Block-Structured AMR Software Framework
 
Loading...
Searching...
No Matches
AMReX_EB2_3D_C.H
Go to the documentation of this file.
1#ifndef AMREX_EB2_3D_C_H_
2#define AMREX_EB2_3D_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 Array4<Type_t> const& fz,
15 Array4<Type_t> const& ex,
16 Array4<Type_t> const& ey,
17 Array4<Type_t> const& ez)
18{
19 auto lo = amrex::max_lbound(tbx, bxg2);
20 auto hi = amrex::min_ubound(tbx, bxg2);
21 amrex::Loop(lo, hi,
22 [=] (int i, int j, int k) noexcept
23 {
24 if ( s(i,j ,k ) < 0.0_rt && s(i+1,j ,k ) < 0.0_rt
25 && s(i,j+1,k ) < 0.0_rt && s(i+1,j+1,k ) < 0.0_rt
26 && s(i,j ,k+1) < 0.0_rt && s(i+1,j ,k+1) < 0.0_rt
27 && s(i,j+1,k+1) < 0.0_rt && s(i+1,j+1,k+1) < 0.0_rt)
28 {
29 cell(i,j,k).setRegular();
30 }
31 else if (s(i,j ,k ) >= 0.0_rt && s(i+1,j ,k ) >= 0.0_rt
32 && s(i,j+1,k ) >= 0.0_rt && s(i+1,j+1,k ) >= 0.0_rt
33 && s(i,j ,k+1) >= 0.0_rt && s(i+1,j ,k+1) >= 0.0_rt
34 && s(i,j+1,k+1) >= 0.0_rt && s(i+1,j+1,k+1) >= 0.0_rt)
35 {
36 cell(i,j,k).setCovered();
37 }
38 else
39 {
40 cell(i,j,k).setSingleValued();
41 }
42 });
43
44 // x-face
45 Box b = amrex::surroundingNodes(bxg2,0);
46 lo = amrex::max_lbound(tbx, b);
47 hi = amrex::min_ubound(tbx, b);
48 amrex::Loop(lo, hi,
49 [=] (int i, int j, int k) noexcept
50 {
51 if ( s(i,j,k ) < 0.0_rt && s(i,j+1,k ) < 0.0_rt
52 && s(i,j,k+1) < 0.0_rt && s(i,j+1,k+1) < 0.0_rt )
53 {
54 fx(i,j,k) = Type::regular;
55 }
56 else if (s(i,j,k ) >= 0.0_rt && s(i,j+1,k ) >= 0.0_rt
57 && s(i,j,k+1) >= 0.0_rt && s(i,j+1,k+1) >= 0.0_rt )
58 {
59 fx(i,j,k) = Type::covered;
60 }
61 else
62 {
63 fx(i,j,k) = Type::irregular;
64 }
65 });
66
67 // y-face
68 b = amrex::surroundingNodes(bxg2,1);
69 lo = amrex::max_lbound(tbx, b);
70 hi = amrex::min_ubound(tbx, b);
71 amrex::Loop(lo, hi,
72 [=] (int i, int j, int k) noexcept
73 {
74 if ( s(i,j,k ) < 0.0_rt && s(i+1,j,k ) < 0.0_rt
75 && s(i,j,k+1) < 0.0_rt && s(i+1,j,k+1) < 0.0_rt )
76 {
77 fy(i,j,k) = Type::regular;
78 }
79 else if (s(i,j,k ) >= 0.0_rt && s(i+1,j,k ) >= 0.0_rt
80 && s(i,j,k+1) >= 0.0_rt && s(i+1,j,k+1) >= 0.0_rt )
81 {
82 fy(i,j,k) = Type::covered;
83 }
84 else
85 {
86 fy(i,j,k) = Type::irregular;
87 }
88 });
89
90 // z-face
91 b = amrex::surroundingNodes(bxg2,2);
92 lo = amrex::max_lbound(tbx, b);
93 hi = amrex::min_ubound(tbx, b);
94 amrex::Loop(lo, hi,
95 [=] (int i, int j, int k) noexcept
96 {
97 if ( s(i,j ,k) < 0.0_rt && s(i+1,j ,k) < 0.0_rt
98 && s(i,j+1,k) < 0.0_rt && s(i+1,j+1,k) < 0.0_rt)
99 {
100 fz(i,j,k) = Type::regular;
101 }
102 else if (s(i,j ,k) >= 0.0_rt && s(i+1,j ,k) >= 0.0_rt
103 && s(i,j+1,k) >= 0.0_rt && s(i+1,j+1,k) >= 0.0_rt)
104 {
105 fz(i,j,k) = Type::covered;
106 }
107 else
108 {
109 fz(i,j,k) = Type::irregular;
110 }
111 });
112
113 // x-edge
114 b = amrex::convert(bxg2,IntVect(0,1,1));
115 lo = amrex::max_lbound(tbx, b);
116 hi = amrex::min_ubound(tbx, b);
117 amrex::Loop(lo, hi,
118 [=] (int i, int j, int k) noexcept
119 {
120 if (s(i,j,k) < 0.0_rt && s(i+1,j,k) < 0.0_rt) {
121 ex(i,j,k) = Type::regular;
122 } else if (s(i,j,k) >= 0.0_rt && s(i+1,j,k) >= 0.0_rt) {
123 ex(i,j,k) = Type::covered;
124 } else {
125 ex(i,j,k) = Type::irregular;
126 }
127 });
128
129 // y-edge
130 b = amrex::convert(bxg2,IntVect(1,0,1));
131 lo = amrex::max_lbound(tbx, b);
132 hi = amrex::min_ubound(tbx, b);
133 amrex::Loop(lo, hi,
134 [=] (int i, int j, int k) noexcept
135 {
136 if (s(i,j,k) < 0.0_rt && s(i,j+1,k) < 0.0_rt) {
137 ey(i,j,k) = Type::regular;
138 } else if (s(i,j,k) >= 0.0_rt && s(i,j+1,k) >= 0.0_rt) {
139 ey(i,j,k) = Type::covered;
140 } else {
141 ey(i,j,k) = Type::irregular;
142 }
143 });
144
145 // z-edge
146 b = amrex::convert(bxg2,IntVect(1,1,0));
147 lo = amrex::max_lbound(tbx, b);
148 hi = amrex::min_ubound(tbx, b);
149 amrex::Loop(lo, hi,
150 [=] (int i, int j, int k) noexcept
151 {
152 if (s(i,j,k) < 0.0_rt && s(i,j,k+1) < 0.0_rt) {
153 ez(i,j,k) = Type::regular;
154 } else if (s(i,j,k) >= 0.0_rt && s(i,j,k+1) >= 0.0_rt) {
155 ez(i,j,k) = Type::covered;
156 } else {
157 ez(i,j,k) = Type::irregular;
158 }
159 });
160}
161
163namespace detail {
165 int num_cuts (Real a, Real b) noexcept {
166 return (a >= 0.0_rt && b < 0.0_rt) || (b >= 0.0_rt && a < 0.0_rt);
167 }
168}
170
172int check_mvmc (int i, int j, int k, Array4<Real const> const& fine)
173{
174 using detail::num_cuts;
175
176 int ierr = 0;
177
178 i *= 2;
179 j *= 2;
180 k *= 2;
181
182 // x-edges
183 int nx00 = num_cuts(fine(i,j,k),fine(i+1,j,k)) + num_cuts(fine(i+1,j,k),fine(i+2,j,k));
184 int nx10 = num_cuts(fine(i,j+2,k),fine(i+1,j+2,k)) + num_cuts(fine(i+1,j+2,k),fine(i+2,j+2,k));
185 int nx01 = num_cuts(fine(i,j,k+2),fine(i+1,j,k+2)) + num_cuts(fine(i+1,j,k+2),fine(i+2,j,k+2));
186 int nx11 = num_cuts(fine(i,j+2,k+2),fine(i+1,j+2,k+2)) + num_cuts(fine(i+1,j+2,k+2),fine(i+2,j+2,k+2));
187
188 // y-edges
189 int ny00 = num_cuts(fine(i,j,k),fine(i,j+1,k)) + num_cuts(fine(i,j+1,k),fine(i,j+2,k));
190 int ny10 = num_cuts(fine(i+2,j,k),fine(i+2,j+1,k)) + num_cuts(fine(i+2,j+1,k),fine(i+2,j+2,k));
191 int ny01 = num_cuts(fine(i,j,k+2),fine(i,j+1,k+2)) + num_cuts(fine(i,j+1,k+2),fine(i,j+2,k+2));
192 int ny11 = num_cuts(fine(i+2,j,k+2),fine(i+2,j+1,k+2)) + num_cuts(fine(i+2,j+1,k+2),fine(i+2,j+2,k+2));
193
194 // z-edges
195 int nz00 = num_cuts(fine(i,j,k),fine(i,j,k+1)) + num_cuts(fine(i,j,k+1),fine(i,j,k+2));
196 int nz10 = num_cuts(fine(i+2,j,k),fine(i+2,j,k+1)) + num_cuts(fine(i+2,j,k+1),fine(i+2,j,k+2));
197 int nz01 = num_cuts(fine(i,j+2,k),fine(i,j+2,k+1)) + num_cuts(fine(i,j+2,k+1),fine(i,j+2,k+2));
198 int nz11 = num_cuts(fine(i+2,j+2,k),fine(i+2,j+2,k+1)) + num_cuts(fine(i+2,j+2,k+1),fine(i+2,j+2,k+2));
199
200 // x-faces
201 int nxm = -1;
202 int n = ny00 + ny01 + nz00 + nz01;
203 if (n == 0) {
204 nxm = 0;
205 } else if (n == 2) {
206 nxm = 1;
207 } else {
208 ierr = 1;
209 }
210
211 int nxp = -1;
212 n = ny10 + ny11 + nz10 + nz11;
213 if (n == 0) {
214 nxp = 0;
215 } else if (n == 2) {
216 nxp = 1;
217 } else {
218 ierr = 1;
219 }
220
221 // y-faces
222 int nym = -1;
223 n = nx00 + nx01 + nz00 + nz10;
224 if (n == 0) {
225 nym = 0;
226 } else if (n == 2) {
227 nym = 1;
228 } else {
229 ierr = 1;
230 }
231
232 int nyp = -1;
233 n = nx10 + nx11 + nz01 + nz11;
234 if (n == 0) {
235 nyp = 0;
236 } else if (n == 2) {
237 nyp = 1;
238 } else {
239 ierr = 1;
240 }
241
242 // z-faces
243 int nzm = -1;
244 n = nx00 + nx10 + ny00 + ny10;
245 if (n == 0) {
246 nzm = 0;
247 } else if (n == 2) {
248 nzm = 1;
249 } else {
250 ierr = 1;
251 }
252
253 int nzp = -1;
254 n = nx01 + nx11 + ny01 + ny11;
255 if (n == 0) {
256 nzp = 0;
257 } else if (n == 2) {
258 nzp = 1;
259 } else {
260 ierr = 1;
261 }
262
263 if (nxm == 1 && nym == 1 && nzm == 1 && nxp == 1 && nyp == 1 && nzp == 1) {
264 n = (fine(i ,j ,k ) < 0.0_rt) + (fine(i+2,j ,k ) < 0.0_rt) +
265 (fine(i ,j+2,k ) < 0.0_rt) + (fine(i+2,j+2,k ) < 0.0_rt) +
266 (fine(i ,j ,k+2) < 0.0_rt) + (fine(i+2,j ,k+2) < 0.0_rt) +
267 (fine(i ,j+2,k+2) < 0.0_rt) + (fine(i+2,j+2,k+2) < 0.0_rt);
268 if (n == 2 || n == 6) {
269 ierr = 1;
270 } else if (n != 4) {
271 ierr = 1;
272 amrex::Abort("amrex::check_mvmc: how did this happen? nopen != 4");
273 }
274 }
275
276 return ierr;
277}
278
280namespace detail {
282Real coarsen_edge_cent (Real f1, Real f2)
283{
284 if (f1 == Real(1.0) && f2 == Real(1.0)) {
285 return Real(1.0);
286 } else if (f1 == Real(-1.0) && f2 == Real(-1.0)) {
287 return Real(-1.0);
288 } else {
289 if (f1 == Real(-1.0)) {
290 f1 = Real(0.0);
291 } else if (f1 == Real(1.0)) {
292 f1 = Real(-0.25);
293 } else {
294 f1 = Real(0.5)*f1 - Real(0.25);
295 }
296 if (f2 == Real(-1.0)) {
297 f2 = Real(0.0);
298 } else if (f2 == Real(1.0)) {
299 f2 = Real(0.25);
300 } else {
301 f2 = Real(0.5)*f2 + Real(0.25);
302 }
303 Real r = (f2*f2-f1*f1)/(f2-f1+Real(1.e-30));
304 return amrex::min(Real(0.5),amrex::max(Real(-0.5),r));
305 }
306}
307}
309
311int coarsen_from_fine (int i, int j, int k, Box const& bx, int ngrow,
312 Array4<Real> const& cvol, Array4<Real> const& ccent,
313 Array4<Real> const& cba, Array4<Real> const& cbc,
314 Array4<Real> const& cbn, Array4<Real> const& capx,
315 Array4<Real> const& capy, Array4<Real> const& capz,
316 Array4<Real> const& cfcx, Array4<Real> const& cfcy,
317 Array4<Real> const& cfcz, Array4<Real> const& cecx,
318 Array4<Real> const& cecy, Array4<Real> const& cecz,
319 Array4<EBCellFlag> const& cflag,
320 Array4<Real const> const& fvol, Array4<Real const> const& fcent,
321 Array4<Real const> const& fba, Array4<Real const> const& fbc,
322 Array4<Real const> const& fbn, Array4<Real const> const& fapx,
323 Array4<Real const> const& fapy, Array4<Real const> const& fapz,
324 Array4<Real const> const& ffcx, Array4<Real const> const& ffcy,
325 Array4<Real const> const& ffcz, Array4<Real const> const& fecx,
326 Array4<Real const> const& fecy, Array4<Real const> const& fecz,
327 Array4<EBCellFlag const> const& fflag)
328{
329 using detail::coarsen_edge_cent;
330
331 const Box& gbx = amrex::grow(bx,ngrow);
332 const Box& xbx = amrex::surroundingNodes(bx,0); // face boxes
333 const Box& ybx = amrex::surroundingNodes(bx,1);
334 const Box& zbx = amrex::surroundingNodes(bx,2);
335 const Box& xgbx = amrex::surroundingNodes(gbx,0);
336 const Box& ygbx = amrex::surroundingNodes(gbx,1);
337 const Box& zgbx = amrex::surroundingNodes(gbx,2);
338 const Box& exbx = amrex::convert(bx,IntVect(0,1,1)); // edge boxes
339 const Box& eybx = amrex::convert(bx,IntVect(1,0,1));
340 const Box& ezbx = amrex::convert(bx,IntVect(1,1,0));
341 const Box& exgbx = amrex::convert(gbx,IntVect(0,1,1));
342 const Box& eygbx = amrex::convert(gbx,IntVect(1,0,1));
343 const Box& ezgbx = amrex::convert(gbx,IntVect(1,1,0));
344
345 int ierr = 0;
346 int ii = i*2;
347 int jj = j*2;
348 int kk = k*2;
349
350 if (bx.contains(i,j,k))
351 {
352 if (fflag(ii,jj ,kk ).isRegular() && fflag(ii+1,jj ,kk ).isRegular() &&
353 fflag(ii,jj+1,kk ).isRegular() && fflag(ii+1,jj+1,kk ).isRegular() &&
354 fflag(ii,jj ,kk+1).isRegular() && fflag(ii+1,jj ,kk+1).isRegular() &&
355 fflag(ii,jj+1,kk+1).isRegular() && fflag(ii+1,jj+1,kk+1).isRegular())
356 {
357 cflag(i,j,k).setRegular();
358 cvol(i,j,k) = 1.0_rt;
359 ccent(i,j,k,0) = 0.0_rt;
360 ccent(i,j,k,1) = 0.0_rt;
361 ccent(i,j,k,2) = 0.0_rt;
362 cba(i,j,k) = 0.0_rt;
363 cbc(i,j,k,0) = -1.0_rt;
364 cbc(i,j,k,1) = -1.0_rt;
365 cbc(i,j,k,2) = -1.0_rt;
366 cbn(i,j,k,0) = 0.0_rt;
367 cbn(i,j,k,1) = 0.0_rt;
368 cbn(i,j,k,2) = 0.0_rt;
369 }
370 else if (fflag(ii,jj ,kk ).isCovered() && fflag(ii+1,jj ,kk ).isCovered() &&
371 fflag(ii,jj+1,kk ).isCovered() && fflag(ii+1,jj+1,kk ).isCovered() &&
372 fflag(ii,jj ,kk+1).isCovered() && fflag(ii+1,jj ,kk+1).isCovered() &&
373 fflag(ii,jj+1,kk+1).isCovered() && fflag(ii+1,jj+1,kk+1).isCovered())
374 {
375 cflag(i,j,k).setCovered();
376 cvol(i,j,k) = 0.0_rt;
377 ccent(i,j,k,0) = 0.0_rt;
378 ccent(i,j,k,1) = 0.0_rt;
379 ccent(i,j,k,2) = 0.0_rt;
380 cba(i,j,k) = 0.0_rt;
381 cbc(i,j,k,0) = -1.0_rt;
382 cbc(i,j,k,1) = -1.0_rt;
383 cbc(i,j,k,2) = -1.0_rt;
384 cbn(i,j,k,0) = 0.0_rt;
385 cbn(i,j,k,1) = 0.0_rt;
386 cbn(i,j,k,2) = 0.0_rt;
387 }
388 else
389 {
390 cflag(i,j,k).setSingleValued();
391
392 cvol(i,j,k) = 0.125_rt*(fvol(ii ,jj ,kk ) + fvol(ii+1,jj ,kk ) +
393 fvol(ii ,jj+1,kk ) + fvol(ii+1,jj+1,kk ) +
394 fvol(ii ,jj ,kk+1) + fvol(ii+1,jj ,kk+1) +
395 fvol(ii ,jj+1,kk+1) + fvol(ii+1,jj+1,kk+1));
396 Real cvolinv = 1.0_rt / cvol(i,j,k);
397
398 ccent(i,j,k,0) = 0.125_rt * cvolinv *
399 (fvol(ii ,jj ,kk )*(0.5_rt*fcent(ii ,jj ,kk ,0)-0.25_rt) +
400 fvol(ii+1,jj ,kk )*(0.5_rt*fcent(ii+1,jj ,kk ,0)+0.25_rt) +
401 fvol(ii ,jj+1,kk )*(0.5_rt*fcent(ii ,jj+1,kk ,0)-0.25_rt) +
402 fvol(ii+1,jj+1,kk )*(0.5_rt*fcent(ii+1,jj+1,kk ,0)+0.25_rt) +
403 fvol(ii ,jj ,kk+1)*(0.5_rt*fcent(ii ,jj ,kk+1,0)-0.25_rt) +
404 fvol(ii+1,jj ,kk+1)*(0.5_rt*fcent(ii+1,jj ,kk+1,0)+0.25_rt) +
405 fvol(ii ,jj+1,kk+1)*(0.5_rt*fcent(ii ,jj+1,kk+1,0)-0.25_rt) +
406 fvol(ii+1,jj+1,kk+1)*(0.5_rt*fcent(ii+1,jj+1,kk+1,0)+0.25_rt));
407 ccent(i,j,k,1) = 0.125_rt * cvolinv *
408 (fvol(ii ,jj ,kk )*(0.5_rt*fcent(ii ,jj ,kk ,1)-0.25_rt) +
409 fvol(ii+1,jj ,kk )*(0.5_rt*fcent(ii+1,jj ,kk ,1)-0.25_rt) +
410 fvol(ii ,jj+1,kk )*(0.5_rt*fcent(ii ,jj+1,kk ,1)+0.25_rt) +
411 fvol(ii+1,jj+1,kk )*(0.5_rt*fcent(ii+1,jj+1,kk ,1)+0.25_rt) +
412 fvol(ii ,jj ,kk+1)*(0.5_rt*fcent(ii ,jj ,kk+1,1)-0.25_rt) +
413 fvol(ii+1,jj ,kk+1)*(0.5_rt*fcent(ii+1,jj ,kk+1,1)-0.25_rt) +
414 fvol(ii ,jj+1,kk+1)*(0.5_rt*fcent(ii ,jj+1,kk+1,1)+0.25_rt) +
415 fvol(ii+1,jj+1,kk+1)*(0.5_rt*fcent(ii+1,jj+1,kk+1,1)+0.25_rt));
416 ccent(i,j,k,2) = 0.125_rt * cvolinv *
417 (fvol(ii ,jj ,kk )*(0.5_rt*fcent(ii ,jj ,kk ,2)-0.25_rt) +
418 fvol(ii+1,jj ,kk )*(0.5_rt*fcent(ii+1,jj ,kk ,2)-0.25_rt) +
419 fvol(ii ,jj+1,kk )*(0.5_rt*fcent(ii ,jj+1,kk ,2)-0.25_rt) +
420 fvol(ii+1,jj+1,kk )*(0.5_rt*fcent(ii+1,jj+1,kk ,2)-0.25_rt) +
421 fvol(ii ,jj ,kk+1)*(0.5_rt*fcent(ii ,jj ,kk+1,2)+0.25_rt) +
422 fvol(ii+1,jj ,kk+1)*(0.5_rt*fcent(ii+1,jj ,kk+1,2)+0.25_rt) +
423 fvol(ii ,jj+1,kk+1)*(0.5_rt*fcent(ii ,jj+1,kk+1,2)+0.25_rt) +
424 fvol(ii+1,jj+1,kk+1)*(0.5_rt*fcent(ii+1,jj+1,kk+1,2)+0.25_rt));
425
426 cba(i,j,k) = 0.25_rt*(fba(ii ,jj ,kk ) + fba(ii+1,jj ,kk ) +
427 fba(ii ,jj+1,kk ) + fba(ii+1,jj+1,kk ) +
428 fba(ii ,jj ,kk+1) + fba(ii+1,jj ,kk+1) +
429 fba(ii ,jj+1,kk+1) + fba(ii+1,jj+1,kk+1));
430 Real cbainv = 1.0_rt / cba(i,j,k);
431
432 cbc(i,j,k,0) = 0.25_rt * cbainv *
433 ( fba(ii ,jj ,kk )*(0.5_rt*fbc(ii ,jj ,kk ,0)-0.25_rt)
434 + fba(ii+1,jj ,kk )*(0.5_rt*fbc(ii+1,jj ,kk ,0)+0.25_rt)
435 + fba(ii ,jj+1,kk )*(0.5_rt*fbc(ii ,jj+1,kk ,0)-0.25_rt)
436 + fba(ii+1,jj+1,kk )*(0.5_rt*fbc(ii+1,jj+1,kk ,0)+0.25_rt)
437 + fba(ii ,jj ,kk+1)*(0.5_rt*fbc(ii ,jj ,kk+1,0)-0.25_rt)
438 + fba(ii+1,jj ,kk+1)*(0.5_rt*fbc(ii+1,jj ,kk+1,0)+0.25_rt)
439 + fba(ii ,jj+1,kk+1)*(0.5_rt*fbc(ii ,jj+1,kk+1,0)-0.25_rt)
440 + fba(ii+1,jj+1,kk+1)*(0.5_rt*fbc(ii+1,jj+1,kk+1,0)+0.25_rt) );
441 cbc(i,j,k,1) = 0.25_rt * cbainv *
442 ( fba(ii ,jj ,kk )*(0.5_rt*fbc(ii ,jj ,kk ,1)-0.25_rt)
443 + fba(ii+1,jj ,kk )*(0.5_rt*fbc(ii+1,jj ,kk ,1)-0.25_rt)
444 + fba(ii ,jj+1,kk )*(0.5_rt*fbc(ii ,jj+1,kk ,1)+0.25_rt)
445 + fba(ii+1,jj+1,kk )*(0.5_rt*fbc(ii+1,jj+1,kk ,1)+0.25_rt)
446 + fba(ii ,jj ,kk+1)*(0.5_rt*fbc(ii ,jj ,kk+1,1)-0.25_rt)
447 + fba(ii+1,jj ,kk+1)*(0.5_rt*fbc(ii+1,jj ,kk+1,1)-0.25_rt)
448 + fba(ii ,jj+1,kk+1)*(0.5_rt*fbc(ii ,jj+1,kk+1,1)+0.25_rt)
449 + fba(ii+1,jj+1,kk+1)*(0.5_rt*fbc(ii+1,jj+1,kk+1,1)+0.25_rt) );
450 cbc(i,j,k,2) = 0.25_rt * cbainv *
451 ( fba(ii ,jj ,kk )*(0.5_rt*fbc(ii ,jj ,kk ,2)-0.25_rt)
452 + fba(ii+1,jj ,kk )*(0.5_rt*fbc(ii+1,jj ,kk ,2)-0.25_rt)
453 + fba(ii ,jj+1,kk )*(0.5_rt*fbc(ii ,jj+1,kk ,2)-0.25_rt)
454 + fba(ii+1,jj+1,kk )*(0.5_rt*fbc(ii+1,jj+1,kk ,2)-0.25_rt)
455 + fba(ii ,jj ,kk+1)*(0.5_rt*fbc(ii ,jj ,kk+1,2)+0.25_rt)
456 + fba(ii+1,jj ,kk+1)*(0.5_rt*fbc(ii+1,jj ,kk+1,2)+0.25_rt)
457 + fba(ii ,jj+1,kk+1)*(0.5_rt*fbc(ii ,jj+1,kk+1,2)+0.25_rt)
458 + fba(ii+1,jj+1,kk+1)*(0.5_rt*fbc(ii+1,jj+1,kk+1,2)+0.25_rt) );
459
460 Real nx = fbn(ii ,jj ,kk ,0)*fba(ii ,jj ,kk )
461 + fbn(ii+1,jj ,kk ,0)*fba(ii+1,jj ,kk )
462 + fbn(ii ,jj+1,kk ,0)*fba(ii ,jj+1,kk )
463 + fbn(ii+1,jj+1,kk ,0)*fba(ii+1,jj+1,kk )
464 + fbn(ii ,jj ,kk+1,0)*fba(ii ,jj ,kk+1)
465 + fbn(ii+1,jj ,kk+1,0)*fba(ii+1,jj ,kk+1)
466 + fbn(ii ,jj+1,kk+1,0)*fba(ii ,jj+1,kk+1)
467 + fbn(ii+1,jj+1,kk+1,0)*fba(ii+1,jj+1,kk+1);
468 Real ny = fbn(ii ,jj ,kk ,1)*fba(ii ,jj ,kk )
469 + fbn(ii+1,jj ,kk ,1)*fba(ii+1,jj ,kk )
470 + fbn(ii ,jj+1,kk ,1)*fba(ii ,jj+1,kk )
471 + fbn(ii+1,jj+1,kk ,1)*fba(ii+1,jj+1,kk )
472 + fbn(ii ,jj ,kk+1,1)*fba(ii ,jj ,kk+1)
473 + fbn(ii+1,jj ,kk+1,1)*fba(ii+1,jj ,kk+1)
474 + fbn(ii ,jj+1,kk+1,1)*fba(ii ,jj+1,kk+1)
475 + fbn(ii+1,jj+1,kk+1,1)*fba(ii+1,jj+1,kk+1);
476 Real nz = fbn(ii ,jj ,kk ,2)*fba(ii ,jj ,kk )
477 + fbn(ii+1,jj ,kk ,2)*fba(ii+1,jj ,kk )
478 + fbn(ii ,jj+1,kk ,2)*fba(ii ,jj+1,kk )
479 + fbn(ii+1,jj+1,kk ,2)*fba(ii+1,jj+1,kk )
480 + fbn(ii ,jj ,kk+1,2)*fba(ii ,jj ,kk+1)
481 + fbn(ii+1,jj ,kk+1,2)*fba(ii+1,jj ,kk+1)
482 + fbn(ii ,jj+1,kk+1,2)*fba(ii ,jj+1,kk+1)
483 + fbn(ii+1,jj+1,kk+1,2)*fba(ii+1,jj+1,kk+1);
484 Real nfac = 1.0_rt / std::sqrt(nx*nx+ny*ny+nz*nz+1.e-30_rt);
485 cbn(i,j,k,0) = nx*nfac;
486 cbn(i,j,k,1) = ny*nfac;
487 cbn(i,j,k,2) = nz*nfac;
488 ierr = (nx == 0.0_rt && ny == 0.0_rt && nz == 0.0_rt)
489 // we must check the enclosing surface to make sure the coarse cell does not
490 // fully contains the geometry object.
491 || ( fapx(ii,jj ,kk )==1.0_rt && fapx(ii+2,jj ,kk )==1.0_rt
492 && fapx(ii,jj+1,kk )==1.0_rt && fapx(ii+2,jj+1,kk )==1.0_rt
493 && fapx(ii,jj ,kk+1)==1.0_rt && fapx(ii+2,jj ,kk+1)==1.0_rt
494 && fapx(ii,jj+1,kk+1)==1.0_rt && fapx(ii+2,jj+1,kk+1)==1.0_rt
495 && fapy(ii,jj ,kk )==1.0_rt && fapy(ii+1,jj ,kk )==1.0_rt
496 && fapy(ii,jj+2,kk )==1.0_rt && fapy(ii+1,jj+2,kk )==1.0_rt
497 && fapy(ii,jj ,kk+1)==1.0_rt && fapy(ii+1,jj ,kk+1)==1.0_rt
498 && fapy(ii,jj+2,kk+1)==1.0_rt && fapy(ii+1,jj+2,kk+1)==1.0_rt
499 && fapz(ii,jj ,kk )==1.0_rt && fapz(ii+1,jj ,kk )==1.0_rt
500 && fapz(ii,jj+1,kk )==1.0_rt && fapz(ii+1,jj+1,kk )==1.0_rt
501 && fapz(ii,jj ,kk+2)==1.0_rt && fapz(ii+1,jj ,kk+2)==1.0_rt
502 && fapz(ii,jj+1,kk+2)==1.0_rt && fapz(ii+1,jj+1,kk+2)==1.0_rt);
503
504 }
505 }
506 else if (gbx.contains(i,j,k))
507 {
508 cvol(i,j,k) = 1.0_rt;
509 ccent(i,j,k,0) = 0.0_rt;
510 ccent(i,j,k,1) = 0.0_rt;
511 ccent(i,j,k,2) = 0.0_rt;
512 cba(i,j,k) = 0.0_rt;
513 cbc(i,j,k,0) = -1.0_rt;
514 cbc(i,j,k,1) = -1.0_rt;
515 cbc(i,j,k,2) = -1.0_rt;
516 cbn(i,j,k,0) = 0.0_rt;
517 cbn(i,j,k,1) = 0.0_rt;
518 cbn(i,j,k,2) = 0.0_rt;
519 }
520
521 if (xbx.contains(i,j,k))
522 {
523 capx(i,j,k) = 0.25_rt*(fapx(ii,jj ,kk ) + fapx(ii,jj+1,kk ) +
524 fapx(ii,jj ,kk+1) + fapx(ii,jj+1,kk+1));
525 if (capx(i,j,k) != 0.0_rt) {
526 Real apinv = 1.0_rt / capx(i,j,k);
527 cfcx(i,j,k,0) = 0.25_rt * apinv *
528 (fapx(ii,jj ,kk )*(0.5_rt*ffcx(ii,jj ,kk ,0)-0.25_rt) +
529 fapx(ii,jj+1,kk )*(0.5_rt*ffcx(ii,jj+1,kk ,0)+0.25_rt) +
530 fapx(ii,jj ,kk+1)*(0.5_rt*ffcx(ii,jj ,kk+1,0)-0.25_rt) +
531 fapx(ii,jj+1,kk+1)*(0.5_rt*ffcx(ii,jj+1,kk+1,0)+0.25_rt) );
532 cfcx(i,j,k,1) = 0.25_rt * apinv *
533 (fapx(ii,jj ,kk )*(0.5_rt*ffcx(ii,jj ,kk ,1)-0.25_rt) +
534 fapx(ii,jj+1,kk )*(0.5_rt*ffcx(ii,jj+1,kk ,1)-0.25_rt) +
535 fapx(ii,jj ,kk+1)*(0.5_rt*ffcx(ii,jj ,kk+1,1)+0.25_rt) +
536 fapx(ii,jj+1,kk+1)*(0.5_rt*ffcx(ii,jj+1,kk+1,1)+0.25_rt) );
537 } else {
538 cfcx(i,j,k,0) = 0.0_rt;
539 cfcx(i,j,k,1) = 0.0_rt;
540 }
541 }
542 else if (xgbx.contains(i,j,k))
543 {
544 capx(i,j,k) = 1.0_rt;
545 cfcx(i,j,k,0) = 0.0_rt;
546 cfcx(i,j,k,1) = 0.0_rt;
547 }
548
549 if (ybx.contains(i,j,k))
550 {
551 capy(i,j,k) = 0.25_rt*(fapy(ii ,jj,kk ) + fapy(ii+1,jj,kk ) +
552 fapy(ii ,jj,kk+1) + fapy(ii+1,jj,kk+1));
553 if (capy(i,j,k) != 0.0_rt) {
554 Real apinv = 1.0_rt / capy(i,j,k);
555 cfcy(i,j,k,0) = 0.25_rt * apinv *
556 (fapy(ii ,jj,kk )*(0.5_rt*ffcy(ii ,jj,kk ,0)-0.25_rt) +
557 fapy(ii+1,jj,kk )*(0.5_rt*ffcy(ii+1,jj,kk ,0)+0.25_rt) +
558 fapy(ii ,jj,kk+1)*(0.5_rt*ffcy(ii ,jj,kk+1,0)-0.25_rt) +
559 fapy(ii+1,jj,kk+1)*(0.5_rt*ffcy(ii+1,jj,kk+1,0)+0.25_rt) );
560 cfcy(i,j,k,1) = 0.25_rt * apinv *
561 (fapy(ii ,jj,kk )*(0.5_rt*ffcy(ii ,jj,kk ,1)-0.25_rt) +
562 fapy(ii+1,jj,kk )*(0.5_rt*ffcy(ii+1,jj,kk ,1)-0.25_rt) +
563 fapy(ii ,jj,kk+1)*(0.5_rt*ffcy(ii ,jj,kk+1,1)+0.25_rt) +
564 fapy(ii+1,jj,kk+1)*(0.5_rt*ffcy(ii+1,jj,kk+1,1)+0.25_rt) );
565 } else {
566 cfcy(i,j,k,0) = 0.0_rt;
567 cfcy(i,j,k,1) = 0.0_rt;
568 }
569 }
570 else if (ygbx.contains(i,j,k))
571 {
572 capy(i,j,k) = 1.0_rt;
573 cfcy(i,j,k,0) = 0.0_rt;
574 cfcy(i,j,k,1) = 0.0_rt;
575 }
576
577 if (zbx.contains(i,j,k))
578 {
579 capz(i,j,k) = 0.25_rt * (fapz(ii ,jj ,kk) + fapz(ii+1,jj ,kk) +
580 fapz(ii ,jj+1,kk) + fapz(ii+1,jj+1,kk));
581 if (capz(i,j,k) != 0.0_rt) {
582 Real apinv = 1.0_rt / capz(i,j,k);
583 cfcz(i,j,k,0) = 0.25_rt * apinv *
584 (fapz(ii ,jj ,kk)*(0.5_rt*ffcz(ii ,jj ,kk,0)-0.25_rt) +
585 fapz(ii+1,jj ,kk)*(0.5_rt*ffcz(ii+1,jj ,kk,0)+0.25_rt) +
586 fapz(ii ,jj+1,kk)*(0.5_rt*ffcz(ii ,jj+1,kk,0)-0.25_rt) +
587 fapz(ii+1,jj+1,kk)*(0.5_rt*ffcz(ii+1,jj+1,kk,0)+0.25_rt) );
588 cfcz(i,j,k,1) = 0.25_rt * apinv *
589 (fapz(ii ,jj ,kk)*(0.5_rt*ffcz(ii ,jj ,kk,1)-0.25_rt) +
590 fapz(ii+1,jj ,kk)*(0.5_rt*ffcz(ii+1,jj ,kk,1)-0.25_rt) +
591 fapz(ii ,jj+1,kk)*(0.5_rt*ffcz(ii ,jj+1,kk,1)+0.25_rt) +
592 fapz(ii+1,jj+1,kk)*(0.5_rt*ffcz(ii+1,jj+1,kk,1)+0.25_rt) );
593 } else {
594 cfcz(i,j,k,0) = 0.0_rt;
595 cfcz(i,j,k,1) = 0.0_rt;
596 }
597 }
598 else if (zgbx.contains(i,j,k))
599 {
600 capz(i,j,k) = 1.0_rt;
601 cfcz(i,j,k,0) = 0.0_rt;
602 cfcz(i,j,k,1) = 0.0_rt;
603 }
604
605 if (exbx.contains(i,j,k))
606 {
607 cecx(i,j,k) = coarsen_edge_cent(fecx(ii,jj,kk), fecx(ii+1,jj,kk));
608 }
609 else if (exgbx.contains(i,j,k))
610 {
611 cecx(i,j,k) = 1.0_rt;
612 }
613
614 if (eybx.contains(i,j,k))
615 {
616 cecy(i,j,k) = coarsen_edge_cent(fecy(ii,jj,kk), fecy(ii,jj+1,kk));
617 }
618 else if (eygbx.contains(i,j,k))
619 {
620 cecy(i,j,k) = 1.0_rt;
621 }
622
623 if (ezbx.contains(i,j,k))
624 {
625 cecz(i,j,k) = coarsen_edge_cent(fecz(ii,jj,kk), fecz(ii,jj,kk+1));
626 }
627 else if (ezgbx.contains(i,j,k))
628 {
629 cecz(i,j,k) = 1.0_rt;
630 }
631
632 return ierr;
633}
634
636void build_cellflag_from_ap (int i, int j, int k, Array4<EBCellFlag> const& cflag,
638 Array4<Real const> const& apz)
639{
640 auto flg = cflag(i,j,k);
641 flg.setDisconnected();
642
643 if (!flg.isCovered())
644 {
645 flg.setConnected(0,0,0);
646
647 if (apx(i ,j,k) != 0.0_rt) { flg.setConnected(-1, 0, 0); }
648 if (apx(i+1,j,k) != 0.0_rt) { flg.setConnected( 1, 0, 0); }
649 if (apy(i,j ,k) != 0.0_rt) { flg.setConnected( 0, -1, 0); }
650 if (apy(i,j+1,k) != 0.0_rt) { flg.setConnected( 0, 1, 0); }
651 if (apz(i,j,k ) != 0.0_rt) { flg.setConnected( 0, 0, -1); }
652 if (apz(i,j,k+1) != 0.0_rt) { flg.setConnected( 0, 0, 1); }
653
654 if ( (apx(i,j,k) != 0.0_rt && apy(i-1,j,k) != 0.0_rt) ||
655 (apy(i,j,k) != 0.0_rt && apx(i,j-1,k) != 0.0_rt) )
656 {
657 flg.setConnected(-1, -1, 0);
658 if (apz(i-1,j-1,k ) != 0.0_rt) { flg.setConnected(-1,-1,-1); }
659 if (apz(i-1,j-1,k+1) != 0.0_rt) { flg.setConnected(-1,-1, 1); }
660 }
661
662 if ( (apx(i+1,j,k) != 0.0_rt && apy(i+1,j ,k) != 0.0_rt) ||
663 (apy(i ,j,k) != 0.0_rt && apx(i+1,j-1,k) != 0.0_rt) )
664 {
665 flg.setConnected(1, -1, 0);
666 if (apz(i+1,j-1,k ) != 0.0_rt) { flg.setConnected(1,-1,-1); }
667 if (apz(i+1,j-1,k+1) != 0.0_rt) { flg.setConnected(1,-1, 1); }
668 }
669
670 if ( (apx(i,j ,k) != 0.0_rt && apy(i-1,j+1,k) != 0.0_rt) ||
671 (apy(i,j+1,k) != 0.0_rt && apx(i ,j+1,k) != 0.0_rt) )
672 {
673 flg.setConnected(-1, 1, 0);
674 if (apz(i-1,j+1,k ) != 0.0_rt) { flg.setConnected(-1, 1,-1); }
675 if (apz(i-1,j+1,k+1) != 0.0_rt) { flg.setConnected(-1, 1, 1); }
676 }
677
678 if ( (apx(i+1,j ,k) != 0.0_rt && apy(i+1,j+1,k) != 0.0_rt) ||
679 (apy(i ,j+1,k) != 0.0_rt && apx(i+1,j+1,k) != 0.0_rt) )
680 {
681 flg.setConnected(1, 1, 0);
682 if (apz(i+1,j+1,k ) != 0.0_rt) { flg.setConnected(1, 1,-1); }
683 if (apz(i+1,j+1,k+1) != 0.0_rt) { flg.setConnected(1, 1, 1); }
684 }
685
686 if ( (apx(i,j,k) != 0.0_rt && apz(i-1,j,k ) != 0.0_rt) ||
687 (apz(i,j,k) != 0.0_rt && apx(i ,j,k-1) != 0.0_rt) )
688 {
689 flg.setConnected(-1, 0, -1);
690 if (apy(i-1,j ,k-1) != 0.0_rt) { flg.setConnected(-1,-1,-1); }
691 if (apy(i-1,j+1,k-1) != 0.0_rt) { flg.setConnected(-1, 1,-1); }
692 }
693
694 if ( (apx(i+1,j,k) != 0.0_rt && apz(i+1,j,k ) != 0.0_rt) ||
695 (apz(i ,j,k) != 0.0_rt && apx(i+1,j,k-1) != 0.0_rt) )
696 {
697 flg.setConnected(1, 0, -1);
698 if (apy(i+1,j ,k-1) != 0.0_rt) { flg.setConnected(1,-1,-1); }
699 if (apy(i+1,j+1,k-1) != 0.0_rt) { flg.setConnected(1, 1,-1); }
700 }
701
702 if ( (apx(i,j,k ) != 0.0_rt && apz(i-1,j,k+1) != 0.0_rt) ||
703 (apz(i,j,k+1) != 0.0_rt && apx(i ,j,k+1) != 0.0_rt) )
704 {
705 flg.setConnected(-1, 0, 1);
706 if (apy(i-1,j ,k+1) != 0.0_rt) { flg.setConnected(-1,-1, 1); }
707 if (apy(i-1,j+1,k+1) != 0.0_rt) { flg.setConnected(-1, 1, 1); }
708 }
709
710 if ( (apx(i+1,j,k ) != 0.0_rt && apz(i+1,j,k+1) != 0.0_rt) ||
711 (apz(i ,j,k+1) != 0.0_rt && apx(i+1,j,k+1) != 0.0_rt) )
712 {
713 flg.setConnected(1, 0, 1);
714 if (apy(i+1,j ,k+1) != 0.0_rt) { flg.setConnected(1,-1, 1); }
715 if (apy(i+1,j+1,k+1) != 0.0_rt) { flg.setConnected(1, 1, 1); }
716 }
717
718 if ( (apy(i,j,k) != 0.0_rt && apz(i,j-1,k ) != 0.0_rt) ||
719 (apz(i,j,k) != 0.0_rt && apy(i,j ,k-1) != 0.0_rt) )
720 {
721 flg.setConnected(0, -1, -1);
722 if (apx(i ,j-1,k-1) != 0.0_rt) { flg.setConnected(-1,-1,-1); }
723 if (apx(i+1,j-1,k-1) != 0.0_rt) { flg.setConnected( 1,-1,-1); }
724 }
725
726 if ( (apy(i,j+1,k) != 0.0_rt && apz(i,j+1,k ) != 0.0_rt) ||
727 (apz(i,j ,k) != 0.0_rt && apy(i,j+1,k-1) != 0.0_rt) )
728 {
729 flg.setConnected(0, 1, -1);
730 if (apx(i ,j+1,k-1) != 0.0_rt) { flg.setConnected(-1, 1,-1); }
731 if (apx(i+1,j+1,k-1) != 0.0_rt) { flg.setConnected( 1, 1,-1); }
732 }
733
734 if ( (apy(i,j,k ) != 0.0_rt && apz(i,j-1,k+1) != 0.0_rt) ||
735 (apz(i,j,k+1) != 0.0_rt && apy(i,j ,k+1) != 0.0_rt) )
736 {
737 flg.setConnected(0, -1, 1);
738 if (apx(i ,j-1,k+1) != 0.0_rt) { flg.setConnected(-1,-1, 1); }
739 if (apx(i+1,j-1,k+1) != 0.0_rt) { flg.setConnected( 1,-1, 1); }
740 }
741
742 if ( (apy(i,j+1,k ) != 0.0_rt && apz(i,j+1,k+1) != 0.0_rt) ||
743 (apz(i,j ,k+1) != 0.0_rt && apy(i,j+1,k+1) != 0.0_rt) )
744 {
745 flg.setConnected(0, 1, 1);
746 if (apx(i ,j+1,k+1) != 0.0_rt) { flg.setConnected(-1, 1, 1); }
747 if (apx(i+1,j+1,k+1) != 0.0_rt) { flg.setConnected( 1, 1, 1); }
748 }
749 }
750
751 cflag(i,j,k) = flg;
752}
753
754}
755
756#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 > convert(const BoxND< dim > &b, const IntVectND< dim > &typ) noexcept
Return a BoxND with different type.
Definition AMReX_Box.H:1558
__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__ constexpr const T & min(const T &a, const T &b) noexcept
Definition AMReX_Algorithm.H:21
__host__ __device__ Dim3 min_ubound(BoxND< dim > const &b1, BoxND< dim > const &b2) noexcept
Definition AMReX_Box.H:2053
IntVectND< 3 > IntVect
IntVect is an alias for amrex::IntVectND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:30
__host__ __device__ constexpr const T & max(const T &a, const T &b) noexcept
Definition AMReX_Algorithm.H:35
void Abort(const std::string &msg)
Print out message to cerr and exit via abort().
Definition AMReX.cpp:230
__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