Line data Source code
1 : //
2 : // This model implements an affine hexagonal material:
3 : //
4 : // .. math::
5 : //
6 : // W_{aff}(\nabla\mathbf{u}) = W_{lin}(\nabla\mathbf{u} - \mathbf{F}_0)
7 : //
8 : // where :math:`W_{aff}` is the present model, :math:`\mathbf{F}_0` is the eigenstrain,
9 : // and :math:`W_{lin}` is the cubic model defined in :ref:`Model::Solid::Linear::Hexagonal`.
10 : //
11 : #ifndef MODEL_SOLID_AFFINE_HEXAGONAL_H_
12 : #define MODEL_SOLID_AFFINE_HEXAGONAL_H_
13 :
14 : #include "Model/Solid/Solid.H"
15 : #include "Model/Solid/Linear/Hexagonal.H"
16 : #include "IO/ParmParse.H"
17 :
18 : namespace Model
19 : {
20 : namespace Solid
21 : {
22 : namespace Affine
23 : {
24 : class Hexagonal : public Linear::Hexagonal
25 : {
26 : public:
27 :
28 859 : Hexagonal() {};
29 172 : Hexagonal(Linear::Hexagonal base) : Linear::Hexagonal(base) {};
30 1184 : virtual ~Hexagonal() {};
31 :
32 : void
33 : Define(Set::Scalar C11, Set::Scalar C12, Set::Scalar C13, Set::Scalar C33, Set::Scalar C44, Set::Scalar phi1, Set::Scalar Phi, Set::Scalar phi2,Set::Matrix a_F0=Set::Matrix::Zero())
34 : {
35 : Linear::Hexagonal::Define(C11,C12,C13,C33,C44,phi1,Phi,phi2);
36 : F0 = a_F0;
37 : }
38 : void
39 : Define(Set::Scalar C11, Set::Scalar C12, Set::Scalar C13, Set::Scalar C33, Set::Scalar C44, Eigen::Matrix3d R, Set::Matrix a_F0=Set::Matrix::Zero())
40 : {
41 : Linear::Hexagonal::Define(C11,C12,C13,C33,C44,R);
42 : F0 = a_F0;
43 : }
44 260 : Set::Scalar W(const Set::Matrix & gradu) const override
45 : {
46 260 : return Linear::Hexagonal::W(gradu - F0);
47 : }
48 26960 : Set::Matrix DW(const Set::Matrix & gradu) const override
49 : {
50 26960 : return Linear::Hexagonal::DW(gradu - F0);
51 : }
52 12520 : Set::Matrix4<AMREX_SPACEDIM,Set::Sym::MajorMinor> DDW(const Set::Matrix & gradu) const override
53 : {
54 12520 : return Linear::Hexagonal::DDW(gradu - F0);
55 : }
56 0 : virtual void Print(std::ostream &out) const override
57 : {
58 0 : out << ddw;
59 0 : }
60 : AMREX_FORCE_INLINE
61 : void SetF0 (Set::Matrix &a_F0) {F0 = a_F0;}
62 :
63 : public:
64 : Set::Matrix F0 = Set::Matrix::Zero();
65 : static const KinematicVariable kinvar = KinematicVariable::gradu;
66 :
67 128 : static Hexagonal Zero()
68 : {
69 128 : Hexagonal ret = Linear::Hexagonal::Zero();
70 128 : ret.F0 = Set::Matrix::Zero();
71 128 : return ret;
72 : }
73 44 : static Hexagonal Random()
74 : {
75 44 : return Random(Util::Random(), Util::Random(), Util::Random(),Util::Random(),Util::Random());
76 : }
77 44 : static Hexagonal Random(Set::Scalar C11, Set::Scalar C12, Set::Scalar C13, Set::Scalar C33, Set::Scalar C44)
78 : {
79 44 : Hexagonal ret = Linear::Hexagonal::Random(C11,C12,C13,C33,C44);
80 44 : ret.F0 = Set::Matrix::Random();
81 44 : return ret;
82 : }
83 1 : static void Parse(Hexagonal & value, IO::ParmParse & pp)
84 : {
85 1 : Linear::Hexagonal::Parse(value,pp);
86 1 : pp_queryarr("F0",value.F0); // Eigenstrain matrix. Can be defined in 2D or 3D.
87 1 : }
88 :
89 : AMREX_FORCE_INLINE
90 : static Hexagonal Combine(const std::vector<Hexagonal> &models, const std::vector<Set::Scalar> &eta, int order)
91 : {
92 0 : Hexagonal ret;
93 0 : ret.ddw = Set::Matrix4<AMREX_SPACEDIM,Set::Sym::MajorMinor>::Zero();
94 0 : ret.F0 = Set::Matrix::Zero();
95 0 : if (order == 1)
96 : {
97 0 : Set::Scalar etasum = 0.;
98 0 : for (unsigned int n = 0 ; n < models.size(); n++) etasum += eta[n];
99 0 : for (unsigned int n = 0 ; n < models.size(); n++)
100 : {
101 0 : ret.ddw += models[n].ddw * (eta[n] / etasum);
102 0 : ret.F0 += models[n].F0 * (eta[n] / etasum);
103 : }
104 0 : return ret;
105 : }
106 0 : Util::Exception(INFO,"Order value of ", order, " not supported yet");
107 0 : return ret;
108 : }
109 :
110 : #define OP_CLASS Hexagonal
111 : #define OP_VARS X(ddw) X(F0)
112 : #include "Model/Solid/InClassOperators.H"
113 : };
114 : #include "Model/Solid/ExtClassOperators.H"
115 :
116 : }
117 : }
118 : }
119 :
120 : template<>
121 : ALAMO_SINGLE_DEFINITION
122 44 : int Set::Field<Model::Solid::Affine::Hexagonal>::NComp() const
123 : {
124 44 : return 1;
125 : }
126 :
127 : template<>
128 : ALAMO_SINGLE_DEFINITION
129 11 : std::string Set::Field<Model::Solid::Affine::Hexagonal>::Name(int i) const
130 : {
131 11 : if (i==0) return name + ".Cxxxx";
132 0 : return name;
133 : }
134 :
135 : template<>
136 : ALAMO_SINGLE_DEFINITION
137 11 : void Set::Field<Model::Solid::Affine::Hexagonal>::Copy(int a_lev, amrex::MultiFab &a_dst, int a_dstcomp, int a_nghost) const
138 : {
139 22 : for (amrex::MFIter mfi(a_dst, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
140 : {
141 11 : const amrex::Box& bx = mfi.growntilebox(amrex::IntVect(a_nghost));
142 11 : if (bx.ok())
143 : {
144 11 : amrex::Array4<const Model::Solid::Affine::Hexagonal> const & src = ((*this)[a_lev])->array(mfi);
145 11 : amrex::Array4<Set::Scalar> const & dst = a_dst.array(mfi);
146 11 : amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
147 : {
148 4125 : dst(i,j,k,a_dstcomp + 0) = src(i,j,k).ddw(0,0,0,0);
149 1375 : });
150 : }
151 : }
152 11 : }
153 :
154 :
155 : #endif
|