Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <ostream>
7 :
8 : /// \cond
9 : namespace Options {
10 : class Option;
11 : template <typename T>
12 : struct create_from_yaml;
13 : } // namespace Options
14 : /// \endcond
15 :
16 : namespace NewtonianEuler {
17 : namespace Limiters {
18 : /// \ingroup LimitersGroup
19 : /// \brief Type of NewtonianEuler variables to apply limiter to
20 : ///
21 : /// \note The option `Characteristic` denotes the characteristic fields computed
22 : /// from the analytic expression, whereas the option `NumericalCharacteristic`
23 : /// denotes the fields as computed numerically by solving for the eigenvectors
24 : /// of the flux Jacobian.
25 : ///
26 : /// Initial experiments with limiting in a Reimann problem by FH suggest the
27 : /// numerical eigenvectors can sometimes produce more accurate results than the
28 : /// analytic ones (does the numerical solution give a better linear combination
29 : /// of the degenerate eigenvectors?), and is not too much more expensive
30 : /// (probably the expense of the limiter as a whole dominates). More testing is
31 : /// needed to verify and understand this...
32 0 : enum class VariablesToLimit {
33 : Conserved,
34 : Characteristic,
35 : NumericalCharacteristic
36 : };
37 :
38 0 : std::ostream& operator<<(std::ostream& os, VariablesToLimit vars_to_limit);
39 : } // namespace Limiters
40 : } // namespace NewtonianEuler
41 :
42 : template <>
43 0 : struct Options::create_from_yaml<NewtonianEuler::Limiters::VariablesToLimit> {
44 : template <typename Metavariables>
45 0 : static NewtonianEuler::Limiters::VariablesToLimit create(
46 : const Options::Option& options) {
47 : return create<void>(options);
48 : }
49 : };
50 :
51 : template <>
52 0 : NewtonianEuler::Limiters::VariablesToLimit
53 : Options::create_from_yaml<NewtonianEuler::Limiters::VariablesToLimit>::create<
54 : void>(const Options::Option& options);
|