Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/Control/Walker/Options/DiffEq.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 Differential equation options and associations for walker
9 : : \details Differential equation options and associations for walker
10 : : */
11 : : // *****************************************************************************
12 : : #ifndef WalkerDiffEqOptions_h
13 : : #define WalkerDiffEqOptions_h
14 : :
15 : : #include <brigand/sequences/list.hpp>
16 : :
17 : : #include "TaggedTuple.hpp"
18 : : #include "Toggle.hpp"
19 : : #include "Keywords.hpp"
20 : : #include "Walker/Options/InitPolicy.hpp"
21 : : #include "Walker/Options/CoeffPolicy.hpp"
22 : :
23 : : namespace walker {
24 : : namespace ctr {
25 : :
26 : : //! Differential equation types
27 : : enum class DiffEqType : uint8_t { NO_DIFFEQ=0,
28 : : OU,
29 : : DIAG_OU,
30 : : SKEWNORMAL,
31 : : GAMMA,
32 : : BETA,
33 : : NUMFRACBETA,
34 : : MASSFRACBETA,
35 : : MIXNUMFRACBETA,
36 : : MIXMASSFRACBETA,
37 : : DIRICHLET,
38 : : MIXDIRICHLET,
39 : : GENDIR,
40 : : WRIGHTFISHER,
41 : : POSITION,
42 : : DISSIPATION,
43 : : VELOCITY };
44 : :
45 : : //! Pack/Unpack: forward overload to generic enum class packer
46 : 371 : inline void operator|( PUP::er& p, DiffEqType& e ) { PUP::pup( p, e ); }
47 : :
48 : : //! Differential equation key used to access a diff eq in a factory
49 : : using DiffEqKey =
50 : : tk::TaggedTuple< brigand::list<
51 : : tag::diffeq, DiffEqType
52 : : , tag::initpolicy, ctr::InitPolicyType
53 : : , tag::coeffpolicy, ctr::CoeffPolicyType
54 : : > >;
55 : :
56 : : //! Class with base templated on the above enum class with associations
57 : : class DiffEq : public tk::Toggle< DiffEqType > {
58 : :
59 : : public:
60 : : // List valid expected choices to make them also available at compile-time
61 : : using keywords = brigand::list< kw::ornstein_uhlenbeck
62 : : , kw::diag_ou
63 : : , kw::skewnormal
64 : : , kw::gamma
65 : : , kw::beta
66 : : , kw::numfracbeta
67 : : , kw::massfracbeta
68 : : , kw::mixnumfracbeta
69 : : , kw::mixmassfracbeta
70 : : , kw::dirichlet
71 : : , kw::mixdirichlet
72 : : , kw::gendir
73 : : , kw::wrightfisher
74 : : , kw::position
75 : : , kw::dissipation
76 : : , kw::velocity
77 : : >;
78 : :
79 : : //! Constructor: pass associations references to base, which will handle
80 : : //! class-user interactions
81 : 172 : explicit DiffEq() :
82 : : tk::Toggle< DiffEqType >( "Differential equation",
83 : : //! Enums -> names
84 : 0 : { { DiffEqType::NO_DIFFEQ, "n/a" },
85 [ + - ]: 172 : { DiffEqType::OU, kw::ornstein_uhlenbeck::name() },
86 [ + - ]: 344 : { DiffEqType::DIAG_OU, kw::diag_ou::name() },
87 [ + - ]: 344 : { DiffEqType::SKEWNORMAL, kw::skewnormal::name() },
88 [ + - ]: 344 : { DiffEqType::GAMMA, kw::gamma::name() },
89 [ + - ]: 344 : { DiffEqType::BETA, kw::beta::name() },
90 [ + - ]: 344 : { DiffEqType::NUMFRACBETA, kw::numfracbeta::name() },
91 [ + - ]: 344 : { DiffEqType::MASSFRACBETA, kw::massfracbeta::name() },
92 [ + - ]: 344 : { DiffEqType::MIXNUMFRACBETA, kw::mixnumfracbeta::name() },
93 [ + - ]: 344 : { DiffEqType::MIXMASSFRACBETA, kw::mixmassfracbeta::name() },
94 [ + - ]: 344 : { DiffEqType::DIRICHLET, kw::dirichlet::name() },
95 [ + - ]: 344 : { DiffEqType::MIXDIRICHLET, kw::mixdirichlet::name() },
96 [ + - ]: 344 : { DiffEqType::GENDIR, kw::gendir::name() },
97 [ + - ]: 344 : { DiffEqType::WRIGHTFISHER, kw::wrightfisher::name() },
98 [ + - ]: 344 : { DiffEqType::POSITION, kw::position::name() },
99 [ + - ]: 344 : { DiffEqType::DISSIPATION, kw::dissipation::name() },
100 [ + - ]: 344 : { DiffEqType::VELOCITY, kw::velocity::name() } },
101 : : //! keywords -> Enums
102 : 344 : { { "no_diffeq", DiffEqType::NO_DIFFEQ },
103 [ + - ]: 172 : { kw::ornstein_uhlenbeck::string(), DiffEqType::OU },
104 [ + - ]: 344 : { kw::diag_ou::string(), DiffEqType::DIAG_OU },
105 [ + - ]: 344 : { kw::skewnormal::string(), DiffEqType::SKEWNORMAL },
106 [ + - ]: 344 : { kw::gamma::string(), DiffEqType::GAMMA },
107 [ + - ]: 344 : { kw::beta::string(), DiffEqType::BETA },
108 [ + - ]: 344 : { kw::numfracbeta::string(), DiffEqType::NUMFRACBETA },
109 [ + - ]: 344 : { kw::massfracbeta::string(), DiffEqType::MASSFRACBETA },
110 [ + - ]: 344 : { kw::mixnumfracbeta::string(), DiffEqType::MIXNUMFRACBETA },
111 [ + - ]: 344 : { kw::mixmassfracbeta::string(), DiffEqType::MIXMASSFRACBETA },
112 [ + - ]: 344 : { kw::dirichlet::string(), DiffEqType::DIRICHLET },
113 [ + - ]: 344 : { kw::mixdirichlet::string(), DiffEqType::MIXDIRICHLET },
114 [ + - ]: 344 : { kw::gendir::string(), DiffEqType::GENDIR },
115 [ + - ]: 344 : { kw::wrightfisher::string(), DiffEqType::WRIGHTFISHER },
116 [ + - ]: 344 : { kw::position::string(), DiffEqType::POSITION },
117 [ + - ]: 344 : { kw::dissipation::string(), DiffEqType::DISSIPATION },
118 [ + - ][ + - ]: 11696 : { kw::velocity::string(), DiffEqType::VELOCITY } } ) {}
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + + ]
[ + + ][ - - ]
[ - - ]
119 : : };
120 : :
121 : : } // ctr::
122 : : } // walker::
123 : :
124 : : #endif // WalkerDiffEqOptions_h
|