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 : 191 : 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 material property vector into inpudeck storage
48 : : void checkStoreMatPropVec(
49 : : const sol::table table,
50 : : const std::string key,
51 : : std::size_t nspec,
52 : : std::size_t vecsize,
53 : : std::vector<std::vector< tk::real >>& storage );
54 : :
55 : : //! Check and store field output variables
56 : : void addOutVar(
57 : : const std::string& varname,
58 : : const std::string& alias,
59 : : std::vector< char >& depv,
60 : : std::size_t nmat,
61 : : std::size_t nspec,
62 : : inciter::ctr::PDEType pde,
63 : : tk::Centering c,
64 : : std::vector< inciter::ctr::OutVar >& foutvar );
65 : :
66 : : private:
67 : : const std::string m_filename; //!< Name of file to parse
68 : :
69 : : //! Assign parameter to inputdeck entry if specified, else default
70 : : //! \tparam N Type of parameter being read/assigned
71 : : //! \param[in] table Sol-table which contains said parameter
72 : : //! \param[in] key Key for said parameter in Sol-table
73 : : //! \param[in,out] storage Storage space in inputdeck where said parameter
74 : : //! is to be stored
75 : : //! \param[in] dflt Default value of said parameter, if unspecified
76 : : template< typename N > void
77 : 14028 : storeIfSpecd(
78 : : const sol::table table,
79 : : const std::string key,
80 : : N& storage,
81 : : const N dflt )
82 : : {
83 : : auto sol_var = table[key];
84 [ + - ][ + + ]: 7014 : if (sol_var.valid())
85 : 1724 : storage = sol_var;
86 : : else
87 : 5504 : storage = dflt;
88 : 7014 : }
89 : :
90 : : //! Assign Option to inputdeck entry if specified, else default
91 : : //! \tparam Op Option-Type of parameter being read/assigned
92 : : //! \tparam OpClass Option-class of parameter being read/assigned
93 : : //! \param[in] table Sol-table which contains said parameter
94 : : //! \param[in] key Key for said parameter in Sol-table
95 : : //! \param[in,out] storage Storage space in inputdeck where said parameter
96 : : //! is to be stored
97 : : //! \param[in] dflt Default value of said parameter, if unspecified
98 : : template< typename Op, class OpClass > void
99 : 1706 : storeOptIfSpecd(
100 : : const sol::table table,
101 : : const std::string key,
102 : : Op& storage,
103 : : const Op dflt )
104 : : {
105 : 1706 : OpClass opt;
106 : : auto sol_var = table[key];
107 [ + - ][ + + ]: 1706 : if (sol_var.valid())
108 [ + + ]: 890 : storage = opt.value(sol_var);
109 : : else
110 : 852 : storage = dflt;
111 : 1706 : }
112 : :
113 : : //! Assign vector parameter to inputdeck entry if specified, else default
114 : : //! \tparam N Type of parameter vector being read/assigned
115 : : //! \param[in] table Sol-table which contains said parameter
116 : : //! \param[in] key Key for said parameter in Sol-table
117 : : //! \param[in,out] storage Storage space in inputdeck where said parameter
118 : : //! is to be stored
119 : : //! \param[in] dflt Default value of said parameter, if unspecified
120 : : template< typename N > void
121 : 3286 : storeVecIfSpecd(
122 : : const sol::table table,
123 : : const std::string key,
124 : : std::vector< N >& storage,
125 : : const std::vector< N >& dflt )
126 : : {
127 : : auto sol_vec = table[key];
128 [ + - ][ + + ]: 3286 : if (sol_vec.valid()) {
129 [ + - ][ + + ]: 8220 : for (std::size_t i=0; i<sol::table(sol_vec).size(); ++i)
130 [ + - ][ + + ]: 6604 : storage.push_back(sol_vec[i+1]);
[ - + ][ - - ]
[ - - ]
131 : : }
132 : : else
133 [ + - ]: 2478 : storage = dflt;
134 : 3286 : }
135 : :
136 : : //! Assign vector of Options to inputdeck entry if specified, else default
137 : : //! \tparam Op Option-Type of parameter being read/assigned
138 : : //! \tparam OpClass Option-class of parameter being read/assigned
139 : : //! \param[in] table Sol-table which contains said parameter
140 : : //! \param[in] key Key for said parameter in Sol-table
141 : : //! \param[in,out] storage Storage space in inputdeck where said parameter
142 : : //! is to be stored
143 : : //! \param[in] dflt Default value of said parameter, if unspecified
144 : : template< typename Op, class OpClass > void
145 : 20 : storeOptVecIfSpecd(
146 : : const sol::table table,
147 : : const std::string key,
148 : : std::vector< Op >& storage,
149 : : const std::vector< Op >& dflt )
150 : : {
151 : 20 : OpClass opt;
152 : : auto sol_vec = table[key];
153 [ + - ][ + - ]: 20 : if (sol_vec.valid()) {
154 [ + - ][ + + ]: 154 : for (std::size_t i=0; i<sol::table(sol_vec).size(); ++i)
155 [ + - ][ + - ]: 141 : storage.push_back(opt.value(sol_vec[i+1]));
[ + + ][ - + ]
[ - - ][ - - ]
[ - - ]
156 : : }
157 : : else
158 [ - - ]: 0 : storage = dflt;
159 : 20 : }
160 : :
161 : : //! \brief Check validity of keywords within a particular block
162 : : //! \tparam tags Tags addressing the said block in the input deck
163 : : //! \param[in] block Sol table of the input deck block read in from the
164 : : //! lua file
165 : : //! \param[in] blk_name Name of the block, for error clarity
166 : : template< typename... tags >
167 : 765 : void checkBlock(const sol::table& block, const std::string& blk_name) const
168 : : {
169 [ + + ]: 3277 : for (const auto& kvp : block) {
170 : 1747 : bool is_valid(false);
171 : : auto ukw = kvp.first.as<std::string>();
172 [ + + ][ - - ]: 1747 : brigand::for_each< tags... >( checkKw(ukw, is_valid) );
173 [ - + ]: 1747 : if (!is_valid)
174 [ - - ][ - - ]: 0 : Throw("Invalid keyword '" + ukw + "' in '" + blk_name + "' block.");
[ - - ][ - - ]
[ - - ][ - - ]
[ - - ][ - - ]
[ - - ][ - - ]
[ - - ][ - - ]
[ - - ][ - - ]
175 : : }
176 : 765 : }
177 : :
178 : : // Check if a keyword matches the existing ones
179 [ - - ][ - - ]: 5241 : struct checkKw {
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ - - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ]
180 : : std::string user_kw;
181 : : // reference to bool keeping track of kw-match
182 : : bool& is_valid;
183 : : // Constructor
184 [ - - ][ + - ]: 1747 : checkKw( const std::string& ukw, bool& isv ) :
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ]
185 [ - - ][ + - ]: 1747 : user_kw(ukw), is_valid(isv) {}
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ]
186 : : //! Function to call for each keyword type
187 : : template< typename U > void operator()( brigand::type_<U> ) {
188 : : auto spec_key = U::name();
189 : : // only check if not previously matched
190 : : if (!is_valid) {
191 : : if (user_kw == spec_key) is_valid = true;
192 : : else is_valid = false;
193 : : }
194 : : }
195 : : };
196 : : };
197 : :
198 : : } // namespace inciter
199 : :
200 : : #endif // InciterLuaParser_h
|