LCOV - code coverage report
Current view: top level - src/Model/Solid/Affine - Hexagonal.H (source / functions) Hit Total Coverage
Test: coverage_merged.info Lines: 37 53 69.8 %
Date: 2024-11-18 05:28:54 Functions: 17 19 89.5 %

          Line data    Source code
       1             : //
       2             : // This model implements an affine hexagonal material:
       3             : //
       4             : // .. math::
       5             : //
       6             : //    W_{aff}(\nabla\mathbf{u}) = W_{lin}(\nabla\mathbf{u} - \mathbf{F}_0)
       7             : //
       8             : // where :math:`W_{aff}` is the present model, :math:`\mathbf{F}_0` is the eigenstrain,
       9             : // and :math:`W_{lin}` is the cubic model defined in :ref:`Model::Solid::Linear::Hexagonal`.
      10             : //
      11             : #ifndef MODEL_SOLID_AFFINE_HEXAGONAL_H_
      12             : #define MODEL_SOLID_AFFINE_HEXAGONAL_H_
      13             : 
      14             : #include "Model/Solid/Solid.H"
      15             : #include "Model/Solid/Linear/Hexagonal.H"
      16             : #include "IO/ParmParse.H"
      17             : 
      18             : namespace Model
      19             : {
      20             : namespace Solid
      21             : {
      22             : namespace Affine
      23             : {
      24             : class Hexagonal : public Linear::Hexagonal
      25             : {
      26             : public:
      27             : 
      28         859 :     Hexagonal() {};
      29         172 :     Hexagonal(Linear::Hexagonal base) : Linear::Hexagonal(base) {};
      30        1184 :     virtual ~Hexagonal() {};
      31             : 
      32             :     void
      33             :     Define(Set::Scalar C11, Set::Scalar C12, Set::Scalar C13, Set::Scalar C33, Set::Scalar C44, Set::Scalar phi1, Set::Scalar Phi, Set::Scalar phi2,Set::Matrix a_F0=Set::Matrix::Zero())
      34             :     {
      35             :         Linear::Hexagonal::Define(C11,C12,C13,C33,C44,phi1,Phi,phi2);
      36             :         F0 = a_F0;
      37             :     }
      38             :     void
      39             :     Define(Set::Scalar C11, Set::Scalar C12, Set::Scalar C13, Set::Scalar C33, Set::Scalar C44, Eigen::Matrix3d R, Set::Matrix a_F0=Set::Matrix::Zero())
      40             :     {
      41             :         Linear::Hexagonal::Define(C11,C12,C13,C33,C44,R);
      42             :         F0 = a_F0;
      43             :     }
      44         260 :     Set::Scalar W(const Set::Matrix & gradu) const override
      45             :     {
      46         260 :         return Linear::Hexagonal::W(gradu - F0);
      47             :     }
      48       26960 :     Set::Matrix DW(const Set::Matrix & gradu) const override
      49             :     {
      50       26960 :         return Linear::Hexagonal::DW(gradu - F0);
      51             :     }
      52       12520 :     Set::Matrix4<AMREX_SPACEDIM,Set::Sym::MajorMinor> DDW(const Set::Matrix & gradu) const override
      53             :     {
      54       12520 :         return Linear::Hexagonal::DDW(gradu - F0);
      55             :     }
      56           0 :     virtual void Print(std::ostream &out) const override 
      57             :     {
      58           0 :         out << ddw;
      59           0 :     }
      60             :     AMREX_FORCE_INLINE
      61             :     void SetF0 (Set::Matrix &a_F0) {F0 = a_F0;}
      62             : 
      63             : public:
      64             :     Set::Matrix F0 = Set::Matrix::Zero();
      65             :     static const KinematicVariable kinvar = KinematicVariable::gradu;
      66             : 
      67         128 :     static Hexagonal Zero()
      68             :     {
      69         128 :         Hexagonal ret = Linear::Hexagonal::Zero();
      70         128 :         ret.F0 = Set::Matrix::Zero();
      71         128 :         return ret;
      72             :     }
      73          44 :     static Hexagonal Random()
      74             :     {
      75          44 :         return Random(Util::Random(), Util::Random(), Util::Random(),Util::Random(),Util::Random());
      76             :     }
      77          44 :     static Hexagonal Random(Set::Scalar C11, Set::Scalar C12, Set::Scalar C13, Set::Scalar C33, Set::Scalar C44)
      78             :     {
      79          44 :         Hexagonal ret = Linear::Hexagonal::Random(C11,C12,C13,C33,C44);
      80          44 :         ret.F0 = Set::Matrix::Random();
      81          44 :         return ret;
      82             :     }
      83           1 :     static void Parse(Hexagonal & value, IO::ParmParse & pp)
      84             :     {
      85           1 :         Linear::Hexagonal::Parse(value,pp);
      86           1 :         pp_queryarr("F0",value.F0); // Eigenstrain matrix. Can be defined in 2D or 3D.
      87           1 :     }
      88             : 
      89             :     AMREX_FORCE_INLINE
      90             :     static Hexagonal Combine(const std::vector<Hexagonal> &models, const std::vector<Set::Scalar> &eta, int order)
      91             :     {
      92           0 :         Hexagonal ret;
      93           0 :         ret.ddw = Set::Matrix4<AMREX_SPACEDIM,Set::Sym::MajorMinor>::Zero();
      94           0 :         ret.F0 = Set::Matrix::Zero();
      95           0 :         if (order == 1)
      96             :         {
      97           0 :         Set::Scalar etasum = 0.;
      98           0 :         for (unsigned int n = 0 ; n < models.size(); n++) etasum += eta[n];
      99           0 :         for (unsigned int n = 0 ; n < models.size(); n++)
     100             :         {
     101           0 :             ret.ddw += models[n].ddw * (eta[n] / etasum);
     102           0 :             ret.F0  += models[n].F0  * (eta[n] / etasum);
     103             :         }
     104           0 :             return ret;
     105             :         }
     106           0 :         Util::Exception(INFO,"Order value of ", order, " not supported yet");
     107           0 :         return ret;
     108             :     }
     109             : 
     110             :     #define OP_CLASS Hexagonal
     111             :     #define OP_VARS  X(ddw) X(F0)
     112             :     #include "Model/Solid/InClassOperators.H"
     113             : };
     114             : #include "Model/Solid/ExtClassOperators.H"
     115             : 
     116             : }
     117             : }
     118             : }
     119             : 
     120             : template<>
     121             : ALAMO_SINGLE_DEFINITION
     122          44 : int Set::Field<Model::Solid::Affine::Hexagonal>::NComp() const 
     123             : {
     124          44 :     return 1;
     125             : }
     126             : 
     127             : template<>
     128             : ALAMO_SINGLE_DEFINITION
     129          11 : std::string Set::Field<Model::Solid::Affine::Hexagonal>::Name(int i) const 
     130             : {
     131          11 :     if (i==0) return name + ".Cxxxx";
     132           0 :     return name;
     133             : }
     134             : 
     135             : template<>
     136             : ALAMO_SINGLE_DEFINITION
     137          11 : void Set::Field<Model::Solid::Affine::Hexagonal>::Copy(int a_lev, amrex::MultiFab &a_dst, int a_dstcomp, int a_nghost) const
     138             : {
     139          22 :     for (amrex::MFIter mfi(a_dst, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
     140             :     {
     141          11 :         const amrex::Box& bx = mfi.growntilebox(amrex::IntVect(a_nghost));
     142          11 :         if (bx.ok())
     143             :         {
     144          11 :             amrex::Array4<const Model::Solid::Affine::Hexagonal> const & src = ((*this)[a_lev])->array(mfi);
     145          11 :             amrex::Array4<Set::Scalar> const & dst = a_dst.array(mfi);
     146          11 :             amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) 
     147             :             {
     148        4125 :                 dst(i,j,k,a_dstcomp + 0) = src(i,j,k).ddw(0,0,0,0);
     149        1375 :             });
     150             :         }
     151             :     }    
     152          11 : }
     153             : 
     154             : 
     155             : #endif

Generated by: LCOV version 1.14