Alamo
Isotropic.H
Go to the documentation of this file.
1#ifndef MODEL_SOLID_AFFINE_ISOTROPIC_H_
2#define MODEL_SOLID_AFFINE_ISOTROPIC_H_
3
4#include "AMReX.H"
5#include "IO/ParmParse.H"
7
8namespace Model
9{
10namespace Solid
11{
12namespace Affine
13{
14class Isotropic : public Affine<Set::Sym::Isotropic>
15{
16public:
17
20 Isotropic(Set::Scalar a_mu, Set::Scalar a_lambda, Set::Matrix a_F0 = Set::Matrix::Zero())
21 {
22 Define(a_mu, a_lambda, a_F0);
23 };
24
25 void Define(Set::Scalar a_mu, Set::Scalar a_lambda, Set::Matrix a_F0)
26 {
27 F0 = a_F0;
29 }
30
31 void Define(Set::Scalar a_mu, Set::Scalar a_lambda)
32 {
34 }
35
36 Set::Scalar W(const Set::Matrix& F) const override
37 {
38 return 0.5 * ((F - F0).transpose() * (ddw * ((F - F0)))).trace();
39 }
40 Set::Matrix DW(const Set::Matrix& F) const override
41 {
42 return ddw * (F - F0);
43 }
45 {
46 return ddw;
47 }
48 virtual void Print(std::ostream& out) const override
49 {
50 out << "lambda=" << ddw.Lambda() << ", mu=" << ddw.Mu() << ", F0=\n" << F0;
51 }
52 virtual bool ContainsNan() override
53 {
54 if (F0.hasNaN()) return true;
55 if (ddw.contains_nan()) return true;
56 else return false;
57 }
58public:
59 static Isotropic Zero()
60 {
61 Isotropic ret;
62 Set::Scalar mu = 0.0;
63 Set::Scalar lambda = 0.0;
64 Set::Matrix F0 = Set::Matrix::Zero();
65 ret.Define(mu, lambda, F0);
66 return ret;
67 }
69 {
70 Isotropic ret;
72 Set::Scalar lambda = Util::Random();
73 Set::Matrix F0 = Set::Matrix::Random();
74 ret.Define(mu, lambda, F0);
75 return ret;
76 }
77 static void Parse(Isotropic& value, IO::ParmParse& pp)
78 {
79 Set::Scalar mu = NAN, lambda = NAN;
80 Set::Matrix F0 = Set::Matrix::Zero();
81
82 std::pair<std::string, Set::Scalar> moduli[2];
83
84 pp.forbid("lame","Use 'lambda' instead for lame constant");
85 pp.forbid("shear","Use 'mu' instead for shear modulus");
86 pp.forbid("bulk","Use 'kappa' instead for bulk modulus");
87
88 // Specify exactly two of: lame constant \‍(\lambda\‍),
89 // shear modulus \‍(\mu\‍), Young's modulus \‍(E\‍), Poisson's ratio \‍(\nu\‍),
90 // bulk modulus \‍(\kappa\‍).
91 // \‍(\mu\‍) and \‍(\lambda\‍) are how the final values are stored.
92 pp.query_exactly<2>({"lambda","mu","E","nu","kappa"}, moduli);
93
94 if (moduli[0].first == "lambda" && moduli[1].first == "mu")
95 {
96 lambda = moduli[0].second;
97 mu = moduli[1].second;
98 }
99 else if (moduli[0].first == "lambda" && moduli[1].first == "E")
100 {
101 lambda = moduli[0].second;
102 Set::Scalar E = moduli[1].second;
103 mu = (E - 3.0 * lambda + sqrt(E * E + 9.0 * lambda * lambda + 2.0 * E * lambda)) / 4.0;
104 }
105 else if (moduli[0].first == "lambda" && moduli[1].first == "nu")
106 {
107 lambda = moduli[0].second;
108 Set::Scalar nu = moduli[1].second;
109 mu = lambda * (1.0 - 2.0 * nu) / 2.0 / nu;
110 }
111 else if (moduli[0].first == "mu" && moduli[1].first == "E")
112 {
113 mu = moduli[0].second;
114 Set::Scalar E = moduli[1].second;
115 lambda = mu * (E - 2.0 * mu) / (3.0 * mu - E);
116 }
117 else if (moduli[0].first == "mu" && moduli[1].first == "nu")
118 {
119 mu = moduli[0].second;
120 Set::Scalar nu = moduli[1].second;
121 lambda = 2.0 * mu * nu / (1.0 - 2.0 * nu);
122 }
123 else if (moduli[0].first == "mu" && moduli[1].first == "K")
124 {
125 mu = moduli[0].second;
126 Set::Scalar K = moduli[1].second;
127 lambda = K - (2.0 * mu / 3.0);
128 }
129 else if (moduli[0].first == "E" && moduli[1].first == "nu")
130 {
131 Set::Scalar E = moduli[0].second, nu = moduli[1].second;
132 lambda = E * nu / (1.0 + nu) / (1.0 - 2.0 * nu);
133 mu = E / 2.0 / (1.0 + nu);
134 }
135 else
136 {
137 Util::Exception(INFO,"Haven't implemented ",moduli[0].first," and ",moduli[1].first," (sorry!)");
138 }
139
140 if (pp.contains("F0"))
141 {
142 pp_queryarr("F0", F0); // Eigendeformation gradient
143 }
144 value.Define(mu, lambda, F0);
145 }
146#define OP_CLASS Isotropic
147#define OP_VARS X(ddw) X(F0)
149};
151}
152}
153}
154
155template<>
161template<>
164{
165 if (i == 0) return name + "_lambda";
166 if (i == 1) return name + "_mu";
167#if AMREX_SPACEDIM==2
168 if (i == 2) return name + "_F0_xx";
169 if (i == 3) return name + "_F0_xy";
170 if (i == 4) return name + "_F0_yx";
171 if (i == 5) return name + "_F0_yy";
172#elif AMREX_SPACEDIM==3
173 if (i == 2) return name + "_F0_xx";
174 if (i == 3) return name + "_F0_xy";
175 if (i == 4) return name + "_F0_xy";
176 if (i == 5) return name + "_F0_yx";
177 if (i == 6) return name + "_F0_yy";
178 if (i == 7) return name + "_F0_yz";
179 if (i == 8) return name + "_F0_zy";
180 if (i == 9) return name + "_F0_zx";
181 if (i == 10) return name + "_F0_zz";
182#endif
183 return name;
184}
185template<>
188{
189 for (amrex::MFIter mfi(a_dst, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
190 {
191 const amrex::Box& bx = mfi.growntilebox(amrex::IntVect(a_nghost));
192 if (bx.ok())
193 {
194 amrex::Array4<const Model::Solid::Affine::Isotropic> const& src = ((*this)[a_lev])->array(mfi);
195 amrex::Array4<Set::Scalar> const& dst = a_dst.array(mfi);
196 for (int n = 0; n < AMREX_SPACEDIM * AMREX_SPACEDIM; n++)
197 {
198 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) {
199 dst(i, j, k, a_dstcomp + 0) = src(i, j, k).ddw.Lambda();
200 dst(i, j, k, a_dstcomp + 1) = src(i, j, k).ddw.Mu();
201#if AMREX_SPACEDIM==2
202 dst(i, j, k, a_dstcomp + 2) = src(i, j, k).F0(0, 0);
203 dst(i, j, k, a_dstcomp + 3) = src(i, j, k).F0(0, 1);
204 dst(i, j, k, a_dstcomp + 4) = src(i, j, k).F0(1, 0);
205 dst(i, j, k, a_dstcomp + 5) = src(i, j, k).F0(1, 1);
206#elif AMREX_SPACEDIM==3
207 dst(i, j, k, a_dstcomp + 2) = src(i, j, k).F0(0, 0);
208 dst(i, j, k, a_dstcomp + 3) = src(i, j, k).F0(0, 1);
209 dst(i, j, k, a_dstcomp + 4) = src(i, j, k).F0(0, 2);
210 dst(i, j, k, a_dstcomp + 5) = src(i, j, k).F0(1, 0);
211 dst(i, j, k, a_dstcomp + 6) = src(i, j, k).F0(1, 1);
212 dst(i, j, k, a_dstcomp + 7) = src(i, j, k).F0(1, 2);
213 dst(i, j, k, a_dstcomp + 8) = src(i, j, k).F0(2, 0);
214 dst(i, j, k, a_dstcomp + 9) = src(i, j, k).F0(2, 1);
215 dst(i, j, k, a_dstcomp + 10) = src(i, j, k).F0(2, 2);
216#endif
217 });
218 }
219 }
220 }
221}
222
223
224
225
226#endif
#define pp_queryarr(...)
Definition ParmParse.H:103
#define ALAMO_SINGLE_DEFINITION
Definition Util.H:25
#define INFO
Definition Util.H:20
void forbid(std::string name, std::string explanation, std::string file="", std::string func="", int line=-1)
Definition ParmParse.H:140
bool contains(std::string name)
Definition ParmParse.H:154
void query_exactly(std::vector< std::string > names, std::pair< std::string, Set::Scalar > values[N])
Definition ParmParse.H:778
Set::Matrix4< AMREX_SPACEDIM, SYM > ddw
Definition Affine.H:37
Isotropic(Set::Scalar a_mu, Set::Scalar a_lambda, Set::Matrix a_F0=Set::Matrix::Zero())
Definition Isotropic.H:20
static void Parse(Isotropic &value, IO::ParmParse &pp)
Definition Isotropic.H:77
void Define(Set::Scalar a_mu, Set::Scalar a_lambda, Set::Matrix a_F0)
Definition Isotropic.H:25
void Define(Set::Scalar a_mu, Set::Scalar a_lambda)
Definition Isotropic.H:31
static Isotropic Random()
Definition Isotropic.H:68
Set::Matrix4< AMREX_SPACEDIM, Set::Sym::Isotropic > DDW(const Set::Matrix &) const override
Definition Isotropic.H:44
Set::Matrix DW(const Set::Matrix &F) const override
Definition Isotropic.H:40
static Isotropic Zero()
Definition Isotropic.H:59
Isotropic(Affine< Set::Sym::Isotropic > base)
Definition Isotropic.H:19
virtual void Print(std::ostream &out) const override
Definition Isotropic.H:48
virtual bool ContainsNan() override
Definition Isotropic.H:52
Set::Scalar W(const Set::Matrix &F) const override
Definition Isotropic.H:36
std::string Name(int) const
Definition Set.H:73
void Copy(int, amrex::MultiFab &, int, int) const
Definition Set.H:68
int NComp() const
Definition Set.H:72
A collection of data types and symmetry-reduced data structures.
Definition Base.H:18
amrex::Real Scalar
Definition Base.H:19
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
Definition Base.H:20
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, AMREX_SPACEDIM > Matrix
Definition Base.H:23
Set::Scalar Random()
Definition Set.cpp:9
void Exception(std::string file, std::string func, int line, Args const &... args)
Definition Util.H:205