Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/Control/Inciter/InputDeck/LuaParser.hpp
4 : : \copyright 2019-2023 Triad National Security, LLC.
5 : : All rights reserved. See the LICENSE file for details.
6 : : \brief Inciter's lua input deck file parser
7 : : \details This file declares the input deck, i.e., control file, parser for
8 : : the computational shock hydrodynamics tool, Inciter.
9 : : */
10 : : // *****************************************************************************
11 : : #ifndef InciterLuaParser_h
12 : : #define InciterLuaParser_h
13 : :
14 : : #include "NoWarning/sol.hpp"
15 : :
16 : : #include "Inciter/CmdLine/CmdLine.hpp"
17 : : #include "InputDeck.hpp"
18 : :
19 : : namespace tk { class Print; }
20 : :
21 : : namespace inciter {
22 : :
23 : : //! \brief Control file lua-parser for Inciter.
24 : : //! \details This class is used to interface with sol2, for the purpose of
25 : : //! parsing the control file for the computational shock hydrodynamics tool,
26 : : //! Inciter.
27 : : class LuaParser {
28 : :
29 : : public:
30 : : //! Constructor
31 : : explicit LuaParser( const tk::Print& print,
32 : : const ctr::CmdLine& cmdline,
33 : : ctr::InputDeck& inputdeck );
34 : :
35 : : //! Store lua inputdeck in custom struct
36 : : void storeInputDeck(
37 : : const sol::table& lua_ideck,
38 : : ctr::InputDeck& gideck );
39 : :
40 : : //! Check and store material property into inpudeck storage
41 : : void checkStoreMatProp(
42 : : const sol::table table,
43 : : const std::string key,
44 : : std::size_t vecsize,
45 : : std::vector< tk::real >& storage );
46 : :
47 : : //! Check and store field output variables
48 : : void addOutVar(
49 : : const std::string& varname,
50 : : const std::string& alias,
51 : : std::vector< char >& depv,
52 : : std::size_t nmat,
53 : : std::size_t nspec,
54 : : inciter::ctr::PDEType pde,
55 : : tk::Centering c,
56 : : std::vector< inciter::ctr::OutVar >& foutvar );
57 : :
58 : : private:
59 : : const std::string m_filename; //!< Name of file to parse
60 : :
61 : : //! Assign parameter to inputdeck entry if specified, else default
62 : : //! \tparam N Type of parameter being read/assigned
63 : : //! \param[in] table Sol-table which contains said parameter
64 : : //! \param[in] key Key for said parameter in Sol-table
65 : : //! \param[in,out] storage Storage space in inputdeck where said parameter
66 : : //! is to be stored
67 : : //! \param[in] dflt Default value of said parameter, if unspecified
68 : : template< typename N > void
69 : 6907 : storeIfSpecd(
70 : : const sol::table table,
71 : : const std::string key,
72 : : N& storage,
73 : : const N dflt )
74 : : {
75 [ + - ]: 13814 : auto sol_var = table[key];
76 [ + - ][ + + ]: 6907 : if (sol_var.valid())
77 [ + - ]: 1475 : storage = sol_var;
78 : : else
79 [ - - ]: 5432 : storage = dflt;
80 : 6907 : }
81 : :
82 : : //! Assign Option to inputdeck entry if specified, else default
83 : : //! \tparam Op Option-Type of parameter being read/assigned
84 : : //! \tparam OpClass Option-class of parameter being read/assigned
85 : : //! \param[in] table Sol-table which contains said parameter
86 : : //! \param[in] key Key for said parameter in Sol-table
87 : : //! \param[in,out] storage Storage space in inputdeck where said parameter
88 : : //! is to be stored
89 : : //! \param[in] dflt Default value of said parameter, if unspecified
90 : : template< typename Op, class OpClass > void
91 : 1684 : storeOptIfSpecd(
92 : : const sol::table table,
93 : : const std::string key,
94 : : Op& storage,
95 : : const Op dflt )
96 : : {
97 [ + - ]: 3368 : OpClass opt;
98 [ + - ]: 3368 : auto sol_var = table[key];
99 [ + - ][ + + ]: 1684 : if (sol_var.valid())
100 [ + - ][ + - ]: 843 : storage = opt.value(sol_var);
101 : : else
102 : 841 : storage = dflt;
103 : 1684 : }
104 : :
105 : : //! Assign vector parameter to inputdeck entry if specified, else default
106 : : //! \tparam N Type of parameter vector being read/assigned
107 : : //! \param[in] table Sol-table which contains said parameter
108 : : //! \param[in] key Key for said parameter in Sol-table
109 : : //! \param[in,out] storage Storage space in inputdeck where said parameter
110 : : //! is to be stored
111 : : //! \param[in] dflt Default value of said parameter, if unspecified
112 : : template< typename N > void
113 : 3233 : storeVecIfSpecd(
114 : : const sol::table table,
115 : : const std::string key,
116 : : std::vector< N >& storage,
117 : : const std::vector< N >& dflt )
118 : : {
119 [ + - ]: 6466 : auto sol_vec = table[key];
120 [ + - ][ + + ]: 3233 : if (sol_vec.valid()) {
121 [ + - ][ + - ]: 4035 : for (std::size_t i=0; i<sol::table(sol_vec).size(); ++i)
[ + + ]
122 [ + - ][ + - ]: 3249 : storage.push_back(sol_vec[i+1]);
[ + - ]
123 : : }
124 : : else
125 [ + - ]: 2447 : storage = dflt;
126 : 3233 : }
127 : :
128 : : //! Assign vector of Options to inputdeck entry if specified, else default
129 : : //! \tparam Op Option-Type of parameter being read/assigned
130 : : //! \tparam OpClass Option-class of parameter being read/assigned
131 : : //! \param[in] table Sol-table which contains said parameter
132 : : //! \param[in] key Key for said parameter in Sol-table
133 : : //! \param[in,out] storage Storage space in inputdeck where said parameter
134 : : //! is to be stored
135 : : //! \param[in] dflt Default value of said parameter, if unspecified
136 : : template< typename Op, class OpClass > void
137 : 20 : storeOptVecIfSpecd(
138 : : const sol::table table,
139 : : const std::string key,
140 : : std::vector< Op >& storage,
141 : : const std::vector< Op >& dflt )
142 : : {
143 [ + - ]: 40 : OpClass opt;
144 [ + - ]: 40 : auto sol_vec = table[key];
145 [ + - ][ + - ]: 20 : if (sol_vec.valid()) {
146 [ + - ][ + - ]: 77 : for (std::size_t i=0; i<sol::table(sol_vec).size(); ++i)
[ + + ]
147 [ + - ][ + - ]: 57 : storage.push_back(opt.value(sol_vec[i+1]));
[ + - ][ + - ]
148 : : }
149 : : else
150 [ - - ]: 0 : storage = dflt;
151 : 20 : }
152 : :
153 : : //! \brief Check validity of keywords within a particular block
154 : : //! \tparam tags Tags addressing the said block in the input deck
155 : : //! \param[in] block Sol table of the input deck block read in from the
156 : : //! lua file
157 : : //! \param[in] blk_name Name of the block, for error clarity
158 : : template< typename... tags >
159 : 751 : void checkBlock(const sol::table& block, const std::string& blk_name) const
160 : : {
161 [ + + ]: 2449 : for (const auto& kvp : block) {
162 : 1698 : bool is_valid(false);
163 [ + - ]: 3396 : auto ukw = kvp.first.as<std::string>();
164 [ + - ][ + - ]: 1698 : brigand::for_each< tags... >( checkKw(ukw, is_valid) );
165 [ - + ]: 1698 : if (!is_valid)
166 [ - - ][ - - ]: 0 : Throw("Invalid keyword '" + ukw + "' in '" + blk_name + "' block.");
[ - - ][ - - ]
[ - - ][ - - ]
167 : : }
168 : 751 : }
169 : :
170 : : // Check if a keyword matches the existing ones
171 : : struct checkKw {
172 : : std::string user_kw;
173 : : // reference to bool keeping track of kw-match
174 : : bool& is_valid;
175 : : // Constructor
176 : 1698 : checkKw( const std::string& ukw, bool& isv ) :
177 : 1698 : user_kw(ukw), is_valid(isv) {}
178 : : //! Function to call for each keyword type
179 : 18984 : template< typename U > void operator()( brigand::type_<U> ) {
180 : 18984 : auto spec_key = U::name();
181 : : // only check if not previously matched
182 [ + + ]: 18984 : if (!is_valid) {
183 [ + + ]: 7363 : if (user_kw == spec_key) is_valid = true;
184 : 5665 : else is_valid = false;
185 : : }
186 : 18984 : }
187 : : };
188 : : };
189 : :
190 : : } // namespace inciter
191 : :
192 : : #endif // InciterLuaParser_h
|