32 using Direction = shammodels::basegodunov::modules::Direction;
34 template<
class Tvec,
class Tgr
idVec>
36 using Tscal = shambase::VecComponent<Tvec>;
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);
52 AMRGraph &graph_neigh_xp
54 AMRGraph &graph_neigh_xm
56 AMRGraph &graph_neigh_yp
58 AMRGraph &graph_neigh_ym
60 AMRGraph &graph_neigh_zp
62 AMRGraph &graph_neigh_zm
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);
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);
81 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
82 u32 cell_count = (edges.sizes.indexes.get(
id)) * block_size;
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;
89 Tscal delta_cell = cell_sizes[block_id];
90 auto Aphi = shammodels::basegodunov::laplacian_7pt<Tscal, Tvec>(
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;
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);
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);
127 template<
class Tvec,
class Tgr
idVec>
130 auto edges = get_edges();
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);
138 _Kernel<Tvec, TgridVec>::kernel(edges, block_size, fourPiG);
141 template<
class Tvec,
class Tgr
idVec>
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();
152 std::string tex = R
"tex(
153 Initiation step of CG
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.
void _impl_evaluate_internal()
evaluate the node
void replace_all(std::string &inout, std::string_view what, std::string_view with)
replace all occurence of a search string with another
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...
namespace for the basegodunov model modules