SpECTRE Documentation Coverage Report
Current view: top level - Evolution/Systems/ScalarTensor/BoundaryConditions - DirichletAnalytic.hpp Hit Total Coverage
Commit: de0084593a37be7727c6c4da0be2184b0f8d9ed4 Lines: 2 28 7.1 %
Date: 2025-11-04 23:26:01
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 <memory>
       7             : #include <optional>
       8             : #include <string>
       9             : 
      10             : #include "DataStructures/DataVector.hpp"
      11             : #include "DataStructures/Tensor/Tensor.hpp"
      12             : #include "Evolution/BoundaryConditions/Type.hpp"
      13             : #include "Evolution/Systems/CurvedScalarWave/Tags.hpp"
      14             : #include "Evolution/Systems/ScalarTensor/BoundaryConditions/BoundaryCondition.hpp"
      15             : #include "Options/String.hpp"
      16             : #include "PointwiseFunctions/GeneralRelativity/GeneralizedHarmonic/ConstraintDampingTags.hpp"
      17             : #include "PointwiseFunctions/InitialDataUtilities/InitialData.hpp"
      18             : #include "Utilities/Gsl.hpp"
      19             : #include "Utilities/Serialization/CharmPupable.hpp"
      20             : #include "Utilities/TMPL.hpp"
      21             : 
      22             : /// \cond
      23             : namespace Tags {
      24             : struct Time;
      25             : }  // namespace Tags
      26             : namespace domain::Tags {
      27             : template <size_t Dim, typename Frame>
      28             : struct Coordinates;
      29             : }  // namespace domain::Tags
      30             : /// \endcond
      31             : 
      32             : namespace ScalarTensor::BoundaryConditions {
      33             : /*!
      34             :  * \brief Sets Dirichlet boundary conditions using the analytic solution or
      35             :  * analytic data.
      36             :  */
      37           1 : class DirichletAnalytic final : public BoundaryCondition {
      38             :  public:
      39             :   /// \brief What analytic solution/data to prescribe.
      40           1 :   struct AnalyticPrescription {
      41           0 :     static constexpr Options::String help =
      42             :         "What analytic solution/data to prescribe.";
      43           0 :     using type = std::unique_ptr<evolution::initial_data::InitialData>;
      44             :   };
      45           0 :   struct Amplitude {
      46           0 :     using type = double;
      47           0 :     static constexpr Options::String help = {
      48             :         "Amplitude of the scalar at the boundary"};
      49             :   };
      50             : 
      51           0 :   using options = tmpl::list<AnalyticPrescription, Amplitude>;
      52             : 
      53           0 :   static constexpr Options::String help{
      54             :       "DirichletAnalytic boundary conditions."};
      55             : 
      56           0 :   DirichletAnalytic() = default;
      57           0 :   DirichletAnalytic(DirichletAnalytic&&) = default;
      58           0 :   DirichletAnalytic& operator=(DirichletAnalytic&&) = default;
      59           0 :   DirichletAnalytic(const DirichletAnalytic&);
      60           0 :   DirichletAnalytic& operator=(const DirichletAnalytic&);
      61           0 :   ~DirichletAnalytic() override = default;
      62             : 
      63           0 :   DirichletAnalytic(std::unique_ptr<evolution::initial_data::InitialData>
      64             :                         analytic_prescription,
      65             :                     double amplitude);
      66             : 
      67           0 :   explicit DirichletAnalytic(CkMigrateMessage* msg);
      68             : 
      69           0 :   WRAPPED_PUPable_decl_base_template(
      70             :       domain::BoundaryConditions::BoundaryCondition, DirichletAnalytic);
      71             : 
      72           0 :   auto get_clone() const -> std::unique_ptr<
      73             :       domain::BoundaryConditions::BoundaryCondition> override;
      74             : 
      75           0 :   static constexpr evolution::BoundaryConditions::Type bc_type =
      76             :       evolution::BoundaryConditions::Type::Ghost;
      77             : 
      78           0 :   void pup(PUP::er& p) override;
      79             : 
      80           0 :   using dg_interior_evolved_variables_tags = tmpl::list<>;
      81           0 :   using dg_interior_temporary_tags =
      82             :       tmpl::list<domain::Tags::Coordinates<3, Frame::Inertial>,
      83             :                  ::gh::Tags::ConstraintGamma1, ::gh::Tags::ConstraintGamma2,
      84             :                  ::CurvedScalarWave::Tags::ConstraintGamma1,
      85             :                  ::CurvedScalarWave::Tags::ConstraintGamma2>;
      86           0 :   using dg_gridless_tags = tmpl::list<::Tags::Time>;
      87             : 
      88           0 :   std::optional<std::string> dg_ghost(
      89             :       // GH evolved variables
      90             :       gsl::not_null<tnsr::aa<DataVector, 3, Frame::Inertial>*> spacetime_metric,
      91             :       gsl::not_null<tnsr::aa<DataVector, 3, Frame::Inertial>*> pi,
      92             :       gsl::not_null<tnsr::iaa<DataVector, 3, Frame::Inertial>*> phi,
      93             :       // Scalar evolved variables
      94             :       gsl::not_null<Scalar<DataVector>*> psi_scalar,
      95             :       gsl::not_null<Scalar<DataVector>*> pi_scalar,
      96             :       gsl::not_null<tnsr::i<DataVector, 3, Frame::Inertial>*> phi_scalar,
      97             :       // GH temporary variables
      98             :       gsl::not_null<Scalar<DataVector>*> gamma1,
      99             :       gsl::not_null<Scalar<DataVector>*> gamma2,
     100             :       gsl::not_null<Scalar<DataVector>*> lapse,
     101             :       gsl::not_null<tnsr::I<DataVector, 3, Frame::Inertial>*> shift,
     102             :       // Scalar temporary variables
     103             :       gsl::not_null<Scalar<DataVector>*> gamma1_scalar,
     104             :       gsl::not_null<Scalar<DataVector>*> gamma2_scalar,
     105             :       // Inverse metric
     106             :       gsl::not_null<tnsr::II<DataVector, 3, Frame::Inertial>*>
     107             :           inv_spatial_metric,
     108             :       // Mesh variables
     109             :       const std::optional<tnsr::I<DataVector, 3, Frame::Inertial>>&
     110             :           face_mesh_velocity,
     111             :       const tnsr::i<DataVector, 3, Frame::Inertial>& normal_covector,
     112             :       const tnsr::I<DataVector, 3, Frame::Inertial>& normal_vector,
     113             :       // GH interior variables
     114             :       const tnsr::I<DataVector, 3, Frame::Inertial>& coords,
     115             :       const Scalar<DataVector>& interior_gamma1,
     116             :       const Scalar<DataVector>& interior_gamma2,
     117             :       // Scalar interior variables
     118             :       const Scalar<DataVector>& gamma1_interior_scalar,
     119             :       const Scalar<DataVector>& gamma2_interior_scalar, double time) const;
     120             : 
     121             :  private:
     122           0 :   std::unique_ptr<evolution::initial_data::InitialData> analytic_prescription_;
     123           0 :   double amplitude_ = std::numeric_limits<double>::signaling_NaN();
     124             : };
     125             : }  // namespace ScalarTensor::BoundaryConditions

Generated by: LCOV version 1.14