Line data Source code
1 : #ifndef MODEL_SOLID_FINITE_NEOHOOKEANPREDEFORMED_H_
2 : #define MODEL_SOLID_FINITE_NEOHOOKEANPREDEFORMED_H_
3 :
4 : #include "IO/ParmParse.H"
5 : #include "Model/Solid/Finite/NeoHookean.H"
6 :
7 : namespace Model
8 : {
9 : namespace Solid
10 : {
11 : namespace Finite
12 : {
13 : class NeoHookeanPredeformed : public NeoHookean
14 : {
15 : public:
16 10 : NeoHookeanPredeformed() {};
17 130 : NeoHookeanPredeformed(NeoHookean base) : NeoHookean(base) {};
18 166 : virtual ~NeoHookeanPredeformed() {};
19 :
20 480 : Set::Scalar W(const Set::Matrix& F) const override
21 : {
22 480 : return NeoHookean::W(F * F0.inverse());
23 : }
24 1960 : Set::Matrix DW(const Set::Matrix& F) const override
25 : {
26 1960 : return NeoHookean::DW(F * F0.inverse());
27 : }
28 20 : Set::Matrix4<AMREX_SPACEDIM, Set::Sym::Major> DDW(const Set::Matrix& F) const override
29 : {
30 20 : return NeoHookean::DDW(F * F0.inverse());
31 : }
32 0 : virtual void Print(std::ostream& out) const override
33 : {
34 0 : out << "mu = " << mu << " kappa = " << kappa << " F0 = " << F0;
35 0 : }
36 :
37 : public:
38 : Set::Matrix F0 = Set::Matrix::Identity();
39 :
40 : public:
41 2 : static NeoHookeanPredeformed Zero()
42 : {
43 2 : NeoHookeanPredeformed ret = NeoHookean::Zero();
44 2 : ret.F0 = Set::Matrix::Zero();
45 2 : return ret;
46 : }
47 64 : static NeoHookean Random()
48 : {
49 128 : NeoHookeanPredeformed ret = NeoHookean::Random();
50 64 : ret.F0 = Set::Matrix::Random();
51 128 : return ret;
52 : }
53 0 : static void Parse(NeoHookeanPredeformed& value, IO::ParmParse& pp)
54 : {
55 0 : pp.queryclass<NeoHookean>(value);
56 :
57 0 : if (pp.contains("eps0") && pp.contains("F0"))
58 : {
59 0 : Util::Abort("Cannot specify both F0 and eps0");
60 : }
61 0 : else if (pp.contains("F0"))
62 : {
63 0 : Set::Matrix F0;
64 0 : pp_queryarr("F0", F0); // Large-deformation eigendeformation (Identity = no deformation)
65 0 : value.F0 = F0;
66 : }
67 0 : else if (pp.contains("eps0"))
68 : {
69 0 : Set::Matrix eps0;
70 0 : pp_queryarr("eps0",eps0); // Small-deformation eigendeformation (Zero = no deformation)
71 0 : value.F0 = eps0 + Set::Matrix::Identity();
72 : }
73 : else
74 : {
75 0 : value.F0 = Set::Matrix::Identity();
76 : }
77 0 : Util::Assert(INFO,TEST(fabs(value.F0.determinant()) > 1E-8 ),"F0 must be non-singular");
78 0 : }
79 :
80 : #define OP_CLASS NeoHookeanPredeformed
81 : #define OP_VARS X(kappa) X(mu) X(F0)
82 : #include "Model/Solid/InClassOperators.H"
83 : };
84 : #include "Model/Solid/ExtClassOperators.H"
85 :
86 : }
87 : }
88 : }
89 :
90 :
91 :
92 : template<>
93 : ALAMO_SINGLE_DEFINITION
94 0 : int Set::Field<Model::Solid::Finite::NeoHookeanPredeformed>::NComp() const
95 : {
96 0 : return 2 + AMREX_SPACEDIM * AMREX_SPACEDIM;
97 : }
98 :
99 : template<>
100 : ALAMO_SINGLE_DEFINITION
101 0 : std::string Set::Field<Model::Solid::Finite::NeoHookeanPredeformed>::Name(int i) const
102 : {
103 0 : if (i == 0) return name + "_mu";
104 0 : if (i == 1) return name + "_kappa";
105 : #if AMREX_SPACEDIM==2
106 0 : if (i == 2) return name + "_F0xx";
107 0 : if (i == 3) return name + "_F0xy";
108 0 : if (i == 4) return name + "_F0yx";
109 0 : if (i == 5) return name + "_F0yy";
110 : #elif AMREX_SPACEDIM==3
111 : //Util::Abort(INFO, "Not implemented yet");
112 0 : if (i == 2) return name + "_F0xx";
113 0 : if (i == 3) return name + "_F0xy";
114 0 : if (i == 4) return name + "_F0yx";
115 0 : if (i == 5) return name + "_F0yy";
116 : #endif
117 0 : return name;
118 : }
119 :
120 : template<>
121 : ALAMO_SINGLE_DEFINITION
122 0 : void Set::Field<Model::Solid::Finite::NeoHookeanPredeformed>::Copy(int a_lev, amrex::MultiFab& a_dst, int a_dstcomp, int a_nghost) const
123 : {
124 0 : for (amrex::MFIter mfi(a_dst, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
125 : {
126 0 : const amrex::Box& bx = mfi.growntilebox(amrex::IntVect(a_nghost));
127 0 : if (bx.ok())
128 : {
129 0 : amrex::Array4<const Model::Solid::Finite::NeoHookeanPredeformed> const& src = ((*this)[a_lev])->array(mfi);
130 0 : amrex::Array4<Set::Scalar> const& dst = a_dst.array(mfi);
131 0 : amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
132 : {
133 0 : dst(i, j, k, a_dstcomp + 0) = src(i, j, k).mu;
134 0 : dst(i, j, k, a_dstcomp + 1) = src(i, j, k).kappa;
135 : #if AMREX_SPACEDIM==2
136 0 : dst(i, j, k, a_dstcomp + 2) = src(i, j, k).F0(0, 0);
137 0 : dst(i, j, k, a_dstcomp + 3) = src(i, j, k).F0(0, 1);
138 0 : dst(i, j, k, a_dstcomp + 4) = src(i, j, k).F0(1, 0);
139 0 : dst(i, j, k, a_dstcomp + 5) = src(i, j, k).F0(1, 1);
140 : #elif AMREX_SPACEDIM==3
141 0 : dst(i, j, k, a_dstcomp + 2) = src(i, j, k).F0(0, 0);
142 0 : dst(i, j, k, a_dstcomp + 3) = src(i, j, k).F0(0, 1);
143 0 : dst(i, j, k, a_dstcomp + 4) = src(i, j, k).F0(1, 0);
144 0 : dst(i, j, k, a_dstcomp + 5) = src(i, j, k).F0(1, 1);
145 : //Util::Abort(INFO, "Not implemented");
146 : #endif
147 :
148 : //dst(i, j, k, a_dstcomp + 0) = src(i, j, k).ddw(0, 0, 0, 0);
149 0 : });
150 : }
151 : }
152 0 : }
153 :
154 :
155 : #endif
|