1#ifndef MODEL_SOLID_FINITE_NEOHOOKEAN_H_
2#define MODEL_SOLID_FINITE_NEOHOOKEAN_H_
24 Eigen::Matrix3d
F = Eigen::Matrix3d::Identity();
29#elif AMREX_SPACEDIM==3
30 Eigen::Matrix3d
F = a_F;
36 w += 0.5 *
mu * ((
F *
F.transpose()).trace() / J23 - 3.);
37 w += 0.5 *
kappa * (J - 1.0) * (J - 1.0);
43 Eigen::Matrix3d
F = Eigen::Matrix3d::Identity();
48#elif AMREX_SPACEDIM==3
49 Eigen::Matrix3d
F = a_F;
54 Eigen::Matrix3d FinvT =
F.inverse().transpose();
56 Eigen::Matrix3d dw = Eigen::Matrix3d::Zero();
58 dw +=
mu * (
F / J23 - (
F *
F.transpose()).trace() * FinvT / (3. * J23));
59 dw +=
kappa * (J - 1) * J * FinvT;
63 r_dw(0, 0) = dw(0, 0);
64 r_dw(0, 1) = dw(0, 1);
65 r_dw(1, 0) = dw(1, 0);
66 r_dw(1, 1) = dw(1, 1);
68#elif AMREX_SPACEDIM==3
75 Eigen::Matrix3d
F = Eigen::Matrix3d::Identity();
80#elif AMREX_SPACEDIM==3
81 Eigen::Matrix3d
F = a_F;
87 Eigen::Matrix3d FinvT =
F.inverse().transpose();
88 for (
int i = 0; i < 3; i++)
89 for (
int j = 0; j < 3; j++)
90 for (
int k = 0; k < 3; k++)
91 for (
int l = 0; l < 3; l++)
93 ddw(i, j, k, l) = 0.0;
97 if (i == k && j == l) t1 += 1.0;
98 t1 -= (2. / 3.) *
F(i, j) * FinvT(k, l);
99 t1 -= (2. / 3.) * FinvT(i, j) *
F(k, l);
100 t1 += (2. / 9.) * (
F *
F.transpose()).trace() * FinvT(i, j) * FinvT(k, l);
101 t1 += (1. / 3.) * (
F *
F.transpose()).trace() * FinvT(i, l) * FinvT(k, j);
103 t2 += (2. * J - 1.) * FinvT(i, j) * FinvT(k, l);
104 t2 += (1. - J) * FinvT(i, l) * FinvT(k, j);
106 ddw(i, j, k, l) = (
mu / J23) * t1 +
kappa * J * t2;
110 for (
int i = 0; i < 2; i++)
111 for (
int j = 0; j < 2; j++)
112 for (
int k = 0; k < 2; k++)
113 for (
int l = 0; l < 2; l++)
114 r_ddw(i, j, k, l) = ddw(i, j, k, l);
116#elif AMREX_SPACEDIM==3
122 out <<
"mu = " <<
mu <<
" kappa = " <<
kappa;
147 std::pair<std::string, Set::Scalar> moduli[2];
149 pp.
forbid(
"lame",
"Use 'lambda' instead for lame constant");
150 pp.
forbid(
"shear",
"Use 'mu' instead for shear modulus");
151 pp.
forbid(
"bulk",
"Use 'K' instead for bulk modulus");
158 pp.
query_exactly<2>({
"lambda",
"mu",
"E",
"nu",
"kappa"}, moduli, std::vector<Unit>{
Unit::Pressure(),
Unit::Pressure(),
Unit::Pressure(),
Unit::Less(),
Unit::Pressure()});
161 if (moduli[0].first ==
"mu" && moduli[1].first ==
"kappa")
163 value.
mu = moduli[0].second;
164 value.
kappa = moduli[1].second;
166 else if (moduli[0].first ==
"lambda" && moduli[1].first ==
"mu")
169 value.
mu = moduli[1].second;
170 value.
kappa = lambda + (2.0 * value.
mu) / 3.0;
175 value.
kappa = E / (3.0 - 6.0 * nu);
176 value.
mu = E / (2.0 + 2.0 * nu);
180 Util::Exception(
INFO,
"Haven't implemented",moduli[0].first,
" and ",moduli[1].first,
" yet (sorry!)");
184#define OP_CLASS NeoHookean
185#define OP_VARS X(kappa) X(mu)
bool contains(std::string name)
void forbid(std::string name, std::string explanation)
void query_exactly(std::vector< std::string > names, std::pair< std::string, Set::Scalar > values[N], std::vector< Unit > units=std::vector< Unit >())
static NeoHookean Random()
NeoHookean(Solid< Set::Sym::Major > base)
static void Parse(NeoHookean &value, IO::ParmParse &pp)
static constexpr KinematicVariable kinvar
void Print(std::ostream &out) const
Set::Matrix4< AMREX_SPACEDIM, Set::Sym::Major > DDW(const Set::Matrix &a_F) const
Set::Matrix DW(const Set::Matrix &a_F) const
Set::Scalar W(const Set::Matrix &a_F) 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)