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 "Domain/Tags.hpp" 10 : #include "Evolution/DgSubcell/RdmpTciData.hpp" 11 : #include "Evolution/DgSubcell/SubcellOptions.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/ForceFree/Subcell/TciOptions.hpp" 16 : #include "Evolution/Systems/ForceFree/Tags.hpp" 17 : #include "PointwiseFunctions/GeneralRelativity/TagsDeclarations.hpp" 18 : #include "Utilities/TMPL.hpp" 19 : 20 : /// \cond 21 : class DataVector; 22 : template <size_t Dim> 23 : class Mesh; 24 : namespace gsl { 25 : template <typename T> 26 : class not_null; 27 : } // namespace gsl 28 : /// \endcond 29 : 30 : namespace ForceFree::subcell { 31 : 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> apply the Persson TCI to magnitude of `TildeE` 43 : * <td> `+1` 44 : * 45 : * <tr><td> apply the Persson TCI to magnitude of `TildeB` 46 : * <td> `+2` 47 : * 48 : * <tr><td> apply the Persson TCI to `TildeQ` if \f$\max(|\tilde{q}|)\f$ is 49 : * larger than `tci_options.cutoff_tilde_q`. 50 : * Check is skipped if `tci_options.tilde_q_cutoff == DoNotCheckTildeQ`. 51 : * <td> `+3` 52 : * 53 : * <tr><td> apply the RDMP TCI to magnitude of `TildeE` 54 : * <td> `+4` 55 : * 56 : * <tr><td> apply the RDMP TCI to magnitude of `TildeB` 57 : * <td> `+5` 58 : * 59 : * </table> 60 : * 61 : * The second column of the table above denotes the value of an integer stored 62 : * as the first element of the returned `std::tuple`, which indicates the 63 : * particular kind of check that failed. For example, if the second check 64 : * (Persson TCI to `mag(TildeB)`) fails and element is marked as troubled, an 65 : * integer with value `+2` is stored in the first slot of the returned tuple. 66 : * Note that this integer is marking only the _first_ check to fail since 67 : * checks are done in a particular sequence as listed above. If all checks are 68 : * passed and cell is not troubled, it is returned with the value `0`. 69 : * 70 : * When computing magnitudes of tensor quantities (TildeE, TildeB) for TCI 71 : * checks, we simply use the square root of the sum of spatial components 72 : * squared, _not_ the square root of the scalar product using the spatial 73 : * metric. 74 : * 75 : * \note We adopt positive integers to mark TCI status from FD grid returned by 76 : * TciOnFdGrid class. Negative integers are reserved for TCIs on DG grid; see 77 : * TciOnDgGrid and its documentation. 78 : * 79 : */ 80 1 : class TciOnFdGrid { 81 : public: 82 0 : using return_tags = tmpl::list<>; 83 0 : using argument_tags = 84 : tmpl::list<ForceFree::Tags::TildeE, ForceFree::Tags::TildeB, 85 : ForceFree::Tags::TildeQ, domain::Tags::Mesh<3>, 86 : evolution::dg::subcell::Tags::Mesh<3>, 87 : evolution::dg::subcell::Tags::DataForRdmpTci, Tags::TciOptions, 88 : evolution::dg::subcell::Tags::SubcellOptions<3>>; 89 : 90 0 : static std::tuple<int, evolution::dg::subcell::RdmpTciData> apply( 91 : const tnsr::I<DataVector, 3, Frame::Inertial>& subcell_tilde_e, 92 : const tnsr::I<DataVector, 3, Frame::Inertial>& subcell_tilde_b, 93 : const Scalar<DataVector>& subcell_tilde_q, const Mesh<3>& dg_mesh, 94 : const Mesh<3>& subcell_mesh, 95 : const evolution::dg::subcell::RdmpTciData& past_rdmp_tci_data, 96 : const TciOptions& tci_options, 97 : const evolution::dg::subcell::SubcellOptions& subcell_options, 98 : double persson_exponent, bool need_rdmp_data_only); 99 : }; 100 : 101 : } // namespace ForceFree::subcell