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 <memory> 8 : #include <vector> 9 : 10 : #include "DataStructures/Tensor/Tensor.hpp" 11 : #include "Domain/Structure/Element.hpp" 12 : #include "Domain/Tags.hpp" 13 : #include "Elliptic/Systems/Elasticity/Tags.hpp" 14 : #include "Utilities/Gsl.hpp" 15 : #include "Utilities/MakeWithValue.hpp" 16 : #include "Utilities/TMPL.hpp" 17 : 18 : /// \cond 19 : class DataVector; 20 : namespace PUP { 21 : class er; 22 : } // namespace PUP 23 : namespace Elasticity { 24 : namespace ConstitutiveRelations { 25 : template <size_t Dim> 26 : class ConstitutiveRelation; 27 : } // namespace ConstitutiveRelations 28 : namespace Tags { 29 : template <size_t Dim> 30 : struct ConstitutiveRelationPerBlock; 31 : } // namespace Tags 32 : } // namespace Elasticity 33 : /// \endcond 34 : 35 : namespace Elasticity { 36 : 37 : /*! 38 : * \brief Compute the fluxes \f$F^{ij}=Y^{ijkl}(x) S_{kl}(x)=-T^{ij}\f$ for 39 : * the Elasticity equation. 40 : */ 41 : template <size_t Dim> 42 1 : void primal_fluxes(gsl::not_null<tnsr::II<DataVector, Dim>*> minus_stress, 43 : const tnsr::iJ<DataVector, Dim>& deriv_displacement, 44 : const ConstitutiveRelations::ConstitutiveRelation<Dim>& 45 : constitutive_relation, 46 : const tnsr::I<DataVector, Dim>& coordinates); 47 : 48 : /*! 49 : * \brief Add the contribution \f$-\Gamma^i_{ik}T^{kj} - \Gamma^j_{ik}T^{ik}\f$ 50 : * to the displacement source for the curved-space elasticity equations on a 51 : * metric \f$\gamma_{ij}\f$. 52 : * 53 : * These sources arise from the non-principal part of the divergence on a 54 : * curved background. 55 : */ 56 : template <size_t Dim> 57 1 : void add_curved_sources( 58 : gsl::not_null<tnsr::I<DataVector, Dim>*> source_for_displacement, 59 : const tnsr::Ijj<DataVector, Dim>& christoffel_second_kind, 60 : const tnsr::i<DataVector, Dim>& christoffel_contracted, 61 : const tnsr::II<DataVector, Dim>& stress); 62 : 63 : /*! 64 : * \brief Compute the fluxes \f$F^i_A\f$ for the Elasticity equation on a flat 65 : * metric in Cartesian coordinates. 66 : * 67 : * \see Elasticity::FirstOrderSystem 68 : */ 69 : template <size_t Dim> 70 1 : struct Fluxes { 71 0 : using argument_tags = 72 : tmpl::list<Tags::ConstitutiveRelationPerBlock<Dim>, 73 : domain::Tags::Coordinates<Dim, Frame::Inertial>>; 74 0 : using volume_tags = tmpl::list<Tags::ConstitutiveRelationPerBlock<Dim>>; 75 0 : using const_global_cache_tags = volume_tags; 76 0 : static constexpr bool is_trivial = false; 77 0 : static constexpr bool is_discontinuous = true; 78 0 : static void apply( 79 : gsl::not_null<tnsr::II<DataVector, Dim>*> minus_stress, 80 : const std::vector< 81 : std::unique_ptr<ConstitutiveRelations::ConstitutiveRelation<Dim>>>& 82 : constitutive_relation_per_block, 83 : const tnsr::I<DataVector, Dim>& coordinates, 84 : const ElementId<Dim>& element_id, 85 : const tnsr::I<DataVector, Dim>& displacement, 86 : const tnsr::iJ<DataVector, Dim>& deriv_displacement); 87 0 : static void apply( 88 : gsl::not_null<tnsr::II<DataVector, Dim>*> minus_stress, 89 : const std::vector< 90 : std::unique_ptr<ConstitutiveRelations::ConstitutiveRelation<Dim>>>& 91 : constitutive_relation_per_block, 92 : const tnsr::I<DataVector, Dim>& coordinates, 93 : const ElementId<Dim>& element_id, 94 : const tnsr::i<DataVector, Dim>& face_normal, 95 : const tnsr::I<DataVector, Dim>& face_normal_vector, 96 : const tnsr::I<DataVector, Dim>& displacement); 97 : }; 98 : 99 : } // namespace Elasticity