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/Tensor/TypeAliases.hpp" 7 : #include "Options/String.hpp" 8 : #include "PointwiseFunctions/Hydro/TagsDeclarations.hpp" 9 : #include "Utilities/Gsl.hpp" 10 : #include "Utilities/TMPL.hpp" 11 : 12 : /// \cond 13 : class DataVector; 14 : 15 : namespace PUP { 16 : class er; 17 : } // namespace PUP 18 : /// \endcond 19 : 20 : namespace VariableFixing { 21 : /*! 22 : *\ingroup VariableFixingGroup 23 : * \brief Limit the maximum Lorentz factor to LorentzFactorCap in regions where 24 : * the density is below MaxDensityCutoff. 25 : * 26 : * The Lorentz factor is set to LorentzFactorCap and the spatial velocity is 27 : * adjusted according to: 28 : * \f{align} 29 : * v^i_{(\textrm{new})} = \sqrt{\left(1 - \frac{1}{W_{(\textrm{new})}^2}\right) 30 : * \left(1 - \frac{1}{W_{(\textrm{old})}^2}\right)^{-1}} v^i_{(\textrm{old})} 31 : * \f} 32 : */ 33 1 : class LimitLorentzFactor { 34 : public: 35 : /// Do not apply the Lorentz factor cap above this density 36 1 : struct MaxDensityCutoff { 37 0 : using type = double; 38 0 : static type lower_bound() { return 0.0; } 39 0 : static constexpr Options::String help = { 40 : "Do not apply the Lorentz factor cap above this density"}; 41 : }; 42 : /// Largest Lorentz factor allowed. If a larger one is found, normalize 43 : /// velocity to have the Lorentz factor be this value. 44 1 : struct LorentzFactorCap { 45 0 : using type = double; 46 0 : static type lower_bound() { return 1.0; } 47 0 : static constexpr Options::String help = {"Largest Lorentz factor allowed."}; 48 : }; 49 : /// Whether or not the limiting is enabled 50 1 : struct Enable { 51 0 : using type = bool; 52 0 : static constexpr Options::String help = { 53 : "If true then the limiting is applied."}; 54 : }; 55 : 56 0 : using options = tmpl::list<MaxDensityCutoff, LorentzFactorCap, Enable>; 57 0 : static constexpr Options::String help = { 58 : "Limit the maximum Lorentz factor to LorentzFactorCap in regions where " 59 : "the\n" 60 : "density is below MaxDensityCutoff. The Lorentz factor is set to\n" 61 : "LorentzFactorCap and the spatial velocity is adjusted accordingly."}; 62 : 63 0 : LimitLorentzFactor(double max_density_cutoff, double lorentz_factor_cap, 64 : bool enable); 65 : 66 0 : LimitLorentzFactor() = default; 67 0 : LimitLorentzFactor(const LimitLorentzFactor& /*rhs*/) = default; 68 0 : LimitLorentzFactor& operator=(const LimitLorentzFactor& /*rhs*/) = default; 69 0 : LimitLorentzFactor(LimitLorentzFactor&& /*rhs*/) = default; 70 0 : LimitLorentzFactor& operator=(LimitLorentzFactor&& /*rhs*/) = default; 71 0 : ~LimitLorentzFactor() = default; 72 : 73 : // NOLINTNEXTLINE(google-runtime-references) 74 0 : void pup(PUP::er& p); 75 : 76 0 : using return_tags = tmpl::list<hydro::Tags::LorentzFactor<DataVector>, 77 : hydro::Tags::SpatialVelocity<DataVector, 3>>; 78 : 79 0 : using argument_tags = tmpl::list<hydro::Tags::RestMassDensity<DataVector>>; 80 : 81 0 : void operator()( 82 : gsl::not_null<Scalar<DataVector>*> lorentz_factor, 83 : gsl::not_null<tnsr::I<DataVector, 3, Frame::Inertial>*> spatial_velocity, 84 : const Scalar<DataVector>& rest_mass_density) const; 85 : 86 : private: 87 0 : friend bool operator==(const LimitLorentzFactor& lhs, 88 : const LimitLorentzFactor& rhs); 89 : 90 0 : double max_density_cuttoff_; 91 0 : double lorentz_factor_cap_; 92 0 : bool enable_; 93 : }; 94 : 95 0 : bool operator!=(const LimitLorentzFactor& lhs, const LimitLorentzFactor& rhs); 96 : } // namespace VariableFixing