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> type, val;
410 auto set = [&] (std::vector<std::string> type, std::vector<std::string> val, Face face)
412 if (type.size() == 1)
413 type.resize(AMREX_SPACEDIM,type[0]);
414 else if (type.size() < AMREX_SPACEDIM)
415 Util::Abort(
INFO,
"Invalid number of types specified for ", facestr[face]);
418 val.resize(AMREX_SPACEDIM,val[0]);
419 else if (val.size() < AMREX_SPACEDIM)
420 Util::Abort(
INFO,
"Invalid number of vals specified for ", facestr[face]);
422 for (
int i = 0 ; i < AMREX_SPACEDIM; i++)
425 value.
m_bc_type[face][i] = bcmap[type[i]];
436 set(type,val,Face::XLO);
440 set(type,val,Face::XHI);
444 set(type,val,Face::YLO);
448 set(type,val,Face::YHI);
453 set(type,val,Face::ZLO);
457 set(type,val,Face::ZHI);
463 set(type,val,Face::XLO_YLO);
467 set(type,val,Face::XLO_YHI);
471 set(type,val,Face::XHI_YLO);
475 set(type,val,Face::XHI_YHI);
480 set(type,val,Face::XLO_YLO_ZLO);
484 set(type,val,Face::XLO_YLO_ZHI);
488 set(type,val,Face::XLO_YHI_ZLO);
492 set(type,val,Face::XLO_YHI_ZHI);
496 set(type,val,Face::XHI_YLO_ZLO);
500 set(type,val,Face::XHI_YLO_ZHI);
504 set(type,val,Face::XHI_YHI_ZLO);
508 set(type,val,Face::XHI_YHI_ZHI);
512 set(type,val,Face::YLO_ZLO);
516 set(type,val,Face::YLO_ZHI);
520 set(type,val,Face::YHI_ZLO);
524 set(type,val,Face::YHI_ZHI);
528 set(type,val,Face::ZLO_XLO);
532 set(type,val,Face::ZLO_XHI);
536 set(type,val,Face::ZHI_XLO);
540 set(type,val,Face::ZHI_XHI);
552 std::vector<std::string> ignore_in_2d = {
554 "zhixlo",
"zloxlo",
"zhixhi",
"zloxhi",
"ylozlo",
"ylozhi",
"yhizlo",
"yhizhi",
555 "xloylozlo",
"xloylozhi",
"xloyhizlo",
"xloyhizhi",
"xhiylozlo",
"xhiylozhi",
"xhiyhizlo",
"xhiyhizhi"};
556 for (
unsigned int n = 0; n < ignore_in_2d.size(); n++)
558 std::string querystr = std::string(
"val.") + ignore_in_2d[n];
560 querystr = std::string(
"type.") + ignore_in_2d[n];