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 <limits> 9 : #include <memory> 10 : #include <utility> 11 : 12 : #include "DataStructures/DataBox/PrefixHelpers.hpp" 13 : #include "DataStructures/DataBox/Prefixes.hpp" 14 : #include "DataStructures/Tensor/TypeAliases.hpp" 15 : #include "Domain/Structure/DirectionalIdMap.hpp" 16 : #include "Domain/Tags.hpp" 17 : #include "Evolution/DgSubcell/Tags/GhostDataForReconstruction.hpp" 18 : #include "Evolution/DgSubcell/Tags/Inactive.hpp" 19 : #include "Evolution/DgSubcell/Tags/Mesh.hpp" 20 : #include "Evolution/Systems/GrMhd/ValenciaDivClean/FiniteDifference/ReconstructWork.hpp" 21 : #include "Evolution/Systems/GrMhd/ValenciaDivClean/FiniteDifference/Reconstructor.hpp" 22 : #include "Evolution/Systems/GrMhd/ValenciaDivClean/Tags.hpp" 23 : #include "Evolution/VariableFixing/FixToAtmosphere.hpp" 24 : #include "Evolution/VariableFixing/Tags.hpp" 25 : #include "Options/String.hpp" 26 : #include "PointwiseFunctions/GeneralRelativity/Tags.hpp" 27 : #include "PointwiseFunctions/Hydro/Tags.hpp" 28 : #include "Utilities/Serialization/CharmPupable.hpp" 29 : #include "Utilities/TMPL.hpp" 30 : 31 : /// \cond 32 : class DataVector; 33 : template <size_t Dim> 34 : class Direction; 35 : template <size_t Dim> 36 : class Element; 37 : template <size_t Dim> 38 : class ElementId; 39 : namespace EquationsOfState { 40 : template <bool IsRelativistic, size_t ThermodynamicDim> 41 : class EquationOfState; 42 : } // namespace EquationsOfState 43 : template <size_t Dim> 44 : class Mesh; 45 : namespace gsl { 46 : template <typename T> 47 : class not_null; 48 : } // namespace gsl 49 : namespace PUP { 50 : class er; 51 : } // namespace PUP 52 : template <typename TagsList> 53 : class Variables; 54 : namespace evolution::dg::subcell { 55 : class GhostData; 56 : } // namespace evolution::dg::subcell 57 : /// \endcond 58 : 59 : namespace grmhd::ValenciaDivClean::fd { 60 : /*! 61 : * \brief Fifth order monotonicity-preserving (MP5) reconstruction. See 62 : * ::fd::reconstruction::monotonicity_preserving_5() for details. 63 : * 64 : */ 65 1 : class MonotonicityPreserving5Prim : public Reconstructor { 66 : private: 67 0 : using prims_to_reconstruct_tags = 68 : tmpl::list<hydro::Tags::RestMassDensity<DataVector>, 69 : hydro::Tags::ElectronFraction<DataVector>, 70 : hydro::Tags::Temperature<DataVector>, 71 : hydro::Tags::LorentzFactorTimesSpatialVelocity<DataVector, 3>, 72 : hydro::Tags::MagneticField<DataVector, 3>, 73 : hydro::Tags::DivergenceCleaningField<DataVector>>; 74 : 75 : public: 76 0 : static constexpr size_t dim = 3; 77 : 78 0 : struct Alpha { 79 0 : using type = double; 80 0 : static constexpr Options::String help = { 81 : "The parameter used in an intermediate reconstruction step to impose " 82 : "monotonicity; typically Alpha=4.0 is used. Note that in principle the " 83 : "CFL number must be not bigger than 1/(1+Alpha). See the original text " 84 : "Suresh & Huynh (1997) for the details"}; 85 : }; 86 0 : struct Epsilon { 87 0 : using type = double; 88 0 : static constexpr Options::String help = { 89 : "A small tolerance value by which limiting process is turned on and " 90 : "off. Suresh & Huynh (1997) suggests 1e-10, but for hydro simulations " 91 : "with atmosphere treatment setting Epsilon=0.0 would be safe."}; 92 : }; 93 0 : struct ReconstructRhoTimesTemperature { 94 0 : using type = bool; 95 0 : static constexpr Options::String help = { 96 : "If 'true' then we reconstruct the rho*T, if 'false' we reconstruct " 97 : "T."}; 98 : }; 99 : 100 0 : using options = tmpl::list<Alpha, Epsilon, ReconstructRhoTimesTemperature>; 101 0 : static constexpr Options::String help{ 102 : "MP5 reconstruction scheme using primitive variables."}; 103 : 104 0 : MonotonicityPreserving5Prim() = default; 105 0 : MonotonicityPreserving5Prim(MonotonicityPreserving5Prim&&) = default; 106 0 : MonotonicityPreserving5Prim& operator=(MonotonicityPreserving5Prim&&) = 107 : default; 108 0 : MonotonicityPreserving5Prim(const MonotonicityPreserving5Prim&) = default; 109 0 : MonotonicityPreserving5Prim& operator=(const MonotonicityPreserving5Prim&) = 110 : default; 111 0 : ~MonotonicityPreserving5Prim() override = default; 112 : 113 0 : MonotonicityPreserving5Prim(double alpha, double epsilon, 114 : bool reconstruct_rho_times_temperature); 115 : 116 0 : explicit MonotonicityPreserving5Prim(CkMigrateMessage* msg); 117 : 118 0 : WRAPPED_PUPable_decl_base_template(Reconstructor, 119 : MonotonicityPreserving5Prim); 120 : 121 0 : auto get_clone() const -> std::unique_ptr<Reconstructor> override; 122 : 123 0 : static constexpr bool use_adaptive_order = false; 124 : 125 0 : void pup(PUP::er& p) override; 126 : 127 0 : size_t ghost_zone_size() const override { return 3; } 128 : 129 0 : using reconstruction_argument_tags = 130 : tmpl::list<::Tags::Variables<hydro::grmhd_tags<DataVector>>, 131 : hydro::Tags::GrmhdEquationOfState, domain::Tags::Element<dim>, 132 : evolution::dg::subcell::Tags::GhostDataForReconstruction<dim>, 133 : evolution::dg::subcell::Tags::Mesh<dim>, 134 : ::Tags::VariableFixer<VariableFixing::FixToAtmosphere<dim>>>; 135 : 136 : template <size_t ThermodynamicDim> 137 0 : void reconstruct( 138 : gsl::not_null<std::array<Variables<tags_list_for_reconstruct>, dim>*> 139 : vars_on_lower_face, 140 : gsl::not_null<std::array<Variables<tags_list_for_reconstruct>, dim>*> 141 : vars_on_upper_face, 142 : const Variables<hydro::grmhd_tags<DataVector>>& volume_prims, 143 : const EquationsOfState::EquationOfState<true, ThermodynamicDim>& eos, 144 : const Element<dim>& element, 145 : const DirectionalIdMap<dim, evolution::dg::subcell::GhostData>& 146 : ghost_data, 147 : const Mesh<dim>& subcell_mesh, 148 : const VariableFixing::FixToAtmosphere<dim>& fix_to_atmosphere) const; 149 : 150 : template <size_t ThermodynamicDim> 151 0 : void reconstruct_fd_neighbor( 152 : gsl::not_null<Variables<tags_list_for_reconstruct>*> vars_on_face, 153 : const Variables<hydro::grmhd_tags<DataVector>>& subcell_volume_prims, 154 : const EquationsOfState::EquationOfState<true, ThermodynamicDim>& eos, 155 : const Element<dim>& element, 156 : const DirectionalIdMap<dim, evolution::dg::subcell::GhostData>& 157 : ghost_data, 158 : const Mesh<dim>& subcell_mesh, 159 : const VariableFixing::FixToAtmosphere<dim>& fix_to_atmosphere, 160 : Direction<dim> direction_to_reconstruct) const; 161 : 162 0 : bool reconstruct_rho_times_temperature() const override; 163 : 164 : private: 165 : // NOLINTNEXTLINE(readability-redundant-declaration) 166 0 : friend bool operator==(const MonotonicityPreserving5Prim& lhs, 167 : const MonotonicityPreserving5Prim& rhs); 168 0 : friend bool operator!=(const MonotonicityPreserving5Prim& lhs, 169 : const MonotonicityPreserving5Prim& rhs); 170 : 171 0 : double alpha_ = std::numeric_limits<double>::signaling_NaN(); 172 0 : double epsilon_ = std::numeric_limits<double>::signaling_NaN(); 173 0 : bool reconstruct_rho_times_temperature_{false}; 174 : }; 175 : 176 : } // namespace grmhd::ValenciaDivClean::fd