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
|