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
|