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 "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::Tags::ConstraintGamma1, ::gh::Tags::ConstraintGamma2,
84 : gr::Tags::Lapse<DataVector>, gr::Tags::Shift<DataVector, 3>,
85 : gr::Tags::InverseSpatialMetric<DataVector, 3>,
86 : gr::Tags::InverseSpacetimeMetric<DataVector, 3>,
87 : gr::Tags::SpacetimeNormalVector<DataVector, 3>,
88 : gh::Tags::ThreeIndexConstraint<DataVector, 3>,
89 : gh::Tags::GaugeH<DataVector, 3>,
90 : gh::Tags::SpacetimeDerivGaugeH<DataVector, 3>,
91 : CurvedScalarWave::Tags::ConstraintGamma1,
92 : CurvedScalarWave::Tags::ConstraintGamma2>;
93 0 : using dg_interior_primitive_variables_tags = tmpl::list<>;
94 0 : using dg_gridless_tags = tmpl::list<>;
95 :
96 0 : static std::optional<std::string> dg_ghost(
97 : gsl::not_null<tnsr::aa<DataVector, 3, Frame::Inertial>*> spacetime_metric,
98 : gsl::not_null<tnsr::aa<DataVector, 3, Frame::Inertial>*> pi,
99 : gsl::not_null<tnsr::iaa<DataVector, 3, Frame::Inertial>*> phi,
100 :
101 : gsl::not_null<Scalar<DataVector>*> psi_scalar,
102 : gsl::not_null<Scalar<DataVector>*> pi_scalar,
103 : gsl::not_null<tnsr::i<DataVector, 3, Frame::Inertial>*> phi_scalar,
104 :
105 : // c.f. dg_package_data_temporary_tags from the combined Upwind correction
106 : gsl::not_null<Scalar<DataVector>*> gamma1,
107 : gsl::not_null<Scalar<DataVector>*> gamma2,
108 : gsl::not_null<Scalar<DataVector>*> lapse,
109 : gsl::not_null<tnsr::I<DataVector, 3, Frame::Inertial>*> shift,
110 : gsl::not_null<Scalar<DataVector>*> gamma1_scalar,
111 : gsl::not_null<Scalar<DataVector>*> gamma2_scalar,
112 :
113 : gsl::not_null<tnsr::II<DataVector, 3, Frame::Inertial>*>
114 : inv_spatial_metric,
115 :
116 : const std::optional<tnsr::I<DataVector, 3, Frame::Inertial>>&
117 : face_mesh_velocity,
118 : const tnsr::i<DataVector, 3, Frame::Inertial>& normal_covector,
119 : const tnsr::I<DataVector, 3, Frame::Inertial>& normal_vector,
120 :
121 : const tnsr::aa<DataVector, 3, Frame::Inertial>& interior_spacetime_metric,
122 : const tnsr::aa<DataVector, 3, Frame::Inertial>& interior_pi,
123 : const tnsr::iaa<DataVector, 3, Frame::Inertial>& interior_phi,
124 :
125 : const Scalar<DataVector>& psi_scalar_interior,
126 : const Scalar<DataVector>& pi_scalar_interior,
127 : const tnsr::i<DataVector, 3>& phi_scalar_interior,
128 :
129 : const tnsr::I<DataVector, 3, Frame::Inertial>& /*coords*/,
130 : const Scalar<DataVector>& interior_gamma1,
131 : const Scalar<DataVector>& interior_gamma2,
132 : const Scalar<DataVector>& interior_lapse,
133 : const tnsr::I<DataVector, 3>& interior_shift,
134 : const tnsr::II<DataVector, 3>& interior_inv_spatial_metric,
135 : const tnsr::AA<DataVector, 3,
136 : Frame::Inertial>& /*inverse_spacetime_metric*/,
137 : const tnsr::A<DataVector, 3, Frame::Inertial>&
138 : /*spacetime_unit_normal_vector*/,
139 : const tnsr::iaa<DataVector, 3,
140 : Frame::Inertial>& /*three_index_constraint*/,
141 : const tnsr::a<DataVector, 3, Frame::Inertial>& /*gauge_source*/,
142 : const tnsr::ab<DataVector, 3, Frame::Inertial>&
143 : /*spacetime_deriv_gauge_source*/,
144 : const Scalar<DataVector>& interior_gamma1_scalar,
145 : const Scalar<DataVector>& interior_gamma2_scalar,
146 :
147 : // c.f. dg_interior_dt_vars_tags
148 : const tnsr::aa<DataVector, 3, Frame::Inertial>&
149 : /*logical_dt_spacetime_metric*/,
150 : const tnsr::aa<DataVector, 3, Frame::Inertial>& /*logical_dt_pi*/,
151 : const tnsr::iaa<DataVector, 3, Frame::Inertial>& /*logical_dt_phi*/,
152 :
153 : const Scalar<DataVector>& /* logical_dt_psi_scalar*/,
154 : const Scalar<DataVector>& /*logical_dt_pi_scalar*/,
155 : const tnsr::i<DataVector, 3>& /*logical_dt_phi_scalar*/,
156 :
157 : // c.f. dg_interior_deriv_vars_tags
158 : const tnsr::iaa<DataVector, 3, Frame::Inertial>& /*d_spacetime_metric*/,
159 : const tnsr::iaa<DataVector, 3, Frame::Inertial>& /*d_pi*/,
160 : const tnsr::ijaa<DataVector, 3, Frame::Inertial>& /*d_phi*/,
161 :
162 : const tnsr::i<DataVector, 3, Frame::Inertial>& /*d_psi_scalar*/,
163 : const tnsr::i<DataVector, 3, Frame::Inertial>& /*d_pi_scalar*/,
164 : const tnsr::ij<DataVector, 3, Frame::Inertial>& /*d_phi_scalar*/);
165 :
166 0 : using dg_interior_dt_vars_tags =
167 : tmpl::list<::Tags::dt<gr::Tags::SpacetimeMetric<DataVector, 3>>,
168 : ::Tags::dt<gh::Tags::Pi<DataVector, 3>>,
169 : ::Tags::dt<gh::Tags::Phi<DataVector, 3>>,
170 : ::Tags::dt<CurvedScalarWave::Tags::Psi>,
171 : ::Tags::dt<CurvedScalarWave::Tags::Pi>,
172 : ::Tags::dt<CurvedScalarWave::Tags::Phi<3>>>;
173 0 : using dg_interior_deriv_vars_tags =
174 : tmpl::list<::Tags::deriv<gr::Tags::SpacetimeMetric<DataVector, 3>,
175 : tmpl::size_t<3>, Frame::Inertial>,
176 : ::Tags::deriv<gh::Tags::Pi<DataVector, 3>, tmpl::size_t<3>,
177 : Frame::Inertial>,
178 : ::Tags::deriv<gh::Tags::Phi<DataVector, 3>, tmpl::size_t<3>,
179 : Frame::Inertial>,
180 : ::Tags::deriv<CurvedScalarWave::Tags::Psi, tmpl::size_t<3>,
181 : Frame::Inertial>,
182 : ::Tags::deriv<CurvedScalarWave::Tags::Pi, tmpl::size_t<3>,
183 : Frame::Inertial>,
184 : ::Tags::deriv<CurvedScalarWave::Tags::Phi<3>, tmpl::size_t<3>,
185 : Frame::Inertial>>;
186 :
187 0 : std::optional<std::string> dg_time_derivative(
188 : gsl::not_null<tnsr::aa<DataVector, 3, Frame::Inertial>*>
189 : dt_spacetime_metric_correction,
190 : gsl::not_null<tnsr::aa<DataVector, 3, Frame::Inertial>*> dt_pi_correction,
191 : gsl::not_null<tnsr::iaa<DataVector, 3, Frame::Inertial>*>
192 : dt_phi_correction,
193 :
194 : gsl::not_null<Scalar<DataVector>*> dt_psi_scalar_correction,
195 : gsl::not_null<Scalar<DataVector>*> dt_pi_scalar_correction,
196 : gsl::not_null<tnsr::i<DataVector, 3, Frame::Inertial>*>
197 : dt_phi_scalar_correction,
198 :
199 : const std::optional<tnsr::I<DataVector, 3, Frame::Inertial>>&
200 : face_mesh_velocity,
201 : const tnsr::i<DataVector, 3, Frame::Inertial>& normal_covector,
202 : const tnsr::I<DataVector, 3, Frame::Inertial>& normal_vector,
203 : // c.f. dg_interior_evolved_variables_tags
204 : const tnsr::aa<DataVector, 3, Frame::Inertial>& spacetime_metric,
205 : const tnsr::aa<DataVector, 3, Frame::Inertial>& pi,
206 : const tnsr::iaa<DataVector, 3, Frame::Inertial>& phi,
207 :
208 : const Scalar<DataVector>& psi_scalar, const Scalar<DataVector>& pi_scalar,
209 : const tnsr::i<DataVector, 3, Frame::Inertial>& phi_scalar,
210 :
211 : // c.f. dg_interior_temporary_tags
212 : const tnsr::I<DataVector, 3, Frame::Inertial>& coords,
213 : const Scalar<DataVector>& gamma1, const Scalar<DataVector>& gamma2,
214 : const Scalar<DataVector>& lapse,
215 : const tnsr::I<DataVector, 3, Frame::Inertial>& shift,
216 : const tnsr::II<DataVector, 3>& /*interior_inv_spatial_metric*/,
217 : const tnsr::AA<DataVector, 3, Frame::Inertial>& inverse_spacetime_metric,
218 : const tnsr::A<DataVector, 3, Frame::Inertial>&
219 : spacetime_unit_normal_vector,
220 : const tnsr::iaa<DataVector, 3, Frame::Inertial>& three_index_constraint,
221 : const tnsr::a<DataVector, 3, Frame::Inertial>& gauge_source,
222 : const tnsr::ab<DataVector, 3, Frame::Inertial>&
223 : spacetime_deriv_gauge_source,
224 : const Scalar<DataVector>& gamma1_scalar,
225 : const Scalar<DataVector>& gamma2_scalar,
226 :
227 : // c.f. dg_interior_dt_vars_tags
228 : const tnsr::aa<DataVector, 3, Frame::Inertial>&
229 : logical_dt_spacetime_metric,
230 : const tnsr::aa<DataVector, 3, Frame::Inertial>& logical_dt_pi,
231 : const tnsr::iaa<DataVector, 3, Frame::Inertial>& logical_dt_phi,
232 :
233 : const Scalar<DataVector>& logical_dt_psi_scalar,
234 : const Scalar<DataVector>& logical_dt_pi_scalar,
235 : const tnsr::i<DataVector, 3>& logical_dt_phi_scalar,
236 :
237 : // c.f. dg_interior_deriv_vars_tags
238 : const tnsr::iaa<DataVector, 3, Frame::Inertial>& d_spacetime_metric,
239 : const tnsr::iaa<DataVector, 3, Frame::Inertial>& d_pi,
240 : const tnsr::ijaa<DataVector, 3, Frame::Inertial>& d_phi,
241 :
242 : const tnsr::i<DataVector, 3, Frame::Inertial>& d_psi_scalar,
243 : const tnsr::i<DataVector, 3, Frame::Inertial>& d_pi_scalar,
244 : const tnsr::ij<DataVector, 3, Frame::Inertial>& d_phi_scalar) const;
245 :
246 : private:
247 : gh::BoundaryConditions::ConstraintPreservingBjorhus<3>
248 0 : constraint_preserving_{};
249 : CurvedScalarWave::BoundaryConditions::ConstraintPreservingSphericalRadiation<
250 : 3>
251 0 : csw_constraint_preserving_{};
252 : };
253 : } // namespace ScalarTensor::BoundaryConditions
|