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
|