Shamrock 2025.10.0
Astrophysical Code
Loading...
Searching...
No Matches
CGInit.cpp
Go to the documentation of this file.
1// -------------------------------------------------------//
2//
3// SHAMROCK code for hydrodynamics
4// Copyright (c) 2021-2026 Timothée David--Cléris <tim.shamrock@proton.me>
5// SPDX-License-Identifier: CeCILL Free Software License Agreement v2.1
6// Shamrock is licensed under the CeCILL 2.1 License, see LICENSE for more information
7//
8// -------------------------------------------------------//
9
22#include "shambackends/vec.hpp"
26#include <shambackends/sycl.hpp>
27#include <type_traits>
28
30
31namespace {
32 using Direction = shammodels::basegodunov::modules::Direction;
33
34 template<class Tvec, class TgridVec>
35 class _Kernel {
36 using Tscal = shambase::VecComponent<Tvec>;
40
41 public:
42 inline static void kernel(Edges &edges, u32 block_size, Tscal fourPiG) {
43 edges.cell_neigh_graph.graph.for_each(
44 [&](u64 id, const OrientedAMRGraph &oriented_cell_graph) {
45 auto &cell_sizes_span = edges.spans_block_cell_sizes.get_spans().get(id);
46 auto &phi_span = edges.spans_phi.get_spans().get(id);
47 auto &rho_span = edges.spans_rho.get_spans().get(id);
48 auto &mean_rho = edges.mean_rho.value;
49 auto &phi_res_span = edges.spans_phi_res.get_spans().get(id);
50 auto &phi_p_span = edges.spans_phi_p.get_spans().get(id);
51
52 AMRGraph &graph_neigh_xp
53 = shambase::get_check_ref(oriented_cell_graph.graph_links[Direction::xp]);
54 AMRGraph &graph_neigh_xm
55 = shambase::get_check_ref(oriented_cell_graph.graph_links[Direction::xm]);
56 AMRGraph &graph_neigh_yp
57 = shambase::get_check_ref(oriented_cell_graph.graph_links[Direction::yp]);
58 AMRGraph &graph_neigh_ym
59 = shambase::get_check_ref(oriented_cell_graph.graph_links[Direction::ym]);
60 AMRGraph &graph_neigh_zp
61 = shambase::get_check_ref(oriented_cell_graph.graph_links[Direction::zp]);
62 AMRGraph &graph_neigh_zm
63 = shambase::get_check_ref(oriented_cell_graph.graph_links[Direction::zm]);
64
65 sham::EventList depends_list;
66
67 auto cell_sizes = cell_sizes_span.get_read_access(depends_list);
68 auto phi = phi_span.get_read_access(depends_list);
69 auto rho = rho_span.get_read_access(depends_list);
70 auto phi_res = phi_res_span.get_write_access(depends_list);
71 auto phi_p = phi_p_span.get_write_access(depends_list);
72
73 auto graph_iter_xp = graph_neigh_xp.get_read_access(depends_list);
74 auto graph_iter_xm = graph_neigh_xm.get_read_access(depends_list);
75 auto graph_iter_yp = graph_neigh_yp.get_read_access(depends_list);
76 auto graph_iter_ym = graph_neigh_ym.get_read_access(depends_list);
77 auto graph_iter_zp = graph_neigh_zp.get_read_access(depends_list);
78 auto graph_iter_zm = graph_neigh_zm.get_read_access(depends_list);
79
80 sham::DeviceQueue &q = shamsys::instance::get_compute_scheduler().get_queue();
81 auto e = q.submit(depends_list, [&](sycl::handler &cgh) {
82 u32 cell_count = (edges.sizes.indexes.get(id)) * block_size;
83
84 shambase::parallel_for(cgh, cell_count, "init step for cg", [=](u64 gid) {
85 const u32 cell_global_id = (u32) gid;
86 const u32 block_id = cell_global_id / block_size;
87 const u32 cell_loc_id = cell_global_id % block_size;
88
89 Tscal delta_cell = cell_sizes[block_id];
90 auto Aphi = shammodels::basegodunov::laplacian_7pt<Tscal, Tvec>(
91 cell_global_id,
92 delta_cell,
93 graph_iter_xp,
94 graph_iter_xm,
95 graph_iter_yp,
96 graph_iter_ym,
97 graph_iter_zp,
98 graph_iter_zm,
99 [=](u32 id) {
100 return phi[id];
101 });
102
103 auto res = fourPiG * (rho[cell_global_id] - mean_rho) - Aphi;
104 phi_res[cell_global_id] = res;
105 phi_p[cell_global_id] = res;
106 });
107 });
108
109 cell_sizes_span.complete_event_state(e);
110 phi_span.complete_event_state(e);
111 rho_span.complete_event_state(e);
112 phi_res_span.complete_event_state(e);
113 phi_p_span.complete_event_state(e);
114
115 graph_neigh_xp.complete_event_state(e);
116 graph_neigh_xm.complete_event_state(e);
117 graph_neigh_yp.complete_event_state(e);
118 graph_neigh_ym.complete_event_state(e);
119 graph_neigh_zp.complete_event_state(e);
120 graph_neigh_zm.complete_event_state(e);
121 });
122 }
123 };
124} // namespace
125
127 template<class Tvec, class TgridVec>
129 StackEntry stack_loc{};
130 auto edges = get_edges();
131
132 edges.spans_block_cell_sizes.check_sizes(edges.sizes.indexes);
133 edges.spans_phi.check_sizes(edges.sizes.indexes);
134 edges.spans_rho.check_sizes(edges.sizes.indexes);
135 edges.spans_phi_res.check_sizes(edges.sizes.indexes);
136 edges.spans_phi_p.check_sizes(edges.sizes.indexes);
137
138 _Kernel<Tvec, TgridVec>::kernel(edges, block_size, fourPiG);
139 }
140
141 template<class Tvec, class TgridVec>
143 std::string sizes = get_ro_edge_base(0).get_tex_symbol();
144 std::string cell_neigh_graph = get_ro_edge_base(1).get_tex_symbol();
145 std::string spans_block_cell_sizes = get_ro_edge_base(2).get_tex_symbol();
146 std::string span_phi = get_ro_edge_base(3).get_tex_symbol();
147 std::string span_rho = get_ro_edge_base(4).get_tex_symbol();
148 std::string mean_rho = get_ro_edge_base(5).get_tex_symbol();
149 std::string span_phi_res = get_rw_edge_base(0).get_tex_symbol();
150 std::string span_phi_p = get_rw_edge_base(1).get_tex_symbol();
151
152 std::string tex = R"tex(
153 Initiation step of CG
154 )tex";
155
156 shambase::replace_all(tex, "{sizes}", sizes);
157 shambase::replace_all(tex, "{cell_neigh_graph}", cell_neigh_graph);
158 shambase::replace_all(tex, "{spans_block_cell_sizes}", spans_block_cell_sizes);
159 shambase::replace_all(tex, "{span_phi}", span_phi);
160 shambase::replace_all(tex, "{span_rhi}", span_rho);
161 shambase::replace_all(tex, "{mean_rho}", mean_rho);
162 shambase::replace_all(tex, "{span_phi_res}", span_phi_res);
163 shambase::replace_all(tex, "{span_phi_p}", span_phi_p);
164
165 return tex;
166 }
167
168} // namespace shammodels::basegodunov::modules
169
7-point stencil for the discrete Laplacian operator
Header file describing a Node Instance.
std::uint32_t u32
32 bit unsigned integer
std::uint64_t u64
64 bit unsigned integer
A SYCL queue associated with a device and a context.
sycl::event submit(Fct &&fct)
Submits a kernel to the SYCL queue.
DeviceQueue & get_queue(u32 id=0)
Get a reference to a DeviceQueue.
Class to manage a list of SYCL events.
Definition EventList.hpp:31
void _impl_evaluate_internal()
evaluate the node
Definition CGInit.cpp:128
void replace_all(std::string &inout, std::string_view what, std::string_view with)
replace all occurence of a search string with another
Definition string.hpp:183
T & get_check_ref(const std::unique_ptr< T > &ptr, SourceLocation loc=SourceLocation())
Takes a std::unique_ptr and returns a reference to the object it holds. It throws a std::runtime_erro...
Definition memory.hpp:110
namespace for the basegodunov model modules