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

Generated by: LCOV version 1.14