57 Init(amrex::FabArray<amrex::BaseFab<Set::Vector>> *a_rhs,
58 const amrex::Geometry &a_geom,
59 bool a_homogeneous =
false)
const override
61 amrex::Box domain(a_geom.Domain());
62 domain.convert(amrex::IntVect::TheNodeVector());
63 const amrex::Dim3 lo= amrex::lbound(domain), hi = amrex::ubound(domain);
64 for (amrex::MFIter mfi(*a_rhs, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
66 amrex::Box bx = mfi.tilebox();
69 amrex::Array4<Set::Vector>
const& rhs = a_rhs->array(mfi);
70 amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
72 for (
int dir = 0; dir < AMREX_SPACEDIM; dir++)
74 Face face = Face::INT;
76 #if AMREX_SPACEDIM == 2
78 if (i==lo.x && j==lo.y) face = Face::XLO_YLO;
79 else if (i==lo.x && j==hi.y) face = Face::XLO_YHI;
80 else if (i==hi.x && j==lo.y) face = Face::XHI_YLO;
81 else if (i==hi.x && j==hi.y) face = Face::XHI_YHI;
83 else if (i==lo.x) face = Face::XLO;
84 else if (i==hi.x) face = Face::XHI;
85 else if (j==lo.y) face = Face::YLO;
86 else if (j==hi.y) face = Face::YHI;
88 #elif AMREX_SPACEDIM == 3
90 if (i==lo.x && j==lo.y && k==lo.z) face = Face::XLO_YLO_ZLO;
91 else if (i==lo.x && j==lo.y && k==hi.z) face = Face::XLO_YLO_ZHI;
92 else if (i==lo.x && j==hi.y && k==lo.z) face = Face::XLO_YHI_ZLO;
93 else if (i==lo.x && j==hi.y && k==hi.z) face = Face::XLO_YHI_ZHI;
94 else if (i==hi.x && j==lo.y && k==lo.z) face = Face::XHI_YLO_ZLO;
95 else if (i==hi.x && j==lo.y && k==hi.z) face = Face::XHI_YLO_ZHI;
96 else if (i==hi.x && j==hi.y && k==lo.z) face = Face::XHI_YHI_ZLO;
97 else if (i==hi.x && j==hi.y && k==hi.z) face = Face::XHI_YHI_ZHI;
99 else if (j==lo.y && k==lo.z) face = Face::YLO_ZLO;
100 else if (j==lo.y && k==hi.z) face = Face::YLO_ZHI;
101 else if (j==hi.y && k==lo.z) face = Face::YHI_ZLO;
102 else if (j==hi.y && k==hi.z) face = Face::YHI_ZHI;
103 else if (k==lo.z && i==lo.x) face = Face::ZLO_XLO;
104 else if (k==lo.z && i==hi.x) face = Face::ZLO_XHI;
105 else if (k==hi.z && i==lo.x) face = Face::ZHI_XLO;
106 else if (k==hi.z && i==hi.x) face = Face::ZHI_XHI;
107 else if (i==lo.x && j==lo.y) face = Face::XLO_YLO;
108 else if (i==lo.x && j==hi.y) face = Face::XLO_YHI;
109 else if (i==hi.x && j==lo.y) face = Face::XHI_YLO;
110 else if (i==hi.x && j==hi.y) face = Face::XHI_YHI;
112 else if (i==lo.x) face = Face::XLO;
113 else if (i==hi.x) face = Face::XHI;
114 else if (j==lo.y) face = Face::YLO;
115 else if (j==hi.y) face = Face::YHI;
116 else if (k==lo.z) face = Face::ZLO;
117 else if (k==hi.z) face = Face::ZHI;
121 amrex::IndexType type = a_rhs->ixType();
122 if (!(face == Face::INT))
125 rhs(i,j,k)(dir) = 0.0;
129 #if AMREX_SPACEDIM==1
131 #elif AMREX_SPACEDIM==2
133 #elif AMREX_SPACEDIM==3
146 const amrex::Geometry &a_geom,
147 bool a_homogeneous =
false)
const override
149 amrex::Box domain(a_geom.Domain());
150 domain.convert(amrex::IntVect::TheNodeVector());
151 const amrex::Dim3 lo= amrex::lbound(domain), hi = amrex::ubound(domain);
152 for (amrex::MFIter mfi(*a_rhs, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
154 amrex::Box bx = mfi.tilebox();
157 amrex::Array4<amrex::Real>
const& rhs = a_rhs->array(mfi);
158 amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
160 for (
int dir = 0; dir < AMREX_SPACEDIM; dir++)
162 Face face = Face::INT;
164 #if AMREX_SPACEDIM == 2
166 if (i==lo.x && j==lo.y) face = Face::XLO_YLO;
167 else if (i==lo.x && j==hi.y) face = Face::XLO_YHI;
168 else if (i==hi.x && j==lo.y) face = Face::XHI_YLO;
169 else if (i==hi.x && j==hi.y) face = Face::XHI_YHI;
171 else if (i==lo.x) face = Face::XLO;
172 else if (i==hi.x) face = Face::XHI;
173 else if (j==lo.y) face = Face::YLO;
174 else if (j==hi.y) face = Face::YHI;
176 #elif AMREX_SPACEDIM == 3
178 if (i==lo.x && j==lo.y && k==lo.z) face = Face::XLO_YLO_ZLO;
179 else if (i==lo.x && j==lo.y && k==hi.z) face = Face::XLO_YLO_ZHI;
180 else if (i==lo.x && j==hi.y && k==lo.z) face = Face::XLO_YHI_ZLO;
181 else if (i==lo.x && j==hi.y && k==hi.z) face = Face::XLO_YHI_ZHI;
182 else if (i==hi.x && j==lo.y && k==lo.z) face = Face::XHI_YLO_ZLO;
183 else if (i==hi.x && j==lo.y && k==hi.z) face = Face::XHI_YLO_ZHI;
184 else if (i==hi.x && j==hi.y && k==lo.z) face = Face::XHI_YHI_ZLO;
185 else if (i==hi.x && j==hi.y && k==hi.z) face = Face::XHI_YHI_ZHI;
187 else if (j==lo.y && k==lo.z) face = Face::YLO_ZLO;
188 else if (j==lo.y && k==hi.z) face = Face::YLO_ZHI;
189 else if (j==hi.y && k==lo.z) face = Face::YHI_ZLO;
190 else if (j==hi.y && k==hi.z) face = Face::YHI_ZHI;
191 else if (k==lo.z && i==lo.x) face = Face::ZLO_XLO;
192 else if (k==lo.z && i==hi.x) face = Face::ZLO_XHI;
193 else if (k==hi.z && i==lo.x) face = Face::ZHI_XLO;
194 else if (k==hi.z && i==hi.x) face = Face::ZHI_XHI;
195 else if (i==lo.x && j==lo.y) face = Face::XLO_YLO;
196 else if (i==lo.x && j==hi.y) face = Face::XLO_YHI;
197 else if (i==hi.x && j==lo.y) face = Face::XHI_YLO;
198 else if (i==hi.x && j==hi.y) face = Face::XHI_YHI;
200 else if (i==lo.x) face = Face::XLO;
201 else if (i==hi.x) face = Face::XHI;
202 else if (j==lo.y) face = Face::YLO;
203 else if (j==hi.y) face = Face::YHI;
204 else if (k==lo.z) face = Face::ZLO;
205 else if (k==hi.z) face = Face::ZHI;
209 amrex::IndexType type = a_rhs->ixType();
210 if (!(face == Face::INT))
213 rhs(i,j,k,dir) = 0.0;
217 #if AMREX_SPACEDIM==1
219 #elif AMREX_SPACEDIM==2
221 #elif AMREX_SPACEDIM==3
235 const int &i,
const int &j, [[maybe_unused]]
const int &k,
236 const amrex::Box &domain)
override
238 (void)i, (
void)j, (void)k;
240 const amrex::Dim3 lo = amrex::lbound(domain), hi = amrex::ubound(domain);
243 #if AMREX_SPACEDIM == 2
244 if (m[0] == lo.x && m[1] == lo.y)
return m_bc_type[Face::XLO_YLO];
245 if (m[0] == lo.x && m[1] == hi.y)
return m_bc_type[Face::XLO_YHI];
246 if (m[0] == hi.x && m[1] == lo.y)
return m_bc_type[Face::XHI_YLO];
247 if (m[0] == hi.x && m[1] == hi.y)
return m_bc_type[Face::XHI_YHI];
248 if (m[0] == lo.x)
return m_bc_type[Face::XLO];
249 if (m[0] == hi.x)
return m_bc_type[Face::XHI];
250 if (m[1] == lo.y)
return m_bc_type[Face::YLO];
251 if (m[1] == hi.y)
return m_bc_type[Face::YHI];
253 #elif AMREX_SPACEDIM == 3
255 if (m[0] == lo.x && m[1] == lo.y && m[2] == lo.z)
return m_bc_type[Face::XLO_YLO_ZLO];
256 if (m[0] == lo.x && m[1] == lo.y && m[2] == hi.z)
return m_bc_type[Face::XLO_YLO_ZHI];
257 if (m[0] == lo.x && m[1] == hi.y && m[2] == lo.z)
return m_bc_type[Face::XLO_YHI_ZLO];
258 if (m[0] == lo.x && m[1] == hi.y && m[2] == hi.z)
return m_bc_type[Face::XLO_YHI_ZHI];
259 if (m[0] == hi.x && m[1] == lo.y && m[2] == lo.z)
return m_bc_type[Face::XHI_YLO_ZLO];
260 if (m[0] == hi.x && m[1] == lo.y && m[2] == hi.z)
return m_bc_type[Face::XHI_YLO_ZHI];
261 if (m[0] == hi.x && m[1] == hi.y && m[2] == lo.z)
return m_bc_type[Face::XHI_YHI_ZLO];
262 if (m[0] == hi.x && m[1] == hi.y && m[2] == hi.z)
return m_bc_type[Face::XHI_YHI_ZHI];
264 if (m[1] == lo.y && m[2] == lo.z)
return m_bc_type[Face::YLO_ZLO];
265 if (m[1] == lo.y && m[2] == hi.z)
return m_bc_type[Face::YLO_ZHI];
266 if (m[1] == hi.y && m[2] == lo.z)
return m_bc_type[Face::YHI_ZLO];
267 if (m[1] == hi.y && m[2] == hi.z)
return m_bc_type[Face::YHI_ZHI];
268 if (m[2] == lo.z && m[0] == lo.x)
return m_bc_type[Face::ZLO_XLO];
269 if (m[2] == lo.z && m[0] == hi.x)
return m_bc_type[Face::ZLO_XHI];
270 if (m[2] == hi.z && m[0] == lo.x)
return m_bc_type[Face::ZHI_XLO];
271 if (m[2] == hi.z && m[0] == hi.x)
return m_bc_type[Face::ZHI_XHI];
272 if (m[0] == lo.x && m[1] == lo.y)
return m_bc_type[Face::XLO_YLO];
273 if (m[0] == lo.x && m[1] == hi.y)
return m_bc_type[Face::XLO_YHI];
274 if (m[0] == hi.x && m[1] == lo.y)
return m_bc_type[Face::XHI_YLO];
275 if (m[0] == hi.x && m[1] == hi.y)
return m_bc_type[Face::XHI_YHI];
277 if (m[0] == lo.x)
return m_bc_type[Face::XLO];
278 if (m[0] == hi.x)
return m_bc_type[Face::XHI];
279 if (m[1] == lo.y)
return m_bc_type[Face::YLO];
280 if (m[1] == hi.y)
return m_bc_type[Face::YHI];
281 if (m[2] == lo.z)
return m_bc_type[Face::ZLO];
282 if (m[2] == hi.z)
return m_bc_type[Face::ZHI];
294 const int &i,
const int &j,
const int &k,
295 const amrex::Box &domain)
override
297 (void)i; (void)j; (void)k;
300 const amrex::Dim3 lo= amrex::lbound(domain), hi = amrex::ubound(domain);
305 #if AMREX_SPACEDIM == 2
317 #elif AMREX_SPACEDIM == 3
351 return Set::Vector::Zero();
396 std::map<std::string, Type> bcmap;
404 std::vector<std::string> str;
408 #if AMREX_SPACEDIM==3
409 if (pp.
contains(
"type.xloylozlo")) {
pp_queryarr(
"type.xloylozlo",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YLO_ZLO][i] = bcmap[str[i]]; }
410 if (pp.
contains(
"type.xloylozhi")) {
pp_queryarr(
"type.xloylozhi",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YLO_ZHI][i] = bcmap[str[i]]; }
411 if (pp.
contains(
"type.xloyhizlo")) {
pp_queryarr(
"type.xloyhizlo",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YHI_ZLO][i] = bcmap[str[i]]; }
412 if (pp.
contains(
"type.xloyhizhi")) {
pp_queryarr(
"type.xloyhizhi",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YHI_ZHI][i] = bcmap[str[i]]; }
413 if (pp.
contains(
"type.xhiylozlo")) {
pp_queryarr(
"type.xhiylozlo",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YLO_ZLO][i] = bcmap[str[i]]; }
414 if (pp.
contains(
"type.xhiylozhi")) {
pp_queryarr(
"type.xhiylozhi",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YLO_ZHI][i] = bcmap[str[i]]; }
415 if (pp.
contains(
"type.xhiyhizlo")) {
pp_queryarr(
"type.xhiyhizlo",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YHI_ZLO][i] = bcmap[str[i]]; }
416 if (pp.
contains(
"type.xhiyhizhi")) {
pp_queryarr(
"type.xhiyhizhi",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YHI_ZHI][i] = bcmap[str[i]]; }
419 #if AMREX_SPACEDIM==3
420 if (pp.
contains(
"type.ylozlo")) {
pp_queryarr(
"type.ylozlo",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YLO_ZLO][i] = bcmap[str[i]]; }
421 if (pp.
contains(
"type.ylozhi")) {
pp_queryarr(
"type.ylozhi",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YLO_ZHI][i] = bcmap[str[i]]; }
422 if (pp.
contains(
"type.yhizlo")) {
pp_queryarr(
"type.yhizlo",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YHI_ZLO][i] = bcmap[str[i]]; }
423 if (pp.
contains(
"type.yhizhi")) {
pp_queryarr(
"type.yhizhi",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YHI_ZHI][i] = bcmap[str[i]]; }
424 if (pp.
contains(
"type.zloxlo")) {
pp_queryarr(
"type.zloxlo",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZLO_XLO][i] = bcmap[str[i]]; }
425 if (pp.
contains(
"type.zloxhi")) {
pp_queryarr(
"type.zloxhi",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZLO_XHI][i] = bcmap[str[i]]; }
426 if (pp.
contains(
"type.zhixlo")) {
pp_queryarr(
"type.zhixlo",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZHI_XLO][i] = bcmap[str[i]]; }
427 if (pp.
contains(
"type.zhixhi")) {
pp_queryarr(
"type.zhixhi",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZHI_XHI][i] = bcmap[str[i]]; }
429 if (pp.
contains(
"type.xloylo")) {
pp_queryarr(
"type.xloylo",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YLO][i] = bcmap[str[i]]; }
430 if (pp.
contains(
"type.xloyhi")) {
pp_queryarr(
"type.xloyhi",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YHI][i] = bcmap[str[i]]; }
431 if (pp.
contains(
"type.xhiylo")) {
pp_queryarr(
"type.xhiylo",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YLO][i] = bcmap[str[i]]; }
432 if (pp.
contains(
"type.xhiyhi")) {
pp_queryarr(
"type.xhiyhi",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YHI][i] = bcmap[str[i]]; }
434 if (pp.
contains(
"type.xlo")) {
pp_queryarr(
"type.xlo",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO][i] = bcmap[str[i]]; }
435 if (pp.
contains(
"type.xhi")) {
pp_queryarr(
"type.xhi",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI][i] = bcmap[str[i]]; }
436 if (pp.
contains(
"type.ylo")) {
pp_queryarr(
"type.ylo",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YLO][i] = bcmap[str[i]]; }
437 if (pp.
contains(
"type.yhi")) {
pp_queryarr(
"type.yhi",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YHI][i] = bcmap[str[i]]; }
438 #if AMREX_SPACEDIM==3
439 if (pp.
contains(
"type.zlo")) {
pp_queryarr(
"type.zlo",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZLO][i] = bcmap[str[i]]; }
440 if (pp.
contains(
"type.zhi")) {
pp_queryarr(
"type.zhi",str);
for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZHI][i] = bcmap[str[i]]; }
445 for (
int face = 0; face != Face::INT; face++)
447 std::vector<std::string> val(AMREX_SPACEDIM,
"0.0");
448 val.resize(AMREX_SPACEDIM,
"0.0");
449 std::string querystr = std::string(
"val.") + std::string(facestr[face]);
451 for (
int i = 0 ; i < AMREX_SPACEDIM; i++)
462 std::vector<std::string> ignore_in_2d = {
464 "zhixlo",
"zloxlo",
"zhixhi",
"zloxhi",
"ylozlo",
"ylozhi",
"yhizlo",
"yhizhi",
465 "xloylozlo",
"xloylozhi",
"xloyhizlo",
"xloyhizhi",
"xhiylozlo",
"xhiylozhi",
"xhiyhizlo",
"xhiyhizhi"};
466 for (
unsigned int n = 0; n < ignore_in_2d.size(); n++)
468 std::string querystr = std::string(
"val.") + ignore_in_2d[n];
470 querystr = std::string(
"type.") + ignore_in_2d[n];