Line data Source code
1 : #ifndef MODEL_SOLID_LINEAR_LAPLACIAN_H_
2 : #define MODEL_SOLID_LINEAR_LAPLACIAN_H_
3 :
4 : #include <AMReX.H>
5 : #include <AMReX_REAL.H>
6 : #include <eigen3/Eigen/Core>
7 :
8 : #include "IO/ParmParse.H"
9 : #include "Util/Util.H"
10 : #include "Set/Set.H"
11 :
12 : namespace Model
13 : {
14 : namespace Solid
15 : {
16 : namespace Linear
17 : {
18 : ///
19 : /// Isotropic implements the following elastic model
20 : /// \f[ \mathbb{C}_{ijkl} = \alpha\delta_{ik}\delta_{jl} \f]
21 : /// corresponding to the elastic model
22 : /// \f[ \sigma_{ij} = \alpha\delta_{ik}\delta_{jl}u_{k,l} = \alpha u_{i,j} \f]
23 : /// \f[ f_{i} = \mathbb{C}_{ijkl}u_{k,jl} = \alpha\delta_{ik}\delta_{jl}u_{k,jl} = \alpha u_{i,jj} \f]
24 : ///
25 : class Laplacian : public Model::Solid::Solid<Set::Sym::Diagonal>
26 : {
27 : public:
28 18054 : Laplacian() { Define(); } ;
29 8516 : Laplacian(Set::Scalar alpha) { Define(alpha); } ;
30 : Laplacian(Solid<Set::Sym::Diagonal> base) : Solid<Set::Sym::Diagonal>(base) {};
31 35074 : ~Laplacian() {} ;
32 26574 : void Define(Set::Scalar alpha = 1.0)
33 : {
34 53148 : ddw = alpha*Set::Matrix4<AMREX_SPACEDIM,Set::Sym::Diagonal>(Set::Matrix::Ones());
35 26574 : }
36 260 : Set::Scalar W(const Set::Matrix & gradu) const override
37 : {
38 520 : return ( 0.5 * gradu.transpose() * (ddw*gradu) ).trace();
39 : }
40 18886 : Set::Matrix DW(const Set::Matrix & gradu) const override
41 : {
42 37772 : return ddw*gradu;
43 : }
44 8483 : Set::Matrix4<AMREX_SPACEDIM,Set::Sym::Diagonal> DDW(const Set::Matrix & /*gradu*/) const override
45 : {
46 8483 : return ddw;
47 : }
48 : public:
49 8472 : static Laplacian Zero()
50 : {
51 8472 : return Laplacian(0.0);
52 : }
53 4 : static void Parse(Laplacian value,IO::ParmParse pp)
54 : {
55 4 : Set::Scalar alpha = NAN;
56 : // Coefficient for the Laplacian
57 20 : pp_query_default("alpha",alpha,1.0);
58 4 : value.Define(alpha);
59 4 : }
60 :
61 : Set::Matrix4<AMREX_SPACEDIM,Set::Sym::Diagonal> ddw;
62 : static const KinematicVariable kinvar = KinematicVariable::gradu;
63 44 : static Laplacian Random()
64 : {
65 44 : Set::Scalar alpha = (Util::Random() + 0.1)/1.1;
66 44 : return Laplacian(alpha);
67 : }
68 :
69 : #define OP_CLASS Laplacian
70 : #define OP_VARS X(ddw)
71 : #include "Model/Solid/InClassOperators.H"
72 : };
73 : #include "Model/Solid/ExtClassOperators.H"
74 :
75 : }
76 : }
77 : }
78 : #endif
|