SpECTRE Documentation Coverage Report
Current view: top level - PointwiseFunctions/Elasticity/ConstitutiveRelations - IsotropicHomogeneous.hpp Coverage Total Hit
Commit: 0d1d717af84a81fb1284a20c4013708fe85cc2f0 Lines: 23.5 % 34 8
Test Date: 2026-10-22 17:29:42
Legend: Lines:     hit not hit

            Line data    Source code
       1            0 : // Distributed under the MIT License.
       2              : // See LICENSE.txt for details.
       3              : 
       4              : #pragma once
       5              : 
       6              : #include <cstddef>
       7              : #include <limits>
       8              : #include <memory>
       9              : #include <pup.h>
      10              : 
      11              : #include "DataStructures/Tensor/TypeAliases.hpp"
      12              : #include "Options/String.hpp"
      13              : #include "PointwiseFunctions/Elasticity/ConstitutiveRelations/ConstitutiveRelation.hpp"
      14              : #include "Utilities/Gsl.hpp"
      15              : #include "Utilities/Serialization/CharmPupable.hpp"
      16              : #include "Utilities/TMPL.hpp"
      17              : 
      18              : /// \cond
      19              : class DataVector;
      20              : /// \endcond
      21              : 
      22              : namespace Elasticity {
      23              : namespace ConstitutiveRelations {
      24              : 
      25              : /*!
      26              :  * \brief An isotropic and homogeneous material
      27              :  *
      28              :  * \details For an isotropic and homogeneous material the linear constitutive
      29              :  * relation \f$T^{ij}=-Y^{ijkl}S_{kl}\f$ reduces to
      30              :  *
      31              :  * \f[
      32              :  * Y^{ijkl} = \lambda \delta^{ij}\delta^{kl} + \mu
      33              :  * \left(\delta^{ik}\delta^{jl} + \delta^{il}\delta^{jk}\right) \\
      34              :  * \implies \quad T^{ij} = -\lambda \mathrm{Tr}(S) \delta^{ij} - 2\mu S^{ij}
      35              :  * \f]
      36              :  *
      37              :  * with the _Lamé parameter_ \f$\lambda\f$ and the _shear modulus_ (or
      38              :  * _rigidity_) \f$\mu\f$. In the parametrization chosen in this implementation
      39              :  * we use the _bulk modulus_ (or _incompressibility_)
      40              :  *
      41              :  * \f[
      42              :  * K=\lambda + \frac{2}{3}\mu
      43              :  * \f]
      44              :  *
      45              :  * instead of the Lamé parameter. In this parametrization the
      46              :  * stress-strain relation
      47              :  *
      48              :  * \f[
      49              :  * T^{ij} = -K \mathrm{Tr}(S) \delta^{ij} - 2\mu\left(S^{ij} -
      50              :  * \frac{1}{3}\mathrm{Tr}(S)\delta^{ij}\right)
      51              :  * \f]
      52              :  *
      53              :  * decomposes into a scalar and a traceless part (Eq. 11.18 in
      54              :  * \cite ThorneBlandford2017). Parameters also often used in this context are
      55              :  * the _Young's modulus_
      56              :  *
      57              :  * \f[
      58              :  * E=\frac{9K\mu}{3K+\mu}=\frac{\mu(3\lambda+2\mu)}{\lambda+\mu}
      59              :  * \f]
      60              :  *
      61              :  * and the _Poisson ratio_
      62              :  *
      63              :  * \f[
      64              :  * \nu=\frac{3K-2\mu}{2(3K+\mu)}=\frac{\lambda}{2(\lambda+\mu)}\text{.}
      65              :  * \f]
      66              :  *
      67              :  * Inversely, these relations read:
      68              :  *
      69              :  * \f[
      70              :  * K =\frac{E}{3(1-2\nu)}, \quad
      71              :  * \lambda =\frac{E\nu}{(1+\nu)(1-2\nu)}, \quad
      72              :  * \mu =\frac{E}{2(1+\nu)}
      73              :  * \f]
      74              :  *
      75              :  * **In two dimensions** this implementation reduces to the plane-stress
      76              :  * approximation. We assume that all stresses apply in the plane of the
      77              :  * computational domain, which corresponds to scenarios of in-plane stretching
      78              :  * and shearing of thin slabs of material. Since orthogonal stresses vanish as
      79              :  * \f$T^{i3}=0=T^{3i}\f$ we find \f$\mathrm{Tr}(S)=\frac{2\mu}{\lambda +
      80              :  * 2\mu}\mathrm{Tr}^{(2)}(S)\f$, where \f$\mathrm{Tr}^{(2)}\f$ denotes that the
      81              :  * trace only applies to the two dimensions within the plane. The constitutive
      82              :  * relation thus reduces to
      83              :  *
      84              :  * \f{align}
      85              :  * T^{ij}=&-\frac{2\lambda\mu}{\lambda + 2\mu}\mathrm{Tr}^{(2)}(S)\delta^{ij} -
      86              :  * 2\mu S^{ij} \\
      87              :  * =&-\frac{E\nu}{1-\nu^2}\mathrm{Tr}^{(2)}(S)\delta^{ij} -
      88              :  * \frac{E}{1+\nu}S^{ij}
      89              :  * \f}
      90              :  *
      91              :  * which is non-zero only in the directions of the plane. Since the stresses
      92              :  * are also assumed to be constant along the thickness of the plane
      93              :  * \f$\partial_3T^{ij}=0\f$ the elasticity problem \f$-\partial_i T^{ij}=F^j\f$
      94              :  * reduces to two dimensions.
      95              :  */
      96              : template <size_t Dim>
      97            1 : class IsotropicHomogeneous : public ConstitutiveRelation<Dim> {
      98              :  public:
      99            0 :   static constexpr size_t volume_dim = Dim;
     100              : 
     101            0 :   struct BulkModulus {
     102            0 :     using type = double;
     103            0 :     static constexpr Options::String help = {
     104              :         "The incompressibility of the material"};
     105            0 :     static type lower_bound() { return 0.0; }
     106              :   };
     107              : 
     108            0 :   struct ShearModulus {
     109            0 :     using type = double;
     110            0 :     static constexpr Options::String help = {"The rigidity of the material"};
     111            0 :     static type lower_bound() { return 0.0; }
     112              :   };
     113              : 
     114            0 :   using options = tmpl::list<BulkModulus, ShearModulus>;
     115              : 
     116            0 :   static constexpr Options::String help = {
     117              :       "A constitutive relation that describes an isotropic, homogeneous "
     118              :       "material in terms of two elastic moduli. These bulk and shear moduli "
     119              :       "indicate the material's resistance to volume and shape changes, "
     120              :       "respectively. Both are measured in units of stress, typically Pascals."};
     121              : 
     122            0 :   IsotropicHomogeneous() = default;
     123            0 :   IsotropicHomogeneous(const IsotropicHomogeneous&) = default;
     124            0 :   IsotropicHomogeneous& operator=(const IsotropicHomogeneous&) = default;
     125            0 :   IsotropicHomogeneous(IsotropicHomogeneous&&) = default;
     126            0 :   IsotropicHomogeneous& operator=(IsotropicHomogeneous&&) = default;
     127            0 :   ~IsotropicHomogeneous() override = default;
     128              : 
     129            0 :   IsotropicHomogeneous(double bulk_modulus, double shear_modulus);
     130              : 
     131            1 :   std::unique_ptr<ConstitutiveRelation<Dim>> get_clone() const override;
     132              : 
     133              :   /// The constitutive relation that characterizes the elastic properties of a
     134              :   /// material
     135            1 :   void stress(gsl::not_null<tnsr::II<DataVector, Dim>*> stress,
     136              :               const tnsr::ii<DataVector, Dim>& strain,
     137              :               const tnsr::I<DataVector, Dim>& x) const override;
     138              : 
     139              :   /// The bulk modulus (or incompressibility) \f$K\f$
     140            1 :   double bulk_modulus() const;
     141              :   /// The shear modulus (or rigidity) \f$\mu\f$
     142            1 :   double shear_modulus() const;
     143              :   /// The Lamé parameter \f$\lambda\f$
     144            1 :   double lame_parameter() const;
     145              :   /// The Young's modulus \f$E\f$
     146            1 :   double youngs_modulus() const;
     147              :   /// The Poisson ratio \f$\nu\f$
     148            1 :   double poisson_ratio() const;
     149              : 
     150              :   // clang-tidy: no runtime references
     151            0 :   void pup(PUP::er& /*p*/) override;  //  NOLINT
     152              : 
     153            0 :   explicit IsotropicHomogeneous(CkMigrateMessage* /*unused*/) {}
     154              : 
     155            0 :   WRAPPED_PUPable_decl_base_template(  // NOLINT
     156              :       SINGLE_ARG(ConstitutiveRelation<Dim>), IsotropicHomogeneous);
     157              : 
     158              :  private:
     159            0 :   double bulk_modulus_ = std::numeric_limits<double>::signaling_NaN();
     160            0 :   double shear_modulus_ = std::numeric_limits<double>::signaling_NaN();
     161              : };
     162              : 
     163              : template <size_t Dim>
     164            0 : bool operator==(const IsotropicHomogeneous<Dim>& lhs,
     165              :                 const IsotropicHomogeneous<Dim>& rhs);
     166              : template <size_t Dim>
     167            0 : bool operator!=(const IsotropicHomogeneous<Dim>& lhs,
     168              :                 const IsotropicHomogeneous<Dim>& rhs);
     169              : 
     170              : /// \cond
     171              : template <size_t Dim>
     172              : PUP::able::PUP_ID IsotropicHomogeneous<Dim>::my_PUP_ID = 0;
     173              : /// \endcond
     174              : 
     175              : }  // namespace ConstitutiveRelations
     176              : }  // namespace Elasticity
        

Generated by: LCOV version 2.0-1