LCOV - code coverage report
Current view: top level - src/Model/Solid/Finite - NeoHookeanPredeformed.H (source / functions) Hit Total Coverage
Test: coverage_merged.info Lines: 17 68 25.0 %
Date: 2024-11-18 05:28:54 Functions: 11 18 61.1 %

          Line data    Source code
       1             : #ifndef MODEL_SOLID_FINITE_NEOHOOKEANPREDEFORMED_H_
       2             : #define MODEL_SOLID_FINITE_NEOHOOKEANPREDEFORMED_H_
       3             : 
       4             : #include "IO/ParmParse.H"
       5             : #include "Model/Solid/Finite/NeoHookean.H"
       6             : 
       7             : namespace Model
       8             : {
       9             : namespace Solid
      10             : {
      11             : namespace Finite
      12             : {
      13             : class NeoHookeanPredeformed : public NeoHookean
      14             : {
      15             : public:
      16          10 :     NeoHookeanPredeformed() {};
      17         130 :     NeoHookeanPredeformed(NeoHookean base) : NeoHookean(base) {};
      18         166 :     virtual ~NeoHookeanPredeformed() {};
      19             : 
      20         480 :     Set::Scalar W(const Set::Matrix& F) const override
      21             :     {
      22         480 :         return NeoHookean::W(F * F0.inverse());
      23             :     }
      24        1960 :     Set::Matrix DW(const Set::Matrix& F) const override
      25             :     {
      26        1960 :         return NeoHookean::DW(F * F0.inverse());
      27             :     }
      28          20 :     Set::Matrix4<AMREX_SPACEDIM, Set::Sym::Major> DDW(const Set::Matrix& F) const override
      29             :     {
      30          20 :         return NeoHookean::DDW(F * F0.inverse());
      31             :     }
      32           0 :     virtual void Print(std::ostream& out) const override
      33             :     {
      34           0 :         out << "mu = " << mu << " kappa = " << kappa << " F0 = " << F0;
      35           0 :     }
      36             : 
      37             : public:
      38             :     Set::Matrix F0 = Set::Matrix::Identity();
      39             : 
      40             : public:
      41           2 :     static NeoHookeanPredeformed Zero()
      42             :     {
      43           2 :         NeoHookeanPredeformed ret = NeoHookean::Zero();
      44           2 :         ret.F0 = Set::Matrix::Zero();
      45           2 :         return ret;
      46             :     }
      47          64 :     static NeoHookean Random()
      48             :     {
      49         128 :         NeoHookeanPredeformed ret = NeoHookean::Random();
      50          64 :         ret.F0 = Set::Matrix::Random();
      51         128 :         return ret;
      52             :     }
      53           0 :     static void Parse(NeoHookeanPredeformed& value, IO::ParmParse& pp)
      54             :     {
      55           0 :         pp.queryclass<NeoHookean>(value);
      56             :         
      57           0 :         if (pp.contains("eps0") && pp.contains("F0"))
      58             :         {
      59           0 :             Util::Abort("Cannot specify both F0 and eps0");
      60             :         }
      61           0 :         else if (pp.contains("F0")) 
      62             :         {
      63           0 :             Set::Matrix F0;
      64           0 :             pp_queryarr("F0", F0); // Large-deformation eigendeformation (Identity = no deformation)
      65           0 :             value.F0 = F0;
      66             :         }
      67           0 :         else if (pp.contains("eps0"))
      68             :         {
      69           0 :             Set::Matrix eps0;
      70           0 :             pp_queryarr("eps0",eps0); // Small-deformation eigendeformation (Zero = no deformation)
      71           0 :             value.F0 = eps0 + Set::Matrix::Identity(); 
      72             :         }
      73             :         else
      74             :         {
      75           0 :             value.F0 = Set::Matrix::Identity();
      76             :         }
      77           0 :         Util::Assert(INFO,TEST(fabs(value.F0.determinant()) > 1E-8 ),"F0 must be non-singular");
      78           0 :     }
      79             : 
      80             : #define OP_CLASS NeoHookeanPredeformed
      81             : #define OP_VARS X(kappa) X(mu) X(F0)
      82             : #include "Model/Solid/InClassOperators.H"
      83             : };
      84             : #include "Model/Solid/ExtClassOperators.H"
      85             : 
      86             : }
      87             : }
      88             : }
      89             : 
      90             : 
      91             : 
      92             : template<>
      93             : ALAMO_SINGLE_DEFINITION
      94           0 : int Set::Field<Model::Solid::Finite::NeoHookeanPredeformed>::NComp() const
      95             : {
      96           0 :     return 2 + AMREX_SPACEDIM * AMREX_SPACEDIM;
      97             : }
      98             : 
      99             : template<>
     100             : ALAMO_SINGLE_DEFINITION
     101           0 : std::string Set::Field<Model::Solid::Finite::NeoHookeanPredeformed>::Name(int i) const
     102             : {
     103           0 :     if (i == 0) return name + "_mu";
     104           0 :     if (i == 1) return name + "_kappa";
     105             : #if AMREX_SPACEDIM==2
     106           0 :     if (i == 2) return name + "_F0xx";
     107           0 :     if (i == 3) return name + "_F0xy";
     108           0 :     if (i == 4) return name + "_F0yx";
     109           0 :     if (i == 5) return name + "_F0yy";
     110             : #elif AMREX_SPACEDIM==3
     111             :     //Util::Abort(INFO, "Not implemented yet");
     112           0 :     if (i == 2) return name + "_F0xx";
     113           0 :     if (i == 3) return name + "_F0xy";
     114           0 :     if (i == 4) return name + "_F0yx";
     115           0 :     if (i == 5) return name + "_F0yy";
     116             : #endif
     117           0 :     return name;
     118             : }
     119             : 
     120             : template<>
     121             : ALAMO_SINGLE_DEFINITION
     122           0 : void Set::Field<Model::Solid::Finite::NeoHookeanPredeformed>::Copy(int a_lev, amrex::MultiFab& a_dst, int a_dstcomp, int a_nghost) const
     123             : {
     124           0 :     for (amrex::MFIter mfi(a_dst, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
     125             :     {
     126           0 :         const amrex::Box& bx = mfi.growntilebox(amrex::IntVect(a_nghost));
     127           0 :         if (bx.ok())
     128             :         {
     129           0 :             amrex::Array4<const Model::Solid::Finite::NeoHookeanPredeformed> const& src = ((*this)[a_lev])->array(mfi);
     130           0 :             amrex::Array4<Set::Scalar> const& dst = a_dst.array(mfi);
     131           0 :             amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
     132             :             {
     133           0 :                 dst(i, j, k, a_dstcomp + 0) = src(i, j, k).mu;
     134           0 :                 dst(i, j, k, a_dstcomp + 1) = src(i, j, k).kappa;
     135             : #if AMREX_SPACEDIM==2
     136           0 :                 dst(i, j, k, a_dstcomp + 2) = src(i, j, k).F0(0, 0);
     137           0 :                 dst(i, j, k, a_dstcomp + 3) = src(i, j, k).F0(0, 1);
     138           0 :                 dst(i, j, k, a_dstcomp + 4) = src(i, j, k).F0(1, 0);
     139           0 :                 dst(i, j, k, a_dstcomp + 5) = src(i, j, k).F0(1, 1);
     140             : #elif AMREX_SPACEDIM==3
     141           0 :                 dst(i, j, k, a_dstcomp + 2) = src(i, j, k).F0(0, 0);
     142           0 :                 dst(i, j, k, a_dstcomp + 3) = src(i, j, k).F0(0, 1);
     143           0 :                 dst(i, j, k, a_dstcomp + 4) = src(i, j, k).F0(1, 0);
     144           0 :                 dst(i, j, k, a_dstcomp + 5) = src(i, j, k).F0(1, 1);
     145             :                 //Util::Abort(INFO, "Not implemented");
     146             : #endif
     147             : 
     148             :                 //dst(i, j, k, a_dstcomp + 0) = src(i, j, k).ddw(0, 0, 0, 0);
     149           0 :             });
     150             :         }
     151             :     }
     152           0 : }
     153             : 
     154             : 
     155             : #endif

Generated by: LCOV version 1.14