FirstOrderSystem.hpp
1 // Distributed under the MIT License.
2 // See LICENSE.txt for details.
3 
4 #pragma once
5 
6 #include <cstddef>
7 
8 #include "DataStructures/DataBox/PrefixHelpers.hpp"
9 #include "DataStructures/Tensor/EagerMath/Magnitude.hpp"
10 #include "DataStructures/VariablesTag.hpp"
11 #include "Elliptic/Systems/Elasticity/Equations.hpp"
12 #include "Elliptic/Systems/Elasticity/Tags.hpp"
15 #include "PointwiseFunctions/Elasticity/ConstitutiveRelations/ConstitutiveRelation.hpp"
16 #include "Utilities/TMPL.hpp"
17 
18 /// \cond
19 namespace LinearSolver {
20 namespace Tags {
21 template <typename>
22 struct Operand;
23 } // namespace Tags
24 } // namespace LinearSolver
25 /// \endcond
26 
27 namespace Elasticity {
28 
29 /*!
30  * \brief The linear elasticity equation formulated as a set of coupled
31  * first-order PDEs.
32  *
33  * This system formulates the elasticity equation \f$\nabla_i T^{ij} =
34  * f_\mathrm{ext}^j\f$ (see `Elasticity`). It introduces the symmetric strain
35  * tensor \f$S_{kl}\f$ as an auxiliary variable which satisfies the
36  * `Elasticity::ConstitutiveRelations` \f$T^{ij} = -Y^{ijkl} S_{kl}\f$ with the
37  * material-specific elasticity tensor \f$Y^{ijkl}\f$. Written as a set of
38  * coupled first-order PDEs, we get
39  *
40  * \f{align*}
41  * -\nabla_i Y^{ijkl} S_{kl} = f_\mathrm{ext}^j \\
42  * -\nabla_{(k} \xi_{l)} + S_{kl} = 0
43  * \f}
44  *
45  * The fluxes and sources in terms of the system variables
46  * \f$\xi^j\f$ and \f$S_{kl}\f$ are given by
47  *
48  * \f{align*}
49  * F^i_{\xi^j} &= Y^{ijkl}_{(\xi, S)} S_{kl} \\
50  * S_{\xi^j} &= 0 \\
51  * f_{\xi^j} &= f_\mathrm{ext}^j \\
52  * F^i_{S_{kl}} &= \delta^{i}_{(k} \xi_{l)} \\
53  * S_{S_{kl}} &= S_{kl} \\
54  * f_{S_{kl}} &= 0 \text{.}
55  * \f}
56  *
57  * See `Poisson::FirstOrderSystem` for details on the first-order
58  * flux-formulation.
59  */
60 template <size_t Dim>
62  private:
66  using strain = Tags::Strain<Dim>;
67 
68  public:
69  static constexpr size_t volume_dim = Dim;
70 
71  // The physical fields to solve for
72  using primal_fields = tmpl::list<displacement>;
73  using auxiliary_fields = tmpl::list<strain>;
74  using fields_tag =
76 
77  // The variables to compute bulk contributions and fluxes for.
78  using variables_tag =
80  using primal_variables =
82  using auxiliary_variables =
84 
85  using fluxes = Fluxes<Dim>;
86  using sources = Sources<Dim>;
87 
88  // The tag of the operator to compute magnitudes on the manifold, e.g. to
89  // normalize vectors on the faces of an element
90  template <typename Tag>
92 };
93 } // namespace Elasticity
Prefix< DataBox_detail::dispatch_add_tag_prefix_impl< Prefix, Tag, Args... >, Args... > add_tag_prefix
Wrap Tag in Prefix<_, Args...>, also wrapping variables tags if Tag is a Tags::Variables.
Definition: PrefixHelpers.hpp:145
Definition: VariablesTag.hpp:21
Functionality for solving linear systems of equations.
Definition: TerminateIfConverged.hpp:22
The Euclidean magnitude of a (co)vector.
Definition: Magnitude.hpp:94
Compute the fluxes for the Elasticity equation on a flat metric in Cartesian coordinates.
Definition: Equations.hpp:61
The material displacement field .
Definition: Tags.hpp:47
Compute the sources for the Elasticity equation.
Definition: Equations.hpp:93
tmpl::transform< TagList, tmpl::bind< Wrapper, tmpl::_1, tmpl::pin< Args >... > > wrap_tags_in
Create a new list of Tags by wrapping each tag in TagList using the Wrapper.
Definition: PrefixHelpers.hpp:30
The linear elasticity equation formulated as a set of coupled first-order PDEs.
Definition: FirstOrderSystem.hpp:61
Prefix indicating spatial derivatives.
Definition: PartialDerivatives.hpp:54
Items related to solving elasticity problems.
Definition: Equations.cpp:19
Defines functions computing partial derivatives.
The symmetric strain , describing the deformation of the elastic material.
Definition: Tags.hpp:56
Definition: DataBoxTag.hpp:27
Wraps the template metaprogramming library used (brigand)
Definition: IndexType.hpp:44
Defines DataBox tags for the linear solver.