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