Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_EBData.H
Go to the documentation of this file.
1#ifndef AMREX_EB_DATA_H_
2#define AMREX_EB_DATA_H_
3#include <AMReX_Config.H>
4
5#include <AMReX_EBCellFlag.H>
6#include <AMReX_Random.H>
7
14namespace amrex
15{
16
18enum struct EBData_t : int
19{
20 levelset, // level set
21 volfrac, // volume fraction
22 centroid, // volume centroid
23 bndrycent, // boundary centroid
24 bndrynorm, // boundary normal
25 bndryarea, // boundary area
26 AMREX_D_DECL(apx, apy, apz), // area fraction
27 AMREX_D_DECL(fcx, fcy, fcz), // face centroid
28 AMREX_D_DECL(ecx, ecy, ecz), // edge centroid
29 cellflag // EBCellFlag
30};
31
33struct EBData
34{
35 template <EBData_t T>
38 auto get (int i, int j, int k) const noexcept
39 {
40 if constexpr (T == EBData_t::cellflag) {
41 return (*m_cell_flag)(i,j,k);
42 } else {
43 return m_real_data[static_cast<int>(T)](i,j,k);
44 }
45 }
46
47 template <EBData_t T>
50 const auto& get () const noexcept
51 {
52 if constexpr (T == EBData_t::cellflag) {
53 return *m_cell_flag;
54 } else {
55 return m_real_data[static_cast<int>(T)];
56 }
57 }
58
59 template <EBData_t T>
60 requires ( T == EBData_t::centroid
64 || T==EBData_t::fcy,
65 || T==EBData_t::fcz) )
68 auto get (int i, int j, int k, int n) const noexcept
69 {
70 return m_real_data[static_cast<int>(T)](i,j,k,n);
71 }
72
80 randomPointOnEB (int i, int j, int k, RandomEngine const& engine) const
81 {
82 Real nx = this->get<EBData_t::bndrynorm>(i,j,k,0);
83 Real ny = this->get<EBData_t::bndrynorm>(i,j,k,1);
84 Real bcx = this->get<EBData_t::bndrycent>(i,j,k,0);
85 Real bcy = this->get<EBData_t::bndrycent>(i,j,k,1);
86 int dir = (std::abs(nx) >= std::abs(ny)) ? 0 : 1;
87#if (AMREX_SPACEDIM == 2)
88 auto f = [&] (Real n0, Real n1, Real bc0, Real bc1)
89 {
90 Real rn = amrex::Random(engine);
91 if (n1 == 0) {
92 return amrex::makeTuple(bc0, rn-Real(0.5));
93 } else {
94 Real nn = n0/n1; // Note that we have n0 >= n1. So nn != 0.
95 Real ym = bc1+nn*(bc0-Real(-0.5)); // where x=-0.5 and EB intersects
96 Real yp = bc1+nn*(bc0-Real( 0.5)); // where x= 0.5 and EB intersects
97 Real ymin = std::min(ym,yp);
98 Real ymax = std::max(ym,yp);
99 ymin = std::max(ymin, Real(-0.5));
100 ymax = std::min(ymax, Real( 0.5));
101 Real y = rn*(ymax-ymin) + ymin;
102 Real x = bc0 - (y-bc1)*n1/n0;
103 return amrex::makeTuple(x,y);
104 }
105 };
106
107 if (dir == 0) {
108 auto [x,y] = f( nx, ny,
109 bcx,bcy);
110 return GpuArray<Real,2>{x,y};
111 } else {
112 auto [y,x] = f( ny, nx,
113 bcy,bcx);
114 return GpuArray<Real,2>{x,y};
115 }
116#else
117 Real nz = this->get<EBData_t::bndrynorm>(i,j,k,2);
118 Real bcz = this->get<EBData_t::bndrycent>(i,j,k,2);
119 if (std::abs(nz) > std::abs(nx) && std::abs(nz) > std::abs(ny)) {
120 dir = 2;
121 }
122 auto f = [&] (Real n0, Real n1, Real n2, Real bc0, Real bc1, Real bc2)
123 { // Note that n0 >= n1 >= n2;
124 if (n1 == 0 && n2 == 0) {
125 return amrex::makeTuple(bc0,
126 amrex::Random(engine)-Real(0.5),
127 amrex::Random(engine)-Real(0.5));
128 } else if (n2 == 0) {
129 Real nn = n0/n1;
130 Real ym = bc1+nn*(bc0-Real(-0.5));
131 Real yp = bc1+nn*(bc0-Real( 0.5));
132 Real ymin = std::min(ym,yp);
133 Real ymax = std::max(ym,yp);
134 ymin = std::max(ymin, Real(-0.5));
135 ymax = std::min(ymax, Real( 0.5));
136 Real y = amrex::Random(engine)*(ymax-ymin) + ymin;
137 Real z = amrex::Random(engine) - Real(0.5);
138 Real x = bc0 - ((y-bc1)*n1+(z-bc2)*n2)/n0;
139 return amrex::makeTuple(x,y,z);
140 } else {
141 Real y0 = bc1 - ((Real(-0.5)-bc0)*n0+(Real(-0.5)-bc2)*n2)/n1;
142 Real y1 = bc1 - ((Real( 0.5)-bc0)*n0+(Real(-0.5)-bc2)*n2)/n1;
143 Real y2 = bc1 - ((Real(-0.5)-bc0)*n0+(Real( 0.5)-bc2)*n2)/n1;
144 Real y3 = bc1 - ((Real( 0.5)-bc0)*n0+(Real( 0.5)-bc2)*n2)/n1;
145 Real ymin = amrex::min(y0,y1,y2,y3);
146 Real ymax = amrex::max(y0,y1,y2,y3);
147 ymin = std::max(ymin, Real(-0.5));
148 ymax = std::min(ymax, Real( 0.5));
149 Real z0 = bc2 - ((Real(-0.5)-bc0)*n0+(Real(-0.5)-bc1)*n1)/n2;
150 Real z1 = bc2 - ((Real( 0.5)-bc0)*n0+(Real(-0.5)-bc1)*n1)/n2;
151 Real z2 = bc2 - ((Real(-0.5)-bc0)*n0+(Real( 0.5)-bc1)*n1)/n2;
152 Real z3 = bc2 - ((Real( 0.5)-bc0)*n0+(Real( 0.5)-bc1)*n1)/n2;
153 Real zmin = amrex::min(z0,z1,z2,z3);
154 Real zmax = amrex::max(z0,z1,z2,z3);
155 zmin = std::max(zmin, Real(-0.5));
156 zmax = std::min(zmax, Real( 0.5));
157 Real x, y, z;
158 do {
159 y = amrex::Random(engine)*(ymax-ymin) + ymin;
160 z = amrex::Random(engine)*(zmax-zmin) + zmin;
161 x = bc0 - ((y-bc1)*n1+(z-bc2)*n2)/n0;
162 } while (x > Real(0.5) || x < Real(-0.5));
163 return amrex::makeTuple(x,y,z);
164 }
165 };
166 if (dir == 0) {
167 if (std::abs(ny) >= std::abs(nz)) {
168 auto [x,y,z] = f( nx, ny, nz,
169 bcx,bcy,bcz);
170 return GpuArray<Real,3>{x, y, z};
171 } else {
172 auto [x,z,y] = f( nx, nz, ny,
173 bcx,bcz,bcy);
174 return GpuArray<Real,3>{x, y, z};
175 }
176 } else if (dir == 1) {
177 if (std::abs(nx) >= std::abs(nz)) {
178 auto [y,x,z] = f( ny, nx, nz,
179 bcy,bcx,bcz);
180 return GpuArray<Real,3>{x, y, z};
181 } else {
182 auto [y,z,x] = f( ny, nz, nx,
183 bcy,bcz,bcx);
184 return GpuArray<Real,3>{x, y, z};
185 }
186 } else {
187 if (std::abs(nx) >= std::abs(ny)) {
188 auto [z,x,y] = f( nz, nx, ny,
189 bcz,bcx,bcy);
190 return GpuArray<Real,3>{x, y, z};
191 } else {
192 auto [z,y,x] = f( nz, ny, nx,
193 bcz,bcy,bcx);
194 return GpuArray<Real,3>{x, y, z};
195 }
196 }
197#endif
198 }
199
200 static constexpr int real_data_size = static_cast<int>(EBData_t::cellflag);
201
204};
205
208{
209 template <EBData_t T>
212 auto get (int box_no, int i, int j, int k) const noexcept
213 {
214 if constexpr (T == EBData_t::cellflag) {
215 return m_cell_flag[box_no](i,j,k);
216 } else {
217 return m_real_data[(box_no*real_data_size) + static_cast<int>(T)](i,j,k);
218 }
219 }
220
221 template <EBData_t T>
222 requires ( T == EBData_t::centroid
223 || T == EBData_t::bndrycent
224 || T == EBData_t::bndrynorm
226 || T==EBData_t::fcy,
227 || T==EBData_t::fcz))
230 auto get (int box_no, int i, int j, int k, int n) const noexcept
231 {
232 return m_real_data[(box_no*real_data_size) + static_cast<int>(T)](i,j,k,n);
233 }
234
237 EBData get (int box_no) const noexcept
238 {
239 return EBData{.m_cell_flag = m_cell_flag + box_no,
240 .m_real_data = m_real_data + (box_no * real_data_size)};
241 }
242
243 static constexpr int real_data_size = static_cast<int>(EBData_t::cellflag);
244
247};
248
249}
250#endif
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:119
#define AMREX_RESTRICT
Definition AMReX_Extension.H:32
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
#define AMREX_D_TERM(a, b, c)
Definition AMReX_SPACE.H:172
#define AMREX_D_DECL(a, b, c)
Definition AMReX_SPACE.H:171
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:79
Real Random()
Generate a psuedo-random real from uniform distribution.
Definition AMReX_Random.cpp:133
Definition AMReX_Amr.cpp:50
__host__ __device__ constexpr GpuTuple< detail::tuple_decay_t< Ts >... > makeTuple(Ts &&... args)
Definition AMReX_Tuple.H:269
__host__ __device__ constexpr const T & min(const T &a, const T &b) noexcept
Definition AMReX_Algorithm.H:25
__host__ __device__ constexpr const T & max(const T &a, const T &b) noexcept
Definition AMReX_Algorithm.H:45
EBData_t
Tags that index into EB data arrays stored in EBData/EBDataArrays.
Definition AMReX_EBData.H:19
A multidimensional array accessor.
Definition AMReX_Array4.H:285
Views aggregating EBData for multiple boxes.
Definition AMReX_EBData.H:208
Array4< Real const > const *__restrict__ m_real_data
Definition AMReX_EBData.H:246
static constexpr int real_data_size
Definition AMReX_EBData.H:243
Array4< EBCellFlag const > const *__restrict__ m_cell_flag
Definition AMReX_EBData.H:245
__host__ __device__ auto get(int box_no, int i, int j, int k) const noexcept
Access scalar EB data for box box_no at (i,j,k).
Definition AMReX_EBData.H:212
__host__ __device__ EBData get(int box_no) const noexcept
Return an EBData wrapper anchored at box box_no.
Definition AMReX_EBData.H:237
Set of Array4 views to EB data for a single box (plus helpers).
Definition AMReX_EBData.H:34
__host__ __device__ GpuArray< Real, 3 > randomPointOnEB(int i, int j, int k, RandomEngine const &engine) const
Generate a uniformly random point on the EB face inside cell (i,j,k).
Definition AMReX_EBData.H:80
__host__ __device__ const auto & get() const noexcept
Access the Array4 backing EB data T.
Definition AMReX_EBData.H:50
Array4< EBCellFlag const > const * m_cell_flag
Definition AMReX_EBData.H:202
static constexpr int real_data_size
Definition AMReX_EBData.H:200
Array4< Real const > const * m_real_data
Definition AMReX_EBData.H:203
__host__ __device__ auto get(int i, int j, int k) const noexcept
Access scalar EB data entries at cell (i,j,k).
Definition AMReX_EBData.H:38
Fixed-size array that can be used on GPU.
Definition AMReX_Array.H:43
Definition AMReX_RandomEngine.H:72