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 : * \brief The troubled-cell indicator run on the DG grid to check if the 33 : * solution is admissible. 34 : * 35 : * The following checks are done in the order they are listed: 36 : * 37 : * <table> 38 : * <caption>List of checks</caption> 39 : * <tr><th> Description <th> TCI status 40 : * 41 : * <tr><td> apply the Persson TCI to magnitude of `TildeE` 42 : * <td> `-1` 43 : * 44 : * <tr><td> apply the Persson TCI to magnitude of `TildeB` 45 : * <td> `-2` 46 : * 47 : * <tr><td> apply the Persson TCI to `TildeQ` if \f$\max(|\tilde{q}|)\f$ is 48 : * greater than `tci_options.tilde_q_cutoff`. 49 : * Check is skipped if `tci_options.tilde_q_cutoff == DoNotCheckTildeQ`. 50 : * <td> `-3` 51 : * 52 : * <tr><td> apply the RDMP TCI to magnitude of `TildeE` 53 : * <td> `-4` 54 : * 55 : * <tr><td> apply the RDMP TCI to magnitude of `TildeB` 56 : * <td> `-5` 57 : * 58 : * </table> 59 : * 60 : * The second column of the table above denotes the value of an integer stored 61 : * as the first element of the returned `std::tuple`, which indicates the 62 : * particular kind of check that failed. For example, if the 3rd check 63 : * (Persson TCI to TildeQ) fails and cell is marked as troubled, an integer with 64 : * value `-3` is stored in the first slot of the returned tuple. Note that this 65 : * integer is marking only the first check to fail since checks are done in a 66 : * particular sequence as listed above. If all checks are passed and cell is not 67 : * troubled, it is returned with the value `0`. 68 : * 69 : * When computing magnitudes of tensor quantities (TildeE, TildeB) here for TCI 70 : * checks, we simply use the square root of the sum of spatial components 71 : * squared, _not_ the square root of the scalar product using the spatial 72 : * metric. 73 : * 74 : * \note We adopt negative integers to mark TCI status from DG grid returned by 75 : * TciOnDgGrid class. Positive integers are used for TCIs on FD grid; see 76 : * TciOnFdGrid and its documentation. 77 : * 78 : */ 79 1 : class TciOnDgGrid { 80 : public: 81 0 : using return_tags = tmpl::list<>; 82 0 : using argument_tags = 83 : tmpl::list<ForceFree::Tags::TildeE, ForceFree::Tags::TildeB, 84 : ForceFree::Tags::TildeQ, domain::Tags::Mesh<3>, 85 : evolution::dg::subcell::Tags::Mesh<3>, 86 : evolution::dg::subcell::Tags::DataForRdmpTci, Tags::TciOptions, 87 : evolution::dg::subcell::Tags::SubcellOptions<3>>; 88 : 89 0 : static std::tuple<int, evolution::dg::subcell::RdmpTciData> apply( 90 : const tnsr::I<DataVector, 3, Frame::Inertial>& tilde_e, 91 : const tnsr::I<DataVector, 3, Frame::Inertial>& tilde_b, 92 : const Scalar<DataVector>& tilde_q, const Mesh<3>& dg_mesh, 93 : const Mesh<3>& subcell_mesh, 94 : const evolution::dg::subcell::RdmpTciData& past_rdmp_tci_data, 95 : const TciOptions& tci_options, 96 : const evolution::dg::subcell::SubcellOptions& subcell_options, 97 : double persson_exponent, bool /*element_stays_on_dg*/); 98 : }; 99 : 100 : } // namespace ForceFree::subcell