Alamo
Cubic.H
Go to the documentation of this file.
1 #ifndef MODEL_SOLID_FINITE_PSEUDOAFFINE_CUBIC_H_
2 #define MODEL_SOLID_FINITE_PSEUDOAFFINE_CUBIC_H_
3 
4 #include "IO/ParmParse.H"
6 
7 namespace Model
8 {
9 namespace Solid
10 {
11 namespace Finite
12 {
13 namespace PseudoAffine
14 {
15 class Cubic : public PseudoLinear::Cubic
16 {
17 public:
18  Cubic() {};
19  Cubic(PseudoLinear::Cubic base) : PseudoLinear::Cubic(base) {};
20  virtual ~Cubic() {};
21 
22  Set::Scalar W(const Set::Matrix& F) const override
23  {
24  Set::Matrix F0inv = F0.inverse();
25  return PseudoLinear::Cubic::W(F * F0inv);
26  }
27  Set::Matrix DW(const Set::Matrix& F) const override
28  {
29  Set::Matrix F0inv = F0.inverse();
30  return PseudoLinear::Cubic::DW(F * F0inv) * F0inv.transpose();
31  }
33  {
34  Set::Matrix F0inv = F0.inverse();
35  auto DDW = PseudoLinear::Cubic::DDW(F * F0inv);
37  for (int i = 0; i < AMREX_SPACEDIM; i++)
38  for (int J = 0; J < AMREX_SPACEDIM; J++)
39  for (int k = 0; k < AMREX_SPACEDIM; k++)
40  for (int L = 0; L < AMREX_SPACEDIM; L++)
41  {
42  ret(i,J,k,L) = 0.0;
43  for (int Q = 0; Q < AMREX_SPACEDIM; Q++)
44  for (int R = 0; R < AMREX_SPACEDIM; R++)
45  ret(i,J,k,L) += DDW(i,Q,k,R)*F0inv(J,Q)*F0inv(L,R);
46  }
47  return ret;
48  }
49 
50 public:
51  Set::Matrix F0 = Set::Matrix::Identity();
52 
53 public:
54  static Cubic Zero()
55  {
57  ret.F0 = Set::Matrix::Zero();
58  return ret;
59  }
60  static Cubic Random()
61  {
63  ret.F0 = Set::Matrix::Random();
64  return ret;
65  }
66 
67  AMREX_FORCE_INLINE
68  static Cubic Combine(const std::vector<Cubic> &models, const std::vector<Set::Scalar> &eta, int order)
69  {
70  Cubic ret = Cubic::Zero();
71  if (order == 1)
72  {
73  Set::Scalar etasum = 0.;
74  for (unsigned int n = 0 ; n < models.size(); n++) etasum += eta[n];
75  for (unsigned int n = 0 ; n < models.size(); n++)
76  {
77  ret.C11 += models[n].C11 * (eta[n] / etasum);
78  ret.C12 += models[n].C12 * (eta[n] / etasum);
79  ret.C44 += models[n].C44 * (eta[n] / etasum);
80  ret.q += models[n].q * (eta[n] / etasum);
81  ret.F0 += models[n].F0 * (eta[n] / etasum);
82  }
83  return ret;
84  }
85  else if (order == 2)
86  {
87  Set::Scalar etasum = 0.;
88  for (unsigned int n = 0 ; n < models.size(); n++) etasum += eta[n]*eta[n];
89  for (unsigned int n = 0 ; n < models.size(); n++)
90  {
91  ret.C11 += models[n].C11 * (eta[n]*eta[n] / etasum);
92  ret.C12 += models[n].C12 * (eta[n]*eta[n] / etasum);
93  ret.C44 += models[n].C44 * (eta[n]*eta[n] / etasum);
94  ret.q += models[n].q * (eta[n]*eta[n] / etasum);
95  ret.F0 += models[n].F0 * (eta[n]*eta[n] / etasum);
96  }
97  return ret;
98  }
99 
100  Util::Exception(INFO,"invalid value used for order, ",order);
101  return ret; // should never happen
102  }
103 
104 
105  static void Parse(Cubic& value, IO::ParmParse& pp)
106  {
107  PseudoLinear::Cubic::Parse(value, pp);
108  if (pp.contains("eps0") && pp.contains("F0"))
109  {
110  Util::Abort("Cannot specify both F0 and eps0");
111  }
112  else if (pp.contains("F0"))
113  {
114  Set::Matrix F0;
115  pp_queryarr("F0", F0); // Large-strain eigendeformation (Identity = no deformation)
116  value.F0 = F0;
117  }
118  else if (pp.contains("eps0"))
119  {
120  Set::Matrix eps0;
121  pp_queryarr("eps0",eps0); // Small-strain eigendeformation (Zero = no deformation)
122  value.F0 = eps0 + Set::Matrix::Identity();
123  }
124  else
125  {
126  value.F0 = Set::Matrix::Identity();
127  }
128  Util::Assert(INFO,TEST(fabs(value.F0.determinant()) > 1E-8 ),"F0 must be non-singular");
129  }
130 
131 #define OP_CLASS Cubic
132 #define OP_VARS X(C11) X(C12) X(C44) X(q) X(F0)
134 };
136 
137 }
138 }
139 }
140 }
141 
142 
143 template<>
146 {
147  return 4;
148 }
149 
150 template<>
153 {
154  if (i == 0) return name + "_F0xx";
155  if (i == 1) return name + "_F0xy";
156  if (i == 2) return name + "_F0yx";
157  if (i == 3) return name + "_F0yy";
158  return name;
159 }
160 
161 template<>
163 void Set::Field<Model::Solid::Finite::PseudoAffine::Cubic>::Copy(int a_lev, amrex::MultiFab& a_dst, int a_dstcomp, int a_nghost) const
164 {
165  for (amrex::MFIter mfi(a_dst, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
166  {
167  const amrex::Box& bx = mfi.growntilebox(amrex::IntVect(a_nghost));
168  if (bx.ok())
169  {
170  amrex::Array4<const Model::Solid::Finite::PseudoAffine::Cubic> const& src = ((*this)[a_lev])->array(mfi);
171  amrex::Array4<Set::Scalar> const& dst = a_dst.array(mfi);
172  amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
173  {
174  dst(i, j, k, a_dstcomp + 0) = src(i, j, k).F0(0, 0);
175  dst(i, j, k, a_dstcomp + 1) = src(i, j, k).F0(0, 1);
176  dst(i, j, k, a_dstcomp + 2) = src(i, j, k).F0(1, 0);
177  dst(i, j, k, a_dstcomp + 3) = src(i, j, k).F0(1, 1);
178  });
179  }
180  }
181 }
182 
183 
184 #endif
Model::Solid::Finite::PseudoAffine::Cubic::~Cubic
virtual ~Cubic()
Definition: Cubic.H:20
Cubic.H
Model::Solid::Finite::PseudoLinear::Cubic::DW
Set::Matrix DW(const Set::Matrix &F) const override
Definition: Cubic.H:30
TEST
#define TEST(x)
Definition: Util.H:21
Model::Solid::Finite::PseudoAffine::Cubic::DDW
Set::Matrix4< AMREX_SPACEDIM, Set::Sym::Major > DDW(const Set::Matrix &F) const override
Definition: Cubic.H:32
ALAMO_SINGLE_DEFINITION
#define ALAMO_SINGLE_DEFINITION
Definition: Util.H:25
Model::Solid::Finite::PseudoLinear::Cubic::C11
Set::Scalar C11
Definition: Cubic.H:83
Model::Solid::Finite::PseudoAffine::Cubic::Random
static Cubic Random()
Definition: Cubic.H:60
Set::Field::Copy
void Copy(int, amrex::MultiFab &, int, int) const
Definition: Set.H:68
ParmParse.H
Set::Field::Name
std::string Name(int) const
Definition: Set.H:73
Util::Random
Set::Scalar Random()
Definition: Set.cpp:9
Set::Scalar
amrex::Real Scalar
Definition: Base.H:19
Model::Solid::Finite::PseudoAffine::Cubic::Zero
static Cubic Zero()
Definition: Cubic.H:54
Model::Solid::Finite::PseudoLinear::Cubic::q
Set::Quaternion q
Definition: Cubic.H:84
Model::Solid::Finite::PseudoAffine::Cubic::DW
Set::Matrix DW(const Set::Matrix &F) const override
Definition: Cubic.H:27
InClassOperators.H
Set::Matrix
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, AMREX_SPACEDIM > Matrix
Definition: Base.H:23
Model::Solid::Finite::PseudoAffine::Cubic::Cubic
Cubic(PseudoLinear::Cubic base)
Definition: Cubic.H:19
Model::Solid::Finite::PseudoAffine::Cubic::Parse
static void Parse(Cubic &value, IO::ParmParse &pp)
Definition: Cubic.H:105
ExtClassOperators.H
Model::Solid::Finite::PseudoLinear::Cubic::Zero
static Cubic Zero()
Definition: Cubic.H:87
Model::Solid::Finite::PseudoAffine::Cubic
Definition: Cubic.H:15
Model::Solid::Finite::PseudoLinear::Cubic::DDW
Set::Matrix4< AMREX_SPACEDIM, Set::Sym::Major > DDW(const Set::Matrix &F) const override
Definition: Cubic.H:47
Model::Solid::Finite::PseudoLinear::Cubic::C44
Set::Scalar C44
Definition: Cubic.H:83
Util::Exception
void Exception(std::string file, std::string func, int line, Args const &... args)
Definition: Util.H:194
IO::ParmParse::contains
bool contains(std::string name)
Definition: ParmParse.H:151
Util::Assert
AMREX_FORCE_INLINE void Assert(std::string file, std::string func, int line, std::string smt, bool pass, Args const &... args)
Definition: Util.H:65
Model::Solid::Finite::PseudoLinear::Cubic
Definition: Cubic.H:15
Util::Abort
void Abort(const char *msg)
Definition: Util.cpp:165
Set::Matrix4
Definition: Base.H:198
Model::Solid::Finite::PseudoLinear::Cubic::Parse
static void Parse(Cubic &value, IO::ParmParse &pp)
Definition: Cubic.H:115
IO::ParmParse
Definition: ParmParse.H:110
Model::Solid::Finite::PseudoLinear::Cubic::C12
Set::Scalar C12
Definition: Cubic.H:83
Model::Solid::Finite::PseudoAffine::Cubic::Combine
static AMREX_FORCE_INLINE Cubic Combine(const std::vector< Cubic > &models, const std::vector< Set::Scalar > &eta, int order)
Definition: Cubic.H:68
Model::Solid::Finite::PseudoLinear::Cubic::W
Set::Scalar W(const Set::Matrix &F) const override
Definition: Cubic.H:22
Set::Field::NComp
int NComp() const
Definition: Set.H:72
Model::Solid::Finite::PseudoAffine::Cubic::Cubic
Cubic()
Definition: Cubic.H:18
INFO
#define INFO
Definition: Util.H:20
Model
Definition: Constant.H:12
Model::Solid::Finite::PseudoAffine::Cubic::W
Set::Scalar W(const Set::Matrix &F) const override
Definition: Cubic.H:22
Model::Solid::Finite::PseudoAffine::Cubic::F0
Set::Matrix F0
Definition: Cubic.H:51
Model::Solid::F
@ F
Definition: Solid.H:26
Model::Solid::Finite::PseudoLinear::Cubic::Random
static Cubic Random()
Definition: Cubic.H:97
pp_queryarr
#define pp_queryarr(...)
Definition: ParmParse.H:103