Shamrock 2025.10.0
Astrophysical Code
Loading...
Searching...
No Matches
AMRBlockStencil.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
20#include <array>
21#include <variant>
22namespace shammodels::amr::block {
23
24 struct SameLevel {
25 u32 block_idx;
26 };
27
28 struct Levelp1 {
29 std::array<u32, 8> block_child_idxs;
30 };
31
32 struct Levelm1 {
33 u32 block_idx;
34 };
35
36 struct None {};
37
42 struct alignas(8) StencilElement {
43
44 enum { SAME, LEVELP1, LEVELM1, NONE } tag = NONE;
45
46 union {
47 SameLevel level_d0;
48 Levelm1 level_dm1;
49 Levelp1 level_dp1;
50 None none;
51 };
52
53 static StencilElement make_none() {
55 ret.tag = NONE;
56 ret.none = {};
57 return ret;
58 }
59 static StencilElement make_same_level(SameLevel l) {
61 ret.tag = SAME;
62 ret.level_d0 = l;
63 return ret;
64 }
65 static StencilElement make_level_p1(Levelp1 l) {
67 ret.tag = LEVELP1;
68 ret.level_dp1 = l;
69 return ret;
70 }
71 static StencilElement make_level_m1(Levelm1 l) {
73 ret.tag = LEVELM1;
74 ret.level_dm1 = l;
75 return ret;
76 }
77
78 template<class Visitor1, class Visitor2, class Visitor3, class Visitor4>
79 inline void visitor(Visitor1 &&f1, Visitor2 &&f2, Visitor3 &&f3, Visitor4 &&f4) {
80 switch (tag) {
81 case SAME : f1(level_d0); break;
82 case LEVELM1: f2(level_dm1); break;
83 case LEVELP1: f3(level_dp1); break;
84 case NONE : f4(none); break;
85 }
86 }
87 };
88
89} // namespace shammodels::amr::block
std::uint32_t u32
32 bit unsigned integer
Traits for C++ types.
Stencil element, describe the state of a cell relative to another.