Alamo
Cubic.H
Go to the documentation of this file.
1//
2// This class extends :ref:`Model::Solid::Linear::Cubic`
3// by adding an eigenstrain :math:`\mathbf{F}_0`.
4//
5
6#ifndef MODEL_SOLID_AFFINE_CUBIC_H_
7#define MODEL_SOLID_AFFINE_CUBIC_H_
8
9#include "Model/Solid/Solid.H"
11#include "IO/ParmParse.H"
12
13namespace Model
14{
15namespace Solid
16{
17namespace Affine
18{
19class Cubic : public Linear::Cubic
20{
21public:
22 static constexpr const char *name = "cubic";
23
24 Cubic() {};
25 Cubic(Linear::Cubic base) : Linear::Cubic(base) {};
26 virtual ~Cubic() {};
27
28 void
29 Define(Set::Scalar C11, Set::Scalar C12, Set::Scalar C44, Set::Scalar phi1, Set::Scalar Phi, Set::Scalar phi2,Set::Matrix a_F0=Set::Matrix::Zero())
30 {
31 Linear::Cubic::Define(C11,C12,C44,phi1,Phi,phi2);
32 F0 = a_F0;
33 }
34 void
35 Define(Set::Scalar C11, Set::Scalar C12, Set::Scalar C44, Eigen::Matrix3d R, Set::Matrix a_F0=Set::Matrix::Zero())
36 {
37 Linear::Cubic::Define(C11,C12,C44,R);
38 F0 = a_F0;
39 }
40 Set::Scalar W(const Set::Matrix & gradu) const override
41 {
42 return Linear::Cubic::W(gradu - F0);
43 }
44 Set::Matrix DW(const Set::Matrix & gradu) const override
45 {
46 return Linear::Cubic::DW(gradu - F0);
47 }
52 virtual void Print(std::ostream &out) const override
53 {
54 out << ddw;
55 }
56 AMREX_FORCE_INLINE
57 void SetF0 (Set::Matrix &a_F0) {F0 = a_F0;}
58
59public:
60 Set::Matrix F0 = Set::Matrix::Zero();
62
63 static Cubic Zero()
64 {
66 ret.F0 = Set::Matrix::Zero();
67 return ret;
68 }
69 static Cubic Random()
70 {
72 }
74 {
75 Cubic ret = Linear::Cubic::Random(C11,C12,C44);
76 ret.F0 = Set::Matrix::Random();
77 return ret;
78 }
79 // This class extends :ref:`Model::Solid::Linear::Cubic` by adding
80 // an eigenstrain. (See the Linear::Cubic class for more inputs for this model)
81 static void Parse(Cubic & value, IO::ParmParse & pp)
82 {
83 pp.queryclass<Linear::Cubic>(value);
84 if (pp.contains("F0"))
85 pp_queryarr("F0",value.F0); // Eigenstrain
86 }
87
88 AMREX_FORCE_INLINE
89 static Cubic Combine(const std::vector<Cubic> &models, const std::vector<Set::Scalar> &eta, int order)
90 {
91 Cubic ret;
93 ret.F0 = Set::Matrix::Zero();
94 if (order == 1)
95 {
96 Set::Scalar etasum = 0.;
97 for (unsigned int n = 0 ; n < models.size(); n++) etasum += eta[n];
98 for (unsigned int n = 0 ; n < models.size(); n++)
99 {
100 ret.ddw += models[n].ddw * (eta[n] / etasum);
101 ret.F0 += models[n].F0 * (eta[n] / etasum);
102 }
103 return ret;
104 }
105 else if (order == 2)
106 {
107 Set::Scalar etasum = 0.;
108 for (unsigned int n = 0 ; n < models.size(); n++) etasum += eta[n]*eta[n];
109 for (unsigned int n = 0 ; n < models.size(); n++)
110 {
111 ret.ddw += models[n].ddw * (eta[n]*eta[n] / etasum);
112 ret.F0 += models[n].F0 * (eta[n]*eta[n] / etasum);
113 }
114 return ret;
115 }
116
117 Util::Exception(INFO,"invalid value used for order, ",order);
118 return ret; // should never happen
119 }
120
121 #define OP_CLASS Cubic
122 #define OP_VARS X(ddw) X(F0)
124};
126
127}
128}
129}
130
131template<>
134{
135 return 1;
136}
137
138template<>
141{
142 if (i==0) return name + ".Cxxxx";
143 return name;
144}
145
146template<>
149{
150 for (amrex::MFIter mfi(a_dst, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
151 {
152 const amrex::Box& bx = mfi.growntilebox(amrex::IntVect(a_nghost));
153 if (bx.ok())
154 {
155 amrex::Array4<const Model::Solid::Affine::Cubic> const & src = ((*this)[a_lev])->array(mfi);
156 amrex::Array4<Set::Scalar> const & dst = a_dst.array(mfi);
157 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
158 {
159 dst(i,j,k,a_dstcomp + 0) = src(i,j,k).ddw(0,0,0,0);
160 });
161}
162 }
163}
164
165#endif
166
#define pp_queryarr(...)
Definition ParmParse.H:103
#define ALAMO_SINGLE_DEFINITION
Definition Util.H:25
#define INFO
Definition Util.H:20
bool contains(std::string name)
Definition ParmParse.H:154
void queryclass(std::string name, T *value, std::string file="", std::string func="", int line=-1)
Definition ParmParse.H:604
virtual void Print(std::ostream &out) const override
Definition Cubic.H:52
AMREX_FORCE_INLINE void SetF0(Set::Matrix &a_F0)
Definition Cubic.H:57
void Define(Set::Scalar C11, Set::Scalar C12, Set::Scalar C44, Eigen::Matrix3d R, Set::Matrix a_F0=Set::Matrix::Zero())
Definition Cubic.H:35
Set::Matrix DW(const Set::Matrix &gradu) const override
Definition Cubic.H:44
static AMREX_FORCE_INLINE Cubic Combine(const std::vector< Cubic > &models, const std::vector< Set::Scalar > &eta, int order)
Definition Cubic.H:89
static Cubic Zero()
Definition Cubic.H:63
void Define(Set::Scalar C11, Set::Scalar C12, Set::Scalar C44, Set::Scalar phi1, Set::Scalar Phi, Set::Scalar phi2, Set::Matrix a_F0=Set::Matrix::Zero())
Definition Cubic.H:29
Cubic(Linear::Cubic base)
Definition Cubic.H:25
Set::Scalar W(const Set::Matrix &gradu) const override
Definition Cubic.H:40
static void Parse(Cubic &value, IO::ParmParse &pp)
Definition Cubic.H:81
static Cubic Random()
Definition Cubic.H:69
static Cubic Random(Set::Scalar C11, Set::Scalar C12, Set::Scalar C44)
Definition Cubic.H:73
static const KinematicVariable kinvar
Definition Cubic.H:61
static constexpr const char * name
Definition Cubic.H:22
Set::Matrix4< AMREX_SPACEDIM, Set::Sym::MajorMinor > DDW(const Set::Matrix &gradu) const override
Definition Cubic.H:48
Set::Matrix4< AMREX_SPACEDIM, Set::Sym::MajorMinor > DDW(const Set::Matrix &) const override
Definition Cubic.H:44
Set::Matrix DW(const Set::Matrix &gradu) const override
Definition Cubic.H:40
Set::Matrix4< AMREX_SPACEDIM, Set::Sym::MajorMinor > ddw
Definition Cubic.H:54
static Cubic Zero()
Definition Cubic.H:71
Set::Scalar W(const Set::Matrix &gradu) const override
Definition Cubic.H:36
static Cubic Random()
Definition Cubic.H:78
void Define(Set::Scalar C11, Set::Scalar C12, Set::Scalar C44, Set::Scalar phi1, Set::Scalar Phi, Set::Scalar phi2)
Definition Cubic.H:27
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
KinematicVariable
Definition Solid.H:26
amrex::Real Scalar
Definition Base.H:19
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
Definition Base.H:20
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, AMREX_SPACEDIM > Matrix
Definition Base.H:23
Set::Scalar Random()
Definition Set.cpp:9
void Exception(std::string file, std::string func, int line, Args const &... args)
Definition Util.H:205