Alamo
Cubic.H
Go to the documentation of this file.
1 //
2 // This class implements basic cubic elasticity.
3 // For a discussion on cubic elasticity, `please see this link <http://solidmechanics.org/text/Chapter3_2/Chapter3_2.htm#Sect3_2_16>`_.
4 //
5 
6 #ifndef MODEL_SOLID_LINEAR_CUBIC_H_
7 #define MODEL_SOLID_LINEAR_CUBIC_H_
8 
9 #include "Model/Solid/Solid.H"
10 #include "IO/ParmParse.H"
11 
12 namespace Model
13 {
14 namespace Solid
15 {
16 namespace Linear
17 {
18 class Cubic : public Solid<Set::Sym::MajorMinor>
19 {
20 public:
21 
22  Cubic() {};
24  virtual ~Cubic() {};
25 
26  void
28  {
30  }
31  void
33  {
35  }
36  Set::Scalar W(const Set::Matrix & gradu) const override
37  {
38  return ( 0.5 * gradu.transpose() * (ddw*gradu) ).trace();
39  }
40  Set::Matrix DW(const Set::Matrix & gradu) const override
41  {
42  return ddw*gradu;
43  }
45  {
46  return ddw;
47  }
48  virtual void Print(std::ostream &out) const override
49  {
50  out << ddw;
51  }
52 
53 public:
56 
57  AMREX_FORCE_INLINE
58  static Cubic Combine(const std::vector<Cubic> &models, const std::vector<Set::Scalar> &eta)
59  {
60  Cubic ret;
62  Set::Scalar etasum = 0.;
63  for (unsigned int n = 0 ; n < models.size(); n++) etasum += eta[n];
64  for (unsigned int n = 0 ; n < models.size(); n++)
65  {
66  ret.ddw += models[n].ddw * (eta[n] / etasum);
67  }
68  return ret;
69  }
70 
71  static Cubic Zero()
72  {
73  Cubic ret;
74  ret.Define(0.0,0.0,0.0,0.0,0.0,0.0);
75  return ret;
76 
77  }
78  static Cubic Random()
79  {
81  }
83  {
84  Cubic ret;
88  ret.Define(C11,C12,C44,phi1,Phi,phi2);
89  return ret;
90  }
91 
92  static void Parse(Cubic & value, IO::ParmParse & pp)
93  {
94  Set::Scalar C11 = NAN, C12 = NAN, C44 = NAN;
95  pp_query_default("C11",C11,1.68); // Elastic constant
96  pp_query_default("C12",C12,1.21); // Elastic constant
97  pp_query_default("C44",C44,0.75); // Elastic constant
98 
99  if (pp.contains("random"))
100  {
101  value = Cubic::Random(C11,C12,C44);
102  return;
103  }
104 
105  std::string anglefmt;
106  // specify whether using radians or degrees
107  pp_query_validate("anglefmt",anglefmt,{"radians","degrees"});
108 
109  Set::Scalar phi1 = NAN, Phi = NAN, phi2 = NAN;
110  pp_query_default("phi1",phi1,0.0); // Bunge Euler angle :math:`\phi_1` about x axis
111  pp_query_default("Phi", Phi, 0.0); // Bunge Euler angle :math:`\Phi` about z axis
112  pp_query_default("phi2",phi2,0.0); // Bunge Euler angle :math:`\phi_2` about x axis
113 
114  if (anglefmt == "degrees")
115  {
116  phi1 *= Set::Constant::Pi / 180.0;
117  Phi *= Set::Constant::Pi / 180.0;
118  phi2 *= Set::Constant::Pi / 180.0;
119  }
120 
121  value.Define(C11,C12,C44,phi1,Phi,phi2);
122  }
123 
124  #define OP_CLASS Cubic
125  #define OP_VARS X(ddw)
127 };
129 
130 }
131 }
132 }
133 
134 #endif
Model::Solid::gradu
@ gradu
Definition: Solid.H:26
Set::Sym
Sym
Definition: Base.H:197
Model::Solid::Linear::Cubic::ddw
Set::Matrix4< AMREX_SPACEDIM, Set::Sym::MajorMinor > ddw
Definition: Cubic.H:54
Model::Solid::Linear::Cubic::Define
void Define(Set::Scalar C11, Set::Scalar C12, Set::Scalar C44, Eigen::Matrix3d R)
Definition: Cubic.H:32
Set::MajorMinor
@ MajorMinor
Definition: Base.H:197
Model::Solid::Linear::Cubic::Cubic
Cubic(Solid< Set::Sym::MajorMinor > base)
Definition: Cubic.H:23
Model::Solid::Linear::Cubic::kinvar
static const KinematicVariable kinvar
Definition: Cubic.H:55
Model::Solid::Linear::Cubic::Random
static Cubic Random(Set::Scalar C11, Set::Scalar C12, Set::Scalar C44)
Definition: Cubic.H:82
Model::Solid::Linear::Cubic::Print
virtual void Print(std::ostream &out) const override
Definition: Cubic.H:48
ParmParse.H
Util::Random
Set::Scalar Random()
Definition: Set.cpp:9
Set::Scalar
amrex::Real Scalar
Definition: Base.H:19
Set
A collection of data types and symmetry-reduced data structures.
Definition: Base.H:17
Solid.H
InClassOperators.H
Set::Matrix
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, AMREX_SPACEDIM > Matrix
Definition: Base.H:23
ExtClassOperators.H
Model::Solid::Linear::Cubic::W
Set::Scalar W(const Set::Matrix &gradu) const override
Definition: Cubic.H:36
Model::Solid::Linear::Cubic::DDW
Set::Matrix4< AMREX_SPACEDIM, Set::Sym::MajorMinor > DDW(const Set::Matrix &) const override
Definition: Cubic.H:44
IO::ParmParse::contains
bool contains(std::string name)
Definition: ParmParse.H:151
pp_query_default
#define pp_query_default(...)
Definition: ParmParse.H:100
Model::Solid::Linear::Cubic::Random
static Cubic Random()
Definition: Cubic.H:78
Model::Solid::Solid
Definition: Solid.H:29
Set::Matrix4
Definition: Base.H:198
Model::Solid::Linear::Cubic
Definition: Cubic.H:18
Model::Solid::Linear::Cubic::Parse
static void Parse(Cubic &value, IO::ParmParse &pp)
Definition: Cubic.H:92
Set::Constant::Pi
static const Set::Scalar Pi
Definition: Set.H:286
Model::Solid::KinematicVariable
KinematicVariable
Definition: Solid.H:26
pp_query_validate
#define pp_query_validate(...)
Definition: ParmParse.H:101
IO::ParmParse
Definition: ParmParse.H:110
Model::Solid::Linear::Cubic::Combine
static AMREX_FORCE_INLINE Cubic Combine(const std::vector< Cubic > &models, const std::vector< Set::Scalar > &eta)
Definition: Cubic.H:58
Model::Solid::Linear::Cubic::DW
Set::Matrix DW(const Set::Matrix &gradu) const override
Definition: Cubic.H:40
Model::Solid::Linear::Cubic::Define
void Define(Set::Scalar C11, Set::Scalar C12, Set::Scalar C44, Set::Scalar phi1, Set::Scalar Phi, Set::Scalar phi2)
Definition: Cubic.H:27
Model::Solid::Linear::Cubic::Zero
static Cubic Zero()
Definition: Cubic.H:71
Model::Solid::Linear::Cubic::~Cubic
virtual ~Cubic()
Definition: Cubic.H:24
Model
Definition: Constant.H:12
Set::Matrix3d
Eigen::Matrix3d Matrix3d
Definition: Base.H:24
Model::Solid::Linear::Cubic::Cubic
Cubic()
Definition: Cubic.H:22