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