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 4 : 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