Shamrock 2025.10.0
Astrophysical Code
Loading...
Searching...
No Matches
EulerTimeDerivativeDust.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
16
17#include "shambase/string.hpp"
19#include "shambackends/math.hpp"
23
24namespace {
25
26 template<class Tvec>
27 struct KernelEulerTimeDerivativeDust {
28 using Tscal = shambase::VecComponent<Tvec>;
29
30 inline static void kernel(
31 const shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<Tscal>>
32 &spans_rho_dust,
33 const shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<Tvec>>
34 &spans_vel_dust,
35 const shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<Tvec>>
36 &spans_grad_rho_dust,
37 const shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<Tvec>>
38 &spans_dx_v_dust,
39 const shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<Tvec>>
40 &spans_dy_v_dust,
41 const shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<Tvec>>
42 &spans_dz_v_dust,
43
44 shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<Tscal>>
45 &spans_dt_rho_dust,
46 shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<Tvec>> &spans_dt_vel_dust,
47 const shambase::DistributedData<u32> &sizes,
48 u32 block_size,
49 u32 ndust) {
50
51 shambase::DistributedData<u32> cell_counts
52 = sizes.map<u32>([&](u64 id, u32 block_count) {
53 u32 cell_count = block_count * block_size * ndust;
54 return cell_count;
55 });
56
58 shamsys::instance::get_compute_scheduler_ptr(),
59 sham::DDMultiRef{
60 spans_rho_dust,
61 spans_vel_dust,
62 spans_grad_rho_dust,
63 spans_dx_v_dust,
64 spans_dy_v_dust,
65 spans_dz_v_dust},
66 sham::DDMultiRef{spans_dt_rho_dust, spans_dt_vel_dust},
67 cell_counts,
68 [](u32 i,
69 const Tscal *__restrict rho_dust,
70 const Tvec *__restrict vel_dust,
71 const Tvec *__restrict grad_rho_dust,
72 const Tvec *__restrict dx_v_dust,
73 const Tvec *__restrict dy_v_dust,
74 const Tvec *__restrict dz_v_dust,
75 Tscal *__restrict dt_rho_dust,
76 Tvec *__restrict dt_vel_dust) {
77 Tscal rho_dust_i = rho_dust[i];
78 Tvec v_dust_i = vel_dust[i];
79 Tvec grad_rho_dust_i = grad_rho_dust[i];
80 Tvec dx_v_dust_i = dx_v_dust[i];
81 Tvec dy_v_dust_i = dy_v_dust[i];
82 Tvec dz_v_dust_i = dz_v_dust[i];
83
84 dt_rho_dust[i]
85 = -(sham::dot(v_dust_i, grad_rho_dust_i)
86 + rho_dust_i * (dx_v_dust_i[0] + dy_v_dust_i[1] + dz_v_dust_i[2]));
87
88 // Dust is pressureless, only the advection term remains
89 dt_vel_dust[i]
90 = -(v_dust_i[0] * dx_v_dust_i + v_dust_i[1] * dy_v_dust_i
91 + v_dust_i[2] * dz_v_dust_i);
92 });
93 }
94 };
95
96} // namespace
97
99
100 template<class Tvec>
102 auto edges = get_edges();
103
104 edges.spans_rho_dust.check_sizes(edges.sizes.indexes);
105 edges.spans_vel_dust.check_sizes(edges.sizes.indexes);
106 edges.spans_grad_rho_dust.check_sizes(edges.sizes.indexes);
107 edges.spans_dx_v_dust.check_sizes(edges.sizes.indexes);
108 edges.spans_dy_v_dust.check_sizes(edges.sizes.indexes);
109 edges.spans_dz_v_dust.check_sizes(edges.sizes.indexes);
110
111 edges.spans_dt_rho_dust.ensure_sizes(edges.sizes.indexes);
112 edges.spans_dt_vel_dust.ensure_sizes(edges.sizes.indexes);
113
114 KernelEulerTimeDerivativeDust<Tvec>::kernel(
115 edges.spans_rho_dust.get_spans(),
116 edges.spans_vel_dust.get_spans(),
117 edges.spans_grad_rho_dust.get_spans(),
118 edges.spans_dx_v_dust.get_spans(),
119 edges.spans_dy_v_dust.get_spans(),
120 edges.spans_dz_v_dust.get_spans(),
121 edges.spans_dt_rho_dust.get_spans(),
122 edges.spans_dt_vel_dust.get_spans(),
123 edges.sizes.indexes,
124 block_size,
125 ndust);
126 }
127
128 template<class Tvec>
130 std::string tex = R"tex(
131 Euler time derivatives of the dust primitive state (pressureless)
132
133 \begin{align}
134 {spans_dt_rho_dust}_i &= - \left( {spans_vel_dust}_i \cdot {spans_grad_rho_dust}_i
135 + {spans_rho_dust}_i \left( {spans_dx_v_dust}_{i,x} + {spans_dy_v_dust}_{i,y}
136 + {spans_dz_v_dust}_{i,z} \right) \right) \\
137 {spans_dt_vel_dust}_i &= - \left( {spans_vel_dust}_{i,x} {spans_dx_v_dust}_i
138 + {spans_vel_dust}_{i,y} {spans_dy_v_dust}_i + {spans_vel_dust}_{i,z} {spans_dz_v_dust}_i \right) \\
139 i &\in [0,{sizes} * N_{\rm cell/block} * N_{\rm dust}) \\
140 N_{\rm cell/block} & = {block_size} \\
141 N_{\rm dust} & = {ndust}
142 \end{align}
143 )tex";
144
145 replace_edges_tex_symbols(tex);
146
147 shambase::replace_all(tex, "{block_size}", sham::format("{}", block_size));
148 shambase::replace_all(tex, "{ndust}", sham::format("{}", ndust));
149
150 return tex;
151 }
152
153} // namespace shammodels::basegodunov::modules
154
Per cell Euler time derivatives of the dust primitive state.
constexpr const char * sizes
Temporary sizes for h-iteration.
Header file describing a Node Instance.
std::uint32_t u32
32 bit unsigned integer
std::uint64_t u64
64 bit unsigned integer
Compute the Euler time derivatives of the dust primitive state per cell.
virtual std::string _impl_get_tex() const
get the tex of the node
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:106
namespace for the basegodunov model modules