Shamrock 2025.10.0
Astrophysical Code
Loading...
Searching...
No Matches
EulerTimeDerivativeGas.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 KernelEulerTimeDerivativeGas {
28 using Tscal = shambase::VecComponent<Tvec>;
29
30 inline static void kernel(
31 const shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<Tscal>> &spans_rho,
32 const shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<Tvec>> &spans_vel,
33 const shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<Tscal>>
34 &spans_press,
35 const shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<Tvec>>
36 &spans_grad_rho,
37 const shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<Tvec>> &spans_dx_v,
38 const shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<Tvec>> &spans_dy_v,
39 const shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<Tvec>> &spans_dz_v,
40 const shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<Tvec>>
41 &spans_grad_P,
42
43 shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<Tscal>> &spans_dt_rho,
44 shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<Tvec>> &spans_dt_vel,
45 shambase::DistributedData<shamrock::PatchDataFieldSpanPointer<Tscal>> &spans_dt_press,
46 const shambase::DistributedData<u32> &sizes,
47 u32 block_size,
48 Tscal gamma) {
49
50 shambase::DistributedData<u32> cell_counts
51 = sizes.map<u32>([&](u64 id, u32 block_count) {
52 u32 cell_count = block_count * block_size;
53 return cell_count;
54 });
55
57 shamsys::instance::get_compute_scheduler_ptr(),
58 sham::DDMultiRef{
59 spans_rho,
60 spans_vel,
61 spans_press,
62 spans_grad_rho,
63 spans_dx_v,
64 spans_dy_v,
65 spans_dz_v,
66 spans_grad_P},
67 sham::DDMultiRef{spans_dt_rho, spans_dt_vel, spans_dt_press},
68 cell_counts,
69 [gamma](
70 u32 i,
71 const Tscal *__restrict rho,
72 const Tvec *__restrict vel,
73 const Tscal *__restrict press,
74 const Tvec *__restrict grad_rho,
75 const Tvec *__restrict dx_v,
76 const Tvec *__restrict dy_v,
77 const Tvec *__restrict dz_v,
78 const Tvec *__restrict grad_P,
79 Tscal *__restrict dt_rho,
80 Tvec *__restrict dt_vel,
81 Tscal *__restrict dt_press) {
82 Tscal rho_i = rho[i];
83 Tvec v_i = vel[i];
84 Tscal P_i = press[i];
85 Tvec grad_rho_i = grad_rho[i];
86 Tvec dx_v_i = dx_v[i];
87 Tvec dy_v_i = dy_v[i];
88 Tvec dz_v_i = dz_v[i];
89 Tvec grad_P_i = grad_P[i];
90
91 dt_rho[i] = -(
92 sham::dot(v_i, grad_rho_i) + rho_i * (dx_v_i[0] + dy_v_i[1] + dz_v_i[2]));
93
94 dt_vel[i]
95 = -(v_i[0] * dx_v_i + v_i[1] * dy_v_i + v_i[2] * dz_v_i + grad_P_i / rho_i);
96
97 dt_press[i]
98 = -(gamma * P_i * (dx_v_i[0] + dy_v_i[1] + dz_v_i[2])
99 + sham::dot(v_i, grad_P_i));
100 });
101 }
102 };
103
104} // namespace
105
107
108 template<class Tvec>
110 auto edges = get_edges();
111
112 edges.spans_rho.check_sizes(edges.sizes.indexes);
113 edges.spans_vel.check_sizes(edges.sizes.indexes);
114 edges.spans_press.check_sizes(edges.sizes.indexes);
115 edges.spans_grad_rho.check_sizes(edges.sizes.indexes);
116 edges.spans_dx_v.check_sizes(edges.sizes.indexes);
117 edges.spans_dy_v.check_sizes(edges.sizes.indexes);
118 edges.spans_dz_v.check_sizes(edges.sizes.indexes);
119 edges.spans_grad_P.check_sizes(edges.sizes.indexes);
120
121 edges.spans_dt_rho.ensure_sizes(edges.sizes.indexes);
122 edges.spans_dt_vel.ensure_sizes(edges.sizes.indexes);
123 edges.spans_dt_press.ensure_sizes(edges.sizes.indexes);
124
125 KernelEulerTimeDerivativeGas<Tvec>::kernel(
126 edges.spans_rho.get_spans(),
127 edges.spans_vel.get_spans(),
128 edges.spans_press.get_spans(),
129 edges.spans_grad_rho.get_spans(),
130 edges.spans_dx_v.get_spans(),
131 edges.spans_dy_v.get_spans(),
132 edges.spans_dz_v.get_spans(),
133 edges.spans_grad_P.get_spans(),
134 edges.spans_dt_rho.get_spans(),
135 edges.spans_dt_vel.get_spans(),
136 edges.spans_dt_press.get_spans(),
137 edges.sizes.indexes,
138 block_size,
139 gamma);
140 }
141
142 template<class Tvec>
144 std::string tex = R"tex(
145 Euler time derivatives of the gas primitive state
146
147 \begin{align}
148 {spans_dt_rho}_i &= - \left( {spans_vel}_i \cdot {spans_grad_rho}_i
149 + {spans_rho}_i \left( {spans_dx_v}_{i,x} + {spans_dy_v}_{i,y} + {spans_dz_v}_{i,z} \right) \right) \\
150 {spans_dt_vel}_i &= - \left( {spans_vel}_{i,x} {spans_dx_v}_i + {spans_vel}_{i,y} {spans_dy_v}_i
151 + {spans_vel}_{i,z} {spans_dz_v}_i + \frac{ {spans_grad_P}_i }{ {spans_rho}_i } \right) \\
152 {spans_dt_press}_i &= - \left( \gamma {spans_press}_i
153 \left( {spans_dx_v}_{i,x} + {spans_dy_v}_{i,y} + {spans_dz_v}_{i,z} \right)
154 + {spans_vel}_i \cdot {spans_grad_P}_i \right) \\
155 i &\in [0,{sizes} * N_{\rm cell/block}) \\
156 \gamma &= {gamma} \\
157 N_{\rm cell/block} & = {block_size}
158 \end{align}
159 )tex";
160
161 replace_edges_tex_symbols(tex);
162
163 shambase::replace_all(tex, "{gamma}", sham::format("{}", gamma));
164 shambase::replace_all(tex, "{block_size}", sham::format("{}", block_size));
165
166 return tex;
167 }
168
169} // namespace shammodels::basegodunov::modules
170
Per cell Euler time derivatives of the gas 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 gas 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