17 #ifndef BC_OPERATOR_ELASTIC_CONSTANT_H
18 #define BC_OPERATOR_ELASTIC_CONSTANT_H
38 for (
int face = 0; face < m_nfaces; face++)
39 for (
int direction = 0; direction < AMREX_SPACEDIM; direction++)
41 m_bc_type[face][direction] = Type::Displacement;
67 amrex::Vector<amrex::MultiFab *> &,
68 const amrex::Vector<amrex::Geometry> &)
78 amrex::Vector<amrex::MultiFab> &a_rhs,
79 const amrex::Vector<amrex::Geometry> &a_geom)
81 amrex::Vector<amrex::MultiFab *> pa_rhs = amrex::GetVecOfPtrs(a_rhs);
82 Set(face,direction,type,value,pa_rhs,a_geom);
91 const amrex::Vector<amrex::Geometry> &a_geom)
93 amrex::Vector<amrex::MultiFab *> pa_rhs = amrex::GetVecOfPtrs(a_rhs);
94 Set(face,direction,type,value,pa_rhs,a_geom);
100 Init(amrex::FabArray<amrex::BaseFab<Set::Vector>> *a_rhs,
101 const amrex::Geometry &a_geom,
102 bool a_homogeneous =
false)
const
104 amrex::Box domain(a_geom.Domain());
105 domain.convert(amrex::IntVect::TheNodeVector());
106 const amrex::Dim3 lo= amrex::lbound(domain), hi = amrex::ubound(domain);
107 for (amrex::MFIter mfi(*a_rhs, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
109 amrex::Box bx = mfi.tilebox();
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 (!(face == Face::INT))
166 if (a_homogeneous &&
m_bc_type[face][dir] == Type::Displacement)
167 rhs(i,j,k)(dir) = 0.0;
179 const amrex::Geometry &a_geom,
180 bool a_homogeneous =
false)
const
182 amrex::Box domain(a_geom.Domain());
183 domain.convert(amrex::IntVect::TheNodeVector());
184 const amrex::Dim3 lo= amrex::lbound(domain), hi = amrex::ubound(domain);
185 for (amrex::MFIter mfi(*a_rhs, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
187 amrex::Box bx = mfi.tilebox();
190 amrex::Array4<amrex::Real>
const& rhs = a_rhs->array(mfi);
191 amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
193 for (
int dir = 0; dir < AMREX_SPACEDIM; dir++)
195 Face face = Face::INT;
197 #if AMREX_SPACEDIM == 2
199 if (i==lo.x && j==lo.y) face = Face::XLO_YLO;
200 else if (i==lo.x && j==hi.y) face = Face::XLO_YHI;
201 else if (i==hi.x && j==lo.y) face = Face::XHI_YLO;
202 else if (i==hi.x && j==hi.y) face = Face::XHI_YHI;
204 else if (i==lo.x) face = Face::XLO;
205 else if (i==hi.x) face = Face::XHI;
206 else if (j==lo.y) face = Face::YLO;
207 else if (j==hi.y) face = Face::YHI;
209 #elif AMREX_SPACEDIM == 3
211 if (i==lo.x && j==lo.y && k==lo.z) face = Face::XLO_YLO_ZLO;
212 else if (i==lo.x && j==lo.y && k==hi.z) face = Face::XLO_YLO_ZHI;
213 else if (i==lo.x && j==hi.y && k==lo.z) face = Face::XLO_YHI_ZLO;
214 else if (i==lo.x && j==hi.y && k==hi.z) face = Face::XLO_YHI_ZHI;
215 else if (i==hi.x && j==lo.y && k==lo.z) face = Face::XHI_YLO_ZLO;
216 else if (i==hi.x && j==lo.y && k==hi.z) face = Face::XHI_YLO_ZHI;
217 else if (i==hi.x && j==hi.y && k==lo.z) face = Face::XHI_YHI_ZLO;
218 else if (i==hi.x && j==hi.y && k==hi.z) face = Face::XHI_YHI_ZHI;
220 else if (j==lo.y && k==lo.z) face = Face::YLO_ZLO;
221 else if (j==lo.y && k==hi.z) face = Face::YLO_ZHI;
222 else if (j==hi.y && k==lo.z) face = Face::YHI_ZLO;
223 else if (j==hi.y && k==hi.z) face = Face::YHI_ZHI;
224 else if (k==lo.z && i==lo.x) face = Face::ZLO_XLO;
225 else if (k==lo.z && i==hi.x) face = Face::ZLO_XHI;
226 else if (k==hi.z && i==lo.x) face = Face::ZHI_XLO;
227 else if (k==hi.z && i==hi.x) face = Face::ZHI_XHI;
228 else if (i==lo.x && j==lo.y) face = Face::XLO_YLO;
229 else if (i==lo.x && j==hi.y) face = Face::XLO_YHI;
230 else if (i==hi.x && j==lo.y) face = Face::XHI_YLO;
231 else if (i==hi.x && j==hi.y) face = Face::XHI_YHI;
233 else if (i==lo.x) face = Face::XLO;
234 else if (i==hi.x) face = Face::XHI;
235 else if (j==lo.y) face = Face::YLO;
236 else if (j==hi.y) face = Face::YHI;
237 else if (k==lo.z) face = Face::ZLO;
238 else if (k==hi.z) face = Face::ZHI;
242 if (!(face == Face::INT))
244 if (a_homogeneous &&
m_bc_type[face][dir] == Type::Displacement)
245 rhs(i,j,k,dir) = 0.0;
256 const int &i,
const int &j, [[maybe_unused]]
const int &k,
257 const amrex::Box &domain)
260 const amrex::Dim3 lo = amrex::lbound(domain), hi = amrex::ubound(domain);
263 #if AMREX_SPACEDIM == 2
264 if (m[0] == lo.x && m[1] == lo.y)
return m_bc_type[Face::XLO_YLO];
265 if (m[0] == lo.x && m[1] == hi.y)
return m_bc_type[Face::XLO_YHI];
266 if (m[0] == hi.x && m[1] == lo.y)
return m_bc_type[Face::XHI_YLO];
267 if (m[0] == hi.x && m[1] == hi.y)
return m_bc_type[Face::XHI_YHI];
268 if (m[0] == lo.x)
return m_bc_type[Face::XLO];
269 if (m[0] == hi.x)
return m_bc_type[Face::XHI];
270 if (m[1] == lo.y)
return m_bc_type[Face::YLO];
271 if (m[1] == hi.y)
return m_bc_type[Face::YHI];
273 #elif AMREX_SPACEDIM == 3
275 if (m[0] == lo.x && m[1] == lo.y && m[2] == lo.z)
return m_bc_type[Face::XLO_YLO_ZLO];
276 if (m[0] == lo.x && m[1] == lo.y && m[2] == hi.z)
return m_bc_type[Face::XLO_YLO_ZHI];
277 if (m[0] == lo.x && m[1] == hi.y && m[2] == lo.z)
return m_bc_type[Face::XLO_YHI_ZLO];
278 if (m[0] == lo.x && m[1] == hi.y && m[2] == hi.z)
return m_bc_type[Face::XLO_YHI_ZHI];
279 if (m[0] == hi.x && m[1] == lo.y && m[2] == lo.z)
return m_bc_type[Face::XHI_YLO_ZLO];
280 if (m[0] == hi.x && m[1] == lo.y && m[2] == hi.z)
return m_bc_type[Face::XHI_YLO_ZHI];
281 if (m[0] == hi.x && m[1] == hi.y && m[2] == lo.z)
return m_bc_type[Face::XHI_YHI_ZLO];
282 if (m[0] == hi.x && m[1] == hi.y && m[2] == hi.z)
return m_bc_type[Face::XHI_YHI_ZHI];
284 if (m[1] == lo.y && m[2] == lo.z)
return m_bc_type[Face::YLO_ZLO];
285 if (m[1] == lo.y && m[2] == hi.z)
return m_bc_type[Face::YLO_ZHI];
286 if (m[1] == hi.y && m[2] == lo.z)
return m_bc_type[Face::YHI_ZLO];
287 if (m[1] == hi.y && m[2] == hi.z)
return m_bc_type[Face::YHI_ZHI];
288 if (m[2] == lo.z && m[0] == lo.x)
return m_bc_type[Face::ZLO_XLO];
289 if (m[2] == lo.z && m[0] == hi.x)
return m_bc_type[Face::ZLO_XHI];
290 if (m[2] == hi.z && m[0] == lo.x)
return m_bc_type[Face::ZHI_XLO];
291 if (m[2] == hi.z && m[0] == hi.x)
return m_bc_type[Face::ZHI_XHI];
292 if (m[0] == lo.x && m[1] == lo.y)
return m_bc_type[Face::XLO_YLO];
293 if (m[0] == lo.x && m[1] == hi.y)
return m_bc_type[Face::XLO_YHI];
294 if (m[0] == hi.x && m[1] == lo.y)
return m_bc_type[Face::XHI_YLO];
295 if (m[0] == hi.x && m[1] == hi.y)
return m_bc_type[Face::XHI_YHI];
297 if (m[0] == lo.x)
return m_bc_type[Face::XLO];
298 if (m[0] == hi.x)
return m_bc_type[Face::XHI];
299 if (m[1] == lo.y)
return m_bc_type[Face::YLO];
300 if (m[1] == hi.y)
return m_bc_type[Face::YHI];
301 if (m[2] == lo.z)
return m_bc_type[Face::ZLO];
302 if (m[2] == hi.z)
return m_bc_type[Face::ZHI];
314 const int &i,
const int &j,
const int &k,
315 const amrex::Box &domain)
317 (void)i; (void)j; (void)k;
320 const amrex::Dim3 lo= amrex::lbound(domain), hi = amrex::ubound(domain);
325 #if AMREX_SPACEDIM == 2
337 #elif AMREX_SPACEDIM == 3
371 return Set::Vector::Zero();
379 for (
int i = 0; i < AMREX_SPACEDIM; i++)
381 if (bc_type[i] == Type::Displacement)
383 else if (bc_type[i] == Type::Traction)
385 else if (bc_type[i] == Type::Neumann)
395 #if AMREX_SPACEDIM==2
396 static const int m_nfaces = 8;
397 #elif AMREX_SPACEDIM==3
398 static const int m_nfaces = 26;
401 std::array<std::array<Type, AMREX_SPACEDIM>, m_nfaces>
m_bc_type;
402 std::array<std::array<Numeric::Interpolator::Linear<Set::Scalar>,AMREX_SPACEDIM>, m_nfaces>
m_bc_val;
407 std::map<std::string, Type> bcmap;
408 bcmap[
"displacement"] = Type::Displacement;
409 bcmap[
"disp"] = Type::Displacement;
410 bcmap[
"neumann"] = Type::Neumann;
411 bcmap[
"traction"] = Type::Traction;
412 bcmap[
"trac"] = Type::Traction;
413 bcmap[
"periodic"] = Type::Periodic;
415 std::vector<std::string> str;
419 #if AMREX_SPACEDIM==3
420 if (pp.
contains(
"type.xloylozlo")) {
422 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YLO_ZLO][i] = bcmap[str[i]]; }
423 if (pp.
contains(
"type.xloylozhi")) {
425 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YLO_ZHI][i] = bcmap[str[i]]; }
426 if (pp.
contains(
"type.xloyhizlo")) {
428 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YHI_ZLO][i] = bcmap[str[i]]; }
429 if (pp.
contains(
"type.xloyhizhi")) {
431 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YHI_ZHI][i] = bcmap[str[i]]; }
432 if (pp.
contains(
"type.xhiylozlo")) {
434 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YLO_ZLO][i] = bcmap[str[i]]; }
435 if (pp.
contains(
"type.xhiylozhi")) {
437 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YLO_ZHI][i] = bcmap[str[i]]; }
438 if (pp.
contains(
"type.xhiyhizlo")) {
440 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YHI_ZLO][i] = bcmap[str[i]]; }
441 if (pp.
contains(
"type.xhiyhizhi")) {
443 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YHI_ZHI][i] = bcmap[str[i]]; }
444 #else // ignore unused inputs
449 #if AMREX_SPACEDIM==3
452 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YLO_ZLO][i] = bcmap[str[i]]; }
455 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YLO_ZHI][i] = bcmap[str[i]]; }
458 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YHI_ZLO][i] = bcmap[str[i]]; }
461 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YHI_ZHI][i] = bcmap[str[i]]; }
464 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZLO_XLO][i] = bcmap[str[i]]; }
467 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZLO_XHI][i] = bcmap[str[i]]; }
470 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZHI_XLO][i] = bcmap[str[i]]; }
473 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZHI_XHI][i] = bcmap[str[i]]; }
481 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YLO][i] = bcmap[str[i]]; }
484 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO_YHI][i] = bcmap[str[i]]; }
487 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YLO][i] = bcmap[str[i]]; }
490 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI_YHI][i] = bcmap[str[i]]; }
494 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XLO][i] = bcmap[str[i]]; }
497 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::XHI][i] = bcmap[str[i]]; }
500 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YLO][i] = bcmap[str[i]]; }
503 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::YHI][i] = bcmap[str[i]]; }
504 #if AMREX_SPACEDIM==3
507 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZLO][i] = bcmap[str[i]]; }
510 for (
int i = 0; i < AMREX_SPACEDIM; i++) value.
m_bc_type[Face::ZHI][i] = bcmap[str[i]]; }
517 std::vector<std::string> val;
519 #if AMREX_SPACEDIM==3
549 #if AMREX_SPACEDIM==3
603 #if AMREX_SPACEDIM==3