LCOV - code coverage report
Current view: top level - src/BC/Operator/Elastic - TensionTest.H (source / functions) Coverage Total Hit
Test: coverage_merged.info Lines: 37.0 % 184 68
Test Date: 2025-02-27 04:17:48 Functions: 100.0 % 5 5

            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
        

Generated by: LCOV version 2.0-1