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/EquationOfState.hpp"
17 : #include "PointwiseFunctions/Hydro/EquationsOfState/Factory.hpp"
18 : #include "PointwiseFunctions/Hydro/EquationsOfState/Tabulated3d.hpp"
19 : #include "PointwiseFunctions/Hydro/Temperature.hpp"
20 : #include "PointwiseFunctions/Hydro/Units.hpp"
21 : #include "PointwiseFunctions/InitialDataUtilities/InitialData.hpp"
22 : #include "Utilities/Serialization/RegisterDerivedClassesWithCharm.hpp"
23 : #include "Utilities/TMPL.hpp"
24 : #include "Utilities/TaggedTuple.hpp"
25 :
26 : namespace grmhd::AnalyticData {
27 : namespace detail {
28 : /*!
29 : * \brief Read a massive star supernova progenitor from file.
30 : */
31 : class ProgenitorProfile {
32 : public:
33 : ProgenitorProfile() = default;
34 :
35 : ProgenitorProfile(const std::string& filename);
36 : // interpolate function
37 : std::array<double, 6> interpolate(double target_radius,
38 : double target_cos_theta,
39 : bool interpolate_hydro_vars) const;
40 :
41 : double max_radius() const { return maximum_radius_; }
42 :
43 : // Change private density ratio based on user-defined value,
44 : // accessed in CCSNCollapse() call
45 : void set_dens_ratio(double max_dens_ratio) {
46 : max_density_ratio_for_linear_interpolation_ = max_dens_ratio;
47 : }
48 :
49 : void pup(PUP::er& p);
50 :
51 : private:
52 : double maximum_radius_{std::numeric_limits<double>::signaling_NaN()};
53 : double max_density_ratio_for_linear_interpolation_{
54 : 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::Tabulated3D<true>;
183 :
184 : /// The massive star progenitor data file.
185 : ///
186 : /// Available in the
187 : /// [SXS
188 : /// Repo](https://github.com/sxs-collaboration/core_collapse_supernova_files_for_spectre/tree/main/progenitor_files)
189 1 : struct ProgenitorFilename {
190 0 : using type = std::string;
191 0 : static constexpr Options::String help = {
192 : "The supernova progenitor data file."};
193 : };
194 :
195 : /// Central angular velocity artificially assigned at readin.
196 : ///
197 : /// Currently limited by the angular velocity of an object rotating in a
198 : /// circle, with radius = 1 cm (well below grid resolution) and
199 : /// transverse velocity = the speed of light.
200 : ///
201 : /// Due to effects from magnetic breaking, more realistic central angular
202 : /// velocities for massive stars are of order 0.1 [radians/sec] ~ 4.93e-7
203 : /// [code units] (see Figure 1 of \cite Pajkos2019 based on results from
204 : /// \cite Heger2005, or see \cite Richers2017 for an exploration of
205 : /// different values).
206 1 : struct CentralAngularVelocity {
207 0 : using type = double;
208 0 : static constexpr Options::String help = {
209 : "Central angular velocity of progenitor"};
210 :
211 0 : static type upper_bound() { return 147670.0; }
212 0 : static type lower_bound() { return -147670.0; }
213 : };
214 :
215 : /// Differential rotation parameter for artificially assigned
216 : /// rotation profile.
217 1 : struct DifferentialRotationParameter {
218 0 : using type = double;
219 0 : static constexpr Options::String help = {
220 : "Differential rotation parameter (large"
221 : " indicates solid body, small very differential)"};
222 : // This is ~1 cm, well below simulation resolution.
223 : // The lower bound is used to ensure a nonzero divisor.
224 0 : static type lower_bound() { return 6.7706e-6; }
225 : };
226 :
227 : /// Maximum density ratio for linear interpolation.
228 : ///
229 : /// If the ratio of two neighboring densities are greater than this value,
230 : /// then interpolation onto the SpECTRE grid reverts to linear, to avoid
231 : /// oscillations. A ratio of 100 is used for the rotating TOV star test
232 : /// and a safe value to use if unsure.
233 1 : struct MaxDensityRatioForLinearInterpolation {
234 0 : using type = double;
235 0 : static constexpr Options::String help = {
236 : "If the ratio between neighboring density points is greater"
237 : " than this parameter, fall back to linear interpolation"
238 : " onto the SpECTRE grid."};
239 0 : static type lower_bound() { return 0.0; }
240 : };
241 :
242 0 : struct TableFilename {
243 0 : using type = std::string;
244 0 : static constexpr Options::String help{"File name of the EOS table"};
245 : };
246 :
247 0 : struct TableSubFilename {
248 0 : using type = std::string;
249 0 : static constexpr Options::String help{
250 : "Subfile name of the EOS table, e.g., 'dd2'."};
251 : };
252 :
253 0 : using options = tmpl::list<
254 : ProgenitorFilename, CentralAngularVelocity, DifferentialRotationParameter,
255 : MaxDensityRatioForLinearInterpolation, TableFilename, TableSubFilename>;
256 0 : static constexpr Options::String help = {
257 : "Core collapse supernova initial data, read in from a profile containing"
258 : " hydrodynamic primitives and metric variables. The data "
259 : "are read in from disk."};
260 :
261 0 : CcsnCollapse() = default;
262 0 : CcsnCollapse(const CcsnCollapse& /*rhs*/) = default;
263 0 : CcsnCollapse& operator=(const CcsnCollapse& /*rhs*/) = default;
264 0 : CcsnCollapse(CcsnCollapse&& /*rhs*/) = default;
265 0 : CcsnCollapse& operator=(CcsnCollapse&& /*rhs*/) = default;
266 0 : ~CcsnCollapse() override = default;
267 :
268 0 : CcsnCollapse(std::string progenitor_filename,
269 : double central_angular_velocity,
270 : double diff_rot_parameter,
271 : double max_dens_ratio_interp,
272 : const std::string& eos_filename,
273 : const std::string& eos_subfilename);
274 :
275 0 : auto get_clone() const
276 : -> std::unique_ptr<evolution::initial_data::InitialData> override;
277 :
278 : /// \cond
279 : explicit CcsnCollapse(CkMigrateMessage* msg);
280 : using PUP::able::register_constructor;
281 : WRAPPED_PUPable_decl_template(CcsnCollapse);
282 : /// \endcond
283 :
284 : /// Retrieve a collection of variables at `(x)`
285 : template <typename DataType, typename... Tags>
286 1 : tuples::TaggedTuple<Tags...> variables(const tnsr::I<DataType, 3>& x,
287 : tmpl::list<Tags...> /*meta*/) const {
288 : IntermediateVariables<DataType> intermediate_vars{
289 : x, 1.0e-4 * prog_data_.max_radius()};
290 : return {get<Tags>(variables(make_not_null(&intermediate_vars), x,
291 : tmpl::list<Tags>{}))...};
292 : }
293 :
294 : // NOLINTNEXTLINE(google-runtime-references)
295 0 : void pup(PUP::er& p) override;
296 :
297 0 : const EquationsOfState::Tabulated3D<true>& equation_of_state() const {
298 : return equation_of_state_;
299 : }
300 :
301 : protected:
302 : template <typename DataType>
303 0 : using DerivLapse = ::Tags::deriv<gr::Tags::Lapse<DataType>, tmpl::size_t<3>,
304 : Frame::Inertial>;
305 :
306 : template <typename DataType>
307 0 : using DerivShift = ::Tags::deriv<gr::Tags::Shift<DataType, 3>,
308 : tmpl::size_t<3>, Frame::Inertial>;
309 :
310 : template <typename DataType>
311 0 : using DerivSpatialMetric = ::Tags::deriv<gr::Tags::SpatialMetric<DataType, 3>,
312 : tmpl::size_t<3>, Frame::Inertial>;
313 :
314 : template <typename DataType>
315 0 : void interpolate_vars_if_necessary(
316 : gsl::not_null<IntermediateVariables<DataType>*> vars) const;
317 :
318 : template <typename DataType>
319 0 : void interpolate_deriv_vars_if_necessary(
320 : gsl::not_null<IntermediateVariables<DataType>*> vars) const;
321 :
322 : template <typename DataType>
323 0 : Scalar<DataType> lapse(const DataType& metric_potential) const;
324 :
325 : template <typename DataType>
326 0 : tnsr::I<DataType, 3, Frame::Inertial> shift(const DataType& radius) const;
327 :
328 : template <typename DataType>
329 0 : tnsr::ii<DataType, 3, Frame::Inertial> spatial_metric(
330 : const DataType& chi, const DataType& cos_theta, const DataType& sin_theta,
331 : const DataType& phi) const;
332 :
333 : template <typename DataType>
334 0 : tnsr::II<DataType, 3, Frame::Inertial> inverse_spatial_metric(
335 : const DataType& chi, const DataType& cos_theta, const DataType& sin_theta,
336 : const DataType& phi) const;
337 :
338 : template <typename DataType>
339 0 : Scalar<DataType> sqrt_det_spatial_metric(const DataType& chi) const;
340 :
341 : template <typename DataType>
342 0 : auto make_metric_data(size_t num_points) const ->
343 : typename IntermediateVariables<DataType>::MetricData;
344 :
345 : public:
346 : template <typename DataType>
347 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
348 : const tnsr::I<DataType, 3>& x,
349 : tmpl::list<hydro::Tags::RestMassDensity<DataType>> /*meta*/)
350 : const -> tuples::TaggedTuple<hydro::Tags::RestMassDensity<DataType>>;
351 :
352 : template <typename DataType>
353 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
354 : const tnsr::I<DataType, 3>& x,
355 : tmpl::list<hydro::Tags::ElectronFraction<DataType>> /*meta*/)
356 : const -> tuples::TaggedTuple<hydro::Tags::ElectronFraction<DataType>>;
357 :
358 : template <typename DataType>
359 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
360 : const tnsr::I<DataType, 3>& x,
361 : tmpl::list<hydro::Tags::SpecificEnthalpy<DataType>> /*meta*/)
362 : const -> tuples::TaggedTuple<hydro::Tags::SpecificEnthalpy<DataType>>;
363 :
364 : template <typename DataType>
365 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
366 : const tnsr::I<DataType, 3>& x,
367 : tmpl::list<hydro::Tags::Pressure<DataType>> /*meta*/) const
368 : -> tuples::TaggedTuple<hydro::Tags::Pressure<DataType>>;
369 :
370 : template <typename DataType>
371 0 : auto variables(
372 : gsl::not_null<IntermediateVariables<DataType>*> vars,
373 : const tnsr::I<DataType, 3>& x,
374 : tmpl::list<hydro::Tags::SpecificInternalEnergy<DataType>> /*meta*/) const
375 : -> tuples::TaggedTuple<hydro::Tags::SpecificInternalEnergy<DataType>>;
376 :
377 : template <typename DataType>
378 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
379 : const tnsr::I<DataType, 3>& x,
380 : tmpl::list<hydro::Tags::Temperature<DataType>> /*meta*/) const
381 : -> tuples::TaggedTuple<hydro::Tags::Temperature<DataType>>;
382 :
383 : template <typename DataType>
384 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
385 : const tnsr::I<DataType, 3>& x,
386 : tmpl::list<hydro::Tags::SpatialVelocity<DataType, 3>> /*meta*/)
387 : const -> tuples::TaggedTuple<hydro::Tags::SpatialVelocity<DataType, 3>>;
388 :
389 : template <typename DataType>
390 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
391 : const tnsr::I<DataType, 3>& x,
392 : tmpl::list<hydro::Tags::LorentzFactor<DataType>> /*meta*/)
393 : const -> tuples::TaggedTuple<hydro::Tags::LorentzFactor<DataType>>;
394 :
395 : template <typename DataType>
396 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
397 : const tnsr::I<DataType, 3>& x,
398 : tmpl::list<hydro::Tags::MagneticField<DataType, 3>> /*meta*/)
399 : const -> tuples::TaggedTuple<hydro::Tags::MagneticField<DataType, 3>>;
400 :
401 : template <typename DataType>
402 0 : auto variables(
403 : gsl::not_null<IntermediateVariables<DataType>*> vars,
404 : const tnsr::I<DataType, 3>& x,
405 : tmpl::list<hydro::Tags::DivergenceCleaningField<DataType>> /*meta*/) const
406 : -> tuples::TaggedTuple<hydro::Tags::DivergenceCleaningField<DataType>>;
407 :
408 : template <typename DataType>
409 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
410 : const tnsr::I<DataType, 3>& x,
411 : tmpl::list<gr::Tags::Lapse<DataType>> /*meta*/) const
412 : -> tuples::TaggedTuple<gr::Tags::Lapse<DataType>>;
413 :
414 : template <typename DataType>
415 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
416 : const tnsr::I<DataType, 3>& x,
417 : tmpl::list<gr::Tags::Shift<DataType, 3>> /*meta*/) const
418 : -> tuples::TaggedTuple<gr::Tags::Shift<DataType, 3>>;
419 :
420 : template <typename DataType>
421 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
422 : const tnsr::I<DataType, 3>& x,
423 : tmpl::list<gr::Tags::SpatialMetric<DataType, 3>> /*meta*/)
424 : const -> tuples::TaggedTuple<gr::Tags::SpatialMetric<DataType, 3>>;
425 :
426 : template <typename DataType>
427 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
428 : const tnsr::I<DataType, 3>& x,
429 : tmpl::list<gr::Tags::SqrtDetSpatialMetric<DataType>> /*meta*/)
430 : const -> tuples::TaggedTuple<gr::Tags::SqrtDetSpatialMetric<DataType>>;
431 :
432 : template <typename DataType>
433 0 : auto variables(
434 : gsl::not_null<IntermediateVariables<DataType>*> vars,
435 : const tnsr::I<DataType, 3>& x,
436 : tmpl::list<gr::Tags::InverseSpatialMetric<DataType, 3>> /*meta*/) const
437 : -> tuples::TaggedTuple<gr::Tags::InverseSpatialMetric<DataType, 3>>;
438 :
439 : template <typename DataType>
440 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
441 : const tnsr::I<DataType, 3>& x,
442 : tmpl::list<DerivLapse<DataType>> /*meta*/) const
443 : -> tuples::TaggedTuple<DerivLapse<DataType>>;
444 :
445 : template <typename DataType>
446 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
447 : const tnsr::I<DataType, 3>& x,
448 : tmpl::list<DerivShift<DataType>> /*meta*/) const
449 : -> tuples::TaggedTuple<DerivShift<DataType>>;
450 :
451 : template <typename DataType>
452 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
453 : const tnsr::I<DataType, 3>& x,
454 : tmpl::list<DerivSpatialMetric<DataType>> /*meta*/) const
455 : -> tuples::TaggedTuple<DerivSpatialMetric<DataType>>;
456 :
457 : template <typename DataType>
458 0 : auto variables(gsl::not_null<IntermediateVariables<DataType>*> vars,
459 : const tnsr::I<DataType, 3>& x,
460 : tmpl::list<gr::Tags::ExtrinsicCurvature<DataType, 3>> /*meta*/)
461 : const -> tuples::TaggedTuple<gr::Tags::ExtrinsicCurvature<DataType, 3>>;
462 :
463 : template <typename DataType>
464 0 : auto variables(const gsl::not_null<IntermediateVariables<DataType>*> vars,
465 : const tnsr::I<DataType, 3>& x,
466 : tmpl::list<::Tags::dt<gr::Tags::Lapse<DataType>>> /*meta*/)
467 : const -> tuples::TaggedTuple<::Tags::dt<gr::Tags::Lapse<DataType>>>;
468 :
469 : template <typename DataType>
470 0 : auto variables(
471 : const gsl::not_null<IntermediateVariables<DataType>*> vars,
472 : const tnsr::I<DataType, 3>& x,
473 : tmpl::list<::Tags::dt<gr::Tags::SpatialMetric<DataType, 3>>> /*meta*/)
474 : const
475 : -> tuples::TaggedTuple<::Tags::dt<gr::Tags::SpatialMetric<DataType, 3>>>;
476 :
477 : template <typename DataType>
478 0 : auto variables(const gsl::not_null<IntermediateVariables<DataType>*> vars,
479 : const tnsr::I<DataType, 3>& x,
480 : tmpl::list<::Tags::dt<gr::Tags::Shift<DataType, 3>>> /*meta*/)
481 : const -> tuples::TaggedTuple<::Tags::dt<gr::Tags::Shift<DataType, 3>>>;
482 :
483 0 : friend bool operator==(const CcsnCollapse& lhs, const CcsnCollapse& rhs);
484 :
485 : protected:
486 0 : std::string progenitor_filename_{};
487 0 : detail::ProgenitorProfile prog_data_{};
488 0 : EquationsOfState::Tabulated3D<true> equation_of_state_;
489 0 : double central_angular_velocity_ =
490 : std::numeric_limits<double>::signaling_NaN();
491 0 : double inv_diff_rot_parameter_ = std::numeric_limits<double>::signaling_NaN();
492 : };
493 0 : bool operator!=(const CcsnCollapse& lhs, const CcsnCollapse& rhs);
494 :
495 : } // namespace grmhd::AnalyticData
|