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 <tuple> 8 : 9 : #include "DataStructures/Tensor/TypeAliases.hpp" 10 : #include "Domain/Tags.hpp" 11 : #include "Evolution/DgSubcell/RdmpTciData.hpp" 12 : #include "Evolution/DgSubcell/Tags/DataForRdmpTci.hpp" 13 : #include "Evolution/DgSubcell/Tags/Mesh.hpp" 14 : #include "Evolution/DgSubcell/Tags/SubcellOptions.hpp" 15 : #include "Evolution/Systems/GrMhd/ValenciaDivClean/Subcell/TciOptions.hpp" 16 : #include "Evolution/Systems/GrMhd/ValenciaDivClean/Tags.hpp" 17 : #include "Evolution/VariableFixing/Tags.hpp" 18 : #include "PointwiseFunctions/GeneralRelativity/TagsDeclarations.hpp" 19 : #include "PointwiseFunctions/Hydro/Tags.hpp" 20 : #include "Utilities/TMPL.hpp" 21 : 22 : /// \cond 23 : class DataVector; 24 : namespace evolution::dg::subcell { 25 : class SubcellOptions; 26 : } // namespace evolution::dg::subcell 27 : template <size_t Dim> 28 : class Mesh; 29 : /// \endcond 30 : 31 : namespace grmhd::ValenciaDivClean::subcell { 32 : /*! 33 : * \brief The troubled-cell indicator run on the FD grid to check if the 34 : * corresponding DG solution is admissible. 35 : * 36 : * The following checks are done in the order they are listed: 37 : * 38 : * <table> 39 : * <caption>List of checks</caption> 40 : * <tr><th> Description <th> TCI status 41 : * 42 : * <tr><td> the element is not troubled. 43 : * <td> `+0` 44 : * 45 : * <tr><td> if `min(tilde_d)` is less than 46 : * `tci_options.minimum_rest_mass_density_times_lorentz_factor`, then we 47 : * remain on FD. 48 : * <td> `+1` 49 : * 50 : * <tr><td> if `min(tilde_ye)` is less than 51 : * `tci_options.minimum_rest_mass_density_times_lorentz_factor` times 52 : * `tci_options.minimum_ye`, then we remain on FD. 53 : * <td> `+2` 54 : * 55 : * <tr><td> if `min(tilde_tau)` is less than 56 : * `tci_options.minimum_tilde_tau`, then we remain on FD. 57 : * <td> `+3` 58 : * 59 : * <tr><td> if `grmhd::ValenciaDivClean::Tags::VariablesNeededFixing` is `true` 60 : * and the maximum of rest mass density on FD grid is greater than 61 : * `tci_options.atmosphere_density`, then we remain on FD. 62 : * <td> `+4` 63 : * 64 : * <tr><td> apply the Persson TCI to \f$\tilde{D}\f$ if the maximum of rest 65 : * mass density on FD grid is greater than `tci_options.atmosphere_density`. 66 : * <td> `+5` 67 : * 68 : * <tr><td> apply the Persson TCI to \f$\tilde{Y}_e\f$ if the maximum of rest 69 : * mass density on FD grid is greater than `tci_options.atmosphere_density`. 70 : * <td> `+6` 71 : * 72 : * <tr><td> apply the Persson TCI to pressure if the maximum of rest mass 73 : * density on FD grid is greater than `tci_options.atmosphere_density`. <td> 74 : * `+7` 75 : * 76 : * <tr><td> apply the RDMP TCI to `TildeD` 77 : * <td> `+8` 78 : * 79 : * <tr><td> apply the RDMP TCI to `TildeYe` 80 : * <td> `+9` 81 : * 82 : * <tr><td> apply the RDMP TCI to `TildeTau` 83 : * <td> `+10` 84 : * 85 : * <tr><td> apply the RDMP TCI to `TildeB` 86 : * <td> `+11` 87 : * 88 : * <tr><td> apply the Persson TCI to the magnitude of \f$\tilde{B}^{n+1}\f$ if 89 : * its magnitude is greater than `tci_options.magnetic_field_cutoff`. 90 : * <td> `+12` 91 : * 92 : * </table> 93 : * 94 : * The second column of the table above denotes the value of an integer stored 95 : * as the first element of the returned `std::tuple`, which indicates the 96 : * particular kind of check that failed. For example, if the tenth check 97 : * (RDMP TCI to TildeTau) fails and cell is marked as troubled, an integer with 98 : * value `+10` is stored in the first slot of the returned tuple. Note that this 99 : * integer is marking only the _first_ check to fail, since checks are done in a 100 : * particular sequence as listed above. If all checks are passed and cell is not 101 : * troubled, it is returned with the value `0`. 102 : * 103 : * \note We adopt positive integers to mark TCI status from FD grid returned by 104 : * TciOnFdGrid class. Negative integers are reserved for TCIs on DG grid; see 105 : * TciOnDgGrid and its documentation. 106 : * 107 : */ 108 1 : struct TciOnFdGrid { 109 0 : using return_tags = tmpl::list<>; 110 0 : using argument_tags = 111 : tmpl::list<grmhd::ValenciaDivClean::Tags::TildeD, 112 : grmhd::ValenciaDivClean::Tags::TildeYe, 113 : grmhd::ValenciaDivClean::Tags::TildeTau, 114 : grmhd::ValenciaDivClean::Tags::TildeB<>, 115 : hydro::Tags::RestMassDensity<DataVector>, 116 : hydro::Tags::Pressure<DataVector>, 117 : grmhd::ValenciaDivClean::Tags::VariablesNeededFixing, 118 : domain::Tags::Mesh<3>, evolution::dg::subcell::Tags::Mesh<3>, 119 : evolution::dg::subcell::Tags::DataForRdmpTci, Tags::TciOptions, 120 : evolution::dg::subcell::Tags::SubcellOptions<3>>; 121 0 : static std::tuple<int, evolution::dg::subcell::RdmpTciData> apply( 122 : const Scalar<DataVector>& subcell_tilde_d, 123 : const Scalar<DataVector>& subcell_tilde_ye, 124 : const Scalar<DataVector>& subcell_tilde_tau, 125 : const tnsr::I<DataVector, 3, Frame::Inertial>& subcell_tilde_b, 126 : const Scalar<DataVector>& subcell_rest_mass_density, 127 : const Scalar<DataVector>& subcell_pressure, bool vars_needed_fixing, 128 : const Mesh<3>& dg_mesh, const Mesh<3>& subcell_mesh, 129 : const evolution::dg::subcell::RdmpTciData& past_rdmp_tci_data, 130 : const TciOptions& tci_options, 131 : const evolution::dg::subcell::SubcellOptions& subcell_options, 132 : double persson_exponent, bool need_rdmp_data_only); 133 : }; 134 : } // namespace grmhd::ValenciaDivClean::subcell