48 const std::string & param2)
const;
53 const std::string & param2)
const;
58 const std::string & param2)
const;
62 template <
typename T,
typename S>
69 const std::string & param2)
const;
73 template <
typename T,
typename S>
75 const std::string & param2)
const;
89 template <
typename T,
typename S>
91 const std::string & param2)
const;
97 const std::string & param2,
98 const bool error_for_param2)
const;
101 template <
typename T>
106 template <
typename T,
typename S>
108 const std::string & param2,
109 const bool ignore_empty_default_param2 =
false)
const;
114 template <
typename T,
typename S,
typename U>
116 const std::string & param2,
117 const std::string & param3)
const;
122 template <
typename T>
124 const std::vector<std::string> & parameter_names)
const;
128 template <
typename T>
130 const std::string & param_name)
const;
134 template <
typename T>
141 const std::string & value_not_set,
142 const std::vector<std::string> & dependent_params)
const;
148 const std::string & value_set,
149 const std::vector<std::string> & dependent_params)
const;
155 template <
typename T>
173 template <
typename... Args>
179 template <
typename... Args>
185 template <
typename... Args>
211 mooseAssert(forwardParameters().
template have_parameter<T>(param),
212 "Parameter '" + param +
"' is not defined with type '" +
213 MooseUtils::prettyCppType<T>() +
"' in object type '" +
218template <
typename T,
typename S>
221 const std::string & param2)
const
223 assertParamDefined<std::vector<T>>(param1);
224 assertParamDefined<std::vector<S>>(param2);
226 if (forwardIsParamValid(param1) && forwardIsParamValid(param2))
228 const auto size_1 = forwardGetParam<std::vector<T>>(param1).size();
229 const auto size_2 = forwardGetParam<std::vector<S>>(param2).size();
230 if (size_1 != size_2)
231 forwardParamError(param1,
232 "Vector parameters '" + param1 +
"' (size " + std::to_string(size_1) +
233 ") and '" + param2 +
"' (size " + std::to_string(size_2) +
234 ") must be the same size");
237 else if (forwardIsParamValid(param1) || forwardIsParamValid(param2))
238 if (forwardGetParam<std::vector<T>>(param1).size() ||
239 forwardGetParam<std::vector<S>>(param2).size())
240 checkParamsBothSetOrNotSet(param1, param2);
247 const std::string & param1,
const std::string & param2)
const
249 assertParamDefined<std::vector<T>>(param1);
250 assertParamDefined<MultiMooseEnum>(param2);
252 if (forwardIsParamValid(param1) && forwardIsParamValid(param2))
254 const auto size_1 = forwardGetParam<std::vector<T>>(param1).size();
255 const auto size_2 = forwardGetParam<MultiMooseEnum>(param2).size();
256 if (size_1 != size_2)
257 forwardParamError(param1,
258 "Vector parameters '" + param1 +
"' (size " + std::to_string(size_1) +
259 ") and '" + param2 +
"' (size " + std::to_string(size_2) +
260 ") must be the same size");
263 else if (forwardIsParamValid(param1) || forwardIsParamValid(param2))
264 if (forwardGetParam<std::vector<T>>(param1).size() ||
265 forwardGetParam<MultiMooseEnum>(param2).size())
266 checkParamsBothSetOrNotSet(param1, param2);
270template <
typename T,
typename S>
273 const std::string & param2)
const
275 checkVectorParamsSameLength<std::vector<T>, std::vector<S>>(param1, param2);
276 if (forwardIsParamValid(param1) && forwardIsParamValid(param2))
278 const auto value1 = forwardGetParam<std::vector<std::vector<T>>>(param1);
279 const auto value2 = forwardGetParam<std::vector<std::vector<S>>>(param2);
280 for (
const auto index : index_range(value1))
281 if (value1[index].size() != value2[index].size())
284 "Vector at index " + std::to_string(index) +
" of 2D vector parameter '" + param1 +
285 "' is not the same size as its counterpart from 2D vector parameter '" + param2 +
286 "'.\nSize first vector: " + std::to_string(value1[index].size()) +
287 "\nSize second vector: " + std::to_string(value2[index].size()));
290 else if (forwardIsParamValid(param1) || forwardIsParamValid(param2))
291 if (forwardGetParam<std::vector<T>>(param1).size() ||
292 forwardGetParam<std::vector<S>>(param2).size())
293 checkParamsBothSetOrNotSet(param1, param2);
297template <
typename T,
typename S>
300 const std::string & param1,
const std::string & param2)
const
302 assertParamDefined<std::vector<std::vector<T>>>(param1);
303 assertParamDefined<std::vector<S>>(param2);
304 for (
const auto & sub_vec_i : index_range(forwardGetParam<std::vector<std::vector<T>>>(param1)))
306 const auto size_1 = forwardGetParam<std::vector<std::vector<T>>>(param1)[sub_vec_i].size();
307 const auto size_2 = forwardGetParam<std::vector<S>>(param2).size();
308 if (size_1 != size_2)
309 forwardParamError(param1,
310 "Vector at index " + std::to_string(sub_vec_i) +
" (size " +
311 std::to_string(size_1) +
313 " of this parameter should be the same length as parameter '" +
314 param2 +
"' (size " + std::to_string(size_2) +
")");
322 const std::string & param1,
const std::string & param2,
const bool error_for_param2)
const
324 assertParamDefined<std::vector<std::vector<T>>>(param1);
325 assertParamDefined<MultiMooseEnum>(param2);
326 const auto vec1 = forwardGetParam<std::vector<std::vector<T>>>(param1);
327 const auto enum2 = forwardGetParam<MultiMooseEnum>(param2);
328 const auto size_1 = vec1.empty() ? 0 : vec1.size() * vec1[0].size();
329 const auto size_2 = enum2.size();
330 if (size_1 != size_2)
332 if (error_for_param2)
333 forwardParamError(param2,
334 "Vector enumeration parameter (size " + std::to_string(size_2) +
335 ") is not the same size as the vector of vector parameter '" + param1 +
336 "' (size " + std::to_string(size_1) +
")");
338 forwardParamError(param1,
339 "Vector of vector parameter '" + param1 +
"' (total size " +
340 std::to_string(size_1) +
341 ") is not the same size as vector-enumeration parameter '" + param2 +
342 "' (size " + std::to_string(size_2) +
")");
347template <
typename T,
typename S,
typename U>
350 const std::string & param1,
const std::string & param2,
const std::string & param3)
const
352 assertParamDefined<std::vector<T>>(param1);
353 assertParamDefined<std::vector<S>>(param2);
354 assertParamDefined<std::vector<U>>(param3);
355 const auto size_1 = forwardGetParam<std::vector<T>>(param1).size();
356 const auto size_2 = forwardGetParam<std::vector<S>>(param2).size();
357 const auto size_3 = forwardGetParam<std::vector<U>>(param3).size();
359 if (size_1 != size_2 + size_3)
360 forwardParamError(param1,
361 "Vector parameter '" + param1 +
"' (size " + std::to_string(size_1) +
362 ") should be the same size as parameter '" + param2 +
"' and '" + param3 +
363 " combined (total size " + std::to_string(size_2 + size_3) +
")");
370 const std::vector<std::string> & param_vec)
const
372 std::set<std::string> unique_params;
373 for (
const auto & param : param_vec)
375 assertParamDefined<std::vector<T>>(param);
377 for (
const auto & value : forwardGetParam<std::vector<T>>(param))
378 if (!unique_params.insert(value).second)
380 auto copy_params = param_vec;
381 copy_params.erase(std::find(copy_params.begin(), copy_params.end(), param));
383 if (copy_params.size())
384 forwardMooseError(
"Item '" + value +
"' specified in vector parameter '" + param +
385 "' is also present in one or more of the parameters '" +
389 forwardMooseError(
"Item '" + value +
"' specified in vector parameter '" + param +
390 "' is repeated, which is not allowed.");
399 const std::vector<std::string> & param_vec)
const
402 for (
const auto & param : param_vec)
404 assertParamDefined<std::vector<std::vector<T>>>(param);
405 const auto & twoD_vec = forwardGetParam<std::vector<std::vector<T>>>(param);
406 std::vector<std::set<T>> unique_params(twoD_vec.size());
409 for (
const auto i : index_range(twoD_vec))
411 for (
const auto & value : twoD_vec[i])
412 if (!unique_params[i].insert(value).second)
414 auto copy_params = param_vec;
415 copy_params.erase(std::find(copy_params.begin(), copy_params.end(), param));
416 forwardMooseError(
"Item '" + value +
"' specified in vector parameter '" + param +
417 "' is also present in one or more of the two-D vector parameters '" +
419 "' in the inner vector of the same index, which is not allowed.");
430 assertParamDefined<std::vector<T>>(param);
431 if (!forwardGetParam<std::vector<T>>(param).size())
432 forwardParamError(param,
"Parameter '" + param +
"' should not be set to an empty vector.");
436template <
typename T,
typename S>
439 const std::string & param1,
440 const std::string & param2,
441 const bool ignore_empty_default_param2)
const
443 assertParamDefined<std::vector<T>>(param1);
444 assertParamDefined<std::vector<S>>(param2);
446 if (forwardIsParamValid(param1) && forwardIsParamValid(param2))
448 const auto size_1 = forwardGetParam<std::vector<T>>(param1).size();
449 const auto size_2 = forwardGetParam<std::vector<S>>(param2).size();
450 if (ignore_empty_default_param2 && (size_2 == 0) && !forwardIsParamSetByUser(param2))
452 if (size_1 != size_2)
453 forwardParamError(param1,
454 "Parameter '" + param1 +
"' (size " + std::to_string(size_1) +
") and '" +
455 param2 +
"' (size " + std::to_string(size_2) +
456 ") must be the same size if set.");
464 const std::string & param_name)
const
466 assertParamDefined<T>(param_name);
468 "This should have been a parameter from the parameters being compared");
469 bool consistent =
true;
470 if (forwardParameters().isParamValid(param_name) && other_param.
isParamValid(param_name))
472 if constexpr (std::is_same_v<MooseEnum, T>)
474 if (!forwardGetParam<T>(param_name).compareCurrent(other_param.
get<T>(param_name)))
477 else if (forwardGetParam<T>(param_name) != other_param.
get<T>(param_name))
487 const std::string & block_param_name,
const std::vector<std::string> & parameter_names)
const
489 const std::vector<std::vector<SubdomainName>> & block_names =
490 forwardGetParam<std::vector<std::vector<SubdomainName>>>(block_param_name);
492 if (block_names.size())
497 const auto & object_blocks = forwardBlocks();
498 if (std::find(object_blocks.begin(), object_blocks.end(),
"ANY_BLOCK_ID") ==
500 for (
const auto & block_group : block_names)
501 for (
const auto & block : block_group)
502 if (std::find(object_blocks.begin(), object_blocks.end(), block) == object_blocks.end())
503 forwardParamError(block_param_name,
504 "Block '" + block +
"' is not present in the block restriction of " +
508 for (
const auto & param_name : parameter_names)
510 const std::vector<T> & param_vector = forwardGetParam<std::vector<T>>(param_name);
511 if (block_names.size() != param_vector.size())
512 forwardParamError(param_name,
513 "The number of entries in '" + param_name +
"' (" +
514 std::to_string(param_vector.size()) +
515 ") is not the same as the number of blocks"
517 std::to_string(block_names.size()) +
") in '" + block_param_name +
523 unsigned int previous_size = 0;
524 for (
const auto param_i : index_range(parameter_names))
526 const std::vector<T> & param_vector =
527 forwardGetParam<std::vector<T>>(parameter_names[param_i]);
530 if (param_vector.size() > 1)
531 forwardParamError(parameter_names[param_i],
532 "The user should only use one or zero entries in " +
533 parameter_names[param_i] +
" if " + block_param_name +
535 previous_size = param_vector.size();
539 if (previous_size != param_vector.size())
540 forwardParamError(parameter_names[param_i],
541 "The number of entries in '" + parameter_names[param_i] +
542 "' is not the same as the number of entries in '" +
543 parameter_names[param_i - 1] +
"'!");
553 const std::string & param_name)
const
555 const bool consistent = parameterConsistent<T>(other_param, param_name);
557 forwardMooseWarning(
"Parameter " + param_name +
" is inconsistent between Physics \"" +
558 forwardName() +
"\" of type \"" + forwardType() +
559 "\" and the parameter set for \"" + other_param.
getObjectName() +
566 const std::string & param1,
567 const std::string & value_not_set,
568 const std::vector<std::string> & dependent_params)
const
570 for (
const auto & dependent_param : dependent_params)
571 if (forwardIsParamSetByUser(dependent_param))
572 forwardParamError(dependent_param,
573 "Parameter '" + dependent_param +
574 "' should not be set by the user if parameter '" + param1 +
575 "' has not been set to '" + value_not_set +
"'");
581 const std::string & param1,
582 const std::string & value_set,
583 const std::vector<std::string> & dependent_params)
const
585 for (
const auto & dependent_param : dependent_params)
586 if (forwardIsParamSetByUser(dependent_param))
587 forwardParamError(dependent_param,
588 "Parameter '" + dependent_param +
589 "' should not be set by the user if parameter '" + param1 +
590 "' has been set to '" + value_set +
"'");
596 const std::string & param2)
const
598 if ((forwardIsParamValid(param1) + forwardIsParamValid(param2)) % 2 != 0)
599 forwardParamError(param1,
600 "Parameters '" + param1 +
"' and '" + param2 +
601 "' must be either both set or both not set.");
607 const std::vector<std::string> & params)
const
609 unsigned int num_set = 0;
610 for (
const auto & param : params)
611 num_set += forwardIsParamSetByUser(param);
616 std::vector<std::string> params_set;
617 std::string first_set;
618 for (
const auto & param : params)
619 if (forwardIsParamSetByUser(param))
621 params_set.push_back(param);
622 if (first_set.empty())
626 forwardParamError(first_set,
635 const std::string & param1,
const std::string & param2)
const
637 mooseAssert(forwardParameters().
template have_parameter<bool>(param1),
638 "Cannot check if parameter " + param1 +
639 " is true if it's not a bool parameter of this object");
640 if (!forwardGetParam<bool>(param1) && forwardIsParamSetByUser(param2))
641 forwardParamError(param2,
642 "Parameter '" + param1 +
"' cannot be set to false if parameter '" + param2 +
643 "' is set by the user");
649 const std::string & param1,
const std::string & param2)
const
651 if (!forwardIsParamSetByUser(param1) && forwardIsParamSetByUser(param2))
652 forwardParamError(param2,
653 "Parameter '" + param2 +
"' should not be set if parameter '" + param1 +
654 "' is not specified.");
660 const std::string & param2)
const
662 if (forwardIsParamSetByUser(param1) && forwardIsParamSetByUser(param2))
663 forwardParamError(param2,
664 "Parameter '" + param2 +
"' should not be specified if parameter '" + param1 +
std::string prettyCppType(const std::string &cpp_type)
std::string stringify(const T &t)
conversion to string