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
|