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);