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