ConstitutiveRelation.hpp
1 // Distributed under the MIT License.
2 // See LICENSE.txt for details.
3 
4 #pragma once
5 
6 #include <cstddef>
7 #include <pup.h>
8 
11 #include "Utilities/TMPL.hpp"
12 
13 /// \cond
14 class DataVector;
15 namespace Elasticity {
16 namespace ConstitutiveRelations {
17 template <size_t Dim>
18 struct IsotropicHomogeneous; // IWYU pragma: keep
19 } // namespace ConstitutiveRelations
20 } // namespace Elasticity
21 /// \endcond
22 
23 namespace Elasticity {
24 /*!
25  * \brief Constitutive (stress-strain) relations that characterize the elastic
26  * properties of a material
27  */
28 namespace ConstitutiveRelations {
29 
30 /*!
31  * \brief Base class for constitutive (stress-strain) relations that
32  * characterize the elastic properties of a material
33  *
34  * \details A constitutive relation, in the context of elasticity, relates the
35  * Stress \f$T^{ij}\f$ and Strain \f$S_{ij}=\nabla_{(i}u_{j)}\f$ within an
36  * elastic material (see \ref Elasticity). For small stresses it is approximated
37  * by the linear relation \f[ T^{ij} = -Y^{ijkl}S_{kl} \f] (Eq. 11.17 in
38  * \cite ThorneBlandford2017) that is referred to as _Hooke's law_. The
39  * constitutive relation in this linear approximation is determined by the
40  * elasticity (or _Young's_) tensor \f$Y^{ijkl}=Y^{(ij)(kl)}=Y^{klij}\f$ that
41  * generalizes a simple proportionality to a three-dimensional and (possibly)
42  * anisotropic material.
43  *
44  * \note We assume a Euclidean metric in Cartesian coordinates here (for now).
45  */
46 template <size_t Dim>
47 class ConstitutiveRelation : public PUP::able {
48  public:
49  using creatable_classes = tmpl::list<IsotropicHomogeneous<Dim>>;
50 
51  ConstitutiveRelation() = default;
53  ConstitutiveRelation& operator=(const ConstitutiveRelation&) = delete;
55  ConstitutiveRelation& operator=(ConstitutiveRelation&&) = default;
56  ~ConstitutiveRelation() override = default;
57 
59 
60  /// The constitutive relation that characterizes the elastic properties of a
61  /// material
62  virtual tnsr::II<DataVector, Dim> stress(
63  const tnsr::ii<DataVector, Dim>& strain,
64  const tnsr::I<DataVector, Dim>& x) const noexcept = 0;
65 
66  /// Symmmetrize the displacement gradient to compute the strain, then pass it
67  /// to the constitutive relation
68  tnsr::II<DataVector, Dim> stress(
69  const tnsr::iJ<DataVector, Dim>& grad_displacement,
70  const tnsr::I<DataVector, Dim>& x) const noexcept;
71 };
72 
73 } // namespace ConstitutiveRelations
74 } // namespace Elasticity
75 
76 #include "PointwiseFunctions/Elasticity/ConstitutiveRelations/IsotropicHomogeneous.hpp" // IWYU pragma: keep
Defines macros to allow serialization of abstract template base classes.
Items related to solving elasticity problems.
Definition: Tags.hpp:34
Base class for constitutive (stress-strain) relations that characterize the elastic properties of a m...
Definition: ConstitutiveRelation.hpp:47
Defines a list of useful type aliases for tensors.
#define WRAPPED_PUPable_abstract(className)
Wraps the Charm++ macro, see the Charm++ documentation.
Definition: CharmPupable.hpp:39
Stores a collection of function values.
Definition: DataVector.hpp:42
Wraps the template metaprogramming library used (brigand)