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 : 8 : #include "DataStructures/DataBox/Prefixes.hpp" 9 : #include "DataStructures/DataBox/Tag.hpp" 10 : #include "DataStructures/DataVector.hpp" 11 : #include "DataStructures/Tensor/Tensor.hpp" 12 : #include "Evolution/Systems/GeneralizedHarmonic/Tags.hpp" 13 : #include "NumericalAlgorithms/LinearOperators/PartialDerivatives.hpp" 14 : #include "PointwiseFunctions/GeneralRelativity/Tags.hpp" 15 : #include "Utilities/ContainerHelpers.hpp" 16 : #include "Utilities/Gsl.hpp" 17 : #include "Utilities/TMPL.hpp" 18 : 19 : // IWYU pragma: no_forward_declare Tags::deriv 20 : 21 : /// \cond 22 : namespace domain { 23 : namespace Tags { 24 : template <size_t Dim, typename Frame> 25 : struct Coordinates; 26 : } // namespace Tags 27 : } // namespace domain 28 : class DataVector; 29 : template <typename X, typename Symm, typename IndexList> 30 : class Tensor; 31 : /// \endcond 32 : 33 : namespace gh { 34 : /// @{ 35 : /*! 36 : * \ingroup GeneralRelativityGroup 37 : * \brief Computes spatial derivatives of the spatial metric from 38 : * the generalized harmonic spatial derivative variable. 39 : * 40 : * \details If \f$ \Phi_{kab} \f$ is the generalized 41 : * harmonic spatial derivative variable, then the derivatives of the 42 : * spatial metric are 43 : * \f[ 44 : * \partial_k \gamma_{ij} = \Phi_{kij} 45 : * \f] 46 : * 47 : * This quantity is needed for computing spatial Christoffel symbols. 48 : */ 49 : template <typename DataType, size_t SpatialDim, typename Frame> 50 1 : void deriv_spatial_metric( 51 : gsl::not_null<tnsr::ijj<DataType, SpatialDim, Frame>*> d_spatial_metric, 52 : const tnsr::iaa<DataType, SpatialDim, Frame>& phi); 53 : 54 : template <typename DataType, size_t SpatialDim, typename Frame> 55 1 : tnsr::ijj<DataType, SpatialDim, Frame> deriv_spatial_metric( 56 : const tnsr::iaa<DataType, SpatialDim, Frame>& phi); 57 : /// @} 58 : 59 : namespace Tags { 60 : /*! 61 : * \brief Compute item to get spatial derivatives of the spatial metric from 62 : * the generalized harmonic spatial derivative variable. 63 : * 64 : * \details See `deriv_spatial_metric()`. Can be retrieved using 65 : * `gr::Tags::SpatialMetric` wrapped in `::Tags::deriv`. 66 : */ 67 : template <size_t SpatialDim, typename Frame> 68 1 : struct DerivSpatialMetricCompute 69 : : ::Tags::deriv<gr::Tags::SpatialMetric<DataVector, SpatialDim, Frame>, 70 : tmpl::size_t<SpatialDim>, Frame>, 71 : db::ComputeTag { 72 0 : using argument_tags = tmpl::list<Phi<DataVector, SpatialDim, Frame>>; 73 : 74 0 : using return_type = tnsr::ijj<DataVector, SpatialDim, Frame>; 75 : 76 0 : static constexpr auto function = static_cast<void (*)( 77 : gsl::not_null<tnsr::ijj<DataVector, SpatialDim, Frame>*>, 78 : const tnsr::iaa<DataVector, SpatialDim, Frame>&)>( 79 : &deriv_spatial_metric<DataVector, SpatialDim, Frame>); 80 : 81 0 : using base = 82 : ::Tags::deriv<gr::Tags::SpatialMetric<DataVector, SpatialDim, Frame>, 83 : tmpl::size_t<SpatialDim>, Frame>; 84 : }; 85 : } // namespace Tags 86 : } // namespace gh