Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/Control/RNGTest/InputDeck/InputDeck.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 Random number generator test suite input deck
9 : : \details This file defines the heterogeneous stack that is used for storing
10 : : the data from user input during the control file parsing of the random
11 : : number generator test suite, RNGTest.
12 : : */
13 : : // *****************************************************************************
14 : : #ifndef RNGTestInputDeck_h
15 : : #define RNGTestInputDeck_h
16 : :
17 : : #include <brigand/algorithms/for_each.hpp>
18 : :
19 : : #include "NoWarning/set.hpp"
20 : :
21 : : #include "QuinoaBuildConfig.hpp"
22 : : #include "TaggedTuple.hpp"
23 : : #include "RNGTest/CmdLine/CmdLine.hpp"
24 : :
25 : : namespace rngtest {
26 : : namespace ctr {
27 : :
28 : : //! Member data for tagged tuple
29 : : using InputDeckMembers = brigand::list<
30 : : tag::cmd, CmdLine
31 : : , tag::title, kw::title::info::expect::type
32 : : , tag::selected, selects
33 : : , tag::param, parameters
34 : : , tag::error, std::vector< std::string >
35 : : >;
36 : :
37 : : //! \brief InputDeck is a TaggedTuple specialized to RNGTest
38 : : //! \details The stack is a tagged tuple, a hierarchical heterogeneous data
39 : : //! structure where all parsed information is stored.
40 : : //! \see Base/TaggedTuple.h
41 : : //! \see Control/RNGTest/Types.h
42 : : class InputDeck : public tk::TaggedTuple< InputDeckMembers > {
43 : :
44 : : public:
45 : : //! \brief RNGTest input deck keywords
46 : : //! \see tk::grm::use and its documentation
47 : : using keywords = brigand::set< kw::title
48 : : , kw::end
49 : : , kw::smallcrush
50 : : , kw::crush
51 : : , kw::bigcrush
52 : : , kw::cja
53 : : , kw::cja_accurate
54 : : #ifdef HAS_RNGSSE2
55 : : , kw::rngsse_gm19
56 : : , kw::rngsse_gm29
57 : : , kw::rngsse_gm31
58 : : , kw::rngsse_gm55
59 : : , kw::rngsse_gm61
60 : : , kw::rngsse_gq581
61 : : , kw::rngsse_gq583
62 : : , kw::rngsse_gq584
63 : : , kw::rngsse_mt19937
64 : : , kw::rngsse_lfsr113
65 : : , kw::rngsse_mrg32k3a
66 : : , kw::seqlen
67 : : #endif
68 : : #ifdef HAS_MKL
69 : : , kw::mkl_mcg31
70 : : , kw::mkl_r250
71 : : , kw::mkl_mrg32k3a
72 : : , kw::mkl_mcg59
73 : : , kw::mkl_wh
74 : : , kw::mkl_mt19937
75 : : , kw::mkl_mt2203
76 : : , kw::mkl_sfmt19937
77 : : , kw::mkl_sobol
78 : : , kw::mkl_niederr
79 : : , kw::mkl_nondeterm
80 : : , kw::uniform_method
81 : : , kw::gaussian_method
82 : : , kw::gaussianmv_method
83 : : , kw::beta_method
84 : : , kw::standard
85 : : , kw::accurate
86 : : , kw::boxmuller
87 : : , kw::boxmuller2
88 : : , kw::icdf
89 : : #endif
90 : : , kw::seed
91 : : , kw::r123_threefry
92 : : , kw::r123_philox
93 : : , kw::gamma_method
94 : : , kw::gnorm
95 : : , kw::gnorm_accurate
96 : : >;
97 : :
98 : : //! Set of tags to ignore when printing this InputDeck
99 : : using ignore = CmdLine::ignore;
100 : :
101 : : //! \brief Constructor: set all defaults
102 : : //! \param[in] cl Previously parsed and store command line
103 : : //! \details Anything not set here is initialized by the compiler using the
104 : : //! default constructor for the corresponding type.
105 : 180 : explicit InputDeck( const CmdLine& cl = {} ) {
106 : : // Set previously parsed command line
107 [ + - ]: 180 : get< tag::cmd >() = cl;
108 : : // Initialize help
109 : 180 : const auto& ctrinfoFill = tk::ctr::Info( get< tag::cmd, tag::ctrinfo >() );
110 [ + - ]: 180 : brigand::for_each< keywords >( ctrinfoFill );
111 : 180 : }
112 : :
113 : : /** @name Pack/Unpack: Serialize InputDeck object for Charm++ */
114 : : ///@{
115 : : //! \brief Pack/Unpack serialize member function
116 : : //! \param[in,out] p Charm++'s PUP::er serializer object reference
117 : 184 : void pup( PUP::er& p ) { tk::TaggedTuple< InputDeckMembers >::pup(p); }
118 : : //! \brief Pack/Unpack serialize operator|
119 : : //! \param[in,out] p Charm++'s PUP::er serializer object reference
120 : : //! \param[in,out] i InputDeck object reference
121 : 184 : friend void operator|( PUP::er& p, InputDeck& i ) { i.pup(p); }
122 : : //@}
123 : : };
124 : :
125 : : } // ctr::
126 : : } // rngtest::
127 : :
128 : : #endif // RNGTestInputDeck_h
|