PRISMS-PF Manual
Loading...
Searching...
No Matches
parameter_base.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: © 2026 PRISMS Center at the University of Michigan
2// SPDX-License-Identifier: GNU Lesser General Public Version 2.1
3
4#pragma once
5
6#include <deal.II/base/parameter_handler.h>
7#include <deal.II/base/patterns.h>
8
10
11#include <prismspf/config.h>
12
13#include <cfloat>
14#include <concepts>
15#include <ranges>
16#include <string>
17#include <string_view>
18#include <vector>
19
21
22class SolveBlock;
23class FieldAttributes;
24
28static constexpr std::array<std::string_view, 3> axis_labels {"x", "y", "z"};
29
33template <std::ranges::input_range Range = std::vector<std::string>>
34requires std::convertible_to<std::ranges::range_reference_t<Range>, std::string_view>
35static void
36declare_aliases(dealii::ParameterHandler &parameter_handler,
37 const std::string &existing_entry_name,
38 const Range &aliases = {})
39{
40 for (const auto &alias : aliases)
41 {
42 parameter_handler.declare_alias(existing_entry_name, alias);
43 }
44}
45
55[[nodiscard]] static std::array<std::string, 4>
56generate_aliases(std::string_view name)
57{
58 std::string snake;
59 std::string title;
60 std::string title_snake;
61 std::string pascal;
62 snake.reserve(name.size());
63 title.reserve(name.size());
64 title_snake.reserve(name.size());
65 pascal.reserve(name.size());
66
67 bool start_of_word = true;
68 for (char character : name)
69 {
70 if (character == ' ')
71 {
72 snake += '_';
73 title += ' ';
74 title_snake += '_';
75 start_of_word = true;
76 continue;
77 }
78
79 const char lower = (char) std::tolower((unsigned char) character);
80 const char upper = (char) std::toupper((unsigned char) character);
81
82 snake += lower;
83 title += start_of_word ? upper : lower;
84 title_snake += start_of_word ? upper : lower;
85 pascal += start_of_word ? upper : lower;
86
87 start_of_word = false;
88 }
89
90 return {
91 std::move(snake),
92 std::move(title),
93 std::move(title_snake),
94 std::move(pascal),
95 };
96}
97
101template <std::ranges::input_range Range>
102requires std::convertible_to<std::ranges::range_reference_t<Range>, std::string_view>
103static void
104declare_aliases_with_generated(dealii::ParameterHandler &parameter_handler,
105 const std::string &existing_entry_name,
106 const Range &aliases)
107{
108 declare_aliases(parameter_handler,
109 existing_entry_name,
110 generate_aliases(existing_entry_name));
111
112 for (const auto &alias : aliases)
113 {
114 parameter_handler.declare_alias(existing_entry_name, std::string(alias));
115 declare_aliases(parameter_handler, existing_entry_name, generate_aliases(alias));
116 }
117}
118
119static void
120declare_entry(dealii::ParameterHandler &parameter_handler,
121 const std::string_view &entry,
122 const std::string_view &default_value,
123 const dealii::Patterns::PatternBase &pattern,
124 const std::string_view &documentation,
125 const std::list<std::string_view> &aliases = {},
126 const std::string_view &warnings = {},
127 const std::string_view &example = {},
128 bool deprecated = false)
129{
130 const auto _entry = std::string(entry);
131
132 // Format the warning and example strings and append them to the documentation
133 auto _doc = std::string(documentation);
134
135 if (!warnings.empty())
136 {
137 _doc += "\n\n@warning " + std::string(warnings) + "\n@end_warning";
138 }
139 if (!example.empty())
140 {
141 _doc += "\n\n@example\n" + std::string(example) + "\n@end_example";
142 }
143
144 parameter_handler.declare_entry(_entry, std::string(default_value), pattern, _doc);
145#if DEAL_II_VERSION_MAJOR >= 9 && DEAL_II_VERSION_MINOR >= 7
146 parameter_handler.mark_as_deprecated(_entry, deprecated);
147#endif
148 declare_aliases_with_generated(parameter_handler, _entry, aliases);
149}
150
151static std::string
152get(const dealii::ParameterHandler &parameter_handler, const std::string_view &entry)
153{
154 return parameter_handler.get(std::string(entry));
155}
156
157static int
158get_int(const dealii::ParameterHandler &parameter_handler, const std::string_view &entry)
159{
160 // TODO: Add check for safe casting
161 return (int) parameter_handler.get_integer(std::string(entry));
162}
163
164static unsigned int
165get_unsigned_int(const dealii::ParameterHandler &parameter_handler,
166 const std::string_view &entry)
167{
168 // TODO: Add check for safe casting
169 return (unsigned int) parameter_handler.get_integer(std::string(entry));
170}
171
172static double
173get_double(const dealii::ParameterHandler &parameter_handler,
174 const std::string_view &entry)
175{
176 return parameter_handler.get_double(std::string(entry));
177}
178
179static bool
180get_bool(const dealii::ParameterHandler &parameter_handler, const std::string_view &entry)
181{
182 return parameter_handler.get_bool(std::string(entry));
183}
184
185template <typename Map>
186requires requires(Map &map, const typename Map::key_type &key) {
187 map.find(key);
188 map.end();
189}
190typename Map::mapped_type
191get_selection(const dealii::ParameterHandler &parameter_handler,
192 const std::string_view &entry,
193 Map &map)
194{
195 const auto value = get(parameter_handler, entry);
196 const auto iter = map.find(value);
197 AssertThrow(iter != map.end(), dealii::ExcMessage("Invalid selection"));
198 return iter->second;
199}
200
201static std::vector<std::string>
202get_string_list(const dealii::ParameterHandler &parameter_handler,
203 const std::string_view &entry)
204{
205 return dealii::Utilities::split_string_list(parameter_handler.get(std::string(entry)));
206}
207
208static std::vector<unsigned int>
209get_unsigned_int_list(const dealii::ParameterHandler &parameter_handler,
210 const std::string_view &entry)
211{
212 // TODO: Add check for safe casting
213 std::vector<unsigned int> list;
214
215 for (const auto &list_entry : get_string_list(parameter_handler, entry))
216 {
217 list.push_back((unsigned int) std::stoul(list_entry));
218 }
219
220 return list;
221}
222
223namespace Patterns
224{
225 // NOLINTBEGIN(readability-identifier-naming)
226
227 static inline dealii::Patterns::Anything
229 {
230 return {};
231 }
232
233 static inline dealii::Patterns::Selection
234 Selection(std::string_view options)
235 {
236 return {std::string(options)};
237 }
238
239 static inline dealii::Patterns::Bool
241 {
242 return {};
243 }
244
245 static inline dealii::Patterns::Integer
247 {
248 return {-INT_MAX, INT_MAX};
249 }
250
251 static inline dealii::Patterns::Integer
253 {
254 return {0, INT_MAX};
255 }
256
257 static inline dealii::Patterns::Integer
259 {
260 return {1, INT_MAX};
261 }
262
263 static inline dealii::Patterns::Integer
265 {
266 return {-INT_MAX, 0};
267 }
268
269 static inline dealii::Patterns::Double
271 {
272 return {-DBL_MAX, DBL_MAX};
273 }
274
275 static inline dealii::Patterns::Double
277 {
278 return {0.0, DBL_MAX};
279 }
280
281 static inline dealii::Patterns::Double
283 {
284 return {-DBL_MAX, 0.0};
285 }
286
287 static inline dealii::Patterns::List
289 {
290 return {Anything(), 0, INT_MAX, ","};
291 }
292
293 static inline dealii::Patterns::List
295 {
296 return {UnsignedInteger(), 0, INT_MAX, ","};
297 }
298
299 // NOLINTEND(readability-identifier-naming)
300
301} // namespace Patterns
302
312{
313 ParameterBase() = default;
314 virtual ~ParameterBase() = default;
315
316 ParameterBase(const ParameterBase &) = default;
318
320 operator=(const ParameterBase &) = default;
323
327 virtual void
328 assign(dealii::ParameterHandler &parameter_handler,
329 unsigned int n_subsections = Numbers::default_subsections) = 0;
330
334 virtual void
335 validate(const std::vector<FieldAttributes> &field_attributes,
336 const std::vector<SolveBlock> &solve_blocks) const = 0;
337};
338
339PRISMS_PF_END_NAMESPACE
Structure to hold the attributes of a solve-block.
Definition solve_block.h:58
static constexpr unsigned int default_subsections
Max number of subsections.
Definition types.h:33
Definition conditional_ostreams.cc:20
Definition parameter_base.h:224
static dealii::Patterns::Selection Selection(std::string_view options)
Definition parameter_base.h:234
static dealii::Patterns::Double Double()
Definition parameter_base.h:270
static dealii::Patterns::List StringList()
Definition parameter_base.h:288
static dealii::Patterns::Double NegativeDouble()
Definition parameter_base.h:282
static dealii::Patterns::Integer Integer()
Definition parameter_base.h:246
static dealii::Patterns::Anything Anything()
Definition parameter_base.h:228
static dealii::Patterns::Integer UnsignedInteger()
Definition parameter_base.h:252
static dealii::Patterns::Integer PositiveInteger()
Definition parameter_base.h:258
static dealii::Patterns::Double PositiveDouble()
Definition parameter_base.h:276
static dealii::Patterns::Bool Bool()
Definition parameter_base.h:240
static dealii::Patterns::List UnsignedIntegerList()
Definition parameter_base.h:294
static dealii::Patterns::Integer NegativeInteger()
Definition parameter_base.h:264
static constexpr std::array< std::string_view, 3 > axis_labels
Cartesian axis labels.
Definition parameter_base.h:28
static std::vector< std::string > get_string_list(const dealii::ParameterHandler &parameter_handler, const std::string_view &entry)
Definition parameter_base.h:202
static void declare_entry(dealii::ParameterHandler &parameter_handler, const std::string_view &entry, const std::string_view &default_value, const dealii::Patterns::PatternBase &pattern, const std::string_view &documentation, const std::list< std::string_view > &aliases={}, const std::string_view &warnings={}, const std::string_view &example={}, bool deprecated=false)
Definition parameter_base.h:120
static void declare_aliases(dealii::ParameterHandler &parameter_handler, const std::string &existing_entry_name, const Range &aliases={})
Definition parameter_base.h:36
static bool get_bool(const dealii::ParameterHandler &parameter_handler, const std::string_view &entry)
Definition parameter_base.h:180
static int get_int(const dealii::ParameterHandler &parameter_handler, const std::string_view &entry)
Definition parameter_base.h:158
static double get_double(const dealii::ParameterHandler &parameter_handler, const std::string_view &entry)
Definition parameter_base.h:173
static std::string get(const dealii::ParameterHandler &parameter_handler, const std::string_view &entry)
Definition parameter_base.h:152
Map::mapped_type get_selection(const dealii::ParameterHandler &parameter_handler, const std::string_view &entry, Map &map)
Definition parameter_base.h:191
static void declare_aliases_with_generated(dealii::ParameterHandler &parameter_handler, const std::string &existing_entry_name, const Range &aliases)
Definition parameter_base.h:104
static std::vector< unsigned int > get_unsigned_int_list(const dealii::ParameterHandler &parameter_handler, const std::string_view &entry)
Definition parameter_base.h:209
static std::array< std::string, 4 > generate_aliases(std::string_view name)
Definition parameter_base.h:56
static unsigned int get_unsigned_int(const dealii::ParameterHandler &parameter_handler, const std::string_view &entry)
Definition parameter_base.h:165
Structure to hold the attributes of a field. This includes things like the name, rank,...
Definition field_attributes.h:26
std::string name
Field name.
Definition field_attributes.h:46
ParameterBase()=default
virtual void validate(const std::vector< FieldAttributes > &field_attributes, const std::vector< SolveBlock > &solve_blocks) const =0
Validate.
virtual ~ParameterBase()=default
virtual void assign(dealii::ParameterHandler &parameter_handler, unsigned int n_subsections=Numbers::default_subsections)=0
Assign the parameters from file.
ParameterBase(ParameterBase &&)=default
ParameterBase & operator=(ParameterBase &&)=default
ParameterBase(const ParameterBase &)=default
ParameterBase & operator=(const ParameterBase &)=default