Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <array>
7 : #include <cstddef>
8 : #include <optional>
9 : #include <string>
10 :
11 : #include "DataStructures/Tensor/TypeAliases.hpp"
12 : #include "NumericalAlgorithms/LinearOperators/PartialDerivatives.hpp"
13 : #include "Options/String.hpp"
14 : #include "PointwiseFunctions/AnalyticData/AnalyticData.hpp"
15 : #include "PointwiseFunctions/AnalyticData/GrMhd/AnalyticData.hpp"
16 : #include "PointwiseFunctions/Hydro/EquationsOfState/PolytropicFluid.hpp"
17 : #include "PointwiseFunctions/Hydro/Temperature.hpp"
18 : #include "PointwiseFunctions/Hydro/Units.hpp"
19 : #include "PointwiseFunctions/InitialDataUtilities/InitialData.hpp"
20 : #include "Utilities/TMPL.hpp"
21 : #include "Utilities/TaggedTuple.hpp"
22 :
23 : namespace grmhd::AnalyticData {
24 : namespace detail {
25 : /*!
26 : * \brief Read a massive star supernova progenitor from file.
27 : */
28 : class ProgenitorProfile {
29 : public:
30 : ProgenitorProfile() = default;
31 :
32 : ProgenitorProfile(const std::string& filename);
33 : // interpolate function
34 : std::array<double, 6> interpolate(double target_radius,
35 : double target_cos_theta,
36 : bool interpolate_hydro_vars) const;
37 :
38 : double polytropic_index() const { return polytropic_index_; }
39 :
40 : double max_radius() const { return maximum_radius_; }
41 :
42 : // Change private density ratio based on user-defined value,
43 : // accessed in CCSNCollapse() call
44 : void set_dens_ratio(double max_dens_ratio) {
45 : max_density_ratio_for_linear_interpolation_ = max_dens_ratio;
46 : }
47 :
48 : void pup(PUP::er& p);
49 :
50 : private:
51 : double maximum_radius_{std::numeric_limits<double>::signaling_NaN()};
52 : double max_density_ratio_for_linear_interpolation_{
53 : std::numeric_limits<double>::signaling_NaN()};
54 : double polytropic_index_{std::numeric_limits<double>::signaling_NaN()};
55 : size_t num_radial_points_{std::numeric_limits<size_t>::max()};
56 : size_t num_angular_points_{std::numeric_limits<size_t>::max()};
57 : size_t num_grid_points_{std::numeric_limits<size_t>::max()};
58 :
59 : // Begin constants to translate units from cgs to c=G=M_Sun=(k_Boltzmann=1)=1
60 : // Divide cm/s by speed_of_light_cgs_ to get into c=G=M_Sun=1 units
61 : static constexpr double speed_of_light_cgs_ =
62 : hydro::units::cgs::speed_of_light;
63 :
64 : // Multiply cm by c2g_length_ to get into c=G=M_Sun=1 units
65 : // (speed of light)^2 / (Newton's constant * Msun)
66 : // c2g_length_ = c^2 / (G*M_Sun)
67 : // c2g_length_~6.7706e-6 [1/cm]
68 : static constexpr double g_times_m_sun_ =
69 : hydro::units::cgs::G_Newton_times_m_sun;
70 : static constexpr double c2g_length_ = 1.0 / hydro::units::cgs::length_unit;
71 :
72 : // Multiply g/cm^3 by c2g_dens_ to get into c=G=M_Sun=1 units
73 : // c2g_dens_ = (G*M_Sun)^2*G/c^6.
74 : // Note G = 6.67430x10^-8.
75 : // While G is not known to as many significant figures as G*M_Sun,
76 : // it's uncertainty is still less than that of the maximum mass of
77 : // a neutron star (~1%~10%), a quantity assumed to be 2.2 M_Sun when
78 : // converting to c=G=M_Sun=1 units; see
79 : // https://iopscience.iop.org/article/10.3847/2041-8213/aaa401.
80 : // c2g_dens_~1.61887e-18 [cm^3/g]
81 : static constexpr double newtons_grav_constant_ = hydro::units::cgs::G_Newton;
82 : static constexpr double c2g_dens_ =
83 : 1.0 / hydro::units::cgs::rest_mass_density_unit;
84 :
85 : // Multiply Kelvin by c2g_temp_ to get into c=G=M_Sun=k_Boltzmann=1 units.
86 : // c2g_temp_ = (k_B/(M_Sun*c^2))
87 : // c2g_temp_=7.72567e-71
88 : static constexpr double boltzmann_constant_ = hydro::units::cgs::k_Boltzmann;
89 : // Note setting MSun=1.0 is a choice made independent of EoS,
90 : // so that there are no unit ambiguities between 2 simulations
91 : // ran with different EoSs (e.g., polytropic vs. tabulated)
92 : static constexpr double m_sun_ = hydro::units::cgs::mass_unit;
93 : static constexpr double c2g_temp_ =
94 : boltzmann_constant_ / (m_sun_ * square(speed_of_light_cgs_));
95 :
96 : // readin data
97 : DataVector radius_;
98 : DataVector rest_mass_density_;
99 : DataVector fluid_velocity_;
100 : DataVector electron_fraction_;
101 : DataVector chi_;
102 : DataVector metric_potential_;
103 : DataVector temperature_;
104 : };
105 : } // namespace detail
106 :
107 : /*!
108 : * \brief Evolve a stellar collapse (progenitor) profile through collapse.
109 : *
110 : * Read the 1D core-collapse supernova (CCSN) profile from file, assuming
111 : * the following format of the data:
112 : * * 1st row - number of radial points in data set, followed by 6 columns of 0s
113 : * * Subsequent rows contain these column headers:
114 : * * radius, rest mass density, specific internal energy, radial velocity,
115 : * electron fraction, \f$X\f$, \f$\Phi\f$.
116 : *
117 : * These columns assume a metric of the form \f$ds^2 = -e^{2\Phi} dt^2 +
118 : * X^2 dr^2 + r^2 d\theta^2 + r^2 \sin^2\theta d\phi^2\f$, following
119 : * \cite Oconnor2015.
120 : *
121 : * Units:
122 : * The input file is assumed to be in cgs units and
123 : * will be converted to dimensionless units upon
124 : * readin, setting \f$c = G = M_\odot = 1\f$.
125 : *
126 : * Rotation:
127 : * Once the stationary progenitor is constructed, an artificial
128 : * rotation profile can be assigned to the matter. It takes the form
129 : * \f$\Omega(r) = \Omega_0/(1 + (r_\perp/A)^2)\f$, where \f$\Omega_0\f$ is
130 : * the central rotation rate, \f$r_\perp\f$ is the distance from the rotation
131 : * axis, and \f$A\f$ is the differential rotation parameter. Large values
132 : * of \f$A\f$ correspond to more solid-body rotation. Small values correspond
133 : * to stronger differential rotation. The axis of rotation is assumed to
134 : * be the z axis.
135 : *
136 : */
137 1 : class CcsnCollapse : public virtual evolution::initial_data::InitialData,
138 : public MarkAsAnalyticData,
139 : public AnalyticDataBase,
140 : public hydro::TemperatureInitialization<CcsnCollapse> {
141 : template <typename DataType>
142 0 : struct IntermediateVariables {
143 0 : IntermediateVariables(
144 : const tnsr::I<DataType, 3, Frame::Inertial>& in_coords,
145 : double in_delta_r);
146 :
147 0 : struct MetricData {
148 0 : MetricData() = default;
149 0 : MetricData(size_t num_points);
150 0 : DataType chi;
151 0 : DataType metric_potential;
152 : };
153 :
154 0 : const tnsr::I<DataType, 3, Frame::Inertial>& coords;
155 0 : DataType radius;
156 0 : DataType phi;
157 0 : DataType cos_theta;
158 0 : DataType sin_theta;
159 0 : double delta_r;
160 :
161 0 : std::optional<DataType> rest_mass_density;
162 0 : std::optional<DataType> fluid_velocity;
163 0 : std::optional<DataType> electron_fraction;
164 0 : std::optional<DataType> temperature;
165 0 : std::optional<MetricData> metric_data;
166 : // Data for 2nd-order FD derivatives.
167 : // metric info at different indices for finite differences
168 0 : std::optional<std::array<MetricData, 3>> metric_data_upper{};
169 0 : std::optional<std::array<MetricData, 3>> metric_data_lower{};
170 :
171 0 : std::array<DataType, 3> radius_upper{};
172 0 : std::array<DataType, 3> radius_lower{};
173 0 : std::array<DataType, 3> cos_theta_upper{};
174 0 : std::array<DataType, 3> cos_theta_lower{};
175 0 : std::array<DataType, 3> sin_theta_upper{};
176 0 : std::array<DataType, 3> sin_theta_lower{};
177 0 : std::array<DataType, 3> phi_upper{};
178 0 : std::array<DataType, 3> phi_lower{};
179 : };
180 :
181 : public:
182 0 : using equation_of_state_type = EquationsOfState::PolytropicFluid<true>;
183 :
184 : /// The massive star progenitor data file.
185 1 : struct ProgenitorFilename {
186 0 : using type = std::string;
187 0 : static constexpr Options::String help = {
188 : "The supernova progenitor data file."};
189 : };
190 :
191 : /// The polytropic constant of the fluid.
192 : ///
193 : /// The remaining hydrodynamic primitive variables (e.g., pressure)
194 : /// will be calculated based on this \f$K\f$ for \f$P=K\rho^{\Gamma}\f$.
195 1 : struct PolytropicConstant {
196 0 : using type = double;
197 0 : static constexpr Options::String help = {
198 : "The polytropic constant of the fluid."};
199 0 : static type lower_bound() { return 0.; }
200 : };
201 :
202 : /// Adiabatic index of the system at readin.
203 : ///
204 : /// Note the density profile used is from the initial profile calculated from
205 : /// the TOV equations, specified by ProgenitorFilename. A lower, user
206 : /// defined, \f$\Gamma\f$ will cause a lower pressure for an equation of state
207 : /// of the form \f$P=K\rho^{\Gamma}\f$. This effect triggers collapse for
208 : /// simplified CCSN models.
209 1 : struct AdiabaticIndex {
210 0 : using type = double;
211 0 : static constexpr Options::String help = {
212 : "The adiabatic index that will trigger collapse."};
213 0 : static type lower_bound() { return 1.0; }
214 : };
215 :
216 : /// Central angular velocity artificially assigned at readin.
217 : ///
218 : /// Currently limited by the angular velocity of an object rotating in a
219 : /// circle, with radius = 1 cm (well below grid resolution) and
220 : /// transverse velocity = the speed of light.
221 : ///
222 : /// Due to effects from magnetic breaking, more realistic central angular
223 : /// velocities for massive stars are of order 0.1 [radians/sec] ~ 4.93e-7
224 : /// [code units] (see Figure 1 of \cite Pajkos2019 based on results from
225 : /// \cite Heger2005, or see \cite Richers2017 for an exploration of
226 : /// different values).
227 1 : struct CentralAngularVelocity {
228 0 : using type = double;
229 0 : static constexpr Options::String help = {
230 : "Central angular velocity of progenitor"};
231 :
232 0 : static type upper_bound() { return 147670.0; }
233 0 : static type lower_bound() { return -147670.0; }
234 : };
235 :
236 : /// Differential rotation parameter for artificially assigned
237 : /// rotation profile.
238 1 : struct DifferentialRotationParameter {
239 0 : using type = double;
240 0 : static constexpr Options::String help = {
241 : "Differential rotation parameter (large"
242 : " indicates solid body, small very differential)"};
243 : // This is ~1 cm, well below simulation resolution.
244 : // The lower bound is used to ensure a nonzero divisor.
245 0 : static type lower_bound() { return 6.7706e-6; }
246 : };
247 :
248 : /// Maximum density ratio for linear interpolation.
249 : ///
250 : /// If the ratio of two neighboring densities are greater than this value,
251 : /// then interpolation onto the SpECTRE grid reverts to linear, to avoid
252 : /// oscillations. A ratio of 100 is used for the rotating TOV star test
253 : /// and a safe value to use if unsure.
254 1 : struct MaxDensityRatioForLinearInterpolation {
255 0 : using type = double;
256 0 : static constexpr Options::String help = {
257 : "If the ratio between neighboring density points is greater"
258 : " than this parameter, fall back to linear interpolation"
259 : " onto the SpECTRE grid."};
260 0 : static type lower_bound() { return 0.0; }
261 : };
262 :
263 0 : using options =
264 : tmpl::list<ProgenitorFilename, PolytropicConstant, AdiabaticIndex,
265 : CentralAngularVelocity, DifferentialRotationParameter,
266 : MaxDensityRatioForLinearInterpolation>;
267 0 : static constexpr Options::String help = {
268 : "Core collapse supernova initial data, read in from a profile containing"
269 : " hydrodynamic primitives and metric variables. The data "
270 : "are read in from disk."};
271 :
272 0 : CcsnCollapse() = default;
273 0 : CcsnCollapse(const CcsnCollapse& /*rhs*/) = default;
274 0 : CcsnCollapse& operator=(const CcsnCollapse& /*rhs*/) = default;
275 0 : CcsnCollapse(CcsnCollapse&& /*rhs*/) = default;
276 0 : CcsnCollapse& operator=(CcsnCollapse&& /*rhs*/) = default;
277 0 : ~CcsnCollapse() override = default;
278 :
279 0 : CcsnCollapse(std::string progenitor_filename, double polytropic_constant,
280 : double adiabatic_index, double central_angular_velocity,
281 : double diff_rot_parameter, double max_dens_ratio_interp);
282 :
283 0 : auto get_clone() const
284 : -> std::unique_ptr<evolution::initial_data::InitialData> override;
285 :
286 : /// \cond
287 : explicit CcsnCollapse(CkMigrateMessage* msg);
288 : using PUP::able::register_constructor;
289 : WRAPPED_PUPable_decl_template(CcsnCollapse);
290 : /// \endcond
291 :
292 : /// Retrieve a collection of variables at `(x)`
293 : template <typename DataType, typename... Tags>
294 1 : tuples::TaggedTuple<Tags...> variables(const tnsr::I<DataType, 3>& x,
295 : tmpl::list<Tags...> /*meta*/) const {
296 : IntermediateVariables<DataType> intermediate_vars{
297 : x, 1.0e-4 * prog_data_.max_radius()};
298 : return {get<Tags>(variables(make_not_null(&intermediate_vars), x,
299 : tmpl::list<Tags>{}))...};
300 : }
301 :
302 : // NOLINTNEXTLINE(google-runtime-references)
303 0 : void pup(PUP::er& p) override;
304 :
305 0 : const EquationsOfState::PolytropicFluid<true>& equation_of_state() const {
306 : return equation_of_state_;
307 : }
308 :
309 : protected:
310 : template <typename DataType>
311 0 : using DerivLapse = ::Tags::deriv<gr::Tags::Lapse<DataType>, tmpl::size_t<3>,
312 : Frame::Inertial>;
313 :
314 : template <typename DataType>
315 0 : using DerivShift = ::Tags::deriv<gr::Tags::Shift<DataType, 3>,
316 : tmpl::size_t<3>, Frame::Inertial>;
317 :
318 : template <typename DataType>
319 0 : using DerivSpatialMetric = ::Tags::deriv<gr::Tags::SpatialMetric<DataType, 3>,
320 : tmpl::size_t<3>, Frame::Inertial>;
321 :
322 : template <typename DataType>
323 0 : void interpolate_vars_if_necessary(
324 : gsl::not_null<IntermediateVariables<DataType>*> vars) const;
325 :
326 : template <typename DataType>
327 0 : void interpolate_deriv_vars_if_necessary(
328 : gsl::not_null<IntermediateVariables<DataType>*> vars) const;
329 :
330 : template <typename DataType>
331 0 : Scalar<DataType> lapse(const DataType& metric_potential) const;
332 :
333 : template <typename DataType>
334 0 : tnsr::I<DataType, 3, Frame::Inertial> shift(const DataType& radius) const;
335 :
336 : template <typename DataType>
337 0 : tnsr::ii<DataType, 3, Frame::Inertial> spatial_metric(
338 : const DataType& chi, const DataType& cos_theta, const DataType& sin_theta,
339 : const DataType& phi) const;
340 :
341 : template <typename DataType>
342 0 : tnsr::II<DataType, 3, Frame::Inertial> inverse_spatial_metric(
343 : const DataType& chi, const DataType& cos_theta, const DataType& sin_theta,
344 : const DataType& phi) const;
345 :
346 : template <typename DataType>
347 0 : Scalar<DataType> sqrt_det_spatial_metric(const DataType& chi) const;
348 :
349 : template <typename DataType>
350 0 : auto make_metric_data(size_t num_points) const ->
351 : typename IntermediateVariables<DataType>::MetricData;
352 :
353 : public:
354 : template <typename DataType>
355 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
356 : const tnsr::I<DataType, 3>& x,
357 : tmpl::list<hydro::Tags::RestMassDensity<DataType>> /*meta*/)
358 : const -> tuples::TaggedTuple<hydro::Tags::RestMassDensity<DataType>>;
359 :
360 : template <typename DataType>
361 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
362 : const tnsr::I<DataType, 3>& x,
363 : tmpl::list<hydro::Tags::ElectronFraction<DataType>> /*meta*/)
364 : const -> tuples::TaggedTuple<hydro::Tags::ElectronFraction<DataType>>;
365 :
366 : template <typename DataType>
367 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
368 : const tnsr::I<DataType, 3>& x,
369 : tmpl::list<hydro::Tags::SpecificEnthalpy<DataType>> /*meta*/)
370 : const -> tuples::TaggedTuple<hydro::Tags::SpecificEnthalpy<DataType>>;
371 :
372 : template <typename DataType>
373 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
374 : const tnsr::I<DataType, 3>& x,
375 : tmpl::list<hydro::Tags::Pressure<DataType>> /*meta*/) const
376 : -> tuples::TaggedTuple<hydro::Tags::Pressure<DataType>>;
377 :
378 : template <typename DataType>
379 0 : auto variables(
380 : gsl::not_null<IntermediateVariables<DataType>*> vars,
381 : const tnsr::I<DataType, 3>& x,
382 : tmpl::list<hydro::Tags::SpecificInternalEnergy<DataType>> /*meta*/) const
383 : -> tuples::TaggedTuple<hydro::Tags::SpecificInternalEnergy<DataType>>;
384 :
385 : template <typename DataType>
386 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
387 : const tnsr::I<DataType, 3>& x,
388 : tmpl::list<hydro::Tags::Temperature<DataType>> /*meta*/) const
389 : -> tuples::TaggedTuple<hydro::Tags::Temperature<DataType>> {
390 : return TemperatureInitialization::variables(
391 : vars, x, tmpl::list<hydro::Tags::Temperature<DataType>>{});
392 : }
393 :
394 : template <typename DataType>
395 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
396 : const tnsr::I<DataType, 3>& x,
397 : tmpl::list<hydro::Tags::SpatialVelocity<DataType, 3>> /*meta*/)
398 : const -> tuples::TaggedTuple<hydro::Tags::SpatialVelocity<DataType, 3>>;
399 :
400 : template <typename DataType>
401 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
402 : const tnsr::I<DataType, 3>& x,
403 : tmpl::list<hydro::Tags::LorentzFactor<DataType>> /*meta*/)
404 : const -> tuples::TaggedTuple<hydro::Tags::LorentzFactor<DataType>>;
405 :
406 : template <typename DataType>
407 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
408 : const tnsr::I<DataType, 3>& x,
409 : tmpl::list<hydro::Tags::MagneticField<DataType, 3>> /*meta*/)
410 : const -> tuples::TaggedTuple<hydro::Tags::MagneticField<DataType, 3>>;
411 :
412 : template <typename DataType>
413 0 : auto variables(
414 : gsl::not_null<IntermediateVariables<DataType>*> vars,
415 : const tnsr::I<DataType, 3>& x,
416 : tmpl::list<hydro::Tags::DivergenceCleaningField<DataType>> /*meta*/) const
417 : -> tuples::TaggedTuple<hydro::Tags::DivergenceCleaningField<DataType>>;
418 :
419 : template <typename DataType>
420 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
421 : const tnsr::I<DataType, 3>& x,
422 : tmpl::list<gr::Tags::Lapse<DataType>> /*meta*/) const
423 : -> tuples::TaggedTuple<gr::Tags::Lapse<DataType>>;
424 :
425 : template <typename DataType>
426 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
427 : const tnsr::I<DataType, 3>& x,
428 : tmpl::list<gr::Tags::Shift<DataType, 3>> /*meta*/) const
429 : -> tuples::TaggedTuple<gr::Tags::Shift<DataType, 3>>;
430 :
431 : template <typename DataType>
432 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
433 : const tnsr::I<DataType, 3>& x,
434 : tmpl::list<gr::Tags::SpatialMetric<DataType, 3>> /*meta*/)
435 : const -> tuples::TaggedTuple<gr::Tags::SpatialMetric<DataType, 3>>;
436 :
437 : template <typename DataType>
438 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
439 : const tnsr::I<DataType, 3>& x,
440 : tmpl::list<gr::Tags::SqrtDetSpatialMetric<DataType>> /*meta*/)
441 : const -> tuples::TaggedTuple<gr::Tags::SqrtDetSpatialMetric<DataType>>;
442 :
443 : template <typename DataType>
444 0 : auto variables(
445 : gsl::not_null<IntermediateVariables<DataType>*> vars,
446 : const tnsr::I<DataType, 3>& x,
447 : tmpl::list<gr::Tags::InverseSpatialMetric<DataType, 3>> /*meta*/) const
448 : -> tuples::TaggedTuple<gr::Tags::InverseSpatialMetric<DataType, 3>>;
449 :
450 : template <typename DataType>
451 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
452 : const tnsr::I<DataType, 3>& x,
453 : tmpl::list<DerivLapse<DataType>> /*meta*/) const
454 : -> tuples::TaggedTuple<DerivLapse<DataType>>;
455 :
456 : template <typename DataType>
457 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
458 : const tnsr::I<DataType, 3>& x,
459 : tmpl::list<DerivShift<DataType>> /*meta*/) const
460 : -> tuples::TaggedTuple<DerivShift<DataType>>;
461 :
462 : template <typename DataType>
463 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
464 : const tnsr::I<DataType, 3>& x,
465 : tmpl::list<DerivSpatialMetric<DataType>> /*meta*/) const
466 : -> tuples::TaggedTuple<DerivSpatialMetric<DataType>>;
467 :
468 : template <typename DataType>
469 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
470 : const tnsr::I<DataType, 3>& x,
471 : tmpl::list<gr::Tags::ExtrinsicCurvature<DataType, 3>> /*meta*/)
472 : const -> tuples::TaggedTuple<gr::Tags::ExtrinsicCurvature<DataType, 3>>;
473 :
474 : template <typename DataType>
475 0 : auto variables(const gsl::not_null<IntermediateVariables<DataType>*> vars,
476 : const tnsr::I<DataType, 3>& x,
477 : tmpl::list<::Tags::dt<gr::Tags::Lapse<DataType>>> /*meta*/)
478 : const -> tuples::TaggedTuple<::Tags::dt<gr::Tags::Lapse<DataType>>>;
479 :
480 : template <typename DataType>
481 0 : auto variables(
482 : const gsl::not_null<IntermediateVariables<DataType>*> vars,
483 : const tnsr::I<DataType, 3>& x,
484 : tmpl::list<::Tags::dt<gr::Tags::SpatialMetric<DataType, 3>>> /*meta*/)
485 : const
486 : -> tuples::TaggedTuple<::Tags::dt<gr::Tags::SpatialMetric<DataType, 3>>>;
487 :
488 : template <typename DataType>
489 0 : auto variables(const gsl::not_null<IntermediateVariables<DataType>*> vars,
490 : const tnsr::I<DataType, 3>& x,
491 : tmpl::list<::Tags::dt<gr::Tags::Shift<DataType, 3>>> /*meta*/)
492 : const -> tuples::TaggedTuple<::Tags::dt<gr::Tags::Shift<DataType, 3>>>;
493 :
494 0 : friend bool operator==(const CcsnCollapse& lhs, const CcsnCollapse& rhs);
495 :
496 : protected:
497 0 : std::string progenitor_filename_{};
498 0 : detail::ProgenitorProfile prog_data_{};
499 0 : double polytropic_constant_ = std::numeric_limits<double>::signaling_NaN();
500 0 : double polytropic_exponent_ = std::numeric_limits<double>::signaling_NaN();
501 0 : EquationsOfState::PolytropicFluid<true> equation_of_state_{};
502 0 : double central_angular_velocity_ =
503 : std::numeric_limits<double>::signaling_NaN();
504 0 : double inv_diff_rot_parameter_ = std::numeric_limits<double>::signaling_NaN();
505 : };
506 0 : bool operator!=(const CcsnCollapse& lhs, const CcsnCollapse& rhs);
507 :
508 : } // namespace grmhd::AnalyticData
|