SpECTRE Documentation Coverage Report
Current view: top level - PointwiseFunctions/AnalyticSolutions/GeneralRelativity - Ccz4WrappedGr.hpp Hit Total Coverage
Commit: 1f2210958b4f38fdc0400907ee7c6d5af5111418 Lines: 1 51 2.0 %
Date: 2025-12-05 05:03:31
Legend: Lines: hit not hit

          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 <string>
       9             : 
      10             : #include "DataStructures/DataBox/Prefixes.hpp"
      11             : #include "DataStructures/Tensor/Tensor.hpp"
      12             : #include "Evolution/Systems/Ccz4/Tags.hpp"
      13             : #include "Options/String.hpp"
      14             : #include "PointwiseFunctions/GeneralRelativity/Tags.hpp"
      15             : #include "PointwiseFunctions/InitialDataUtilities/InitialData.hpp"
      16             : #include "Utilities/GenerateInstantiations.hpp"
      17             : #include "Utilities/Serialization/CharmPupable.hpp"
      18             : #include "Utilities/TMPL.hpp"
      19             : #include "Utilities/TaggedTuple.hpp"
      20             : 
      21             : /// \cond
      22             : class DataVector;
      23             : namespace PUP {
      24             : class er;
      25             : }  // namespace PUP
      26             : /// \endcond
      27             : 
      28           0 : namespace Ccz4::Solutions {
      29             : /*!
      30             :  * \brief A wrapper for general-relativity analytic solutions that loads
      31             :  * the analytic solution and then adds a function that returns
      32             :  * any combination of the Ccz4 evolution variables.
      33             :  * Specifically, see `Ccz4::fd::System`.
      34             :  */
      35             : template <typename SolutionType>
      36           1 : class Ccz4WrappedGr : public virtual evolution::initial_data::InitialData,
      37             :                       public SolutionType {
      38             :  public:
      39             :   using SolutionType::SolutionType;
      40             : 
      41           0 :   Ccz4WrappedGr() = default;
      42           0 :   Ccz4WrappedGr(const Ccz4WrappedGr& /*rhs*/) = default;
      43           0 :   Ccz4WrappedGr& operator=(const Ccz4WrappedGr& /*rhs*/) = default;
      44           0 :   Ccz4WrappedGr(Ccz4WrappedGr&& /*rhs*/) = default;
      45           0 :   Ccz4WrappedGr& operator=(Ccz4WrappedGr&& /*rhs*/) = default;
      46           0 :   ~Ccz4WrappedGr() override = default;
      47             : 
      48           0 :   explicit Ccz4WrappedGr(const SolutionType& wrapped_solution);
      49             : 
      50           0 :   auto get_clone() const
      51             :       -> std::unique_ptr<evolution::initial_data::InitialData> override;
      52             : 
      53             :   /// \cond
      54             :   explicit Ccz4WrappedGr(CkMigrateMessage* msg);
      55             :   using PUP::able::register_constructor;
      56             :   WRAPPED_PUPable_decl_template(Ccz4WrappedGr);
      57             :   /// \endcond
      58             : 
      59           0 :   static constexpr size_t volume_dim = SolutionType::volume_dim;
      60             :   static_assert(volume_dim == 3,
      61             :                 "Ccz4 evolution system has only been implemented in 3D!");
      62           0 :   using options = typename SolutionType::options;
      63           0 :   static constexpr Options::String help = SolutionType::help;
      64           0 :   static std::string name() {
      65             :     return "Ccz4(" + pretty_type::name<SolutionType>() + ")";
      66             :   }
      67             : 
      68           0 :   using DerivLapse = ::Tags::deriv<gr::Tags::Lapse<DataVector>,
      69             :                                    tmpl::size_t<volume_dim>, Frame::Inertial>;
      70           0 :   using DerivShift = ::Tags::deriv<gr::Tags::Shift<DataVector, volume_dim>,
      71             :                                    tmpl::size_t<volume_dim>, Frame::Inertial>;
      72           0 :   using DerivSpatialMetric =
      73             :       ::Tags::deriv<gr::Tags::SpatialMetric<DataVector, volume_dim>,
      74             :                     tmpl::size_t<volume_dim>, Frame::Inertial>;
      75           0 :   using TimeDerivLapse = ::Tags::dt<gr::Tags::Lapse<DataVector>>;
      76           0 :   using TimeDerivShift = ::Tags::dt<gr::Tags::Shift<DataVector, volume_dim>>;
      77           0 :   using TimeDerivSpatialMetric =
      78             :       ::Tags::dt<gr::Tags::SpatialMetric<DataVector, volume_dim>>;
      79             : 
      80           0 :   using IntermediateVars = tuples::tagged_tuple_from_typelist<
      81             :       typename SolutionType::template tags<DataVector>>;
      82             : 
      83             :   template <typename DataType>
      84           0 :   using tags =
      85             :       tmpl::push_back<typename SolutionType::template tags<DataType>,
      86             :                       Ccz4::Tags::ConformalMetric<DataType, volume_dim>,
      87             :                       Ccz4::Tags::ConformalFactor<DataType>,
      88             :                       Ccz4::Tags::ATilde<DataType, volume_dim>,
      89             :                       gr::Tags::TraceExtrinsicCurvature<DataType>,
      90             :                       Ccz4::Tags::Theta<DataType>,
      91             :                       Ccz4::Tags::GammaHat<DataType, volume_dim>,
      92             :                       Ccz4::Tags::AuxiliaryShiftB<DataType, volume_dim>>;
      93             : 
      94             :   template <typename... Tags>
      95           0 :   tuples::TaggedTuple<Tags...> variables(
      96             :       const tnsr::I<DataVector, volume_dim>& x, const double t,
      97             :       tmpl::list<Tags...> /*meta*/) const {
      98             :     // Get the underlying solution's variables using the solution's tags list,
      99             :     // store in IntermediateVariables
     100             :     const IntermediateVars& intermediate_vars = SolutionType::variables(
     101             :         x, t, typename SolutionType::template tags<DataVector>{});
     102             : 
     103             :     return {
     104             :         get<Tags>(variables(x, t, tmpl::list<Tags>{}, intermediate_vars))...};
     105             :   }
     106             : 
     107             :   template <typename Tag>
     108           0 :   tuples::TaggedTuple<Tag> variables(const tnsr::I<DataVector, volume_dim>& x,
     109             :                                      const double t,
     110             :                                      tmpl::list<Tag> /*meta*/) const {
     111             :     const IntermediateVars& intermediate_vars = SolutionType::variables(
     112             :         x, t, typename SolutionType::template tags<DataVector>{});
     113             :     return {get<Tag>(variables(x, t, tmpl::list<Tag>{}, intermediate_vars))};
     114             :   }
     115             : 
     116             :   // overloads for wrapping analytic data
     117             : 
     118             :   template <typename... Tags>
     119           0 :   tuples::TaggedTuple<Tags...> variables(
     120             :       const tnsr::I<DataVector, volume_dim>& x,
     121             :       tmpl::list<Tags...> /*meta*/) const {
     122             :     // Get the underlying solution's variables using the solution's tags list,
     123             :     // store in IntermediateVariables
     124             :     const IntermediateVars intermediate_vars = SolutionType::variables(
     125             :         x, typename SolutionType::template tags<DataVector>{});
     126             : 
     127             :     return {get<Tags>(variables(x, tmpl::list<Tags>{}, intermediate_vars))...};
     128             :   }
     129             : 
     130             :   template <typename Tag>
     131           0 :   tuples::TaggedTuple<Tag> variables(const tnsr::I<DataVector, volume_dim>& x,
     132             :                                      tmpl::list<Tag> /*meta*/) const {
     133             :     const IntermediateVars intermediate_vars = SolutionType::variables(
     134             :         x, typename SolutionType::template tags<DataVector>{});
     135             :     return {get<Tag>(variables(x, tmpl::list<Tag>{}, intermediate_vars))};
     136             :   }
     137             : 
     138             :   // NOLINTNEXTLINE(google-runtime-references)
     139           0 :   void pup(PUP::er& p) override;
     140             : 
     141             :  private:
     142             :   // Preprocessor logic to avoid declaring variables() functions for
     143             :   // tags other than the three the wrapper adds (i.e., other than
     144             :   // Ccz4::Tags::ConformalMetric, Ccz4::Tags::ConformalFactor,
     145             :   // Ccz4:Tags::ATilde, gr::Tags::TraceExtrinsicCurvature,
     146             :   // Ccz4::Tags::Theta, Ccz4::Tags::GammaHat)
     147           0 :   using TagShift = gr::Tags::Shift<DataVector, volume_dim>;
     148           0 :   using TagSpatialMetric = gr::Tags::SpatialMetric<DataVector, volume_dim>;
     149           0 :   using TagInverseSpatialMetric =
     150             :       gr::Tags::InverseSpatialMetric<DataVector, volume_dim>;
     151           0 :   using TagExCurvature = gr::Tags::ExtrinsicCurvature<DataVector, volume_dim>;
     152             : 
     153             :   template <typename Tag>
     154           0 :   tuples::TaggedTuple<Tag> variables(
     155             :       const tnsr::I<DataVector, volume_dim>& /*x*/, double /*t*/,
     156             :       tmpl::list<Tag> /*meta*/,
     157             :       const IntermediateVars& intermediate_vars) const {
     158             :     static_assert(
     159             :         tmpl::list_contains_v<typename SolutionType::template tags<DataVector>,
     160             :                               Tag>);
     161             :     return {get<Tag>(intermediate_vars)};
     162             :   }
     163             : 
     164             :   template <typename Tag>
     165           0 :   tuples::TaggedTuple<Tag> variables(
     166             :       const tnsr::I<DataVector, volume_dim>& /*x*/, tmpl::list<Tag> /*meta*/,
     167             :       const IntermediateVars& intermediate_vars) const {
     168             :     static_assert(
     169             :         tmpl::list_contains_v<typename SolutionType::template tags<DataVector>,
     170             :                               Tag>);
     171             :     return {get<Tag>(intermediate_vars)};
     172             :   }
     173             : 
     174             :   tuples::TaggedTuple<Ccz4::Tags::ConformalMetric<DataVector, volume_dim>>
     175           0 :   variables(
     176             :       const tnsr::I<DataVector, volume_dim>& /*x*/,
     177             :       tmpl::list<Ccz4::Tags::ConformalMetric<DataVector, volume_dim>> /*meta*/,
     178             :       const IntermediateVars& intermediate_vars) const;
     179           0 :   tuples::TaggedTuple<Ccz4::Tags::ConformalFactor<DataVector>> variables(
     180             :       const tnsr::I<DataVector, volume_dim>& /*x*/,
     181             :       tmpl::list<Ccz4::Tags::ConformalFactor<DataVector>> /*meta*/,
     182             :       const IntermediateVars& intermediate_vars) const;
     183           0 :   tuples::TaggedTuple<Ccz4::Tags::ATilde<DataVector, volume_dim>> variables(
     184             :       const tnsr::I<DataVector, volume_dim>& /*x*/,
     185             :       tmpl::list<Ccz4::Tags::ATilde<DataVector, volume_dim>> /*meta*/,
     186             :       const IntermediateVars& intermediate_vars) const;
     187           0 :   tuples::TaggedTuple<gr::Tags::TraceExtrinsicCurvature<DataVector>> variables(
     188             :       const tnsr::I<DataVector, volume_dim>& /*x*/,
     189             :       tmpl::list<gr::Tags::TraceExtrinsicCurvature<DataVector>> /*meta*/,
     190             :       const IntermediateVars& intermediate_vars) const;
     191           0 :   tuples::TaggedTuple<Ccz4::Tags::Theta<DataVector>> variables(
     192             :       const tnsr::I<DataVector, volume_dim>& /*x*/,
     193             :       tmpl::list<Ccz4::Tags::Theta<DataVector>> /*meta*/,
     194             :       const IntermediateVars& intermediate_vars) const;
     195           0 :   tuples::TaggedTuple<Ccz4::Tags::GammaHat<DataVector, volume_dim>> variables(
     196             :       const tnsr::I<DataVector, volume_dim>& /*x*/,
     197             :       tmpl::list<Ccz4::Tags::GammaHat<DataVector, volume_dim>> /*meta*/,
     198             :       const IntermediateVars& intermediate_vars) const;
     199             :   tuples::TaggedTuple<Ccz4::Tags::AuxiliaryShiftB<DataVector, volume_dim>>
     200           0 :   variables(
     201             :       const tnsr::I<DataVector, volume_dim>& /*x*/,
     202             :       tmpl::list<Ccz4::Tags::AuxiliaryShiftB<DataVector, volume_dim>> /*meta*/,
     203             :       const IntermediateVars& intermediate_vars) const;
     204             : 
     205             :   tuples::TaggedTuple<Ccz4::Tags::ConformalMetric<DataVector, volume_dim>>
     206           0 :   variables(
     207             :       const tnsr::I<DataVector, volume_dim>& x, const double /*t*/,
     208             :       tmpl::list<Ccz4::Tags::ConformalMetric<DataVector, volume_dim>> meta,
     209             :       const IntermediateVars& intermediate_vars) const {
     210             :     return variables(x, meta, intermediate_vars);
     211             :   }
     212           0 :   tuples::TaggedTuple<Ccz4::Tags::ConformalFactor<DataVector>> variables(
     213             :       const tnsr::I<DataVector, volume_dim>& x, double /*t*/,
     214             :       tmpl::list<Ccz4::Tags::ConformalFactor<DataVector>> meta,
     215             :       const IntermediateVars& intermediate_vars) const {
     216             :     return variables(x, meta, intermediate_vars);
     217             :   }
     218           0 :   tuples::TaggedTuple<Ccz4::Tags::ATilde<DataVector, volume_dim>> variables(
     219             :       const tnsr::I<DataVector, volume_dim>& x, double /*t*/,
     220             :       tmpl::list<Ccz4::Tags::ATilde<DataVector, volume_dim>> meta,
     221             :       const IntermediateVars& intermediate_vars) const {
     222             :     return variables(x, meta, intermediate_vars);
     223             :   }
     224           0 :   tuples::TaggedTuple<gr::Tags::TraceExtrinsicCurvature<DataVector>> variables(
     225             :       const tnsr::I<DataVector, volume_dim>& x, const double /*t*/,
     226             :       tmpl::list<gr::Tags::TraceExtrinsicCurvature<DataVector>> meta,
     227             :       const IntermediateVars& intermediate_vars) const {
     228             :     return variables(x, meta, intermediate_vars);
     229             :   }
     230           0 :   tuples::TaggedTuple<Ccz4::Tags::Theta<DataVector>> variables(
     231             :       const tnsr::I<DataVector, volume_dim>& x, double /*t*/,
     232             :       tmpl::list<Ccz4::Tags::Theta<DataVector>> meta,
     233             :       const IntermediateVars& intermediate_vars) const {
     234             :     return variables(x, meta, intermediate_vars);
     235             :   }
     236           0 :   tuples::TaggedTuple<Ccz4::Tags::GammaHat<DataVector, volume_dim>> variables(
     237             :       const tnsr::I<DataVector, volume_dim>& x, double /*t*/,
     238             :       tmpl::list<Ccz4::Tags::GammaHat<DataVector, volume_dim>> meta,
     239             :       const IntermediateVars& intermediate_vars) const {
     240             :     return variables(x, meta, intermediate_vars);
     241             :   }
     242             :   tuples::TaggedTuple<Ccz4::Tags::AuxiliaryShiftB<DataVector, volume_dim>>
     243           0 :   variables(
     244             :       const tnsr::I<DataVector, volume_dim>& x, double /*t*/,
     245             :       tmpl::list<Ccz4::Tags::AuxiliaryShiftB<DataVector, volume_dim>> meta,
     246             :       const IntermediateVars& intermediate_vars) const {
     247             :     return variables(x, meta, intermediate_vars);
     248             :   }
     249             : };
     250             : 
     251             : template <typename SolutionType>
     252           0 : bool operator==(const Ccz4WrappedGr<SolutionType>& lhs,
     253             :                 const Ccz4WrappedGr<SolutionType>& rhs);
     254             : 
     255             : template <typename SolutionType>
     256           0 : bool operator!=(const Ccz4WrappedGr<SolutionType>& lhs,
     257             :                 const Ccz4WrappedGr<SolutionType>& rhs);
     258             : 
     259             : template <typename SolutionType>
     260           0 : Ccz4WrappedGr(SolutionType solution) -> Ccz4WrappedGr<SolutionType>;
     261             : }  // namespace Ccz4::Solutions

Generated by: LCOV version 1.14