Alamo
TensionTest.H
Go to the documentation of this file.
1//
2// A boundary condition for mechanics operators that simplifies frequently-used
3// conditions for uniaxial loading.
4//
5// Types include:
6//
7// - :code:`uniaxial_stress_clamp`: fixes both ends and allows for stress
8// concentrations at the corners.
9// - :code:`uniaxial_kolsky`
10// - :code:`uniaxial_stress`: 1D stress problem
11// - :code:`uniaxial_strain`: 1D strain problem
12//
13//
14
15#ifndef BC_OPERATOR_ELASTIC_TENSIONTEST_H
16#define BC_OPERATOR_ELASTIC_TENSIONTEST_H
17
18// #include "Operator/Elastic.H"
19#include "Constant.H"
20#include "IO/ParmParse.H"
21
22namespace BC
23{
24namespace Operator
25{
26namespace Elastic
27{
28class TensionTest : public Constant
29{
30public:
31 static constexpr const char* name = "tensiontest";
32
34 {};
35
37 { pp_queryclass(name,*this); }
38
39
41
42 using Constant::Init;
43 using Constant::operator();
44 using Constant::set;
45
47
48public:
49 static void Parse(TensionTest & value, IO::ParmParse & pp)
50 {
51 std::string type = "uniaxial_stress_clamp";
52 std::string disp = "0.0", trac = "0.0";
53 LoadingMode mode;
54
55 // Tension test type.
56 pp.query_validate("type",type,{"uniaxial_stress_clamp","uniaxial_kolsky","uniaxial_stress","uniaxial_strain"});
57
58 pp.query("disp",disp); // Applied displacement (can be interpolator)
59 pp.query("trac",trac); // Applied traction (can be interpolator)
60
62
63 if (pp.contains("trac") && pp.contains("disp"))
64 Util::Abort(INFO,"Cannot specify both trac and disp");
65 else if (pp.contains("disp"))
66 {
67 mode = LoadingMode::DISP;
68 }
69 else if (pp.contains("trac"))
70 {
71 mode = LoadingMode::TRAC;
72 }
73 else
74 Util::Abort(INFO,"You must specify either trac or disp");
75
76 if (type == "uniaxial_stress_clamp")
77 {
78 // Add a X displacement in the X direction
79 value.m_bc_val[Face::XHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
80 value.m_bc_val[Face::XHI_YLO][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
81 value.m_bc_val[Face::XHI_YHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
82 #if AMREX_SPACEDIM==3
83 value.m_bc_val[Face::ZLO_XHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
84 value.m_bc_val[Face::ZHI_XHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
85 value.m_bc_val[Face::XHI_YLO_ZLO][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
86 value.m_bc_val[Face::XHI_YLO_ZHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
87 value.m_bc_val[Face::XHI_YHI_ZLO][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
88 value.m_bc_val[Face::XHI_YHI_ZHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
89 #endif
90
91 // Set the Y faces, Z faces, and YZ edges to be traction-free
92 for (int i = 0 ; i < AMREX_SPACEDIM ; i++)
93 {
94 value.m_bc_type[Face::YLO][i] = Type::Traction;
95 value.m_bc_type[Face::YHI][i] = Type::Traction;
96 #if AMREX_SPACEDIM==3
97 value.m_bc_type[Face::ZLO][i] = Type::Traction;
98 value.m_bc_type[Face::ZHI][i] = Type::Traction;
99 value.m_bc_type[Face::YLO_ZLO][i] = Type::Traction;
100 value.m_bc_type[Face::YHI_ZLO][i] = Type::Traction;
101 value.m_bc_type[Face::YLO_ZHI][i] = Type::Traction;
102 value.m_bc_type[Face::YHI_ZHI][i] = Type::Traction;
103 #endif
104 }
105 }
106 else if (type == "uniaxial_kolsky")
107 {
108 // Add a X displacement in the X direction
109 value.m_bc_val[Face::XLO][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
110 value.m_bc_val[Face::XLO_YLO][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
111 value.m_bc_val[Face::XLO_YHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
112 // Set the Y faces, Z faces, and YZ edges to be traction-free
113 for (int i = 0 ; i < AMREX_SPACEDIM ; i++)
114 {
115 value.m_bc_type[Face::YLO][i] = Type::Traction;
116 value.m_bc_type[Face::YHI][i] = Type::Traction;
117 }
118 }
119 else if (type == "uniaxial_stress")
120 {
121 // Go ahead and set everything to traction first.
122 for (int face = 0; face < m_nfaces; face++)
123 for (int i = 0; i < AMREX_SPACEDIM; i++)
124 value.m_bc_type[face][i] = Type::Traction;
125
126
127 // Fix the X displacement in the XMIN
128 value.m_bc_type[Face::XLO][0] = Type::Displacement;
129 value.m_bc_type[Face::XLO_YLO][0] = Type::Displacement;
130 value.m_bc_type[Face::XLO_YHI][0] = Type::Displacement;
131 #if AMREX_SPACEDIM == 3
132 value.m_bc_type[Face::ZLO_XLO][0] = Type::Displacement;
133 value.m_bc_type[Face::ZHI_XLO][0] = Type::Displacement;
134 value.m_bc_type[Face::XLO_YLO_ZLO][0] = Type::Displacement;
135 value.m_bc_type[Face::XLO_YLO_ZHI][0] = Type::Displacement;
136 value.m_bc_type[Face::XLO_YHI_ZLO][0] = Type::Displacement;
137 value.m_bc_type[Face::XLO_YHI_ZHI][0] = Type::Displacement;
138 #endif
139
140 // Add a X displacement in the X direction (same as above)
142 {
143 value.m_bc_type[Face::XHI][0] = Type::Displacement;
144 value.m_bc_val [Face::XHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
145 value.m_bc_type[Face::XHI_YLO][0] = Type::Displacement;
146 value.m_bc_val [Face::XHI_YLO][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
147 value.m_bc_type[Face::XHI_YHI][0] = Type::Displacement;
148 value.m_bc_val [Face::XHI_YHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
149 }
150 else if (mode == TensionTest::LoadingMode::TRAC)
151 {
152 value.m_bc_type[Face::XHI][0] = Type::Traction;
153 value.m_bc_val [Face::XHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(trac);
154 value.m_bc_type[Face::XHI_YLO][0] = Type::Traction;
155 value.m_bc_val [Face::XHI_YLO][0] = Numeric::Interpolator::Linear<Set::Scalar>(trac);
156 value.m_bc_type[Face::XHI_YHI][0] = Type::Traction;
157 value.m_bc_val [Face::XHI_YHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(trac);
158 }
159 #if AMREX_SPACEDIM == 3
161 {
162 value.m_bc_type[Face::ZLO_XHI][0] = Type::Displacement;
163 value.m_bc_val [Face::ZLO_XHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
164 value.m_bc_type[Face::ZHI_XHI][0] = Type::Displacement;
165 value.m_bc_val [Face::ZHI_XHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
166 value.m_bc_type[Face::XHI_YLO_ZLO][0] = Type::Displacement;
167 value.m_bc_val [Face::XHI_YLO_ZLO][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
168 value.m_bc_type[Face::XHI_YLO_ZHI][0] = Type::Displacement;
169 value.m_bc_val [Face::XHI_YLO_ZHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
170 value.m_bc_type[Face::XHI_YHI_ZLO][0] = Type::Displacement;
171 value.m_bc_val [Face::XHI_YHI_ZLO][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
172 value.m_bc_type[Face::XHI_YHI_ZHI][0] = Type::Displacement;
173 value.m_bc_val [Face::XHI_YHI_ZHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
174 }
176 {
177 value.m_bc_type[Face::ZLO_XHI][0] = Type::Traction;
178 value.m_bc_val [Face::ZLO_XHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(trac);
179 value.m_bc_type[Face::ZHI_XHI][0] = Type::Traction;
180 value.m_bc_val [Face::ZHI_XHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(trac);
181 value.m_bc_type[Face::XHI_YLO_ZLO][0] = Type::Traction;
182 value.m_bc_val [Face::XHI_YLO_ZLO][0] = Numeric::Interpolator::Linear<Set::Scalar>(trac);
183 value.m_bc_type[Face::XHI_YLO_ZHI][0] = Type::Traction;
184 value.m_bc_val [Face::XHI_YLO_ZHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(trac);
185 value.m_bc_type[Face::XHI_YHI_ZLO][0] = Type::Traction;
186 value.m_bc_val [Face::XHI_YHI_ZLO][0] = Numeric::Interpolator::Linear<Set::Scalar>(trac);
187 value.m_bc_type[Face::XHI_YHI_ZHI][0] = Type::Traction;
188 value.m_bc_val [Face::XHI_YHI_ZHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(trac);
189 }
190 #endif
191
192 // Fix Ymin displacement
193 value.m_bc_type[Face::YLO][1] = Type::Displacement;
194 value.m_bc_type[Face::XLO_YLO][1] = Type::Displacement;
195 value.m_bc_type[Face::XHI_YLO][1] = Type::Displacement;
196 #if AMREX_SPACEDIM == 3
197 value.m_bc_type[Face::YLO_ZLO][1] = Type::Displacement;
198 value.m_bc_type[Face::YLO_ZHI][1] = Type::Displacement;
199 value.m_bc_type[Face::XLO_YLO_ZLO][1] = Type::Displacement;
200 value.m_bc_type[Face::XLO_YLO_ZHI][1] = Type::Displacement;
201 value.m_bc_type[Face::XHI_YLO_ZLO][1] = Type::Displacement;
202 value.m_bc_type[Face::XHI_YLO_ZHI][1] = Type::Displacement;
203 #endif
204
205 #if AMREX_SPACEDIM == 3
206 // Fix Zmin displacement
207 value.m_bc_type[Face::ZLO][2] = Type::Displacement;
208 value.m_bc_type[Face::YLO_ZLO][2] = Type::Displacement;
209 value.m_bc_type[Face::YHI_ZLO][2] = Type::Displacement;
210 value.m_bc_type[Face::ZLO_XLO][2] = Type::Displacement;
211 value.m_bc_type[Face::ZLO_XHI][2] = Type::Displacement;
212 value.m_bc_type[Face::XLO_YLO_ZLO][2] = Type::Displacement;
213 value.m_bc_type[Face::XLO_YHI_ZLO][2] = Type::Displacement;
214 value.m_bc_type[Face::XHI_YLO_ZLO][2] = Type::Displacement;
215 value.m_bc_type[Face::XHI_YHI_ZLO][2] = Type::Displacement;
216 #endif
217
218 }
219 else if (type == "uniaxial_strain")
220 {
221 // Go ahead and set everything to traction first.
222 for (int face = 0; face < m_nfaces; face++)
223 for (int i = 0; i < AMREX_SPACEDIM; i++)
224 value.m_bc_type[face][i] = Type::Traction;
225
226
227 // Fix the X displacement in the XMIN
228 value.m_bc_type[Face::XLO][0] = Type::Displacement;
229 value.m_bc_type[Face::XLO_YLO][0] = Type::Displacement;
230 value.m_bc_type[Face::XLO_YHI][0] = Type::Displacement;
231 #if AMREX_SPACEDIM == 3
232 value.m_bc_type[Face::ZLO_XLO][0] = Type::Displacement;
233 value.m_bc_type[Face::ZHI_XLO][0] = Type::Displacement;
234 value.m_bc_type[Face::XLO_YLO_ZLO][0] = Type::Displacement;
235 value.m_bc_type[Face::XLO_YLO_ZHI][0] = Type::Displacement;
236 value.m_bc_type[Face::XLO_YHI_ZLO][0] = Type::Displacement;
237 value.m_bc_type[Face::XLO_YHI_ZHI][0] = Type::Displacement;
238 #endif
239
240 // Add a X displacement in the X direction (same as above)
241 value.m_bc_type[Face::XHI][0] = Type::Displacement;
242 value.m_bc_val [Face::XHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
243 value.m_bc_type[Face::XHI_YLO][0] = Type::Displacement;
244 value.m_bc_val [Face::XHI_YLO][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
245 value.m_bc_type[Face::XHI_YHI][0] = Type::Displacement;
246 value.m_bc_val [Face::XHI_YHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
247 #if AMREX_SPACEDIM == 3
248 value.m_bc_type[Face::ZLO_XHI][0] = Type::Displacement;
249 value.m_bc_val [Face::ZLO_XHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
250 value.m_bc_type[Face::ZHI_XHI][0] = Type::Displacement;
251 value.m_bc_val [Face::ZHI_XHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
252 value.m_bc_type[Face::XHI_YLO_ZLO][0] = Type::Displacement;
253 value.m_bc_val [Face::XHI_YLO_ZLO][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
254 value.m_bc_type[Face::XHI_YLO_ZHI][0] = Type::Displacement;
255 value.m_bc_val [Face::XHI_YLO_ZHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
256 value.m_bc_type[Face::XHI_YHI_ZLO][0] = Type::Displacement;
257 value.m_bc_val [Face::XHI_YHI_ZLO][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
258 value.m_bc_type[Face::XHI_YHI_ZHI][0] = Type::Displacement;
259 value.m_bc_val [Face::XHI_YHI_ZHI][0] = Numeric::Interpolator::Linear<Set::Scalar>(disp);
260 #endif
261
262 // Fix Ymin displacement
263 value.m_bc_type[Face::YLO][1] = Type::Displacement;
264 value.m_bc_type[Face::XLO_YLO][1] = Type::Displacement;
265 value.m_bc_type[Face::XHI_YLO][1] = Type::Displacement;
266 value.m_bc_type[Face::YHI][1] = Type::Displacement;
267 value.m_bc_type[Face::XLO_YHI][1] = Type::Displacement;
268 value.m_bc_type[Face::XHI_YHI][1] = Type::Displacement;
269 #if AMREX_SPACEDIM == 3
270 value.m_bc_type[Face::YLO_ZLO][1] = Type::Displacement;
271 value.m_bc_type[Face::YLO_ZHI][1] = Type::Displacement;
272 value.m_bc_type[Face::YHI_ZLO][1] = Type::Displacement;
273 value.m_bc_type[Face::YHI_ZHI][1] = Type::Displacement;
274 value.m_bc_type[Face::XLO_YLO_ZLO][1] = Type::Displacement;
275 value.m_bc_type[Face::XLO_YLO_ZHI][1] = Type::Displacement;
276 value.m_bc_type[Face::XHI_YLO_ZLO][1] = Type::Displacement;
277 value.m_bc_type[Face::XHI_YLO_ZHI][1] = Type::Displacement;
278 value.m_bc_type[Face::XLO_YHI_ZLO][1] = Type::Displacement;
279 value.m_bc_type[Face::XLO_YHI_ZHI][1] = Type::Displacement;
280 value.m_bc_type[Face::XHI_YHI_ZLO][1] = Type::Displacement;
281 value.m_bc_type[Face::XHI_YHI_ZHI][1] = Type::Displacement;
282 #endif
283
284 #if AMREX_SPACEDIM == 3
285 value.m_bc_type[Face::ZLO][2] = Type::Displacement;
286 value.m_bc_type[Face::ZHI][2] = Type::Displacement;
287 value.m_bc_type[Face::YLO_ZLO][2] = Type::Displacement;
288 value.m_bc_type[Face::YHI_ZLO][2] = Type::Displacement;
289 value.m_bc_type[Face::ZLO_XLO][2] = Type::Displacement;
290 value.m_bc_type[Face::ZLO_XHI][2] = Type::Displacement;
291 value.m_bc_type[Face::YLO_ZHI][2] = Type::Displacement;
292 value.m_bc_type[Face::YHI_ZHI][2] = Type::Displacement;
293 value.m_bc_type[Face::ZHI_XLO][2] = Type::Displacement;
294 value.m_bc_type[Face::ZHI_XHI][2] = Type::Displacement;
295 value.m_bc_type[Face::XLO_YLO_ZLO][2] = Type::Displacement;
296 value.m_bc_type[Face::XLO_YHI_ZLO][2] = Type::Displacement;
297 value.m_bc_type[Face::XHI_YLO_ZLO][2] = Type::Displacement;
298 value.m_bc_type[Face::XHI_YHI_ZLO][2] = Type::Displacement;
299 value.m_bc_type[Face::XLO_YLO_ZHI][2] = Type::Displacement;
300 value.m_bc_type[Face::XLO_YHI_ZHI][2] = Type::Displacement;
301 value.m_bc_type[Face::XHI_YLO_ZHI][2] = Type::Displacement;
302 value.m_bc_type[Face::XHI_YHI_ZHI][2] = Type::Displacement;
303 #endif
304
305 }
306 else
307 {
308 Util::Abort(INFO,"Unknown BC type ", type);
309 }
310 }
311};
312}
313}
314}
315#endif
#define pp_queryclass(...)
Definition ParmParse.H:130
#define INFO
Definition Util.H:24
std::array< std::array< Type, AMREX_SPACEDIM >, m_nfaces > m_bc_type
Definition Constant.H:435
AMREX_FORCE_INLINE Set::Vector set(std::array< Type, AMREX_SPACEDIM > &bc_type, const Set::Vector &u, const Set::Matrix &gradu, const Set::Matrix &sigma, Set::Vector n) const
Definition Constant.H:409
std::array< std::array< Numeric::Interpolator::Linear< Set::Scalar >, AMREX_SPACEDIM >, m_nfaces > m_bc_val
Definition Constant.H:436
virtual void Init(amrex::FabArray< amrex::BaseFab< Set::Vector > > *a_rhs, const amrex::Geometry &a_geom, bool a_homogeneous=false) const override
Definition Constant.H:101
static void Parse(TensionTest &value, IO::ParmParse &pp)
Definition TensionTest.H:49
TensionTest(IO::ParmParse &pp, std::string name)
Definition TensionTest.H:36
static constexpr const char * name
Definition TensionTest.H:31
int query_validate(std::string name, int &value, std::vector< int > possibleintvals, const std::source_location &location=std::source_location::current())
Definition ParmParse.H:569
int query(std::string name, T &value, const std::source_location &location=std::source_location::current())
Definition ParmParse.H:340
static bool InTraversalMode()
Definition ParmParse.cpp:14
bool contains(std::string name, const std::source_location &location=std::source_location::current())
Definition ParmParse.H:318
Collection of boundary condition (BC) objects.
Definition BC.cpp:5
Documentation for operator namespace.
Definition Diagonal.cpp:14
AMREX_GPU_HOST_DEVICE void Abort(const char *msg)
Definition Util.cpp:406