26 template<
class Tvec,
class Tgr
idVec, SlopeMode mode>
27 class KernelSlopeLimScalGrad {
29 using Edges =
typename shammodels::basegodunov::modules::
30 SlopeLimitedScalarGradient<Tvec, TgridVec>::Edges;
31 using Tscal = shambase::VecComponent<Tvec>;
32 using OrientedAMRGraph = shammodels::basegodunov::modules::OrientedAMRGraph<Tvec, TgridVec>;
33 using AMRGraph = shammodels::basegodunov::modules::AMRGraph;
36 inline static void kernel(Edges &edges,
u32 block_size,
u32 var_per_cell) {
38 edges.cell_neigh_graph.graph.for_each(
39 [&](
u64 id,
const OrientedAMRGraph &oriented_cell_graph) {
40 auto &field_span = edges.span_field.get_spans().get(
id);
41 auto &field_grad_span = edges.span_grad_field.get_spans().get(
id);
42 auto &cell_sizes_span = edges.spans_block_cell_sizes.get_spans().get(
id);
44 AMRGraph &graph_neigh_xp
46 AMRGraph &graph_neigh_xm
48 AMRGraph &graph_neigh_yp
50 AMRGraph &graph_neigh_ym
52 AMRGraph &graph_neigh_zp
54 AMRGraph &graph_neigh_zm
57 sham::EventList depends_list;
59 auto cell_sizes = cell_sizes_span.get_read_access(depends_list);
60 auto field = field_span.get_read_access(depends_list);
61 auto field_grad = field_grad_span.get_write_access(depends_list);
63 auto graph_iter_xp = graph_neigh_xp.get_read_access(depends_list);
64 auto graph_iter_xm = graph_neigh_xm.get_read_access(depends_list);
65 auto graph_iter_yp = graph_neigh_yp.get_read_access(depends_list);
66 auto graph_iter_ym = graph_neigh_ym.get_read_access(depends_list);
67 auto graph_iter_zp = graph_neigh_zp.get_read_access(depends_list);
68 auto graph_iter_zm = graph_neigh_zm.get_read_access(depends_list);
70 sham::DeviceQueue &q = shamsys::instance::get_compute_scheduler().
get_queue();
71 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
72 u32 cell_count = (edges.sizes.indexes.get(
id)) * block_size;
74 shambase::parallel_for(
75 cgh, cell_count * var_per_cell,
"compute_grad_rho", [=](
u64 gid) {
76 const u32 tmp_gid = (
u32) gid;
78 const u32 cell_global_id = tmp_gid / var_per_cell;
79 const u32 var_off_loc = tmp_gid % var_per_cell;
81 const u32 block_id = cell_global_id / block_size;
82 const u32 cell_loc_id = cell_global_id % block_size;
84 Tscal delta_cell = cell_sizes[block_id];
86 auto result = get_3d_grad<Tscal, Tvec, mode>(
97 return field[var_per_cell *
id + var_off_loc];
100 field_grad[var_per_cell * cell_global_id + var_off_loc]
101 = {result[0], result[1], result[2]};
105 cell_sizes_span.complete_event_state(e);
106 field_span.complete_event_state(e);
107 field_grad_span.complete_event_state(e);
109 graph_neigh_xp.complete_event_state(e);
110 graph_neigh_xm.complete_event_state(e);
111 graph_neigh_yp.complete_event_state(e);
112 graph_neigh_ym.complete_event_state(e);
113 graph_neigh_zp.complete_event_state(e);
114 graph_neigh_zm.complete_event_state(e);
119 template<
class Tvec,
class Tgr
idVec, SlopeMode mode>
120 class KernelSlopeLimVecGrad {
122 using Edges =
typename shammodels::basegodunov::modules::
123 SlopeLimitedVectorGradient<Tvec, TgridVec>::Edges;
124 using Tscal = shambase::VecComponent<Tvec>;
125 using OrientedAMRGraph = shammodels::basegodunov::modules::OrientedAMRGraph<Tvec, TgridVec>;
126 using AMRGraph = shammodels::basegodunov::modules::AMRGraph;
129 inline static void kernel(Edges &edges,
u32 block_size,
u32 var_per_cell) {
131 edges.cell_neigh_graph.graph.for_each(
132 [&](
u64 id,
const OrientedAMRGraph &oriented_cell_graph) {
133 auto &field_span = edges.span_field.get_spans().get(
id);
134 auto &field_dx_span = edges.span_dx_field.get_spans().get(
id);
135 auto &field_dy_span = edges.span_dy_field.get_spans().get(
id);
136 auto &field_dz_span = edges.span_dz_field.get_spans().get(
id);
137 auto &cell_sizes_span = edges.spans_block_cell_sizes.get_spans().get(
id);
139 AMRGraph &graph_neigh_xp
141 AMRGraph &graph_neigh_xm
143 AMRGraph &graph_neigh_yp
145 AMRGraph &graph_neigh_ym
147 AMRGraph &graph_neigh_zp
149 AMRGraph &graph_neigh_zm
152 sham::EventList depends_list;
154 auto cell_sizes = cell_sizes_span.get_read_access(depends_list);
155 auto field = field_span.get_read_access(depends_list);
156 auto field_dx = field_dx_span.get_write_access(depends_list);
157 auto field_dy = field_dy_span.get_write_access(depends_list);
158 auto field_dz = field_dz_span.get_write_access(depends_list);
160 auto graph_iter_xp = graph_neigh_xp.get_read_access(depends_list);
161 auto graph_iter_xm = graph_neigh_xm.get_read_access(depends_list);
162 auto graph_iter_yp = graph_neigh_yp.get_read_access(depends_list);
163 auto graph_iter_ym = graph_neigh_ym.get_read_access(depends_list);
164 auto graph_iter_zp = graph_neigh_zp.get_read_access(depends_list);
165 auto graph_iter_zm = graph_neigh_zm.get_read_access(depends_list);
167 sham::DeviceQueue &q = shamsys::instance::get_compute_scheduler().
get_queue();
168 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
169 u32 cell_count = (edges.sizes.indexes.get(
id)) * block_size;
171 shambase::parallel_for(
172 cgh, cell_count * var_per_cell,
"compute_grad_rho", [=](
u64 gid) {
173 const u32 tmp_gid = (
u32) gid;
175 const u32 cell_global_id = tmp_gid / var_per_cell;
176 const u32 var_off_loc = tmp_gid % var_per_cell;
178 const u32 block_id = cell_global_id / block_size;
179 const u32 cell_loc_id = cell_global_id % block_size;
181 Tscal delta_cell = cell_sizes[block_id];
183 auto result = get_3d_grad<Tvec, Tvec, mode>(
194 return field[var_per_cell *
id + var_off_loc];
197 field_dx[var_per_cell * cell_global_id + var_off_loc] = result[0];
198 field_dy[var_per_cell * cell_global_id + var_off_loc] = result[1];
199 field_dz[var_per_cell * cell_global_id + var_off_loc] = result[2];
203 cell_sizes_span.complete_event_state(e);
204 field_span.complete_event_state(e);
205 field_dx_span.complete_event_state(e);
206 field_dy_span.complete_event_state(e);
207 field_dz_span.complete_event_state(e);
209 graph_neigh_xp.complete_event_state(e);
210 graph_neigh_xm.complete_event_state(e);
211 graph_neigh_yp.complete_event_state(e);
212 graph_neigh_ym.complete_event_state(e);
213 graph_neigh_zp.complete_event_state(e);
214 graph_neigh_zm.complete_event_state(e);
222 template<
class Tvec,
class Tgr
idVec>
225 auto edges = get_edges();
227 edges.spans_block_cell_sizes.check_sizes(edges.sizes.indexes);
228 edges.span_field.check_sizes(edges.sizes.indexes);
230 edges.span_grad_field.ensure_sizes(edges.sizes.indexes);
232 if (mode == SlopeMode::None) {
233 using Kern = KernelSlopeLimScalGrad<Tvec, TgridVec, None>;
234 Kern::kernel(edges, block_size, var_per_cell);
235 }
else if (mode == SlopeMode::VanLeer_f) {
236 using Kern = KernelSlopeLimScalGrad<Tvec, TgridVec, VanLeer_f>;
237 Kern::kernel(edges, block_size, var_per_cell);
238 }
else if (mode == SlopeMode::VanLeer_std) {
239 using Kern = KernelSlopeLimScalGrad<Tvec, TgridVec, VanLeer_std>;
240 Kern::kernel(edges, block_size, var_per_cell);
241 }
else if (mode == SlopeMode::VanLeer_sym) {
242 using Kern = KernelSlopeLimScalGrad<Tvec, TgridVec, VanLeer_sym>;
243 Kern::kernel(edges, block_size, var_per_cell);
244 }
else if (mode == SlopeMode::Minmod) {
245 using Kern = KernelSlopeLimScalGrad<Tvec, TgridVec, Minmod>;
246 Kern::kernel(edges, block_size, var_per_cell);
252 template<
class Tvec,
class Tgr
idVec>
261 std::string tex = R
"tex(
262 Slope limited gradient (Scalar)
273 template<
class Tvec,
class Tgr
idVec>
276 auto edges = get_edges();
278 edges.spans_block_cell_sizes.check_sizes(edges.sizes.indexes);
279 edges.span_field.check_sizes(edges.sizes.indexes);
281 edges.span_dx_field.ensure_sizes(edges.sizes.indexes);
282 edges.span_dy_field.ensure_sizes(edges.sizes.indexes);
283 edges.span_dz_field.ensure_sizes(edges.sizes.indexes);
285 if (mode == SlopeMode::None) {
286 using Kern = KernelSlopeLimVecGrad<Tvec, TgridVec, None>;
287 Kern::kernel(edges, block_size, var_per_cell);
288 }
else if (mode == SlopeMode::VanLeer_f) {
289 using Kern = KernelSlopeLimVecGrad<Tvec, TgridVec, VanLeer_f>;
290 Kern::kernel(edges, block_size, var_per_cell);
291 }
else if (mode == SlopeMode::VanLeer_std) {
292 using Kern = KernelSlopeLimVecGrad<Tvec, TgridVec, VanLeer_std>;
293 Kern::kernel(edges, block_size, var_per_cell);
294 }
else if (mode == SlopeMode::VanLeer_sym) {
295 using Kern = KernelSlopeLimVecGrad<Tvec, TgridVec, VanLeer_sym>;
296 Kern::kernel(edges, block_size, var_per_cell);
297 }
else if (mode == SlopeMode::Minmod) {
298 using Kern = KernelSlopeLimVecGrad<Tvec, TgridVec, Minmod>;
299 Kern::kernel(edges, block_size, var_per_cell);
305 template<
class Tvec,
class Tgr
idVec>
316 std::string tex = R
"tex(
317 Slope limited gradient (Vector)
std::uint32_t u32
32 bit unsigned integer
std::uint64_t u64
64 bit unsigned integer
sycl::event submit(Fct &&fct)
Submits a kernel to the SYCL queue.
DeviceQueue & get_queue(u32 id=0)
Get a reference to a DeviceQueue.
void _impl_evaluate_internal()
evaluate the node
virtual std::string _impl_get_tex() const
get the tex of the node
void _impl_evaluate_internal()
evaluate the node
virtual std::string _impl_get_tex() const
get the tex of the node
IEdge & get_rw_edge_base(int slot)
Get a reference to a read write edge and cast it to the type IEdge.
const IEdge & get_ro_edge_base(int slot)
Get a reference to a read only edge.
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...
void throw_unimplemented(SourceLocation loc=SourceLocation{})
Throw a std::runtime_error saying that the function is unimplemented.
namespace for the basegodunov model modules
shambase::details::BasicStackEntry StackEntry
Alias for shambase::details::BasicStackEntry.