24 template<
class Tvec,
class Tgr
idVec>
25 struct KernelComputeCellAABB {
26 using Tscal = shambase::VecComponent<Tvec>;
28 inline static void kernel(
29 const shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<TgridVec>>
31 const shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<TgridVec>>
33 shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<Tscal>>
34 &spans_block_cell_sizes,
35 shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<Tvec>>
36 &spans_cell0block_aabb_lower,
37 const shambase::DistributedData<u32> &sizes,
39 Tscal grid_coord_to_pos_fact) {
41 const shambase::DistributedData<u32> &block_counts =
sizes;
43 Tscal one_over_Nside = 1. / block_nside;
45 Tscal dxfact = grid_coord_to_pos_fact;
48 shamsys::instance::get_compute_scheduler_ptr(),
49 sham::DDMultiRef{spans_block_min, spans_block_max},
50 sham::DDMultiRef{spans_block_cell_sizes, spans_cell0block_aabb_lower},
52 [one_over_Nside, dxfact](
54 const TgridVec *__restrict acc_block_min,
55 const TgridVec *__restrict acc_block_max,
56 Tscal *__restrict bsize,
57 Tvec *__restrict aabb_lower) {
58 TgridVec lower = acc_block_min[i];
59 TgridVec upper = acc_block_max[i];
61 Tvec lower_flt = lower.template convert<Tscal>() * dxfact;
62 Tvec upper_flt = upper.template convert<Tscal>() * dxfact;
64 Tvec block_cell_size = (upper_flt - lower_flt) * one_over_Nside;
66 Tscal res = block_cell_size.x();
69 aabb_lower[i] = lower_flt;
78 template<
class Tvec,
class Tgr
idVec>
80 auto edges = get_edges();
82 edges.spans_block_min.check_sizes(edges.sizes.indexes);
83 edges.spans_block_max.check_sizes(edges.sizes.indexes);
85 edges.spans_block_cell_sizes.ensure_sizes(edges.sizes.indexes);
86 edges.spans_cell0block_aabb_lower.ensure_sizes(edges.sizes.indexes);
88 KernelComputeCellAABB<Tvec, TgridVec>::kernel(
89 edges.spans_block_min.get_spans(),
90 edges.spans_block_max.get_spans(),
91 edges.spans_block_cell_sizes.get_spans(),
92 edges.spans_cell0block_aabb_lower.get_spans(),
95 grid_coord_to_pos_fact);
98 template<
class Tvec,
class Tgr
idVec>
107 std::string tex = R
"tex(
111 {block_cell_sizes}_i &= \mathbf{e}_x \cdot ({block_max}_i - {block_min}_i) (\chi / block_{\rm nside}) \\
112 {cell0block_aabb_lower}_i &= ({block_min}_i) (\chi / block_{\rm nside}) \\
113 i &\in [0,{block_count})\\
114 \chi &= {grid_coord_to_pos_fact}\\
115 block_{\rm nside} &= {block_nside}
126 tex,
"{grid_coord_to_pos_fact}", shambase::format(
"{}", grid_coord_to_pos_fact));
constexpr const char * sizes
Temporary sizes for h-iteration.
Header file describing a Node Instance.
std::uint32_t u32
32 bit unsigned integer
virtual std::string _impl_get_tex() const
get the tex of the node
void _impl_evaluate_internal()
evaluate 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 distributed_data_kernel_call(sham::DeviceScheduler_ptr dev_sched, RefIn in, RefOut in_out, const shambase::DistributedData< index_t > &thread_counts, Functor &&func)
A variant of sham::kernel_call for distributed data.
void replace_all(std::string &inout, std::string_view what, std::string_view with)
replace all occurence of a search string with another
namespace for the basegodunov model modules