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