Block-Structured AMR Software Framework
 
Loading...
Searching...
No Matches
AMReX_EB2_2D_C.H
Go to the documentation of this file.
1#ifndef AMREX_EB2_2D_C_H_
2#define AMREX_EB2_2D_C_H_
3#include <AMReX_Config.H>
4
5namespace amrex::EB2 {
6
8void
9amrex_eb2_build_types (Box const& tbx, Box const& bxg2,
10 Array4<Real const> const& s,
11 Array4<EBCellFlag> const& cell,
12 Array4<Type_t> const& fx,
13 Array4<Type_t> const& fy)
14{
15 auto lo = amrex::max_lbound(tbx, bxg2);
16 auto hi = amrex::min_ubound(tbx, bxg2);
17 amrex::Loop(lo, hi,
18 [=] (int i, int j, int k) noexcept
19 {
20 if ( s(i,j ,k) < 0.0_rt && s(i+1,j ,k) < 0.0_rt
21 && s(i,j+1,k) < 0.0_rt && s(i+1,j+1,k) < 0.0_rt)
22 {
23 cell(i,j,k).setRegular();
24 }
25 else if (s(i,j ,k) >= 0.0_rt && s(i+1,j ,k) >= 0.0_rt
26 && s(i,j+1,k) >= 0.0_rt && s(i+1,j+1,k) >= 0.0_rt)
27 {
28 cell(i,j,k).setCovered();
29 }
30 else
31 {
32 cell(i,j,k).setSingleValued();
33 }
34 });
35
36 // x-face
37 const Box& xbx = amrex::surroundingNodes(bxg2,0);
38 lo = amrex::max_lbound(tbx, xbx);
39 hi = amrex::min_ubound(tbx, xbx);
40 amrex::Loop(lo, hi,
41 [=] (int i, int j, int k) noexcept
42 {
43 if (s(i,j,k) < 0.0_rt && s(i,j+1,k) < 0.0_rt) {
44 fx(i,j,k) = Type::regular;
45 } else if (s(i,j,k) >= 0.0_rt && s(i,j+1,k) >= 0.0_rt) {
46 fx(i,j,k) = Type::covered;
47 } else {
48 fx(i,j,k) = Type::irregular;
49 }
50 });
51
52 // y-face
53 const Box& ybx = amrex::surroundingNodes(bxg2,1);
54 lo = amrex::max_lbound(tbx, ybx);
55 hi = amrex::min_ubound(tbx, ybx);
56 amrex::Loop(lo, hi,
57 [=] (int i, int j, int k) noexcept
58 {
59 if (s(i,j,k) < 0.0_rt && s(i+1,j,k) < 0.0_rt) {
60 fy(i,j,k) = Type::regular;
61 } else if (s(i,j,k) >= 0.0_rt && s(i+1,j,k) >= 0.0_rt) {
62 fy(i,j,k) = Type::covered;
63 } else {
64 fy(i,j,k) = Type::irregular;
65 }
66 });
67}
68
70namespace detail {
72 int num_cuts (Real a, Real b) noexcept {
73 return (a >= 0.0_rt && b < 0.0_rt) || (b >= 0.0_rt && a < 0.0_rt);
74 }
75}
77
79int check_mvmc (int i, int j, int, Array4<Real const> const& fine)
80{
81 using detail::num_cuts;
82
83 constexpr int k = 0;
84 i *= 2;
85 j *= 2;
86 int ncuts = num_cuts(fine(i ,j ,k),fine(i+1,j ,k))
87 + num_cuts(fine(i+1,j ,k),fine(i+2,j ,k))
88 + num_cuts(fine(i ,j+2,k),fine(i+1,j+2,k))
89 + num_cuts(fine(i+1,j+2,k),fine(i+2,j+2,k))
90 + num_cuts(fine(i ,j ,k),fine(i ,j+1,k))
91 + num_cuts(fine(i ,j+1,k),fine(i ,j+2,k))
92 + num_cuts(fine(i+2,j ,k),fine(i+2,j+1,k))
93 + num_cuts(fine(i+2,j+1,k),fine(i+2,j+2,k));
94 return (ncuts != 0 && ncuts != 2);
95}
96
98int coarsen_from_fine (int i, int j, Box const& bx, int ngrow,
99 Array4<Real> const& cvol, Array4<Real> const& ccent,
100 Array4<Real> const& cba, Array4<Real> const& cbc,
101 Array4<Real> const& cbn, Array4<Real> const& capx,
102 Array4<Real> const& capy, Array4<Real> const& cfcx,
103 Array4<Real> const& cfcy, Array4<Real> const& cecx,
104 Array4<Real> const& cecy, Array4<EBCellFlag> const& cflag,
105 Array4<Real const> const& fvol, Array4<Real const> const& fcent,
106 Array4<Real const> const& fba, Array4<Real const> const& fbc,
107 Array4<Real const> const& fbn, Array4<Real const> const& fapx,
108 Array4<Real const> const& fapy, Array4<Real const> const& ffcx,
109 Array4<Real const> const& ffcy, Array4<Real const> const& fecx,
110 Array4<Real const> const& fecy, Array4<EBCellFlag const> const& fflag)
111{
112 const Box& gbx = amrex::grow(bx,ngrow);
113 const Box& xbx = amrex::surroundingNodes(bx,0);
114 const Box& ybx = amrex::surroundingNodes(bx,1);
115 const Box& xgbx = amrex::surroundingNodes(gbx,0);
116 const Box& ygbx = amrex::surroundingNodes(gbx,1);
117
118 int ierr = 0;
119 constexpr int k = 0;
120 int ii = i*2;
121 int jj = j*2;
122
123 if (bx.contains(i,j,k))
124 {
125 if (fflag(ii,jj ,k).isRegular() && fflag(ii+1,jj ,k).isRegular() &&
126 fflag(ii,jj+1,k).isRegular() && fflag(ii+1,jj+1,k).isRegular())
127 {
128 cflag(i,j,k).setRegular();
129 cvol(i,j,k) = 1.0_rt;
130 ccent(i,j,k,0) = 0.0_rt;
131 ccent(i,j,k,1) = 0.0_rt;
132 cba(i,j,k) = 0.0_rt;
133 cbc(i,j,k,0) = -1.0_rt;
134 cbc(i,j,k,1) = -1.0_rt;
135 cbn(i,j,k,0) = 0.0_rt;
136 cbn(i,j,k,1) = 0.0_rt;
137 }
138 else if (fflag(ii,jj ,k).isCovered() && fflag(ii+1,jj ,k).isCovered() &&
139 fflag(ii,jj+1,k).isCovered() && fflag(ii+1,jj+1,k).isCovered())
140 {
141 cflag(i,j,k).setCovered();
142 cvol(i,j,k) = 0.0_rt;
143 ccent(i,j,k,0) = 0.0_rt;
144 ccent(i,j,k,1) = 0.0_rt;
145 cba(i,j,k) = 0.0_rt;
146 cbc(i,j,k,0) = -1.0_rt;
147 cbc(i,j,k,1) = -1.0_rt;
148 cbn(i,j,k,0) = 0.0_rt;
149 cbn(i,j,k,1) = 0.0_rt;
150 }
151 else
152 {
153 cflag(i,j,k).setSingleValued();
154
155 cvol(i,j,k) = 0.25_rt*(fvol(ii,jj ,k) + fvol(ii+1,jj ,k) +
156 fvol(ii,jj+1,k) + fvol(ii+1,jj+1,k));
157 Real cvolinv = 1.0_rt/cvol(i,j,k);
158
159 ccent(i,j,k,0) = 0.25_rt * cvolinv *
160 (fvol(ii ,jj ,k)*(0.5_rt*fcent(ii ,jj ,k,0)-0.25_rt) +
161 fvol(ii+1,jj ,k)*(0.5_rt*fcent(ii+1,jj ,k,0)+0.25_rt) +
162 fvol(ii ,jj+1,k)*(0.5_rt*fcent(ii ,jj+1,k,0)-0.25_rt) +
163 fvol(ii+1,jj+1,k)*(0.5_rt*fcent(ii+1,jj+1,k,0)+0.25_rt));
164 ccent(i,j,k,1) = 0.25_rt * cvolinv *
165 (fvol(ii ,jj ,k)*(0.5_rt*fcent(ii ,jj ,k,1)-0.25_rt) +
166 fvol(ii+1,jj ,k)*(0.5_rt*fcent(ii+1,jj ,k,1)-0.25_rt) +
167 fvol(ii ,jj+1,k)*(0.5_rt*fcent(ii ,jj+1,k,1)+0.25_rt) +
168 fvol(ii+1,jj+1,k)*(0.5_rt*fcent(ii+1,jj+1,k,1)+0.25_rt));
169
170 cba(i,j,k) = 0.5_rt*(fba(ii,jj ,k) + fba(ii+1,jj ,k) +
171 fba(ii,jj+1,k) + fba(ii+1,jj+1,k));
172 Real cbainv = 1.0_rt/cba(i,j,k);
173
174 cbc(i,j,k,0) = 0.5_rt * cbainv *
175 (fba(ii ,jj ,k)*(0.5_rt*fbc(ii ,jj ,k,0)-0.25_rt) +
176 fba(ii+1,jj ,k)*(0.5_rt*fbc(ii+1,jj ,k,0)+0.25_rt) +
177 fba(ii ,jj+1,k)*(0.5_rt*fbc(ii ,jj+1,k,0)-0.25_rt) +
178 fba(ii+1,jj+1,k)*(0.5_rt*fbc(ii+1,jj+1,k,0)+0.25_rt));
179 cbc(i,j,k,1) = 0.5_rt * cbainv *
180 (fba(ii ,jj ,k)*(0.5_rt*fbc(ii ,jj ,k,1)-0.25_rt) +
181 fba(ii+1,jj ,k)*(0.5_rt*fbc(ii+1,jj ,k,1)-0.25_rt) +
182 fba(ii ,jj+1,k)*(0.5_rt*fbc(ii ,jj+1,k,1)+0.25_rt) +
183 fba(ii+1,jj+1,k)*(0.5_rt*fbc(ii+1,jj+1,k,1)+0.25_rt));
184
185 Real nx = fbn(ii ,jj ,k,0)*fba(ii ,jj ,k)
186 + fbn(ii+1,jj ,k,0)*fba(ii+1,jj ,k)
187 + fbn(ii ,jj+1,k,0)*fba(ii ,jj+1,k)
188 + fbn(ii+1,jj+1,k,0)*fba(ii+1,jj+1,k);
189 Real ny = fbn(ii ,jj ,k,1)*fba(ii ,jj ,k)
190 + fbn(ii+1,jj ,k,1)*fba(ii+1,jj ,k)
191 + fbn(ii ,jj+1,k,1)*fba(ii ,jj+1,k)
192 + fbn(ii+1,jj+1,k,1)*fba(ii+1,jj+1,k);
193 Real nfac = 1.0_rt/std::sqrt(nx*nx+ny*ny+1.e-30_rt);
194 cbn(i,j,k,0) = nx*nfac;
195 cbn(i,j,k,1) = ny*nfac;
196 ierr = (nx == 0.0_rt && ny == 0.0_rt)
197 // we must check the enclosing surface to make sure the coarse cell does not
198 // fully contains the geometry object.
199 || ( fapx(ii,jj ,k)==1.0_rt && fapx(ii+2,jj ,k)==1.0_rt
200 && fapx(ii,jj+1,k)==1.0_rt && fapx(ii+2,jj+1,k)==1.0_rt
201 && fapy(ii,jj ,k)==1.0_rt && fapy(ii+1,jj ,k)==1.0_rt
202 && fapy(ii,jj+2,k)==1.0_rt && fapy(ii+1,jj+2,k)==1.0_rt);
203 }
204 }
205 else if (gbx.contains(i,j,k))
206 {
207 cvol(i,j,k) = 1.0_rt;
208 ccent(i,j,k,0) = 0.0_rt;
209 ccent(i,j,k,1) = 0.0_rt;
210 cba(i,j,k) = 0.0_rt;
211 cbc(i,j,k,0) = -1.0_rt;
212 cbc(i,j,k,1) = -1.0_rt;
213 cbn(i,j,k,0) = 0.0_rt;
214 cbn(i,j,k,1) = 0.0_rt;
215 }
216
217 if (xbx.contains(i,j,k))
218 {
219 capx(i,j,k) = 0.5_rt*(fapx(ii,jj,k) + fapx(ii,jj+1,k));
220 if (capx(i,j,k) != 0.0_rt) {
221 cfcx(i,j,k) = 0.5_rt / capx(i,j,k) *
222 (fapx(ii,jj ,k)*(0.5_rt*ffcx(ii,jj ,k)-0.25_rt) +
223 fapx(ii,jj+1,k)*(0.5_rt*ffcx(ii,jj+1,k)+0.25_rt));
224 if (fecy(ii,jj,k) == Real(1.0) && fecy(ii,jj+1,k) == Real(1.0)) {
225 cecy(i,j,k) = Real(1.0);
226 } else {
227 cecy(i,j,k) = cfcx(i,j,k);
228 }
229 }
230 else {
231 cfcx(i,j,k) = 0.0_rt;
232 cecy(i,j,k) = -1.0_rt;
233 }
234 }
235 else if (xgbx.contains(i,j,k))
236 {
237 capx(i,j,k) = 1.0_rt;
238 cfcx(i,j,k) = 0.0_rt;
239 cecy(i,j,k) = 1.0_rt;
240 }
241
242 if (ybx.contains(i,j,k))
243 {
244 capy(i,j,k) = 0.5_rt*(fapy(ii,jj,k) + fapy(ii+1,jj,k));
245 if (capy(i,j,k) != 0.0_rt) {
246 cfcy(i,j,k) = 0.5_rt / capy(i,j,k) *
247 (fapy(ii ,jj,k)*(0.5_rt*ffcy(ii ,jj,k)-0.25_rt) +
248 fapy(ii+1,jj,k)*(0.5_rt*ffcy(ii+1,jj,k)+0.25_rt));
249 if (fecx(ii,jj,k) == Real(1.0) && fecx(ii+1,jj,k) == Real(1.0)) {
250 cecx(i,j,k) = Real(1.0);
251 } else {
252 cecx(i,j,k) = cfcy(i,j,k);
253 }
254 } else {
255 cfcy(i,j,k) = 0.0_rt;
256 cecx(i,j,k) = -1.0_rt;
257 }
258 }
259 else if (ygbx.contains(i,j,k))
260 {
261 capy(i,j,k) = 1.0_rt;
262 cfcy(i,j,k) = 0.0_rt;
263 cecx(i,j,k) = 1.0_rt;
264 }
265
266 return ierr;
267}
268
270void build_cellflag_from_ap (int i, int j, Array4<EBCellFlag> const& cflag,
272{
273 constexpr int k = 0;
274
275 // By default, all neighbors are already set.
276 auto flg = cflag(i,j,k);
277
278 if (apx(i ,j ,k) == 0.0_rt) { flg.setDisconnected(-1, 0, 0); }
279 if (apx(i+1,j ,k) == 0.0_rt) { flg.setDisconnected( 1, 0, 0); }
280 if (apy(i ,j ,k) == 0.0_rt) { flg.setDisconnected( 0,-1, 0); }
281 if (apy(i ,j+1,k) == 0.0_rt) { flg.setDisconnected( 0, 1, 0); }
282
283 if ((apx(i,j ,k) == 0.0_rt || apy(i-1,j,k) == 0.0_rt) &&
284 (apx(i,j-1,k) == 0.0_rt || apy(i ,j,k) == 0.0_rt))
285 {
286 flg.setDisconnected(-1,-1,0);
287 }
288
289 if ((apx(i+1,j ,k) == 0.0_rt || apy(i+1,j,k) == 0.0_rt) &&
290 (apx(i+1,j-1,k) == 0.0_rt || apy(i ,j,k) == 0.0_rt))
291 {
292 flg.setDisconnected(1,-1,0);
293 }
294
295 if ((apx(i,j ,k) == 0.0_rt || apy(i-1,j+1,k) == 0.0_rt) &&
296 (apx(i,j+1,k) == 0.0_rt || apy(i ,j+1,k) == 0.0_rt))
297 {
298 flg.setDisconnected(-1,1,0);
299 }
300
301 if ((apx(i+1,j ,k) == 0.0_rt || apy(i+1,j+1,k) == 0.0_rt) &&
302 (apx(i+1,j+1,k) == 0.0_rt || apy(i ,j+1,k) == 0.0_rt))
303 {
304 flg.setDisconnected(1,1,0);
305 }
306
307 cflag(i,j,k) = flg;
308}
309
310}
311
312#endif
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:119
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
Array4< Real > fine
Definition AMReX_InterpFaceRegister.cpp:90
__host__ __device__ bool contains(const IntVectND< dim > &p) const noexcept
Return true if argument is contained within BoxND.
Definition AMReX_Box.H:212
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:79
__host__ __device__ BoxND< dim > grow(const BoxND< dim > &b, int i) noexcept
Grow BoxND in all directions by given amount.
Definition AMReX_Box.H:1280
static constexpr Type_t regular
Definition AMReX_EB2_Graph.H:38
static constexpr Type_t covered
Definition AMReX_EB2_Graph.H:39
static constexpr Type_t irregular
Definition AMReX_EB2_Graph.H:40
Definition AMReX_FabArrayBase.H:33
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int coarsen_from_fine(int i, int j, Box const &bx, int ngrow, Array4< Real > const &cvol, Array4< Real > const &ccent, Array4< Real > const &cba, Array4< Real > const &cbc, Array4< Real > const &cbn, Array4< Real > const &capx, Array4< Real > const &capy, Array4< Real > const &cfcx, Array4< Real > const &cfcy, Array4< Real > const &cecx, Array4< Real > const &cecy, Array4< EBCellFlag > const &cflag, Array4< Real const > const &fvol, Array4< Real const > const &fcent, Array4< Real const > const &fba, Array4< Real const > const &fbc, Array4< Real const > const &fbn, Array4< Real const > const &fapx, Array4< Real const > const &fapy, Array4< Real const > const &ffcx, Array4< Real const > const &ffcy, Array4< Real const > const &fecx, Array4< Real const > const &fecy, Array4< EBCellFlag const > const &fflag)
Definition AMReX_EB2_2D_C.H:98
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void build_cellflag_from_ap(int i, int j, Array4< EBCellFlag > const &cflag, Array4< Real const > const &apx, Array4< Real const > const &apy)
Definition AMReX_EB2_2D_C.H:270
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void amrex_eb2_build_types(Box const &tbx, Box const &bxg2, Array4< Real const > const &s, Array4< EBCellFlag > const &cell, Array4< Type_t > const &fx, Array4< Type_t > const &fy)
Definition AMReX_EB2_2D_C.H:9
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int check_mvmc(int i, int j, int, Array4< Real const > const &fine)
Definition AMReX_EB2_2D_C.H:79
__host__ __device__ BoxND< dim > surroundingNodes(const BoxND< dim > &b, int dir) noexcept
Return a BoxND with NODE based coordinates in direction dir that encloses BoxND b....
Definition AMReX_Box.H:1522
__host__ __device__ Dim3 min_ubound(BoxND< dim > const &b1, BoxND< dim > const &b2) noexcept
Definition AMReX_Box.H:2053
__host__ __device__ void Loop(Dim3 lo, Dim3 hi, F const &f) noexcept
Definition AMReX_Loop.H:127
__host__ __device__ Dim3 max_lbound(BoxND< dim > const &b1, BoxND< dim > const &b2) noexcept
Definition AMReX_Box.H:2034
Definition AMReX_Array4.H:61