SpECTRE Documentation Coverage Report
Current view: top level - Evolution/Systems/ScalarTensor/BoundaryConditions - ConstraintPreserving.hpp Coverage Total Hit
Commit: 0d1d717af84a81fb1284a20c4013708fe85cc2f0 Lines: 3.8 % 26 1
Test Date: 2026-10-22 17:29:42
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 <pup.h>
       9              : #include <string>
      10              : 
      11              : #include "DataStructures/DataBox/Prefixes.hpp"
      12              : #include "DataStructures/DataVector.hpp"
      13              : #include "DataStructures/Tensor/Tensor.hpp"
      14              : #include "DataStructures/Variables.hpp"
      15              : #include "Domain/CoordinateMaps/Tags.hpp"
      16              : #include "Domain/ElementMap.hpp"
      17              : #include "Domain/Structure/Direction.hpp"
      18              : #include "Domain/Tags.hpp"
      19              : #include "Evolution/BoundaryConditions/Type.hpp"
      20              : #include "Evolution/Systems/CurvedScalarWave/BoundaryConditions/ConstraintPreservingSphericalRadiation.hpp"
      21              : #include "Evolution/Systems/CurvedScalarWave/Tags.hpp"
      22              : #include "Evolution/Systems/GeneralizedHarmonic/BoundaryConditions/Bjorhus.hpp"
      23              : #include "Evolution/Systems/GeneralizedHarmonic/Tags.hpp"
      24              : #include "Evolution/Systems/ScalarTensor/BoundaryConditions/BoundaryCondition.hpp"
      25              : #include "Evolution/Systems/ScalarTensor/Tags.hpp"
      26              : #include "Options/String.hpp"
      27              : #include "PointwiseFunctions/GeneralRelativity/GeneralizedHarmonic/ConstraintDampingTags.hpp"
      28              : #include "PointwiseFunctions/MathFunctions/MathFunction.hpp"
      29              : #include "Utilities/Gsl.hpp"
      30              : #include "Utilities/Serialization/CharmPupable.hpp"
      31              : #include "Utilities/TMPL.hpp"
      32              : 
      33              : namespace ScalarTensor::BoundaryConditions {
      34              : /*!
      35              :  * \brief Sets constraint-preserving boundary conditions on the variables of the
      36              :  * ScalarTensor system.
      37              :  * \details The constraint-preserving boundary conditions on the scalar
      38              :  * variables are approximate as they assume a fixed spacetime geometry.
      39              :  * Likewise, the constraint-preserving boundary conditions on the metric
      40              :  * variables assume that there is no back-reaction of the scalar stress energy
      41              :  * tensor on the metric.
      42              :  *
      43              :  */
      44            1 : class ConstraintPreserving final : public BoundaryCondition {
      45              :  public:
      46            0 :   using options = tmpl::push_back<
      47              :       typename gh::BoundaryConditions::ConstraintPreservingBjorhus<3>::options>;
      48              : 
      49            0 :   static constexpr Options::String help{
      50              :       "Constraint-preserving boundary conditions are applied for the "
      51              :       "Generalized Harmonic variables and spherical radiation constraint-"
      52              :       "preserving boundary conditions are applied for the scalar variables."};
      53              : 
      54            0 :   ConstraintPreserving() = default;
      55            0 :   explicit ConstraintPreserving(
      56              :       gh::BoundaryConditions::detail::ConstraintPreservingBjorhusType type,
      57              :       std::optional<std::unique_ptr<::MathFunction<1, Frame::Inertial>>>
      58              :           incoming_wave_profile = std::nullopt);
      59              : 
      60            0 :   ConstraintPreserving(ConstraintPreserving&&) = default;
      61            0 :   ConstraintPreserving& operator=(ConstraintPreserving&&) = default;
      62            0 :   ConstraintPreserving(const ConstraintPreserving&) = default;
      63            0 :   ConstraintPreserving& operator=(const ConstraintPreserving&) = default;
      64            0 :   ~ConstraintPreserving() override = default;
      65              : 
      66            0 :   explicit ConstraintPreserving(CkMigrateMessage* msg);
      67              : 
      68            0 :   WRAPPED_PUPable_decl_base_template(
      69              :       domain::BoundaryConditions::BoundaryCondition, ConstraintPreserving);
      70              : 
      71            0 :   auto get_clone() const -> std::unique_ptr<
      72              :       domain::BoundaryConditions::BoundaryCondition> override;
      73              : 
      74            0 :   static constexpr evolution::BoundaryConditions::Type bc_type =
      75              :       evolution::BoundaryConditions::Type::GhostAndTimeDerivative;
      76              : 
      77            0 :   void pup(PUP::er& p) override;
      78              : 
      79            0 :   using dg_interior_evolved_variables_tags =
      80              :       tmpl::list<gr::Tags::SpacetimeMetric<DataVector, 3>,
      81              :                  gh::Tags::Pi<DataVector, 3>, gh::Tags::Phi<DataVector, 3>,
      82              :                  CurvedScalarWave::Tags::Psi, CurvedScalarWave::Tags::Pi,
      83              :                  CurvedScalarWave::Tags::Phi<3>>;
      84            0 :   using dg_interior_temporary_tags =
      85              :       tmpl::list<domain::Tags::Coordinates<3, Frame::Inertial>,
      86              :                  ::gh::Tags::ConstraintGamma1, ::gh::Tags::ConstraintGamma2,
      87              :                  gr::Tags::Lapse<DataVector>, gr::Tags::Shift<DataVector, 3>,
      88              :                  gr::Tags::InverseSpatialMetric<DataVector, 3>,
      89              :                  gr::Tags::InverseSpacetimeMetric<DataVector, 3>,
      90              :                  gr::Tags::SpacetimeNormalVector<DataVector, 3>,
      91              :                  gh::Tags::ThreeIndexConstraint<DataVector, 3>,
      92              :                  gh::Tags::GaugeH<DataVector, 3>,
      93              :                  gh::Tags::SpacetimeDerivGaugeH<DataVector, 3>,
      94              :                  CurvedScalarWave::Tags::ConstraintGamma1,
      95              :                  CurvedScalarWave::Tags::ConstraintGamma2>;
      96            0 :   using dg_interior_primitive_variables_tags = tmpl::list<>;
      97            0 :   using dg_gridless_tags = tmpl::list<>;
      98              : 
      99            0 :   static std::optional<std::string> dg_ghost(
     100              :       gsl::not_null<tnsr::aa<DataVector, 3, Frame::Inertial>*> spacetime_metric,
     101              :       gsl::not_null<tnsr::aa<DataVector, 3, Frame::Inertial>*> pi,
     102              :       gsl::not_null<tnsr::iaa<DataVector, 3, Frame::Inertial>*> phi,
     103              : 
     104              :       gsl::not_null<Scalar<DataVector>*> psi_scalar,
     105              :       gsl::not_null<Scalar<DataVector>*> pi_scalar,
     106              :       gsl::not_null<tnsr::i<DataVector, 3, Frame::Inertial>*> phi_scalar,
     107              : 
     108              :       // c.f. dg_package_data_temporary_tags from the combined Upwind correction
     109              :       gsl::not_null<Scalar<DataVector>*> gamma1,
     110              :       gsl::not_null<Scalar<DataVector>*> gamma2,
     111              :       gsl::not_null<Scalar<DataVector>*> lapse,
     112              :       gsl::not_null<tnsr::I<DataVector, 3, Frame::Inertial>*> shift,
     113              :       gsl::not_null<Scalar<DataVector>*> gamma1_scalar,
     114              :       gsl::not_null<Scalar<DataVector>*> gamma2_scalar,
     115              : 
     116              :       gsl::not_null<tnsr::II<DataVector, 3, Frame::Inertial>*>
     117              :           inv_spatial_metric,
     118              : 
     119              :       const std::optional<tnsr::I<DataVector, 3, Frame::Inertial>>&
     120              :           face_mesh_velocity,
     121              :       const tnsr::i<DataVector, 3, Frame::Inertial>& normal_covector,
     122              :       const tnsr::I<DataVector, 3, Frame::Inertial>& normal_vector,
     123              : 
     124              :       const tnsr::aa<DataVector, 3, Frame::Inertial>& interior_spacetime_metric,
     125              :       const tnsr::aa<DataVector, 3, Frame::Inertial>& interior_pi,
     126              :       const tnsr::iaa<DataVector, 3, Frame::Inertial>& interior_phi,
     127              : 
     128              :       const Scalar<DataVector>& psi_scalar_interior,
     129              :       const Scalar<DataVector>& pi_scalar_interior,
     130              :       const tnsr::i<DataVector, 3>& phi_scalar_interior,
     131              : 
     132              :       const tnsr::I<DataVector, 3, Frame::Inertial>& /*coords*/,
     133              :       const Scalar<DataVector>& interior_gamma1,
     134              :       const Scalar<DataVector>& interior_gamma2,
     135              :       const Scalar<DataVector>& interior_lapse,
     136              :       const tnsr::I<DataVector, 3>& interior_shift,
     137              :       const tnsr::II<DataVector, 3>& interior_inv_spatial_metric,
     138              :       const tnsr::AA<DataVector, 3,
     139              :                      Frame::Inertial>& /*inverse_spacetime_metric*/,
     140              :       const tnsr::A<DataVector, 3, Frame::Inertial>&
     141              :       /*spacetime_unit_normal_vector*/,
     142              :       const tnsr::iaa<DataVector, 3,
     143              :                       Frame::Inertial>& /*three_index_constraint*/,
     144              :       const tnsr::a<DataVector, 3, Frame::Inertial>& /*gauge_source*/,
     145              :       const tnsr::ab<DataVector, 3, Frame::Inertial>&
     146              :       /*spacetime_deriv_gauge_source*/,
     147              :       const Scalar<DataVector>& interior_gamma1_scalar,
     148              :       const Scalar<DataVector>& interior_gamma2_scalar,
     149              : 
     150              :       // c.f. dg_interior_dt_vars_tags
     151              :       const tnsr::aa<DataVector, 3, Frame::Inertial>&
     152              :       /*logical_dt_spacetime_metric*/,
     153              :       const tnsr::aa<DataVector, 3, Frame::Inertial>& /*logical_dt_pi*/,
     154              :       const tnsr::iaa<DataVector, 3, Frame::Inertial>& /*logical_dt_phi*/,
     155              : 
     156              :       const Scalar<DataVector>& /* logical_dt_psi_scalar*/,
     157              :       const Scalar<DataVector>& /*logical_dt_pi_scalar*/,
     158              :       const tnsr::i<DataVector, 3>& /*logical_dt_phi_scalar*/,
     159              : 
     160              :       // c.f. dg_interior_deriv_vars_tags
     161              :       const tnsr::iaa<DataVector, 3, Frame::Inertial>& /*d_spacetime_metric*/,
     162              :       const tnsr::iaa<DataVector, 3, Frame::Inertial>& /*d_pi*/,
     163              :       const tnsr::ijaa<DataVector, 3, Frame::Inertial>& /*d_phi*/,
     164              : 
     165              :       const tnsr::i<DataVector, 3, Frame::Inertial>& /*d_psi_scalar*/,
     166              :       const tnsr::i<DataVector, 3, Frame::Inertial>& /*d_pi_scalar*/,
     167              :       const tnsr::ij<DataVector, 3, Frame::Inertial>& /*d_phi_scalar*/);
     168              : 
     169            0 :   using dg_interior_dt_vars_tags =
     170              :       tmpl::list<::Tags::dt<gr::Tags::SpacetimeMetric<DataVector, 3>>,
     171              :                  ::Tags::dt<gh::Tags::Pi<DataVector, 3>>,
     172              :                  ::Tags::dt<gh::Tags::Phi<DataVector, 3>>,
     173              :                  ::Tags::dt<CurvedScalarWave::Tags::Psi>,
     174              :                  ::Tags::dt<CurvedScalarWave::Tags::Pi>,
     175              :                  ::Tags::dt<CurvedScalarWave::Tags::Phi<3>>>;
     176            0 :   using dg_interior_deriv_vars_tags =
     177              :       tmpl::list<::Tags::deriv<gr::Tags::SpacetimeMetric<DataVector, 3>,
     178              :                                tmpl::size_t<3>, Frame::Inertial>,
     179              :                  ::Tags::deriv<gh::Tags::Pi<DataVector, 3>, tmpl::size_t<3>,
     180              :                                Frame::Inertial>,
     181              :                  ::Tags::deriv<gh::Tags::Phi<DataVector, 3>, tmpl::size_t<3>,
     182              :                                Frame::Inertial>,
     183              :                  ::Tags::deriv<CurvedScalarWave::Tags::Psi, tmpl::size_t<3>,
     184              :                                Frame::Inertial>,
     185              :                  ::Tags::deriv<CurvedScalarWave::Tags::Pi, tmpl::size_t<3>,
     186              :                                Frame::Inertial>,
     187              :                  ::Tags::deriv<CurvedScalarWave::Tags::Phi<3>, tmpl::size_t<3>,
     188              :                                Frame::Inertial>>;
     189              : 
     190            0 :   std::optional<std::string> dg_time_derivative(
     191              :       gsl::not_null<tnsr::aa<DataVector, 3, Frame::Inertial>*>
     192              :           dt_spacetime_metric_correction,
     193              :       gsl::not_null<tnsr::aa<DataVector, 3, Frame::Inertial>*> dt_pi_correction,
     194              :       gsl::not_null<tnsr::iaa<DataVector, 3, Frame::Inertial>*>
     195              :           dt_phi_correction,
     196              : 
     197              :       gsl::not_null<Scalar<DataVector>*> dt_psi_scalar_correction,
     198              :       gsl::not_null<Scalar<DataVector>*> dt_pi_scalar_correction,
     199              :       gsl::not_null<tnsr::i<DataVector, 3, Frame::Inertial>*>
     200              :           dt_phi_scalar_correction,
     201              : 
     202              :       const std::optional<tnsr::I<DataVector, 3, Frame::Inertial>>&
     203              :           face_mesh_velocity,
     204              :       const tnsr::i<DataVector, 3, Frame::Inertial>& normal_covector,
     205              :       const tnsr::I<DataVector, 3, Frame::Inertial>& normal_vector,
     206              :       // c.f. dg_interior_evolved_variables_tags
     207              :       const tnsr::aa<DataVector, 3, Frame::Inertial>& spacetime_metric,
     208              :       const tnsr::aa<DataVector, 3, Frame::Inertial>& pi,
     209              :       const tnsr::iaa<DataVector, 3, Frame::Inertial>& phi,
     210              : 
     211              :       const Scalar<DataVector>& psi_scalar, const Scalar<DataVector>& pi_scalar,
     212              :       const tnsr::i<DataVector, 3, Frame::Inertial>& phi_scalar,
     213              : 
     214              :       // c.f. dg_interior_temporary_tags
     215              :       const tnsr::I<DataVector, 3, Frame::Inertial>& coords,
     216              :       const Scalar<DataVector>& gamma1, const Scalar<DataVector>& gamma2,
     217              :       const Scalar<DataVector>& lapse,
     218              :       const tnsr::I<DataVector, 3, Frame::Inertial>& shift,
     219              :       const tnsr::II<DataVector, 3>& /*interior_inv_spatial_metric*/,
     220              :       const tnsr::AA<DataVector, 3, Frame::Inertial>& inverse_spacetime_metric,
     221              :       const tnsr::A<DataVector, 3, Frame::Inertial>&
     222              :           spacetime_unit_normal_vector,
     223              :       const tnsr::iaa<DataVector, 3, Frame::Inertial>& three_index_constraint,
     224              :       const tnsr::a<DataVector, 3, Frame::Inertial>& gauge_source,
     225              :       const tnsr::ab<DataVector, 3, Frame::Inertial>&
     226              :           spacetime_deriv_gauge_source,
     227              :       const Scalar<DataVector>& gamma1_scalar,
     228              :       const Scalar<DataVector>& gamma2_scalar,
     229              : 
     230              :       // c.f. dg_interior_dt_vars_tags
     231              :       const tnsr::aa<DataVector, 3, Frame::Inertial>&
     232              :           logical_dt_spacetime_metric,
     233              :       const tnsr::aa<DataVector, 3, Frame::Inertial>& logical_dt_pi,
     234              :       const tnsr::iaa<DataVector, 3, Frame::Inertial>& logical_dt_phi,
     235              : 
     236              :       const Scalar<DataVector>& logical_dt_psi_scalar,
     237              :       const Scalar<DataVector>& logical_dt_pi_scalar,
     238              :       const tnsr::i<DataVector, 3>& logical_dt_phi_scalar,
     239              : 
     240              :       // c.f. dg_interior_deriv_vars_tags
     241              :       const tnsr::iaa<DataVector, 3, Frame::Inertial>& d_spacetime_metric,
     242              :       const tnsr::iaa<DataVector, 3, Frame::Inertial>& d_pi,
     243              :       const tnsr::ijaa<DataVector, 3, Frame::Inertial>& d_phi,
     244              : 
     245              :       const tnsr::i<DataVector, 3, Frame::Inertial>& d_psi_scalar,
     246              :       const tnsr::i<DataVector, 3, Frame::Inertial>& d_pi_scalar,
     247              :       const tnsr::ij<DataVector, 3, Frame::Inertial>& d_phi_scalar) const;
     248              : 
     249              :  private:
     250              :   gh::BoundaryConditions::ConstraintPreservingBjorhus<3>
     251            0 :       constraint_preserving_{};
     252              :   CurvedScalarWave::BoundaryConditions::ConstraintPreservingSphericalRadiation<
     253              :       3>
     254            0 :       csw_constraint_preserving_{};
     255              : };
     256              : }  // namespace ScalarTensor::BoundaryConditions
        

Generated by: LCOV version 2.0-1