Shamrock 2025.10.0
Astrophysical Code
Loading...
Searching...
No Matches
ComputeCellAABB.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
21
22namespace {
23
24 template<class Tvec, class TgridVec>
25 struct KernelComputeCellAABB {
26 using Tscal = shambase::VecComponent<Tvec>;
27
28 inline static void kernel(
30 &spans_block_min,
32 &spans_block_max,
34 &spans_block_cell_sizes,
36 &spans_cell0block_aabb_lower,
38 u32 block_nside,
39 Tscal grid_coord_to_pos_fact) {
40
41 const shambase::DistributedData<u32> &block_counts = sizes;
42
43 Tscal one_over_Nside = 1. / block_nside;
44
45 Tscal dxfact = grid_coord_to_pos_fact;
46
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},
51 block_counts,
52 [one_over_Nside, dxfact](
53 u32 i,
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];
60
61 Tvec lower_flt = lower.template convert<Tscal>() * dxfact;
62 Tvec upper_flt = upper.template convert<Tscal>() * dxfact;
63
64 Tvec block_cell_size = (upper_flt - lower_flt) * one_over_Nside;
65
66 Tscal res = block_cell_size.x();
67
68 bsize[i] = res;
69 aabb_lower[i] = lower_flt;
70 });
71 }
72 };
73
74} // namespace
75
77
78 template<class Tvec, class TgridVec>
80 auto edges = get_edges();
81
82 edges.spans_block_min.check_sizes(edges.sizes.indexes);
83 edges.spans_block_max.check_sizes(edges.sizes.indexes);
84
85 edges.spans_block_cell_sizes.ensure_sizes(edges.sizes.indexes);
86 edges.spans_cell0block_aabb_lower.ensure_sizes(edges.sizes.indexes);
87
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(),
93 edges.sizes.indexes,
94 block_nside,
95 grid_coord_to_pos_fact);
96 }
97
98 template<class Tvec, class TgridVec>
100
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();
106
107 std::string tex = R"tex(
108 Compute cell AABBs
109
110 \begin{align}
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}
116 \end{align}
117 )tex";
118
119 shambase::replace_all(tex, "{block_count}", block_count);
120 shambase::replace_all(tex, "{block_min}", block_min);
121 shambase::replace_all(tex, "{block_max}", block_max);
122 shambase::replace_all(tex, "{block_cell_sizes}", block_cell_sizes);
123 shambase::replace_all(tex, "{cell0block_aabb_lower}", cell0block_aabb_lower);
124 shambase::replace_all(tex, "{block_nside}", shambase::format("{}", block_nside));
126 tex, "{grid_coord_to_pos_fact}", shambase::format("{}", grid_coord_to_pos_fact));
127
128 return tex;
129 }
130
131} // namespace shammodels::basegodunov::modules
132
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
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
Definition string.hpp:183
namespace for the basegodunov model modules
A variant of sham::MultiRef for distributed data.