101 Init(amrex::FabArray<amrex::BaseFab<Set::Vector>> *a_rhs,
102 const amrex::Geometry &a_geom,
103 bool a_homogeneous =
false)
const override
105 amrex::Box domain(a_geom.growPeriodicDomain(2));
106 domain.convert(amrex::IntVect::TheNodeVector());
107 const amrex::Dim3 lo= amrex::lbound(domain), hi = amrex::ubound(domain);
108 for (amrex::MFIter mfi(*a_rhs, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
110 amrex::Box bx = mfi.grownnodaltilebox();
112 amrex::Array4<Set::Vector>
const& rhs = a_rhs->array(mfi);
113 amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
115 for (
int dir = 0; dir < AMREX_SPACEDIM; dir++)
117 Face face = Face::INT;
119 #if AMREX_SPACEDIM == 2
121 if (i==lo.x && j==lo.y) face = Face::XLO_YLO;
122 else if (i==lo.x && j==hi.y) face = Face::XLO_YHI;
123 else if (i==hi.x && j==lo.y) face = Face::XHI_YLO;
124 else if (i==hi.x && j==hi.y) face = Face::XHI_YHI;
126 else if (i==lo.x) face = Face::XLO;
127 else if (i==hi.x) face = Face::XHI;
128 else if (j==lo.y) face = Face::YLO;
129 else if (j==hi.y) face = Face::YHI;
131 #elif AMREX_SPACEDIM == 3
133 if (i==lo.x && j==lo.y && k==lo.z) face = Face::XLO_YLO_ZLO;
134 else if (i==lo.x && j==lo.y && k==hi.z) face = Face::XLO_YLO_ZHI;
135 else if (i==lo.x && j==hi.y && k==lo.z) face = Face::XLO_YHI_ZLO;
136 else if (i==lo.x && j==hi.y && k==hi.z) face = Face::XLO_YHI_ZHI;
137 else if (i==hi.x && j==lo.y && k==lo.z) face = Face::XHI_YLO_ZLO;
138 else if (i==hi.x && j==lo.y && k==hi.z) face = Face::XHI_YLO_ZHI;
139 else if (i==hi.x && j==hi.y && k==lo.z) face = Face::XHI_YHI_ZLO;
140 else if (i==hi.x && j==hi.y && k==hi.z) face = Face::XHI_YHI_ZHI;
142 else if (j==lo.y && k==lo.z) face = Face::YLO_ZLO;
143 else if (j==lo.y && k==hi.z) face = Face::YLO_ZHI;
144 else if (j==hi.y && k==lo.z) face = Face::YHI_ZLO;
145 else if (j==hi.y && k==hi.z) face = Face::YHI_ZHI;
146 else if (k==lo.z && i==lo.x) face = Face::ZLO_XLO;
147 else if (k==lo.z && i==hi.x) face = Face::ZLO_XHI;
148 else if (k==hi.z && i==lo.x) face = Face::ZHI_XLO;
149 else if (k==hi.z && i==hi.x) face = Face::ZHI_XHI;
150 else if (i==lo.x && j==lo.y) face = Face::XLO_YLO;
151 else if (i==lo.x && j==hi.y) face = Face::XLO_YHI;
152 else if (i==hi.x && j==lo.y) face = Face::XHI_YLO;
153 else if (i==hi.x && j==hi.y) face = Face::XHI_YHI;
155 else if (i==lo.x) face = Face::XLO;
156 else if (i==hi.x) face = Face::XHI;
157 else if (j==lo.y) face = Face::YLO;
158 else if (j==hi.y) face = Face::YHI;
159 else if (k==lo.z) face = Face::ZLO;
160 else if (k==hi.z) face = Face::ZHI;
164 if (a_geom.isPeriodic(0) && a_geom.isPeriodic(1))
166 if (face == Face::XLO || face == Face::XHI ||
167 face == Face::YLO || face == Face::YHI)
continue;
169 if (a_geom.isPeriodic(0))
171 if (face == Face::XLO || face==Face::XHI)
continue;
173 if (a_geom.isPeriodic(1))
175 if (face == Face::YLO || face==Face::YHI)
continue;
177 #if AMREX_SPACEDIM == 3
178 if (a_geom.isPeriodic(2))
180 if (face == Face::ZLO || face==Face::ZHI)
continue;
184 if (!(face == Face::INT))
187 rhs(i,j,k)(dir) = 0.0;
199 const amrex::Geometry &a_geom,
200 bool a_homogeneous =
false)
const override
202 amrex::Box domain(a_geom.Domain());
203 domain.convert(amrex::IntVect::TheNodeVector());
204 const amrex::Dim3 lo= amrex::lbound(domain), hi = amrex::ubound(domain);
205 for (amrex::MFIter mfi(*a_rhs, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
207 amrex::Box bx = mfi.tilebox();
210 amrex::Array4<amrex::Real>
const& rhs = a_rhs->array(mfi);
211 amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
213 for (
int dir = 0; dir < AMREX_SPACEDIM; dir++)
215 Face face = Face::INT;
217 #if AMREX_SPACEDIM == 2
219 if (i==lo.x && j==lo.y) face = Face::XLO_YLO;
220 else if (i==lo.x && j==hi.y) face = Face::XLO_YHI;
221 else if (i==hi.x && j==lo.y) face = Face::XHI_YLO;
222 else if (i==hi.x && j==hi.y) face = Face::XHI_YHI;
224 else if (i==lo.x) face = Face::XLO;
225 else if (i==hi.x) face = Face::XHI;
226 else if (j==lo.y) face = Face::YLO;
227 else if (j==hi.y) face = Face::YHI;
229 #elif AMREX_SPACEDIM == 3
231 if (i==lo.x && j==lo.y && k==lo.z) face = Face::XLO_YLO_ZLO;
232 else if (i==lo.x && j==lo.y && k==hi.z) face = Face::XLO_YLO_ZHI;
233 else if (i==lo.x && j==hi.y && k==lo.z) face = Face::XLO_YHI_ZLO;
234 else if (i==lo.x && j==hi.y && k==hi.z) face = Face::XLO_YHI_ZHI;
235 else if (i==hi.x && j==lo.y && k==lo.z) face = Face::XHI_YLO_ZLO;
236 else if (i==hi.x && j==lo.y && k==hi.z) face = Face::XHI_YLO_ZHI;
237 else if (i==hi.x && j==hi.y && k==lo.z) face = Face::XHI_YHI_ZLO;
238 else if (i==hi.x && j==hi.y && k==hi.z) face = Face::XHI_YHI_ZHI;
240 else if (j==lo.y && k==lo.z) face = Face::YLO_ZLO;
241 else if (j==lo.y && k==hi.z) face = Face::YLO_ZHI;
242 else if (j==hi.y && k==lo.z) face = Face::YHI_ZLO;
243 else if (j==hi.y && k==hi.z) face = Face::YHI_ZHI;
244 else if (k==lo.z && i==lo.x) face = Face::ZLO_XLO;
245 else if (k==lo.z && i==hi.x) face = Face::ZLO_XHI;
246 else if (k==hi.z && i==lo.x) face = Face::ZHI_XLO;
247 else if (k==hi.z && i==hi.x) face = Face::ZHI_XHI;
248 else if (i==lo.x && j==lo.y) face = Face::XLO_YLO;
249 else if (i==lo.x && j==hi.y) face = Face::XLO_YHI;
250 else if (i==hi.x && j==lo.y) face = Face::XHI_YLO;
251 else if (i==hi.x && j==hi.y) face = Face::XHI_YHI;
253 else if (i==lo.x) face = Face::XLO;
254 else if (i==hi.x) face = Face::XHI;
255 else if (j==lo.y) face = Face::YLO;
256 else if (j==hi.y) face = Face::YHI;
257 else if (k==lo.z) face = Face::ZLO;
258 else if (k==hi.z) face = Face::ZHI;
262 if (a_geom.isPeriodic(0) && a_geom.isPeriodic(1))
264 if (face == Face::XLO || face == Face::XHI ||
265 face == Face::YLO || face == Face::YHI)
continue;
267 if (a_geom.isPeriodic(0))
269 if (face == Face::XLO || face==Face::XHI)
continue;
271 if (a_geom.isPeriodic(1))
273 if (face == Face::YLO || face==Face::YHI)
continue;
276 if (!(face == Face::INT))
279 rhs(i,j,k,dir) = 0.0;
290 const int &i,
const int &j, [[maybe_unused]]
const int &k,
291 const amrex::Box &domain)
override
294 const amrex::Dim3 lo = amrex::lbound(domain), hi = amrex::ubound(domain);
297 #if AMREX_SPACEDIM == 2
298 if (m[0] == lo.x && m[1] == lo.y)
return m_bc_type[Face::XLO_YLO];
299 if (m[0] == lo.x && m[1] == hi.y)
return m_bc_type[Face::XLO_YHI];
300 if (m[0] == hi.x && m[1] == lo.y)
return m_bc_type[Face::XHI_YLO];
301 if (m[0] == hi.x && m[1] == hi.y)
return m_bc_type[Face::XHI_YHI];
302 if (m[0] == lo.x)
return m_bc_type[Face::XLO];
303 if (m[0] == hi.x)
return m_bc_type[Face::XHI];
304 if (m[1] == lo.y)
return m_bc_type[Face::YLO];
305 if (m[1] == hi.y)
return m_bc_type[Face::YHI];
307 #elif AMREX_SPACEDIM == 3
309 if (m[0] == lo.x && m[1] == lo.y && m[2] == lo.z)
return m_bc_type[Face::XLO_YLO_ZLO];
310 if (m[0] == lo.x && m[1] == lo.y && m[2] == hi.z)
return m_bc_type[Face::XLO_YLO_ZHI];
311 if (m[0] == lo.x && m[1] == hi.y && m[2] == lo.z)
return m_bc_type[Face::XLO_YHI_ZLO];
312 if (m[0] == lo.x && m[1] == hi.y && m[2] == hi.z)
return m_bc_type[Face::XLO_YHI_ZHI];
313 if (m[0] == hi.x && m[1] == lo.y && m[2] == lo.z)
return m_bc_type[Face::XHI_YLO_ZLO];
314 if (m[0] == hi.x && m[1] == lo.y && m[2] == hi.z)
return m_bc_type[Face::XHI_YLO_ZHI];
315 if (m[0] == hi.x && m[1] == hi.y && m[2] == lo.z)
return m_bc_type[Face::XHI_YHI_ZLO];
316 if (m[0] == hi.x && m[1] == hi.y && m[2] == hi.z)
return m_bc_type[Face::XHI_YHI_ZHI];
318 if (m[1] == lo.y && m[2] == lo.z)
return m_bc_type[Face::YLO_ZLO];
319 if (m[1] == lo.y && m[2] == hi.z)
return m_bc_type[Face::YLO_ZHI];
320 if (m[1] == hi.y && m[2] == lo.z)
return m_bc_type[Face::YHI_ZLO];
321 if (m[1] == hi.y && m[2] == hi.z)
return m_bc_type[Face::YHI_ZHI];
322 if (m[2] == lo.z && m[0] == lo.x)
return m_bc_type[Face::ZLO_XLO];
323 if (m[2] == lo.z && m[0] == hi.x)
return m_bc_type[Face::ZLO_XHI];
324 if (m[2] == hi.z && m[0] == lo.x)
return m_bc_type[Face::ZHI_XLO];
325 if (m[2] == hi.z && m[0] == hi.x)
return m_bc_type[Face::ZHI_XHI];
326 if (m[0] == lo.x && m[1] == lo.y)
return m_bc_type[Face::XLO_YLO];
327 if (m[0] == lo.x && m[1] == hi.y)
return m_bc_type[Face::XLO_YHI];
328 if (m[0] == hi.x && m[1] == lo.y)
return m_bc_type[Face::XHI_YLO];
329 if (m[0] == hi.x && m[1] == hi.y)
return m_bc_type[Face::XHI_YHI];
331 if (m[0] == lo.x)
return m_bc_type[Face::XLO];
332 if (m[0] == hi.x)
return m_bc_type[Face::XHI];
333 if (m[1] == lo.y)
return m_bc_type[Face::YLO];
334 if (m[1] == hi.y)
return m_bc_type[Face::YHI];
335 if (m[2] == lo.z)
return m_bc_type[Face::ZLO];
336 if (m[2] == hi.z)
return m_bc_type[Face::ZHI];
348 const int &i,
const int &j,
const int &k,
349 const amrex::Box &domain)
override
351 (void)i; (void)j; (void)k;
354 const amrex::Dim3 lo= amrex::lbound(domain), hi = amrex::ubound(domain);
359 #if AMREX_SPACEDIM == 2
371 #elif AMREX_SPACEDIM == 3
405 return Set::Vector::Zero();
441 std::map<std::string, Type> bcmap;
449 std::vector<std::string> str;
453 #if AMREX_SPACEDIM==3
454 if (pp.
contains(
"type.xloylozlo")) {
456 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YLO_ZLO][i] = bcmap[str[i]]; }
457 if (pp.
contains(
"type.xloylozhi")) {
459 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YLO_ZHI][i] = bcmap[str[i]]; }
460 if (pp.
contains(
"type.xloyhizlo")) {
462 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YHI_ZLO][i] = bcmap[str[i]]; }
463 if (pp.
contains(
"type.xloyhizhi")) {
465 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YHI_ZHI][i] = bcmap[str[i]]; }
466 if (pp.
contains(
"type.xhiylozlo")) {
468 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YLO_ZLO][i] = bcmap[str[i]]; }
469 if (pp.
contains(
"type.xhiylozhi")) {
471 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YLO_ZHI][i] = bcmap[str[i]]; }
472 if (pp.
contains(
"type.xhiyhizlo")) {
474 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YHI_ZLO][i] = bcmap[str[i]]; }
475 if (pp.
contains(
"type.xhiyhizhi")) {
477 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YHI_ZHI][i] = bcmap[str[i]]; }
483 #if AMREX_SPACEDIM==3
486 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YLO_ZLO][i] = bcmap[str[i]]; }
489 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YLO_ZHI][i] = bcmap[str[i]]; }
492 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YHI_ZLO][i] = bcmap[str[i]]; }
495 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YHI_ZHI][i] = bcmap[str[i]]; }
498 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZLO_XLO][i] = bcmap[str[i]]; }
501 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZLO_XHI][i] = bcmap[str[i]]; }
504 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZHI_XLO][i] = bcmap[str[i]]; }
507 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZHI_XHI][i] = bcmap[str[i]]; }
515 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YLO][i] = bcmap[str[i]]; }
518 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YHI][i] = bcmap[str[i]]; }
521 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YLO][i] = bcmap[str[i]]; }
524 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YHI][i] = bcmap[str[i]]; }
528 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO][i] = bcmap[str[i]]; }
531 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI][i] = bcmap[str[i]]; }
534 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YLO][i] = bcmap[str[i]]; }
537 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YHI][i] = bcmap[str[i]]; }
538 #if AMREX_SPACEDIM==3
541 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZLO][i] = bcmap[str[i]]; }
544 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZHI][i] = bcmap[str[i]]; }
551 std::vector<std::string> val;
553 #if AMREX_SPACEDIM==3
583 #if AMREX_SPACEDIM==3
637 #if AMREX_SPACEDIM==3