From a1baffda0d9ed2a9729a48aba1fd8edbe70fd5cc Mon Sep 17 00:00:00 2001 From: MengnanLi91 <118846840+MengnanLi91@users.noreply.github.com> Date: Wed, 23 Aug 2023 10:58:45 -0600 Subject: [PATCH 1/5] Add detailed error message in getParam, default value in addParam, fixed framework test case #25245 Address review: add default value in addParam, fixed framework test cases --- .../MaterialDerivativeTestKernelBase.h | 4 +- framework/include/utils/IndexableProperty.h | 1 + framework/include/utils/InputParameters.h | 54 +++---- framework/src/actions/AdaptivityAction.C | 14 +- framework/src/actions/AddPeriodicBCAction.C | 2 +- framework/src/actions/CommonOutputAction.C | 2 + framework/src/actions/SetupMeshAction.C | 8 +- .../src/actions/SetupResidualDebugAction.C | 2 +- framework/src/auxkernels/ArrayParsedAux.C | 7 +- framework/src/auxkernels/ParsedAux.C | 7 +- framework/src/auxkernels/ParsedVectorAux.C | 25 ++-- .../EqualValueBoundaryConstraint.C | 3 +- .../src/constraints/LinearNodalConstraint.C | 4 +- framework/src/controls/Control.C | 1 + framework/src/executioners/FEProblemSolve.C | 1 + .../src/functormaterials/FunctorADConverter.C | 13 +- framework/src/kernels/NodalScalarKernel.C | 2 +- .../DerivativeParsedMaterialHelper.C | 1 + .../src/materials/DerivativeSumMaterial.C | 6 +- framework/src/materials/MaterialADConverter.C | 17 ++- framework/src/materials/MaterialBase.C | 1 + .../src/materials/MaterialFunctorConverter.C | 12 +- .../src/meshgenerators/AddMetaDataGenerator.C | 88 ++++++------ .../AdvancedExtruderGenerator.C | 4 + .../src/meshgenerators/AnnularMeshGenerator.C | 4 +- .../meshgenerators/ExtraNodesetGenerator.C | 133 ++++++++---------- .../src/meshgenerators/ParsedCurveGenerator.C | 21 +-- .../meshgenerators/ParsedGenerateSideset.C | 7 +- .../ParsedNodeTransformGenerator.C | 7 +- .../ParsedSubdomainMeshGenerator.C | 7 +- .../src/meshgenerators/RenameBlockGenerator.C | 73 +--------- framework/src/multiapps/MultiApp.C | 16 ++- framework/src/outputs/AdvancedOutput.C | 5 +- .../src/partitioner/LibmeshPartitioner.C | 21 +-- .../FunctionValuePostprocessor.C | 9 +- .../src/postprocessors/ParsedPostprocessor.C | 7 +- .../FieldSplitPreconditioner.C | 27 ++-- .../FiniteDifferencePreconditioner.C | 21 +-- .../PhysicsBasedPreconditioner.C | 20 +-- .../SingleMatrixPreconditioner.C | 40 +++--- .../VariableCondensationPreconditioner.C | 29 ++-- framework/src/predictors/Predictor.C | 3 +- framework/src/problems/FEProblemBase.C | 40 +++--- .../src/problems/ReferenceResidualProblem.C | 1 + framework/src/scalarkernels/ParsedODEKernel.C | 20 +-- framework/src/splits/Split.C | 12 +- framework/src/timesteppers/CompositionDT.C | 4 +- framework/src/timesteppers/FunctionDT.C | 10 +- .../src/timesteppers/IterationAdaptiveDT.C | 4 +- .../transfers/MultiAppConservativeTransfer.C | 4 +- .../src/transfers/MultiAppDofCopyTransfer.C | 28 ++-- .../MultiAppGeneralFieldUserObjectTransfer.C | 1 + .../MultiAppGeometricInterpolationTransfer.C | 1 + .../transfers/MultiAppUserObjectTransfer.C | 1 + framework/src/userobjects/GeometryBase.C | 4 +- framework/src/utils/InputParameters.C | 13 +- .../src/raybcs/RayBoundaryConditionBase.C | 2 +- .../src/raykernels/RayKernelBase.C | 2 +- .../rename_block_generator/tests | 86 ----------- .../restricted_elem_parent.i | 2 +- .../restricted_elem_sub.i | 2 +- .../restricted_node_parent.i | 2 +- .../restricted_node_sub.i | 2 +- .../duplicated_user_object_tests/sub.i | 2 +- .../multiapp_userobject_transfer/sub.i | 2 +- unit/src/InputParametersTest.C | 35 +++++ 66 files changed, 479 insertions(+), 530 deletions(-) diff --git a/framework/include/kernels/MaterialDerivativeTestKernelBase.h b/framework/include/kernels/MaterialDerivativeTestKernelBase.h index a060900c132c..03af989c8b4f 100644 --- a/framework/include/kernels/MaterialDerivativeTestKernelBase.h +++ b/framework/include/kernels/MaterialDerivativeTestKernelBase.h @@ -47,7 +47,8 @@ MaterialDerivativeTestKernelBase::MaterialDerivativeTestKernelBase( const InputParameters & parameters) : DerivativeMaterialInterface>(parameters), _n_vars(_coupled_moose_vars.size()), - _derivative(getParam>("derivative")), + _derivative(isParamValid("derivative") ? getParam>("derivative") + : std::vector{}), _p(this->template getMaterialPropertyDerivative("material_property", _derivative)), _p_off_diag_derivatives(_n_vars), _p_diag_derivative(this->template getMaterialPropertyDerivative( @@ -71,6 +72,7 @@ MaterialDerivativeTestKernelBase::validParams() params.deprecateCoupledVar("args", "coupled_variables", "02/07/2024"); params.addParam>( "derivative", + {}, "Select derivative to test derivatives of (leave empty for checking " "derivatives of the original material property)"); return params; diff --git a/framework/include/utils/IndexableProperty.h b/framework/include/utils/IndexableProperty.h index 56dd4fb53629..0be2af14877f 100644 --- a/framework/include/utils/IndexableProperty.h +++ b/framework/include/utils/IndexableProperty.h @@ -70,6 +70,7 @@ IndexableProperty::validParams() "The name of the material property"); params.template addParam>( "component", + {}, "Index vector of the scalar component to extract from " "the material property (empty for scalar properties)"); return params; diff --git a/framework/include/utils/InputParameters.h b/framework/include/utils/InputParameters.h index ad2493e67a9b..ee638a981c87 100644 --- a/framework/include/utils/InputParameters.h +++ b/framework/include/utils/InputParameters.h @@ -763,16 +763,13 @@ class InputParameters : public Parameters /* * These methods are here to retrieve parameters for scalar and vector types respectively. We will * throw errors - * when returning most scalar types, but will allow retrieving empty vectors. + * when returning most scalar and vector types. */ template - static const T & - getParamHelper(const std::string & name, const InputParameters & pars, const T * the_type); - - template - static const std::vector & getParamHelper(const std::string & name, - const InputParameters & pars, - const std::vector * the_type); + static const T & getParamHelper(const std::string & name, + const InputParameters & pars, + const T * the_type, + const MooseObject * moose_object = nullptr); ///@} using Parameters::get; @@ -1020,6 +1017,8 @@ class InputParameters : public Parameters const std::string & docstring, const std::string & removal_date); + static void callMooseErrorHelper(const MooseObject & object, const std::string & error); + struct Metadata { std::string _doc_string; @@ -1757,12 +1756,20 @@ template const T & InputParameters::getParamHelper(const std::string & name_in, const InputParameters & pars, - const T *) + const T *, + const MooseObject * moose_object /* = nullptr */) { const auto name = pars.checkForRename(name_in); if (!pars.isParamValid(name)) - mooseError("The parameter \"", name, "\" is being retrieved before being set.\n"); + { + std::stringstream err; + err << "The parameter \"" << name << "\" is being retrieved before being set."; + if (moose_object) + callMooseErrorHelper(*moose_object, err.str()); + else + mooseError(err.str()); + } return pars.get(name); } @@ -1771,25 +1778,18 @@ InputParameters::getParamHelper(const std::string & name_in, // implementation, but the definition will be in InputParameters.C so // we won't need to bring in *MooseEnum header files here. template <> -const MooseEnum & InputParameters::getParamHelper(const std::string & name, - const InputParameters & pars, - const MooseEnum *); +const MooseEnum & +InputParameters::getParamHelper(const std::string & name, + const InputParameters & pars, + const MooseEnum *, + const MooseObject * moose_object /* = nullptr */); template <> -const MultiMooseEnum & InputParameters::getParamHelper(const std::string & name, - const InputParameters & pars, - const MultiMooseEnum *); - -template -const std::vector & -InputParameters::getParamHelper(const std::string & name_in, - const InputParameters & pars, - const std::vector *) -{ - const auto name = pars.checkForRename(name_in); - - return pars.get>(name); -} +const MultiMooseEnum & +InputParameters::getParamHelper(const std::string & name, + const InputParameters & pars, + const MultiMooseEnum *, + const MooseObject * moose_object /* = nullptr */); template std::vector> diff --git a/framework/src/actions/AdaptivityAction.C b/framework/src/actions/AdaptivityAction.C index 4e6fa7a83533..39948574b00a 100644 --- a/framework/src/actions/AdaptivityAction.C +++ b/framework/src/actions/AdaptivityAction.C @@ -170,15 +170,15 @@ AdaptivityAction::act() adapt.setPrintMeshChanged(getParam("print_changed_info")); - const std::vector & weight_names = - getParam>("weight_names"); - const std::vector & weight_values = getParam>("weight_values"); + if (isParamValid("weight_names") && isParamValid("weight_values")) + { + const std::vector & weight_names = + getParam>("weight_names"); + const std::vector & weight_values = getParam>("weight_values"); - auto num_weight_names = weight_names.size(); - auto num_weight_values = weight_values.size(); + auto num_weight_names = weight_names.size(); + auto num_weight_values = weight_values.size(); - if (num_weight_names) - { if (num_weight_names != num_weight_values) mooseError("Number of weight_names must be equal to number of weight_values in " "Execution/Adaptivity"); diff --git a/framework/src/actions/AddPeriodicBCAction.C b/framework/src/actions/AddPeriodicBCAction.C index 4e9cf8d382e7..ffe14f3e8380 100644 --- a/framework/src/actions/AddPeriodicBCAction.C +++ b/framework/src/actions/AddPeriodicBCAction.C @@ -46,7 +46,7 @@ AddPeriodicBCAction::validParams() params.addParam>("inv_transform_func", "Functions that specify the inverse transformation"); - params.addParam>("variable", "Variable for the periodic boundary"); + params.addParam>("variable", {}, "Variable for the periodic boundary"); params.addClassDescription("Action that adds periodic boundary conditions"); return params; } diff --git a/framework/src/actions/CommonOutputAction.C b/framework/src/actions/CommonOutputAction.C index 0eb7044aafe0..64a5014eb912 100644 --- a/framework/src/actions/CommonOutputAction.C +++ b/framework/src/actions/CommonOutputAction.C @@ -100,10 +100,12 @@ CommonOutputAction::validParams() params.addParam>( "hide", + {}, "A list of the variables and postprocessors that should NOT be output to the Exodus " "file (may include Variables, ScalarVariables, and Postprocessor names)."); params.addParam>( "show", + {}, "A list of the variables and postprocessors that should be output to the Exodus file " "(may include Variables, ScalarVariables, and Postprocessor names)."); diff --git a/framework/src/actions/SetupMeshAction.C b/framework/src/actions/SetupMeshAction.C index 3194e153021a..ad40a08ff050 100644 --- a/framework/src/actions/SetupMeshAction.C +++ b/framework/src/actions/SetupMeshAction.C @@ -132,11 +132,9 @@ SetupMeshAction::SetupMeshAction(const InputParameters & params) void SetupMeshAction::setupMesh(MooseMesh * mesh) { - std::vector ghosted_boundaries = - getParam>("ghosted_boundaries"); - - for (const auto & bnd_name : ghosted_boundaries) - mesh->addGhostedBoundary(mesh->getBoundaryID(bnd_name)); + if (isParamValid("ghosted_boundaries")) + for (const auto & bnd_name : getParam>("ghosted_boundaries")) + mesh->addGhostedBoundary(mesh->getBoundaryID(bnd_name)); if (isParamValid("ghosted_boundaries_inflation")) { diff --git a/framework/src/actions/SetupResidualDebugAction.C b/framework/src/actions/SetupResidualDebugAction.C index 5d259709108a..1f503bfd8ffb 100644 --- a/framework/src/actions/SetupResidualDebugAction.C +++ b/framework/src/actions/SetupResidualDebugAction.C @@ -26,7 +26,7 @@ SetupResidualDebugAction::validParams() { InputParameters params = Action::validParams(); params.addParam>( - "show_var_residual", "Variables for which residuals will be sent to the output file."); + "show_var_residual", {}, "Variables for which residuals will be sent to the output file."); params.addClassDescription( "Adds the necessary objects for computing the residuals for individual variables."); return params; diff --git a/framework/src/auxkernels/ArrayParsedAux.C b/framework/src/auxkernels/ArrayParsedAux.C index a2ab764ecd88..6e1a9945432c 100644 --- a/framework/src/auxkernels/ArrayParsedAux.C +++ b/framework/src/auxkernels/ArrayParsedAux.C @@ -84,9 +84,10 @@ ArrayParsedAux::ArrayParsedAux(const InputParameters & parameters) setParserFeatureFlags(_func_F); // add the constant expressions - addFParserConstants(_func_F, - getParam>("constant_names"), - getParam>("constant_expressions")); + if (isParamValid("constant_names") && isParamValid("constant_expressions")) + addFParserConstants(_func_F, + getParam>("constant_names"), + getParam>("constant_expressions")); // parse function if (_func_F->Parse(_function, variables) >= 0) diff --git a/framework/src/auxkernels/ParsedAux.C b/framework/src/auxkernels/ParsedAux.C index c21ea8366276..eb7e03fda5a7 100644 --- a/framework/src/auxkernels/ParsedAux.C +++ b/framework/src/auxkernels/ParsedAux.C @@ -67,9 +67,10 @@ ParsedAux::ParsedAux(const InputParameters & parameters) setParserFeatureFlags(_func_F); // add the constant expressions - addFParserConstants(_func_F, - getParam>("constant_names"), - getParam>("constant_expressions")); + if (isParamValid("constant_names") && isParamValid("constant_expressions")) + addFParserConstants(_func_F, + getParam>("constant_names"), + getParam>("constant_expressions")); // parse function if (_func_F->Parse(_function, variables) >= 0) diff --git a/framework/src/auxkernels/ParsedVectorAux.C b/framework/src/auxkernels/ParsedVectorAux.C index 9747c6f06f4e..450ca7218f11 100644 --- a/framework/src/auxkernels/ParsedVectorAux.C +++ b/framework/src/auxkernels/ParsedVectorAux.C @@ -41,12 +41,9 @@ ParsedVectorAux::validParams() false, "Make coordinate (x,y,z) and time (t) variables available in the function expression."); params.addParam>>( - "constant_names", - std::vector>(), - "Vector of constants used in the parsed function (use this for kB etc.)"); + "constant_names", "Vector of constants used in the parsed function (use this for kB etc.)"); params.addParam>>( "constant_expressions", - std::vector>(), "Vector of values for the constants in constant_names (can be an FParser expression)"); return params; @@ -67,10 +64,6 @@ ParsedVectorAux::ParsedVectorAux(const InputParameters & parameters) _func_F.resize(LIBMESH_DIM); _function.resize(LIBMESH_DIM); - if (getParam>>("constant_names").size() != - getParam>>("constant_expressions").size()) - paramError("constant_names", "Must be same length as constant_expressions"); - for (const auto i : make_range(Moose::dim)) { // build variables argument @@ -98,11 +91,17 @@ ParsedVectorAux::ParsedVectorAux(const InputParameters & parameters) setParserFeatureFlags(_func_F[i]); // add the constant expressions - if (getParam>>("constant_names").size()) - addFParserConstants( - _func_F[i], - getParam>>("constant_names")[i], - getParam>>("constant_expressions")[i]); + if (isParamValid("constant_names") && isParamValid("constant_expressions")) + { + auto constant_names = getParam>>("constant_names"); + auto constant_expressions = + getParam>>("constant_expressions"); + + if (constant_names.size() != constant_expressions.size()) + paramError("constant_names", "Must be same length as constant_expressions"); + + addFParserConstants(_func_F[i], constant_names[i], constant_expressions[i]); + } // parse function if (_func_F[i]->Parse(_function[i], variables) >= 0) diff --git a/framework/src/constraints/EqualValueBoundaryConstraint.C b/framework/src/constraints/EqualValueBoundaryConstraint.C index 80c359b6cc6d..103a8c44561a 100644 --- a/framework/src/constraints/EqualValueBoundaryConstraint.C +++ b/framework/src/constraints/EqualValueBoundaryConstraint.C @@ -58,7 +58,8 @@ EqualValueBoundaryConstraint::validParams() "primary", std::numeric_limits::max(), "The ID of the primary node. If no ID is provided, first node of secondary set is chosen."); - params.addParam>("secondary_node_ids", "The IDs of the secondary node"); + params.addParam>( + "secondary_node_ids", {}, "The IDs of the secondary node"); params.addParam( "secondary", "NaN", "The boundary ID associated with the secondary side"); params.addRequiredParam("penalty", "The penalty used for the boundary term"); diff --git a/framework/src/constraints/LinearNodalConstraint.C b/framework/src/constraints/LinearNodalConstraint.C index 91543244b5c5..b12316bc09bd 100644 --- a/framework/src/constraints/LinearNodalConstraint.C +++ b/framework/src/constraints/LinearNodalConstraint.C @@ -20,8 +20,8 @@ LinearNodalConstraint::validParams() params.addClassDescription( "Constrains secondary node to move as a linear combination of primary nodes."); params.addRequiredParam>("primary", "The primary node IDs."); - params.addParam>("secondary_node_ids", - "The list of secondary node ids"); + params.addParam>( + "secondary_node_ids", {}, "The list of secondary node ids"); params.addParam( "secondary_node_set", "NaN", "The boundary ID associated with the secondary side"); params.addRequiredParam("penalty", "The penalty used for the boundary term"); diff --git a/framework/src/controls/Control.C b/framework/src/controls/Control.C index 644fadb0707a..aac4723fbc11 100644 --- a/framework/src/controls/Control.C +++ b/framework/src/controls/Control.C @@ -27,6 +27,7 @@ Control::validParams() params.addParam>( "depends_on", + {}, "The Controls that this control relies upon (i.e. must execute before this one)"); return params; diff --git a/framework/src/executioners/FEProblemSolve.C b/framework/src/executioners/FEProblemSolve.C index 1be14063f705..76f77d8557a6 100644 --- a/framework/src/executioners/FEProblemSolve.C +++ b/framework/src/executioners/FEProblemSolve.C @@ -26,6 +26,7 @@ FEProblemSolve::validParams() InputParameters params = emptyInputParameters(); params.addParam>("splitting", + {}, "Top-level splitting defining a " "hierarchical decomposition into " "subsystems to help the solver."); diff --git a/framework/src/functormaterials/FunctorADConverter.C b/framework/src/functormaterials/FunctorADConverter.C index 5dd3f29891c5..7c3c2a84701d 100644 --- a/framework/src/functormaterials/FunctorADConverter.C +++ b/framework/src/functormaterials/FunctorADConverter.C @@ -22,13 +22,13 @@ FunctorADConverterTempl::validParams() params.addClassDescription("Converts regular functors to AD functors and " "AD functors to regular functors"); params.addParam>( - "reg_props_in", "The names of the regular functors to convert to AD functors"); - params.addParam>("ad_props_out", - "The names of the output AD functors"); + "reg_props_in", {}, "The names of the regular functors to convert to AD functors"); params.addParam>( - "ad_props_in", "The names of the AD functors to convert to regular functors"); - params.addParam>("reg_props_out", - "The names of the output regular functors"); + "ad_props_out", {}, "The names of the output AD functors"); + params.addParam>( + "ad_props_in", {}, "The names of the AD functors to convert to regular functors"); + params.addParam>( + "reg_props_out", {}, "The names of the output regular functors"); return params; } @@ -36,7 +36,6 @@ template FunctorADConverterTempl::FunctorADConverterTempl(const InputParameters & parameters) : FunctorMaterial(parameters) { - const std::set clearance_schedule(_execute_enum.begin(), _execute_enum.end()); auto reg_props_in = getParam>("reg_props_in"); auto ad_props_out = getParam>("ad_props_out"); auto ad_props_in = getParam>("ad_props_in"); diff --git a/framework/src/kernels/NodalScalarKernel.C b/framework/src/kernels/NodalScalarKernel.C index e3c792611a36..a1e3b28ae5cd 100644 --- a/framework/src/kernels/NodalScalarKernel.C +++ b/framework/src/kernels/NodalScalarKernel.C @@ -19,7 +19,7 @@ InputParameters NodalScalarKernel::validParams() { InputParameters params = ScalarKernel::validParams(); - params.addParam>("nodes", "Supply nodes using node ids"); + params.addParam>("nodes", {}, "Supply nodes using node ids"); params.addParam>( "boundary", "The list of boundary IDs from the mesh where this nodal kernel applies"); diff --git a/framework/src/materials/DerivativeParsedMaterialHelper.C b/framework/src/materials/DerivativeParsedMaterialHelper.C index 52ab28e34c0e..7b3eea7bb8fd 100644 --- a/framework/src/materials/DerivativeParsedMaterialHelper.C +++ b/framework/src/materials/DerivativeParsedMaterialHelper.C @@ -23,6 +23,7 @@ DerivativeParsedMaterialHelperTempl::validParams() params.addParam("derivative_order", 3, "Maximum order of derivatives taken"); params.addParam>( "additional_derivative_symbols", + {}, "A list of additional (non-variable) symbols (such as material property or postprocessor " "names) to take derivatives w.r.t."); return params; diff --git a/framework/src/materials/DerivativeSumMaterial.C b/framework/src/materials/DerivativeSumMaterial.C index b5dd1ee87765..659cccb53ad4 100644 --- a/framework/src/materials/DerivativeSumMaterial.C +++ b/framework/src/materials/DerivativeSumMaterial.C @@ -33,7 +33,7 @@ DerivativeSumMaterialTempl::validParams() "action)"); // Advanced arguments to construct a sum of the form \f$ c+\gamma\sum_iF_i \f$ - params.addParam>("prefactor", "Prefactor to multiply the sum term with."); + params.addParam>("prefactor", {}, "Prefactor to multiply the sum term with."); params.addParam("constant", 0.0, "Constant to be added to the prefactor multiplied sum."); params.addParam("validate_coupling", @@ -59,7 +59,9 @@ DerivativeSumMaterialTempl::DerivativeSumMaterialTempl(const InputParamet mooseError("Please supply at least one material to sum in DerivativeSumMaterial ", name()); // get prefactor values if not 1.0 - std::vector p = this->template getParam>("prefactor"); + std::vector p = this->isParamValid("prefactor") + ? this->template getParam>("prefactor") + : std::vector{}; // if prefactor is used we need the same number of prefactors as sum materials if (_num_materials == p.size()) diff --git a/framework/src/materials/MaterialADConverter.C b/framework/src/materials/MaterialADConverter.C index 67798e7026ba..73edd3aed7a2 100644 --- a/framework/src/materials/MaterialADConverter.C +++ b/framework/src/materials/MaterialADConverter.C @@ -34,13 +34,17 @@ MaterialADConverterTempl::validParams() params.addClassDescription( "Converts regular material properties to AD properties and vice versa"); params.addParam>( - "reg_props_in", "The names of the regular material properties to convert to AD properties"); - params.addParam>("ad_props_out", - "The names of the output AD properties"); + "reg_props_in", + {}, + "The names of the regular material properties to convert to AD properties"); params.addParam>( - "ad_props_in", "The names of the AD material properties to convert to regular properties"); - params.addParam>("reg_props_out", - "The names of the output regular properties"); + "ad_props_out", {}, "The names of the output AD properties"); + params.addParam>( + "ad_props_in", + {}, + "The names of the AD material properties to convert to regular properties"); + params.addParam>( + "reg_props_out", {}, "The names of the output regular properties"); params.addParam( "intra_convert", false, "Whether to allow intra conversion, e.g. regular->regular, ad->ad"); return params; @@ -50,6 +54,7 @@ template MaterialADConverterTempl::MaterialADConverterTempl(const InputParameters & parameters) : Material(parameters), _intra_convert(getParam("intra_convert")) { + auto reg_props_in = getParam>("reg_props_in"); auto ad_props_out = getParam>("ad_props_out"); auto ad_props_in = getParam>("ad_props_in"); diff --git a/framework/src/materials/MaterialBase.C b/framework/src/materials/MaterialBase.C index 23630f96a19a..c8b760cd2157 100644 --- a/framework/src/materials/MaterialBase.C +++ b/framework/src/materials/MaterialBase.C @@ -50,6 +50,7 @@ MaterialBase::validParams() params.set>("outputs") = {"none"}; params.addParam>( "output_properties", + {}, "List of material properties, from this material, to output (outputs " "must also be defined to an output type)"); params.addParam( diff --git a/framework/src/materials/MaterialFunctorConverter.C b/framework/src/materials/MaterialFunctorConverter.C index f94bb1faf3ad..4b3df026344f 100644 --- a/framework/src/materials/MaterialFunctorConverter.C +++ b/framework/src/materials/MaterialFunctorConverter.C @@ -21,11 +21,11 @@ MaterialFunctorConverterTempl::validParams() InputParameters params = Material::validParams(); params.addClassDescription("Converts functor to non-AD and AD regular material properties"); params.addParam>( - "functors_in", "The names of the functors to convert to regular material properties"); - params.addParam>("ad_props_out", - "The names of the output AD properties"); - params.addParam>("reg_props_out", - "The names of the output regular properties"); + "functors_in", {}, "The names of the functors to convert to regular material properties"); + params.addParam>( + "ad_props_out", {}, "The names of the output AD properties"); + params.addParam>( + "reg_props_out", {}, "The names of the output regular properties"); return params; } @@ -38,7 +38,7 @@ MaterialFunctorConverterTempl::MaterialFunctorConverterTempl(const InputParam const auto & reg_props_out = getParam>("reg_props_out"); const auto & ad_props_out = getParam>("ad_props_out"); - if (isParamValid("reg_props_out") && isParamValid("ad_props_out")) + if (isParamSetByUser("reg_props_out") && isParamSetByUser("ad_props_out")) paramError("reg_props_out", "We dont support converting functors to both regular and AD material properties in " "a single instance of '", diff --git a/framework/src/meshgenerators/AddMetaDataGenerator.C b/framework/src/meshgenerators/AddMetaDataGenerator.C index ab8b9ec61392..261a7c057796 100644 --- a/framework/src/meshgenerators/AddMetaDataGenerator.C +++ b/framework/src/meshgenerators/AddMetaDataGenerator.C @@ -25,61 +25,65 @@ AddMetaDataGenerator::validParams() "This mesh generator assigns extraneous mesh metadata to the input mesh"); params.addRequiredParam("input", "The mesh we want to modify"); - params.addParam>("real_scalar_metadata_names", - "Names of the real scalar mesh metadata."); - params.addParam>("real_scalar_metadata_values", - "Values of the real scalar mesh metadata."); - params.addParam>("uint_scalar_metadata_names", - "Names of the unsigned integer scalar mesh metadata."); + params.addParam>( + "real_scalar_metadata_names", {}, "Names of the real scalar mesh metadata."); + params.addParam>( + "real_scalar_metadata_values", {}, "Values of the real scalar mesh metadata."); + params.addParam>( + "uint_scalar_metadata_names", {}, "Names of the unsigned integer scalar mesh metadata."); params.addParam>( - "uint_scalar_metadata_values", "Values of the unsigned integer scalar mesh metadata."); - params.addParam>("int_scalar_metadata_names", - "Names of the integer scalar mesh metadata."); - params.addParam>("int_scalar_metadata_values", - "Values of the integer scalar mesh metadata."); - params.addParam>("dof_id_type_scalar_metadata_names", - "Names of the dof_id_type scalar mesh metadata."); - params.addParam>("dof_id_type_scalar_metadata_values", - "Values of the dof_id_type scalar mesh metadata."); + "uint_scalar_metadata_values", {}, "Values of the unsigned integer scalar mesh metadata."); + params.addParam>( + "int_scalar_metadata_names", {}, "Names of the integer scalar mesh metadata."); + params.addParam>( + "int_scalar_metadata_values", {}, "Values of the integer scalar mesh metadata."); + params.addParam>( + "dof_id_type_scalar_metadata_names", {}, "Names of the dof_id_type scalar mesh metadata."); + params.addParam>( + "dof_id_type_scalar_metadata_values", {}, "Values of the dof_id_type scalar mesh metadata."); params.addParam>("subdomain_id_type_scalar_metadata_names", + {}, "Names of the subdomain_id_type scalar mesh metadata."); params.addParam>( "subdomain_id_type_scalar_metadata_values", + {}, "Values of the subdomain_id_type scalar mesh metadata."); - params.addParam>("boolean_scalar_metadata_names", - "Names of the boolean scalar mesh metadata."); - params.addParam>("boolean_scalar_metadata_values", - "Values of the boolean scalar mesh metadata."); - params.addParam>("point_scalar_metadata_names", - "Names of the point scalar mesh metadata."); - params.addParam>("point_scalar_metadata_values", - "Values of the point scalar mesh metadata."); - - params.addParam>("real_vector_metadata_names", - "Names of the real vector mesh metadata."); - params.addParam>>("real_vector_metadata_values", - "Values of the real vector mesh metadata."); - params.addParam>("uint_vector_metadata_names", - "Names of the unsigned integer vector mesh metadata."); + params.addParam>( + "boolean_scalar_metadata_names", {}, "Names of the boolean scalar mesh metadata."); + params.addParam>( + "boolean_scalar_metadata_values", {}, "Values of the boolean scalar mesh metadata."); + params.addParam>( + "point_scalar_metadata_names", {}, "Names of the point scalar mesh metadata."); + params.addParam>( + "point_scalar_metadata_values", {}, "Values of the point scalar mesh metadata."); + + params.addParam>( + "real_vector_metadata_names", {}, "Names of the real vector mesh metadata."); + params.addParam>>( + "real_vector_metadata_values", {}, "Values of the real vector mesh metadata."); + params.addParam>( + "uint_vector_metadata_names", {}, "Names of the unsigned integer vector mesh metadata."); params.addParam>>( - "uint_vector_metadata_values", "Values of the unsigned integer vector mesh metadata."); - params.addParam>("int_vector_metadata_names", - "Names of the integer vector mesh metadata."); - params.addParam>>("int_vector_metadata_values", - "Values of the integer vector mesh metadata."); - params.addParam>("dof_id_type_vector_metadata_names", - "Names of the dof_id_type vector mesh metadata."); + "uint_vector_metadata_values", {}, "Values of the unsigned integer vector mesh metadata."); + params.addParam>( + "int_vector_metadata_names", {}, "Names of the integer vector mesh metadata."); + params.addParam>>( + "int_vector_metadata_values", {}, "Values of the integer vector mesh metadata."); + params.addParam>( + "dof_id_type_vector_metadata_names", {}, "Names of the dof_id_type vector mesh metadata."); params.addParam>>( - "dof_id_type_vector_metadata_values", "Values of the dof_id_type vector mesh metadata."); + "dof_id_type_vector_metadata_values", {}, "Values of the dof_id_type vector mesh metadata."); params.addParam>("subdomain_id_type_vector_metadata_names", + {}, "Names of the subdomain_id_type vector mesh metadata."); params.addParam>>( "subdomain_id_type_vector_metadata_values", + {}, "Values of the subdomain_id_type vector mesh metadata."); - params.addParam>("point_vector_metadata_names", - "Names of the Point vector mesh metadata."); - params.addParam>>("point_vector_metadata_values", - "Values of the Point vector mesh metadata."); + params.addParam>( + "point_vector_metadata_names", {}, "Names of the Point vector mesh metadata."); + params.addParam>>( + "point_vector_metadata_values", {}, "Values of the Point vector mesh metadata."); return params; } diff --git a/framework/src/meshgenerators/AdvancedExtruderGenerator.C b/framework/src/meshgenerators/AdvancedExtruderGenerator.C index fb7be8ebebad..9d56ed69b657 100644 --- a/framework/src/meshgenerators/AdvancedExtruderGenerator.C +++ b/framework/src/meshgenerators/AdvancedExtruderGenerator.C @@ -61,20 +61,24 @@ AdvancedExtruderGenerator::validParams() params.addParam>>( "subdomain_swaps", + {}, "For each row, every two entries are interpreted as a pair of " "'from' and 'to' to remap the subdomains for that elevation"); params.addParam>>( "boundary_swaps", + {}, "For each row, every two entries are interpreted as a pair of " "'from' and 'to' to remap the boundaries for that elevation"); params.addParam>( "elem_integer_names_to_swap", + {}, "Array of element extra integer names that need to be swapped during extrusion."); params.addParam>>>( "elem_integers_swaps", + {}, "For each row, every two entries are interpreted as a pair of 'from' and 'to' to remap the " "element extra integer for that elevation. If multiple element extra integers need to be " "swapped, the enties are stacked based on the order provided in " diff --git a/framework/src/meshgenerators/AnnularMeshGenerator.C b/framework/src/meshgenerators/AnnularMeshGenerator.C index 923cffab1ccf..b72e0daad4b8 100644 --- a/framework/src/meshgenerators/AnnularMeshGenerator.C +++ b/framework/src/meshgenerators/AnnularMeshGenerator.C @@ -31,8 +31,8 @@ AnnularMeshGenerator::validParams() "rmin>=0.0", "Inner radius. If rmin=0 then a disc mesh (with no central hole) will be created."); params.addRequiredParam("rmax", "Outer radius"); - params.addParam>("radial_positions", - "Directly prescribed positions of intermediate radial nodes"); + params.addParam>( + "radial_positions", {}, "Directly prescribed positions of intermediate radial nodes"); params.addParam("equal_area", false, "Whether to select the radial discretization " diff --git a/framework/src/meshgenerators/ExtraNodesetGenerator.C b/framework/src/meshgenerators/ExtraNodesetGenerator.C index 6e3dd15af5cc..8a1848a9bb5c 100644 --- a/framework/src/meshgenerators/ExtraNodesetGenerator.C +++ b/framework/src/meshgenerators/ExtraNodesetGenerator.C @@ -52,18 +52,6 @@ std::unique_ptr ExtraNodesetGenerator::generate() { std::unique_ptr mesh = std::move(_input); - const auto coord = getParam>>("coord"); - const auto nodes = getParam>("nodes"); - - // make sure the input is not empty - bool data_valid = false; - if (isParamValid("nodes") && nodes.size() != 0) - data_valid = true; - if (_pars.isParamValid("coord") && coord.size() != 0) - data_valid = true; - - if (!data_valid) - mooseError("Node set can not be empty!"); // Get the BoundaryIDs from the mesh std::vector boundary_names = getParam>("new_boundary"); @@ -74,15 +62,16 @@ ExtraNodesetGenerator::generate() BoundaryInfo & boundary_info = mesh->get_boundary_info(); // add nodes with their ids - for (const auto & node_id : nodes) - { - // Our mesh may be distributed and this node may not exist on this process - if (!mesh->query_node_ptr(node_id)) - continue; + if (isParamValid("nodes")) + for (const auto & node_id : getParam>("nodes")) + { + // Our mesh may be distributed and this node may not exist on this process + if (!mesh->query_node_ptr(node_id)) + continue; - for (const auto & boundary_id : boundary_ids) - boundary_info.add_node(node_id, boundary_id); - } + for (const auto & boundary_id : boundary_ids) + boundary_info.add_node(node_id, boundary_id); + } // add nodes with their coordinates const auto dim = mesh->mesh_dimension(); @@ -91,65 +80,67 @@ ExtraNodesetGenerator::generate() locator->enable_out_of_mesh_mode(); const auto tolerance = getParam("tolerance"); - for (const auto & c : coord) - { - Point p; - if (c.size() < dim) - paramError("coord", - "Coordinate ", - Moose::stringify(c), - " does not have enough components for a ", - dim, - "D mesh."); - - if (c.size() > 3) - paramError("coord", - "Coordinate ", - Moose::stringify(c), - " has too many components. Did you maybe forget to separate multiple coordinates " - "with a ';'?"); - - for (unsigned int j = 0; j < c.size(); ++j) - p(j) = c[j]; - - // locate candidate element - bool on_node = false; - bool found_elem = false; - const Elem * elem = (*locator)(p); - if (elem) + if (_pars.isParamValid("coord")) + for (const auto & c : getParam>>("coord")) { - found_elem = true; - for (unsigned int j = 0; j < elem->n_nodes(); ++j) + Point p; + if (c.size() < dim) + paramError("coord", + "Coordinate ", + Moose::stringify(c), + " does not have enough components for a ", + dim, + "D mesh."); + + if (c.size() > 3) + paramError( + "coord", + "Coordinate ", + Moose::stringify(c), + " has too many components. Did you maybe forget to separate multiple coordinates " + "with a ';'?"); + + for (unsigned int j = 0; j < c.size(); ++j) + p(j) = c[j]; + + // locate candidate element + bool on_node = false; + bool found_elem = false; + const Elem * elem = (*locator)(p); + if (elem) { - const Node * node = elem->node_ptr(j); - if (p.absolute_fuzzy_equals(*node, tolerance)) + found_elem = true; + for (unsigned int j = 0; j < elem->n_nodes(); ++j) { - for (const auto & boundary_id : boundary_ids) - boundary_info.add_node(node, boundary_id); - - on_node = true; - break; + const Node * node = elem->node_ptr(j); + if (p.absolute_fuzzy_equals(*node, tolerance)) + { + for (const auto & boundary_id : boundary_ids) + boundary_info.add_node(node, boundary_id); + + on_node = true; + break; + } } } - } - // If we are on a distributed mesh, then any particular processor - // may be unable to find any particular node, but *some* processor - // should have found it. - if (!mesh->is_replicated()) - { - this->comm().max(found_elem); - this->comm().max(on_node); - } + // If we are on a distributed mesh, then any particular processor + // may be unable to find any particular node, but *some* processor + // should have found it. + if (!mesh->is_replicated()) + { + this->comm().max(found_elem); + this->comm().max(on_node); + } - if (!found_elem) - mooseError( - "Unable to locate the following point within the domain, please check its coordinates:\n", - p); + if (!found_elem) + mooseError("Unable to locate the following point within the domain, please check its " + "coordinates:\n", + p); - if (!on_node) - mooseError("No node found at point:\n", p); - } + if (!on_node) + mooseError("No node found at point:\n", p); + } for (unsigned int i = 0; i < boundary_ids.size(); ++i) boundary_info.nodeset_name(boundary_ids[i]) = boundary_names[i]; diff --git a/framework/src/meshgenerators/ParsedCurveGenerator.C b/framework/src/meshgenerators/ParsedCurveGenerator.C index 83aafd5f337f..6b60f4898320 100644 --- a/framework/src/meshgenerators/ParsedCurveGenerator.C +++ b/framework/src/meshgenerators/ParsedCurveGenerator.C @@ -112,15 +112,18 @@ ParsedCurveGenerator::ParsedCurveGenerator(const InputParameters & parameters) setParserFeatureFlags(_func_Fz); // add the constant expressions; note that the three functions share one set of constants - addFParserConstants(_func_Fx, - getParam>("constant_names"), - getParam>("constant_expressions")); - addFParserConstants(_func_Fy, - getParam>("constant_names"), - getParam>("constant_expressions")); - addFParserConstants(_func_Fz, - getParam>("constant_names"), - getParam>("constant_expressions")); + if (isParamValid("constant_names") && isParamValid("constant_expressions")) + { + addFParserConstants(_func_Fx, + getParam>("constant_names"), + getParam>("constant_expressions")); + addFParserConstants(_func_Fy, + getParam>("constant_names"), + getParam>("constant_expressions")); + addFParserConstants(_func_Fz, + getParam>("constant_names"), + getParam>("constant_expressions")); + } // parse functions if (_func_Fx->Parse(_function_x, "t") >= 0) diff --git a/framework/src/meshgenerators/ParsedGenerateSideset.C b/framework/src/meshgenerators/ParsedGenerateSideset.C index 000a02804259..be6d16142ff0 100644 --- a/framework/src/meshgenerators/ParsedGenerateSideset.C +++ b/framework/src/meshgenerators/ParsedGenerateSideset.C @@ -119,9 +119,10 @@ ParsedGenerateSideset::ParsedGenerateSideset(const InputParameters & parameters) setParserFeatureFlags(_func_F); // add the constant expressions - addFParserConstants(_func_F, - getParam>("constant_names"), - getParam>("constant_expressions")); + if (isParamValid("constant_names") && isParamValid("constant_expressions")) + addFParserConstants(_func_F, + getParam>("constant_names"), + getParam>("constant_expressions")); // parse function if (_func_F->Parse(_function, "x,y,z") >= 0) diff --git a/framework/src/meshgenerators/ParsedNodeTransformGenerator.C b/framework/src/meshgenerators/ParsedNodeTransformGenerator.C index 6aa450760522..60ef89b9dae6 100644 --- a/framework/src/meshgenerators/ParsedNodeTransformGenerator.C +++ b/framework/src/meshgenerators/ParsedNodeTransformGenerator.C @@ -52,9 +52,10 @@ ParsedNodeTransformGenerator::ParsedNodeTransformGenerator(const InputParameters setParserFeatureFlags(_functions[i]); // add the constant expressions - addFParserConstants(_functions[i], - getParam>("constant_names"), - getParam>("constant_expressions")); + if (isParamValid("constant_names") && isParamValid("constant_expressions")) + addFParserConstants(_functions[i], + getParam>("constant_names"), + getParam>("constant_expressions")); // parse function if (_functions[i]->Parse(getParam(_func_name[i]), "x,y,z") >= 0) diff --git a/framework/src/meshgenerators/ParsedSubdomainMeshGenerator.C b/framework/src/meshgenerators/ParsedSubdomainMeshGenerator.C index 5b41133c88c6..ac57cc1b69a2 100644 --- a/framework/src/meshgenerators/ParsedSubdomainMeshGenerator.C +++ b/framework/src/meshgenerators/ParsedSubdomainMeshGenerator.C @@ -69,9 +69,10 @@ ParsedSubdomainMeshGenerator::ParsedSubdomainMeshGenerator(const InputParameters setParserFeatureFlags(_func_F); // add the constant expressions - addFParserConstants(_func_F, - getParam>("constant_names"), - getParam>("constant_expressions")); + if (isParamValid("constant_names") && isParamValid("constant_expressions")) + addFParserConstants(_func_F, + getParam>("constant_names"), + getParam>("constant_expressions")); // parse function if (_func_F->Parse(_function, "x,y,z") >= 0) diff --git a/framework/src/meshgenerators/RenameBlockGenerator.C b/framework/src/meshgenerators/RenameBlockGenerator.C index 9f8d5ab4a316..898e4dcacca1 100644 --- a/framework/src/meshgenerators/RenameBlockGenerator.C +++ b/framework/src/meshgenerators/RenameBlockGenerator.C @@ -23,39 +23,11 @@ RenameBlockGenerator::validParams() params.addRequiredParam("input", "The mesh we want to modify"); - params.addDeprecatedParam>( - "old_block_id", - "Elements with this block number will be given the new_block_number or " - "new_block_name. You must supply either old_block_id or old_block_name. " - "You may supply a vector of old_block_id, in which case the new_block " - "information must also be a vector.", - "Use 'old_block' instead of 'old_block_id'."); - params.addDeprecatedParam>( - "old_block_name", - "Elements with this block name will be given the new_block_number or " - "new_block_name. You must supply either old_block_id or old_block_name. " - "You may supply a vector of old_block_name, in which case the new_block " - "information must also be a vector.", - "Use 'old_block' instead of 'old_block_name'."); - params.addDeprecatedParam>( - "new_block_id", - "Elements with the old block number (or name) will be given this block " - "number. If the old blocks are named, their names will be passed onto the " - "newly numbered blocks.", - "Use 'new_block' instead of 'new_block_id'."); - params.addDeprecatedParam>( - "new_block_name", - "Elements with the old block number (or name) will be given this block " - "name. No change of block ID is performed, unless multiple old blocks are " - "given the same name, in which case they are all given the first old block " - "number.", - "Use 'new_block' instead of 'new_block_name'."); - - params.addParam>( + params.addRequiredParam>( "old_block", "Elements with these block ID(s)/name(s) will be given the new block information specified " "in 'new_block'"); - params.addParam>( + params.addRequiredParam>( "new_block", "The new block ID(s)/name(s) to be given by the elements defined in 'old_block'."); @@ -69,60 +41,21 @@ RenameBlockGenerator::validParams() RenameBlockGenerator::RenameBlockGenerator(const InputParameters & parameters) : MeshGenerator(parameters), _input(getMesh("input")) { - if (isParamValid("old_block_id") && isParamValid("old_block_name")) - paramError("old_block_id", - "Cannot use in combination with 'old_block_name'. Please use 'old_block' " - "instead; 'old_block_id' and 'old_block_name' are deprecated."); - if (isParamValid("new_block_id") && isParamValid("new_block_name")) - paramError("new_block_id", - "Cannot use in combination with 'new_block_name'. Please use 'new_block' " - "instead; 'new_block_id' and 'new_block_name' are deprecated."); if (isParamValid("old_block")) { - if (isParamValid("old_block_id")) - paramError("old_block_id", - "Cannot use with 'old_block'. Use only 'old_block'; 'old_block_id' is " - "deprecated."); - if (isParamValid("old_block_name")) - paramError("old_block_name", - "Cannot use with 'old_block'. Use only 'old_block'; 'old_block_name' is " - "deprecated."); _old_block = getParam>("old_block"); _old_block_param_name = "old_block"; } - else if (isParamValid("old_block_id")) - { - for (const auto id : getParam>("old_block_id")) - _old_block.push_back(std::to_string(id)); - _old_block_param_name = "old_block_id"; - } else - { - _old_block = getParam>("old_block_name"); - _old_block_param_name = "old_block_name"; - } + paramError("old_block", "No valid 'old_block' name is provided."); std::string new_block_param_name; if (isParamValid("new_block")) { - if (isParamValid("new_block_id")) - paramError("new_block_id", - "Cannot use with 'new_block'. Use only 'new_block'; 'new_block_id' is " - "deprecated."); - if (isParamValid("new_block_name")) - paramError("new_block_name", - "Cannot use with 'new_block'. Use only 'new_block'; 'new_block_name' is " - "deprecated."); _new_block = getParam>("new_block"); new_block_param_name = "new_block"; } - else if (isParamValid("new_block_id")) - { - for (const auto id : getParam>("new_block_id")) - _new_block.push_back(std::to_string(id)); - new_block_param_name = "new_block_id"; - } else { _new_block = getParam>("new_block_name"); diff --git a/framework/src/multiapps/MultiApp.C b/framework/src/multiapps/MultiApp.C index a6ce44076b62..6cbfa84b32b6 100644 --- a/framework/src/multiapps/MultiApp.C +++ b/framework/src/multiapps/MultiApp.C @@ -151,12 +151,13 @@ MultiApp::validParams() // Resetting subapps params.addParam>( "reset_time", - std::vector(), + {}, "The time(s) at which to reset Apps given by the 'reset_apps' parameter. " "Resetting an App means that it is destroyed and recreated, possibly " "modeling the insertion of 'new' material for that app."); params.addParam>( "reset_apps", + {}, "The Apps that will be reset when 'reset_time' is hit. These are the App " "'numbers' starting with 0 corresponding to the order of the App positions. " "Resetting an App means that it is destroyed and recreated, possibly modeling " @@ -170,14 +171,15 @@ MultiApp::validParams() params.addParam>( "move_apps", + {}, "Apps, designated by their 'numbers' starting with 0 corresponding to the order " "of the App positions, to be moved at move_time to move_positions"); - params.addParam>("move_positions", - "The positions corresponding to each move_app."); + params.addParam>( + "move_positions", {}, "The positions corresponding to each move_app."); params.addParam>( "cli_args", - std::vector(), + {}, "Additional command line arguments to pass to the sub apps. If one set is provided the " "arguments are applied to all, otherwise there must be a set for each sub app."); @@ -195,16 +197,16 @@ MultiApp::validParams() "Set between 0 and 2."); params.addDeprecatedParam>( "relaxed_variables", - std::vector(), + {}, "Use transformed_variables.", "List of subapp variables to relax during Multiapp coupling iterations"); params.addParam>( "transformed_variables", - std::vector(), + {}, "List of subapp variables to use coupling algorithm on during Multiapp coupling iterations"); params.addParam>( "transformed_postprocessors", - std::vector(), + {}, "List of subapp postprocessors to use coupling " "algorithm on during Multiapp coupling iterations"); params.addParam("keep_solution_during_restore", diff --git a/framework/src/outputs/AdvancedOutput.C b/framework/src/outputs/AdvancedOutput.C index 59a2dd6bdb3b..4bc3cd13b2a0 100644 --- a/framework/src/outputs/AdvancedOutput.C +++ b/framework/src/outputs/AdvancedOutput.C @@ -161,8 +161,9 @@ AdvancedOutput::init() initAvailableLists(); // Separate the hide/show list into components - initShowHideLists(getParam>("show"), - getParam>("hide")); + if (isParamValid("show") && isParamValid("hide")) + initShowHideLists(getParam>("show"), + getParam>("hide")); // If 'elemental_as_nodal = true' the elemental variable names must be appended to the // nodal variable names. Thus, when libMesh::EquationSystem::build_solution_vector is called diff --git a/framework/src/partitioner/LibmeshPartitioner.C b/framework/src/partitioner/LibmeshPartitioner.C index 885bbddcbff7..6e36c51f8141 100644 --- a/framework/src/partitioner/LibmeshPartitioner.C +++ b/framework/src/partitioner/LibmeshPartitioner.C @@ -37,7 +37,7 @@ LibmeshPartitioner::validParams() "Specifies the sort direction if using the centroid partitioner. " "Available options: x, y, z, radial"); params.addParam>>( - "blocks", "Block is seperated by ;, and partition mesh block by block. "); + "blocks", {}, "Block is seperated by ;, and partition mesh block by block. "); return params; } @@ -149,17 +149,18 @@ LibmeshPartitioner::prepareBlocksForSubdomainPartitioner( subdomain_partitioner.chunks.clear(); // Insert each chunk - for (const auto & group : _subdomain_blocks) - { - const auto subdomain_ids = MooseMeshUtils::getSubdomainIDs(mesh, group); - for (const auto id : subdomain_ids) - if (!mesh_subdomain_ids.count(id)) - paramError("blocks", "The block ", id, " was not found on the mesh"); + if (_subdomain_blocks.size() != 0) + for (const auto & group : _subdomain_blocks) + { + const auto subdomain_ids = MooseMeshUtils::getSubdomainIDs(mesh, group); + for (const auto id : subdomain_ids) + if (!mesh_subdomain_ids.count(id)) + paramError("blocks", "The block ", id, " was not found on the mesh"); - std::set subdomain_ids_set(subdomain_ids.begin(), subdomain_ids.end()); + std::set subdomain_ids_set(subdomain_ids.begin(), subdomain_ids.end()); - subdomain_partitioner.chunks.push_back(subdomain_ids_set); - } + subdomain_partitioner.chunks.push_back(subdomain_ids_set); + } } void diff --git a/framework/src/postprocessors/FunctionValuePostprocessor.C b/framework/src/postprocessors/FunctionValuePostprocessor.C index a6b50917ffce..e97f58cda744 100644 --- a/framework/src/postprocessors/FunctionValuePostprocessor.C +++ b/framework/src/postprocessors/FunctionValuePostprocessor.C @@ -58,9 +58,12 @@ FunctionValuePostprocessor::FunctionValuePostprocessor(const InputParameters & p _point[j] = &getPostprocessorValue("point", j); } - const auto & indirect_dependencies = - getParam>("indirect_dependencies"); - _depend_uo.insert(indirect_dependencies.begin(), indirect_dependencies.end()); + if (isParamValid("indirect_dependencies")) + { + const auto & indirect_dependencies = + getParam>("indirect_dependencies"); + _depend_uo.insert(indirect_dependencies.begin(), indirect_dependencies.end()); + } } void diff --git a/framework/src/postprocessors/ParsedPostprocessor.C b/framework/src/postprocessors/ParsedPostprocessor.C index 1c1768580ac7..dd9ffed4e766 100644 --- a/framework/src/postprocessors/ParsedPostprocessor.C +++ b/framework/src/postprocessors/ParsedPostprocessor.C @@ -58,9 +58,10 @@ ParsedPostprocessor::ParsedPostprocessor(const InputParameters & parameters) setParserFeatureFlags(_func_F); // add the constant expressions - addFParserConstants(_func_F, - getParam>("constant_names"), - getParam>("constant_expressions")); + if (isParamValid("constant_names") && isParamValid("constant_expressions")) + addFParserConstants(_func_F, + getParam>("constant_names"), + getParam>("constant_expressions")); // parse function std::string function = getParam("function"); diff --git a/framework/src/preconditioners/FieldSplitPreconditioner.C b/framework/src/preconditioners/FieldSplitPreconditioner.C index 9e3f46c01bdc..5fbbc2cfea8e 100644 --- a/framework/src/preconditioners/FieldSplitPreconditioner.C +++ b/framework/src/preconditioners/FieldSplitPreconditioner.C @@ -56,20 +56,23 @@ FieldSplitPreconditioner::FieldSplitPreconditioner(const InputParameters & param std::unique_ptr cm = std::make_unique(n_vars); if (!full) { - const auto off_diag_rows = getParam>("off_diag_row"); - const auto off_diag_columns = getParam>("off_diag_column"); + if (isParamValid("off_diag_row") && isParamValid("off_diag_column")) + { + const auto off_diag_rows = getParam>("off_diag_row"); + const auto off_diag_columns = getParam>("off_diag_column"); - // put 1s on diagonal - for (unsigned int i = 0; i < n_vars; i++) - (*cm)(i, i) = 1; + // put 1s on diagonal + for (unsigned int i = 0; i < n_vars; i++) + (*cm)(i, i) = 1; - // off-diagonal entries - std::vector> off_diag(n_vars); - for (const auto i : index_range(off_diag_rows)) - { - unsigned int row = _nl.getVariable(0, off_diag_rows[i]).number(); - unsigned int column = _nl.getVariable(0, off_diag_columns[i]).number(); - (*cm)(row, column) = 1; + // off-diagonal entries + std::vector> off_diag(n_vars); + for (const auto i : index_range(off_diag_rows)) + { + unsigned int row = _nl.getVariable(0, off_diag_rows[i]).number(); + unsigned int column = _nl.getVariable(0, off_diag_columns[i]).number(); + (*cm)(row, column) = 1; + } } } else diff --git a/framework/src/preconditioners/FiniteDifferencePreconditioner.C b/framework/src/preconditioners/FiniteDifferencePreconditioner.C index e534372a5a7f..080cc90693f3 100644 --- a/framework/src/preconditioners/FiniteDifferencePreconditioner.C +++ b/framework/src/preconditioners/FiniteDifferencePreconditioner.C @@ -68,16 +68,17 @@ FiniteDifferencePreconditioner::FiniteDifferencePreconditioner(const InputParame // off-diagonal entries std::vector> off_diag(n_vars); - for (const auto i : index_range(getParam>("off_diag_row"))) - { - unsigned int row = - nl.getVariable(0, getParam>("off_diag_row")[i]) - .number(); - unsigned int column = - nl.getVariable(0, getParam>("off_diag_column")[i]) - .number(); - (*cm)(row, column) = 1; - } + if (isParamValid("off_diag_row") && isParamValid("off_diag_column")) + for (const auto i : index_range(getParam>("off_diag_row"))) + { + unsigned int row = + nl.getVariable(0, getParam>("off_diag_row")[i]) + .number(); + unsigned int column = + nl.getVariable(0, getParam>("off_diag_column")[i]) + .number(); + (*cm)(row, column) = 1; + } // TODO: handle coupling entries between NL-vars and SCALAR-vars } diff --git a/framework/src/preconditioners/PhysicsBasedPreconditioner.C b/framework/src/preconditioners/PhysicsBasedPreconditioner.C index 652c6dbb1525..3dccac1f29c8 100644 --- a/framework/src/preconditioners/PhysicsBasedPreconditioner.C +++ b/framework/src/preconditioners/PhysicsBasedPreconditioner.C @@ -112,16 +112,20 @@ PhysicsBasedPreconditioner::PhysicsBasedPreconditioner(const InputParameters & p unsigned int n_vars = _nl.system().n_vars(); // off-diagonal entries - const std::vector & odr = - getParam>("off_diag_row"); - const std::vector & odc = - getParam>("off_diag_column"); std::vector> off_diag(n_vars); - for (const auto i : index_range(odr)) + if (isParamValid("off_diag_row") && isParamValid("off_diag_column")) { - unsigned int row = _nl.system().variable_number(odr[i]); - unsigned int column = _nl.system().variable_number(odc[i]); - off_diag[row].push_back(column); + const std::vector & odr = + getParam>("off_diag_row"); + const std::vector & odc = + getParam>("off_diag_column"); + + for (const auto i : index_range(odr)) + { + unsigned int row = _nl.system().variable_number(odr[i]); + unsigned int column = _nl.system().variable_number(odc[i]); + off_diag[row].push_back(column); + } } // Add all of the preconditioning systems for (unsigned int var = 0; var < n_vars; var++) diff --git a/framework/src/preconditioners/SingleMatrixPreconditioner.C b/framework/src/preconditioners/SingleMatrixPreconditioner.C index e3e19bec6f88..f9ba14283f0c 100644 --- a/framework/src/preconditioners/SingleMatrixPreconditioner.C +++ b/framework/src/preconditioners/SingleMatrixPreconditioner.C @@ -65,29 +65,29 @@ SingleMatrixPreconditioner::SingleMatrixPreconditioner(const InputParameters & p // off-diagonal entries from the coupled_groups parameters const auto & all_vars = nl.getVariableNames(); - auto groups = getParam>("coupled_groups"); - for (const auto & group : groups) - { - std::vector vars; - MooseUtils::tokenize(group, vars, 1, ","); - try - { - MooseUtils::expandAllMatches(all_vars, vars); - } - catch (std::invalid_argument const & e) + if (isParamValid("coupled_groups")) + for (const auto & group : getParam>("coupled_groups")) { - mooseError("No variable name match found for '", e.what(), "'."); - } - - for (const auto j : index_range(vars)) - for (unsigned int k = j + 1; k < vars.size(); ++k) + std::vector vars; + MooseUtils::tokenize(group, vars, 1, ","); + try { - const auto row = libmesh_system.variable_number(vars[j]); - const auto column = libmesh_system.variable_number(vars[k]); - (*cm)(row, column) = 1; - (*cm)(column, row) = 1; + MooseUtils::expandAllMatches(all_vars, vars); } - } + catch (std::invalid_argument const & e) + { + mooseError("No variable name match found for '", e.what(), "'."); + } + + for (const auto j : index_range(vars)) + for (unsigned int k = j + 1; k < vars.size(); ++k) + { + const auto row = libmesh_system.variable_number(vars[j]); + const auto column = libmesh_system.variable_number(vars[k]); + (*cm)(row, column) = 1; + (*cm)(column, row) = 1; + } + } } else { diff --git a/framework/src/preconditioners/VariableCondensationPreconditioner.C b/framework/src/preconditioners/VariableCondensationPreconditioner.C index e44ee77bee6c..8d3048768b67 100644 --- a/framework/src/preconditioners/VariableCondensationPreconditioner.C +++ b/framework/src/preconditioners/VariableCondensationPreconditioner.C @@ -146,24 +146,25 @@ VariableCondensationPreconditioner::VariableCondensationPreconditioner( // off-diagonal entries from the off_diag_row and off_diag_column parameters std::vector> off_diag(_n_vars); - for (const auto i : index_range(getParam>("off_diag_row"))) - { - const unsigned int row = - _nl.getVariable(0, getParam>("off_diag_row")[i]) - .number(); - const unsigned int column = - _nl.getVariable(0, getParam>("off_diag_column")[i]) - .number(); - (*cm)(row, column) = 1; - } + if (isParamValid("off_diag_row") && isParamValid("off_diag_column")) + for (const auto i : index_range(getParam>("off_diag_row"))) + { + const unsigned int row = + _nl.getVariable(0, getParam>("off_diag_row")[i]) + .number(); + const unsigned int column = + _nl.getVariable(0, getParam>("off_diag_column")[i]) + .number(); + (*cm)(row, column) = 1; + } // off-diagonal entries from the coupled_groups parameters - std::vector groups = - getParam>("coupled_groups"); - for (const auto i : index_range(groups)) + if (isParamValid("coupled_groups")) + for (const auto & coupled_group : + getParam>("coupled_groups")) { std::vector vars; - MooseUtils::tokenize(groups[i], vars, 1, ","); + MooseUtils::tokenize(coupled_group, vars, 1, ","); for (unsigned int j : index_range(vars)) for (unsigned int k = j + 1; k < vars.size(); ++k) { diff --git a/framework/src/predictors/Predictor.C b/framework/src/predictors/Predictor.C index dd474b060dc0..becf6b86d802 100644 --- a/framework/src/predictors/Predictor.C +++ b/framework/src/predictors/Predictor.C @@ -22,9 +22,10 @@ Predictor::validParams() params.addRequiredParam("scale", "The scale factor for the predictor (can range from 0 to 1)"); params.addParam>( - "skip_times", "Skip the predictor if the current solution time is in this list of times"); + "skip_times", {}, "Skip the predictor if the current solution time is in this list of times"); params.addParam>( "skip_times_old", + {}, "Skip the predictor if the previous solution time is in this list of times"); params.addParam("skip_after_failed_timestep", false, diff --git a/framework/src/problems/FEProblemBase.C b/framework/src/problems/FEProblemBase.C index 876f8f55a064..5a882bc202f6 100644 --- a/framework/src/problems/FEProblemBase.C +++ b/framework/src/problems/FEProblemBase.C @@ -188,7 +188,7 @@ FEProblemBase::validParams() /// 2. _blocks.size() > 0 and no coordinate system was specified, then the whole domain will be XYZ. /// 3. _blocks.size() > 0 and one coordinate system was specified, then the whole domain will be that system. params.addDeprecatedParam>( - "block", "Block IDs for the coordinate systems", "Please use 'Mesh/coord_block' instead"); + "block", {}, "Block IDs for the coordinate systems", "Please use 'Mesh/coord_block' instead"); MultiMooseEnum coord_types("XYZ RZ RSPHERICAL", "XYZ"); MooseEnum rz_coord_axis("X=0 Y=1", "Y"); params.addDeprecatedParam("coord_type", @@ -500,35 +500,41 @@ void FEProblemBase::createTagVectors() { // add vectors and their tags to system - auto & vectors = getParam>>("extra_tag_vectors"); - for (const auto nl_sys_num : index_range(vectors)) - for (auto & vector : vectors[nl_sys_num]) - { - auto tag = addVectorTag(vector); - _nl[nl_sys_num]->addVector(tag, false, GHOSTED); - } + if (isParamValid("extra_tag_vectors")) + { + auto & vectors = getParam>>("extra_tag_vectors"); + for (const auto nl_sys_num : index_range(vectors)) + for (auto & vector : vectors[nl_sys_num]) + { + auto tag = addVectorTag(vector); + _nl[nl_sys_num]->addVector(tag, false, GHOSTED); + } + } // add matrices and their tags - auto & matrices = getParam>>("extra_tag_matrices"); + if (isParamValid("extra_tag_matrices")) + { + auto & matrices = getParam>>("extra_tag_matrices"); for (const auto nl_sys_num : index_range(matrices)) for (auto & matrix : matrices[nl_sys_num]) { auto tag = addMatrixTag(matrix); _nl[nl_sys_num]->addMatrix(tag); } + } } void FEProblemBase::createTagSolutions() { - auto & vectors = getParam>("extra_tag_solutions"); - for (auto & vector : vectors) - { - auto tag = addVectorTag(vector, Moose::VECTOR_TAG_SOLUTION); - for (auto & nl : _nl) - nl->addVector(tag, false, GHOSTED); - _aux->addVector(tag, false, GHOSTED); - } + if (isParamValid("extra_tag_solutions")) + for (auto & vector : getParam>("extra_tag_solutions")) + { + auto tag = addVectorTag(vector, Moose::VECTOR_TAG_SOLUTION); + for (auto & nl : _nl) + nl->addVector(tag, false, GHOSTED); + _aux->addVector(tag, false, GHOSTED); + } if (getParam("previous_nl_solution_required")) { diff --git a/framework/src/problems/ReferenceResidualProblem.C b/framework/src/problems/ReferenceResidualProblem.C index f4a66e8b17d1..d5c6c36de28c 100644 --- a/framework/src/problems/ReferenceResidualProblem.C +++ b/framework/src/problems/ReferenceResidualProblem.C @@ -48,6 +48,7 @@ ReferenceResidualProblem::validParams() "provided, separated by semicolon)"); params.addParam>( "converge_on", + {}, "If supplied, use only these variables in the individual variable convergence check"); MooseEnum Lnorm("global_L2 local_L2 global_Linf local_Linf", "global_L2"); params.addParam( diff --git a/framework/src/scalarkernels/ParsedODEKernel.C b/framework/src/scalarkernels/ParsedODEKernel.C index f2c09291a633..4236a292e378 100644 --- a/framework/src/scalarkernels/ParsedODEKernel.C +++ b/framework/src/scalarkernels/ParsedODEKernel.C @@ -69,12 +69,15 @@ ParsedODEKernel::ParsedODEKernel(const InputParameters & parameters) } // add postprocessors - auto pp_names = getParam>("postprocessors"); - _pp.resize(pp_names.size()); - for (unsigned int i = 0; i < pp_names.size(); ++i) + if (isParamValid("postprocessors")) { - variables += "," + pp_names[i]; - _pp[i] = &getPostprocessorValueByName(pp_names[i]); + auto pp_names = getParam>("postprocessors"); + _pp.resize(pp_names.size()); + for (unsigned int i = 0; i < pp_names.size(); ++i) + { + variables += "," + pp_names[i]; + _pp[i] = &getPostprocessorValueByName(pp_names[i]); + } } // base function object @@ -84,9 +87,10 @@ ParsedODEKernel::ParsedODEKernel(const InputParameters & parameters) setParserFeatureFlags(_func_F); // add the constant expressions - addFParserConstants(_func_F, - getParam>("constant_names"), - getParam>("constant_expressions")); + if (isParamValid("constant_names") && isParamValid("constant_expressions")) + addFParserConstants(_func_F, + getParam>("constant_names"), + getParam>("constant_expressions")); // parse function if (_func_F->Parse(_function, variables) >= 0) diff --git a/framework/src/splits/Split.C b/framework/src/splits/Split.C index c1a6d6d8a63e..47dc75d12e13 100644 --- a/framework/src/splits/Split.C +++ b/framework/src/splits/Split.C @@ -23,15 +23,17 @@ Split::validParams() InputParameters params = MooseObject::validParams(); params.addClassDescription("Field split based preconditioner for nonlinear solver."); params.addParam>( - "vars", "Variables Split operates on (omitting this implies \"all variables\""); + "vars", {}, "Variables Split operates on (omitting this implies \"all variables\""); params.addParam>( - "blocks", "Mesh blocks Split operates on (omitting this implies \"all blocks\""); + "blocks", {}, "Mesh blocks Split operates on (omitting this implies \"all blocks\""); params.addParam>( - "sides", "Sidesets Split operates on (omitting this implies \"no sidesets\""); + "sides", {}, "Sidesets Split operates on (omitting this implies \"no sidesets\""); params.addParam>( - "unsides", "Sidesets Split excludes (omitting this implies \"do not exclude any sidesets\""); + "unsides", + {}, + "Sidesets Split excludes (omitting this implies \"do not exclude any sidesets\""); params.addParam>( - "splitting", "The names of the splits (subsystems) in the decomposition of this split"); + "splitting", {}, "The names of the splits (subsystems) in the decomposition of this split"); MooseEnum SplittingTypeEnum("additive multiplicative symmetric_multiplicative schur", "additive"); params.addParam("splitting_type", SplittingTypeEnum, "Split decomposition type"); diff --git a/framework/src/timesteppers/CompositionDT.C b/framework/src/timesteppers/CompositionDT.C index 1e6c0fddff7a..56a9360072c2 100644 --- a/framework/src/timesteppers/CompositionDT.C +++ b/framework/src/timesteppers/CompositionDT.C @@ -25,6 +25,7 @@ CompositionDT::compositionDTParams() params.addParam("initial_dt", "Initial value of dt"); params.addParam>( "lower_bound", + {}, "The maximum of these TimeSteppers will form the lower bound on the time " "step size. A single or multiple time steppers may be specified."); @@ -59,7 +60,8 @@ CompositionDT::CompositionDT(const InputParameters & parameters) if (std::find_if(time_steppers.begin(), time_steppers.end(), [&time_stepper_name](const auto & ts) - { return ts->name() == time_stepper_name; }) == time_steppers.end()) + { return ts->name() == time_stepper_name; }) == time_steppers.end() && + _lower_bound.size() != 0) paramError( "lower_bound", "Failed to find a timestepper with the name '", time_stepper_name, "'"); } diff --git a/framework/src/timesteppers/FunctionDT.C b/framework/src/timesteppers/FunctionDT.C index c81c2e29b5c4..3367e7ea8c6b 100644 --- a/framework/src/timesteppers/FunctionDT.C +++ b/framework/src/timesteppers/FunctionDT.C @@ -21,8 +21,8 @@ FunctionDT::validParams() // TODO: This will be required when time_t and time_dt is removed params.addParam( "function", "The name of the time-dependent function that prescribes the time step size."); - params.addParam>("time_t", "The values of t"); - params.addParam>("time_dt", "The values of dt"); + params.addParam>("time_t", {}, "The values of t"); + params.addParam>("time_dt", {}, "The values of dt"); params.addParam("growth_factor", std::numeric_limits::max(), "Maximum ratio of new to previous timestep sizes."); @@ -49,7 +49,7 @@ FunctionDT::FunctionDT(const InputParameters & parameters) _interpolate(getParam("interpolate")) { // TODO: remove this when `time_t` and `time_dt` is removed - if ((isParamValid("time_t") && isParamValid("time_dt")) && !isParamValid("function")) + if ((isParamSetByUser("time_t") && isParamSetByUser("time_dt")) && !isParamValid("function")) mooseDeprecated(name(), ": Using `time_t` and `time_dt` parameter is deprecated. Switch your input " "file to using `function` parameter.\n", @@ -59,7 +59,7 @@ FunctionDT::FunctionDT(const InputParameters & parameters) " 3. Copy `time_dt` parameter into your function and rename it to `y`.\n", " 4. Use the `function` parameter in your time stepper and pass your new " "function name into it.\n"); - else if ((isParamValid("time_t") && isParamValid("time_dt")) && isParamValid("function")) + else if ((isParamSetByUser("time_t") && isParamSetByUser("time_dt")) && isParamValid("function")) mooseError(name(), ": Using `time_t`, `_time_dt` and `function` at the same time. Use only `function`, " "`time_t` and _time_dt is deprecated."); @@ -68,7 +68,7 @@ FunctionDT::FunctionDT(const InputParameters & parameters) ": Please, specify a function (using the `function` parameter) that will prescribe " "the time step size."); - if (isParamValid("time_t") && isParamValid("time_dt")) + if (isParamSetByUser("time_t") && isParamSetByUser("time_dt")) { try { diff --git a/framework/src/timesteppers/IterationAdaptiveDT.C b/framework/src/timesteppers/IterationAdaptiveDT.C index c46c5485ae90..67adf237ec41 100644 --- a/framework/src/timesteppers/IterationAdaptiveDT.C +++ b/framework/src/timesteppers/IterationAdaptiveDT.C @@ -57,8 +57,8 @@ IterationAdaptiveDT::validParams() "Timestep to apply after time sync with function point. To be used in " "conjunction with 'force_step_every_function_point'."); params.addRequiredParam("dt", "The default timestep size between solves"); - params.addParam>("time_t", "The values of t"); - params.addParam>("time_dt", "The values of dt"); + params.addParam>("time_t", {}, "The values of t"); + params.addParam>("time_dt", {}, "The values of dt"); params.addParam("growth_factor", 2.0, "Factor to apply to timestep if easy convergence (if " diff --git a/framework/src/transfers/MultiAppConservativeTransfer.C b/framework/src/transfers/MultiAppConservativeTransfer.C index b29314697c8c..c69bbd2d8ff1 100644 --- a/framework/src/transfers/MultiAppConservativeTransfer.C +++ b/framework/src/transfers/MultiAppConservativeTransfer.C @@ -28,10 +28,12 @@ MultiAppConservativeTransfer::validParams() params.addParam>( "from_postprocessors_to_be_preserved", + {}, "The name of the Postprocessor in the from-app to evaluate an adjusting factor."); params.addParam>( "to_postprocessors_to_be_preserved", + {}, "The name of the Postprocessor in the to-app to evaluate an adjusting factor."); params.addParam("allow_skipped_adjustment", false, @@ -49,7 +51,7 @@ MultiAppConservativeTransfer::MultiAppConservativeTransfer(const InputParameters : MultiAppFieldTransfer(parameters), _from_var_names(getParam>("source_variable")), _to_var_names(getParam>("variable")), - _preserve_transfer(isParamValid("from_postprocessors_to_be_preserved")), + _preserve_transfer(isParamSetByUser("from_postprocessors_to_be_preserved")), _from_postprocessors_to_be_preserved( getParam>("from_postprocessors_to_be_preserved")), _to_postprocessors_to_be_preserved( diff --git a/framework/src/transfers/MultiAppDofCopyTransfer.C b/framework/src/transfers/MultiAppDofCopyTransfer.C index c96f7e945da2..d08bfadab8ea 100644 --- a/framework/src/transfers/MultiAppDofCopyTransfer.C +++ b/framework/src/transfers/MultiAppDofCopyTransfer.C @@ -75,14 +75,14 @@ MultiAppDofCopyTransfer::initialSetup() // Convert block names to block IDs, fill with all blocks if unspecified if (_has_block_restrictions) { - const auto & from_block_names = getParam>("from_blocks"); - for (const auto & b : from_block_names) - if (!MooseMeshUtils::hasSubdomainName(const_cast(from_problem->mesh().getMesh()), - b)) - paramError("from_blocks", "The block '", b, "' was not found in the mesh"); - - if (from_block_names.size()) + if (isParamValid("from_blocks")) { + const auto & from_block_names = getParam>("from_blocks"); + for (const auto & b : from_block_names) + if (!MooseMeshUtils::hasSubdomainName( + const_cast(from_problem->mesh().getMesh()), b)) + paramError("from_blocks", "The block '", b, "' was not found in the mesh"); + if (from_problem) { const auto block_vec = from_problem->mesh().getSubdomainIDs(from_block_names); @@ -95,14 +95,14 @@ MultiAppDofCopyTransfer::initialSetup() else _from_blocks = from_problem->mesh().meshSubdomains(); - const auto & to_block_names = getParam>("to_blocks"); - for (const auto & b : to_block_names) - if (!MooseMeshUtils::hasSubdomainName(const_cast(to_problem->mesh().getMesh()), - b)) - paramError("to_blocks", "The block '", b, "' was not found in the mesh"); - - if (to_block_names.size()) + if (isParamValid("to_blocks")) { + const auto & to_block_names = getParam>("to_blocks"); + for (const auto & b : to_block_names) + if (!MooseMeshUtils::hasSubdomainName(const_cast(to_problem->mesh().getMesh()), + b)) + paramError("to_blocks", "The block '", b, "' was not found in the mesh"); + if (to_problem) { const auto block_vec = to_problem->mesh().getSubdomainIDs(to_block_names); diff --git a/framework/src/transfers/MultiAppGeneralFieldUserObjectTransfer.C b/framework/src/transfers/MultiAppGeneralFieldUserObjectTransfer.C index d0eea9f3a3ac..c1fc3b3899ee 100644 --- a/framework/src/transfers/MultiAppGeneralFieldUserObjectTransfer.C +++ b/framework/src/transfers/MultiAppGeneralFieldUserObjectTransfer.C @@ -31,6 +31,7 @@ MultiAppGeneralFieldUserObjectTransfer::validParams() "Transfers user object spatial evaluations from an origin app onto a variable in the target " "application."); + params.set>("source_variable") = std::vector{}; params.suppressParameter>("source_variable"); params.addRequiredParam("source_user_object", "The UserObject you want to transfer values from. " diff --git a/framework/src/transfers/MultiAppGeometricInterpolationTransfer.C b/framework/src/transfers/MultiAppGeometricInterpolationTransfer.C index a61670cd9fc6..cb80c350b6ed 100644 --- a/framework/src/transfers/MultiAppGeometricInterpolationTransfer.C +++ b/framework/src/transfers/MultiAppGeometricInterpolationTransfer.C @@ -60,6 +60,7 @@ MultiAppGeometricInterpolationTransfer::validParams() params.addParam>( "exclude_gap_blocks", + {}, "Gap subdomains we want to exclude when constructing/using virtually translated points"); params.addParam("distance_tol", diff --git a/framework/src/transfers/MultiAppUserObjectTransfer.C b/framework/src/transfers/MultiAppUserObjectTransfer.C index b05a5a5bb578..7635482e2d49 100644 --- a/framework/src/transfers/MultiAppUserObjectTransfer.C +++ b/framework/src/transfers/MultiAppUserObjectTransfer.C @@ -35,6 +35,7 @@ MultiAppUserObjectTransfer::validParams() InputParameters params = MultiAppConservativeTransfer::validParams(); // MultiAppUserObjectTransfer does not need source variable since it query values from user // objects + params.set>("source_variable") = std::vector{}; params.suppressParameter>("source_variable"); params.addRequiredParam( "user_object", diff --git a/framework/src/userobjects/GeometryBase.C b/framework/src/userobjects/GeometryBase.C index 8dc475b928b9..f9c4b50e2058 100644 --- a/framework/src/userobjects/GeometryBase.C +++ b/framework/src/userobjects/GeometryBase.C @@ -18,9 +18,9 @@ GeometryBase::validParams() params.addClassDescription( "Snap refined nodes on a given boundary or block to a given geometry."); params.addParam>( - "boundary", "List of boundaries whose nodes are snapped to a given geometry"); + "boundary", {}, "List of boundaries whose nodes are snapped to a given geometry"); params.addParam>( - "block", "List of blocks whose nodes are snapped to a given geometry"); + "block", {}, "List of blocks whose nodes are snapped to a given geometry"); return params; } diff --git a/framework/src/utils/InputParameters.C b/framework/src/utils/InputParameters.C index c3f7cdcefca5..e12d84d39c0d 100644 --- a/framework/src/utils/InputParameters.C +++ b/framework/src/utils/InputParameters.C @@ -15,6 +15,7 @@ #include "MooseUtils.h" #include "MultiMooseEnum.h" #include "ExecFlagEnum.h" +#include "MooseObject.h" #include "libmesh/utility.h" #include "libmesh/simple_range.h" @@ -1189,7 +1190,8 @@ template <> const MooseEnum & InputParameters::getParamHelper(const std::string & name_in, const InputParameters & pars, - const MooseEnum *) + const MooseEnum *, + const MooseObject * /* = nullptr */) { const auto name = pars.checkForRename(name_in); return pars.get(name); @@ -1199,7 +1201,8 @@ template <> const MultiMooseEnum & InputParameters::getParamHelper(const std::string & name_in, const InputParameters & pars, - const MultiMooseEnum *) + const MultiMooseEnum *, + const MooseObject * /* = nullptr */) { const auto name = pars.checkForRename(name_in); return pars.get(name); @@ -1415,3 +1418,9 @@ InputParameters::paramAliases(const std::string & param_name) const return aliases; } + +void +InputParameters::callMooseErrorHelper(const MooseObject & object, const std::string & error) +{ + object.mooseError(error); +} diff --git a/modules/ray_tracing/src/raybcs/RayBoundaryConditionBase.C b/modules/ray_tracing/src/raybcs/RayBoundaryConditionBase.C index d81f2091e6eb..51ae3f785499 100644 --- a/modules/ray_tracing/src/raybcs/RayBoundaryConditionBase.C +++ b/modules/ray_tracing/src/raybcs/RayBoundaryConditionBase.C @@ -42,7 +42,7 @@ RayBoundaryConditionBase::RayBoundaryConditionBase(const InputParameters & param _current_bnd_id(_trace_ray.currentBoundaryID()) { // Add dependencies - if (params.isParamSetByUser("depends_on")) + if (params.isParamSetByUser("depends_on") && isParamValid("depends_on")) for (const auto & name : getParam>("depends_on")) dependsOn(name); } diff --git a/modules/ray_tracing/src/raykernels/RayKernelBase.C b/modules/ray_tracing/src/raykernels/RayKernelBase.C index bf3b3a14a904..6e7646c0be3d 100644 --- a/modules/ray_tracing/src/raykernels/RayKernelBase.C +++ b/modules/ray_tracing/src/raykernels/RayKernelBase.C @@ -49,7 +49,7 @@ RayKernelBase::RayKernelBase(const InputParameters & params) _need_segment_reinit(getParam("_need_segment_reinit")) { // Add dependencies - if (params.isParamSetByUser("depends_on")) + if (params.isParamSetByUser("depends_on") && isParamValid("depends_on")) for (const auto & name : getParam>("depends_on")) dependsOn(name); diff --git a/test/tests/meshgenerators/rename_block_generator/tests b/test/tests/meshgenerators/rename_block_generator/tests index a5267452035a..738b92e26d5d 100644 --- a/test/tests/meshgenerators/rename_block_generator/tests +++ b/test/tests/meshgenerators/rename_block_generator/tests @@ -96,90 +96,4 @@ detail = 'and when the provided old and new blocks are not the same length.' [] [] - - [deprecated] - requirement = 'The system shall be able to rename or renumber mesh blocks using old syntax by' - - [id] - type = JSONDiff - input = 'rename_block.i' - cli_args = '--allow-warnings - Mesh/rename/old_block_id="0 1 3 2" - Mesh/rename/new_block_id="1 2 4 3" - Outputs/file_base=deprecated_id' - jsondiff = 'deprecated_id.json' - - detail = 'identifying blocks by ID' - [] - [name] - type = JSONDiff - input = 'rename_block.i' - cli_args = '--allow-warnings - Mesh/rename/old_block_name="block0 block1" - Mesh/rename/new_block_name="foo bar" - Outputs/file_base=deprecated_name' - jsondiff = 'deprecated_name.json' - - detail = 'identifying blocks by name' - [] - [] - - [deprecated_errors] - requirement = 'The system shall report a reasonable error when renaming or renumbering blocks using deprecated syntax when' - - [old_block_id_and_name] - type = RunException - input = 'rename_block.i' - cli_args = 'Mesh/rename/old_block_id=0 - Mesh/rename/old_block_name=dummy' - expect_err = "old_block_id\):.*Cannot use in combination with 'old_block_name'. Please use 'old_block' instead; 'old_block_id' and 'old_block_name' are deprecated." - - detail = 'both old block IDs and old block names are provided' - [] - [new_block_id_and_name] - type = RunException - input = 'rename_block.i' - cli_args = 'Mesh/rename/new_block_id=0 - Mesh/rename/new_block_name=dummy' - expect_err = "new_block_id\):.*Cannot use in combination with 'new_block_name'. Please use 'new_block' instead; 'new_block_id' and 'new_block_name' are deprecated." - - detail = 'both new block IDs and new block names are provided' - [] - [old_block_and_id] - type = RunException - input = 'rename_block.i' - cli_args = 'Mesh/rename/old_block=0 - Mesh/rename/old_block_id=0' - expect_err = "old_block_id\):.*Cannot use with 'old_block'. Use only 'old_block'; 'old_block_id' is deprecated." - - detail = 'the deprecated syntax for old block id and the new syntax for old block is used' - [] - [old_block_and_name] - type = RunException - input = 'rename_block.i' - cli_args = 'Mesh/rename/old_block=0 - Mesh/rename/old_block_name=dummy' - expect_err = "old_block_name\):.*Cannot use with 'old_block'. Use only 'old_block'; 'old_block_name' is deprecated." - - detail = 'the deprecated syntax for old block name and the new syntax for old block is used' - [] - [new_block_and_id] - type = RunException - input = 'rename_block.i' - cli_args = 'Mesh/rename/new_block=0 - Mesh/rename/new_block_id=0' - expect_err = "new_block_id\):.*Cannot use with 'new_block'. Use only 'new_block'; 'new_block_id' is deprecated." - - detail = 'the deprecated syntax for new block id and the new syntax for new block is used' - [] - [new_block_and_name] - type = RunException - input = 'rename_block.i' - cli_args = 'Mesh/rename/new_block=0 - Mesh/rename/new_block_name=dummy' - expect_err = "new_block_name\):.*Cannot use with 'new_block'. Use only 'new_block'; 'new_block_name' is deprecated." - - detail = 'the deprecated syntax for new block name and the new syntax for new block is used' - [] - [] [] diff --git a/test/tests/transfers/general_field/user_object/duplicated_user_object_tests/restricted_elem_parent.i b/test/tests/transfers/general_field/user_object/duplicated_user_object_tests/restricted_elem_parent.i index 5cf429c9a9e0..b02943b1f8a6 100644 --- a/test/tests/transfers/general_field/user_object/duplicated_user_object_tests/restricted_elem_parent.i +++ b/test/tests/transfers/general_field/user_object/duplicated_user_object_tests/restricted_elem_parent.i @@ -42,7 +42,7 @@ num_layers = 2 type = ParsedAux variable = s use_xyzt = true - function = 'x+(z*z)' + expression = 'x+(z*z)' [] [] diff --git a/test/tests/transfers/general_field/user_object/duplicated_user_object_tests/restricted_elem_sub.i b/test/tests/transfers/general_field/user_object/duplicated_user_object_tests/restricted_elem_sub.i index c43d3d1c0809..8585f0373705 100644 --- a/test/tests/transfers/general_field/user_object/duplicated_user_object_tests/restricted_elem_sub.i +++ b/test/tests/transfers/general_field/user_object/duplicated_user_object_tests/restricted_elem_sub.i @@ -34,7 +34,7 @@ type = ParsedAux variable = A use_xyzt = true - function = '2*x+4*${yy}' + expression = '2*x+4*${yy}' execute_on = 'TIMESTEP_BEGIN' [] [] diff --git a/test/tests/transfers/general_field/user_object/duplicated_user_object_tests/restricted_node_parent.i b/test/tests/transfers/general_field/user_object/duplicated_user_object_tests/restricted_node_parent.i index acba4a48529d..e5d2fc617e44 100644 --- a/test/tests/transfers/general_field/user_object/duplicated_user_object_tests/restricted_node_parent.i +++ b/test/tests/transfers/general_field/user_object/duplicated_user_object_tests/restricted_node_parent.i @@ -42,7 +42,7 @@ num_layers = 2 type = ParsedAux variable = s use_xyzt = true - function = 'x+(z*z)' + expression = 'x+(z*z)' [] [] diff --git a/test/tests/transfers/general_field/user_object/duplicated_user_object_tests/restricted_node_sub.i b/test/tests/transfers/general_field/user_object/duplicated_user_object_tests/restricted_node_sub.i index 10c159ea6e9e..92fcc5fb8a09 100644 --- a/test/tests/transfers/general_field/user_object/duplicated_user_object_tests/restricted_node_sub.i +++ b/test/tests/transfers/general_field/user_object/duplicated_user_object_tests/restricted_node_sub.i @@ -30,7 +30,7 @@ type = ParsedAux variable = A use_xyzt = true - function = '2*x+4*${yy}' + expression = '2*x+4*${yy}' execute_on = 'TIMESTEP_BEGIN' [] [] diff --git a/test/tests/transfers/general_field/user_object/duplicated_user_object_tests/sub.i b/test/tests/transfers/general_field/user_object/duplicated_user_object_tests/sub.i index 9160d103981b..92baa8807a0c 100644 --- a/test/tests/transfers/general_field/user_object/duplicated_user_object_tests/sub.i +++ b/test/tests/transfers/general_field/user_object/duplicated_user_object_tests/sub.i @@ -24,7 +24,7 @@ [Functions] [./axial_force] type = ParsedFunction - value = 1000*y + expression = 1000*y [../] [] diff --git a/test/tests/transfers/multiapp_userobject_transfer/sub.i b/test/tests/transfers/multiapp_userobject_transfer/sub.i index e0c2773cda15..d9528c8ddbd7 100644 --- a/test/tests/transfers/multiapp_userobject_transfer/sub.i +++ b/test/tests/transfers/multiapp_userobject_transfer/sub.i @@ -5,6 +5,7 @@ ny = 8 xmax = 0.1 ymax = 0.5 + coord_type = rz [] [Variables] @@ -86,6 +87,5 @@ [] [Problem] - coord_type = rz type = FEProblem [] diff --git a/unit/src/InputParametersTest.C b/unit/src/InputParametersTest.C index 6df40eb13489..19364b7aadd4 100644 --- a/unit/src/InputParametersTest.C +++ b/unit/src/InputParametersTest.C @@ -530,3 +530,38 @@ TEST(InputParameters, transferParameters) EXPECT_EQ(p1.getDocString("od3a"), p2.getDocString("od3a")); EXPECT_EQ(p1.getDocString("od3b"), p2.getDocString("od3b")); } + +TEST(InputParameters, noDefaultValueError) +{ + InputParameters params = emptyInputParameters(); + params.addParam("dummy_real", "a dummy real"); + params.addParam>("dummy_vector", "a dummy vector"); + + // Throw an error message when no default value is provided + try + { + params.getParamHelper("dummy_real", params, static_cast(0)); + FAIL() << "failed to get the parameter because the default value is missing"; + } + catch (const std::exception & e) + { + std::string msg(e.what()); + ASSERT_TRUE(msg.find("The parameter \"dummy_real\" is being retrieved before being set.") != + std::string::npos) + << "Failed with unexpected error message: " << msg; + } + + try + { + params.getParamHelper>( + "dummy_vector", params, static_cast *>(0)); + FAIL() << "failed to get the parameter because the default value is missing"; + } + catch (const std::exception & e) + { + std::string msg(e.what()); + ASSERT_TRUE(msg.find("The parameter \"dummy_vector\" is being retrieved before being set.") != + std::string::npos) + << "Failed with unexpected error message: " << msg; + } +} From bc91153d100f05d4b927229bd793b8045150cccd Mon Sep 17 00:00:00 2001 From: MengnanLi91 <118846840+MengnanLi91@users.noreply.github.com> Date: Mon, 18 Sep 2023 14:25:44 -0600 Subject: [PATCH 2/5] Fix modules failed tests Add missing conductivity value to chemical_reactions failed tests Chemical_reaction and porous_flow module fix fix compiling error in chemical_reaction Use _pars in chemical reaction module Fix failed tests in reactor module and tensor_mechanics Fix coupledvalue in tensor_mechanics Add default value for "external_fields" --- framework/src/bcs/IntegratedBCBase.C | 2 ++ framework/src/bcs/NodalBCBase.C | 2 ++ framework/src/dgkernels/DGKernelBase.C | 2 ++ .../interfacekernels/InterfaceKernelBase.C | 2 ++ framework/src/kernels/KernelBase.C | 2 ++ framework/src/kernels/NodalScalarKernel.C | 2 +- .../ParsedElementDeletionGenerator.C | 5 +++-- framework/src/nodalkernels/ADNodalKernel.C | 4 ++-- .../src/nodalkernels/LowerBoundNodalKernel.C | 1 + framework/src/nodalkernels/NodalKernelBase.C | 2 ++ .../src/nodalkernels/UpperBoundNodalKernel.C | 2 +- framework/src/outputs/Output.C | 4 ++-- .../src/actions/AddCoupledEqSpeciesAction.C | 2 +- .../src/actions/ChemicalCompositionAction.C | 5 +++-- .../src/auxkernels/TotalConcentrationAux.C | 1 + .../src/kernels/CoupledBEEquilibriumSub.C | 4 ++-- .../kernels/CoupledConvectionReactionSub.C | 1 + .../src/kernels/CoupledDiffusionReactionSub.C | 4 ++-- .../aqueous_equilibrium/calcium_bicarbonate.i | 4 ++-- .../test/tests/aqueous_equilibrium/co2_h2o.i | 4 ++-- .../aqueous_equilibrium/water_dissociation.i | 4 ++-- .../solid_kinetics/calcite_dissolution.i | 4 ++-- .../solid_kinetics/calcite_precipitation.i | 4 ++-- modules/contact/src/actions/ContactAction.C | 2 ++ modules/contact/src/splits/ContactSplit.C | 2 ++ .../in_and_out/frictional_02_penalty_out.e | Bin 360012 -> 361224 bytes .../in_and_out/frictionless_kinematic_out.e | Bin 363820 -> 365116 bytes .../outputs/GeochemicalModelInterrogator.C | 4 ++++ .../userobjects/GeochemicalModelDefinition.C | 7 +++++- .../src/userobjects/GeochemistryKineticRate.C | 6 ++--- .../src/userobjects/GeochemistryReactorBase.C | 3 +++ .../userobjects/GeochemistrySpatialReactor.C | 6 +++++ .../GeochemistryTimeDependentReactor.C | 6 +++++ .../src/actions/MortarGapHeatTransferAction.C | 1 + .../src/actions/RadiationTransferAction.C | 9 +++++--- .../src/actions/ThermalContactAction.C | 2 +- .../dirackernels/GapHeatPointSourceMaster.C | 4 ++-- .../GrayLambertSurfaceRadiationBase.C | 7 +++--- modules/misc/misc.yaml | 9 ++++++++ modules/navier_stokes/src/actions/CNSAction.C | 2 +- modules/navier_stokes/src/actions/INSAction.C | 2 +- .../navier_stokes/src/actions/NSFVAction.C | 2 +- .../src/reporters/OptimizationData.C | 4 ++-- .../actions/GeneralizedPlaneStrainActionPD.C | 2 +- .../src/actions/MechanicsActionPD.C | 8 ++++--- .../src/kernels/MechanicsBaseNOSPD.C | 1 + .../kernels/MechanicsFiniteStrainBaseNOSPD.C | 1 + .../src/materials/ComputeStrainBaseNOSPD.C | 2 +- .../phase_field/src/actions/ConservedAction.C | 4 ++-- .../src/actions/DisplacementGradientsAction.C | 4 ++-- .../src/actions/EulerAngle2RGBAction.C | 4 ++-- .../src/actions/GrainGrowthAction.C | 4 ++-- .../src/actions/GrandPotentialKernelAction.C | 2 ++ .../actions/HHPFCRFFSplitVariablesAction.C | 4 ++-- .../src/actions/NonconservedAction.C | 4 ++-- .../src/actions/PFCRFFVariablesAction.C | 4 ++-- .../src/actions/PolycrystalColoringICAction.C | 4 ++-- .../src/actions/PolycrystalRandomICAction.C | 4 ++-- .../src/actions/PolycrystalVariablesAction.C | 4 ++-- .../actions/PolycrystalVoronoiVoidICAction.C | 4 ++-- .../actions/Tricrystal2CircleGrainsICAction.C | 4 ++-- .../doc/content/modules/porous_flow/ates.md | 6 ++--- modules/porous_flow/examples/ates/ates.i | 5 +---- .../include/actions/PorousFlowActionBase.h | 4 ++-- .../src/actions/PorousFlowActionBase.C | 10 +++++++-- .../src/actions/PorousFlowSinglePhaseBase.C | 4 +++- .../src/materials/PorousFlowMassFraction.C | 3 ++- .../src/postprocessors/PorousFlowFluidMass.C | 1 + .../src/postprocessors/PorousFlowHeatEnergy.C | 2 +- .../src/raykernels/LineSourceRayKernel.C | 6 +++-- .../AzimuthalBlockSplitGenerator.C | 1 + .../meshgenerators/FlexiblePatternGenerator.C | 3 ++- modules/richards/src/actions/Q2PAction.C | 2 ++ .../src/reporters/MorrisReporter.C | 2 +- .../src/reporters/SobolReporter.C | 2 +- .../src/reporters/StatisticsReporter.C | 2 +- .../ActiveLearningGaussianProcess.C | 4 ++-- .../src/trainers/GaussianProcessTrainer.C | 4 +++- .../src/actions/CavityPressureAction.C | 2 +- .../src/actions/CohesiveZoneActionBase.C | 8 +++---- .../src/actions/CoupledPressureAction.C | 13 ++++++----- .../src/actions/DomainIntegralAction.C | 8 ++++--- .../src/actions/GlobalStrainAction.C | 5 +++-- .../actions/InclinedNoDisplacementBCAction.C | 3 ++- .../src/actions/LineElementAction.C | 8 ++++--- .../actions/MaterialVectorBodyForceAction.C | 5 +++-- .../src/actions/PressureAction.C | 12 +++++----- .../src/actions/TensorMechanicsAction.C | 2 ++ .../src/actions/TensorMechanicsActionBase.C | 8 +++---- .../src/dampers/ElementJacobianDamper.C | 4 ++-- .../kernels/GeneralizedPlaneStrainOffDiag.C | 2 +- .../src/kernels/StressDivergenceTensors.C | 1 + .../src/kernels/WeakPlaneStress.C | 1 + .../LagrangianStressDivergenceBase.C | 1 + .../ADComputeSmearedCrackingStress.C | 1 + .../src/materials/ADComputeStrainBase.C | 2 +- .../ADComputeStrainIncrementBasedStress.C | 2 +- .../materials/ComputeIncrementalBeamStrain.C | 4 +++- .../materials/ComputeSmearedCrackingStress.C | 1 + .../src/materials/ComputeStrainBase.C | 2 +- .../ComputeStrainIncrementBasedStress.C | 2 +- .../src/materials/HillConstants.C | 1 + .../src/materials/ThermalFractureIntegral.C | 2 +- .../src/materials/abaqus/AbaqusUMATStress.C | 8 ++++--- .../ComputeMultipleCrystalPlasticityStress.C | 4 ++-- .../FiniteStrainCrystalPlasticity.C | 6 ++--- .../lagrangian/ComputeLagrangianStrainBase.C | 5 +++-- .../src/userobjects/AbaqusUserElement.C | 1 + .../src/userobjects/CrackFrontDefinition.C | 12 +++++----- ...ystalPlasticityStateVarRateComponentVoce.C | 1 + .../CrystalPlasticityStateVariable.C | 2 ++ .../kernels/LagrangianStressDivergenceBaseS.C | 1 + .../notched_plastic_block/biaxial_planar.i | 6 ++--- .../gold/biaxial_planar_out.csv | 6 +++-- .../src/components/Component2D.C | 2 +- .../src/components/GeneratedMeshComponent.C | 4 ++-- .../src/components/HeatStructureBase.C | 2 +- .../src/components/HeatStructureCylindrical.C | 5 +++-- .../src/components/HeatStructurePlate.C | 6 ++--- .../ShaftConnectedCompressor1Phase.C | 1 + .../src/components/ShaftConnectedPump1Phase.C | 1 + .../components/ShaftConnectedTurbine1Phase.C | 1 + .../userobjects/ADFlowJunctionUserObject.C | 2 +- .../src/actions/JacobianTestGeneralAction.C | 5 +++-- .../test/src/actions/TestAction.C | 21 +++++++++--------- modules/xfem/src/actions/XFEMAction.C | 2 ++ .../nodalkernels/ADLowerBoundNodalKernel.C | 2 +- .../nodalkernels/ADUpperBoundNodalKernel.C | 1 + 128 files changed, 297 insertions(+), 180 deletions(-) create mode 100644 modules/misc/misc.yaml diff --git a/framework/src/bcs/IntegratedBCBase.C b/framework/src/bcs/IntegratedBCBase.C index f3c1da437e3e..dc2b959be93a 100644 --- a/framework/src/bcs/IntegratedBCBase.C +++ b/framework/src/bcs/IntegratedBCBase.C @@ -18,11 +18,13 @@ IntegratedBCBase::validParams() params.addParam>( "save_in", + {}, "The name of auxiliary variables to save this BC's residual contributions to. " "Everything about that variable must match everything about this variable (the " "type, what blocks it's on, etc.)"); params.addParam>( "diag_save_in", + {}, "The name of auxiliary variables to save this BC's diagonal jacobian " "contributions to. Everything about that variable must match everything " "about this variable (the type, what blocks it's on, etc.)"); diff --git a/framework/src/bcs/NodalBCBase.C b/framework/src/bcs/NodalBCBase.C index 8555d4dc81f1..f733911b8e7c 100644 --- a/framework/src/bcs/NodalBCBase.C +++ b/framework/src/bcs/NodalBCBase.C @@ -15,11 +15,13 @@ NodalBCBase::validParams() InputParameters params = BoundaryCondition::validParams(); params.addParam>( "save_in", + {}, "The name of auxiliary variables to save this BC's residual contributions to. " "Everything about that variable must match everything about this variable (the " "type, what blocks it's on, etc.)"); params.addParam>( "diag_save_in", + {}, "The name of auxiliary variables to save this BC's diagonal jacobian " "contributions to. Everything about that variable must match everything " "about this variable (the type, what blocks it's on, etc.)"); diff --git a/framework/src/dgkernels/DGKernelBase.C b/framework/src/dgkernels/DGKernelBase.C index a0b4c820dbf5..17e2aa7585bc 100644 --- a/framework/src/dgkernels/DGKernelBase.C +++ b/framework/src/dgkernels/DGKernelBase.C @@ -40,11 +40,13 @@ DGKernelBase::validParams() params.addParam>( "save_in", + {}, "The name of auxiliary variables to save this Kernel's residual contributions to. " " Everything about that variable must match everything about this variable (the " "type, what blocks it's on, etc.)"); params.addParam>( "diag_save_in", + {}, "The name of auxiliary variables to save this Kernel's diagonal Jacobian " "contributions to. Everything about that variable must match everything " "about this variable (the type, what blocks it's on, etc.)"); diff --git a/framework/src/interfacekernels/InterfaceKernelBase.C b/framework/src/interfacekernels/InterfaceKernelBase.C index 8a80489d4373..ca23e42ee9de 100644 --- a/framework/src/interfacekernels/InterfaceKernelBase.C +++ b/framework/src/interfacekernels/InterfaceKernelBase.C @@ -37,11 +37,13 @@ InterfaceKernelBase::validParams() params.set("_moose_base") = "InterfaceKernel"; params.addParam>( "save_in", + {}, "The name of auxiliary variables to save this Kernel's residual contributions to. " " Everything about that variable must match everything about this variable (the " "type, what blocks it's on, etc.)"); params.addParam>( "diag_save_in", + {}, "The name of auxiliary variables to save this Kernel's diagonal Jacobian " "contributions to. Everything about that variable must match everything " "about this variable (the type, what blocks it's on, etc.)"); diff --git a/framework/src/kernels/KernelBase.C b/framework/src/kernels/KernelBase.C index e6d68bdf5584..ab336a3f0d00 100644 --- a/framework/src/kernels/KernelBase.C +++ b/framework/src/kernels/KernelBase.C @@ -26,11 +26,13 @@ KernelBase::validParams() params.addParam>( "save_in", + {}, "The name of auxiliary variables to save this Kernel's residual contributions to. " " Everything about that variable must match everything about this variable (the " "type, what blocks it's on, etc.)"); params.addParam>( "diag_save_in", + {}, "The name of auxiliary variables to save this Kernel's diagonal Jacobian " "contributions to. Everything about that variable must match everything " "about this variable (the type, what blocks it's on, etc.)"); diff --git a/framework/src/kernels/NodalScalarKernel.C b/framework/src/kernels/NodalScalarKernel.C index a1e3b28ae5cd..4eabe3cc4c15 100644 --- a/framework/src/kernels/NodalScalarKernel.C +++ b/framework/src/kernels/NodalScalarKernel.C @@ -21,7 +21,7 @@ NodalScalarKernel::validParams() InputParameters params = ScalarKernel::validParams(); params.addParam>("nodes", {}, "Supply nodes using node ids"); params.addParam>( - "boundary", "The list of boundary IDs from the mesh where this nodal kernel applies"); + "boundary", {}, "The list of boundary IDs from the mesh where this nodal kernel applies"); return params; } diff --git a/framework/src/meshgenerators/ParsedElementDeletionGenerator.C b/framework/src/meshgenerators/ParsedElementDeletionGenerator.C index c101ec45aeae..08057863299f 100644 --- a/framework/src/meshgenerators/ParsedElementDeletionGenerator.C +++ b/framework/src/meshgenerators/ParsedElementDeletionGenerator.C @@ -24,10 +24,11 @@ ParsedElementDeletionGenerator::validParams() "(must be 'volume' in the expression) and the element id ('id' in the expression)."); params.addRequiredParam( "expression", "Expression to evaluate to decide whether an element should be deleted"); - params.addParam>("constant_names", - "Vector of constants used in the parsed function"); + params.addParam>( + "constant_names", {}, "Vector of constants used in the parsed function"); params.addParam>( "constant_expressions", + {}, "Vector of values for the constants in constant_names (can be an FParser expression)"); return params; } diff --git a/framework/src/nodalkernels/ADNodalKernel.C b/framework/src/nodalkernels/ADNodalKernel.C index a4a582c0da96..4225b3fba71e 100644 --- a/framework/src/nodalkernels/ADNodalKernel.C +++ b/framework/src/nodalkernels/ADNodalKernel.C @@ -25,10 +25,10 @@ ADNodalKernel::validParams() ADNodalKernel::ADNodalKernel(const InputParameters & parameters) : NodalKernelBase(parameters), _u(_var.adDofValues()) { - if (isParamValid("save_in")) + if (isParamSetByUser("save_in")) paramError("save_in", "ADNodalKernels do not support save_in. Please use the tagging system instead."); - if (isParamValid("diag_save_in")) + if (isParamSetByUser("diag_save_in")) paramError( "diag_save_in", "ADNodalKernels do not support diag_save_in. Please use the tagging system instead."); diff --git a/framework/src/nodalkernels/LowerBoundNodalKernel.C b/framework/src/nodalkernels/LowerBoundNodalKernel.C index d25a911c37e4..d4a369f9a48a 100644 --- a/framework/src/nodalkernels/LowerBoundNodalKernel.C +++ b/framework/src/nodalkernels/LowerBoundNodalKernel.C @@ -21,6 +21,7 @@ LowerBoundNodalKernel::validParams() params.addParam("lower_bound", 0, "The lower bound on the coupled variable"); params.addParam>( "exclude_boundaries", + {}, "Boundaries on which not to execute the NodalKernel. This can be useful for avoiding " "singuarility in the matrix in case a constraint is active in the same place that a " "DirichletBC is set"); diff --git a/framework/src/nodalkernels/NodalKernelBase.C b/framework/src/nodalkernels/NodalKernelBase.C index 5f5c3902a67b..9fde4e57df87 100644 --- a/framework/src/nodalkernels/NodalKernelBase.C +++ b/framework/src/nodalkernels/NodalKernelBase.C @@ -30,11 +30,13 @@ NodalKernelBase::validParams() params.addParamNamesToGroup("use_displaced_mesh", "Advanced"); params.addParam>( "save_in", + {}, "The name of auxiliary variables to save this BC's residual contributions to. " "Everything about that variable must match everything about this variable (the " "type, what blocks it's on, etc.)"); params.addParam>( "diag_save_in", + {}, "The name of auxiliary variables to save this BC's diagonal jacobian " "contributions to. Everything about that variable must match everything " "about this variable (the type, what blocks it's on, etc.)"); diff --git a/framework/src/nodalkernels/UpperBoundNodalKernel.C b/framework/src/nodalkernels/UpperBoundNodalKernel.C index e8f67610fccf..1e9d96990e16 100644 --- a/framework/src/nodalkernels/UpperBoundNodalKernel.C +++ b/framework/src/nodalkernels/UpperBoundNodalKernel.C @@ -20,7 +20,7 @@ UpperBoundNodalKernel::validParams() "v", "The coupled variable we require to be greater than the upper bound"); params.addParam("upper_bound", 0, "The upper bound on the coupled variable"); params.addParam>( - "exclude_boundaries", + "exclude_boundaries", {}, "Boundaries on which not to execute the NodalKernel. This can be useful for avoiding " "singuarility in the matrix in case a constraint is active in the same place that a " "DirichletBC is set"); diff --git a/framework/src/outputs/Output.C b/framework/src/outputs/Output.C index 489f938bafc6..ed8999f1c455 100644 --- a/framework/src/outputs/Output.C +++ b/framework/src/outputs/Output.C @@ -44,8 +44,8 @@ Output::validParams() "interval", 1, "The interval at which time steps are output to the solution file"); params.addParam( "minimum_time_interval", 0.0, "The minimum simulation time between output steps"); - params.addParam>("sync_times", - "Times at which the output and solution is forced to occur"); + params.addParam>( + "sync_times", {}, "Times at which the output and solution is forced to occur"); params.addParam( "sync_times_object", "Times object providing the times at which the output and solution is forced to occur"); diff --git a/modules/chemical_reactions/src/actions/AddCoupledEqSpeciesAction.C b/modules/chemical_reactions/src/actions/AddCoupledEqSpeciesAction.C index f05765e59a16..6ec0cfb3fd9a 100644 --- a/modules/chemical_reactions/src/actions/AddCoupledEqSpeciesAction.C +++ b/modules/chemical_reactions/src/actions/AddCoupledEqSpeciesAction.C @@ -31,7 +31,7 @@ AddCoupledEqSpeciesAction::validParams() params.addParam>( "secondary_species", "The list of aqueous equilibrium species to be output as aux variables"); params.addParam("reactions", "The list of aqueous equilibrium reactions"); - params.addParam>("pressure", "Pressure variable"); + params.addParam>("pressure", {}, "Pressure variable"); RealVectorValue g(0, 0, 0); params.addParam("gravity", g, "Gravity vector (default is (0, 0, 0))"); params.addClassDescription("Adds coupled equilibrium Kernels and AuxKernels for primary species"); diff --git a/modules/chemical_reactions/src/actions/ChemicalCompositionAction.C b/modules/chemical_reactions/src/actions/ChemicalCompositionAction.C index 36f46d8d3aec..3c76a6541a58 100644 --- a/modules/chemical_reactions/src/actions/ChemicalCompositionAction.C +++ b/modules/chemical_reactions/src/actions/ChemicalCompositionAction.C @@ -76,6 +76,7 @@ ChemicalCompositionAction::validParams() "List of gas phase species for which vapor pressures are requested"); params.addParam>( "output_element_phases", + {}, "List of elements whose molar amounts in specific phases are requested"); params.addParam( "uo_name", "Thermochimica", "Name of the ThermochimicaDataUserObject."); @@ -350,7 +351,7 @@ ChemicalCompositionAction::ChemicalCompositionAction(const InputParameters & par } } - if (isParamValid("output_element_phases")) + if (_pars.isParamSetByUser("output_element_phases")) { auto phases = Thermochimica::getPhaseNamesSystem(); if (_element_phases.size() == 1 && _element_phases[0] == "ALL") @@ -489,7 +490,7 @@ ChemicalCompositionAction::act() _vapor_pressures.begin(), _vapor_pressures.end()); - if (isParamValid("output_element_phases")) + if (_pars.isParamSetByUser("output_element_phases")) uo_params.set>("output_element_phases") .insert(uo_params.set>("output_element_phases").end(), _element_phases.begin(), diff --git a/modules/chemical_reactions/src/auxkernels/TotalConcentrationAux.C b/modules/chemical_reactions/src/auxkernels/TotalConcentrationAux.C index 1d27f9fcf0e2..7324b764855d 100644 --- a/modules/chemical_reactions/src/auxkernels/TotalConcentrationAux.C +++ b/modules/chemical_reactions/src/auxkernels/TotalConcentrationAux.C @@ -18,6 +18,7 @@ TotalConcentrationAux::validParams() params.addCoupledVar("primary_species", "Primary species free concentration"); params.addParam>( "sto_v", + {}, "The stoichiometric coefficient of primary species in secondary equilibrium species"); params.addCoupledVar("v", "Secondary equilibrium species in which the primary species is involved"); diff --git a/modules/chemical_reactions/src/kernels/CoupledBEEquilibriumSub.C b/modules/chemical_reactions/src/kernels/CoupledBEEquilibriumSub.C index 285b4e5300ac..c87bef1f4494 100644 --- a/modules/chemical_reactions/src/kernels/CoupledBEEquilibriumSub.C +++ b/modules/chemical_reactions/src/kernels/CoupledBEEquilibriumSub.C @@ -24,8 +24,8 @@ CoupledBEEquilibriumSub::validParams() "The stoichiometric coefficient of the primary species this kernel operates on"); params.addCoupledVar( "gamma_u", 1.0, "Activity coefficient of primary species that this kernel operates on"); - params.addParam>("sto_v", - "The stoichiometric coefficients of coupled primary species"); + params.addParam>( + "sto_v", {}, "The stoichiometric coefficients of coupled primary species"); params.addCoupledVar("gamma_v", 1.0, "Activity coefficients of coupled primary species"); params.addCoupledVar("gamma_eq", 1.0, "Activity coefficient of this equilibrium species"); params.addCoupledVar("v", "Coupled primary species constituting the equilibrium species"); diff --git a/modules/chemical_reactions/src/kernels/CoupledConvectionReactionSub.C b/modules/chemical_reactions/src/kernels/CoupledConvectionReactionSub.C index 5482bc5a0d93..639bee587886 100644 --- a/modules/chemical_reactions/src/kernels/CoupledConvectionReactionSub.C +++ b/modules/chemical_reactions/src/kernels/CoupledConvectionReactionSub.C @@ -25,6 +25,7 @@ CoupledConvectionReactionSub::validParams() "gamma_u", 1.0, "Activity coefficient of primary species that this kernel operates on"); params.addParam>( "sto_v", + {}, "The stoichiometric coefficients of coupled primary species in equilibrium reaction"); params.addRequiredCoupledVar("p", "Pressure"); params.addCoupledVar("v", "List of coupled primary species"); diff --git a/modules/chemical_reactions/src/kernels/CoupledDiffusionReactionSub.C b/modules/chemical_reactions/src/kernels/CoupledDiffusionReactionSub.C index 157740ad7ef2..3a0dc64ca7fb 100644 --- a/modules/chemical_reactions/src/kernels/CoupledDiffusionReactionSub.C +++ b/modules/chemical_reactions/src/kernels/CoupledDiffusionReactionSub.C @@ -27,8 +27,8 @@ CoupledDiffusionReactionSub::validParams() "operates on in the equilibrium reaction"); params.addCoupledVar( "gamma_u", 1.0, "Activity coefficient of primary species that this kernel operates on"); - params.addParam>("sto_v", - "The stoichiometric coefficients of coupled primary species"); + params.addParam>( + "sto_v", {}, "The stoichiometric coefficients of coupled primary species"); params.addCoupledVar("v", "List of coupled primary species in this equilibrium species"); params.addCoupledVar("gamma_v", 1.0, "Activity coefficients of coupled primary species"); params.addCoupledVar("gamma_eq", 1.0, "Activity coefficient of this equilibrium species"); diff --git a/modules/chemical_reactions/test/tests/aqueous_equilibrium/calcium_bicarbonate.i b/modules/chemical_reactions/test/tests/aqueous_equilibrium/calcium_bicarbonate.i index 3de642865083..7daee54e45b4 100644 --- a/modules/chemical_reactions/test/tests/aqueous_equilibrium/calcium_bicarbonate.i +++ b/modules/chemical_reactions/test/tests/aqueous_equilibrium/calcium_bicarbonate.i @@ -100,8 +100,8 @@ [Materials] [./porous] type = GenericConstantMaterial - prop_names = 'diffusivity porosity' - prop_values = '1e-7 0.25' + prop_names = 'diffusivity porosity conductivity' + prop_values = '1e-7 0.25 1.0' [../] [] diff --git a/modules/chemical_reactions/test/tests/aqueous_equilibrium/co2_h2o.i b/modules/chemical_reactions/test/tests/aqueous_equilibrium/co2_h2o.i index e078732484fd..2f0cd3f1b9f3 100644 --- a/modules/chemical_reactions/test/tests/aqueous_equilibrium/co2_h2o.i +++ b/modules/chemical_reactions/test/tests/aqueous_equilibrium/co2_h2o.i @@ -77,8 +77,8 @@ [Materials] [./porous] type = GenericConstantMaterial - prop_names = 'diffusivity porosity' - prop_values = '1e-7 0.25' + prop_names = 'diffusivity porosity conductivity' + prop_values = '1e-7 0.25 1.0' [../] [] diff --git a/modules/chemical_reactions/test/tests/aqueous_equilibrium/water_dissociation.i b/modules/chemical_reactions/test/tests/aqueous_equilibrium/water_dissociation.i index 146b7a6f3a0a..05e8c3839557 100644 --- a/modules/chemical_reactions/test/tests/aqueous_equilibrium/water_dissociation.i +++ b/modules/chemical_reactions/test/tests/aqueous_equilibrium/water_dissociation.i @@ -55,8 +55,8 @@ [Materials] [./porous] type = GenericConstantMaterial - prop_names = 'diffusivity porosity' - prop_values = '1e-7 0.25' + prop_names = 'diffusivity porosity conductivity' + prop_values = '1e-7 0.25 1.0' [../] [] diff --git a/modules/chemical_reactions/test/tests/solid_kinetics/calcite_dissolution.i b/modules/chemical_reactions/test/tests/solid_kinetics/calcite_dissolution.i index 875d62de0252..885195ba06be 100644 --- a/modules/chemical_reactions/test/tests/solid_kinetics/calcite_dissolution.i +++ b/modules/chemical_reactions/test/tests/solid_kinetics/calcite_dissolution.i @@ -92,8 +92,8 @@ [Materials] [./porous] type = GenericConstantMaterial - prop_names = 'porosity diffusivity' - prop_values = '0.25 1e-9' + prop_names = 'porosity diffusivity conductivity' + prop_values = '0.25 1e-9 1.0' [../] [] diff --git a/modules/chemical_reactions/test/tests/solid_kinetics/calcite_precipitation.i b/modules/chemical_reactions/test/tests/solid_kinetics/calcite_precipitation.i index 1ce5a69835bb..b4eb64208606 100644 --- a/modules/chemical_reactions/test/tests/solid_kinetics/calcite_precipitation.i +++ b/modules/chemical_reactions/test/tests/solid_kinetics/calcite_precipitation.i @@ -91,8 +91,8 @@ [Materials] [./porous] type = GenericConstantMaterial - prop_names = 'porosity diffusivity' - prop_values = '0.25 1e-9' + prop_names = 'porosity diffusivity conductivity' + prop_values = '0.25 1e-9 1.0' [../] [] diff --git a/modules/contact/src/actions/ContactAction.C b/modules/contact/src/actions/ContactAction.C index e666a7a30a78..19ca481a3192 100644 --- a/modules/contact/src/actions/ContactAction.C +++ b/modules/contact/src/actions/ContactAction.C @@ -80,6 +80,7 @@ ContactAction::validParams() "secondary", "The list of boundary IDs referring to secondary sidesets"); params.addParam>( "automatic_pairing_boundaries", + {}, "List of boundary IDs for sidesets that are automatically paired with any other boundary in " "this list having a centroid-to-centroid distance less than the value specified in the " "'automatic_pairing_distance' parameter. "); @@ -103,6 +104,7 @@ ContactAction::validParams() "Offset to gap distance mapped from primary side"); params.addParam>( "displacements", + {}, "The displacements appropriate for the simulation geometry and coordinate system"); params.addParam( "penalty", diff --git a/modules/contact/src/splits/ContactSplit.C b/modules/contact/src/splits/ContactSplit.C index 2d88cd6ea885..549e6c90ec2c 100644 --- a/modules/contact/src/splits/ContactSplit.C +++ b/modules/contact/src/splits/ContactSplit.C @@ -24,6 +24,7 @@ ContactSplit::validParams() "Secondary surface list for included contacts"); params.addParam>( "contact_displaced", + {}, "List of indicators whether displaced mesh is used to define included contact"); params.addParam>("uncontact_primary", "Primary surface list for excluded contacts"); @@ -31,6 +32,7 @@ ContactSplit::validParams() "Secondary surface list for excluded contacts"); params.addParam>( "uncontact_displaced", + {}, "List of indicators whether displaced mesh is used to define excluded contact"); params.addRequiredParam("include_all_contact_nodes", "Whether to include all nodes on the contact surfaces"); diff --git a/modules/contact/test/tests/sliding_block/in_and_out/frictional_02_penalty_out.e b/modules/contact/test/tests/sliding_block/in_and_out/frictional_02_penalty_out.e index aea1f2e879e3f32e89c51d452a72ca6cf7036b0f..a54253ea83893e7a725ae5c42caa72714fe1a646 100644 GIT binary patch delta 38998 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 z

OA!*8b7C*;i8z-mkSD^mgYhDE8{zlq4Vx| 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 delta 38726 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 delta 38863 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 diff --git a/modules/geochemistry/src/outputs/GeochemicalModelInterrogator.C b/modules/geochemistry/src/outputs/GeochemicalModelInterrogator.C index 623ea6755d0b..fa849e8dbf8b 100644 --- a/modules/geochemistry/src/outputs/GeochemicalModelInterrogator.C +++ b/modules/geochemistry/src/outputs/GeochemicalModelInterrogator.C @@ -22,6 +22,7 @@ GeochemicalModelInterrogator::sharedParams() "The name of the GeochemicalModelDefinition user object"); params.addParam>( "swap_out_of_basis", + {}, "Species that should be removed from the model_definition's basis and be replaced with the " "swap_into_basis species. There must be the same number of species in swap_out_of_basis and " "swap_into_basis. If this list contains more than one species, the swapping is performed " @@ -29,14 +30,17 @@ GeochemicalModelInterrogator::sharedParams() "then the next pair, etc"); params.addParam>( "swap_into_basis", + {}, "Species that should be removed from the model_definition's " "equilibrium species list and added to the basis"); params.addParam>( "activity_species", + {}, "Species that are provided numerical values of activity (or fugacity for gases) in the " "activity_value input"); params.addParam>( "activity_values", + {}, "Numerical values for the activity (or fugacity) for the " "species in the activity_species list. These are activity values, not log10(activity)."); params.addParam( diff --git a/modules/geochemistry/src/userobjects/GeochemicalModelDefinition.C b/modules/geochemistry/src/userobjects/GeochemicalModelDefinition.C index b160bed7d126..cccf08428e1f 100644 --- a/modules/geochemistry/src/userobjects/GeochemicalModelDefinition.C +++ b/modules/geochemistry/src/userobjects/GeochemicalModelDefinition.C @@ -39,28 +39,32 @@ GeochemicalModelDefinition::validParams() "database, the sorbing sites (if any) and the decoupled redox states that are in " "disequilibrium (if any)."); params.addParam>( - "equilibrium_minerals", + "equilibrium_minerals", {}, "A list of minerals that are in equilibrium with the aqueous solution. All members of this " "list must be in the 'minerals' section of the database file"); params.addParam>( "equilibrium_gases", + {}, "A list of gases that are in equilibrium with the aqueous solution and can have their " "fugacities fixed, at least for some time and spatial location. All members of this list " "must be in the 'gas' section of the database file"); params.addParam>( "kinetic_minerals", + {}, "A list of minerals whose dynamics are governed by a rate law. These are not in equilibrium " "with the aqueous solution. All members of this list must be in the 'minerals' section of " "the database " "file."); params.addParam>( "kinetic_redox", + {}, "A list alternative oxidation states (eg Fe+++) whose dynamics are governed by a rate law. " "These are not in equilibrium with the aqueous solution. All members of this list must be " "in the " "'redox couples' section of the database file."); params.addParam>( "kinetic_surface_species", + {}, "A list surface sorbing species whose dynamics are governed by a rate law. These are not in " "equilibrium with the aqueous solution. All members of this list must be in the 'surface " "species' section of the database file."); @@ -80,6 +84,7 @@ GeochemicalModelDefinition::validParams() "redox_electron is an equilibrium species"); params.addParam>( "kinetic_rate_descriptions", + {}, "A list of GeochemistryKineticRate UserObject names that define the kinetic rates. If a " "kinetic species has no rate prescribed to it, its reaction rate will be zero"); params.addParam( diff --git a/modules/geochemistry/src/userobjects/GeochemistryKineticRate.C b/modules/geochemistry/src/userobjects/GeochemistryKineticRate.C index 2fc44d7f4b89..80b85577c228 100644 --- a/modules/geochemistry/src/userobjects/GeochemistryKineticRate.C +++ b/modules/geochemistry/src/userobjects/GeochemistryKineticRate.C @@ -46,9 +46,9 @@ GeochemistryKineticRate::validParams() "The rate is multiplied by kinetic_species_molality^kinetic_molal_index / " "(kinetic_species_molality^kinetic_molal_index + " "kinetic_half_saturation^kinetic_molal_index)^kinetic_monod_index"); - params.addParam>("promoting_species_names", - "Names of any promoting species"); - params.addParam>("promoting_indices", "Indices of the promoting species"); + params.addParam>( + "promoting_species_names", {}, "Names of any promoting species"); + params.addParam>("promoting_indices", {}, "Indices of the promoting species"); params.addParam>( "promoting_monod_indices", "Indices of the monod denominators of the promoting species. If not given, then the default " diff --git a/modules/geochemistry/src/userobjects/GeochemistryReactorBase.C b/modules/geochemistry/src/userobjects/GeochemistryReactorBase.C index 53ea3345ca0c..14ef528a67f6 100644 --- a/modules/geochemistry/src/userobjects/GeochemistryReactorBase.C +++ b/modules/geochemistry/src/userobjects/GeochemistryReactorBase.C @@ -15,10 +15,12 @@ GeochemistryReactorBase::sharedParams() InputParameters params = emptyInputParameters(); params.addParam>( "swap_out_of_basis", + {}, "Species that should be removed from the model_definition's basis and be replaced with the " "swap_into_basis species"); params.addParam>( "swap_into_basis", + {}, "Species that should be removed from the model_definition's equilibrium species list and " "added to the basis. There must be the same number of species in swap_out_of_basis and " "swap_into_basis. These swaps are performed before any other computations during the " @@ -83,6 +85,7 @@ GeochemistryReactorBase::sharedParams() "must be provided with a bulk_composition constraint_meaning."); params.addParam>( "prevent_precipitation", + {}, "Mineral species in this list will be prevented from precipitating, irrespective of their " "saturation index (unless they are initially in the basis)"); params.addParam( diff --git a/modules/geochemistry/src/userobjects/GeochemistrySpatialReactor.C b/modules/geochemistry/src/userobjects/GeochemistrySpatialReactor.C index dacc3e2a7971..e0068ef83c7b 100644 --- a/modules/geochemistry/src/userobjects/GeochemistrySpatialReactor.C +++ b/modules/geochemistry/src/userobjects/GeochemistrySpatialReactor.C @@ -33,15 +33,18 @@ GeochemistrySpatialReactor::sharedParams() "and free_moles_mineral_species to moles_bulk_species"); params.addParam>( "remove_fixed_activity_name", + {}, "The name of the species that should have their activity or fugacity constraint removed at " "time given in remove_fixed_activity_time. There should be an equal number of these names " "as times given in remove_fixed_activity_time. Each of these must be in the basis and have " "an activity or fugacity constraint"); params.addParam>("remove_fixed_activity_time", + {}, "The times at which the species in remove_fixed_activity_name " "should have their activity or fugacity constraint removed."); params.addParam>( "source_species_names", + {}, "The name of the species that are added at rates given in source_species_rates. There must " "be an equal number of these as source_species_rates."); params.addCoupledVar("source_species_rates", @@ -50,6 +53,7 @@ GeochemistrySpatialReactor::sharedParams() "be careful that you don't cause negative mass problems!"); params.addParam>( "controlled_activity_name", + {}, "The names of the species that have their activity or fugacity constrained. There should be " "an equal number of these names as values given in controlled_activity_value. NOTE: if " "these species are not in the basis, or they do not have an activity (or fugacity) " @@ -67,9 +71,11 @@ GeochemistrySpatialReactor::sharedParams() "of the current time step (ie, implement an explicit solve)"); params.addParam>( "kinetic_species_name", + {}, "Names of the kinetic species given initial values in kinetic_species_initial_value"); params.addParam>( "kinetic_species_initial_value", + {}, "Initial number of moles, mass or volume (depending on kinetic_species_unit) for each of the " "species named in kinetic_species_name"); MultiMooseEnum kin_species_unit("dimensionless moles molal kg g mg ug kg_per_kg_solvent " diff --git a/modules/geochemistry/src/userobjects/GeochemistryTimeDependentReactor.C b/modules/geochemistry/src/userobjects/GeochemistryTimeDependentReactor.C index 9fe35bb8c33c..79b37f0448a4 100644 --- a/modules/geochemistry/src/userobjects/GeochemistryTimeDependentReactor.C +++ b/modules/geochemistry/src/userobjects/GeochemistryTimeDependentReactor.C @@ -71,15 +71,18 @@ GeochemistryTimeDependentReactor::sharedParams() "free_moles_mineral_species to moles_bulk_species"); params.addParam>( "remove_fixed_activity_name", + {}, "The name of the species that should have their activity or fugacity constraint removed at " "time given in remove_fixed_activity_time. There should be an equal number of these names " "as times given in remove_fixed_activity_time. Each of these must be in the basis and have " "an activity or fugacity constraint"); params.addParam>("remove_fixed_activity_time", + {}, "The times at which the species in remove_fixed_activity_name " "should have their activity or fugacity constraint removed."); params.addParam>( "source_species_names", + {}, "The name of the species that are added at rates given in source_species_rates. There must " "be an equal number of these as source_species_rates."); params.addCoupledVar("source_species_rates", @@ -88,6 +91,7 @@ GeochemistryTimeDependentReactor::sharedParams() "be careful that you don't cause negative mass problems!"); params.addParam>( "controlled_activity_name", + {}, "The names of the species that have their activity or fugacity constrained. There should be " "an equal number of these names as values given in controlled_activity_value. NOTE: if " "these species are not in the basis, or they do not have an activity (or fugacity) " @@ -105,9 +109,11 @@ GeochemistryTimeDependentReactor::sharedParams() "of the current time step (ie, implement an explicit solve)"); params.addParam>( "kinetic_species_name", + {}, "Names of the kinetic species given initial values in kinetic_species_initial_value"); params.addParam>( "kinetic_species_initial_value", + {}, "Initial number of moles, mass or volume (depending on kinetic_species_unit) for each of the " "species named in kinetic_species_name"); MultiMooseEnum kin_species_unit("dimensionless moles molal kg g mg ug kg_per_kg_solvent " diff --git a/modules/heat_transfer/src/actions/MortarGapHeatTransferAction.C b/modules/heat_transfer/src/actions/MortarGapHeatTransferAction.C index 05d64767c9c6..eb524f33e8a8 100644 --- a/modules/heat_transfer/src/actions/MortarGapHeatTransferAction.C +++ b/modules/heat_transfer/src/actions/MortarGapHeatTransferAction.C @@ -59,6 +59,7 @@ MortarGapHeatTransferAction::validParams() params.addParam>( "user_created_gap_flux_models", + {}, "The name of the user objects created by the user to represent gap heat transfer physics"); return params; diff --git a/modules/heat_transfer/src/actions/RadiationTransferAction.C b/modules/heat_transfer/src/actions/RadiationTransferAction.C index 5b5d2caf61f6..850ad5cef09e 100644 --- a/modules/heat_transfer/src/actions/RadiationTransferAction.C +++ b/modules/heat_transfer/src/actions/RadiationTransferAction.C @@ -33,14 +33,17 @@ RadiationTransferAction::validParams() "boundary", "The boundaries that participate in the radiative exchange."); params.addParam>( - "adiabatic_boundary", "The adiabatic boundaries that participate in the radiative exchange."); + "adiabatic_boundary", + {}, + "The adiabatic boundaries that participate in the radiative exchange."); params.addParam>( "fixed_temperature_boundary", + {}, "The fixed temperature boundaries that participate in the radiative exchange."); - params.addParam>("fixed_boundary_temperatures", - "The temperatures of the fixed boundary."); + params.addParam>( + "fixed_boundary_temperatures", {}, "The temperatures of the fixed boundary."); params.addRequiredParam>("n_patches", "Number of radiation patches per sideset."); diff --git a/modules/heat_transfer/src/actions/ThermalContactAction.C b/modules/heat_transfer/src/actions/ThermalContactAction.C index 01644cb0f1c2..7ac1c8ba675d 100644 --- a/modules/heat_transfer/src/actions/ThermalContactAction.C +++ b/modules/heat_transfer/src/actions/ThermalContactAction.C @@ -81,7 +81,7 @@ ThermalContactAction::validParams() "The displacements appropriate for the simulation geometry and coordinate system"); params.addParam>( - "save_in", "The Auxiliary Variable to (optionally) save the boundary flux in"); + "save_in", {}, "The Auxiliary Variable to (optionally) save the boundary flux in"); params.addRangeCheckedParam("gap_conductivity", 1.0, "gap_conductivity>0", diff --git a/modules/heat_transfer/src/dirackernels/GapHeatPointSourceMaster.C b/modules/heat_transfer/src/dirackernels/GapHeatPointSourceMaster.C index fe6ab622dea7..a1737645daea 100644 --- a/modules/heat_transfer/src/dirackernels/GapHeatPointSourceMaster.C +++ b/modules/heat_transfer/src/dirackernels/GapHeatPointSourceMaster.C @@ -22,8 +22,8 @@ GapHeatPointSourceMaster::validParams() MooseEnum orders("CONSTANT FIRST SECOND THIRD FOURTH", "FIRST"); InputParameters params = DiracKernel::validParams(); - params.addParam("boundary", "The primary boundary"); - params.addParam("secondary", "The secondary boundary"); + params.addParam("boundary", {}, "The primary boundary"); + params.addParam("secondary", {}, "The secondary boundary"); params.addParam("order", orders, "The finite element order"); params.set("use_displaced_mesh") = true; params.addParam("tangential_tolerance", diff --git a/modules/heat_transfer/src/userobjects/GrayLambertSurfaceRadiationBase.C b/modules/heat_transfer/src/userobjects/GrayLambertSurfaceRadiationBase.C index eb4297af8a4b..38e1189d1757 100644 --- a/modules/heat_transfer/src/userobjects/GrayLambertSurfaceRadiationBase.C +++ b/modules/heat_transfer/src/userobjects/GrayLambertSurfaceRadiationBase.C @@ -26,11 +26,12 @@ GrayLambertSurfaceRadiationBase::validParams() params.addRequiredParam>("emissivity", "Emissivities for each boundary."); params.addParam>( "fixed_temperature_boundary", + {}, "The list of boundary IDs from the mesh with fixed temperatures."); - params.addParam>("fixed_boundary_temperatures", - "The temperatures of the fixed boundary."); + params.addParam>( + "fixed_boundary_temperatures", {}, "The temperatures of the fixed boundary."); params.addParam>( - "adiabatic_boundary", "The list of boundary IDs from the mesh that are adiabatic."); + "adiabatic_boundary", {}, "The list of boundary IDs from the mesh that are adiabatic."); params.addClassDescription( "This object implements the exchange of heat by radiation between sidesets."); diff --git a/modules/misc/misc.yaml b/modules/misc/misc.yaml new file mode 100644 index 000000000000..23e0b023ec45 --- /dev/null +++ b/modules/misc/misc.yaml @@ -0,0 +1,9 @@ +DMETHOD: opt +Werror: reorder +compiler_type: clang +documentation: true +installation_type: in_tree +registered_apps: +- WASPAPP +- MISCTESTAPP +- MISCAPP diff --git a/modules/navier_stokes/src/actions/CNSAction.C b/modules/navier_stokes/src/actions/CNSAction.C index 112fca2103ab..ae7694d1f498 100644 --- a/modules/navier_stokes/src/actions/CNSAction.C +++ b/modules/navier_stokes/src/actions/CNSAction.C @@ -38,7 +38,7 @@ CNSAction::validParams() params.addParam("equation_type", type, "Navier-Stokes equation type"); params.addParam>( - "block", "The list of block ids (SubdomainID) on which NS equation is defined on"); + "block", {}, "The list of block ids (SubdomainID) on which NS equation is defined on"); params.addRequiredParam("fluid_properties", "The name of the user object for fluid properties"); diff --git a/modules/navier_stokes/src/actions/INSAction.C b/modules/navier_stokes/src/actions/INSAction.C index b501ed1fbc7c..08fee41937ef 100644 --- a/modules/navier_stokes/src/actions/INSAction.C +++ b/modules/navier_stokes/src/actions/INSAction.C @@ -41,7 +41,7 @@ INSAction::validParams() params.addParam("equation_type", type, "Navier-Stokes equation type"); params.addParam>( - "block", "The list of block ids (SubdomainID) on which NS equation is defined on"); + "block", {}, "The list of block ids (SubdomainID) on which NS equation is defined on"); // temperature equation parameters params.addParam("boussinesq_approximation", false, "True to have Boussinesq approximation"); diff --git a/modules/navier_stokes/src/actions/NSFVAction.C b/modules/navier_stokes/src/actions/NSFVAction.C index 8a66aecfb1fc..9dead7fd1ca2 100644 --- a/modules/navier_stokes/src/actions/NSFVAction.C +++ b/modules/navier_stokes/src/actions/NSFVAction.C @@ -28,7 +28,7 @@ NSFVAction::validParams() InputParameters params = NSFVBase::validParams(); params.addParam>( - "block", "The list of blocks on which NS equations are defined on"); + "block", {}, "The list of blocks on which NS equations are defined on"); params.addClassDescription("This class allows us to set up Navier-Stokes equations for porous " "medium or clean fluid flows using incompressible or weakly " diff --git a/modules/optimization/src/reporters/OptimizationData.C b/modules/optimization/src/reporters/OptimizationData.C index 93849761dc9a..3c2c830d1cdc 100644 --- a/modules/optimization/src/reporters/OptimizationData.C +++ b/modules/optimization/src/reporters/OptimizationData.C @@ -39,7 +39,7 @@ OptimizationDataTempl::validParams() params.addParam( "file_time", "time", "time column name from csv file being read in."); params.addParam>( - "file_variable_weights", "variable weight column names from csv file being read in."); + "file_variable_weights", {}, "variable weight column names from csv file being read in."); params.addParam( "file_value", "value", "measurement value column name from csv file being read in."); @@ -269,7 +269,7 @@ template void OptimizationDataTempl::readMeasurementsFromInput() { - if (this->isParamValid("file_variable_weights")) + if (this->template getParam>("file_variable_weights").size()) this->paramError( "measurement_values", "file_variable_weights cannot be used with measurement data read from the input " diff --git a/modules/peridynamics/src/actions/GeneralizedPlaneStrainActionPD.C b/modules/peridynamics/src/actions/GeneralizedPlaneStrainActionPD.C index 6793584c181e..d09e5cc8b08d 100644 --- a/modules/peridynamics/src/actions/GeneralizedPlaneStrainActionPD.C +++ b/modules/peridynamics/src/actions/GeneralizedPlaneStrainActionPD.C @@ -49,7 +49,7 @@ GeneralizedPlaneStrainActionPD::validParams() "GeneralizedPlaneStrainActionPD will be applied " "to"); params.addParam>( - "eigenstrain_names", "List of eigenstrains to be applied in this strain calculation"); + "eigenstrain_names", {}, "List of eigenstrains to be applied in this strain calculation"); return params; } diff --git a/modules/peridynamics/src/actions/MechanicsActionPD.C b/modules/peridynamics/src/actions/MechanicsActionPD.C index f36ef9555145..52b2999f3ff5 100644 --- a/modules/peridynamics/src/actions/MechanicsActionPD.C +++ b/modules/peridynamics/src/actions/MechanicsActionPD.C @@ -48,13 +48,15 @@ MechanicsActionPD::validParams() "Nonlinear variable name for the out_of_plane strain for " "plane stress using the NOSPD formulation"); params.addParam>("block", + {}, "List of ids of the blocks (subdomains) that the " "peridynamic mechanics kernel will be applied to"); - params.addParam>("save_in", "The displacement residuals"); - params.addParam>("diag_save_in", - "The displacement diagonal preconditioner terms"); + params.addParam>("save_in", {}, "The displacement residuals"); + params.addParam>( + "diag_save_in", {}, "The displacement diagonal preconditioner terms"); params.addParam>( "eigenstrain_names", + {}, "List of eigenstrains to be coupled in non-ordinary state-based mechanics kernels"); return params; diff --git a/modules/peridynamics/src/kernels/MechanicsBaseNOSPD.C b/modules/peridynamics/src/kernels/MechanicsBaseNOSPD.C index 2f5562df65b4..95113983a0dc 100644 --- a/modules/peridynamics/src/kernels/MechanicsBaseNOSPD.C +++ b/modules/peridynamics/src/kernels/MechanicsBaseNOSPD.C @@ -18,6 +18,7 @@ MechanicsBaseNOSPD::validParams() params.addParam>( "eigenstrain_names", + {}, "List of eigenstrains to be coupled in non-ordinary state-based mechanics kernels"); return params; diff --git a/modules/peridynamics/src/kernels/MechanicsFiniteStrainBaseNOSPD.C b/modules/peridynamics/src/kernels/MechanicsFiniteStrainBaseNOSPD.C index 794f05cf3f91..8bf8bd07bc53 100644 --- a/modules/peridynamics/src/kernels/MechanicsFiniteStrainBaseNOSPD.C +++ b/modules/peridynamics/src/kernels/MechanicsFiniteStrainBaseNOSPD.C @@ -18,6 +18,7 @@ MechanicsFiniteStrainBaseNOSPD::validParams() params.addParam>( "eigenstrain_names", + {}, "List of eigenstrains to be coupled in non-ordinary state-based mechanics kernels"); return params; diff --git a/modules/peridynamics/src/materials/ComputeStrainBaseNOSPD.C b/modules/peridynamics/src/materials/ComputeStrainBaseNOSPD.C index 461c77c242a4..bc2cd822a5b7 100644 --- a/modules/peridynamics/src/materials/ComputeStrainBaseNOSPD.C +++ b/modules/peridynamics/src/materials/ComputeStrainBaseNOSPD.C @@ -29,7 +29,7 @@ ComputeStrainBaseNOSPD::validParams() "Plane strain problem or not, this will affect the mechanical stretch " "calculation for problem with eigenstrains"); params.addParam>( - "eigenstrain_names", "List of eigenstrains to be applied in this strain calculation"); + "eigenstrain_names", {}, "List of eigenstrains to be applied in this strain calculation"); return params; } diff --git a/modules/phase_field/src/actions/ConservedAction.C b/modules/phase_field/src/actions/ConservedAction.C index 2265fc081ef4..7e1e6c174078 100644 --- a/modules/phase_field/src/actions/ConservedAction.C +++ b/modules/phase_field/src/actions/ConservedAction.C @@ -55,8 +55,8 @@ ConservedAction::validParams() params.addRequiredParam( "free_energy", "Base name of the free energy function F defined in a free energy material"); params.addRequiredParam("kappa", "The kappa used with the kernel"); - params.addParam>("block", - "Block restriction for the variables and kernels"); + params.addParam>( + "block", {}, "Block restriction for the variables and kernels"); return params; } diff --git a/modules/phase_field/src/actions/DisplacementGradientsAction.C b/modules/phase_field/src/actions/DisplacementGradientsAction.C index f9ab5dc2c486..b5b0c3483348 100644 --- a/modules/phase_field/src/actions/DisplacementGradientsAction.C +++ b/modules/phase_field/src/actions/DisplacementGradientsAction.C @@ -32,8 +32,8 @@ DisplacementGradientsAction::validParams() "Vector of displacement gradient variables"); params.addParam( "scaling", 1.0, "Specifies a scaling factor to apply to the displacement gradient variables"); - params.addParam>("block", - "Block restriction for the variables and kernels"); + params.addParam>( + "block", {}, "Block restriction for the variables and kernels"); return params; } diff --git a/modules/phase_field/src/actions/EulerAngle2RGBAction.C b/modules/phase_field/src/actions/EulerAngle2RGBAction.C index 0ae47a9723d2..1434ff9f2eb5 100644 --- a/modules/phase_field/src/actions/EulerAngle2RGBAction.C +++ b/modules/phase_field/src/actions/EulerAngle2RGBAction.C @@ -39,8 +39,8 @@ EulerAngle2RGBAction::validParams() "no_grain_color", Point(0, 0, 0), "RGB value of color used to represent area with no grains, defaults to black"); - params.addParam>("block", - "Block restriction for the variables and kernels"); + params.addParam>( + "block", {}, "Block restriction for the variables and kernels"); return params; } diff --git a/modules/phase_field/src/actions/GrainGrowthAction.C b/modules/phase_field/src/actions/GrainGrowthAction.C index d4c5e3229725..ca9ffc3808b1 100644 --- a/modules/phase_field/src/actions/GrainGrowthAction.C +++ b/modules/phase_field/src/actions/GrainGrowthAction.C @@ -77,8 +77,8 @@ GrainGrowthAction::validParams() params.addParam("use_automatic_differentiation", false, "Flag to use automatic differentiation (AD) objects when possible"); - params.addParam>("block", - "Block restriction for the variables and kernels"); + params.addParam>( + "block", {}, "Block restriction for the variables and kernels"); params.addParamNamesToGroup("scaling implicit use_displaced_mesh", "Advanced"); params.addParamNamesToGroup("c en_ratio ndef", "Multiphysics"); diff --git a/modules/phase_field/src/actions/GrandPotentialKernelAction.C b/modules/phase_field/src/actions/GrandPotentialKernelAction.C index c8fa38d8bdc5..db9568ac4e76 100644 --- a/modules/phase_field/src/actions/GrandPotentialKernelAction.C +++ b/modules/phase_field/src/actions/GrandPotentialKernelAction.C @@ -73,11 +73,13 @@ GrandPotentialKernelAction::validParams() "concentrations", "List of concentration variables for strict mass conservation"); parameters.addParam>( "hj_c_min", + {}, "List of body forces coefficients for strict mass conservation formulation that indicates " "the minima in concentration free energy." "Place in same order as switching_function_names."); parameters.addParam>( "hj_over_kVa", + {}, "List of MatReaction coefficients for strict mass conservation formulation that relates " "chemical potential with switching functionj between phases" "Place in same order as switching_function_names."); diff --git a/modules/phase_field/src/actions/HHPFCRFFSplitVariablesAction.C b/modules/phase_field/src/actions/HHPFCRFFSplitVariablesAction.C index 287c1dbb5310..fce0b9615cdd 100644 --- a/modules/phase_field/src/actions/HHPFCRFFSplitVariablesAction.C +++ b/modules/phase_field/src/actions/HHPFCRFFSplitVariablesAction.C @@ -35,8 +35,8 @@ HHPFCRFFSplitVariablesAction::validParams() params.addRequiredParam( "num_L", "specifies the number of complex L variables will be solved for"); params.addRequiredParam("L_name_base", "Base name for the complex L variables"); - params.addParam>("block", - "Block restriction for the variables and kernels"); + params.addParam>( + "block", {}, "Block restriction for the variables and kernels"); return params; } diff --git a/modules/phase_field/src/actions/NonconservedAction.C b/modules/phase_field/src/actions/NonconservedAction.C index 0884673c1005..14425a89d88c 100644 --- a/modules/phase_field/src/actions/NonconservedAction.C +++ b/modules/phase_field/src/actions/NonconservedAction.C @@ -55,8 +55,8 @@ NonconservedAction::validParams() "The mobility is a function of any MOOSE variable (if " "this is set to false, L must be constant over the " "entire domain!)"); - params.addParam>("block", - "Block restriction for the variables and kernels"); + params.addParam>( + "block", {}, "Block restriction for the variables and kernels"); return params; } diff --git a/modules/phase_field/src/actions/PFCRFFVariablesAction.C b/modules/phase_field/src/actions/PFCRFFVariablesAction.C index 54aa5284a5c9..8f580cf8d002 100644 --- a/modules/phase_field/src/actions/PFCRFFVariablesAction.C +++ b/modules/phase_field/src/actions/PFCRFFVariablesAction.C @@ -35,8 +35,8 @@ PFCRFFVariablesAction::validParams() params.addRequiredParam( "num_L", "specifies the number of complex L variables will be solved for"); params.addRequiredParam("L_name_base", "Base name for the complex L variables"); - params.addParam>("block", - "Block restriction for the variables and kernels"); + params.addParam>( + "block", {}, "Block restriction for the variables and kernels"); return params; } diff --git a/modules/phase_field/src/actions/PolycrystalColoringICAction.C b/modules/phase_field/src/actions/PolycrystalColoringICAction.C index 3b8d6c58f718..fd076bc2f929 100644 --- a/modules/phase_field/src/actions/PolycrystalColoringICAction.C +++ b/modules/phase_field/src/actions/PolycrystalColoringICAction.C @@ -23,8 +23,8 @@ PolycrystalColoringICAction::validParams() params.addRequiredParam("op_num", "number of order parameters to create"); params.addRequiredParam("var_name_base", "specifies the base name of the variables"); params.addRequiredParam("polycrystal_ic_uo", "Optional: TODO"); - params.addParam>("block", - "Block restriction for the initial condition"); + params.addParam>( + "block", {}, "Block restriction for the initial condition"); params.addParam( "linearized_interface", false, "Whether to use linearized interface or the standard model"); params.addParam("bound_value", diff --git a/modules/phase_field/src/actions/PolycrystalRandomICAction.C b/modules/phase_field/src/actions/PolycrystalRandomICAction.C index 9513759c5fff..f25d0929f236 100644 --- a/modules/phase_field/src/actions/PolycrystalRandomICAction.C +++ b/modules/phase_field/src/actions/PolycrystalRandomICAction.C @@ -26,8 +26,8 @@ PolycrystalRandomICAction::validParams() "The type of random polycrystal initial condition. Whether " "one order parameter is chosen to be 1 at each node or if " "each other parameter continuously varies from 0 to 1"); - params.addParam>("block", - "Block restriction for the initial condition"); + params.addParam>( + "block", {}, "Block restriction for the initial condition"); return params; } diff --git a/modules/phase_field/src/actions/PolycrystalVariablesAction.C b/modules/phase_field/src/actions/PolycrystalVariablesAction.C index c53ba836242a..d5faadc15fe6 100644 --- a/modules/phase_field/src/actions/PolycrystalVariablesAction.C +++ b/modules/phase_field/src/actions/PolycrystalVariablesAction.C @@ -44,8 +44,8 @@ PolycrystalVariablesAction::validParams() params.addRequiredParam("op_num", "specifies the number of order parameters to create"); params.addRequiredParam("var_name_base", "specifies the base name of the variables"); - params.addParam>("block", - "Block restriction for the variables and kernels"); + params.addParam>( + "block", {}, "Block restriction for the variables and kernels"); return params; } diff --git a/modules/phase_field/src/actions/PolycrystalVoronoiVoidICAction.C b/modules/phase_field/src/actions/PolycrystalVoronoiVoidICAction.C index 65f6dc96d073..3b8464bac364 100644 --- a/modules/phase_field/src/actions/PolycrystalVoronoiVoidICAction.C +++ b/modules/phase_field/src/actions/PolycrystalVoronoiVoidICAction.C @@ -29,8 +29,8 @@ PolycrystalVoronoiVoidICAction::validParams() "", "File containing grain centroids, if file_name is provided, the centroids " "from the file will be used."); - params.addParam>("block", - "Block restriction for the initial condition"); + params.addParam>( + "block", {}, "Block restriction for the initial condition"); return params; } diff --git a/modules/phase_field/src/actions/Tricrystal2CircleGrainsICAction.C b/modules/phase_field/src/actions/Tricrystal2CircleGrainsICAction.C index ee22bdc0a386..a335587ee5cd 100644 --- a/modules/phase_field/src/actions/Tricrystal2CircleGrainsICAction.C +++ b/modules/phase_field/src/actions/Tricrystal2CircleGrainsICAction.C @@ -33,8 +33,8 @@ Tricrystal2CircleGrainsICAction::validParams() InputParameters params = Action::validParams(); params.addRequiredParam("op_num", "number of order parameters to create"); params.addRequiredParam("var_name_base", "specifies the base name of the variables"); - params.addParam>("block", - "Block restriction for the initial condition"); + params.addParam>( + "block", {}, "Block restriction for the initial condition"); return params; } diff --git a/modules/porous_flow/doc/content/modules/porous_flow/ates.md b/modules/porous_flow/doc/content/modules/porous_flow/ates.md index d3f1da65362a..9d5d724f86a1 100644 --- a/modules/porous_flow/doc/content/modules/porous_flow/ates.md +++ b/modules/porous_flow/doc/content/modules/porous_flow/ates.md @@ -16,7 +16,7 @@ This process can be reversed to enable cooling. The duration of an ATES cycle ca There are many ATES systems in operation currently. Their viability depends crucially on the recovery efficiency, $R$, which is the ratio of heat energy extracted to heat energy injected, because it is impossible to extract all of the injected heat from an ATES system due to heat losses caused by conduction and convection. $R$ is \begin{equation} -R = \frac{\overline{h}_{\mathrm{p}} - h_{\mathrm{amb}}}{h_{\mathrm{i}} - h_{\mathrm{amb}}} +R = \frac{\overline{h}_{\mathrm{p}} - h_{\mathrm{amb}}}{h_{\mathrm{i}} - h_{\mathrm{amb}}} \approx \frac{\overline{T}_{\mathrm{p}} - T_{\mathrm{amb}}}{T_{\mathrm{i}} - T_{\mathrm{amb}}} \ , \end{equation} @@ -28,11 +28,11 @@ The purpose of this page is to describe a MOOSE model of an ATES system, with th ## Model setup -The model simulates an ATES system comprising a single injection-production well penetrating a horizontal aquifer 20 m thick. Five injection-production cycles are simulated, with each cycle comprising 91 days each of injection, storage, production and rest. The injection temperature is 90$^{\circ}\mathrm{C}$, and the injected fluid mass is 10$^8\,$kg. +The model simulates an ATES system comprising a single injection-production well penetrating a horizontal aquifer 20 m thick. Five injection-production cycles are simulated, with each cycle comprising 91 days each of injection, storage, production and rest. The injection temperature is 90$^{\circ}\mathrm{C}$, and the injected fluid mass is 10$^8\,$kg. The single-well system has radial symmetry, hence it may be simulated using "RZ" coordinates: -!listing modules/porous_flow/examples/ates/ates.i block=Problem +!listing modules/porous_flow/examples/ates/ates.i block=Mesh which means gravity acts along what is usually thought of as the "y" direction: diff --git a/modules/porous_flow/examples/ates/ates.i b/modules/porous_flow/examples/ates/ates.i index 932526519208..c55aa8e83c2a 100644 --- a/modules/porous_flow/examples/ates/ates.i +++ b/modules/porous_flow/examples/ates/ates.i @@ -171,6 +171,7 @@ cap_ver_wet_thermal_cond = ${fparse cap_ver_thermal_cond * 60 * 60 * 24} # J/day ###################################### [Mesh] + coord_type = RZ [aq_top_fine] type = GeneratedMeshGenerator dim = 2 @@ -345,10 +346,6 @@ cap_ver_wet_thermal_cond = ${fparse cap_ver_thermal_cond * 60 * 60 * 24} # J/day [] [] -[Problem] - coord_type = RZ -[] - [GlobalParams] PorousFlowDictator = dictator gravity = '0 ${gravity} 0' diff --git a/modules/porous_flow/include/actions/PorousFlowActionBase.h b/modules/porous_flow/include/actions/PorousFlowActionBase.h index 1937c7a4eda1..8c6e991000e9 100644 --- a/modules/porous_flow/include/actions/PorousFlowActionBase.h +++ b/modules/porous_flow/include/actions/PorousFlowActionBase.h @@ -60,13 +60,13 @@ class PorousFlowActionBase : public Action, public PorousFlowDependencies const RealVectorValue _gravity; /// Name of the mass-fraction variables (if any) - const std::vector & _mass_fraction_vars; + const std::vector _mass_fraction_vars; /// Number of mass-fraction variables const unsigned _num_mass_fraction_vars; /// Name of the temperature variable (if any) - const std::vector & _temperature_var; + const std::vector _temperature_var; /// Displacement NonlinearVariable names (if any) const std::vector & _displacements; diff --git a/modules/porous_flow/src/actions/PorousFlowActionBase.C b/modules/porous_flow/src/actions/PorousFlowActionBase.C index 2fe6445ac6df..5503ffccf99e 100644 --- a/modules/porous_flow/src/actions/PorousFlowActionBase.C +++ b/modules/porous_flow/src/actions/PorousFlowActionBase.C @@ -57,10 +57,12 @@ PorousFlowActionBase::validParams() "if the simulation does not involve chemistry)"); params.addParam>( "displacements", + {}, "The name of the displacement variables (relevant only for " "mechanically-coupled simulations)"); params.addParam>( "eigenstrain_names", + {}, "List of all eigenstrain models used in mechanics calculations. " "Typically the eigenstrain_name used in " "ComputeThermalExpansionEigenstrain. Only needed for " @@ -99,9 +101,13 @@ PorousFlowActionBase::PorousFlowActionBase(const InputParameters & params) _num_aqueous_equilibrium(getParam("number_aqueous_equilibrium")), _num_aqueous_kinetic(getParam("number_aqueous_kinetic")), _gravity(getParam("gravity")), - _mass_fraction_vars(getParam>("mass_fraction_vars")), + _mass_fraction_vars(isParamValid("mass_fraction_vars") + ? getParam>("mass_fraction_vars") + : std::vector{}), _num_mass_fraction_vars(_mass_fraction_vars.size()), - _temperature_var(getParam>("temperature")), + _temperature_var(isParamValid("temperature") + ? getParam>("temperature") + : std::vector{}), _displacements(getParam>("displacements")), _ndisp(_displacements.size()), _coupled_displacements(_ndisp), diff --git a/modules/porous_flow/src/actions/PorousFlowSinglePhaseBase.C b/modules/porous_flow/src/actions/PorousFlowSinglePhaseBase.C index 7c5234fabbaa..b9437d683733 100644 --- a/modules/porous_flow/src/actions/PorousFlowSinglePhaseBase.C +++ b/modules/porous_flow/src/actions/PorousFlowSinglePhaseBase.C @@ -53,6 +53,7 @@ PorousFlowSinglePhaseBase::validParams() "The name of the user object for fluid " "properties. Only needed if fluid_properties_type = PorousFlowSingleComponentFluid"); params.addCoupledVar("mass_fraction_vars", + {}, "List of variables that represent the mass fractions. With only one fluid " "component, this may be left empty. With N fluid components, the format is " "'f_0 f_1 f_2 ... f_(N-1)'. That is, the N^th component need not be " @@ -77,6 +78,7 @@ PorousFlowSinglePhaseBase::validParams() "The Biot coefficient (relevant only for mechanically-coupled simulations)"); params.addParam>( "save_component_rate_in", + {}, "List of AuxVariables into which the rate-of-change of each fluid component at each node " "will be saved. There must be exactly N of these to match the N fluid components. The " "result will be measured in kg/s, where the kg is the mass of the fluid component at the " @@ -161,7 +163,7 @@ PorousFlowSinglePhaseBase::PorousFlowSinglePhaseBase(const InputParameters & par _nacl_name = getParam("nacl_name"); } - if (params.isParamValid("save_component_rate_in") && + if (params.isParamSetByUser("save_component_rate_in") && _save_component_rate_in.size() != _num_mass_fraction_vars + 1) paramError("save_component_rate_in", "The number of save_component_rate_in variables must be the number of fluid " diff --git a/modules/porous_flow/src/materials/PorousFlowMassFraction.C b/modules/porous_flow/src/materials/PorousFlowMassFraction.C index 539547177149..9d8ee69d7e00 100644 --- a/modules/porous_flow/src/materials/PorousFlowMassFraction.C +++ b/modules/porous_flow/src/materials/PorousFlowMassFraction.C @@ -48,7 +48,8 @@ PorousFlowMassFractionTempl::PorousFlowMassFractionTempl(const InputParam "dPorousFlow_mass_frac_nodal_dvar") : &declareProperty>>>( "dPorousFlow_mass_frac_qp_dvar")), - _num_passed_mf_vars(coupledComponents("mass_fraction_vars")) + _num_passed_mf_vars(isParamValid("mass_fraction_vars") ? coupledComponents("mass_fraction_vars") + : 0) { if (_num_phases < 1 || _num_components < 1) mooseError("PorousFlowMassFraction: The Dictator proclaims that the number of phases is ", diff --git a/modules/porous_flow/src/postprocessors/PorousFlowFluidMass.C b/modules/porous_flow/src/postprocessors/PorousFlowFluidMass.C index 1a6c83f23556..2cb9dda6f01a 100644 --- a/modules/porous_flow/src/postprocessors/PorousFlowFluidMass.C +++ b/modules/porous_flow/src/postprocessors/PorousFlowFluidMass.C @@ -28,6 +28,7 @@ PorousFlowFluidMassTempl::validParams() params.addRequiredParam( "PorousFlowDictator", "The UserObject that holds the list of PorousFlow variable names."); params.addParam>("phase", + {}, "The index of the fluid phase that this " "Postprocessor is restricted to. Multiple " "indices can be entered"); diff --git a/modules/porous_flow/src/postprocessors/PorousFlowHeatEnergy.C b/modules/porous_flow/src/postprocessors/PorousFlowHeatEnergy.C index 7d767bbdec3d..83a27490b248 100644 --- a/modules/porous_flow/src/postprocessors/PorousFlowHeatEnergy.C +++ b/modules/porous_flow/src/postprocessors/PorousFlowHeatEnergy.C @@ -23,7 +23,7 @@ PorousFlowHeatEnergy::validParams() "PorousFlowDictator", "The UserObject that holds the list of PorousFlow variable names."); params.addParam( "include_porous_skeleton", true, "Include the heat energy of the porous skeleton"); - params.addParam>("phase", + params.addParam>("phase", {}, "The index(es) of the fluid phase that this " "Postprocessor is restricted to. Multiple " "indices can be entered."); diff --git a/modules/ray_tracing/src/raykernels/LineSourceRayKernel.C b/modules/ray_tracing/src/raykernels/LineSourceRayKernel.C index 7bc6ac245d6c..1a12bc2f38c1 100644 --- a/modules/ray_tracing/src/raykernels/LineSourceRayKernel.C +++ b/modules/ray_tracing/src/raykernels/LineSourceRayKernel.C @@ -31,9 +31,11 @@ LineSourceRayKernelTempl::validParams() params.addParam( "postprocessor", 1, "A postprocessor whose value is multiplied by the line source"); params.addParam>( - "ray_data_factor_names", "The names of the Ray data to scale the source by (if any)"); + "ray_data_factor_names", {}, "The names of the Ray data to scale the source by (if any)"); params.addParam>( - "ray_aux_data_factor_names", "The names of the Ray aux data to scale the source by (if any)"); + "ray_aux_data_factor_names", + {}, + "The names of the Ray aux data to scale the source by (if any)"); params.declareControllable("value"); diff --git a/modules/reactor/src/meshgenerators/AzimuthalBlockSplitGenerator.C b/modules/reactor/src/meshgenerators/AzimuthalBlockSplitGenerator.C index 030ba49ccc3a..23fae0a25662 100644 --- a/modules/reactor/src/meshgenerators/AzimuthalBlockSplitGenerator.C +++ b/modules/reactor/src/meshgenerators/AzimuthalBlockSplitGenerator.C @@ -26,6 +26,7 @@ AzimuthalBlockSplitGenerator::validParams() "new_block_ids", "The block IDs to be used for the new selected azimuthal angle blocks."); params.addParam>( "new_block_names", + {}, "The optional block names to be used for the new selected azimulathal angle blocks."); params.addParam("preserve_volumes", true, diff --git a/modules/reactor/src/meshgenerators/FlexiblePatternGenerator.C b/modules/reactor/src/meshgenerators/FlexiblePatternGenerator.C index 871f2091420e..ca7418d3f54e 100644 --- a/modules/reactor/src/meshgenerators/FlexiblePatternGenerator.C +++ b/modules/reactor/src/meshgenerators/FlexiblePatternGenerator.C @@ -38,9 +38,10 @@ FlexiblePatternGenerator::validParams() "the diameter of the CIRCLE boundary mesh."); params.addParam>( - "extra_positions", "The extra non-patterned positions to set the input MeshGenerators."); + "extra_positions", {}, "The extra non-patterned positions to set the input MeshGenerators."); params.addParam>( "extra_positions_mg_indices", + {}, "the indices of the input mesh generators for the extra position."); params.addParam>>>("hex_patterns", diff --git a/modules/richards/src/actions/Q2PAction.C b/modules/richards/src/actions/Q2PAction.C index fb05e7e008d6..ab437970dc19 100644 --- a/modules/richards/src/actions/Q2PAction.C +++ b/modules/richards/src/actions/Q2PAction.C @@ -54,10 +54,12 @@ Q2PAction::validParams() params.addRequiredParam("gas_viscosity", "The gas viscosity"); params.addRequiredParam("diffusivity", "The diffusivity"); params.addParam>("output_nodal_masses_to", + {}, "Output Nodal masses to this Output object. If you " "don't want any outputs, don't input anything here"); params.addParam>( "output_total_masses_to", + {}, "Output total water and gas mass to this Output object. If you " "don't want any outputs, don't input anything here"); params.addParam("save_gas_flux_in_Q2PGasFluxResidual", diff --git a/modules/stochastic_tools/src/reporters/MorrisReporter.C b/modules/stochastic_tools/src/reporters/MorrisReporter.C index 5722466d6b89..fb89a9f77ca6 100644 --- a/modules/stochastic_tools/src/reporters/MorrisReporter.C +++ b/modules/stochastic_tools/src/reporters/MorrisReporter.C @@ -24,7 +24,7 @@ MorrisReporter::validParams() "vectorpostprocessors", "List of VectorPostprocessor(s) to utilized for statistic computations."); params.addParam>( - "reporters", "List of Reporter values to utilized for statistic computations."); + "reporters", {}, "List of Reporter values to utilized for statistic computations."); // Confidence Levels params.addParam>( diff --git a/modules/stochastic_tools/src/reporters/SobolReporter.C b/modules/stochastic_tools/src/reporters/SobolReporter.C index 844ae5987dff..a0ba9cb47d59 100644 --- a/modules/stochastic_tools/src/reporters/SobolReporter.C +++ b/modules/stochastic_tools/src/reporters/SobolReporter.C @@ -36,7 +36,7 @@ SobolReporter::validParams() "List of VectorPostprocessor(s) to utilized for statistic computations."); params.addParam>( - "reporters", "List of Reporter values to utilized for statistic computations."); + "reporters", {}, "List of Reporter values to utilized for statistic computations."); params.addParam>( "ci_levels", diff --git a/modules/stochastic_tools/src/reporters/StatisticsReporter.C b/modules/stochastic_tools/src/reporters/StatisticsReporter.C index 969c8004d093..75a3eb99b65f 100644 --- a/modules/stochastic_tools/src/reporters/StatisticsReporter.C +++ b/modules/stochastic_tools/src/reporters/StatisticsReporter.C @@ -32,7 +32,7 @@ StatisticsReporter::validParams() "List of VectorPostprocessor(s) to utilized for statistic computations."); params.addParam>( - "reporters", "List of Reporter values to utilized for statistic computations."); + "reporters", {}, "List of Reporter values to utilized for statistic computations."); MultiMooseEnum stats = StochasticTools::makeCalculatorEnum(); params.addRequiredParam( diff --git a/modules/stochastic_tools/src/surrogates/ActiveLearningGaussianProcess.C b/modules/stochastic_tools/src/surrogates/ActiveLearningGaussianProcess.C index 4a0a267537af..b187d99f8a4d 100644 --- a/modules/stochastic_tools/src/surrogates/ActiveLearningGaussianProcess.C +++ b/modules/stochastic_tools/src/surrogates/ActiveLearningGaussianProcess.C @@ -40,8 +40,8 @@ ActiveLearningGaussianProcess::validParams() "tao_options", "", "Command line options for PETSc/TAO hyperparameter optimization"); params.addParam( "show_optimization_details", false, "Switch to show TAO or Adam solver results"); - params.addParam>("tune_parameters", - "Select hyperparameters to be tuned"); + params.addParam>( + "tune_parameters", {}, "Select hyperparameters to be tuned"); params.addParam>( "tuning_min", std::vector(), "Minimum allowable tuning value"); params.addParam>( diff --git a/modules/stochastic_tools/src/trainers/GaussianProcessTrainer.C b/modules/stochastic_tools/src/trainers/GaussianProcessTrainer.C index eadb2c9cc223..2d80a9d2bbc2 100644 --- a/modules/stochastic_tools/src/trainers/GaussianProcessTrainer.C +++ b/modules/stochastic_tools/src/trainers/GaussianProcessTrainer.C @@ -100,7 +100,9 @@ GaussianProcessTrainer::GaussianProcessTrainer(const InputParameters & parameter if (_sampler.getNumberOfRows() < _optimization_opts.batch_size) paramError("batch_size", "Batch size cannot be greater than the training data set size."); - std::vector tune_parameters(getParam>("tune_parameters")); + std::vector tune_parameters( + _do_tuning ? getParam>("tune_parameters") + : std::vector{}); if (isParamValid("tuning_min") && (getParam>("tuning_min").size() != tune_parameters.size())) diff --git a/modules/tensor_mechanics/src/actions/CavityPressureAction.C b/modules/tensor_mechanics/src/actions/CavityPressureAction.C index c24ae9eb69cc..059246c27cc5 100644 --- a/modules/tensor_mechanics/src/actions/CavityPressureAction.C +++ b/modules/tensor_mechanics/src/actions/CavityPressureAction.C @@ -23,7 +23,7 @@ CavityPressureAction::validParams() params.addRequiredParam>("displacements", "The nonlinear displacement variables"); params.addParam>( - "save_in", "Auxiliary variables to save the displacement residuals"); + "save_in", {}, "Auxiliary variables to save the displacement residuals"); params.addParam("output", "The name to use for the cavity pressure value"); params.addParam( "use_displaced_mesh", true, "Whether to use displaced mesh in the boundary condition"); diff --git a/modules/tensor_mechanics/src/actions/CohesiveZoneActionBase.C b/modules/tensor_mechanics/src/actions/CohesiveZoneActionBase.C index e5a004ef37c4..32d463412921 100644 --- a/modules/tensor_mechanics/src/actions/CohesiveZoneActionBase.C +++ b/modules/tensor_mechanics/src/actions/CohesiveZoneActionBase.C @@ -47,14 +47,14 @@ CohesiveZoneActionBase::validParams() false, "Whether to use automatic differentiation to compute the Jacobian"); params.addParam("base_name", "Material property base name"); - params.addParam>("save_in_master", + params.addParam>("save_in_master", {}, "The displacement residuals on the master side"); params.addParam>( - "diag_save_in_master", "The displacement diagonal preconditioner terms on the master side"); - params.addParam>("save_in_slave", + "diag_save_in_master", {}, "The displacement diagonal preconditioner terms on the master side"); + params.addParam>("save_in_slave", {}, "The displacement residuals on the slave side"); params.addParam>( - "diag_save_in_slave", "The displacement diagonal preconditioner terms on the slave side"); + "diag_save_in_slave", {}, "The displacement diagonal preconditioner terms on the slave side"); params.addParamNamesToGroup("save_in_master diag_save_in_master save_in_slave diag_save_in_slave", "Advanced"); params.addParam("verbose", false, "Display extra information."); diff --git a/modules/tensor_mechanics/src/actions/CoupledPressureAction.C b/modules/tensor_mechanics/src/actions/CoupledPressureAction.C index 0425f9bc689c..dbb6a4fc45ab 100644 --- a/modules/tensor_mechanics/src/actions/CoupledPressureAction.C +++ b/modules/tensor_mechanics/src/actions/CoupledPressureAction.C @@ -25,15 +25,16 @@ CoupledPressureAction::validParams() params.addParam>( "displacements", + {}, "The displacements appropriate for the simulation geometry and coordinate system"); params.addParam("use_displaced_mesh", true, "Whether to use the displaced mesh."); - params.addParam>("save_in_disp_x", - "The save_in variables for x displacement"); - params.addParam>("save_in_disp_y", - "The save_in variables for y displacement"); - params.addParam>("save_in_disp_z", - "The save_in variables for z displacement"); + params.addParam>( + "save_in_disp_x", {}, "The save_in variables for x displacement"); + params.addParam>( + "save_in_disp_y", {}, "The save_in variables for y displacement"); + params.addParam>( + "save_in_disp_z", {}, "The save_in variables for z displacement"); params.addParam("pressure", "The variable that contains the pressure"); return params; diff --git a/modules/tensor_mechanics/src/actions/DomainIntegralAction.C b/modules/tensor_mechanics/src/actions/DomainIntegralAction.C index cc871d71d9ab..14d13271050e 100644 --- a/modules/tensor_mechanics/src/actions/DomainIntegralAction.C +++ b/modules/tensor_mechanics/src/actions/DomainIntegralAction.C @@ -42,8 +42,8 @@ DomainIntegralAction::validParams() integral_vec, "Domain integrals to calculate. Choices are: " + integral_vec.getRawNames()); - params.addParam>("boundary", - "Boundary containing the crack front points"); + params.addParam>( + "boundary", {}, "Boundary containing the crack front points"); params.addParam>("crack_front_points", "Set of points to define crack front"); params.addParam( "order", "FIRST", "Specifies the order of the FE shape function to use for q AuxVariables"); @@ -59,9 +59,11 @@ DomainIntegralAction::validParams() "output_variable", "Variable values to be reported along the crack front"); params.addParam("poissons_ratio", "Poisson's ratio"); params.addParam("youngs_modulus", "Young's modulus"); - params.addParam>("block", "The block ids where integrals are defined"); + params.addParam>( + "block", {}, "The block ids where integrals are defined"); params.addParam>( "displacements", + {}, "The displacements appropriate for the simulation geometry and coordinate system"); params.addParam("temperature", "", "The temperature"); params.addParam( diff --git a/modules/tensor_mechanics/src/actions/GlobalStrainAction.C b/modules/tensor_mechanics/src/actions/GlobalStrainAction.C index 854a97cef9c9..599e083a3023 100644 --- a/modules/tensor_mechanics/src/actions/GlobalStrainAction.C +++ b/modules/tensor_mechanics/src/actions/GlobalStrainAction.C @@ -33,7 +33,7 @@ GlobalStrainAction::validParams() params.addClassDescription("Set up the GlobalStrainAction environment"); params.addRequiredParam("scalar_global_strain", "Scalar variable for global strain"); - params.addParam>("displacements", "The displacement variables"); + params.addParam>("displacements", {}, "The displacement variables"); params.addParam>( "auxiliary_displacements", "The auxliary displacement variables to be calculated from scalar variables"); @@ -44,7 +44,8 @@ GlobalStrainAction::validParams() "Vector of values defining the constant applied stress " "to add, in order 11, 22, 33, 23, 13, 12"); params.addParam("base_name", "Material property base name"); - params.addParam>("block", "The block id where this variable lives"); + params.addParam>( + "block", {}, "The block id where this variable lives"); return params; } diff --git a/modules/tensor_mechanics/src/actions/InclinedNoDisplacementBCAction.C b/modules/tensor_mechanics/src/actions/InclinedNoDisplacementBCAction.C index 23294a3a54df..efdebd1bfa11 100644 --- a/modules/tensor_mechanics/src/actions/InclinedNoDisplacementBCAction.C +++ b/modules/tensor_mechanics/src/actions/InclinedNoDisplacementBCAction.C @@ -25,8 +25,9 @@ InclinedNoDisplacementBCAction::validParams() params.addParam>( "displacements", + {}, "The displacements appropriate for the simulation geometry and coordinate system"); - params.addParam>("save_in", "The displacement residuals"); + params.addParam>("save_in", {}, "The displacement residuals"); params.addRequiredParam("penalty", "Penalty parameter"); params.addParam("use_automatic_differentiation", diff --git a/modules/tensor_mechanics/src/actions/LineElementAction.C b/modules/tensor_mechanics/src/actions/LineElementAction.C index 26159d290093..004d3b3f710c 100644 --- a/modules/tensor_mechanics/src/actions/LineElementAction.C +++ b/modules/tensor_mechanics/src/actions/LineElementAction.C @@ -69,14 +69,15 @@ LineElementAction::validParams() // Master action, not in the common parameters area params.addParam>( "block", + {}, "The list of ids of the blocks (subdomain) " "that the stress divergence, inertia kernels and materials will be " "applied to"); // Advanced - params.addParam>("save_in", - "The displacement and rotational residuals"); params.addParam>( - "diag_save_in", "The displacement and rotational diagonal preconditioner terms"); + "save_in", {}, "The displacement and rotational residuals"); + params.addParam>( + "diag_save_in", {}, "The displacement and rotational diagonal preconditioner terms"); params.addParamNamesToGroup("block", "Advanced"); return params; } @@ -200,6 +201,7 @@ LineElementAction::beamParameters() "Unit vector along the y direction if different from global y direction."); params.addParam>( "boundary", + {}, "The list of boundary IDs from the mesh where the nodal " "mass/inertia will be applied."); return params; diff --git a/modules/tensor_mechanics/src/actions/MaterialVectorBodyForceAction.C b/modules/tensor_mechanics/src/actions/MaterialVectorBodyForceAction.C index bf36e1adb118..5d9320434ca9 100644 --- a/modules/tensor_mechanics/src/actions/MaterialVectorBodyForceAction.C +++ b/modules/tensor_mechanics/src/actions/MaterialVectorBodyForceAction.C @@ -20,11 +20,12 @@ MaterialVectorBodyForceAction::validParams() InputParameters params = Action::validParams(); params.addClassDescription("Set up volumetric body force kernels"); - params.addParam>("block", - "The block ids where the body force will be applied"); + params.addParam>( + "block", "The block ids where the body force will be applied"); params.addParam>( "displacements", + {}, "The displacements appropriate for the simulation geometry and coordinate system"); params.addParam( diff --git a/modules/tensor_mechanics/src/actions/PressureAction.C b/modules/tensor_mechanics/src/actions/PressureAction.C index f4af14a749d4..829e7345c702 100644 --- a/modules/tensor_mechanics/src/actions/PressureAction.C +++ b/modules/tensor_mechanics/src/actions/PressureAction.C @@ -27,12 +27,12 @@ PressureAction::validParams() "displacements", "The displacements appropriate for the simulation geometry and coordinate system"); - params.addParam>("save_in_disp_x", - "The save_in variables for x displacement"); - params.addParam>("save_in_disp_y", - "The save_in variables for y displacement"); - params.addParam>("save_in_disp_z", - "The save_in variables for z displacement"); + params.addParam>( + "save_in_disp_x", {}, "The save_in variables for x displacement"); + params.addParam>( + "save_in_disp_y", {}, "The save_in variables for y displacement"); + params.addParam>( + "save_in_disp_z", {}, "The save_in variables for z displacement"); params.addParam("factor", 1.0, "The factor to use in computing the pressure"); params.addParam("use_displaced_mesh", true, "Whether to use the displaced mesh."); diff --git a/modules/tensor_mechanics/src/actions/TensorMechanicsAction.C b/modules/tensor_mechanics/src/actions/TensorMechanicsAction.C index 2c41d40b049f..5c321ab824b9 100644 --- a/modules/tensor_mechanics/src/actions/TensorMechanicsAction.C +++ b/modules/tensor_mechanics/src/actions/TensorMechanicsAction.C @@ -54,6 +54,7 @@ TensorMechanicsAction::validParams() // parameters specified here only appear in the input file sub-blocks of the // Master action, not in the common parameters area params.addParam>("block", + {}, "The list of ids of the blocks (subdomain) " "that the stress divergence kernels will be " "applied to"); @@ -107,6 +108,7 @@ TensorMechanicsAction::validParams() "Type of each constraint: " "stress or strain."); params.addParam>("targets", + {}, "Functions giving the target " "values of each constraint."); diff --git a/modules/tensor_mechanics/src/actions/TensorMechanicsActionBase.C b/modules/tensor_mechanics/src/actions/TensorMechanicsActionBase.C index 0e4c42ce626f..e3def96b7394 100644 --- a/modules/tensor_mechanics/src/actions/TensorMechanicsActionBase.C +++ b/modules/tensor_mechanics/src/actions/TensorMechanicsActionBase.C @@ -154,7 +154,7 @@ TensorMechanicsActionBase::validParams() "use_finite_deform_jacobian", false, "Jacobian for corrotational finite strain"); params.addParam("add_variables", false, "Add the displacement variables"); params.addParam>( - "eigenstrain_names", "List of eigenstrains to be applied in this strain calculation"); + "eigenstrain_names", {}, "List of eigenstrains to be applied in this strain calculation"); params.addParam("use_automatic_differentiation", false, "Flag to use automatic differentiation (AD) objects when possible"); @@ -166,9 +166,9 @@ TensorMechanicsActionBase::validParams() "of the deformed shape with the periodic BC"); // Advanced - params.addParam>("save_in", "The displacement residuals"); - params.addParam>("diag_save_in", - "The displacement diagonal preconditioner terms"); + params.addParam>("save_in", {}, "The displacement residuals"); + params.addParam>( + "diag_save_in", {}, "The displacement diagonal preconditioner terms"); params.addParam("decomposition_method", ComputeFiniteStrain::decompositionType(), "Methods to calculate the finite strain and rotation increments"); diff --git a/modules/tensor_mechanics/src/dampers/ElementJacobianDamper.C b/modules/tensor_mechanics/src/dampers/ElementJacobianDamper.C index 2fb038490a21..2ed5816db82e 100644 --- a/modules/tensor_mechanics/src/dampers/ElementJacobianDamper.C +++ b/modules/tensor_mechanics/src/dampers/ElementJacobianDamper.C @@ -22,8 +22,8 @@ ElementJacobianDamper::validParams() { InputParameters params = GeneralDamper::validParams(); params.addClassDescription("Damper that limits the change in element Jacobians"); - params.addParam>("displacements", - "The nonlinear displacement variables"); + params.addParam>( + "displacements", {}, "The nonlinear displacement variables"); params.addParam( "max_increment", 0.1, diff --git a/modules/tensor_mechanics/src/kernels/GeneralizedPlaneStrainOffDiag.C b/modules/tensor_mechanics/src/kernels/GeneralizedPlaneStrainOffDiag.C index fe1db4b0c474..6dda05934f06 100644 --- a/modules/tensor_mechanics/src/kernels/GeneralizedPlaneStrainOffDiag.C +++ b/modules/tensor_mechanics/src/kernels/GeneralizedPlaneStrainOffDiag.C @@ -44,7 +44,7 @@ GeneralizedPlaneStrainOffDiag::validParams() "The index number of scalar_out_of_plane_strain this kernel acts on"); params.addParam("base_name", "Material property base name"); params.addParam>( - "eigenstrain_names", "List of eigenstrains to be applied in this strain calculation"); + "eigenstrain_names", {}, "List of eigenstrains to be applied in this strain calculation"); return params; } diff --git a/modules/tensor_mechanics/src/kernels/StressDivergenceTensors.C b/modules/tensor_mechanics/src/kernels/StressDivergenceTensors.C index 14574350e388..bb7f42b99eb0 100644 --- a/modules/tensor_mechanics/src/kernels/StressDivergenceTensors.C +++ b/modules/tensor_mechanics/src/kernels/StressDivergenceTensors.C @@ -41,6 +41,7 @@ StressDivergenceTensors::validParams() params.addParam>( "eigenstrain_names", + {}, "List of eigenstrains used in the strain calculation. Used for computing their derivatives " "for off-diagonal Jacobian terms."); params.addCoupledVar("out_of_plane_strain", diff --git a/modules/tensor_mechanics/src/kernels/WeakPlaneStress.C b/modules/tensor_mechanics/src/kernels/WeakPlaneStress.C index 51af9b406871..bfab9f8a84a4 100644 --- a/modules/tensor_mechanics/src/kernels/WeakPlaneStress.C +++ b/modules/tensor_mechanics/src/kernels/WeakPlaneStress.C @@ -30,6 +30,7 @@ WeakPlaneStress::validParams() "simulations without temperature coupling.)"); params.addParam>( "eigenstrain_names", + {}, "List of eigenstrains used in the strain calculation. Used for computing their derivaties " "for off-diagonal Jacobian terms."); params.addParam("base_name", "Material property base name"); diff --git a/modules/tensor_mechanics/src/kernels/lagrangian/LagrangianStressDivergenceBase.C b/modules/tensor_mechanics/src/kernels/lagrangian/LagrangianStressDivergenceBase.C index 1a8691313c28..7bb55c2971c6 100644 --- a/modules/tensor_mechanics/src/kernels/lagrangian/LagrangianStressDivergenceBase.C +++ b/modules/tensor_mechanics/src/kernels/lagrangian/LagrangianStressDivergenceBase.C @@ -29,6 +29,7 @@ LagrangianStressDivergenceBase::validParams() params.addParam>( "eigenstrain_names", + {}, "List of eigenstrains used in the strain calculation. Used for computing their derivatives " "for off-diagonal Jacobian terms."); diff --git a/modules/tensor_mechanics/src/materials/ADComputeSmearedCrackingStress.C b/modules/tensor_mechanics/src/materials/ADComputeSmearedCrackingStress.C index 51dcecb1a266..728500a09ecd 100644 --- a/modules/tensor_mechanics/src/materials/ADComputeSmearedCrackingStress.C +++ b/modules/tensor_mechanics/src/materials/ADComputeSmearedCrackingStress.C @@ -31,6 +31,7 @@ ADComputeSmearedCrackingStress::validParams() "a softening model"); params.addParam>( "softening_models", + {}, "The material objects used to compute softening behavior for loading a crack." "Either 1 or 3 models must be specified. If a single model is specified, it is" "used for all directions. If 3 models are specified, they will be used for the" diff --git a/modules/tensor_mechanics/src/materials/ADComputeStrainBase.C b/modules/tensor_mechanics/src/materials/ADComputeStrainBase.C index e1e67c473c5a..93423ab8d0e4 100644 --- a/modules/tensor_mechanics/src/materials/ADComputeStrainBase.C +++ b/modules/tensor_mechanics/src/materials/ADComputeStrainBase.C @@ -28,7 +28,7 @@ ADComputeStrainBaseTempl::validParams() params.addParam( "volumetric_locking_correction", false, "Flag to correct volumetric locking"); params.addParam>( - "eigenstrain_names", "List of eigenstrains to be applied in this strain calculation"); + "eigenstrain_names", {}, "List of eigenstrains to be applied in this strain calculation"); params.addParam("global_strain", "Optional material property holding a global strain " "tensor applied to the mesh as a whole"); diff --git a/modules/tensor_mechanics/src/materials/ADComputeStrainIncrementBasedStress.C b/modules/tensor_mechanics/src/materials/ADComputeStrainIncrementBasedStress.C index 383595e2db82..a576c014c5e2 100644 --- a/modules/tensor_mechanics/src/materials/ADComputeStrainIncrementBasedStress.C +++ b/modules/tensor_mechanics/src/materials/ADComputeStrainIncrementBasedStress.C @@ -16,7 +16,7 @@ ADComputeStrainIncrementBasedStress::validParams() { InputParameters params = ADComputeStressBase::validParams(); params.addClassDescription("Compute stress after subtracting inelastic strain increments"); - params.addParam>("inelastic_strain_names", + params.addParam>("inelastic_strain_names",{}, "Names of inelastic strain properties"); return params; diff --git a/modules/tensor_mechanics/src/materials/ComputeIncrementalBeamStrain.C b/modules/tensor_mechanics/src/materials/ComputeIncrementalBeamStrain.C index afdc5574432a..f1d6ba9f82f9 100644 --- a/modules/tensor_mechanics/src/materials/ComputeIncrementalBeamStrain.C +++ b/modules/tensor_mechanics/src/materials/ComputeIncrementalBeamStrain.C @@ -55,7 +55,9 @@ ComputeIncrementalBeamStrain::validParams() "supplied as either a number or a variable name."); params.addParam("large_strain", false, "Set to true if large strain are to be calculated."); params.addParam>( - "eigenstrain_names", "List of beam eigenstrains to be applied in this strain calculation."); + "eigenstrain_names", + {}, + "List of beam eigenstrains to be applied in this strain calculation."); params.addParam( "elasticity_prefactor", "Optional function to use as a scalar prefactor on the elasticity vector for the beam."); diff --git a/modules/tensor_mechanics/src/materials/ComputeSmearedCrackingStress.C b/modules/tensor_mechanics/src/materials/ComputeSmearedCrackingStress.C index b06592da15cd..3d9c5e71f071 100644 --- a/modules/tensor_mechanics/src/materials/ComputeSmearedCrackingStress.C +++ b/modules/tensor_mechanics/src/materials/ComputeSmearedCrackingStress.C @@ -30,6 +30,7 @@ ComputeSmearedCrackingStress::validParams() "a softening model"); params.addParam>( "softening_models", + {}, "The material objects used to compute softening behavior for loading a crack." "Either 1 or 3 models must be specified. If a single model is specified, it is" "used for all directions. If 3 models are specified, they will be used for the" diff --git a/modules/tensor_mechanics/src/materials/ComputeStrainBase.C b/modules/tensor_mechanics/src/materials/ComputeStrainBase.C index ccd7d6f9614f..24853f95a98c 100644 --- a/modules/tensor_mechanics/src/materials/ComputeStrainBase.C +++ b/modules/tensor_mechanics/src/materials/ComputeStrainBase.C @@ -25,7 +25,7 @@ ComputeStrainBase::validParams() params.addParam( "volumetric_locking_correction", false, "Flag to correct volumetric locking"); params.addParam>( - "eigenstrain_names", "List of eigenstrains to be applied in this strain calculation"); + "eigenstrain_names", {}, "List of eigenstrains to be applied in this strain calculation"); params.addParam("global_strain", "Optional material property holding a global strain " "tensor applied to the mesh as a whole"); diff --git a/modules/tensor_mechanics/src/materials/ComputeStrainIncrementBasedStress.C b/modules/tensor_mechanics/src/materials/ComputeStrainIncrementBasedStress.C index 5254ea66191e..37143372aeb0 100644 --- a/modules/tensor_mechanics/src/materials/ComputeStrainIncrementBasedStress.C +++ b/modules/tensor_mechanics/src/materials/ComputeStrainIncrementBasedStress.C @@ -16,7 +16,7 @@ ComputeStrainIncrementBasedStress::validParams() { InputParameters params = ComputeStressBase::validParams(); params.addClassDescription("Compute stress after subtracting inelastic strain increments"); - params.addParam>("inelastic_strain_names", + params.addParam>("inelastic_strain_names", {}, "Names of inelastic strain properties"); return params; diff --git a/modules/tensor_mechanics/src/materials/HillConstants.C b/modules/tensor_mechanics/src/materials/HillConstants.C index 90b0d23ba9c4..a6ae9ae23a98 100644 --- a/modules/tensor_mechanics/src/materials/HillConstants.C +++ b/modules/tensor_mechanics/src/materials/HillConstants.C @@ -34,6 +34,7 @@ HillConstantsTempl::validParams() "the rotation angles about z-, x-, and z-axis, respectively in degrees."); params.addParam>( "function_names", + {}, "A set of functions that describe the evolution of anisotropy with temperature"); params.addParam( "use_large_rotation", diff --git a/modules/tensor_mechanics/src/materials/ThermalFractureIntegral.C b/modules/tensor_mechanics/src/materials/ThermalFractureIntegral.C index 3b02aec2e919..06e92ed46cfa 100644 --- a/modules/tensor_mechanics/src/materials/ThermalFractureIntegral.C +++ b/modules/tensor_mechanics/src/materials/ThermalFractureIntegral.C @@ -20,7 +20,7 @@ ThermalFractureIntegral::validParams() "Calculates summation of the derivative of the eigenstrains with respect to temperature."); params.addRequiredCoupledVar("temperature", "Coupled temperature"); params.addParam>( - "eigenstrain_names", "List of eigenstrains to be applied in this strain calculation"); + "eigenstrain_names", {}, "List of eigenstrains to be applied in this strain calculation"); return params; } diff --git a/modules/tensor_mechanics/src/materials/abaqus/AbaqusUMATStress.C b/modules/tensor_mechanics/src/materials/abaqus/AbaqusUMATStress.C index b6b42e03ed31..568d7ac2d6d1 100644 --- a/modules/tensor_mechanics/src/materials/abaqus/AbaqusUMATStress.C +++ b/modules/tensor_mechanics/src/materials/abaqus/AbaqusUMATStress.C @@ -40,7 +40,7 @@ AbaqusUMATStress::validParams() params.addCoupledVar("temperature", 0.0, "Coupled temperature"); params.addCoupledVar("external_fields", "The external fields that can be used in the UMAT subroutine"); - params.addParam>("external_properties", ""); + params.addParam>("external_properties", {}, ""); params.addParam("decomposition_method", ComputeFiniteStrain::decompositionType(), "Method to calculate the strain kinematics."); @@ -83,8 +83,10 @@ AbaqusUMATStress::AbaqusUMATStress(const InputParameters & parameters) getOptionalMaterialProperty(_base_name + "rotation_increment")), _temperature(coupledValue("temperature")), _temperature_old(coupledValueOld("temperature")), - _external_fields(coupledValues("external_fields")), - _external_fields_old(coupledValuesOld("external_fields")), + _external_fields(isCoupled("external_fields") ? coupledValues("external_fields") + : std::vector{}), + _external_fields_old(isCoupled("external_fields") ? coupledValuesOld("external_fields") + : std::vector{}), _number_external_fields(_external_fields.size()), _external_property_names(getParam>("external_properties")), _number_external_properties(_external_property_names.size()), diff --git a/modules/tensor_mechanics/src/materials/crystal_plasticity/ComputeMultipleCrystalPlasticityStress.C b/modules/tensor_mechanics/src/materials/crystal_plasticity/ComputeMultipleCrystalPlasticityStress.C index fb7bd454fccd..d82475dbb6b6 100644 --- a/modules/tensor_mechanics/src/materials/crystal_plasticity/ComputeMultipleCrystalPlasticityStress.C +++ b/modules/tensor_mechanics/src/materials/crystal_plasticity/ComputeMultipleCrystalPlasticityStress.C @@ -33,8 +33,8 @@ ComputeMultipleCrystalPlasticityStress::validParams() params.addRequiredParam>( "crystal_plasticity_models", "The material objects to use to calculate crystal plasticity stress and strains."); - params.addParam>("eigenstrain_names", - "The material objects to calculate eigenstrains."); + params.addParam>( + "eigenstrain_names", {}, "The material objects to calculate eigenstrains."); params.addParam("tan_mod_type", MooseEnum("exact none", "none"), "Type of tangent moduli for preconditioner: default elastic"); diff --git a/modules/tensor_mechanics/src/materials/crystal_plasticity/FiniteStrainCrystalPlasticity.C b/modules/tensor_mechanics/src/materials/crystal_plasticity/FiniteStrainCrystalPlasticity.C index f4bb2ad74f3e..adacd7e910d5 100644 --- a/modules/tensor_mechanics/src/materials/crystal_plasticity/FiniteStrainCrystalPlasticity.C +++ b/modules/tensor_mechanics/src/materials/crystal_plasticity/FiniteStrainCrystalPlasticity.C @@ -23,9 +23,9 @@ FiniteStrainCrystalPlasticity::validParams() params.addClassDescription( "Crystal Plasticity base class: FCC system with power law flow rule implemented"); params.addRequiredParam("nss", "Number of slip systems"); - params.addParam>("gprops", "Initial values of slip system resistances"); - params.addParam>("hprops", "Hardening properties"); - params.addParam>("flowprops", "Parameters used in slip rate equations"); + params.addParam>("gprops", {}, "Initial values of slip system resistances"); + params.addParam>("hprops", {}, "Hardening properties"); + params.addParam>("flowprops", {}, "Parameters used in slip rate equations"); params.addRequiredParam("slip_sys_file_name", "Name of the file containing the slip system"); params.addParam( diff --git a/modules/tensor_mechanics/src/materials/lagrangian/ComputeLagrangianStrainBase.C b/modules/tensor_mechanics/src/materials/lagrangian/ComputeLagrangianStrainBase.C index 110ba37242e3..57204926a86c 100644 --- a/modules/tensor_mechanics/src/materials/lagrangian/ComputeLagrangianStrainBase.C +++ b/modules/tensor_mechanics/src/materials/lagrangian/ComputeLagrangianStrainBase.C @@ -19,10 +19,11 @@ ComputeLagrangianStrainBase::baseParams() params.addParam( "large_kinematics", false, "Use large displacement kinematics in the kernel."); params.addParam("stabilize_strain", false, "Average the volumetric strains"); - params.addParam>("eigenstrain_names", - "List of eigenstrains to account for"); + params.addParam>( + "eigenstrain_names", {}, "List of eigenstrains to account for"); params.addParam>( "homogenization_gradient_names", + {}, "List of homogenization gradients to add to the displacement gradient"); params.addParam("base_name", "Material property base name"); diff --git a/modules/tensor_mechanics/src/userobjects/AbaqusUserElement.C b/modules/tensor_mechanics/src/userobjects/AbaqusUserElement.C index dbf61d2949b5..84a63b3319c9 100644 --- a/modules/tensor_mechanics/src/userobjects/AbaqusUserElement.C +++ b/modules/tensor_mechanics/src/userobjects/AbaqusUserElement.C @@ -37,6 +37,7 @@ AbaqusUserElement::validParams() // auxiliary variables (including temperature) params.addParam>( "external_fields", + {}, "Auxiliary field variables (or 'predifined field variables') passed to the UEL plugin. Some " "plugins may assume that the first field is temperature when there are multiple external " "fields."); diff --git a/modules/tensor_mechanics/src/userobjects/CrackFrontDefinition.C b/modules/tensor_mechanics/src/userobjects/CrackFrontDefinition.C index 1d56e6a86027..e4a8e0f2816c 100644 --- a/modules/tensor_mechanics/src/userobjects/CrackFrontDefinition.C +++ b/modules/tensor_mechanics/src/userobjects/CrackFrontDefinition.C @@ -88,10 +88,10 @@ addCrackFrontDefinitionParams(InputParameters & params) params.addParam("disp_x", "Variable containing the x displacement"); params.addParam("disp_y", "Variable containing the y displacement"); params.addParam("disp_z", "Variable containing the z displacement"); - params.addParam>("j_integral_radius_inner", - "Radius for J-Integral calculation"); - params.addParam>("j_integral_radius_outer", - "Radius for J-Integral calculation"); + params.addParam>( + "j_integral_radius_inner", {}, "Radius for J-Integral calculation"); + params.addParam>( + "j_integral_radius_outer", {}, "Radius for J-Integral calculation"); MooseEnum q_function_type("Geometry Topology", "Geometry"); params.addParam("q_function_type", q_function_type, @@ -131,7 +131,7 @@ CrackFrontDefinition::CrackFrontDefinition(const InputParameters & parameters) { if (isParamValid("crack_front_points")) { - if (isParamValid("boundary")) + if (isParamSetByUser("boundary")) paramError("crack_front_points", "CrackFrontDefinition error: since boundary is defined, crack_front_points should " "not be added."); @@ -148,7 +148,7 @@ CrackFrontDefinition::CrackFrontDefinition(const InputParameters & parameters) } else if (isParamValid("crack_front_points_provider")) { - if (isParamValid("boundary")) + if (isParamSetByUser("boundary")) paramError("crack_front_points_provider", "CrackFrontDefinition error: since boundary is defined, " "crack_front_points_provider should not be added."); diff --git a/modules/tensor_mechanics/src/userobjects/CrystalPlasticityStateVarRateComponentVoce.C b/modules/tensor_mechanics/src/userobjects/CrystalPlasticityStateVarRateComponentVoce.C index 2c307135276e..da6a4f3f1363 100644 --- a/modules/tensor_mechanics/src/userobjects/CrystalPlasticityStateVarRateComponentVoce.C +++ b/modules/tensor_mechanics/src/userobjects/CrystalPlasticityStateVarRateComponentVoce.C @@ -29,6 +29,7 @@ CrystalPlasticityStateVarRateComponentVoce::validParams() CrystalPlasticityStateVarRateComponentVoce::crystalLatticeTypeOptions(), "Type of crystal lattyce structure output"); params.addParam>("groups", + {}, "To group the initial values on different " "slip systems 'format: [start end)', i.e.'0 " "12 24 48' groups 0-11, 12-23 and 24-48 "); diff --git a/modules/tensor_mechanics/src/userobjects/CrystalPlasticityStateVariable.C b/modules/tensor_mechanics/src/userobjects/CrystalPlasticityStateVariable.C index 0d6066c0a971..27818fcbd689 100644 --- a/modules/tensor_mechanics/src/userobjects/CrystalPlasticityStateVariable.C +++ b/modules/tensor_mechanics/src/userobjects/CrystalPlasticityStateVariable.C @@ -27,10 +27,12 @@ CrystalPlasticityStateVariable::validParams() intvar_read_options, "Read from options for initial value of internal variables: Default from .i file"); params.addParam>("groups", + {}, "To group the initial values on different " "slip systems 'format: [start end)', i.e.'0 " "4 8 11' groups 0-3, 4-7 and 8-11 "); params.addParam>("group_values", + {}, "The initial values corresponding to each " "group, i.e. '0.0 1.0 2.0' means 0-4 = 0.0, " "4-8 = 1.0 and 8-12 = 2.0 "); diff --git a/modules/tensor_mechanics/test/src/kernels/LagrangianStressDivergenceBaseS.C b/modules/tensor_mechanics/test/src/kernels/LagrangianStressDivergenceBaseS.C index 8e06253a552f..6ae4d04c60bd 100644 --- a/modules/tensor_mechanics/test/src/kernels/LagrangianStressDivergenceBaseS.C +++ b/modules/tensor_mechanics/test/src/kernels/LagrangianStressDivergenceBaseS.C @@ -29,6 +29,7 @@ LagrangianStressDivergenceBaseS::validParams() params.addParam>( "eigenstrain_names", + {}, "List of eigenstrains used in the strain calculation. Used for computing their derivatives " "for off-diagonal Jacobian terms."); diff --git a/modules/tensor_mechanics/test/tests/notched_plastic_block/biaxial_planar.i b/modules/tensor_mechanics/test/tests/notched_plastic_block/biaxial_planar.i index 0486ffdd7e43..869b653cfc55 100644 --- a/modules/tensor_mechanics/test/tests/notched_plastic_block/biaxial_planar.i +++ b/modules/tensor_mechanics/test/tests/notched_plastic_block/biaxial_planar.i @@ -245,7 +245,7 @@ start_time = -1 end_time = 10 dt = 1 - dtmin = 1 + dtmin = 0.1 solve_type = NEWTON type = Transient @@ -255,8 +255,8 @@ l_max_its = 200 nl_max_its = 400 - petsc_options_iname = '-pc_type -pc_asm_overlap -sub_pc_type -ksp_type -ksp_gmres_restart' - petsc_options_value = ' asm 2 lu gmres 200' + petsc_options_iname = '-pc_type' + petsc_options_value = 'lu' [] diff --git a/modules/tensor_mechanics/test/tests/notched_plastic_block/gold/biaxial_planar_out.csv b/modules/tensor_mechanics/test/tests/notched_plastic_block/gold/biaxial_planar_out.csv index d87e3cb1bd81..09c7e00e37ba 100644 --- a/modules/tensor_mechanics/test/tests/notched_plastic_block/gold/biaxial_planar_out.csv +++ b/modules/tensor_mechanics/test/tests/notched_plastic_block/gold/biaxial_planar_out.csv @@ -1,4 +1,6 @@ time,s_zz -1,0 -0,4212480.7815763 -1,4256182.3497563 +-0.75,4212480.7763311 +-0.25,4212480.7687263 +0.75,4246241.4049096 +1,4256259.3495139 diff --git a/modules/thermal_hydraulics/src/components/Component2D.C b/modules/thermal_hydraulics/src/components/Component2D.C index 3e90fd0b79e1..f04f05228db7 100644 --- a/modules/thermal_hydraulics/src/components/Component2D.C +++ b/modules/thermal_hydraulics/src/components/Component2D.C @@ -48,7 +48,7 @@ Component2D::check() const { GeneratedMeshComponent::check(); - if (isParamValid("axial_region_names")) + if (isParamSetByUser("axial_region_names")) checkEqualSize("axial_region_names", "length"); else if (_n_sections > 1) logError("If there is more than 1 axial region, then the parameter 'axial_region_names' must " diff --git a/modules/thermal_hydraulics/src/components/GeneratedMeshComponent.C b/modules/thermal_hydraulics/src/components/GeneratedMeshComponent.C index f3aa7cf7eac8..bd4446df0b0d 100644 --- a/modules/thermal_hydraulics/src/components/GeneratedMeshComponent.C +++ b/modules/thermal_hydraulics/src/components/GeneratedMeshComponent.C @@ -16,8 +16,8 @@ GeneratedMeshComponent::validParams() InputParameters params = GeometricalComponent::validParams(); params += DiscreteLineSegmentInterface::validParams(); - params.addParam>("axial_region_names", - "Names to assign to axial regions"); + params.addParam>( + "axial_region_names", {}, "Names to assign to axial regions"); return params; } diff --git a/modules/thermal_hydraulics/src/components/HeatStructureBase.C b/modules/thermal_hydraulics/src/components/HeatStructureBase.C index 686757cb83da..5326536a4e65 100644 --- a/modules/thermal_hydraulics/src/components/HeatStructureBase.C +++ b/modules/thermal_hydraulics/src/components/HeatStructureBase.C @@ -63,7 +63,7 @@ HeatStructureBase::addMooseObjects() { HeatStructureInterface::addMooseObjects(); - if (isParamValid("materials")) + if (isParamSetByUser("materials")) { _hc_model->addMaterials(); diff --git a/modules/thermal_hydraulics/src/components/HeatStructureCylindrical.C b/modules/thermal_hydraulics/src/components/HeatStructureCylindrical.C index 64f3d75a6300..f943c72c6010 100644 --- a/modules/thermal_hydraulics/src/components/HeatStructureCylindrical.C +++ b/modules/thermal_hydraulics/src/components/HeatStructureCylindrical.C @@ -20,7 +20,8 @@ HeatStructureCylindrical::validParams() params.addRequiredParam>("widths", "Width of each radial region [m]"); params.addRequiredParam>("n_part_elems", "Number of elements of each radial region"); - params.addParam>("materials", "Material name for each radial region"); + params.addParam>( + "materials", {}, "Material name for each radial region"); params.addParam("num_rods", 1.0, "Number of rods represented by this heat structure"); params.addParam("inner_radius", 0., "Inner radius of the heat structure [m]"); @@ -68,6 +69,6 @@ HeatStructureCylindrical::check() const checkEqualSize("names", "n_part_elems"); checkEqualSize("names", "widths"); - if (isParamValid("materials")) + if (isParamSetByUser("materials")) checkEqualSize("names", "materials"); } diff --git a/modules/thermal_hydraulics/src/components/HeatStructurePlate.C b/modules/thermal_hydraulics/src/components/HeatStructurePlate.C index 65f42c901fe7..498e32d1742f 100644 --- a/modules/thermal_hydraulics/src/components/HeatStructurePlate.C +++ b/modules/thermal_hydraulics/src/components/HeatStructurePlate.C @@ -20,8 +20,8 @@ HeatStructurePlate::validParams() params.addRequiredParam>("widths", "Width of each transverse region [m]"); params.addRequiredParam>( "n_part_elems", "Number of elements of each transverse region"); - params.addParam>("materials", - "Material name for each transverse region"); + params.addParam>( + "materials", {}, "Material name for each transverse region"); params.addParam("num_rods", 1.0, "Number of rods represented by this heat structure"); params.addRequiredParam("depth", "Dimension of plate fuel in the third direction [m]"); @@ -63,7 +63,7 @@ HeatStructurePlate::check() const checkEqualSize("names", "n_part_elems"); checkEqualSize("names", "widths"); - if (isParamValid("materials")) + if (isParamSetByUser("materials")) checkEqualSize("names", "materials"); } diff --git a/modules/thermal_hydraulics/src/components/ShaftConnectedCompressor1Phase.C b/modules/thermal_hydraulics/src/components/ShaftConnectedCompressor1Phase.C index da16289a6497..31640290adf4 100644 --- a/modules/thermal_hydraulics/src/components/ShaftConnectedCompressor1Phase.C +++ b/modules/thermal_hydraulics/src/components/ShaftConnectedCompressor1Phase.C @@ -27,6 +27,7 @@ ShaftConnectedCompressor1Phase::validParams() params.makeParamRequired("A_ref"); params.addRequiredParam("inlet", "Compressor inlet"); params.addRequiredParam("outlet", "Compressor outlet"); + params.set>("connections") = {}; params.suppressParameter>("connections"); params.addParam("treat_as_turbine", false, "Treat the compressor as a turbine?"); params.addRequiredParam("omega_rated", "Rated compressor speed [rad/s]"); diff --git a/modules/thermal_hydraulics/src/components/ShaftConnectedPump1Phase.C b/modules/thermal_hydraulics/src/components/ShaftConnectedPump1Phase.C index da30fa225bba..ca950cc6a370 100644 --- a/modules/thermal_hydraulics/src/components/ShaftConnectedPump1Phase.C +++ b/modules/thermal_hydraulics/src/components/ShaftConnectedPump1Phase.C @@ -25,6 +25,7 @@ ShaftConnectedPump1Phase::validParams() params.makeParamRequired("A_ref"); params.addRequiredParam("inlet", "Pump inlet"); params.addRequiredParam("outlet", "Pump outlet"); + params.set>("connections") = {}; params.suppressParameter>("connections"); params.addRequiredParam("omega_rated", "Rated pump speed [rad/s]"); params.addRequiredParam("volumetric_rated", "Rated pump volumetric flow rate [m^3/s]"); diff --git a/modules/thermal_hydraulics/src/components/ShaftConnectedTurbine1Phase.C b/modules/thermal_hydraulics/src/components/ShaftConnectedTurbine1Phase.C index f1c7cc078b71..1330cb9f23e5 100644 --- a/modules/thermal_hydraulics/src/components/ShaftConnectedTurbine1Phase.C +++ b/modules/thermal_hydraulics/src/components/ShaftConnectedTurbine1Phase.C @@ -25,6 +25,7 @@ ShaftConnectedTurbine1Phase::validParams() params.makeParamRequired("A_ref"); params.addRequiredParam("inlet", "Turbine inlet"); params.addRequiredParam("outlet", "Turbine outlet"); + params.set>("connections") = {}; params.suppressParameter>("connections"); params.addRequiredParam("omega_rated", "Rated turbine speed [rad/s]"); params.addRequiredParam("D_wheel", diff --git a/modules/thermal_hydraulics/src/userobjects/ADFlowJunctionUserObject.C b/modules/thermal_hydraulics/src/userobjects/ADFlowJunctionUserObject.C index 01e58f4a5c25..186f81003683 100644 --- a/modules/thermal_hydraulics/src/userobjects/ADFlowJunctionUserObject.C +++ b/modules/thermal_hydraulics/src/userobjects/ADFlowJunctionUserObject.C @@ -18,7 +18,7 @@ ADFlowJunctionUserObject::validParams() params.addRequiredParam>( "normals", "Flow channel outward normals or junction inward normals"); params.addParam>( - "processor_ids", "Processor IDs owning each connected flow channel element"); + "processor_ids", {}, "Processor IDs owning each connected flow channel element"); params.addClassDescription("Provides common interfaces for flow junction user objects"); diff --git a/modules/thermal_hydraulics/test/src/actions/JacobianTestGeneralAction.C b/modules/thermal_hydraulics/test/src/actions/JacobianTestGeneralAction.C index 9489e94cadd1..d8f409140936 100644 --- a/modules/thermal_hydraulics/test/src/actions/JacobianTestGeneralAction.C +++ b/modules/thermal_hydraulics/test/src/actions/JacobianTestGeneralAction.C @@ -20,8 +20,9 @@ JacobianTestGeneralAction::validParams() { InputParameters params = JacobianTestAction::validParams(); - params.addParam>("variable_names", "List of variables"); - params.addParam>("variable_values", "List of values of the variables"); + params.addParam>("variable_names", {}, "List of variables"); + params.addParam>( + "variable_values", {}, "List of values of the variables"); params.set("fe_family") = "LAGRANGE"; params.set("fe_order") = "FIRST"; diff --git a/modules/thermal_hydraulics/test/src/actions/TestAction.C b/modules/thermal_hydraulics/test/src/actions/TestAction.C index df3814505e3c..b4b87b9f9a3a 100644 --- a/modules/thermal_hydraulics/test/src/actions/TestAction.C +++ b/modules/thermal_hydraulics/test/src/actions/TestAction.C @@ -20,16 +20,17 @@ TestAction::validParams() params.addParam("use_transient_executioner", "Option to use a transient executioner"); params.addParam("generate_mesh", true, "Option to have the action generate the mesh"); - params.addParam>("scalar_variable_names", "List of scalar variables"); - params.addParam>("scalar_variable_values", - "List of values of the scalar variables"); - params.addParam>("aux_variable_names", "List of aux variables"); - params.addParam>("aux_variable_values", - "List of values of the aux variables"); - params.addParam>("mat_property_names", - "List of material property names"); - params.addParam>("mat_property_values", - "List of values of the material properties"); + params.addParam>( + "scalar_variable_names", {}, "List of scalar variables"); + params.addParam>( + "scalar_variable_values", {}, "List of values of the scalar variables"); + params.addParam>("aux_variable_names", {}, "List of aux variables"); + params.addParam>( + "aux_variable_values", {}, "List of values of the aux variables"); + params.addParam>( + "mat_property_names", {}, "List of material property names"); + params.addParam>( + "mat_property_values", {}, "List of values of the material properties"); params.addParam("ad", false, "Setup for AD or non-AD testing"); params.addPrivateParam("fe_family"); diff --git a/modules/xfem/src/actions/XFEMAction.C b/modules/xfem/src/actions/XFEMAction.C index b340b464e87a..d3fd0f2e9d3b 100644 --- a/modules/xfem/src/actions/XFEMAction.C +++ b/modules/xfem/src/actions/XFEMAction.C @@ -48,6 +48,7 @@ XFEMAction::validParams() params.addParam>( "geometric_cut_userobjects", + {}, "List of names of GeometricCutUserObjects with cut info and methods"); params.addParam("qrule", "volfrac", "XFEM quadrature rule to use"); params.addRangeCheckedParam( @@ -64,6 +65,7 @@ XFEMAction::validParams() "The CrackFrontDefinition user object name (only " "needed if 'use_crack_tip_enrichment=true')"); params.addParam>("displacements", + {}, "Names of displacement variables (only " "needed if 'use_crack_tip_enrichment=true')"); params.addParam>("enrichment_displacements", diff --git a/test/src/nodalkernels/ADLowerBoundNodalKernel.C b/test/src/nodalkernels/ADLowerBoundNodalKernel.C index 6c37fe4ea960..5509b5bc6cd2 100644 --- a/test/src/nodalkernels/ADLowerBoundNodalKernel.C +++ b/test/src/nodalkernels/ADLowerBoundNodalKernel.C @@ -19,7 +19,7 @@ ADLowerBoundNodalKernel::validParams() "v", "The coupled variable we require to be greater than the lower bound"); params.addParam("lower_bound", "The lower bound on the coupled variable"); params.addParam>( - "exclude_boundaries", + "exclude_boundaries", {}, "Boundaries on which not to execute the NodalKernel. This can be useful for avoiding " "singularity in the matrix in case a constraint is active in the same place that a " "DirichletBC is set"); diff --git a/test/src/nodalkernels/ADUpperBoundNodalKernel.C b/test/src/nodalkernels/ADUpperBoundNodalKernel.C index 95c147ca89eb..875c09ca6989 100644 --- a/test/src/nodalkernels/ADUpperBoundNodalKernel.C +++ b/test/src/nodalkernels/ADUpperBoundNodalKernel.C @@ -20,6 +20,7 @@ ADUpperBoundNodalKernel::validParams() params.addParam("upper_bound", "The upper bound on the coupled variable"); params.addParam>( "exclude_boundaries", + {}, "Boundaries on which not to execute the NodalKernel. This can be useful for avoiding " "singularity in the matrix in case a constraint is active in the same place that a " "DirichletBC is set"); From 8407bb3eb84aaabec32ae56487e28262e73d37e2 Mon Sep 17 00:00:00 2001 From: MengnanLi91 <118846840+MengnanLi91@users.noreply.github.com> Date: Thu, 28 Sep 2023 14:25:58 -0600 Subject: [PATCH 3/5] Thermal_hydraulics module fix for RELAP-7 Co-Authored-By: Lise Charlot --- .../in_and_out/frictional_02_penalty_out.e | Bin 361224 -> 0 bytes .../in_and_out/frictionless_kinematic_out.e | Bin 365116 -> 0 bytes .../dirackernels/GapHeatPointSourceMaster.C | 4 ++-- .../src/reporters/OptimizationData.C | 2 +- .../ray_tracing/src/raykernels/RayKernelBase.C | 2 +- .../notched_plastic_block/biaxial_planar.i | 6 +++--- .../gold/biaxial_planar_out.csv | 6 ++---- .../test/src/actions/ClosureTestAction.C | 6 +++--- 8 files changed, 12 insertions(+), 14 deletions(-) delete mode 100644 modules/contact/test/tests/sliding_block/in_and_out/frictional_02_penalty_out.e delete mode 100644 modules/contact/test/tests/sliding_block/in_and_out/frictionless_kinematic_out.e diff --git a/modules/contact/test/tests/sliding_block/in_and_out/frictional_02_penalty_out.e b/modules/contact/test/tests/sliding_block/in_and_out/frictional_02_penalty_out.e deleted file mode 100644 index a54253ea83893e7a725ae5c42caa72714fe1a646..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 361224 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 Dj=-+& diff --git a/modules/contact/test/tests/sliding_block/in_and_out/frictionless_kinematic_out.e b/modules/contact/test/tests/sliding_block/in_and_out/frictionless_kinematic_out.e deleted file mode 100644 index 24025ce3b71ba51692db2975c12462c89746e54b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 365116 zcmeEP2V4`$_s5RC_ZE9Q0kP|D02LHPM8#fWNCHGcf=NK^*n96Cd+!Z335ezFy`H_? zo#)xku4nnbwf+*32#^O*3gD_zs3mG? zq{77|3*5To)+-|w5}jTVg?IFoOC234kt-wd4!_Th_iBw?p`)MQ1IHD^6eyksS)T{6h z;X?f@AF5T#^biS^LZ_2NKtv;fMVUkst#@NybIA+u)du9D^m$;oh9Q9bP>K#NUO55C zKZM2;@S9r^VqpS90XYEdg?!QPyW~T;y2ATWT1^z{5Bn~Lqdz;HuPC0g`D4n{@nXL( z2KTwux)lG1Jh2!4ALduM@|A-hS9st0|M1=P{*V3sCwMnENX#r`xJN!wH`vSi|4<&T z@V@o`;kz0AzW{hQr%VGH6HAfD|3ZCbFW{a1>wLW-kbZX%^*D`pi{iT|cN8z`3hD%# zMl5f6Bz{Vjs;g8LO=|?cgEa91Ki=Y1hN1;BwWh_&KZCSTWO$XMXo0+}X_+GkFW~>D z!xu|SgtYRY?99|?rdh@_$Q%25Riu{>%WMf2QjtNXNWy~Q$!{qNjZ-b?g@qL@sF@8s;*#itcjf>FBe+7H6us&xx~Tp4;;5aPR72Vp+t zK+h!!-iOPRfS-KS|J%lg6(GI@{;X}#1Mh!^A6M#q9aT7E-0^?e3*ODb+&63mfv#5d zLK^Qj3c`08x)?8fH$Q;AtmrnTWXjM@=iMgZK!Bx-l?2i)z!C))=(6QPQ$6@ue$#t* z48F_oi^+s^3j)~7n(iD3Wa*~&?rMCO)-SVsnR16B4Ro_G_f2F!dJwWA$#c zBUbOSaVui`u1hiczWHUVcUgXmrtdYEb8LYgRJ$K_s@_*U@D<~tM!T@=yX$62M+rU9xodrf*u~{~%2ktiG}L ztc&5uTz0E>*=OjQpL<=ZPhG4F&ulLHaN(Yo7b_$|9)dhj0zaxgBwnJ^UvLFEpakso z!0TCsgpPlXtzdS4qiz$tSeJdC(ffNyEuoWFdhVrbdB~_$*Sykkld94=H>pZk?Odw^ zA{bX?4zGMRxL}(FSChJ5jNOsYh=C6Yw_ zKi9o+aunl^Oscp#078CY-0MjdwDE&m9ouep%X`0>I8`z(iFU^(m4ko3@}alcEpr?H z&@+j4J(5aqdbuyGwyW7K1=O}B-$|m~yGbSS^Ip3dcV|)w;NJVqB*vYXR1EGWPVHxQ zi|(2WoHt5h-6A9ZC|V{lUlQ%+Nh%yfR+e>pz_|C43PJ2Qy-YB>`EQ(rFUlpcZr&J- z;PE8d{W&Q&P|F*mXIyPk&TYvMBN5|PNXm}lxpA6tPb6i*zt0=XxY3Ev&-nQH>20yw7z#|+@9Wa zJ{ZHeHKt^ac_Fl`7O@uGWpP(c1w9P`PJ+)`PiFwTX@s?{Ic1l%Z2{l zv>Wctlozbalo$Q&%8Sb>%LkkCATCAzXX44^^X@6~HzP;8d^~~4w|$xX+Q2TKviWl_ zlOIbl`S1vn|Du?DSB}YV$C-SlXY!Xfldl#q`ROH-kJ>Q#$D7GF_n7>`=945ke{6PP z@Mg6UjTrsx$LQrGMjv-G zdU(f9|2!Fe>zzW+nDUy@r%{X^m9*0zA4XrUGI|oh>W6pbQ0nrod>XGa7MBUHLbn^d z&F(_#@~*t{t$R^T&B|oYThnXPg_xIbfXI#W`D?hsF6Wb`A^Yx=I7e0LlW& z0m=g^04f4RfJ%VMfGPm&?NkF)2h;%61k?iHnxHy>p8$0MZUA?H2LPvRarza<;Bi_M zr#NxC5~m(<8WE=in*o{w2mlEX1H1s<03SdLKubU?fG@xg&>GMN;16gEXa@)Yv%LoO80m1=F zKz~34Km~{dr~w*46kq^A3(x`dfM`GrU?3nCFbFUhFa$6ZFbpspFai(<7zr2!7!4Q$ z7z-E&7!Q~LmtN^S8tOBeCtO2YAtOKkEYyfNoYyxZsYyoTqYy)fu>;UWp>;mit>;dcr>;ohK z_5%(84gw4SBftbm1SA0t0g?fS0Y?Bw0mlG81C9eu08Ro<0Zs$X0L}u=0nP(104@S9 z0WJfs0ImYA0j>jX0Db}71l$7L2HXMM1>6H<0b~Va17v6XIl#@ygrPqdz?BI@e{Mh? zCJg;~0r{9P^ydc@V8YN}5KxE-Lw{jF5he`%MFGW_F!UD(lwiWpUlLG?2}6HrKp7?s z{bd2=m@xF02UK9f&|eWC0$>>WD*-A4M2x=*xK#ldhW=`R>HrKwe+@uQ0EVHz7N9l& z!_Z#`@Dl*T&|eqe2EZ`%y8}D`7>53O08aphp}#($0RY3$-w@CUfMMuw3}^ztF!VPC zGy`B5`kMm?0EVHT1c(6`hJG)AHvq%X?*nK7@Mioi!EFV=F!cKZ`~Vn+{?>pt01QLF zKcFoD!_eOj5CFh1^tT5D0x%5y9RNW93`2iMKqml(p}#XA7=U5u?*ixwz%cZ819S&q z82WnvdIB&E{k;Ia0T_n+ z7Xi#2!LVeuMSuYz%caJ1S|ny82W1imI5#g{XYSg0Wb{xZh++g3`4&MARd5W z==TJy0K_x?2H>s)U>N!v0agJp4E;?2s{t5>{$_wR01QJv0ay#bF!YN7>i`&res92f z0EVHz1z-aJ!_eOfun~Y^==TF`0$>>W+WfKM=4DfMMtl z0&E9h82UQ_b^tI8{lS2p01QKaSHLa+hM~VZU^f86(BBiV2Y_Md?+w@sz%cap1?&T0 z82bAG5&#&6{t&=^0EVGo4mbe7F!YB44gxR?{ow!u0K?GVA7BJv82VKJ69B`|uLdLn zFbw@sfFuBhp52Bz+nJ}p+6RI1b|`a9}GAOz%cX=1snrl82X0; zege*E?(6Nca5x3>Vd89#n|hY3SJ zetVY*LqC3d4}f7=09gUq0NDXK0677<0Iq=CfINV_fP8@bfC7MmfI@)6fFgjRfMS5+ zfD(X`fKq_cfHHuxfO3HHfC_+$01==PpfaEepempmpgN!ipeCRepf;cm;3q&`fE&Oa z-~p%y@C4KcGypUNGy*gRGyyaPGy^mT5C9S&26zFy0X~2hfR=z(0AGL~pf#Wkz#q^S z&<+p)Xb%VkbN~baIs!TYIs<|MT>xDH-2mMIJpercy#T!deE@v{5^=K$sc<^kpd7629k76BFmmH?IlmI0On;sGlFD*>wjs{v~OYXR#3>j4`88v&aD zn*mz@TLIeu+W|WOI{~`@y8(Ludjb0Z34r~81Av171HcF{0TKa8fJ1;}z+u1*5)c811ZV&Q06IW4U?5-+U~xl;Fo zYCfIJRQ!KP&8Oq9RLg$g(hn*bHvT`T4#2idsY)W%DzNtb0k0^9TA|m1odnwU!w)Bc zAHDulgSiZ_lp)nhl&tNQA4&&)bp5a5;L4N&R1vj=!c?!2i$Vs8+IQ&C*;j;}D*l%P z1~W}i)KU`}DOJlw0igRLA8lB4q(ZINiQvC@Fe-BIq670e?kZ)Zr+X)b4sw$$+?|TM zd#DzS34nE+2zUI^YZVHedkh%Q01F;bQhcTdV?}aBs5Dxo2YUmmXg4=E7lnJIMjj1j zY}{p<$Pi#rZuZpGMCnC!l_JNsZrqfju2QX18iL=_OL)t5J;cRRzBvZbcv5+9&;Lfs?$f@w_y(m;(9`9`@{eL=a@nK)lt!U5m+8l@Xa3oWITG|0F*N?kw_A)Rt|_( zNMK|EvN2_=$dUm?B2wfdmqQU8rBQ==wby8LiVh+Dp;XlQP#@ScBZ3U8)@wB?iC!9} zv!=xONs)hGSDygJn3nzLDepxhr5bsQQ8*xmL8PdrTEmvhI1rf5g#?v)C3Gd^dWR&r zbEwh`gsLG#6AjgrgNr+dQWcPts1;#Qw#FzV0|qLTVc}5eF&8OvT<)b7b4ZkEon8|O zM))+c2s0U$93L4n1i@Ab)F>80tdF}4(V`J(n1rIplCij;hh2hkXf}hFNR$d8mLzwA zl-;M)sd6WXcDGn|9Jr*YwNIDMI1HV!%jtzf#{QPWTfKauW7{dTYK2PY?1GE~7iqmJ z67_O(w;E`U%`Bgou4xvrQ~^s1g)UL0a=Anr9V>~T1Z9yJu!YSzr_TW(hiR7C-1Ble zWj6Qn5D4n%YKN8)@@#c+FAqhcG&3J03Qo2}tDtuTDUg=NP|uJTN^7VuB%xX;Yr(uH z)w-wnB%#vbGJ1(0QH3@2wSyl%i9%ISQtcoIU0kDA>QfZ|7j&Ac=1vE(uBJLJDX}Qxc}oV_#4g z9U7{PwW7;Mv2_YsTvlW(UQ*)sb87q`hu?jpy+(k4ps!CSo5p*MRKiiX^A^0=|!h6Xw;TneS9M zPWeoQ+RvK(j}}fq^O}_ly)wWmKxea%!vz)F>6KKdG*YQ@JmP>Y*Z`l_oqPgY<2KU_ zT*zUXi{1FlFSCo?AnI~h_GUW~&SzxF=_@guK2*gll16c+y!b>powXv=sz_E1TS#?j z@61G&*hHZgicsgS;vuJaW-mNMwF!o02^r8B>J`TXVc-QH;Ke7(Qms~+nqC7z?yCr# z-o1r|;q;I_pw3Q-_u5anNz8qmbvWh}p&CUgST61*_CGL0AXKB41VJD7MENeN zQOm$`=6lR2rp#8O7Ji`Fjs%5jRH#P3(`qzv%;5X2w-$>_>7rt%?A{8!(Tw)y@jaBG z&>KZ5ST3PA%0+{m^DZ^0Yp%93-51U1RA$<}Q42pzP7$h6p&I>8tI^c6DHeP}HEJpT z(I*V*rmio{6BLs$sGF{s{*Q3{re`}m8bdf5qs z;>ZsQig&&2Xw^It6zXM^g5@GbLcN@h@}sbXdfC=+EuV^BsFy9-4t+wsoKD7LD|#!N zk+u><8PZMRbSW_};P*dby{tuB$xiApqYU}f%M1@GlL`q6^)gDqa*-mxXfb;lxc(@heCfj^VO)+`^%w>qG1B1xJXgBMyni*$Ly&jk#L#@j!dMJ%0fkN zE5`q7MW24XoW7N4MwL)tKW@G3oDMU}kbk}Gpu>y=g?bsKV7Y{PIgP@feuTmj`pcQG z=+mi};b1Gh5)Q`7NUcowq=b6el8@2%!g| z2sJfprPnzeT3PAkLr^B64GClPQ(Q1Ns;J|U@v{YyfDC4-S&Oia2->S!n)ehzX_Ow0 znzu_{hBTjbU+J{5naq(UUzUdyhZ;EeP^OnCg5 z7*?}HYP5Pdu-N7l8a|W$PG1q^bd%sVQ8WvW@$gAyI9FET*z5@qCCzCD$H(f@NM7a< z^1-Bqe2^N9R>|yawD3t~wPGOHQ-=ef6nZHWQHuiv-8>tn&l&p$e#sIHlfsd|7E-hi z338z4f?qLq+EtMf2R5Pj=wUjB-#y&8m>sg>&|*p6s!HKijnW({2P-5pq;GriN@dE{ zJracaUaGRSug-^{12Psa`P6z0L34}ALJfR0!6vMlrR(CyEI}w`^-5S^r7)Y)q6wx; z#QFut1g)6mqlZ|@Nx=LS{Ae|LsQ;|%0$zzipN)Xbro8x>_ookAuo%(rFO_LRlu}$g z$S2BXLMiz}g4_?nFcY*p5Q3u5r^L3jy(B4196nLDB4}x=v(e|pp+c?0Q+~B@+A7$o zV@c62AGJwm2|D)$jYu#`0S5@jK&rrr2GE$XaLI?mfpEk-oDLkNw>}1sCCOcePPTmV z9rWnwgTO&+6j~?rmT`10&E7KR<(66nG#;(~nC>}S1=tp_*wcf8kUFk|vTiwk0t?$= z(Rip-Y15kJo|nNa9%N&r7%7dFz{#6n}kXGSaGG)@>ffNk&`r~-#J1fyVpSu5v9 zixLA6L_L(sV{DFLVapmmYGWC~aL|6`Ly$iFNg8c^YN>@mF5+XNj8-^t+XA~+on7e* zodW2lLRn5N|CWS6eplKI520a!;%&pXR%5S+6z%u)NPpYPB?H#pY|Sw z)?^)A+>0-UAT%3N=g@;o8(R*CNkN)KMbZ0R?3v7ns#q62)Fd1p9c)u9m~|2RL=sB% zGo*w-*+P&h7BWGL$tiNnkcxeD@gAbgvGXX`LpkV(6di_YQ>Q)`wE=?Gtu1@f$e{;^ z{%ty&JTb}~s8NZcP|GE_^~9bv<{k)g86j{14z*g17OND;ap%sVb+zOmLt~;)_VIB_Rp7pE=V$H0ywf~zr8G=SSm!N|( zj7k(v#g{S+WQKe7=w(4VoS~6mWzAO8+=^I{NF{NgEY_*aRc&CZJY`bY5cJ4+(SYTl zZc;PEqJ}GTX1xxWi*3 zVS6Vb|o|y?cWRI317kVxfK`f}9n#vAJeoPPQqEeY#qL_!psg2t>swP*4 zhEg-Sl8`~rpy1TLfhb2uO2V{CxuX;T9)Uv}p{I946Lgr1%~9r5fHuU0rmD#C!uDsV-6ii^#PqX_TmLgbt7Gj*^5$LQew5U#Vg?{T~#0%C5$Qlc~e za37Eal~(An)N_1sFC3^Iwe`{X)j`h4dY%JYQ9oAg&ma( z(`ulNm_m8D=VcuX%h;BwHu^(~*oC}x711yqlzw@ri%>%09*aZ8SSQn?J{FqXQyFWF z$WSPM^BGS_;U9uH5o8$gPJ+WG~yOE0G8=WtFrOi}CgwsRhq7()Vc)kB?*mYbsn zHW21sd;!6<#+G;_3YGCv9SY(@P$88M!rl)IX3G_spHhdGmxUlz+uMv>Ws*Zj)4?!A zz^P6_>A_s9R;iIoU|`L@y~I5)TN9*WY)djz1Z_#t+Rcw3+oymjBipG3MzQO8nzL4V z9+3#_1F3ZqHosV9I+jDOB{oG6S~ii?%&4F`o5<_lI zb!ZOc0W!q4h{9GFl1JG+Z}X~S?x5tL|D@=O!_@fPr~#ufgxwl1mi(81Pw-X$X{Njl}Bk6g~m zg)R))JDs~7Cpd1Cjv)XCc`KbDjRm3V_HHZSH zge{DjeQ+|bf1s~Vr}Q{upHm#hM!`r1uDUdnv3OuW66Vw!)Yd80H5=5{*Qx_|X*ECb zOWmNz5RFQLLy;*P#eC{zh9EU`n1Ui7fRBCrG)q3LE8~qN{rag={!xA!;Q*;KBJOgSIq=Bg$ou5iG5V}C@ z|F?x@^e`SOhj}r|r^5%>@u8Tr*QLzd{{wpHP{iJil5%@!vz(crQnjOBg$-CH(o z>9T>nqmOd1At$uHY%5Uu4t62YI}!YK8rY5oGy1+NsSeCjDD{JaVH=&sZY~nP!r4Kp zW9FD3_j)-5%RxuPFboRVdLqyC7IavW8ox>BR0tj%Myn!Vm%lt(6`it21>IXtlcUHX zv;PCVDK9>Qy3nnF$tc(*wCd2_$3M^_s5E@Yl3XEENn!P`E*fkl*e}56 zUX8*ahFP&BdP=i!*9^PNgL`lE9~c#3C*f132!!xS6nf*0Lvl!vyV}r8$#6F`%xLP- zWQ^6tCsEQ|o5p={GAuIEC}AECW(%pUYF6B#7uq&%Ty`+yHyBq5EMCE}`xLs!C(2Gg z2tyZ+i;`0*9r&a&P8G7vPPwgB5lV(>8~R5Ps+xJh9E2EY6Pn@^|I3|`tP7#{+CyyPOekFhfxuQF5EfQ6P+W|siLsu zKwF$>1t-p_q%ws(NUMQ-70Gm+fgRhdolX^n1pnU$)0{jiA`+$9_QEK0>gu`RdLWr9 zTCTvcK3J3u+eyO0HPFFkcdv0B?h}cavc{H-rC{Vvkm`O*l=h2GSd!ekW;8+jT_h|$ zkRjI&INP63g-PyuXeQ{GN$v!x?zc7?Hv7X7aFEzwf)i|CX(C~x6mtvF&iE=xk%&rO zSf^xV9n>s9@NnlaB|%WeP!(-Z1PO9Y6lGfL()i>Q+ESH7qm|q22VkSkMSfV2F>9*8 zyr607_Oi?7f$bX z`xV~Y6`L}f0uhF-iXkv>!Iso4zuc<;sVXX5Dgg_2Y-VFgu~Ful_0SY$>hyTzo+32uUYP{nTUHrFnhIIK5#7%1{88e5FBKIyjg%+lZl#!n9onUhx8cuR=-=RZi zU-wX$=2i^UXd~S5M^8-@Dik_*#>O!yB0R@oNjVH-gAGmE$d5ZU5D2f~_>NSjch|!@ zW9moe4))09INwX9sXG$H?ZvQ9588C*hs-!R{gO`NDR<*w9|B}ZnUzhwbl|QwY)cce zo*t}9>A*;;S%Bc-PEe&#hv~y{K+WMkO6~-4ODkmO&=kDUe1aZkyy->hA()nivwUq! z1gki6FTPM&R4Ozq<#6#moZ0H@=hG!1INeM~zW~GHmSWI~F|!v=QKXfU13^cLYeldL zM;X%E!tA4gF;JLm4;y5r2Wq2Mz!JF(@`r_kb}%fIz#>r^>nLeRQI8B0!xyaxQu#4O zYID~^Gl%Ai$%beq2!cT**mq<@4MfSEAhi*KZp%pqhAY$(+vXVe5*zl%nj>pTT(gfW zhds6HzwR!FHxhb9PfKCq5RqoapctgZV)l!K*%R2r>sY!sT-)u>Y; z#0E12!2*v&Ck2zbDU3C89~D88?1VaQaiB=nH6nHqTbsZAKQ{uj&#V5F_d@gqz_5KZQmLYwvHWCcPta<(lOI7iPDG*`1Z8Z>zBs?q24X7Fgi2tJ z2u4P18+W8=aJsr@{Q{i^HUz1CVsO|J{fJ+b9TKDry)ovoGd`e}28UomhF-VKsnm8r z&^EvDi!!DLj8{1-BS;bVIeJ`I1uH7>&?|Nc9?dxZ^5f8PVNFrxmzQxDI7Hbdu^CbF z~*T;)MiZ z;2ze~;3yRi?1@?f9h9J7l9Q8w68G za@fv=Huqp;l0L1Y9^YydqU?~MCx3#ecFy>9&9E<(O6QDkD%-X)S;>OSH-rkGF&t7<7Fsslu1TRJ)IS38vb8~q!zqc`lD>O1^Y3IhCA?%Xct) z+ktAnId5_>jo}Mg0ieOzrak?yU8!+{t_tWD!j5u!FoWTT?K)zjq}nNC334qQQf(RX zB^bj*K_b;LgCR5}=9l{*2J}#H<&%Gd{|WX$`3yu8>8rbsX|!dvWJbrh$1yTO!tX++}E;0@jomKQDr?Y&BIw zaXg}|i*dl1Ify$!xh6Ccj_ye9;!ZG4+k&WvHLxk-?-L*j_HXaoIoLNy;v3j1RRa&u z^^S#^dk0MhhGp&?rgD-2D+2B5D?4ABt1T%22w2 zjg=tGtD7~QyB@-1R4AOTB#m-(3OFAbS_s0HrkE5O#JxPUBM3VJB7t%wyAT-FhKt@n zKhzv$ibFcJEfh&nMo;~qn^1wZc0IUMA@1kOu8!Na5{@Q zkwLLDz9)dLMrjUlF9n=mAyp%Hu#-!}W*+W}O%t@7ua_d$+<0VVXd!49Yi{JQt zrL{`Kp8Ll}n2%!X!Ziae->2|#FAvSfqlLrPKaJLEp)*CCd!pzDso}^iv{IgeI}G5? zAsqJM+&U#jpQ_O&nnNx*8B;k{F2xU1ySU3RR-Q)dkdNBLMy6KbQA~5?kS=qa_)9Ig zWE!zfo3NH>Li$t3SW|W%;c#(1p8N+}Tj-5f=GIh(;(>BXV+AKBijQ1QcM)y6i@2W# zdq?*Ff&}3awzBEzX$-KwxL2e9fkPZxIu@3_@R)lPm(_H7$`(8y8RF(Yb`>mjUZizF z#xb{}b5_e!P&BK*sDpt|p`p01)}%5+fh~0N>QR=c$w^X$51f*hGOP<5q`1F~W4jVcJ6k z7J{(LU!#Stsm?lKGDDD=MzT`EOeP9D;AfLKnc|RI{7dx#v@qvLSrN{Z+R&?stqGzq zQM0LWo3zr_^2|Dw*&VYsiOrS8bP3W-W_)xB37Q)(cw>L@$;+W&&jEG-r|2qEv`LX~ zU|0W69Rl0?24-ZdCw`RX$PM>i0Jd$?7`cJchEuB@IaDb_sLrUPo*CCfcA*JU$Go$> zMmQ}EmZ8Te!5A$(MGm=)5jY}fQ)%%@WoCH5%%RQ6hkOX)4rZ-ppmh@o8K*DqgBT)F znxkKQnj*MP1USUQGE<%@2#KPo%jrl#IJjG*wilySLUT-J6qEykmW1Y$C=Li(B{WBh z$RP~)sgy9!Pn`n@mM3iN+&~rJ;npPMrjD%%vbB>sqk=7{4qG<-N*lTYNu>+UN3pGHBuiqjK3)WI;2G*>`yp(KCNCMLHImIM zmCXd1p-DEn=<G&Y#7EcCjVDQx_bnsbEJ3DJ=$ zidW>2d%a8%gryx02gvy(3Pli?jN7g1pyEx6V7;g^y^Y$oB{oG6*1pP=4o(5&lPDBH zhpkQE5o8Dr&WzV97%g0g$Lm%3Tf z+etoZwgMVAPMN7do={BxlGzG~mLn-4hr(_CKohN zNa&<^M7KqPduo@@k zQ;o7C?Uux02MfNN`4kSL&Mv5NY?SHw6f61R!_3I=|8IgOqthRDjS)KTnTfKw59%yE z{9nzd@R-VECJIwde^6?}z0uCA+>m2TOSe1pj?=0XWhQCX~V82R&ztjMEo) z^R4DlVtQY>RT)81L3)S)gh$zBv1ZKd=Tqz1riSeh5U-vT zZK2nJsX}Cvj|`bsmxF#8UxJDO(F(Q9VIuQtW2d_DxS72x+6uInoAo_@3Ht(Il3orQ zT*34S*rlXLNuUP=BTO&_3oSF)RhrR40tq^Ql$aR^vKu+X|H9Un^|oc}$T{}oH&#)^ z!_8oerY73F<%a&PCf@nIH(e98=QEaAG*%P^(bN?AU`_J{-c> zt0Ijv3OzkN*}u<#i!9N-(G(LOG`D=JQRkmj4kiU1+2^HLGaN`^q$S zDuJe8_e)a6rF8|7cFKGw6V_Mb$%1MlV2|K^I`$@TINSf_j!Q3m^53Yfsf9eSB*G*Gn`7O>8!Mk$`K8m0Mi zTqE)dMGl2(6s2Ifg#L26s)WK4`pXuTK_8#SlF(namm&8BJWj5cVSzU@P-e>-a|f&L zEfqw%`2?pjf52ML$x;3e%(t?GtC{V1XF#L)y+REU;Km9`Y^Iwv6bG0e(r??aa-pXI z*gKs&&52D^kf76>B338CA${A66b1OS?&K5LI)f&+@#{2g*7BJFX9m;Z)MPb%RE{-| zd`38xx(<{nC|cy!)WFYYK+=4AfgLUC7LAs7>YNcf33OuPN4U-*jg6?VX~?6IjcTNI zg9II)*Nso$!XsleI+*sLr$1Uqb!pCixZpQzqJ(NSk#IB@4DjNNGqWKO)g~BhqNc@_ z^)tr=W29!YXM9pws?|yzZvMl6u!(LQJoq9fcNFAr-h&v49 z6J@8*Nrk3mVU`bvY89RunM$1DaCQ}!*#IQt^!XI3^#!&v9rDOM%1&-MSZ710_$}4w zpnpv@I>;twm=HoWYC9{;r}z@8QQIsnRHHW8%+U=BOsGcf)rNbIUZ_UxWyqzP{|Ck# z{{0H!2oew^AV@%vfFJ=u z0)hkt2?!DpBp^sYkbocoK>~sV1PKTd5F{W-K#+hS0YL(S1Oy2P5)dRHNI;N)AOS%F zf&>H!2oew^AV@%vfFJ=u0)hl=B;a*oAztxb`zbexxsS6CxA{o85hNf;K#+hS0YL)a zxdal&48GrbYq7ZW+|;7!_2L_KrS@D17bGA^K#+hS0YL(S1Oy2P5)dRHNI;N)AOS%F zf&>H!2oew^AV@%v!1pczV)?-nk)2MrAy#X4_o;es4zWmj;2T;0xyA+YZ0$ zQ{%7W#OjjjQ2$z0iS4dspC63vPb|1ztLfp8IAUGQ)32sd=ZQtX81mK~?Lw@ndA8gT zuP9>9l^7o)-vnZF`OhVZ-P?%;{=It_)5?kM$Gj$d`tRvSY`<|yRr}gc#GL7m{emlOC)N~PJ3V>c17dNRk$v4h#S?4y%n2So;w7;x zd1$Uny(SPlvUI;O#nY9T_h!hrK3P174UgCQKYwwZSoW#M-s4ra61!?#&UdV+o>-Q& zq6C@y9>G()2adjUtNMnR`Qk~! z#zBvX&GVW0uzSf<8xrxqEH1mq zJDAw6%oDq_r5h1{edpdMPumb1$}~Ifs%b?m%K1`K`ce|Hru6IS>+Xn%nbNR2HJUyq z;(JL8)bWZXmP(FCye+LF;zx$BzBO+yv2tUNU%JLDBW87JJ78PhQpD0>I&$cZo`#im zeyJH&^&qiAHGIK+^-IIvUZ=+|O1MR=7lPLqIDhI(!?`-L zYfW-R5Ie?xTGe>kC&SI*er@jW%t|C|E1tLUm=cEHL)X0dt3w;YFspUwV#5o=>&Z8M z+1~#*;_%=*Ij%=EF?`$fbF+^peLx+{X1KKe`BpF83oH?}ky!@NUhU-2Sdi!*_QSW#1jpwTF zq)*M(nqEa48sm!j{~hu^j%?TPbBWj0pBX2Pm?EkFv=iB7R-Qr+eTEt5G-|PlcsQSw zR@srGz}Bb6_^cPhZWLHbM)VrH>r$yz#tl7N-Pm`iDH;7|&vgmM@yZ}S>8nmz$eBNP z{55#|CgZ&;TSo^x+C;|pSYZhDYhZlzlgCfl`;{S&-tDH3KAqEedT_peg+l9)&kLHy zHJG|v>~jAQQL^GkagMA%zv_Irq4Ddbp*~gj=Mh)%koY&w9b`NoKJ4t4>zl+`kCh5J z_j^}UualcsP0qU0)W~~DuSGr~rchn8(IKx2n}XMO&t3Y>4pUf=;z_yOf15hWE6M#f zPBjIn6T}xhWTv13hr3?ATlae}{{;U3SqXS;Ft$A8u`kxjZFR!c&lT=l6XM^$Yp4 z6uPaSZ{1t~?@#3$@DANSTlzc&*SF*S!X*rQUiv+#9GUtcVykq*af; zhE01q?(W!TyJ73iLzUuNMj4j%XfpWc)iVrpuZ*2kzDk^7{#v&#-Eu_{Jsw=>(luWk z(Y|Zeyg4Vt8REA6Su!AJl3|Q@{?Ty@W)QI>{W`=icQI%OT)$KCh>Kyujdy*YlxboZ z-{zd}%u3#bY}GdR)+6H$%6QKrZ~D3z=0*07@6ap3Fl7G1;^XGU6Pm%TAB{VgL`>?k zIBDqccw$o4w%5izXhV!z7A%Rc!xw(29hK?^&lyL8BkYuf_3_s~Yg#CJX%#f_{hN+{kY+A5ZWEh$Kb&2d> zrx?PfY;PTWxSv50^etii)HuWBj0!h<`ViWyDJ{e8*TtPN)oTk7PR^k^_atbcOht88^YB4O8^ zKKk~{h%JEzk54}(5y^L2x?X=en%H;oYNx$rZV+c8t2a9~Zv}DW;ar!`Kc6M8CCdNK z5?GHoAJ}p1>&YbX&@JEk+rdwWUkrbn`tOb*o|h>;aQdN=#IL0zK9uXWhj>5ErD`wv zd*bE7BArWYSwUv~tADEm^;>PP-atkRkK(!`~HqwqNh|POWvrla5`Cx zEHqM;r-PS?to&Q!zkdB|Ia#KG?Az|UCCIvOB~^Tl5oFb**DaPm>`OK_UViO6VlL^S z8-1w4)iAQfr9I0Uohm^#D_nO{ykht8-LzTw%T0R$K~%wWVdzu{&MY-NCt)6 zzkBw49x^2P+~Hq!8nVadi?@&I7Lk!jr6(tNRU_q#qX)Mrdzc(J@1d#m{xxJ&*S)2V z88zgn-C3es+Xa$?{^+owU4x*M!9oiYh!qh zaD@one7*KZQ18848bm!mGyiXNKQ>Kx^1aJf;9rn{AOS%Ff&>H!2oew^AV@%vfFJ=u z0)hkt2?!DpBp^sYkboe8A5Q|f5B_JjJfXNh{z3zS+8@7d`PW<+zR6|jI1JzQN6CCY zo@9g=3lb0{AV@%vz<*f+iCb@e-E;g?_r$HYT!^uA@E? zW#CDw&qbHNoPAV@%vfFJ=u0)hkt2?!DpBp^sYkbocoK>~sV1PKTd5F{W- zK#;)qA_4CsuY28UR-wB0si4(Q_MiOI`%r^MiHEm)cpvptDNj9m=6&*8(^c0$7Bbvg z5pD>p_?B1~&~WFr4TTIN9%&Aj`xN4%X8~Eswd1yI=f)fUSQ#DCIQBYO`{D0ovkyfLZ&eKvFaDB^Y}lwo%MSgA z8nbj7T(76{F6n)A?w1D7D;e`9<{k6vqIP84={tJ9-`(6;qVlz3zNM#=UGlyv-FC=8 zW2IF^iG`z1ll`{T*wE?HOyf^Q)$b&A>yiDVjt`sudsbtkPWApe|HPNnzx^^IcFH)T z&)x|$M|u1~#w}~FEIsb9F`!icRTCvfa#GJgpJg(CW7oDd2FY4IA?G|g-F!l}Lq_S= zY@59fz`o`gAD1;L{nn_;8}-~zx0u}MD~Xi&v@phy&9(=Wu1W5`9Dl_0{rcif$BSGI%5GdSH+uBb z?c>OM1CMPvSFVO}(}QgjCLP*GJ}Ez`=k&-U#=YgDySN-GO}^Pv^7xTEd5ni91eIJ| z!AW%TwgbTs@nrsr+dRNzQJ#@bD?ca@Ft*TvC++gm*`2}uVHD!r>UT?+g z9b)fJi`K2Ytup0Zb@yxWd@IEM50(t*TcEtD_>=Jmk79pE`WFvP7&r`?T8K0B=*nU#^#U?y3;$V}_Z+9(*wQbU9zBO`osg zxTYg3pB-M$)Gn@Goy*cO;)w^xzwyX5-PGmex`U##g~fCFkEt^*sE0|~sKUC-o-4)i z4cDEMD+p6WKFx=bzkd~PIJl*wa+Iqny4A5oL+aNP@9uKqX7g!pOd}i3xa)uCzBqAz zkYB*hai(eYjuqH5SRp>%c5l87vv!)6yuC8Ob^R;x#p8D`xwzIhZ7j3#dj0l~#rMVq z7p(vIf@wpE7NMuh>cp=WZF~3P{s!?;-{}h*P0#I>YmF$OGV#0k)YKDeNN0D68~ki_(RXSSr--BV|vr7LE|bL>UtIT`MXDj6|20my*V}WgzU9fj_y-R z->TeG{Gw*|JUzEh6+a)kW8tGe)`^d4;v4R|lFyW!E$(x%z*43Yo*yPom3B3KopHDQ zpi%oxpF+15ELe2&_fj4TeE$DPAaPFKc6kPD2{XI1f^r%T_I6F2dA?fc)2^E>;R9j^ zNtV5^+;>>fAujQy`F`fP!Fzn&)+WyA(EW&N@0!HvWk<~&TyAILj03Hkyt`UBaYjHt zuWq+v6Q`H|cHd*gjl?N4UjG(;IyrIT%`45LPBc!O`fUA~p?`%ZP8pGB<+ydT6DPjR z`tfz6(T2~}$0z$nH!}SFSJ}z;*ZpC5X{sC&_jQKhuX^5Ea^hygx67|z4GRb}ycH!3 zYpyP1%n`r2dFU~%;meB~1M}>?XDn2r@XlS`HyU$xh@4oo>~>?RXXktEm@>s!IG}4T zRS6$sm8JEDMkMw$mTkUn!-P>$M)y3r8x7Bd8>Kp528!RhO z?3bY)Ldh;*GDElo>fGBzCA}Z%X6==vHO5Gh5G(<${6%~Rgm)I zHKQzK=6?U)uZ=x#W+@-PS8r4sceVRi`KVFRZd&n)?>ZY}`;8m^cSJ5@)Ppn6_Rnc- z9Nqa{t*0}F83!Lb?k~yeXPmb7;h#fPLB_God;HP8czff5_II{Dd6i_GaV2r~0Pn)a zRlYG3wv>8cT(ookvu|V#a**8;_Q4Q!Ibg=f>-`8W-r%^cUlKL*MRA^7$Aa z)|3wU_3LTlFOxdgDCkzk_*^>Ov+t@V#$WUHd{*YgQR9aapG)^$_}ut%n`uyqVKq$I zNVQTzp$FeJP?wdU3E&3z8{9;p! zFV!d1n^VrzEHEm|8tn#CVEL@&{f`$mwYqsXyUQaFQ@4BZNexU3O+k}N_KGUzW(s+J zNwZ<=P*cxl^JmpBLzvV#+a?cbpKOw!t~~YgA*E^H*`=c;e>F8l4O`k^tFEAF)V)bV zx2|4p8eIMC*TC*#)6^F$N;Y5I%{0cKZ`7v8d((WwD)*3i0j3!P+;ea1JlnMLV!J+v zx6d*yDq6H-ju{bVIA9;9_%Q*<-wS# zrW>#B>O2$wFg;uLS-!Z^6w{-*2TLqmxzqH1?5^^KmJKt#^zSZlc{nOD>sig9fLe`B zALo^e@3(hsVu5~THkS4~m6+{`XT+`j@rkAM)ep|NnKQ9qtCB^|wD~!)^0dQ^UiNsK zSVq%xPTq#$iPd+sY0^?rGO>2Hw?|@s8sQln#b0eOMXwQmYdl?br0KN83VLY`-Hyjz zzT>0cCSTc-nBzv{Jyl9ad9^-V&a|rLeJ@ddzxjpRZS-okZtAwme^v9UG4H!2oew^AV}al zlYrNW0~_Y#J9NWq|NfqH`>eR{b;4N2ZE(kH!WJm&r8IE5w+@r(I>p_|Q@$B2)u9PnudoQ?x1Oy2P5)dRHNI;N)AOS%F zf&>H!2oew^AV@%vfFJ=u0)hkt2?!GSuStN|xUhuhqopDuxvi$*gYJ8Yoih!-O+$(h z;o>a0^6!cxj<<=do3%Va>^o4mnfHAyar|5GgUY{jA`&V+%{HU@F5>W!In!6HsY2{8 zJLYS)(@%(Fk@dH4xzdN&cY4O@CFg>OpFf;7wTdZ3>z1bJyE*k>J_Q*Nzh}eCs*n**3 zRud-!4@}R~b0x87dFA&C@5{uA&R1658{3N5H|71$!!HI9C-3%4ZqZ=`v2Wdg-4$!@ zBu*V9^i9|J68k4-4axh<-^8)a;f=rMpGX`iebICA;>X0vu*V+5&ov^8y>|*>9K1PtPx)g+VmY_) zvz1p8hP-X(obNn_*q-G=!k$8(iT$5HJt+FyX~W_co64Qb_LWF-`&ji^U@wEQWjT-Q zpYsu>q)WYe6^k-l`#j*;r$&p3LrWrqYkysB`0YvVm|t%WB#zfR*dn_q$?*DNsrm8c zzY^ya3j!}3+;4R0cX#`eLS>1|uFcP#3VUYEV_KW*)8nhe?GD=tZ|_^iSbXiw+Ic-< zh+qHsJ>XuSTEgLmvC zv%NUs>UAl*(dXpO`SbI%B?~0vYSVCjvN51-%U)|g8_7~$_aCi_+i2{noxGq>vomCs zn(KNt^sH}`o*(!7hDmoww>G(2C{ATDs#=Wq-72j|HvZ86X~LfM#u#P5!~-|Bk}bX% z_g^`k+c@%YlT{1*bteNGT}t}Wp@nfurA2}Fv|Y*W?$Zi%c~I0i&$q^hdvDi~GR49A z`k0@LD|XI3aQ1#QsaDk5*?#&8j9V|a9S~k{1 zev2viY0D#1?Ze5wWlv2RqK3;jIBrH_^uk6Rig&h_=r zBdzZ@5f_RH?NmE=HdC)KQ7+%ILre|FcV6@B!tAC{S^xFj=4(vB%a_$(x$~GQtW%Tw zzy4I+)KMunOuqHR6mY%NjMJ{yOhL_mDI#0`{=Zfp3h{BS1iaQXi(j^^i^j@bx$sYQ z1GrzYdC8jn*5N}|jqPTAKjUSV@>cgN{M-vl;C@a1zoT8iT@@Mkcm%ksm*0;HK=)P1 z#S7rB)ULg=2HbU}wr3lU?rhI0L(v^lb?jVl*CxJoe~Iq0j>?OMiwQ?ss&$_Xr#zM$ zCHF!N#%opTWobOnaKv47Ez2oSgCY8D#DcpnhTTJ}#i_>z7GaZp zGYl&al$qT;rk`Q{A=lmOU*0p!@7LDj&NOesO1CCUTe}=Ltju#QYuqDO!;Is>_1|mz z8J3T4{&`^WB*Vf<>e3f`&oC_9({#k76%7otuSup)+39WAGU)o5&^%KNvkv?=J;ALB zvEc9HA44a&5c4hv?OWo1o|yfjK<bRZ7h`rWx&ni52$US1~-V=K(KiEMScgYSk zC^CiE@uFh%P1kKia@B?*-J7>3OrPtPzEMy_oL9Rx?G(9`IM#94f{9tm5x3p+Q@%_d zPh3o>+;#QsSHz>|W3vRkT}|9}?en5`@r%UE8NN$T&T2*c7CffFs27)sPZ6II!o_8X zS2>q@M6H@m<|z2K-` zbK={f8J=X-%O#s>)X8MIcSr7oPu@d%OjaG}crAgf{$Rd&YW_3>xufg(7PK((hKorac#JCwtcME4JRFG1;l&k@M4z zTqEU)#Z<>9RVRBJ?iP0k`!-S9+s#+qIZcM1kOoP|zaa+~`(=9DI@?KYp(MY>aYM;5 zTWj8LeJ-3Fx;96X#+yEnGZee(ZR@{-9JjAi7%jPL>Pl|!eyKyq{pIA^wGrWMb+5?%Pq#JmUs{OV@pfRTmv@emN2cEj zHWsN!8e;X0Blk5V&v(o_ep&WqSC0P z{P^vtVz8f=xW%7mwk=*?&G>G5;cwrb*AjP`60v9R{XfM;>$*%@yk@Pq)6(%XHk{uf zZmd7!9~~biuAaL~u_>cG#jW(;*0$Wcm;CM1jix21JrTDmS^M?Y8vVuI<*$E^9v>@i z8veC@tr6|SJ^X*mb@%;UvB&tL;kSO9DDKy&*s0O0o``)8JS~&Zy|XyDZq-rk-NuPK z96wy?iC0c>o3?koE-z>&?)dD>uGgoN#J-hZ&MH6Tv$*qs0u@6yE1g?f3e^5<5=dg! znOM77f4S5U@3Zy#rnC-sQ7s>9zR&gT+m{Q+irCzD`+Yy&XBn@~Nx74*D5&R0-*%#0 z+0E=!xMaZ$bhAILR~Fse_1AQu!e707m;`jcX6ut1-S_)zjQX$1TZoS!0YL(S1Oy2P z5)dRHNI;N)AOS%Ff&>H!2oew^AV@%vfFJ=u0{?vp;5qS^mXihXocKG1ZhPYW`FqXE zqWfpqqhlEUm3Zaz-xe5S z3PHD4P}u{lOw8xUGta#XQBSh6&jnYIfFJ=u0)hkt2?!DpBp^sYkbocoK>~sV1PKTd z5F{W-K#+hS0YL))H3<;A3{{T0`g9?V4Q{)=Q0+xT!g`Ol*A5RijGOT5sp;-hhzkP- zb{_LrUE)v;ZJw+Ndx=Zssx>J#u{Dt#xZ6>0Iht z-qp#3apZg5&{;vmxnF-;)#=j|Vt;pi{=+r)6X&I}L-}XqC-x^rJzP;!O`Lx!nQ~lp zl}LKrWzxgPTZxOMZ_RS^+CU_ku5WIT{~>Wn{qWeIQ^ScPO9yp2=30Ze;yEJce6`SnEdtPs8bjDp1ZiGDl$*VHDG8r*5DuAGy&Ft^6ncbap=ftZuO z_W0&TocDkIs;|B-k+7$tByr+);@tg?*(!I*NhB_9_xG{2D&o?>qm`N#-b5rWX}oS{ z?nL6;=R@blc;qCK3eSx_n(R+p4*xs2dXt7k;rH`~H zu0Jm+DtLVlk#tJE=}F7{#Py^9$KIQVW6}Tp|EGOvvn7%(k{0`(nL+lFUG^+lN)#%D zvSrN{SxYI3O0s3CnX!v3*~*e+-;$7!^*iHxUDw_H`|Ecf$LBb{$K5sOA3cxfYvw(? zA3DY#&c``ywvf6FP$@h*bdMt*=wrHPba3J-P(jub=5#O`7-)<~mhUwJW$s>D8SKx2 zQK{J^&NnashZoA+T)PQ;7j-&ICr|=pRqpte^wI`c5Iw=MOV0yHaQ?9aRM!U9v&)3@ z^bO(XS?N*kt-nC(Q^rxAU2owkDo3ROsbr8**!{!Z=uv?-PG{RLXm5m*bY$C@k5fq6;AkvJEti_LQvFkw6Zl=N~S9sSny6 zO=zyWrGSV%bV@qCp9Q?s__c6&-zNm5=Sbgn#2>t-p2EpDGl-~le9xGAa}B&%`-1Xl zsvn{yqThdyI~X$fJJ8!$I4F4f9+CmR9zti&B2DBGX?2GWBW*hy(fm0%WH#!Iq{5vzWMqbE#|ED& zI6*Hv`&v^3nO%>Z99WKncwB>+tEIUi>5WIIsL?WXq1*oPv!gbUF3*+v6Jr{X%{_6} zR?SSv==L$A@7JXu^@R8pSg8t9_&QS3aDX4({_-yCt&5uAk1zMtHMX^&fbI;Fnfxj$ ze8fsA&LRLcvu(DD7o|XzLL1hLC7e-RL*JYiYbB^o%BPG7UZ#3o$r)9`f6)N6l?c zNAIV!L8Zd?f2x%Ei8|OcvAe(U!uMGBnWdTBe+WnB&&wrMHLi+x}8S$@czva+!ObcmJ&q z+$+4{h4m4^H$vc=7W_=#DZDVmV-uc;G0OqZzI2JXj7D^giapdrS6= z1C}F+%Nzyxd?9ir6z+*BqSPTzf;$SfJ>WHxg=?P+PT3+Kc7>9Cg46)6Ve0pLbaA4N}O9{lLIM)dJVGeAJv!azWDEO7M$ zd4amoJvjD)t=04qSJ+2HQRvZLfB2Ei!tMw=E;y{+ieF@%1V3-0BokCW4L_Dtd2r#T zC!Fa+%ks>;4ZimU`Odx`ej8(FbJimd{_IHp%fNXr+_5HduEQ`M9^2qNvg>CI zJaAnu^-b#rJpVS1JSboSo*e80)jGZ4^_rH*1kD@pLK9H0ZuSA8NsJzDte{0mew#k3 z11bm;YG$o*f)k-<3n^d9-Gy*=YbG1W86YgFAqrmf*N}rrd18lRzau<`6b`kMoQU{a ziu0U(=aEAj8}Dm?0tBr6C99&xhe$pYy=hUbhN!2stt1UqB8uiqRbMW~Bl>T6uPNLt zMl`>#4u5Tai&z%2N#tfXAck@Cv*i9th+{N4f3e3i#9FsId$LsnaepE0Y1N*Moc}WG zHE2JMTu)2Sel<;nTnXOeXc3o-g!&k|##ojh{;GX9f?^kuxcgBI1{cpD;mzN$50rU~ zq}`hKRje~c?zoMHUbmV=vb<@V`%gzA=|U`DsMPe4f}9w!Q1UM1>79ThBWIToB*lyZ zYWG8m48>GDLs*fw^e$wFDO8aPk50xK^*E$W<$dC6vklT1^Xg{H&?lt(hreDg&qJh3 zD6~8#XB#qt&V}C<=t2g8@$+Y`=aA*h)bs}4P2{77?1gKr!|3jx<fMBEdVXJ zf%4W<@?MDXgbppe+PlPm0n$lS$~TulA@O6|PMT;vgml!MJA&_QKynLxvq#88A>}H@ zk-_iI(6NnKnwKB=(Y>Tr*$_(mJmFqCv44;ve%Ccyp2-GBG06uuir@ zhd9>n9)9Qo8Ct%$sH1HP0q0tH&45Wr`0L@1XROabY7{X7O7V8kcKxoTD{Xd=Difg9 zmg5a6QS`|L*115(vhKN1*Udww@uQtwJav$mAtf8c21C}`_tip`bs?pVj7~nbILJ^} z`@68@2&A*rOhN7$2Wf=pz^&CfklyCVtw{MqNY%pNZHnp~WDt1UPS;ZZKYO<%uJ)%9 zsQBxBCch_Hcrz#7$>L5O{C!R`qxb!%@521}{?a@Dtq=28Z1s0n(zfzdNYz$`bAQ>& z?0juJ$=q%=<4JCjdK6E}Z6f|#bLZ>J71(t*Iz+4RTvlz@{L^?7`ymJr1PB5I0fGQQ zfFM8+AP5iy2m%BFf&f8)AV3fx2oMDRd;+)!UwyOi7Vg2ncUD`#dwoN(FP<~v;~v;N zmHbj5>z_}8*dalHAV3fx2>hD}ls{HV`|31Gi{)L4=;y6?PrpMWiFZv0UluG=zDn+f z|7P-!AOF{JMdnTXwek0HA_)Qn0fGQQfFM8+AP5iy2m%BFf&f8)AV3fx2oMAa0t5kq z!2cEkiZJc-!{fjF6sw9Z{$$o`Q!LeVR8hS+qX_?qzGlhps8|JF9+>0xL6pu{zqeuA zi%`T}tDXEvi)_EU!kQv_9D(lh79I`G1P@6ihrISqfCo``vgeTiD6Qx-xGon4FUz}s zv-a%hE`-Ee6lC~f@K0h zTZ83Bn3)R^E(`Y2?`8m9SWWiSnyMqRPNRWe^b0`GUE@V>c4{NampqTuf>dCj#_P4p zWi>>*$L-kb`D`$9L(DCZw;VC?OOuzpa|ldab8My(0g$t9VievL*T6?|!JR8~*2u*V zMIPO{^AYPsTK zT@E(2vg>hHE{a1 z!uiyhS)^1y=#%P~AaL=m&b)8SNu*j+sASJw9*BHb)j(UXG}4lgZfosG3vJJgph&&r zhjc5RSV}gNfmn+<1NpPABg4n?E9w`gp#9`Lddjl2$jprgi?U1#(9!5=eXo%1$g(gk zW2!bAB%QhHk#BPmr8p{Na6={-Qd)@eBd>BscRG5{U0BS5w62{Gt%!YsvT-CX`u4a& zr{hP1-^EIxe4GVw!2+U?&DgLKB_|y!tk){->23fypEXXCdOeTIZZEdov8D-m1Rksc zLe8Sf%)UN5&*wn_J^nvBu4SOw$DS{HoymYA4cHhs!!uFi{?{cVTvAZtb?x_AX~w8+ zg%Pca!DZ-SPYxO7^$pa;?>0v%R0QQngnKbEm7|_BR&%t50?@0KbAg-2)MzkU<2dxP1=5Pc-zlRTQR7wQsVPF8H_K+~1JL^2*!hNjMZ zBpqwq2UR$Xn5(}yqd;mnv{&X_Gc>U$u;rq%s>05b=eSQy--p(@-(4@`$VKbjJ)(BV zI+T;|n@@Z->s+pJN;tIRgI_uL>iy>TKDKgu5qcr{0KamB>-KaCLbT=QUp_f?9JpR? zVkF0ZDMqN=_E&lEVIG!pz1!cHfqCI_g}?w$$BLqIX%)s#_WFX*^7TwgQ_EnqeS+=w zJsTs1?Xzq~eZU!LMP7%AKc5;}vzxZOW^@!9TD7IV--bYAW|={864_88bu!z}eX3BW z+sUrd=tMMQ$JpTbm15{^uRzno9erpzN;%%I6AYm*cU_3f;zHwmVaJLikD$WMYHrb{ zR`lk3ot)$(7|P~a`9-E0j(SPu1?r#O2R)cw|5YClgIKas$2Hi0#*|~G7549GU z<=@^P0EJtXN-xhGMGZ8V;=9}*LtgAp&BO3^4#Embx+}+5ytla^ytQSnTqPa$|K8{1-A!9m*0B* z{^uqQQXZwoKh59%r986ubvpZ$efh15DkHiJf#nhOGxKOkczGDF?VPvw$?}M%zDEwW zcgn-3FHK1-x0Qz}+ZnT$r6T5vk+aLjx`>5XuFdJ<07Q31Cp@371JO-?BXd!g3bB52 z;H%#4H^^yKZV&!3I>b>jGvm#fmxwiG-yMfz`w=%^C289?Ysfj^z(aXvHpE9LL0j4K z5#rw2m~C60jRae}1zp+{!@TI*?~eG|BC(?;I$UA5kWj~&LFqT$NNN?svSsQD5*Ie! zb^GZi@>udci|C0*NSZZTHZrG*MwcpPOiZ6Y&@sWtxgC zHEBUUiwzqTTk{~ZuilI{JvKqc1;j5F927)W{F=817b3{K+2*rrl)5Mt1%=e(uykad zqwl@N^a+&VDUW87ohwSi@_OjjCKbB(!h3}``FbeRDS^DEacz|U$06a6o*I;sYV3XR z`8}xUz34&v(YxqD3cZA{`UlWs#shCew|Al93MQrr>AI-Ou(>)C?uP=iWCN9K2&x-P z-8K020jf6lQ@KH@5j9gGbNH|@hU$ymIem2L6l&Lz;(IbK5VhzPk~h-GL0yBw)bDq* zqYeX47|79gsJEynd%@2>)Sd5>CF9BS=*{XuZW#T5`qns~rZ34vV?B3Gz*j@jkoS%; zb58VV>OPlU-qg`(9P1I<(wui_W|6wA7Vj_gUhds}Zf$L7o>Lpok=F+36J+M1LQ{T$$XZX!=#VGDdKlNjgO$M7V}Li4FFpA5-d1dvlH!^p-(iY zB}dyy^c_Y+yU>waUD;$x(P&?E<;jf>3UpR4r;Jv8H#(L$=Rz~qgRXE`QDzlIqI0lC z*w41}vt zIal?HWQjjr`F^dhn)F9?${81We~6r=EteP>5TO3KqCow`@T{zxP`TpE41cG3MFr-u z-W`12_sfr!yt>^j(ua;O3m$k`04dPKrBP;bnwRfB9pg4MSEK;WPj^_dji9S}#Y-ll zMG6X|x92xC>=jtIpJ>~WU8x|ZLQ`$eq@uu86sQ~i22|jl5WGkG`iR1wCFwTXhz13Q zDE@Ws%^wQ84j`#?!4e7-Bcro9)^8LjPR>iDI5k1PT*r>uM>Rl8Gh$q`8AZ^n;XU${ z6((qgjIN-PdlMR|HQ@2e2!MvZ_Q?J~#GqbPIbL)^9qJlLd1@)+54EPMyK5DiD zdNOI_E-*_2W$%~JV)D_1(q-ZtwUTY2Ovr-vRcI}gvVAc?Zk+|n2$W=Vq~w8;AFO-b zEaUlqb5|w4>i-r36@R_Yxd6^rs3IGH(Axjx$&%>$FaKh^@Qf)v?{Kf_dZfh<@I8Z2oB)B$Z(2 zJxh2T`2_1EW@fYF*m;8D>-#vc^Q_v6488xia3sD@f&f8)AV3fx2oMAa0t5kq06~Bt zKoB4Z5CjMU1Ob8oL4Y9eH-W$Wc%Q%g_)fx)|C{P>msJ0<=l2oMAa0t5kq06~BtKoB4Z5CjMU z1Ob8oL4Y7Y5FiK;1PB6u9s!`{kr;QC{T-m~RI1)DrFNkDL3|)w-3qwspCqf!Yz2A& za+%@TB%t2qrt}Pp4)AF*YjQ!@6KHC*^V5A30dzN6bCmV;0`HE@PBd9b0Nt*sAFsa4 z2HrNUi&+?0kx5?rzi8tfF1$O!*16*f!gi4T%BGSz^8rpr}b8~fp;%0 zRTIv%0DY9lBNl%_K;1=(*(yX7_%ty~rc&|h{wFh}oq8pGHDY9!LrUY6B^^^N_a#y^$qHw;ibf zYS)<_LRC1rnE}Da_tfP!nx<0O)VS9pcX+9 zQdSSw4J`fiVbcKFq41a=1|ZxwUvl(zUlho9hWWx5+E94%o4Ww7yb36MG+;iGy&PUV zZAkt>O8}H98hFg8aTg&EeEfi!b_hIPQ7#)}O)mWAemXQthSqQtI&3Guq6+Vue9 zIN*w8ybMOt7jK+Zy`q3*N4}5sOs+!Sy9CvIaH>OEc*o!injXmL^+?H78!n{3U6d@t zZwy>Gk}34*jsvJ$tbLa0{q&mW(irSuymZ`sW)b* znRzw3gRK}<3JTG<8@)AdNQoqx4 zgIG{NR+({mL=2_Kk`a4I8im-O2hZE)zk%pf9*<=1-2pK;m?-bGd54-?Pl5tZj$zM_ zSLrep9LAm>|Ki5BU~TOA@f{}0-x2Kj@hLT?EFswQQiH>qO91PtcByhlexF;>-;DXKt8b)`-~O$uY@TN2 z!n(%O$5kU(sw~IdD#TJ#`*HtGd~O}@Cyvh#?uf3%=Z>F6Ot4fLvXCm$?5=C%{v!hKY0~cJlG-MIhNDCM4RUb-G4uSKzdY<3p@q-KPMV9Y8 zy8!1IR9Az3k#M^0Sz(7z7%o!&Mpv?X4o>Pj(#NU82H&U7iX^90gdgoryzp7I1}?m5 z&FkM5O9 zwr=l(E7i4qouC&`zdk&!7-E;})C#Xsk25Mp z`N8wwyfSn1&LdP0`MBj2-^1&EFZP6AqC*%D2x@gng&;IF7C-LHs307?9YdW1D8lra zbJO$mY2?7OCtZHE=MgT--Jf*c?n1;kwGY!R4I>9%ALZaaE{DjAO2?m+eu#+o>W4=2 zOdzT;id0lGP6*h~eU{_RK}2s)wcF0wW<>q@wDSFjOo%!AdH^W72hp$d_7Z+SgV_5! z$obr~M=Tq}QVyC>A#U5r?_a)Jf;c`XT?^W=fcVfjEH<-xBkpg;xEP*dpLgKOwp6Gz zf?O}WZTrjZ6LOn!ZF)}$EfRXu_VH5}I^-_Xb=QdF^GIA0AZ1B*33(jGR$8@k21#>5 z`4d_%AbGzWRAFrjBrBAnJ@mvaq-=dW)cDkOq|kCg-)&zVQZ>Ib^6jt#QgMSOL+>Pr zG=`RNS8wk?8jpy*?(MThdRsETKB!ejT4!}VJ$Pr3h3!eKZ+Q=b`Q~6%%-5YL22M>gWo@tNhwmvabO$d?MEEEa(Ou z8kO5K&+`P*OvoB2izD73@0q45An--nD|KB*NY$lh zS>o#y1S;jJ^17`-n!4iCM}6oa3648o%iLNat*LRNN9#?Hz$>8w(}tsvN%$g^bLSOw zSZSwITjWm2&~L}svcp~osI|7d-KPVI#J`O@u&D&8@zg(J<%yVrfe_A><7mE8nM76u}CarkEKRl^lh{&hCGdaiklv)^)kKpvVdxr+5@)lD7jg z)E{eqn6(4aSyknnxts)PMC8vqhkb$c$)rQzpy!aPb&Q5=sW)U0)JJ`5dHz3nuOzPZ z=Mkv*>wPBwBpdd8_ndf*3OwT!pZz{39oZ-LPsi46JQ-yBZ@r~Q7hgwmR%+jx5ADd= z>P`vYwldJ2X6w50h(4a=cKaIeq?~Yiv~~Q4js4a-jms#WYqkrPe;#pSM+5_V=14HO#^uQbc|ts&vjT%yMTp`mIU+%Q2w$K{s=TV zT|MeD>JEI-(7GKu!3eZDG}-SPbOAmaX0mlH6#?(B@$wyZ(*XKZS`5mco&%cIeD)8i zN<%0Vs=mzq5s~-*Yk@63{Q(JdP1=XtJB53 z`!oH4=?tV*;$bYZ-#`>jIh_tHMDh*3VyQrc`jhPhHwS?ASw>CZu_7Wf!gSpIT?I&e zI{v{+wsb_9b6=v?6-AIyC>JFGJwaJ6xYa^{1LBXYF-=81E9(SR!TEBYa~c2 zt1ovk4AeE!&9>^~L84u?xX!ADfo8i+V#>}9Aj!Moo{vwgLAy2GOB{LrNCrz?eLZD8 z=vvEZF`USP2wkO=+ z!YygJ!Ob{ut@_*j+mk{N_2(|jJDkrT8WkUNVgFO8NXKHhftf!_7qj+Ym`?)LSD^9L zNOnRsD#Cc};?hyK(L|<`)Ptz8H*MWza}w&-otxd^+m4<|F|OP0-H6)I$0(rp^ikdC z`DvaHs?pt456c(TE`Tlf&x;HddO~K2bI;6Qb3m$;T82#}{LopjHhCB!gY+9ek9@y0 z3aMQC{%nvI^9A2(@id1HqIy|irmkxXDjApYjB8d1759B~El+_N6`4rz<-F$sabI4O zcAR zDoL0h?@hi(>;punDjA%~Vu$(hdP?>A!dt& zJ?DY@@zXK8LUBL-u7Y9#=EpCE?^W}{{P<{{N>Q;t?S4q?=RZq8A+Y9(2u0b6-_nn5 z!^|4%ZUq~qIls@}P%1e8)^F%Y*75z;-Pja$$FLp|BcSDqrPt$UYn@o$Di?yzVj2EG z-e>_!kL=a28CWK$O3jdA8S74!$A)E+qc*!5mWfIgkwRF8Nn96_heu8gqj~47;V(r| z{?9&Cz^&acy5isY!#(jz#rF0jxSdDn_y-z)xURq0h^&GHS6&Ke_{uE)4YiWs z#~oRWJJU&Uc4v@`bsh<}8Jp1X^(VpU)Q_#7XOn>EuT3~2v3%Ic&XJT(0*Zp-onFgg zDR9eV2P5Oh}#~NQqd6Ph~L0_@D#0pTb zq2f&BUVjjz zw$Yz*xf1MuEX*$6`VO3n1{Timg24%whW-tH9&q(cQ;+MdAn-?NoGaVJ5Jb5#WwP8z z3z66}^mtdbAO_3rS+f}v5M7kQ;mX<%5U2hKk@J@Dzjw!seyTG6dNmDF2 zF50<5BCIEz_$D17BMRlul@pgCVP=)LPUMWx2@~dqcD+}S>@!oYxvYLj);gg4jd-!ej zk3qUWwM3$=enDW(N4=P*-yu~m!}pg@#zCO2hIHEWB}nshyWXmk4kW=}?MF{x0%?8U z%`PNO4GC0K0FKO;Ad_3_2^al$Lx(lYM$gqNVt)Kk!QtjG2zdLVXT#ba5=mMyw(iz| z)OZ6?AJu2jPFlrQ_My9w>H(ptv%{j0(r)l!W%OIjkI!E+zh;X0@z-}ZL+3F+K5$95 ze;o7Uy%x{h%fbBkDx0bVPRx&AGUZmjj`{KCa*|q=If+%!y$`SH-)r4eP!kADV@ zNnXYL_z_iVssHTFlDOI*N1)=b_nG{Y`!H`kPQ0lC&)Br0-{&OS?KGtt_^#y1vDU(laWm@waJSnd~-0E~PyU%XTBbYkzb!)THR(LME z_v-#}z=;hJ1PB5I0fGQQfFM8+AP5iy2m%BFf&f8)AV3fx2oMAa0)IRK%!5zmKVP+o zdGM*C^_)g{XL72)h$qJmz9D>mNSE99j|V|)kRU)1AP5iy{#69Z;~&6eRxQC;mNB87 z=~$w|*>=~lEbl7F6vF3HlHdOM``+$8VPd`I|!99l_a(E{I9eXD${re4pfv61YDAn^oYb~!N104%6 zATYT4er*b9BQGTDZkq-Mj^EN_h4O*srD+zA_9) zub}$z{#Bq;eO4lDl?L_e&9o0b%^1( zAlwsNHi}xm20j{(l^#i(glBJ@vvet70D5+Jd=p|RhBq!nII>Zv0$&~&3&sq|BJ>yb znsiKs03%ht8>eo6LRe)4kMA+-0=_xXn>OYfA^Ron)SrHf0t+M66T9Ty5TVK^k#j2Z z!1`uf6Z_mCBGW#o-JqldQU_h(n~>W;l$pV*nqUBAbbRpY+o!jPwpCog-7XPu?}~=b z!4^TpMD$lHY)JeBp_lmFY4%eR2mVnjkc1FLfEYc=M^jp~e^BF%EN&?W?PZ zmmF`&ORp4A<%40FSWT<7;}SWtnfSNlo{s7Uy_`g zcmUe1yNufDoyPq5G?m^B2h5Kjjog;2fcf#9a_;Fim><76cOf$v^W*8H7X5uOKYn8D z@s3W+kMGiR%IL@Z`0C`N-P4#KFWY!1`2gm}M|~Lb@5lUjwwJ?C;xIp6M>e=T6Z7L8 z!_UOBV}5-4^oH<9%#W8jLX-0m_v7b(Y9`@+d?$3j0Qck5(hlFo{rI!R>&3VqZ*yVK zHr$W*MCKsekLS`;$;174Mvs|s+>fsbetsMG}`>ZTre*A@;UZ@H8<8$?$3~)c*bh7g$?#JJ~0e;2(_%VxzcW^(xz_W!4_v4S; zP7%ia_=hs0mvBEmgKaJe_v0Pr&Wz!Hyqf^WcHED5_fo~4r_1sAln7#o`|(pS6%Fpk zN3RXi;ePz>Y*rE6j~_^%dXM|@xA%CY<9@tk@b^sIk9WE4ErlSTpX&>(s9-;(k2!{#+N_k3ZCQ z<2~-j4=7Hh;ePxHp6~|TkKZBD8jbt$U0-+X#{GCJzSFL_AMf)+)&=+D)6z}`<9>Xx zCC@7E$2$dne}Vh)U$w3(;eLF|&Y+LDAAj@LWz5sZ{P=D%nSa;alGyG4lt8(4&uSdS zruA?6eu~}aV7YZKRUjK_+i&w`Te8Wr-+Bk5LX+2j^p_V4FRt<8d@!9}C`js}V_Z|bO zqqa#~Ql$c$rozX3k^3MMRsYjqp%9QZBe8+evk}}EA+GdHaTH{3yOSq*@CzuApxCSX zRS5IrD?Y@;wqky~APaP{5EOh{_W5f3J`gaSlZ|uR4N5#_i`TTI1l7U>uF~zN2Nfg* z+nh5Gf_h!8ai!FsF+ZL?#!z@0=Et9PHmS%44N{8ZuC;9g9WIuTmwwX0{P@^{pArn9 zTf@pnE>0hM-`JYc z3uAu#IXXjWSIm#!l-!d-h5PaR)j{5v9}jAzz5j^&@juV*<;DH@Iw3F{_u~WXd)071 zUWQB{9rxpPSIy~gKR!L4HvsqJS=+WP;C?)lJZ7 z-l1eD3isogUtUVb{dj$SZ(iJwxAqp1!u|NOPh_*U{P@Yfnk_$GQ|$rn$JZ)cJ&*hG zjRy+GaX+57xOp$`$5)bk+P3`op@~@Bk9XIxm&N_~yRSb|;C{SsB0~i3#~0miGTrjy zyHmd7empO~7xk7Ozg$hi{di;EZ6w@}Z`Jc2*z)5ChY#X@yn&6a3GT=H>W69Je*9hu zx>ekdSAV#$Ys-)Kae0mV@ne>Daa(@8>7H%4AKz_pUK97@jq(P?w)}Vjve&pDKkT69 zyXD6VdV1h~e5U*AFWiq`OiEM0{diX43kPvOepN-!c*~DRf_ZU2-Yz~V9rxoc*r+UU zKOT70XpH;uUk?bg<9_^)tdsk2KVF^gqY&=LYdmN;`9HlM66gQB2vq#_K9hfv2YYV3 zCi~e6JT~dr_rLt*i_%e4BCAAW$3lsCpx)TP*?@{yZc4-46sh z-fiE}-LnfAoH?D*#AN_<)JMeJU{(YM-tE5|ma+)6vMaa#+Ls7?&MXRU`l14~xxRe7 z8RG@?U1*}*t*HofCW{Lfc}N1E2BWHOJaq!vC(rztpG^chcDW3E6%hcsDo9MdM+Jeh z)Xc~3`e%VItD0ki#dL6oJ}pP{auD#L>T;V4`xrd=C}*L!#0ls>dDN_Lkpf;}hZ~I2 zyn#W#>}&3GJ_wC4rOtMZ3z+Y|q-(lw8DZJq#yWCa9Qdjw6%T)Zhwx;_x$RLf1%4PA zY#z3jM2=ADjaBvJ0c$)R5l1avB2tw`&X*dyKq}++sqb6;5ha&bUsVf~KnC%$uhh>r zk(2#Of>cdHAlrMMd#cB%k<*8bDDM8;2J+c(%;l3UAvX7QKOi#$ps6 z28|WX&)>Q)fh4|t#l_8^3|djb7O`5%$Rl)K;_@*c&|24K;6lu6!!-BhtV!U{f`q4>l{Fts#wHH0lAQruf$DW-g$A5|j%pMZWH0KJqi!FZ-l%G%VSapMVxP?d z>h|6p%_^8i&)n_f6S}{QT5q1KIH9G0>gMibedN=LvK(X*xYGCqY`hj%{Yk15GJAlE zW{WC7s^sR%!`phHvx?Ck6?<4PKVFq%=RiE9;=eq4@5y24P>nu?m)!=c_n0bN_GKd~ z86WT2LSKW5d(!1KX%wI$lQqJer~(~2!@3j2 z{CH*0o3&(^A3tO5CVC4}@4whwai4_w@ka8c0z)YM@spo(QSAA{*LNS^@q7ja_O~|r z<{rfS_(7_TX$s7b56wvqS;hSLJLK(N>zE(kv+WW?5a!2^Tc!^8V}ATO-_f^um>=&Z z8T9KS=EsvWZoe{!`SF@&g+F~TKc0RUTV*Nc$9ouv*2`diyp4S7xo?;suOoXxj2rXg zN7HYwGU0xFKedA(?#Fu$wOQkS{H5hLp12>sl8zu9S$*1$TJf?E*&0efa+gp&rexIjl)|36-6}191e(O?mCAK@T z4*dG!s*2Amb>qsh1n(YtmWR*#JifMKDP2CqQi7$z*qnGiJ~z74tAM4VN71*f`MEH@ zJ6M;`-p}&{9xpF{$ZqBf58kL|ia6N%%l>yRDTa>kgz!>7wid?_`5b`jMZbl z`%LuDpDRGi6*aP^sb|1oKl2L?`+A^f!MFY(?_S{hvBrGIU!Q@|7xj%Ues#dFy-g0c z@&$nTYfsC&YXFc+U}|l93@xxOUr24Jk^wTjo*Vt4Gzd~J923u`Wd-*_yXJDJAAwAV ztOPsy(m?*lE3^scZh`x%IVb~}j6l&Vi)u_w&7eT8qEpu^OYj)8dz57LG$_8y#P1V! zUsQRlpUg9D1Okau$)8*5KwZl(!F1mXLA4k0zaGT;fu{2%%+d{Jpx%m{UbBcZXqQ;5 zIjC3wTHLfp{41`4uKLn^eicig!#%~O9ns_9wLvikU-}-`x`Pi4xh2+ciO&E`X+B+~x-$&C{be9nbY2?Fyt;1VM9Tr*GrpJE zKOqC=$qS2r7_J7Nc<{R0U33G>smt~`!@d&9X99;)vii;ku7jT?zHC}3KLcmR+U1P$ zhrn_66{ZD~T5#nx-NAux5#X%YGLHas654L5z->nz0?taI)ei;tKwOmU3HKY^!8d%z z9#k9`gM?|5=g+I$h3GT%7_MHngmi-H4U(ZCNYG}pW=E7_^KV%+E;rERS*^pe7$<2Ma&jtoA8WVD_>nvZ9NPHtxHJ<3)K@oAJkWqbM+vK*p% zLj7wJW!TB=ruW?!GS$$jyH8gI9TgsN8z6szaOapEDa<(&ouZw=oBRT@ZIQU06QeJjIzYf2|zrZhYrXLnLtwgV+(ifZh=$# z*PB)jeuv~V#}4>DPl5DuMT2keu7PBKiflTcsDX5s2D(Rfia}uGS_fl!Hl*s4NOfty z83Y=>yAc_G7}7NP0_TYVki@~e*0QN`kk+jAWd+TjkU-681NMqHm>-|V?9U;2#@K}U@$fm7{jSi?ZMTx1gz;j2yuO1)>`u&& zx8jILUSodzfKgGEBId`3_J~}`#r*j64tJ#~%#ZgC-)Cx#`SDFkd^(w!AHQ~;F3J@1 z<89d{bmcKW{^J8VHDk<=SGw){(HisP3tmdn1!I2vSohPPX8+l{C2_SsjX=d;?=$%) z_hVkXryOMko|lrfexH-r+r|Fr*t(6EOuPPDe?7m6uOn$|9NtQ*Sa>Us+Cp2&zu#~x zvvvjGNq#~$8Bfa8i1e+wr+Wx~y$wt1Yk0246@8$B>|t8EbENBNI>&RQd!P43GSye@Cwo*0n-szeyDMhfVL&cZzb4yvr(f;0`w%{ z!>hXv!H+9|9|N+3%n2l*{fCfeAHP4atoM`d$WiQkY3--9BeTF}*^5K3VoAVTmv~xc z1I+iUrmxC2BLP)P9K#0+2f$q*pnEuw1mwv#o_knA0{2K*iBpA<;JSI;B%h!DAnyro zNl26g_x2v0E}m8d54#DkN4JyU8IA|;A`>J~(ypkBGlB%KiB@Mv#FIdUsbRzJbrM1Y z-P@JTK>{^*4Q<{H@kf|#4xcXkLIMrmX$rB{kPz@D{(f8X(SW0FR7}Mv{?JAJ$%DkIO z;XFv$Ct6E=fn}squ(y-Lf(!XB!c#t1V2sS|34^c4WFRv-zLz+I?U0qpRhJm9QxJbu zYf55E6vTbv_PtjtAY{VrS!G-+4(Zsxu~sa)23>6_5u-|UhHPqgFfXjfK$mHLSU822 zK$d{)n#o5!h-sz?mW%R*j*pa^r_xiSM^12Qj~Iub2a0bC1Q>lo<(@B`elK(YsMy2GxJ{=}i~&i65pjI9oH7R6VTV>92}gG~SuukAJa!bOMf zX_9axBliajrw&bgGSx+oNK;SCXu~K2>-8D39T!l&rcybdS!YzEc-xf!y9=mWN5K;| z-)7X^Gm>)lua;n-2^W(*@8&B#(Dgj+0)LACbq3Q+t_U8UI4tQgJ{II;3n>yyl2lu1C6SyC5%(}B5^W(cl%d5ZOethgVQ5W2g=hD~F z#{GDM4fW5MA5X?@yS)te<8Mf-fS4aoGV~a<#{BrJD;mOWm>=&Lsc_Z~^W(KQ1?m)W zKi>bsHAUQyA5(rGiTm*vKmXFf{diZe>j_(aeD81~?#GwcFt6Z#e0b4wecX@FGKv26 z@48zOyZxUMD8I>Ke>|Zk@3*uGI;>}c^{cus;v#;VTk$rV<^0xdUe$R^{MJ1tlep%w zZuK!%!46Ar-M&-VSeh4 z3fE_Hlq7^I*gT`9lmxGOf9r$TNXX9g4DPQcB!tpCr&`m3gzQ1~+JD1-zcBFX$9&&O zLiXR0O83zqA?(NQ(oBhy5TR3x3p=s%`M0AZANoj$3~veV1Q!VrY2M488B0QrD<{QH z(~}T6aoug-vFmAlEZYk{@kf+b>t+NU{E^e$UZ3>dDk3`h1HJ=m{)p|~gl8;?{)j1i z#YO2w65?DaF?V~LB64JP{EX3XdQ;{&OS; zV^JidLNxZM=>$@Imx=1f*9qjME{Wmp5DBTAjn{668IjVK?cAKqJV?_G-i8FdgGhBo z?}}c8BJwdcy~W~bH}YP<^5ipE0~u@;FEL|OM7oEsxn)z$BVQl1R9=26iHwLn?JmE> zhWwsa;y6*54%siRm0H zl6RPelnh*2u3gvzi8*~dam!p6(tmx&L*%p(B;`okHs*H~(pDUD`DDt5o!6mEoxTdm z&yVvY-4=w7H=BMl4OM|u_U_Cd^ACdLu75re6+{bZZI-`^-aZEjY!mHZuPlJhh`;cT zh&YDQ@jqy6Vw#0aeR!OW^F$#b4IO(CgJUS??o!v840PeJr95X*bRvqRcd6kZ$d_5XDZmuH6RhDF6D78 zKj=i-|tTTf*R$u1^dP&#!J(p?sJUM+Llc-E{}Zx!y94v%!yR~dXfQwiZT!Sz70i!^*KUQSVt)LnLUWx1 z=Eonc%sH}w`SIRAg|*EwKi<{4vA7@eXh4_?Fk_;LPHYt8@Z{g62S-$kI}ulJe!ll+($Z{ByU z0#Di5xZmfb-4^!$bZp&5z4F2T*5|_7@pUBrf*V`&C-YrfU8uEjE7eu+Y~}dZ7(B@y zrSHd+qBwtfYwnSlu(gieMHbIBgyzV<>!(5NmLNb7AP5iy2m%BFf&f8)AV3fx2oMAa z0t5kq06~BtKoIy72q-j^$-lMgKdw+#`e=D(5ypC7$6dZ6ER6?Ud=#fvb;EDt7Gr^g(5k#?R0zLh;O=nR2?4?&d|zW7rC zvzIB_8=c+*ADuqD|MC6=@S~U~RPS~n(D|Z*I>Md=EDJa@kzecr+E)!GGqkCJO?i>~ z0qi?~ch(xzVXr+vDswCInhQQaWf;Yg@8Wjg&YtA1Hw_1Y=aO90yyGO0_4}h~_QTxp zyP=_xuv`<6cYmHi=vO1SpV6Yw@`N{d_!RXm`Q^*-cayW9U-y3lB~9Jwf^4_LYjM7B z4F+;Rh4Jx$0ZBH5#w?orX^Azc$w0Fh)MSM)dp);0p7jgx%vy?UhR=~PAdSd zj`zG`Gqpet6&&DuOJM|_D;IxOeC!}18LXeb7aRmHCvqA#fN6;0`OM9IG^OB;RrH+q z$`W$IYPId;6M4*!54XAe*cCDQKkeOVG?nZB_;Eu*hR9G7GH1vB*7~i}|L(#0tn1p{`?TL{ zwI6x)aXI6sV!?`?_KiMvcKKf1lXXSkvw34If5Q#IIrze0-K}U?=kNwuUX<$j8fV(%OT3yvH`t!_dcTu72*c75ezD z2fNwrk&kzn$mfDSUdW}m#}N7WrY$j9F_Wj%^~e7o^+bL8V=PDjQeA79mZ z+!gwGcXkQRKh-c1PK{$aeLLXXTpoIT9Nh;x?YIZ0S_7wl zE}X{xo1`=0)Lg%yuo6zwbyla}z-bg)A!!1qdgyJe38%lATI{mR5~l+ts>@?~>%S#R zw|_i3R6mYyC{XLFUC30yx9q(NNB0tbS3G^Yz6Yiug+QBX%5E zFV1k%;97O+IKH~5pKJH|a-1WYUT6ND5iSx$6+i3lf%Bcbk&dr%z&G-nCyAxe;$jMC zs~&N_#MR~q*}0@ExO}^gB`sSXt}k7G%=^GiTyyPvqiuaA_||IL3tsB`@J%E1@r5^3 zaQk-2?9ua8xJAYeZ~E42xED9w)bu?ZcVY?N`)${Ee0Mqf_b~-S-1~)DQ>S-29#$`E z9Zw&R2OW9;j&))gevHvKTk$0u9zOR@Vt?;ZJTddoK6}wV=;J+wEzOnjjLTJ}c_{>* z;&*QEce+i`$7h>ncCUjze%bn`ak0?He^qrVNy0Bsa{}+boq;}HC9(R7D}K!at6`MK zkdNO_pRot8?rPVWpxpp{JWt?wTC|5?Ra2w6ZG*?k7Fn9 zKp%f+-gnI|Uk$yzFH^mf!!zXLkKTK`>(>Fu$9Ki2Zb3d?Ny>LC^6_rtvDc7~zo~Oo8u|Dqy?bs!AMZHH zwn+f__|xX84amoU8LFruN<3)3%l97*}_PE@Jd_3XI)r)-m$fZbkmvH)3tEI<|@3y=lK0{^N4Xiq$C9-AlH6EAp9Fc_Y*$EY*X=$@nF zloz^JxT$dGU-hBLKP*{*EI<|@3y=l=mjcwh#cGc48wcSmZ5dc`1kT!~nSn2GR;@W@ zUjb)Ht;-kszu)GUkN@j+UCAXMKk@hLmvH)3t zEI<|@3y=lK0)JWoY%LS3k6yKe&V-J)(CssmI-h4sn~%zuU_6-(kB!`(*MD;nW%Cnn z(izl`<$Ttxk2A&3UT?g%Ugw=$;#&TJHk{{6=BpXyF`X~fq5NHX&v227^wnc49_q|g z(2Dk2j^T2{z1ts%xnneWXN_mHPT-n6Lf@!KVoqK5W%{v4fs> zb#P1Ok87#*_po(68!y$o9KfA2d0YoR`C$_2wNFBJEa2N6{aCJfZ^9G{G;NgAgYjS) z>Dz?WET&y~(#YDS7C%tNH5u_V6f^w9!RY$J8IN(A4%MR@#jJc89qmR(@ziykAFKB! zV=iyP{Zh{q;@JmBbGE*m#dajv+wXL7!;7@pzjp_%$3i;SbDXPviB~ub?TYG+!@|Gj z9;KZ7gx482hwOCpz{2&++P=ko#9P_&`>ffOvCX~(W1r4l#P6SZaL$3d2Rqy?!yKf% z9q;u27*Er*9lP^%u7yD4Kj$-7p4J;pWEi+cx3YK-{e9xU(i`@)y zv()q-2i#q29J+?T5u)9|<$@6>A?dl-zEDG*@VvXM?{v`^VJwxlw^`^J5fmu&e4dMg za26KZlLa0U{-SKO4fMAO8~fV>Gtn;zl?Ogtp03h_yqhR9Wo{F2^dC`J!%G1cUExRG zW&H&EejIXnl>HcZ{@f|m?KuuY*B&}>&t4h0ZRfH&vuZWqmSy9rOUVWLUzDB8#r6?0 zf=x5SRsn=~gWLK|4=99Y!O*(}6Fy@7*yY0EibS9&JFDQ=dK?IAF;%R7<_WAv^HjaY zKLT~nSl2w`rv(3(9b5P=xPuOu2*1`9%anRrk^zqLh+3_$!A20YRJWCn+`1i->KW;=m zo_nfR82b1ZoIexaKp+2==S128=;QG>gJoRE$KQBzUI6-d+i@We8R+B3z_JHD(8muA zt)qDieSFA0*A!vs#Qiw|ayk5}ftcNO~hC@HhyH00xridVKm zA787v(6S%-c=$K568U&7rx^96{qd7V6y)RkR_%5}KHkQR&IkGU=TFtQARnK+>xBjK z@oT%zQjm|gIG|{Ud_0fHn^@%I_eM)!Bj_*w^b6ini+sFnv$+lQ@qSk44iCfq@fHqy z7G{x;-~Um72l@Diz5Z&*$M4koE{=TsZtGR9$j5(EV%d*;e7)?+K;+|N67N1jKE7x| z!~akFJ|sWSKU;uOI%l349&Pa3v|{u~^?>IsP8)h;e!o9aG!gLI+4AAXRJGsEThu4q z%HY{XDzu*&&MjvaGBV(_-5xl=0H^iH1OGU5FV4LD1DtldR&Gmx)8b=O`wuwnD=rkN zp!+<>o%i50dvB{)gDKJ3l&C4|VM?=~H5r;NViI2#nNL2xgNeTv{l;s`kEt(9iaL6H z3X|)yKeXYF38t&vuCY@s3RCl~v(Tn4V4E}Q4^$srhUu}e)nQxHFdK;*6qU5Am}!i5 zh3Ygn<}O;kwfcJxW;>WRrhT;z^L=1?wpM5xw(amE0bg%sY|p^HC-Z_H*iJF#@G6Pz zSk$P8r9->?CXFT8#c7mUllk zSnFCVcBbSsyRrOLtfUBNFiY&h3bu7BgnhV$-5{=T#Nv5a>6~Twq^m!M*E|+6aty+5 zW$7=d3=Lwfr@x(eUZ;jNSl_F}0zI(@RZ@qkennW@^I+kcFdyt??bErBM~bn&@JDL~ z)S|JGQ-l5qten`Ou7Htkw?FnZMhaklsn{5M__ES@6YP8Z_9u32{@6EzRZUH2Zvlq< zE6whfk$^T>rfo%$G~nE`%TQdz5Ui+WXxQ}34+w`Iaj(dB2JF(u+I63925MbX*^2{f zu*vt9m#wo;0PFM#b(dB93Eu7>Jr0yS;GD7h=XTaW!2W&xLd3Zapmk;3VV~$E(BW25 zJTrEH(0!I-e^GZm(0eYXq1khaFf29Z6Ztj?!0ZFRg%);zvD9idY5-so zu<&Fy9F@%9gL+^jRMI_>k+Tb#Fo+f0CdzDTY4&um``H6*iVo zD}Ig52>N*G#FKY;p^v|nXW1M9eSF@}%WnSA$E%2_d=7;^{&jlc{4VI@e{$a9=Yl@o zl{rVc6#97KIi;z+(8te+jeKT@KK`V-mE9%iEARjMX92bCm{G$I&7Ubg}IPt$hKK`RI&r9Uv zpY={qk&jp7(_8(|ep{07_NNtS`0M9Pe$5Tgt=AumY(TT%MBMN9H1xVEzs~TvMVAtZ z|2iL1SU}Iwh!pK#x=);>E}g|zTwIzwnY)+fxt$qk(j8`}L6hOc>;L>d!!$kg+@hAp zRWujeL(n#Q@)ucvEI<|@3y=lK0%QTQ09k-6Ko%eikOjyBWC5}OS%54+7Wh{cKn`AC zwA&szcvp*6W#}v-zdZ;|wWyZI=-x8jy!T)Ap~ychS%54+79b0d1^$-;)N5MoV} z!O5g`et83&D_JrQoPv{Gd>{QMI2naYwYvX)n_oWuuh(^@mVEr@zh5UOS%54+79b0d z1;_$q0kQyDfGj{3APbNM$O2>mvH)3tEI=0cw-nHAo^BRhX4kLVZe#4S=zCGOvA0;o zEFeO+neU+9j~-jy4k_(@y&7J`jx?RH<$|V!Oe{~aMo~GTEM96OzdV8PZlUq-?>-DH zuC2w)J0}UY@voGMK@H$)DlGp-b%qemr%_mpDFeQ%f8Nhz*+D4f7e2nFWCQkO>XvII zPZAXON7Y_Z0wC%(>%~jy6NHI^nIw(UO%QkfXme%GeZqEmVKRNfE|At@(G<5UknpG& zH$F1R5Aq&ba5#7j6MmmA{?OUt3QDdi^|q*$5TWTd4Xa|x!42Gt!oS0mIK20aw%aF8 zfLk7WDgEglks$Szu7}zSS`L5e(zL!xWIss!9BZ{4+~2GgSf!j!T%yYgIehduco{_L zG@W}*T-ng#`eiZ}d|s&Le#B!0YEC`f|N0OIWtl10uJjryF!r?hXT-}l6z<6tQlADS zDRj?`ne463tuXR~eMtpc>ZN*$)bQqf)%>sJrZ>M*W|?pgQSW zCNA3ZQ1_f#HWR!(lj?asr&M<6H8n^Ze=I5)L3O<(A#w>{Pqp6vH1?f^5!GmG-rCEb z9}=&(t9S>rr^6-Zru83p2aI2-2Sqbf9G8@BI4bpRTpAEgEF&r&Q*gsM5x_f z)r2$^P!OE6UeQT~*gbLfKzeXFI1?*0?MN@j%PkjlF|xjjVCo`d7sm9vD$ zp=FP96GREuI`?AtCsl-%PU$4>6bjZKcojqi6Zj({O%LWspV<*6Fp$)z9n;LYu$ z5YCRW!tX7=5_%_1UfmIkA}r17Oy7JNAuMv8W-}R5iQP2#>(Kr~(8t$oyI@gA7}DB_ z=ElWAA78|xxOq20pRS)HxcLm=D?1Y~G^YocExJmQirE2&Pn%V!Vt zuH@wMaOmUDiMMK>fIj}w8nvcz=;QNP`IOE@j3&i|VN)YG3XEskg@|C(uPpH3`ntE8T)%?@uAO!%LB`$n%>E$;t0YcM?AbKmsW z`Bd$LdyjUeQd8A3MIR8)s3~k=$-1GH)YQE6C)@`Hsi~Bsx0RD+s3~+)&E35iHPQ13 zlg~bV>PfmR^RID6)THbe^^TY-H8B@E7w&V7dZPJ?j3aZK{2_|Py7 zvF{bL)uFIlVxN!oy2QLP;&{Zm(qbodBC>w}7V6bbB5C%CsB@(`5mO-?JAUg3k&$^r z_v5YmM2bb^mpm61qA*4E=bMACh%DQ-j7_!0#O3_DhCI2a#08OLnq7Qnh})06MvMZF z5apoj$qEohG@81cJHcT>R85+XyJxu(9lqCvQqJEY?ku<)a0eI`8{FA#YAld5;ulU{ZIftke)nSC}4E*l~I> zb*(pb^^3W<$A+C$iEU^0Za?EkmH2S%(Ib~A>iX?nh7}tnsT%h(N9Zq`QRuh_$Nem- zsm6k`p{Y%?6v1_J*Bae6QVpk-s3SGAV9F(=Lzpp($~`mXdgMqVm4C*oIO*(0$|kNE z&RtTQe*yL~w1q-e|rDuMCBH_>7y&FG7k>Pe69ANdK zi1eN_J(^ZX;a6jR?ao(DSu-o}OtPkzvhu@zmhyOQ%1Tzwfw<`llx15ZMaxpTe8Gi)wvqu)Pmrs;U-_u72FQBO z?s~al0i2SPy#6z06-bq*t2!XH792n3vYK|$7R0S+x|eg46&yS?(r~WS6dbzj5sACk zfDo$4iLFm^KtO$zLKsB~?7UUB(kIXaxQXBU+Ur{dyb>k$ywrrQJG)vz_h1rmXzX48 z_ShC+x54zMFr6$g+b2{%RCo@!56ka+&#em#730#v&yE2bpZ$2!s}f)^RU)shGzkot zA6~{B;lBf5*Rb+HyE0IcwBY~Y&;fMvMrq3@Bmw`UwHMp>WCQHv*t-fNKVV(V9G=p9 z4QO8&S+De{1X!Jsu3Bkz1W=-uy-4p421dHqQ;y$n0l?=uuljsBFnJ_%CIIIlT=Pk8=xm(dhBHsBhYH^F9=|j1WsqUehNB< z0L7gZK5qN?z&0z}zL^i%K!3ULp59amU~8+CTp3aZEPl`o3xiOwIdQo6jtCX{_*X&Y z*d1W#b*1xFRwl5CIcmluO80;BtxEo1|1AX?{`xtSUsIY!yYhgtT7xvrr4Ln4ynfxo z-`4?Tvwu4`$6C+s`t9s6)hcKXpL2KaQ`!sXgP|yAXZZS}Oic1PoP{6TW9Q+N-}y-( z55Asze6u#SL7G-}c|uq$dY_lnw)1dqbNks8(IBmvH)3t zEI<|@3y=lK0%QTQ09k-6Ko%eikOjyBWP!g6P}=Gn_Fu1>qtw(rA7aYNptKPy+}-u` z;avAz!-1PpgSRuS{Ix#!@5jhV79b0d1;_$qfj^=^ed>RIjQWQEod3T6_4AmvH)3tEI<|@3y=lK0%QTQ09oMAD}Y(r zF2B>tpN;V*Ki`REAH@V@8GNtU#bH~6IP;^2^>NjX*de9`X`S!R0V(gVHB55v+r^t~-*6vnPm%joE=(!1 z#&9^4#W>EU^42EShC zR(2{e2@6dw`}XtFLma1U?OqJKhJ`qFC>(m{jknOO?DH8ljbh)1@S8N)QhRhTl zqV`7;Dl9z;jGPK+%0p2RW8GbxkeSC<7M_DS~Y?&?RtynVoZdd*V;Av=H3w= zIs5}YaqVzVIPD1z&0Iongv+YQ`V66>8Yx>4687(y@?=ayKS03^9g7Exeq6%ju8HQKUXD8ZzXIT z6|5`HX%H%za-X8Q9*gbXhYRq!eUA>L^0==&^!&^#yP z$;C59tRL46jNm>D6ywLJ{&>Gq$t{`$|Hs0+b8sK5 z(p?`g7+pxLZnz7Cd zxo%8@_Q$6e(Y2xd@eOLtm1uwbnlo1<(f)Xo)@nhxKmLu{fqGT6KfZ&SrGWOwOE0gQ zNBiRoXpX6&{qYKZ^+9NVysAm^4B8*Rx$n#uv_Iae@Lez5A75P*Je7y`$ERQOm`3~K zS6Vfxp#AaEH@H`!{qgMv&N*m*yk()UCfXnWu*?l6zcF4p5OH3 zgc-s4B5Y;g4LIMiv0Im;`%AZFPs92A#)<53I7dbFMfWwwrWVp_;-nZxdncW<^Tp ze4{>g*|@jfWWx|f)#BTIps)tJeXcEK%cLxJucbXJW5fb$T>oC$K12q4Sms<^n=FiV zh(;8Nvm0ZtWQ12K^ZH?r5}Y}-dk*PfuR2sv#0nbb|! z@i^?q!DT*gFTKU4k1zE6pw9w~{a!vig8tprk6 zRR^C3dtlQ|%nUM5ZUUWh;xfzC0sN}~o4Hl-04;wn+{SEBg0(*!x~**p^;{wySrWNDQ^nU4!*ilH7x@uh;6Ly zidX?`CFZ$m`CG6l!5qWzshz;3Z_md0Ps~7IxN60dW*UG^&7@}D(*ZzrCad=SErL=i z%Ubb459r79@-gu>6Nbw#GVW^E0hGtqd}FIs30;OLClUTkfMul>O;|PnldF>J*0iVs zji0s&nvL?n=5gif!sz2bd9>`tKA>^ALHstK%nOzVnSa)4?<<)~87eqioAv!T9bBhcHynRLo+4(M`n410h)=H4BmpLf!T6v_lS;QAR(}Wv1@%E+#lbt><7m> zf@%7;7@bER+#eq}XKzpgHd-XAc=x3d0!$}pY=+?e_;L0{;{(cYe|#VduL&L8AD_H( zdgoWTKfa3I?Se1dA75>tv^*W|k2g)NVH}40<82?6QXY<5Rxyub{&H z@!O5}=nBF8@e-L*_tN41cy=SpYPX|FN5~S?-QOBf&1g%MDjV!q5bjU?gw4b{`j-i zjy7^#~ZAAQPM4DFBKvCUKt?T?S%xWfePkKgKH!2(18B(Eumyw6w?X_cSY`rGA~^ zbBnxR>Hh1iG`sX14Ui98y1!f=h~9@rF3NLh@|W~1&8E6CH0c)K=c2hhIPpLCZUrOg zxgX7M&!RamYm)ru6(>ItS%54+79b0d1;_$q0kQyDfGj{3APbNM$O2>mvH)3tEbyln zKzrg{X4cW5J@H|56|Ly3+dtQgrblz~(q8$)4Hd3`dI$3Jkp;*CWC60k|6c{DWh)9a zMBiz^nUj3s@-{f(&)RvmvH)3tEI<|@3y=lK0%QTQ09k-6Ko%eikOls<0{H&y&H3t6{^GHGu z-&EZ(EasAmMY~3PjZhWGtyT>?R&FlGQWz~?M;hqkF3aB1pB**9vR!zjti{7{&*p>Y z?G6ZG7mr=pcSBticiJ`*9&Am6-Js}4gr6_P?51dJG;8i)wP9>qSp)j;(1g_`c@kf- zix+ofKp}?TT8s^8<mhI>qC-8}J`X6aKgXH)TsblH@Rk4v%d=iVf? z)4sr`<-I)`Y}W!AheUJEYePWmD&1_~WkwLxdapHGs1?|(XzbNm)dqIHDxWD#Q3oz% z5~B>7cEEOR8*?_pdSKkul6@Uc<3c&1qkLlFvgk5G?}}@C z${lY)1ytK+9r%XNb)2(*m(2wjTN$;Z&Tl5x`L5NwMMx0h+m625$o`Y?OxwTT_{1b( z^nuszeWnQ!x175TLXdyK7t|WMWYllAGv4&nu1N!(MM1vkDsb}wHo<&2HDS? z$j7T#S*ar*f4`z375Vts?<=+i&NfPqd^}f;s|w z$j5Il2iuU3_jywufPDOCF|9Ai$5)@4Q$#*~|8S}X^6}@N+J67jz7NUI^UoHb6hy?v zHB)nboAHO4#%{y&(JYxqkAAy9;bTb?{o6S{$)aECxAT$l;nWy-KJisS#sbbGFNIn( z;7pk9V84UzU#Uw7zNiE2iX2jD!mcXg#IoJj>)l`?Q91V=iDpnKCsFE%{Q zgX1W-R~UYpq41P)x-%X-roXSp;UFFx;A!zeC=1Uxv@o^(`5HW#kLl=K&m%nF(?Y50 zxGbJt=IZDeNWn{r$DOaIti}tr@95a7Y>eO7F7Qmn(-$udW9{xY;K1wW__aE6&*3*0 zeNSD!#ela=lw2`tEyJlv>pBd@`|$_jgB!9G$M80mwr{T0ckvf)T*=E0)!=>70|`U= z7WmuqXNyk3-#?hON+C+56#t@^oUH4cjgRY4tR#J-@dbt5#gqwqd`f(9wsh-lg6&ZE z@q;=m@QFy1jl3S_gm`|K%@*_P*etCx>)e(ZLQTazve7gN$ke{~9K9n0Or8(eyZkT) zikmv?9q77%)i&P6nv{H?zNS$8-Q`ojc+dL$c*_}}Y43HHA=nw1^5zZ4RImfZ-JIX` zfgdnQ4N-G_{|#(lmp4v>&)MzRn00Z}2O#n88XkX|3E0fL?E4~71hjmGznhE-0vQ+I zYl*A&07KIiX`*svV0CgnuH^m@=%vugv))et*kPy0y$4%>V(JSyZmU3GdvL|7_ML)& z7OTr=t*Zd8OkHz$Ss+-?rT3kWQVBr#B1cuo0RT?<^k-ghCn$Cw2c?S{fPT@~Q`gpQ zgu#a$YNy5p0A;>B@2Su}f-*Y9ZhwghVAqZ~M;ONdld6o41dfY9ldY}KD8C)pJfjJ_ z4V}93*GB~+yW4=(XR(#4LYzSEqo9*C{C7r-hTcS)V@W`c}?bQsXfoWE|xWD68q zN~E;z%t9aEGZw*f6R4h-{AhO3516~;3*C#UgFgQFh+c3D(BZy)c(m^=(C-(hziVLv zeSE#vRQzS=*FA9;vjN&x!!XSbuSi9sLVwRIGGMKFC!COjiLp^xA1D0AHv z`uN(c1gCuH<5jXLUMbMW^IEK_Mn2xxyWf%meSF&GorO8j$Cnp|p8N@YJi)zM^d9u_ z7X1ygJkZBGM7WQ~ARqruDBm3V_%p{>*mFT2?_)jm<|Xv;8(4QIOhF&NGV{aBYUty` z^`o(9=;Jer4`nPuA0HjDZTVT~;}!c~>U%;TzfpuSy&L&>!maJc)cfR@C_j`S{ZPx%tq?N6|Fi&qO{xMJY%Y`FN#bRcqwqnVqBVARj;OJgkI# z{8S>19rE!rUoXB!KAxgCUG~p@Taxegrxj@U>*q{zC$y1g{F3r{V*@75$HH0i2K2hn7xq={R4 z{SqYwJ-4{FXSt v0@RB+2BA#qPvO*RxEnnSry=Laottp#bt;QY!m06`^ECh8O@8_Kzh3`;US7)- diff --git a/modules/heat_transfer/src/dirackernels/GapHeatPointSourceMaster.C b/modules/heat_transfer/src/dirackernels/GapHeatPointSourceMaster.C index a1737645daea..fe6ab622dea7 100644 --- a/modules/heat_transfer/src/dirackernels/GapHeatPointSourceMaster.C +++ b/modules/heat_transfer/src/dirackernels/GapHeatPointSourceMaster.C @@ -22,8 +22,8 @@ GapHeatPointSourceMaster::validParams() MooseEnum orders("CONSTANT FIRST SECOND THIRD FOURTH", "FIRST"); InputParameters params = DiracKernel::validParams(); - params.addParam("boundary", {}, "The primary boundary"); - params.addParam("secondary", {}, "The secondary boundary"); + params.addParam("boundary", "The primary boundary"); + params.addParam("secondary", "The secondary boundary"); params.addParam("order", orders, "The finite element order"); params.set("use_displaced_mesh") = true; params.addParam("tangential_tolerance", diff --git a/modules/optimization/src/reporters/OptimizationData.C b/modules/optimization/src/reporters/OptimizationData.C index 3c2c830d1cdc..bbe043f1efa3 100644 --- a/modules/optimization/src/reporters/OptimizationData.C +++ b/modules/optimization/src/reporters/OptimizationData.C @@ -269,7 +269,7 @@ template void OptimizationDataTempl::readMeasurementsFromInput() { - if (this->template getParam>("file_variable_weights").size()) + if (!this->template getParam>("file_variable_weights").empty()) this->paramError( "measurement_values", "file_variable_weights cannot be used with measurement data read from the input " diff --git a/modules/ray_tracing/src/raykernels/RayKernelBase.C b/modules/ray_tracing/src/raykernels/RayKernelBase.C index 6e7646c0be3d..16a7a8623c86 100644 --- a/modules/ray_tracing/src/raykernels/RayKernelBase.C +++ b/modules/ray_tracing/src/raykernels/RayKernelBase.C @@ -49,7 +49,7 @@ RayKernelBase::RayKernelBase(const InputParameters & params) _need_segment_reinit(getParam("_need_segment_reinit")) { // Add dependencies - if (params.isParamSetByUser("depends_on") && isParamValid("depends_on")) + if (isParamValid("depends_on")) for (const auto & name : getParam>("depends_on")) dependsOn(name); diff --git a/modules/tensor_mechanics/test/tests/notched_plastic_block/biaxial_planar.i b/modules/tensor_mechanics/test/tests/notched_plastic_block/biaxial_planar.i index 869b653cfc55..0486ffdd7e43 100644 --- a/modules/tensor_mechanics/test/tests/notched_plastic_block/biaxial_planar.i +++ b/modules/tensor_mechanics/test/tests/notched_plastic_block/biaxial_planar.i @@ -245,7 +245,7 @@ start_time = -1 end_time = 10 dt = 1 - dtmin = 0.1 + dtmin = 1 solve_type = NEWTON type = Transient @@ -255,8 +255,8 @@ l_max_its = 200 nl_max_its = 400 - petsc_options_iname = '-pc_type' - petsc_options_value = 'lu' + petsc_options_iname = '-pc_type -pc_asm_overlap -sub_pc_type -ksp_type -ksp_gmres_restart' + petsc_options_value = ' asm 2 lu gmres 200' [] diff --git a/modules/tensor_mechanics/test/tests/notched_plastic_block/gold/biaxial_planar_out.csv b/modules/tensor_mechanics/test/tests/notched_plastic_block/gold/biaxial_planar_out.csv index 09c7e00e37ba..d87e3cb1bd81 100644 --- a/modules/tensor_mechanics/test/tests/notched_plastic_block/gold/biaxial_planar_out.csv +++ b/modules/tensor_mechanics/test/tests/notched_plastic_block/gold/biaxial_planar_out.csv @@ -1,6 +1,4 @@ time,s_zz -1,0 --0.75,4212480.7763311 --0.25,4212480.7687263 -0.75,4246241.4049096 -1,4256259.3495139 +0,4212480.7815763 +1,4256182.3497563 diff --git a/modules/thermal_hydraulics/test/src/actions/ClosureTestAction.C b/modules/thermal_hydraulics/test/src/actions/ClosureTestAction.C index d6ce8bbbecde..ad1693f7a7b5 100644 --- a/modules/thermal_hydraulics/test/src/actions/ClosureTestAction.C +++ b/modules/thermal_hydraulics/test/src/actions/ClosureTestAction.C @@ -19,9 +19,9 @@ ClosureTestAction::validParams() params.addParam("T_wall", "Wall temperature function"); params.addParam("q_wall", 0., "Convective wall heat flux"); - params.addParam>("output", "List of material properties to output"); - params.addParam>("ad_output", - "List of AD material properties to output"); + params.addParam>("output", {}, "List of material properties to output"); + params.addParam>( + "ad_output", {}, "List of AD material properties to output"); params.set("fe_family") = "LAGRANGE"; params.set("fe_order") = "FIRST"; From d4384d29d355a58fe977d08f17b86ced95d81904 Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Thu, 28 Sep 2023 21:38:43 -0600 Subject: [PATCH 4/5] Add default param for failed tests in Modules Add default value for "included_boundaries" Add default value for porous_flow "phase" Add missing clearance_schedule due to rebase Fix high_order_elements.square_branch_tri7_2d exodiff error Address review: minor changes, remove yaml file and modify .gitignore Co-Authored-By: Guillaume Giudicelli Clean format for precheck Clean format Clean format for pre-check Clean format for precheck --- .gitignore | 1 + .../MaterialDerivativeTestKernelBase.h | 3 +- framework/src/auxkernels/ParsedVectorAux.C | 18 +++-- .../src/functormaterials/FunctorADConverter.C | 1 + .../meshgenerators/ParsedGenerateSideset.C | 21 +++--- .../src/meshgenerators/RenameBlockGenerator.C | 73 ++++++++++++++++++- .../src/nodalkernels/UpperBoundNodalKernel.C | 3 +- .../src/partitioner/LibmeshPartitioner.C | 19 +++-- .../src/postprocessors/ParsedPostprocessor.C | 5 +- .../FieldSplitPreconditioner.C | 14 ++-- .../PhysicsBasedPreconditioner.C | 1 + .../VariableCondensationPreconditioner.C | 28 +++---- framework/src/problems/DisplacedProblem.C | 2 +- framework/src/problems/FEProblemBase.C | 12 +-- .../userobjects/GeochemicalModelDefinition.C | 3 +- modules/misc/misc.yaml | 9 --- .../postprocessors/FVPorousFlowFluidMass.C | 1 + .../src/postprocessors/PorousFlowHeatEnergy.C | 3 +- .../src/raybcs/RayBoundaryConditionBase.C | 2 +- .../src/actions/CohesiveZoneActionBase.C | 16 ++-- .../actions/MaterialVectorBodyForceAction.C | 4 +- .../ADComputeStrainIncrementBasedStress.C | 4 +- .../ComputeStrainIncrementBasedStress.C | 4 +- modules/xfem/src/actions/XFEMAction.C | 1 - .../nodalkernels/ADLowerBoundNodalKernel.C | 3 +- 25 files changed, 164 insertions(+), 87 deletions(-) delete mode 100644 modules/misc/misc.yaml diff --git a/.gitignore b/.gitignore index 2ae1547959f2..395d47c1cbb6 100644 --- a/.gitignore +++ b/.gitignore @@ -321,5 +321,6 @@ share/ /modules/reactor/unit/reactor-unit.yaml /modules/rdg/unit/rdg-unit.yaml /modules/fsi/unit/fsi-unit.yaml +/modules/misc/misc.yaml /tutorials/tutorial01_app_development/*/babbler.yaml /tutorials/darcy_thermo_mech/*/darcy_thermo_mech.yaml diff --git a/framework/include/kernels/MaterialDerivativeTestKernelBase.h b/framework/include/kernels/MaterialDerivativeTestKernelBase.h index 03af989c8b4f..ecc47079a342 100644 --- a/framework/include/kernels/MaterialDerivativeTestKernelBase.h +++ b/framework/include/kernels/MaterialDerivativeTestKernelBase.h @@ -47,8 +47,7 @@ MaterialDerivativeTestKernelBase::MaterialDerivativeTestKernelBase( const InputParameters & parameters) : DerivativeMaterialInterface>(parameters), _n_vars(_coupled_moose_vars.size()), - _derivative(isParamValid("derivative") ? getParam>("derivative") - : std::vector{}), + _derivative(getParam>("derivative")), _p(this->template getMaterialPropertyDerivative("material_property", _derivative)), _p_off_diag_derivatives(_n_vars), _p_diag_derivative(this->template getMaterialPropertyDerivative( diff --git a/framework/src/auxkernels/ParsedVectorAux.C b/framework/src/auxkernels/ParsedVectorAux.C index 450ca7218f11..e45bf0441688 100644 --- a/framework/src/auxkernels/ParsedVectorAux.C +++ b/framework/src/auxkernels/ParsedVectorAux.C @@ -91,17 +91,19 @@ ParsedVectorAux::ParsedVectorAux(const InputParameters & parameters) setParserFeatureFlags(_func_F[i]); // add the constant expressions - if (isParamValid("constant_names") && isParamValid("constant_expressions")) - { - auto constant_names = getParam>>("constant_names"); - auto constant_expressions = - getParam>>("constant_expressions"); + auto constant_names = isParamValid("constant_names") + ? getParam>>("constant_names") + : std::vector>{}; + auto constant_expressions = + isParamValid("constant_expressions") + ? getParam>>("constant_expressions") + : std::vector>{}; - if (constant_names.size() != constant_expressions.size()) - paramError("constant_names", "Must be same length as constant_expressions"); + if (constant_names.size() != constant_expressions.size()) + paramError("constant_names", "Must be same length as constant_expressions"); + if (isParamValid("constant_names") && isParamValid("constant_expressions")) addFParserConstants(_func_F[i], constant_names[i], constant_expressions[i]); - } // parse function if (_func_F[i]->Parse(_function[i], variables) >= 0) diff --git a/framework/src/functormaterials/FunctorADConverter.C b/framework/src/functormaterials/FunctorADConverter.C index 7c3c2a84701d..cdacfe8cc917 100644 --- a/framework/src/functormaterials/FunctorADConverter.C +++ b/framework/src/functormaterials/FunctorADConverter.C @@ -36,6 +36,7 @@ template FunctorADConverterTempl::FunctorADConverterTempl(const InputParameters & parameters) : FunctorMaterial(parameters) { + const std::set clearance_schedule(_execute_enum.begin(), _execute_enum.end()); auto reg_props_in = getParam>("reg_props_in"); auto ad_props_out = getParam>("ad_props_out"); auto ad_props_in = getParam>("ad_props_in"); diff --git a/framework/src/meshgenerators/ParsedGenerateSideset.C b/framework/src/meshgenerators/ParsedGenerateSideset.C index be6d16142ff0..c94d29f5ef21 100644 --- a/framework/src/meshgenerators/ParsedGenerateSideset.C +++ b/framework/src/meshgenerators/ParsedGenerateSideset.C @@ -103,15 +103,18 @@ ParsedGenerateSideset::ParsedGenerateSideset(const InputParameters & parameters) // Handle incompatible parameters if (_include_only_external_sides && _check_neighbor_subdomains) paramError("include_only_external_sides", "External sides dont have neighbors"); - const auto & included_boundaries = getParam>("included_boundaries"); - if (std::find(included_boundaries.begin(), included_boundaries.end(), _sideset_name) != - included_boundaries.end()) - paramError("new_boundary", - "A boundary cannot be both the new boundary and be included in the list of included " - "boundaries. If you are trying to restrict an existing boundary, you must use a " - "different name for 'new_boundary', delete the old boundary, and then rename the " - "new boundary to the old boundary."); - + if (_check_boundaries) + { + const auto & included_boundaries = getParam>("included_boundaries"); + if (std::find(included_boundaries.begin(), included_boundaries.end(), _sideset_name) != + included_boundaries.end()) + paramError( + "new_boundary", + "A boundary cannot be both the new boundary and be included in the list of included " + "boundaries. If you are trying to restrict an existing boundary, you must use a " + "different name for 'new_boundary', delete the old boundary, and then rename the " + "new boundary to the old boundary."); + } // base function object _func_F = std::make_shared(); diff --git a/framework/src/meshgenerators/RenameBlockGenerator.C b/framework/src/meshgenerators/RenameBlockGenerator.C index 898e4dcacca1..9f8d5ab4a316 100644 --- a/framework/src/meshgenerators/RenameBlockGenerator.C +++ b/framework/src/meshgenerators/RenameBlockGenerator.C @@ -23,11 +23,39 @@ RenameBlockGenerator::validParams() params.addRequiredParam("input", "The mesh we want to modify"); - params.addRequiredParam>( + params.addDeprecatedParam>( + "old_block_id", + "Elements with this block number will be given the new_block_number or " + "new_block_name. You must supply either old_block_id or old_block_name. " + "You may supply a vector of old_block_id, in which case the new_block " + "information must also be a vector.", + "Use 'old_block' instead of 'old_block_id'."); + params.addDeprecatedParam>( + "old_block_name", + "Elements with this block name will be given the new_block_number or " + "new_block_name. You must supply either old_block_id or old_block_name. " + "You may supply a vector of old_block_name, in which case the new_block " + "information must also be a vector.", + "Use 'old_block' instead of 'old_block_name'."); + params.addDeprecatedParam>( + "new_block_id", + "Elements with the old block number (or name) will be given this block " + "number. If the old blocks are named, their names will be passed onto the " + "newly numbered blocks.", + "Use 'new_block' instead of 'new_block_id'."); + params.addDeprecatedParam>( + "new_block_name", + "Elements with the old block number (or name) will be given this block " + "name. No change of block ID is performed, unless multiple old blocks are " + "given the same name, in which case they are all given the first old block " + "number.", + "Use 'new_block' instead of 'new_block_name'."); + + params.addParam>( "old_block", "Elements with these block ID(s)/name(s) will be given the new block information specified " "in 'new_block'"); - params.addRequiredParam>( + params.addParam>( "new_block", "The new block ID(s)/name(s) to be given by the elements defined in 'old_block'."); @@ -41,21 +69,60 @@ RenameBlockGenerator::validParams() RenameBlockGenerator::RenameBlockGenerator(const InputParameters & parameters) : MeshGenerator(parameters), _input(getMesh("input")) { + if (isParamValid("old_block_id") && isParamValid("old_block_name")) + paramError("old_block_id", + "Cannot use in combination with 'old_block_name'. Please use 'old_block' " + "instead; 'old_block_id' and 'old_block_name' are deprecated."); + if (isParamValid("new_block_id") && isParamValid("new_block_name")) + paramError("new_block_id", + "Cannot use in combination with 'new_block_name'. Please use 'new_block' " + "instead; 'new_block_id' and 'new_block_name' are deprecated."); if (isParamValid("old_block")) { + if (isParamValid("old_block_id")) + paramError("old_block_id", + "Cannot use with 'old_block'. Use only 'old_block'; 'old_block_id' is " + "deprecated."); + if (isParamValid("old_block_name")) + paramError("old_block_name", + "Cannot use with 'old_block'. Use only 'old_block'; 'old_block_name' is " + "deprecated."); _old_block = getParam>("old_block"); _old_block_param_name = "old_block"; } + else if (isParamValid("old_block_id")) + { + for (const auto id : getParam>("old_block_id")) + _old_block.push_back(std::to_string(id)); + _old_block_param_name = "old_block_id"; + } else - paramError("old_block", "No valid 'old_block' name is provided."); + { + _old_block = getParam>("old_block_name"); + _old_block_param_name = "old_block_name"; + } std::string new_block_param_name; if (isParamValid("new_block")) { + if (isParamValid("new_block_id")) + paramError("new_block_id", + "Cannot use with 'new_block'. Use only 'new_block'; 'new_block_id' is " + "deprecated."); + if (isParamValid("new_block_name")) + paramError("new_block_name", + "Cannot use with 'new_block'. Use only 'new_block'; 'new_block_name' is " + "deprecated."); _new_block = getParam>("new_block"); new_block_param_name = "new_block"; } + else if (isParamValid("new_block_id")) + { + for (const auto id : getParam>("new_block_id")) + _new_block.push_back(std::to_string(id)); + new_block_param_name = "new_block_id"; + } else { _new_block = getParam>("new_block_name"); diff --git a/framework/src/nodalkernels/UpperBoundNodalKernel.C b/framework/src/nodalkernels/UpperBoundNodalKernel.C index 1e9d96990e16..8edc6f6e34ba 100644 --- a/framework/src/nodalkernels/UpperBoundNodalKernel.C +++ b/framework/src/nodalkernels/UpperBoundNodalKernel.C @@ -20,7 +20,8 @@ UpperBoundNodalKernel::validParams() "v", "The coupled variable we require to be greater than the upper bound"); params.addParam("upper_bound", 0, "The upper bound on the coupled variable"); params.addParam>( - "exclude_boundaries", {}, + "exclude_boundaries", + {}, "Boundaries on which not to execute the NodalKernel. This can be useful for avoiding " "singuarility in the matrix in case a constraint is active in the same place that a " "DirichletBC is set"); diff --git a/framework/src/partitioner/LibmeshPartitioner.C b/framework/src/partitioner/LibmeshPartitioner.C index 6e36c51f8141..41be89a66b88 100644 --- a/framework/src/partitioner/LibmeshPartitioner.C +++ b/framework/src/partitioner/LibmeshPartitioner.C @@ -149,18 +149,17 @@ LibmeshPartitioner::prepareBlocksForSubdomainPartitioner( subdomain_partitioner.chunks.clear(); // Insert each chunk - if (_subdomain_blocks.size() != 0) - for (const auto & group : _subdomain_blocks) - { - const auto subdomain_ids = MooseMeshUtils::getSubdomainIDs(mesh, group); - for (const auto id : subdomain_ids) - if (!mesh_subdomain_ids.count(id)) - paramError("blocks", "The block ", id, " was not found on the mesh"); + for (const auto & group : _subdomain_blocks) + { + const auto subdomain_ids = MooseMeshUtils::getSubdomainIDs(mesh, group); + for (const auto id : subdomain_ids) + if (!mesh_subdomain_ids.count(id)) + paramError("blocks", "The block ", id, " was not found on the mesh"); - std::set subdomain_ids_set(subdomain_ids.begin(), subdomain_ids.end()); + std::set subdomain_ids_set(subdomain_ids.begin(), subdomain_ids.end()); - subdomain_partitioner.chunks.push_back(subdomain_ids_set); - } + subdomain_partitioner.chunks.push_back(subdomain_ids_set); + } } void diff --git a/framework/src/postprocessors/ParsedPostprocessor.C b/framework/src/postprocessors/ParsedPostprocessor.C index dd9ffed4e766..07fc19bd8be0 100644 --- a/framework/src/postprocessors/ParsedPostprocessor.C +++ b/framework/src/postprocessors/ParsedPostprocessor.C @@ -21,9 +21,12 @@ ParsedPostprocessor::validParams() "function", "FunctionExpression", "function expression"); params.addRequiredParam>("pp_names", "Post-processors arguments"); params.addParam>( - "constant_names", "Vector of constants used in the parsed function (use this for kB etc.)"); + "constant_names", + {}, + "Vector of constants used in the parsed function (use this for kB etc.)"); params.addParam>( "constant_expressions", + {}, "Vector of values for the constants in constant_names (can be an FParser expression)"); params.addParam( "use_t", false, "Make time (t) variables available in the function expression."); diff --git a/framework/src/preconditioners/FieldSplitPreconditioner.C b/framework/src/preconditioners/FieldSplitPreconditioner.C index 5fbbc2cfea8e..a52a1c5d8279 100644 --- a/framework/src/preconditioners/FieldSplitPreconditioner.C +++ b/framework/src/preconditioners/FieldSplitPreconditioner.C @@ -67,12 +67,14 @@ FieldSplitPreconditioner::FieldSplitPreconditioner(const InputParameters & param // off-diagonal entries std::vector> off_diag(n_vars); - for (const auto i : index_range(off_diag_rows)) - { - unsigned int row = _nl.getVariable(0, off_diag_rows[i]).number(); - unsigned int column = _nl.getVariable(0, off_diag_columns[i]).number(); - (*cm)(row, column) = 1; - } + if (off_diag_rows.size() * off_diag_columns.size() != 0 && + off_diag_rows.size() == off_diag_columns.size()) + for (const auto i : index_range(off_diag_rows)) + { + unsigned int row = _nl.getVariable(0, off_diag_rows[i]).number(); + unsigned int column = _nl.getVariable(0, off_diag_columns[i]).number(); + (*cm)(row, column) = 1; + } } } else diff --git a/framework/src/preconditioners/PhysicsBasedPreconditioner.C b/framework/src/preconditioners/PhysicsBasedPreconditioner.C index 3dccac1f29c8..a9829926d3bb 100644 --- a/framework/src/preconditioners/PhysicsBasedPreconditioner.C +++ b/framework/src/preconditioners/PhysicsBasedPreconditioner.C @@ -127,6 +127,7 @@ PhysicsBasedPreconditioner::PhysicsBasedPreconditioner(const InputParameters & p off_diag[row].push_back(column); } } + // Add all of the preconditioning systems for (unsigned int var = 0; var < n_vars; var++) addSystem(var, off_diag[var], _pre_type[var]); diff --git a/framework/src/preconditioners/VariableCondensationPreconditioner.C b/framework/src/preconditioners/VariableCondensationPreconditioner.C index 8d3048768b67..ce933510efc3 100644 --- a/framework/src/preconditioners/VariableCondensationPreconditioner.C +++ b/framework/src/preconditioners/VariableCondensationPreconditioner.C @@ -160,20 +160,20 @@ VariableCondensationPreconditioner::VariableCondensationPreconditioner( // off-diagonal entries from the coupled_groups parameters if (isParamValid("coupled_groups")) - for (const auto & coupled_group : - getParam>("coupled_groups")) - { - std::vector vars; - MooseUtils::tokenize(coupled_group, vars, 1, ","); - for (unsigned int j : index_range(vars)) - for (unsigned int k = j + 1; k < vars.size(); ++k) - { - const unsigned int row = _nl.getVariable(0, vars[j]).number(); - const unsigned int column = _nl.getVariable(0, vars[k]).number(); - (*cm)(row, column) = 1; - (*cm)(column, row) = 1; - } - } + for (const auto & coupled_group : + getParam>("coupled_groups")) + { + std::vector vars; + MooseUtils::tokenize(coupled_group, vars, 1, ","); + for (unsigned int j : index_range(vars)) + for (unsigned int k = j + 1; k < vars.size(); ++k) + { + const unsigned int row = _nl.getVariable(0, vars[j]).number(); + const unsigned int column = _nl.getVariable(0, vars[k]).number(); + (*cm)(row, column) = 1; + (*cm)(column, row) = 1; + } + } } else { diff --git a/framework/src/problems/DisplacedProblem.C b/framework/src/problems/DisplacedProblem.C index 94b21ad576cd..886f867b2c2b 100644 --- a/framework/src/problems/DisplacedProblem.C +++ b/framework/src/problems/DisplacedProblem.C @@ -34,7 +34,7 @@ DisplacedProblem::validParams() "A Problem object for providing access to the displaced finite element " "mesh and associated variables."); params.addPrivateParam("mesh"); - params.addPrivateParam>("displacements"); + params.addPrivateParam>("displacements", {}); return params; } diff --git a/framework/src/problems/FEProblemBase.C b/framework/src/problems/FEProblemBase.C index 5a882bc202f6..f67bd4463646 100644 --- a/framework/src/problems/FEProblemBase.C +++ b/framework/src/problems/FEProblemBase.C @@ -515,12 +515,12 @@ FEProblemBase::createTagVectors() if (isParamValid("extra_tag_matrices")) { auto & matrices = getParam>>("extra_tag_matrices"); - for (const auto nl_sys_num : index_range(matrices)) - for (auto & matrix : matrices[nl_sys_num]) - { - auto tag = addMatrixTag(matrix); - _nl[nl_sys_num]->addMatrix(tag); - } + for (const auto nl_sys_num : index_range(matrices)) + for (auto & matrix : matrices[nl_sys_num]) + { + auto tag = addMatrixTag(matrix); + _nl[nl_sys_num]->addMatrix(tag); + } } } diff --git a/modules/geochemistry/src/userobjects/GeochemicalModelDefinition.C b/modules/geochemistry/src/userobjects/GeochemicalModelDefinition.C index cccf08428e1f..d8014c5295f5 100644 --- a/modules/geochemistry/src/userobjects/GeochemicalModelDefinition.C +++ b/modules/geochemistry/src/userobjects/GeochemicalModelDefinition.C @@ -39,7 +39,8 @@ GeochemicalModelDefinition::validParams() "database, the sorbing sites (if any) and the decoupled redox states that are in " "disequilibrium (if any)."); params.addParam>( - "equilibrium_minerals", {}, + "equilibrium_minerals", + {}, "A list of minerals that are in equilibrium with the aqueous solution. All members of this " "list must be in the 'minerals' section of the database file"); params.addParam>( diff --git a/modules/misc/misc.yaml b/modules/misc/misc.yaml deleted file mode 100644 index 23e0b023ec45..000000000000 --- a/modules/misc/misc.yaml +++ /dev/null @@ -1,9 +0,0 @@ -DMETHOD: opt -Werror: reorder -compiler_type: clang -documentation: true -installation_type: in_tree -registered_apps: -- WASPAPP -- MISCTESTAPP -- MISCAPP diff --git a/modules/porous_flow/src/postprocessors/FVPorousFlowFluidMass.C b/modules/porous_flow/src/postprocessors/FVPorousFlowFluidMass.C index c6709e58cb26..76fd1567bf21 100644 --- a/modules/porous_flow/src/postprocessors/FVPorousFlowFluidMass.C +++ b/modules/porous_flow/src/postprocessors/FVPorousFlowFluidMass.C @@ -22,6 +22,7 @@ FVPorousFlowFluidMass::validParams() params.addRequiredParam( "PorousFlowDictator", "The UserObject that holds the list of PorousFlow variable names."); params.addParam>("phase", + {}, "The index of the fluid phase that this " "Postprocessor is restricted to. Multiple " "indices can be entered"); diff --git a/modules/porous_flow/src/postprocessors/PorousFlowHeatEnergy.C b/modules/porous_flow/src/postprocessors/PorousFlowHeatEnergy.C index 83a27490b248..43f6ea0150c3 100644 --- a/modules/porous_flow/src/postprocessors/PorousFlowHeatEnergy.C +++ b/modules/porous_flow/src/postprocessors/PorousFlowHeatEnergy.C @@ -23,7 +23,8 @@ PorousFlowHeatEnergy::validParams() "PorousFlowDictator", "The UserObject that holds the list of PorousFlow variable names."); params.addParam( "include_porous_skeleton", true, "Include the heat energy of the porous skeleton"); - params.addParam>("phase", {}, + params.addParam>("phase", + {}, "The index(es) of the fluid phase that this " "Postprocessor is restricted to. Multiple " "indices can be entered."); diff --git a/modules/ray_tracing/src/raybcs/RayBoundaryConditionBase.C b/modules/ray_tracing/src/raybcs/RayBoundaryConditionBase.C index 51ae3f785499..d81f2091e6eb 100644 --- a/modules/ray_tracing/src/raybcs/RayBoundaryConditionBase.C +++ b/modules/ray_tracing/src/raybcs/RayBoundaryConditionBase.C @@ -42,7 +42,7 @@ RayBoundaryConditionBase::RayBoundaryConditionBase(const InputParameters & param _current_bnd_id(_trace_ray.currentBoundaryID()) { // Add dependencies - if (params.isParamSetByUser("depends_on") && isParamValid("depends_on")) + if (params.isParamSetByUser("depends_on")) for (const auto & name : getParam>("depends_on")) dependsOn(name); } diff --git a/modules/tensor_mechanics/src/actions/CohesiveZoneActionBase.C b/modules/tensor_mechanics/src/actions/CohesiveZoneActionBase.C index 32d463412921..f9853a113a44 100644 --- a/modules/tensor_mechanics/src/actions/CohesiveZoneActionBase.C +++ b/modules/tensor_mechanics/src/actions/CohesiveZoneActionBase.C @@ -47,14 +47,18 @@ CohesiveZoneActionBase::validParams() false, "Whether to use automatic differentiation to compute the Jacobian"); params.addParam("base_name", "Material property base name"); - params.addParam>("save_in_master", {}, - "The displacement residuals on the master side"); params.addParam>( - "diag_save_in_master", {}, "The displacement diagonal preconditioner terms on the master side"); - params.addParam>("save_in_slave", {}, - "The displacement residuals on the slave side"); + "save_in_master", {}, "The displacement residuals on the master side"); params.addParam>( - "diag_save_in_slave", {}, "The displacement diagonal preconditioner terms on the slave side"); + "diag_save_in_master", + {}, + "The displacement diagonal preconditioner terms on the master side"); + params.addParam>( + "save_in_slave", {}, "The displacement residuals on the slave side"); + params.addParam>( + "diag_save_in_slave", + {}, + "The displacement diagonal preconditioner terms on the slave side"); params.addParamNamesToGroup("save_in_master diag_save_in_master save_in_slave diag_save_in_slave", "Advanced"); params.addParam("verbose", false, "Display extra information."); diff --git a/modules/tensor_mechanics/src/actions/MaterialVectorBodyForceAction.C b/modules/tensor_mechanics/src/actions/MaterialVectorBodyForceAction.C index 5d9320434ca9..fd8a86d4ce2f 100644 --- a/modules/tensor_mechanics/src/actions/MaterialVectorBodyForceAction.C +++ b/modules/tensor_mechanics/src/actions/MaterialVectorBodyForceAction.C @@ -20,8 +20,8 @@ MaterialVectorBodyForceAction::validParams() InputParameters params = Action::validParams(); params.addClassDescription("Set up volumetric body force kernels"); - params.addParam>( - "block", "The block ids where the body force will be applied"); + params.addParam>("block", + "The block ids where the body force will be applied"); params.addParam>( "displacements", diff --git a/modules/tensor_mechanics/src/materials/ADComputeStrainIncrementBasedStress.C b/modules/tensor_mechanics/src/materials/ADComputeStrainIncrementBasedStress.C index a576c014c5e2..f97d0f9d58a1 100644 --- a/modules/tensor_mechanics/src/materials/ADComputeStrainIncrementBasedStress.C +++ b/modules/tensor_mechanics/src/materials/ADComputeStrainIncrementBasedStress.C @@ -16,8 +16,8 @@ ADComputeStrainIncrementBasedStress::validParams() { InputParameters params = ADComputeStressBase::validParams(); params.addClassDescription("Compute stress after subtracting inelastic strain increments"); - params.addParam>("inelastic_strain_names",{}, - "Names of inelastic strain properties"); + params.addParam>( + "inelastic_strain_names", {}, "Names of inelastic strain properties"); return params; } diff --git a/modules/tensor_mechanics/src/materials/ComputeStrainIncrementBasedStress.C b/modules/tensor_mechanics/src/materials/ComputeStrainIncrementBasedStress.C index 37143372aeb0..be4da0a54d9c 100644 --- a/modules/tensor_mechanics/src/materials/ComputeStrainIncrementBasedStress.C +++ b/modules/tensor_mechanics/src/materials/ComputeStrainIncrementBasedStress.C @@ -16,8 +16,8 @@ ComputeStrainIncrementBasedStress::validParams() { InputParameters params = ComputeStressBase::validParams(); params.addClassDescription("Compute stress after subtracting inelastic strain increments"); - params.addParam>("inelastic_strain_names", {}, - "Names of inelastic strain properties"); + params.addParam>( + "inelastic_strain_names", {}, "Names of inelastic strain properties"); return params; } diff --git a/modules/xfem/src/actions/XFEMAction.C b/modules/xfem/src/actions/XFEMAction.C index d3fd0f2e9d3b..df6ed8aafafe 100644 --- a/modules/xfem/src/actions/XFEMAction.C +++ b/modules/xfem/src/actions/XFEMAction.C @@ -65,7 +65,6 @@ XFEMAction::validParams() "The CrackFrontDefinition user object name (only " "needed if 'use_crack_tip_enrichment=true')"); params.addParam>("displacements", - {}, "Names of displacement variables (only " "needed if 'use_crack_tip_enrichment=true')"); params.addParam>("enrichment_displacements", diff --git a/test/src/nodalkernels/ADLowerBoundNodalKernel.C b/test/src/nodalkernels/ADLowerBoundNodalKernel.C index 5509b5bc6cd2..8a8b176914c6 100644 --- a/test/src/nodalkernels/ADLowerBoundNodalKernel.C +++ b/test/src/nodalkernels/ADLowerBoundNodalKernel.C @@ -19,7 +19,8 @@ ADLowerBoundNodalKernel::validParams() "v", "The coupled variable we require to be greater than the lower bound"); params.addParam("lower_bound", "The lower bound on the coupled variable"); params.addParam>( - "exclude_boundaries", {}, + "exclude_boundaries", + {}, "Boundaries on which not to execute the NodalKernel. This can be useful for avoiding " "singularity in the matrix in case a constraint is active in the same place that a " "DirichletBC is set"); From 49ab69ff9f9b51bb06338b8eb17f21bc5d6ac77a Mon Sep 17 00:00:00 2001 From: MengnanLi91 <118846840+MengnanLi91@users.noreply.github.com> Date: Thu, 2 Nov 2023 14:32:25 -0600 Subject: [PATCH 5/5] Address review: use default value when possible, replace isParamSetByUser Co-Authored-By: Guillaume Giudicelli Address review: remove isParamValid if necessary Co-Authored-By: Guillaume Giudicelli Use default {} in VariableCodensatonPreconditioner Co-Authored-By: Guillaume Giudicelli Address review: replace isParamSetByUser Co-Authored-By: Daniel Schwen Clean format for precheck Fix module tests failure Address review: format change and remove unnecessary isParamValid check Co-Authored-By: Guillaume Giudicelli Address review: use size check Co-Authored-By: Guillaume Giudicelli --- framework/src/actions/AdaptivityAction.C | 17 +-- framework/src/auxkernels/ArrayParsedAux.C | 12 +- framework/src/auxkernels/ParsedAux.C | 12 +- .../src/materials/DerivativeSumMaterial.C | 4 +- .../src/materials/MaterialFunctorConverter.C | 5 +- .../meshgenerators/ExtraNodesetGenerator.C | 105 +++++++++--------- .../meshgenerators/ParsedGenerateSideset.C | 12 +- .../ParsedNodeTransformGenerator.C | 12 +- .../ParsedSubdomainMeshGenerator.C | 12 +- .../src/meshgenerators/RenameBlockGenerator.C | 8 +- framework/src/nodalkernels/ADNodalKernel.C | 4 +- framework/src/outputs/AdvancedOutput.C | 7 +- .../FunctionValuePostprocessor.C | 10 +- .../src/postprocessors/ParsedPostprocessor.C | 7 +- .../FieldSplitPreconditioner.C | 1 + .../FiniteDifferencePreconditioner.C | 1 + .../src/preconditioners/MoosePreconditioner.C | 4 +- .../PhysicsBasedPreconditioner.C | 1 - .../SingleMatrixPreconditioner.C | 40 +++---- .../VariableCondensationPreconditioner.C | 31 +++--- framework/src/problems/FEProblemBase.C | 52 ++++----- framework/src/scalarkernels/ParsedODEKernel.C | 27 ++--- framework/src/timesteppers/FunctionDT.C | 6 +- .../transfers/MultiAppConservativeTransfer.C | 7 +- .../src/transfers/MultiAppDofCopyTransfer.C | 36 +++--- .../src/actions/ChemicalCompositionAction.C | 4 +- .../src/actions/PorousFlowSinglePhaseBase.C | 4 +- .../src/userobjects/CrackFrontDefinition.C | 8 +- .../src/components/Component2D.C | 2 +- .../src/components/HeatStructureBase.C | 2 +- .../src/components/HeatStructureCylindrical.C | 8 +- .../src/components/HeatStructurePlate.C | 9 +- .../rename_block_generator/tests | 86 ++++++++++++++ 33 files changed, 325 insertions(+), 231 deletions(-) diff --git a/framework/src/actions/AdaptivityAction.C b/framework/src/actions/AdaptivityAction.C index 39948574b00a..28b2178177d2 100644 --- a/framework/src/actions/AdaptivityAction.C +++ b/framework/src/actions/AdaptivityAction.C @@ -69,9 +69,10 @@ AdaptivityAction::validParams() std::numeric_limits::max(), "The time after which adaptivity will no longer be active."); params.addParam>( - "weight_names", "List of names of variables that will be associated with weight_values"); + "weight_names", {}, "List of names of variables that will be associated with weight_values"); params.addParam>( "weight_values", + {}, "List of values between 0 and 1 to weight the associated weight_names error by"); params.addParam("cycles_per_step", 1, "The number of adaptivity cycles per step"); @@ -170,15 +171,15 @@ AdaptivityAction::act() adapt.setPrintMeshChanged(getParam("print_changed_info")); - if (isParamValid("weight_names") && isParamValid("weight_values")) - { - const std::vector & weight_names = - getParam>("weight_names"); - const std::vector & weight_values = getParam>("weight_values"); + const std::vector & weight_names = + getParam>("weight_names"); + const std::vector & weight_values = getParam>("weight_values"); - auto num_weight_names = weight_names.size(); - auto num_weight_values = weight_values.size(); + auto num_weight_names = weight_names.size(); + auto num_weight_values = weight_values.size(); + if (num_weight_names) + { if (num_weight_names != num_weight_values) mooseError("Number of weight_names must be equal to number of weight_values in " "Execution/Adaptivity"); diff --git a/framework/src/auxkernels/ArrayParsedAux.C b/framework/src/auxkernels/ArrayParsedAux.C index 6e1a9945432c..5e2613c60284 100644 --- a/framework/src/auxkernels/ArrayParsedAux.C +++ b/framework/src/auxkernels/ArrayParsedAux.C @@ -30,9 +30,12 @@ ArrayParsedAux::validParams() false, "Make coordinate (x,y,z) and time (t) variables available in the function expression."); params.addParam>( - "constant_names", "Vector of constants used in the parsed function (use this for kB etc.)"); + "constant_names", + {}, + "Vector of constants used in the parsed function (use this for kB etc.)"); params.addParam>( "constant_expressions", + {}, "Vector of values for the constants in constant_names (can be an FParser expression)"); return params; @@ -84,10 +87,9 @@ ArrayParsedAux::ArrayParsedAux(const InputParameters & parameters) setParserFeatureFlags(_func_F); // add the constant expressions - if (isParamValid("constant_names") && isParamValid("constant_expressions")) - addFParserConstants(_func_F, - getParam>("constant_names"), - getParam>("constant_expressions")); + addFParserConstants(_func_F, + getParam>("constant_names"), + getParam>("constant_expressions")); // parse function if (_func_F->Parse(_function, variables) >= 0) diff --git a/framework/src/auxkernels/ParsedAux.C b/framework/src/auxkernels/ParsedAux.C index eb7e03fda5a7..911ddbd879d0 100644 --- a/framework/src/auxkernels/ParsedAux.C +++ b/framework/src/auxkernels/ParsedAux.C @@ -31,9 +31,12 @@ ParsedAux::validParams() false, "Make coordinate (x,y,z) and time (t) variables available in the function expression."); params.addParam>( - "constant_names", "Vector of constants used in the parsed function (use this for kB etc.)"); + "constant_names", + {}, + "Vector of constants used in the parsed function (use this for kB etc.)"); params.addParam>( "constant_expressions", + {}, "Vector of values for the constants in constant_names (can be an FParser expression)"); return params; @@ -67,10 +70,9 @@ ParsedAux::ParsedAux(const InputParameters & parameters) setParserFeatureFlags(_func_F); // add the constant expressions - if (isParamValid("constant_names") && isParamValid("constant_expressions")) - addFParserConstants(_func_F, - getParam>("constant_names"), - getParam>("constant_expressions")); + addFParserConstants(_func_F, + getParam>("constant_names"), + getParam>("constant_expressions")); // parse function if (_func_F->Parse(_function, variables) >= 0) diff --git a/framework/src/materials/DerivativeSumMaterial.C b/framework/src/materials/DerivativeSumMaterial.C index 659cccb53ad4..8b9b5a9b7ba2 100644 --- a/framework/src/materials/DerivativeSumMaterial.C +++ b/framework/src/materials/DerivativeSumMaterial.C @@ -59,9 +59,7 @@ DerivativeSumMaterialTempl::DerivativeSumMaterialTempl(const InputParamet mooseError("Please supply at least one material to sum in DerivativeSumMaterial ", name()); // get prefactor values if not 1.0 - std::vector p = this->isParamValid("prefactor") - ? this->template getParam>("prefactor") - : std::vector{}; + std::vector p = this->template getParam>("prefactor"); // if prefactor is used we need the same number of prefactors as sum materials if (_num_materials == p.size()) diff --git a/framework/src/materials/MaterialFunctorConverter.C b/framework/src/materials/MaterialFunctorConverter.C index 4b3df026344f..bc36c1387220 100644 --- a/framework/src/materials/MaterialFunctorConverter.C +++ b/framework/src/materials/MaterialFunctorConverter.C @@ -38,9 +38,10 @@ MaterialFunctorConverterTempl::MaterialFunctorConverterTempl(const InputParam const auto & reg_props_out = getParam>("reg_props_out"); const auto & ad_props_out = getParam>("ad_props_out"); - if (isParamSetByUser("reg_props_out") && isParamSetByUser("ad_props_out")) + if (reg_props_out.size() && ad_props_out.size()) paramError("reg_props_out", - "We dont support converting functors to both regular and AD material properties in " + "We dont support converting functors to both regular and AD " + "material properties in " "a single instance of '", type(), "'. Please create two instances, one for regular and one for AD."); diff --git a/framework/src/meshgenerators/ExtraNodesetGenerator.C b/framework/src/meshgenerators/ExtraNodesetGenerator.C index 8a1848a9bb5c..55e82b8f236c 100644 --- a/framework/src/meshgenerators/ExtraNodesetGenerator.C +++ b/framework/src/meshgenerators/ExtraNodesetGenerator.C @@ -32,6 +32,7 @@ ExtraNodesetGenerator::validParams() "supplied)."); params.addParam>>( "coord", + {}, "The nodes with coordinates you want to be in the " "nodeset. Separate multple coords with ';' (Either this parameter or \"nodes\" must be " "supplied)."); @@ -80,67 +81,65 @@ ExtraNodesetGenerator::generate() locator->enable_out_of_mesh_mode(); const auto tolerance = getParam("tolerance"); - if (_pars.isParamValid("coord")) - for (const auto & c : getParam>>("coord")) + for (const auto & c : getParam>>("coord")) + { + Point p; + if (c.size() < dim) + paramError("coord", + "Coordinate ", + Moose::stringify(c), + " does not have enough components for a ", + dim, + "D mesh."); + + if (c.size() > 3) + paramError("coord", + "Coordinate ", + Moose::stringify(c), + " has too many components. Did you maybe forget to separate multiple coordinates " + "with a ';'?"); + + for (unsigned int j = 0; j < c.size(); ++j) + p(j) = c[j]; + + // locate candidate element + bool on_node = false; + bool found_elem = false; + const Elem * elem = (*locator)(p); + if (elem) { - Point p; - if (c.size() < dim) - paramError("coord", - "Coordinate ", - Moose::stringify(c), - " does not have enough components for a ", - dim, - "D mesh."); - - if (c.size() > 3) - paramError( - "coord", - "Coordinate ", - Moose::stringify(c), - " has too many components. Did you maybe forget to separate multiple coordinates " - "with a ';'?"); - - for (unsigned int j = 0; j < c.size(); ++j) - p(j) = c[j]; - - // locate candidate element - bool on_node = false; - bool found_elem = false; - const Elem * elem = (*locator)(p); - if (elem) + found_elem = true; + for (unsigned int j = 0; j < elem->n_nodes(); ++j) { - found_elem = true; - for (unsigned int j = 0; j < elem->n_nodes(); ++j) + const Node * node = elem->node_ptr(j); + if (p.absolute_fuzzy_equals(*node, tolerance)) { - const Node * node = elem->node_ptr(j); - if (p.absolute_fuzzy_equals(*node, tolerance)) - { - for (const auto & boundary_id : boundary_ids) - boundary_info.add_node(node, boundary_id); - - on_node = true; - break; - } + for (const auto & boundary_id : boundary_ids) + boundary_info.add_node(node, boundary_id); + + on_node = true; + break; } } + } - // If we are on a distributed mesh, then any particular processor - // may be unable to find any particular node, but *some* processor - // should have found it. - if (!mesh->is_replicated()) - { - this->comm().max(found_elem); - this->comm().max(on_node); - } + // If we are on a distributed mesh, then any particular processor + // may be unable to find any particular node, but *some* processor + // should have found it. + if (!mesh->is_replicated()) + { + this->comm().max(found_elem); + this->comm().max(on_node); + } - if (!found_elem) - mooseError("Unable to locate the following point within the domain, please check its " - "coordinates:\n", - p); + if (!found_elem) + mooseError("Unable to locate the following point within the domain, please check its " + "coordinates:\n", + p); - if (!on_node) - mooseError("No node found at point:\n", p); - } + if (!on_node) + mooseError("No node found at point:\n", p); + } for (unsigned int i = 0; i < boundary_ids.size(); ++i) boundary_info.nodeset_name(boundary_ids[i]) = boundary_names[i]; diff --git a/framework/src/meshgenerators/ParsedGenerateSideset.C b/framework/src/meshgenerators/ParsedGenerateSideset.C index c94d29f5ef21..fa2e5dacba75 100644 --- a/framework/src/meshgenerators/ParsedGenerateSideset.C +++ b/framework/src/meshgenerators/ParsedGenerateSideset.C @@ -58,10 +58,11 @@ ParsedGenerateSideset::validParams() "normal", Point(), "If provided specifies the normal vector on sides that are added to the new "); - params.addParam>("constant_names", - "Vector of constants used in the parsed function"); + params.addParam>( + "constant_names", {}, "Vector of constants used in the parsed function"); params.addParam>( "constant_expressions", + {}, "Vector of values for the constants in constant_names (can be an FParser expression)"); params.addClassDescription("A MeshGenerator that adds element sides to a sideset if the " "centroid satisfies the `combinatorial_geometry` expression. " @@ -122,10 +123,9 @@ ParsedGenerateSideset::ParsedGenerateSideset(const InputParameters & parameters) setParserFeatureFlags(_func_F); // add the constant expressions - if (isParamValid("constant_names") && isParamValid("constant_expressions")) - addFParserConstants(_func_F, - getParam>("constant_names"), - getParam>("constant_expressions")); + addFParserConstants(_func_F, + getParam>("constant_names"), + getParam>("constant_expressions")); // parse function if (_func_F->Parse(_function, "x,y,z") >= 0) diff --git a/framework/src/meshgenerators/ParsedNodeTransformGenerator.C b/framework/src/meshgenerators/ParsedNodeTransformGenerator.C index 60ef89b9dae6..7797bc80925d 100644 --- a/framework/src/meshgenerators/ParsedNodeTransformGenerator.C +++ b/framework/src/meshgenerators/ParsedNodeTransformGenerator.C @@ -32,10 +32,11 @@ ParsedNodeTransformGenerator::validParams() params.addParam( _func_name[2], "z", "Function for the updated z component of the node"); - params.addParam>("constant_names", - "Vector of constants used in the parsed function"); + params.addParam>( + "constant_names", {}, "Vector of constants used in the parsed function"); params.addParam>( "constant_expressions", + {}, "Vector of values for the constants in constant_names (can be an FParser expression)"); return params; @@ -52,10 +53,9 @@ ParsedNodeTransformGenerator::ParsedNodeTransformGenerator(const InputParameters setParserFeatureFlags(_functions[i]); // add the constant expressions - if (isParamValid("constant_names") && isParamValid("constant_expressions")) - addFParserConstants(_functions[i], - getParam>("constant_names"), - getParam>("constant_expressions")); + addFParserConstants(_functions[i], + getParam>("constant_names"), + getParam>("constant_expressions")); // parse function if (_functions[i]->Parse(getParam(_func_name[i]), "x,y,z") >= 0) diff --git a/framework/src/meshgenerators/ParsedSubdomainMeshGenerator.C b/framework/src/meshgenerators/ParsedSubdomainMeshGenerator.C index ac57cc1b69a2..02dec4d9ea27 100644 --- a/framework/src/meshgenerators/ParsedSubdomainMeshGenerator.C +++ b/framework/src/meshgenerators/ParsedSubdomainMeshGenerator.C @@ -39,10 +39,11 @@ ParsedSubdomainMeshGenerator::validParams() "A set of subdomain ids that will not changed even if " "they are inside/outside the combinatorial geometry", "excluded_subdomain_ids is deprecated, use excluded_subdomains (ids or names accepted)"); - params.addParam>("constant_names", - "Vector of constants used in the parsed function"); + params.addParam>( + "constant_names", {}, "Vector of constants used in the parsed function"); params.addParam>( "constant_expressions", + {}, "Vector of values for the constants in constant_names (can be an FParser expression)"); params.addClassDescription( "Uses a parsed expression (`combinatorial_geometry`) to determine if an " @@ -69,10 +70,9 @@ ParsedSubdomainMeshGenerator::ParsedSubdomainMeshGenerator(const InputParameters setParserFeatureFlags(_func_F); // add the constant expressions - if (isParamValid("constant_names") && isParamValid("constant_expressions")) - addFParserConstants(_func_F, - getParam>("constant_names"), - getParam>("constant_expressions")); + addFParserConstants(_func_F, + getParam>("constant_names"), + getParam>("constant_expressions")); // parse function if (_func_F->Parse(_function, "x,y,z") >= 0) diff --git a/framework/src/meshgenerators/RenameBlockGenerator.C b/framework/src/meshgenerators/RenameBlockGenerator.C index 9f8d5ab4a316..a99e300a584d 100644 --- a/framework/src/meshgenerators/RenameBlockGenerator.C +++ b/framework/src/meshgenerators/RenameBlockGenerator.C @@ -99,7 +99,9 @@ RenameBlockGenerator::RenameBlockGenerator(const InputParameters & parameters) } else { - _old_block = getParam>("old_block_name"); + _old_block = isParamValid("old_block_name") + ? getParam>("old_block_name") + : std::vector{}; _old_block_param_name = "old_block_name"; } @@ -125,7 +127,9 @@ RenameBlockGenerator::RenameBlockGenerator(const InputParameters & parameters) } else { - _new_block = getParam>("new_block_name"); + _new_block = isParamValid("new_block_name") + ? getParam>("new_block_name") + : std::vector{}; new_block_param_name = "new_block_name"; } diff --git a/framework/src/nodalkernels/ADNodalKernel.C b/framework/src/nodalkernels/ADNodalKernel.C index 4225b3fba71e..c448171e3320 100644 --- a/framework/src/nodalkernels/ADNodalKernel.C +++ b/framework/src/nodalkernels/ADNodalKernel.C @@ -25,10 +25,10 @@ ADNodalKernel::validParams() ADNodalKernel::ADNodalKernel(const InputParameters & parameters) : NodalKernelBase(parameters), _u(_var.adDofValues()) { - if (isParamSetByUser("save_in")) + if (getParam>("save_in").size()) paramError("save_in", "ADNodalKernels do not support save_in. Please use the tagging system instead."); - if (isParamSetByUser("diag_save_in")) + if (getParam>("diag_save_in").size()) paramError( "diag_save_in", "ADNodalKernels do not support diag_save_in. Please use the tagging system instead."); diff --git a/framework/src/outputs/AdvancedOutput.C b/framework/src/outputs/AdvancedOutput.C index 4bc3cd13b2a0..fb7028f0d61f 100644 --- a/framework/src/outputs/AdvancedOutput.C +++ b/framework/src/outputs/AdvancedOutput.C @@ -35,11 +35,13 @@ addAdvancedOutputParams(InputParameters & params) // Hide/show variable output options params.addParam>( "hide", + {}, "A list of the variables and postprocessors that should NOT be output to the Exodus " "file (may include Variables, ScalarVariables, and Postprocessor names)."); params.addParam>( "show", + {}, "A list of the variables and postprocessors that should be output to the Exodus file " "(may include Variables, ScalarVariables, and Postprocessor names)."); @@ -161,9 +163,8 @@ AdvancedOutput::init() initAvailableLists(); // Separate the hide/show list into components - if (isParamValid("show") && isParamValid("hide")) - initShowHideLists(getParam>("show"), - getParam>("hide")); + initShowHideLists(getParam>("show"), + getParam>("hide")); // If 'elemental_as_nodal = true' the elemental variable names must be appended to the // nodal variable names. Thus, when libMesh::EquationSystem::build_solution_vector is called diff --git a/framework/src/postprocessors/FunctionValuePostprocessor.C b/framework/src/postprocessors/FunctionValuePostprocessor.C index e97f58cda744..0be35accdf35 100644 --- a/framework/src/postprocessors/FunctionValuePostprocessor.C +++ b/framework/src/postprocessors/FunctionValuePostprocessor.C @@ -27,6 +27,7 @@ FunctionValuePostprocessor::validParams() params.addParam("scale_factor", 1, "A scale factor to be applied to the function"); params.addParam>( "indirect_dependencies", + {}, "If the evaluated function depends on other postprocessors they must be listed here to " "ensure proper dependency resolution"); @@ -58,12 +59,9 @@ FunctionValuePostprocessor::FunctionValuePostprocessor(const InputParameters & p _point[j] = &getPostprocessorValue("point", j); } - if (isParamValid("indirect_dependencies")) - { - const auto & indirect_dependencies = - getParam>("indirect_dependencies"); - _depend_uo.insert(indirect_dependencies.begin(), indirect_dependencies.end()); - } + const auto & indirect_dependencies = + getParam>("indirect_dependencies"); + _depend_uo.insert(indirect_dependencies.begin(), indirect_dependencies.end()); } void diff --git a/framework/src/postprocessors/ParsedPostprocessor.C b/framework/src/postprocessors/ParsedPostprocessor.C index 07fc19bd8be0..1181a7ce3905 100644 --- a/framework/src/postprocessors/ParsedPostprocessor.C +++ b/framework/src/postprocessors/ParsedPostprocessor.C @@ -61,10 +61,9 @@ ParsedPostprocessor::ParsedPostprocessor(const InputParameters & parameters) setParserFeatureFlags(_func_F); // add the constant expressions - if (isParamValid("constant_names") && isParamValid("constant_expressions")) - addFParserConstants(_func_F, - getParam>("constant_names"), - getParam>("constant_expressions")); + addFParserConstants(_func_F, + getParam>("constant_names"), + getParam>("constant_expressions")); // parse function std::string function = getParam("function"); diff --git a/framework/src/preconditioners/FieldSplitPreconditioner.C b/framework/src/preconditioners/FieldSplitPreconditioner.C index a52a1c5d8279..d1a0dafd8475 100644 --- a/framework/src/preconditioners/FieldSplitPreconditioner.C +++ b/framework/src/preconditioners/FieldSplitPreconditioner.C @@ -58,6 +58,7 @@ FieldSplitPreconditioner::FieldSplitPreconditioner(const InputParameters & param { if (isParamValid("off_diag_row") && isParamValid("off_diag_column")) { + const auto off_diag_rows = getParam>("off_diag_row"); const auto off_diag_columns = getParam>("off_diag_column"); diff --git a/framework/src/preconditioners/FiniteDifferencePreconditioner.C b/framework/src/preconditioners/FiniteDifferencePreconditioner.C index 080cc90693f3..e636279efb5a 100644 --- a/framework/src/preconditioners/FiniteDifferencePreconditioner.C +++ b/framework/src/preconditioners/FiniteDifferencePreconditioner.C @@ -69,6 +69,7 @@ FiniteDifferencePreconditioner::FiniteDifferencePreconditioner(const InputParame // off-diagonal entries std::vector> off_diag(n_vars); if (isParamValid("off_diag_row") && isParamValid("off_diag_column")) + for (const auto i : index_range(getParam>("off_diag_row"))) { unsigned int row = diff --git a/framework/src/preconditioners/MoosePreconditioner.C b/framework/src/preconditioners/MoosePreconditioner.C index 7571e3d81590..0811823f6019 100644 --- a/framework/src/preconditioners/MoosePreconditioner.C +++ b/framework/src/preconditioners/MoosePreconditioner.C @@ -35,8 +35,8 @@ MoosePreconditioner::validParams() "associated with an off-diagonal column from the same position in off_diag_column."); params.addParam>( "off_diag_column", - "The variable names for the off-diagonal columns you want to add into the matrix; they will " - "be associated with an off-diagonal row from the same position in off_diag_row."); + "The variable names for the off-diagonal columns you want to add into the matrix; they " + "will be associated with an off-diagonal row from the same position in off_diag_row."); params.addParam("full", false, "Set to true if you want the full set of couplings between variables " diff --git a/framework/src/preconditioners/PhysicsBasedPreconditioner.C b/framework/src/preconditioners/PhysicsBasedPreconditioner.C index a9829926d3bb..3dccac1f29c8 100644 --- a/framework/src/preconditioners/PhysicsBasedPreconditioner.C +++ b/framework/src/preconditioners/PhysicsBasedPreconditioner.C @@ -127,7 +127,6 @@ PhysicsBasedPreconditioner::PhysicsBasedPreconditioner(const InputParameters & p off_diag[row].push_back(column); } } - // Add all of the preconditioning systems for (unsigned int var = 0; var < n_vars; var++) addSystem(var, off_diag[var], _pre_type[var]); diff --git a/framework/src/preconditioners/SingleMatrixPreconditioner.C b/framework/src/preconditioners/SingleMatrixPreconditioner.C index f9ba14283f0c..e561208901a6 100644 --- a/framework/src/preconditioners/SingleMatrixPreconditioner.C +++ b/framework/src/preconditioners/SingleMatrixPreconditioner.C @@ -29,6 +29,7 @@ SingleMatrixPreconditioner::validParams() params.addParam>( "coupled_groups", + {}, "List multiple space separated groups of comma separated variables. " "Off-diagonal jacobians will be generated for all pairs within a group."); params.addParam( @@ -65,29 +66,28 @@ SingleMatrixPreconditioner::SingleMatrixPreconditioner(const InputParameters & p // off-diagonal entries from the coupled_groups parameters const auto & all_vars = nl.getVariableNames(); - if (isParamValid("coupled_groups")) - for (const auto & group : getParam>("coupled_groups")) + for (const auto & group : getParam>("coupled_groups")) + { + std::vector vars; + MooseUtils::tokenize(group, vars, 1, ","); + try { - std::vector vars; - MooseUtils::tokenize(group, vars, 1, ","); - try - { - MooseUtils::expandAllMatches(all_vars, vars); - } - catch (std::invalid_argument const & e) + MooseUtils::expandAllMatches(all_vars, vars); + } + catch (std::invalid_argument const & e) + { + mooseError("No variable name match found for '", e.what(), "'."); + } + + for (const auto j : index_range(vars)) + for (unsigned int k = j + 1; k < vars.size(); ++k) { - mooseError("No variable name match found for '", e.what(), "'."); + const auto row = libmesh_system.variable_number(vars[j]); + const auto column = libmesh_system.variable_number(vars[k]); + (*cm)(row, column) = 1; + (*cm)(column, row) = 1; } - - for (const auto j : index_range(vars)) - for (unsigned int k = j + 1; k < vars.size(); ++k) - { - const auto row = libmesh_system.variable_number(vars[j]); - const auto column = libmesh_system.variable_number(vars[k]); - (*cm)(row, column) = 1; - (*cm)(column, row) = 1; - } - } + } } else { diff --git a/framework/src/preconditioners/VariableCondensationPreconditioner.C b/framework/src/preconditioners/VariableCondensationPreconditioner.C index ce933510efc3..edfbdf0fc13a 100644 --- a/framework/src/preconditioners/VariableCondensationPreconditioner.C +++ b/framework/src/preconditioners/VariableCondensationPreconditioner.C @@ -49,6 +49,7 @@ VariableCondensationPreconditioner::validParams() params.addParam>( "coupled_groups", + {}, "List multiple space separated groups of comma separated variables. " "Off-diagonal jacobians will be generated for all pairs within a group."); @@ -147,6 +148,7 @@ VariableCondensationPreconditioner::VariableCondensationPreconditioner( // off-diagonal entries from the off_diag_row and off_diag_column parameters std::vector> off_diag(_n_vars); if (isParamValid("off_diag_row") && isParamValid("off_diag_column")) + for (const auto i : index_range(getParam>("off_diag_row"))) { const unsigned int row = @@ -159,21 +161,20 @@ VariableCondensationPreconditioner::VariableCondensationPreconditioner( } // off-diagonal entries from the coupled_groups parameters - if (isParamValid("coupled_groups")) - for (const auto & coupled_group : - getParam>("coupled_groups")) - { - std::vector vars; - MooseUtils::tokenize(coupled_group, vars, 1, ","); - for (unsigned int j : index_range(vars)) - for (unsigned int k = j + 1; k < vars.size(); ++k) - { - const unsigned int row = _nl.getVariable(0, vars[j]).number(); - const unsigned int column = _nl.getVariable(0, vars[k]).number(); - (*cm)(row, column) = 1; - (*cm)(column, row) = 1; - } - } + for (const auto & coupled_group : + getParam>("coupled_groups")) + { + std::vector vars; + MooseUtils::tokenize(coupled_group, vars, 1, ","); + for (unsigned int j : index_range(vars)) + for (unsigned int k = j + 1; k < vars.size(); ++k) + { + const unsigned int row = _nl.getVariable(0, vars[j]).number(); + const unsigned int column = _nl.getVariable(0, vars[k]).number(); + (*cm)(row, column) = 1; + (*cm)(column, row) = 1; + } + } } else { diff --git a/framework/src/problems/FEProblemBase.C b/framework/src/problems/FEProblemBase.C index f67bd4463646..f1dffd54ae41 100644 --- a/framework/src/problems/FEProblemBase.C +++ b/framework/src/problems/FEProblemBase.C @@ -241,12 +241,14 @@ FEProblemBase::validParams() params.addParam>>( "extra_tag_vectors", + {}, "Extra vectors to add to the system that can be filled by objects which compute residuals " "and Jacobians (Kernels, BCs, etc.) by setting tags on them. The outer index is for which " "nonlinear system the extra tag vectors should be added for"); params.addParam>>( "extra_tag_matrices", + {}, "Extra matrices to add to the system that can be filled " "by objects which compute residuals and Jacobians " "(Kernels, BCs, etc.) by setting tags on them. The outer index is for which " @@ -254,6 +256,7 @@ FEProblemBase::validParams() params.addParam>( "extra_tag_solutions", + {}, "Extra solution vectors to add to the system that can be used by " "objects for coupling variable values stored in them."); @@ -500,41 +503,34 @@ void FEProblemBase::createTagVectors() { // add vectors and their tags to system - if (isParamValid("extra_tag_vectors")) - { - auto & vectors = getParam>>("extra_tag_vectors"); - for (const auto nl_sys_num : index_range(vectors)) - for (auto & vector : vectors[nl_sys_num]) - { - auto tag = addVectorTag(vector); - _nl[nl_sys_num]->addVector(tag, false, GHOSTED); - } - } + auto & vectors = getParam>>("extra_tag_vectors"); + for (const auto nl_sys_num : index_range(vectors)) + for (auto & vector : vectors[nl_sys_num]) + { + auto tag = addVectorTag(vector); + _nl[nl_sys_num]->addVector(tag, false, GHOSTED); + } // add matrices and their tags - if (isParamValid("extra_tag_matrices")) - { - auto & matrices = getParam>>("extra_tag_matrices"); - for (const auto nl_sys_num : index_range(matrices)) - for (auto & matrix : matrices[nl_sys_num]) - { - auto tag = addMatrixTag(matrix); - _nl[nl_sys_num]->addMatrix(tag); - } - } + auto & matrices = getParam>>("extra_tag_matrices"); + for (const auto nl_sys_num : index_range(matrices)) + for (auto & matrix : matrices[nl_sys_num]) + { + auto tag = addMatrixTag(matrix); + _nl[nl_sys_num]->addMatrix(tag); + } } void FEProblemBase::createTagSolutions() { - if (isParamValid("extra_tag_solutions")) - for (auto & vector : getParam>("extra_tag_solutions")) - { - auto tag = addVectorTag(vector, Moose::VECTOR_TAG_SOLUTION); - for (auto & nl : _nl) - nl->addVector(tag, false, GHOSTED); - _aux->addVector(tag, false, GHOSTED); - } + for (auto & vector : getParam>("extra_tag_solutions")) + { + auto tag = addVectorTag(vector, Moose::VECTOR_TAG_SOLUTION); + for (auto & nl : _nl) + nl->addVector(tag, false, GHOSTED); + _aux->addVector(tag, false, GHOSTED); + } if (getParam("previous_nl_solution_required")) { diff --git a/framework/src/scalarkernels/ParsedODEKernel.C b/framework/src/scalarkernels/ParsedODEKernel.C index 4236a292e378..6d40c507bb5b 100644 --- a/framework/src/scalarkernels/ParsedODEKernel.C +++ b/framework/src/scalarkernels/ParsedODEKernel.C @@ -30,13 +30,14 @@ ParsedODEKernel::validParams() params.deprecateParam("function", "expression", "02/07/2024"); params.addCoupledVar("args", "Scalar variables coupled in the parsed expression."); params.deprecateCoupledVar("args", "coupled_variables", "02/07/2024"); - params.addParam>("constant_names", - "Vector of constants used in the parsed expression"); + params.addParam>( + "constant_names", {}, "Vector of constants used in the parsed expression"); params.addParam>( "constant_expressions", + {}, "Vector of values for the constants in constant_names (can be an FParser expression)"); params.addParam>( - "postprocessors", "Vector of postprocessor names used in the function expression"); + "postprocessors", {}, "Vector of postprocessor names used in the function expression"); return params; } @@ -69,15 +70,12 @@ ParsedODEKernel::ParsedODEKernel(const InputParameters & parameters) } // add postprocessors - if (isParamValid("postprocessors")) + auto pp_names = getParam>("postprocessors"); + _pp.resize(pp_names.size()); + for (unsigned int i = 0; i < pp_names.size(); ++i) { - auto pp_names = getParam>("postprocessors"); - _pp.resize(pp_names.size()); - for (unsigned int i = 0; i < pp_names.size(); ++i) - { - variables += "," + pp_names[i]; - _pp[i] = &getPostprocessorValueByName(pp_names[i]); - } + variables += "," + pp_names[i]; + _pp[i] = &getPostprocessorValueByName(pp_names[i]); } // base function object @@ -87,10 +85,9 @@ ParsedODEKernel::ParsedODEKernel(const InputParameters & parameters) setParserFeatureFlags(_func_F); // add the constant expressions - if (isParamValid("constant_names") && isParamValid("constant_expressions")) - addFParserConstants(_func_F, - getParam>("constant_names"), - getParam>("constant_expressions")); + addFParserConstants(_func_F, + getParam>("constant_names"), + getParam>("constant_expressions")); // parse function if (_func_F->Parse(_function, variables) >= 0) diff --git a/framework/src/timesteppers/FunctionDT.C b/framework/src/timesteppers/FunctionDT.C index 3367e7ea8c6b..f95001e54615 100644 --- a/framework/src/timesteppers/FunctionDT.C +++ b/framework/src/timesteppers/FunctionDT.C @@ -49,7 +49,7 @@ FunctionDT::FunctionDT(const InputParameters & parameters) _interpolate(getParam("interpolate")) { // TODO: remove this when `time_t` and `time_dt` is removed - if ((isParamSetByUser("time_t") && isParamSetByUser("time_dt")) && !isParamValid("function")) + if ((_time_t.size() && _time_dt.size()) && !isParamValid("function")) mooseDeprecated(name(), ": Using `time_t` and `time_dt` parameter is deprecated. Switch your input " "file to using `function` parameter.\n", @@ -59,7 +59,7 @@ FunctionDT::FunctionDT(const InputParameters & parameters) " 3. Copy `time_dt` parameter into your function and rename it to `y`.\n", " 4. Use the `function` parameter in your time stepper and pass your new " "function name into it.\n"); - else if ((isParamSetByUser("time_t") && isParamSetByUser("time_dt")) && isParamValid("function")) + else if ((_time_t.size() && _time_dt.size()) && isParamValid("function")) mooseError(name(), ": Using `time_t`, `_time_dt` and `function` at the same time. Use only `function`, " "`time_t` and _time_dt is deprecated."); @@ -68,7 +68,7 @@ FunctionDT::FunctionDT(const InputParameters & parameters) ": Please, specify a function (using the `function` parameter) that will prescribe " "the time step size."); - if (isParamSetByUser("time_t") && isParamSetByUser("time_dt")) + if (_time_t.size() && _time_dt.size()) { try { diff --git a/framework/src/transfers/MultiAppConservativeTransfer.C b/framework/src/transfers/MultiAppConservativeTransfer.C index c69bbd2d8ff1..e7b04683fac8 100644 --- a/framework/src/transfers/MultiAppConservativeTransfer.C +++ b/framework/src/transfers/MultiAppConservativeTransfer.C @@ -28,7 +28,6 @@ MultiAppConservativeTransfer::validParams() params.addParam>( "from_postprocessors_to_be_preserved", - {}, "The name of the Postprocessor in the from-app to evaluate an adjusting factor."); params.addParam>( @@ -51,9 +50,11 @@ MultiAppConservativeTransfer::MultiAppConservativeTransfer(const InputParameters : MultiAppFieldTransfer(parameters), _from_var_names(getParam>("source_variable")), _to_var_names(getParam>("variable")), - _preserve_transfer(isParamSetByUser("from_postprocessors_to_be_preserved")), + _preserve_transfer(isParamValid("from_postprocessors_to_be_preserved")), _from_postprocessors_to_be_preserved( - getParam>("from_postprocessors_to_be_preserved")), + _preserve_transfer + ? getParam>("from_postprocessors_to_be_preserved") + : std::vector{}), _to_postprocessors_to_be_preserved( getParam>("to_postprocessors_to_be_preserved")), _use_nearestpoint_pps(false), diff --git a/framework/src/transfers/MultiAppDofCopyTransfer.C b/framework/src/transfers/MultiAppDofCopyTransfer.C index d08bfadab8ea..0ab5437cefe8 100644 --- a/framework/src/transfers/MultiAppDofCopyTransfer.C +++ b/framework/src/transfers/MultiAppDofCopyTransfer.C @@ -31,9 +31,12 @@ MultiAppDofCopyTransfer::validParams() // Block restrictions params.addParam>( "from_blocks", + {}, "Subdomain restriction to transfer from (defaults to all the origin app domain)"); params.addParam>( - "to_blocks", "Subdomain restriction to transfer to, (defaults to all the target app domain)"); + "to_blocks", + {}, + "Subdomain restriction to transfer to, (defaults to all the target app domain)"); params.addClassDescription( "Base class for copying degrees-of-freedom values (nonlinear and auxiliary) between apps " @@ -43,7 +46,8 @@ MultiAppDofCopyTransfer::validParams() MultiAppDofCopyTransfer::MultiAppDofCopyTransfer(const InputParameters & parameters) : MultiAppFieldTransfer(parameters), - _has_block_restrictions(isParamValid("from_blocks") || isParamValid("to_blocks")) + _has_block_restrictions(!getParam>("from_blocks").empty() || + !getParam>("to_blocks").empty()) { } @@ -75,14 +79,14 @@ MultiAppDofCopyTransfer::initialSetup() // Convert block names to block IDs, fill with all blocks if unspecified if (_has_block_restrictions) { - if (isParamValid("from_blocks")) - { - const auto & from_block_names = getParam>("from_blocks"); - for (const auto & b : from_block_names) - if (!MooseMeshUtils::hasSubdomainName( - const_cast(from_problem->mesh().getMesh()), b)) - paramError("from_blocks", "The block '", b, "' was not found in the mesh"); + const auto & from_block_names = getParam>("from_blocks"); + for (const auto & b : from_block_names) + if (!MooseMeshUtils::hasSubdomainName(const_cast(from_problem->mesh().getMesh()), + b)) + paramError("from_blocks", "The block '", b, "' was not found in the mesh"); + if (from_block_names.size()) + { if (from_problem) { const auto block_vec = from_problem->mesh().getSubdomainIDs(from_block_names); @@ -95,14 +99,14 @@ MultiAppDofCopyTransfer::initialSetup() else _from_blocks = from_problem->mesh().meshSubdomains(); - if (isParamValid("to_blocks")) - { - const auto & to_block_names = getParam>("to_blocks"); - for (const auto & b : to_block_names) - if (!MooseMeshUtils::hasSubdomainName(const_cast(to_problem->mesh().getMesh()), - b)) - paramError("to_blocks", "The block '", b, "' was not found in the mesh"); + const auto & to_block_names = getParam>("to_blocks"); + for (const auto & b : to_block_names) + if (!MooseMeshUtils::hasSubdomainName(const_cast(to_problem->mesh().getMesh()), + b)) + paramError("to_blocks", "The block '", b, "' was not found in the mesh"); + if (to_block_names.size()) + { if (to_problem) { const auto block_vec = to_problem->mesh().getSubdomainIDs(to_block_names); diff --git a/modules/chemical_reactions/src/actions/ChemicalCompositionAction.C b/modules/chemical_reactions/src/actions/ChemicalCompositionAction.C index 3c76a6541a58..f3ca7a6a9753 100644 --- a/modules/chemical_reactions/src/actions/ChemicalCompositionAction.C +++ b/modules/chemical_reactions/src/actions/ChemicalCompositionAction.C @@ -351,7 +351,7 @@ ChemicalCompositionAction::ChemicalCompositionAction(const InputParameters & par } } - if (_pars.isParamSetByUser("output_element_phases")) + if (_element_phases.size()) { auto phases = Thermochimica::getPhaseNamesSystem(); if (_element_phases.size() == 1 && _element_phases[0] == "ALL") @@ -490,7 +490,7 @@ ChemicalCompositionAction::act() _vapor_pressures.begin(), _vapor_pressures.end()); - if (_pars.isParamSetByUser("output_element_phases")) + if (_element_phases.size()) uo_params.set>("output_element_phases") .insert(uo_params.set>("output_element_phases").end(), _element_phases.begin(), diff --git a/modules/porous_flow/src/actions/PorousFlowSinglePhaseBase.C b/modules/porous_flow/src/actions/PorousFlowSinglePhaseBase.C index b9437d683733..a3cd9ae3bf3f 100644 --- a/modules/porous_flow/src/actions/PorousFlowSinglePhaseBase.C +++ b/modules/porous_flow/src/actions/PorousFlowSinglePhaseBase.C @@ -163,8 +163,8 @@ PorousFlowSinglePhaseBase::PorousFlowSinglePhaseBase(const InputParameters & par _nacl_name = getParam("nacl_name"); } - if (params.isParamSetByUser("save_component_rate_in") && - _save_component_rate_in.size() != _num_mass_fraction_vars + 1) + auto save_component_rate_in_size = _save_component_rate_in.size(); + if (save_component_rate_in_size && save_component_rate_in_size != _num_mass_fraction_vars + 1) paramError("save_component_rate_in", "The number of save_component_rate_in variables must be the number of fluid " "components + 1"); diff --git a/modules/tensor_mechanics/src/userobjects/CrackFrontDefinition.C b/modules/tensor_mechanics/src/userobjects/CrackFrontDefinition.C index e4a8e0f2816c..5ac31c304bbb 100644 --- a/modules/tensor_mechanics/src/userobjects/CrackFrontDefinition.C +++ b/modules/tensor_mechanics/src/userobjects/CrackFrontDefinition.C @@ -129,9 +129,11 @@ CrackFrontDefinition::CrackFrontDefinition(const InputParameters & parameters) _q_function_type(getParam("q_function_type")), _crack_front_points_provider(nullptr) { + auto boundary = isParamValid("boundary") ? getParam>("boundary") + : std::vector{}; if (isParamValid("crack_front_points")) { - if (isParamSetByUser("boundary")) + if (boundary.size()) paramError("crack_front_points", "CrackFrontDefinition error: since boundary is defined, crack_front_points should " "not be added."); @@ -148,7 +150,7 @@ CrackFrontDefinition::CrackFrontDefinition(const InputParameters & parameters) } else if (isParamValid("crack_front_points_provider")) { - if (isParamSetByUser("boundary")) + if (boundary.size()) paramError("crack_front_points_provider", "CrackFrontDefinition error: since boundary is defined, " "crack_front_points_provider should not be added."); @@ -164,7 +166,7 @@ CrackFrontDefinition::CrackFrontDefinition(const InputParameters & parameters) paramError("number_points_from_provider", "CrackFrontDefinition error: number_points_from_provider is provided but " "crack_front_points_provider cannot be found."); - else if (isParamValid("boundary")) + else if (boundary.size()) { _geom_definition_method = CRACK_GEOM_DEFINITION::CRACK_FRONT_NODES; if (parameters.isParamSetByUser("closed_loop")) diff --git a/modules/thermal_hydraulics/src/components/Component2D.C b/modules/thermal_hydraulics/src/components/Component2D.C index f04f05228db7..12eda8391ae8 100644 --- a/modules/thermal_hydraulics/src/components/Component2D.C +++ b/modules/thermal_hydraulics/src/components/Component2D.C @@ -48,7 +48,7 @@ Component2D::check() const { GeneratedMeshComponent::check(); - if (isParamSetByUser("axial_region_names")) + if (getParam>("axial_region_names").size()) checkEqualSize("axial_region_names", "length"); else if (_n_sections > 1) logError("If there is more than 1 axial region, then the parameter 'axial_region_names' must " diff --git a/modules/thermal_hydraulics/src/components/HeatStructureBase.C b/modules/thermal_hydraulics/src/components/HeatStructureBase.C index 5326536a4e65..686757cb83da 100644 --- a/modules/thermal_hydraulics/src/components/HeatStructureBase.C +++ b/modules/thermal_hydraulics/src/components/HeatStructureBase.C @@ -63,7 +63,7 @@ HeatStructureBase::addMooseObjects() { HeatStructureInterface::addMooseObjects(); - if (isParamSetByUser("materials")) + if (isParamValid("materials")) { _hc_model->addMaterials(); diff --git a/modules/thermal_hydraulics/src/components/HeatStructureCylindrical.C b/modules/thermal_hydraulics/src/components/HeatStructureCylindrical.C index f943c72c6010..4744346f8e17 100644 --- a/modules/thermal_hydraulics/src/components/HeatStructureCylindrical.C +++ b/modules/thermal_hydraulics/src/components/HeatStructureCylindrical.C @@ -20,8 +20,7 @@ HeatStructureCylindrical::validParams() params.addRequiredParam>("widths", "Width of each radial region [m]"); params.addRequiredParam>("n_part_elems", "Number of elements of each radial region"); - params.addParam>( - "materials", {}, "Material name for each radial region"); + params.addParam>("materials", "Material name for each radial region"); params.addParam("num_rods", 1.0, "Number of rods represented by this heat structure"); params.addParam("inner_radius", 0., "Inner radius of the heat structure [m]"); @@ -38,7 +37,8 @@ HeatStructureCylindrical::HeatStructureCylindrical(const InputParameters & param for (unsigned int i = 0; i < _names.size(); i++) _name_index[_names[i]] = i; - _material_names = getParam>("materials"); + _material_names = isParamValid("materials") ? getParam>("materials") + : std::vector{}; _width = getParam>("widths"); _total_width = std::accumulate(_width.begin(), _width.end(), 0.0); @@ -69,6 +69,6 @@ HeatStructureCylindrical::check() const checkEqualSize("names", "n_part_elems"); checkEqualSize("names", "widths"); - if (isParamSetByUser("materials")) + if (isParamValid("materials")) checkEqualSize("names", "materials"); } diff --git a/modules/thermal_hydraulics/src/components/HeatStructurePlate.C b/modules/thermal_hydraulics/src/components/HeatStructurePlate.C index 498e32d1742f..314ed2b52660 100644 --- a/modules/thermal_hydraulics/src/components/HeatStructurePlate.C +++ b/modules/thermal_hydraulics/src/components/HeatStructurePlate.C @@ -20,8 +20,8 @@ HeatStructurePlate::validParams() params.addRequiredParam>("widths", "Width of each transverse region [m]"); params.addRequiredParam>( "n_part_elems", "Number of elements of each transverse region"); - params.addParam>( - "materials", {}, "Material name for each transverse region"); + params.addParam>("materials", + "Material name for each transverse region"); params.addParam("num_rods", 1.0, "Number of rods represented by this heat structure"); params.addRequiredParam("depth", "Dimension of plate fuel in the third direction [m]"); @@ -38,7 +38,8 @@ HeatStructurePlate::HeatStructurePlate(const InputParameters & params) for (unsigned int i = 0; i < _names.size(); i++) _name_index[_names[i]] = i; - _material_names = getParam>("materials"); + _material_names = isParamValid("materials") ? getParam>("materials") + : std::vector{}; _width = getParam>("widths"); _total_width = std::accumulate(_width.begin(), _width.end(), 0.0); @@ -63,7 +64,7 @@ HeatStructurePlate::check() const checkEqualSize("names", "n_part_elems"); checkEqualSize("names", "widths"); - if (isParamSetByUser("materials")) + if (isParamValid("materials")) checkEqualSize("names", "materials"); } diff --git a/test/tests/meshgenerators/rename_block_generator/tests b/test/tests/meshgenerators/rename_block_generator/tests index 738b92e26d5d..0423dcbb7cd7 100644 --- a/test/tests/meshgenerators/rename_block_generator/tests +++ b/test/tests/meshgenerators/rename_block_generator/tests @@ -96,4 +96,90 @@ detail = 'and when the provided old and new blocks are not the same length.' [] [] + +[deprecated] + requirement = 'The system shall be able to rename or renumber mesh blocks using old syntax by' + + [id] + type = JSONDiff + input = 'rename_block.i' + cli_args = '--allow-warnings + Mesh/rename/old_block_id="0 1 3 2" + Mesh/rename/new_block_id="1 2 4 3" + Outputs/file_base=deprecated_id' + jsondiff = 'deprecated_id.json' + + detail = 'identifying blocks by ID' + [] + [name] + type = JSONDiff + input = 'rename_block.i' + cli_args = '--allow-warnings + Mesh/rename/old_block_name="block0 block1" + Mesh/rename/new_block_name="foo bar" + Outputs/file_base=deprecated_name' + jsondiff = 'deprecated_name.json' + + detail = 'identifying blocks by name' + [] +[] + +[deprecated_errors] + requirement = 'The system shall report a reasonable error when renaming or renumbering blocks using deprecated syntax when' + + [old_block_id_and_name] + type = RunException + input = 'rename_block.i' + cli_args = 'Mesh/rename/old_block_id=0 + Mesh/rename/old_block_name=dummy' + expect_err = "old_block_id\):.*Cannot use in combination with 'old_block_name'. Please use 'old_block' instead; 'old_block_id' and 'old_block_name' are deprecated." + + detail = 'both old block IDs and old block names are provided' + [] + [new_block_id_and_name] + type = RunException + input = 'rename_block.i' + cli_args = 'Mesh/rename/new_block_id=0 + Mesh/rename/new_block_name=dummy' + expect_err = "new_block_id\):.*Cannot use in combination with 'new_block_name'. Please use 'new_block' instead; 'new_block_id' and 'new_block_name' are deprecated." + + detail = 'both new block IDs and new block names are provided' + [] + [old_block_and_id] + type = RunException + input = 'rename_block.i' + cli_args = 'Mesh/rename/old_block=0 + Mesh/rename/old_block_id=0' + expect_err = "old_block_id\):.*Cannot use with 'old_block'. Use only 'old_block'; 'old_block_id' is deprecated." + + detail = 'the deprecated syntax for old block id and the new syntax for old block is used' + [] + [old_block_and_name] + type = RunException + input = 'rename_block.i' + cli_args = 'Mesh/rename/old_block=0 + Mesh/rename/old_block_name=dummy' + expect_err = "old_block_name\):.*Cannot use with 'old_block'. Use only 'old_block'; 'old_block_name' is deprecated." + + detail = 'the deprecated syntax for old block name and the new syntax for old block is used' + [] + [new_block_and_id] + type = RunException + input = 'rename_block.i' + cli_args = 'Mesh/rename/new_block=0 + Mesh/rename/new_block_id=0' + expect_err = "new_block_id\):.*Cannot use with 'new_block'. Use only 'new_block'; 'new_block_id' is deprecated." + + detail = 'the deprecated syntax for new block id and the new syntax for new block is used' + [] + [new_block_and_name] + type = RunException + input = 'rename_block.i' + cli_args = 'Mesh/rename/new_block=0 + Mesh/rename/new_block_name=dummy' + expect_err = "new_block_name\):.*Cannot use with 'new_block'. Use only 'new_block'; 'new_block_name' is deprecated." + + detail = 'the deprecated syntax for new block name and the new syntax for new block is used' + [] +[] []