1#ifndef MODEL_SOLID_AFFINE_ISOTROPIC_H_
2#define MODEL_SOLID_AFFINE_ISOTROPIC_H_
22 Define(a_mu, a_lambda, a_F0);
38 return 0.5 * ((
F -
F0).transpose() * (
ddw * ((
F -
F0)))).trace();
48 virtual void Print(std::ostream& out)
const override
50 out <<
"lambda=" <<
ddw.Lambda() <<
", mu=" <<
ddw.Mu() <<
", F0=\n" <<
F0;
54 if (
F0.hasNaN())
return true;
55 if (
ddw.contains_nan())
return true;
82 std::pair<std::string, Set::Scalar> moduli[2];
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");
92 pp.
query_exactly<2>({
"lambda",
"mu",
"E",
"nu",
"kappa"}, moduli);
94 if (moduli[0].first ==
"lambda" && moduli[1].first ==
"mu")
96 lambda = moduli[0].second;
97 mu = moduli[1].second;
99 else if (moduli[0].first ==
"lambda" && moduli[1].first ==
"E")
101 lambda = moduli[0].second;
103 mu = (E - 3.0 * lambda + sqrt(E * E + 9.0 * lambda * lambda + 2.0 * E * lambda)) / 4.0;
105 else if (moduli[0].first ==
"lambda" && moduli[1].first ==
"nu")
107 lambda = moduli[0].second;
109 mu = lambda * (1.0 - 2.0 * nu) / 2.0 / nu;
111 else if (moduli[0].first ==
"mu" && moduli[1].first ==
"E")
113 mu = moduli[0].second;
115 lambda = mu * (E - 2.0 * mu) / (3.0 * mu - E);
117 else if (moduli[0].first ==
"mu" && moduli[1].first ==
"nu")
119 mu = moduli[0].second;
121 lambda = 2.0 * mu * nu / (1.0 - 2.0 * nu);
123 else if (moduli[0].first ==
"mu" && moduli[1].first ==
"K")
125 mu = moduli[0].second;
127 lambda = K - (2.0 * mu / 3.0);
129 else if (moduli[0].first ==
"E" && moduli[1].first ==
"nu")
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);
137 Util::Exception(
INFO,
"Haven't implemented ",moduli[0].first,
" and ",moduli[1].first,
" (sorry!)");
146#define OP_CLASS Isotropic
147#define OP_VARS X(ddw) X(F0)
165 if (
i == 0)
return name +
"_lambda";
166 if (
i == 1)
return name +
"_mu";
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";
189 for (amrex::MFIter
mfi(
a_dst, amrex::TilingIfNotGPU());
mfi.isValid(); ++
mfi)
191 const amrex::Box&
bx =
mfi.growntilebox(amrex::IntVect(
a_nghost));
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);
206#elif AMREX_SPACEDIM==3
#define ALAMO_SINGLE_DEFINITION
void forbid(std::string name, std::string explanation, std::string file="", std::string func="", int line=-1)
bool contains(std::string name)
void query_exactly(std::vector< std::string > names, std::pair< std::string, Set::Scalar > values[N])
Set::Matrix4< AMREX_SPACEDIM, SYM > ddw
Isotropic(Set::Scalar a_mu, Set::Scalar a_lambda, Set::Matrix a_F0=Set::Matrix::Zero())
static void Parse(Isotropic &value, IO::ParmParse &pp)
void Define(Set::Scalar a_mu, Set::Scalar a_lambda, Set::Matrix a_F0)
void Define(Set::Scalar a_mu, Set::Scalar a_lambda)
static Isotropic Random()
Set::Matrix4< AMREX_SPACEDIM, Set::Sym::Isotropic > DDW(const Set::Matrix &) const override
Set::Matrix DW(const Set::Matrix &F) const override
Isotropic(Affine< Set::Sym::Isotropic > base)
virtual void Print(std::ostream &out) const override
virtual bool ContainsNan() override
Set::Scalar W(const Set::Matrix &F) const override
std::string Name(int) const
void Copy(int, amrex::MultiFab &, int, int) const
A collection of data types and symmetry-reduced data structures.
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, AMREX_SPACEDIM > Matrix
void Exception(std::string file, std::string func, int line, Args const &... args)