Shamrock 2025.10.0
Astrophysical Code
Loading...
Searching...
No Matches
InterpolateToFace.hpp
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
10#pragma once
11
18
19#include "shambackends/vec.hpp"
26#include <array>
27
28// Note on the edge lists below: the Euler time derivatives (dt_rho, dt_vel,
29// dt_press and their dust counterparts) used to be recomputed inside these
30// kernels for both sides of every link. They are now precomputed per cell by
31// NodeEulerTimeDerivativeGas / NodeEulerTimeDerivativeDust and merely loaded
32// here, which is why each node only carries the fields its spatial
33// reconstruction still needs.
34
35#define NODE_EDGES_RHO(X_RO, X_RW) \
36 /* ------------------- inputs ------------------- */ \
37 X_RO(ScalarEdgeScal, dt_interp) \
38 X_RO(AMRGraphEdge, cell_neigh_graph) \
39 X_RO(shamrock::solvergraph::IFieldSpan<Tscal>, spans_block_cell_sizes) \
40 X_RO(shamrock::solvergraph::IFieldSpan<Tvec>, spans_cell0block_aabb_lower) \
41 X_RO(shamrock::solvergraph::IFieldSpan<Tscal>, spans_rhos) \
42 X_RO(shamrock::solvergraph::IFieldSpan<Tvec>, spans_grad_rho) \
43 X_RO(shamrock::solvergraph::IFieldSpan<Tscal>, spans_dt_rho) \
44 \
45 /* ------------------- outputs ------------------- */ \
46 X_RW(LinkFieldScal, rho_face_xp) \
47 X_RW(LinkFieldScal, rho_face_xm) \
48 X_RW(LinkFieldScal, rho_face_yp) \
49 X_RW(LinkFieldScal, rho_face_ym) \
50 X_RW(LinkFieldScal, rho_face_zp) \
51 X_RW(LinkFieldScal, rho_face_zm)
52
53#define NODE_EDGES_VEL(X_RO, X_RW) \
54 /* ------------------- inputs ------------------- */ \
55 X_RO(ScalarEdgeScal, dt_interp) \
56 X_RO(AMRGraphEdge, cell_neigh_graph) \
57 X_RO(shamrock::solvergraph::IFieldSpan<Tscal>, spans_block_cell_sizes) \
58 X_RO(shamrock::solvergraph::IFieldSpan<Tvec>, spans_cell0block_aabb_lower) \
59 X_RO(shamrock::solvergraph::IFieldSpan<Tvec>, spans_vel) \
60 X_RO(shamrock::solvergraph::IFieldSpan<Tvec>, spans_dx_vel) \
61 X_RO(shamrock::solvergraph::IFieldSpan<Tvec>, spans_dy_vel) \
62 X_RO(shamrock::solvergraph::IFieldSpan<Tvec>, spans_dz_vel) \
63 X_RO(shamrock::solvergraph::IFieldSpan<Tvec>, spans_dt_vel) \
64 \
65 /* ------------------- outputs ------------------- */ \
66 X_RW(LinkFieldVec, vel_face_xp) \
67 X_RW(LinkFieldVec, vel_face_xm) \
68 X_RW(LinkFieldVec, vel_face_yp) \
69 X_RW(LinkFieldVec, vel_face_ym) \
70 X_RW(LinkFieldVec, vel_face_zp) \
71 X_RW(LinkFieldVec, vel_face_zm)
72
73#define NODE_EDGES_PRESS(X_RO, X_RW) \
74 /* ------------------- inputs ------------------- */ \
75 X_RO(ScalarEdgeScal, dt_interp) \
76 X_RO(AMRGraphEdge, cell_neigh_graph) \
77 X_RO(shamrock::solvergraph::IFieldSpan<Tscal>, spans_block_cell_sizes) \
78 X_RO(shamrock::solvergraph::IFieldSpan<Tvec>, spans_cell0block_aabb_lower) \
79 X_RO(shamrock::solvergraph::IFieldSpan<Tscal>, spans_press) \
80 X_RO(shamrock::solvergraph::IFieldSpan<Tvec>, spans_grad_P) \
81 X_RO(shamrock::solvergraph::IFieldSpan<Tscal>, spans_dt_press) \
82 \
83 /* ------------------- outputs ------------------- */ \
84 X_RW(LinkFieldScal, press_face_xp) \
85 X_RW(LinkFieldScal, press_face_xm) \
86 X_RW(LinkFieldScal, press_face_yp) \
87 X_RW(LinkFieldScal, press_face_ym) \
88 X_RW(LinkFieldScal, press_face_zp) \
89 X_RW(LinkFieldScal, press_face_zm)
90
91#define NODE_EDGES_RHO_DUST(X_RO, X_RW) \
92 /* ------------------- inputs ------------------- */ \
93 X_RO(ScalarEdgeScal, dt_interp) \
94 X_RO(AMRGraphEdge, cell_neigh_graph) \
95 X_RO(shamrock::solvergraph::IFieldSpan<Tscal>, spans_block_cell_sizes) \
96 X_RO(shamrock::solvergraph::IFieldSpan<Tvec>, spans_cell0block_aabb_lower) \
97 X_RO(shamrock::solvergraph::IFieldSpan<Tscal>, spans_rhos_dust) \
98 X_RO(shamrock::solvergraph::IFieldSpan<Tvec>, spans_grad_rho_dust) \
99 X_RO(shamrock::solvergraph::IFieldSpan<Tscal>, spans_dt_rho_dust) \
100 \
101 /* ------------------- outputs ------------------- */ \
102 X_RW(LinkFieldScal, rho_dust_face_xp) \
103 X_RW(LinkFieldScal, rho_dust_face_xm) \
104 X_RW(LinkFieldScal, rho_dust_face_yp) \
105 X_RW(LinkFieldScal, rho_dust_face_ym) \
106 X_RW(LinkFieldScal, rho_dust_face_zp) \
107 X_RW(LinkFieldScal, rho_dust_face_zm)
108
109#define NODE_EDGES_VEL_DUST(X_RO, X_RW) \
110 /* ------------------- inputs ------------------- */ \
111 X_RO(ScalarEdgeScal, dt_interp) \
112 X_RO(AMRGraphEdge, cell_neigh_graph) \
113 X_RO(shamrock::solvergraph::IFieldSpan<Tscal>, spans_block_cell_sizes) \
114 X_RO(shamrock::solvergraph::IFieldSpan<Tvec>, spans_cell0block_aabb_lower) \
115 X_RO(shamrock::solvergraph::IFieldSpan<Tvec>, spans_vel_dust) \
116 X_RO(shamrock::solvergraph::IFieldSpan<Tvec>, spans_dx_vel_dust) \
117 X_RO(shamrock::solvergraph::IFieldSpan<Tvec>, spans_dy_vel_dust) \
118 X_RO(shamrock::solvergraph::IFieldSpan<Tvec>, spans_dz_vel_dust) \
119 X_RO(shamrock::solvergraph::IFieldSpan<Tvec>, spans_dt_vel_dust) \
120 \
121 /* ------------------- outputs ------------------- */ \
122 X_RW(LinkFieldVec, vel_dust_face_xp) \
123 X_RW(LinkFieldVec, vel_dust_face_xm) \
124 X_RW(LinkFieldVec, vel_dust_face_yp) \
125 X_RW(LinkFieldVec, vel_dust_face_ym) \
126 X_RW(LinkFieldVec, vel_dust_face_zp) \
127 X_RW(LinkFieldVec, vel_dust_face_zm)
128
130
131 template<class Tvec, class TgridVec>
132 class InterpolateToFaceRho : public shamrock::solvergraph::INode {
133 using Tscal = shambase::VecComponent<Tvec>;
134
136 using ScalarEdgeScal = shamrock::solvergraph::ScalarEdge<Tscal>;
139
140 u32 block_size;
141
142 public:
143 InterpolateToFaceRho(u32 block_size) : block_size(block_size) {}
144
145 EXPAND_NODE_EDGES(NODE_EDGES_RHO)
146
148
149 inline virtual std::string _impl_get_label() const { return "InterpolateRhoToFaceRho"; };
150
151 virtual std::string _impl_get_tex() const;
152 };
153
154 template<class Tvec, class TgridVec>
155 class InterpolateToFaceVel : public shamrock::solvergraph::INode {
156 using Tscal = shambase::VecComponent<Tvec>;
157
159 using ScalarEdgeScal = shamrock::solvergraph::ScalarEdge<Tscal>;
162
163 u32 block_size;
164
165 public:
166 InterpolateToFaceVel(u32 block_size) : block_size(block_size) {}
167
168 EXPAND_NODE_EDGES(NODE_EDGES_VEL)
169
171
172 inline virtual std::string _impl_get_label() const { return "InterpolateVelToFaceVel"; };
173
174 virtual std::string _impl_get_tex() const;
175 };
176
177 template<class Tvec, class TgridVec>
178 class InterpolateToFacePress : public shamrock::solvergraph::INode {
179 using Tscal = shambase::VecComponent<Tvec>;
180
182 using ScalarEdgeScal = shamrock::solvergraph::ScalarEdge<Tscal>;
185
186 u32 block_size;
187
188 public:
189 InterpolateToFacePress(u32 block_size) : block_size(block_size) {}
190
191 EXPAND_NODE_EDGES(NODE_EDGES_PRESS)
192
194
195 inline virtual std::string _impl_get_label() const {
196 return "InterpolatePressToFacePress";
197 };
198
199 virtual std::string _impl_get_tex() const;
200 };
201
202 template<class Tvec, class TgridVec>
203 class InterpolateToFaceRhoDust : public shamrock::solvergraph::INode {
204 using Tscal = shambase::VecComponent<Tvec>;
205
207 using ScalarEdgeScal = shamrock::solvergraph::ScalarEdge<Tscal>;
210
211 u32 block_size;
212 u32 ndust;
213
214 public:
215 InterpolateToFaceRhoDust(u32 block_size, u32 ndust)
216 : block_size(block_size), ndust(ndust) {}
217
218 EXPAND_NODE_EDGES(NODE_EDGES_RHO_DUST)
219
221
222 inline virtual std::string _impl_get_label() const {
223 return "InterpolateRhoDustToFaceRhoDust";
224 };
225
226 virtual std::string _impl_get_tex() const;
227 };
228
229 template<class Tvec, class TgridVec>
230 class InterpolateToFaceVelDust : public shamrock::solvergraph::INode {
231 using Tscal = shambase::VecComponent<Tvec>;
232
234 using ScalarEdgeScal = shamrock::solvergraph::ScalarEdge<Tscal>;
237
238 u32 block_size;
239 u32 ndust;
240
241 public:
242 InterpolateToFaceVelDust(u32 block_size, u32 ndust)
243 : block_size(block_size), ndust(ndust) {}
244
245 EXPAND_NODE_EDGES(NODE_EDGES_VEL_DUST)
246
248
249 inline virtual std::string _impl_get_label() const {
250 return "InterpolateVelDustToFaceVelDust";
251 };
252
253 virtual std::string _impl_get_tex() const;
254 };
255
256} // namespace shammodels::basegodunov::modules
257
258#undef NODE_EDGES_RHO
259#undef NODE_EDGES_VEL
260#undef NODE_EDGES_PRESS
261#undef NODE_EDGES_RHO_DUST
262#undef NODE_EDGES_VEL_DUST
std::uint32_t u32
32 bit unsigned integer
virtual std::string _impl_get_tex() const
get the tex of the node
virtual std::string _impl_get_label() const
get the label of the node
virtual std::string _impl_get_label() const
get the label of the node
virtual std::string _impl_get_tex() const
get the tex of the node
virtual std::string _impl_get_tex() const
get the tex of the node
virtual std::string _impl_get_label() const
get the label of the node
virtual std::string _impl_get_tex() const
get the tex of the node
virtual std::string _impl_get_label() const
get the label of the node
virtual std::string _impl_get_tex() const
get the tex of the node
virtual std::string _impl_get_label() const
get the label of the node
Inode is node between data edges, takes multiple inputs, multiple outputs.
Definition INode.hpp:31
namespace for the basegodunov model modules