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 "DataStructures/VariablesTag.hpp"
11 : #include "Domain/Tags.hpp"
12 : #include "Evolution/DgSubcell/RdmpTciData.hpp"
13 : #include "Evolution/DgSubcell/Tags/DataForRdmpTci.hpp"
14 : #include "Evolution/DgSubcell/Tags/Mesh.hpp"
15 : #include "Evolution/DgSubcell/Tags/SubcellOptions.hpp"
16 : #include "Evolution/Systems/GrMhd/ValenciaDivClean/PrimitiveFromConservativeOptions.hpp"
17 : #include "Evolution/Systems/GrMhd/ValenciaDivClean/Subcell/TciOptions.hpp"
18 : #include "Evolution/Systems/GrMhd/ValenciaDivClean/Tags.hpp"
19 : #include "PointwiseFunctions/GeneralRelativity/TagsDeclarations.hpp"
20 : #include "PointwiseFunctions/Hydro/Tags.hpp"
21 : #include "Utilities/TMPL.hpp"
22 :
23 : /// \cond
24 : class DataVector;
25 : namespace EquationsOfState {
26 : template <bool IsRelativistic, size_t ThermodynamicDim>
27 : class EquationOfState;
28 : } // namespace EquationsOfState
29 : namespace evolution::dg::subcell {
30 : struct RdmpTciData;
31 : class SubcellOptions;
32 : } // namespace evolution::dg::subcell
33 : template <size_t Dim>
34 : class Mesh;
35 : namespace gsl {
36 : template <typename T>
37 : class not_null;
38 : } // namespace gsl
39 : template <typename TagsList>
40 : class Variables;
41 : /// \endcond
42 :
43 : namespace grmhd::ValenciaDivClean::subcell {
44 : /*!
45 : * \brief The troubled-cell indicator run on the DG grid to check if the
46 : * solution is admissible.
47 : *
48 : * We denote variables at the candidate solution's time level by a superscript
49 : * \f$n+1\f$ and at the time level where the solution is known to be admissible
50 : * by a superscript \f$n\f$.
51 : *
52 : * The following checks are done in the order they are listed:
53 : *
54 : * <table>
55 : * <caption>List of checks</caption>
56 : * <tr><th> Description <th> TCI status
57 : *
58 : * <tr><td> if \f$\min(\tilde{D}^{n+1}/\textrm{avg}(\sqrt{\gamma^{n}}))\f$
59 : * is less than `tci_options.minimum_rest_mass_density_times_lorentz_factor`
60 : * or if \f$\min(\tilde{Y}_e^{n+1}/\textrm{avg}(\sqrt{\gamma^{n}}))\f$ is less
61 : * than `tci_options.minimum_rest_mass_density_times_lorentz_factor` times
62 : * `tci_options.minimum_ye`, we have a negative (or extremely small) density or
63 : * electron fraction and the cell is troubled. Note that if this `tci_option` is
64 : * approximately equal to or larger than the `atmosphere_density`, the
65 : * atmosphere will be flagged as troubled.
66 : * <td> `-1`
67 : *
68 : * <tr><td> if \f$\tilde{\tau}\f$ is less than `tci_options.minimum_tilde_tau`
69 : * then we have a negative (or extremely small) energy and the cell is troubled.
70 : * <td> `-2`
71 : *
72 : * <tr><td> if \f$\max(\tilde{D}^{n+1}/(\sqrt{\gamma^n}W^n))\f$ and
73 : * \f$\max(\rho^n)\f$ are less than `tci_options.atmosphere_density` then the
74 : * entire DG element is in atmosphere and it is _not_ troubled.
75 : * <td> `0`
76 : *
77 : * <tr><td> if
78 : * \f$(\tilde{B}^{n+1})^2>2\sqrt{\gamma^n}(1-\epsilon_B)\tilde{\tau}^{n+1}\f$ at
79 : * any grid point, then the cell is troubled.
80 : * <td> `-3`
81 : *
82 : * <tr><td> attempt a primitive recovery using the `RecoveryScheme` from the
83 : * template parameter. The cell is marked as troubled if the primitive recovery
84 : * fails at any grid point.
85 : * <td> `-4`
86 : *
87 : * <tr><td> if \f$\max(\rho^{n+1})\f$ is below `tci_options.atmosphere_density`
88 : * then the cell is in atmosphere and not marked as troubled. Note that the
89 : * magnetic field is still freely evolved.
90 : * <td> `0`
91 : *
92 : * <tr><td> apply the Persson TCI to \f$\tilde{D}^{n+1}\f$
93 : * <td> `-5`
94 : *
95 : * <tr><td> apply the Persson TCI to \f$\tilde{Y}_e^{n+1}\f$
96 : * <td> `-6`
97 : *
98 : * <tr><td> apply the Persson TCI to pressure \f$p^{n+1}\f$
99 : * <td> `-7`
100 : *
101 : * <tr><td> apply the Persson TCI to the magnitude of \f$\tilde{B}^{n+1}\f$ if
102 : * its magnitude is greater than `tci_options.magnetic_field_cutoff`
103 : * <td> `-8`
104 : *
105 : * <tr><td> apply the RDMP TCI to `TildeD`
106 : * <td> `-9`
107 : *
108 : * <tr><td> apply the RDMP TCI to `TildeTau`
109 : * <td> `-10`
110 : *
111 : * <tr><td> apply the RDMP TCI to `TildeB`
112 : * <td> `-11`
113 : *
114 : * </table>
115 : *
116 : * If the cell is not flagged as troubled then the primitives are computed at
117 : * time level `n+1`.
118 : *
119 : * The second column of the table above denotes the value of an integer stored
120 : * as the first element of the returned `std::tuple`, which indicates the
121 : * particular kind of check that failed. For example, if the fifth check
122 : * (primitive recovery) fails and cell is marked as troubled, an integer with
123 : * value `-4` is stored in the first slot of the returned tuple. Note that this
124 : * integer is marking only the _first_ check to fail, since checks are done in a
125 : * particular sequence as listed above. If all checks are passed and cell is not
126 : * troubled, it is returned with the value `0`.
127 : *
128 : * \note We adopt negative integers to mark TCI status from DG grid returned by
129 : * TciOnDgGrid class. Positive integers are used for TCIs on FD grid; see
130 : * TciOnFdGrid and its documentation.
131 : *
132 : */
133 : template <typename RecoveryScheme>
134 1 : class TciOnDgGrid {
135 : public:
136 0 : using return_tags =
137 : tmpl::list<::Tags::Variables<hydro::grmhd_tags<DataVector>>>;
138 0 : using argument_tags = tmpl::list<
139 : grmhd::ValenciaDivClean::Tags::TildeD,
140 : grmhd::ValenciaDivClean::Tags::TildeYe,
141 : grmhd::ValenciaDivClean::Tags::TildeTau,
142 : grmhd::ValenciaDivClean::Tags::TildeS<>,
143 : grmhd::ValenciaDivClean::Tags::TildeB<>,
144 : grmhd::ValenciaDivClean::Tags::TildePhi,
145 : gr::Tags::SpatialMetric<DataVector, 3>,
146 : gr::Tags::InverseSpatialMetric<DataVector, 3>,
147 : gr::Tags::SqrtDetSpatialMetric<DataVector>,
148 : hydro::Tags::GrmhdEquationOfState, domain::Tags::Mesh<3>,
149 : evolution::dg::subcell::Tags::Mesh<3>,
150 : evolution::dg::subcell::Tags::DataForRdmpTci, Tags::TciOptions,
151 : evolution::dg::subcell::Tags::SubcellOptions<3>,
152 : grmhd::ValenciaDivClean::Tags::PrimitiveFromConservativeOptions>;
153 :
154 0 : static std::tuple<int, evolution::dg::subcell::RdmpTciData> apply(
155 : gsl::not_null<Variables<hydro::grmhd_tags<DataVector>>*> dg_prim_vars,
156 : const Scalar<DataVector>& tilde_d, const Scalar<DataVector>& tilde_ye,
157 : const Scalar<DataVector>& tilde_tau,
158 : const tnsr::i<DataVector, 3, Frame::Inertial>& tilde_s,
159 : const tnsr::I<DataVector, 3, Frame::Inertial>& tilde_b,
160 : const Scalar<DataVector>& tilde_phi,
161 : const tnsr::ii<DataVector, 3, Frame::Inertial>& spatial_metric,
162 : const tnsr::II<DataVector, 3, Frame::Inertial>& inv_spatial_metric,
163 : const Scalar<DataVector>& sqrt_det_spatial_metric,
164 : const EquationsOfState::EquationOfState<true, 3>& eos,
165 : const Mesh<3>& dg_mesh, const Mesh<3>& subcell_mesh,
166 : const evolution::dg::subcell::RdmpTciData& past_rdmp_tci_data,
167 : const TciOptions& tci_options,
168 : const evolution::dg::subcell::SubcellOptions& subcell_options,
169 : const grmhd::ValenciaDivClean::PrimitiveFromConservativeOptions&
170 : primitive_from_conservative_options,
171 : double persson_exponent, bool element_stays_on_dg);
172 : };
173 : } // namespace grmhd::ValenciaDivClean::subcell
|