Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <cstddef> 7 : #include <optional> 8 : #include <string> 9 : 10 : #include "Evolution/Systems/GrMhd/ValenciaDivClean/PrimitiveRecoveryData.hpp" 11 : 12 : /// \cond 13 : namespace EquationsOfState { 14 : template <bool, size_t> 15 : class EquationOfState; 16 : } // namespace EquationsOfState 17 : namespace grmhd::ValenciaDivClean { 18 : class PrimitiveFromConservativeOptions; 19 : } // namespace grmhd::ValenciaDivClean 20 : /// \endcond 21 : 22 : namespace grmhd::ValenciaDivClean::PrimitiveRecoverySchemes { 23 : 24 : /*! 25 : * \brief Compute the primitive variables from the conservative variables using 26 : * the scheme of [Newman and Hamlin, SIAM J. Sci. Comput., 36(4) 27 : * B661-B683 (2014)](https://epubs.siam.org/doi/10.1137/140956749). 28 : * 29 : * In the Newman and Hamlin paper, `tau` is \f$e - \rho W\f$, 30 : * `momentum_density_squared` is\f${\cal M}^2\f$, 31 : * `momentum_density_dot_magnetic_field` is \f${\cal T}\f$, 32 : * `magnetic_field_squared` is \f${\cal B}^2\f$, and 33 : * `rest_mass_density_times_lorentz_factor` is \f${\tilde \rho}\f$. 34 : * Furthermore, the returned `PrimitiveRecoveryData.rho_h_w_squared` is \f${\cal 35 : * L}\f$. 36 : * 37 : * In terms of the conservative variables (in our notation): 38 : * \f{align} 39 : * e = & \frac{{\tilde D} + {\tilde \tau}}{\sqrt{\gamma}} \\ 40 : * {\cal M}^2 = & \frac{\gamma^{mn} {\tilde S}_m {\tilde S}_n}{\gamma} \\ 41 : * {\cal T} = & \frac{{\tilde B}^m {\tilde S}_m}{\gamma} \\ 42 : * {\cal B}^2 = & \frac{\gamma_{mn} {\tilde B}^m {\tilde B}^n}{\gamma} \\ 43 : * {\tilde \rho} = & \frac{\tilde D}{\sqrt{\gamma}} 44 : * \f} 45 : * 46 : * where the conserved variables \f${\tilde D}\f$, \f${\tilde S}_i\f$, 47 : * \f${\tilde \tau}\f$, and \f${\tilde B}^i\f$ are a generalized mass-energy 48 : * density, momentum density, specific internal energy density, and magnetic 49 : * field, and \f$\gamma\f$ and \f$\gamma^{mn}\f$ are the determinant and inverse 50 : * of the spatial metric \f$\gamma_{mn}\f$. 51 : */ 52 1 : class NewmanHamlin { 53 : public: 54 : template <bool EnforcePhysicality, typename EosType> 55 0 : static std::optional<PrimitiveRecoveryData> apply( 56 : double initial_guess_for_pressure, double tau, 57 : double momentum_density_squared, 58 : double momentum_density_dot_magnetic_field, double magnetic_field_squared, 59 : double rest_mass_density_times_lorentz_factor, double electron_fraction, 60 : const EosType& equation_of_state, 61 : const grmhd::ValenciaDivClean::PrimitiveFromConservativeOptions& 62 : primitive_from_conservative_options); 63 : 64 0 : static const std::string name() { return "Newman Hamlin"; } 65 : 66 : private: 67 0 : static constexpr size_t max_iterations_ = 50; 68 0 : static constexpr double relative_tolerance_ = 1.e-10; 69 : }; 70 : } // namespace grmhd::ValenciaDivClean::PrimitiveRecoverySchemes