https://mooseframework.inl.gov
InputParameters.C
Go to the documentation of this file.
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 
32 {
33  InputParameters params;
34  return params;
35 }
36 
38  : Parameters(),
39  _collapse_nesting(false),
40  _moose_object_syntax_visibility(true),
41  _show_deprecated_message(true),
42  _allow_copy(true),
43  _hit_node(nullptr),
44  _finalized(false)
45 {
46 }
47 
49  : Parameters(), _show_deprecated_message(true), _allow_copy(true)
50 {
51  *this = rhs;
52 }
53 
54 InputParameters::InputParameters(const Parameters & rhs)
55  : _show_deprecated_message(true), _allow_copy(true)
56 {
57  _params.clear();
59  _collapse_nesting = false;
61 }
62 
63 void
65 {
67  _params.clear();
68  _coupled_vars.clear();
70  _collapse_nesting = false;
73  _allow_copy = true;
75  _new_to_old_names.clear();
76  _hit_node = nullptr;
77  _finalized = false;
78 }
79 
80 void
81 InputParameters::addClassDescription(const std::string & doc_string)
82 {
83  _class_description = doc_string;
84 }
85 
86 void
87 InputParameters::set_attributes(const std::string & name_in, bool inserted_only)
88 {
89  const auto name = checkForRename(name_in);
90 
91  if (!inserted_only)
92  {
93  auto & metadata = _params[name];
100  metadata._set_by_add_param = false;
101 
102  // valid_params don't make sense for MooseEnums
103  if (!have_parameter<MooseEnum>(name) && !have_parameter<MultiMooseEnum>(name))
104  metadata._valid = true;
105  }
106 }
107 
108 std::optional<std::string>
109 InputParameters::queryDeprecatedParamMessage(const std::string & name_in) const
110 {
111  const auto name = checkForRename(name_in);
113  {
114  auto deprecation_message = [this](const auto & name, const auto & message) -> std::string
115  { return paramMessagePrefix(name) + message; };
116 
117  if (_params.count(name) && !libmesh_map_find(_params, name)._deprecation_message.empty())
118  return deprecation_message(name,
119  "The parameter '" + name + "' is deprecated.\n" +
120  libmesh_map_find(_params, name)._deprecation_message);
121  else if (auto it = _old_to_new_name_and_dep.find(name_in);
122  it != _old_to_new_name_and_dep.end() && !it->second.second.empty())
123  return deprecation_message(name_in, it->second.second);
124  }
125  return {};
126 }
127 
128 std::string
130 {
131  return _class_description;
132 }
133 
136 {
137  // An error to help minimize the segmentation faults that occure when MooseObjects do not have the
138  // correct constructor
139  if (!rhs._allow_copy)
140  {
141  // If _allow_parameter_copy is set, these should be too (see
142  // InputParameterWarehouse::addInputParameters)
143  const std::string & name = rhs.getObjectName();
144  const std::string & type = rhs.getObjectType(); // could be empty
145  const std::string name_example = type.size() ? type : "the " + name + " object";
146  const std::string type_example = type.size() ? type : "MyObject";
147  ::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  }
159 
161 
162  _params = rhs._params;
163 
170  _allow_copy = rhs._allow_copy;
173  _hit_node = rhs._hit_node;
174  _finalized = false;
175 
176  return *this;
177 }
178 
181 {
182  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  for (auto it = rhs._params.begin(); it != rhs._params.end(); ++it)
187  _params[it->first] = it->second;
188 
189  _buildable_types.insert(
190  _buildable_types.end(), rhs._buildable_types.begin(), rhs._buildable_types.end());
191  _buildable_rm_types.insert(
192  _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  _coupled_vars.insert(rhs._coupled_vars.begin(), rhs._coupled_vars.end());
198 
200  rhs._old_to_new_name_and_dep.end());
201  _new_to_old_names.insert(rhs._new_to_old_names.begin(), rhs._new_to_old_names.end());
202  return *this;
203 }
204 
205 void
206 InputParameters::setDeprecatedVarDocString(const std::string & new_name,
207  const std::string & doc_string)
208 {
209  auto coupled_vars_it = _new_to_deprecated_coupled_vars.find(new_name);
210  if (coupled_vars_it != _new_to_deprecated_coupled_vars.end())
211  {
212  auto params_it = _params.find(coupled_vars_it->second);
213  if (params_it == _params.end())
214  mooseError("There must have been a mistake in the construction of the new to deprecated "
215  "coupled vars map because the old name ",
216  coupled_vars_it->second,
217  " doesn't exist in the parameters data.");
218 
219  params_it->second._doc_string = doc_string;
220  }
221 }
222 
223 void
224 InputParameters::addCoupledVar(const std::string & name, Real value, const std::string & doc_string)
225 {
226  addParam<std::vector<VariableName>>(name, doc_string);
227  _coupled_vars.insert(name);
228  auto & metadata = _params[name];
229  metadata._coupled_default.assign(1, value);
230  metadata._have_coupled_default = true;
231 
232  // Set the doc string for any associated deprecated coupled var
233  setDeprecatedVarDocString(name, doc_string);
234 }
235 
236 void
237 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  addParam<std::vector<VariableName>>(name, doc_string);
243  _coupled_vars.insert(name);
244  auto & metadata = _params[name];
245  metadata._coupled_default = value;
246  metadata._have_coupled_default = true;
247 
248  // Set the doc string for any associated deprecated coupled var
249  setDeprecatedVarDocString(name, doc_string);
250 }
251 
252 void
253 InputParameters::addCoupledVar(const std::string & name, const std::string & doc_string)
254 {
255  addParam<std::vector<VariableName>>(name, doc_string);
256  _coupled_vars.insert(name);
257 
258  // Set the doc string for any associated deprecated coupled var
259  setDeprecatedVarDocString(name, doc_string);
260 }
261 
262 void
263 InputParameters::addDeprecatedCoupledVar(const std::string & old_name,
264  const std::string & new_name,
265  const std::string & removal_date /*=""*/)
266 {
267  mooseDeprecated("Please use 'deprecateCoupledVar'");
268 
269  _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  auto params_it = _params.find(new_name);
273  std::string doc_string;
274  if (params_it != _params.end())
275  doc_string = params_it->second._doc_string;
276 
277  addParam<std::vector<VariableName>>(old_name, doc_string);
278  _coupled_vars.insert(old_name);
279  _new_to_deprecated_coupled_vars.emplace(new_name, old_name);
280 
281  std::string deprecation_message =
282  "The coupled variable parameter '" + old_name + "' has been deprecated";
283  if (!removal_date.empty())
284  deprecation_message += " and will be removed " + removal_date;
285  deprecation_message += ". Please use the '" + new_name + "' coupled variable parameter instead.";
286  _params[old_name]._deprecation_message = deprecation_message;
288 }
289 
290 void
292  const std::string & base_name,
293  const std::string & num_name,
294  const std::string & doc_string)
295 {
296  addParam<std::vector<VariableName>>(name, doc_string);
297  _coupled_vars.insert(name);
298  _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  addParam<std::string>(base_name, doc_string + " (base_name)");
302  addParam<unsigned int>(num_name, doc_string + " (num_name)");
303 }
304 
305 void
307  const std::string & base_name,
308  const std::string & num_name,
309  const std::string & doc_string)
310 {
311  addRequiredParam<std::vector<VariableName>>(name, doc_string);
312 
313  addCoupledVarWithAutoBuild(name, base_name, num_name, doc_string);
314 }
315 
316 void
317 InputParameters::addRequiredCoupledVar(const std::string & name, const std::string & doc_string)
318 {
319  addRequiredParam<std::vector<VariableName>>(name, doc_string);
320  _coupled_vars.insert(name);
321 }
322 
323 std::string
324 InputParameters::getDocString(const std::string & name_in) const
325 {
326  const auto name = checkForRename(name_in);
327 
328  std::string doc_string;
329  auto it = _params.find(name);
330  if (it != _params.end())
331  for (const auto & ch : it->second._doc_string)
332  {
333  if (ch == '\n')
334  doc_string += " ... ";
335  else
336  doc_string += ch;
337  }
338 
339  return doc_string;
340 }
341 
342 void
343 InputParameters::setDocString(const std::string & name_in, const std::string & doc)
344 {
345  const auto name = checkForRename(name_in);
346 
347  auto it = _params.find(name);
348  if (it == _params.end())
349  mooseError("Unable to set the documentation string (using setDocString) for the \"",
350  name,
351  "\" parameter, the parameter does not exist.");
352  it->second._doc_string = doc;
353 }
354 
355 std::string
356 InputParameters::getDocUnit(const std::string & name_in) const
357 {
358  const auto name = checkForRename(name_in);
359  return _params.at(name)._doc_unit;
360 }
361 
362 void
363 InputParameters::setDocUnit(const std::string & name_in, const std::string & doc_unit)
364 {
365  const auto name = checkForRename(name_in);
366  _params[name]._doc_unit = doc_unit;
367 }
368 
369 bool
370 InputParameters::isParamRequired(const std::string & name_in) const
371 {
372  const auto name = checkForRename(name_in);
373  return _params.count(name) > 0 && _params.at(name)._required;
374 }
375 
376 void
377 InputParameters::makeParamNotRequired(const std::string & name_in)
378 {
379  const auto name = checkForRename(name_in);
380 
381  if (_params.count(name))
382  _params[name]._required = false;
383 }
384 
385 bool
386 InputParameters::isParamValid(const std::string & name_in) const
387 {
388  const auto name = checkForRename(name_in);
389  if (have_parameter<MooseEnum>(name))
390  return get<MooseEnum>(name).isValid();
391  else if (have_parameter<std::vector<MooseEnum>>(name))
392  {
393  for (auto it = get<std::vector<MooseEnum>>(name).begin();
394  it != get<std::vector<MooseEnum>>(name).end();
395  ++it)
396  if (!it->isValid())
397  return false;
398  return true;
399  }
400  else if (have_parameter<MultiMooseEnum>(name))
401  return get<MultiMooseEnum>(name).isValid();
402  else if (have_parameter<std::vector<MultiMooseEnum>>(name))
403  {
404  for (auto it = get<std::vector<MultiMooseEnum>>(name).begin();
405  it != get<std::vector<MultiMooseEnum>>(name).end();
406  ++it)
407  if (!it->isValid())
408  return false;
409  return true;
410  }
411  else if (have_parameter<ExecFlagEnum>(name))
412  return get<ExecFlagEnum>(name).isValid();
413  else
414  return _params.count(name) > 0 && _params.at(name)._valid;
415 }
416 
417 bool
418 InputParameters::isParamSetByAddParam(const std::string & name_in) const
419 {
420  const auto name = checkForRename(name_in);
421  return _params.count(name) > 0 && _params.at(name)._set_by_add_param;
422 }
423 
424 bool
425 InputParameters::isParamDeprecated(const std::string & name_in) const
426 {
427  const auto name = checkForRename(name_in);
428  return _params.count(name) > 0 && !_params.at(name)._deprecation_message.empty();
429 }
430 
431 #ifdef MOOSE_KOKKOS_ENABLED
432 bool
434 {
436 }
437 #endif
438 
439 bool
441 {
442  for (const auto & it : *this)
443  if (isParamRequired(it.first) && !isParamValid(it.first))
444  return false;
445  return true;
446 }
447 
448 bool
449 InputParameters::isPrivate(const std::string & name_in) const
450 {
451  const auto name = checkForRename(name_in);
452  return _params.count(name) > 0 && _params.at(name)._is_private;
453 }
454 
455 void
456 InputParameters::declareControllable(const std::string & input_names,
457  std::set<ExecFlagType> execute_flags)
458 {
459  std::vector<std::string> names;
460  MooseUtils::tokenize<std::string>(input_names, names, 1, " ");
461  for (auto & name_in : names)
462  {
463  const auto name = checkForRename(name_in);
464  auto map_iter = _params.find(name);
465  if (map_iter != _params.end()) // error is handled by checkParams method
466  {
467  map_iter->second._controllable = true;
468  map_iter->second._controllable_flags = execute_flags;
469  }
470  else
471  mooseError("The input parameter '",
472  name,
473  "' does not exist, thus cannot be marked as controllable.");
474  }
475 }
476 
477 bool
478 InputParameters::isControllable(const std::string & name_in) const
479 {
480  const auto name = checkForRename(name_in);
481  return _params.count(name) > 0 && _params.at(name)._controllable;
482 }
483 
484 const std::set<ExecFlagType> &
485 InputParameters::getControllableExecuteOnTypes(const std::string & name_in) const
486 {
487  const auto name = checkForRename(name_in);
488  return at(name)._controllable_flags;
489 }
490 
491 void
492 InputParameters::registerBase(const std::string & value)
493 {
494  InputParameters::set<std::string>(MooseBase::moose_base_param) = value;
495  _params[MooseBase::moose_base_param]._is_private = true;
496 }
497 
498 bool
500 {
501  return have_parameter<std::string>(MooseBase::moose_base_param);
502 }
503 
504 const std::string &
506 {
507  if (!have_parameter<std::string>(MooseBase::moose_base_param))
508  mooseError("InputParameters::getBase(): Parameters do not have base; one needs to be set with "
509  "registerBase()");
510  return get<std::string>(MooseBase::moose_base_param);
511 }
512 
513 void
515 {
516  InputParameters::set<std::string>("_moose_warehouse_system_name") = value;
517  _params["_moose_warehouse_system_name"]._is_private = true;
518 }
519 
520 const std::string &
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  return Parameters::get<std::string>("_moose_warehouse_system_name");
527 }
528 
529 void
530 InputParameters::registerBuildableTypes(const std::string & names)
531 {
532  _buildable_types.clear();
533  MooseUtils::tokenize(names, _buildable_types, 1, " \t\n\v\f\r"); // tokenize on whitespace
534 }
535 
536 void
538  const std::string & name,
540  Moose::RelationshipManagerInputParameterCallback input_parameter_callback)
541 {
542  _buildable_rm_types.emplace_back(name, rm_type, input_parameter_callback);
543 }
544 
545 const std::vector<std::string> &
547 {
548  return _buildable_types;
549 }
550 
551 const std::vector<std::tuple<std::string,
555 {
556  return _buildable_rm_types;
557 }
558 
559 void
561 {
562  _collapse_nesting = collapse;
563 }
564 
565 bool
567 {
568  return _collapse_nesting;
569 }
570 
571 void
573 {
574  _moose_object_syntax_visibility = visibility;
575 }
576 
577 bool
579 {
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 InputParameters::checkParams(const std::string & parsing_syntax)
590 {
591  const std::string parampath = blockFullpath() != "" ? blockFullpath() : parsing_syntax;
592 
593  // Required parameters
594  std::vector<std::string> required_param_errors;
595  for (const auto & it : *this)
596  {
597  const auto param_name = checkForRename(it.first);
598  if (!isParamValid(param_name) && isParamRequired(param_name))
599  {
600  // check if an old, deprecated name exists for this parameter that may be specified
601  auto oit = _new_to_deprecated_coupled_vars.find(param_name);
602  if (oit != _new_to_deprecated_coupled_vars.end() && isParamValid(oit->second))
603  continue;
604 
605  required_param_errors.push_back("missing required parameter '" + parampath + "/" +
606  param_name + "'\n\tDoc String: \"" +
607  getDocString(param_name) + "\"");
608  }
609  }
610 
611  if (required_param_errors.size())
612  mooseError(MooseUtils::stringJoin(required_param_errors, "\n"));
613 
614  // Range checked parameters
615  for (const auto & [name, param_ptr] : *this)
616  {
617  if (const auto error = parameterRangeCheck(*param_ptr, parampath + "/" + name, name, false))
618  {
619  if (error->first)
620  paramError(name, error->second);
621  else
622  mooseError("For range checked parameter '" + name + "': " + error->second);
623  }
624  }
625 
626  // Controllable parameters
627  for (const auto & param_name : getControllableParameters())
628  {
629  if (isPrivate(param_name))
630  paramError(param_name,
631  "private parameter '" + paramFullpath(param_name) + "' marked controllable");
632 
633  std::optional<std::string> error;
634  checkMooseType(NonlinearVariableName, param_name);
635  checkMooseType(AuxVariableName, param_name);
636  checkMooseType(VariableName, param_name);
637  checkMooseType(BoundaryName, param_name);
638  checkMooseType(SubdomainName, param_name);
639  checkMooseType(PostprocessorName, param_name);
640  checkMooseType(VectorPostprocessorName, param_name);
641  checkMooseType(UserObjectName, param_name);
642  checkMooseType(MaterialPropertyName, param_name);
643  if (error)
644  paramError(param_name, *error);
645  }
646 }
647 
648 std::optional<std::pair<bool, std::string>>
649 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  dynamicCastRangeCheck(Real, Real, long_name, short_name);
665  dynamicCastRangeCheck(int, long, long_name, short_name);
666  dynamicCastRangeCheck(long, long, long_name, short_name);
667  dynamicCastRangeCheck(unsigned int, long, long_name, short_name);
668 #undef dynamicCastRangeCheck
669 
670  return {};
671 }
672 
673 void
674 InputParameters::finalize(const std::string & parsing_syntax)
675 {
676  mooseAssert(!isFinalized(), "Already finalized");
677 
678  checkParams(parsing_syntax);
679 
680  // Set parameters that represent file types
681  for (const auto & name_value : *this)
682  {
683  const auto & param_name = name_value.first;
684  const auto & param_value = name_value.second;
685 
686  // Helper for setting a file typed parameter value
687  const auto set_filename = [&](auto & value)
688  {
689  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  if (value.empty())
698  return;
699  }
700 
701  // Setup options for searching for the path
703  // Associate relative path searches with the folder
704  // that input file that has this parameter is located
705  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  options.search_all_data = false;
718  options.graceful = true;
719  }
720 
722  try
723  {
724  Moose::ScopedThrowOnError scoped_throw_on_error;
725  path = Moose::DataFileUtils::getPath(value, options);
726  }
727  catch (std::exception & e)
728  {
729  paramError(param_name, e.what());
730  }
731 
732  value = path.path;
733  at(param_name)._data_file_name_path = path;
734  };
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  set_if_filename(FileName);
745  set_if_filename(FileNameNoExtension);
746  set_if_filename(MeshFileName);
747  set_if_filename(MatrixFileName);
748  set_if_filename(DataFileName);
749 #undef set_if_filename
750  }
751 
752  _finalized = true;
753 }
754 
755 std::filesystem::path
756 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  const hit::Node * hit_node = nullptr;
762 
763  // Context from the individual parameter
764  if (param_name)
765  hit_node = getHitNode(*param_name);
766  // Context from the parameters
767  if (!hit_node)
768  hit_node = getHitNode();
769  // No hit node, so use the cwd (no input files)
770  if (!hit_node)
771  return std::filesystem::current_path();
772 
773  // Find any context that isn't command line arguments
774  while (hit_node && hit_node->filename() == "CLI_ARGS")
775  hit_node = hit_node->parent();
776 
777  // Failed to find a node up the tree that isn't a command line argument
778  if (!hit_node)
779  {
780  const std::string error = "Input context was set via a command-line argument and does not have "
781  "sufficient context for determining a file path.";
782  if (param_name)
783  paramError(*param_name, error);
784  else
785  mooseError(error);
786  }
787 
788  return std::filesystem::absolute(std::filesystem::path(hit_node->filename()).parent_path());
789 }
790 
791 bool
792 InputParameters::isRangeChecked(const std::string & param_name) const
793 {
794  const auto name = checkForRename(param_name);
795  return !_params.find(name)->second._range_function.empty();
796 }
797 
798 std::string
799 InputParameters::rangeCheckedFunction(const std::string & param_name) const
800 {
801  const auto name = checkForRename(param_name);
802  return _params.at(name)._range_function;
803 }
804 
805 bool
806 InputParameters::hasDefault(const std::string & param_name) const
807 {
808  const auto name = checkForRename(param_name);
810  return true;
811  // If it has a default, it's already valid
812  else if (isParamSetByAddParam(name))
813  return true;
814  else if (isParamValid(name))
815  mooseError("No way to know if the parameter '", param_name, "' has a default");
816  else
817  return false;
818 }
819 
820 bool
821 InputParameters::hasCoupledVar(const std::string & coupling_name) const
822 {
823  return _coupled_vars.find(coupling_name) != _coupled_vars.end();
824 }
825 
826 void
827 InputParameters::setCoupledVar(const std::string & coupling_name, const std::string & value)
828 {
829  setCoupledVar(coupling_name, std::vector<VariableName>{value});
830 }
831 
832 void
833 InputParameters::setCoupledVar(const std::string & coupling_name,
834  const std::vector<VariableName> & values)
835 {
836  const auto actual_name = checkForRename(coupling_name);
837 
838  if (!hasCoupledVar(actual_name))
839  mooseError("Unable to set coupled variable parameter '",
840  coupling_name,
841  "' because it was not added with addCoupledVar or addRequiredCoupledVar.");
842 
843  set<std::vector<VariableName>>(actual_name) = values;
844 }
845 
846 const std::vector<VariableName> &
847 InputParameters::getCoupledVar(const std::string & coupling_name) const
848 {
849  const auto actual_name = checkForRename(coupling_name);
850 
851  if (!hasCoupledVar(actual_name))
852  mooseError("Unable to get coupled variable parameter '",
853  coupling_name,
854  "' because it was not added with addCoupledVar or addRequiredCoupledVar.");
855 
856  return get<std::vector<VariableName>>(actual_name);
857 }
858 
859 bool
860 InputParameters::hasDefaultCoupledValue(const std::string & coupling_name) const
861 {
862  return _params.count(coupling_name) > 0 && _params.at(coupling_name)._have_coupled_default &&
863  _coupled_vars.count(coupling_name) > 0;
864 }
865 
866 void
867 InputParameters::defaultCoupledValue(const std::string & coupling_name, Real value, unsigned int i)
868 {
869  const auto actual_name = checkForRename(coupling_name);
870  _params[actual_name]._coupled_default.resize(i + 1);
871  _params[actual_name]._coupled_default[i] = value;
872  _params[actual_name]._have_coupled_default = true;
873 }
874 
875 Real
876 InputParameters::defaultCoupledValue(const std::string & coupling_name, unsigned int i) const
877 {
878  auto value_it = _params.find(coupling_name);
879 
880  if (value_it == _params.end() || !value_it->second._have_coupled_default)
881  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  return value_it->second._coupled_default.at(i);
890 }
891 
892 unsigned int
893 InputParameters::numberDefaultCoupledValues(const std::string & coupling_name) const
894 {
895  auto value_it = _params.find(coupling_name);
896  if (value_it == _params.end())
897  mooseError("Attempted to retrieve default value for coupled variable '",
898  coupling_name,
899  "' when none was provided.");
900  return value_it->second._coupled_default.size();
901 }
902 
903 std::map<std::string, std::pair<std::string, std::string>>
905 {
906  std::map<std::string, std::pair<std::string, std::string>> abv;
907  for (auto it = _params.begin(); it != _params.end(); ++it)
908  {
909  if (!it->second._autobuild_vecs.first.empty())
910  abv[it->first] = it->second._autobuild_vecs;
911  }
912  return abv;
913 }
914 
915 std::string
916 InputParameters::type(const std::string & name_in) const
917 {
918  const auto name = checkForRename(name_in);
919  if (!_values.count(name))
920  mooseError("Parameter \"", name, "\" not found.\n\n", *this);
921 
922  if (_coupled_vars.find(name) != _coupled_vars.end())
923  return "std::vector<VariableName>";
924  else if (_params.count(name) > 0 && !_params.at(name)._custom_type.empty())
925  return _params.at(name)._custom_type;
926  return _values.at(name)->type();
927 }
928 
929 std::string
930 InputParameters::getMooseType(const std::string & name_in) const
931 {
932  const auto name = checkForRename(name_in);
933  std::string var;
934 
935  if (have_parameter<VariableName>(name))
936  var = get<VariableName>(name);
937  else if (have_parameter<NonlinearVariableName>(name))
938  var = get<NonlinearVariableName>(name);
939  else if (have_parameter<LinearVariableName>(name))
940  var = get<LinearVariableName>(name);
941  else if (have_parameter<AuxVariableName>(name))
942  var = get<AuxVariableName>(name);
943  else if (have_parameter<PostprocessorName>(name))
944  var = get<PostprocessorName>(name);
945  else if (have_parameter<VectorPostprocessorName>(name))
946  var = get<VectorPostprocessorName>(name);
947  else if (have_parameter<FunctionName>(name))
948  var = get<FunctionName>(name);
949  else if (have_parameter<UserObjectName>(name))
950  var = get<UserObjectName>(name);
951  else if (have_parameter<MaterialPropertyName>(name))
952  var = get<MaterialPropertyName>(name);
953  else if (have_parameter<std::string>(name))
954  var = get<std::string>(name);
955 
956  return var;
957 }
958 
959 std::vector<std::string>
960 InputParameters::getVecMooseType(const std::string & name_in) const
961 {
962  const auto name = checkForRename(name_in);
963  std::vector<std::string> svars;
964 
965  if (have_parameter<std::vector<VariableName>>(name))
966  {
967  std::vector<VariableName> vars = get<std::vector<VariableName>>(name);
968  std::copy(vars.begin(), vars.end(), std::back_inserter(svars));
969  }
970  else if (have_parameter<std::vector<NonlinearVariableName>>(name))
971  {
972  std::vector<NonlinearVariableName> vars = get<std::vector<NonlinearVariableName>>(name);
973  std::copy(vars.begin(), vars.end(), std::back_inserter(svars));
974  }
975  else if (have_parameter<std::vector<AuxVariableName>>(name))
976  {
977  std::vector<AuxVariableName> vars = get<std::vector<AuxVariableName>>(name);
978  std::copy(vars.begin(), vars.end(), std::back_inserter(svars));
979  }
980  else if (have_parameter<std::vector<MaterialPropertyName>>(name))
981  {
982  std::vector<MaterialPropertyName> vars = get<std::vector<MaterialPropertyName>>(name);
983  std::copy(vars.begin(), vars.end(), std::back_inserter(svars));
984  }
985  else if (have_parameter<std::vector<std::string>>(name))
986  {
987  std::vector<std::string> vars = get<std::vector<std::string>>(name);
988  std::copy(vars.begin(), vars.end(), std::back_inserter(svars));
989  }
990 
991  return svars;
992 }
993 
994 bool
996 {
997  return have_parameter<std::string>(MooseBase::type_param) &&
998  get<std::string>(MooseBase::type_param).size() &&
999  have_parameter<std::string>(MooseBase::name_param);
1000 }
1001 
1002 const std::string *
1004 {
1005  return have_parameter<std::string>(MooseBase::type_param)
1006  ? &get<std::string>(MooseBase::type_param)
1007  : nullptr;
1008 }
1009 
1010 const std::string &
1012 {
1013  if (const auto type_ptr = queryObjectType())
1014  return *type_ptr;
1015  ::mooseError("InputParameters::getObjectType(): Missing '", MooseBase::type_param, "' param");
1016 }
1017 
1018 const std::string &
1020 {
1021  if (!have_parameter<std::string>(MooseBase::name_param))
1022  ::mooseError("InputParameters::getObjectName(): Missing '", MooseBase::name_param, "' param");
1023  return get<std::string>(MooseBase::name_param);
1024 }
1025 
1026 void
1027 InputParameters::addParamNamesToGroup(const std::string & space_delim_names,
1028  const std::string group_name)
1029 {
1030  std::vector<std::string> elements;
1031  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  std::set<std::string> param_names;
1036  for (const auto & it : *this)
1037  param_names.insert(it.first);
1038 
1039  for (const auto & param_name : elements)
1040  if (_params.count(param_name) > 0)
1041  _params[param_name]._group = group_name;
1042  else
1043  mooseError("Unable to find a parameter with name: ",
1044  param_name,
1045  " when adding to group ",
1046  group_name,
1047  '.');
1048 }
1049 
1050 void
1051 InputParameters::renameParameterGroup(const std::string & old_name, const std::string & new_name)
1052 {
1053  for (auto & param : _params)
1054  if (param.second._group == old_name)
1055  param.second._group = new_name;
1056 }
1057 
1058 void
1060 {
1061  auto & cl_data = at(checkForRename(name))._cl_data;
1062  if (!cl_data)
1063  mooseError("InputParameters::setGlobalCommandLineParam: The parameter '",
1064  name,
1065  "' is not a command line parameter");
1066  cl_data->global = true;
1067 }
1068 
1069 bool
1070 InputParameters::isCommandLineParameter(const std::string & name) const
1071 {
1072  return at(checkForRename(name))._cl_data.has_value();
1073 }
1074 
1075 std::optional<InputParameters::CommandLineMetadata>
1076 InputParameters::queryCommandLineMetadata(const std::string & name) const
1077 {
1078  const auto & cl_data = at(checkForRename(name))._cl_data;
1079  if (!cl_data)
1080  return {};
1081  return *cl_data;
1082 }
1083 
1085 InputParameters::getCommandLineMetadata(const std::string & name) const
1086 {
1087  const auto & cl_data = at(checkForRename(name))._cl_data;
1088  if (!cl_data)
1089  mooseError("InputParameters::getCommandLineMetadata: The parameter '",
1090  name,
1091  "' is not a command line parameter");
1092  return *cl_data;
1093 }
1094 
1095 void
1097 {
1098  auto & cl_data = at(checkForRename(name))._cl_data;
1099  if (!cl_data)
1100  mooseError("InputParameters::commandLineParamSet: The parameter '",
1101  name,
1102  "' is not a command line parameter");
1103  cl_data->set_by_command_line = true;
1104 }
1105 
1106 std::string
1107 InputParameters::getGroupName(const std::string & param_name_in) const
1108 {
1109  const auto param_name = checkForRename(param_name_in);
1110  auto it = _params.find(param_name);
1111  if (it != _params.end())
1112  return it->second._group;
1113  return std::string();
1114 }
1115 
1116 void
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  if (exclude.empty() && !getHitNode() && common.getHitNode())
1123  setHitNode(*common.getHitNode(), {});
1124 
1125  // Loop through the common parameters
1126  for (const auto & it : common)
1127  {
1128  // Common parameter name
1129  const std::string & common_name = it.first;
1130  // Continue to next parameter, if the current is in list of excluded parameters
1131  if (std::find(exclude.begin(), exclude.end(), common_name) != exclude.end())
1132  continue;
1133 
1134  applyParameter(common, common_name, allow_private);
1135  }
1136 
1137  // Loop through the coupled variables
1138  for (const auto & var_name : common._coupled_vars)
1139  {
1140  // Continue to next variable, if the current is in list of excluded parameters
1141  if (std::find(exclude.begin(), exclude.end(), var_name) != exclude.end())
1142  continue;
1143 
1144  applyCoupledVar(common, var_name);
1145  }
1146 }
1147 
1148 void
1150  const std::vector<std::string> & exclude,
1151  const bool allow_private)
1152 {
1153  for (const auto & it : common)
1154  {
1155  const std::string & common_name = it.first;
1156  if (std::find(exclude.begin(), exclude.end(), common_name) != exclude.end())
1157  continue;
1158  if (!common.isParamSetByUser(common_name))
1159  continue;
1160  applyParameter(common, common_name, allow_private);
1161  }
1162 
1163  for (const auto & var_name : common._coupled_vars)
1164  {
1165  if (std::find(exclude.begin(), exclude.end(), var_name) != exclude.end())
1166  continue;
1167  if (!common.isParamSetByUser(var_name))
1168  continue;
1169  applyCoupledVar(common, var_name);
1170  }
1171 }
1172 
1173 void
1175  const std::vector<std::string> & include,
1176  bool allow_private)
1177 {
1178  // Loop through the common parameters
1179  for (const auto & it : common)
1180  {
1181  // Common parameter name
1182  const std::string & common_name = it.first;
1183 
1184  // Continue to next parameter, if the current is not in list of included parameters
1185  if (std::find(include.begin(), include.end(), common_name) == include.end())
1186  continue;
1187 
1188  applyParameter(common, common_name, allow_private);
1189  }
1190 
1191  // Loop through the coupled variables
1192  for (std::set<std::string>::const_iterator it = common.coupledVarsBegin();
1193  it != common.coupledVarsEnd();
1194  ++it)
1195  {
1196  // Variable name
1197  const std::string var_name = *it;
1198 
1199  // Continue to next variable, if the current is not in list of included parameters
1200  if (std::find(include.begin(), include.end(), var_name) == include.end())
1201  continue;
1202 
1203  applyCoupledVar(common, var_name);
1204  }
1205 }
1206 
1207 void
1208 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  _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  if (hasCoupledVar(var_name))
1217  {
1218  if (common.hasDefaultCoupledValue(var_name))
1219  {
1220  // prepare a vector of default coupled values
1221  std::vector<Real> defaults(common.numberDefaultCoupledValues(var_name));
1222  for (unsigned int j = 0; j < common.numberDefaultCoupledValues(var_name); ++j)
1223  defaults[j] = common.defaultCoupledValue(var_name, j);
1224  addCoupledVar(var_name, defaults, common.getDocString(var_name));
1225  }
1226  else if (common.hasCoupledVar(var_name))
1227  addCoupledVar(var_name, common.getDocString(var_name));
1228  }
1229 
1230  // Enable deprecated message printing
1231  _show_deprecated_message = true;
1232 }
1233 
1234 void
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  _show_deprecated_message = false;
1242 
1243  const auto local_name = checkForRename(common_name);
1244 
1245  // Extract the properties from the local parameter for the current common parameter name
1246  const bool local_exist = _values.find(local_name) != _values.end();
1247  const bool local_set = _params.count(local_name) > 0 && !_params[local_name]._set_by_add_param;
1248  const bool local_priv = allow_private ? false : isPrivate(local_name);
1249  const bool local_valid = isParamValid(local_name);
1250 
1251  // Extract the properties from the common parameter
1252  const bool common_exist = common._values.find(common_name) != common._values.end();
1253  const bool common_priv = allow_private ? false : common.isPrivate(common_name);
1254  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  if (local_exist && common_exist && common_valid && (!local_valid || !local_set) &&
1263  (!common_priv || !local_priv))
1264  {
1265  remove(local_name);
1266  _values[local_name] = common._values.find(common_name)->second->clone();
1267  set_attributes(local_name, false);
1268  _params[local_name]._set_by_add_param =
1269  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  at(local_name)._hit_node = common.getHitNode(common_name);
1274  }
1275  else if (!local_exist && !common_exist)
1276  mooseError("InputParameters::applyParameter(): Attempted to apply invalid parameter \"",
1277  common_name,
1278  "\"");
1279 
1280  // Enable deprecated message printing
1281  _show_deprecated_message = true;
1282 }
1283 
1285 bool
1286 InputParameters::paramSetByUser(const std::string & name) const
1287 {
1288  mooseDeprecated("paramSetByUser() is deprecated. Use isParamSetByUser() instead.");
1289  return isParamSetByUser(name);
1290 }
1291 
1292 bool
1293 InputParameters::isParamSetByUser(const std::string & name_in) const
1294 {
1295  const auto name = checkForRename(name_in);
1296  // Invalid; for sure not set by the user
1297  if (!isParamValid(name))
1298  return false;
1299  // Parameter is not located in the list (called Parameters::set)
1300  if (!_params.count(name))
1301  return false;
1302  // Special case for a command line option, which is a private parameter
1303  if (const auto cl_data = queryCommandLineMetadata(name))
1304  return cl_data->set_by_command_line;
1305  // Not a command line option, not set by addParam and not private
1306  return !_params.at(name)._set_by_add_param && !_params.at(name)._is_private;
1307 }
1308 
1309 bool
1310 InputParameters::isParamDefined(const std::string & name_in) const
1311 {
1312  const auto name = checkForRename(name_in);
1313  return _params.count(name) > 0;
1314 }
1315 
1316 const std::string &
1317 InputParameters::getDescription(const std::string & name_in) const
1318 {
1319  const auto name = checkForRename(name_in);
1320  auto it = _params.find(name);
1321  if (it == _params.end())
1322  mooseError("No parameter exists with the name ", name);
1323  return it->second._doc_string;
1324 }
1325 
1326 template <>
1327 void
1328 InputParameters::addRequiredParam<MooseEnum>(const std::string & name,
1329  const MooseEnum & moose_enum,
1330  const std::string & doc_string)
1331 {
1332  InputParameters::set<MooseEnum>(name) = moose_enum; // valid parameter is set by set_attributes
1333  auto & metadata = _params[name];
1334  metadata._required = true;
1335  metadata._doc_string = doc_string;
1336 }
1337 
1338 template <>
1339 void
1340 InputParameters::addRequiredParam<MultiMooseEnum>(const std::string & name,
1341  const MultiMooseEnum & moose_enum,
1342  const std::string & doc_string)
1343 {
1344  InputParameters::set<MultiMooseEnum>(name) =
1345  moose_enum; // valid parameter is set by set_attributes
1346  auto & metadata = _params[name];
1347  metadata._required = true;
1348  metadata._doc_string = doc_string;
1349 }
1350 
1351 template <>
1352 void
1353 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  InputParameters::set<std::vector<MooseEnum>>(name) =
1359  moose_enums; // valid parameter is set by set_attributes
1360  auto & metadata = _params[name];
1361  metadata._required = true;
1362  metadata._doc_string = doc_string;
1363 }
1364 
1365 template <>
1366 void
1367 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  InputParameters::set<std::vector<MultiMooseEnum>>(name) =
1380  moose_enums; // valid parameter is set by set_attributes
1381  auto & metadata = _params[name];
1382  metadata._required = true;
1383  metadata._doc_string = doc_string;
1384 }
1385 
1386 template <>
1387 void
1388 InputParameters::addParam<MooseEnum>(const std::string & /*name*/,
1389  const std::string & /*doc_string*/)
1390 {
1391  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 InputParameters::addParam<MultiMooseEnum>(const std::string & /*name*/,
1398  const std::string & /*doc_string*/)
1399 {
1400  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 InputParameters::addParam<std::vector<MooseEnum>>(const std::string & /*name*/,
1407  const std::string & /*doc_string*/)
1408 {
1409  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 InputParameters::addParam<std::vector<MultiMooseEnum>>(const std::string & /*name*/,
1416  const std::string & /*doc_string*/)
1417 {
1418  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 InputParameters::addRequiredParam<std::vector<MultiMooseEnum>>(const std::string & /*name*/,
1426  const std::string & /*doc_string*/)
1427 {
1428  mooseError("You must supply a vector of MultiMooseEnum object(s) when using addRequiredParam!");
1429 }
1430 
1431 template <>
1432 void
1433 InputParameters::addPrivateParam<MooseEnum>(const std::string & /*name*/)
1434 {
1435  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 InputParameters::addPrivateParam<MultiMooseEnum>(const std::string & /*name*/)
1442 {
1443  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 InputParameters::addDeprecatedParam<MooseEnum>(const std::string & /*name*/,
1450  const std::string & /*doc_string*/,
1451  const std::string & /*deprecation_message*/)
1452 {
1453  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 InputParameters::addDeprecatedParam<MultiMooseEnum>(const std::string & /*name*/,
1460  const std::string & /*doc_string*/,
1461  const std::string & /*deprecation_message*/)
1462 {
1463  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 InputParameters::addDeprecatedParam<std::vector<MooseEnum>>(
1470  const std::string & /*name*/,
1471  const std::string & /*doc_string*/,
1472  const std::string & /*deprecation_message*/)
1473 {
1474  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 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  std::ostringstream oss;
1486  oss << r_value;
1487  l_value = oss.str();
1488 }
1489 
1490 template <>
1491 void
1492 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  std::ostringstream oss;
1498  oss << r_value;
1499  l_value = oss.str();
1500 }
1501 
1502 template <>
1503 void
1504 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  std::ostringstream oss;
1510  oss << r_value;
1511  l_value = oss.str();
1512 }
1513 
1514 template <>
1515 void
1516 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  std::ostringstream oss;
1522  oss << r_value;
1523  l_value = oss.str();
1524 }
1525 
1526 template <>
1527 void
1528 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  std::ostringstream oss;
1534  oss << r_value;
1535  l_value = oss.str();
1536 }
1537 
1538 template <>
1539 void
1540 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  std::ostringstream oss;
1546  oss << r_value;
1547  l_value = oss.str();
1548 }
1549 
1550 template <>
1551 void
1552 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  std::ostringstream oss;
1558  oss << r_value;
1559  l_value = oss.str();
1560 }
1561 
1562 template <>
1563 void
1564 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  std::ostringstream oss;
1570  oss << r_value;
1571  l_value = oss.str();
1572 }
1573 
1574 template <>
1575 const MooseEnum &
1576 InputParameters::getParamHelper<MooseEnum>(const std::string & name_in,
1577  const InputParameters & pars)
1578 {
1579  const auto name = pars.checkForRename(name_in);
1580  return pars.get<MooseEnum>(name);
1581 }
1582 
1583 template <>
1584 const MultiMooseEnum &
1585 InputParameters::getParamHelper<MultiMooseEnum>(const std::string & name_in,
1586  const InputParameters & pars)
1587 {
1588  const auto name = pars.checkForRename(name_in);
1589  return pars.get<MultiMooseEnum>(name);
1590 }
1591 
1592 void
1593 InputParameters::setReservedValues(const std::string & name_in,
1594  const std::set<std::string> & reserved)
1595 {
1596  const auto name = checkForRename(name_in);
1597  _params[name]._reserved_values = reserved;
1598 }
1599 
1600 std::set<std::string>
1601 InputParameters::reservedValues(const std::string & name_in) const
1602 {
1603  const auto name = checkForRename(name_in);
1604  auto it = _params.find(name);
1605  if (it == _params.end())
1606  return std::set<std::string>();
1607  return it->second._reserved_values;
1608 }
1609 
1610 std::string
1612 {
1613  if (const auto hit_node = getHitNode())
1614  return hit_node->fileLocation(/* with_column = */ false);
1615  return "";
1616 }
1617 
1618 std::string
1620 {
1621  if (const auto hit_node = getHitNode())
1622  return hit_node->fullpath();
1623  return "";
1624 }
1625 
1626 const hit::Node *
1627 InputParameters::getHitNode(const std::string & param) const
1628 {
1629  return at(param)._hit_node;
1630 }
1631 
1632 void
1633 InputParameters::setHitNode(const std::string & param,
1634  const hit::Node & node,
1636 {
1637  mooseAssert(node.type() == hit::NodeType::Field, "Must be a field");
1638  at(param)._hit_node = &node;
1639 }
1640 
1641 std::string
1642 InputParameters::inputLocation(const std::string & param) const
1643 {
1644  if (const auto hit_node = getHitNode(param))
1645  return hit_node->fileLocation(/* with_column = */ false);
1646  return "";
1647 }
1648 
1649 std::string
1650 InputParameters::paramFullpath(const std::string & param) const
1651 {
1652  if (const auto hit_node = getHitNode(param))
1653  return hit_node->fullpath();
1654  return "";
1655 }
1656 
1657 void
1658 InputParameters::checkParamName(const std::string & name) const
1659 {
1660  const static pcrecpp::RE valid("[\\w:/]+");
1661  if (!valid.FullMatch(name))
1662  mooseError("Invalid parameter name: '", name, "'");
1663 }
1664 
1665 bool
1666 InputParameters::shouldIgnore(const std::string & name_in)
1667 {
1668  const auto name = checkForRename(name_in);
1669  auto it = _params.find(name);
1670  if (it != _params.end())
1671  return it->second._ignore;
1672  mooseError("Parameter ", name, " does not exist");
1673 }
1674 
1675 std::set<std::string>
1676 InputParameters::getGroupParameters(const std::string & group) const
1677 {
1678  std::set<std::string> names;
1679  for (auto it = _params.begin(); it != _params.end(); ++it)
1680  if (it->second._group == group)
1681  names.emplace(it->first);
1682  return names;
1683 }
1684 
1685 std::set<std::string>
1687 {
1688  std::set<std::string> param_set;
1689  for (auto it = _params.begin(); it != _params.end(); ++it)
1690  param_set.emplace(it->first);
1691  return param_set;
1692 }
1693 
1694 std::set<std::string>
1696 {
1697  std::set<std::string> controllable;
1698  for (auto it = _params.begin(); it != _params.end(); ++it)
1699  if (it->second._controllable)
1700  controllable.emplace(it->first);
1701  return controllable;
1702 }
1703 
1704 std::string
1705 InputParameters::paramLocationPrefix(const std::string & param) const
1706 {
1707  auto prefix = param + ":";
1708  if (!inputLocation(param).empty())
1709  prefix = inputLocation(param) + ": (" + paramFullpath(param) + ")";
1710  return prefix;
1711 }
1712 
1713 std::string
1714 InputParameters::rawParamVal(const std::string & param) const
1715 {
1716  if (const auto hit_node = getHitNode(param))
1717  return hit_node->strVal();
1718  return "";
1719 }
1720 
1721 std::string
1722 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  std::string variable_name = getMooseType(var_param_name);
1727  if (variable_name == "")
1728  {
1729  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  if (vec.empty())
1736  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  variable_name = vec[0];
1747  }
1748 
1749  return variable_name;
1750 }
1751 
1752 void
1753 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  auto params_it = _params.find(old_name);
1759  if (params_it == _params.end())
1760  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  auto new_metadata = std::move(params_it->second);
1767  if (!docstring.empty())
1768  new_metadata._doc_string = docstring;
1769  _params.emplace(new_name, std::move(new_metadata));
1770  _params.erase(params_it);
1771 
1772  auto values_it = _values.find(old_name);
1773  auto new_value = std::move(values_it->second);
1774  _values.emplace(new_name, std::move(new_value));
1775  _values.erase(values_it);
1776 
1777  std::string deprecation_message;
1778  if (!removal_date.empty())
1779  deprecation_message = "'" + old_name + "' has been deprecated and will be removed on " +
1780  removal_date + ". Please use '" + new_name + "' instead.";
1781 
1782  _old_to_new_name_and_dep.emplace(old_name, std::make_pair(new_name, deprecation_message));
1783  _new_to_old_names.emplace(new_name, old_name);
1784 }
1785 
1786 void
1787 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  auto coupled_vars_it = _coupled_vars.find(old_name);
1793  if (coupled_vars_it == _coupled_vars.end())
1794  mooseError("Requested to rename coupled variable '",
1795  old_name,
1796  "' but that coupled variable name doesn't exist in the parameters object.");
1797 
1798  _coupled_vars.insert(new_name);
1799  _coupled_vars.erase(coupled_vars_it);
1800 
1801  renameParamInternal(old_name, new_name, docstring, removal_date);
1802 }
1803 
1804 void
1805 InputParameters::renameParam(const std::string & old_name,
1806  const std::string & new_name,
1807  const std::string & new_docstring)
1808 {
1809  renameParamInternal(old_name, new_name, new_docstring, "");
1810 }
1811 
1812 void
1813 InputParameters::renameCoupledVar(const std::string & old_name,
1814  const std::string & new_name,
1815  const std::string & new_docstring)
1816 {
1817  renameCoupledVarInternal(old_name, new_name, new_docstring, "");
1818 }
1819 
1820 void
1821 InputParameters::deprecateParam(const std::string & old_name,
1822  const std::string & new_name,
1823  const std::string & removal_date)
1824 {
1825  renameParamInternal(old_name, new_name, "", removal_date);
1826 }
1827 
1828 void
1829 InputParameters::deprecateCoupledVar(const std::string & old_name,
1830  const std::string & new_name,
1831  const std::string & removal_date)
1832 {
1833  renameCoupledVarInternal(old_name, new_name, "", removal_date);
1834 }
1835 
1836 std::string
1837 InputParameters::checkForRename(const std::string & name) const
1838 {
1839  if (auto it = _old_to_new_name_and_dep.find(name); it != _old_to_new_name_and_dep.end())
1840  return it->second.first;
1841  else
1842  return name;
1843 }
1844 
1845 std::vector<std::string>
1846 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  std::vector<std::string> aliases = {param_name};
1851 
1852  for (const auto & pr : as_range(_new_to_old_names.equal_range(param_name)))
1853  aliases.push_back(pr.second);
1854 
1855  return aliases;
1856 }
1857 
1858 std::optional<Moose::DataFileUtils::Path>
1859 InputParameters::queryDataFileNamePath(const std::string & name) const
1860 {
1862 }
1863 
1864 std::optional<std::string>
1865 InputParameters::setupVariableNames(std::vector<VariableName> & names,
1866  const hit::Node & node,
1868 {
1869  // Whether or not a name was found
1870  bool has_name = false;
1871  // Whether or not a default value (real) was found
1872  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  for (const auto i : index_range(names))
1879  {
1880  auto & name = names[i];
1881  Real real_value;
1882  if (MooseUtils::convert<Real>(name, real_value, false))
1883  {
1884  has_default = true;
1885  defaultCoupledValue(node.path(), real_value, i);
1886  }
1887  else
1888  has_name = true;
1889  }
1890 
1891  if (has_default)
1892  {
1893  if (has_name)
1894  return {"invalid value for '" + node.fullpath() +
1895  "': coupled vectors where some parameters are reals and others are variables are not "
1896  "supported"};
1897 
1898  // Don't actually use the names if these don't represent names
1899  names.clear();
1900  }
1901 
1902  return {};
1903 }
1904 
1905 std::pair<std::string, const hit::Node *>
1906 InputParameters::paramMessageContext(const std::string & param) const
1907 {
1908  const hit::Node * node = nullptr;
1909 
1910  std::string fullpath;
1911  // First try to find the parameter
1912  if (const hit::Node * param_node = getHitNode(param))
1913  {
1914  fullpath = param_node->fullpath();
1915  node = param_node;
1916  }
1917  // If no parameter node, hope for a block node
1918  else if (const hit::Node * block_node = getHitNode())
1919  {
1920  node = block_node;
1921  fullpath = block_node->fullpath() + "/" + param;
1922  }
1923  // Didn't find anything, at least use the parameter
1924  else
1925  fullpath = param;
1926 
1927  return {fullpath + ": ", node};
1928 }
1929 
1930 std::string
1931 InputParameters::paramMessagePrefix(const std::string & param) const
1932 {
1933  auto [prefix, node] = paramMessageContext(param);
1934  if (node)
1935  prefix = Moose::hitMessagePrefix(*node) + prefix;
1936  return prefix;
1937 }
1938 
1939 [[noreturn]] void
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  MooseApp * app = nullptr;
1949  if (isMooseBaseObject() && have_parameter<MooseApp *>(MooseBase::app_param))
1950  app = get<MooseApp *>(MooseBase::app_param);
1951 
1952  MooseBase::callMooseError(app, *this, msg, with_prefix, node, show_trace);
1953 }
std::multimap< std::string, std::string > _new_to_old_names
A map from derived-class/blessed parameter names to associated base-class/deprecated parameter names...
std::string name(const ElemQuality q)
std::optional< std::string > queryDeprecatedParamMessage(const std::string &name) const
std::string getMooseType(const std::string &name) const
Utility functions for retrieving one of the MooseTypes variables into the common "string" base class...
bool isRangeChecked(const std::string &param_name) const
Return whether a parameter has a range check.
void renameParam(const std::string &old_name, const std::string &new_name, const std::string &new_docstring)
Rename a parameter and provide a new documentation string.
bool isParamDefined(const std::string &name) const
Method returns true if the parameter is defined for any type.
const hit::Node * getHitNode(const std::string &param) const
static const std::string name_param
The name of the parameter that contains the object name.
Definition: MooseBase.h:55
KOKKOS_INLINE_FUNCTION const T * find(const T &target, const T *const begin, const T *const end)
Find a value in an array.
Definition: KokkosUtils.h:40
static const std::string app_param
The name of the parameter that contains the MooseApp.
Definition: MooseBase.h:59
void setGlobalCommandLineParam(const std::string &name)
Sets the command line parameter with name as global.
void isValid(MooseObject *obj)
Definition: TheWarehouse.C:294
bool _allow_copy
A flag for toggling the error message in the copy constructor.
void tokenize(const std::string &str, std::vector< T > &elements, unsigned int min_len=1, const std::string &delims="/")
This function will split the passed in string on a set of delimiters appending the substrings to the ...
bool search_all_data
Whether or not to search all registered data.
Definition: DataFileUtils.h:67
RelationshipManagerType
Main types of Relationship Managers.
Definition: MooseTypes.h:1012
InputParameters & operator=(const InputParameters &rhs)
void setDocUnit(const std::string &name, const std::string &doc_unit)
Set the unit string of a parameter.
std::map< std::string, std::pair< std::string, std::string > > getAutoBuildVectors() const
Returns the auto build vectors for all parameters.
static const std::string type_param
The name of the parameter that contains the object type.
Definition: MooseBase.h:53
std::set< std::string > getParametersList() const
void applySpecificParameters(const InputParameters &common, const std::vector< std::string > &include, bool allow_private=false)
Method for applying common parameters.
void setDocString(const std::string &name, const std::string &doc)
Set the doc string of a parameter.
bool isParamDeprecated(const std::string &name) const
Returns True if the parameters is deprecated.
const std::vector< std::tuple< std::string, Moose::RelationshipManagerType, Moose::RelationshipManagerInputParameterCallback > > & getBuildableRelationshipManagerTypes() const
Returns the list of buildable (or required) RelationshipManager object types for this object...
const std::string & getObjectName() const
bool isControllable(const std::string &name) const
Returns a Boolean indicating whether the specified parameter is controllable.
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:311
std::set< ExecFlagType > _controllable_flags
Controllable execute flag restriction.
void setCoupledVar(const std::string &coupling_name, const std::string &value)
Set a coupled variable parameter to a single variable name.
const hit::Node * _hit_node
Original location of parameter node; used for error messages.
char ** vars
std::unordered_map< std::string, std::string > _new_to_deprecated_coupled_vars
A map from deprecated coupled variable names to the new blessed name.
const std::vector< std::string > & getBuildableTypes() const
Returns the list of buildable types as a std::vector<std::string>
void setDeprecatedVarDocString(const std::string &new_name, const std::string &doc_string)
Private method for setting deprecated coupled variable documentation strings.
InputParameters & operator+=(const InputParameters &rhs)
bool isKokkosObject() const
Returns whether this InputParameters belongs to a Kokkos object Checks whether MooseBase::kokkos_obje...
std::optional< Moose::DataFileUtils::Path > _data_file_name_path
The searched path information pertaining to a DataFileName parameter.
void registerSystemAttributeName(const std::string &value)
This method is used to define the MOOSE system name that is used by the TheWarehouse object for stori...
Base class for MOOSE-based applications.
Definition: MooseApp.h:108
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
void applyParameters(const InputParameters &common, const std::vector< std::string > &exclude={}, const bool allow_private=false)
Method for applying common parameters.
void renameCoupledVar(const std::string &old_name, const std::string &new_name, const std::string &new_docstring)
Rename a coupled variable and provide a new documentation string.
bool graceful
Whether or not to error whenever a path is not found.
Definition: DataFileUtils.h:72
bool hasBase() const
void applyCoupledVar(const InputParameters &common, const std::string &var_name)
Apply properties of a single coupled variable in common, to a single coupled variable stored in this ...
void registerBuildableTypes(const std::string &names)
This method is here to indicate which Moose types a particular Action may build.
bool isPrivate(const std::string &name) const
Returns a Boolean indicating whether the specified parameter is private or not.
void mooseError(Args &&... args) const
Emits an error prefixed with the object information, if available.
std::vector< std::string > paramAliases(const std::string &param_name) const
Return all the aliased names associated with param_name.
void addRelationshipManager(const std::string &name, Moose::RelationshipManagerType rm_type, Moose::RelationshipManagerInputParameterCallback input_parameter_callback=nullptr)
Tells MOOSE about a RelationshipManager that this object needs.
void renameParameterGroup(const std::string &old_name, const std::string &new_name)
This method renames a parameter group.
void finalize(const std::string &parsing_syntax)
Finalizes the parameters, which must be done before constructing any objects with these parameters (t...
const std::string & getBase() const
void checkParamName(const std::string &name) const
Make sure the parameter name doesn&#39;t have any invalid characters.
void renameParamInternal(const std::string &old_name, const std::string &new_name, const std::string &docstring, const std::string &removal_date)
bool mooseObjectSyntaxVisibility() const
unsigned int numberDefaultCoupledValues(const std::string &coupling_name) const
Get the number of defaulted coupled value entries.
void registerBase(const std::string &value)
This method must be called from every base "Moose System" to create linkage with the Action System...
const std::string * queryObjectType() const
const std::string & getDescription(const std::string &name) const
Get the documentation string for a parameter.
void paramError(const std::string &param, Args... args) const
Emits a parameter error prefixed with the parameter location and object information if available...
Structure for storing information about a command line parameter.
bool isParamSetByAddParam(const std::string &name) const
Returns whether or not the parameter was set due to addParam.
void commandLineParamSet(const std::string &name, const CommandLineParamSetKey)
Marks the command line parameter name as set by the CommandLine.
bool _show_deprecated_message
Flag for disabling deprecated parameters message, this is used by applyParameters to avoid dumping me...
Path getPath(std::string path, const GetPathOptions &options={})
Get the data path for a given path, searching the registered data.
Definition: DataFileUtils.C:22
static const std::string moose_base_param
The name of the parameter that contains the moose system base.
Definition: MooseBase.h:61
bool _collapse_nesting
This parameter collapses one level of nesting in the syntax blocks.
std::string getDocString(const std::string &name) const
Returns the documentation string for the specified parameter name.
static const std::string kokkos_object_param
The name of the parameter that indicates an object is a Kokkos functor.
Definition: MooseBase.h:64
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
void deprecateParam(const std::string &old_name, const std::string &new_name, const std::string &removal_date)
sideset clear()
Class that is used as a parameter to commandLineParamSet() that allows only the CommandLine to set th...
std::string getDocUnit(const std::string &name) const
Returns the documentation unit string for the specified parameter name.
bool shouldIgnore(const std::string &name)
Whether to ignore the value of an input parameter set in the input file or from the command line...
std::pair< std::string, const hit::Node * > paramMessageContext(const std::string &param) const
Get the context associated with a parameter for a message.
std::function< void(const InputParameters &, InputParameters &)> RelationshipManagerInputParameterCallback
The type for the callback to set RelationshipManager parameters.
Definition: MooseTypes.h:1038
bool hasDefaultCoupledValue(const std::string &coupling_name) const
Return whether or not the requested parameter has a default coupled value.
bool areAllRequiredParamsValid() const
This method returns true if all of the parameters in this object are valid (i.e.
std::string rawParamVal(const std::string &param) const
Real defaultCoupledValue(const std::string &coupling_name, unsigned int i=0) const
Get the default value for an optionally coupled variable.
SimpleRange< IndexType > as_range(const std::pair< IndexType, IndexType > &p)
void addDeprecatedCoupledVar(const std::string &old_name, const std::string &new_name, const std::string &removal_date="")
This method adds a deprecated coupled variable name pair.
std::string _class_description
The class description for the owning object.
const std::set< ExecFlagType > & getControllableExecuteOnTypes(const std::string &name) const
Return the allowed execute flags for a controllable parameter.
void renameCoupledVarInternal(const std::string &old_name, const std::string &new_name, const std::string &docstring, const std::string &removal_date)
std::string docstring(const std::string &desc)
Augment docstring if NEML2 is not enabled.
Definition: NEML2Utils.C:71
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition: MooseEnum.h:54
void deprecateCoupledVar(const std::string &old_name, const std::string &new_name, const std::string &removal_date)
void mooseDeprecated(Args &&... args)
Emit a deprecated code/feature message with the given stringified, concatenated args.
Definition: MooseError.h:363
void checkParams(const std::string &parsing_syntax)
This function checks parameters stored in the object to make sure they are in the correct state as th...
std::string inputLocation(const std::string &param) const
void applyParameter(const InputParameters &common, const std::string &common_name, bool allow_private=false)
Apply values from a single parameter in common, to a single parameter stored in this object...
Options to be passed to getPath().
Definition: DataFileUtils.h:60
bool isMooseBaseObject() const
Representation of a data file path.
Definition: DataFileUtils.h:40
std::optional< std::string > base
The base path by which to search for relative paths.
Definition: DataFileUtils.h:65
std::set< std::string > reservedValues(const std::string &name) const
Get a set of reserved parameter values.
void addCoupledVar(const std::string &name, const std::string &doc_string)
This method adds a coupled variable name pair.
void setReservedValues(const std::string &name, const std::set< std::string > &reserved)
Provide a set of reserved values for a parameter.
void addRequiredCoupledVar(const std::string &name, const std::string &doc_string)
This method adds a coupled variable name pair.
void makeParamNotRequired(const std::string &name)
Changes the parameter to not be required.
bool have_parameter(std::string_view name) const
A wrapper around the Parameters base class method.
std::optional< std::pair< bool, std::string > > parameterRangeCheck(const Parameters::Value &value, const std::string &long_name, const std::string &short_name, const bool include_param_path)
Performs a range check on the parameter (which must have a range check)
bool isParamSetByUser(const std::string &name) const
Method returns true if the parameter was set by the user.
std::string paramMessagePrefix(const std::string &param) const
Get a prefix for messages associated with a parameter.
infix_ostream_iterator< T, charT, traits > & operator=(T const &item)
Definition: InfixIterator.h:47
std::string varName(const std::string &var_param_name, const std::string &moose_object_with_var_param_name) const
Determine the actual variable name from the given variable parameter name.
const std::string & getObjectType() const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
bool isFinalized() const
std::set< std::string > _coupled_vars
The coupled variables set.
std::vector< std::tuple< std::string, Moose::RelationshipManagerType, Moose::RelationshipManagerInputParameterCallback > > _buildable_rm_types
The RelationshipManagers that this object may either build or require.
void addRequiredCoupledVarWithAutoBuild(const std::string &name, const std::string &base_name, const std::string &num_name, const std::string &doc_string)
void addCoupledVarWithAutoBuild(const std::string &name, const std::string &base_name, const std::string &num_name, const std::string &doc_string)
These methods add a coupled variable name pair.
bool hasCoupledVar(const std::string &coupling_name) const
Return whether or not the coupled variable exists.
std::string getGroupName(const std::string &param_name) const
This method retrieves the group name for the passed parameter name if one exists. ...
std::string paramLocationPrefix(const std::string &param) const
Returns a prefix containing the parameter name and location (if available)
std::string checkForRename(const std::string &name) const
Checks whether the provided name is a renamed parameter name.
bool _finalized
Whether or not we&#39;ve called finalize() on these parameters yet.
std::string type(const std::string &name) const
Prints the type of the requested parameter by name.
Scoped helper for setting Moose::_throw_on_error during this scope.
Definition: Moose.h:296
std::string blockFullpath() const
bool isCommandLineParameter(const std::string &name) const
const hit::Node * _hit_node
The hit node representing the syntax that created these parameters, if any.
bool paramSetByUser(const std::string &name) const
Deprecated method.
std::optional< InputParameters::CommandLineMetadata > queryCommandLineMetadata(const std::string &name) const
bool isParamRequired(const std::string &name) const
Returns a boolean indicating whether the specified parameter is required or not.
void addClassDescription(const std::string &doc_string)
This method adds a description of the class that will be displayed in the input file syntax dump...
const std::string & getSystemAttributeName() const
Get the system attribute name if it was registered.
const InputParameters::CommandLineMetadata & getCommandLineMetadata(const std::string &name) const
std::vector< std::string > _buildable_types
The parameter is used to restrict types that can be built.
void addParam(const std::string &name, const S &value, const std::string &doc_string)
These methods add an optional parameter and a documentation string to the InputParameters object...
void callMooseError(std::string msg, const bool with_prefix, const hit::Node *node=nullptr, const bool show_trace=true) const
External method for calling moose error with added object context.
Definition: MooseBase.C:105
bool _moose_object_syntax_visibility
This parameter hides derived MOOSE object types from appearing in syntax dumps.
virtual void clear() override
bool hasDefault(const std::string &param_name) const
Return whether a parameter has a default.
void setHitNode(const std::string &param, const hit::Node &node, const SetParamHitNodeKey)
Sets the hit node associated with the parameter param to node.
const std::vector< VariableName > & getCoupledVar(const std::string &coupling_name) const
Get a coupled variable parameter.
std::map< std::string, Metadata > _params
The actual parameter data.
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type...
virtual void set_attributes(const std::string &name, bool inserted_only) override
Override from libMesh to set user-defined attributes on our parameter.
std::string blockLocation() const
std::string getClassDescription() const
Returns the class description.
InputParameters emptyInputParameters()
std::map< std::string, std::pair< std::string, std::string > > _old_to_new_name_and_dep
A map from base-class/deprecated parameter names to derived-class/blessed parameter names and the dep...
std::set< std::string > getControllableParameters() const
Return list of controllable parameters.
std::optional< Moose::DataFileUtils::Path > queryDataFileNamePath(const std::string &name) const
std::vector< ElemQuality > valid(const ElemType t)
void callMooseError(std::string msg, const bool with_prefix=true, const hit::Node *node=nullptr, const bool show_trace=true) const
Internal helper for calling back to mooseError(), ideally from the underlying MooseBase object if it ...
std::string hitMessagePrefix(const hit::Node &node)
Get the prefix to be associated with a hit node for a message.
Definition: Moose.C:887
std::filesystem::path getFileBase(const std::optional< std::string > &param_name=std::optional< std::string >()) const
std::vector< std::string > getVecMooseType(const std::string &name) const
const hit::Node * getHitNode() const
std::optional< std::string > setupVariableNames(std::vector< VariableName > &names, const hit::Node &node, const Moose::PassKey< Moose::Builder >)
Entrypoint for the Builder to setup a std::vector<VariableName> parameter, which will setup the defau...
std::optional< CommandLineMetadata > _cl_data
The data pertaining to a command line parameter (empty if not a command line param) ...
std::string stringJoin(const std::vector< std::string > &values, const std::string &separator=" ")
Concatenates value into a single string separated by separator.
Metadata & at(const std::string &param_name)
void declareControllable(const std::string &name, std::set< ExecFlagType > execute_flags={})
Declare the given parameters as controllable.
std::string paramFullpath(const std::string &param) const
auto index_range(const T &sizable)
std::string rangeCheckedFunction(const std::string &name) const
Return the range check function for any parameter (empty string if it is not range checked) ...
bool collapseSyntaxNesting() const
Class that is used as a parameter to setHitNode(param) that allows only relevant classes to set the h...
void applyCommonUserSetParameters(const InputParameters &common, const std::vector< std::string > &exclude={}, const bool allow_private=false)
Variant of applyParameters that only applies parameters explicitly set by the user in common (i...
ExecFlagEnum execute_flags
Storage for the registered execute flags.
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)
This method takes a space delimited list of parameter names and adds them to the specified group name...
std::set< std::string > getGroupParameters(const std::string &group) const
Return names of parameters within a group.
bool isParamValid(const std::string &name) const
This method returns parameters that have been initialized in one fashion or another, i.e.