17 #ifndef BC_OPERATOR_ELASTIC_CONSTANT_H
18 #define BC_OPERATOR_ELASTIC_CONSTANT_H
34 static constexpr
const char*
name =
"constant";
39 for (
int face = 0; face < m_nfaces; face++)
40 for (
int direction = 0; direction < AMREX_SPACEDIM; direction++)
42 m_bc_type[face][direction] = Type::Displacement;
68 amrex::Vector<amrex::MultiFab *> &,
69 const amrex::Vector<amrex::Geometry> &)
79 amrex::Vector<amrex::MultiFab> &a_rhs,
80 const amrex::Vector<amrex::Geometry> &a_geom)
82 amrex::Vector<amrex::MultiFab *> pa_rhs = amrex::GetVecOfPtrs(a_rhs);
83 Set(face,direction,type,value,pa_rhs,a_geom);
92 const amrex::Vector<amrex::Geometry> &a_geom)
94 amrex::Vector<amrex::MultiFab *> pa_rhs = amrex::GetVecOfPtrs(a_rhs);
95 Set(face,direction,type,value,pa_rhs,a_geom);
101 Init(amrex::FabArray<amrex::BaseFab<Set::Vector>> *a_rhs,
102 const amrex::Geometry &a_geom,
103 bool a_homogeneous =
false)
const
105 amrex::Box domain(a_geom.Domain());
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.tilebox();
113 amrex::Array4<Set::Vector>
const& rhs = a_rhs->array(mfi);
114 amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
116 for (
int dir = 0; dir < AMREX_SPACEDIM; dir++)
118 Face face = Face::INT;
120 #if AMREX_SPACEDIM == 2
122 if (i==lo.x && j==lo.y) face = Face::XLO_YLO;
123 else if (i==lo.x && j==hi.y) face = Face::XLO_YHI;
124 else if (i==hi.x && j==lo.y) face = Face::XHI_YLO;
125 else if (i==hi.x && j==hi.y) face = Face::XHI_YHI;
127 else if (i==lo.x) face = Face::XLO;
128 else if (i==hi.x) face = Face::XHI;
129 else if (j==lo.y) face = Face::YLO;
130 else if (j==hi.y) face = Face::YHI;
132 #elif AMREX_SPACEDIM == 3
134 if (i==lo.x && j==lo.y && k==lo.z) face = Face::XLO_YLO_ZLO;
135 else if (i==lo.x && j==lo.y && k==hi.z) face = Face::XLO_YLO_ZHI;
136 else if (i==lo.x && j==hi.y && k==lo.z) face = Face::XLO_YHI_ZLO;
137 else if (i==lo.x && j==hi.y && k==hi.z) face = Face::XLO_YHI_ZHI;
138 else if (i==hi.x && j==lo.y && k==lo.z) face = Face::XHI_YLO_ZLO;
139 else if (i==hi.x && j==lo.y && k==hi.z) face = Face::XHI_YLO_ZHI;
140 else if (i==hi.x && j==hi.y && k==lo.z) face = Face::XHI_YHI_ZLO;
141 else if (i==hi.x && j==hi.y && k==hi.z) face = Face::XHI_YHI_ZHI;
143 else if (j==lo.y && k==lo.z) face = Face::YLO_ZLO;
144 else if (j==lo.y && k==hi.z) face = Face::YLO_ZHI;
145 else if (j==hi.y && k==lo.z) face = Face::YHI_ZLO;
146 else if (j==hi.y && k==hi.z) face = Face::YHI_ZHI;
147 else if (k==lo.z && i==lo.x) face = Face::ZLO_XLO;
148 else if (k==lo.z && i==hi.x) face = Face::ZLO_XHI;
149 else if (k==hi.z && i==lo.x) face = Face::ZHI_XLO;
150 else if (k==hi.z && i==hi.x) face = Face::ZHI_XHI;
151 else if (i==lo.x && j==lo.y) face = Face::XLO_YLO;
152 else if (i==lo.x && j==hi.y) face = Face::XLO_YHI;
153 else if (i==hi.x && j==lo.y) face = Face::XHI_YLO;
154 else if (i==hi.x && j==hi.y) face = Face::XHI_YHI;
156 else if (i==lo.x) face = Face::XLO;
157 else if (i==hi.x) face = Face::XHI;
158 else if (j==lo.y) face = Face::YLO;
159 else if (j==hi.y) face = Face::YHI;
160 else if (k==lo.z) face = Face::ZLO;
161 else if (k==hi.z) face = Face::ZHI;
165 if (!(face == Face::INT))
167 if (a_homogeneous &&
m_bc_type[face][dir] == Type::Displacement)
168 rhs(i,j,k)(dir) = 0.0;
180 const amrex::Geometry &a_geom,
181 bool a_homogeneous =
false)
const
183 amrex::Box domain(a_geom.Domain());
184 domain.convert(amrex::IntVect::TheNodeVector());
185 const amrex::Dim3 lo= amrex::lbound(domain), hi = amrex::ubound(domain);
186 for (amrex::MFIter mfi(*a_rhs, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
188 amrex::Box bx = mfi.tilebox();
191 amrex::Array4<amrex::Real>
const& rhs = a_rhs->array(mfi);
192 amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
194 for (
int dir = 0; dir < AMREX_SPACEDIM; dir++)
196 Face face = Face::INT;
198 #if AMREX_SPACEDIM == 2
200 if (i==lo.x && j==lo.y) face = Face::XLO_YLO;
201 else if (i==lo.x && j==hi.y) face = Face::XLO_YHI;
202 else if (i==hi.x && j==lo.y) face = Face::XHI_YLO;
203 else if (i==hi.x && j==hi.y) face = Face::XHI_YHI;
205 else if (i==lo.x) face = Face::XLO;
206 else if (i==hi.x) face = Face::XHI;
207 else if (j==lo.y) face = Face::YLO;
208 else if (j==hi.y) face = Face::YHI;
210 #elif AMREX_SPACEDIM == 3
212 if (i==lo.x && j==lo.y && k==lo.z) face = Face::XLO_YLO_ZLO;
213 else if (i==lo.x && j==lo.y && k==hi.z) face = Face::XLO_YLO_ZHI;
214 else if (i==lo.x && j==hi.y && k==lo.z) face = Face::XLO_YHI_ZLO;
215 else if (i==lo.x && j==hi.y && k==hi.z) face = Face::XLO_YHI_ZHI;
216 else if (i==hi.x && j==lo.y && k==lo.z) face = Face::XHI_YLO_ZLO;
217 else if (i==hi.x && j==lo.y && k==hi.z) face = Face::XHI_YLO_ZHI;
218 else if (i==hi.x && j==hi.y && k==lo.z) face = Face::XHI_YHI_ZLO;
219 else if (i==hi.x && j==hi.y && k==hi.z) face = Face::XHI_YHI_ZHI;
221 else if (j==lo.y && k==lo.z) face = Face::YLO_ZLO;
222 else if (j==lo.y && k==hi.z) face = Face::YLO_ZHI;
223 else if (j==hi.y && k==lo.z) face = Face::YHI_ZLO;
224 else if (j==hi.y && k==hi.z) face = Face::YHI_ZHI;
225 else if (k==lo.z && i==lo.x) face = Face::ZLO_XLO;
226 else if (k==lo.z && i==hi.x) face = Face::ZLO_XHI;
227 else if (k==hi.z && i==lo.x) face = Face::ZHI_XLO;
228 else if (k==hi.z && i==hi.x) face = Face::ZHI_XHI;
229 else if (i==lo.x && j==lo.y) face = Face::XLO_YLO;
230 else if (i==lo.x && j==hi.y) face = Face::XLO_YHI;
231 else if (i==hi.x && j==lo.y) face = Face::XHI_YLO;
232 else if (i==hi.x && j==hi.y) face = Face::XHI_YHI;
234 else if (i==lo.x) face = Face::XLO;
235 else if (i==hi.x) face = Face::XHI;
236 else if (j==lo.y) face = Face::YLO;
237 else if (j==hi.y) face = Face::YHI;
238 else if (k==lo.z) face = Face::ZLO;
239 else if (k==hi.z) face = Face::ZHI;
243 if (!(face == Face::INT))
245 if (a_homogeneous &&
m_bc_type[face][dir] == Type::Displacement)
246 rhs(i,j,k,dir) = 0.0;
257 const int &i,
const int &j, [[maybe_unused]]
const int &k,
258 const amrex::Box &domain)
261 const amrex::Dim3 lo = amrex::lbound(domain), hi = amrex::ubound(domain);
264 #if AMREX_SPACEDIM == 2
265 if (m[0] == lo.x && m[1] == lo.y)
return m_bc_type[Face::XLO_YLO];
266 if (m[0] == lo.x && m[1] == hi.y)
return m_bc_type[Face::XLO_YHI];
267 if (m[0] == hi.x && m[1] == lo.y)
return m_bc_type[Face::XHI_YLO];
268 if (m[0] == hi.x && m[1] == hi.y)
return m_bc_type[Face::XHI_YHI];
269 if (m[0] == lo.x)
return m_bc_type[Face::XLO];
270 if (m[0] == hi.x)
return m_bc_type[Face::XHI];
271 if (m[1] == lo.y)
return m_bc_type[Face::YLO];
272 if (m[1] == hi.y)
return m_bc_type[Face::YHI];
274 #elif AMREX_SPACEDIM == 3
276 if (m[0] == lo.x && m[1] == lo.y && m[2] == lo.z)
return m_bc_type[Face::XLO_YLO_ZLO];
277 if (m[0] == lo.x && m[1] == lo.y && m[2] == hi.z)
return m_bc_type[Face::XLO_YLO_ZHI];
278 if (m[0] == lo.x && m[1] == hi.y && m[2] == lo.z)
return m_bc_type[Face::XLO_YHI_ZLO];
279 if (m[0] == lo.x && m[1] == hi.y && m[2] == hi.z)
return m_bc_type[Face::XLO_YHI_ZHI];
280 if (m[0] == hi.x && m[1] == lo.y && m[2] == lo.z)
return m_bc_type[Face::XHI_YLO_ZLO];
281 if (m[0] == hi.x && m[1] == lo.y && m[2] == hi.z)
return m_bc_type[Face::XHI_YLO_ZHI];
282 if (m[0] == hi.x && m[1] == hi.y && m[2] == lo.z)
return m_bc_type[Face::XHI_YHI_ZLO];
283 if (m[0] == hi.x && m[1] == hi.y && m[2] == hi.z)
return m_bc_type[Face::XHI_YHI_ZHI];
285 if (m[1] == lo.y && m[2] == lo.z)
return m_bc_type[Face::YLO_ZLO];
286 if (m[1] == lo.y && m[2] == hi.z)
return m_bc_type[Face::YLO_ZHI];
287 if (m[1] == hi.y && m[2] == lo.z)
return m_bc_type[Face::YHI_ZLO];
288 if (m[1] == hi.y && m[2] == hi.z)
return m_bc_type[Face::YHI_ZHI];
289 if (m[2] == lo.z && m[0] == lo.x)
return m_bc_type[Face::ZLO_XLO];
290 if (m[2] == lo.z && m[0] == hi.x)
return m_bc_type[Face::ZLO_XHI];
291 if (m[2] == hi.z && m[0] == lo.x)
return m_bc_type[Face::ZHI_XLO];
292 if (m[2] == hi.z && m[0] == hi.x)
return m_bc_type[Face::ZHI_XHI];
293 if (m[0] == lo.x && m[1] == lo.y)
return m_bc_type[Face::XLO_YLO];
294 if (m[0] == lo.x && m[1] == hi.y)
return m_bc_type[Face::XLO_YHI];
295 if (m[0] == hi.x && m[1] == lo.y)
return m_bc_type[Face::XHI_YLO];
296 if (m[0] == hi.x && m[1] == hi.y)
return m_bc_type[Face::XHI_YHI];
298 if (m[0] == lo.x)
return m_bc_type[Face::XLO];
299 if (m[0] == hi.x)
return m_bc_type[Face::XHI];
300 if (m[1] == lo.y)
return m_bc_type[Face::YLO];
301 if (m[1] == hi.y)
return m_bc_type[Face::YHI];
302 if (m[2] == lo.z)
return m_bc_type[Face::ZLO];
303 if (m[2] == hi.z)
return m_bc_type[Face::ZHI];
315 const int &i,
const int &j,
const int &k,
316 const amrex::Box &domain)
318 (void)i; (void)j; (void)k;
321 const amrex::Dim3 lo= amrex::lbound(domain), hi = amrex::ubound(domain);
326 #if AMREX_SPACEDIM == 2
338 #elif AMREX_SPACEDIM == 3
372 return Set::Vector::Zero();
380 for (
int i = 0; i < AMREX_SPACEDIM; i++)
382 if (bc_type[i] == Type::Displacement)
384 else if (bc_type[i] == Type::Traction)
386 else if (bc_type[i] == Type::Neumann)
396 #if AMREX_SPACEDIM==2
397 static const int m_nfaces = 8;
398 #elif AMREX_SPACEDIM==3
399 static const int m_nfaces = 26;
402 std::array<std::array<Type, AMREX_SPACEDIM>, m_nfaces>
m_bc_type;
403 std::array<std::array<Numeric::Interpolator::Linear<Set::Scalar>,AMREX_SPACEDIM>, m_nfaces>
m_bc_val;
408 std::map<std::string, Type> bcmap;
409 bcmap[
"displacement"] = Type::Displacement;
410 bcmap[
"disp"] = Type::Displacement;
411 bcmap[
"neumann"] = Type::Neumann;
412 bcmap[
"traction"] = Type::Traction;
413 bcmap[
"trac"] = Type::Traction;
414 bcmap[
"periodic"] = Type::Periodic;
416 std::vector<std::string> str;
420 #if AMREX_SPACEDIM==3
421 if (pp.
contains(
"type.xloylozlo")) {
423 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YLO_ZLO][i] = bcmap[str[i]]; }
424 if (pp.
contains(
"type.xloylozhi")) {
426 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YLO_ZHI][i] = bcmap[str[i]]; }
427 if (pp.
contains(
"type.xloyhizlo")) {
429 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YHI_ZLO][i] = bcmap[str[i]]; }
430 if (pp.
contains(
"type.xloyhizhi")) {
432 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YHI_ZHI][i] = bcmap[str[i]]; }
433 if (pp.
contains(
"type.xhiylozlo")) {
435 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YLO_ZLO][i] = bcmap[str[i]]; }
436 if (pp.
contains(
"type.xhiylozhi")) {
438 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YLO_ZHI][i] = bcmap[str[i]]; }
439 if (pp.
contains(
"type.xhiyhizlo")) {
441 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YHI_ZLO][i] = bcmap[str[i]]; }
442 if (pp.
contains(
"type.xhiyhizhi")) {
444 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YHI_ZHI][i] = bcmap[str[i]]; }
445 #else // ignore unused inputs
450 #if AMREX_SPACEDIM==3
453 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YLO_ZLO][i] = bcmap[str[i]]; }
456 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YLO_ZHI][i] = bcmap[str[i]]; }
459 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YHI_ZLO][i] = bcmap[str[i]]; }
462 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YHI_ZHI][i] = bcmap[str[i]]; }
465 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZLO_XLO][i] = bcmap[str[i]]; }
468 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZLO_XHI][i] = bcmap[str[i]]; }
471 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZHI_XLO][i] = bcmap[str[i]]; }
474 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZHI_XHI][i] = bcmap[str[i]]; }
482 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YLO][i] = bcmap[str[i]]; }
485 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YHI][i] = bcmap[str[i]]; }
488 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YLO][i] = bcmap[str[i]]; }
491 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YHI][i] = bcmap[str[i]]; }
495 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO][i] = bcmap[str[i]]; }
498 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI][i] = bcmap[str[i]]; }
501 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YLO][i] = bcmap[str[i]]; }
504 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YHI][i] = bcmap[str[i]]; }
505 #if AMREX_SPACEDIM==3
508 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZLO][i] = bcmap[str[i]]; }
511 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZHI][i] = bcmap[str[i]]; }
518 std::vector<std::string> val;
520 #if AMREX_SPACEDIM==3
550 #if AMREX_SPACEDIM==3
604 #if AMREX_SPACEDIM==3