18 #include <type_traits> 45 const std::string & param2)
const;
50 const std::string & param2)
const;
55 const std::string & param2)
const;
59 template <
typename T,
typename S>
66 const std::string & param2)
const;
70 template <
typename T,
typename S>
72 const std::string & param2)
const;
86 template <
typename T,
typename S>
88 const std::string & param2)
const;
94 const std::string & param2,
95 const bool error_for_param2)
const;
103 template <
typename T,
typename S>
105 const std::string & param2,
106 const bool ignore_empty_default_param2 =
false)
const;
111 template <
typename T,
typename S,
typename U>
113 const std::string & param2,
114 const std::string & param3)
const;
119 template <
typename T>
121 const std::vector<std::string> & parameter_names)
const;
125 template <
typename T>
127 const std::string & param_name)
const;
131 template <
typename T>
138 const std::string & value_not_set,
139 const std::vector<std::string> & dependent_params)
const;
145 const std::string & value_set,
146 const std::vector<std::string> & dependent_params)
const;
152 template <
typename T>
170 template <
typename... Args>
176 template <
typename... Args>
182 template <
typename... Args>
203 template <
typename C>
204 template <
typename T>
208 mooseAssert(forwardParameters().
template have_parameter<T>(param),
209 "Parameter '" + param +
"' is not defined with type '" +
210 MooseUtils::prettyCppType<T>() +
"' in object type '" +
214 template <
typename C>
215 template <
typename T,
typename S>
218 const std::string & param2)
const 220 assertParamDefined<std::vector<T>>(param1);
221 assertParamDefined<std::vector<S>>(param2);
223 if (forwardIsParamValid(param1) && forwardIsParamValid(param2))
225 const auto size_1 = forwardGetParam<std::vector<T>>(param1).size();
226 const auto size_2 = forwardGetParam<std::vector<S>>(param2).size();
227 if (size_1 != size_2)
228 forwardParamError(param1,
229 "Vector parameters '" + param1 +
"' (size " + std::to_string(size_1) +
230 ") and '" + param2 +
"' (size " + std::to_string(size_2) +
231 ") must be the same size");
234 else if (forwardIsParamValid(param1) || forwardIsParamValid(param2))
235 if (forwardGetParam<std::vector<T>>(param1).size() ||
236 forwardGetParam<std::vector<T>>(param2).size())
237 checkParamsBothSetOrNotSet(param1, param2);
240 template <
typename C>
241 template <
typename T>
244 const std::string & param1,
const std::string & param2)
const 246 assertParamDefined<std::vector<T>>(param1);
247 assertParamDefined<MultiMooseEnum>(param2);
249 if (forwardIsParamValid(param1) && forwardIsParamValid(param2))
251 const auto size_1 = forwardGetParam<std::vector<T>>(param1).size();
252 const auto size_2 = forwardGetParam<MultiMooseEnum>(param2).size();
253 if (size_1 != size_2)
254 forwardParamError(param1,
255 "Vector parameters '" + param1 +
"' (size " + std::to_string(size_1) +
256 ") and '" + param2 +
"' (size " + std::to_string(size_2) +
257 ") must be the same size");
260 else if (forwardIsParamValid(param1) || forwardIsParamValid(param2))
261 if (forwardGetParam<std::vector<T>>(param1).size() ||
262 forwardGetParam<MultiMooseEnum>(param2).size())
263 checkParamsBothSetOrNotSet(param1, param2);
266 template <
typename C>
267 template <
typename T,
typename S>
270 const std::string & param2)
const 272 checkVectorParamsSameLength<std::vector<T>, std::vector<S>>(param1, param2);
273 if (forwardIsParamValid(param1) && forwardIsParamValid(param2))
275 const auto value1 = forwardGetParam<std::vector<std::vector<T>>>(param1);
276 const auto value2 = forwardGetParam<std::vector<std::vector<S>>>(param2);
278 if (value1[index].size() != value2[index].size())
281 "Vector at index " + std::to_string(index) +
" of 2D vector parameter '" + param1 +
282 "' is not the same size as its counterpart from 2D vector parameter '" + param2 +
283 "'.\nSize first vector: " + std::to_string(value1[index].size()) +
284 "\nSize second vector: " + std::to_string(value2[index].size()));
287 else if (forwardIsParamValid(param1) || forwardIsParamValid(param2))
288 if (forwardGetParam<std::vector<T>>(param1).size() ||
289 forwardGetParam<std::vector<T>>(param2).size())
290 checkParamsBothSetOrNotSet(param1, param2);
293 template <
typename C>
294 template <
typename T,
typename S>
297 const std::string & param1,
const std::string & param2)
const 299 assertParamDefined<std::vector<std::vector<T>>>(param1);
300 assertParamDefined<std::vector<S>>(param2);
301 for (
const auto & sub_vec_i :
index_range(forwardGetParam<std::vector<std::vector<T>>>(param1)))
303 const auto size_1 = forwardGetParam<std::vector<std::vector<T>>>(param1)[sub_vec_i].size();
304 const auto size_2 = forwardGetParam<std::vector<S>>(param2).size();
305 if (size_1 != size_2)
306 forwardParamError(param1,
307 "Vector at index " + std::to_string(sub_vec_i) +
" (size " +
308 std::to_string(size_1) +
310 " of this parameter should be the same length as parameter '" +
311 param2 +
"' (size " + std::to_string(size_2) +
")");
315 template <
typename C>
316 template <
typename T>
319 const std::string & param1,
const std::string & param2,
const bool error_for_param2)
const 321 assertParamDefined<std::vector<std::vector<T>>>(param1);
322 assertParamDefined<MultiMooseEnum>(param2);
323 const auto vec1 = forwardGetParam<std::vector<std::vector<T>>>(param1);
324 const auto enum2 = forwardGetParam<MultiMooseEnum>(param2);
325 const auto size_1 = vec1.empty() ? 0 : vec1.size() * vec1[0].size();
326 const auto size_2 = enum2.size();
327 if (size_1 != size_2)
329 if (error_for_param2)
330 forwardParamError(param2,
331 "Vector enumeration parameter (size " + std::to_string(size_2) +
332 ") is not the same size as the vector of vector parameter '" + param1 +
333 "' (size " + std::to_string(size_1) +
")");
335 forwardParamError(param1,
336 "Vector of vector parameter '" + param1 +
"' (total size " +
337 std::to_string(size_1) +
338 ") is not the same size as vector-enumeration parameter '" + param2 +
339 "' (size " + std::to_string(size_2) +
")");
343 template <
typename C>
344 template <
typename T,
typename S,
typename U>
347 const std::string & param1,
const std::string & param2,
const std::string & param3)
const 349 assertParamDefined<std::vector<T>>(param1);
350 assertParamDefined<std::vector<S>>(param2);
351 assertParamDefined<std::vector<U>>(param3);
352 const auto size_1 = forwardGetParam<std::vector<T>>(param1).size();
353 const auto size_2 = forwardGetParam<std::vector<S>>(param2).size();
354 const auto size_3 = forwardGetParam<std::vector<U>>(param3).size();
356 if (size_1 != size_2 + size_3)
357 forwardParamError(param1,
358 "Vector parameter '" + param1 +
"' (size " + std::to_string(size_1) +
359 ") should be the same size as parameter '" + param2 +
"' and '" + param3 +
360 " combined (total size " + std::to_string(size_2 + size_3) +
")");
363 template <
typename C>
364 template <
typename T>
367 const std::vector<std::string> & param_vec)
const 369 std::set<std::string> unique_params;
370 for (
const auto & param : param_vec)
372 assertParamDefined<std::vector<T>>(param);
374 for (
const auto &
value : forwardGetParam<std::vector<T>>(param))
375 if (!unique_params.insert(
value).second)
377 auto copy_params = param_vec;
378 copy_params.erase(std::find(copy_params.begin(), copy_params.end(), param));
380 if (copy_params.size())
381 forwardMooseError(
"Item '" +
value +
"' specified in vector parameter '" + param +
382 "' is also present in one or more of the parameters '" +
386 forwardMooseError(
"Item '" +
value +
"' specified in vector parameter '" + param +
387 "' is repeated, which is not allowed.");
392 template <
typename C>
393 template <
typename T>
396 const std::vector<std::string> & param_vec)
const 399 for (
const auto & param : param_vec)
401 assertParamDefined<std::vector<std::vector<T>>>(param);
402 const auto & twoD_vec = forwardGetParam<std::vector<std::vector<T>>>(param);
403 std::vector<std::set<T>> unique_params(twoD_vec.size());
408 for (
const auto &
value : twoD_vec[i])
409 if (!unique_params[i].insert(
value).second)
411 auto copy_params = param_vec;
412 copy_params.erase(std::find(copy_params.begin(), copy_params.end(), param));
413 forwardMooseError(
"Item '" +
value +
"' specified in vector parameter '" + param +
414 "' is also present in one or more of the two-D vector parameters '" +
416 "' in the inner vector of the same index, which is not allowed.");
422 template <
typename C>
423 template <
typename T>
427 assertParamDefined<std::vector<T>>(param);
428 if (!forwardGetParam<std::vector<T>>(param).size())
429 forwardParamError(param,
"Parameter '" + param +
"' should not be set to an empty vector.");
432 template <
typename C>
433 template <
typename T,
typename S>
436 const std::string & param1,
437 const std::string & param2,
438 const bool ignore_empty_default_param2)
const 440 assertParamDefined<std::vector<T>>(param1);
441 assertParamDefined<std::vector<S>>(param2);
443 if (forwardIsParamValid(param1) && forwardIsParamValid(param2))
445 const auto size_1 = forwardGetParam<std::vector<T>>(param1).size();
446 const auto size_2 = forwardGetParam<std::vector<S>>(param2).size();
447 if (ignore_empty_default_param2 && (size_2 == 0) && !forwardIsParamSetByUser(param2))
449 if (size_1 != size_2)
450 forwardParamError(param1,
451 "Parameter '" + param1 +
"' (size " + std::to_string(size_1) +
") and '" +
452 param2 +
"' (size " + std::to_string(size_2) +
453 ") must be the same size if set.");
457 template <
typename C>
458 template <
typename T>
461 const std::string & param_name)
const 463 assertParamDefined<T>(param_name);
465 "This should have been a parameter from the parameters being compared");
466 bool consistent =
true;
467 if (forwardParameters().isParamValid(param_name) && other_param.
isParamValid(param_name))
469 if constexpr (std::is_same_v<MooseEnum, T>)
471 if (!forwardGetParam<T>(param_name).compareCurrent(other_param.
get<T>(param_name)))
474 else if (forwardGetParam<T>(param_name) != other_param.
get<T>(param_name))
480 template <
typename C>
481 template <
typename T>
484 const std::string & block_param_name,
const std::vector<std::string> & parameter_names)
const 486 const std::vector<std::vector<SubdomainName>> & block_names =
487 forwardGetParam<std::vector<std::vector<SubdomainName>>>(block_param_name);
489 if (block_names.size())
494 const auto & object_blocks = forwardBlocks();
495 if (std::find(object_blocks.begin(), object_blocks.end(),
"ANY_BLOCK_ID") ==
497 for (
const auto & block_group : block_names)
498 for (
const auto & block : block_group)
499 if (std::find(object_blocks.begin(), object_blocks.end(), block) == object_blocks.end())
500 forwardParamError(block_param_name,
501 "Block '" + block +
"' is not present in the block restriction of " +
505 for (
const auto & param_name : parameter_names)
507 const std::vector<T> & param_vector = forwardGetParam<std::vector<T>>(param_name);
508 if (block_names.size() != param_vector.size())
509 forwardParamError(param_name,
510 "The number of entries in '" + param_name +
"' (" +
511 std::to_string(param_vector.size()) +
512 ") is not the same as the number of blocks" 514 std::to_string(block_names.size()) +
") in '" + block_param_name +
520 unsigned int previous_size = 0;
521 for (
const auto param_i :
index_range(parameter_names))
523 const std::vector<T> & param_vector =
524 forwardGetParam<std::vector<T>>(parameter_names[param_i]);
527 if (param_vector.size() > 1)
528 forwardParamError(parameter_names[param_i],
529 "The user should only use one or zero entries in " +
530 parameter_names[param_i] +
" if " + block_param_name +
532 previous_size = param_vector.size();
536 if (previous_size != param_vector.size())
537 forwardParamError(parameter_names[param_i],
538 "The number of entries in '" + parameter_names[param_i] +
539 "' is not the same as the number of entries in '" +
540 parameter_names[param_i - 1] +
"'!");
546 template <
typename C>
547 template <
typename T>
550 const std::string & param_name)
const 552 const bool consistent = parameterConsistent<T>(other_param, param_name);
554 forwardMooseWarning(
"Parameter " + param_name +
" is inconsistent between Physics \"" +
555 forwardName() +
"\" of type \"" + forwardType() +
556 "\" and the parameter set for \"" +
557 other_param.get<std::string>(
"_action_name") +
"\" of type \"" +
558 other_param.get<std::string>(
"action_type") +
"\"");
561 template <
typename C>
564 const std::string & param1,
565 const std::string & value_not_set,
566 const std::vector<std::string> & dependent_params)
const 568 for (
const auto & dependent_param : dependent_params)
569 if (forwardIsParamSetByUser(dependent_param))
570 forwardParamError(dependent_param,
571 "Parameter '" + dependent_param +
572 "' should not be set by the user if parameter '" + param1 +
573 "' has not been set to '" + value_not_set +
"'");
576 template <
typename C>
579 const std::string & param1,
580 const std::string & value_set,
581 const std::vector<std::string> & dependent_params)
const 583 for (
const auto & dependent_param : dependent_params)
584 if (forwardIsParamSetByUser(dependent_param))
585 forwardParamError(dependent_param,
586 "Parameter '" + dependent_param +
587 "' should not be set by the user if parameter '" + param1 +
588 "' has been set to '" + value_set +
"'");
591 template <
typename C>
594 const std::string & param2)
const 596 if ((forwardIsParamValid(param1) + forwardIsParamValid(param2)) % 2 != 0)
597 forwardParamError(param1,
598 "Parameters '" + param1 +
"' and '" + param2 +
599 "' must be either both set or both not set.");
602 template <
typename C>
605 const std::string & param1,
const std::string & param2)
const 607 mooseAssert(forwardParameters().
template have_parameter<bool>(param1),
608 "Cannot check if parameter " + param1 +
609 " is true if it's not a bool parameter of this object");
610 if (!forwardGetParam<bool>(param1) && forwardIsParamSetByUser(param2))
611 forwardParamError(param2,
612 "Parameter '" + param1 +
"' cannot be set to false if parameter '" + param2 +
613 "' is set by the user");
616 template <
typename C>
619 const std::string & param1,
const std::string & param2)
const 621 if (!forwardIsParamSetByUser(param1) && forwardIsParamSetByUser(param2))
622 forwardParamError(param2,
623 "Parameter '" + param2 +
"' should not be set if parameter '" + param1 +
624 "' is not specified.");
627 template <
typename C>
630 const std::string & param2)
const 632 if (forwardIsParamSetByUser(param1) && forwardIsParamSetByUser(param2))
633 forwardParamError(param2,
634 "Parameter '" + param2 +
"' should not be specified if parameter '" + param1 +
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
std::string stringify(const T &t)
conversion to string
auto index_range(const T &sizable)
std::string prettyCppType(const std::string &cpp_type)