24 template<
class Tvec,
class Tgr
idVec>
25 struct KernelComputeCellAABB {
26 using Tscal = shambase::VecComponent<Tvec>;
28 inline static void kernel(
34 &spans_block_cell_sizes,
36 &spans_cell0block_aabb_lower,
39 Tscal grid_coord_to_pos_fact) {
43 Tscal one_over_Nside = 1. / block_nside;
45 Tscal dxfact = grid_coord_to_pos_fact;
48 shamsys::instance::get_compute_scheduler_ptr(),
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>
101 auto block_count = get_ro_edge_base(0).get_tex_symbol();
102 auto block_min = get_ro_edge_base(1).get_tex_symbol();
103 auto block_max = get_ro_edge_base(2).get_tex_symbol();
104 auto block_cell_sizes = get_rw_edge_base(0).get_tex_symbol();
105 auto cell0block_aabb_lower = get_rw_edge_base(1).get_tex_symbol();
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
Represents a collection of objects distributed across patches identified by a u64 id.
virtual std::string _impl_get_tex() const
get the tex of the node
void _impl_evaluate_internal()
evaluate the node
Represents a span of data within a PatchDataField.
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
A variant of sham::MultiRef for distributed data.