Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/Control/Inciter/Options/Scheme.hpp
4 : : \copyright 2012-2015 J. Bakosi,
5 : : 2016-2018 Los Alamos National Security, LLC.,
6 : : 2019-2021 Triad National Security, LLC.
7 : : All rights reserved. See the LICENSE file for details.
8 : : \brief Discretization scheme options for inciter
9 : : \details Discretization scheme options for inciter
10 : : */
11 : : // *****************************************************************************
12 : : #ifndef SchemeOptions_h
13 : : #define SchemeOptions_h
14 : :
15 : : #include <brigand/sequences/list.hpp>
16 : :
17 : : #include "Toggle.hpp"
18 : : #include "Keywords.hpp"
19 : : #include "PUPUtil.hpp"
20 : : #include "Centering.hpp"
21 : :
22 : : namespace inciter {
23 : : namespace ctr {
24 : :
25 : : //! Scheme types
26 : : enum class SchemeType : uint8_t { DiagCG
27 : : , ALECG
28 : : , DG
29 : : , P0P1
30 : : , DGP1
31 : : , DGP2
32 : : , PDG };
33 : :
34 : : //! Pack/Unpack SchemeType: forward overload to generic enum class packer
35 : 1798 : inline void operator|( PUP::er& p, SchemeType& e ) { PUP::pup( p, e ); }
36 : :
37 : : //! \brief Scheme options: outsource to base templated on enum type
38 : : class Scheme : public tk::Toggle< SchemeType > {
39 : :
40 : : public:
41 : : //! Valid expected choices to make them also available at compile-time
42 : : using keywords = brigand::list< kw::diagcg
43 : : , kw::alecg
44 : : , kw::dg
45 : : , kw::p0p1
46 : : , kw::dgp1
47 : : , kw::dgp2
48 : : , kw::pdg
49 : : >;
50 : :
51 : : //! \brief Options constructor
52 : : //! \details Simply initialize in-line and pass associations to base, which
53 : : //! will handle client interactions
54 : 907672 : explicit Scheme() :
55 : : tk::Toggle< SchemeType >(
56 : : //! Group, i.e., options, name
57 [ + - ]: 1815344 : kw::scheme::name(),
58 : : //! Enums -> names (if defined, policy codes, if not, name)
59 [ + - ]: 907672 : { { SchemeType::DiagCG, kw::diagcg::name() },
60 [ + - ]: 1815344 : { SchemeType::ALECG, kw::alecg::name() },
61 [ + - ]: 1815344 : { SchemeType::DG, kw::dg::name() },
62 [ + - ]: 1815344 : { SchemeType::P0P1, kw::p0p1::name() },
63 [ + - ]: 1815344 : { SchemeType::DGP1, kw::dgp1::name() },
64 [ + - ]: 1815344 : { SchemeType::DGP2, kw::dgp2::name() },
65 [ + - ]: 1815344 : { SchemeType::PDG, kw::pdg::name() } },
66 : : //! keywords -> Enums
67 : 0 : { { kw::diagcg::string(), SchemeType::DiagCG },
68 [ + - ]: 1815344 : { kw::alecg::string(), SchemeType::ALECG },
69 [ + - ]: 1815344 : { kw::dg::string(), SchemeType::DG },
70 [ + - ]: 1815344 : { kw::p0p1::string(), SchemeType::P0P1 },
71 [ + - ]: 1815344 : { kw::dgp1::string(), SchemeType::DGP1 },
72 [ + - ]: 1815344 : { kw::dgp2::string(), SchemeType::DGP2 },
73 [ + - ][ + - ]: 28137832 : { kw::pdg::string(), SchemeType::PDG } } ) {}
[ + - ][ + - ]
[ + + ][ + + ]
[ - - ][ - - ]
74 : :
75 : : //! Return scheme centering for SchemeType
76 : : //! \param[in] type Scheme type
77 : : //! \return Mesh centering for scheme type
78 : 907235 : tk::Centering centering( SchemeType type ) {
79 [ + + ][ + + ]: 907235 : if ( type == SchemeType::DiagCG ||
80 : : type == SchemeType::ALECG )
81 : :
82 : 2634 : return tk::Centering::NODE;
83 : :
84 [ + + ][ + + ]: 904601 : else if ( type == SchemeType::DG ||
85 [ + + ]: 904411 : type == SchemeType::P0P1 ||
86 [ + + ]: 685815 : type == SchemeType::DGP1 ||
87 [ + - ]: 175785 : type == SchemeType::DGP2 ||
88 : : type == SchemeType::PDG )
89 : :
90 : 904601 : return tk::Centering::ELEM;
91 : :
92 [ - - ][ - - ]: 0 : else Throw( "No such scheme centering" );
[ - - ]
93 : : }
94 : : };
95 : :
96 : : } // ctr::
97 : : } // inciter::
98 : :
99 : : #endif // SchemeOptions_h
|