Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/Control/Walker/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 Walker's input deck
9 : : \details Walker's input deck
10 : : */
11 : : // *****************************************************************************
12 : : #ifndef WalkerInputDeck_h
13 : : #define WalkerInputDeck_h
14 : :
15 : : #include <limits>
16 : : #include <iostream>
17 : :
18 : : #include <brigand/algorithms/for_each.hpp>
19 : :
20 : : #include "NoWarning/set.hpp"
21 : :
22 : : #include "QuinoaBuildConfig.hpp"
23 : : #include "TaggedTuple.hpp"
24 : : #include "HelpFactory.hpp"
25 : : #include "Walker/CmdLine/CmdLine.hpp"
26 : : #include "Walker/Components.hpp"
27 : :
28 : : namespace walker {
29 : : namespace ctr {
30 : :
31 : : //! Member data for tagged tuple
32 : : using InputDeckMembers = brigand::list<
33 : : tag::cmd, CmdLine
34 : : , tag::title, kw::title::info::expect::type
35 : : , tag::selected, selects
36 : : , tag::discr, discretization
37 : : , tag::prec, precision
38 : : , tag::flformat, floatformat
39 : : , tag::component, ncomps
40 : : , tag::output, output_parameters
41 : : , tag::param, parameters
42 : : , tag::stat, std::vector< tk::ctr::Product >
43 : : , tag::pdf, std::vector< tk::ctr::Probability >
44 : : , tag::error, std::vector< std::string >
45 : : >;
46 : :
47 : : //! InputDeck : Control< specialized to Walker >, see Types.h
48 : : class InputDeck : public tk::TaggedTuple< InputDeckMembers > {
49 : :
50 : : public:
51 : : //! \brief Walker input deck keywords
52 : : //! \see See also tk::grm::use
53 : : using keywords = brigand::set< kw::precision
54 : : , kw::end
55 : : , kw::depvar
56 : : , kw::title
57 : : , kw::statistics
58 : : , kw::interval_iter
59 : : , kw::pdfs
60 : : , kw::filetype
61 : : , kw::pdf_policy
62 : : , kw::pdf_centering
63 : : , kw::txt_float_format
64 : : , kw::npar
65 : : , kw::nstep
66 : : , kw::term
67 : : , kw::dt
68 : : , kw::ttyi
69 : : , kw::pari
70 : : , kw::rngs
71 : : , kw::ncomp
72 : : , kw::rng
73 : : , kw::walker
74 : : , kw::init
75 : : , kw::coeff
76 : : , kw::diag_ou
77 : : , kw::ornstein_uhlenbeck
78 : : , kw::skewnormal
79 : : , kw::gamma
80 : : , kw::dirichlet
81 : : , kw::mixdirichlet
82 : : , kw::gendir
83 : : , kw::wrightfisher
84 : : , kw::beta
85 : : , kw::sde_sigmasq
86 : : , kw::sde_theta
87 : : , kw::sde_mu
88 : : , kw::sde_mean
89 : : , kw::sde_cov
90 : : , kw::mean_gradient
91 : : , kw::gravity
92 : : , kw::sde_T
93 : : , kw::sde_lambda
94 : : , kw::sde_b
95 : : , kw::sde_S
96 : : , kw::sde_c
97 : : , kw::sde_kappa
98 : : , kw::sde_omega
99 : : , kw::cja
100 : : , kw::cja_accurate
101 : : #ifdef HAS_RNGSSE2
102 : : , kw::rngsse_gm19
103 : : , kw::rngsse_gm29
104 : : , kw::rngsse_gm31
105 : : , kw::rngsse_gm55
106 : : , kw::rngsse_gm61
107 : : , kw::rngsse_gq581
108 : : , kw::rngsse_gq583
109 : : , kw::rngsse_gq584
110 : : , kw::rngsse_mt19937
111 : : , kw::rngsse_lfsr113
112 : : , kw::rngsse_mrg32k3a
113 : : , kw::seqlen
114 : : #endif
115 : : , kw::r123_threefry
116 : : , kw::r123_philox
117 : : , kw::const_shear
118 : : , kw::stationary
119 : : , kw::position
120 : : , kw::velocity
121 : : , kw::velocitysde
122 : : , kw::inst_velocity
123 : : , kw::seed
124 : : #ifdef HAS_MKL
125 : : , kw::mkl_mcg31
126 : : , kw::mkl_r250
127 : : , kw::mkl_mrg32k3a
128 : : , kw::mkl_mcg59
129 : : , kw::mkl_wh
130 : : , kw::mkl_mt19937
131 : : , kw::mkl_mt2203
132 : : , kw::mkl_sfmt19937
133 : : , kw::mkl_sobol
134 : : , kw::mkl_niederr
135 : : , kw::mkl_nondeterm
136 : : , kw::uniform_method
137 : : , kw::gaussian_method
138 : : , kw::gaussianmv_method
139 : : , kw::beta_method
140 : : , kw::standard
141 : : , kw::accurate
142 : : , kw::boxmuller
143 : : , kw::boxmuller2
144 : : , kw::icdf
145 : : #endif
146 : : , kw::constcoeff
147 : : , kw::decay
148 : : , kw::raw
149 : : , kw::zero
150 : : , kw::elem
151 : : , kw::node
152 : : , kw::txt
153 : : , kw::gmshtxt
154 : : , kw::gmshbin
155 : : , kw::exodusii
156 : : , kw::overwrite
157 : : , kw::multiple
158 : : , kw::evolution
159 : : , kw::txt_float_default
160 : : , kw::txt_float_fixed
161 : : , kw::txt_float_scientific
162 : : , kw::numfracbeta
163 : : , kw::sde_rho2
164 : : , kw::sde_rho
165 : : , kw::sde_rcomma
166 : : , kw::icdelta
167 : : , kw::spike
168 : : , kw::sde_bprime
169 : : , kw::sde_kappaprime
170 : : , kw::mixnumfracbeta
171 : : , kw::mixmassfracbeta
172 : : , kw::massfracbeta
173 : : , kw::sde_r
174 : : , kw::homogeneous
175 : : , kw::homdecay
176 : : , kw::montecarlo_homdecay
177 : : , kw::hydrotimescale
178 : : , kw::jointbeta
179 : : , kw::jointdelta
180 : : , kw::jointgaussian
181 : : , kw::jointcorrgaussian
182 : : , kw::jointdirichlet
183 : : , kw::icbeta
184 : : , kw::betapdf
185 : : , kw::dirichletpdf
186 : : , kw::sde_c0
187 : : , kw::icgaussian
188 : : , kw::icjointgaussian
189 : : , kw::icdirichlet
190 : : , kw::gaussian
191 : : , kw::dissipation
192 : : , kw::jointgamma
193 : : , kw::hydrotimescales
194 : : , kw::hydroproductions
195 : : , kw::eq_A005H
196 : : , kw::eq_A005S
197 : : , kw::eq_A005L
198 : : , kw::eq_A05H
199 : : , kw::eq_A05S
200 : : , kw::eq_A05L
201 : : , kw::eq_A075H
202 : : , kw::eq_A075S
203 : : , kw::eq_A075L
204 : : , kw::prod_A005H
205 : : , kw::prod_A005S
206 : : , kw::prod_A005L
207 : : , kw::prod_A05H
208 : : , kw::prod_A05S
209 : : , kw::prod_A05L
210 : : , kw::prod_A075H
211 : : , kw::prod_A075S
212 : : , kw::prod_A075L
213 : : , kw::gnorm
214 : : , kw::gnorm_accurate
215 : : , kw::gamma_method
216 : : , kw::icgamma
217 : : , kw::gammapdf
218 : : , kw::sde_c3
219 : : , kw::sde_c4
220 : : , kw::sde_com1
221 : : , kw::sde_com2
222 : : , kw::fullvar
223 : : , kw::fluctuation
224 : : , kw::product
225 : : , kw::fluctuating_momentum
226 : : , kw::solve
227 : : , kw::variant
228 : : , kw::slm
229 : : , kw::glm
230 : : , kw::normalization
231 : : , kw::light
232 : : , kw::heavy
233 : : >;
234 : :
235 : : //! Set of tags to ignore when printing this InputDeck
236 : : using ignore =
237 : : brigand::set< tag::cmdinfo
238 : : , tag::ctrinfo
239 : : , tag::helpkw >;
240 : :
241 : : //! \brief Constructor: set all defaults
242 : : //! \param[in] cl Previously parsed and store command line
243 : : //! \details Anything not set here is initialized by the compiler using the
244 : : //! default constructor for the corresponding type.
245 : 572 : explicit InputDeck( const CmdLine& cl = {} ) {
246 : : // Set previously parsed command line
247 [ + - ]: 572 : get< tag::cmd >() = cl;
248 : : // Default discretization parameters
249 : 572 : get< tag::discr, tag::npar >() = 1;
250 : 572 : get< tag::discr, tag::nstep >() =
251 : 572 : std::numeric_limits< kw::nstep::info::expect::type >::max();
252 : 572 : get< tag::discr, tag::term >() = 1.0;
253 : 572 : get< tag::discr, tag::dt >() = 0.5;
254 : : // Default txt floating-point output precision in digits
255 : 572 : get< tag::prec, tag::stat >() = std::cout.precision();
256 : 572 : get< tag::prec, tag::pdf >() = std::cout.precision();
257 : : // Default intervals
258 : 572 : get< tag::output, tag::iter, tag::tty >() = 1;
259 : 572 : get< tag::output, tag::iter, tag::stat >() = 1;
260 : 572 : get< tag::output, tag::iter, tag::particles >() = 10000;
261 : 572 : get< tag::output, tag::iter, tag::pdf >() = 1;
262 : : // Default requested statistics
263 : 572 : get< tag::stat >() = std::vector< tk::ctr::Product >();
264 : : // Initialize help
265 : 572 : const auto& ctrinfoFill = tk::ctr::Info( get< tag::cmd, tag::ctrinfo >() );
266 [ + - ]: 572 : brigand::for_each< keywords >( ctrinfoFill );
267 : 572 : }
268 : :
269 : : //! Extract moment names of requested statistics
270 : 646 : std::vector< std::string > momentNames( std::function<
271 : : bool ( const std::vector< tk::ctr::Term >& ) > momentType ) const
272 : : {
273 : 646 : std::vector< std::string > names;
274 [ + + ]: 10862 : for (const auto& product : get< tag::stat >()) {
275 [ + - ][ + + ]: 10216 : if (momentType( product )) {
276 [ + - ]: 5108 : names.emplace_back( std::string() );
277 [ + + ]: 16155 : for (const auto& term : product)
278 [ + - ]: 11047 : names.back() += tk::ctr::Term( term.var, term.field );
279 : : }
280 : : }
281 : 646 : return names;
282 : : }
283 : :
284 : : //! Query if there are any statistics or PDFs to estimate
285 : : //! \return True if there are any statistics or PDFs to estimate
286 : 4902527 : bool stat()
287 [ + + ][ + - ]: 4902527 : { return !get< tag::stat >().empty() || !get< tag::pdf >().empty(); }
288 : :
289 : : //! Query if there are any PDFs to estimate
290 : : //! \return True if there are any PDFs to estimate
291 : 8991578 : bool pdf() { return !get< tag::pdf >().empty(); }
292 : :
293 : : /** @name Pack/Unpack: Serialize InputDeck object for Charm++ */
294 : : ///@{
295 : : //! \brief Pack/Unpack serialize member function
296 : : //! \param[in,out] p Charm++'s PUP::er serializer object reference
297 : 646 : void pup( PUP::er& p ) { tk::TaggedTuple< InputDeckMembers >::pup(p); }
298 : : //! \brief Pack/Unpack serialize operator|
299 : : //! \param[in,out] p Charm++'s PUP::er serializer object reference
300 : : //! \param[in,out] i InputDeck object reference
301 : 646 : friend void operator|( PUP::er& p, InputDeck& i ) { i.pup(p); }
302 : : //@}
303 : : };
304 : :
305 : : } // ctr::
306 : : } // Walker::
307 : :
308 : : #endif // WalkerInputDeck_h
|