Skip to content

Commit f44a52e

Browse files
Add source terms for ValenciaDivClean with Cartoon
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent adb23fb commit f44a52e

7 files changed

Lines changed: 1222 additions & 10 deletions

File tree

src/Evolution/Systems/GrMhd/ValenciaDivClean/Sources.cpp

Lines changed: 111 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,13 @@
1313
#include "DataStructures/Tensor/Tensor.hpp"
1414
#include "DataStructures/Variables.hpp"
1515
#include "Evolution/Systems/GrMhd/ValenciaDivClean/Tags.hpp"
16+
#include "NumericalAlgorithms/Spectral/Mesh.hpp"
17+
#include "NumericalAlgorithms/Spectral/Quadrature.hpp"
1618
#include "PointwiseFunctions/GeneralRelativity/Christoffel.hpp"
1719
#include "PointwiseFunctions/GeneralRelativity/Tags.hpp"
20+
#include "PointwiseFunctions/Hydro/ComovingMagneticField.hpp"
1821
#include "PointwiseFunctions/Hydro/Tags.hpp"
22+
#include "PointwiseFunctions/Hydro/TransportVelocity.hpp"
1923
#include "Utilities/ConstantExpressions.hpp"
2024
#include "Utilities/Gsl.hpp"
2125

@@ -65,6 +69,9 @@ struct PressureStar : db::SimpleTag {
6569
struct EnthalpyTimesDensityWSquaredPlusBSquared : db::SimpleTag {
6670
using type = Scalar<DataVector>;
6771
};
72+
struct ComovingMagneticFieldOneForm : db::SimpleTag {
73+
using type = tnsr::a<DataVector, 3, Frame::Inertial>;
74+
};
6875
} // namespace
6976

7077
namespace grmhd::ValenciaDivClean {
@@ -165,6 +172,97 @@ void sources_impl(
165172
get(*source_tilde_phi) += tilde_b.get(m) * d_lapse.get(m);
166173
}
167174
}
175+
176+
void cartoon_sources_impl(
177+
const gsl::not_null<tnsr::i<DataVector, 3, Frame::Inertial>*>
178+
source_tilde_s,
179+
const gsl::not_null<tnsr::I<DataVector, 3, Frame::Inertial>*>
180+
source_tilde_b,
181+
182+
const Scalar<DataVector>& pressure_star,
183+
const tnsr::i<DataVector, 3, Frame::Inertial>& magnetic_field_one_form,
184+
const Scalar<DataVector>& magnetic_field_dot_spatial_velocity,
185+
186+
const tnsr::i<DataVector, 3, Frame::Inertial>& tilde_s,
187+
const tnsr::I<DataVector, 3, Frame::Inertial>& tilde_b,
188+
const Scalar<DataVector>& tilde_phi,
189+
const tnsr::I<DataVector, 3, Frame::Inertial>& spatial_velocity,
190+
const Scalar<DataVector>& lorentz_factor, const Scalar<DataVector>& lapse,
191+
const tnsr::I<DataVector, 3, Frame::Inertial>& shift,
192+
const tnsr::ii<DataVector, 3, Frame::Inertial>& spatial_metric,
193+
const tnsr::II<DataVector, 3, Frame::Inertial>& inv_spatial_metric,
194+
const Scalar<DataVector>& sqrt_det_spatial_metric,
195+
const tnsr::I<DataVector, 3, Frame::Inertial>& inertial_coords,
196+
const Spectral::Quadrature cartoon_quadrature) {
197+
#ifdef SPECTRE_DEBUG
198+
for (size_t i = 0; i < get<0>(inertial_coords).size(); ++i) {
199+
ASSERT(not equal_within_roundoff(
200+
0.0, get<0>(inertial_coords)[i],
201+
std::numeric_limits<double>::epsilon() * 100.0,
202+
max(get<0>(inertial_coords))),
203+
"Computing cartoon source terms with x=0 in domain, got "
204+
"inertial_coords = "
205+
<< inertial_coords);
206+
}
207+
#endif // SPECTRE_DEBUG
208+
if (cartoon_quadrature == Spectral::Quadrature::SphericalSymmetry) {
209+
get<0>(*source_tilde_s) += 2.0 * get(lapse) * get(sqrt_det_spatial_metric) *
210+
get(pressure_star) / get<0>(inertial_coords);
211+
get<0>(*source_tilde_b) +=
212+
get(lapse) *
213+
(get<1, 1>(inv_spatial_metric) + get<2, 2>(inv_spatial_metric)) *
214+
get(tilde_phi) / get<0>(inertial_coords);
215+
} else {
216+
ASSERT(
217+
cartoon_quadrature == Spectral::Quadrature::AxialSymmetry,
218+
"Got unexpected quadrature for Cartoon basis: " << cartoon_quadrature);
219+
220+
Variables<tmpl::list<hydro::Tags::SpatialVelocityOneForm<DataVector, 3>,
221+
ComovingMagneticFieldOneForm,
222+
hydro::Tags::TransportVelocity<DataVector, 3>>>
223+
temp_tensors(get<0>(inertial_coords).size());
224+
225+
auto& spatial_velocity_one_form =
226+
get<hydro::Tags::SpatialVelocityOneForm<DataVector, 3>>(temp_tensors);
227+
raise_or_lower_index(make_not_null(&spatial_velocity_one_form),
228+
spatial_velocity, spatial_metric);
229+
230+
auto& comoving_magnetic_field_one_form =
231+
get<ComovingMagneticFieldOneForm>(temp_tensors);
232+
hydro::comoving_magnetic_field_one_form(
233+
make_not_null(&comoving_magnetic_field_one_form),
234+
spatial_velocity_one_form, magnetic_field_one_form,
235+
magnetic_field_dot_spatial_velocity, lorentz_factor, shift, lapse);
236+
237+
auto& transport_velocity =
238+
get<hydro::Tags::TransportVelocity<DataVector, 3>>(temp_tensors);
239+
hydro::transport_velocity(make_not_null(&transport_velocity),
240+
spatial_velocity, lapse, shift);
241+
242+
get<0>(*source_tilde_s) +=
243+
(get(lapse) * get(sqrt_det_spatial_metric) * get(pressure_star) +
244+
get(lapse) * get<2>(tilde_b) *
245+
(-get<3>(comoving_magnetic_field_one_form)) / get(lorentz_factor) +
246+
(get<2>(tilde_s)) * get<2>(transport_velocity)) /
247+
get<0>(inertial_coords);
248+
get<2>(*source_tilde_s) +=
249+
(get(lapse) * get<2>(tilde_b) *
250+
(get<1>(comoving_magnetic_field_one_form)) / get(lorentz_factor) +
251+
(-get<0>(tilde_s)) * get<2>(transport_velocity)) /
252+
get<0>(inertial_coords);
253+
254+
get<0>(*source_tilde_b) +=
255+
(get(lapse) * (get<2, 2>(inv_spatial_metric)) * get(tilde_phi) +
256+
get(lapse) * (-get<2>(spatial_velocity)) * get<2>(tilde_b) +
257+
(get<2>(tilde_b)) * get<2>(transport_velocity)) /
258+
get<0>(inertial_coords);
259+
get<2>(*source_tilde_b) +=
260+
(get(lapse) * (-get<2, 0>(inv_spatial_metric)) * get(tilde_phi) +
261+
get(lapse) * (get<0>(spatial_velocity)) * get<2>(tilde_b) +
262+
(-get<0>(tilde_b)) * get<2>(transport_velocity)) /
263+
get<0>(inertial_coords);
264+
}
265+
}
168266
} // namespace detail
169267

170268
void ComputeSources::apply(
@@ -186,14 +284,17 @@ void ComputeSources::apply(
186284
const Scalar<DataVector>& specific_internal_energy,
187285
const Scalar<DataVector>& lorentz_factor,
188286
const Scalar<DataVector>& pressure, const Scalar<DataVector>& lapse,
287+
const tnsr::I<DataVector, 3, Frame::Inertial>& shift,
189288
const tnsr::i<DataVector, 3, Frame::Inertial>& d_lapse,
190289
const tnsr::iJ<DataVector, 3, Frame::Inertial>& d_shift,
191290
const tnsr::ii<DataVector, 3, Frame::Inertial>& spatial_metric,
192291
const tnsr::ijj<DataVector, 3, Frame::Inertial>& d_spatial_metric,
193292
const tnsr::II<DataVector, 3, Frame::Inertial>& inv_spatial_metric,
194293
const Scalar<DataVector>& sqrt_det_spatial_metric,
195294
const tnsr::ii<DataVector, 3, Frame::Inertial>& extrinsic_curvature,
196-
const double constraint_damping_parameter) {
295+
const double constraint_damping_parameter,
296+
const tnsr::I<DataVector, 3, Frame::Inertial>& inertial_coords,
297+
const Mesh<3>& dg_mesh) {
197298
Variables<
198299
tmpl::list<TildeSUp, DensitizedStress, MagneticFieldOneForm,
199300
hydro::Tags::MagneticFieldDotSpatialVelocity<DataVector>,
@@ -260,5 +361,14 @@ void ComputeSources::apply(
260361

261362
rest_mass_density, electron_fraction, pressure, specific_internal_energy,
262363
extrinsic_curvature, constraint_damping_parameter);
364+
365+
if (dg_mesh.basis(2) == Spectral::Basis::Cartoon) {
366+
detail::cartoon_sources_impl(
367+
source_tilde_s, source_tilde_b, pressure_star, magnetic_field_oneform,
368+
magnetic_field_dot_spatial_velocity, tilde_s, tilde_b, tilde_phi,
369+
spatial_velocity, lorentz_factor, lapse, shift, spatial_metric,
370+
inv_spatial_metric, sqrt_det_spatial_metric, inertial_coords,
371+
dg_mesh.quadrature(2));
372+
}
263373
}
264374
} // namespace grmhd::ValenciaDivClean

src/Evolution/Systems/GrMhd/ValenciaDivClean/Sources.hpp

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,20 @@
44
#pragma once
55

66
#include "DataStructures/Tensor/TypeAliases.hpp"
7+
#include "Domain/Tags.hpp"
8+
#include "Evolution/DgSubcell/Tags/Coordinates.hpp"
79
#include "Evolution/Systems/GrMhd/ValenciaDivClean/TagsDeclarations.hpp"
810
#include "NumericalAlgorithms/LinearOperators/PartialDerivatives.hpp"
11+
#include "NumericalAlgorithms/Spectral/Quadrature.hpp"
912
#include "PointwiseFunctions/GeneralRelativity/TagsDeclarations.hpp"
1013
#include "PointwiseFunctions/Hydro/Tags.hpp"
1114
#include "PointwiseFunctions/Hydro/TagsDeclarations.hpp"
1215
#include "Utilities/TMPL.hpp"
1316

1417
/// \cond
1518
class DataVector;
19+
template <size_t Dim>
20+
class Mesh;
1621

1722
namespace Tags {
1823
template <typename>
@@ -23,6 +28,26 @@ struct Source;
2328
namespace grmhd {
2429
namespace ValenciaDivClean {
2530
namespace detail {
31+
void cartoon_sources_impl(
32+
gsl::not_null<tnsr::i<DataVector, 3, Frame::Inertial>*> source_tilde_s,
33+
gsl::not_null<tnsr::I<DataVector, 3, Frame::Inertial>*> source_tilde_b,
34+
35+
const Scalar<DataVector>& pressure_star,
36+
const tnsr::i<DataVector, 3, Frame::Inertial>& magnetic_field_one_form,
37+
const Scalar<DataVector>& magnetic_field_dot_spatial_velocity,
38+
39+
const tnsr::i<DataVector, 3, Frame::Inertial>& tilde_s,
40+
const tnsr::I<DataVector, 3, Frame::Inertial>& tilde_b,
41+
const Scalar<DataVector>& tilde_phi,
42+
const tnsr::I<DataVector, 3, Frame::Inertial>& spatial_velocity,
43+
const Scalar<DataVector>& lorentz_factor, const Scalar<DataVector>& lapse,
44+
const tnsr::I<DataVector, 3, Frame::Inertial>& shift,
45+
const tnsr::ii<DataVector, 3, Frame::Inertial>& spatial_metric,
46+
const tnsr::II<DataVector, 3, Frame::Inertial>& inv_spatial_metric,
47+
const Scalar<DataVector>& sqrt_det_spatial_metric,
48+
const tnsr::I<DataVector, 3, Frame::Inertial>& inertial_coords,
49+
Spectral::Quadrature cartoon_quadrature);
50+
2651
void sources_impl(
2752
gsl::not_null<Scalar<DataVector>*> source_tilde_tau,
2853
gsl::not_null<tnsr::i<DataVector, 3, Frame::Inertial>*> source_tilde_s,
@@ -113,6 +138,31 @@ void sources_impl(
113138
* of the divergence-free (no-monopole) condition \f$\Phi = \partial_i {\tilde
114139
* B}^i = 0\f$ .
115140
*
141+
* When using the cartoon method, the flux of vector-quantity conserved
142+
* variables result in terms that are not flux-like but can be interpreted as
143+
* sources. For spherical symmetry these extra source terms are
144+
* \f{align*}
145+
* S(\tilde{S}_i) &= \frac{2}{x} \alpha \sqrt{\gamma} (p + p_m) \\
146+
* S(\tilde{B}^i) &= \frac{1}{x} \alpha (\gamma^{yy} + \gamma^{zz}) \tilde{\Phi}
147+
* \f}
148+
*
149+
* and for axial symmetry they are
150+
* \f{align*}
151+
* S(\tilde{S}_i) &=
152+
* \frac{1}{x} \left( \alpha \sqrt{\gamma} (p + p_m) +
153+
* (\tilde{S}_z - \tilde{S}_x ) v^z_\mathrm{tr} +
154+
* \frac{\alpha}{W} (b_x - b_z) \tilde{B}^z \right) \\
155+
* S(\tilde{B}^i) &=
156+
* \frac{1}{x} \left( \alpha (\gamma^{zz}- \gamma^{zx}) \tilde{\Phi}
157+
* + \alpha (v^x - v^z) \tilde{B}^z +
158+
* (\tilde{B}^z - \tilde{B}^x) v^z_\mathrm{tr} \right),
159+
* \f}
160+
*
161+
* where \f$v^i_\mathrm{tr} = \alpha v^i - \beta^i\f$ is the transport
162+
* velocity. These terms are associated with the $x$ component of
163+
* $\tilde{S}_j$ and $\tilde{B}^j$ because that is the divergence direction we
164+
* have cartoonified.
165+
*
116166
* \note For the electron fraction side, the source term is currently set to
117167
* \f$S(\tilde{Y}_e) = 0\f$ where the conserved variable \f$\tilde{Y}_e\f$ is a
118168
* generalized electron fraction. Implementing the source term using neutrino
@@ -140,6 +190,7 @@ struct ComputeSources {
140190
hydro::Tags::SpecificInternalEnergy<DataVector>,
141191
hydro::Tags::LorentzFactor<DataVector>,
142192
hydro::Tags::Pressure<DataVector>, gr::Tags::Lapse<DataVector>,
193+
gr::Tags::Shift<DataVector, 3>,
143194
::Tags::deriv<gr::Tags::Lapse<DataVector>, tmpl::size_t<3>,
144195
Frame::Inertial>,
145196
::Tags::deriv<gr::Tags::Shift<DataVector, 3>, tmpl::size_t<3>,
@@ -150,7 +201,9 @@ struct ComputeSources {
150201
gr::Tags::InverseSpatialMetric<DataVector, 3>,
151202
gr::Tags::SqrtDetSpatialMetric<DataVector>,
152203
gr::Tags::ExtrinsicCurvature<DataVector, 3>,
153-
grmhd::ValenciaDivClean::Tags::ConstraintDampingParameter>;
204+
grmhd::ValenciaDivClean::Tags::ConstraintDampingParameter,
205+
evolution::dg::subcell::Tags::Coordinates<3, Frame::Inertial>,
206+
domain::Tags::Mesh<3>>;
154207

155208
static void apply(
156209
gsl::not_null<Scalar<DataVector>*> source_tilde_tau,
@@ -169,14 +222,17 @@ struct ComputeSources {
169222
const Scalar<DataVector>& specific_internal_energy,
170223
const Scalar<DataVector>& lorentz_factor,
171224
const Scalar<DataVector>& pressure, const Scalar<DataVector>& lapse,
225+
const tnsr::I<DataVector, 3, Frame::Inertial>& shift,
172226
const tnsr::i<DataVector, 3, Frame::Inertial>& d_lapse,
173227
const tnsr::iJ<DataVector, 3, Frame::Inertial>& d_shift,
174228
const tnsr::ii<DataVector, 3, Frame::Inertial>& spatial_metric,
175229
const tnsr::ijj<DataVector, 3, Frame::Inertial>& d_spatial_metric,
176230
const tnsr::II<DataVector, 3, Frame::Inertial>& inv_spatial_metric,
177231
const Scalar<DataVector>& sqrt_det_spatial_metric,
178232
const tnsr::ii<DataVector, 3, Frame::Inertial>& extrinsic_curvature,
179-
double constraint_damping_parameter);
233+
double constraint_damping_parameter,
234+
const tnsr::I<DataVector, 3, Frame::Inertial>& inertial_coords,
235+
const Mesh<3>& dg_mesh);
180236
};
181237
} // namespace ValenciaDivClean
182238
} // namespace grmhd

tests/Unit/Evolution/Systems/GrMhd/ValenciaDivClean/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ target_link_libraries(
6262
Hydro
6363
HydroHelpers
6464
Importers
65+
LinearOperators
6566
Utilities
6667
ValenciaDivClean
6768
)

tests/Unit/Evolution/Systems/GrMhd/ValenciaDivClean/Sources.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ def source_tilde_tau(
6666
lorentz_factor,
6767
pressure,
6868
lapse,
69+
shift,
6970
d_lapse,
7071
d_shift,
7172
spatial_metric,
@@ -106,6 +107,7 @@ def source_tilde_s(
106107
lorentz_factor,
107108
pressure,
108109
lapse,
110+
shift,
109111
d_lapse,
110112
d_shift,
111113
spatial_metric,
@@ -148,6 +150,7 @@ def source_tilde_b(
148150
lorentz_factor,
149151
pressure,
150152
lapse,
153+
shift,
151154
d_lapse,
152155
d_shift,
153156
spatial_metric,
@@ -186,6 +189,7 @@ def source_tilde_phi(
186189
lorentz_factor,
187190
pressure,
188191
lapse,
192+
shift,
189193
d_lapse,
190194
d_shift,
191195
spatial_metric,

0 commit comments

Comments
 (0)