Alamo
NeoHookeanPredeformed.H
Go to the documentation of this file.
1#ifndef MODEL_SOLID_FINITE_NEOHOOKEANPREDEFORMED_H_
2#define MODEL_SOLID_FINITE_NEOHOOKEANPREDEFORMED_H_
3
4#include "IO/ParmParse.H"
6
7namespace Model
8{
9namespace Solid
10{
11namespace Finite
12{
14{
15public:
19
20 Set::Scalar W(const Set::Matrix& F) const override
21 {
22 return NeoHookean::W(F * F0.inverse());
23 }
24 Set::Matrix DW(const Set::Matrix& F) const override
25 {
26 return NeoHookean::DW(F * F0.inverse());
27 }
29 {
30 return NeoHookean::DDW(F * F0.inverse());
31 }
32 virtual void Print(std::ostream& out) const override
33 {
34 out << "mu = " << mu << " kappa = " << kappa << " F0 = " << F0;
35 }
36
37public:
38 Set::Matrix F0 = Set::Matrix::Identity();
39
40public:
42 {
44 ret.F0 = Set::Matrix::Zero();
45 return ret;
46 }
48 {
50 ret.F0 = Set::Matrix::Random();
51 return ret;
52 }
53 static void Parse(NeoHookeanPredeformed& value, IO::ParmParse& pp)
54 {
55 pp.queryclass<NeoHookean>(value);
56
57 if (pp.contains("eps0") && pp.contains("F0"))
58 {
59 Util::Abort("Cannot specify both F0 and eps0");
60 }
61 else if (pp.contains("F0"))
62 {
64 // Large-deformation eigendeformation (Identity = no deformation)
65 pp_queryarr_default("F0", F0, Set::Matrix::Identity());
66 value.F0 = F0;
67 }
68 else if (pp.contains("eps0"))
69 {
70 Set::Matrix eps0;
71 // Small-deformation eigendeformation (Zero = no deformation)
72 pp_queryarr_default("eps0",eps0, Set::Matrix::Zero());
73 value.F0 = eps0 + Set::Matrix::Identity();
74 }
75 else
76 {
77 value.F0 = Set::Matrix::Identity();
78 }
79 Util::Assert(INFO,TEST(fabs(value.F0.determinant()) > 1E-8 ),"F0 must be non-singular");
80 }
81
82#define OP_CLASS NeoHookeanPredeformed
83#define OP_VARS X(kappa) X(mu) X(F0)
85};
87
88}
89}
90}
91
92
93
94template<>
100
101template<>
104{
105 if (i == 0) return name + "_mu";
106 if (i == 1) return name + "_kappa";
107#if AMREX_SPACEDIM==2
108 if (i == 2) return name + "_F0xx";
109 if (i == 3) return name + "_F0xy";
110 if (i == 4) return name + "_F0yx";
111 if (i == 5) return name + "_F0yy";
112#elif AMREX_SPACEDIM==3
113 //Util::Abort(INFO, "Not implemented yet");
114 if (i == 2) return name + "_F0xx";
115 if (i == 3) return name + "_F0xy";
116 if (i == 4) return name + "_F0yx";
117 if (i == 5) return name + "_F0yy";
118#endif
119 return name;
120}
121
122template<>
125{
126 for (amrex::MFIter mfi(a_dst, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
127 {
128 const amrex::Box& bx = mfi.growntilebox(amrex::IntVect(a_nghost));
129 if (bx.ok())
130 {
131 amrex::Array4<const Model::Solid::Finite::NeoHookeanPredeformed> const& src = ((*this)[a_lev])->array(mfi);
132 amrex::Array4<Set::Scalar> const& dst = a_dst.array(mfi);
133 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
134 {
135 dst(i, j, k, a_dstcomp + 0) = src(i, j, k).mu;
136 dst(i, j, k, a_dstcomp + 1) = src(i, j, k).kappa;
137#if AMREX_SPACEDIM==2
138 dst(i, j, k, a_dstcomp + 2) = src(i, j, k).F0(0, 0);
139 dst(i, j, k, a_dstcomp + 3) = src(i, j, k).F0(0, 1);
140 dst(i, j, k, a_dstcomp + 4) = src(i, j, k).F0(1, 0);
141 dst(i, j, k, a_dstcomp + 5) = src(i, j, k).F0(1, 1);
142#elif AMREX_SPACEDIM==3
143 dst(i, j, k, a_dstcomp + 2) = src(i, j, k).F0(0, 0);
144 dst(i, j, k, a_dstcomp + 3) = src(i, j, k).F0(0, 1);
145 dst(i, j, k, a_dstcomp + 4) = src(i, j, k).F0(1, 0);
146 dst(i, j, k, a_dstcomp + 5) = src(i, j, k).F0(1, 1);
147 //Util::Abort(INFO, "Not implemented");
148#endif
149
150 //dst(i, j, k, a_dstcomp + 0) = src(i, j, k).ddw(0, 0, 0, 0);
151 });
152 }
153 }
154}
155
156
157#endif
#define pp_queryarr_default(...)
Definition ParmParse.H:107
#define TEST(x)
Definition Util.H:22
#define ALAMO_SINGLE_DEFINITION
Definition Util.H:26
#define INFO
Definition Util.H:21
bool contains(std::string name)
Definition ParmParse.H:173
void queryclass(std::string name, T *value)
Definition ParmParse.H:934
virtual void Print(std::ostream &out) const override
Set::Scalar W(const Set::Matrix &F) const override
Set::Matrix DW(const Set::Matrix &F) const override
Set::Matrix4< AMREX_SPACEDIM, Set::Sym::Major > DDW(const Set::Matrix &F) const override
static void Parse(NeoHookeanPredeformed &value, IO::ParmParse &pp)
Set::Matrix4< AMREX_SPACEDIM, Set::Sym::Major > DDW(const Set::Matrix &a_F) const override
Definition NeoHookean.H:71
Set::Matrix DW(const Set::Matrix &a_F) const override
Definition NeoHookean.H:39
Set::Scalar W(const Set::Matrix &a_F) const override
Definition NeoHookean.H:20
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
amrex::Real Scalar
Definition Base.H:18
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
Definition Base.H:19
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, AMREX_SPACEDIM > Matrix
Definition Base.H:22
void Abort(const char *msg)
Definition Util.cpp:225
AMREX_FORCE_INLINE void Assert(std::string file, std::string func, int line, std::string smt, bool pass, Args const &... args)
Definition Util.H:55