1#ifndef MODEL_SOLID_FINITE_NEOHOOKEAN_H_
2#define MODEL_SOLID_FINITE_NEOHOOKEAN_H_
23 Eigen::Matrix3d
F = Eigen::Matrix3d::Identity();
28#elif AMREX_SPACEDIM==3
29 Eigen::Matrix3d
F = a_F;
35 w += 0.5 *
mu * ((
F *
F.transpose()).trace() / J23 - 3.);
36 w += 0.5 *
kappa * (J - 1.0) * (J - 1.0);
42 Eigen::Matrix3d
F = Eigen::Matrix3d::Identity();
47#elif AMREX_SPACEDIM==3
48 Eigen::Matrix3d
F = a_F;
53 Eigen::Matrix3d FinvT =
F.inverse().transpose();
55 Eigen::Matrix3d dw = Eigen::Matrix3d::Zero();
57 dw +=
mu * (
F / J23 - (
F *
F.transpose()).trace() * FinvT / (3. * J23));
58 dw +=
kappa * (J - 1) * J * FinvT;
62 r_dw(0, 0) = dw(0, 0);
63 r_dw(0, 1) = dw(0, 1);
64 r_dw(1, 0) = dw(1, 0);
65 r_dw(1, 1) = dw(1, 1);
67#elif AMREX_SPACEDIM==3
74 Eigen::Matrix3d
F = Eigen::Matrix3d::Identity();
79#elif AMREX_SPACEDIM==3
80 Eigen::Matrix3d
F = a_F;
86 Eigen::Matrix3d FinvT =
F.inverse().transpose();
87 for (
int i = 0; i < 3; i++)
88 for (
int j = 0; j < 3; j++)
89 for (
int k = 0; k < 3; k++)
90 for (
int l = 0; l < 3; l++)
92 ddw(i, j, k, l) = 0.0;
96 if (i == k && j == l) t1 += 1.0;
97 t1 -= (2. / 3.) *
F(i, j) * FinvT(k, l);
98 t1 -= (2. / 3.) * FinvT(i, j) *
F(k, l);
99 t1 += (2. / 9.) * (
F *
F.transpose()).trace() * FinvT(i, j) * FinvT(k, l);
100 t1 += (1. / 3.) * (
F *
F.transpose()).trace() * FinvT(i, l) * FinvT(k, j);
102 t2 += (2. * J - 1.) * FinvT(i, j) * FinvT(k, l);
103 t2 += (1. - J) * FinvT(i, l) * FinvT(k, j);
105 ddw(i, j, k, l) = (
mu / J23) * t1 +
kappa * J * t2;
109 for (
int i = 0; i < 2; i++)
110 for (
int j = 0; j < 2; j++)
111 for (
int k = 0; k < 2; k++)
112 for (
int l = 0; l < 2; l++)
113 r_ddw(i, j, k, l) = ddw(i, j, k, l);
115#elif AMREX_SPACEDIM==3
119 virtual void Print(std::ostream& out)
const override
121 out <<
"mu = " <<
mu <<
" kappa = " <<
kappa;
146 std::pair<std::string, Set::Scalar> moduli[2];
148 pp.
forbid(
"lame",
"Use 'lambda' instead for lame constant");
149 pp.
forbid(
"shear",
"Use 'mu' instead for shear modulus");
150 pp.
forbid(
"bulk",
"Use 'K' instead for bulk modulus");
156 pp.
query_exactly<2>({
"lambda",
"mu",
"E",
"nu",
"kappa"}, moduli);
159 if (moduli[0].first ==
"mu" && moduli[1].first ==
"kappa")
161 value.
mu = moduli[0].second;
162 value.
kappa = moduli[1].second;
164 else if (moduli[0].first ==
"lambda" && moduli[1].first ==
"mu")
167 value.
mu = moduli[1].second;
168 value.
kappa = lambda + (2.0 * value.
mu) / 3.0;
173 value.
kappa = E / (3.0 - 6.0 * nu);
174 value.
mu = E / (2.0 + 2.0 * nu);
178 Util::Exception(
INFO,
"Haven't implemented",moduli[0].first,
" and ",moduli[1].first,
" yet (sorry!)");
182#define OP_CLASS NeoHookean
183#define OP_VARS X(kappa) X(mu)
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])
virtual void Print(std::ostream &out) const override
static NeoHookean Random()
NeoHookean(Solid< Set::Sym::Major > base)
static void Parse(NeoHookean &value, IO::ParmParse &pp)
static constexpr KinematicVariable kinvar
Set::Matrix4< AMREX_SPACEDIM, Set::Sym::Major > DDW(const Set::Matrix &a_F) const override
Set::Matrix DW(const Set::Matrix &a_F) const override
Set::Scalar W(const Set::Matrix &a_F) const override
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)