Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include "DataStructures/DataBox/DataBoxTag.hpp"
7 : #include "DataStructures/Tensor/TypeAliases.hpp"
8 : #include "DataStructures/Variables.hpp"
9 : #include "Evolution/Systems/GrMhd/ValenciaDivClean/TagsDeclarations.hpp"
10 : #include "NumericalAlgorithms/LinearOperators/PartialDerivatives.hpp"
11 : #include "PointwiseFunctions/GeneralRelativity/TagsDeclarations.hpp"
12 : #include "PointwiseFunctions/Hydro/Tags.hpp"
13 : #include "PointwiseFunctions/Hydro/TagsDeclarations.hpp"
14 : #include "Utilities/TMPL.hpp"
15 :
16 : /// \cond
17 : namespace gsl {
18 : template <typename T>
19 : class not_null;
20 : } // namespace gsl
21 :
22 : class DataVector;
23 : /// \endcond
24 :
25 : namespace grmhd::ValenciaDivClean {
26 : /*!
27 : * \brief Compute the time derivative of the conserved variables for the
28 : * Valencia formulation of the GRMHD equations with divergence cleaning.
29 : */
30 1 : struct TimeDerivativeTerms {
31 0 : struct MagneticFieldOneForm : db::SimpleTag {
32 0 : using type = tnsr::i<DataVector, 3, Frame::Inertial>;
33 : };
34 0 : struct TildeSUp : db::SimpleTag {
35 0 : using type = tnsr::I<DataVector, 3, Frame::Inertial>;
36 : };
37 0 : struct DensitizedStress : db::SimpleTag {
38 0 : using type = tnsr::II<DataVector, 3, Frame::Inertial>;
39 : };
40 0 : struct OneOverLorentzFactorSquared : db::SimpleTag {
41 0 : using type = Scalar<DataVector>;
42 : };
43 0 : struct PressureStarLapseSqrtDetSpatialMetric : db::SimpleTag {
44 0 : using type = Scalar<DataVector>;
45 : };
46 0 : struct PressureStar : db::SimpleTag {
47 0 : using type = Scalar<DataVector>;
48 : };
49 0 : struct EnthalpyTimesDensityWSquaredPlusBSquared : db::SimpleTag {
50 0 : using type = Scalar<DataVector>;
51 : };
52 0 : struct LapseTimesbOverW : db::SimpleTag {
53 0 : using type = tnsr::i<DataVector, 3, Frame::Inertial>;
54 : };
55 :
56 0 : using temporary_tags = tmpl::list<
57 : // Flux terms
58 : hydro::Tags::SpatialVelocityOneForm<DataVector, 3, Frame::Inertial>,
59 : hydro::Tags::MagneticFieldOneForm<DataVector, 3, Frame::Inertial>,
60 : hydro::Tags::MagneticFieldDotSpatialVelocity<DataVector>,
61 : hydro::Tags::MagneticFieldSquared<DataVector>,
62 : OneOverLorentzFactorSquared, PressureStar,
63 : PressureStarLapseSqrtDetSpatialMetric,
64 : hydro::Tags::TransportVelocity<DataVector, 3, Frame::Inertial>,
65 : LapseTimesbOverW,
66 :
67 : // Source terms
68 : TildeSUp, DensitizedStress,
69 : gr::Tags::SpatialChristoffelFirstKind<DataVector, 3>,
70 : gr::Tags::SpatialChristoffelSecondKind<DataVector, 3>,
71 : gr::Tags::TraceSpatialChristoffelSecondKind<DataVector, 3>,
72 : EnthalpyTimesDensityWSquaredPlusBSquared,
73 :
74 : // Need lapse, shift, and inverse spatial metric to be projected to the
75 : // boundary for Riemann solvers.
76 : gr::Tags::Lapse<DataVector>, gr::Tags::Shift<DataVector, 3>,
77 : gr::Tags::InverseSpatialMetric<DataVector, 3>>;
78 0 : using argument_tags =
79 : tmpl::list<grmhd::ValenciaDivClean::Tags::TildeD,
80 : grmhd::ValenciaDivClean::Tags::TildeYe,
81 : grmhd::ValenciaDivClean::Tags::TildeTau,
82 : grmhd::ValenciaDivClean::Tags::TildeS<>,
83 : grmhd::ValenciaDivClean::Tags::TildeB<>,
84 : grmhd::ValenciaDivClean::Tags::TildePhi,
85 : gr::Tags::Lapse<DataVector>, gr::Tags::Shift<DataVector, 3>,
86 : gr::Tags::SqrtDetSpatialMetric<DataVector>,
87 : gr::Tags::SpatialMetric<DataVector, 3>,
88 : gr::Tags::InverseSpatialMetric<DataVector, 3>,
89 : ::Tags::deriv<gr::Tags::Lapse<DataVector>, tmpl::size_t<3>,
90 : Frame::Inertial>,
91 : ::Tags::deriv<gr::Tags::Shift<DataVector, 3>, tmpl::size_t<3>,
92 : Frame::Inertial>,
93 : ::Tags::deriv<gr::Tags::SpatialMetric<DataVector, 3>,
94 : tmpl::size_t<3>, Frame::Inertial>,
95 : hydro::Tags::Pressure<DataVector>,
96 : hydro::Tags::SpatialVelocity<DataVector, 3>,
97 : hydro::Tags::LorentzFactor<DataVector>,
98 : hydro::Tags::MagneticField<DataVector, 3>,
99 : hydro::Tags::RestMassDensity<DataVector>,
100 : hydro::Tags::ElectronFraction<DataVector>,
101 : hydro::Tags::SpecificInternalEnergy<DataVector>,
102 : gr::Tags::ExtrinsicCurvature<DataVector, 3>,
103 : grmhd::ValenciaDivClean::Tags::ConstraintDampingParameter>;
104 :
105 0 : static void apply(
106 : gsl::not_null<Scalar<DataVector>*> /*non_flux_terms_dt_tilde_d*/,
107 : gsl::not_null<Scalar<DataVector>*> /*non_flux_terms_dt_tilde_ye*/,
108 : gsl::not_null<Scalar<DataVector>*> non_flux_terms_dt_tilde_tau,
109 : gsl::not_null<tnsr::i<DataVector, 3, Frame::Inertial>*>
110 : non_flux_terms_dt_tilde_s,
111 : gsl::not_null<tnsr::I<DataVector, 3, Frame::Inertial>*>
112 : non_flux_terms_dt_tilde_b,
113 : gsl::not_null<Scalar<DataVector>*> non_flux_terms_dt_tilde_phi,
114 :
115 : gsl::not_null<tnsr::I<DataVector, 3, Frame::Inertial>*> tilde_d_flux,
116 : gsl::not_null<tnsr::I<DataVector, 3, Frame::Inertial>*> tilde_ye_flux,
117 : gsl::not_null<tnsr::I<DataVector, 3, Frame::Inertial>*> tilde_tau_flux,
118 : gsl::not_null<tnsr::Ij<DataVector, 3, Frame::Inertial>*> tilde_s_flux,
119 : gsl::not_null<tnsr::IJ<DataVector, 3, Frame::Inertial>*> tilde_b_flux,
120 : gsl::not_null<tnsr::I<DataVector, 3, Frame::Inertial>*> tilde_phi_flux,
121 :
122 : gsl::not_null<tnsr::i<DataVector, 3, Frame::Inertial>*>
123 : spatial_velocity_one_form,
124 : gsl::not_null<tnsr::i<DataVector, 3, Frame::Inertial>*>
125 : magnetic_field_one_form,
126 : gsl::not_null<Scalar<DataVector>*> magnetic_field_dot_spatial_velocity,
127 : gsl::not_null<Scalar<DataVector>*> magnetic_field_squared,
128 : gsl::not_null<Scalar<DataVector>*> one_over_w_squared,
129 : gsl::not_null<Scalar<DataVector>*> pressure_star,
130 : gsl::not_null<Scalar<DataVector>*>
131 : pressure_star_lapse_sqrt_det_spatial_metric,
132 : gsl::not_null<tnsr::I<DataVector, 3, Frame::Inertial>*>
133 : transport_velocity,
134 : gsl::not_null<tnsr::i<DataVector, 3, Frame::Inertial>*> lapse_b_over_w,
135 :
136 : gsl::not_null<tnsr::I<DataVector, 3, Frame::Inertial>*> tilde_s_up,
137 : gsl::not_null<tnsr::II<DataVector, 3, Frame::Inertial>*>
138 : densitized_stress,
139 : gsl::not_null<tnsr::ijj<DataVector, 3, Frame::Inertial>*>
140 : spatial_christoffel_first_kind,
141 : gsl::not_null<tnsr::Ijj<DataVector, 3, Frame::Inertial>*>
142 : spatial_christoffel_second_kind,
143 : gsl::not_null<tnsr::I<DataVector, 3, Frame::Inertial>*>
144 : trace_spatial_christoffel_second,
145 : gsl::not_null<Scalar<DataVector>*> h_rho_w_squared_plus_b_squared,
146 :
147 : gsl::not_null<Scalar<DataVector>*> temp_lapse,
148 : gsl::not_null<tnsr::I<DataVector, 3, Frame::Inertial>*> temp_shift,
149 : gsl::not_null<tnsr::II<DataVector, 3, Frame::Inertial>*>
150 : temp_inverse_spatial_metric,
151 :
152 : const Scalar<DataVector>& tilde_d, const Scalar<DataVector>& tilde_ye,
153 : const Scalar<DataVector>& tilde_tau,
154 : const tnsr::i<DataVector, 3, Frame::Inertial>& tilde_s,
155 : const tnsr::I<DataVector, 3, Frame::Inertial>& tilde_b,
156 : const Scalar<DataVector>& tilde_phi, const Scalar<DataVector>& lapse,
157 : const tnsr::I<DataVector, 3, Frame::Inertial>& shift,
158 : const Scalar<DataVector>& sqrt_det_spatial_metric,
159 : const tnsr::ii<DataVector, 3, Frame::Inertial>& spatial_metric,
160 : const tnsr::II<DataVector, 3, Frame::Inertial>& inv_spatial_metric,
161 : const tnsr::i<DataVector, 3, Frame::Inertial>& d_lapse,
162 : const tnsr::iJ<DataVector, 3, Frame::Inertial>& d_shift,
163 : const tnsr::ijj<DataVector, 3, Frame::Inertial>& d_spatial_metric,
164 : const Scalar<DataVector>& pressure,
165 : const tnsr::I<DataVector, 3, Frame::Inertial>& spatial_velocity,
166 : const Scalar<DataVector>& lorentz_factor,
167 : const tnsr::I<DataVector, 3, Frame::Inertial>& magnetic_field,
168 :
169 : const Scalar<DataVector>& rest_mass_density,
170 : const Scalar<DataVector>& electron_fraction,
171 : const Scalar<DataVector>& specific_internal_energy,
172 : const tnsr::ii<DataVector, 3, Frame::Inertial>& extrinsic_curvature,
173 : double constraint_damping_parameter);
174 : };
175 : } // namespace grmhd::ValenciaDivClean
|