Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/Control/Inciter/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 Inciter's input deck definition
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
11 : : computational shock hydrodynamics tool, Inciter.
12 : : */
13 : : // *****************************************************************************
14 : : #ifndef InciterInputDeck_h
15 : : #define InciterInputDeck_h
16 : :
17 : : #include <limits>
18 : : #include <iomanip>
19 : : #include <iostream>
20 : :
21 : : #include <brigand/algorithms/for_each.hpp>
22 : :
23 : : #include "NoWarning/set.hpp"
24 : :
25 : : #include "Inciter/CmdLine/CmdLine.hpp"
26 : : #include "Inciter/Components.hpp"
27 : :
28 : : namespace inciter {
29 : :
30 : : namespace ctr {
31 : :
32 : : //! Member data for tagged tuple
33 : : using InputDeckMembers = brigand::list<
34 : : tag::cmd, CmdLine
35 : : , tag::title, kw::title::info::expect::type
36 : : , tag::selected, selects
37 : : , tag::amr, amr
38 : : , tag::ale, ale
39 : : , tag::pref, pref
40 : : , tag::discr, discretization
41 : : , tag::prec, precision
42 : : , tag::flformat, floatformat
43 : : , tag::component, ncomps
44 : : , tag::sys, std::map< tk::ctr::ncomp_t, tk::ctr::ncomp_t >
45 : : , tag::output, output_parameters
46 : : , tag::param, parameters
47 : : , tag::couple, couple
48 : : , tag::diag, diagnostics
49 : : , tag::error, std::vector< std::string >
50 : : , tag::history, history
51 : : >;
52 : :
53 : : //! \brief InputDeck : Control< specialized to Inciter >, see Types.h,
54 : : //! \details The stack is a tagged tuple, a hierarchical heterogeneous data
55 : : //! structure where all parsed information is stored.
56 : : //! \see Base/TaggedTuple.h
57 : : //! \see Control/Inciter/Types.h
58 : : class InputDeck : public tk::TaggedTuple< InputDeckMembers > {
59 : :
60 : : public:
61 : : //! \brief Inciter input deck keywords
62 : : //! \see tk::grm::use and its documentation
63 : : using keywords = brigand::set< kw::title
64 : : , kw::nstep
65 : : , kw::term
66 : : , kw::t0
67 : : , kw::dt
68 : : , kw::ttyi
69 : : , kw::transport
70 : : , kw::end
71 : : , kw::shear_diff
72 : : , kw::slot_cyl
73 : : , kw::problem
74 : : , kw::field_output
75 : : , kw::refined
76 : : , kw::interval_iter
77 : : , kw::interval_time
78 : : , kw::time_range
79 : : , kw::partitioning
80 : : , kw::algorithm
81 : : , kw::rcb
82 : : , kw::rib
83 : : , kw::hsfc
84 : : , kw::phg
85 : : , kw::inciter
86 : : , kw::ncomp
87 : : , kw::nmat
88 : : , kw::pde_diffusivity
89 : : , kw::pde_lambda
90 : : , kw::pde_u0
91 : : , kw::bc_dirichlet
92 : : , kw::sideset
93 : : , kw::compflow
94 : : , kw::multimat
95 : : , kw::ic
96 : : , kw::box
97 : : , kw::lua
98 : : , kw::materialid
99 : : , kw::mass
100 : : , kw::density
101 : : , kw::velocity
102 : : , kw::position
103 : : , kw::acceleration
104 : : , kw::fntype
105 : : , kw::fn
106 : : , kw::move
107 : : , kw::initiate
108 : : , kw::impulse
109 : : , kw::linear
110 : : , kw::pressure
111 : : , kw::energy
112 : : , kw::energy_content
113 : : , kw::temperature
114 : : , kw::xmin
115 : : , kw::xmax
116 : : , kw::ymin
117 : : , kw::ymax
118 : : , kw::zmin
119 : : , kw::zmax
120 : : , kw::txt_float_format
121 : : , kw::txt_float_default
122 : : , kw::txt_float_fixed
123 : : , kw::txt_float_scientific
124 : : , kw::precision
125 : : , kw::diagnostics
126 : : , kw::history_output
127 : : , kw::mesh
128 : : , kw::filename
129 : : , kw::location
130 : : , kw::orientation
131 : : , kw::reference
132 : : , kw::couple
133 : : , kw::material
134 : : , kw::id
135 : : , kw::eos
136 : : , kw::stiffenedgas
137 : : , kw::jwl
138 : : , kw::mat_gamma
139 : : , kw::mat_pstiff
140 : : , kw::mat_mu
141 : : , kw::mat_cv
142 : : , kw::mat_k
143 : : , kw::npar
144 : : , kw::physics
145 : : , kw::advection
146 : : , kw::advdiff
147 : : , kw::navierstokes
148 : : , kw::euler
149 : : , kw::veleq
150 : : , kw::user_defined
151 : : , kw::vortical_flow
152 : : , kw::pde_alpha
153 : : , kw::pde_beta
154 : : , kw::pde_p0
155 : : , kw::ctau
156 : : , kw::cfl
157 : : , kw::dvcfl
158 : : , kw::vortmult
159 : : , kw::mj
160 : : , kw::elem
161 : : , kw::node
162 : : , kw::depvar
163 : : , kw::outvar
164 : : , kw::outvar_density
165 : : , kw::outvar_xmomentum
166 : : , kw::outvar_ymomentum
167 : : , kw::outvar_zmomentum
168 : : , kw::outvar_specific_total_energy
169 : : , kw::outvar_volumetric_total_energy
170 : : , kw::outvar_xvelocity
171 : : , kw::outvar_yvelocity
172 : : , kw::outvar_zvelocity
173 : : , kw::outvar_pressure
174 : : , kw::outvar_material_indicator
175 : : , kw::outvar_analytic
176 : : , kw::nl_energy_growth
177 : : , kw::pde_betax
178 : : , kw::pde_betay
179 : : , kw::pde_betaz
180 : : , kw::pde_ce
181 : : , kw::pde_kappa
182 : : , kw::pde_r0
183 : : , kw::rayleigh_taylor
184 : : , kw::taylor_green
185 : : , kw::filetype
186 : : , kw::exodusii
187 : : , kw::root
188 : : , kw::error
189 : : , kw::l2
190 : : , kw::linf
191 : : , kw::fct
192 : : , kw::fctclip
193 : : , kw::fcteps
194 : : , kw::sysfct
195 : : , kw::sysfctvar
196 : : , kw::pelocal_reorder
197 : : , kw::operator_reorder
198 : : , kw::steady_state
199 : : , kw::residual
200 : : , kw::rescomp
201 : : , kw::amr
202 : : , kw::ale
203 : : , kw::smoother
204 : : , kw::laplace
205 : : , kw::helmholtz
206 : : , kw::meshvelocity
207 : : , kw::meshvel_maxit
208 : : , kw::meshvel_tolerance
209 : : , kw::mesh_motion
210 : : , kw::meshforce
211 : : , kw::none
212 : : , kw::sine
213 : : , kw::fluid
214 : : , kw::amr_t0ref
215 : : , kw::amr_dtref
216 : : , kw::amr_dtref_uniform
217 : : , kw::amr_dtfreq
218 : : , kw::amr_initial
219 : : , kw::amr_uniform
220 : : , kw::amr_uniform_derefine
221 : : , kw::amr_initial_conditions
222 : : , kw::amr_coords
223 : : , kw::amr_error
224 : : , kw::amr_jump
225 : : , kw::amr_hessian
226 : : , kw::amr_refvar
227 : : , kw::amr_tolref
228 : : , kw::amr_tolderef
229 : : , kw::amr_edgelist
230 : : , kw::amr_xminus
231 : : , kw::amr_xplus
232 : : , kw::amr_yminus
233 : : , kw::amr_yplus
234 : : , kw::amr_zminus
235 : : , kw::amr_zplus
236 : : , kw::pref
237 : : , kw::pref_indicator
238 : : , kw::pref_spectral_decay
239 : : , kw::pref_non_conformity
240 : : , kw::pref_ndofmax
241 : : , kw::pref_tolref
242 : : , kw::scheme
243 : : , kw::diagcg
244 : : , kw::alecg
245 : : , kw::dg
246 : : , kw::p0p1
247 : : , kw::dgp1
248 : : , kw::dgp2
249 : : , kw::pdg
250 : : , kw::flux
251 : : , kw::laxfriedrichs
252 : : , kw::hllc
253 : : , kw::upwind
254 : : , kw::ausm
255 : : , kw::hll
256 : : , kw::limiter
257 : : , kw::cweight
258 : : , kw::nolimiter
259 : : , kw::wenop1
260 : : , kw::superbeep1
261 : : , kw::vertexbasedp1
262 : : , kw::prelax
263 : : , kw::prelax_timescale
264 : : , kw::intsharp
265 : : , kw::intsharp_param
266 : : , kw::bc_sym
267 : : , kw::bc_inlet
268 : : , kw::bc_outlet
269 : : , kw::bc_farfield
270 : : , kw::bc_extrapolate
271 : : , kw::bc_timedep
272 : : , kw::bc_stag
273 : : , kw::bc_skip
274 : : , kw::sponge
275 : : , kw::point
276 : : , kw::radius
277 : : , kw::gauss_hump
278 : : , kw::rotated_sod_shocktube
279 : : , kw::cyl_advect
280 : : , kw::cyl_vortex
281 : : , kw::shedding_flow
282 : : , kw::sod_shocktube
283 : : , kw::sedov_blastwave
284 : : , kw::interface_advection
285 : : , kw::gauss_hump_compflow
286 : : , kw::waterair_shocktube
287 : : , kw::shock_hebubble
288 : : , kw::underwater_ex >;
289 : :
290 : : //! Set of tags to ignore when printing this InputDeck
291 : : using ignore = CmdLine::ignore;
292 : :
293 : : //! \brief Constructor: set defaults
294 : : //! \param[in] cl Previously parsed and store command line
295 : : //! \details Anything not set here is initialized by the compiler using the
296 : : //! default constructor for the corresponding type.
297 : 1565 : explicit InputDeck( const CmdLine& cl = {} ) {
298 : : // Set previously parsed command line
299 : : get< tag::cmd >() = cl;
300 : : // Default discretization parameters
301 : 1565 : get< tag::discr, tag::nstep >() =
302 : : std::numeric_limits< kw::nstep::info::expect::type >::max();
303 : 1565 : get< tag::discr, tag::term >() =
304 : : std::numeric_limits< kw::term::info::expect::type >::max();
305 : 1565 : get< tag::discr, tag::t0 >() = 0.0;
306 : 1565 : get< tag::discr, tag::dt >() = 0.0;
307 : 1565 : get< tag::discr, tag::cfl >() = 0.0;
308 : 1565 : get< tag::discr, tag::fct >() = true;
309 : 1565 : get< tag::discr, tag::fctclip >() = false;
310 : 1565 : get< tag::discr, tag::ctau >() = 1.0;
311 : 1565 : get< tag::discr, tag::fcteps >() =
312 : : std::numeric_limits< tk::real >::epsilon();
313 : 1565 : get< tag::discr, tag::pelocal_reorder >() = false;
314 : 1565 : get< tag::discr, tag::operator_reorder >() = false;
315 : 1565 : get< tag::discr, tag::steady_state >() = false;
316 : 1565 : get< tag::discr, tag::residual >() = 1.0e-8;
317 : 1565 : get< tag::discr, tag::rescomp >() = 1;
318 : 1565 : get< tag::discr, tag::scheme >() = SchemeType::DiagCG;
319 : 1565 : get< tag::discr, tag::ndof >() = 1;
320 : 1565 : get< tag::discr, tag::limiter >() = LimiterType::NOLIMITER;
321 : 1565 : get< tag::discr, tag::cweight >() = 1.0;
322 : : get< tag::discr, tag::ndof >() = 1;
323 : 1565 : get< tag::discr, tag::rdof >() = 1;
324 : : // Default field output file type
325 : 1565 : get< tag::selected, tag::filetype >() = tk::ctr::FieldFileType::EXODUSII;
326 : : // Default AMR settings
327 : 1565 : get< tag::amr, tag::amr >() = false;
328 : 1565 : get< tag::amr, tag::t0ref >() = false;
329 : 1565 : get< tag::amr, tag::dtref >() = false;
330 : 1565 : get< tag::amr, tag::dtref_uniform >() = false;
331 : 1565 : get< tag::amr, tag::dtfreq >() = 3;
332 : 1565 : get< tag::amr, tag::error >() = AMRErrorType::JUMP;
333 : 1565 : get< tag::amr, tag::tolref >() = 0.2;
334 : 1565 : get< tag::amr, tag::tolderef >() = 0.05;
335 : : auto rmax =
336 : : std::numeric_limits< kw::amr_xminus::info::expect::type >::max() / 100;
337 : 1565 : get< tag::amr, tag::xminus >() = rmax;
338 : 1565 : get< tag::amr, tag::xplus >() = -rmax;
339 : 1565 : get< tag::amr, tag::yminus >() = rmax;
340 : 1565 : get< tag::amr, tag::yplus >() = -rmax;
341 : 1565 : get< tag::amr, tag::zminus >() = rmax;
342 : 1565 : get< tag::amr, tag::zplus >() = -rmax;
343 : : // Default ALE settings
344 : 1565 : get< tag::ale, tag::ale >() = false;
345 : 1565 : get< tag::ale, tag::smoother >() = MeshVelocitySmootherType::NONE;
346 : 1565 : get< tag::ale, tag::dvcfl >() = 0.0;
347 : 1565 : get< tag::ale, tag::vortmult >() = 0.0;
348 : 1565 : get< tag::ale, tag::maxit >() = 5;
349 : 1565 : get< tag::ale, tag::tolerance >() = 1.0e-2;
350 : : // Default p-refinement settings
351 : 1565 : get< tag::pref, tag::pref >() = false;
352 : 1565 : get< tag::pref, tag::indicator >() = PrefIndicatorType::SPECTRAL_DECAY;
353 : 1565 : get< tag::pref, tag::ndofmax >() = 10;
354 : 1565 : get< tag::pref, tag::tolref >() = 0.5;
355 : : // Default txt floating-point output precision in digits
356 : 1565 : get< tag::prec, tag::diag >() = std::cout.precision();
357 : 1565 : get< tag::prec, tag::history >() = std::cout.precision();
358 : : // Default intervals
359 : 1565 : get< tag::output, tag::iter, tag::tty >() = 1;
360 : 1565 : get< tag::output, tag::iter, tag::diag >() = 1;
361 : 1565 : get< tag::output, tag::iter, tag::field >() =
362 : : std::numeric_limits< kw::interval_iter::info::expect::type >::max();
363 [ + - ]: 1565 : get< tag::output, tag::iter, tag::history >() =
364 : : std::numeric_limits< kw::interval_iter::info::expect::type >::max();
365 : : // Initialize help: fill own keywords
366 : : const auto& ctrinfoFill = tk::ctr::Info( get< tag::cmd, tag::ctrinfo >() );
367 : 1565 : brigand::for_each< keywords >( ctrinfoFill );
368 : 1565 : }
369 : :
370 : : /** @name Pack/Unpack: Serialize InputDeck object for Charm++ */
371 : : ///@{
372 : : //! \brief Pack/Unpack serialize member function
373 : : //! \param[in,out] p Charm++'s PUP::er serializer object reference
374 : : void pup( PUP::er& p ) { tk::TaggedTuple< InputDeckMembers >::pup(p); }
375 : : //! \brief Pack/Unpack serialize operator|
376 : : //! \param[in,out] p Charm++'s PUP::er serializer object reference
377 : : //! \param[in,out] i InputDeck object reference
378 : : friend void operator|( PUP::er& p, InputDeck& i ) { i.pup(p); }
379 : : //@}
380 : :
381 : : //! Extract surface side set ids along which user wants to save solution
382 : : //! \return Unique set of surface side set ids along which user wants to
383 : : //! save solution field variables
384 : : //! \note This returns an ordered set so the order of the set ids are
385 : : //! always the same.
386 : 9056 : std::set< int > outsets() const {
387 : : std::set< int > ids;
388 [ + + ]: 9372 : for (const auto& s : get< tag::cmd, tag::io, tag::surface >()) {
389 [ + - ]: 632 : std::stringstream conv( s );
390 : : int num;
391 [ + - ]: 316 : conv >> num;
392 : : ids.insert( num );
393 : : }
394 : 9056 : return ids;
395 : : }
396 : :
397 : : //! Extract field output variable names the user wants to save
398 : : //! \param[in] c Extract variables only with this centering
399 : : //! \return Unique set of field output variable names user wants
400 : : //! \note This returns an ordered set so the order of the variable names
401 : : //! are alphabetical and unique.
402 : 466 : std::set< OutVar > outvars( tk::Centering c ) const {
403 : : std::set< OutVar > vars;
404 [ + + ]: 2140 : for (const auto& v : get< tag::cmd, tag::io, tag::outvar >()) {
405 [ + + ]: 1674 : if (v.centering == c) vars.insert( v );
406 : : }
407 : 466 : return vars;
408 : : }
409 : :
410 : : //! Extract field output variable names and aliases the user configured
411 : : //! \return Map of field output variable names and alias for all
412 : : //! output variables the user configured
413 : 233 : std::map< std::string, std::string > outvar_aliases() const {
414 : : std::map< std::string, std::string > aliases;
415 [ + + ]: 1070 : for (const auto& v : get< tag::cmd, tag::io, tag::outvar >())
416 [ + + ]: 837 : if (!v.alias.empty()) {
417 [ + - ]: 658 : std::stringstream s;
418 [ + - ]: 658 : s << v;
419 [ + - ][ + - ]: 1316 : aliases[ s.str() ] = v.alias;
420 : : }
421 : 233 : return aliases;
422 : : }
423 : :
424 : : //! Extract list of mesh filenames (each assigned to a solver)
425 [ + - ]: 233 : std::vector< std::string > mesh() const {
426 : : using PDETypes = parameters::Keys;
427 : : std::vector< std::string > meshes;
428 : : brigand::for_each< PDETypes >( Meshes( *this, meshes ) );
429 : 233 : return meshes;
430 : : }
431 : :
432 : : //! Extract list of dependent variables (each configuring a solver)
433 [ + - ]: 233 : std::vector< char > depvar() const {
434 : : using PDETypes = parameters::Keys;
435 : : std::vector< char > depvar;
436 : : brigand::for_each< PDETypes >( Depvar( *this, depvar ) );
437 : 233 : return depvar;
438 : : }
439 : :
440 : : //! Query special point BC configuration
441 : : //! \tparam eq PDE type to query
442 : : //! \tparam sbc Special BC type to query, e.g., stagnation, skip
443 : : //! \param[in] system Equation system id
444 : : //! \return Vectors configuring the special points and their radii
445 : : template< class eq, class sbc >
446 : : std::tuple< std::vector< tk::real >, std::vector< tk::real > >
447 [ + + ]: 322 : specialBC( std::size_t system ) {
448 : : const auto& bcspec = get< tag::param, eq, sbc >();
449 : : const auto& point = bcspec.template get< tag::point >();
450 : : const auto& radius = bcspec.template get< tag::radius >();
451 : : std::vector< tk::real > pnt;
452 : : std::vector< tk::real > rad;
453 [ + + ][ + - ]: 322 : if (point.size() > system && radius.size() > system) {
454 [ + - ]: 12 : pnt = point[ system ];
455 [ + - ]: 12 : rad = radius[ system ];
456 : : }
457 : : Assert( pnt.size() == 3*rad.size(), "Size mismatch" );
458 : 322 : return { std::move(pnt), std::move(rad) };
459 : : }
460 : :
461 : : private:
462 : : //! Function object to extract the mesh filenames assigned to solvers
463 : : //! \details This is instantiated for all PDE types at compile time. It goes
464 : : //! through all configured solvers (equation system configuration blocks)
465 : : //! and builds a list of all mesh filenames associated to all solvers in
466 : : //! the input file.
467 : : struct Meshes {
468 : : const InputDeck& inputdeck;
469 : : std::vector< std::string >& filenames;
470 : : explicit Meshes( const InputDeck& i, std::vector< std::string >& f )
471 : : : inputdeck(i), filenames(f) {}
472 : : template< typename eq > void operator()( brigand::type_<eq> ) {
473 : : const auto& eq_mesh_filename =
474 : : inputdeck.get< tag::param, eq, tag::mesh, tag::filename >();
475 : : for (const auto& f : eq_mesh_filename) filenames.push_back( f );
476 : : }
477 : : };
478 : :
479 : : //! Function object to extract the dependent variables assigned to solvers
480 : : //! \details This is instantiated for all PDE types at compile time. It goes
481 : : //! through all configured solvers (equation system configuration blocks)
482 : : //! and builds a list of all dependent variables associated to all solvers
483 : : //! in the input file.
484 : : struct Depvar {
485 : : const InputDeck& inputdeck;
486 : : std::vector< char >& depvar;
487 : : explicit Depvar( const InputDeck& i, std::vector< char >& d ) :
488 : : inputdeck(i), depvar(d) {}
489 : : template< typename eq > void operator()( brigand::type_<eq> ) {
490 : : const auto& eq_depvar = inputdeck.get< tag::param, eq, tag::depvar >();
491 : : for (const auto& d : eq_depvar) depvar.push_back( d );
492 : : }
493 : : };
494 : : };
495 : :
496 : : } // ctr::
497 : : } // inciter::
498 : :
499 : : #endif // InciterInputDeck_h
|