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/Serialization/CharmPupable.hpp" 15 : #include "Utilities/TMPL.hpp" 16 : 17 : /// \cond 18 : class DataVector; 19 : /// \endcond 20 : 21 : namespace Elasticity::ConstitutiveRelations { 22 : 23 : /*! 24 : * \brief A cubic crystalline material 25 : * 26 : * \details For a cubic crystalline material the Elasticity tensor in the linear 27 : * constitutive relation \f$T^{ij}=-Y^{ijkl}S_{kl}\f$ reduces to 28 : * 29 : * \f[ 30 : * Y^{ijkl} = 31 : * \begin{cases} 32 : * c_{11} & \mathrm{for}\; i=j=k=l \\ 33 : * c_{12} & \mathrm{for}\; i=j,k=l,i \neq k \\ 34 : * c_{44} & \mathrm{for}\; i=k,j=l,i \neq j \;\mathrm{or}\; i=l,j=k,i\neq j \\ 35 : * \end{cases} 36 : * \f] 37 : * 38 : * with the three independent parameters: the \f$\mathrm{Lam\acute{e}}\f$ 39 : * parameter \f$\lambda\f$, the Shear modulus \f$\mu\f$ and the %Poisson 40 : * ratio \f$\nu\f$. In the parametrization chosen in this implementation we use 41 : * the experimental group parameters \f$c_{11}\f$, \f$c_{12}\f$ and 42 : * \f$c_{44}\f$, related by; 43 : * 44 : * \f[ 45 : * c_{11} = \frac{1 - \nu}{\nu} \lambda = \frac{(1 - \nu)E}{(1 + \nu)(1 - 46 : * 2\nu)}, \quad 47 : * c_{12} = \lambda = \frac{E\nu}{(1 + \nu)(1 - 2\nu)}, \quad 48 : * c_{44} = \mu 49 : * \f] 50 : * 51 : * and inversely; 52 : * 53 : * \f[ 54 : * E = \frac{(c_{11} + 2c_{12})(c_{11} - c_{12})}{c_{11} + c_{12}}, \quad 55 : * \nu = \left(1 + \frac{c_{11}}{c_{12}}\right)^{-1}, \quad 56 : * \mu = c_{44} 57 : * \f] 58 : * 59 : * The stress-strain relation then reduces to 60 : * 61 : * \f[ 62 : * T^{ij} = 63 : * \begin{cases} 64 : * -(c_{11} - c_{12}) S^{ij} - c_{12} \mathrm{Tr}(S) & \mathrm{for}\; i=j \\ 65 : * -2 c_{44} S^{ij} & \mathrm{for}\; i \neq j \\ 66 : * \end{cases} 67 : * \f] 68 : * 69 : * In the case where the shear modulus satisfies \f$c_{44} = 70 : * \frac{c_{11}-c_{12}}{2}\f$ the constitutive relation is that of an isotropic 71 : * material (see `Elasticity::ConstitutiveRelations::IsotropicHomogeneous`). 72 : */ 73 : 74 1 : class CubicCrystal : public ConstitutiveRelation<3> { 75 : public: 76 0 : static constexpr size_t volume_dim = 3; 77 : 78 0 : struct C_11 { 79 0 : using type = double; 80 0 : static constexpr Options::String help = { 81 : "c_11 parameter for a cubic crystal"}; 82 0 : static type lower_bound() { return 0.0; } 83 : }; 84 : 85 0 : struct C_12 { 86 0 : using type = double; 87 0 : static constexpr Options::String help = { 88 : "c_12 parameter for a cubic crystal"}; 89 0 : static type lower_bound() { return 0.0; } 90 : }; 91 : 92 0 : struct C_44 { 93 0 : using type = double; 94 0 : static constexpr Options::String help = { 95 : "c_44 parameter for a cubic crystal"}; 96 0 : static type lower_bound() { return 0.0; } 97 : }; 98 : 99 0 : using options = tmpl::list<C_11, C_12, C_44>; 100 : 101 0 : static constexpr Options::String help = { 102 : "A constitutive relation that describes a cubic, crystalline material in " 103 : "terms of the three independent group paremeters. The parameters " 104 : "are measured in units of stress, typically Pascals."}; 105 : 106 0 : CubicCrystal() = default; 107 0 : CubicCrystal(const CubicCrystal&) = default; 108 0 : CubicCrystal& operator=(const CubicCrystal&) = default; 109 0 : CubicCrystal(CubicCrystal&&) = default; 110 0 : CubicCrystal& operator=(CubicCrystal&&) = default; 111 0 : ~CubicCrystal() override = default; 112 : 113 0 : CubicCrystal(double c_11, double c_12, double c_44); 114 : 115 1 : std::unique_ptr<ConstitutiveRelation<3>> get_clone() const override; 116 : 117 : /// The constitutive relation that characterizes the elastic properties of a 118 : /// material 119 1 : void stress(gsl::not_null<tnsr::II<DataVector, 3>*> stress, 120 : const tnsr::ii<DataVector, 3>& strain, 121 : const tnsr::I<DataVector, 3>& x) const override; 122 : 123 : /// The 1st group parameter \f$c_{11} = \frac{1 - \nu}{\nu} \lambda\f$ 124 1 : double c_11() const; 125 : /// The 2nd group parameter; the \f$\mathrm{Lam\acute{e}}\f$ parameter 126 : /// \f$c_{12} = \lambda\f$ 127 1 : double c_12() const; 128 : /// The 3rd group parameter; the shear modulus (rigidity) \f$c_{44} = \mu\f$ 129 1 : double c_44() const; 130 : /// The Young's modulus \f$E\f$ 131 1 : double youngs_modulus() const; 132 : /// The %Poisson ratio \f$\nu\f$ 133 1 : double poisson_ratio() const; 134 : 135 : // clang-tidy: no runtime references 136 0 : void pup(PUP::er& /*p*/) override; // NOLINT 137 : 138 0 : explicit CubicCrystal(CkMigrateMessage* /*unused*/) {} 139 : 140 0 : WRAPPED_PUPable_decl_base_template( // NOLINT 141 : SINGLE_ARG(ConstitutiveRelation<3>), CubicCrystal); 142 : 143 : private: 144 0 : double c_11_ = std::numeric_limits<double>::signaling_NaN(); 145 0 : double c_12_ = std::numeric_limits<double>::signaling_NaN(); 146 0 : double c_44_ = std::numeric_limits<double>::signaling_NaN(); 147 : }; // namespace ConstitutiveRelations 148 : 149 0 : bool operator==(const CubicCrystal& lhs, const CubicCrystal& rhs); 150 0 : bool operator!=(const CubicCrystal& lhs, const CubicCrystal& rhs); 151 : 152 : } // namespace Elasticity::ConstitutiveRelations