LCOV - code coverage report
Current view: top level - src/Model/Solid/Finite/PseudoLinear - Cubic.H (source / functions) Hit Total Coverage
Test: coverage_merged.info Lines: 52 72 72.2 %
Date: 2024-11-18 05:28:54 Functions: 11 14 78.6 %

          Line data    Source code
       1             : #ifndef MODEL_SOLID_FINITE_PSEUDOLINEAR_CUBIC_H_
       2             : #define MODEL_SOLID_FINITE_PSEUDOLINEAR_CUBIC_H_
       3             : 
       4             : #include "IO/ParmParse.H"
       5             : #include "Model/Solid/Solid.H"
       6             : 
       7             : namespace Model
       8             : {
       9             : namespace Solid
      10             : {
      11             : namespace Finite
      12             : {
      13             : namespace PseudoLinear
      14             : {
      15             : class Cubic : public Solid<Set::Sym::Major>
      16             : {
      17             : public:
      18         140 :     Cubic() {};
      19             :     //Cubic(Solid<Set::Sym::Major> base) : Solid<Set::Sym::Major>(base) {};
      20         258 :     virtual ~Cubic() {};
      21             : 
      22         960 :     Set::Scalar W(const Set::Matrix & F) const override
      23             :     {
      24         960 :         q.normalize();
      25             :         Set::Matrix4<AMREX_SPACEDIM,Set::Sym::MajorMinor> CC
      26         960 :             = Set::Matrix4<AMREX_SPACEDIM,Set::Sym::MajorMinor>::Cubic(C11,C12,C44,q);
      27         960 :         Set::Matrix E = 0.5 * (F.transpose() * F - Set::Matrix::Identity());
      28        1920 :         return 0.5 * (E * (CC*E).transpose()).trace();
      29             :     }
      30        3920 :     Set::Matrix DW(const Set::Matrix & F) const override
      31             :     {
      32        3920 :         q.normalize();
      33             :         Set::Matrix4<AMREX_SPACEDIM,Set::Sym::MajorMinor> CC
      34        3920 :             = Set::Matrix4<AMREX_SPACEDIM,Set::Sym::MajorMinor>::Cubic(C11,C12,C44,q);
      35        3920 :         Set::Matrix C = F.transpose() * F;
      36        3920 :         Set::Matrix dw = Set::Matrix::Zero();
      37       15020 :         for (int i = 0; i < AMREX_SPACEDIM; i++)
      38       43080 :         for (int J = 0; J < AMREX_SPACEDIM; J++)
      39      125280 :         for (int A = 0; A < AMREX_SPACEDIM; A++)
      40      367920 :         for (int R = 0; R < AMREX_SPACEDIM; R++)
      41     1087920 :         for (int S = 0; S < AMREX_SPACEDIM; S++)
      42             :         {
      43     1626600 :             dw(i,J) += 0.5 * F(i,A)*CC(J,A,R,S) * (C(R,S) - ((R==S) ? 1.0 : 0.0));
      44             :         }
      45        7840 :         return dw;      
      46             :     }
      47          40 :     Set::Matrix4<AMREX_SPACEDIM,Set::Sym::Major> DDW(const Set::Matrix & F) const override
      48             :     {
      49          40 :         q.normalize();
      50             :         Set::Matrix4<AMREX_SPACEDIM,Set::Sym::MajorMinor> CC
      51          40 :             = Set::Matrix4<AMREX_SPACEDIM,Set::Sym::MajorMinor>::Cubic(C11,C12,C44,q);
      52          40 :         Set::Matrix4<AMREX_SPACEDIM,Set::Sym::Major> ddw;
      53          40 :         Set::Matrix C = F.transpose() * F;
      54          40 :         Set::Matrix I = Set::Matrix::Identity();
      55             :         
      56         140 :         for (int i = 0; i < AMREX_SPACEDIM; i++)
      57         360 :         for (int J = 0; J < AMREX_SPACEDIM; J++)
      58         960 :         for (int k = 0; k < AMREX_SPACEDIM; k++)
      59        2640 :         for (int L = 0; L < AMREX_SPACEDIM; L++)
      60             :         {
      61        1940 :             ddw(i,J,k,L) = 0.0;
      62        7440 :             for (int A = 0; A < AMREX_SPACEDIM; A++)
      63       21360 :                 for (int B = 0; B < AMREX_SPACEDIM; B++)
      64             :                 {
      65       31720 :                     ddw(i,J,k,L) += 0.5*I(i,k)*CC(J,L,A,B) * (C(A,B) - I(A,B));
      66       47580 :                     ddw(i,J,k,L) += F(i,A)*F(k,B)*CC(A,J,B,L);
      67       15860 :                     if (std::isnan(ddw(i,J,k,L))) Util::Abort(INFO);
      68             :                 }
      69             :         }
      70             : 
      71          80 :         return ddw;   
      72             :     }
      73           0 :     virtual void Print(std::ostream &out) const override 
      74             :     {
      75             :         //out << "CC = " << CC;
      76           0 :         out << "C11=" << C11 << " C12=" << C12 << " C44=" << C44 <<
      77           0 :             " q=" << q.w() << " + " << q.x() << "i + " << q.y() << "j + " << q.z() << "k";
      78           0 :     }
      79             :     
      80             : public:
      81             :     //Set::Matrix4<AMREX_SPACEDIM,Set::Sym::MajorMinor> CC;
      82             :     static constexpr KinematicVariable kinvar = KinematicVariable::F;
      83             :     Set::Scalar C11=1.68, C12=1.21, C44=0.75;
      84             :     mutable Set::Quaternion q = Set::Quaternion(1.0, 0.0, 0.0, 0.0);
      85             : 
      86             : public:
      87           4 :     static Cubic Zero()
      88             :     {
      89           4 :         Cubic ret;
      90           4 :         ret.C11 = 0.0;
      91           4 :         ret.C12 = 0.0;
      92           4 :         ret.C44 = 0.0;
      93           4 :         ret.q = Set::Quaternion(0.0,0.0,0.0,0.0);
      94             :         //ret.CC = Set::Matrix4<AMREX_SPACEDIM,Set::Sym::MajorMinor>::Zero();
      95           4 :         return ret;
      96             :     }
      97         128 :     static Cubic Random()
      98             :     {
      99         128 :         return Random(Util::Random(), Util::Random(), Util::Random());
     100             :     }
     101         128 :     static Cubic Random(Set::Scalar C11, Set::Scalar C12, Set::Scalar C44)
     102             :     {
     103         128 :         Cubic ret;
     104         128 :         ret.C11 = C11;
     105         128 :         ret.C12 = C12;
     106         128 :         ret.C44 = C44;
     107         128 :         ret.q = Set::Quaternion::UnitRandom();
     108             :         //Set::Scalar phi1 = 2.0*Set::Constant::Pi * Util::Random();
     109             :         //Set::Scalar Phi  =     Set::Constant::Pi * Util::Random();
     110             :         //Set::Scalar phi2 = 2.0*Set::Constant::Pi * Util::Random();
     111             :         //ret.CC = Set::Matrix4<AMREX_SPACEDIM,Set::Sym::MajorMinor>::Cubic(C11,C12,C44,phi1,Phi,phi2);
     112             :         //if (ret.CC.contains_nan()) Util::Abort(INFO);
     113         128 :         return ret;
     114             :     }
     115           0 :     static void Parse(Cubic & value, IO::ParmParse & pp)
     116             :     {
     117             :         //Set::Scalar C11 = 1.68, C12 = 1.21, C44 = 0.75;
     118           0 :         pp_query("C11",value.C11); // Elastic constant (default: 1.68)
     119           0 :         pp_query("C12",value.C12); // Elastic constant (default: 1.21)
     120           0 :         pp_query("C44",value.C44); // Elastic constant (default: 0.75)
     121             : 
     122           0 :         if (pp.contains("random"))
     123             :         {
     124           0 :             value = Cubic::Random(value.C11,value.C12,value.C44);
     125           0 :             return;
     126             :         }
     127             : 
     128           0 :         Set::Scalar phi1 = 0.0, Phi = 0.0, phi2 = 0.0;
     129           0 :         pp_query("phi1",phi1);  // Bunge Euler angle :math:`\phi_1`
     130           0 :         pp_query("Phi",Phi);    // Bunge Euler angle :math:`\Phi`
     131           0 :         pp_query("phi2",phi2);  // Bunge Euler angle :math:`\phi_2`
     132           0 :         Eigen::Matrix3d R;
     133           0 :         R = Eigen::AngleAxisd(phi2, Eigen::Vector3d::UnitX()) *
     134           0 :             Eigen::AngleAxisd(Phi,  Eigen::Vector3d::UnitZ()) *
     135           0 :             Eigen::AngleAxisd(phi1, Eigen::Vector3d::UnitX());
     136           0 :         value.q = Set::Quaternion(R);
     137             :     }
     138             : 
     139             : #define OP_CLASS Cubic
     140             : #define OP_VARS X(C11) X(C12) X(C44) X(q)
     141             : #include "Model/Solid/InClassOperators.H"
     142             : };
     143             : #include "Model/Solid/ExtClassOperators.H"
     144             : 
     145             : }
     146             : }
     147             : }
     148             : }
     149             : 
     150             : #endif

Generated by: LCOV version 1.14