Line data Source code
1 : //* This file is part of the MOOSE framework
2 : //* https://mooseframework.inl.gov
3 : //*
4 : //* All rights reserved, see COPYRIGHT for full restrictions
5 : //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 : //*
7 : //* Licensed under LGPL 2.1, please see LICENSE for details
8 : //* https://www.gnu.org/licenses/lgpl-2.1.html
9 :
10 : #include "InputParameters.h"
11 :
12 : // MOOSE includes
13 : #include "MooseEnum.h"
14 : #include "MooseTypes.h"
15 : #include "MooseUtils.h"
16 : #include "MultiMooseEnum.h"
17 : #include "ExecFlagEnum.h"
18 : #include "MooseObject.h"
19 : #include "MooseApp.h"
20 :
21 : #include "libmesh/utility.h"
22 : #include "libmesh/simple_range.h"
23 :
24 : #include "pcrecpp.h"
25 : #include "hit/parse.h"
26 :
27 : #include <cmath>
28 : #include <filesystem>
29 :
30 : InputParameters
31 67619879 : emptyInputParameters()
32 : {
33 67619879 : InputParameters params;
34 67619879 : return params;
35 : }
36 :
37 67619879 : InputParameters::InputParameters()
38 : : Parameters(),
39 67619879 : _collapse_nesting(false),
40 67619879 : _moose_object_syntax_visibility(true),
41 67619879 : _show_deprecated_message(true),
42 67619879 : _allow_copy(true),
43 67619879 : _hit_node(nullptr),
44 67619879 : _finalized(false)
45 : {
46 67619879 : }
47 :
48 8629182 : InputParameters::InputParameters(const InputParameters & rhs)
49 8629182 : : Parameters(), _show_deprecated_message(true), _allow_copy(true)
50 : {
51 8629182 : *this = rhs;
52 8629179 : }
53 :
54 0 : InputParameters::InputParameters(const Parameters & rhs)
55 0 : : _show_deprecated_message(true), _allow_copy(true)
56 : {
57 0 : _params.clear();
58 0 : Parameters::operator=(rhs);
59 0 : _collapse_nesting = false;
60 0 : _moose_object_syntax_visibility = true;
61 0 : }
62 :
63 : void
64 0 : InputParameters::clear()
65 : {
66 0 : Parameters::clear();
67 0 : _params.clear();
68 0 : _coupled_vars.clear();
69 0 : _new_to_deprecated_coupled_vars.clear();
70 0 : _collapse_nesting = false;
71 0 : _moose_object_syntax_visibility = true;
72 0 : _show_deprecated_message = true;
73 0 : _allow_copy = true;
74 0 : _old_to_new_name_and_dep.clear();
75 0 : _new_to_old_names.clear();
76 0 : _hit_node = nullptr;
77 0 : _finalized = false;
78 0 : }
79 :
80 : void
81 20594440 : InputParameters::addClassDescription(const std::string & doc_string)
82 : {
83 20594440 : _class_description = doc_string;
84 20594440 : }
85 :
86 : void
87 567153830 : InputParameters::set_attributes(const std::string & name_in, bool inserted_only)
88 : {
89 567153830 : const auto name = checkForRename(name_in);
90 :
91 567153830 : if (!inserted_only)
92 : {
93 378054231 : auto & metadata = _params[name];
94 : /**
95 : * "._set_by_add_param" and ".deprecated_params" are not populated until after
96 : * the default value has already been set in libMesh (first callback to this
97 : * method). Therefore if a variable is in/not in one of these sets, you can
98 : * be assured it was put there outside of the "addParam*()" calls.
99 : */
100 378054231 : metadata._set_by_add_param = false;
101 :
102 : // valid_params don't make sense for MooseEnums
103 378054231 : if (!have_parameter<MooseEnum>(name) && !have_parameter<MultiMooseEnum>(name))
104 356875126 : metadata._valid = true;
105 : }
106 567153830 : }
107 :
108 : std::optional<std::string>
109 2611450 : InputParameters::queryDeprecatedParamMessage(const std::string & name_in) const
110 : {
111 2611450 : const auto name = checkForRename(name_in);
112 2611450 : if (_show_deprecated_message)
113 : {
114 1024 : auto deprecation_message = [this](const auto & name, const auto & message) -> std::string
115 1024 : { return paramMessagePrefix(name) + message; };
116 :
117 2611450 : if (_params.count(name) && !libmesh_map_find(_params, name)._deprecation_message.empty())
118 1462 : return deprecation_message(name,
119 1462 : "The parameter '" + name + "' is deprecated.\n" +
120 1462 : libmesh_map_find(_params, name)._deprecation_message);
121 2610719 : else if (auto it = _old_to_new_name_and_dep.find(name_in);
122 2610719 : it != _old_to_new_name_and_dep.end() && !it->second.second.empty())
123 293 : return deprecation_message(name_in, it->second.second);
124 : }
125 2610426 : return {};
126 2611450 : }
127 :
128 : std::string
129 764853 : InputParameters::getClassDescription() const
130 : {
131 764853 : return _class_description;
132 : }
133 :
134 : InputParameters &
135 10153539 : InputParameters::operator=(const InputParameters & rhs)
136 : {
137 : // An error to help minimize the segmentation faults that occure when MooseObjects do not have the
138 : // correct constructor
139 10153539 : if (!rhs._allow_copy)
140 : {
141 : // If _allow_parameter_copy is set, these should be too (see
142 : // InputParameterWarehouse::addInputParameters)
143 3 : const std::string & name = rhs.getObjectName();
144 3 : const std::string & type = rhs.getObjectType(); // could be empty
145 3 : const std::string name_example = type.size() ? type : "the " + name + " object";
146 3 : const std::string type_example = type.size() ? type : "MyObject";
147 3 : ::mooseError(
148 : "Copying of the InputParameters object for ",
149 : name_example,
150 : " is not allowed.\n\nThe likely cause for this error ",
151 : "is having a constructor that does not use a const reference, all constructors\nfor "
152 : "MooseObject based classes should be as follows:\n\n",
153 : " ",
154 : type_example,
155 : "::",
156 : type_example,
157 : "(const InputParameters & parameters);");
158 0 : }
159 :
160 10153536 : Parameters::operator=(rhs);
161 :
162 10153536 : _params = rhs._params;
163 :
164 10153536 : _buildable_types = rhs._buildable_types;
165 10153536 : _buildable_rm_types = rhs._buildable_rm_types;
166 10153536 : _collapse_nesting = rhs._collapse_nesting;
167 10153536 : _moose_object_syntax_visibility = rhs._moose_object_syntax_visibility;
168 10153536 : _coupled_vars = rhs._coupled_vars;
169 10153536 : _new_to_deprecated_coupled_vars = rhs._new_to_deprecated_coupled_vars;
170 10153536 : _allow_copy = rhs._allow_copy;
171 10153536 : _old_to_new_name_and_dep = rhs._old_to_new_name_and_dep;
172 10153536 : _new_to_old_names = rhs._new_to_old_names;
173 10153536 : _hit_node = rhs._hit_node;
174 10153536 : _finalized = false;
175 :
176 10153536 : return *this;
177 : }
178 :
179 : InputParameters &
180 48080011 : InputParameters::operator+=(const InputParameters & rhs)
181 : {
182 48080011 : Parameters::operator+=(rhs);
183 :
184 : // TODO: this is not a proper merge - if a particular parameter exists in both this and rhs,
185 : // then we should actually smartly merge both metadata structs before storing in this.
186 149784927 : for (auto it = rhs._params.begin(); it != rhs._params.end(); ++it)
187 101704916 : _params[it->first] = it->second;
188 :
189 96160022 : _buildable_types.insert(
190 48080011 : _buildable_types.end(), rhs._buildable_types.begin(), rhs._buildable_types.end());
191 96160022 : _buildable_rm_types.insert(
192 48080011 : _buildable_rm_types.end(), rhs._buildable_rm_types.begin(), rhs._buildable_rm_types.end());
193 :
194 : // Collapse nesting and moose object syntax hiding are not modified with +=
195 48080011 : _coupled_vars.insert(rhs._coupled_vars.begin(), rhs._coupled_vars.end());
196 48080011 : _new_to_deprecated_coupled_vars.insert(rhs._new_to_deprecated_coupled_vars.begin(),
197 : rhs._new_to_deprecated_coupled_vars.end());
198 :
199 48080011 : _old_to_new_name_and_dep.insert(rhs._old_to_new_name_and_dep.begin(),
200 : rhs._old_to_new_name_and_dep.end());
201 48080011 : _new_to_old_names.insert(rhs._new_to_old_names.begin(), rhs._new_to_old_names.end());
202 48080011 : return *this;
203 : }
204 :
205 : void
206 1392702 : InputParameters::setDeprecatedVarDocString(const std::string & new_name,
207 : const std::string & doc_string)
208 : {
209 1392702 : auto coupled_vars_it = _new_to_deprecated_coupled_vars.find(new_name);
210 1392702 : if (coupled_vars_it != _new_to_deprecated_coupled_vars.end())
211 : {
212 0 : auto params_it = _params.find(coupled_vars_it->second);
213 0 : if (params_it == _params.end())
214 0 : mooseError("There must have been a mistake in the construction of the new to deprecated "
215 : "coupled vars map because the old name ",
216 0 : coupled_vars_it->second,
217 : " doesn't exist in the parameters data.");
218 :
219 0 : params_it->second._doc_string = doc_string;
220 : }
221 1392702 : }
222 :
223 : void
224 82821 : InputParameters::addCoupledVar(const std::string & name, Real value, const std::string & doc_string)
225 : {
226 82821 : addParam<std::vector<VariableName>>(name, doc_string);
227 82821 : _coupled_vars.insert(name);
228 82821 : auto & metadata = _params[name];
229 82821 : metadata._coupled_default.assign(1, value);
230 82821 : metadata._have_coupled_default = true;
231 :
232 : // Set the doc string for any associated deprecated coupled var
233 82821 : setDeprecatedVarDocString(name, doc_string);
234 82821 : }
235 :
236 : void
237 25721 : InputParameters::addCoupledVar(const std::string & name,
238 : const std::vector<Real> & value,
239 : const std::string & doc_string)
240 : {
241 : // std::vector<VariableName>(1, Moose::stringify(value)),
242 25721 : addParam<std::vector<VariableName>>(name, doc_string);
243 25721 : _coupled_vars.insert(name);
244 25721 : auto & metadata = _params[name];
245 25721 : metadata._coupled_default = value;
246 25721 : metadata._have_coupled_default = true;
247 :
248 : // Set the doc string for any associated deprecated coupled var
249 25721 : setDeprecatedVarDocString(name, doc_string);
250 25721 : }
251 :
252 : void
253 1284160 : InputParameters::addCoupledVar(const std::string & name, const std::string & doc_string)
254 : {
255 1284160 : addParam<std::vector<VariableName>>(name, doc_string);
256 1284160 : _coupled_vars.insert(name);
257 :
258 : // Set the doc string for any associated deprecated coupled var
259 1284160 : setDeprecatedVarDocString(name, doc_string);
260 1284160 : }
261 :
262 : void
263 0 : InputParameters::addDeprecatedCoupledVar(const std::string & old_name,
264 : const std::string & new_name,
265 : const std::string & removal_date /*=""*/)
266 : {
267 0 : mooseDeprecated("Please use 'deprecateCoupledVar'");
268 :
269 0 : _show_deprecated_message = false;
270 :
271 : // Set the doc string if we are adding the deprecated var after the new var has already been added
272 0 : auto params_it = _params.find(new_name);
273 0 : std::string doc_string;
274 0 : if (params_it != _params.end())
275 0 : doc_string = params_it->second._doc_string;
276 :
277 0 : addParam<std::vector<VariableName>>(old_name, doc_string);
278 0 : _coupled_vars.insert(old_name);
279 0 : _new_to_deprecated_coupled_vars.emplace(new_name, old_name);
280 :
281 : std::string deprecation_message =
282 0 : "The coupled variable parameter '" + old_name + "' has been deprecated";
283 0 : if (!removal_date.empty())
284 0 : deprecation_message += " and will be removed " + removal_date;
285 0 : deprecation_message += ". Please use the '" + new_name + "' coupled variable parameter instead.";
286 0 : _params[old_name]._deprecation_message = deprecation_message;
287 0 : _show_deprecated_message = true;
288 0 : }
289 :
290 : void
291 4 : InputParameters::addCoupledVarWithAutoBuild(const std::string & name,
292 : const std::string & base_name,
293 : const std::string & num_name,
294 : const std::string & doc_string)
295 : {
296 4 : addParam<std::vector<VariableName>>(name, doc_string);
297 4 : _coupled_vars.insert(name);
298 4 : _params[name]._autobuild_vecs = std::make_pair(base_name, num_name);
299 :
300 : // Additionally there are two more parameters that need to be added:
301 4 : addParam<std::string>(base_name, doc_string + " (base_name)");
302 4 : addParam<unsigned int>(num_name, doc_string + " (num_name)");
303 4 : }
304 :
305 : void
306 4 : InputParameters::addRequiredCoupledVarWithAutoBuild(const std::string & name,
307 : const std::string & base_name,
308 : const std::string & num_name,
309 : const std::string & doc_string)
310 : {
311 4 : addRequiredParam<std::vector<VariableName>>(name, doc_string);
312 :
313 4 : addCoupledVarWithAutoBuild(name, base_name, num_name, doc_string);
314 4 : }
315 :
316 : void
317 1134869 : InputParameters::addRequiredCoupledVar(const std::string & name, const std::string & doc_string)
318 : {
319 1134869 : addRequiredParam<std::vector<VariableName>>(name, doc_string);
320 1134869 : _coupled_vars.insert(name);
321 1134869 : }
322 :
323 : std::string
324 6289794 : InputParameters::getDocString(const std::string & name_in) const
325 : {
326 6289794 : const auto name = checkForRename(name_in);
327 :
328 6289794 : std::string doc_string;
329 6289794 : auto it = _params.find(name);
330 6289794 : if (it != _params.end())
331 451507096 : for (const auto & ch : it->second._doc_string)
332 : {
333 445217302 : if (ch == '\n')
334 0 : doc_string += " ... ";
335 : else
336 445217302 : doc_string += ch;
337 : }
338 :
339 12579588 : return doc_string;
340 6289794 : }
341 :
342 : void
343 2007562 : InputParameters::setDocString(const std::string & name_in, const std::string & doc)
344 : {
345 2007562 : const auto name = checkForRename(name_in);
346 :
347 2007562 : auto it = _params.find(name);
348 2007562 : if (it == _params.end())
349 2 : mooseError("Unable to set the documentation string (using setDocString) for the \"",
350 : name,
351 : "\" parameter, the parameter does not exist.");
352 2007560 : it->second._doc_string = doc;
353 2007562 : }
354 :
355 : std::string
356 1173034 : InputParameters::getDocUnit(const std::string & name_in) const
357 : {
358 1173034 : const auto name = checkForRename(name_in);
359 2346068 : return _params.at(name)._doc_unit;
360 1173034 : }
361 :
362 : void
363 682440 : InputParameters::setDocUnit(const std::string & name_in, const std::string & doc_unit)
364 : {
365 682440 : const auto name = checkForRename(name_in);
366 682440 : _params[name]._doc_unit = doc_unit;
367 682440 : }
368 :
369 : bool
370 60400780 : InputParameters::isParamRequired(const std::string & name_in) const
371 : {
372 60400780 : const auto name = checkForRename(name_in);
373 120801560 : return _params.count(name) > 0 && _params.at(name)._required;
374 60400780 : }
375 :
376 : void
377 6498 : InputParameters::makeParamNotRequired(const std::string & name_in)
378 : {
379 6498 : const auto name = checkForRename(name_in);
380 :
381 6498 : if (_params.count(name))
382 6494 : _params[name]._required = false;
383 6498 : }
384 :
385 : bool
386 345915510 : InputParameters::isParamValid(const std::string & name_in) const
387 : {
388 345915510 : const auto name = checkForRename(name_in);
389 345915510 : if (have_parameter<MooseEnum>(name))
390 6842820 : return get<MooseEnum>(name).isValid();
391 339072690 : else if (have_parameter<std::vector<MooseEnum>>(name))
392 : {
393 10726 : for (auto it = get<std::vector<MooseEnum>>(name).begin();
394 22081 : it != get<std::vector<MooseEnum>>(name).end();
395 11355 : ++it)
396 11359 : if (!it->isValid())
397 4 : return false;
398 10722 : return true;
399 : }
400 339061964 : else if (have_parameter<MultiMooseEnum>(name))
401 1680865 : return get<MultiMooseEnum>(name).isValid();
402 337381099 : else if (have_parameter<std::vector<MultiMooseEnum>>(name))
403 : {
404 84 : for (auto it = get<std::vector<MultiMooseEnum>>(name).begin();
405 324 : it != get<std::vector<MultiMooseEnum>>(name).end();
406 240 : ++it)
407 264 : if (!it->isValid())
408 24 : return false;
409 60 : return true;
410 : }
411 337381015 : else if (have_parameter<ExecFlagEnum>(name))
412 6483552 : return get<ExecFlagEnum>(name).isValid();
413 : else
414 330897463 : return _params.count(name) > 0 && _params.at(name)._valid;
415 345915510 : }
416 :
417 : bool
418 3796652 : InputParameters::isParamSetByAddParam(const std::string & name_in) const
419 : {
420 3796652 : const auto name = checkForRename(name_in);
421 7593304 : return _params.count(name) > 0 && _params.at(name)._set_by_add_param;
422 3796652 : }
423 :
424 : bool
425 759517 : InputParameters::isParamDeprecated(const std::string & name_in) const
426 : {
427 759517 : const auto name = checkForRename(name_in);
428 1519034 : return _params.count(name) > 0 && !_params.at(name)._deprecation_message.empty();
429 759517 : }
430 :
431 : #ifdef MOOSE_KOKKOS_ENABLED
432 : bool
433 1595030 : InputParameters::isKokkosObject() const
434 : {
435 1595030 : return isParamValid(MooseBase::kokkos_object_param);
436 : }
437 : #endif
438 :
439 : bool
440 2287321 : InputParameters::areAllRequiredParamsValid() const
441 : {
442 38433191 : for (const auto & it : *this)
443 36261489 : if (isParamRequired(it.first) && !isParamValid(it.first))
444 115619 : return false;
445 2171702 : return true;
446 : }
447 :
448 : bool
449 170325416 : InputParameters::isPrivate(const std::string & name_in) const
450 : {
451 170325416 : const auto name = checkForRename(name_in);
452 340650832 : return _params.count(name) > 0 && _params.at(name)._is_private;
453 170325416 : }
454 :
455 : void
456 6048805 : InputParameters::declareControllable(const std::string & input_names,
457 : std::set<ExecFlagType> execute_flags)
458 : {
459 6048805 : std::vector<std::string> names;
460 6048805 : MooseUtils::tokenize<std::string>(input_names, names, 1, " ");
461 12127713 : for (auto & name_in : names)
462 : {
463 6078910 : const auto name = checkForRename(name_in);
464 6078910 : auto map_iter = _params.find(name);
465 6078910 : if (map_iter != _params.end()) // error is handled by checkParams method
466 : {
467 6078908 : map_iter->second._controllable = true;
468 6078908 : map_iter->second._controllable_flags = execute_flags;
469 : }
470 : else
471 2 : mooseError("The input parameter '",
472 : name,
473 : "' does not exist, thus cannot be marked as controllable.");
474 6078910 : }
475 6048805 : }
476 :
477 : bool
478 133276980 : InputParameters::isControllable(const std::string & name_in) const
479 : {
480 133276980 : const auto name = checkForRename(name_in);
481 266553960 : return _params.count(name) > 0 && _params.at(name)._controllable;
482 133276980 : }
483 :
484 : const std::set<ExecFlagType> &
485 1396667 : InputParameters::getControllableExecuteOnTypes(const std::string & name_in) const
486 : {
487 1396667 : const auto name = checkForRename(name_in);
488 2793334 : return at(name)._controllable_flags;
489 1396667 : }
490 :
491 : void
492 21117566 : InputParameters::registerBase(const std::string & value)
493 : {
494 21117566 : InputParameters::set<std::string>(MooseBase::moose_base_param) = value;
495 21117566 : _params[MooseBase::moose_base_param]._is_private = true;
496 21117566 : }
497 :
498 : bool
499 6526279 : InputParameters::hasBase() const
500 : {
501 6526279 : return have_parameter<std::string>(MooseBase::moose_base_param);
502 : }
503 :
504 : const std::string &
505 13314984 : InputParameters::getBase() const
506 : {
507 13314984 : if (!have_parameter<std::string>(MooseBase::moose_base_param))
508 0 : mooseError("InputParameters::getBase(): Parameters do not have base; one needs to be set with "
509 : "registerBase()");
510 13314984 : return get<std::string>(MooseBase::moose_base_param);
511 : }
512 :
513 : void
514 4044501 : InputParameters::registerSystemAttributeName(const std::string & value)
515 : {
516 4044501 : InputParameters::set<std::string>("_moose_warehouse_system_name") = value;
517 8089002 : _params["_moose_warehouse_system_name"]._is_private = true;
518 4044501 : }
519 :
520 : const std::string &
521 308660 : InputParameters::getSystemAttributeName() const
522 : {
523 : mooseAssert(have_parameter<std::string>("_moose_warehouse_system_name"),
524 : "SystemAttributeName is not available! Call 'registerSystemAttributeName' (usually "
525 : "in the validParams function) before you try accessing it!");
526 308660 : return Parameters::get<std::string>("_moose_warehouse_system_name");
527 : }
528 :
529 : void
530 0 : InputParameters::registerBuildableTypes(const std::string & names)
531 : {
532 0 : _buildable_types.clear();
533 0 : MooseUtils::tokenize(names, _buildable_types, 1, " \t\n\v\f\r"); // tokenize on whitespace
534 0 : }
535 :
536 : void
537 2263888 : InputParameters::addRelationshipManager(
538 : const std::string & name,
539 : Moose::RelationshipManagerType rm_type,
540 : Moose::RelationshipManagerInputParameterCallback input_parameter_callback)
541 : {
542 2263888 : _buildable_rm_types.emplace_back(name, rm_type, input_parameter_callback);
543 2263888 : }
544 :
545 : const std::vector<std::string> &
546 5112426 : InputParameters::getBuildableTypes() const
547 : {
548 5112426 : return _buildable_types;
549 : }
550 :
551 : const std::vector<std::tuple<std::string,
552 : Moose::RelationshipManagerType,
553 : Moose::RelationshipManagerInputParameterCallback>> &
554 2926178 : InputParameters::getBuildableRelationshipManagerTypes() const
555 : {
556 2926178 : return _buildable_rm_types;
557 : }
558 :
559 : void
560 0 : InputParameters::collapseSyntaxNesting(bool collapse)
561 : {
562 0 : _collapse_nesting = collapse;
563 0 : }
564 :
565 : bool
566 99331 : InputParameters::collapseSyntaxNesting() const
567 : {
568 99331 : return _collapse_nesting;
569 : }
570 :
571 : void
572 0 : InputParameters::mooseObjectSyntaxVisibility(bool visibility)
573 : {
574 0 : _moose_object_syntax_visibility = visibility;
575 0 : }
576 :
577 : bool
578 112213 : InputParameters::mooseObjectSyntaxVisibility() const
579 : {
580 112213 : return _moose_object_syntax_visibility;
581 : }
582 :
583 : #define checkMooseType(param_type, name) \
584 : if (have_parameter<param_type>(name) || have_parameter<std::vector<param_type>>(name)) \
585 : error = "non-controllable type '" + type(name) + "' for parameter '" + \
586 : paramFullpath(param_name) + "' marked controllable";
587 :
588 : void
589 5564848 : InputParameters::checkParams(const std::string & parsing_syntax)
590 : {
591 5564848 : const std::string parampath = blockFullpath() != "" ? blockFullpath() : parsing_syntax;
592 :
593 : // Required parameters
594 5564848 : std::vector<std::string> required_param_errors;
595 144534891 : for (const auto & it : *this)
596 : {
597 138970043 : const auto param_name = checkForRename(it.first);
598 138970043 : if (!isParamValid(param_name) && isParamRequired(param_name))
599 : {
600 : // check if an old, deprecated name exists for this parameter that may be specified
601 29 : auto oit = _new_to_deprecated_coupled_vars.find(param_name);
602 29 : if (oit != _new_to_deprecated_coupled_vars.end() && isParamValid(oit->second))
603 0 : continue;
604 :
605 87 : required_param_errors.push_back("missing required parameter '" + parampath + "/" +
606 58 : param_name + "'\n\tDoc String: \"" +
607 116 : getDocString(param_name) + "\"");
608 : }
609 138970043 : }
610 :
611 5564848 : if (required_param_errors.size())
612 33 : mooseError(MooseUtils::stringJoin(required_param_errors, "\n"));
613 :
614 : // Range checked parameters
615 144533772 : for (const auto & [name, param_ptr] : *this)
616 : {
617 138968955 : if (const auto error = parameterRangeCheck(*param_ptr, parampath + "/" + name, name, false))
618 : {
619 2 : if (error->first)
620 4 : paramError(name, error->second);
621 : else
622 0 : mooseError("For range checked parameter '" + name + "': " + error->second);
623 138968955 : }
624 : }
625 :
626 : // Controllable parameters
627 6471212 : for (const auto & param_name : getControllableParameters())
628 : {
629 906399 : if (isPrivate(param_name))
630 2 : paramError(param_name,
631 10 : "private parameter '" + paramFullpath(param_name) + "' marked controllable");
632 :
633 906397 : std::optional<std::string> error;
634 906397 : checkMooseType(NonlinearVariableName, param_name);
635 906397 : checkMooseType(AuxVariableName, param_name);
636 906397 : checkMooseType(VariableName, param_name);
637 906397 : checkMooseType(BoundaryName, param_name);
638 906397 : checkMooseType(SubdomainName, param_name);
639 906397 : checkMooseType(PostprocessorName, param_name);
640 906397 : checkMooseType(VectorPostprocessorName, param_name);
641 906397 : checkMooseType(UserObjectName, param_name);
642 906397 : checkMooseType(MaterialPropertyName, param_name);
643 906397 : if (error)
644 4 : paramError(param_name, *error);
645 6471214 : }
646 5564829 : }
647 :
648 : std::optional<std::pair<bool, std::string>>
649 138985840 : InputParameters::parameterRangeCheck(const Parameters::Value & value,
650 : const std::string & long_name,
651 : const std::string & short_name,
652 : const bool include_param_path)
653 : {
654 : #define dynamicCastRangeCheck(type, up_type, long_name, short_name) \
655 : do \
656 : { \
657 : if (const auto scalar_p = dynamic_cast<const InputParameters::Parameter<type> *>(&value)) \
658 : return rangeCheck<type, up_type>(long_name, short_name, *scalar_p, include_param_path); \
659 : if (const auto vector_p = \
660 : dynamic_cast<const InputParameters::Parameter<std::vector<type>> *>(&value)) \
661 : return rangeCheck<type, up_type>(long_name, short_name, *vector_p, include_param_path); \
662 : } while (0)
663 :
664 138985840 : dynamicCastRangeCheck(Real, Real, long_name, short_name);
665 131745299 : dynamicCastRangeCheck(int, long, long_name, short_name);
666 131039513 : dynamicCastRangeCheck(long, long, long_name, short_name);
667 131039461 : dynamicCastRangeCheck(unsigned int, long, long_name, short_name);
668 : #undef dynamicCastRangeCheck
669 :
670 121170741 : return {};
671 : }
672 :
673 : void
674 5531013 : InputParameters::finalize(const std::string & parsing_syntax)
675 : {
676 : mooseAssert(!isFinalized(), "Already finalized");
677 :
678 5531013 : checkParams(parsing_syntax);
679 :
680 : // Set parameters that represent file types
681 143625801 : for (const auto & name_value : *this)
682 : {
683 138094841 : const auto & param_name = name_value.first;
684 138094841 : const auto & param_value = name_value.second;
685 :
686 : // Helper for setting a file typed parameter value
687 255333 : const auto set_filename = [&](auto & value)
688 : {
689 255333 : constexpr bool is_data_file_name =
690 : std::is_same_v<std::decay_t<decltype(value)>, DataFileName>;
691 :
692 : // We have behavior (which is gross) that requires that for
693 : // everything but DataFileName, if the value is empty we
694 : // don't bother looking for it
695 : if constexpr (!is_data_file_name)
696 : {
697 255119 : if (value.empty())
698 233889 : return;
699 : }
700 :
701 : // Setup options for searching for the path
702 21444 : Moose::DataFileUtils::GetPathOptions options;
703 : // Associate relative path searches with the folder
704 : // that input file that has this parameter is located
705 21444 : options.base = getFileBase(param_name);
706 : // If we don't explicitly have a DataFileName parameter,
707 : // we only want to augment cases where a data name is
708 : // explicitly set (like moose:file). We don't want to
709 : // search all other data. To presere previous behavior,
710 : // we also don't want to error if nothing is found; for
711 : // example if a relative or absolute path is not found.
712 : // The only time we'll error is if the data name is
713 : // explicitly set and the path doesn't exist in the data
714 : // or if that data name isn't registered.
715 : if constexpr (!is_data_file_name)
716 : {
717 21230 : options.search_all_data = false;
718 21230 : options.graceful = true;
719 : }
720 :
721 21444 : Moose::DataFileUtils::Path path;
722 : try
723 : {
724 21444 : Moose::ScopedThrowOnError scoped_throw_on_error;
725 21471 : path = Moose::DataFileUtils::getPath(value, options);
726 21444 : }
727 51 : catch (std::exception & e)
728 : {
729 27 : paramError(param_name, e.what());
730 : }
731 :
732 21417 : value = path.path;
733 21417 : at(param_name)._data_file_name_path = path;
734 138116306 : };
735 :
736 : #define set_if_filename(type) \
737 : else if (auto type_value = dynamic_cast<Parameters::Parameter<type> *>(param_value.get())) \
738 : set_filename(type_value->set()); \
739 : else if (auto type_values = dynamic_cast<Parameters::Parameter<std::vector<type>> *>( \
740 : param_value.get())) for (auto & value : type_values->set()) set_filename(value)
741 :
742 : if (false)
743 : ;
744 138104387 : set_if_filename(FileName);
745 137996747 : set_if_filename(FileNameNoExtension);
746 137871952 : set_if_filename(MeshFileName);
747 137825664 : set_if_filename(MatrixFileName);
748 137823262 : set_if_filename(DataFileName);
749 : #undef set_if_filename
750 : }
751 :
752 5530960 : _finalized = true;
753 5530960 : }
754 :
755 : std::filesystem::path
756 21444 : InputParameters::getFileBase(const std::optional<std::string> & param_name) const
757 : {
758 : mooseAssert(!have_parameter<std::string>("_app_name"),
759 : "Not currently setup to work with app FileName parameters");
760 :
761 21444 : const hit::Node * hit_node = nullptr;
762 :
763 : // Context from the individual parameter
764 21444 : if (param_name)
765 21444 : hit_node = getHitNode(*param_name);
766 : // Context from the parameters
767 21444 : if (!hit_node)
768 1221 : hit_node = getHitNode();
769 : // No hit node, so use the cwd (no input files)
770 21444 : if (!hit_node)
771 402 : return std::filesystem::current_path();
772 :
773 : // Find any context that isn't command line arguments
774 21692 : while (hit_node && hit_node->filename() == "CLI_ARGS")
775 650 : hit_node = hit_node->parent();
776 :
777 : // Failed to find a node up the tree that isn't a command line argument
778 21042 : if (!hit_node)
779 : {
780 : const std::string error = "Input context was set via a command-line argument and does not have "
781 0 : "sufficient context for determining a file path.";
782 0 : if (param_name)
783 0 : paramError(*param_name, error);
784 : else
785 0 : mooseError(error);
786 0 : }
787 :
788 21042 : return std::filesystem::absolute(std::filesystem::path(hit_node->filename()).parent_path());
789 : }
790 :
791 : bool
792 8054392 : InputParameters::isRangeChecked(const std::string & param_name) const
793 : {
794 8054392 : const auto name = checkForRename(param_name);
795 16108784 : return !_params.find(name)->second._range_function.empty();
796 8054392 : }
797 :
798 : std::string
799 16361 : InputParameters::rangeCheckedFunction(const std::string & param_name) const
800 : {
801 16361 : const auto name = checkForRename(param_name);
802 32722 : return _params.at(name)._range_function;
803 16361 : }
804 :
805 : bool
806 3395791 : InputParameters::hasDefault(const std::string & param_name) const
807 : {
808 3395791 : const auto name = checkForRename(param_name);
809 3395791 : if (hasDefaultCoupledValue(name))
810 0 : return true;
811 : // If it has a default, it's already valid
812 3395791 : else if (isParamSetByAddParam(name))
813 4 : return true;
814 3395787 : else if (isParamValid(name))
815 0 : mooseError("No way to know if the parameter '", param_name, "' has a default");
816 : else
817 3395787 : return false;
818 3395791 : }
819 :
820 : bool
821 4338138 : InputParameters::hasCoupledVar(const std::string & coupling_name) const
822 : {
823 4338138 : return _coupled_vars.find(coupling_name) != _coupled_vars.end();
824 : }
825 :
826 : void
827 4 : InputParameters::setCoupledVar(const std::string & coupling_name, const std::string & value)
828 : {
829 14 : setCoupledVar(coupling_name, std::vector<VariableName>{value});
830 8 : }
831 :
832 : void
833 6 : InputParameters::setCoupledVar(const std::string & coupling_name,
834 : const std::vector<VariableName> & values)
835 : {
836 6 : const auto actual_name = checkForRename(coupling_name);
837 :
838 6 : if (!hasCoupledVar(actual_name))
839 2 : mooseError("Unable to set coupled variable parameter '",
840 : coupling_name,
841 : "' because it was not added with addCoupledVar or addRequiredCoupledVar.");
842 :
843 4 : set<std::vector<VariableName>>(actual_name) = values;
844 6 : }
845 :
846 : const std::vector<VariableName> &
847 6 : InputParameters::getCoupledVar(const std::string & coupling_name) const
848 : {
849 6 : const auto actual_name = checkForRename(coupling_name);
850 :
851 6 : if (!hasCoupledVar(actual_name))
852 2 : mooseError("Unable to get coupled variable parameter '",
853 : coupling_name,
854 : "' because it was not added with addCoupledVar or addRequiredCoupledVar.");
855 :
856 8 : return get<std::vector<VariableName>>(actual_name);
857 6 : }
858 :
859 : bool
860 8238222 : InputParameters::hasDefaultCoupledValue(const std::string & coupling_name) const
861 : {
862 8239779 : return _params.count(coupling_name) > 0 && _params.at(coupling_name)._have_coupled_default &&
863 8239779 : _coupled_vars.count(coupling_name) > 0;
864 : }
865 :
866 : void
867 1079 : InputParameters::defaultCoupledValue(const std::string & coupling_name, Real value, unsigned int i)
868 : {
869 1079 : const auto actual_name = checkForRename(coupling_name);
870 1079 : _params[actual_name]._coupled_default.resize(i + 1);
871 1079 : _params[actual_name]._coupled_default[i] = value;
872 1079 : _params[actual_name]._have_coupled_default = true;
873 1079 : }
874 :
875 : Real
876 929920 : InputParameters::defaultCoupledValue(const std::string & coupling_name, unsigned int i) const
877 : {
878 929920 : auto value_it = _params.find(coupling_name);
879 :
880 929920 : if (value_it == _params.end() || !value_it->second._have_coupled_default)
881 0 : mooseError("Attempted to retrieve default value for coupled variable '",
882 : coupling_name,
883 : "' when none was provided. \n\nThere are three reasons why this may have "
884 : "occurred:\n 1. The other version of params.addCoupledVar() should be used in order "
885 : "to provide a default value. \n 2. This should have been a required coupled "
886 : "variable added with params.addRequiredCoupledVar() \n 3. The call to get the "
887 : "coupled value should have been properly guarded with isCoupled()\n");
888 :
889 1849840 : return value_it->second._coupled_default.at(i);
890 : }
891 :
892 : unsigned int
893 150311 : InputParameters::numberDefaultCoupledValues(const std::string & coupling_name) const
894 : {
895 150311 : auto value_it = _params.find(coupling_name);
896 150311 : if (value_it == _params.end())
897 0 : mooseError("Attempted to retrieve default value for coupled variable '",
898 : coupling_name,
899 : "' when none was provided.");
900 300622 : return value_it->second._coupled_default.size();
901 : }
902 :
903 : std::map<std::string, std::pair<std::string, std::string>>
904 2331050 : InputParameters::getAutoBuildVectors() const
905 : {
906 2331050 : std::map<std::string, std::pair<std::string, std::string>> abv;
907 65739069 : for (auto it = _params.begin(); it != _params.end(); ++it)
908 : {
909 63408019 : if (!it->second._autobuild_vecs.first.empty())
910 2 : abv[it->first] = it->second._autobuild_vecs;
911 : }
912 2331050 : return abv;
913 0 : }
914 :
915 : std::string
916 1175042 : InputParameters::type(const std::string & name_in) const
917 : {
918 1175042 : const auto name = checkForRename(name_in);
919 1175042 : if (!_values.count(name))
920 0 : mooseError("Parameter \"", name, "\" not found.\n\n", *this);
921 :
922 1175042 : if (_coupled_vars.find(name) != _coupled_vars.end())
923 57856 : return "std::vector<VariableName>";
924 1146114 : else if (_params.count(name) > 0 && !_params.at(name)._custom_type.empty())
925 1251 : return _params.at(name)._custom_type;
926 1144863 : return _values.at(name)->type();
927 1175042 : }
928 :
929 : std::string
930 1414552 : InputParameters::getMooseType(const std::string & name_in) const
931 : {
932 1414552 : const auto name = checkForRename(name_in);
933 1414552 : std::string var;
934 :
935 1414552 : if (have_parameter<VariableName>(name))
936 84489 : var = get<VariableName>(name);
937 1330063 : else if (have_parameter<NonlinearVariableName>(name))
938 753453 : var = get<NonlinearVariableName>(name);
939 576610 : else if (have_parameter<LinearVariableName>(name))
940 12699 : var = get<LinearVariableName>(name);
941 563911 : else if (have_parameter<AuxVariableName>(name))
942 436605 : var = get<AuxVariableName>(name);
943 127306 : else if (have_parameter<PostprocessorName>(name))
944 0 : var = get<PostprocessorName>(name);
945 127306 : else if (have_parameter<VectorPostprocessorName>(name))
946 0 : var = get<VectorPostprocessorName>(name);
947 127306 : else if (have_parameter<FunctionName>(name))
948 0 : var = get<FunctionName>(name);
949 127306 : else if (have_parameter<UserObjectName>(name))
950 0 : var = get<UserObjectName>(name);
951 127306 : else if (have_parameter<MaterialPropertyName>(name))
952 0 : var = get<MaterialPropertyName>(name);
953 127306 : else if (have_parameter<std::string>(name))
954 0 : var = get<std::string>(name);
955 :
956 2829104 : return var;
957 1414552 : }
958 :
959 : std::vector<std::string>
960 583320 : InputParameters::getVecMooseType(const std::string & name_in) const
961 : {
962 583320 : const auto name = checkForRename(name_in);
963 583320 : std::vector<std::string> svars;
964 :
965 583320 : if (have_parameter<std::vector<VariableName>>(name))
966 : {
967 583314 : std::vector<VariableName> vars = get<std::vector<VariableName>>(name);
968 583314 : std::copy(vars.begin(), vars.end(), std::back_inserter(svars));
969 583314 : }
970 6 : else if (have_parameter<std::vector<NonlinearVariableName>>(name))
971 : {
972 0 : std::vector<NonlinearVariableName> vars = get<std::vector<NonlinearVariableName>>(name);
973 0 : std::copy(vars.begin(), vars.end(), std::back_inserter(svars));
974 0 : }
975 6 : else if (have_parameter<std::vector<AuxVariableName>>(name))
976 : {
977 0 : std::vector<AuxVariableName> vars = get<std::vector<AuxVariableName>>(name);
978 0 : std::copy(vars.begin(), vars.end(), std::back_inserter(svars));
979 0 : }
980 6 : else if (have_parameter<std::vector<MaterialPropertyName>>(name))
981 : {
982 0 : std::vector<MaterialPropertyName> vars = get<std::vector<MaterialPropertyName>>(name);
983 0 : std::copy(vars.begin(), vars.end(), std::back_inserter(svars));
984 0 : }
985 6 : else if (have_parameter<std::vector<std::string>>(name))
986 : {
987 0 : std::vector<std::string> vars = get<std::vector<std::string>>(name);
988 0 : std::copy(vars.begin(), vars.end(), std::back_inserter(svars));
989 0 : }
990 :
991 1166640 : return svars;
992 583320 : }
993 :
994 : bool
995 18959 : InputParameters::isMooseBaseObject() const
996 : {
997 37814 : return have_parameter<std::string>(MooseBase::type_param) &&
998 37814 : get<std::string>(MooseBase::type_param).size() &&
999 37787 : have_parameter<std::string>(MooseBase::name_param);
1000 : }
1001 :
1002 : const std::string *
1003 12523894 : InputParameters::queryObjectType() const
1004 : {
1005 12523894 : return have_parameter<std::string>(MooseBase::type_param)
1006 12523894 : ? &get<std::string>(MooseBase::type_param)
1007 12523894 : : nullptr;
1008 : }
1009 :
1010 : const std::string &
1011 12522866 : InputParameters::getObjectType() const
1012 : {
1013 12522866 : if (const auto type_ptr = queryObjectType())
1014 12522864 : return *type_ptr;
1015 2 : ::mooseError("InputParameters::getObjectType(): Missing '", MooseBase::type_param, "' param");
1016 : }
1017 :
1018 : const std::string &
1019 13596320 : InputParameters::getObjectName() const
1020 : {
1021 13596320 : if (!have_parameter<std::string>(MooseBase::name_param))
1022 0 : ::mooseError("InputParameters::getObjectName(): Missing '", MooseBase::name_param, "' param");
1023 13596320 : return get<std::string>(MooseBase::name_param);
1024 : }
1025 :
1026 : void
1027 63780106 : InputParameters::addParamNamesToGroup(const std::string & space_delim_names,
1028 : const std::string group_name)
1029 : {
1030 63780106 : std::vector<std::string> elements;
1031 63780106 : MooseUtils::tokenize(space_delim_names, elements, 1, " \t\n\v\f\r"); // tokenize on whitespace
1032 :
1033 : // Since we don't require types (templates) for this method, we need
1034 : // to get a raw list of parameter names to compare against.
1035 63780106 : std::set<std::string> param_names;
1036 1020232990 : for (const auto & it : *this)
1037 956452884 : param_names.insert(it.first);
1038 :
1039 204328823 : for (const auto & param_name : elements)
1040 140548717 : if (_params.count(param_name) > 0)
1041 140548717 : _params[param_name]._group = group_name;
1042 : else
1043 0 : mooseError("Unable to find a parameter with name: ",
1044 : param_name,
1045 : " when adding to group ",
1046 : group_name,
1047 0 : '.');
1048 63780106 : }
1049 :
1050 : void
1051 9671 : InputParameters::renameParameterGroup(const std::string & old_name, const std::string & new_name)
1052 : {
1053 167697 : for (auto & param : _params)
1054 158026 : if (param.second._group == old_name)
1055 32730 : param.second._group = new_name;
1056 9671 : }
1057 :
1058 : void
1059 1894156 : InputParameters::setGlobalCommandLineParam(const std::string & name)
1060 : {
1061 1894156 : auto & cl_data = at(checkForRename(name))._cl_data;
1062 1894156 : if (!cl_data)
1063 2 : mooseError("InputParameters::setGlobalCommandLineParam: The parameter '",
1064 : name,
1065 : "' is not a command line parameter");
1066 1894154 : cl_data->global = true;
1067 1894154 : }
1068 :
1069 : bool
1070 4 : InputParameters::isCommandLineParameter(const std::string & name) const
1071 : {
1072 4 : return at(checkForRename(name))._cl_data.has_value();
1073 : }
1074 :
1075 : std::optional<InputParameters::CommandLineMetadata>
1076 24474405 : InputParameters::queryCommandLineMetadata(const std::string & name) const
1077 : {
1078 24474405 : const auto & cl_data = at(checkForRename(name))._cl_data;
1079 24474405 : if (!cl_data)
1080 18675444 : return {};
1081 5798961 : return *cl_data;
1082 : }
1083 :
1084 : const InputParameters::CommandLineMetadata &
1085 11 : InputParameters::getCommandLineMetadata(const std::string & name) const
1086 : {
1087 11 : const auto & cl_data = at(checkForRename(name))._cl_data;
1088 11 : if (!cl_data)
1089 2 : mooseError("InputParameters::getCommandLineMetadata: The parameter '",
1090 : name,
1091 : "' is not a command line parameter");
1092 9 : return *cl_data;
1093 : }
1094 :
1095 : void
1096 459178 : InputParameters::commandLineParamSet(const std::string & name, const CommandLineParamSetKey)
1097 : {
1098 459178 : auto & cl_data = at(checkForRename(name))._cl_data;
1099 459178 : if (!cl_data)
1100 2 : mooseError("InputParameters::commandLineParamSet: The parameter '",
1101 : name,
1102 : "' is not a command line parameter");
1103 459176 : cl_data->set_by_command_line = true;
1104 459176 : }
1105 :
1106 : std::string
1107 1173030 : InputParameters::getGroupName(const std::string & param_name_in) const
1108 : {
1109 1173030 : const auto param_name = checkForRename(param_name_in);
1110 1173030 : auto it = _params.find(param_name);
1111 1173030 : if (it != _params.end())
1112 1173030 : return it->second._group;
1113 0 : return std::string();
1114 1173030 : }
1115 :
1116 : void
1117 329722 : InputParameters::applyParameters(const InputParameters & common,
1118 : const std::vector<std::string> & exclude,
1119 : const bool allow_private)
1120 : {
1121 : // If we're applying all of the things, also associate the top level hit node
1122 329722 : if (exclude.empty() && !getHitNode() && common.getHitNode())
1123 177099 : setHitNode(*common.getHitNode(), {});
1124 :
1125 : // Loop through the common parameters
1126 24797897 : for (const auto & it : common)
1127 : {
1128 : // Common parameter name
1129 24468175 : const std::string & common_name = it.first;
1130 : // Continue to next parameter, if the current is in list of excluded parameters
1131 24468175 : if (std::find(exclude.begin(), exclude.end(), common_name) != exclude.end())
1132 0 : continue;
1133 :
1134 24468175 : applyParameter(common, common_name, allow_private);
1135 : }
1136 :
1137 : // Loop through the coupled variables
1138 331149 : for (const auto & var_name : common._coupled_vars)
1139 : {
1140 : // Continue to next variable, if the current is in list of excluded parameters
1141 1427 : if (std::find(exclude.begin(), exclude.end(), var_name) != exclude.end())
1142 0 : continue;
1143 :
1144 1427 : applyCoupledVar(common, var_name);
1145 : }
1146 329722 : }
1147 :
1148 : void
1149 288700 : InputParameters::applyCommonUserSetParameters(const InputParameters & common,
1150 : const std::vector<std::string> & exclude,
1151 : const bool allow_private)
1152 : {
1153 15878500 : for (const auto & it : common)
1154 : {
1155 15589800 : const std::string & common_name = it.first;
1156 15589800 : if (std::find(exclude.begin(), exclude.end(), common_name) != exclude.end())
1157 0 : continue;
1158 15589800 : if (!common.isParamSetByUser(common_name))
1159 14680895 : continue;
1160 908905 : applyParameter(common, common_name, allow_private);
1161 : }
1162 :
1163 288700 : for (const auto & var_name : common._coupled_vars)
1164 : {
1165 0 : if (std::find(exclude.begin(), exclude.end(), var_name) != exclude.end())
1166 0 : continue;
1167 0 : if (!common.isParamSetByUser(var_name))
1168 0 : continue;
1169 0 : applyCoupledVar(common, var_name);
1170 : }
1171 288700 : }
1172 :
1173 : void
1174 125315 : InputParameters::applySpecificParameters(const InputParameters & common,
1175 : const std::vector<std::string> & include,
1176 : bool allow_private)
1177 : {
1178 : // Loop through the common parameters
1179 2749929 : for (const auto & it : common)
1180 : {
1181 : // Common parameter name
1182 2624614 : const std::string & common_name = it.first;
1183 :
1184 : // Continue to next parameter, if the current is not in list of included parameters
1185 2624614 : if (std::find(include.begin(), include.end(), common_name) == include.end())
1186 2255696 : continue;
1187 :
1188 368918 : applyParameter(common, common_name, allow_private);
1189 : }
1190 :
1191 : // Loop through the coupled variables
1192 125315 : for (std::set<std::string>::const_iterator it = common.coupledVarsBegin();
1193 125315 : it != common.coupledVarsEnd();
1194 0 : ++it)
1195 : {
1196 : // Variable name
1197 0 : const std::string var_name = *it;
1198 :
1199 : // Continue to next variable, if the current is not in list of included parameters
1200 0 : if (std::find(include.begin(), include.end(), var_name) == include.end())
1201 0 : continue;
1202 :
1203 0 : applyCoupledVar(common, var_name);
1204 0 : }
1205 125315 : }
1206 :
1207 : void
1208 1427 : InputParameters::applyCoupledVar(const InputParameters & common, const std::string & var_name)
1209 : {
1210 : // Disable the display of deprecated message when applying common parameters, this avoids a dump
1211 : // of messages
1212 1427 : _show_deprecated_message = false;
1213 :
1214 : // If the local parameters has a coupled variable, populate it with the value from the common
1215 : // parameters, if the common parameters has the coupled variable too
1216 1427 : if (hasCoupledVar(var_name))
1217 : {
1218 1423 : if (common.hasDefaultCoupledValue(var_name))
1219 : {
1220 : // prepare a vector of default coupled values
1221 0 : std::vector<Real> defaults(common.numberDefaultCoupledValues(var_name));
1222 0 : for (unsigned int j = 0; j < common.numberDefaultCoupledValues(var_name); ++j)
1223 0 : defaults[j] = common.defaultCoupledValue(var_name, j);
1224 0 : addCoupledVar(var_name, defaults, common.getDocString(var_name));
1225 0 : }
1226 1423 : else if (common.hasCoupledVar(var_name))
1227 1423 : addCoupledVar(var_name, common.getDocString(var_name));
1228 : }
1229 :
1230 : // Enable deprecated message printing
1231 1427 : _show_deprecated_message = true;
1232 1427 : }
1233 :
1234 : void
1235 25746145 : InputParameters::applyParameter(const InputParameters & common,
1236 : const std::string & common_name,
1237 : bool allow_private)
1238 : {
1239 : // Disable the display of deprecated message when applying common parameters, this avoids a dump
1240 : // of messages
1241 25746145 : _show_deprecated_message = false;
1242 :
1243 25746145 : const auto local_name = checkForRename(common_name);
1244 :
1245 : // Extract the properties from the local parameter for the current common parameter name
1246 25746145 : const bool local_exist = _values.find(local_name) != _values.end();
1247 25746145 : const bool local_set = _params.count(local_name) > 0 && !_params[local_name]._set_by_add_param;
1248 25746145 : const bool local_priv = allow_private ? false : isPrivate(local_name);
1249 25746145 : const bool local_valid = isParamValid(local_name);
1250 :
1251 : // Extract the properties from the common parameter
1252 25746145 : const bool common_exist = common._values.find(common_name) != common._values.end();
1253 25746145 : const bool common_priv = allow_private ? false : common.isPrivate(common_name);
1254 25746145 : const bool common_valid = common.isParamValid(common_name);
1255 :
1256 : /* In order to apply a common parameter 4 statements must be satisfied
1257 : * (1) A local parameter must exist with the same name as the common parameter
1258 : * (2) Common parameter must be valid and exist
1259 : * (3) Local parameter must be invalid OR not have been set from its default
1260 : * (4) Both cannot be private
1261 : */
1262 25746145 : if (local_exist && common_exist && common_valid && (!local_valid || !local_set) &&
1263 7379245 : (!common_priv || !local_priv))
1264 : {
1265 3220606 : remove(local_name);
1266 3220606 : _values[local_name] = common._values.find(common_name)->second->clone();
1267 3220606 : set_attributes(local_name, false);
1268 6441212 : _params[local_name]._set_by_add_param =
1269 3220606 : libmesh_map_find(common._params, common_name)._set_by_add_param;
1270 : // Keep track of where this param came from if we can. This will enable us to
1271 : // produce param errors from objects created within an action that link to
1272 : // the parameter in the action
1273 3220606 : at(local_name)._hit_node = common.getHitNode(common_name);
1274 : }
1275 22525539 : else if (!local_exist && !common_exist)
1276 2 : mooseError("InputParameters::applyParameter(): Attempted to apply invalid parameter \"",
1277 : common_name,
1278 : "\"");
1279 :
1280 : // Enable deprecated message printing
1281 25746143 : _show_deprecated_message = true;
1282 25746145 : }
1283 :
1284 : ///Deprecated method
1285 : bool
1286 0 : InputParameters::paramSetByUser(const std::string & name) const
1287 : {
1288 0 : mooseDeprecated("paramSetByUser() is deprecated. Use isParamSetByUser() instead.");
1289 0 : return isParamSetByUser(name);
1290 : }
1291 :
1292 : bool
1293 20355837 : InputParameters::isParamSetByUser(const std::string & name_in) const
1294 : {
1295 20355837 : const auto name = checkForRename(name_in);
1296 : // Invalid; for sure not set by the user
1297 20355837 : if (!isParamValid(name))
1298 2328418 : return false;
1299 : // Parameter is not located in the list (called Parameters::set)
1300 18027419 : if (!_params.count(name))
1301 0 : return false;
1302 : // Special case for a command line option, which is a private parameter
1303 18027419 : if (const auto cl_data = queryCommandLineMetadata(name))
1304 18027419 : return cl_data->set_by_command_line;
1305 : // Not a command line option, not set by addParam and not private
1306 17343592 : return !_params.at(name)._set_by_add_param && !_params.at(name)._is_private;
1307 20355837 : }
1308 :
1309 : bool
1310 4 : InputParameters::isParamDefined(const std::string & name_in) const
1311 : {
1312 4 : const auto name = checkForRename(name_in);
1313 8 : return _params.count(name) > 0;
1314 4 : }
1315 :
1316 : const std::string &
1317 4213578 : InputParameters::getDescription(const std::string & name_in) const
1318 : {
1319 4213578 : const auto name = checkForRename(name_in);
1320 4213578 : auto it = _params.find(name);
1321 4213578 : if (it == _params.end())
1322 0 : mooseError("No parameter exists with the name ", name);
1323 8427156 : return it->second._doc_string;
1324 4213578 : }
1325 :
1326 : template <>
1327 : void
1328 499866 : InputParameters::addRequiredParam<MooseEnum>(const std::string & name,
1329 : const MooseEnum & moose_enum,
1330 : const std::string & doc_string)
1331 : {
1332 499866 : InputParameters::set<MooseEnum>(name) = moose_enum; // valid parameter is set by set_attributes
1333 499866 : auto & metadata = _params[name];
1334 499866 : metadata._required = true;
1335 499866 : metadata._doc_string = doc_string;
1336 499866 : }
1337 :
1338 : template <>
1339 : void
1340 4 : InputParameters::addRequiredParam<MultiMooseEnum>(const std::string & name,
1341 : const MultiMooseEnum & moose_enum,
1342 : const std::string & doc_string)
1343 : {
1344 4 : InputParameters::set<MultiMooseEnum>(name) =
1345 4 : moose_enum; // valid parameter is set by set_attributes
1346 4 : auto & metadata = _params[name];
1347 4 : metadata._required = true;
1348 4 : metadata._doc_string = doc_string;
1349 4 : }
1350 :
1351 : template <>
1352 : void
1353 4 : InputParameters::addRequiredParam<std::vector<MooseEnum>>(
1354 : const std::string & name,
1355 : const std::vector<MooseEnum> & moose_enums,
1356 : const std::string & doc_string)
1357 : {
1358 4 : InputParameters::set<std::vector<MooseEnum>>(name) =
1359 4 : moose_enums; // valid parameter is set by set_attributes
1360 4 : auto & metadata = _params[name];
1361 4 : metadata._required = true;
1362 4 : metadata._doc_string = doc_string;
1363 4 : }
1364 :
1365 : template <>
1366 : void
1367 3102 : InputParameters::addRequiredParam<std::vector<MultiMooseEnum>>(
1368 : const std::string & name,
1369 : const std::vector<MultiMooseEnum> & moose_enums,
1370 : const std::string & doc_string)
1371 : {
1372 : mooseAssert(
1373 : moose_enums.size() == 1,
1374 : "Only 1 MultiMooseEnum is supported in addRequiredParam<std::vector<MultiMooseEnum>> for " +
1375 : name);
1376 : mooseAssert(!moose_enums[0].items().empty(),
1377 : "The MultiMooseEnum in addRequiredParam<std::vector<MultiMooseEnum>> is empty for " +
1378 : name);
1379 3102 : InputParameters::set<std::vector<MultiMooseEnum>>(name) =
1380 3102 : moose_enums; // valid parameter is set by set_attributes
1381 3102 : auto & metadata = _params[name];
1382 3102 : metadata._required = true;
1383 3102 : metadata._doc_string = doc_string;
1384 3102 : }
1385 :
1386 : template <>
1387 : void
1388 0 : InputParameters::addParam<MooseEnum>(const std::string & /*name*/,
1389 : const std::string & /*doc_string*/)
1390 : {
1391 0 : mooseError("You must supply a MooseEnum object when using addParam, even if the parameter is not "
1392 : "required!");
1393 : }
1394 :
1395 : template <>
1396 : void
1397 0 : InputParameters::addParam<MultiMooseEnum>(const std::string & /*name*/,
1398 : const std::string & /*doc_string*/)
1399 : {
1400 0 : mooseError("You must supply a MultiMooseEnum object when using addParam, even if the parameter "
1401 : "is not required!");
1402 : }
1403 :
1404 : template <>
1405 : void
1406 0 : InputParameters::addParam<std::vector<MooseEnum>>(const std::string & /*name*/,
1407 : const std::string & /*doc_string*/)
1408 : {
1409 0 : mooseError("You must supply a vector of MooseEnum object(s) when using addParam, even if the "
1410 : "parameter is not required!");
1411 : }
1412 :
1413 : template <>
1414 : void
1415 0 : InputParameters::addParam<std::vector<MultiMooseEnum>>(const std::string & /*name*/,
1416 : const std::string & /*doc_string*/)
1417 : {
1418 0 : mooseError(
1419 : "You must supply a vector of MultiMooseEnum object(s) when using addParam, even if the "
1420 : "parameter is not required!");
1421 : }
1422 :
1423 : template <>
1424 : void
1425 0 : InputParameters::addRequiredParam<std::vector<MultiMooseEnum>>(const std::string & /*name*/,
1426 : const std::string & /*doc_string*/)
1427 : {
1428 0 : mooseError("You must supply a vector of MultiMooseEnum object(s) when using addRequiredParam!");
1429 : }
1430 :
1431 : template <>
1432 : void
1433 0 : InputParameters::addPrivateParam<MooseEnum>(const std::string & /*name*/)
1434 : {
1435 0 : mooseError("You must supply a MooseEnum object when using addPrivateParam, even if the parameter "
1436 : "is not required!");
1437 : }
1438 :
1439 : template <>
1440 : void
1441 0 : InputParameters::addPrivateParam<MultiMooseEnum>(const std::string & /*name*/)
1442 : {
1443 0 : mooseError("You must supply a MultiMooseEnum object when using addPrivateParam, even if the "
1444 : "parameter is not required!");
1445 : }
1446 :
1447 : template <>
1448 : void
1449 0 : InputParameters::addDeprecatedParam<MooseEnum>(const std::string & /*name*/,
1450 : const std::string & /*doc_string*/,
1451 : const std::string & /*deprecation_message*/)
1452 : {
1453 0 : mooseError("You must supply a MooseEnum object and the deprecation string when using "
1454 : "addDeprecatedParam, even if the parameter is not required!");
1455 : }
1456 :
1457 : template <>
1458 : void
1459 0 : InputParameters::addDeprecatedParam<MultiMooseEnum>(const std::string & /*name*/,
1460 : const std::string & /*doc_string*/,
1461 : const std::string & /*deprecation_message*/)
1462 : {
1463 0 : mooseError("You must supply a MultiMooseEnum object and the deprecation string when using "
1464 : "addDeprecatedParam, even if the parameter is not required!");
1465 : }
1466 :
1467 : template <>
1468 : void
1469 0 : InputParameters::addDeprecatedParam<std::vector<MooseEnum>>(
1470 : const std::string & /*name*/,
1471 : const std::string & /*doc_string*/,
1472 : const std::string & /*deprecation_message*/)
1473 : {
1474 0 : mooseError("You must supply a vector of MooseEnum object(s) and the deprecation string when "
1475 : "using addDeprecatedParam, even if the parameter is not required!");
1476 : }
1477 :
1478 : template <>
1479 : void
1480 38298 : InputParameters::setParamHelper<PostprocessorName, Real>(const std::string & /*name*/,
1481 : PostprocessorName & l_value,
1482 : const Real & r_value)
1483 : {
1484 : // Assign the default value so that it appears in the dump
1485 38298 : std::ostringstream oss;
1486 38298 : oss << r_value;
1487 38298 : l_value = oss.str();
1488 38298 : }
1489 :
1490 : template <>
1491 : void
1492 61409 : InputParameters::setParamHelper<PostprocessorName, int>(const std::string & /*name*/,
1493 : PostprocessorName & l_value,
1494 : const int & r_value)
1495 : {
1496 : // Assign the default value so that it appears in the dump
1497 61409 : std::ostringstream oss;
1498 61409 : oss << r_value;
1499 61409 : l_value = oss.str();
1500 61409 : }
1501 :
1502 : template <>
1503 : void
1504 9668 : InputParameters::setParamHelper<FunctionName, Real>(const std::string & /*name*/,
1505 : FunctionName & l_value,
1506 : const Real & r_value)
1507 : {
1508 : // Assign the default value so that it appears in the dump
1509 9668 : std::ostringstream oss;
1510 9668 : oss << r_value;
1511 9668 : l_value = oss.str();
1512 9668 : }
1513 :
1514 : template <>
1515 : void
1516 168982 : InputParameters::setParamHelper<FunctionName, int>(const std::string & /*name*/,
1517 : FunctionName & l_value,
1518 : const int & r_value)
1519 : {
1520 : // Assign the default value so that it appears in the dump
1521 168982 : std::ostringstream oss;
1522 168982 : oss << r_value;
1523 168982 : l_value = oss.str();
1524 168982 : }
1525 :
1526 : template <>
1527 : void
1528 26584 : InputParameters::setParamHelper<MaterialPropertyName, Real>(const std::string & /*name*/,
1529 : MaterialPropertyName & l_value,
1530 : const Real & r_value)
1531 : {
1532 : // Assign the default value so that it appears in the dump
1533 26584 : std::ostringstream oss;
1534 26584 : oss << r_value;
1535 26584 : l_value = oss.str();
1536 26584 : }
1537 :
1538 : template <>
1539 : void
1540 31344 : InputParameters::setParamHelper<MaterialPropertyName, int>(const std::string & /*name*/,
1541 : MaterialPropertyName & l_value,
1542 : const int & r_value)
1543 : {
1544 : // Assign the default value so that it appears in the dump
1545 31344 : std::ostringstream oss;
1546 31344 : oss << r_value;
1547 31344 : l_value = oss.str();
1548 31344 : }
1549 :
1550 : template <>
1551 : void
1552 53057 : InputParameters::setParamHelper<MooseFunctorName, Real>(const std::string & /*name*/,
1553 : MooseFunctorName & l_value,
1554 : const Real & r_value)
1555 : {
1556 : // Assign the default value so that it appears in the dump
1557 53057 : std::ostringstream oss;
1558 53057 : oss << r_value;
1559 53057 : l_value = oss.str();
1560 53057 : }
1561 :
1562 : template <>
1563 : void
1564 73754 : InputParameters::setParamHelper<MooseFunctorName, int>(const std::string & /*name*/,
1565 : MooseFunctorName & l_value,
1566 : const int & r_value)
1567 : {
1568 : // Assign the default value so that it appears in the dump
1569 73754 : std::ostringstream oss;
1570 73754 : oss << r_value;
1571 73754 : l_value = oss.str();
1572 73754 : }
1573 :
1574 : template <>
1575 : const MooseEnum &
1576 2319421 : InputParameters::getParamHelper<MooseEnum>(const std::string & name_in,
1577 : const InputParameters & pars)
1578 : {
1579 2319421 : const auto name = pars.checkForRename(name_in);
1580 4638842 : return pars.get<MooseEnum>(name);
1581 2319421 : }
1582 :
1583 : template <>
1584 : const MultiMooseEnum &
1585 200784 : InputParameters::getParamHelper<MultiMooseEnum>(const std::string & name_in,
1586 : const InputParameters & pars)
1587 : {
1588 200784 : const auto name = pars.checkForRename(name_in);
1589 401568 : return pars.get<MultiMooseEnum>(name);
1590 200784 : }
1591 :
1592 : void
1593 2244871 : InputParameters::setReservedValues(const std::string & name_in,
1594 : const std::set<std::string> & reserved)
1595 : {
1596 2244871 : const auto name = checkForRename(name_in);
1597 2244871 : _params[name]._reserved_values = reserved;
1598 2244871 : }
1599 :
1600 : std::set<std::string>
1601 719412 : InputParameters::reservedValues(const std::string & name_in) const
1602 : {
1603 719412 : const auto name = checkForRename(name_in);
1604 719412 : auto it = _params.find(name);
1605 719412 : if (it == _params.end())
1606 0 : return std::set<std::string>();
1607 719412 : return it->second._reserved_values;
1608 719412 : }
1609 :
1610 : std::string
1611 0 : InputParameters::blockLocation() const
1612 : {
1613 0 : if (const auto hit_node = getHitNode())
1614 0 : return hit_node->fileLocation(/* with_column = */ false);
1615 0 : return "";
1616 : }
1617 :
1618 : std::string
1619 14980314 : InputParameters::blockFullpath() const
1620 : {
1621 14980314 : if (const auto hit_node = getHitNode())
1622 13873472 : return hit_node->fullpath();
1623 2213684 : return "";
1624 : }
1625 :
1626 : const hit::Node *
1627 3515200 : InputParameters::getHitNode(const std::string & param) const
1628 : {
1629 3515200 : return at(param)._hit_node;
1630 : }
1631 :
1632 : void
1633 2667955 : InputParameters::setHitNode(const std::string & param,
1634 : const hit::Node & node,
1635 : const InputParameters::SetParamHitNodeKey)
1636 : {
1637 : mooseAssert(node.type() == hit::NodeType::Field, "Must be a field");
1638 2667955 : at(param)._hit_node = &node;
1639 2667955 : }
1640 :
1641 : std::string
1642 24 : InputParameters::inputLocation(const std::string & param) const
1643 : {
1644 24 : if (const auto hit_node = getHitNode(param))
1645 24 : return hit_node->fileLocation(/* with_column = */ false);
1646 0 : return "";
1647 : }
1648 :
1649 : std::string
1650 34 : InputParameters::paramFullpath(const std::string & param) const
1651 : {
1652 34 : if (const auto hit_node = getHitNode(param))
1653 30 : return hit_node->fullpath();
1654 8 : return "";
1655 : }
1656 :
1657 : void
1658 860217332 : InputParameters::checkParamName(const std::string & name) const
1659 : {
1660 860217332 : const static pcrecpp::RE valid("[\\w:/]+");
1661 860217332 : if (!valid.FullMatch(name))
1662 6 : mooseError("Invalid parameter name: '", name, "'");
1663 860217326 : }
1664 :
1665 : bool
1666 63408019 : InputParameters::shouldIgnore(const std::string & name_in)
1667 : {
1668 63408019 : const auto name = checkForRename(name_in);
1669 63408019 : auto it = _params.find(name);
1670 63408019 : if (it != _params.end())
1671 126816038 : return it->second._ignore;
1672 0 : mooseError("Parameter ", name, " does not exist");
1673 63408019 : }
1674 :
1675 : std::set<std::string>
1676 0 : InputParameters::getGroupParameters(const std::string & group) const
1677 : {
1678 0 : std::set<std::string> names;
1679 0 : for (auto it = _params.begin(); it != _params.end(); ++it)
1680 0 : if (it->second._group == group)
1681 0 : names.emplace(it->first);
1682 0 : return names;
1683 0 : }
1684 :
1685 : std::set<std::string>
1686 695 : InputParameters::getParametersList() const
1687 : {
1688 695 : std::set<std::string> param_set;
1689 28381 : for (auto it = _params.begin(); it != _params.end(); ++it)
1690 27686 : param_set.emplace(it->first);
1691 695 : return param_set;
1692 0 : }
1693 :
1694 : std::set<std::string>
1695 5710729 : InputParameters::getControllableParameters() const
1696 : {
1697 5710729 : std::set<std::string> controllable;
1698 152286332 : for (auto it = _params.begin(); it != _params.end(); ++it)
1699 146575603 : if (it->second._controllable)
1700 907823 : controllable.emplace(it->first);
1701 5710729 : return controllable;
1702 0 : }
1703 :
1704 : std::string
1705 12 : InputParameters::paramLocationPrefix(const std::string & param) const
1706 : {
1707 12 : auto prefix = param + ":";
1708 12 : if (!inputLocation(param).empty())
1709 12 : prefix = inputLocation(param) + ": (" + paramFullpath(param) + ")";
1710 12 : return prefix;
1711 0 : }
1712 :
1713 : std::string
1714 0 : InputParameters::rawParamVal(const std::string & param) const
1715 : {
1716 0 : if (const auto hit_node = getHitNode(param))
1717 0 : return hit_node->strVal();
1718 0 : return "";
1719 : }
1720 :
1721 : std::string
1722 514838 : InputParameters::varName(const std::string & var_param_name,
1723 : const std::string & moose_object_with_var_param_name) const
1724 : {
1725 : // Try the scalar version first
1726 514838 : std::string variable_name = getMooseType(var_param_name);
1727 514838 : if (variable_name == "")
1728 : {
1729 65734 : auto vec = getVecMooseType(var_param_name);
1730 :
1731 : // Catch the (very unlikely) case where a user specifies
1732 : // variable = '' (the empty string)
1733 : // in their input file. This could happen if e.g. something goes
1734 : // wrong with dollar bracket expression expansion.
1735 65734 : if (vec.empty())
1736 6 : mooseError("Error constructing object '",
1737 : moose_object_with_var_param_name,
1738 : "' while retrieving value for '",
1739 : var_param_name,
1740 : "' parameter! Did you forget to set '",
1741 : var_param_name,
1742 : "' or set it to '' (empty string) by accident?");
1743 :
1744 : // When using vector variables, we are only going to use the first one in the list at the
1745 : // interface level...
1746 65728 : variable_name = vec[0];
1747 65728 : }
1748 :
1749 514832 : return variable_name;
1750 0 : }
1751 :
1752 : void
1753 156154 : InputParameters::renameParamInternal(const std::string & old_name,
1754 : const std::string & new_name,
1755 : const std::string & docstring,
1756 : const std::string & removal_date)
1757 : {
1758 156154 : auto params_it = _params.find(old_name);
1759 156154 : if (params_it == _params.end())
1760 0 : mooseError("Requested to rename parameter '",
1761 : old_name,
1762 : "' but that parameter name doesn't exist in the parameters object.");
1763 : mooseAssert(params_it->second._deprecation_message.empty(),
1764 : "Attempting to rename the parameter, '" << old_name << "', that is deprecated");
1765 :
1766 156154 : auto new_metadata = std::move(params_it->second);
1767 156154 : if (!docstring.empty())
1768 109489 : new_metadata._doc_string = docstring;
1769 156154 : _params.emplace(new_name, std::move(new_metadata));
1770 156154 : _params.erase(params_it);
1771 :
1772 156154 : auto values_it = _values.find(old_name);
1773 156154 : auto new_value = std::move(values_it->second);
1774 156154 : _values.emplace(new_name, std::move(new_value));
1775 156154 : _values.erase(values_it);
1776 :
1777 156154 : std::string deprecation_message;
1778 156154 : if (!removal_date.empty())
1779 51514 : deprecation_message = "'" + old_name + "' has been deprecated and will be removed on " +
1780 51514 : removal_date + ". Please use '" + new_name + "' instead.";
1781 :
1782 156154 : _old_to_new_name_and_dep.emplace(old_name, std::make_pair(new_name, deprecation_message));
1783 156154 : _new_to_old_names.emplace(new_name, old_name);
1784 156154 : }
1785 :
1786 : void
1787 47746 : InputParameters::renameCoupledVarInternal(const std::string & old_name,
1788 : const std::string & new_name,
1789 : const std::string & docstring,
1790 : const std::string & removal_date)
1791 : {
1792 47746 : auto coupled_vars_it = _coupled_vars.find(old_name);
1793 47746 : if (coupled_vars_it == _coupled_vars.end())
1794 0 : mooseError("Requested to rename coupled variable '",
1795 : old_name,
1796 : "' but that coupled variable name doesn't exist in the parameters object.");
1797 :
1798 47746 : _coupled_vars.insert(new_name);
1799 47746 : _coupled_vars.erase(coupled_vars_it);
1800 :
1801 47746 : renameParamInternal(old_name, new_name, docstring, removal_date);
1802 47746 : }
1803 :
1804 : void
1805 95817 : InputParameters::renameParam(const std::string & old_name,
1806 : const std::string & new_name,
1807 : const std::string & new_docstring)
1808 : {
1809 95817 : renameParamInternal(old_name, new_name, new_docstring, "");
1810 95817 : }
1811 :
1812 : void
1813 34580 : InputParameters::renameCoupledVar(const std::string & old_name,
1814 : const std::string & new_name,
1815 : const std::string & new_docstring)
1816 : {
1817 34580 : renameCoupledVarInternal(old_name, new_name, new_docstring, "");
1818 34580 : }
1819 :
1820 : void
1821 12591 : InputParameters::deprecateParam(const std::string & old_name,
1822 : const std::string & new_name,
1823 : const std::string & removal_date)
1824 : {
1825 12591 : renameParamInternal(old_name, new_name, "", removal_date);
1826 12591 : }
1827 :
1828 : void
1829 13166 : InputParameters::deprecateCoupledVar(const std::string & old_name,
1830 : const std::string & new_name,
1831 : const std::string & removal_date)
1832 : {
1833 13166 : renameCoupledVarInternal(old_name, new_name, "", removal_date);
1834 13166 : }
1835 :
1836 : std::string
1837 5703293241 : InputParameters::checkForRename(const std::string & name) const
1838 : {
1839 5703293241 : if (auto it = _old_to_new_name_and_dep.find(name); it != _old_to_new_name_and_dep.end())
1840 37195 : return it->second.first;
1841 : else
1842 5703256046 : return name;
1843 : }
1844 :
1845 : std::vector<std::string>
1846 63405333 : InputParameters::paramAliases(const std::string & param_name) const
1847 : {
1848 : mooseAssert(_values.find(param_name) != _values.end(),
1849 : "The parameter we are searching for aliases for should exist in our parameter map");
1850 190215999 : std::vector<std::string> aliases = {param_name};
1851 :
1852 63421518 : for (const auto & pr : as_range(_new_to_old_names.equal_range(param_name)))
1853 16185 : aliases.push_back(pr.second);
1854 :
1855 63405333 : return aliases;
1856 63405333 : }
1857 :
1858 : std::optional<Moose::DataFileUtils::Path>
1859 11343 : InputParameters::queryDataFileNamePath(const std::string & name) const
1860 : {
1861 11343 : return at(checkForRename(name))._data_file_name_path;
1862 : }
1863 :
1864 : std::optional<std::string>
1865 77120 : InputParameters::setupVariableNames(std::vector<VariableName> & names,
1866 : const hit::Node & node,
1867 : const Moose::PassKey<Moose::Builder>)
1868 : {
1869 : // Whether or not a name was found
1870 77120 : bool has_name = false;
1871 : // Whether or not a default value (real) was found
1872 77120 : bool has_default = false;
1873 :
1874 : // Search through the names for values that convert to Real values,
1875 : // which are default values. If defaults are found, set appropriately
1876 : // in the InputParameters object. Keep track of if names or defaults
1877 : // were found because we don't allow having both
1878 163532 : for (const auto i : index_range(names))
1879 : {
1880 86412 : auto & name = names[i];
1881 : Real real_value;
1882 86412 : if (MooseUtils::convert<Real>(name, real_value, false))
1883 : {
1884 1079 : has_default = true;
1885 1079 : defaultCoupledValue(node.path(), real_value, i);
1886 : }
1887 : else
1888 85333 : has_name = true;
1889 : }
1890 :
1891 77120 : if (has_default)
1892 : {
1893 538 : if (has_name)
1894 6 : return {"invalid value for '" + node.fullpath() +
1895 : "': coupled vectors where some parameters are reals and others are variables are not "
1896 3 : "supported"};
1897 :
1898 : // Don't actually use the names if these don't represent names
1899 535 : names.clear();
1900 : }
1901 :
1902 77117 : return {};
1903 : }
1904 :
1905 : std::pair<std::string, const hit::Node *>
1906 2524 : InputParameters::paramMessageContext(const std::string & param) const
1907 : {
1908 2524 : const hit::Node * node = nullptr;
1909 :
1910 2524 : std::string fullpath;
1911 : // First try to find the parameter
1912 2524 : if (const hit::Node * param_node = getHitNode(param))
1913 : {
1914 2341 : fullpath = param_node->fullpath();
1915 2341 : node = param_node;
1916 : }
1917 : // If no parameter node, hope for a block node
1918 183 : else if (const hit::Node * block_node = getHitNode())
1919 : {
1920 139 : node = block_node;
1921 139 : fullpath = block_node->fullpath() + "/" + param;
1922 : }
1923 : // Didn't find anything, at least use the parameter
1924 : else
1925 44 : fullpath = param;
1926 :
1927 5048 : return {fullpath + ": ", node};
1928 2524 : }
1929 :
1930 : std::string
1931 1230 : InputParameters::paramMessagePrefix(const std::string & param) const
1932 : {
1933 1230 : auto [prefix, node] = paramMessageContext(param);
1934 1230 : if (node)
1935 1230 : prefix = Moose::hitMessagePrefix(*node) + prefix;
1936 2460 : return prefix;
1937 1230 : }
1938 :
1939 : [[noreturn]] void
1940 1374 : InputParameters::callMooseError(std::string msg,
1941 : const bool with_prefix /* = true */,
1942 : const hit::Node * node /* = nullptr */,
1943 : const bool show_trace /* = true */) const
1944 : {
1945 : // Find the context of the app if we can. This will let our errors be
1946 : // prefixed by the multiapp name (if applicable) and will flush the
1947 : // console before outputting an error
1948 1374 : MooseApp * app = nullptr;
1949 1374 : if (isMooseBaseObject() && have_parameter<MooseApp *>(MooseBase::app_param))
1950 1288 : app = get<MooseApp *>(MooseBase::app_param);
1951 :
1952 1374 : MooseBase::callMooseError(app, *this, msg, with_prefix, node, show_trace);
1953 : }
|