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
19#include "shambackends/vec.hpp"
27
29
30 template<class Tvec, class TgridVec>
32 using Tscal = shambase::VecComponent<Tvec>;
33
35
36 u32 block_size;
37
38 public:
39 InterpolateToFaceRho(u32 block_size) : block_size(block_size) {}
40
62
63 inline void set_edges(
64 std::shared_ptr<shamrock::solvergraph::ScalarEdge<Tscal>> dt_interp,
65 std::shared_ptr<solvergraph::OrientedAMRGraphEdge<Tvec, TgridVec>> cell_neigh_graph,
66 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tscal>> spans_block_cell_sizes,
67 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_cell0block_aabb_lower,
68 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tscal>> spans_rhos,
69 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_grad_rho,
70 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_vel,
71 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_dx_vel,
72 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_dy_vel,
73 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_dz_vel,
74 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>
75 &rho_face_xp,
76 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>
77 &rho_face_xm,
78 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>
79 &rho_face_yp,
80 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>
81 &rho_face_ym,
82 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>
83 &rho_face_zp,
84 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>
85 &rho_face_zm) {
87 dt_interp,
88 cell_neigh_graph,
89 spans_block_cell_sizes,
90 spans_cell0block_aabb_lower,
91 spans_rhos,
92 spans_grad_rho,
93 spans_vel,
94 spans_dx_vel,
95 spans_dy_vel,
96 spans_dz_vel,
97 });
99 rho_face_xp,
100 rho_face_xm,
101 rho_face_yp,
102 rho_face_ym,
103 rho_face_zp,
104 rho_face_zm,
105 });
106 }
107
108 inline Edges get_edges() {
109 return Edges{
110 get_ro_edge<shamrock::solvergraph::ScalarEdge<Tscal>>(0),
111 get_ro_edge<solvergraph::OrientedAMRGraphEdge<Tvec, TgridVec>>(1),
112 get_ro_edge<shamrock::solvergraph::IFieldSpan<Tscal>>(2),
114 get_ro_edge<shamrock::solvergraph::IFieldSpan<Tscal>>(4),
116 get_ro_edge<shamrock::solvergraph::IFieldSpan<Tvec>>(6),
118 get_ro_edge<shamrock::solvergraph::IFieldSpan<Tvec>>(8),
120 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(0),
121 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(1),
122 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(2),
123 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(3),
124 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(4),
125 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(5),
126 };
127 }
128
130
131 inline virtual std::string _impl_get_label() const { return "InterpolateRhoToFaceRho"; };
132
133 virtual std::string _impl_get_tex() const;
134 };
135
136 template<class Tvec, class TgridVec>
138 using Tscal = shambase::VecComponent<Tvec>;
139
141
142 u32 block_size;
143
144 public:
145 InterpolateToFaceVel(u32 block_size) : block_size(block_size) {}
146
168
169 inline void set_edges(
170 std::shared_ptr<shamrock::solvergraph::ScalarEdge<Tscal>> dt_interp,
171 std::shared_ptr<solvergraph::OrientedAMRGraphEdge<Tvec, TgridVec>> cell_neigh_graph,
172 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tscal>> spans_block_cell_sizes,
173 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_cell0block_aabb_lower,
174 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tscal>> spans_rhos,
175 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_grad_P,
176 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_vel,
177 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_dx_vel,
178 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_dy_vel,
179 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_dz_vel,
180
181 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>> &vel_face_xp,
182 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>> &vel_face_xm,
183 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>> &vel_face_yp,
184 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>> &vel_face_ym,
185 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>> &vel_face_zp,
186 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>
187 &vel_face_zm) {
189 dt_interp,
190 cell_neigh_graph,
191 spans_block_cell_sizes,
192 spans_cell0block_aabb_lower,
193 spans_rhos,
194 spans_grad_P,
195 spans_vel,
196 spans_dx_vel,
197 spans_dy_vel,
198 spans_dz_vel,
199 });
201 vel_face_xp,
202 vel_face_xm,
203 vel_face_yp,
204 vel_face_ym,
205 vel_face_zp,
206 vel_face_zm,
207 });
208 }
209
210 inline Edges get_edges() {
211 return Edges{
212 get_ro_edge<shamrock::solvergraph::ScalarEdge<Tscal>>(0),
213 get_ro_edge<solvergraph::OrientedAMRGraphEdge<Tvec, TgridVec>>(1),
214 get_ro_edge<shamrock::solvergraph::IFieldSpan<Tscal>>(2),
216 get_ro_edge<shamrock::solvergraph::IFieldSpan<Tscal>>(4),
218 get_ro_edge<shamrock::solvergraph::IFieldSpan<Tvec>>(6),
220 get_ro_edge<shamrock::solvergraph::IFieldSpan<Tvec>>(8),
222 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(0),
223 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(1),
224 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(2),
225 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(3),
226 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(4),
227 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(5),
228 };
229 }
230
232
233 inline virtual std::string _impl_get_label() const { return "InterpolateVelToFaceVel"; };
234
235 virtual std::string _impl_get_tex() const;
236 };
237
238 template<class Tvec, class TgridVec>
240 using Tscal = shambase::VecComponent<Tvec>;
241
243
244 u32 block_size;
245 Tscal gamma;
246
247 public:
248 InterpolateToFacePress(u32 block_size, Tscal gamma)
249 : block_size(block_size), gamma(gamma) {}
250
272
273 inline void set_edges(
274 std::shared_ptr<shamrock::solvergraph::ScalarEdge<Tscal>> dt_interp,
275 std::shared_ptr<solvergraph::OrientedAMRGraphEdge<Tvec, TgridVec>> cell_neigh_graph,
276 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tscal>> spans_block_cell_sizes,
277 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_cell0block_aabb_lower,
278 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tscal>> spans_press,
279 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_grad_P,
280 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_vel,
281 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_dx_vel,
282 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_dy_vel,
283 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_dz_vel,
284
285 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>
286 &press_face_xp,
287 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>
288 &press_face_xm,
289 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>
290 &press_face_yp,
291 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>
292 &press_face_ym,
293 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>
294 &press_face_zp,
295 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>
296 &press_face_zm) {
298 dt_interp,
299 cell_neigh_graph,
300 spans_block_cell_sizes,
301 spans_cell0block_aabb_lower,
302 spans_press,
303 spans_grad_P,
304 spans_vel,
305 spans_dx_vel,
306 spans_dy_vel,
307 spans_dz_vel,
308 });
310 press_face_xp,
311 press_face_xm,
312 press_face_yp,
313 press_face_ym,
314 press_face_zp,
315 press_face_zm,
316 });
317 }
318
319 inline Edges get_edges() {
320 return Edges{
321 get_ro_edge<shamrock::solvergraph::ScalarEdge<Tscal>>(0),
322 get_ro_edge<solvergraph::OrientedAMRGraphEdge<Tvec, TgridVec>>(1),
323 get_ro_edge<shamrock::solvergraph::IFieldSpan<Tscal>>(2),
325 get_ro_edge<shamrock::solvergraph::IFieldSpan<Tscal>>(4),
327 get_ro_edge<shamrock::solvergraph::IFieldSpan<Tvec>>(6),
329 get_ro_edge<shamrock::solvergraph::IFieldSpan<Tvec>>(8),
331 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(0),
332 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(1),
333 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(2),
334 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(3),
335 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(4),
336 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(5),
337 };
338 }
339
341
342 inline virtual std::string _impl_get_label() const {
343 return "InterpolatePressToFacePress";
344 };
345
346 virtual std::string _impl_get_tex() const;
347 };
348
349 template<class Tvec, class TgridVec>
351 using Tscal = shambase::VecComponent<Tvec>;
352
354
355 u32 block_size;
356 u32 ndust;
357
358 public:
359 InterpolateToFaceRhoDust(u32 block_size, u32 ndust)
360 : block_size(block_size), ndust(ndust) {}
361
383
384 inline void set_edges(
385 std::shared_ptr<shamrock::solvergraph::ScalarEdge<Tscal>> dt_interp,
386 std::shared_ptr<solvergraph::OrientedAMRGraphEdge<Tvec, TgridVec>> cell_neigh_graph,
387 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tscal>> spans_block_cell_sizes,
388 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_cell0block_aabb_lower,
389 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tscal>> spans_rhos_dust,
390 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_grad_rho_dust,
391 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_vel_dust,
392 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_dx_vel_dust,
393 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_dy_vel_dust,
394 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_dz_vel_dust,
395 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>
396 &rho_dust_face_xp,
397 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>
398 &rho_dust_face_xm,
399 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>
400 &rho_dust_face_yp,
401 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>
402 &rho_dust_face_ym,
403 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>
404 &rho_dust_face_zp,
405 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>
406 &rho_dust_face_zm) {
408 dt_interp,
409 cell_neigh_graph,
410 spans_block_cell_sizes,
411 spans_cell0block_aabb_lower,
412 spans_rhos_dust,
413 spans_grad_rho_dust,
414 spans_vel_dust,
415 spans_dx_vel_dust,
416 spans_dy_vel_dust,
417 spans_dz_vel_dust,
418 });
420 rho_dust_face_xp,
421 rho_dust_face_xm,
422 rho_dust_face_yp,
423 rho_dust_face_ym,
424 rho_dust_face_zp,
425 rho_dust_face_zm,
426 });
427 }
428
429 inline Edges get_edges() {
430 return Edges{
431 get_ro_edge<shamrock::solvergraph::ScalarEdge<Tscal>>(0),
432 get_ro_edge<solvergraph::OrientedAMRGraphEdge<Tvec, TgridVec>>(1),
433 get_ro_edge<shamrock::solvergraph::IFieldSpan<Tscal>>(2),
435 get_ro_edge<shamrock::solvergraph::IFieldSpan<Tscal>>(4),
437 get_ro_edge<shamrock::solvergraph::IFieldSpan<Tvec>>(6),
439 get_ro_edge<shamrock::solvergraph::IFieldSpan<Tvec>>(8),
441 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(0),
442 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(1),
443 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(2),
444 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(3),
445 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(4),
446 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tscal, 2>>>(5),
447 };
448 }
449
451
452 inline virtual std::string _impl_get_label() const { return "InterpolateRhoToFaceRho"; };
453
454 virtual std::string _impl_get_tex() const;
455 };
456
457 template<class Tvec, class TgridVec>
459 using Tscal = shambase::VecComponent<Tvec>;
460
462
463 u32 block_size;
464 u32 ndust;
465
466 public:
467 InterpolateToFaceVelDust(u32 block_size, u32 ndust)
468 : block_size(block_size), ndust(ndust) {}
469
490
491 inline void set_edges(
492 std::shared_ptr<shamrock::solvergraph::ScalarEdge<Tscal>> dt_interp,
493 std::shared_ptr<solvergraph::OrientedAMRGraphEdge<Tvec, TgridVec>> cell_neigh_graph,
494 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tscal>> spans_block_cell_sizes,
495 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_cell0block_aabb_lower,
496 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tscal>> spans_rhos_dust,
497 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_vel_dust,
498 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_dx_vel_dust,
499 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_dy_vel_dust,
500 std::shared_ptr<shamrock::solvergraph::IFieldSpan<Tvec>> spans_dz_vel_dust,
501
502 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>
503 &vel_dust_face_xp,
504 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>
505 &vel_dust_face_xm,
506 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>
507 &vel_dust_face_yp,
508 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>
509 &vel_dust_face_ym,
510 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>
511 &vel_dust_face_zp,
512 std::shared_ptr<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>
513 &vel_dust_face_zm) {
515 dt_interp,
516 cell_neigh_graph,
517 spans_block_cell_sizes,
518 spans_cell0block_aabb_lower,
519 spans_rhos_dust,
520 spans_vel_dust,
521 spans_dx_vel_dust,
522 spans_dy_vel_dust,
523 spans_dz_vel_dust,
524 });
526 vel_dust_face_xp,
527 vel_dust_face_xm,
528 vel_dust_face_yp,
529 vel_dust_face_ym,
530 vel_dust_face_zp,
531 vel_dust_face_zm,
532 });
533 }
534
535 inline Edges get_edges() {
536 return Edges{
537 get_ro_edge<shamrock::solvergraph::ScalarEdge<Tscal>>(0),
538 get_ro_edge<solvergraph::OrientedAMRGraphEdge<Tvec, TgridVec>>(1),
539 get_ro_edge<shamrock::solvergraph::IFieldSpan<Tscal>>(2),
541 get_ro_edge<shamrock::solvergraph::IFieldSpan<Tscal>>(4),
543 get_ro_edge<shamrock::solvergraph::IFieldSpan<Tvec>>(6),
545 get_ro_edge<shamrock::solvergraph::IFieldSpan<Tvec>>(8),
546 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(0),
547 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(1),
548 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(2),
549 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(3),
550 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(4),
551 get_rw_edge<solvergraph::NeighGraphLinkFieldEdge<std::array<Tvec, 2>>>(5),
552 };
553 }
554
556
557 inline virtual std::string _impl_get_label() const { return "InterpolateVelToFaceVel"; };
558
559 virtual std::string _impl_get_tex() const;
560 };
561
562} // namespace shammodels::basegodunov::modules
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
Interface for a solver graph edge representing a field as spans.
Inode is node between data edges, takes multiple inputs, multiple outputs.
Definition INode.hpp:30
T & get_rw_edge(int slot)
Get a read write edge and cast it to the type T.
Definition INode.hpp:86
void __internal_set_rw_edges(std::vector< std::shared_ptr< IEdge > > new_rw_edges)
Set the read write edges.
Definition INode.hpp:181
void __internal_set_ro_edges(std::vector< std::shared_ptr< IEdge > > new_ro_edges)
Set the read only edges.
Definition INode.hpp:171
const T & get_ro_edge(int slot)
Get a read only edge and cast it to the type T.
Definition INode.hpp:80
Slope mode enum + json serialization/deserialization.
namespace for the basegodunov model modules
SlopeMode
Slope limiter modes.