From 3eeea5854a9c23a7c8bdfc16dfcb018182b7d57b Mon Sep 17 00:00:00 2001 From: Derek Gaston Date: Wed, 9 Mar 2022 17:03:50 -0700 Subject: [PATCH 01/71] Invert loops in UserObjectTransfer. All existing tests pass refs #19056 --- framework/include/multiapps/MultiApp.h | 2 +- .../transfers/MultiAppUserObjectTransfer.h | 10 + .../transfers/MultiAppUserObjectTransfer.C | 220 +++++++++++------- 3 files changed, 148 insertions(+), 84 deletions(-) diff --git a/framework/include/multiapps/MultiApp.h b/framework/include/multiapps/MultiApp.h index 1199155390dc..0e10999c84b0 100644 --- a/framework/include/multiapps/MultiApp.h +++ b/framework/include/multiapps/MultiApp.h @@ -292,7 +292,7 @@ class MultiApp : public MooseObject, * @param app The global app number you want the position for. * @return the position */ - Point position(unsigned int app) { return _positions[app]; } + const Point & position(unsigned int app) { return _positions[app]; } /** * "Reset" the App corresponding to the global App number diff --git a/framework/include/transfers/MultiAppUserObjectTransfer.h b/framework/include/transfers/MultiAppUserObjectTransfer.h index 0ca9978952ba..62e4050c3544 100644 --- a/framework/include/transfers/MultiAppUserObjectTransfer.h +++ b/framework/include/transfers/MultiAppUserObjectTransfer.h @@ -78,6 +78,13 @@ class MultiAppUserObjectTransfer : public MultiAppConservativeTransfer */ bool isBoundaryElem(const MooseMesh * mesh, const Elem * elem) const; + /** + * Get's the userobject to transfer from when transferring from_multiapp + * @param p The point in the parent app that is being transferred to + * @return will return static_cast(-1) if none is found + */ + unsigned int findSubAppToTransferFrom(const Point & p); + std::string _user_object_name; /** @@ -89,6 +96,9 @@ class MultiAppUserObjectTransfer : public MultiAppConservativeTransfer /// whether to check the bounding box check or not const bool _skip_bbox_check; + /// Whether to utilize the nearest sub-app to transfer from + const bool & _nearest_sub_app; + private: /// Set of block ids this transfer is restricted to std::set _blk_ids; diff --git a/framework/src/transfers/MultiAppUserObjectTransfer.C b/framework/src/transfers/MultiAppUserObjectTransfer.C index 2a12603c21af..7d39d00dbe3b 100644 --- a/framework/src/transfers/MultiAppUserObjectTransfer.C +++ b/framework/src/transfers/MultiAppUserObjectTransfer.C @@ -60,6 +60,11 @@ MultiAppUserObjectTransfer::validParams() "Samples a variable's value in the Master domain at the point where the MultiApp is and " "copies that value into a post-processor in the MultiApp"); + params.addParam("nearest_sub_app", + false, + "When True, a from_multiapp transfer will work by finding the nearest " + "(using the `location`) sub-app and query that for the value to transfer"); + return params; } @@ -67,7 +72,8 @@ MultiAppUserObjectTransfer::MultiAppUserObjectTransfer(const InputParameters & p : MultiAppConservativeTransfer(parameters), _user_object_name(getParam("user_object")), _all_master_nodes_contained_in_sub_app(getParam("all_master_nodes_contained_in_sub_app")), - _skip_bbox_check(getParam("skip_bounding_box_check")) + _skip_bbox_check(getParam("skip_bounding_box_check")), + _nearest_sub_app(getParam("nearest_sub_app")) { // This transfer does not work with DistributedMesh _fe_problem.mesh().errorIfDistributedMesh("MultiAppUserObjectTransfer"); @@ -389,109 +395,108 @@ MultiAppUserObjectTransfer::execute() } } - for (unsigned int i = 0; i < _multi_app->numGlobalApps(); i++) + if (is_nodal) { - if (!_multi_app->hasLocalApp(i)) - continue; + for (auto & node : to_mesh->getMesh().node_ptr_range()) + { + if (blockRestricted() && !hasBlocks(to_mesh, node)) + continue; - Point app_position = _multi_app->position(i); - BoundingBox app_box = _multi_app->getBoundingBox(i, _displaced_source_mesh); - const UserObject & user_object = _multi_app->appUserObjectBase(i, _user_object_name); + if (boundaryRestricted() && !isBoundaryNode(to_mesh, node)) + continue; - if (is_nodal) - { - for (auto & node : to_mesh->getMesh().node_ptr_range()) + if (node->n_dofs(to_sys_num, to_var_num) > 0) // If this variable has dofs at this node { - if (blockRestricted() && !hasBlocks(to_mesh, node)) - continue; + const auto sub_app = findSubAppToTransferFrom(*node); - if (boundaryRestricted() && !isBoundaryNode(to_mesh, node)) + // Check to see if a sub-app was found + if (sub_app == static_cast(-1)) continue; - if (node->n_dofs(to_sys_num, to_var_num) > 0) // If this variable has dofs at this node + const auto & app_position = _multi_app->position(sub_app); + const auto & user_object = _multi_app->appUserObjectBase(sub_app, _user_object_name); + + dof_id_type dof = node->dof_number(to_sys_num, to_var_num, 0); + + Real from_value = 0; { - // See if this node falls in this bounding box - if (_skip_bbox_check || app_box.contains_point(*node)) - { - dof_id_type dof = node->dof_number(to_sys_num, to_var_num, 0); - - Real from_value = 0; - { - Moose::ScopedCommSwapper swapper(_multi_app->comm()); - from_value = user_object.spatialValue(*node - app_position); - } - - if (from_value == std::numeric_limits::infinity()) - { - Point n = *node; - mooseError("MultiAppUserObjectTransfer: Point corresponding to master node at (", - n, - ") not found in the sub application."); - } - to_solution->set(dof, from_value); - } + Moose::ScopedCommSwapper swapper(_multi_app->comm()); + from_value = user_object.spatialValue(*node - app_position); } + + if (from_value == std::numeric_limits::infinity()) + { + Point n = *node; + mooseError("MultiAppUserObjectTransfer: Point corresponding to master node at (", + n, + ") not found in the sub application."); + } + to_solution->set(dof, from_value); } } - else // Elemental + } + else // Elemental + { + std::vector points; + for (auto & elem : + as_range(to_mesh->getMesh().elements_begin(), to_mesh->getMesh().elements_end())) { - std::vector points; - for (auto & elem : - as_range(to_mesh->getMesh().elements_begin(), to_mesh->getMesh().elements_end())) + if (blockRestricted() && !hasBlocks(elem)) + continue; + + if (boundaryRestricted() && !isBoundaryElem(to_mesh, elem)) + continue; + + // Skip this element if the variable has no dofs at it. + if (elem->n_dofs(to_sys_num, to_var_num) < 1) + continue; + + points.clear(); + // grap sample points + // for constant shape function, we take the element centroid + if (is_constant) + points.push_back(elem->vertex_average()); + // for higher order method, we take all nodes of element + // this works for the first order L2 Lagrange. + else + for (auto & node : elem->node_ref_range()) + points.push_back(node); + + auto n_points = points.size(); + unsigned int n_comp = elem->n_comp(to_sys_num, to_var_num); + // We assume each point corresponds to one component of elemental variable + if (n_points != n_comp) + mooseError(" Number of points ", + n_points, + " does not equal to number of variable components ", + n_comp); + + unsigned int offset = 0; + for (auto & point : points) // If this variable has dofs at this elem { - if (blockRestricted() && !hasBlocks(elem)) - continue; + const auto sub_app = findSubAppToTransferFrom(point); - if (boundaryRestricted() && !isBoundaryElem(to_mesh, elem)) + // Check to see if a sub-app was found + if (sub_app == static_cast(-1)) continue; - // Skip this element if the variable has no dofs at it. - if (elem->n_dofs(to_sys_num, to_var_num) < 1) - continue; + const auto & app_position = _multi_app->position(sub_app); + const auto & user_object = _multi_app->appUserObjectBase(sub_app, _user_object_name); - points.clear(); - // grap sample points - // for constant shape function, we take the element centroid - if (is_constant) - points.push_back(elem->vertex_average()); - // for higher order method, we take all nodes of element - // this works for the first order L2 Lagrange. - else - for (auto & node : elem->node_ref_range()) - points.push_back(node); - - auto n_points = points.size(); - unsigned int n_comp = elem->n_comp(to_sys_num, to_var_num); - // We assume each point corresponds to one component of elemental variable - if (n_points != n_comp) - mooseError(" Number of points ", - n_points, - " does not equal to number of variable components ", - n_comp); + dof_id_type dof = elem->dof_number(to_sys_num, to_var_num, offset++); - unsigned int offset = 0; - for (auto & point : points) // If this variable has dofs at this elem + Real from_value = 0; { - // See if this elem falls in this bounding box - if (_skip_bbox_check || app_box.contains_point(point)) - { - dof_id_type dof = elem->dof_number(to_sys_num, to_var_num, offset++); - - Real from_value = 0; - { - Moose::ScopedCommSwapper swapper(_multi_app->comm()); - from_value = user_object.spatialValue(point - app_position); - } + Moose::ScopedCommSwapper swapper(_multi_app->comm()); + from_value = user_object.spatialValue(point - app_position); + } - if (from_value == std::numeric_limits::infinity()) - mooseError( - "MultiAppUserObjectTransfer: Point corresponding to element's centroid (", - point, - ") not found in sub application."); + if (from_value == std::numeric_limits::infinity()) + mooseError("MultiAppUserObjectTransfer: Point corresponding to element's centroid (", + point, + ") not found in sub application."); - to_solution->set(dof, from_value); - } - } + to_solution->set(dof, from_value); } } } @@ -556,3 +561,52 @@ MultiAppUserObjectTransfer::isBoundaryElem(const MooseMesh * mesh, const Elem * return true; return false; } + +unsigned int +MultiAppUserObjectTransfer::findSubAppToTransferFrom(const Point & p) +{ + // Just find the nearest app to this point + if (_nearest_sub_app) + { + unsigned int closest_app = 0; + Real closest_distance = std::numeric_limits::max(); + + mooseAssert(_multi_app->numGlobalApps() > 0, "No Multiapps To Transfer From"); + + for (unsigned int i = 0; _multi_app->numGlobalApps(); i++) + { + if (!_multi_app->hasLocalApp(i)) + continue; + + auto & app_position = _multi_app->position(i); + + auto distance = (p - app_position).norm(); + + if (distance < closest_distance) + { + closest_app = i; + closest_distance = distance; + } + } + + return closest_app; + } + + // Find the app that contains this point... + + // This loop counts _down_ so that it can preserve legacy behavior of the + // last sub-app "winning" to be able to set the value at this point + for (int i = _multi_app->numGlobalApps(); i >= 0; i--) + { + if (!_multi_app->hasLocalApp(i)) + continue; + + Point app_position = _multi_app->position(i); + BoundingBox app_box = _multi_app->getBoundingBox(i, _displaced_source_mesh); + + if (_skip_bbox_check || app_box.contains_point(p)) + return static_cast(i); + } + + return -1; +} From 20dae92b061487e8633f44ecd58e3d96936bce86 Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Mon, 7 Mar 2022 17:30:11 -0800 Subject: [PATCH 02/71] Add a check reset_ parameters for MultiApps Closes #20540 Fixup the fix for reset parameter --- framework/doc/content/source/kernels/ADMaterial.md | 1 - framework/src/multiapps/MultiApp.C | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) delete mode 100644 framework/doc/content/source/kernels/ADMaterial.md diff --git a/framework/doc/content/source/kernels/ADMaterial.md b/framework/doc/content/source/kernels/ADMaterial.md deleted file mode 100644 index 12b0df48a8fd..000000000000 --- a/framework/doc/content/source/kernels/ADMaterial.md +++ /dev/null @@ -1 +0,0 @@ -# ADMaterial diff --git a/framework/src/multiapps/MultiApp.C b/framework/src/multiapps/MultiApp.C index f0c2100eba75..03064e623c97 100644 --- a/framework/src/multiapps/MultiApp.C +++ b/framework/src/multiapps/MultiApp.C @@ -246,6 +246,10 @@ MultiApp::MultiApp(const InputParameters & parameters) parameters.isParamValid("cli_args_files")) paramError("cli_args", "'cli_args' and 'cli_args_files' cannot be specified simultaneously in MultiApp "); + + if ((_reset_apps.size() > 0 && _reset_time == std::numeric_limits::max()) || + (_reset_apps.size() == 0 && _reset_time < std::numeric_limits::max())) + mooseError("reset_time and reset_apps may only be specified together"); } void From cc7b285c116474aa1eca30271965e49d66e81faf Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Mon, 7 Mar 2022 18:10:33 -0800 Subject: [PATCH 03/71] Remove empty source files, which are only used to force compiling of headers --- framework/src/auxkernels/MaterialAuxBase.C | 11 ----------- framework/src/auxkernels/MaterialStdVectorAuxBase.C | 11 ----------- framework/src/loops/ThreadedNodeLoop.C | 10 ---------- framework/src/utils/PerfGuard.C | 10 ---------- .../vectorpostprocessors/LineMaterialSamplerBase.C | 10 ---------- 5 files changed, 52 deletions(-) delete mode 100644 framework/src/auxkernels/MaterialAuxBase.C delete mode 100644 framework/src/auxkernels/MaterialStdVectorAuxBase.C delete mode 100644 framework/src/loops/ThreadedNodeLoop.C delete mode 100644 framework/src/utils/PerfGuard.C delete mode 100644 framework/src/vectorpostprocessors/LineMaterialSamplerBase.C diff --git a/framework/src/auxkernels/MaterialAuxBase.C b/framework/src/auxkernels/MaterialAuxBase.C deleted file mode 100644 index f13685e3a8b5..000000000000 --- a/framework/src/auxkernels/MaterialAuxBase.C +++ /dev/null @@ -1,11 +0,0 @@ -//* This file is part of the MOOSE framework -//* https://www.mooseframework.org -//* -//* All rights reserved, see COPYRIGHT for full restrictions -//* https://github.com/idaholab/moose/blob/master/COPYRIGHT -//* -//* Licensed under LGPL 2.1, please see LICENSE for details -//* https://www.gnu.org/licenses/lgpl-2.1.html - -// MOOSE includes -#include "MaterialAuxBase.h" diff --git a/framework/src/auxkernels/MaterialStdVectorAuxBase.C b/framework/src/auxkernels/MaterialStdVectorAuxBase.C deleted file mode 100644 index a34bcfeaf5be..000000000000 --- a/framework/src/auxkernels/MaterialStdVectorAuxBase.C +++ /dev/null @@ -1,11 +0,0 @@ -//* This file is part of the MOOSE framework -//* https://www.mooseframework.org -//* -//* All rights reserved, see COPYRIGHT for full restrictions -//* https://github.com/idaholab/moose/blob/master/COPYRIGHT -//* -//* Licensed under LGPL 2.1, please see LICENSE for details -//* https://www.gnu.org/licenses/lgpl-2.1.html - -// MOOSE includes -#include "MaterialStdVectorAuxBase.h" diff --git a/framework/src/loops/ThreadedNodeLoop.C b/framework/src/loops/ThreadedNodeLoop.C deleted file mode 100644 index 5a536fc4ab9f..000000000000 --- a/framework/src/loops/ThreadedNodeLoop.C +++ /dev/null @@ -1,10 +0,0 @@ -//* This file is part of the MOOSE framework -//* https://www.mooseframework.org -//* -//* All rights reserved, see COPYRIGHT for full restrictions -//* https://github.com/idaholab/moose/blob/master/COPYRIGHT -//* -//* Licensed under LGPL 2.1, please see LICENSE for details -//* https://www.gnu.org/licenses/lgpl-2.1.html - -#include "ThreadedNodeLoop.h" diff --git a/framework/src/utils/PerfGuard.C b/framework/src/utils/PerfGuard.C deleted file mode 100644 index 0b9ba75874a6..000000000000 --- a/framework/src/utils/PerfGuard.C +++ /dev/null @@ -1,10 +0,0 @@ -//* This file is part of the MOOSE framework -//* https://www.mooseframework.org -//* -//* All rights reserved, see COPYRIGHT for full restrictions -//* https://github.com/idaholab/moose/blob/master/COPYRIGHT -//* -//* Licensed under LGPL 2.1, please see LICENSE for details -//* https://www.gnu.org/licenses/lgpl-2.1.html - -#include "PerfGuard.h" diff --git a/framework/src/vectorpostprocessors/LineMaterialSamplerBase.C b/framework/src/vectorpostprocessors/LineMaterialSamplerBase.C deleted file mode 100644 index bc20f5a9905f..000000000000 --- a/framework/src/vectorpostprocessors/LineMaterialSamplerBase.C +++ /dev/null @@ -1,10 +0,0 @@ -//* This file is part of the MOOSE framework -//* https://www.mooseframework.org -//* -//* All rights reserved, see COPYRIGHT for full restrictions -//* https://github.com/idaholab/moose/blob/master/COPYRIGHT -//* -//* Licensed under LGPL 2.1, please see LICENSE for details -//* https://www.gnu.org/licenses/lgpl-2.1.html - -#include "LineMaterialSamplerBase.h" From f1786d1b5bf24ce6338d69fd167156d9c817654a Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Mon, 7 Mar 2022 18:13:56 -0800 Subject: [PATCH 04/71] Miscellaneous fixes on VPP docs Refs #18333 --- .../source/vectorpostprocessors/CSVReader.md | 5 +++++ .../vectorpostprocessors/CylindricalAverage.md | 2 -- .../vectorpostprocessors/ElementValueSampler.md | 2 -- .../ElementVariablesDifferenceMax.md | 2 +- .../vectorpostprocessors/ElementsAlongLine.md | 5 ++--- .../vectorpostprocessors/ElementsAlongPlane.md | 4 +--- .../HistogramVectorPostprocessor.md | 2 -- .../source/vectorpostprocessors/LeastSquaresFit.md | 4 +--- .../vectorpostprocessors/LeastSquaresFitHistory.md | 4 +--- .../vectorpostprocessors/LineMaterialRealSampler.md | 13 +++++++++++++ .../source/vectorpostprocessors/LineValueSampler.md | 4 +--- .../MaterialVectorPostprocessor.md | 2 +- .../vectorpostprocessors/NodalValueSampler.md | 2 -- .../PiecewiseFunctionTabulate.md | 2 -- .../SidesetInfoVectorPostprocessor.md | 2 -- .../vectorpostprocessors/VectorMemoryUsage.md | 2 -- .../source/vectorpostprocessors/WorkBalance.md | 2 -- 17 files changed, 26 insertions(+), 33 deletions(-) diff --git a/framework/doc/content/source/vectorpostprocessors/CSVReader.md b/framework/doc/content/source/vectorpostprocessors/CSVReader.md index bb6968cb4510..b2897ddff70c 100644 --- a/framework/doc/content/source/vectorpostprocessors/CSVReader.md +++ b/framework/doc/content/source/vectorpostprocessors/CSVReader.md @@ -6,8 +6,13 @@ converts each column into a VectorPostprocessor vector. This object uses the ## Example Input Syntax +In this example, the `example.csv` file containings data for year/month/day is being read by +the `CSVReader`. + !listing test/tests/vectorpostprocessors/csv_reader/read.i block=VectorPostprocessors +!listing test/tests/vectorpostprocessors/csv_reader/example.csv + !syntax parameters /VectorPostprocessors/CSVReader !syntax inputs /VectorPostprocessors/CSVReader diff --git a/framework/doc/content/source/vectorpostprocessors/CylindricalAverage.md b/framework/doc/content/source/vectorpostprocessors/CylindricalAverage.md index 7b408961ecee..edb4e25b5036 100644 --- a/framework/doc/content/source/vectorpostprocessors/CylindricalAverage.md +++ b/framework/doc/content/source/vectorpostprocessors/CylindricalAverage.md @@ -17,5 +17,3 @@ The average is an average over quadrature points! The specific weight / volume a !syntax inputs /VectorPostprocessors/CylindricalAverage !syntax children /VectorPostprocessors/CylindricalAverage - -!bibtex bibliography diff --git a/framework/doc/content/source/vectorpostprocessors/ElementValueSampler.md b/framework/doc/content/source/vectorpostprocessors/ElementValueSampler.md index 7c361ac3cea3..b8440ae4878e 100644 --- a/framework/doc/content/source/vectorpostprocessors/ElementValueSampler.md +++ b/framework/doc/content/source/vectorpostprocessors/ElementValueSampler.md @@ -12,5 +12,3 @@ element. !syntax inputs /VectorPostprocessors/ElementValueSampler !syntax children /VectorPostprocessors/ElementValueSampler - -!bibtex bibliography diff --git a/framework/doc/content/source/vectorpostprocessors/ElementVariablesDifferenceMax.md b/framework/doc/content/source/vectorpostprocessors/ElementVariablesDifferenceMax.md index 0ebe7793594b..ce0c7d6f91de 100644 --- a/framework/doc/content/source/vectorpostprocessors/ElementVariablesDifferenceMax.md +++ b/framework/doc/content/source/vectorpostprocessors/ElementVariablesDifferenceMax.md @@ -4,7 +4,7 @@ This postprocessor can find the maximum of the difference or the absolute difference if the [!param](/VectorPostprocessors/ElementVariablesDifferenceMax/furthest_from_zero) parameter is set to `true`. -This vector postprocessor output to CSV has the following columns, in this order: +This vector postprocessor output to CSV has the following columns, in this order by default: - the maximum difference between the two variables diff --git a/framework/doc/content/source/vectorpostprocessors/ElementsAlongLine.md b/framework/doc/content/source/vectorpostprocessors/ElementsAlongLine.md index 39ee97a92353..e41d303f233b 100644 --- a/framework/doc/content/source/vectorpostprocessors/ElementsAlongLine.md +++ b/framework/doc/content/source/vectorpostprocessors/ElementsAlongLine.md @@ -1,4 +1,5 @@ # ElementsAlongLine + !syntax description /VectorPostprocessors/ElementsAlongLine ## Description @@ -9,7 +10,7 @@ every element intersected by a line. The IDs are provided in a vector named `ele The user defines the line using a start and end point. The line terminates at those points, so elements on the line beyond those points are not output. -The IDs output from this class use the MOOSE interal numbering scheme, which starts +The IDs output from this class use the MOOSE integral numbering scheme, which starts with 0, so 1 should be added to them to translate them to the equivalent numbering in formats such as Exodus that start with 1. @@ -18,5 +19,3 @@ formats such as Exodus that start with 1. !syntax inputs /VectorPostprocessors/ElementsAlongLine !syntax children /VectorPostprocessors/ElementsAlongLine - -!bibtex bibliography diff --git a/framework/doc/content/source/vectorpostprocessors/ElementsAlongPlane.md b/framework/doc/content/source/vectorpostprocessors/ElementsAlongPlane.md index df12febae9be..faf4f0caea03 100644 --- a/framework/doc/content/source/vectorpostprocessors/ElementsAlongPlane.md +++ b/framework/doc/content/source/vectorpostprocessors/ElementsAlongPlane.md @@ -10,7 +10,7 @@ every element intersected by a plane. The IDs are provided in a vector named `el The user defines the plane using a combination of a point on the plane and a normal to the plane, and the plane extends infinitely. -The IDs output from this class use the MOOSE interal numbering scheme, which starts +The IDs output from this class use the MOOSE internal numbering scheme, which starts with 0, so 1 should be added to them to translate them to the equivalent numbering in formats such as Exodus that start with 1. @@ -19,5 +19,3 @@ formats such as Exodus that start with 1. !syntax inputs /VectorPostprocessors/ElementsAlongPlane !syntax children /VectorPostprocessors/ElementsAlongPlane - -!bibtex bibliography diff --git a/framework/doc/content/source/vectorpostprocessors/HistogramVectorPostprocessor.md b/framework/doc/content/source/vectorpostprocessors/HistogramVectorPostprocessor.md index bbde4db51949..05054a1727cc 100644 --- a/framework/doc/content/source/vectorpostprocessors/HistogramVectorPostprocessor.md +++ b/framework/doc/content/source/vectorpostprocessors/HistogramVectorPostprocessor.md @@ -60,5 +60,3 @@ figure.savefig("output.pdf") !syntax inputs /VectorPostprocessors/HistogramVectorPostprocessor !syntax children /VectorPostprocessors/HistogramVectorPostprocessor - -!bibtex bibliography diff --git a/framework/doc/content/source/vectorpostprocessors/LeastSquaresFit.md b/framework/doc/content/source/vectorpostprocessors/LeastSquaresFit.md index 285506560f6f..472cc99a9c59 100644 --- a/framework/doc/content/source/vectorpostprocessors/LeastSquaresFit.md +++ b/framework/doc/content/source/vectorpostprocessors/LeastSquaresFit.md @@ -8,7 +8,7 @@ This VectorPostprocessor is closely related to the [LeastSquaresFitHistory](/LeastSquaresFitHistory.md) VectorPostprocessor, which performs the same type of least squares fit, but stores the results in a set of vectors that store the full history of the individual coefficients over a transient analysis. -The vectors of values of the independent ($x$) and dependent ($y$) variables on which the least squares fit is performed are provided through another VectorPostprocessor, which must provide two equally-sized vectors of data upon which to operate. The name of this VectorPostprocesor is provided using the `vectorpostprocessor` parameter, and the names of the data vectors are provided with the `x_name` and `y_name` parameters. The vectors of data can be shifted and/or scaled through the use of optional parameters. +The vectors of values of the independent ($x$) and dependent ($y$) variables on which the least squares fit is performed are provided through another VectorPostprocessor, which must provide two equally-sized vectors of data upon which to operate. The name of this VectorPostprocessor is provided using the `vectorpostprocessor` parameter, and the names of the data vectors are provided with the `x_name` and `y_name` parameters. The vectors of data can be shifted and/or scaled through the use of optional parameters. By default, if an insufficient number of points is provided in these data vectors, the order of the polynomial will be truncated to one less than the number of points. If the `truncate_order parameter is set to `false`, an error will be generated in this case. @@ -19,5 +19,3 @@ The user must define whether the output should be in the form of polynomial coef !syntax inputs /VectorPostprocessors/LeastSquaresFit !syntax children /VectorPostprocessors/LeastSquaresFit - -!bibtex bibliography diff --git a/framework/doc/content/source/vectorpostprocessors/LeastSquaresFitHistory.md b/framework/doc/content/source/vectorpostprocessors/LeastSquaresFitHistory.md index 93032ebccce6..b8d1d1f0015a 100644 --- a/framework/doc/content/source/vectorpostprocessors/LeastSquaresFitHistory.md +++ b/framework/doc/content/source/vectorpostprocessors/LeastSquaresFitHistory.md @@ -4,7 +4,7 @@ ## Description -`LeastSquaresFitHistory` is used perform a polynomial least squares fit of data provided through another VectorPostprocessor. It computes the coefficients for a polynomial of arbitrary, user-specified order that minimize the error using a standard least-squares procedure.This object stores the polynomial coefficients in a set of vectors that contain the full history of those values for a transient analysis. +`LeastSquaresFitHistory` is used perform a polynomial least squares fit of data provided through another VectorPostprocessor. It computes the coefficients for a polynomial of arbitrary, user-specified order that minimize the error using a standard least-squares procedure.This object stores the polynomial coefficients in a set of vectors that contain the full history of those values for a transient analysis. This VectorPostprocessor is closely related to the [LeastSquaresFit](/LeastSquaresFit.md) VectorPostprocessor, which performs the same type of least squares fit, but stores the results in a single vector, the history of which is not stored. @@ -19,5 +19,3 @@ By default, if an insufficient number of points is provided in these data vector !syntax inputs /VectorPostprocessors/LeastSquaresFitHistory !syntax children /VectorPostprocessors/LeastSquaresFitHistory - -!bibtex bibliography diff --git a/framework/doc/content/source/vectorpostprocessors/LineMaterialRealSampler.md b/framework/doc/content/source/vectorpostprocessors/LineMaterialRealSampler.md index 80cf796b1426..59b3b8e7fb1b 100644 --- a/framework/doc/content/source/vectorpostprocessors/LineMaterialRealSampler.md +++ b/framework/doc/content/source/vectorpostprocessors/LineMaterialRealSampler.md @@ -7,8 +7,21 @@ This class samples Real material properties for the integration points in all elements that are intersected by a user-defined line. +The output to CSV is **by default** ordered as follows: + +- rows are ordered by point sampled along the line + +- columns are ordered by alphabetical order of the properties sampled. The distance along the sampled line, and the x, y and z coordinates of the sampled points are added to the output as additional columns. + + ## Example Input File Syntax +In this example, the material property `matp` is being sampled along the segment between +'0.125 0.375 0.0' and '0.875 0.375 0.0'. The output is then sorted by the element ids along +this line. + +!listing test/tests/vectorpostprocessors/line_material_sampler/line_material_real_sampler.i block=Materials VectorPostprocessors + !syntax parameters /VectorPostprocessors/LineMaterialRealSampler !syntax inputs /VectorPostprocessors/LineMaterialRealSampler diff --git a/framework/doc/content/source/vectorpostprocessors/LineValueSampler.md b/framework/doc/content/source/vectorpostprocessors/LineValueSampler.md index d7a9e704eee9..7b3948ec7988 100644 --- a/framework/doc/content/source/vectorpostprocessors/LineValueSampler.md +++ b/framework/doc/content/source/vectorpostprocessors/LineValueSampler.md @@ -6,7 +6,7 @@ LineValueSampler samples the given variables/auxvariables at equally spaced points between the start and end points of a user provided line segment. The sampled points and the values are written to a csv file at every time step. The sorting order of the points can be changed using the `sort_by` parameter which takes `x`, `y`, `z` or `id` (increasing distance from start point) as input. -LineValueSampler could also be used as an UserObject with the [MultiAppUserObjectTransfer](/MultiAppUserObjectTransfer.md) to transfer values to AuxVariables in the master or sub application. When using the LineValueSampler with the MultiAppUserObjectTransfer, an error is generated if more than one variable is supplied as input to the LineValueSampler as the transfer currently works only with one variable. Also, when calculating the value of the UserObject (LineValueSampler in this case) at a given point, the point is first projected onto the user defined line segment and the interpolated value at the projected point is returned as output. If the projected point falls outside the line segment, infinity is returned as output. +LineValueSampler could also be used as an UserObject with the [MultiAppUserObjectTransfer.md] to transfer values to AuxVariables in the master or sub application. When using the LineValueSampler with the [MultiAppUserObjectTransfer.md], an error is generated if more than one variable is supplied as input to the LineValueSampler as the transfer currently works only with one variable. Also, when calculating the value of the UserObject (LineValueSampler in this case) at a given point, the point is first projected onto the user defined line segment and the interpolated value at the projected point is returned as output. If the projected point falls outside the line segment, infinity is returned as output. If the variable to be plotted needs to be scaled, this can be done by supplying a postprocessor. Caution should be used to make sure that the postprocessor is being evaluated in such a way that its value will not be lagged when being called by LineValueSampler. @@ -18,5 +18,3 @@ If the line value sampler is used with a discontinuous variable on the edge/face !syntax inputs /VectorPostprocessors/LineValueSampler !syntax children /VectorPostprocessors/LineValueSampler - -!bibtex bibliography diff --git a/framework/doc/content/source/vectorpostprocessors/MaterialVectorPostprocessor.md b/framework/doc/content/source/vectorpostprocessors/MaterialVectorPostprocessor.md index d4c2f57da738..8fc0556d154d 100644 --- a/framework/doc/content/source/vectorpostprocessors/MaterialVectorPostprocessor.md +++ b/framework/doc/content/source/vectorpostprocessors/MaterialVectorPostprocessor.md @@ -10,7 +10,7 @@ The `MaterialVectorPostprocessor` output to CSV is sorted as follows: !alert note -Only scalar variables (floating point and integer-valued) are supported by the vector postprocessor. Vector-valued material properties are not currently supported, though this addition would not be difficult and would be a welcome contribution. +Only scalar-valued (floating point and integer-valued) material properties are supported by the vector postprocessor. Vector-valued material properties are not currently supported, though this addition would not be difficult and would be a welcome contribution. ## Example input syntax diff --git a/framework/doc/content/source/vectorpostprocessors/NodalValueSampler.md b/framework/doc/content/source/vectorpostprocessors/NodalValueSampler.md index a1935d8f4cbf..09244207be5c 100644 --- a/framework/doc/content/source/vectorpostprocessors/NodalValueSampler.md +++ b/framework/doc/content/source/vectorpostprocessors/NodalValueSampler.md @@ -10,5 +10,3 @@ in the domain, selection of blocks, or selection of boundaries. !syntax inputs /VectorPostprocessors/NodalValueSampler !syntax children /VectorPostprocessors/NodalValueSampler - -!bibtex bibliography diff --git a/framework/doc/content/source/vectorpostprocessors/PiecewiseFunctionTabulate.md b/framework/doc/content/source/vectorpostprocessors/PiecewiseFunctionTabulate.md index 48fd2dc2310b..96f7aa9f7c00 100644 --- a/framework/doc/content/source/vectorpostprocessors/PiecewiseFunctionTabulate.md +++ b/framework/doc/content/source/vectorpostprocessors/PiecewiseFunctionTabulate.md @@ -14,5 +14,3 @@ defined function, such as !syntax inputs /VectorPostprocessors/PiecewiseFunctionTabulate !syntax children /VectorPostprocessors/PiecewiseFunctionTabulate - -!bibtex bibliography diff --git a/framework/doc/content/source/vectorpostprocessors/SidesetInfoVectorPostprocessor.md b/framework/doc/content/source/vectorpostprocessors/SidesetInfoVectorPostprocessor.md index 5c3fa2af3467..7623d1587aaf 100644 --- a/framework/doc/content/source/vectorpostprocessors/SidesetInfoVectorPostprocessor.md +++ b/framework/doc/content/source/vectorpostprocessors/SidesetInfoVectorPostprocessor.md @@ -15,5 +15,3 @@ is not guaranteed to be a point contained in the sideset. !syntax inputs /VectorPostprocessors/SidesetInfoVectorPostprocessor !syntax children /VectorPostprocessors/SidesetInfoVectorPostprocessor - -!bibtex bibliography diff --git a/framework/doc/content/source/vectorpostprocessors/VectorMemoryUsage.md b/framework/doc/content/source/vectorpostprocessors/VectorMemoryUsage.md index ec4302bd0d65..a456696799dc 100644 --- a/framework/doc/content/source/vectorpostprocessors/VectorMemoryUsage.md +++ b/framework/doc/content/source/vectorpostprocessors/VectorMemoryUsage.md @@ -48,5 +48,3 @@ AuxKernel. !syntax inputs /VectorPostprocessors/VectorMemoryUsage !syntax children /VectorPostprocessors/VectorMemoryUsage - -!bibtex bibliography diff --git a/framework/doc/content/source/vectorpostprocessors/WorkBalance.md b/framework/doc/content/source/vectorpostprocessors/WorkBalance.md index 6744456d640c..de3d143f98cc 100644 --- a/framework/doc/content/source/vectorpostprocessors/WorkBalance.md +++ b/framework/doc/content/source/vectorpostprocessors/WorkBalance.md @@ -23,5 +23,3 @@ For instance, here is a 1600x1600 mesh partitioned to run on 64 nodes, each havi !syntax inputs /VectorPostprocessors/WorkBalance !syntax children /VectorPostprocessors/WorkBalance - -!bibtex bibliography From 0f8fbddebcf102a3b3c2638231b8e7fb4d360cd4 Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Mon, 7 Mar 2022 18:30:29 -0800 Subject: [PATCH 05/71] Fix documentation for two postprocessors Refs #18333 --- .../ElementExtremeMaterialProperty.md | 7 +++++++ .../doc/content/source/postprocessors/Receiver.md | 15 ++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/framework/doc/content/source/postprocessors/ElementExtremeMaterialProperty.md b/framework/doc/content/source/postprocessors/ElementExtremeMaterialProperty.md index e1be149f9b45..49826e413268 100644 --- a/framework/doc/content/source/postprocessors/ElementExtremeMaterialProperty.md +++ b/framework/doc/content/source/postprocessors/ElementExtremeMaterialProperty.md @@ -3,6 +3,13 @@ This post-processor computes the minimum or maximum of a material property from all quadrature points in a domain. +## Example input syntax + +In this example, the minimum and maximum of the material property `mat_prop` are being sampled +by two `ElementExtremeMaterialProperty` post-processors. + +!listing test/tests/postprocessors/element_extreme_material_property/element_extreme_material_property.i block=Materials Postprocessors + !syntax parameters /Postprocessors/ElementExtremeMaterialProperty !syntax inputs /Postprocessors/ElementExtremeMaterialProperty diff --git a/framework/doc/content/source/postprocessors/Receiver.md b/framework/doc/content/source/postprocessors/Receiver.md index f6c9d5ea4801..ca257d5a070f 100644 --- a/framework/doc/content/source/postprocessors/Receiver.md +++ b/framework/doc/content/source/postprocessors/Receiver.md @@ -5,17 +5,22 @@ ## Overview The Receiver Postprocessor is useful for reporting scalar values created in other parts of the system -such as a Transfer object. It does +not+ compute it's own value. Note that the user may set a default +such as in a [MultiApp](syntax/MultiApps/index.md), and moved to the Receiver using a +[MultiAppPostprocessorTransfer.md] for example. +It does +not+ compute its own value. Note that the user may set a default value with the "default" parameter. -!! Replace these lines with information regarding the Receiver object. - ## Example Input File Syntax -!! Describe and include an example of how to use the Receiver object. +In this example, the value of the Receiver 'pp' in the subapp 'quad' is being populated by +the value of a variable 'master_aux' in the main appplication. + +!listing test/tests/transfers/multiapp_variable_value_sample_transfer/master.i block=Postprocessors caption='Snippet from the subapp' + +!listing test/tests/transfers/multiapp_variable_value_sample_transfer/pp_sub.i block=Transfers caption='Snippet from the main app, populating the Receiver with a transfer of the variable value at different points' !syntax parameters /Postprocessors/Receiver !syntax inputs /Postprocessors/Receiver -!syntax children /Postprocessors/Receiver \ No newline at end of file +!syntax children /Postprocessors/Receiver From e8637896a9182da503df5eeebf19f7a8bd9ec6c7 Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Mon, 7 Mar 2022 18:30:56 -0800 Subject: [PATCH 06/71] More snippet fixes for pinsfv doc Refs #16756 --- .../doc/content/modules/navier_stokes/pinsfv.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/navier_stokes/doc/content/modules/navier_stokes/pinsfv.md b/modules/navier_stokes/doc/content/modules/navier_stokes/pinsfv.md index 1541f1111f78..46ba4acccef6 100644 --- a/modules/navier_stokes/doc/content/modules/navier_stokes/pinsfv.md +++ b/modules/navier_stokes/doc/content/modules/navier_stokes/pinsfv.md @@ -76,19 +76,25 @@ the same time, the user has to selectively activate the desired one. We list the for the first component of the superficial velocity: - no slip walls + !listing modules/navier_stokes/test/tests/finite_volume/pins/channel-flow/2d-rc.i block=FVBCs/no-slip-u - free slip walls + !listing modules/navier_stokes/test/tests/finite_volume/pins/channel-flow/2d-rc.i block=FVBCs/free-slip-u - symmetry axis. This symmetry condition should also be indicated for the pressure variable. + !listing modules/navier_stokes/test/tests/finite_volume/pins/channel-flow/2d-rc.i block=FVBCs/symmetry-u + !listing modules/navier_stokes/test/tests/finite_volume/pins/channel-flow/2d-rc.i block=FVBCs/symmetry-p - inlet velocity, to specify mass flux given that density is constant + !listing modules/navier_stokes/test/tests/finite_volume/pins/channel-flow/2d-rc.i block=FVBCs/inlet-u - momentum advection outflow (only for a mean-pressure approach, equivalent to executing the momentum advection kernel on the boundary) + !listing modules/navier_stokes/test/tests/finite_volume/pins/channel-flow/2d-rc.i block=FVBCs/outlet-u @@ -97,10 +103,12 @@ If the PINSFV version of a boundary condition does not exist, it may be because replacing velocity by superficial velocity. The pressure boundary condition is usually only set at the outlet: + !listing modules/navier_stokes/test/tests/finite_volume/pins/channel-flow/2d-rc.i block=FVBCs/outlet-p For a mean-pressure approach, usually for cavity problems, the user may specify a mass advection boundary condition. This is equivalent to executing the mass advection kernel on boundaries. + !listing modules/navier_stokes/test/tests/finite_volume/pins/channel-flow/2d-rc.i block=FVBCs/outlet-p-novalue ## Example inputs : heated straight channel From da2740229bd230eebbf9e94c6a57c43ddafaea51 Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Tue, 8 Mar 2022 17:28:04 -0700 Subject: [PATCH 07/71] Add documentation to Table Output refs #18333 #17566 #16248 #15968 --- .../doc/content/source/outputs/TableOutput.md | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/framework/doc/content/source/outputs/TableOutput.md b/framework/doc/content/source/outputs/TableOutput.md index 650f2bb9460c..43049d1ff708 100644 --- a/framework/doc/content/source/outputs/TableOutput.md +++ b/framework/doc/content/source/outputs/TableOutput.md @@ -1,3 +1,33 @@ -!! MOOSE Documentation Stub: Remove this line when content is added. - # TableOutput + +The `TableOutput` handles the output of tables to the command line, showing the values of +postprocessors, reporters and scalar variables. It also handles the output of +those same quantities as well as vector postprocessors to CSV files. + +## Example output + +Table output to the command line is formatted as below for postprocessors and scalar variables +respectively. + +``` +Postprocessor Values: ++----------------+----------------+----------------+----------------+----------------------+----------------+ +| time | dT | max_v | mdot | total_fission_source | total_power | ++----------------+----------------+----------------+----------------+----------------------+----------------+ +| 0.000000e+00 | 0.000000e+00 | 0.000000e+00 | 0.000000e+00 | 0.000000e+00 | 0.000000e+00 | +| 1.000000e+00 | 1.541793e+01 | 2.101305e+00 | 1.870911e+04 | 6.303327e+01 | 2.999999e+09 | ++----------------+----------------+----------------+----------------+----------------------+----------------+ + + +Scalar Variable Values: ++----------------+----------------+ +| time | lambda | ++----------------+----------------+ +| 0.000000e+00 | 3.501308e-13 | +| 1.000000e+00 | 3.501308e-13 | ++----------------+----------------+ +``` + +And to CSV files: + +!listing modules/navier_stokes/test/tests/postprocessors/rayleigh/gold/natural_convection_out.csv From 84186e60bdab250205971230e8695f24719e1ce9 Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Tue, 8 Mar 2022 17:29:06 -0700 Subject: [PATCH 08/71] More docs for ElementExtremeMatprop, add docs for OutputInterface refs #18333 #17566 #16248 #15968 --- framework/doc/content/source/interfaces/OutputInterface.md | 6 ++++++ .../source/postprocessors/ElementExtremeMaterialProperty.md | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/framework/doc/content/source/interfaces/OutputInterface.md b/framework/doc/content/source/interfaces/OutputInterface.md index af238578ce7f..a8d1aebb83a4 100644 --- a/framework/doc/content/source/interfaces/OutputInterface.md +++ b/framework/doc/content/source/interfaces/OutputInterface.md @@ -1 +1,7 @@ # OutputInterface + +Interface to handle the restriction of output from objects to certain [Outputs](syntax/Outputs/index.md). +Numerous objects inherit this interface to output some of their +attributes and related quantities. An important example are +[Materials](syntax/Materials/index.md) which can output +material properties to a selection of outputs using an `outputs` parameter. diff --git a/framework/doc/content/source/postprocessors/ElementExtremeMaterialProperty.md b/framework/doc/content/source/postprocessors/ElementExtremeMaterialProperty.md index 49826e413268..f5786e9803aa 100644 --- a/framework/doc/content/source/postprocessors/ElementExtremeMaterialProperty.md +++ b/framework/doc/content/source/postprocessors/ElementExtremeMaterialProperty.md @@ -1,12 +1,12 @@ # ElementExtremeMaterialProperty -This post-processor computes the minimum or maximum of a material property from +This postprocessor computes the minimum or maximum of a material property from all quadrature points in a domain. ## Example input syntax In this example, the minimum and maximum of the material property `mat_prop` are being sampled -by two `ElementExtremeMaterialProperty` post-processors. +by two `ElementExtremeMaterialProperty` postprocessors. !listing test/tests/postprocessors/element_extreme_material_property/element_extreme_material_property.i block=Materials Postprocessors From 20e1a2e4e0c37ca4b3f91aee8a99526abfc1b528 Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Tue, 8 Mar 2022 17:29:33 -0700 Subject: [PATCH 09/71] Misc comment fixes in code Remove unused variable in TableOutput --- framework/src/interfaces/OutputInterface.C | 7 +++---- framework/src/outputs/TableOutput.C | 5 +---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/framework/src/interfaces/OutputInterface.C b/framework/src/interfaces/OutputInterface.C index c6b787099cdf..0a6c2363fdaa 100644 --- a/framework/src/interfaces/OutputInterface.C +++ b/framework/src/interfaces/OutputInterface.C @@ -19,6 +19,7 @@ OutputInterface::validParams() { InputParameters params = emptyInputParameters(); + params.addClassDescription("Interface to handle the restriction of outputs from objects"); params.addParam>("outputs", "Vector of output names were you would like " "to restrict the output of variables(s) " @@ -43,12 +44,10 @@ OutputInterface::OutputInterface(const InputParameters & parameters, bool build_ // Postprocessors. // However, for Materials this is not the case, so the call to buildOutputHideVariableList must be // disabled, the build_list allows for this behavior. The hide lists are handled by - // MaterialOutputAction - // in this case. + // MaterialOutputAction in this case. // // Variables/AuxVariables also call the buildOutputHideVariableList method later, because when - // their actions - // are called the Output objects do not exist. This case is handled by the + // their actions are called the Output objects do not exist. This case is handled by the // CheckOutputAction::checkVariableOutput. if (build_list) { diff --git a/framework/src/outputs/TableOutput.C b/framework/src/outputs/TableOutput.C index 2270b95ed54b..0f4407da3f45 100644 --- a/framework/src/outputs/TableOutput.C +++ b/framework/src/outputs/TableOutput.C @@ -25,9 +25,6 @@ InputParameters TableOutput::validParams() { - // Fit mode selection Enum - MooseEnum pps_fit_mode(FormattedTable::getWidthModes()); - // Base class parameters InputParameters params = AdvancedOutput::validParams(); params += AdvancedOutput::enableOutputTypes("postprocessor scalar vector_postprocessor reporter"); @@ -35,7 +32,7 @@ TableOutput::validParams() // Option for writing vector_postprocessor time file params.addParam("time_data", false, - "When true and VecptorPostprocessor data exists, write " + "When true and VectorPostprocessor data exists, write " "a csv file containing the timestep and time " "information."); From 1a4f7550e20df74bcb8a010d37d1b9866ee6ddc0 Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Tue, 8 Mar 2022 18:48:42 -0700 Subject: [PATCH 10/71] Fixup moosedocs for numerous classes. Typo fixes. Move ParisLaw doc to right module Fixup documentation fixes, refs #18333 Move ParisLaw correctly to XFEM fixup! Fixup moosedocs for numerous classes. Typo fixes. Move ParisLaw doc to right module Fixup docs for scalar tag aux --- .../source/auxkernels/ScalarTagMatrixAux.md | 10 ++++++++-- .../source/auxkernels/ScalarTagVectorAux.md | 10 ++++++++-- .../doc/content/source/base/MooseException.md | 4 ++-- .../source/interfaces/BlockRestrictable.md | 4 ++-- .../source/interfaces/BoundaryRestrictable.md | 6 +++--- .../interfaces/MeshMetaDataInterface.md | 4 ++-- .../source/interfaces/RandomInterface.md | 2 +- .../BreakMeshByBlockGenerator.md | 13 +++++++----- .../doc/content/source/outputs/FileOutput.md | 2 ++ .../content/source/outputs/OutputWarehouse.md | 2 ++ .../partitioner/PetscExternalPartitioner.md | 6 ++++++ .../postprocessors/DifferencePostprocessor.md | 8 +++++++- .../MaxVarNDofsPerElem.md | 4 ++++ .../source/postprocessors/PointValue.md | 8 +++++++- .../content/source/postprocessors/Receiver.md | 4 ++-- .../SideIntegralVariablePostprocessor.md | 20 +++++++++++++++++-- .../RelationshipManager.md | 2 +- .../doc/content/source/restart/DataIO.md | 4 ++-- ...ledVarThresholdElementSubdomainModifier.md | 2 ++ .../source/utils/BilinearInterpolation.md | 2 +- .../doc/content/source/utils/DualReal.md | 4 ++-- .../source/variables/MooseVariableFE.md | 10 ++++++++++ .../content/source/postprocessors/ParisLaw.md | 6 ++++++ .../include/postprocessors/ParisLaw.h | 0 .../{test => }/src/postprocessors/ParisLaw.C | 2 +- test/tests/materials/ad_material/tests | 2 +- 26 files changed, 108 insertions(+), 33 deletions(-) rename framework/doc/content/source/{base => postprocessors}/MaxVarNDofsPerElem.md (56%) rename {framework => modules/xfem}/doc/content/source/postprocessors/ParisLaw.md (80%) rename modules/xfem/{test => }/include/postprocessors/ParisLaw.h (100%) rename modules/xfem/{test => }/src/postprocessors/ParisLaw.C (98%) diff --git a/framework/doc/content/source/auxkernels/ScalarTagMatrixAux.md b/framework/doc/content/source/auxkernels/ScalarTagMatrixAux.md index 671b29c011b9..a47ae8ce1af2 100644 --- a/framework/doc/content/source/auxkernels/ScalarTagMatrixAux.md +++ b/framework/doc/content/source/auxkernels/ScalarTagMatrixAux.md @@ -1,5 +1,11 @@ # ScalarTagMatrixAux The diagonal value of the matrix (associated with a tag) is retrieved for a given node -for scalar kernels. And the diagonal value is saved as an AuxVariable -that will be written out in an exodus file for visualization. +for scalar kernels. And the diagonal value is saved as an AuxVariable. +The AuxVariable can then be visualized using the Exodus file output. + +!syntax parameters /AuxScalarKernels/ScalarTagMatrixAux + +!syntax inputs /AuxScalarKernels/ScalarTagMatrixAux + +!syntax children /AuxScalarKernels/ScalarTagMatrixAux diff --git a/framework/doc/content/source/auxkernels/ScalarTagVectorAux.md b/framework/doc/content/source/auxkernels/ScalarTagVectorAux.md index a2a8b5ce3416..d56181cd7392 100644 --- a/framework/doc/content/source/auxkernels/ScalarTagVectorAux.md +++ b/framework/doc/content/source/auxkernels/ScalarTagVectorAux.md @@ -1,5 +1,11 @@ # ScalarTagVectorAux The value of a tagged vector (for scalar kernels) for a given node and a given variable is coupled to -the current AuxVariable. ScalarTagVectorAux returns the coupled value. AuxVariable -then is written out in an exodus file. +the current AuxVariable. ScalarTagVectorAux returns the coupled value. The AuxVariable can then +be visualized using the Exodus file output. + +!syntax parameters /AuxScalarKernels/ScalarTagVectorAux + +!syntax inputs /AuxScalarKernels/ScalarTagVectorAux + +!syntax children /AuxScalarKernels/ScalarTagVectorAux diff --git a/framework/doc/content/source/base/MooseException.md b/framework/doc/content/source/base/MooseException.md index c8c70e8eaa58..c12d41403bea 100644 --- a/framework/doc/content/source/base/MooseException.md +++ b/framework/doc/content/source/base/MooseException.md @@ -1,13 +1,13 @@ # MooseException MooseException is a normal C++ derived "exception" object. It's purpose is to give developers -an oppurtunity to terminate a solve, while informing MOOSE that it should perform the +an opportunity to terminate a solve, while informing MOOSE that it should perform the necessary steps to clean up the current stack, notify other threads/processors of the error and communicate with the solver that the current solve has failed. When applicable and possible, the solver will allow MOOSE to cut the time step and make another attempt at a solve. This exception should be used directly in user code when non-fatal situations are encountered -such as the inability to converge a local netwon solve in a material, or if a interpolated value +such as the inability to converge a local Newton solve in a material, or if a interpolated value from a variable or lookup table ends up out-of-range. MOOSE is setup to catch MooseExceptions inside of several user defined callbacks that occur during diff --git a/framework/doc/content/source/interfaces/BlockRestrictable.md b/framework/doc/content/source/interfaces/BlockRestrictable.md index 302260ad4313..a490e24e43b5 100644 --- a/framework/doc/content/source/interfaces/BlockRestrictable.md +++ b/framework/doc/content/source/interfaces/BlockRestrictable.md @@ -2,8 +2,8 @@ The BlockRestrictable interface is inherited by every object in MOOSE that supports running on a subset of the mesh domain corresponding to a subdomain. This interface provides a validParameters -function that also supports a uniform way of handing reading in subdomain restrictions. Specfically, -every object may be restricted to one or more subdomains simulataneously. Subdomains may be specified +function that also supports a uniform way of handing reading in subdomain restrictions. Specifically, +every object may be restricted to one or more subdomains simultaneously. Subdomains may be specified either as numeric IDs or strings (when supported by the Mesh format or named entities are used). Finally, this interface handles queries about the set of subdomains that an object is restricted to when no restrictions are supplied. diff --git a/framework/doc/content/source/interfaces/BoundaryRestrictable.md b/framework/doc/content/source/interfaces/BoundaryRestrictable.md index ed4a95c70d0f..9c2748785161 100644 --- a/framework/doc/content/source/interfaces/BoundaryRestrictable.md +++ b/framework/doc/content/source/interfaces/BoundaryRestrictable.md @@ -2,7 +2,7 @@ The BoundaryRestrictable interface is inherited by every object in MOOSE that supports running on a subset of the mesh domain corresponding to a boundary. This interface provides a validParameters function that also -supports a uniform way of handing reading in boundary restrictions. Specfically, every object may be -restricted to one or more boundaries simulataneously. Boundaries may be specified either as numeric IDs +supports a uniform way of handing reading in boundary restrictions. Specifically, every object may be +restricted to one or more boundaries simultaneously. Boundaries may be specified either as numeric IDs or strings (when supported by the Mesh format or named entities are used). Finally, this interface handles -queries about the set of boundaries that an object is restricted to when no restrictions are supplied. \ No newline at end of file +queries about the set of boundaries that an object is restricted to when no restrictions are supplied. diff --git a/framework/doc/content/source/interfaces/MeshMetaDataInterface.md b/framework/doc/content/source/interfaces/MeshMetaDataInterface.md index fdeccbc2064d..3ff7bf6a0344 100644 --- a/framework/doc/content/source/interfaces/MeshMetaDataInterface.md +++ b/framework/doc/content/source/interfaces/MeshMetaDataInterface.md @@ -3,12 +3,12 @@ The MeshMetaDataInterface is used for retrieving attributes related to the mesh created during the mesh generation phase. Attributes can have arbitrary types and names and can be used by other objects to query information that might otherwise be cumbersome by just inspecting the raw mesh object. Examples include specific feature locations, dimensions, numbers -of elements in a direction, etc. The interface contains templated methods for querying for the existance of specific +of elements in a direction, etc. The interface contains templated methods for querying for the existence of specific attributes as well as retrieving those attributes. ## Availability on "Recover" -One of the most important features of the MeshMetaDataInterface is it's availablity during recover +One of the most important features of the MeshMetaDataInterface is it's availability during recover operations. Any system deriving from the interface will have access to attributes created during the initial setup phase of the simulation. This removes the need to retrieve [MeshGenerator](meshgenerators/MeshGenerator.md), [UserObject](syntax/UserObjects/index.md), or [MooseMesh](syntax/Mesh/index.md) objects that might contain specific diff --git a/framework/doc/content/source/interfaces/RandomInterface.md b/framework/doc/content/source/interfaces/RandomInterface.md index 0452962838f2..6d01063fa9f8 100644 --- a/framework/doc/content/source/interfaces/RandomInterface.md +++ b/framework/doc/content/source/interfaces/RandomInterface.md @@ -3,7 +3,7 @@ MOOSE currently distributes a high-quality efficient Pseudo Random Number Generator package (mtwist) that is stable across different machine architectures. This random number generator is tied into MOOSE's random number generator system that can generate consistent spatial random number fields as -parallel discritization changes (e.g. the number of threads/processors does not impact generated +parallel discretization changes (e.g. the number of threads/processors does not impact generated fields). The random number interface is very straightforward to use. !alert note diff --git a/framework/doc/content/source/meshgenerators/BreakMeshByBlockGenerator.md b/framework/doc/content/source/meshgenerators/BreakMeshByBlockGenerator.md index 294c549ba5bb..5481ab194897 100644 --- a/framework/doc/content/source/meshgenerators/BreakMeshByBlockGenerator.md +++ b/framework/doc/content/source/meshgenerators/BreakMeshByBlockGenerator.md @@ -31,11 +31,6 @@ interface will be named `wood_Block2`. !listing test/tests/meshgenerators/break_mesh_by_block_generator/break_mesh_2DJunction_splittrue.i block=Mesh -!syntax parameters /Mesh/BreakMeshByBlockGenerator - -!syntax inputs /Mesh/BreakMeshByBlockGenerator - - ### block_pair option For `block_pair` option, only the nodes that are shared by specific block pairs will be newly created. In the example below, three different cases are shown, where one, two and three new nodes are created, respectively. @@ -44,3 +39,11 @@ For `block_pair` option, only the nodes that are shared by specific block pairs !listing test/tests/meshgenerators/break_mesh_by_block_generator/break_mesh_block_pairs_restricted_3blocks.i block=Mesh + +!syntax parameters /Mesh/BreakMeshByBlockGenerator + +!syntax inputs /Mesh/BreakMeshByBlockGenerator + +!syntax children /Mesh/BreakMeshByBlockGenerator + +!bibtex bibliography diff --git a/framework/doc/content/source/outputs/FileOutput.md b/framework/doc/content/source/outputs/FileOutput.md index af4bcb01cbe1..11376f556d85 100644 --- a/framework/doc/content/source/outputs/FileOutput.md +++ b/framework/doc/content/source/outputs/FileOutput.md @@ -1 +1,3 @@ # FileOutput + +Base class meant to handle the naming of files for file-based outputs. diff --git a/framework/doc/content/source/outputs/OutputWarehouse.md b/framework/doc/content/source/outputs/OutputWarehouse.md index 3514538ec675..1d22189d259f 100644 --- a/framework/doc/content/source/outputs/OutputWarehouse.md +++ b/framework/doc/content/source/outputs/OutputWarehouse.md @@ -1 +1,3 @@ # OutputWarehouse + +!! MOOSE Documentation Stub: Remove this line when content is added. diff --git a/framework/doc/content/source/partitioner/PetscExternalPartitioner.md b/framework/doc/content/source/partitioner/PetscExternalPartitioner.md index 1fa952a04bf8..5436d9bef6ba 100644 --- a/framework/doc/content/source/partitioner/PetscExternalPartitioner.md +++ b/framework/doc/content/source/partitioner/PetscExternalPartitioner.md @@ -88,3 +88,9 @@ These packages can be accessed via an unified interface in MOOSE, `PetscExternal By default, all element and face weights are uniform. This can be modified by implementing `computeElementWeight` and `computeSideWeight` in a derived class of `PetscExternalPartitioner`. For example, the [BlockWeightedPartitioner.md] returns different weights for all elements in a block. + +!syntax parameters /Mesh/Partitioner/PetscExternalPartitioner + +!syntax inputs /Mesh/Partitioner/PetscExternalPartitioner + +!syntax children /Mesh/Partitioner/PetscExternalPartitioner diff --git a/framework/doc/content/source/postprocessors/DifferencePostprocessor.md b/framework/doc/content/source/postprocessors/DifferencePostprocessor.md index 079f22280441..5605cbc2e30f 100644 --- a/framework/doc/content/source/postprocessors/DifferencePostprocessor.md +++ b/framework/doc/content/source/postprocessors/DifferencePostprocessor.md @@ -3,4 +3,10 @@ The DifferencePostprocessor simply computes the difference between two other Postprocessor values: !equation -p_1 - p_2 \ No newline at end of file +p_1 - p_2 + +!syntax parameters /Postprocessors/DifferencePostprocessor + +!syntax inputs /Postprocessors/DifferencePostprocessor + +!syntax children /Postprocessors/DifferencePostprocessor diff --git a/framework/doc/content/source/base/MaxVarNDofsPerElem.md b/framework/doc/content/source/postprocessors/MaxVarNDofsPerElem.md similarity index 56% rename from framework/doc/content/source/base/MaxVarNDofsPerElem.md rename to framework/doc/content/source/postprocessors/MaxVarNDofsPerElem.md index 99e0d5edf52f..311334aae407 100644 --- a/framework/doc/content/source/base/MaxVarNDofsPerElem.md +++ b/framework/doc/content/source/postprocessors/MaxVarNDofsPerElem.md @@ -5,3 +5,7 @@ This class can be used to calculate the maximum number of degrees of freedom on an element. This may be useful in automatic differentiation calculations to limit the number of derivative calculations that have to be carried out. + +!alert note +This postprocessor is a MOOSE test object. Pass `--allow-test-objects` to a `MooseTestApp` +to be able to use it, or migrate it from the MOOSE `test/src` directory to your source directory. diff --git a/framework/doc/content/source/postprocessors/PointValue.md b/framework/doc/content/source/postprocessors/PointValue.md index 9a17bd381e13..d5ecce8d9aa8 100644 --- a/framework/doc/content/source/postprocessors/PointValue.md +++ b/framework/doc/content/source/postprocessors/PointValue.md @@ -5,4 +5,10 @@ an error if the point being sampled lies outside of the domain. !alert warning The behavior of the PointValue processor is undefined if using discontinous shape functions -and the sample point lies right on a discontinuity. \ No newline at end of file +and the sample point lies right on a discontinuity. + +!syntax parameters /Postprocessors/PointValue + +!syntax inputs /Postprocessors/PointValue + +!syntax children /Postprocessors/PointValue diff --git a/framework/doc/content/source/postprocessors/Receiver.md b/framework/doc/content/source/postprocessors/Receiver.md index ca257d5a070f..562f5855004e 100644 --- a/framework/doc/content/source/postprocessors/Receiver.md +++ b/framework/doc/content/source/postprocessors/Receiver.md @@ -15,9 +15,9 @@ value with the "default" parameter. In this example, the value of the Receiver 'pp' in the subapp 'quad' is being populated by the value of a variable 'master_aux' in the main appplication. -!listing test/tests/transfers/multiapp_variable_value_sample_transfer/master.i block=Postprocessors caption='Snippet from the subapp' +!listing test/tests/transfers/multiapp_variable_value_sample_transfer/pp_sub.i block=Postprocessors caption='Snippet from the subapp showing the Receiver' -!listing test/tests/transfers/multiapp_variable_value_sample_transfer/pp_sub.i block=Transfers caption='Snippet from the main app, populating the Receiver with a transfer of the variable value at different points' +!listing test/tests/transfers/multiapp_variable_value_sample_transfer/pp_master.i block=Transfers caption='Snippet from the main app, populating the Receiver with a transfer of the variable value at different points' !syntax parameters /Postprocessors/Receiver diff --git a/framework/doc/content/source/postprocessors/SideIntegralVariablePostprocessor.md b/framework/doc/content/source/postprocessors/SideIntegralVariablePostprocessor.md index 4600cf5d6273..b64954f97179 100644 --- a/framework/doc/content/source/postprocessors/SideIntegralVariablePostprocessor.md +++ b/framework/doc/content/source/postprocessors/SideIntegralVariablePostprocessor.md @@ -1,4 +1,20 @@ # SideIntegralVariablePostprocessor -The SideIntegralVariablePostprocessor is an intermediate base class that should be derived from for any calculation involing -the integral of a variable quantity over a side. \ No newline at end of file +!syntax description /Postprocessors/SideIntegralVariablePostprocessor + +The SideIntegralVariablePostprocessor is also an intermediate base class +that should be derived from for any calculation involving +the integral of a variable quantity over a side. + +## Example input syntax + +In this example, a `SideIntegralVariablePostprocessor` is used to compute the intergral +of variable `u` over the sideset of id `0`. + +!listing test/tests/postprocessors/side_integral/side_integral_test.i block=Postprocessors + +!syntax parameters /Postprocessors/SideIntegralVariablePostprocessor + +!syntax inputs /Postprocessors/SideIntegralVariablePostprocessor + +!syntax children /Postprocessors/SideIntegralVariablePostprocessor diff --git a/framework/doc/content/source/relationshipmanagers/RelationshipManager.md b/framework/doc/content/source/relationshipmanagers/RelationshipManager.md index f1824246daf1..5619b08fa9d0 100644 --- a/framework/doc/content/source/relationshipmanagers/RelationshipManager.md +++ b/framework/doc/content/source/relationshipmanagers/RelationshipManager.md @@ -119,7 +119,7 @@ it. However, if the `MooseObjectAction` is not adding the `MooseObject` , and the `MooseObject` is being added through a custom `action`, then that custom action has to be responsible for detecting and adding the associated relationship managers. The method that the custom `Action` should override to -add relationsip managers is +add relationship managers is `addRelationshipManagers(Moose::RelationshipManagerType input_rm_type)`. Both the `ContactAction` in the contact module, and `PorousFlowActionBase` in the porous flow module provide examples of overriding this method. diff --git a/framework/doc/content/source/restart/DataIO.md b/framework/doc/content/source/restart/DataIO.md index a455c7bc6beb..542076cd86f0 100644 --- a/framework/doc/content/source/restart/DataIO.md +++ b/framework/doc/content/source/restart/DataIO.md @@ -6,7 +6,7 @@ recalculated during a restore operation. These methods enable MOOSE's checkpoint several key capabilities in the MOOSE framework including: - Checkpointing -> the ability to terminate an application and restart it where you left off (useful for batch cluster systems). -- Picard Iteration -> The ability to converge a "tighty" coupled multiApp simulation. +- Picard Iteration -> The ability to converge a "tightly" coupled multiApp simulation. - Restart -> the ability to save stateful data for a [restart](restart_recover.md optional=True) type simulation when using checkpoint format ## What is stateful data? @@ -60,7 +60,7 @@ The declarations for the two methods that may need to be specialized for your ap Typically, the serialization routine can be defined in terms of serializing the individual fields in your custom type. For example. If you had a class `Foo` that contained a -few plain old data types, you'd just define the load and store terms interms of the combination of those POD types in order. +few plain old data types, you'd just define the load and store terms in terms of the combination of those POD types in order. ```language=c++ class Foo diff --git a/framework/doc/content/source/userobject/CoupledVarThresholdElementSubdomainModifier.md b/framework/doc/content/source/userobject/CoupledVarThresholdElementSubdomainModifier.md index c8fdbc2f4f70..fbef97d88f66 100644 --- a/framework/doc/content/source/userobject/CoupledVarThresholdElementSubdomainModifier.md +++ b/framework/doc/content/source/userobject/CoupledVarThresholdElementSubdomainModifier.md @@ -68,3 +68,5 @@ Similarly, all stateful material properties will be re-initialized when an eleme !syntax parameters /UserObjects/CoupledVarThresholdElementSubdomainModifier !syntax inputs /UserObjects/CoupledVarThresholdElementSubdomainModifier + +!syntax children /UserObjects/CoupledVarThresholdElementSubdomainModifier diff --git a/framework/doc/content/source/utils/BilinearInterpolation.md b/framework/doc/content/source/utils/BilinearInterpolation.md index a3ffdf40e33f..2ea9cef9028f 100644 --- a/framework/doc/content/source/utils/BilinearInterpolation.md +++ b/framework/doc/content/source/utils/BilinearInterpolation.md @@ -2,4 +2,4 @@ The BilinearInterpolation utility applies the Least Squares algorithm to a set of points to provide a piecewise reconstruction of a surface in 2D. A set of points in both x and y must be provided in conjunction with a set of dependent values (z-values) -to construct the surface. This object is normally not used directly. Instead it is used throught the [PiecewiseBilinear.md] object. \ No newline at end of file +to construct the surface. This object is normally not used directly. Instead it is used through the [PiecewiseBilinear.md] object. diff --git a/framework/doc/content/source/utils/DualReal.md b/framework/doc/content/source/utils/DualReal.md index 55f0a5bf7d7a..83b6c5ed37f1 100644 --- a/framework/doc/content/source/utils/DualReal.md +++ b/framework/doc/content/source/utils/DualReal.md @@ -29,7 +29,7 @@ options for `D` types, including: 3. `SemiDynamicSparseNumberArray` - `std::array` as underlying storage for derivative data and indices - Fast because of static storage - - Indice storage allows sparse operations and hence flexibility + - Indices storage allows sparse operations and hence flexibility - Avoid looping over the whole size of the std::array by maintaining a dynamic size data member @@ -40,7 +40,7 @@ storage type by running `./configure --with-derivative-type=sparse` in MOOSE's framework directory. The underlying derivative storage array size for both `NumberArray` and `SemiDynamicSparseNumberArray` can be modified by running `configure` with the option `--with-derivative-size=` where `` is the -desired size of the container. By default, MOOSE is configured `--with-derivative-size=50`. +desired size of the container. By default, MOOSE is configured `--with-derivative-size=53`. ## AD-Related Timings id=timings diff --git a/framework/doc/content/source/variables/MooseVariableFE.md b/framework/doc/content/source/variables/MooseVariableFE.md index a211f212c781..685d7167604e 100644 --- a/framework/doc/content/source/variables/MooseVariableFE.md +++ b/framework/doc/content/source/variables/MooseVariableFE.md @@ -1 +1,11 @@ # MooseVariableFE + +!syntax description /Variables/MooseVariable + +!! MOOSE Documentation Stub: Remove this line when content is added. + +!syntax parameters /Variables/MooseVariable + +!syntax inputs /Variables/MooseVariable + +!syntax children /Variables/MooseVariable diff --git a/framework/doc/content/source/postprocessors/ParisLaw.md b/modules/xfem/doc/content/source/postprocessors/ParisLaw.md similarity index 80% rename from framework/doc/content/source/postprocessors/ParisLaw.md rename to modules/xfem/doc/content/source/postprocessors/ParisLaw.md index 7bded596007a..28ce93432818 100644 --- a/framework/doc/content/source/postprocessors/ParisLaw.md +++ b/modules/xfem/doc/content/source/postprocessors/ParisLaw.md @@ -7,3 +7,9 @@ The ParisLaw Postprocessor computes the crack extension size at all active crack ## Example Syntax !listing /modules/xfem/test/tests/solid_mechanics_basic/edge_crack_3d_fatigue.i block=Postprocessors + +!syntax parameters /Postprocessors/ParisLaw + +!syntax inputs /Postprocessors/ParisLaw + +!syntax children /Postprocessors/ParisLaw diff --git a/modules/xfem/test/include/postprocessors/ParisLaw.h b/modules/xfem/include/postprocessors/ParisLaw.h similarity index 100% rename from modules/xfem/test/include/postprocessors/ParisLaw.h rename to modules/xfem/include/postprocessors/ParisLaw.h diff --git a/modules/xfem/test/src/postprocessors/ParisLaw.C b/modules/xfem/src/postprocessors/ParisLaw.C similarity index 98% rename from modules/xfem/test/src/postprocessors/ParisLaw.C rename to modules/xfem/src/postprocessors/ParisLaw.C index 1753015a4815..6e4635a5a74c 100644 --- a/modules/xfem/test/src/postprocessors/ParisLaw.C +++ b/modules/xfem/src/postprocessors/ParisLaw.C @@ -17,7 +17,7 @@ #include "libmesh/system.h" -registerMooseObject("MooseApp", ParisLaw); +registerMooseObject("XFEMApp", ParisLaw); InputParameters ParisLaw::validParams() diff --git a/test/tests/materials/ad_material/tests b/test/tests/materials/ad_material/tests index 28b4ac091373..3acee5ebf7e8 100644 --- a/test/tests/materials/ad_material/tests +++ b/test/tests/materials/ad_material/tests @@ -1,5 +1,5 @@ [Tests] - design = 'ADMaterial.md' + design = 'syntax/Materials/index.md' [./test_adad] type = 'Exodiff' input = 'ad_material.i' From 4516b770542bf101328ad050dc0dd4feb4046a0f Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Tue, 8 Mar 2022 18:53:08 -0700 Subject: [PATCH 11/71] Fix doc files which refer to wrong source file for their parameters refs #18333 --- framework/doc/content/source/bcs/ArrayHFEMDirichletBC.md | 6 +++--- framework/doc/content/source/bcs/ArrayNeumannBC.md | 6 +++--- framework/doc/content/source/bcs/EigenArrayDirichletBC.md | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/framework/doc/content/source/bcs/ArrayHFEMDirichletBC.md b/framework/doc/content/source/bcs/ArrayHFEMDirichletBC.md index cfcc1344a747..e51963b2845d 100644 --- a/framework/doc/content/source/bcs/ArrayHFEMDirichletBC.md +++ b/framework/doc/content/source/bcs/ArrayHFEMDirichletBC.md @@ -10,8 +10,8 @@ Different boundary values for components can be assigned. !listing test/tests/kernels/hfem/array_dirichlet.i start=[all] end=[] include-end=true -!syntax parameters /BCs/ArrayDirichletBC +!syntax parameters /BCs/ArrayHFEMDirichletBC -!syntax inputs /BCs/ArrayDirichletBC +!syntax inputs /BCs/ArrayHFEMDirichletBC -!syntax children /BCs/ArrayDirichletBC +!syntax children /BCs/ArrayHFEMDirichletBC diff --git a/framework/doc/content/source/bcs/ArrayNeumannBC.md b/framework/doc/content/source/bcs/ArrayNeumannBC.md index 6bb060752225..f6ada39356e0 100644 --- a/framework/doc/content/source/bcs/ArrayNeumannBC.md +++ b/framework/doc/content/source/bcs/ArrayNeumannBC.md @@ -8,8 +8,8 @@ Different current values for components can be assigned. ## Example Input Syntax -!syntax parameters /BCs/ArrayDirichletBC +!syntax parameters /BCs/ArrayNeumannBC -!syntax inputs /BCs/ArrayDirichletBC +!syntax inputs /BCs/ArrayNeumannBC -!syntax children /BCs/ArrayDirichletBC +!syntax children /BCs/ArrayNeumannBC diff --git a/framework/doc/content/source/bcs/EigenArrayDirichletBC.md b/framework/doc/content/source/bcs/EigenArrayDirichletBC.md index c440335403db..03a3ed65ebf8 100644 --- a/framework/doc/content/source/bcs/EigenArrayDirichletBC.md +++ b/framework/doc/content/source/bcs/EigenArrayDirichletBC.md @@ -6,10 +6,10 @@ from regular DirichletBC. EigenArrayDirichletBC will always return 0 regardless of the residual. The corresponding rows of the matrix are zeroed out without adding ones to the diagonal. -!syntax description /BCs/EigenDirichletBC +!syntax description /BCs/EigenArrayDirichletBC -!syntax parameters /BCs/DirichletBC +!syntax parameters /BCs/EigenArrayDirichletBC -!syntax inputs /BCs/DirichletBC +!syntax inputs /BCs/EigenArrayDirichletBC -!syntax children /BCs/DirichletBC +!syntax children /BCs/EigenArrayDirichletBC From 488ae98f5d5e75faa26f75f428d91d014f40756c Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Tue, 8 Mar 2022 19:10:09 -0700 Subject: [PATCH 12/71] Fix parameter description in FileOutput Fix typo in GapConductanceConstraint refs #18333 More work on file output docs --- framework/src/outputs/FileOutput.C | 3 ++- .../doc/content/source/constraints/GapConductanceConstraint.md | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/framework/src/outputs/FileOutput.C b/framework/src/outputs/FileOutput.C index 127ba5009328..8c68139fe14c 100644 --- a/framework/src/outputs/FileOutput.C +++ b/framework/src/outputs/FileOutput.C @@ -25,6 +25,7 @@ FileOutput::validParams() { // Create InputParameters object for this stand-alone object InputParameters params = PetscOutput::validParams(); + params.addClassDescription("Base class for all file-based output"); params.addRequiredParam( "file_base", "The desired solution output name without an extension. If not provided, MOOSE sets it " @@ -38,7 +39,7 @@ FileOutput::validParams() "is used (see http://www.cplusplus.com/reference/ctime/strftime)."); // Add the padding option and list it as 'Advanced' params.addParam( - "padding", 4, "The number of for extension suffix (e.g., out.e-s002)"); + "padding", 4, "The number of digits for the extension suffix (e.g., out.e-s002)"); params.addParam>("output_if_base_contains", std::vector(), "If this is supplied then output will only be done in " diff --git a/modules/heat_conduction/doc/content/source/constraints/GapConductanceConstraint.md b/modules/heat_conduction/doc/content/source/constraints/GapConductanceConstraint.md index 5b2b94a6ef3c..346441494523 100644 --- a/modules/heat_conduction/doc/content/source/constraints/GapConductanceConstraint.md +++ b/modules/heat_conduction/doc/content/source/constraints/GapConductanceConstraint.md @@ -2,7 +2,7 @@ !syntax description /Constraints/GapConductanceConstraint -The `GapConductanceConstraint` class is used specify a heat flux across a gap +The `GapConductanceConstraint` class is used to specify a heat flux across a gap equivalent to $\frac{k}{l}\left(u_m - u_s\right)$ where $k$ is the gap conductance, $l$ is the gap distance, $u_m$ is the temperature on the primary side of the mortar interface, and $u_s$ is the temperature on the secondary From d5b4e809fcefd1b59bb157a8a0aab4bcf46606d8 Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Wed, 9 Mar 2022 11:42:09 -0600 Subject: [PATCH 13/71] Remove unused parameter from MOOSE example 1, refs #20510 --- examples/ex01_inputfile/ex01.i | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/ex01_inputfile/ex01.i b/examples/ex01_inputfile/ex01.i index a1339d08cf3e..c6aab5546290 100644 --- a/examples/ex01_inputfile/ex01.i +++ b/examples/ex01_inputfile/ex01.i @@ -37,7 +37,6 @@ [Executioner] type = Steady solve_type = 'PJFNK' - file_base = 'out' [] [Outputs] From 54f3b037f5a042e459a2a9ef7e342adbefc6fa73 Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Wed, 9 Mar 2022 11:47:51 -0600 Subject: [PATCH 14/71] Fix some deprecated parameters in tensor mechanics module Waiting for guidance on others, see #20522 --- .../test/tests/gravity/block-gravity-kinetic-energy.i | 2 +- .../volume_weighted_weibull/volume_weighted_weibull.i | 2 +- .../test/tests/lagrangian/total/special/rotate.i | 10 ++++++++-- .../test/tests/lagrangian/updated/special/rotate.i | 10 ++++++++-- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/modules/tensor_mechanics/test/tests/gravity/block-gravity-kinetic-energy.i b/modules/tensor_mechanics/test/tests/gravity/block-gravity-kinetic-energy.i index 5f8002175dd3..b9bd25ab6833 100644 --- a/modules/tensor_mechanics/test/tests/gravity/block-gravity-kinetic-energy.i +++ b/modules/tensor_mechanics/test/tests/gravity/block-gravity-kinetic-energy.i @@ -63,7 +63,7 @@ offset = 1.0 [Modules/TensorMechanics/DynamicMaster] [all] add_variables = true - alpha = 0.0 + hht_alpha = 0.0 beta = 0.25 gamma = 0.5 mass_damping_coefficient = 0.0 diff --git a/modules/tensor_mechanics/test/tests/ics/volume_weighted_weibull/volume_weighted_weibull.i b/modules/tensor_mechanics/test/tests/ics/volume_weighted_weibull/volume_weighted_weibull.i index 906a4af15a2a..611410a9fa7b 100644 --- a/modules/tensor_mechanics/test/tests/ics/volume_weighted_weibull/volume_weighted_weibull.i +++ b/modules/tensor_mechanics/test/tests/ics/volume_weighted_weibull/volume_weighted_weibull.i @@ -34,7 +34,7 @@ [VectorPostprocessors] [./histo] - type = VolumeHistogram + type = VariableValueVolumeHistogram variable = u_vww min_value = 0 max_value = 2 diff --git a/modules/tensor_mechanics/test/tests/lagrangian/total/special/rotate.i b/modules/tensor_mechanics/test/tests/lagrangian/total/special/rotate.i index 434bed8b324a..f34519c37da1 100644 --- a/modules/tensor_mechanics/test/tests/lagrangian/total/special/rotate.i +++ b/modules/tensor_mechanics/test/tests/lagrangian/total/special/rotate.i @@ -101,6 +101,13 @@ vars = 'a theta' vals = 'stretch angles' [] + + [dts] + type = PiecewiseConstant + x = '0 1 2' + y = '0.1 0.001 0.001' + direction = 'LEFT_INCLUSIVE' + [] [] [BCs] @@ -264,8 +271,7 @@ end_time = 2.0 [TimeStepper] type = FunctionDT - time_t = '0 1 2' - time_dt = '0.1 0.001 0.001' + function = dts interpolate = False [] [] diff --git a/modules/tensor_mechanics/test/tests/lagrangian/updated/special/rotate.i b/modules/tensor_mechanics/test/tests/lagrangian/updated/special/rotate.i index dd85b07c4a0a..7a48d7508eb7 100644 --- a/modules/tensor_mechanics/test/tests/lagrangian/updated/special/rotate.i +++ b/modules/tensor_mechanics/test/tests/lagrangian/updated/special/rotate.i @@ -104,6 +104,13 @@ vars = 'a theta' vals = 'stretch angles' [] + + [dts] + type = PiecewiseConstant + x = '0 1 2' + y = '0.1 0.001 0.001' + direction = 'LEFT_INCLUSIVE' + [] [] [BCs] @@ -267,8 +274,7 @@ end_time = 2.0 [TimeStepper] type = FunctionDT - time_t = '0 1 2' - time_dt = '0.1 0.001 0.001' + function = dts interpolate = False [] [] From 766ca20532b5711fdb827a0df12a4cf373f8b1e3 Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Wed, 9 Mar 2022 19:41:11 -0600 Subject: [PATCH 15/71] Fix some deprecated parameters in contact module tests, refs #0 and linked to #15283 --- modules/contact/test/tests/dual_mortar/dm_mechanical_contact.i | 1 - .../test/tests/dual_mortar/dm_mechanical_contact_precon.i | 1 - .../test/tests/verification/patch_tests/brick_1/brick1_aug.i | 1 - .../tests/verification/patch_tests/brick_1/brick1_mu_0_2_pen.i | 1 - .../tests/verification/patch_tests/brick_1/brick1_template1.i | 1 - .../tests/verification/patch_tests/brick_1/brick1_template2.i | 1 - .../test/tests/verification/patch_tests/brick_2/brick2_aug.i | 1 - .../tests/verification/patch_tests/brick_2/brick2_mu_0_2_pen.i | 1 - .../tests/verification/patch_tests/brick_2/brick2_template1.i | 1 - .../tests/verification/patch_tests/brick_2/brick2_template2.i | 1 - .../tests/verification/patch_tests/brick_3/brick3_mu_0_2_pen.i | 1 - .../tests/verification/patch_tests/brick_3/brick3_template1.i | 1 - .../tests/verification/patch_tests/brick_3/brick3_template2.i | 1 - .../tests/verification/patch_tests/brick_4/brick4_mu_0_2_pen.i | 1 - .../tests/verification/patch_tests/brick_4/brick4_template1.i | 1 - .../tests/verification/patch_tests/brick_4/brick4_template2.i | 1 - .../test/tests/verification/patch_tests/cyl_1/cyl1_mu_0_2_pen.i | 1 - .../test/tests/verification/patch_tests/cyl_1/cyl1_template1.i | 1 - .../test/tests/verification/patch_tests/cyl_1/cyl1_template2.i | 1 - .../test/tests/verification/patch_tests/cyl_2/cyl2_mu_0_2_pen.i | 1 - .../test/tests/verification/patch_tests/cyl_2/cyl2_template1.i | 1 - .../test/tests/verification/patch_tests/cyl_2/cyl2_template2.i | 1 - .../test/tests/verification/patch_tests/cyl_3/cyl3_mu_0_2_pen.i | 1 - .../test/tests/verification/patch_tests/cyl_3/cyl3_template1.i | 1 - .../test/tests/verification/patch_tests/cyl_3/cyl3_template2.i | 1 - .../test/tests/verification/patch_tests/cyl_4/cyl4_mu_0_2_pen.i | 1 - .../test/tests/verification/patch_tests/cyl_4/cyl4_template1.i | 1 - .../test/tests/verification/patch_tests/cyl_4/cyl4_template2.i | 1 - .../tests/verification/patch_tests/plane_1/plane1_mu_0_2_pen.i | 1 - .../tests/verification/patch_tests/plane_1/plane1_template1.i | 1 - .../tests/verification/patch_tests/plane_1/plane1_template2.i | 1 - .../tests/verification/patch_tests/plane_2/plane2_mu_0_2_pen.i | 1 - .../tests/verification/patch_tests/plane_2/plane2_template1.i | 1 - .../tests/verification/patch_tests/plane_2/plane2_template2.i | 1 - .../tests/verification/patch_tests/plane_3/plane3_mu_0_2_pen.i | 1 - .../tests/verification/patch_tests/plane_3/plane3_template1.i | 1 - .../tests/verification/patch_tests/plane_3/plane3_template2.i | 1 - .../tests/verification/patch_tests/plane_4/plane4_mu_0_2_pen.i | 1 - .../tests/verification/patch_tests/plane_4/plane4_template1.i | 1 - .../tests/verification/patch_tests/plane_4/plane4_template2.i | 1 - .../tests/verification/patch_tests/ring_1/ring1_mu_0_2_pen.i | 1 - .../test/tests/verification/patch_tests/ring_1/ring1_template1.i | 1 - .../test/tests/verification/patch_tests/ring_1/ring1_template2.i | 1 - .../tests/verification/patch_tests/ring_2/ring2_mu_0_2_pen.i | 1 - .../test/tests/verification/patch_tests/ring_2/ring2_template1.i | 1 - .../test/tests/verification/patch_tests/ring_2/ring2_template2.i | 1 - .../tests/verification/patch_tests/ring_3/ring3_mu_0_2_pen.i | 1 - .../test/tests/verification/patch_tests/ring_3/ring3_template1.i | 1 - .../test/tests/verification/patch_tests/ring_3/ring3_template2.i | 1 - .../tests/verification/patch_tests/ring_4/ring4_mu_0_2_pen.i | 1 - .../test/tests/verification/patch_tests/ring_4/ring4_template1.i | 1 - .../test/tests/verification/patch_tests/ring_4/ring4_template2.i | 1 - 52 files changed, 52 deletions(-) diff --git a/modules/contact/test/tests/dual_mortar/dm_mechanical_contact.i b/modules/contact/test/tests/dual_mortar/dm_mechanical_contact.i index 94693e883df1..cdf8ad7c6051 100644 --- a/modules/contact/test/tests/dual_mortar/dm_mechanical_contact.i +++ b/modules/contact/test/tests/dual_mortar/dm_mechanical_contact.i @@ -130,7 +130,6 @@ [Contact] [leftright] - mesh = combined_mesh secondary = '11' primary = '23' formulation = mortar diff --git a/modules/contact/test/tests/dual_mortar/dm_mechanical_contact_precon.i b/modules/contact/test/tests/dual_mortar/dm_mechanical_contact_precon.i index 4748141e535a..3400fa752675 100644 --- a/modules/contact/test/tests/dual_mortar/dm_mechanical_contact_precon.i +++ b/modules/contact/test/tests/dual_mortar/dm_mechanical_contact_precon.i @@ -130,7 +130,6 @@ [Contact] [leftright] - mesh = combined_mesh secondary = '11' primary = '23' formulation = mortar diff --git a/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_aug.i b/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_aug.i index 8f9ed8ff375c..3a0d86f0af0b 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_aug.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_aug.i @@ -258,7 +258,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_mu_0_2_pen.i index 31e2855000ce..d6b74e2094cb 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_mu_0_2_pen.i @@ -277,7 +277,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_template1.i b/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_template1.i index 9733ce12be07..5ab494427e31 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_template1.i @@ -257,7 +257,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_template2.i b/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_template2.i index c0229750746a..77a5771d3d88 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_template2.i @@ -258,7 +258,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_aug.i b/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_aug.i index 01b6498c14f1..c7a2e75e3e26 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_aug.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_aug.i @@ -238,7 +238,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_mu_0_2_pen.i index 4fc0a9b796b8..5d9a418d0da0 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_mu_0_2_pen.i @@ -257,7 +257,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_template1.i b/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_template1.i index 7538c7b9284e..28afe88e33f6 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_template1.i @@ -237,7 +237,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_template2.i b/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_template2.i index b762549a7b75..289a7fcc18b1 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_template2.i @@ -238,7 +238,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_mu_0_2_pen.i index 2f8f43b9e081..16bd81f2d178 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_mu_0_2_pen.i @@ -257,7 +257,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_template1.i b/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_template1.i index 50ecb295b912..e3e2f056ea17 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_template1.i @@ -237,7 +237,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_template2.i b/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_template2.i index fadf588f6bc6..e6beb9687fcf 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_template2.i @@ -238,7 +238,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_mu_0_2_pen.i index b72535044b07..020e88a8c136 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_mu_0_2_pen.i @@ -257,7 +257,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_template1.i b/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_template1.i index 4125f8a2b673..5f8afbd4c29e 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_template1.i @@ -237,7 +237,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_template2.i b/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_template2.i index 8c3e748cfcb0..2bc3366c6be2 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_template2.i @@ -238,7 +238,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_mu_0_2_pen.i index e9add197c638..3a614b4fe83c 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_mu_0_2_pen.i @@ -237,7 +237,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_template1.i b/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_template1.i index 83b6673295cf..391200c3fe4a 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_template1.i @@ -244,7 +244,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_template2.i b/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_template2.i index 99e6c22d43f6..19cebc3ea651 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_template2.i @@ -245,7 +245,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_mu_0_2_pen.i index 26a2481dc55e..ee85a577eec6 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_mu_0_2_pen.i @@ -237,7 +237,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_template1.i b/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_template1.i index 53956ef8b654..aeecbb9268ee 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_template1.i @@ -244,7 +244,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_template2.i b/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_template2.i index 1f2d30678544..f300b4458c69 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_template2.i @@ -245,7 +245,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_3/cyl3_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/cyl_3/cyl3_mu_0_2_pen.i index f7a5145c0a9b..37ea88133f84 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_3/cyl3_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_3/cyl3_mu_0_2_pen.i @@ -237,7 +237,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_3/cyl3_template1.i b/modules/contact/test/tests/verification/patch_tests/cyl_3/cyl3_template1.i index 20dcadb74a16..14cae06228a8 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_3/cyl3_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_3/cyl3_template1.i @@ -244,7 +244,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_3/cyl3_template2.i b/modules/contact/test/tests/verification/patch_tests/cyl_3/cyl3_template2.i index c14f7fad7dce..fd0654a39555 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_3/cyl3_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_3/cyl3_template2.i @@ -245,7 +245,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_mu_0_2_pen.i index 2f45f5dc5036..bfad68ee1b0d 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_mu_0_2_pen.i @@ -237,7 +237,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_template1.i b/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_template1.i index 5ae76da05800..c39f6072f74d 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_template1.i @@ -237,7 +237,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_template2.i b/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_template2.i index 7b99351ac6bc..505f24ab7ede 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_template2.i @@ -238,7 +238,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_mu_0_2_pen.i index 8849110ec09b..9eb715c7b538 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_mu_0_2_pen.i @@ -239,7 +239,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_template1.i b/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_template1.i index fef258930461..8782080796a0 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_template1.i @@ -219,7 +219,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_template2.i b/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_template2.i index 4b7824a23752..c39aa197a9c6 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_template2.i @@ -220,7 +220,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_mu_0_2_pen.i index bda53fd281ce..c66153a63b91 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_mu_0_2_pen.i @@ -239,7 +239,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_template1.i b/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_template1.i index f8a32e2197d6..57752b7083b4 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_template1.i @@ -219,7 +219,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_template2.i b/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_template2.i index d79c245ae367..c401cf71e043 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_template2.i @@ -220,7 +220,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/plane_3/plane3_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/plane_3/plane3_mu_0_2_pen.i index dd609b7264e5..439bf5a57fc5 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_3/plane3_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_3/plane3_mu_0_2_pen.i @@ -239,7 +239,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/plane_3/plane3_template1.i b/modules/contact/test/tests/verification/patch_tests/plane_3/plane3_template1.i index d8cb6bbae449..f8cde2c04184 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_3/plane3_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_3/plane3_template1.i @@ -223,7 +223,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/plane_3/plane3_template2.i b/modules/contact/test/tests/verification/patch_tests/plane_3/plane3_template2.i index d3bf48803237..0f8cb453ea98 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_3/plane3_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_3/plane3_template2.i @@ -224,7 +224,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_mu_0_2_pen.i index 91a0ebfa9ec7..ead403de9ba4 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_mu_0_2_pen.i @@ -239,7 +239,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_template1.i b/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_template1.i index 0cac04092c0f..4036402b2783 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_template1.i @@ -223,7 +223,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_template2.i b/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_template2.i index dbbb9917a670..f110742aa0ea 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_template2.i @@ -224,7 +224,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_mu_0_2_pen.i index 45cf2f8fdb7f..459f74fe158c 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_mu_0_2_pen.i @@ -231,7 +231,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_template1.i b/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_template1.i index addb81f3fd07..5d3752503a25 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_template1.i @@ -233,7 +233,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_template2.i b/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_template2.i index 97d6d95dd752..882d69a7d7cf 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_template2.i @@ -234,7 +234,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_mu_0_2_pen.i index e1dde6efa217..7bd30873304b 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_mu_0_2_pen.i @@ -231,7 +231,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_template1.i b/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_template1.i index a4338f4fc5ba..7c3c5c843a72 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_template1.i @@ -231,7 +231,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_template2.i b/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_template2.i index 28b04b758be4..5f37e6e55169 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_template2.i @@ -232,7 +232,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_mu_0_2_pen.i index 859a393e6135..ed069394107e 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_mu_0_2_pen.i @@ -231,7 +231,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_template1.i b/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_template1.i index 9126db977d7b..89f80a425d9d 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_template1.i @@ -231,7 +231,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_template2.i b/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_template2.i index c41ac0686a52..cef24624fb1c 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_template2.i @@ -232,7 +232,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_mu_0_2_pen.i index e0d52ab5defd..c6354366a950 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_mu_0_2_pen.i @@ -231,7 +231,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_template1.i b/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_template1.i index 38ccce74a590..9ab15e82cb74 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_template1.i @@ -231,7 +231,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] diff --git a/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_template2.i b/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_template2.i index 23d2df01dc9d..2739057aa12e 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_template2.i @@ -232,7 +232,6 @@ type = Pressure variable = disp_y boundary = 5 - component = 1 factor = 109.89 [../] [] From 7fef27706d1049bb5c10c4792473a957327a142f Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Wed, 9 Mar 2022 19:52:43 -0600 Subject: [PATCH 16/71] Fix some deprecated parameters in heat conduction tests, refs #0 --- .../test/tests/fvbcs/fv_thermal_resistance/test_functor.i | 2 +- .../gap_heat_transfer_htonly_syntax.i | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/heat_conduction/test/tests/fvbcs/fv_thermal_resistance/test_functor.i b/modules/heat_conduction/test/tests/fvbcs/fv_thermal_resistance/test_functor.i index 00254b47b3c3..9ad7420a75b0 100644 --- a/modules/heat_conduction/test/tests/fvbcs/fv_thermal_resistance/test_functor.i +++ b/modules/heat_conduction/test/tests/fvbcs/fv_thermal_resistance/test_functor.i @@ -67,7 +67,7 @@ [Materials] [cht] - type = ADGenericConstantFunctorMaterial + type = ADGenericFunctorMaterial prop_names = 'htc' prop_values = '1' [] diff --git a/modules/heat_conduction/test/tests/gap_heat_transfer_htonly/gap_heat_transfer_htonly_syntax.i b/modules/heat_conduction/test/tests/gap_heat_transfer_htonly/gap_heat_transfer_htonly_syntax.i index f5693ab3aa7a..744f9cd331d5 100644 --- a/modules/heat_conduction/test/tests/gap_heat_transfer_htonly/gap_heat_transfer_htonly_syntax.i +++ b/modules/heat_conduction/test/tests/gap_heat_transfer_htonly/gap_heat_transfer_htonly_syntax.i @@ -193,7 +193,7 @@ [../] [./flux_left] - type = SideFluxIntegral + type = SideDiffusiveFluxIntegral variable = temp boundary = 2 diffusivity = thermal_conductivity @@ -201,7 +201,7 @@ [../] [./flux_right] - type = SideFluxIntegral + type = SideDiffusiveFluxIntegral variable = temp boundary = 3 diffusivity = thermal_conductivity @@ -223,7 +223,7 @@ [../] [./awe_flux_left] - type = SideFluxIntegral + type = SideDiffusiveFluxIntegral variable = awesomium boundary = 2 diffusivity = thermal_conductivity @@ -231,7 +231,7 @@ [../] [./awe_flux_right] - type = SideFluxIntegral + type = SideDiffusiveFluxIntegral variable = awesomium boundary = 3 diffusivity = thermal_conductivity From c2f70cfa9994639fae2a44cdb4dbb27bc0f1718e Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Thu, 10 Mar 2022 00:06:46 -0600 Subject: [PATCH 17/71] Fix some deprecated parameters in porous flow tests, refs #0 --- modules/porous_flow/examples/tutorial/11_2D.i | 1 - modules/porous_flow/test/tests/thm_rehbinder/fixed_outer.i | 2 -- modules/porous_flow/test/tests/thm_rehbinder/fixed_outer_rz.i | 1 - modules/porous_flow/test/tests/thm_rehbinder/free_outer.i | 2 -- 4 files changed, 6 deletions(-) diff --git a/modules/porous_flow/examples/tutorial/11_2D.i b/modules/porous_flow/examples/tutorial/11_2D.i index 60bc94db2bc1..f4d3f3948d7a 100644 --- a/modules/porous_flow/examples/tutorial/11_2D.i +++ b/modules/porous_flow/examples/tutorial/11_2D.i @@ -242,7 +242,6 @@ type = Pressure boundary = injection_area variable = disp_r - component = 0 postprocessor = constrained_effective_fluid_pressure_at_wellbore use_displaced_mesh = false [] diff --git a/modules/porous_flow/test/tests/thm_rehbinder/fixed_outer.i b/modules/porous_flow/test/tests/thm_rehbinder/fixed_outer.i index fedf189fbcd2..66d9a92187e4 100644 --- a/modules/porous_flow/test/tests/thm_rehbinder/fixed_outer.i +++ b/modules/porous_flow/test/tests/thm_rehbinder/fixed_outer.i @@ -72,7 +72,6 @@ [] [cavity_zero_effective_stress_x] type = Pressure - component = 0 variable = disp_x function = 1E6 boundary = rmin @@ -80,7 +79,6 @@ [] [cavity_zero_effective_stress_y] type = Pressure - component = 1 variable = disp_y function = 1E6 boundary = rmin diff --git a/modules/porous_flow/test/tests/thm_rehbinder/fixed_outer_rz.i b/modules/porous_flow/test/tests/thm_rehbinder/fixed_outer_rz.i index 2b2455283e73..bb2228536778 100644 --- a/modules/porous_flow/test/tests/thm_rehbinder/fixed_outer_rz.i +++ b/modules/porous_flow/test/tests/thm_rehbinder/fixed_outer_rz.i @@ -54,7 +54,6 @@ [] [cavity_zero_effective_stress_x] type = Pressure - component = 0 variable = disp_r function = 1E6 boundary = left diff --git a/modules/porous_flow/test/tests/thm_rehbinder/free_outer.i b/modules/porous_flow/test/tests/thm_rehbinder/free_outer.i index 752775982189..ac11e922c5b8 100644 --- a/modules/porous_flow/test/tests/thm_rehbinder/free_outer.i +++ b/modules/porous_flow/test/tests/thm_rehbinder/free_outer.i @@ -76,7 +76,6 @@ [] [cavity_zero_effective_stress_x] type = Pressure - component = 0 variable = disp_x function = 1E6 boundary = rmin @@ -84,7 +83,6 @@ [] [cavity_zero_effective_stress_y] type = Pressure - component = 1 variable = disp_y function = 1E6 boundary = rmin From 4a9ab2bb075886162dee26925f9a48f17b2c1ca4 Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Thu, 10 Mar 2022 00:15:35 -0600 Subject: [PATCH 18/71] Fix some deprecated parameters in a phase field example, refs #0 --- modules/phase_field/examples/ebsd_reconstruction/IN100-111grn.i | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/phase_field/examples/ebsd_reconstruction/IN100-111grn.i b/modules/phase_field/examples/ebsd_reconstruction/IN100-111grn.i index 8cc6da9d4a57..1883dfba9ada 100644 --- a/modules/phase_field/examples/ebsd_reconstruction/IN100-111grn.i +++ b/modules/phase_field/examples/ebsd_reconstruction/IN100-111grn.i @@ -2,7 +2,7 @@ [ebsd_mesh] type = EBSDMeshGenerator filename = IN100_120x120.txt - uniform_refine = 2 + pre_refine = 2 [] [] From bb7fa59f341d34f7e2b2a47b7eeebf5f048c7522 Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Thu, 10 Mar 2022 00:16:47 -0600 Subject: [PATCH 19/71] Fix some deprecated parameters in a reactor module test, refs #0 --- .../reporting_id/cartesian_id/core_zigzag_reporting_id.i | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/reactor/test/tests/meshgenerators/reporting_id/cartesian_id/core_zigzag_reporting_id.i b/modules/reactor/test/tests/meshgenerators/reporting_id/cartesian_id/core_zigzag_reporting_id.i index b32fbd62e0bd..849d815306a5 100644 --- a/modules/reactor/test/tests/meshgenerators/reporting_id/cartesian_id/core_zigzag_reporting_id.i +++ b/modules/reactor/test/tests/meshgenerators/reporting_id/cartesian_id/core_zigzag_reporting_id.i @@ -24,8 +24,8 @@ [pin_dummy] type = RenameBlockGenerator input = 'pin1' - old_block_id = '1 2 3' - new_block_id = '9999 9999 9999' + old_block = '1 2 3' + new_block = '9999 9999 9999' [] [assembly1] From feb7e0f406c4f4e6f0f0613b6f8cf5fa1dad8547 Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Thu, 10 Mar 2022 00:18:23 -0600 Subject: [PATCH 20/71] Fix some deprecated parameters in ray tracing fv tests, refs #0 --- .../line_source_ray_kernel/fv_simple_diffusion_line_source.i | 2 +- .../fv_simple_diffusion_line_integral.i | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ray_tracing/test/tests/raykernels/line_source_ray_kernel/fv_simple_diffusion_line_source.i b/modules/ray_tracing/test/tests/raykernels/line_source_ray_kernel/fv_simple_diffusion_line_source.i index 822f44b5bf61..92d3820c99ab 100644 --- a/modules/ray_tracing/test/tests/raykernels/line_source_ray_kernel/fv_simple_diffusion_line_source.i +++ b/modules/ray_tracing/test/tests/raykernels/line_source_ray_kernel/fv_simple_diffusion_line_source.i @@ -43,7 +43,7 @@ [] [Materials/diff] - type = ADGenericConstantFunctorMaterial + type = ADGenericFunctorMaterial prop_names = 'coeff' prop_values = '1' [] diff --git a/modules/ray_tracing/test/tests/raykernels/variable_integral_ray_kernel/fv_simple_diffusion_line_integral.i b/modules/ray_tracing/test/tests/raykernels/variable_integral_ray_kernel/fv_simple_diffusion_line_integral.i index c9105c380125..2d9e79a644d1 100644 --- a/modules/ray_tracing/test/tests/raykernels/variable_integral_ray_kernel/fv_simple_diffusion_line_integral.i +++ b/modules/ray_tracing/test/tests/raykernels/variable_integral_ray_kernel/fv_simple_diffusion_line_integral.i @@ -41,7 +41,7 @@ [] [Materials/diff] - type = ADGenericConstantFunctorMaterial + type = ADGenericFunctorMaterial prop_names = 'coeff' prop_values = '1' [] From 458fda910767014e6f1a7705b8b36a0cae3bee2f Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Thu, 10 Mar 2022 00:42:50 -0600 Subject: [PATCH 21/71] Add more instructions to INL HPC install, refs #20071 --- .../installation/inl_hpc_install_moose.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/doc/content/getting_started/installation/inl_hpc_install_moose.md b/modules/doc/content/getting_started/installation/inl_hpc_install_moose.md index 7a9a5c291625..781b061d9914 100644 --- a/modules/doc/content/getting_started/installation/inl_hpc_install_moose.md +++ b/modules/doc/content/getting_started/installation/inl_hpc_install_moose.md @@ -88,6 +88,16 @@ nodes (`Compute CPU`) cannot perform this step as it requires more direct access ./update_and_rebuild_libmesh.sh ``` +### Step 3: Build MOOSE and the app + +This should be as simple as going into the app directory and building using the Makefile. +For example for MOOSE, we build the test executable as shown below + +``` + cd /scratch/$USER/projects/moose/test + make -j6 +``` + ## Option 3: conda (mamba) installation (not recommended, light users) !alert warning From b5373498f7b30865f5a3527cae3bca38fefc2e1e Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Fri, 11 Mar 2022 10:34:36 -0600 Subject: [PATCH 22/71] Add parameter groups to MultiApps, refs #20535 --- framework/src/multiapps/MultiApp.C | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/framework/src/multiapps/MultiApp.C b/framework/src/multiapps/MultiApp.C index 03064e623c97..6b9fb860b849 100644 --- a/framework/src/multiapps/MultiApp.C +++ b/framework/src/multiapps/MultiApp.C @@ -198,6 +198,12 @@ MultiApp::validParams() params.declareControllable("cli_args", {EXEC_PRE_MULTIAPP_SETUP}); params.registerBase("MultiApp"); + params.addParamNamesToGroup("reset_time reset_apps", "Reset MultiApp parameters"); + params.addParamNamesToGroup("move_time move_apps move_positions", + "Timed move of MultiApps parameters"); + params.addParamNamesToGroup("relaxation_factor transformed_variables transformed_postprocessors", + "Fixed point acceleration of MultiApp quantities"); + return params; } From 560c8ab457c757bbb59d63a581e9288fa215b781 Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Fri, 11 Mar 2022 10:37:29 -0600 Subject: [PATCH 23/71] Fix parameter groups for fixed point solves, refs #20535 --- framework/src/executioners/Executioner.C | 1 + framework/src/executioners/FixedPointSolve.C | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/src/executioners/Executioner.C b/framework/src/executioners/Executioner.C index b429eba575c3..fd776aaecc4d 100644 --- a/framework/src/executioners/Executioner.C +++ b/framework/src/executioners/Executioner.C @@ -44,6 +44,7 @@ Executioner::validParams() params.registerBase("Executioner"); + params.addParamNamesToGroup("fixed_point_algorithm", "Fixed point iterations"); params.addParamNamesToGroup("restart_file_base", "Restart"); return params; diff --git a/framework/src/executioners/FixedPointSolve.C b/framework/src/executioners/FixedPointSolve.C index b0279060a38d..3b2e2d2050c4 100644 --- a/framework/src/executioners/FixedPointSolve.C +++ b/framework/src/executioners/FixedPointSolve.C @@ -106,7 +106,8 @@ FixedPointSolve::validParams() "fixed_point_min_its fixed_point_max_its accept_on_max_fixed_point_iteration " "disable_fixed_point_residual_norm_check fixed_point_rel_tol fixed_point_abs_tol " "fixed_point_force_norms custom_pp fixed_point_rel_tol fixed_point_abs_tol direct_pp_value " - "relaxation_factor transformed_variables transformed_postprocessors auto_advance", + "relaxation_factor transformed_variables transformed_postprocessors auto_advance " + "custom_abs_tol custom_rel_tol", "Fixed point iterations"); params.addParam( From 1343c747743e10a0a66b4e2c9e599cfe291f3d4d Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Fri, 11 Mar 2022 10:37:56 -0600 Subject: [PATCH 24/71] Fix up deprecation messages in PicardSolve refs #17479 --- framework/src/executioners/PicardSolve.C | 28 ++++++++++++------------ 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/framework/src/executioners/PicardSolve.C b/framework/src/executioners/PicardSolve.C index 069a2adbcf66..209d433d958f 100644 --- a/framework/src/executioners/PicardSolve.C +++ b/framework/src/executioners/PicardSolve.C @@ -23,47 +23,47 @@ PicardSolve::validParams() params.addDeprecatedParam( "picard_max_its", 1, - "Deprecated, use fixed_point_max_its", "Specifies the maximum number of Picard iterations. " "Mainly used when wanting to do Picard iterations with MultiApps " "that are set to execute_on timestep_end or timestep_begin. " - "Setting this parameter to 1 turns off the Picard iterations."); + "Setting this parameter to 1 turns off the Picard iterations.", + "Deprecated, use fixed_point_max_its"); params.addDeprecatedParam( "accept_on_max_picard_iteration", false, - "Deprecated, use accept_on_max_fixed_point_iteration", - "True to treat reaching the maximum number of Picard iterations as converged."); + "True to treat reaching the maximum number of Picard iterations as converged.", + "Deprecated, use accept_on_max_fixed_point_iteration"); params.addDeprecatedParam( "disable_picard_residual_norm_check", false, - "Deprecated, use disable_fixed_point_residual_norm_check", "Disable the Picard residual norm evaluation thus the three parameters " - "picard_rel_tol, picard_abs_tol and picard_force_norms."); + "picard_rel_tol, picard_abs_tol and picard_force_norms.", + "Deprecated, use disable_fixed_point_residual_norm_check"); params.addDeprecatedParam("picard_rel_tol", 1e-8, - "Deprecated, use fixed_point_rel_tol", "The relative nonlinear residual drop to shoot for " "during Picard iterations. This check is " "performed based on the Master app's nonlinear " - "residual."); + "residual.", + "Deprecated, use fixed_point_rel_tol"); params.addDeprecatedParam("picard_abs_tol", 1e-50, - "Deprecated, use fixed_point_abs_tol", "The absolute nonlinear residual to shoot for " "during Picard iterations. This check is " "performed based on the Master app's nonlinear " - "residual."); + "residual.", + "Deprecated, use fixed_point_abs_tol"); params.addDeprecatedParam( "picard_custom_pp", - "Deprecated, use custom_pp", - "Postprocessor for custom picard convergence check."); + "Postprocessor for custom picard convergence check.", + "Deprecated, use custom_pp"); params.addDeprecatedParam( "picard_force_norms", false, - "Deprecated, use fixed_point_force_norms", "Force the evaluation of both the TIMESTEP_BEGIN and TIMESTEP_END norms regardless of the " - "existence of active MultiApps with those execute_on flags, default: false."); + "existence of active MultiApps with those execute_on flags, default: false.", + "Deprecated, use fixed_point_force_norms"); return params; } From 50e233e1c47b6f40f5cefca00979789c8601a71c Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Fri, 11 Mar 2022 10:50:13 -0600 Subject: [PATCH 25/71] Add parameter groups to FEProblemSolve, refs #20535 --- framework/src/executioners/FEProblemSolve.C | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/framework/src/executioners/FEProblemSolve.C b/framework/src/executioners/FEProblemSolve.C index e76646839563..0e4bc86fe6e1 100644 --- a/framework/src/executioners/FEProblemSolve.C +++ b/framework/src/executioners/FEProblemSolve.C @@ -124,8 +124,17 @@ FEProblemSolve::validParams() "l_tol l_abs_tol l_max_its nl_max_its nl_max_funcs " "nl_abs_tol nl_rel_tol nl_abs_step_tol nl_rel_step_tol " "snesmf_reuse_base compute_initial_residual_before_preset_bcs " - "automatic_scaling compute_scaling_once off_diagonals_in_auto_scaling num_grids", + "num_grids nl_div_tol nl_abs_div_tol", "Solver"); + params.addParamNamesToGroup( + "automatic_scaling compute_scaling_once off_diagonals_in_auto_scaling " + "scaling_group_variables resid_vs_jac_scaling_param", + "Solver variable scaling parameters"); + params.addParamNamesToGroup( + "line_search line_search_package contact_line_search_ltol " + "contact_line_search_allowed_lambda_cuts", + "Solver line search parameters"); + return params; } From 1d6d111f3ab8843482ae3704eaec2a2ca08a16fc Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Fri, 11 Mar 2022 19:42:07 -0600 Subject: [PATCH 26/71] Fix some deprecated parameters in stochastic tools test, refs #0 This loses the diffs on those reporters, since the reporters dont output like VPPs BUT it's the stats of results, which is directly output as well and is checked. So the example in itself remains covered. The correct working of StatisticsReporter is also ensured by the test suite, not by these examples lang format --- framework/src/executioners/FEProblemSolve.C | 20 +++++++++---------- framework/src/executioners/PicardSolve.C | 7 +++---- ...iff_react_master_normal_out_stats_0002.csv | 4 ---- ...ff_react_master_uniform_out_stats_0002.csv | 4 ---- .../nonlin_diff_react_master_normal.i | 5 ++++- .../nonlin_diff_react_master_uniform.i | 5 ++++- .../parameter_study/nonlin_diff_react/tests | 4 ++-- .../gold/trans_diff_main_out_stats_0001.csv | 7 ------- .../surrogates/combined/trans_diff_2d/tests | 2 +- .../combined/trans_diff_2d/trans_diff_main.i | 5 ++++- .../random_ic_distribution_test.i | 2 +- 11 files changed, 28 insertions(+), 37 deletions(-) delete mode 100644 modules/stochastic_tools/examples/parameter_study/nonlin_diff_react/gold/nonlin_diff_react_master_normal_out_stats_0002.csv delete mode 100644 modules/stochastic_tools/examples/parameter_study/nonlin_diff_react/gold/nonlin_diff_react_master_uniform_out_stats_0002.csv delete mode 100644 modules/stochastic_tools/examples/surrogates/combined/trans_diff_2d/gold/trans_diff_main_out_stats_0001.csv diff --git a/framework/src/executioners/FEProblemSolve.C b/framework/src/executioners/FEProblemSolve.C index 0e4bc86fe6e1..b108d671d0dd 100644 --- a/framework/src/executioners/FEProblemSolve.C +++ b/framework/src/executioners/FEProblemSolve.C @@ -120,21 +120,19 @@ FEProblemSolve::validParams() "The number of grids to use for a grid sequencing algorithm. This includes the final grid, " "so num_grids = 1 indicates just one solve in a time-step"); - params.addParamNamesToGroup( - "l_tol l_abs_tol l_max_its nl_max_its nl_max_funcs " - "nl_abs_tol nl_rel_tol nl_abs_step_tol nl_rel_step_tol " - "snesmf_reuse_base compute_initial_residual_before_preset_bcs " - "num_grids nl_div_tol nl_abs_div_tol", - "Solver"); + params.addParamNamesToGroup("l_tol l_abs_tol l_max_its nl_max_its nl_max_funcs " + "nl_abs_tol nl_rel_tol nl_abs_step_tol nl_rel_step_tol " + "snesmf_reuse_base compute_initial_residual_before_preset_bcs " + "num_grids nl_div_tol nl_abs_div_tol", + "Solver"); params.addParamNamesToGroup( "automatic_scaling compute_scaling_once off_diagonals_in_auto_scaling " "scaling_group_variables resid_vs_jac_scaling_param", "Solver variable scaling parameters"); - params.addParamNamesToGroup( - "line_search line_search_package contact_line_search_ltol " - "contact_line_search_allowed_lambda_cuts", - "Solver line search parameters"); - + params.addParamNamesToGroup("line_search line_search_package contact_line_search_ltol " + "contact_line_search_allowed_lambda_cuts", + "Solver line search parameters"); + return params; } diff --git a/framework/src/executioners/PicardSolve.C b/framework/src/executioners/PicardSolve.C index 209d433d958f..1389da7b1027 100644 --- a/framework/src/executioners/PicardSolve.C +++ b/framework/src/executioners/PicardSolve.C @@ -53,10 +53,9 @@ PicardSolve::validParams() "performed based on the Master app's nonlinear " "residual.", "Deprecated, use fixed_point_abs_tol"); - params.addDeprecatedParam( - "picard_custom_pp", - "Postprocessor for custom picard convergence check.", - "Deprecated, use custom_pp"); + params.addDeprecatedParam("picard_custom_pp", + "Postprocessor for custom picard convergence check.", + "Deprecated, use custom_pp"); params.addDeprecatedParam( "picard_force_norms", diff --git a/modules/stochastic_tools/examples/parameter_study/nonlin_diff_react/gold/nonlin_diff_react_master_normal_out_stats_0002.csv b/modules/stochastic_tools/examples/parameter_study/nonlin_diff_react/gold/nonlin_diff_react_master_normal_out_stats_0002.csv deleted file mode 100644 index bbcefeaaf67f..000000000000 --- a/modules/stochastic_tools/examples/parameter_study/nonlin_diff_react/gold/nonlin_diff_react_master_normal_out_stats_0002.csv +++ /dev/null @@ -1,4 +0,0 @@ -results_results:average,results_results:max,results_results:min,stat_type --0.12971329957689,0.81664587004429,-1.2815489961452,3 --0.15210053192327,0.74938320294988,-1.2980107390548,3.05 --0.10732606723051,0.88390853713869,-1.2650872532355,3.95 diff --git a/modules/stochastic_tools/examples/parameter_study/nonlin_diff_react/gold/nonlin_diff_react_master_uniform_out_stats_0002.csv b/modules/stochastic_tools/examples/parameter_study/nonlin_diff_react/gold/nonlin_diff_react_master_uniform_out_stats_0002.csv deleted file mode 100644 index fa1ce1eb7811..000000000000 --- a/modules/stochastic_tools/examples/parameter_study/nonlin_diff_react/gold/nonlin_diff_react_master_uniform_out_stats_0002.csv +++ /dev/null @@ -1,4 +0,0 @@ -results_results:average,results_results:max,results_results:min,stat_type --0.12547179466417,0.82900425335,-1.278367537563,3 --0.15244577734334,0.74834889432693,-1.2982241210144,3.05 --0.099118367485304,0.9079515329022,-1.2589087369839,3.95 diff --git a/modules/stochastic_tools/examples/parameter_study/nonlin_diff_react/nonlin_diff_react_master_normal.i b/modules/stochastic_tools/examples/parameter_study/nonlin_diff_react/nonlin_diff_react_master_normal.i index bf059747bc2e..f070c3db5afa 100644 --- a/modules/stochastic_tools/examples/parameter_study/nonlin_diff_react/nonlin_diff_react_master_normal.i +++ b/modules/stochastic_tools/examples/parameter_study/nonlin_diff_react/nonlin_diff_react_master_normal.i @@ -52,8 +52,11 @@ [results] type = StochasticResults [] +[] + +[Reporters] [stats] - type = Statistics + type = StatisticsReporter vectorpostprocessors = results compute = 'mean' ci_method = 'percentile' diff --git a/modules/stochastic_tools/examples/parameter_study/nonlin_diff_react/nonlin_diff_react_master_uniform.i b/modules/stochastic_tools/examples/parameter_study/nonlin_diff_react/nonlin_diff_react_master_uniform.i index 6ceffab14d08..e8dad07018f5 100644 --- a/modules/stochastic_tools/examples/parameter_study/nonlin_diff_react/nonlin_diff_react_master_uniform.i +++ b/modules/stochastic_tools/examples/parameter_study/nonlin_diff_react/nonlin_diff_react_master_uniform.i @@ -52,8 +52,11 @@ [results] type = StochasticResults [] +[] + +[Reporters] [stats] - type = Statistics + type = StatisticsReporter vectorpostprocessors = results compute = 'mean' ci_method = 'percentile' diff --git a/modules/stochastic_tools/examples/parameter_study/nonlin_diff_react/tests b/modules/stochastic_tools/examples/parameter_study/nonlin_diff_react/tests index e2252adc95c6..6fe0b9c3449d 100644 --- a/modules/stochastic_tools/examples/parameter_study/nonlin_diff_react/tests +++ b/modules/stochastic_tools/examples/parameter_study/nonlin_diff_react/tests @@ -12,7 +12,7 @@ cli_args = "Samplers/hypercube/num_rows=5 runner:Mesh/gen/nx=10 runner:Mesh/gen/ny=10" - csvdiff = 'nonlin_diff_react_master_uniform_out_results_0002.csv nonlin_diff_react_master_uniform_out_stats_0002.csv' + csvdiff = 'nonlin_diff_react_master_uniform_out_results_0002.csv' max_parallel = 5 detail = "uniformly distributed and " @@ -24,7 +24,7 @@ cli_args = "Samplers/hypercube/num_rows=5 runner:Mesh/gen/nx=10 runner:Mesh/gen/ny=10" - csvdiff = 'nonlin_diff_react_master_normal_out_results_0002.csv nonlin_diff_react_master_normal_out_stats_0002.csv' + csvdiff = 'nonlin_diff_react_master_normal_out_results_0002.csv' max_parallel = 5 detail = "normally distributed." diff --git a/modules/stochastic_tools/examples/surrogates/combined/trans_diff_2d/gold/trans_diff_main_out_stats_0001.csv b/modules/stochastic_tools/examples/surrogates/combined/trans_diff_2d/gold/trans_diff_main_out_stats_0001.csv deleted file mode 100644 index f7748e041c4f..000000000000 --- a/modules/stochastic_tools/examples/surrogates/combined/trans_diff_2d/gold/trans_diff_main_out_stats_0001.csv +++ /dev/null @@ -1,7 +0,0 @@ -results_results:time_max,results_results:time_min,stat_type -313.62040829628,304.33656926886,3 -299.68204132273,291.22017901025,3.05 -327.55877526982,317.45295952747,3.95 -20.907558307342,19.675381181014,4 -0,0,4.05 -24.141959772724,22.718254339821,4.95 diff --git a/modules/stochastic_tools/examples/surrogates/combined/trans_diff_2d/tests b/modules/stochastic_tools/examples/surrogates/combined/trans_diff_2d/tests index 14f7fef290e3..17b7be88fc4b 100644 --- a/modules/stochastic_tools/examples/surrogates/combined/trans_diff_2d/tests +++ b/modules/stochastic_tools/examples/surrogates/combined/trans_diff_2d/tests @@ -12,7 +12,7 @@ runner:Mesh/msh/nx=10 runner:Mesh/msh/ny=10 runner:Executioner/num_steps=2" - csvdiff = 'trans_diff_main_out_results_0001.csv trans_diff_main_out_stats_0001.csv' + csvdiff = 'trans_diff_main_out_results_0001.csv' abs_zero = 1e-5 detail = "with computing reference solutions " diff --git a/modules/stochastic_tools/examples/surrogates/combined/trans_diff_2d/trans_diff_main.i b/modules/stochastic_tools/examples/surrogates/combined/trans_diff_2d/trans_diff_main.i index fd96a301fece..b79ad5adf620 100644 --- a/modules/stochastic_tools/examples/surrogates/combined/trans_diff_2d/trans_diff_main.i +++ b/modules/stochastic_tools/examples/surrogates/combined/trans_diff_2d/trans_diff_main.i @@ -59,8 +59,11 @@ [results] type = StochasticResults [] +[] + +[Reporters] [stats] - type = Statistics + type = StatisticsReporter vectorpostprocessors = results compute = 'mean stddev' ci_method = 'percentile' diff --git a/modules/stochastic_tools/test/tests/ics/random_ic_distribution_test/random_ic_distribution_test.i b/modules/stochastic_tools/test/tests/ics/random_ic_distribution_test/random_ic_distribution_test.i index 164eec0a8378..58760c24b4de 100644 --- a/modules/stochastic_tools/test/tests/ics/random_ic_distribution_test/random_ic_distribution_test.i +++ b/modules/stochastic_tools/test/tests/ics/random_ic_distribution_test/random_ic_distribution_test.i @@ -61,7 +61,7 @@ [VectorPostprocessors] [histo] - type = VolumeHistogram + type = VariableValueVolumeHistogram variable = u_aux min_value = 0 max_value = 4 From 4dade4ab61a79840c0d78fdadd82529e91b9408f Mon Sep 17 00:00:00 2001 From: Cody Permann Date: Fri, 18 Mar 2022 13:50:10 -0600 Subject: [PATCH 27/71] Continue Cleanup of install tests 1) Removing old --copy-tests and --tests options 2) Getting rid of convoluted logic to fun tests in system installed location 3) Introducing the first C++17 filesystem syntax refs #19022 --- framework/include/parser/CommandLine.h | 12 +++ framework/src/base/MooseApp.C | 95 ++++++++----------- framework/src/parser/CommandLine.C | 31 ++++++ .../application_development/build_system.md | 9 +- test/tests/make_install/tests | 2 +- 5 files changed, 90 insertions(+), 59 deletions(-) diff --git a/framework/include/parser/CommandLine.h b/framework/include/parser/CommandLine.h index dba37ef77340..6a0d4eddf7ba 100644 --- a/framework/include/parser/CommandLine.h +++ b/framework/include/parser/CommandLine.h @@ -92,6 +92,18 @@ class CommandLine template bool search(const std::string & option_name, std::vector & argument); + /** + * Returns an iterator to the underlying argument vector to the position of the option or + * end if the option is not on the command line. + */ + std::vector::const_iterator find(const std::string & option_name) const; + + // Return an iterator to the beginning of the container of CLI options + std::vector::const_iterator begin() const; + + // Return an iterator to the beginning of the container of CLI options + std::vector::const_iterator end() const; + /** * Print the usage info for this command line */ diff --git a/framework/src/base/MooseApp.C b/framework/src/base/MooseApp.C index 411975e7c98e..88a6bdcf5b2d 100644 --- a/framework/src/base/MooseApp.C +++ b/framework/src/base/MooseApp.C @@ -74,6 +74,7 @@ #include // for system() #include #include +#include #define QUOTE(macro) stringifyName(macro) @@ -147,9 +148,6 @@ MooseApp::validParams() "json", "--json", "Dumps input file syntax in JSON format."); params.addCommandLineParam( "syntax", "--syntax", false, "Dumps the associated Action syntax paths ONLY"); - params.addCommandLineParam("run_tests", "--tests", false, "run all tests"); - params.addCommandLineParam( - "copy_tests", "--copy-tests", false, "copy installed tests to an _tests dir"); params.addCommandLineParam( "show_docs", "--docs", false, "print url/path to the documentation website"); params.addCommandLineParam("check_input", @@ -161,8 +159,8 @@ MooseApp::validParams() "Copies installed inputs (e.g. tests, examples, etc.) to " "an directory named _."); params.addCommandLineParam("run", - "--run ", - "Runs the inputs in the specified directory copied to a " + "--run", + "Runs the inputs in the current directory copied to a " "user-writable location by \"--copy-inputs\""); params.addCommandLineParam( @@ -1413,18 +1411,11 @@ MooseApp::run() bool MooseApp::copyInputs() { - std::string dir_to_copy = "tests"; - bool copy_param_valid = false; - if (isParamValid("copy_inputs")) { // Get command line argument following --copy-inputs on command line - dir_to_copy = getParam("copy_inputs"); - copy_param_valid = true; - } + auto dir_to_copy = getParam("copy_inputs"); - if (getParam("copy_tests") || copy_param_valid) - { auto binname = appBinaryName(); if (binname == "") mooseError("could not locate installed tests to run (unresolved binary/app name)"); @@ -1468,53 +1459,48 @@ MooseApp::copyInputs() bool MooseApp::runInputs() { - std::string dir_to_run = "tests"; - bool run_param_valid = false; - int skip_args = 2; - if (isParamValid("run")) { - // Get command line argument following --run on command line - dir_to_run = getParam("run"); - run_param_valid = true; - skip_args = 3; - } + // Here we are going to pass everything after --run on the cli to the TestHarness. That means + // cannot validate these CLIs. + auto it = _command_line->find("run"); - if ((isParamValid("run_tests") && getParam("run_tests")) || run_param_valid) - { - std::string args; - for (int i = skip_args; i < _sys_info->argc(); i++) - args += " " + std::string(*(_sys_info->argv() + i)); - auto cmd = MooseUtils::runTestsExecutable() + args; + std::string test_args; + if (it != _command_line->end()) + { + // Preincrement here to skip over --run + while (++it != _command_line->end()) + test_args += " " + *it; + } + + auto cmd = MooseUtils::runTestsExecutable() + test_args; + std::filesystem::path working_dir; + try + { + working_dir = std::filesystem::current_path(); + } + catch (...) + { + } - std::string working_dir; if (MooseUtils::findTestRoot() == "") { - // run installed tests instead of cwd tests - auto binname = appBinaryName(); - if (binname == "") - mooseError("could not locate installed tests to run (unresolved binary/app name)"); - - working_dir = MooseUtils::installedInputsDir(binname, dir_to_run); - if (working_dir == "") - mooseError("could not find any directory to run"); - - auto cmdname = Moose::getExecutableName(); - if (cmdname.find_first_of("/") != std::string::npos) - cmdname = cmdname.substr(cmdname.find_first_of("/") + 1, std::string::npos); - if (!MooseUtils::checkFileWriteable(MooseUtils::pathjoin(working_dir, "testroot"), false)) - mooseError("You don't have permissions to run contents of directory at their current " - "installed location.\nRun \"", - cmdname, - " --copy-inputs \" to copy the contents of to a \"./", - binname, - "_\" directory.\nChange into that directory and try \"", - cmdname, - " --run \" again."); - - int ret = chdir(working_dir.c_str()); - if (ret != 0) - mooseError("Failed to change directory into ", working_dir); + auto bin_name = appBinaryName(); + if (bin_name == "") + mooseError("Could not locate binary name relative to installed location"); + + auto cmd_name = Moose::getExecutableName(); + mooseError( + "Could not locate installed tests from the current working directory:", + working_dir, + ".\nMake sure you are executing this command from within a writable installed inputs ", + "directory.\nRun \"", + cmd_name, + " --copy-inputs \" to copy the contents of to a \"./", + bin_name, + "_\" directory.\nChange into that directory and try \"", + cmd_name, + " --run \" again."); } // Only launch the tests on the root processor @@ -1528,6 +1514,7 @@ MooseApp::runInputs() mooseError("Run failed"); return true; } + return false; } diff --git a/framework/src/parser/CommandLine.C b/framework/src/parser/CommandLine.C index e56b2ef8d7b5..3dea46de8222 100644 --- a/framework/src/parser/CommandLine.C +++ b/framework/src/parser/CommandLine.C @@ -195,6 +195,37 @@ CommandLine::addOption(const std::string & name, Option cli_opt) _cli_options[name] = cli_opt; } +std::vector::const_iterator +CommandLine::find(const std::string & option_name) const +{ + auto pos = _cli_options.find(option_name); + auto it = _args.end(); + + if (pos != _cli_options.end()) + { + for (const auto & search_string : pos->second.cli_switch) + { + auto it = std::find(_args.begin(), _args.end(), search_string); + if (it != _args.end()) + return it; + } + } + + return it; +} + +std::vector::const_iterator +CommandLine::begin() const +{ + return _args.begin(); +} + +std::vector::const_iterator +CommandLine::end() const +{ + return _args.end(); +} + bool CommandLine::search(const std::string & option_name) { diff --git a/modules/doc/content/application_development/build_system.md b/modules/doc/content/application_development/build_system.md index d73615d6abc6..e10e6a7f71b8 100644 --- a/modules/doc/content/application_development/build_system.md +++ b/modules/doc/content/application_development/build_system.md @@ -214,9 +214,10 @@ when building MOOSE or a MOOSE-based application. MOOSE's build system has the ability to create installed binaries suitable for use with the conda package manager, or installation on a shared computing resource such as Sawtooth. The `install` target will copy binary and required libraries to a file tree based on the prefix you configured with (set by the variable `PREFIX` or the `--prefix` argument. ``` -$ cd moose/framework +$ cd moose $ ./configure --prefix= -$ make +$ cd +$ make [make options] $ make install ``` @@ -241,13 +242,13 @@ Example: $ cd $ export PATH=$PATH:/bin # See instructions for HPC computers below $ bison-opt --copy-inputs # e.g. tests, examples, etc. -$ bison-opt --run +$ bison-opt --run ``` Where `` is one of the installable directories as defined by the application developers (i.e. `tests`, `examples`, `tutorials`, etc.) -When using INL HPC systems to run your input, you will load a module that will set your path correctly +When using INL HPC systems to run your input, you will load a module that will set your path correctly. Example: diff --git a/test/tests/make_install/tests b/test/tests/make_install/tests index d6bdefb87a51..a49eb3c2dc1a 100644 --- a/test/tests/make_install/tests +++ b/test/tests/make_install/tests @@ -76,7 +76,7 @@ [run] type = 'RunApp' - cli_args = "--run tests" + cli_args = "--run" working_directory = "../../../make_install_test/moose_test_tests" no_additional_cli_args = True installed = False From b80195bca768b83882be53fa372780cdb42537b7 Mon Sep 17 00:00:00 2001 From: Cody Permann Date: Mon, 21 Mar 2022 12:04:20 -0600 Subject: [PATCH 28/71] Dropping first C++17 include :( refs #19022 --- framework/include/utils/MooseUtils.h | 7 +++++++ framework/src/base/MooseApp.C | 10 +--------- framework/src/utils/MooseUtils.C | 13 +++++++++++++ 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/framework/include/utils/MooseUtils.h b/framework/include/utils/MooseUtils.h index 7c903a313a35..36424bc55b0a 100644 --- a/framework/include/utils/MooseUtils.h +++ b/framework/include/utils/MooseUtils.h @@ -240,6 +240,13 @@ std::string stripExtension(const std::string & s); */ std::pair splitFileName(std::string full_file); +/** + * Returns the current working directory as a string. If there's a problem + * obtaining the current working directory, this function just returns an + * empty string. It doesn't not throw. + */ +std::string getCurrentWorkingDir(); + /** * Recursively make directories * @param dir_name A complete path diff --git a/framework/src/base/MooseApp.C b/framework/src/base/MooseApp.C index 88a6bdcf5b2d..2ac388be1d53 100644 --- a/framework/src/base/MooseApp.C +++ b/framework/src/base/MooseApp.C @@ -74,7 +74,6 @@ #include // for system() #include #include -#include #define QUOTE(macro) stringifyName(macro) @@ -1474,14 +1473,7 @@ MooseApp::runInputs() } auto cmd = MooseUtils::runTestsExecutable() + test_args; - std::filesystem::path working_dir; - try - { - working_dir = std::filesystem::current_path(); - } - catch (...) - { - } + auto working_dir = MooseUtils::getCurrentWorkingDir(); if (MooseUtils::findTestRoot() == "") { diff --git a/framework/src/utils/MooseUtils.C b/framework/src/utils/MooseUtils.C index e9cfad5813e9..43c75311091e 100644 --- a/framework/src/utils/MooseUtils.C +++ b/framework/src/utils/MooseUtils.C @@ -422,6 +422,19 @@ splitFileName(std::string full_file) return std::pair(path, file); } +std::string +getCurrentWorkingDir() +{ + // Note: At the time of creating this method, our minimum compiler still + // does not support . Additionally, the inclusion of that header + // requires an additional library to be linked so for now, we'll just + // use the Unix standard library to get us the cwd(). + constexpr unsigned int BUF_SIZE = 1024; + char buffer[BUF_SIZE]; + + return getcwd(buffer, BUF_SIZE) != nullptr ? buffer : ""; +} + void makedirs(const std::string & dir_name, bool throw_on_failure) { From e98e61c3cde88969d94898a1ffc41a7e06efc414 Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Mon, 21 Mar 2022 16:35:48 -0600 Subject: [PATCH 29/71] Rename FVScalarLagrangeMultiplier to allow for a base class for FV constraints, refs #20607 --- ...ltiplier.h => FVIntegralValueConstraint.h} | 16 ++----- .../FVScalarLagrangeMultiplierConstraint.h | 38 +++++++++++++++++ .../src/fvkernels/FVIntegralValueConstraint.C | 42 +++++++++++++++++++ ...=> FVScalarLagrangeMultiplierConstraint.C} | 33 +++++++-------- framework/src/systems/NonlinearSystemBase.C | 7 ++-- 5 files changed, 101 insertions(+), 35 deletions(-) rename framework/include/fvkernels/{FVScalarLagrangeMultiplier.h => FVIntegralValueConstraint.h} (68%) create mode 100644 framework/include/fvkernels/FVScalarLagrangeMultiplierConstraint.h create mode 100644 framework/src/fvkernels/FVIntegralValueConstraint.C rename framework/src/fvkernels/{FVScalarLagrangeMultiplier.C => FVScalarLagrangeMultiplierConstraint.C} (64%) diff --git a/framework/include/fvkernels/FVScalarLagrangeMultiplier.h b/framework/include/fvkernels/FVIntegralValueConstraint.h similarity index 68% rename from framework/include/fvkernels/FVScalarLagrangeMultiplier.h rename to framework/include/fvkernels/FVIntegralValueConstraint.h index c812df718506..a5a85c132793 100644 --- a/framework/include/fvkernels/FVScalarLagrangeMultiplier.h +++ b/framework/include/fvkernels/FVIntegralValueConstraint.h @@ -10,6 +10,7 @@ #pragma once #include "FVElementalKernel.h" +#include "FVScalarLagrangeMultiplierConstraint.h" /** * This Kernel implements the residuals that enforce the constraint @@ -24,27 +25,16 @@ * * [0]: https://github.com/idaholab/large_media/blob/master/framework/scalar_constraint_kernel.pdf */ -class FVScalarLagrangeMultiplier : public FVElementalKernel +class FVIntegralValueConstraint : public FVScalarLagrangeMultiplierConstraint { public: static InputParameters validParams(); - FVScalarLagrangeMultiplier(const InputParameters & parameters); - - const MooseVariableScalar & lambdaVariable() const { return _lambda_var; } + FVIntegralValueConstraint(const InputParameters & parameters); private: - void computeResidual() override final; - void computeJacobian() override final; - void computeOffDiagJacobian() override final; ADReal computeQpResidual() override final; - /// The Lagrange Multiplier variable - const MooseVariableScalar & _lambda_var; - - /// The Lagrange Multiplier value - const ADVariableValue & _lambda; - /// The value that we want the average of the primal variable to be equal to const Real _phi0; }; diff --git a/framework/include/fvkernels/FVScalarLagrangeMultiplierConstraint.h b/framework/include/fvkernels/FVScalarLagrangeMultiplierConstraint.h new file mode 100644 index 000000000000..c7bb43b55000 --- /dev/null +++ b/framework/include/fvkernels/FVScalarLagrangeMultiplierConstraint.h @@ -0,0 +1,38 @@ +//* This file is part of the MOOSE framework +//* https://www.mooseframework.org +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#pragma once + +#include "FVElementalKernel.h" + +/** + * Base class for implementing constraints on finite volume variable elemental values using scalar + * Lagrange multipliers + */ +class FVScalarLagrangeMultiplierConstraint : public FVElementalKernel +{ +public: + static InputParameters validParams(); + + FVScalarLagrangeMultiplierConstraint(const InputParameters & parameters); + + const MooseVariableScalar & lambdaVariable() const { return _lambda_var; } + +private: + void computeResidual() override final; + void computeJacobian() override final; + void computeOffDiagJacobian() override final; + ADReal computeQpResidual() override; + + /// The Lagrange Multiplier variable + const MooseVariableScalar & _lambda_var; + + /// The Lagrange Multiplier value + const ADVariableValue & _lambda; +}; diff --git a/framework/src/fvkernels/FVIntegralValueConstraint.C b/framework/src/fvkernels/FVIntegralValueConstraint.C new file mode 100644 index 000000000000..a54a93ea843a --- /dev/null +++ b/framework/src/fvkernels/FVIntegralValueConstraint.C @@ -0,0 +1,42 @@ +//* This file is part of the MOOSE framework +//* https://www.mooseframework.org +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#include "FVIntegralValueConstraint.h" + +#include "MooseVariableScalar.h" +#include "MooseVariableFV.h" +#include "Assembly.h" + +registerMooseObject("MooseApp", FVIntegralValueConstraint); +registerMooseObjectRenamed("MooseApp", + FVScalarLagrangeMultiplier, + "06/30/2022 24:00", + FVIntegralValueConstraint); + +InputParameters +FVIntegralValueConstraint::validParams() +{ + InputParameters params = FVScalarLagrangeMultiplierConstraint::validParams(); + params.addClassDescription("This class is used to enforce integral of phi = volume * phi_0 " + "with a Lagrange multiplier approach."); + params.addParam("phi0", 0, "What we want the average value of the primal variable to be."); + return params; +} + +FVIntegralValueConstraint::FVIntegralValueConstraint(const InputParameters & parameters) + : FVScalarLagrangeMultiplierConstraint(parameters), + _phi0(getParam("phi0")) +{ +} + +ADReal +FVIntegralValueConstraint::computeQpResidual() +{ + return _u[_qp] - _phi0; +} diff --git a/framework/src/fvkernels/FVScalarLagrangeMultiplier.C b/framework/src/fvkernels/FVScalarLagrangeMultiplierConstraint.C similarity index 64% rename from framework/src/fvkernels/FVScalarLagrangeMultiplier.C rename to framework/src/fvkernels/FVScalarLagrangeMultiplierConstraint.C index 0df7e5afbaa6..6f2a4508e642 100644 --- a/framework/src/fvkernels/FVScalarLagrangeMultiplier.C +++ b/framework/src/fvkernels/FVScalarLagrangeMultiplierConstraint.C @@ -7,46 +7,41 @@ //* Licensed under LGPL 2.1, please see LICENSE for details //* https://www.gnu.org/licenses/lgpl-2.1.html -#include "FVScalarLagrangeMultiplier.h" +#include "FVScalarLagrangeMultiplierConstraint.h" #include "MooseVariableScalar.h" #include "MooseVariableFV.h" #include "Assembly.h" -registerMooseObject("MooseApp", FVScalarLagrangeMultiplier); - InputParameters -FVScalarLagrangeMultiplier::validParams() +FVScalarLagrangeMultiplierConstraint::validParams() { InputParameters params = FVElementalKernel::validParams(); - params.addClassDescription("This class is used to enforce integral of phi = volume * phi_0 " - "with a Lagrange multiplier approach."); + params.addClassDescription("Base class for imposing constraints using scalar Lagrange multipliers"); params.addRequiredCoupledVar("lambda", "Lagrange multiplier variable"); - params.addParam("phi0", 0, "What we want the average value of the primal variable to be."); return params; } -FVScalarLagrangeMultiplier::FVScalarLagrangeMultiplier(const InputParameters & parameters) +FVScalarLagrangeMultiplierConstraint::FVScalarLagrangeMultiplierConstraint(const InputParameters & parameters) : FVElementalKernel(parameters), _lambda_var(*getScalarVar("lambda", 0)), - _lambda(adCoupledScalarValue("lambda")), - _phi0(getParam("phi0")) + _lambda(adCoupledScalarValue("lambda")) { #ifndef MOOSE_GLOBAL_AD_INDEXING - mooseError("FVScalarLagrangeMultiplier is not supported by local AD indexing. In order to use " - "FVScalarLagrangeMultiplier, please run the configure script in the root MOOSE " + mooseError("FVScalarLagrangeMultiplierConstraint is not supported by local AD indexing. In order to use " + "FVScalarLagrangeMultiplierConstraint, please run the configure script in the root MOOSE " "directory with the configure option '--with-ad-indexing-type=global'"); #endif } ADReal -FVScalarLagrangeMultiplier::computeQpResidual() +FVScalarLagrangeMultiplierConstraint::computeQpResidual() { - mooseError("There is no need for me."); + mooseError("computeQpResidual is missing. Implement your constraint there"); } void -FVScalarLagrangeMultiplier::computeResidual() +FVScalarLagrangeMultiplierConstraint::computeResidual() { // Primal residual prepareVectorTag(_assembly, _var.number()); @@ -58,18 +53,18 @@ FVScalarLagrangeMultiplier::computeResidual() // LM residual. We may not have any actual ScalarKernels in our simulation so we need to manually // make sure the scalar residuals get cached for later addition - const auto lm_r = (MetaPhysicL::raw_value(_u[_qp]) - _phi0) * _assembly.elemVolume(); + const auto lm_r = MetaPhysicL::raw_value(computeQpResidual()) * _assembly.elemVolume(); mooseAssert(_lambda_var.dofIndices().size() == 1, "We should only have a single dof"); _assembly.processResidual(lm_r, _lambda_var.dofIndices()[0], _vector_tags); } void -FVScalarLagrangeMultiplier::computeJacobian() +FVScalarLagrangeMultiplierConstraint::computeJacobian() { } void -FVScalarLagrangeMultiplier::computeOffDiagJacobian() +FVScalarLagrangeMultiplierConstraint::computeOffDiagJacobian() { // Primal mooseAssert(_lambda.size() == 1 && _lambda_var.order() == 1, @@ -79,7 +74,7 @@ FVScalarLagrangeMultiplier::computeOffDiagJacobian() _assembly.processDerivatives(primal_r, _var.dofIndices()[0], _matrix_tags); // LM - const auto lm_r = (_u[_qp] - _phi0) * _assembly.elemVolume(); + const auto lm_r = computeQpResidual() * _assembly.elemVolume(); mooseAssert(_lambda_var.dofIndices().size() == 1, "We should only have one dof"); _assembly.processDerivatives(lm_r, _lambda_var.dofIndices()[0], _matrix_tags); } diff --git a/framework/src/systems/NonlinearSystemBase.C b/framework/src/systems/NonlinearSystemBase.C index ab2b780b9a56..c5d3840762c8 100644 --- a/framework/src/systems/NonlinearSystemBase.C +++ b/framework/src/systems/NonlinearSystemBase.C @@ -71,7 +71,7 @@ #include "ConsoleStream.h" #include "MooseError.h" #include "FVElementalKernel.h" -#include "FVScalarLagrangeMultiplier.h" +#include "FVScalarLagrangeMultiplierConstraint.h" #include "FVFluxKernel.h" #include "UserObject.h" #include "OffDiagonalScalingMatrix.h" @@ -3165,9 +3165,10 @@ NonlinearSystemBase::checkKernelCoverage(const std::set & mesh_subd kernel_variables.insert(fv_kernel->variable().name()); // Check for lagrange multiplier - if (dynamic_cast(fv_kernel)) + if (dynamic_cast(fv_kernel)) kernel_variables.insert( - dynamic_cast(fv_kernel)->lambdaVariable().name()); + dynamic_cast( + fv_kernel)->lambdaVariable().name()); } std::vector fv_flux_kernels; From a3f597302b150c08166fd17c285d824e6e44f8c4 Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Mon, 21 Mar 2022 16:36:13 -0600 Subject: [PATCH 30/71] Add a point value constraint for FV variables, refs #20607{ Fixup fixup --- .../fvkernels/FVIntegralValueConstraint.h | 1 - .../fvkernels/FVPointValueConstraint.h | 50 ++++++++++++++ .../src/fvkernels/FVPointValueConstraint.C | 66 +++++++++++++++++++ 3 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 framework/include/fvkernels/FVPointValueConstraint.h create mode 100644 framework/src/fvkernels/FVPointValueConstraint.C diff --git a/framework/include/fvkernels/FVIntegralValueConstraint.h b/framework/include/fvkernels/FVIntegralValueConstraint.h index a5a85c132793..603ce66f5b01 100644 --- a/framework/include/fvkernels/FVIntegralValueConstraint.h +++ b/framework/include/fvkernels/FVIntegralValueConstraint.h @@ -9,7 +9,6 @@ #pragma once -#include "FVElementalKernel.h" #include "FVScalarLagrangeMultiplierConstraint.h" /** diff --git a/framework/include/fvkernels/FVPointValueConstraint.h b/framework/include/fvkernels/FVPointValueConstraint.h new file mode 100644 index 000000000000..4caf7162f9eb --- /dev/null +++ b/framework/include/fvkernels/FVPointValueConstraint.h @@ -0,0 +1,50 @@ +//* This file is part of the MOOSE framework +//* https://www.mooseframework.org +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#pragma once + +#include "FVScalarLagrangeMultiplierConstraint.h" + +#include "libmesh/enum_point_locator_type.h" + +/** + * This Kernel implements the residuals that enforce the constraint + * + * \phi(element E containing point P) = phi_0 + * + * using a Lagrange multiplier approach. E.g. this kernel enforces the constraint that the + * elemental value of \phi, in the element containing P, matches \phi_0 + * + * In particular, this Kernel implements the residual contribution for + * the lambda term in Eq. (5), and both terms in Eq. (6) where \int \phi_0 = V_0 + * + * [0]: https://github.com/idaholab/large_media/blob/master/framework/scalar_constraint_kernel.pdf + */ +class FVPointValueConstraint : public FVScalarLagrangeMultiplierConstraint +{ +public: + static InputParameters validParams(); + + FVPointValueConstraint(const InputParameters & parameters); + +private: + ADReal computeQpResidual() override final; + + /// The value that we want the elemental value of the primal variable to be equal to + const Real _phi0; + + /// The point where the constraint should be enforced + const Point _point; + + /// We use a point locator in case the constraint is a point value + std::unique_ptr _point_locator; + + /// Pointer to the element in case we have a point constraint + const Elem * _my_elem; +}; diff --git a/framework/src/fvkernels/FVPointValueConstraint.C b/framework/src/fvkernels/FVPointValueConstraint.C new file mode 100644 index 000000000000..ab7f2810c031 --- /dev/null +++ b/framework/src/fvkernels/FVPointValueConstraint.C @@ -0,0 +1,66 @@ +//* This file is part of the MOOSE framework +//* https://www.mooseframework.org +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#include "FVPointValueConstraint.h" + +#include "MooseVariableScalar.h" +#include "MooseVariableFV.h" +#include "Assembly.h" + +registerMooseObject("MooseApp", FVPointValueConstraint); + +InputParameters +FVPointValueConstraint::validParams() +{ + InputParameters params = FVScalarLagrangeMultiplierConstraint::validParams(); + params.addClassDescription("This class is used to enforce integral of phi = volume * phi_0 " + "with a Lagrange multiplier approach."); + params.addRequiredParam("phi0", "What we want the average value of the primal variable to be."); + params.addRequiredParam( + "point", "The XYZ coordinates of the points where the value shall be enforced."); + return params; +} + +FVPointValueConstraint::FVPointValueConstraint(const InputParameters & parameters) + : FVScalarLagrangeMultiplierConstraint(parameters), + _phi0(getParam("phi0")), + _point(getParam("point")), + _my_elem(NULL) +{ + // Find the element containing the point + _point_locator = PointLocatorBase::build(TREE_LOCAL_ELEMENTS, _mesh); + _point_locator->enable_out_of_mesh_mode(); + + // We only check in the restricted blocks, if needed + const bool block_restricted = blockIDs().find(Moose::ANY_BLOCK_ID) == blockIDs().end(); + const Elem * elem = + block_restricted ? (*_point_locator)(_point, &blockIDs()) : (*_point_locator)(_point); + + // We communicate the results and if there is conflict between processes, + // the minimum cell ID is chosen + dof_id_type elem_id = elem ? elem->id() : DofObject::invalid_id; + dof_id_type min_elem_id = elem_id; + _mesh.comm().min(min_elem_id); + + if (min_elem_id == DofObject::invalid_id) + mooseError("The specified point for the FVPointValueConstraint is not in the " + "domain! Try alleviating block restrictions or " + "using another point!"); + + _my_elem = min_elem_id == elem_id ? elem : NULL; +} + +ADReal +FVPointValueConstraint::computeQpResidual() +{ + if (_current_elem == _my_elem) + return _u[_qp] - _phi0; + else + return 0; +} From 57ee6bac64d619e1c6eea00bb8e7e47962188550 Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Mon, 21 Mar 2022 17:27:52 -0600 Subject: [PATCH 31/71] Add a kernel that creates bound on FV variable values, refs #20607 --- .../fvkernels/FVBoundedValueConstraint.h | 49 +++++++++++++++++++ .../src/fvkernels/FVBoundedValueConstraint.C | 46 +++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 framework/include/fvkernels/FVBoundedValueConstraint.h create mode 100644 framework/src/fvkernels/FVBoundedValueConstraint.C diff --git a/framework/include/fvkernels/FVBoundedValueConstraint.h b/framework/include/fvkernels/FVBoundedValueConstraint.h new file mode 100644 index 000000000000..609e3353f12e --- /dev/null +++ b/framework/include/fvkernels/FVBoundedValueConstraint.h @@ -0,0 +1,49 @@ +//* This file is part of the MOOSE framework +//* https://www.mooseframework.org +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#pragma once + +#include "FVScalarLagrangeMultiplierConstraint.h" + +/// What type of extreme value we are going to compute +enum BoundType +{ + MAX, + MIN +}; + +/** + * This Kernel implements the residuals that enforce the constraint + * + * \phi =< \phi_0 or \phi >= \phi_0 + * + * using a Lagrange multiplier approach. E.g. this kernel enforces the constraint that the + * elemental value of \phi is always either larger or smaller than phi_0 + * + * In particular, this Kernel implements the residual contribution for + * the lambda term in Eq. (5), and both terms in Eq. (6) where \int \phi_0 = V_0 + * + * [0]: https://github.com/idaholab/large_media/blob/master/framework/scalar_constraint_kernel.pdf + */ +class FVBoundedValueConstraint : public FVScalarLagrangeMultiplierConstraint +{ +public: + static InputParameters validParams(); + + FVBoundedValueConstraint(const InputParameters & parameters); + +private: + ADReal computeQpResidual() override final; + + /// The value that we want the elemental value of the primal variable to be equal to + const Real _phi0; + + /// What type of bound (min or max) this kernel intends to apply + const MooseEnum _bound_type; +}; diff --git a/framework/src/fvkernels/FVBoundedValueConstraint.C b/framework/src/fvkernels/FVBoundedValueConstraint.C new file mode 100644 index 000000000000..7a0d5392c307 --- /dev/null +++ b/framework/src/fvkernels/FVBoundedValueConstraint.C @@ -0,0 +1,46 @@ +//* This file is part of the MOOSE framework +//* https://www.mooseframework.org +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#include "FVBoundedValueConstraint.h" + +#include "MooseVariableScalar.h" +#include "MooseVariableFV.h" +#include "Assembly.h" + +registerMooseObject("MooseApp", FVBoundedValueConstraint); + +InputParameters +FVBoundedValueConstraint::validParams() +{ + InputParameters params = FVScalarLagrangeMultiplierConstraint::validParams(); + params.addClassDescription("This class is used to enforce a min or max value for a finite volume variable"); + params.addRequiredParam("phi0", "The min or max bound"); + // Define the min/max enumeration + MooseEnum type_options("max=0 min=1"); + params.addRequiredParam("bound_type", type_options, "Whether a minimum or a maximum bound"); + return params; +} + +FVBoundedValueConstraint::FVBoundedValueConstraint(const InputParameters & parameters) + : FVScalarLagrangeMultiplierConstraint(parameters), + _phi0(getParam("phi0")), + _bound_type(getParam("bound_type")) +{ +} + +ADReal +FVBoundedValueConstraint::computeQpResidual() +{ + if (_bound_type == BoundType::MAX && _u[_qp] > _phi0) + return _u[_qp] - _phi0; + else if (_bound_type == BoundType::MIN && _u[_qp] < _phi0) + return _phi0 - _u[_qp]; + else + return 0; +} From a79d214b5c8faf8ec08426e071421b0ca7955bfe Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Mon, 21 Mar 2022 22:25:12 -0600 Subject: [PATCH 32/71] Add tests for FV constraints, refs #20607 --- .../fvkernels/constraints/bounded_value.i | 73 ++++++++++++++++++ .../constraints/gold/bounded_value_out.e | Bin 0 -> 35184 bytes .../fvkernels/constraints/gold/integral_out.e | Bin 0 -> 30192 bytes .../constraints/gold/point_value_out.e | Bin 0 -> 30276 bytes test/tests/fvkernels/constraints/integral.i | 56 ++++++++++++++ .../tests/fvkernels/constraints/point_value.i | 57 ++++++++++++++ test/tests/fvkernels/constraints/tests | 30 +++++++ 7 files changed, 216 insertions(+) create mode 100644 test/tests/fvkernels/constraints/bounded_value.i create mode 100644 test/tests/fvkernels/constraints/gold/bounded_value_out.e create mode 100644 test/tests/fvkernels/constraints/gold/integral_out.e create mode 100644 test/tests/fvkernels/constraints/gold/point_value_out.e create mode 100644 test/tests/fvkernels/constraints/integral.i create mode 100644 test/tests/fvkernels/constraints/point_value.i create mode 100644 test/tests/fvkernels/constraints/tests diff --git a/test/tests/fvkernels/constraints/bounded_value.i b/test/tests/fvkernels/constraints/bounded_value.i new file mode 100644 index 000000000000..9eaae7fba5d0 --- /dev/null +++ b/test/tests/fvkernels/constraints/bounded_value.i @@ -0,0 +1,73 @@ +[Mesh] + type = GeneratedMesh + dim = 1 + nx = 4 +[] + +[Variables] + [v] + type = MooseVariableFVReal + # breaks the constraint + initial_condition = -1 + [] + [lambda] + type = MooseVariableScalar + [] +[] + +[FVKernels] + [time] + type = FVTimeKernel + variable = v + [] + [diff] + type = FVDiffusion + variable = v + coeff = coeff + [] + [average] + type = FVBoundedValueConstraint + variable = v + phi0 = 0 + lambda = lambda + bound_type = 'min' + [] +[] + +[FVBCs] + [left] + type = FVDirichletBC + variable = v + boundary = left + value = 7 + [] + [right] + type = FVDirichletBC + variable = v + boundary = right + value = 0 + [] +[] + +[Materials] + [diff] + type = ADGenericFunctorMaterial + prop_names = 'coeff' + prop_values = '1' + [] +[] + +[Executioner] + type = Transient + solve_type = 'PJFNK' + petsc_options_iname = '-pc_type -pc_factor_shift_type' + petsc_options_value = 'lu NONZERO' + + num_steps = 2 + dt = 0.001 + nl_abs_tol = 1e-12 +[] + +[Outputs] + exodus = true +[] diff --git a/test/tests/fvkernels/constraints/gold/bounded_value_out.e b/test/tests/fvkernels/constraints/gold/bounded_value_out.e new file mode 100644 index 0000000000000000000000000000000000000000..b29a5d9edc0f130d2cc853b66582a8bb345dec62 GIT binary patch literal 35184 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 literal 0 HcmV?d00001 diff --git a/test/tests/fvkernels/constraints/gold/point_value_out.e b/test/tests/fvkernels/constraints/gold/point_value_out.e new file mode 100644 index 0000000000000000000000000000000000000000..0efc8e5641050e6b6127073ad1debdbfb73e4534 GIT binary patch literal 30276 zcmeHQ&6C{5bsxo+yt}6SA^YHqU7g5Pl45baT#_=y%9Oa~?$R4CKfrQ;< zRK|%Pg}7Ah^vbP&-|F&t#r^LLg2+w5J!ca6Vd|VkaUXShMqaR8Ny7$yn*%>Ud+7&- zXR6L9_}(=z)lH{tW>XHQomW#o4G4zBHhV+A=F|`}Hz0Z{Y zIr45M%kN|VG^zN$f5OcTb(%xvFm~Bii|xa*)UimLf54v&FA78HrIbt7 znf-yZ8s2Rx-H~2Q3jOW1gZ(=PO2cSc1o9(osd6g+{QId#Oyc{$p)a=H#c@OBPjX%N zy2*$m^YVwZ^>_HQv7i^L^4?6aMcjSdG`Mwnf5N=FeRF!hZa{G?;vN_B z8r-bjszfm_dHp&CLm3~Vl{G)Unc=EJ_(L9jUterJ!ttBXdP!dHitLe*NJ^LBNPe2c zej@b6^!GSkQf&mg;G}L3*DOPs=Q~X*(#hU=Nzpko9xU?)e#~bQ?-?5Z1?QI(jq_!w zTUpK|(#Cfqohmt^EplS%K`WU4_$@r7Je!2~Jl)q9TmOcmdB)@7dGT5m`QX3Qq4U9i zXGivEq!0d2A78}ZKn~KC?~VQ8XmyTG8yG8TXzw9;LRq0KP=2V}%sq48JX?Hj?lV7s ze9kgFfAti9)<~}e?zq=?SLb}QB&{w{^Yl$|JC<%L`=WOt?%uzDavW!-+3dQcu?(XHCtCx2(g}d;cW50J-CL>du8RSB~wJ#qWJUa1~;e@!ledYRgIT0(t zPmT{BvZm-?r2 z*6ZfZy5j9Ha{6-MPJ{HF`nMC%PklFV25~fY)FhL$J30sya914fJvuny@M*1728dD9 zjL5Dyy7zeRIGeiFV+!F0L3HMXatO_JDxH5mleFxKf$R#q4lRT?O;S|07ewCE9LB&2 zVc&)sAckMi$1@;vW)H~0Ce(wY5Dm=i*cE#pKDuAub|!}q6+i~k9#Bm$s!{C$Ic+lJ zlpMR_&fbS7C#FWV$JV=E?Hg?~Jkcr}##qL!=n3?cX&S+^fQdlZN3V`T_>~H6Y2Q=Y z*EY%h-ba{1??H*d(k&)?3TwsYB$aMo`#;v;5Zci5~?Z)27QFaF0 z)-xRk!zq$SheT~6h0B0J8U>kzH)+E#jiUhWhGB_G0b#a=J~L8oFL7pc%{n03P+q>i zwp@2|Gdj@&g&9)wDr>tOOVm1Vxf!maaOXxXGfV~{`aX1F>P#l^6T#m-gVJXf-B@7~ zFyRn;PA%lZ9Y*ok@kY{nx|UP}at4^Gh3CM^D3qa^11wh6T-*1Qq6RFH9ec5v0}O^y z?5Cr#p^w@|w}s(i-BE}lAk>Qomo7MwcN%*x7XfJm{MlfWbUt4jj`4M?Rlt(&V&78& zr-Zjfrr0WnK$*{lip~MP`R%Z%wB9bCkkKS7fuOI;8CR z9H29Cy{GPQPUAqZ@wL-i6OPJ(vUfhf=g8@#4<}fGICa_;*LL5(_WpZ6+I@emdINAU z=sVRTrmi@ftW6#=3ZVx{VHC14;TxY|@Gyz;0R)(0!D9ue1+nj+R+@kxSQ)8M19CoF zhG?%GGQcteMXo40w571Bx(4tES8RF;C{${Yqs&|j5=y5=RaRr+X@~*aa#CEj;4{Q# zwRY$Viw4wk7~u0qpu!qj<8p~!&FikUjm=PmU-^cy-!E%Gzyi>w=XEfn9}Ezq;SQsa zAGKgq)Z{N8z}s^f!2lSvSI|caZT&V%-8pbwW2RRE`<#HNGW^;(M^qcWb$Q}x{l=34 z2Ke|UoQ(WIs_wou-^4;IWJBTd7_lqf3Z~-T{d>PWczA!I@H~{h0-&DVRoPN|<&Xhp zWA~+@c7rz56qbyWR8!iEO-5nKI4J|P73>VKs{7e@Js`Q~YT}-WL{Vs(bUg)#i6Z=( zK1bUN!fih_Q^S7eG;uz1^Eo(%5cqJ@kSPF6-8j|$+@71v^%GXvcJgQ@-orSWayGS4 zaeFyTp869BErJCeH*5+8zxW<6Zs)_tKfax`;&3)ruVpWB zY4>@an?gL<{vl&M+Nw3hV`Zi7dkO$oxyJ3sheA}UE|T9BhmZID*!M<(On-d4ws~2m z7fr*y8(;8zDRo6{G|k*g2tcQ4rH_*oLQ>}nt-2r}{Bx7Q_0-3+1*^;|+m2v`Sm{n{ z!W4N9oe19uBDT+$e7lV(RDh@Ob7HK!=qzpm=#OEiJj8I6r6yIbsH}$XisS;5a}{g8 zio50+OVPp`PWK&rtR59ewbj@xTIwA(m|gKB^YXQh8c+|A4948CE7pv;%3h}c%lWHu zy8<2f{qnqUkB8=KnhIr{`!s`80#-R+_w0vte_j=isk#aE{f!nYZ)=)M+2S(}v zmqk40=bPJbBS3lLvZ_T{Wfj%Ild{xAAJ!VFOt7kmn!8V;zJNAmIEoT{Y;`Zn;$xcF zl-7-u{^(mKGq{Jb%^K0KGe#4pb*ncS`8yT#k-{riXYa2+Ban(FtwMzF>+SP*FW!Cj zPWNqn@QtY>Dn ziq2*uhcA?&uNN%K9LnnT{lTCWlZTg+lb-{tw~r>7nstOVZOSUQZuPRco-Y|KqQ58c zJvue%%kzL?1m`5b)i($9A~_fsiWZMu%q{V_rsZajS^lM=pN}+ZGFZ~z6^x?*4qis3 zn@GPV3btnCuvT#oL zPY`v#e@7yo-1iOr?PK(6VC-iIOIy93KB{?-y&Y z)?lq#x63-7MQyYo;}io~zQv>_W1E!$GRg#TdMt#0G%b*X0T# zp98R*NP9pvZiuH?QKD8q20nb+YT2yX=Y*FK9h*p9#a_hP%zPtx`|-q{!eu}R;~>zh z)|vpW3`%IyQxdf}v1(zfRr_geqXNnLSTL*N$YP1GIc#~wm@;=jM|3O)+?HWo#vn|K zk!d+f-iHlm)&(MUOf_*BY(q6<=Pno2#k$mrzxe(g`V7)CRWp>CqdkRsg*7%Ln2vjx zJS;}2+3Ule?Chv-aVoo61LV9yi} z3&7*Z$Ldof(U4}nqKytUd*v`wU%9^0>MPe~R_$0b?IBZaqfD{qV1Wlqr}j)yn>JO) zLD{$A%6U{1IUKrE>~t1HJvW7)oht<9s%!u1 ze(cAG(m7ROKNL}$D^!Oq*;D96K~&hAYK}ZrWm`kfF*deEUIa4N_9h_vv`{r#YEb3m z)KF7)vaNIIehT(J)MDzX4kcXo^Q%2aXy#TOyYG38now|q% zmNC9nERvR8+jIG&r1ayK!MAV2)+auhm)IYu1&EZMdA+PXg~=#7GxaMu+V>P#c@@~^jNtZwH{gP88v`RsIajq#m24{jE(btkh?HX1$nKEyrkw zL~?TAj{TtEOqvr*Zh?E};oiMFYeogJ@XFDReP1S^-li9-Rd4NCB+*`d0kG}m#?_m_ zf>bQ#J$ktQF2WtwF5kBmXD(kgxs|pel)EF~gM7y_4;C zPA&t)t_h~+KrH_Ts7cH;&P=W4!6b%kN@`oVZuDI_bM zoVF%_6t4V;)TGLTRkOz?6xM{g*#_`rOSZ8CEUUki>?v$HOslGoH@>fo)M-2RNfE&| zdugQRC8tSG`Ft6v!^aP$8?2C0HrPuewJ0|B>dSNCdUiaC=ni;C`u?1`Y9fak5IfY# zQb60UX0UpSLIt=SuWPShX+~e#<)Yv;;j&_f@=H$Os7gmsF}R~EvfUn5^xxtm5>sR7 zZT;BTMRL`qk4*-g=~;yTvIxOxg*AW^>?)?#05)ku6|4IfJ92pOGkWuXu-*EbPd@qN oKmPdtxBgZM%^SD2as8iHe|u}^Cq_v?p$0^2@;0RR91 literal 0 HcmV?d00001 diff --git a/test/tests/fvkernels/constraints/integral.i b/test/tests/fvkernels/constraints/integral.i new file mode 100644 index 000000000000..a48f5bf640b6 --- /dev/null +++ b/test/tests/fvkernels/constraints/integral.i @@ -0,0 +1,56 @@ +[Mesh] + type = GeneratedMesh + dim = 1 + nx = 4 +[] + +[Variables] + [v] + type = MooseVariableFVReal + [] + [lambda] + type = MooseVariableScalar + [] +[] + +[FVKernels] + [diff] + type = FVDiffusion + variable = v + coeff = coeff + [] + [average] + type = FVIntegralValueConstraint + variable = v + phi0 = 13 + lambda = lambda + [] +[] + +[FVBCs] + [left] + type = FVDirichletBC + variable = v + boundary = left + value = 7 + [] +[] + +[Materials] + [diff] + type = ADGenericFunctorMaterial + prop_names = 'coeff' + prop_values = '1' + [] +[] + +[Executioner] + type = Steady + solve_type = 'PJFNK' + petsc_options_iname = '-pc_type -pc_factor_shift_type' + petsc_options_value = 'lu NONZERO' +[] + +[Outputs] + exodus = true +[] diff --git a/test/tests/fvkernels/constraints/point_value.i b/test/tests/fvkernels/constraints/point_value.i new file mode 100644 index 000000000000..9497fd0ff085 --- /dev/null +++ b/test/tests/fvkernels/constraints/point_value.i @@ -0,0 +1,57 @@ +[Mesh] + type = GeneratedMesh + dim = 1 + nx = 4 +[] + +[Variables] + [v] + type = MooseVariableFVReal + [] + [lambda] + type = MooseVariableScalar + [] +[] + +[FVKernels] + [diff] + type = FVDiffusion + variable = v + coeff = coeff + [] + [average] + type = FVPointValueConstraint + variable = v + phi0 = 13 + lambda = lambda + point = '0.3 0 0' + [] +[] + +[FVBCs] + [left] + type = FVDirichletBC + variable = v + boundary = left + value = 7 + [] +[] + +[Materials] + [diff] + type = ADGenericFunctorMaterial + prop_names = 'coeff' + prop_values = '1' + [] +[] + +[Executioner] + type = Steady + solve_type = 'PJFNK' + petsc_options_iname = '-pc_type -pc_factor_shift_type' + petsc_options_value = 'lu NONZERO' +[] + +[Outputs] + exodus = true +[] diff --git a/test/tests/fvkernels/constraints/tests b/test/tests/fvkernels/constraints/tests new file mode 100644 index 000000000000..538b1a1ec37e --- /dev/null +++ b/test/tests/fvkernels/constraints/tests @@ -0,0 +1,30 @@ +[Tests] + issues = '#20607' + + [integral] + type = Exodiff + input = integral.i + exodiff = 'integral_out.e' + + requirement = 'The system shall be able to impose a constraint on the domain integral of a variable.' + design = 'FVIntegralValueConstraint.md' + ad_indexing_type = 'global' + [] + [point_value] + type = Exodiff + input = 'point_value.i' + exodiff = 'point_value_out.e' + + requirement = 'The system shall be able to impose a constraint on a single point value of a variable.' + ad_indexing_type = 'global' + [] + [bound] + type = Exodiff + input = 'bounded_value.i' + exodiff = 'bounded_value_out.e' + + requirement = 'The system shall be able to impose bounds for the values of of a variable.' + design = 'FVBoundedValueConstraint.md' + ad_indexing_type = 'global' + [] +[] From bfcb1f263c41434a7791d1d997194c735f872e60 Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Mon, 21 Mar 2022 22:37:28 -0600 Subject: [PATCH 33/71] Add documentation to all FV constraints, refs #20607 --- .../fvkernels/FVBoundedValueConstraint.md | 32 ++++++++++++++++++ .../fvkernels/FVIntegralValueConstraint.md | 33 +++++++++++++++++++ .../fvkernels/FVPointValueConstraint.md | 27 +++++++++++++++ .../fvkernels/FVScalarLagrangeMultiplier.md | 22 ------------- .../FVScalarLagrangeMultiplierConstraint.md | 13 ++++++++ 5 files changed, 105 insertions(+), 22 deletions(-) create mode 100644 framework/doc/content/source/fvkernels/FVBoundedValueConstraint.md create mode 100644 framework/doc/content/source/fvkernels/FVIntegralValueConstraint.md create mode 100644 framework/doc/content/source/fvkernels/FVPointValueConstraint.md delete mode 100644 framework/doc/content/source/fvkernels/FVScalarLagrangeMultiplier.md create mode 100644 framework/doc/content/source/fvkernels/FVScalarLagrangeMultiplierConstraint.md diff --git a/framework/doc/content/source/fvkernels/FVBoundedValueConstraint.md b/framework/doc/content/source/fvkernels/FVBoundedValueConstraint.md new file mode 100644 index 000000000000..251461975669 --- /dev/null +++ b/framework/doc/content/source/fvkernels/FVBoundedValueConstraint.md @@ -0,0 +1,32 @@ +# FVBoundedValueConstraint + +This object implements the residuals that enforce the constraint + +!equation +\phi (point P) > \phi_0 + +or + +!equation +\phi (point P) < \phi_0 + +using a Lagrange multiplier approach. E.g. this object enforces the constraint +that the value of $\phi$ in the domain has to be above or below a certain value. + +!alert warning +The contribution to the diagonal of the system of this kernel is null, which introduces a saddle +point. Make sure to use a `NONZERO` shift in your preconditioner. + +## Example input syntax + +In this example, the value of the variable `v` is forced to be positive using a `FVBoundedValueConstraint`. +This accelerates the convergence to the solution, as the initial condition is negative and the solution +is everywhere positive. + +!listing test/tests/fvkernels/constraints/point_value.i block=Variables FVKernels + +!syntax parameters /FVKernels/FVBoundedValueConstraint + +!syntax inputs /FVKernels/FVBoundedValueConstraint + +!syntax children /FVKernels/FVBoundedValueConstraint diff --git a/framework/doc/content/source/fvkernels/FVIntegralValueConstraint.md b/framework/doc/content/source/fvkernels/FVIntegralValueConstraint.md new file mode 100644 index 000000000000..ee2255e990a8 --- /dev/null +++ b/framework/doc/content/source/fvkernels/FVIntegralValueConstraint.md @@ -0,0 +1,33 @@ +# FVIntegralValueConstraint + +This object implements the residuals that enforce the constraint + +!equation +\int_{\Omega} \phi = \int \phi_0 + +using a Lagrange multiplier approach. E.g. this object enforces the constraint +that the average value of $\phi$ match $\phi_0$. + +The detailed description of the derivation for the corresponding finite element +constraint can be found at +[scalar_constraint_kernel](https://github.com/idaholab/large_media/blob/master/framework/scalar_constraint_kernel.pdf). The +finite volume version can be obtained by simply substituting $1$ for +$\varphi$. Note that $\int \phi_0 = V_0$. + +!alert warning +The contribution to the diagonal of the system of this kernel is null, which introduces a saddle +point. Make sure to use a `NONZERO` shift in your preconditioner. + +## Example input syntax + +In this example, the average value of the variable `v` is set using a `FVIntegralValueConstraint`. +In combination with a single Dirichlet boundary condition, this makes the numerical problem accept a +single numerical solution, and be well-posed. + +!listing test/tests/fvkernels/constraints/integral.i block=Variables FVKernels + +!syntax parameters /FVKernels/FVIntegralValueConstraint + +!syntax inputs /FVKernels/FVIntegralValueConstraint + +!syntax children /FVKernels/FVIntegralValueConstraint diff --git a/framework/doc/content/source/fvkernels/FVPointValueConstraint.md b/framework/doc/content/source/fvkernels/FVPointValueConstraint.md new file mode 100644 index 000000000000..bc9a1a995ec4 --- /dev/null +++ b/framework/doc/content/source/fvkernels/FVPointValueConstraint.md @@ -0,0 +1,27 @@ +# FVPointValueConstraint + +This object implements the residuals that enforce the constraint + +!equation +\phi (point P) = \phi_0 + +using a Lagrange multiplier approach. E.g. this object enforces the constraint +that the value of $\phi$ in the element containing point $P$ match $\phi_0$. + +!alert warning +The contribution to the diagonal of the system of this kernel is null, which introduces a saddle +point. Make sure to use a `NONZERO` shift in your preconditioner. + +## Example input syntax + +In this example, the value of the variable `v` at `0.2 0 0` is set using a `FVPointValueConstraint`. +In combination with a single Dirichlet boundary condition, this makes the numerical problem accept a +single numerical solution, and be well-posed. + +!listing test/tests/fvkernels/constraints/point_value.i block=Variables FVKernels + +!syntax parameters /FVKernels/FVPointValueConstraint + +!syntax inputs /FVKernels/FVPointValueConstraint + +!syntax children /FVKernels/FVPointValueConstraint diff --git a/framework/doc/content/source/fvkernels/FVScalarLagrangeMultiplier.md b/framework/doc/content/source/fvkernels/FVScalarLagrangeMultiplier.md deleted file mode 100644 index ca73831a1ec1..000000000000 --- a/framework/doc/content/source/fvkernels/FVScalarLagrangeMultiplier.md +++ /dev/null @@ -1,22 +0,0 @@ -# FVScalarLagrangeMultiplier - -This object implements the residuals that enforce the constraint - -\begin{equation} - \int_{\Omega} \phi = \int \phi_0 -\end{equation} - -using a Lagrange multiplier approach. E.g. this object enforces the constraint -that the average value of $\phi$ match $\phi_0$. - -The detailed description of the derivation for the corresponding finite element -constraint can be found at -[scalar_constraint_kernel](https://github.com/idaholab/large_media/blob/master/framework/scalar_constraint_kernel.pdf). The -finite volume version can be obtained by simply substituting $1$ for -$\varphi$. Note that $\int \phi_0 = V_0$. - -!syntax parameters /FVKernels/FVScalarLagrangeMultiplier - -!syntax inputs /FVKernels/FVScalarLagrangeMultiplier - -!syntax children /FVKernels/FVScalarLagrangeMultiplier diff --git a/framework/doc/content/source/fvkernels/FVScalarLagrangeMultiplierConstraint.md b/framework/doc/content/source/fvkernels/FVScalarLagrangeMultiplierConstraint.md new file mode 100644 index 000000000000..3f4b4c21d207 --- /dev/null +++ b/framework/doc/content/source/fvkernels/FVScalarLagrangeMultiplierConstraint.md @@ -0,0 +1,13 @@ +# FVScalarLagrangeMultiplierConstraint + +This object is a base class for implementing variable value constraints using Lagrange multipliers. + +The detailed description of the derivation for the corresponding finite element +constraint can be found at +[scalar_constraint_kernel](https://github.com/idaholab/large_media/blob/master/framework/scalar_constraint_kernel.pdf). The +finite volume version can be obtained by simply substituting $1$ for +$\varphi$. + +!alert warning +The contribution to the diagonal of the system of this kernel is null, which introduces a saddle +point. Make sure to use a `NONZERO` shift in your preconditioner. From c98e3dd54586e9557bf5a42296f89dd6e633caad Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Mon, 21 Mar 2022 13:26:23 -0600 Subject: [PATCH 34/71] Add face gradients to functor material properties using Green Gauss, closes #20604 Adapt unit test to use official utils implementation --- framework/include/utils/GreenGaussGradient.h | 77 +++++++++++++++++++ .../utils/PiecewiseByBlockLambdaFunctor.h | 9 +++ unit/src/MooseFunctorTest.C | 20 +---- 3 files changed, 87 insertions(+), 19 deletions(-) diff --git a/framework/include/utils/GreenGaussGradient.h b/framework/include/utils/GreenGaussGradient.h index a4a849b62b96..10e1d63ab1bc 100644 --- a/framework/include/utils/GreenGaussGradient.h +++ b/framework/include/utils/GreenGaussGradient.h @@ -250,6 +250,62 @@ greenGaussGradient(const ElemArg & elem_arg, } } +/** + * Compute a face gradient from Green-Gauss cell gradients, with orthogonality correction + * On the boundaries, the boundary element value is used + * @param face_arg A face argument specifying the current faceand whether to perform skew + * corrections + * @param functor The functor that will provide information such as cell and face value evaluations + * necessary to construct the cell gradient + * @param two_term_boundary_expansion Whether to perform a two-term expansion to compute + * extrapolated boundary face values. If this is true, then an implicit system has to be solved. If + * false, then the cell center value will be used as the extrapolated boundary face value + * @param mesh The mesh on which we are computing the gradient + * @param face_to_value_cache An optional parameter. If provided, we will add face to + * face-evaluations computed in this function to the map + * @return The computed cell gradient + */ +template +VectorValue +greenGaussGradient(const FaceArg & face_arg, + const FunctorBase & functor, + const bool two_term_boundary_expansion, + const MooseMesh & mesh, + std::unordered_map * const face_to_value_cache = nullptr) +{ + mooseAssert(face_arg.fi, "We should have a face info to compute a face gradient"); + const auto & fi = *(face_arg.fi); + const auto & elem_arg = face_arg.makeElem(); + const auto & neighbor_arg = face_arg.makeNeighbor(); + + if (!functor.isExtrapolatedBoundaryFace(fi)) + { + // Compute the gradients in the two cells on both sides of the face + const auto & grad_elem = greenGaussGradient( + elem_arg, functor, two_term_boundary_expansion, mesh, face_to_value_cache); + const auto & grad_neighbor = greenGaussGradient( + neighbor_arg, functor, two_term_boundary_expansion, mesh, face_to_value_cache); + + VectorValue face_gradient; + Moose::FV::interpolate( + Moose::FV::InterpMethod::Average, face_gradient, grad_elem, grad_neighbor, fi, true); + + // Perform orthogonality correction + const auto & value_elem = functor(elem_arg); + const auto & value_neighbor = functor(neighbor_arg); + + face_gradient += outer_product( + fi.eCF(), (value_neighbor - value_elem) / fi.dCFMag() - face_gradient * fi.eCF()); + return face_gradient; + } + + // One term expansion + if (!fi.neighborPtr()) + return functor.gradient(elem_arg); + else + return functor.gradient(neighbor_arg); +} + template TensorValue greenGaussGradient(const ElemArg & elem_arg, @@ -270,5 +326,26 @@ greenGaussGradient(const ElemArg & elem_arg, return ret; } + +template +TensorValue +greenGaussGradient(const FaceArg & face_arg, + const Moose::FunctorBase> & functor, + const bool two_term_boundary_expansion, + const MooseMesh & mesh, + std::unordered_map * const face_to_value_cache = nullptr) +{ + TensorValue ret; + for (const auto i : make_range(unsigned(LIBMESH_DIM))) + { + VectorComponentFunctor scalar_functor(functor, i); + const auto row_gradient = greenGaussGradient( + face_arg, scalar_functor, two_term_boundary_expansion, mesh, face_to_value_cache); + for (const auto j : make_range(unsigned(LIBMESH_DIM))) + ret(i, j) = row_gradient(j); + } + + return ret; +} } } diff --git a/framework/include/utils/PiecewiseByBlockLambdaFunctor.h b/framework/include/utils/PiecewiseByBlockLambdaFunctor.h index 0a0d1958635f..dafe93ccd9d8 100644 --- a/framework/include/utils/PiecewiseByBlockLambdaFunctor.h +++ b/framework/include/utils/PiecewiseByBlockLambdaFunctor.h @@ -77,6 +77,7 @@ class PiecewiseByBlockLambdaFunctor : public Moose::FunctorBase using Moose::FunctorBase::evaluateGradient; GradientType evaluateGradient(const Moose::ElemArg & elem_arg, unsigned int) const override; + GradientType evaluateGradient(const Moose::FaceArg & face_arg, unsigned int) const override; private: /** @@ -295,3 +296,11 @@ PiecewiseByBlockLambdaFunctor::evaluateGradient(const Moose::ElemArg & elem_a { return Moose::FV::greenGaussGradient(elem_arg, *this, true, _mesh); } + +template +typename PiecewiseByBlockLambdaFunctor::GradientType +PiecewiseByBlockLambdaFunctor::evaluateGradient(const Moose::FaceArg & face_arg, + unsigned int) const +{ + return Moose::FV::greenGaussGradient(face_arg, *this, true, _mesh); +} diff --git a/unit/src/MooseFunctorTest.C b/unit/src/MooseFunctorTest.C index e59eee96b56e..940771be72a0 100644 --- a/unit/src/MooseFunctorTest.C +++ b/unit/src/MooseFunctorTest.C @@ -60,25 +60,7 @@ private: GradientType evaluateGradient(const FaceArg & face, unsigned int) const override final { - const auto & fi = *face.fi; - if (!isExtrapolatedBoundaryFace(fi)) - { - const auto elem_arg = face.makeElem(); - const auto elem_gradient = this->gradient(elem_arg); - const auto neighbor_arg = face.makeNeighbor(); - const auto linear_interp_gradient = - fi.gC() * elem_gradient + (1 - fi.gC()) * this->gradient(neighbor_arg); - return linear_interp_gradient + - outer_product(((*this)(neighbor_arg) - (*this)(elem_arg)) / fi.dCFMag() - - linear_interp_gradient * fi.eCF(), - fi.eCF()); - } - - // One term expansion - if (!fi.neighborPtr()) - return this->gradient(face.makeElem()); - else - return this->gradient(face.makeNeighbor()); + return greenGaussGradient(face, *this, true, _mesh); } const MooseMesh & _mesh; From fe3576bacf56d99f93e00f428c591a309851954a Mon Sep 17 00:00:00 2001 From: hansje Date: Tue, 22 Mar 2022 13:34:31 -0500 Subject: [PATCH 35/71] Checked if property exists in Sampler1DReal Closes #20612 --- .../src/vectorpostprocessors/Sampler1DReal.C | 4 ++++ .../vectorpostprocessors/sampler_1d_real/tests | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/modules/thermal_hydraulics/src/vectorpostprocessors/Sampler1DReal.C b/modules/thermal_hydraulics/src/vectorpostprocessors/Sampler1DReal.C index fee4f287d153..88c56193fa91 100644 --- a/modules/thermal_hydraulics/src/vectorpostprocessors/Sampler1DReal.C +++ b/modules/thermal_hydraulics/src/vectorpostprocessors/Sampler1DReal.C @@ -45,8 +45,12 @@ Sampler1DRealTempl::Sampler1DRealTempl(const InputParameters & parameters { std::vector material_property_names = getParam>("property"); for (unsigned int i = 0; i < material_property_names.size(); ++i) + { + if (!hasGenericMaterialProperty(material_property_names[i])) + mooseError("The material property '" + material_property_names[i] + "' does not exist."); _material_properties.push_back( &getGenericMaterialProperty(material_property_names[i])); + } SamplerBase::setupVariables(material_property_names); } diff --git a/modules/thermal_hydraulics/test/tests/vectorpostprocessors/sampler_1d_real/tests b/modules/thermal_hydraulics/test/tests/vectorpostprocessors/sampler_1d_real/tests index ea335cfb91b9..1cfe46c28f90 100644 --- a/modules/thermal_hydraulics/test/tests/vectorpostprocessors/sampler_1d_real/tests +++ b/modules/thermal_hydraulics/test/tests/vectorpostprocessors/sampler_1d_real/tests @@ -1,13 +1,28 @@ [Tests] + design = 'Sampler1DReal.md' + issues = '#19819 #20612' + [non_ad] type = 'CSVDiff' input = 'sampler_1d_real.i' csvdiff = 'out_test_property_vpp_0001.csv' + + requirement = 'The system shall provide a vector post-processor to sample regular material properties in one or more blocks.' [] [ad] type = 'CSVDiff' input = 'ad_sampler_1d_real.i' csvdiff = 'ad_sampler_1d_real_out_test_vpp_0000.csv' recover = False + + requirement = 'The system shall provide a vector post-processor to sample AD material properties in one or more blocks.' + [] + [error_on_nonexistent_matprop] + type = RunException + input = 'sampler_1d_real.i' + cli_args = "VectorPostprocessors/test_property_vpp/property=nonexistent_matprop" + expect_err = "The material property 'nonexistent_matprop' does not exist." + + requirement = 'The system shall report an error if a non-existent material property is requested for the block material property sampler vector post-processor.' [] [] From e7f2c73f67782af90e517bba755b1c0ddb9b43ba Mon Sep 17 00:00:00 2001 From: Logan Harbour Date: Tue, 22 Mar 2022 12:58:30 -0600 Subject: [PATCH 36/71] Move hooks into correct directory for use by Docker autobuild refs #20608 --- {hooks => docker_ci/hooks}/README.md | 0 {hooks => docker_ci/hooks}/post_push | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename {hooks => docker_ci/hooks}/README.md (100%) rename {hooks => docker_ci/hooks}/post_push (100%) diff --git a/hooks/README.md b/docker_ci/hooks/README.md similarity index 100% rename from hooks/README.md rename to docker_ci/hooks/README.md diff --git a/hooks/post_push b/docker_ci/hooks/post_push similarity index 100% rename from hooks/post_push rename to docker_ci/hooks/post_push From d87bc8b8e57caca480c377ba7fb9778758994354 Mon Sep 17 00:00:00 2001 From: Logan Harbour Date: Tue, 22 Mar 2022 13:00:10 -0600 Subject: [PATCH 37/71] Deinit submodules in Docker autobuild refs #20614 --- docker_ci/hooks/post_checkout | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 docker_ci/hooks/post_checkout diff --git a/docker_ci/hooks/post_checkout b/docker_ci/hooks/post_checkout new file mode 100644 index 000000000000..1eee229d672b --- /dev/null +++ b/docker_ci/hooks/post_checkout @@ -0,0 +1,15 @@ +#!/bin/bash +#* This file is part of the MOOSE framework +#* https://www.mooseframework.org +#* +#* All rights reserved, see COPYRIGHT for full restrictions +#* https://github.com/idaholab/moose/blob/master/COPYRIGHT +#* +#* Licensed under LGPL 2.1, please see LICENSE for details +#* https://www.gnu.org/licenses/lgpl-2.1.html + +# Docker autobuild will initialize submodules; we don't want +# them in the final image because we end up cloing libmesh +# and PETSc seperately, and large_media can be cloned +# later if desired +git submodule deinit -f large_media libmesh petsc From f90a622122b12656db9e917015bb66e2e06f8f0f Mon Sep 17 00:00:00 2001 From: Derek Gaston Date: Wed, 9 Mar 2022 17:32:26 -0700 Subject: [PATCH 38/71] UserObjectTransfer from nearest sub-app working refs #19056 Co-authored-by: Guillaume Giudicelli --- .../transfers/MultiAppUserObjectTransfer.h | 4 +- .../transfers/MultiAppUserObjectTransfer.C | 13 +-- modules/doc/content/newsletter/2022_03.md | 4 + .../gold/main_nearest_sub_app_out.e | Bin 0 -> 1044452 bytes .../main_nearest_sub_app.i | 95 ++++++++++++++++++ .../multiapp_userobject_transfer/tests | 10 +- 6 files changed, 117 insertions(+), 9 deletions(-) create mode 100644 test/tests/transfers/multiapp_userobject_transfer/gold/main_nearest_sub_app_out.e create mode 100644 test/tests/transfers/multiapp_userobject_transfer/main_nearest_sub_app.i diff --git a/framework/include/transfers/MultiAppUserObjectTransfer.h b/framework/include/transfers/MultiAppUserObjectTransfer.h index 62e4050c3544..67ee5caeec77 100644 --- a/framework/include/transfers/MultiAppUserObjectTransfer.h +++ b/framework/include/transfers/MultiAppUserObjectTransfer.h @@ -79,9 +79,9 @@ class MultiAppUserObjectTransfer : public MultiAppConservativeTransfer bool isBoundaryElem(const MooseMesh * mesh, const Elem * elem) const; /** - * Get's the userobject to transfer from when transferring from_multiapp + * Gets the UserObject to transfer from when transferring from_multiapp * @param p The point in the parent app that is being transferred to - * @return will return static_cast(-1) if none is found + * @return the subapp index, will return static_cast(-1) if none is found */ unsigned int findSubAppToTransferFrom(const Point & p); diff --git a/framework/src/transfers/MultiAppUserObjectTransfer.C b/framework/src/transfers/MultiAppUserObjectTransfer.C index 7d39d00dbe3b..1f47d13e554d 100644 --- a/framework/src/transfers/MultiAppUserObjectTransfer.C +++ b/framework/src/transfers/MultiAppUserObjectTransfer.C @@ -573,11 +573,8 @@ MultiAppUserObjectTransfer::findSubAppToTransferFrom(const Point & p) mooseAssert(_multi_app->numGlobalApps() > 0, "No Multiapps To Transfer From"); - for (unsigned int i = 0; _multi_app->numGlobalApps(); i++) + for (unsigned int i = 0; i < _multi_app->numGlobalApps(); i++) { - if (!_multi_app->hasLocalApp(i)) - continue; - auto & app_position = _multi_app->position(i); auto distance = (p - app_position).norm(); @@ -589,7 +586,12 @@ MultiAppUserObjectTransfer::findSubAppToTransferFrom(const Point & p) } } - return closest_app; + // We can only get the value if we have this app + // otherwise - another processor will set it + if (_multi_app->hasLocalApp(closest_app)) + return closest_app; + else + return -1; } // Find the app that contains this point... @@ -601,7 +603,6 @@ MultiAppUserObjectTransfer::findSubAppToTransferFrom(const Point & p) if (!_multi_app->hasLocalApp(i)) continue; - Point app_position = _multi_app->position(i); BoundingBox app_box = _multi_app->getBoundingBox(i, _displaced_source_mesh); if (_skip_bbox_check || app_box.contains_point(p)) diff --git a/modules/doc/content/newsletter/2022_03.md b/modules/doc/content/newsletter/2022_03.md index 5bb124219159..5270415259e0 100644 --- a/modules/doc/content/newsletter/2022_03.md +++ b/modules/doc/content/newsletter/2022_03.md @@ -11,6 +11,10 @@ for a complete description of all MOOSE changes. MOOSE now requires a C++17 capable compiler and supports C++17 features. With this, GCC 7 and Clang 5 are now the minimum supported compilers. +### MultiAppUserObjectTransfer Suppoprts Transferring From The Nearest Sub-App + +[/MultiAppUserObjectTransfer.md] gained a new option that allows transferring from the *nearest* sub-app app from a multiapp. This will help in cases where the sub-app is a lower-dimensional manifold and therefore doesn't overlap with the domain of the parent app. + ## libMesh-level Changes - Work towards source code compatibility with Windows diff --git a/test/tests/transfers/multiapp_userobject_transfer/gold/main_nearest_sub_app_out.e b/test/tests/transfers/multiapp_userobject_transfer/gold/main_nearest_sub_app_out.e new file mode 100644 index 0000000000000000000000000000000000000000..3e3b8b869765a96021fada459cc7de304676431a GIT binary patch literal 1044452 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

e_%dOnTIL323cQAp8+{q*+Gljdjo2g9W z9`0p2Gq{iYnaM03;6Y|HhlhBWxy<7c9%ViYc#Owc$ReKLNfxt&r+AvBEaMrTWjQN& zj^|m)DqdhUYgo&Ryu>=z^D?jSDjRr>*V)J>-r!9(vxT>Ko2_i)9p2?Vw(~w8u!Eg^ z$VcpAHy`r}d)UjTe8xWZ^EqGeB?tJ5uQ|vezTsQG<1pXz13z+vpZJ-h9OD;$4Frk@ z$V6tckd-j9k)0gmBp12KLtf4!ANeUjK?+frA{3<eQenwWv)U>QayTG@v1kxR^_5Oazy58BJ))|Ej0Xx{q zhkV2?cJncxu!p^T%4h6jKcDjjUvhx2_?m+p;v2r@I}YP^DMC?-Q5?Ud#QBt@6s5Us7?)PQj6Nup)U2PPXij#h>N*|#zb%_m(hf#Tuw8Z(}I??qBU)} zf-7lDJKEEMj&$NGI@5)&TunE+(}Qd1NiTYHEs^vgioWzCni%>sfPutv9fOD?o&*v} zVlc_1kV+au7|Jk)b3HdOf|1^TzT+_8^8-I}grE4Cqa5QGehmc9 z50Ht>WFaeIWFtE{$Vo18lZU*VM?UgXfPxgFFhwXzF^W?Hzv%pul%g~jP=+9738x(8 zslbI)q!N|6h$>X28r7*mO=?k_I@F~e^=Uvu8gVg~(3l7=Ol}Ji?>QX917#I15?C6FkXcmhco$vy^2#!?P@B z1<&z3D_O-0tY!^sd6Ab`$9i7o6<%cnukkt?*~A;X$!50j7H_kaZM?&~yvKIl=L2@I zlMnfbUF_y#K4A}g`IOJt$9_KN3%=w4U-2~uIm9=7%Xb{+dw$?Yj_?ydbChHJ!moiq z$pD$iOct^dMmDmOgPi0dH+jg*dE_HM1t>@%3R8rl6r(sLI3K^PWGPB>0c8kMmT<~Z zo(fz@MJiF5i>N|Xs!^R9)T9=*sY6}rQJ)4hq!AZ$35|*1QZAzjO}U(AG^YhEX+>+= za0OS=mUgtK10CtaRdl8cUAdZWbf*W`(34*D=2{}@Llk}KM>H|?X8;3<<`ed?mrwbOeeCCRzTis^@D*QkkVAaKw|vK8zUK#iz^ zlnRiE%w!=eVPqpaImk&aa+8O=oJT(LQ-FdLqA*1$N->I4g7YbfUs$R%7f^;EWeKMo z<*C4hRHPD>xri!Mr5e?#K}~8=n>y5`9`$KJLmF{0m(Z99F6A}YhK19)%enb;Pe+Dp+SgvCbam15A zB1sG;nG{kQSEtG^7z1a|w-!;8HH52~D}2W;CY-Eont- z+HeI|(w26#rvn}7#8q^r3thRIZgi&y*U*z*^yXS3=|dEK=|?m%^k)DAiRC&55l1`; zB$C8nl1U+zG=?ygVGQSbZeRo>xsjU~#b|Ek7RE4^Te*#KjOTXlU;-1llSxcw3U_fg zQ<=s++{<)ka3A+GlUY2#gUn_Q5AiT_na3kM%6t~^7>~1%MLfZiEM^H$@ia?W#xp$2 za#rvh&$E(MyufPKu$C8jiFK^!WnSS`Ht-s+vyn}_!JBMm3vcl@TiM1tyvuuR=Y2k4 z2Rr$YkJ!a-KIRklu$NEyjD76qbH3n94)7IUbC5%P!?%3LVZP@Fe&h&0@iRv`#xMLD z2wV^#6Pd|ER>H_ec5;xDT;wJXc{z`K{low$n5bfGI((~a)*;2L_;i{4yIBz=gYFa3xnhW-p-AhBG>AmWH8 zfkcuROfo5?lEx5*GK}F|&kc-VBsX#sqZrN2+`<^fax1qnj`7^i9ZX;%cQT2|OyMr> zW-8OThkKdM4DRE8W-^Nhc#zr5;UOMoF7tSVN14w89^-KqvWO>mlEp0HDV}C2%Xo%o zS|iG!@)5h(&BuJg9`^DnpRteqe9jkq$pOCNYYuXVZ}^t)IL!C_z>gf^Cw}HA$M}U` z1A#IDGLe}qWF?GjWG4qX$whARkeBnwM}7)WkU|uu2t_GIaY}GLB`HN|F2FA@6QnHR zl%qTqxR8oeqB0jzg{oAeIyIO{Xn#Qa z1KJ<@!zkJx(Efn-2edz+{h<{($xev_GKzp&P2TKXhZ2_6M{-p#1^u z4=uK6f9Rx3`$L@{RBC@f`vck^(Efn-2edz+{Q>O{Xn#Qa1KJK+8@yVfc6KpKcM{q?GI>wK>GvQAJG1Q_6M{-p#6a+H05%d(VP~vq!q1c!xdaf zTiVf{4s@gwSJ9a+bmeNg(VZS#Lr;3qn`?=r4^i}`AJN3np8*Ucmg^Wq9PuQOND_ld zCWTbe7{XA7F`VnUff0=4Ms8vhqq&(|7{gd@L(=25f&+shES;2EW z&q`MD0;^fWT3+NO*0G+Kd4*Tmz-zqDMmF&VZ?c&!yv5sWWgGACF7L6O_xXSw?Bqi} zVi&vlm`~WlUOweB_OYMO`GPMwz*l_DK@RZ^-|`)Y`JNy6kt6)X&m83#zwqnvT|ZMM zWoELFl`yiAogCyO7rDtpUd|&Q`6)m_3Q?FM6r~u&DZ%-aq!gvOfHDLrOE~2yPX#Wd zB9*AjMO2|G)u>JlYEp~Z)S)i*s80hL(uj+>gvLa0DVNcNrd&=ln$v=ow4ya_xPmKb zOFP=rfsSPe=t(bnb1jkdA&S2ABbpfcGk}4_avg(+Bc22jNn$X` zq>xG)Lm0|1hI2hPFoKcX$W4r5G&ge#V;IY=+{QS@b31o1fr;G7Bqj%rj~8L*%FwuZ zt{=|j!?_$dmjmZ=;NRy!CSyltvXJ$+aU`2EJ2}WnE^?EHyqrfq^5gvDkMoaAQ;bV@ zaW_+$#y#B2bY^fL_cN1OJivp@W)2VWFmr8IS;8qtc`9%r6{$pJE}{xmsYZ2bP?K6X zKgr_!B#ZNttV?)`r&-D}p5a-Rvx4V%o|UZP1y-|$wY%H=epIW1^OD_YZr zE4Y%jw4*&8=tw87qBC7|`xf5fZML$FcX*fg*v|WWzz%luAs?}e-F(a^>=C{w`qGbR zV(8BR1`^A43?hzr5=bP8!6cJHs#G|{H+;)?9Oip|;75+|6F+m5WBkIe$5SYGCS_)_ zkX1^J=4NhT3}d;K+Ze}qZs!grFp)c%#AK#$7k4vNY8Id%g(yrBic*Z?l;C_yQi{@C zKpBFRC7g1Um*#VLh=-ZWJRadu=Cgpuc$|eS;t8H)F-v%gr&(%usYPw-P?vhtrvVLV z#Kl}fVq)AM*)&*vqGU#yN|Xs!^R9)T9=*sY6}MKTCLur&-D}p5a-Rvx4V%o|UZP1y-|$wY4Rlh*U>pyvbsG;uYswpxJ2_;?F-C{hHH~$l z^~0{pSd8_d`Nuq^aV*m&c5~PiCnu#b9%gPq58@fkG!|g2%e;lX95G+WOIhmChTaTj zEHhZdTDGyDW99?}s6Zpy5k(r~nZ**;vz-H`X_+WOWg_TA48xho9G0{0hRG<;lG7)qlhT%+P4$IiUP7awjgi(TOG^H!CjARP) zSivTCbJ*MnfBjy8nDN8-t(3`=GWd@5_%Qp6N%w@;|RG<;(E$Bf! zqnXA6R95Fx0OIhmChTaTjEHhZdTDGyDV=lQCpaP9(M-*v{XBJCX&vp)&Gi0I& zm5HDeF$`xSb6Ca(c5=wPAdC`JqbXg9Wh7IW#|k#Fo5L>u=A<;WXh9F+8O<~nu!=40 z<%s!0UdmFBHuPpNW0}Ds*0PQL95W{E(gx#z_}dAa1L0r3*G0`SlN+itRsf*wVAE7 zMi#mcWrxywWau7^;!106nVQgrfs9}>bFq$=X(PM%&RoJeV&+m%MeFeWgYrM$`x z4w_43r8re-LKg-yg2~KfIUCupaL`;LE5)fw z6S^>v5lm(-%h|{-zB8A|K`Cm|obJRiimA+JC7ap9kLD722vV2U^dgBdOlKi$*vdYR znos1XJPm0}A5s~|Oct|__xRFWB7pxCu0&%x63s9sFq@^k$_@^iOJt=uRcS&O1~P)l z%w;(n*~NF}5;-VEO`6l4I7Ts*`K)9!d-%~@A`e08(wbf*F^1_ZWDQ%{$5Hc%{FJ95 zZRtZQUW-iOw$S%G! zm&idWYSNtU#4(Dg%x5K=*~5?K5_t$xm)7(mi7`xPA#2#mK8~7Cjzlwz3Cw0Gud;)K<{VimPF0$yAoDrr`rup+oXdf8IdCoqGM)qf z_5Hx1YZmTL$l~NKi}5f^0SZzGV_g<&ZCQ#^4C7c9CjnW`rzE8)je#*s8G_~svv`09 znT_?htPk-pbD75@Jj#3)@EDJ?kVQPflNf(P*DTzhkgWzasYPwvpOCFC^{7t+8q$c1 zxddZ$wg@ieGMbnxtl|Y$vxc?2i2D<=uVXzg^9siC?A8&pzsBoqWD{@jCY#L*+R>g4 zbfgnk(U~rE8;Nl&{J@VK;U|9PD98APU(F{1<_9CWk((IBXl~{f#xRy!xs7p* z=XUO30u#BDNlZ2m$jf=;BR>TwNFfSSgrXFqI5y(%o(~ebX7Pae!h_6a4iE7#bD75@ zJj#3)@EDJ?kVQPflPor8s77^aP?K8JrVe$fM|~R5kVah0B{U|2OSz0DIxx#Q=lbAW z4xGz@b2)G>2Qr=m|MmUA=bm3;oiH2O$w5wXk()d?KRNgO5`EBtj&$NGI@5)&TunE+ z(}Qd1NiTYHEs^xW`Ruvpm*@lMqvxJqq7U}+DW9>A{d~?Be8~a6;%g3K{&Md5CFT-m zJO6O33!HPV56uXyc}rHM^X1TuInI+q3)0r_0@m*W*6l*i zwF)g7dS99gC`&jMxRASbg`Q7kT`lxnD(h*X=TSu{t)m5+aycz%NgJ-9 z9qn;`8hXBz^U~0BrJRq3o+afxH1rH9=bxcxN5v=y5X&IqNn|i7q%oA?+`vezc?L#d ztuyr8r`wd{xr2#JVhVRNjeD8F{mjCeWa#-#&iw-Oc$5V^#v-0%2~V?(XIa7XtYS55 zd5QJB!UkSv6K}GGx7o_OZ07@Z@)5iFguQ&mew=HCo|E*o@(|y0m>)R8&m7|y_s3-- z3t?m@C%MT>J_=BXA{3(pB`HlA%2JLBRHPDBs74KHQHOdopb?i4!DTe187*i<8?K}s z9q5GlN$9yk-IP7(NpB*Fq8~8~AeKSIlgMCFNMk6&xq%Vf#At3|EVnV9JDA8Mrf@gY zxR)8+&nzBf4i7VrM_9n)EaFL)@HESKmK8kDDps?Wmsrm$Y~Xb^@g|#jn{B+yc0OPy zAF-QH*vn_^=L-(-HHY|?!~DPzTo1@}j9=~gnaDyI*~v+6@{*4N6ru>lC_za|Q--pX zqdXOvE0UZ?qDL5n8Mvm<6dTPKeKp{Ik+B?c^;3lfX7+HlPuwB zmhmhrc%D_PW-TwVo>$nw>ulsrw(vIFc$e*bz)n75H=nSV&)Clw9N=pX@hyjOT`2Pr ze&!gzx_ps|EQFDroa81i`6xgkicpLal%zCe2vUv;RHQOhs74KHQHOdopb?i4!DTe1 z87*i<8yx?$w4(!^=uB6-(Sx4!CXy)n5yJpt8ALpZ40fE;#?Tn2jiI@cHU_jYppBuM zFtstDjiE748$%byv@tZsX=7-N)5g#kr;VX8P8&mGoHhouF`$hBZ478*KpO+v7|_Om zHipJHZ48ZZ+87$+u2gDcKpR72TzVT*NM$I)xq*?~#At3|EVnV9JDA8Mrf@gYxR)8+ z@1EhRRKvBdFxR=lT;mFJeJjkhtuWWMLiZgThr^m+91d%aaX73s;tKX8PfImWN9?~6nBEQmw)?1)45+~jrt@B=)EeJRIW97}V| z$5fSr8AZazUA@_vRm1>D$hXXXP>1?=PV-m(i4Fw4fDjxRQ2spc9?xia3Nm?%5O6fh3YiWeCH# zo)O&0D8wQ3ca_B<^!Jo+SBgXW-%u`I2KiFF92KZYWvWn(8q}f=^=LpN#G!Zu;!s>1 zii<;WaVRbhCEi26gzgvqP`Qhb*~6#o<8!{`D-QAv;!xsy#G!;Zln{p!;-E_dC8ux~ z)3}!z+|Mi?WDXBAk4IU+{C@l`9#i4YvHMA_qm(a6|b1HL_mwXhU5Jf0P2})8LaVS$3aR@zs zSRBfTL;5p^gDa6Q!8N?dI$q{gUSlI~u$i~m$~%Zd@O^ghA>t4ehoCrwry*a$hjRlX zxrx!-!dPx&Ja;gWNr*%E-H1cDIE0HsxHyE1Lud@qhk?%M$I$%dMx}U!o+GSs0v$=zI4Y0A}TZ>~|uiCmAdnyu{T7pFOes6+(vBliGCFoj2W z9=V%)FFzTN@*N+O@-$Mmrys+Z$U{8KMt1YPu_iY`>Tv~;q%xidc$!zy-n`#fQpipz zYSEIOBr%rzc#?H&=PP4R7K&4i%jrfO_LY;*{aWMwHa_Q9pLr=vWiF*N0~yI(JjzP8 z@F_nVhw@W_i_zW!(G2HK9%eb4_?RDzPkAUyee4ef`;f-%JjhZu@FCwGACn4|R@SB! zy%@}`+|Odx^FCi2Z?aN?>NKM}@!ZV4EJS+?zrz>DPg{!=QC`GlbRm`-xtsZ{;w?Vo zsPU%&7jg+5i9vgdPGT-Ac!N*)(Yt(#z%Z-EXv6R$H%1Nt(Cn= z<~C-sgqQh%gT|UL&Zh>==|KXwFr7ub$h*hKr1LW=i&BLqbmcm3Vk!%Gfw$SmG2>1_ zD$V!QI3YRqc205z#N|8b#`&s7?g`L)TIsDTRMet%;G6t zVF!mSpJk&YHEF>$Br=8>Ji$x6#{uI}=Hp{hnX1aBT+JXxF^$Jq%~tmFi}9uqm5AUf z1~7stJi_y6Z*VU^nd;=DJdJ2iKZY@phj^Ba?B;u8Pi}(L;|d~4MSH^^;AviEC*K4D z<+4+XTC}7mNsQ$_o@5={`6>`7pM~O7GfwE!(A@A!r5p^+5p82=p4d?-rdhNxG+*qZ zloMI>QE1-SUD*SDoW<`9eV((o@>*IRK_C5Li5WwWjqOp zS?IH&gO$m~nqt`Iuo9e4NwhhvG#4O8!t_~KS;8rYJ`bzFg~-v+XF@A0FQSSuX){}R z3pt%ljI(Xy9qbd?-b0^dd!G-GW7+h1wh#G;U5Ht>kNJc>#-Q=s&K*oZjC0({BqlS3 zySSUF$gv#va4*xDftcmEpP9@u=3GuQn$rR?&ee+6h+i%_l1uz@iC?aEh+nP_h+pX0 zGvb%4Gvb#^{L;s`+&^=aWBkIe#-0F~$c!Axla(;CA;&_W`OK-zMQ;2+p1hn#K4Z~R zmhlX7I`48;@Ep&xl2yFGYSyrp7kP5BcOnKKYO@3HgvuKIBUwl{AJh zlwl0#dTw9@Be{{A7{zGgjePjG_g4SgXImDO4+Z5zLHSTnJ`|J>1?5A*y?n}N>|;Nl z^95gWfUo$PgB;=;zBLZXhr;rquzV;i9}3Hd!t$Z;13buV=I{^?GnaWh!lTS*0gv%G z3ynLSkPk)WLs9uqR6Z1y4@JAtogQ36PkPatYl)-}QS_xB(Zm>Qw7tZ@*yZ6g7P6KAA<5B zC?A50c!DQc%o3jBX_m5#XLy$7tl&AGH}=SfaQP4}AHwBBxO@ng58?e8z(8WTjzPo` zPXdV~F_>ghNHr$Ohw}2FynHAxAIi&z^75g48G@80oN|<>0vA$|N>t_|s!)|`0TV8= z5=IWLMy>}&A@-qbOZp;oJxH#EuHh&`*Im>Vx>nLfDStwL=im{gz6@PQkZYl}|D)z< zwkNY~39YerR1V{M9%3#Vd4uoy(YO{wTSDV+Tctk8GK2@v|5;vTC*Roo?C6iIwP;CC z^k3Go+=uvuo`bMmDSyJUP#k>_R)cQDF`9c2|FAXKKf*reSL0V<^k3++NS&1fvA<-y z3;C06CHAk-TID|Tv;64)>=)C4Xohnq53`(2e9RBJJ`duTqdr&Chcs?Sn{&)z10V9O z`B@IcKWA-P(F^&K^H%O>G3$AsuZ?S2kw3Yr(+q9SbqzOjFAG`AJA7fx6XV=P5aZnT z&(L!ZGe6781=OK6y-DUaX0n8r`GAAQvoOv_jPo_82MK6%zOmT9^S#Ks zd}(f$iK0}Y30=94o0!T1Uf^x^am-j*@VD_&n?uiS?ytOo$;{(9-eeC)j9uqZj)t_O zFGHDt7>7QK^ty5v+FbAlb2R&Rp}Mr;T2dItES};Oc5uizmW`6sqy=JJIFT{TK${CM z<~o4J>TtmPfPFop#v!bMz07sNPtBX=_&Z4R#HGme^{72rZHp(8O| z&m`uuf;aetAB|~w5##U%v?U5{4j;yBmhl=N@tyfuPA;Ght?5lNw=t6?yo?x^J7|0h z<9t7xUgr>ol3uqsgxjvrTIdL+IEHIiXiapKay0rSv^F|MDUZVSYiNyhoN_$k5?U*r zpqz-fhSp3cE2nT5`YC)W(~wu8HPq?K8Qh0Bh1>3vb60T=wR?{8A>>K8ehZ(+BRq8E&$E(MyntASuVF1O@)GM< zkA4k*g;&`?dR$&-BbyM{@Hg4a7T)4*wz3U*75*;ov7Pr3r|=!@%9{Y0$V?Wp z5=J(%lY^Y(A~$)+%X#D@KLsdAAqrE3q7jh$Ef^5=mk($)u1< z8bcV$FottIH!y;c+{jIgVl+2%3u73|t=z^q#&bJ&FoB8O$s{H-g}b<$sZ8S@?qxbN zxR3jp$t)h=L1r_Dhj^H|%;OOrWj+gdjK^8XBA(z$7PEw>c$%dw;~Ac1IV*UM=UK@r zUSKtASj&sN#5&gVGOzF|8+eV^*~li|;7vBOg|~Q{t!(2R-sL^E^FAN2gPnZHN9|;}?E4UIfTQX0ni# zFtU-I9ONVyxyeIb&LbcBDL_FAQJ5kWr5MF2!TFS=6s5U9 zjf{&L9+Mms9T_zwCOK+AjFy~yrJa0t#y2r>G4U}8sgeIsSEh2Od7ZJ+fAfuU!Dh)Z zQK>P}!M?+T?K*Vm+#;yq|AW_QHt>I3VX#?Ze0)?wbg*q~LQJq}@_@AT&PoaTU1zbS z!5Ya?vC%aKM5UxgC)bEiOiYQXks6bddi-r<`rB%WNvXkVvBCJL*o4T0n5bm`7MYUP zH!>IEf%Ny)(h|~A^x|*ds+K4Xl4GM|{6j)wwE@w6tM!fQ zHz+kZs$Yz)4qhFToD!Ru5NwmsKk={4Xqg-pA2T#Dc~I#4$?;LC{@;twqNyi-h-S~6IH8!{o1vn8#b!juU@^V1`TS}YSf^1-CF${HmKR~l-hjJ zu|=28{r*~AFj%L0t$NjK{rP|Y=dU}rZPD>Rt*}{IaBa2V~b%i{nApS`o_hC>P$(Eicbnv{Fe%AHuzT+{?jk~fB*aG zsoy3cDJ?bFGFG$CZvXwiwHZBo|Hst_gRu!w{ZeCx#QeV3o$@XsSScYfGCHPzlyRi; zKmYb%Fe)xCaj3)60LO(PF_D9Z#>5U7=y3SkDOCKGC9oEdTSw{>R^#(f^@m)3jk%M)kM;8*|$KKN##;y~c@DJngAk1~)rBko}|LW8;RWzdOw-=q^k>7VS#-QQ>$nd-zOB{e3=HzR^=n|5i@`Cm5J0^(^a z9Fl%gbNqESO^!-Vjyh9b+rpZEY1ZHUL;7Zf#;4yl=r6_DY@svXq{M{KRN^o7omC#% zLsF9y<04a|2K;r{GX(tM0QYx|J^sD)O)|2_oU*(9aXZhZ4`UKSC!Bw*=J)q!v+MOA z^83&K<=xqAVPaaU6U4uEU#Rl4iL!ZFWOQ0o++VgX{U0*Eg*~fRuaUvS{6EL~Km0#J zgVcX9IGxz0^ltixL8@)jR#!D`->SulANl(-y~1;YRC+J`{)z~;Y;)DWKVS#afAZWQ zWz;)2Nd5iJcItQ2)8^bDmEH@#zcM}qIN|*N*C6%3VDfl*v;Q;aj3@WM(6}5I(?9jU zI(bOX;QxLY{jaBH|1j}s9-AE7Z(v+Z>gCN&_SBi*q&K;5Vp>9URPyO(77@Yp9zJsg zfBsH-h5v9olvscMslWL;y~60&r~#2FE(Ar!{`K7bY|db#V^fmiTsb&?)g%2^{NZ&r z75?Y5fS6$}ZA7|IksLehFSDPs+QLwULo5;`CjTcD#>OYb#rAWZ<8-gHnfRQcvB#^A z2v$rPZZaMpOrMok{F{V1{;l+%N^+Gc=JeZlcB>+1O2N=3o=s3vVqEGt)9Y-8(a_ZF zx8#nFw0tq}54E37g+rp^($2VQdUh2aUy%I6cK!Y~BKR*Z?fxP5=|6dfls;Z*L{JXI zrcYM?@Kb;DHhoO_Uoaa@PQO0!9}Roy9d&NhJDx5l{wr<Mi2b{{=-HeS|Lt5fy}~ZZ zQ3)xrE(rZ)zdhYQ=)=B=$*GZv36Uv@ai)9yqhe3F%8>CB&ZvI9J-5D60>b}Cz<mo zxb=%X?Rs{`E9^Hgrr)5*sI+0HJ$jwR6`%CWglVbiv-#uK!B3o{NA`{BpO_qzz7v_a zMfUBN@~vQ>rdqv! ze~np_kKY89lz#pEG_SL0^6?6jV_XkD*>k_w9NNOa-U#{USe*PieO<}XIyEvW$wiOT zOmj1ETnJT~USUf5)!tN2A2qpp z&6@xI{KgihILVq@+UQ9xC z=-!Z%+jQ!ij5j%S^K<&Bclx%g@Sj?F%J*Ge{=+zTnjJdShZ)+JPpL3&Kw@%i>cIHl zn;j86o}i~}#@~E#>J~cY_lt>4-#t#=q>%Al?~hxUKGesaddI{6tPf@6e_P>cj$xso zWa#h}7kQf4{xK*SJz~dMaQ;irol;>stW`S5O!9#OpEUVHeGb$~F{vs2&RD^pzY+8ahhdS!`p3jarX@xD7|0(h zOMf2`tXsQL-A45r)NWMo&p&*+uT|K;zr)QL?_G@u4oy1U51#4Yg29APloJvY(%T-D z9GPUE;;yX|_vQ&o24b8(NI6?ijY>{UOH#%po!o~{G(F?{a>DVpU-xA1hQA;+Vf(Ou6Lo~gMfDy&i~BfFjoL&w$h$;n?rlAeeEzOwXG66NDZ zhyG~^PRsxL3Z+d366a)vr`eQC8t;_u}KN&dAms zuP{;b(y!kpCPc-hnDLoMS|&L;GtGD&{_UM2>1mVE+owZE_(&g66OPmLGUC#*csUSPF8rPDc@Q2;qfgz&8cCiD>I%pzcu+xCpZ~T?2}Wn)1Tyo z`Y=PMa}G68!$K=k*1gg%)BiDP(i1zQ`*Ns43l=99pZ}EH8DBp^M^CUI()aCWxTYMHnKuXH-emmXC zp^7uUFRSqHmNCvED511YzxU-24gLM?*;E)46+Jxt%-uq4bWEy+FzIu$#{Xf3$M?cN zZtnlELTB1Wwm&ZGW;`hAn-iH7lN_5E9cc~cPlv;^NSi-a7;5pURc8F)@P`Udt?GDO z&aT1}=fi*Mzw|0YeVC!eG)jl$6BZ zKIWS7BlaIF{LAq=y~!E9YIb}ge|%COm3s11VJ=n-NMESTc$3qQtD(=6c=$p3DgU2d z8L!Zz5&HVL+n?$=`DI2c{9kbO_R5&#gqXPhgKtm{-JG00xBE{nE*k;UqxrWNgfpJl zD*U?(!Wlo|3?6znBdM3JH>_7Zy+6Q$UD)Wi}Kd&Ay)EU{Mvjf%Yh7p(8unc3^PNAQu$%};%u z{E_vbcln;r&X$>--77xx9~@Eq;E6&qtmFl~_fw&elamdPW~P3UQnqNm^yFmBO@7Zl zQuu)|8)csBW44fDAZIVMm78| z^%cT2?;V)ZiM`Y}3RbAyACv-(Xk~enHwBSKD5SH&-pPwheT7P5ZQp)<`YTzNaKBqn zpmGl=+_=;;ShT(JsJ!;arzR9D23DfP4(ZhcyBY>gQ?Ky-3Ke7Y3&K=!qq^RQf-J`L zl)iApAjP}!Qo~QIW@!t_SGk7`c98mXRd(R|!M$YOK7PVK?bFpyNfr9&hM@}ewY;|^ zNxi}k#+3v^x30=T4sq?S7>l)Q^!J{XBSSp{MbKHkn!eA`A5yOn?~qh3H0|G`v*J8x zS7E6i4?73?^z~K;1q?MBSz+?0{6*D9R``>lEY*_{74{DdQZ9TBQgV32<&VmxoL!Z} z75Y=msc)1n%E^;H!GX$=4{6bgHDlJd*z8LE;P7tv(vMd-eCbECRB`+tr$$Aiq;|K$ zH&B(At7;AUqhqm;Po2iWL0r%H!TiJ2E=5e9kL~Z%U)hif3hwOFPf0Bj=}-pmoqDs8 zD-XqN`Y8uL`YH)q>KapTHX`dJsH>0PdsShzN>BOtDGx^Mo=Ofu-$28uP9-t*uiP`` zkw(<3oO4O7!jwlEBP&dKq%p2Sk!KPVBo31#n_TNyteI;QPY-A1-p7x+ic<;cz8hqO zBJF>vPfkwW{PguIxx}e#6s(XoG?jIjGGY3w+R3q4&#uZ|;(OC&NgUJF%^F3G>Kx^sX~~pSh2yTRyg>B=Ut3Y_>-v>{$yH( zU!h0Oubk2t@(F+5&P#mJNZnq&KHEG3$RePx$uLQPNsOo;3m+*PYF9H2c}fv0r8j0oMM-XGnDDX zXACOr<>TwC_8^r6Z>vGJgKd8*>u4qZvGQMeTPzL!RF?9-#b0%SrECA>58tMK)>A4B z3iS5rW4PBZH7Ku~T0iAog^;YPUCO3@jV&rvZgWr$Hz^5kecpMEq|vBX{?Hj~#cbs8 z@xN_G`4>V5=2?mZ7W&*vlBX2LDEy!=mHNe!$ixuep`v{8!n;&ZwZax2Udk=#u1&n_ zxw?5Y`d{xYKIt#~GG&b|axay$AchyR8S~0AKl+_4)t`)cbMZ8K0g(+WJ(&yvDd{U}V7!=sKk8*`%@?m0Q z1_xQ8;<2dr%f#;zjgtD&M!4W|OnmQz(??$8Am2Eh5FsiQ_mlKjxQS;`zlh68L^?lUcr4K*sQJ9=nBPH zqh=@ntPBoz)f}o-br3fay!VA!`o`7&L41xjkpxMSDQijmMa-hi6EXIh2NNeP!YgMpX!NaSCS_jA><@ z+_A#<&Mp{Jp$NyNxJ#e+-D9{qo*9~|HaAzYHCuSETa)SFG0;2`a3R>KNYJ7SA%IORZ?x)SxDQ$J#h`@WR# z8A^5zRcbckmHU3^YkZ8T&^OqxhmXOMQ2oY6RQN$pPrPy&k47FXlrKsvrg!>W8@Z%7 z`3u)E*tdU51Vx3ZZDsfpuJ;e1%J)vaVf*(maijS6?B6RW*s#Azc}AH{fcS>nl>bZp zD}ON9CmJQSo)q|^%5`Zeh)jJeck7#MtU=bF`mSg4y;11{_`zvt@vVLRl&>+?TYBmn zMe*+!%5UZk@)_K%M@nQ2D))@w>H#JL<=|&$ z2=soWg;Ryfca@7vUwSEZ`1p2HF2xmJVCaCl87p@Smr|585%DEoSF|8x(r z+ot%s%3U|=EvnSbdAJQH+Ta7t?3RI|HktknDEPg2e`{P$9k|!9-1heOX*4DDP6#G>PbXsZCD)557!9>;-${ zX0SnfP@~AnRrz|mKFaO0dRoc44S>t5P_J>{8Ir$0| z-%9+2_|KSE_UY5dCndX9DolOc=0CVvs)zDrA4qpOp^`#@xipNf&N{S z%RZ+@Nj*c8hpPNOlty4oE8`AxaxG${9m2{%`POS-ru|>)6@GPjU#fwJ|HuTG025#W zOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#W zOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#W zOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#W zOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#W zOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#W zOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#W zOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#W zOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#W zOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#W zOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#W zOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#W zOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#W zOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#W zOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#W zOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#W zOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#W zOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#W zOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#W zOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#W zOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#W zOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#W zOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#W 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 Y8_Ig)XIgJ4{;c@3;?GJQO?lw|0g`4wjsO4v literal 0 HcmV?d00001 diff --git a/test/tests/transfers/multiapp_userobject_transfer/main_nearest_sub_app.i b/test/tests/transfers/multiapp_userobject_transfer/main_nearest_sub_app.i new file mode 100644 index 000000000000..4378836efd7d --- /dev/null +++ b/test/tests/transfers/multiapp_userobject_transfer/main_nearest_sub_app.i @@ -0,0 +1,95 @@ +[Mesh] + type = GeneratedMesh + dim = 3 + nx = 20 + ny = 20 + nz = 20 + # The MultiAppUserObjectTransfer object only works with ReplicatedMesh + parallel_type = replicated +[] + +[Variables] + [./u] + [../] +[] + +[AuxVariables] + [./multi_layered_average] + [../] + [./element_multi_layered_average] + order = CONSTANT + family = MONOMIAL + [../] +[] + +[Kernels] + [./diff] + type = Diffusion + variable = u + [../] + [./td] + type = TimeDerivative + variable = u + [../] +[] + +[BCs] + [./left] + type = DirichletBC + variable = u + boundary = left + value = 0 + [../] + [./right] + type = DirichletBC + variable = u + boundary = right + value = 1 + [../] +[] + +[Executioner] + type = Transient + num_steps = 1 + dt = 0.001 # This will be constrained by the multiapp + + solve_type = 'PJFNK' + + petsc_options_iname = '-pc_type -pc_hypre_type' + petsc_options_value = 'hypre boomeramg' + l_tol = 1e-8 + nl_rel_tol = 1e-10 +[] + + +[Outputs] + exodus = true +[] + +[MultiApps] + [./sub_app] + positions = '0.3 0.1 0.3 0.7 0.1 0.3' + type = TransientMultiApp + input_files = sub.i + app_type = MooseTestApp + [../] +[] + +[Transfers] + [./layered_transfer] + direction = from_multiapp + user_object = layered_average + variable = multi_layered_average + type = MultiAppUserObjectTransfer + multi_app = sub_app + nearest_sub_app = true + [../] + [./element_layered_transfer] + direction = from_multiapp + user_object = layered_average + variable = element_multi_layered_average + type = MultiAppUserObjectTransfer + multi_app = sub_app + nearest_sub_app = true + [../] +[] diff --git a/test/tests/transfers/multiapp_userobject_transfer/tests b/test/tests/transfers/multiapp_userobject_transfer/tests index 2640e34c8284..2414bff432be 100644 --- a/test/tests/transfers/multiapp_userobject_transfer/tests +++ b/test/tests/transfers/multiapp_userobject_transfer/tests @@ -1,5 +1,5 @@ [Tests] - issues = "#10313" + issues = "#10313 #19056" design = "MultiAppUserObjectTransfer.md" [transfer] @@ -13,6 +13,14 @@ detail = "to a master application from sub-applications," [] + [from_sub_nearest_sub_app] + type = 'Exodiff' + input = 'main_nearest_sub_app.i' + exodiff = 'main_nearest_sub_app_out.e' + + detail = "to a master application from the nearest sub-applications," + [] + [to_sub] type = 'Exodiff' input = 'tosub_master.i' From 0042964a53390c7cdedbd13cdbe72a46169f0aa0 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Tue, 22 Mar 2022 21:09:30 +0000 Subject: [PATCH 39/71] Only patch Yum mirrors for CentOS Docker builds. Fixes #20617. --- docker_ci/yum_installs.sh | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docker_ci/yum_installs.sh b/docker_ci/yum_installs.sh index e6f87ac24278..0480eea43ece 100755 --- a/docker_ci/yum_installs.sh +++ b/docker_ci/yum_installs.sh @@ -14,10 +14,13 @@ # Want to exit if there's an errror set -e -# Per https://stackoverflow.com/a/70930049, we need these commands for Yum mirrors -# Per https://serverfault.com/a/1093928, switch to vault.epel.cloud -sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-Linux-* -sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.epel.cloud|g' /etc/yum.repos.d/CentOS-Linux-* +# Only want to mess with mirrors for CentOS +if [ $(ls /etc/yum.repos.d | grep -c CentOS) -gt 0 ]; then + # Per https://stackoverflow.com/a/70930049, we need these commands for Yum mirrors + # Per https://serverfault.com/a/1093928, switch to vault.epel.cloud + sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-Linux-* + sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.epel.cloud|g' /etc/yum.repos.d/CentOS-Linux-* +fi # Update package lists yum update -y From 2ba1c523fc0f33f38131fee280c61cb76016f7d2 Mon Sep 17 00:00:00 2001 From: Casey Icenhour Date: Mon, 21 Feb 2022 13:26:34 -0700 Subject: [PATCH 40/71] Add check in PETSC configure to see if HDF5 exists on system. If not download it using PETSc (except for Darwin) Refs #20033 --- conda/mpich/conda_build_config.yaml | 2 +- conda/petsc/build.sh | 8 +++++ conda/petsc/meta.yaml | 2 +- scripts/configure_petsc.sh | 54 +++++++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 2 deletions(-) diff --git a/conda/mpich/conda_build_config.yaml b/conda/mpich/conda_build_config.yaml index 11a8f6b39be5..bd13c4ab8937 100644 --- a/conda/mpich/conda_build_config.yaml +++ b/conda/mpich/conda_build_config.yaml @@ -14,7 +14,7 @@ moose_libmesh_vtk: - moose-libmesh-vtk 9.1.0 build_4 moose_petsc: - - moose-petsc 3.15.1 build_7 + - moose-petsc 3.15.1 build_8 moose_mpich: - moose-mpich 3.4.2 build_3 diff --git a/conda/petsc/build.sh b/conda/petsc/build.sh index 5f85d9821377..924cde40a76d 100755 --- a/conda/petsc/build.sh +++ b/conda/petsc/build.sh @@ -37,6 +37,14 @@ else FCFLAGS="${FCFLAGS} -I$PREFIX/include" fi +# Set empty HDF5 variables for the configure PETSc script, since we want to use +# the downloaded PETSc HDF5. This is to avoid an "unbound variable" error in +# scripts/configure_petsc.sh +HDF5_DIR="" +HDF5DIR="" +HDF5_ROOT="" +HDF5_STR="" + source $PETSC_DIR/configure_petsc.sh configure_petsc \ --COPTFLAGS=-O3 \ diff --git a/conda/petsc/meta.yaml b/conda/petsc/meta.yaml index 2a9bb97b2be8..a4e6d70c8449 100644 --- a/conda/petsc/meta.yaml +++ b/conda/petsc/meta.yaml @@ -1,5 +1,5 @@ # Do not use jinja templating (A physical change to this file is required to trigger a build) -{% set build = 7 %} +{% set build = 8 %} {% set strbuild = "build_" + build|string %} {% set version = "3.15.1" %} {% set sha256 = "d676eb67e79314d6cca6422d7c477d2b192c830b89d5edc6b46934f7453bcfc0" %} diff --git a/scripts/configure_petsc.sh b/scripts/configure_petsc.sh index 108cc423422f..8dbc4974e8e7 100644 --- a/scripts/configure_petsc.sh +++ b/scripts/configure_petsc.sh @@ -31,9 +31,63 @@ function configure_petsc() SHARED=1 fi + # Check to see if HDF5 exists using environment variables and expected locations. + # If it does, use it. + echo "INFO: Checking for HDF5..." + + # Prioritize user-set environment variables HDF5_DIR, HDF5DIR, and HDF5_ROOT, + # with the first taking the greatest priority + if [ ! -z "$HDF5_DIR" ]; then + echo "INFO: HDF5 installation location was set using HDF5_DIR=$HDF5_DIR" + HDF5_STR="--with-hdf5-dir=$HDF5_DIR" + elif [ ! -z "$HDF5DIR" ]; then + echo "INFO: HDF5 installation location was set using HDF5DIR=$HDF5DIR" + HDF5_STR="--with-hdf5-dir=$HDF5DIR" + elif [ ! -z "$HDF5_ROOT" ]; then + echo "INFO: HDF5 installation location was set using HDF5_ROOT=$HDF5_ROOT" + HDF5_STR="--with-hdf5-dir=$HDF5_ROOT" + fi + + # If not found using a variable, look at a few common library locations + HDF5_PATHS=/usr/lib/hdf5:/usr/local/hdf5:/usr/share/hdf5:/usr/local/hdf5/share:$HOME/.local + if [ -z "$HDF5_STR" ]; then + # Set path delimiter + IFS=: + for p in $HDF5_PATHS; do + # When first instance of hdf5 header is found, report finding, set HDF5_STR, + # and break + loc=$(find "$p" -name 'hdf5.h' -print -quit 2>/dev/null) + if [ ! -z "$loc" ]; then + echo "INFO: HDF5 header location was found at: $loc" + echo "INFO: Using this HDF5 installation to configure and build PETSc." + echo "INFO: If another HDF5 is desired, please set HDF5_DIR and re-run this script." + HDF5_STR="--with-hdf5-dir=$loc/../../" + break + fi + done + unset IFS + fi + + # If HDF5 is not found locally, download it via PETSc (except for Darwin) + if [ -z "$HDF5_STR" ]; then + if [[ $(uname) == Darwin ]]; then + # HDF5 currently doesn't configure properly on macOS due to a gfortran io + # buffer bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102992 + # So, we won't be downloading it by default for now if it isn't found. + # Instead, if a user has it installed somewhere, we'll note the variable + # they need to set. + echo "INFO: HDF5 library not detected; HDF5 related PETSc features will not be enabled." + echo "INFO: Set HDF5_DIR to the location of HDF5 and re-run this script, if desired." + else + HDF5_STR="--download-hdf5=1" + echo "INFO: HDF5 library not detected, opting to download via PETSc..." + fi + fi + cd $PETSC_DIR python ./configure --download-hypre=1 \ --with-shared-libraries=$SHARED \ + "$HDF5_STR" \ --with-debugging=no \ --download-fblaslapack=1 \ --download-metis=1 \ From e53a8fbdca8365311977c108ad276258d1cf6776 Mon Sep 17 00:00:00 2001 From: Casey Icenhour Date: Mon, 21 Feb 2022 14:15:12 -0700 Subject: [PATCH 41/71] Enable HDF5 in libmesh configure by default, but don't require it yet (#20033) --- conda/libmesh/meta.yaml | 2 +- conda/mpich/conda_build_config.yaml | 2 +- scripts/configure_libmesh.sh | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/conda/libmesh/meta.yaml b/conda/libmesh/meta.yaml index 7dbc4dfe6b34..df402bc5984c 100644 --- a/conda/libmesh/meta.yaml +++ b/conda/libmesh/meta.yaml @@ -1,5 +1,5 @@ # Do not use jinja templating (A physical change to this file is required to trigger a build) -{% set build = 0 %} +{% set build = 1 %} {% set strbuild = "build_" + build|string %} {% set version = "2022.03.02" %} diff --git a/conda/mpich/conda_build_config.yaml b/conda/mpich/conda_build_config.yaml index bd13c4ab8937..1de3a93b5439 100644 --- a/conda/mpich/conda_build_config.yaml +++ b/conda/mpich/conda_build_config.yaml @@ -2,7 +2,7 @@ ## Any changes made will require additional changes to any item above that. moose_libmesh: - - moose-libmesh 2022.03.02 build_0 + - moose-libmesh 2022.03.02 build_1 SHORT_VTK_NAME: - 9.1 diff --git a/scripts/configure_libmesh.sh b/scripts/configure_libmesh.sh index e66dfc1f21eb..4a9cb46f9e4a 100644 --- a/scripts/configure_libmesh.sh +++ b/scripts/configure_libmesh.sh @@ -47,6 +47,7 @@ function configure_libmesh() --disable-warnings \ --with-thread-model=openmp \ --disable-maintainer-mode \ + --enable-hdf5 \ --enable-petsc-hypre-required \ --enable-metaphysicl-required \ --with-cxx-std-min=2014 \ From 83ba952fa4fe3ba7f53d2047f48ab7c9042abb1a Mon Sep 17 00:00:00 2001 From: Jason M Miller Date: Wed, 16 Mar 2022 14:47:12 -0600 Subject: [PATCH 42/71] Use conda-forge mpich Use conda-forge's mpich packages for linux, mac, and arm. Closes #20579 --- conda/libmesh-vtk/build.sh | 5 +- conda/libmesh-vtk/meta.yaml | 4 +- conda/libmesh/meta.yaml | 3 +- conda/mpich/build.sh | 101 +++------------------------- conda/mpich/conda_build_config.yaml | 72 ++++++-------------- conda/mpich/meta.yaml | 56 +++++---------- conda/mpich/mpiexec.sh | 4 -- conda/mpich/run_test.sh | 58 ---------------- conda/mpich/tests/helloworld.c | 19 ------ conda/mpich/tests/helloworld.cxx | 22 ------ conda/mpich/tests/helloworld.f | 21 ------ conda/mpich/tests/helloworld.f90 | 23 ------- conda/mpich/tests/helloworld.sh | 5 -- conda/pyhit/meta.yaml | 8 +-- conda/tools/meta.yaml | 15 +---- 15 files changed, 58 insertions(+), 358 deletions(-) delete mode 100755 conda/mpich/mpiexec.sh delete mode 100755 conda/mpich/run_test.sh delete mode 100644 conda/mpich/tests/helloworld.c delete mode 100644 conda/mpich/tests/helloworld.cxx delete mode 100644 conda/mpich/tests/helloworld.f delete mode 100644 conda/mpich/tests/helloworld.f90 delete mode 100755 conda/mpich/tests/helloworld.sh diff --git a/conda/libmesh-vtk/build.sh b/conda/libmesh-vtk/build.sh index bf98b99ac8e8..978e717d5bf4 100755 --- a/conda/libmesh-vtk/build.sh +++ b/conda/libmesh-vtk/build.sh @@ -30,15 +30,14 @@ cmake .. -G "Ninja" \ -DVTK_GROUP_ENABLE_Web:STRING=NO \ -DCMAKE_OSX_SYSROOT=${CONDA_BUILD_SYSROOT} -CORES=$(echo "${CPU_COUNT:-2} / 2" | bc) -ninja install -v -j $CORES +ninja install -v -j ${MOOSE_JOBS:-2} # VTK 9.1 now places libs in lib64 when installed on linux, linking to the "expected" location of lib if [[ $(uname) == Linux ]]; then ln -s ${VTK_PREFIX}/lib64 ${VTK_PREFIX}/lib fi -# Set LIBMESH_DIR environment variable for those that need it +# Set VTK environment variables for those that need it mkdir -p "${PREFIX}/etc/conda/activate.d" "${PREFIX}/etc/conda/deactivate.d" cat < "${PREFIX}/etc/conda/activate.d/activate_${PKG_NAME}.sh" export VTKLIB_DIR=${VTK_PREFIX}/lib diff --git a/conda/libmesh-vtk/meta.yaml b/conda/libmesh-vtk/meta.yaml index 0c97cbf1333b..03e2decd2691 100644 --- a/conda/libmesh-vtk/meta.yaml +++ b/conda/libmesh-vtk/meta.yaml @@ -1,5 +1,5 @@ # Do not use jinja templating (A physical change to this file is required to trigger a build) -{% set build = 4 %} +{% set build = 5 %} {% set strbuild = "build_" + build|string %} {% set vtk_version = "9.1.0" %} {% set friendly_version = "9.1" %} @@ -17,6 +17,8 @@ build: number: {{ build }} string: {{ strbuild }} skip: true # [win] + script_env: + - MOOSE_JOBS requirements: build: diff --git a/conda/libmesh/meta.yaml b/conda/libmesh/meta.yaml index df402bc5984c..a2056163cce0 100644 --- a/conda/libmesh/meta.yaml +++ b/conda/libmesh/meta.yaml @@ -15,6 +15,8 @@ build: number: {{ build }} string: {{ strbuild }} skip: true # [win] + script_env: + - MOOSE_JOBS requirements: build: @@ -24,7 +26,6 @@ requirements: - make # [arm64] - m4 # [arm64] - pkg-config - - {{ moose_ld64 }} # [osx] - {{ moose_libmesh_vtk }} - {{ moose_petsc }} diff --git a/conda/mpich/build.sh b/conda/mpich/build.sh index 8fe63688960c..d6dd7838c2b7 100755 --- a/conda/mpich/build.sh +++ b/conda/mpich/build.sh @@ -1,99 +1,14 @@ #!/bin/bash set -eu -export PATH=/bin:$PATH -export FCFLAGS="$FFLAGS" -export CC=$(basename "$CC") -export CXX=$(basename "$CXX") -export FC=$(basename "$FC") - -if [[ $HOST == arm64-apple-darwin20.0.0 ]]; then - # use Conda-Forge's Arm64 config.guess and config.sub, see - # https://conda-forge.org/blog/posts/2020-10-29-macos-arm64/ - list_config_to_patch=$(find ./ -name config.guess | sed -E 's/config.guess//') - for config_folder in $list_config_to_patch; do - echo "copying config to $config_folder ...\n" - cp -v $BUILD_PREFIX/share/gnuconfig/config.* $config_folder - done - ./autogen.sh -fi - -# In order to set a CXXFLAGS during moose-mpich activation with the proper C++ -# standard (as clang and gcc from conda-forge still default to C++14), we extract -# what moose_cxx gives us here, before we unset it. The "-fdebug-prefix-map" -# flags are also removed, as they are specific to the conda build process. -TEMP_CXXFLAGS=${CXXFLAGS%%-fdebug-prefix-map*} -# Finally, swap "-std=c++14" with "-std=c++17" to set our basic standard requirement. -ACTIVATION_CXXFLAGS=${TEMP_CXXFLAGS/-std=c++14/-std=c++17} - -unset LDFLAGS CPPFLAGS CFLAGS CXXFLAGS FFLAGS FCFLAGS F90 F77 -export LDFLAGS="-L$PREFIX/lib -Wl,-rpath,$PREFIX/lib" -export LIBRARY_PATH="$PREFIX/lib" - -if [[ $(uname) == Darwin ]]; then - if [[ $target_platform == osx-arm64 ]]; then - CTUNING="-mcpu=apple-a12 -I$PREFIX/include" - FTUNING="-march=armv8.3-a -I$PREFIX/include" - OPTIONS="--disable-opencl --enable-cxx --enable-fortran" - export pac_cv_f77_accepts_F=yes - export pac_cv_f77_flibs_valid=unknown - export pac_cv_f77_sizeof_double_precision=8 - export pac_cv_f77_sizeof_integer=4 - export pac_cv_f77_sizeof_real=4 - export pac_cv_fc_accepts_F90=yes - export pac_cv_fc_and_f77=yes - export pac_cv_fc_module_case=lower - export pac_cv_fc_module_ext=mod - export pac_cv_fc_module_incflag=-I - export pac_cv_fc_module_outflag=-J - export pac_cv_fort90_real8=yes - export pac_cv_fort_integer16=yes - export pac_cv_fort_integer1=yes - export pac_cv_fort_integer2=yes - export pac_cv_fort_integer4=yes - export pac_cv_fort_integer8=yes - export pac_cv_fort_real16=no - export pac_cv_fort_real4=yes - export pac_cv_fort_real8=yes - export pac_cv_prog_f77_and_c_stdio_libs=none - export pac_cv_prog_f77_exclaim_comments=yes - export pac_cv_prog_f77_has_incdir=-I - export pac_cv_prog_f77_library_dir_flag=-L - export pac_cv_prog_f77_mismatched_args=yes - export pac_cv_prog_f77_mismatched_args_parm= - export pac_cv_prog_f77_name_mangle='lower uscore' - export pac_cv_prog_fc_and_c_stdio_libs=none - export pac_cv_prog_fc_int_kind_16=8 - export pac_cv_prog_fc_int_kind_8=4 - export pac_cv_prog_fc_works=yes - export pac_MOD='mod' - else - CTUNING="-march=core2 -mtune=haswell -I$PREFIX/include" - FTUNING="-march=core2 -mtune=haswell -I$PREFIX/include" - OPTIONS="" - fi - SHARED="clang" -else - SHARED="gcc" - CTUNING="-march=nocona -mtune=haswell -I$PREFIX/include" - FTUNING="-march=nocona -mtune=haswell -I$PREFIX/include" - OPTIONS="" -fi - -./configure --prefix="${PREFIX}" \ - --enable-shared \ - --enable-sharedlibs="${SHARED}" \ - --enable-fast=O2 \ - --enable-debuginfo \ - --enable-two-level-namespace \ - --with-device=ch3 \ - CC="${CC}" CXX="${CXX}" FC="${FC}" F77="${FC}" F90="" \ - CFLAGS="${CTUNING}" CXXFLAGS="${CTUNING}" FFLAGS="${FTUNING}" LDFLAGS="${LDFLAGS}" \ - FCFLAGS="${FTUNING}" F90FLAGS="" F77FLAGS="" \ - ${OPTIONS} -CORES=$(echo "${CPU_COUNT:-2} / 2" | bc) -make -j $CORES -make install +# In order to set CXXFLAGS during moose-mpich activation with the proper C++ +# standard, we first extract what mpich-mpicxx gives us during build. Just in case +# the clang or gcc conda-forge packages set a standard, remove any occurence of +# "-std=c++XX" +TEMP_CXXFLAGS=${CXXFLAGS//-std=c++[0-9][0-9]} +# The "-fdebug-prefix-map" flags then need to be removed, as they are specific +# to the conda build process. Finally, `-std=c++17` can be appended to the end. +ACTIVATION_CXXFLAGS=${TEMP_CXXFLAGS%%-fdebug-prefix-map*}-std=c++17 # Set MPICH environment variables for those that need it, and set CXXFLAGS using our ACTIVATION_CXXFLAGS variable mkdir -p "${PREFIX}/etc/conda/activate.d" "${PREFIX}/etc/conda/deactivate.d" diff --git a/conda/mpich/conda_build_config.yaml b/conda/mpich/conda_build_config.yaml index 1de3a93b5439..44c3814a5d34 100644 --- a/conda/mpich/conda_build_config.yaml +++ b/conda/mpich/conda_build_config.yaml @@ -11,13 +11,13 @@ vtk_version: - 9.1.0 moose_libmesh_vtk: - - moose-libmesh-vtk 9.1.0 build_4 + - moose-libmesh-vtk 9.1.0 build_5 moose_petsc: - moose-petsc 3.15.1 build_8 moose_mpich: - - moose-mpich 3.4.2 build_3 + - moose-mpich 4.0.1 build_0 #### MOOSE_TOOLS stuff (order is important, must match python version order) moose_python: @@ -194,55 +194,25 @@ zip_keys: - moose_sympy #### Compilers -moose_cc: # [unix] - - gcc_linux-64 9.3.0 h7247604_29 # [linux] - - clang_osx-64 12.0.1 h633439f_6 # [not arm64 and osx] - - clang_osx-arm64 12.0.1 h54d7cd3_0 # [arm64] - -moose_cxx: # [unix] - - gxx_linux-64 9.3.0 h0d07fa4_29 # [linux] - - clangxx_osx-64 12.0.1 hdb584c0_6 # [not arm64 and osx] - - clangxx_osx-arm64 12.0.1 hb84c830_0 # [arm64] - -moose_fortran: # [unix] - - gfortran_linux-64 9.3.0 ha1c937c_29 # [linux] - - gfortran_osx-64 9.3.0 h18f7dce_15 # [not arm64 and osx] - - gfortran_osx-arm64 11.0.1.dev0 h57527a5_14 # [arm64] - -moose_impl: # [linux] - - gcc_impl_linux-64 9.3.0 h70c0ae5_19 # [linux] - -moose_impl_xx: # [linux] - - gxx_impl_linux-64 9.3.0 hd87eabc_19 # [linux] - -moose_libgcc: # [linux] - - libgcc-devel_linux-64 9.3.0 h7864c58_19 # [linux] - -moose_libstd: # [linux] - - libstdcxx-devel_linux-64 9.3.0 hb016644_19 # [linux] - -moose_sysroot: # [linux] - - sysroot_linux-64 2.17 h4a8ded7_13 # [linux] - -moose_libcxx: # [osx] - - libcxx 12.0.1 habf9029_1 # [not arm64 and osx] - - libcxx 12.0.1 h168391b_0 # [arm64] - -moose_libclang: # [osx] - - libclang 13.0.0 default_he082bbe_0 # [not arm64 and osx] - - libclang 12.0.1 default_h2cfa9b4_4 # [arm64] - -moose_openmp: # [osx] - - llvm-openmp 12.0.1 hda6cdc1_1 # [not arm64 and osx] - - llvm-openmp 12.0.1 hf3c4609_1 # [arm64] - -moose_llvm_tools: # [osx] - - llvm-tools 12.0.1 hd011deb_2 # [not arm64 and osx] - - llvm-tools 12.0.1 h93073aa_2 # [arm64] - -moose_ld64: # [osx] - - ld64 609 hd2e7500_4 # [not arm64 and osx] - - ld64_osx-arm64 530 ha291f0b_23 # [arm64] +base_mpich: + - mpich 4.0.1 h846660c_100 # [linux] + - mpich 4.0.1 hd33e60e_100 # [not arm64 and osx] + - mpich 4.0.1 hd4b5bf3_100 # [arm64] + +base_mpicc: + - mpich-mpicc 4.0.1 hb600da9_100 # [linux] + - mpich-mpicc 4.0.1 h4fd26ce_100 # [not arm64 and osx] + - mpich-mpicc 4.0.1 haad7f49_100 # [arm64] + +base_mpicxx: + - mpich-mpicxx 4.0.1 h166bdaf_100 # [linux] + - mpich-mpicxx 4.0.1 h5eb16cf_100 # [not arm64 and osx] + - mpich-mpicxx 4.0.1 h1c322ee_100 # [arm64] + +base_mpifort: + - mpich-mpifort 4.0.1 h924138e_100 # [linux] + - mpich-mpifort 4.0.1 hbb4e6a2_100 # [not arm64 and osx] + - mpich-mpifort 4.0.1 h3e96240_100 # [arm64] #### Support Libraries (libMesh and VTK) moose_libglu: # [linux] diff --git a/conda/mpich/meta.yaml b/conda/mpich/meta.yaml index f7e31d8342d5..7228ef746393 100644 --- a/conda/mpich/meta.yaml +++ b/conda/mpich/meta.yaml @@ -1,15 +1,13 @@ -{% set build = 3 %} +{% set build = 0 %} {% set strbuild = "build_" + build|string %} -{% set version = "3.4.2" %} +{% set version = "4.0.1" %} package: name: moose-mpich version: {{ version }} source: - fn: mpich-{{ version }}.tar.gz - url: https://www.mpich.org/static/downloads/{{ version }}/mpich-{{ version }}.tar.gz - sha256: 5c19bea8b84e8d74cca5f047e82b147ff3fba096144270e3911ad623d6c587bf + - path: . build: number: {{ build }} @@ -20,19 +18,10 @@ build: requirements: build: - - {{ moose_cc }} - - {{ moose_cxx }} - - {{ moose_fortran }} - - {{ moose_impl }} # [linux] - - {{ moose_impl_xx }} # [linux] - - {{ moose_libgcc }} # [linux] - - {{ moose_libstd }} # [linux] - - {{ moose_sysroot }} # [linux] - - {{ moose_libcxx }} # [osx] - - {{ moose_libclang }} # [osx] - - {{ moose_openmp }} # [osx] - - {{ moose_llvm_tools }} # [osx] - - {{ moose_ld64 }} # [osx] + - {{ base_mpich }} + - {{ base_mpicc }} + - {{ base_mpicxx }} + - {{ base_mpifort }} - autoconf # [unix] - automake # [unix] - libtool # [unix] @@ -40,19 +29,10 @@ requirements: - gnuconfig # [arm64] host: [] run: - - {{ moose_cc }} - - {{ moose_cxx }} - - {{ moose_fortran }} - - {{ moose_impl }} # [linux] - - {{ moose_impl_xx }} # [linux] - - {{ moose_libgcc }} # [linux] - - {{ moose_libstd }} # [linux] - - {{ moose_sysroot }} # [linux] - - {{ moose_libcxx }} # [osx] - - {{ moose_libclang }} # [osx] - - {{ moose_openmp }} # [osx] - - {{ moose_llvm_tools }} # [osx] - - {{ moose_ld64 }} # [osx] + - {{ base_mpich }} + - {{ base_mpicc }} + - {{ base_mpicxx }} + - {{ base_mpifort }} - autoconf # [osx] - automake # [osx] - libtool # [osx] @@ -60,17 +40,13 @@ requirements: - {{ pin_compatible('setuptools', lower_bound='58', upper_bound='60') }} - mpi 1.0 mpich test: - script: run_test.sh - files: - - mpiexec.sh - - tests/helloworld.sh + commands: + - test -f $PREFIX/etc/conda/activate.d/activate_moose-mpich.sh about: - home: http://www.mpich.org/ - license: MPICH - license_file: COPYRIGHT - license_family: Other - summary: 'A high performance widely portable implementation of the MPI standard.' + home: https://mooseframework.org/ + license: LGPL 2.1 + summary: 'Top Level packages designed to control environment variables for conda-forge mpich' description: | MPICH is a high performance and widely portable implementation of the Message Passing Interface (MPI) standard. diff --git a/conda/mpich/mpiexec.sh b/conda/mpich/mpiexec.sh deleted file mode 100755 index 26aef3fcb6a5..000000000000 --- a/conda/mpich/mpiexec.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -set -euo pipefail -# pipe stdout, stderr through cat to avoid O_NONBLOCK issues -exec mpiexec "$@" 2>&1 -#include - -int main(int argc, char *argv[]) -{ - int provided, size, rank, len; - char name[MPI_MAX_PROCESSOR_NAME]; - - MPI_Init(&argc, &argv); - - MPI_Comm_size(MPI_COMM_WORLD, &size); - MPI_Comm_rank(MPI_COMM_WORLD, &rank); - MPI_Get_processor_name(name, &len); - - printf("Hello, World! I am process %d of %d on %s.\n", rank, size, name); - - MPI_Finalize(); - return 0; -} diff --git a/conda/mpich/tests/helloworld.cxx b/conda/mpich/tests/helloworld.cxx deleted file mode 100644 index 00f973bcf6a8..000000000000 --- a/conda/mpich/tests/helloworld.cxx +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include - -int main(int argc, char *argv[]) -{ - MPI::Init(); - - int size = MPI::COMM_WORLD.Get_size(); - int rank = MPI::COMM_WORLD.Get_rank(); - int len; char name[MPI_MAX_PROCESSOR_NAME]; - MPI::Get_processor_name(name, len); - - std::cout << - "Hello, World! " << - "I am process " << rank << - " of " << size << - " on " << name << - "." << std::endl; - - MPI::Finalize(); - return 0; -} diff --git a/conda/mpich/tests/helloworld.f b/conda/mpich/tests/helloworld.f deleted file mode 100644 index 4fdff899ffe4..000000000000 --- a/conda/mpich/tests/helloworld.f +++ /dev/null @@ -1,21 +0,0 @@ - program main - - include 'mpif.h' - - integer ierr, rank, size, len - character name*(MPI_MAX_PROCESSOR_NAME) - - call MPI_INIT(ierr) - call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) - call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr) - call MPI_GET_PROCESSOR_NAME(name, len, ierr) - - print '(2A,I2,A,I2,3A)', - & 'Hello, World! ', - & 'I am process ', rank, - & ' of ', size, - & ' on ', trim(name), '.' - - call MPI_FINALIZE(ierr) - - end diff --git a/conda/mpich/tests/helloworld.f90 b/conda/mpich/tests/helloworld.f90 deleted file mode 100644 index 5d829bf26195..000000000000 --- a/conda/mpich/tests/helloworld.f90 +++ /dev/null @@ -1,23 +0,0 @@ -program main - - use mpi - implicit none - - integer :: provided, ierr, size, rank, len - character (len=MPI_MAX_PROCESSOR_NAME) :: name - - call MPI_Init(ierr) - - call MPI_Comm_rank(MPI_COMM_WORLD, rank, ierr) - call MPI_Comm_size(MPI_COMM_WORLD, size, ierr) - call MPI_Get_processor_name(name, len, ierr) - - write(*, '(2A,I2,A,I2,3A)') & - 'Hello, World! ', & - 'I am process ', rank, & - ' of ', size, & - ' on ', name(1:len), '.' - - call MPI_Finalize(ierr) - -end program main diff --git a/conda/mpich/tests/helloworld.sh b/conda/mpich/tests/helloworld.sh deleted file mode 100755 index 920f94763bf3..000000000000 --- a/conda/mpich/tests/helloworld.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -set -eu -rank=$PMI_RANK -size=$PMI_SIZE -printf "Hello, World! I am process %d of %d.\n" $rank $size diff --git a/conda/pyhit/meta.yaml b/conda/pyhit/meta.yaml index 96bdea11d9b4..08cf41af5103 100644 --- a/conda/pyhit/meta.yaml +++ b/conda/pyhit/meta.yaml @@ -1,5 +1,5 @@ {% set build = 0 %} -{% set version = "2022.01.24" %} +{% set version = "2022.03.15" %} package: name: moose-pyhit @@ -14,17 +14,17 @@ build: requirements: build: - - {{ moose_cxx }} + - {{ moose_mpich }} - {{ moose_python }} - cython host: - - {{ moose_cxx }} + - {{ moose_mpich }} - {{ moose_python }} - cython run: - - {{ moose_cxx }} + - {{ moose_mpich }} - {{ pin_compatible('setuptools', lower_bound='58', upper_bound='60') }} - python diff --git a/conda/tools/meta.yaml b/conda/tools/meta.yaml index 01476b0ee535..f969ea2c8ce5 100644 --- a/conda/tools/meta.yaml +++ b/conda/tools/meta.yaml @@ -1,5 +1,5 @@ {% set build = 0 %} -{% set version = "2022.01.25" %} +{% set version = "2022.03.15" %} package: name: moose-tools @@ -17,18 +17,7 @@ requirements: - {{ pin_compatible('setuptools', lower_bound='58', upper_bound='60') }} run: - - {{ moose_cc }} - - {{ moose_cxx }} - - {{ moose_fortran }} - - {{ moose_impl }} # [linux] - - {{ moose_impl_xx }} # [linux] - - {{ moose_libgcc }} # [linux] - - {{ moose_libstd }} # [linux] - - {{ moose_libcxx }} # [osx] - - {{ moose_libclang }} # [osx] - - {{ moose_openmp }} # [osx] - - {{ moose_llvm_tools }} # [osx] - - {{ moose_ld64 }} # [osx] + - {{ moose_mpich }} - {{ moose_vtk }} - {{ moose_numpy }} - {{ moose_pyqt }} # [not arm64] From ef04c16333fc4441b2fdc793ec88622e9453a4a4 Mon Sep 17 00:00:00 2001 From: Fande Kong Date: Thu, 11 Nov 2021 12:22:03 -0700 Subject: [PATCH 43/71] Upgrade to PETSc-3.16.5 Refs #00000 --- conda/mpich/conda_build_config.yaml | 2 +- conda/petsc/meta.yaml | 6 +++--- petsc | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/conda/mpich/conda_build_config.yaml b/conda/mpich/conda_build_config.yaml index 44c3814a5d34..448e98df98cd 100644 --- a/conda/mpich/conda_build_config.yaml +++ b/conda/mpich/conda_build_config.yaml @@ -14,7 +14,7 @@ moose_libmesh_vtk: - moose-libmesh-vtk 9.1.0 build_5 moose_petsc: - - moose-petsc 3.15.1 build_8 + - moose-petsc 3.16.5 build_0 moose_mpich: - moose-mpich 4.0.1 build_0 diff --git a/conda/petsc/meta.yaml b/conda/petsc/meta.yaml index a4e6d70c8449..1f3cfac53a63 100644 --- a/conda/petsc/meta.yaml +++ b/conda/petsc/meta.yaml @@ -1,7 +1,7 @@ # Do not use jinja templating (A physical change to this file is required to trigger a build) -{% set build = 8 %} +{% set build = 0 %} {% set strbuild = "build_" + build|string %} -{% set version = "3.15.1" %} +{% set version = "3.16.5" %} {% set sha256 = "d676eb67e79314d6cca6422d7c477d2b192c830b89d5edc6b46934f7453bcfc0" %} package: @@ -50,7 +50,7 @@ test: - pkg-config --libs PETSc about: - home: http://www.mcs.anl.gov/petsc/ + home: https://petsc.org summary: 'PETSc: Portable, Extensible Toolkit for Scientific Computation' license: BSD 2-Clause license_file: LICENSE diff --git a/petsc b/petsc index 09da24df01e5..f855b9549373 160000 --- a/petsc +++ b/petsc @@ -1 +1 @@ -Subproject commit 09da24df01e50defd94bc4f7396f866a808ecea5 +Subproject commit f855b95493736b087b8ccc16dc6c5b29bc4b5aa8 From 07dc5614076a9185ae0d299074d6c44f1dd3fba4 Mon Sep 17 00:00:00 2001 From: Fande Kong Date: Mon, 7 Mar 2022 10:49:57 -0700 Subject: [PATCH 44/71] Let PETSc figure that out LIBS="-lmpifort -lgfortran" --- conda/petsc/build.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/conda/petsc/build.sh b/conda/petsc/build.sh index 924cde40a76d..9ffd9aaafc40 100755 --- a/conda/petsc/build.sh +++ b/conda/petsc/build.sh @@ -16,7 +16,7 @@ export CXXFLAGS=$(echo ${CXXFLAGS:-} | sed -E 's@\-fdebug\-prefix\-map[^ ]*@@g') export FFLAGS=$(echo ${FFLAGS:-} | sed -E 's@\-fdebug\-prefix\-map[^ ]*@@g') export FCFLAGS="$FFLAGS" export HYDRA_LAUNCHER=fork -export LIBS="-lmpifort -lgfortran" +#export LIBS="-lmpifort -lgfortran" if [[ $(uname) == Darwin ]]; then if [[ $HOST == arm64-apple-darwin20.0.0 ]]; then @@ -65,7 +65,6 @@ configure_petsc \ FFLAGS="$FFLAGS" \ FCFLAGS="$FCFLAGS" \ LDFLAGS="$LDFLAGS" \ - LIBS="$LIBS" \ --prefix=$PREFIX || (cat configure.log && exit 1) # Verify that gcc_ext isn't linked From c5335635e5716cd666dd1426330fc33bcf82915f Mon Sep 17 00:00:00 2001 From: Fande Kong Date: Thu, 10 Mar 2022 14:00:12 -0700 Subject: [PATCH 45/71] Update conda/petsc/build.sh Co-authored-by: Logan Harbour --- conda/petsc/build.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/conda/petsc/build.sh b/conda/petsc/build.sh index 9ffd9aaafc40..ebeedf23cef3 100755 --- a/conda/petsc/build.sh +++ b/conda/petsc/build.sh @@ -16,7 +16,6 @@ export CXXFLAGS=$(echo ${CXXFLAGS:-} | sed -E 's@\-fdebug\-prefix\-map[^ ]*@@g') export FFLAGS=$(echo ${FFLAGS:-} | sed -E 's@\-fdebug\-prefix\-map[^ ]*@@g') export FCFLAGS="$FFLAGS" export HYDRA_LAUNCHER=fork -#export LIBS="-lmpifort -lgfortran" if [[ $(uname) == Darwin ]]; then if [[ $HOST == arm64-apple-darwin20.0.0 ]]; then From 3b92c2f3c172fbedb209e794fb4d7d8e77a1b7a4 Mon Sep 17 00:00:00 2001 From: Fande Kong Date: Thu, 10 Mar 2022 20:29:34 -0700 Subject: [PATCH 46/71] Added valgrind supp Update python/TestHarness/suppressions/errors.supp Co-authored-by: Alex Lindsay --- python/TestHarness/suppressions/errors.supp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/python/TestHarness/suppressions/errors.supp b/python/TestHarness/suppressions/errors.supp index 92468a4ab731..1e217f78e5d9 100644 --- a/python/TestHarness/suppressions/errors.supp +++ b/python/TestHarness/suppressions/errors.supp @@ -189,3 +189,16 @@ fun:*boost*math* ... } +{ + hypre_leaks + Memcheck:Leak + fun:hypre_HostMalloc + fun:hypre_MAlloc_core + fun:hypre_CAlloc + fun:hypre_IntArrayCreate + fun:hypre_BoomerAMGCoarseParmsHost + fun:hypre_BoomerAMGCoarseParms + fun:hypre_BoomerAMGSetup + fun:HYPRE_BoomerAMGSetup + fun:PCSetUp_HYPRE +} From 65f5e84e8a1ec4984269b46accb3ba20a24a4bb7 Mon Sep 17 00:00:00 2001 From: Casey Icenhour Date: Wed, 16 Mar 2022 15:58:16 -0600 Subject: [PATCH 47/71] Update March 2022 newsletter --- modules/doc/content/newsletter/2022_03.md | 35 +++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/modules/doc/content/newsletter/2022_03.md b/modules/doc/content/newsletter/2022_03.md index 5bb124219159..b494b4c0444e 100644 --- a/modules/doc/content/newsletter/2022_03.md +++ b/modules/doc/content/newsletter/2022_03.md @@ -13,6 +13,24 @@ MOOSE now requires a C++17 capable compiler and supports C++17 features. With th ## libMesh-level Changes +### `2022.03.16` Update + +- Update MetaPhysicL + - Add ValueType for `std::array`, `std::vector` + - Implement `ReplaceAlgebraicType` + - Add tolerance to `DynamicSparseNumberBase::sparsity_trim` + - Simplify end/begin/rend/rbegin + - When we exceed our `DynamicStdArray` wrapper container size, we'll throw +- Make `DynamicStdArrayWrapper` member protected +- Factor out push_node, respect offset +- Allow proper constness for our MeshBase iterators +- `libmesh_not_implemented()` in all unimplemented `TypeNTensor` functions +- README: branching description, devel Civet badge +- memcpy warning fix in `TypeNTensor` +- `Poly2Tri` refinement fixes + +### `2022.03.02` Update + - Work towards source code compatibility with Windows - Add an additional `outer_product` definition that supports `scalar * vector -> vector` - Add auto-detection for PETSc external packages, notably HDF5 @@ -25,4 +43,21 @@ MOOSE now requires a C++17 capable compiler and supports C++17 features. With th - Require C++17 support and begin using it internally - Add new static `TensorValue::rotation_matrix` helper functions +## PETSc-level Changes + +PETSc has been updated to the 3.16.5 release. This release should have performance +improvements and better infrastructure support, but much of the update is transparent +to MOOSE users. The detailed PETSc release notes can be found at [the PETSc website](https://petsc.org/release/docs/changes/316/). + +Changes that may be interesting to MOOSE users include the following: +- Added PCQR - an interface to SuiteSparse QR factorization, which is a direct + solver. This can be triggered in MOOSE using the `-pc_type qr` option. +- PETSc has better GPU support via native solver options like GAMG, or other third-party + solver options such as HYPRE. The enhanced GPU capability can be triggered in + MOOSE via the `-mat_type aijcusparse -vec_type cuda` command line option. Note + that GPU capability is still experimental in MOOSE, and only algebra solver + operations are available on GPUs. Residual and Jacobian evaluations are not + available on GPUs yet. If you want to have meaningful performance improvement, + you have to explore many problem-dependent PETSc options. + ## Bug Fixes and Minor Enhancements From 960623e8e66f693030a8f541fe39e41e3d0ce181 Mon Sep 17 00:00:00 2001 From: Casey Icenhour Date: Wed, 16 Mar 2022 19:56:22 -0600 Subject: [PATCH 48/71] M1 fixes related to PETSc 3.16 (#20580) Also removes old build instructions for M1 packages since we now provide them --- conda/petsc/arm64_framework.patch | 12 --- conda/petsc/meta.yaml | 1 - .../installation/m1_monterey.md | 81 ------------------- 3 files changed, 94 deletions(-) delete mode 100644 conda/petsc/arm64_framework.patch delete mode 100644 modules/doc/content/getting_started/installation/m1_monterey.md diff --git a/conda/petsc/arm64_framework.patch b/conda/petsc/arm64_framework.patch deleted file mode 100644 index cfed237a9d62..000000000000 --- a/conda/petsc/arm64_framework.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/config/BuildSystem/config/framework.py b/config/BuildSystem/config/framework.py -index 214b1abef1..d63871e91f 100644 ---- a/config/BuildSystem/config/framework.py -+++ b/config/BuildSystem/config/framework.py -@@ -550,6 +550,7 @@ class Framework(config.base.Configure, script.LanguageProcessor): - lines = [s for s in lines if s.find(' was built for newer macOS version') < 0] - lines = [s for s in lines if s.find(' was built for newer OSX version') < 0] - lines = [s for s in lines if s.find(' stack subq instruction is too different from dwarf stack size') < 0] -+ lines = [s for s in lines if s.find(' could not create compact unwind for') < 0] - if lines: output = '\n'.join(lines) - else: output = '' - self.log.write("Linker output after filtering:\n"+output+":\n") diff --git a/conda/petsc/meta.yaml b/conda/petsc/meta.yaml index 1f3cfac53a63..4a118cfd976f 100644 --- a/conda/petsc/meta.yaml +++ b/conda/petsc/meta.yaml @@ -12,7 +12,6 @@ source: - path: ../../petsc - path: ../../scripts/configure_petsc.sh - patches: - - arm64_framework.patch # [arm64] - no-cppflags-in-pkgconfig-cflags.patch build: diff --git a/modules/doc/content/getting_started/installation/m1_monterey.md b/modules/doc/content/getting_started/installation/m1_monterey.md deleted file mode 100644 index 551908d85ec2..000000000000 --- a/modules/doc/content/getting_started/installation/m1_monterey.md +++ /dev/null @@ -1,81 +0,0 @@ -# Process for building moose-mpich and then MOOSE on ARM64 (M1, Monterey) - -!alert! construction title=Work In Progress -This document is intended to be a living one, as M1 support is added and the current -"best practice" of installing it improved. As of 21 Jan 2022, full, public package -support (i.e., `moose-mpich` + `moose-petsc` + `moose-libmesh`) is not yet available. -!alert-end! - -!alert! note title=Mambaforge3 -This guide assumes that you have mambaforge3 installed. The [MOOSE installation instructions for conda](conda.md) -can be used to perform the installation. Note for those instructions that `x86_64` -in the name of the Mambaforge install script should be replaced with `arm64`. -!alert-end! - -1. Download MacOSX 11.3 SDK [via GitHub](https://github.com/phracker/MacOSX-SDKs/releases/download/11.3/MacOSX11.3.sdk.tar.xz). - -2. Extract the SDK and place it in `/opt/` - -3. Set up conda build environment: - - ``` - conda deactivate - conda create -n build -y - conda activate build - mamba install boa - ``` - - Deactivate and re-activate to ensure environment is in the proper state: - - ``` - conda deactivate - conda activate build - ``` - -4. Initialize MOOSE submodules (as well as all libMesh contrib submodules): - - ``` - git submodule update --init petsc libmesh - cd ~/projects/moose/libmesh - git submodule update --init --recursive - ``` - -5. Build MOOSE packages locally and in order of dependency (this step will take some time): - - ``` - cd ~/projects/moose/conda - conda mambabuild mpich - conda mambabuild libmesh-vtk - conda mambabuild petsc - conda mambabuild libmesh - conda mambabuild tools - ``` - -6. Create development environment (can name it something other than "testing" if you want): - - ``` - conda deactivate - conda create -n testing -y - conda activate testing - mamba install -c ~/mambaforge3/envs/build/conda-bld moose-libmesh moose-tools - ``` - - !alert! tip - IMPORTANT: Close and re-open the Terminal so that the environment variables - can be properly set upon activation - !alert-end! - -7. Build and test MOOSE: - - ``` - conda activate testing - cd ~/projects/moose/test - make -j8 - ./run_tests -j8 - ``` - -!alert! warning title=Failing tests -This method of building MOOSE should pass all framework and unit tests in the `opt` -build mode. Currently (as of 21 Jan 2022), only a handful of geochemistry tests -are failing. "Heavy" tests still need to be tested more thoroughly. -!alert-end! From 51e0435899613daa4e4ddce557c5a2c1b84b2df7 Mon Sep 17 00:00:00 2001 From: Alex Lindsay Date: Thu, 17 Mar 2022 09:13:08 -0700 Subject: [PATCH 49/71] More specific suppression --- python/TestHarness/suppressions/errors.supp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/python/TestHarness/suppressions/errors.supp b/python/TestHarness/suppressions/errors.supp index 1e217f78e5d9..8bfd4975c003 100644 --- a/python/TestHarness/suppressions/errors.supp +++ b/python/TestHarness/suppressions/errors.supp @@ -202,3 +202,22 @@ fun:HYPRE_BoomerAMGSetup fun:PCSetUp_HYPRE } +{ + hypre_more_specific_leak + Memcheck:Leak + match-leak-kinds: definite + fun:calloc + fun:hypre_HostMalloc + fun:hypre_MAlloc_core + fun:hypre_CAlloc + fun:hypre_IntArrayCreate + fun:hypre_BoomerAMGCoarseParmsHost + fun:hypre_BoomerAMGCoarseParms + fun:hypre_BoomerAMGSetup + fun:HYPRE_BoomerAMGSetup + fun:PCSetUp_HYPRE + fun:PCSetUp + fun:KSPSetUp + fun:KSPSolve_Private + fun:KSPSolve +} From 025949373062e59ba9ffb4300c4bfa62cafd06c7 Mon Sep 17 00:00:00 2001 From: Casey Icenhour Date: Thu, 17 Mar 2022 17:37:44 -0600 Subject: [PATCH 50/71] Fixup warnings (#20580) - Convert extra_ghost_elem_inserter away from std::interator - Convert infix_ostream_iterator away from std::iterator for clang and GCC > 9. - Ignore memory overlap and variable warnings from tinydir - Fixup compound assignment operator used in boolean context in PeridynamicsMesh - Fixup deprecated declarations error (C++17) from Eigen in LeastSquaresFitBase --- framework/include/utils/InfixIterator.h | 11 +++++++++++ framework/src/mesh/MooseMesh.C | 5 ++++- framework/src/utils/LeastSquaresFitBase.C | 3 +++ framework/src/utils/MooseUtils.C | 12 ++++++++++++ modules/peridynamics/src/mesh/PeridynamicsMesh.C | 6 ++++-- .../test/plugins/elastic_print_eigen.C | 3 +++ 6 files changed, 37 insertions(+), 3 deletions(-) diff --git a/framework/include/utils/InfixIterator.h b/framework/include/utils/InfixIterator.h index f6fc68fa5f68..00328cab5210 100644 --- a/framework/include/utils/InfixIterator.h +++ b/framework/include/utils/InfixIterator.h @@ -17,8 +17,19 @@ template > class infix_ostream_iterator +/** + * GCC9 currently hits a "no type named 'value_type'" error during build if this + * is removed and iterator traits are listed within the class corresponding to the + * C++17 standard. This preserves use of std::iterator for GCC9 and earlier. + */ +#if defined(__GNUC__) && !defined(__clang__) && (__GNUC__ <= 9) : public std::iterator +#endif { +#if defined(__clang__) || (__GNUC__ > 9) + using iterator_category = std::output_iterator_tag; +#endif + std::basic_ostream * os; charT const * delimiter; bool first_elem; diff --git a/framework/src/mesh/MooseMesh.C b/framework/src/mesh/MooseMesh.C index 6d28873b9a2c..94084c2a86b5 100644 --- a/framework/src/mesh/MooseMesh.C +++ b/framework/src/mesh/MooseMesh.C @@ -2688,8 +2688,11 @@ namespace // Anonymous namespace for helpers // iterator_traits will work. // This object specifically is used to insert extra ghost elems into the mesh template -struct extra_ghost_elem_inserter : std::iterator +struct extra_ghost_elem_inserter { + using iterator_category = std::output_iterator_tag; + using value_type = T; + extra_ghost_elem_inserter(DistributedMesh & m) : mesh(m) {} void operator=(const Elem * e) { mesh.add_extra_ghost_elem(const_cast(e)); } diff --git a/framework/src/utils/LeastSquaresFitBase.C b/framework/src/utils/LeastSquaresFitBase.C index f3cf91aada4e..7c2522b06955 100644 --- a/framework/src/utils/LeastSquaresFitBase.C +++ b/framework/src/utils/LeastSquaresFitBase.C @@ -11,7 +11,10 @@ #include "MooseError.h" #include "libmesh/int_range.h" +// Ignore warnings from Eigen related to deprecated declarations (C++17) +#include "libmesh/ignore_warnings.h" #include +#include "libmesh/restore_warnings.h" LeastSquaresFitBase::LeastSquaresFitBase() {} diff --git a/framework/src/utils/MooseUtils.C b/framework/src/utils/MooseUtils.C index e9cfad5813e9..878ce3ca9d0e 100644 --- a/framework/src/utils/MooseUtils.C +++ b/framework/src/utils/MooseUtils.C @@ -24,7 +24,19 @@ // External includes #include "pcrecpp.h" +/** + * Ignore GCC warnings from tinydir corresponding to memory overlap and possible + * uninitialized variables + */ +#if defined(__GNUC__) && !defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wrestrict" +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif #include "tinydir.h" +#if defined(__GNUC__) && !defined(__clang__) +#pragma GCC diagnostic pop +#endif // C++ includes #include diff --git a/modules/peridynamics/src/mesh/PeridynamicsMesh.C b/modules/peridynamics/src/mesh/PeridynamicsMesh.C index cd922fbc867e..85ed28e783dc 100644 --- a/modules/peridynamics/src/mesh/PeridynamicsMesh.C +++ b/modules/peridynamics/src/mesh/PeridynamicsMesh.C @@ -527,13 +527,15 @@ PeridynamicsMesh::checkPointInsideRectangle( Real a = rec_p2(1) - rec_p1(1); Real b = rec_p1(0) - rec_p2(0); Real c = rec_p2(0) * rec_p1(1) - rec_p2(1) * rec_p1(0); - inside *= std::abs(a * point(0) + b * point(1) + c) / crack_length < rec_height / 2.0; + inside = + inside && (std::abs(a * point(0) + b * point(1) + c) / crack_length < rec_height / 2.0); a = rec_p2(0) - rec_p1(0); b = rec_p2(1) - rec_p1(1); c = 0.5 * (rec_p1(1) * rec_p1(1) - rec_p2(1) * rec_p2(1) - rec_p2(0) * rec_p2(0) + rec_p1(0) * rec_p1(0)); - inside *= std::abs(a * point(0) + b * point(1) + c) / crack_length < (tol + crack_length) / 2.0; + inside = inside && (std::abs(a * point(0) + b * point(1) + c) / crack_length < + (tol + crack_length) / 2.0); } return inside; diff --git a/modules/tensor_mechanics/test/plugins/elastic_print_eigen.C b/modules/tensor_mechanics/test/plugins/elastic_print_eigen.C index 04b081aaf113..60230c7d49eb 100644 --- a/modules/tensor_mechanics/test/plugins/elastic_print_eigen.C +++ b/modules/tensor_mechanics/test/plugins/elastic_print_eigen.C @@ -2,7 +2,10 @@ #pragma GCC diagnostic ignored "-Wunused-parameter" #include +// Ignore warnings from Eigen related to deprecated declarations (C++17) +#include "libmesh/ignore_warnings.h" #include +#include "libmesh/restore_warnings.h" #include "MooseError.h" From 4784ecf0a05bfda53227916d79c0878f7c47f54f Mon Sep 17 00:00:00 2001 From: Casey Icenhour Date: Thu, 17 Mar 2022 20:28:59 -0600 Subject: [PATCH 51/71] Fixup XFEM parallel test (#20580) --- modules/xfem/test/tests/moving_interface/moving_ad_diffusion.i | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/xfem/test/tests/moving_interface/moving_ad_diffusion.i b/modules/xfem/test/tests/moving_interface/moving_ad_diffusion.i index ef246bc4ef83..1a9b486db80b 100644 --- a/modules/xfem/test/tests/moving_interface/moving_ad_diffusion.i +++ b/modules/xfem/test/tests/moving_interface/moving_ad_diffusion.i @@ -126,7 +126,7 @@ l_max_its = 20 l_tol = 1e-8 nl_max_its = 15 - nl_rel_tol = 1e-12 + nl_rel_tol = 2e-12 nl_abs_tol = 1e-50 start_time = 0.0 From 597674f2ee80c10acdab6096117300bc3478d5fc Mon Sep 17 00:00:00 2001 From: Jason Miller Date: Fri, 18 Mar 2022 10:26:15 -0600 Subject: [PATCH 52/71] Use conda suggested compilers Use Conda's suggested compilers when building moose-pyhit. This package does not / should not have the same constraints as our main stack. --- conda/pyhit/meta.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/conda/pyhit/meta.yaml b/conda/pyhit/meta.yaml index 08cf41af5103..aa249122cbda 100644 --- a/conda/pyhit/meta.yaml +++ b/conda/pyhit/meta.yaml @@ -14,17 +14,16 @@ build: requirements: build: - - {{ moose_mpich }} + - {{ compiler('cxx') }} - {{ moose_python }} - cython host: - - {{ moose_mpich }} + - {{ compiler('cxx') }} - {{ moose_python }} - cython run: - - {{ moose_mpich }} - {{ pin_compatible('setuptools', lower_bound='58', upper_bound='60') }} - python From 299e1a4bdb0d1569357fbf7bd389925623273527 Mon Sep 17 00:00:00 2001 From: Casey Icenhour Date: Fri, 18 Mar 2022 13:14:31 -0600 Subject: [PATCH 53/71] More March 2022 news updates --- modules/doc/content/newsletter/2022_03.md | 78 +++++++++++++++++++++-- 1 file changed, 74 insertions(+), 4 deletions(-) diff --git a/modules/doc/content/newsletter/2022_03.md b/modules/doc/content/newsletter/2022_03.md index b494b4c0444e..8f6bdd54a72e 100644 --- a/modules/doc/content/newsletter/2022_03.md +++ b/modules/doc/content/newsletter/2022_03.md @@ -5,22 +5,91 @@ This MOOSE Newsletter edition is in progress. Please check back in April 2022 for a complete description of all MOOSE changes. !alert-end! +## MPICH Updated to 4.0.1, GCC to 10.3.0 + +The `moose-mpich` package has been updated to 4.0.1 and now relies entirely on +the MPICH built by the conda-forge maintainers (`mpich-mpicc`, `mpich-mpicxx`, +and `mpich-mpifort`). As a result of this change, the default compilers installed +on Linux using the MOOSE package are now GCC 10.3.0 / gfortran 10.3.0. Minimum +supported compilers (see [below](2022_03.md#cxx17-support)) remain the same and +Clang 12.0.1 / gfortran 9.3.0 is still the default compiler set on MacOS. The bulk +of MOOSE PR testing will still be done using GCC 9, to maintain compatibility over +a broad range of compiler releases. + +To update your MOOSE packages, please activate your MOOSE conda environment and +perform the command: + +``` +conda update --all +``` + +The following package versions and builds outlined in the update prompt should be +at least the following: + +``` +Package Version Build +===================================================== +moose-libmesh 2022.03.18 build_0 +moose-libmesh-vtk 9.1.0 build_5 +moose-petsc 3.16.5 build_0 +moose-mpich 4.0.1 build_0 +``` + ## MOOSE Improvements -### C++17 Support +### C++17 Support id=cxx17-support + +MOOSE now requires a C++17 capable compiler and supports C++17 features. With +this, GCC 7 and Clang 5 are now the minimum supported compilers. + +### HDF5 support in PETSc and libMesh now requested by default + +The `update_and_rebuild_petsc` script now performs a basic search for a supported +HDF5 installation in the local environment by default. Developers can place an +HDF5 installation in the following searched locations: -MOOSE now requires a C++17 capable compiler and supports C++17 features. With this, GCC 7 and Clang 5 are now the minimum supported compilers. +- `/usr/lib/hdf5` +- `/usr/local/hdf5` +- `/usr/share/hdf5` +- `/usr/local/hdf5/share` +- `$HOME/.local` + +Or select a custom location by setting one of the environment variables `HDF5_DIR`, +`HDF5DIR`, or `HDF5_ROOT`. If a compatible installation cannot be found, PETSc +will download and build it for the user on Linux. This fallback download option +is not yet available on MacOS, but will be coming soon. Subsequently, the +`update_and_rebuild_libmesh` script now uses the `--enable-hdf5` configure flag +and, with recent libMesh changes, attempts to find the HDF5 installation used by +PETSc. + +The new conda packages mentioned above all contain the PETSc default HDF5 on Linux, +but no HDF5 is currently provided on MacOS (coming soon). A serial, pre-built HDF5 +is available within the `moose-tools` package on either platform if this is sufficient +for developer needs. ## libMesh-level Changes -### `2022.03.16` Update +### `2022.03.18` Update + +- Update MetaPhysicL + + - `OpFunction` support for `DualNumber` and `SemiDynamicSparseNumberArray`, which + means we can now do basic parallel `sum()` etc. on AD values. +- `get_nodeset_info()` to get nodeset info +- Fixes up deprecation warnings in custom iterators due to C++17 +- `Poly2Tri` updates/bugfixes related to refinement +- Support for non-uniform refinement with `Poly2Tri` +- Added virtual methods for specifying index maps that we can use for defining + the `RBParameterizedFunction` used in EIM approximations - Update MetaPhysicL + - Add ValueType for `std::array`, `std::vector` - Implement `ReplaceAlgebraicType` - Add tolerance to `DynamicSparseNumberBase::sparsity_trim` - Simplify end/begin/rend/rbegin - When we exceed our `DynamicStdArray` wrapper container size, we'll throw + - Make `DynamicStdArrayWrapper` member protected - Factor out push_node, respect offset - Allow proper constness for our MeshBase iterators @@ -49,7 +118,8 @@ PETSc has been updated to the 3.16.5 release. This release should have performan improvements and better infrastructure support, but much of the update is transparent to MOOSE users. The detailed PETSc release notes can be found at [the PETSc website](https://petsc.org/release/docs/changes/316/). -Changes that may be interesting to MOOSE users include the following: +Changes that may be interesting to MOOSE users include the following: + - Added PCQR - an interface to SuiteSparse QR factorization, which is a direct solver. This can be triggered in MOOSE using the `-pc_type qr` option. - PETSc has better GPU support via native solver options like GAMG, or other third-party From d7ccd2c738d4c9e7319b502f83dc5bbc3c4b46de Mon Sep 17 00:00:00 2001 From: Casey Icenhour Date: Fri, 18 Mar 2022 14:08:36 -0600 Subject: [PATCH 54/71] Update libmesh - Update MetaPhysicL - `OpFunction` support for `DualNumber` and `SemiDynamicSparseNumberArray`, which means we can now do basic parallel `sum()` etc. on AD values. - `get_nodeset_info()` to get nodeset info - Fixes up deprecation warnings in custom iterators due to C++17 - `Poly2Tri` updates/bugfixes related to refinement - Support for non-uniform refinement with `Poly2Tri` - Added virtual methods for specifying index maps that we can use for defining the `RBParameterizedFunction` used in EIM approximations - Update MetaPhysicL - Add ValueType for `std::array`, `std::vector` - Implement `ReplaceAlgebraicType` - Add tolerance to `DynamicSparseNumberBase::sparsity_trim` - Simplify end/begin/rend/rbegin - When we exceed our `DynamicStdArray` wrapper container size, we'll throw - Make `DynamicStdArrayWrapper` member protected - Factor out push_node, respect offset - Allow proper constness for our MeshBase iterators - `libmesh_not_implemented()` in all unimplemented `TypeNTensor` functions - README: branching description, devel Civet badge - memcpy warning fix in `TypeNTensor` - `Poly2Tri` refinement fixes --- conda/libmesh/meta.yaml | 4 ++-- conda/mpich/conda_build_config.yaml | 2 +- libmesh | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/conda/libmesh/meta.yaml b/conda/libmesh/meta.yaml index a2056163cce0..c62bc1f6e25a 100644 --- a/conda/libmesh/meta.yaml +++ b/conda/libmesh/meta.yaml @@ -1,7 +1,7 @@ # Do not use jinja templating (A physical change to this file is required to trigger a build) -{% set build = 1 %} +{% set build = 0 %} {% set strbuild = "build_" + build|string %} -{% set version = "2022.03.02" %} +{% set version = "2022.03.18" %} package: name: moose-libmesh diff --git a/conda/mpich/conda_build_config.yaml b/conda/mpich/conda_build_config.yaml index 448e98df98cd..bc40f7793476 100644 --- a/conda/mpich/conda_build_config.yaml +++ b/conda/mpich/conda_build_config.yaml @@ -2,7 +2,7 @@ ## Any changes made will require additional changes to any item above that. moose_libmesh: - - moose-libmesh 2022.03.02 build_1 + - moose-libmesh 2022.03.18 build_0 SHORT_VTK_NAME: - 9.1 diff --git a/libmesh b/libmesh index a7279e6a5f0e..7315cdb99555 160000 --- a/libmesh +++ b/libmesh @@ -1 +1 @@ -Subproject commit a7279e6a5f0ea1f621d894c55a771197241f8708 +Subproject commit 7315cdb99555e4d774fc149b8c659f1e56955053 From 94636b2d93d78ec3f3450d189db42164b500eeda Mon Sep 17 00:00:00 2001 From: Casey Icenhour Date: Tue, 22 Mar 2022 14:36:05 -0600 Subject: [PATCH 55/71] Address review comments (#20580) --- conda/libmesh/build.sh | 2 +- conda/mpich/meta.yaml | 2 +- conda/petsc/meta.yaml | 2 ++ modules/doc/content/newsletter/2022_03.md | 41 +++++++++++------------ scripts/configure_petsc.sh | 13 +++++-- scripts/update_and_rebuild_petsc.sh | 8 +---- 6 files changed, 35 insertions(+), 33 deletions(-) diff --git a/conda/libmesh/build.sh b/conda/libmesh/build.sh index 4280acd59011..bcced7de3c60 100644 --- a/conda/libmesh/build.sh +++ b/conda/libmesh/build.sh @@ -79,7 +79,7 @@ LIBMESH_DIR=${PREFIX}/libmesh \ --with-vtk-include=${BUILD_PREFIX}/libmesh-vtk/include/vtk-${SHORT_VTK_NAME} \ $* -CORES=$(echo "${CPU_COUNT:-2} / 2" | bc) +CORES=${MOOSE_JOBS:-2} make -j $CORES make install sed_replace diff --git a/conda/mpich/meta.yaml b/conda/mpich/meta.yaml index 7228ef746393..36a6f9423f38 100644 --- a/conda/mpich/meta.yaml +++ b/conda/mpich/meta.yaml @@ -46,7 +46,7 @@ test: about: home: https://mooseframework.org/ license: LGPL 2.1 - summary: 'Top Level packages designed to control environment variables for conda-forge mpich' + summary: 'A top-level package designed to control environment variables related to conda-forge provided MPICH' description: | MPICH is a high performance and widely portable implementation of the Message Passing Interface (MPI) standard. diff --git a/conda/petsc/meta.yaml b/conda/petsc/meta.yaml index 4a118cfd976f..80acd2160d2c 100644 --- a/conda/petsc/meta.yaml +++ b/conda/petsc/meta.yaml @@ -18,6 +18,8 @@ build: number: {{ build }} string: {{ strbuild }} skip: true # [win] + script_env: + - MOOSE_JOBS run_exports: - {{ pin_subpackage('moose-petsc', max_pin='x.x')}} diff --git a/modules/doc/content/newsletter/2022_03.md b/modules/doc/content/newsletter/2022_03.md index 8f6bdd54a72e..422e90fa6b63 100644 --- a/modules/doc/content/newsletter/2022_03.md +++ b/modules/doc/content/newsletter/2022_03.md @@ -5,7 +5,7 @@ This MOOSE Newsletter edition is in progress. Please check back in April 2022 for a complete description of all MOOSE changes. !alert-end! -## MPICH Updated to 4.0.1, GCC to 10.3.0 +## Conda MPICH Updated to 4.0.1, GCC to 10.3.0 The `moose-mpich` package has been updated to 4.0.1 and now relies entirely on the MPICH built by the conda-forge maintainers (`mpich-mpicc`, `mpich-mpicxx`, @@ -74,29 +74,28 @@ for developer needs. - Update MetaPhysicL - `OpFunction` support for `DualNumber` and `SemiDynamicSparseNumberArray`, which - means we can now do basic parallel `sum()` etc. on AD values. - -- `get_nodeset_info()` to get nodeset info -- Fixes up deprecation warnings in custom iterators due to C++17 -- `Poly2Tri` updates/bugfixes related to refinement -- Support for non-uniform refinement with `Poly2Tri` + means we can now do basic parallel `sum()` etc. on AD values + - Implement `ReplaceAlgebraicType` to conveniently replace types in containers, + and add ValueType for `std::array`, and `std::vector` + - Add tolerance to `DynamicSparseNumberBase::sparsity_trim` + - Simplify end/begin/rend/rbegin methods in `DynamicStdArrayWrapper` + - When `DynamicStdArray` wrapper container size is exceeded, an error will now + be thrown instead of an assert + +- `get_nodeset_info()` bugfix in `MeshBase::get_info()` - sideset names were being + requested instead of nodesets +- Deprecation warnings were fixed up in custom iterators due to C++17 and newer + GCC/Clang +- `Poly2Tri` was updated to fix various bugs related to refinement, and support + was added for non-uniform refinement - Added virtual methods for specifying index maps that we can use for defining the `RBParameterizedFunction` used in EIM approximations -- Update MetaPhysicL - - - Add ValueType for `std::array`, `std::vector` - - Implement `ReplaceAlgebraicType` - - Add tolerance to `DynamicSparseNumberBase::sparsity_trim` - - Simplify end/begin/rend/rbegin - - When we exceed our `DynamicStdArray` wrapper container size, we'll throw - - Make `DynamicStdArrayWrapper` member protected -- Factor out push_node, respect offset -- Allow proper constness for our MeshBase iterators -- `libmesh_not_implemented()` in all unimplemented `TypeNTensor` functions -- README: branching description, devel Civet badge -- memcpy warning fix in `TypeNTensor` -- `Poly2Tri` refinement fixes +- Make the coordinate offset transfer be respected by discontinuous output, not + just continuous output +- Allow proper const-ness for our `MeshBase` iterators +- `TypeNTensor` changes - `libmesh_not_implemented()` was added to all unimplemented + functions and a mempcpy warning was fixed up ### `2022.03.02` Update diff --git a/scripts/configure_petsc.sh b/scripts/configure_petsc.sh index 8dbc4974e8e7..07eb532101c2 100644 --- a/scripts/configure_petsc.sh +++ b/scripts/configure_petsc.sh @@ -31,19 +31,25 @@ function configure_petsc() SHARED=1 fi + # Use --with-make-np if MOOSE_JOBS is given + MAKE_NP_STR="" + if [ ! -z "$MOOSE_JOBS" ]; then + MAKE_NP_STR="--with-make-np=$MOOSE_JOBS" + fi + # Check to see if HDF5 exists using environment variables and expected locations. # If it does, use it. echo "INFO: Checking for HDF5..." # Prioritize user-set environment variables HDF5_DIR, HDF5DIR, and HDF5_ROOT, # with the first taking the greatest priority - if [ ! -z "$HDF5_DIR" ]; then + if [ -n "$HDF5_DIR" ]; then echo "INFO: HDF5 installation location was set using HDF5_DIR=$HDF5_DIR" HDF5_STR="--with-hdf5-dir=$HDF5_DIR" - elif [ ! -z "$HDF5DIR" ]; then + elif [ -n "$HDF5DIR" ]; then echo "INFO: HDF5 installation location was set using HDF5DIR=$HDF5DIR" HDF5_STR="--with-hdf5-dir=$HDF5DIR" - elif [ ! -z "$HDF5_ROOT" ]; then + elif [ -n "$HDF5_ROOT" ]; then echo "INFO: HDF5 installation location was set using HDF5_ROOT=$HDF5_ROOT" HDF5_STR="--with-hdf5-dir=$HDF5_ROOT" fi @@ -88,6 +94,7 @@ function configure_petsc() python ./configure --download-hypre=1 \ --with-shared-libraries=$SHARED \ "$HDF5_STR" \ + "$MAKE_NP_STR" \ --with-debugging=no \ --download-fblaslapack=1 \ --download-metis=1 \ diff --git a/scripts/update_and_rebuild_petsc.sh b/scripts/update_and_rebuild_petsc.sh index 1d221ab693d6..2c1bf88054c1 100755 --- a/scripts/update_and_rebuild_petsc.sh +++ b/scripts/update_and_rebuild_petsc.sh @@ -97,12 +97,6 @@ if [ ! -z "$PETSC_PREFIX" ]; then PFX_STR="--prefix=$PETSC_PREFIX" fi -# Use --with-make-np if MOOSE_JOBS is given -MAKE_NP_STR="" -if [ ! -z "$MOOSE_JOBS" ]; then - MAKE_NP_STR="--with-make-np=$MOOSE_JOBS" -fi - cd $SCRIPT_DIR/../petsc # If we're not going fast, remove the build directory and reconfigure @@ -110,7 +104,7 @@ if [ -z "$go_fast" ]; then rm -rf $SCRIPT_DIR/../petsc/$PETSC_ARCH source $SCRIPT_DIR/configure_petsc.sh - configure_petsc "$PFX_STR" "$MAKE_NP_STR" $* + configure_petsc "$PFX_STR" $* exitIfExitCode $? fi From b2384e154761ae541a8b998e72e0d8d16afff6ef Mon Sep 17 00:00:00 2001 From: Casey Icenhour Date: Tue, 22 Mar 2022 16:00:39 -0600 Subject: [PATCH 56/71] Update Dockerfile to new PETSc and libMesh hashes (#20580) --- docker_ci/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker_ci/Dockerfile b/docker_ci/Dockerfile index f15a21e3f1c3..7e8e7892648d 100644 --- a/docker_ci/Dockerfile +++ b/docker_ci/Dockerfile @@ -92,7 +92,7 @@ WORKDIR ${MOOSE_DIR} #-----------------------------------------------------------------------------# # Install PETSc to system path #-----------------------------------------------------------------------------# -ARG PETSC_REV=09da24df01e50defd94bc4f7396f866a808ecea5 +ARG PETSC_REV=f855b95493736b087b8ccc16dc6c5b29bc4b5aa8 ARG PETSC_OPTIONS ENV PETSC_DIR=/usr/local COPY scripts/update_and_rebuild_petsc.sh ${MOOSE_DIR}/scripts/update_and_rebuild_petsc.sh @@ -107,7 +107,7 @@ if [ ! -d $PETSC_DIR/lib/petsc ]; then exit 1; fi #-----------------------------------------------------------------------------# # Install Libmesh to system path #-----------------------------------------------------------------------------# -ARG LIBMESH_REV=a7279e6a5f0ea1f621d894c55a771197241f8708 +ARG LIBMESH_REV=7315cdb99555e4d774fc149b8c659f1e56955053 ARG LIBMESH_OPTIONS ARG LIBMESH_METHODS="opt dbg" ENV LIBMESH_DIR=/usr/local \ From c5d5320a2934c43c2d6521281c93fd2122460c5c Mon Sep 17 00:00:00 2001 From: Antonio Recuero Date: Tue, 22 Mar 2022 18:30:54 -0600 Subject: [PATCH 57/71] Performance and clarity improvements to mortar friction-related code (#17495) --- framework/src/constraints/AutomaticMortarGeneration.C | 8 ++++---- .../auxkernels/MortarFrictionalPressureVectorAux.h | 1 + .../src/auxkernels/MortarFrictionalPressureVectorAux.C | 3 +-- modules/contact/test/tests/mortar_aux_kernels/tests | 2 -- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/framework/src/constraints/AutomaticMortarGeneration.C b/framework/src/constraints/AutomaticMortarGeneration.C index 4198013016fa..e2c901a2fe28 100644 --- a/framework/src/constraints/AutomaticMortarGeneration.C +++ b/framework/src/constraints/AutomaticMortarGeneration.C @@ -198,10 +198,10 @@ AutomaticMortarGeneration::getNodalTangents(const Elem & secondary_elem) const for (const auto n : make_range(secondary_elem.n_nodes())) { - nodal_tangents_one[n] = - libmesh_map_find(_secondary_node_to_hh_nodal_tangents, secondary_elem.node_ptr(n))[0]; - nodal_tangents_two[n] = - libmesh_map_find(_secondary_node_to_hh_nodal_tangents, secondary_elem.node_ptr(n))[1]; + const auto & tangent_vectors = + libmesh_map_find(_secondary_node_to_hh_nodal_tangents, secondary_elem.node_ptr(n)); + nodal_tangents_one[n] = tangent_vectors[0]; + nodal_tangents_two[n] = tangent_vectors[1]; } return {{nodal_tangents_one, nodal_tangents_two}}; diff --git a/modules/contact/include/auxkernels/MortarFrictionalPressureVectorAux.h b/modules/contact/include/auxkernels/MortarFrictionalPressureVectorAux.h index bad5be831510..d9cdef0de0b9 100644 --- a/modules/contact/include/auxkernels/MortarFrictionalPressureVectorAux.h +++ b/modules/contact/include/auxkernels/MortarFrictionalPressureVectorAux.h @@ -31,6 +31,7 @@ class MortarFrictionalPressureVectorAux : public AuxKernel /// Tangent along the second direction const MooseArray * const _tangent_two; + /// Fe problem to obtain primary/secondary ids const FEProblemBase & _fe_problem; /// Boundary ID for the primary surface diff --git a/modules/contact/src/auxkernels/MortarFrictionalPressureVectorAux.C b/modules/contact/src/auxkernels/MortarFrictionalPressureVectorAux.C index e68ba280079d..e4fdefc24d7d 100644 --- a/modules/contact/src/auxkernels/MortarFrictionalPressureVectorAux.C +++ b/modules/contact/src/auxkernels/MortarFrictionalPressureVectorAux.C @@ -109,8 +109,7 @@ MortarFrictionalPressureVectorAux::computeValue() for (const auto lowerd_node : make_range(lower_dimensional_element->n_nodes())) { - if (_fe_problem.mesh().getMesh().node_ptr(_current_node->id()) == - _fe_problem.mesh().getMesh().node_ptr(lower_dimensional_element->node_id(lowerd_node))) + if (_current_node->id() == lower_dimensional_element->node_id(lowerd_node)) { tangent_one_component = nodal_tangents[0][lowerd_node](_component); tangent_two_component = nodal_tangents[1][lowerd_node](_component); diff --git a/modules/contact/test/tests/mortar_aux_kernels/tests b/modules/contact/test/tests/mortar_aux_kernels/tests index 603c5cbe015c..8135a171ac9c 100644 --- a/modules/contact/test/tests/mortar_aux_kernels/tests +++ b/modules/contact/test/tests/mortar_aux_kernels/tests @@ -54,8 +54,6 @@ input = 'frictional-mortar-3d-status.i' rel_err = 1.0e-3 abs_zero = 1.0e-4 - min_parallel = 1 - max_parallel = 2 min_ad_size = '100' ad_indexing_type = 'global' cli_args = 'AuxKernels/frictional_state/tangent_two=mortar_tangential_3d_lm' From dc1cee4080ff50595361d1960e9a1e243d6416b1 Mon Sep 17 00:00:00 2001 From: Cody Permann Date: Wed, 23 Mar 2022 08:33:19 -0600 Subject: [PATCH 58/71] INSTALLABLE_DIRS default fix INSTALLABLE_DIRS is not defined in any .mk file. It does not need to be stored on the Makefile stack. Also the test needs to account fo undefined variables, not just empty variables. refs #19022 --- framework/app.mk | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/framework/app.mk b/framework/app.mk index 1cbe5e156688..29dc1f12b33b 100644 --- a/framework/app.mk +++ b/framework/app.mk @@ -7,7 +7,7 @@ GEN_REVISION ?= yes # Set a default to install the main application's tests if one isn't set in the Makefile -ifeq ($(INSTALLABLE_DIRS),) +ifndef INSTALLABLE_DIRS ifneq ($(wildcard $(APPLICATION_DIR)/test/.),) INSTALLABLE_DIRS := test/tests else @@ -28,7 +28,6 @@ $APPLICATION_NAME$(STACK) := $(APPLICATION_NAME) $DEPEND_MODULES$(STACK) := $(DEPEND_MODULES) $GEN_REVISION$(STACK) := $(GEN_REVISION) $BUILD_EXEC$(STACK) := $(BUILD_EXEC) -$INSTALLABLE_DIRS$(STACK) := $(INSTALLABLE_DIRS) -include $(APPLICATION_DIR)/$(APPLICATION_NAME).mk @@ -44,7 +43,6 @@ APPLICATION_NAME := $($APPLICATION_NAME$(STACK)) DEPEND_MODULES := $($DEPEND_MODULES$(STACK)) GEN_REVISION := $($GEN_REVISION$(STACK)) BUILD_EXEC := $($BUILD_EXEC$(STACK)) -INSTALLABLE_DIRS := $($INSTALLABLE_DIRS$(STACK)) STACK := $(basename $(STACK)) ifneq ($(SUFFIX),) From df69c45b10973d7c4506ec737b7b2c1a5269bd32 Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Mon, 21 Mar 2022 22:44:26 -0600 Subject: [PATCH 59/71] More explicit names for bound types for the FVBoundedValueConstraint, refs #20607 Clang format Update test/tests/fvkernels/constraints/tests Co-authored-by: Alex Lindsay Update framework/src/fvkernels/FVPointValueConstraint.C Co-authored-by: Alex Lindsay Update framework/src/fvkernels/FVPointValueConstraint.C Co-authored-by: Alex Lindsay Update framework/doc/content/source/fvkernels/FVBoundedValueConstraint.md Co-authored-by: Alex Lindsay Update framework/src/fvkernels/FVPointValueConstraint.C Co-authored-by: Alex Lindsay --- .../fvkernels/FVBoundedValueConstraint.md | 4 ++-- .../fvkernels/FVBoundedValueConstraint.h | 6 +++--- .../FVScalarLagrangeMultiplierConstraint.h | 2 +- .../src/fvkernels/FVBoundedValueConstraint.C | 12 ++++++----- .../src/fvkernels/FVIntegralValueConstraint.C | 3 +-- .../src/fvkernels/FVPointValueConstraint.C | 9 +++++---- .../FVScalarLagrangeMultiplierConstraint.C | 19 ++++++++---------- framework/src/systems/NonlinearSystemBase.C | 6 +++--- .../fvkernels/constraints/bounded_value.i | 6 +++--- .../constraints/gold/bounded_value_out.e | Bin 35184 -> 36288 bytes test/tests/fvkernels/constraints/tests | 3 ++- 11 files changed, 35 insertions(+), 35 deletions(-) diff --git a/framework/doc/content/source/fvkernels/FVBoundedValueConstraint.md b/framework/doc/content/source/fvkernels/FVBoundedValueConstraint.md index 251461975669..7a0da337866f 100644 --- a/framework/doc/content/source/fvkernels/FVBoundedValueConstraint.md +++ b/framework/doc/content/source/fvkernels/FVBoundedValueConstraint.md @@ -3,12 +3,12 @@ This object implements the residuals that enforce the constraint !equation -\phi (point P) > \phi_0 +\phi > \phi_0 \in \Omega or !equation -\phi (point P) < \phi_0 +\phi < \phi_0 \in \Omega using a Lagrange multiplier approach. E.g. this object enforces the constraint that the value of $\phi$ in the domain has to be above or below a certain value. diff --git a/framework/include/fvkernels/FVBoundedValueConstraint.h b/framework/include/fvkernels/FVBoundedValueConstraint.h index 609e3353f12e..992c6033d13a 100644 --- a/framework/include/fvkernels/FVBoundedValueConstraint.h +++ b/framework/include/fvkernels/FVBoundedValueConstraint.h @@ -11,11 +11,11 @@ #include "FVScalarLagrangeMultiplierConstraint.h" -/// What type of extreme value we are going to compute +/// What type of constraint we are going to enforce enum BoundType { - MAX, - MIN + LOWER_THAN, + HIGHER_THAN }; /** diff --git a/framework/include/fvkernels/FVScalarLagrangeMultiplierConstraint.h b/framework/include/fvkernels/FVScalarLagrangeMultiplierConstraint.h index c7bb43b55000..75ce02d5bbbc 100644 --- a/framework/include/fvkernels/FVScalarLagrangeMultiplierConstraint.h +++ b/framework/include/fvkernels/FVScalarLagrangeMultiplierConstraint.h @@ -28,7 +28,7 @@ class FVScalarLagrangeMultiplierConstraint : public FVElementalKernel void computeResidual() override final; void computeJacobian() override final; void computeOffDiagJacobian() override final; - ADReal computeQpResidual() override; + ADReal computeQpResidual() override = 0; /// The Lagrange Multiplier variable const MooseVariableScalar & _lambda_var; diff --git a/framework/src/fvkernels/FVBoundedValueConstraint.C b/framework/src/fvkernels/FVBoundedValueConstraint.C index 7a0d5392c307..beb40964c7f2 100644 --- a/framework/src/fvkernels/FVBoundedValueConstraint.C +++ b/framework/src/fvkernels/FVBoundedValueConstraint.C @@ -19,11 +19,13 @@ InputParameters FVBoundedValueConstraint::validParams() { InputParameters params = FVScalarLagrangeMultiplierConstraint::validParams(); - params.addClassDescription("This class is used to enforce a min or max value for a finite volume variable"); + params.addClassDescription( + "This class is used to enforce a min or max value for a finite volume variable"); params.addRequiredParam("phi0", "The min or max bound"); // Define the min/max enumeration - MooseEnum type_options("max=0 min=1"); - params.addRequiredParam("bound_type", type_options, "Whether a minimum or a maximum bound"); + MooseEnum type_options("lower_than=0 higher_than=1"); + params.addRequiredParam( + "bound_type", type_options, "Whether a minimum or a maximum bound"); return params; } @@ -37,9 +39,9 @@ FVBoundedValueConstraint::FVBoundedValueConstraint(const InputParameters & param ADReal FVBoundedValueConstraint::computeQpResidual() { - if (_bound_type == BoundType::MAX && _u[_qp] > _phi0) + if (_bound_type == BoundType::LOWER_THAN && _u[_qp] > _phi0) return _u[_qp] - _phi0; - else if (_bound_type == BoundType::MIN && _u[_qp] < _phi0) + else if (_bound_type == BoundType::HIGHER_THAN && _u[_qp] < _phi0) return _phi0 - _u[_qp]; else return 0; diff --git a/framework/src/fvkernels/FVIntegralValueConstraint.C b/framework/src/fvkernels/FVIntegralValueConstraint.C index a54a93ea843a..2f693101a3e1 100644 --- a/framework/src/fvkernels/FVIntegralValueConstraint.C +++ b/framework/src/fvkernels/FVIntegralValueConstraint.C @@ -30,8 +30,7 @@ FVIntegralValueConstraint::validParams() } FVIntegralValueConstraint::FVIntegralValueConstraint(const InputParameters & parameters) - : FVScalarLagrangeMultiplierConstraint(parameters), - _phi0(getParam("phi0")) + : FVScalarLagrangeMultiplierConstraint(parameters), _phi0(getParam("phi0")) { } diff --git a/framework/src/fvkernels/FVPointValueConstraint.C b/framework/src/fvkernels/FVPointValueConstraint.C index ab7f2810c031..a1d3b3b1eb8e 100644 --- a/framework/src/fvkernels/FVPointValueConstraint.C +++ b/framework/src/fvkernels/FVPointValueConstraint.C @@ -21,7 +21,8 @@ FVPointValueConstraint::validParams() InputParameters params = FVScalarLagrangeMultiplierConstraint::validParams(); params.addClassDescription("This class is used to enforce integral of phi = volume * phi_0 " "with a Lagrange multiplier approach."); - params.addRequiredParam("phi0", "What we want the average value of the primal variable to be."); + params.addRequiredParam("phi0", + "What we want the average value of the primal variable to be."); params.addRequiredParam( "point", "The XYZ coordinates of the points where the value shall be enforced."); return params; @@ -31,7 +32,7 @@ FVPointValueConstraint::FVPointValueConstraint(const InputParameters & parameter : FVScalarLagrangeMultiplierConstraint(parameters), _phi0(getParam("phi0")), _point(getParam("point")), - _my_elem(NULL) + _my_elem(nullptr) { // Find the element containing the point _point_locator = PointLocatorBase::build(TREE_LOCAL_ELEMENTS, _mesh); @@ -44,7 +45,7 @@ FVPointValueConstraint::FVPointValueConstraint(const InputParameters & parameter // We communicate the results and if there is conflict between processes, // the minimum cell ID is chosen - dof_id_type elem_id = elem ? elem->id() : DofObject::invalid_id; + const dof_id_type elem_id = elem ? elem->id() : DofObject::invalid_id; dof_id_type min_elem_id = elem_id; _mesh.comm().min(min_elem_id); @@ -53,7 +54,7 @@ FVPointValueConstraint::FVPointValueConstraint(const InputParameters & parameter "domain! Try alleviating block restrictions or " "using another point!"); - _my_elem = min_elem_id == elem_id ? elem : NULL; + _my_elem = min_elem_id == elem_id ? elem : nullptr; } ADReal diff --git a/framework/src/fvkernels/FVScalarLagrangeMultiplierConstraint.C b/framework/src/fvkernels/FVScalarLagrangeMultiplierConstraint.C index 6f2a4508e642..b849dfc664ec 100644 --- a/framework/src/fvkernels/FVScalarLagrangeMultiplierConstraint.C +++ b/framework/src/fvkernels/FVScalarLagrangeMultiplierConstraint.C @@ -17,29 +17,26 @@ InputParameters FVScalarLagrangeMultiplierConstraint::validParams() { InputParameters params = FVElementalKernel::validParams(); - params.addClassDescription("Base class for imposing constraints using scalar Lagrange multipliers"); + params.addClassDescription( + "Base class for imposing constraints using scalar Lagrange multipliers"); params.addRequiredCoupledVar("lambda", "Lagrange multiplier variable"); return params; } -FVScalarLagrangeMultiplierConstraint::FVScalarLagrangeMultiplierConstraint(const InputParameters & parameters) +FVScalarLagrangeMultiplierConstraint::FVScalarLagrangeMultiplierConstraint( + const InputParameters & parameters) : FVElementalKernel(parameters), _lambda_var(*getScalarVar("lambda", 0)), _lambda(adCoupledScalarValue("lambda")) { #ifndef MOOSE_GLOBAL_AD_INDEXING - mooseError("FVScalarLagrangeMultiplierConstraint is not supported by local AD indexing. In order to use " - "FVScalarLagrangeMultiplierConstraint, please run the configure script in the root MOOSE " - "directory with the configure option '--with-ad-indexing-type=global'"); + mooseError( + "FVScalarLagrangeMultiplierConstraint is not supported by local AD indexing. In order to use " + "FVScalarLagrangeMultiplierConstraint, please run the configure script in the root MOOSE " + "directory with the configure option '--with-ad-indexing-type=global'"); #endif } -ADReal -FVScalarLagrangeMultiplierConstraint::computeQpResidual() -{ - mooseError("computeQpResidual is missing. Implement your constraint there"); -} - void FVScalarLagrangeMultiplierConstraint::computeResidual() { diff --git a/framework/src/systems/NonlinearSystemBase.C b/framework/src/systems/NonlinearSystemBase.C index c5d3840762c8..cb8dc261d3d8 100644 --- a/framework/src/systems/NonlinearSystemBase.C +++ b/framework/src/systems/NonlinearSystemBase.C @@ -3166,9 +3166,9 @@ NonlinearSystemBase::checkKernelCoverage(const std::set & mesh_subd // Check for lagrange multiplier if (dynamic_cast(fv_kernel)) - kernel_variables.insert( - dynamic_cast( - fv_kernel)->lambdaVariable().name()); + kernel_variables.insert(dynamic_cast(fv_kernel) + ->lambdaVariable() + .name()); } std::vector fv_flux_kernels; diff --git a/test/tests/fvkernels/constraints/bounded_value.i b/test/tests/fvkernels/constraints/bounded_value.i index 9eaae7fba5d0..4bfc2769a609 100644 --- a/test/tests/fvkernels/constraints/bounded_value.i +++ b/test/tests/fvkernels/constraints/bounded_value.i @@ -1,7 +1,7 @@ [Mesh] type = GeneratedMesh dim = 1 - nx = 4 + nx = 20 [] [Variables] @@ -30,7 +30,7 @@ variable = v phi0 = 0 lambda = lambda - bound_type = 'min' + bound_type = 'HIGHER_THAN' [] [] @@ -59,7 +59,7 @@ [Executioner] type = Transient - solve_type = 'PJFNK' + solve_type = 'Newton' petsc_options_iname = '-pc_type -pc_factor_shift_type' petsc_options_value = 'lu NONZERO' diff --git a/test/tests/fvkernels/constraints/gold/bounded_value_out.e b/test/tests/fvkernels/constraints/gold/bounded_value_out.e index b29a5d9edc0f130d2cc853b66582a8bb345dec62..b1a3fa20054ef463e01c21124b7285af28c3dd8d 100644 GIT binary patch delta 1463 zcmZWneN0p(L?Eo~n#12QgA$>zqO3yeAD2DE(?7__6MNFoC? zm<@}uaQQ>n7D}>AFq0IEd?f6F4uP4HbZBrh%iM<{o1ZWlnFcrSqwgj0%4NVx*$NVZE0LdWFwutBm*>J?T2 z7(g>)Xhm1SHAx~#kHds8M3b<9rzzOX(=5EeQvhD&DG0^kJ4pIFm=T_g&D^7~KAa)x zhwuVVYw#wbwl|@I(nvj_ga|dk0C?PG2Z<3&ncfn5B4Lf32?2O%U0#3n6 zI1MM_RGf^{*Ka@&WrPTYlL${Ch!OCG@I~+ia4-(UK{x;#^L{+|0N$7HmGH}q?eHC0 z1YA0$g0G^#4sk~-^`B1ymt`y4bO)TQ!>O}YxGdHx-EoJ#k~P;lb=7velhxI-&RY1J zJPxR}TGrvPJJd-@NrcdAT{f4KwcwG~UWX(V78Y&T>{_eEq&1bAkJUO#%`A+fx58A~ zB{QcndVT84W;5d-qIIHY3tX&vU#UaQFlvJ#-N2-$=+%s#frhwkaC79QC+7Op^b|&z zC$9e)K8o^3M&)b?%gsJmke3TfV>N!ahE&SSE3DafywPFANdg96X#wQLvx2h>ilC7KDwKxjy+)q@#Qu96d zYKW;`j5q>%Td%yG_xVepxkfkJtDOc%=Z;yIXdB3w*z(Dz{T}d~)%NIOejszT?Sq}C zYb=?wT{Ca|)zZw3Tun6|Q4!o!12wa?$jD8fSSZo&4RX_~5(nk+aWgUU{+x5s+)Qk} zCqdCv!cG5k-Fki&agXntf$?bWYxkfejn$5$lw;RE=^Nr+i+6{2=#PXl@ZW?$?yvOHy8o|308gsTh8kl~(H#L}b z0K9go(LlQO;Dtk7_gw`YK%95EFr{eI{>%0xme!^QTW#oSm%-Vc$x_i!Ua(=A1NhdIA!#jAWU$eoQnc%^eJ NIFTQ4KJ$wo9V+OrU~tWtPBhc9C@X=@u@kfxj;6{#2L|yEEB)XXYAiRg;9=?spG-sElkCX zj2e?QShP7cfJ%UXW5(nd7G(|?Z*n_}J`=}_$var|m^gVRzW`AIlO#e%+MEth8x~CV;4l=w z0O8p`fYL7@^kf0fn#mV{7GB`mKlwbjf*K=GoC%1TftUq|L3|Jfu|eV>Hfz~rMNYNJ zzj=5kt8+?BKExX|xrp~Ohn}837)@^DQ=0soPk!=$z8WqIQ!^9GR10GZGm_?a$GxH_~+Uake;9RQ8Xfk=Dmi}hb%x0y@&b*3~BYFfP>`%v5z1Q{p zWS_0BGj&J6DSNK=KgVaK>+CtQ-2vzsh6DZf|HA99O|VZ$^1bwN-`nBnen19{6p*s`^?i4pN=pv0032RpT__I diff --git a/test/tests/fvkernels/constraints/tests b/test/tests/fvkernels/constraints/tests index 538b1a1ec37e..b14a7cf69a81 100644 --- a/test/tests/fvkernels/constraints/tests +++ b/test/tests/fvkernels/constraints/tests @@ -16,6 +16,7 @@ exodiff = 'point_value_out.e' requirement = 'The system shall be able to impose a constraint on a single point value of a variable.' + design = 'FVPointValueConstraint.md' ad_indexing_type = 'global' [] [bound] @@ -23,7 +24,7 @@ input = 'bounded_value.i' exodiff = 'bounded_value_out.e' - requirement = 'The system shall be able to impose bounds for the values of of a variable.' + requirement = 'The system shall be able to impose bounds for the values of a variable.' design = 'FVBoundedValueConstraint.md' ad_indexing_type = 'global' [] From 264509d0cd1af5408f618d723f3621f7009c6c06 Mon Sep 17 00:00:00 2001 From: Antonio Recuero Date: Wed, 23 Mar 2022 14:02:57 -0600 Subject: [PATCH 60/71] Make MortarFrictionalPressureVectorAux compute at TIMESTEP_END The test frictional-mortar-3d-status had been intermittently failing with components of the computed tangential vector that were far from the reference results. This appeared to happen in parallel runs. The fact that the auxiliary kernel was not computing the vector at TIMESTEP_END did not guaranteed a converged solution. Since this aux kernel is there to help with analysis, we can in principle just run it at TIMESTEP_END avoiding the performance hit and generating always the converged aux kernel solution. Credit to Alex Lindsay. --- .../contact/src/auxkernels/MortarFrictionalPressureVectorAux.C | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/contact/src/auxkernels/MortarFrictionalPressureVectorAux.C b/modules/contact/src/auxkernels/MortarFrictionalPressureVectorAux.C index e4fdefc24d7d..914f78b43e05 100644 --- a/modules/contact/src/auxkernels/MortarFrictionalPressureVectorAux.C +++ b/modules/contact/src/auxkernels/MortarFrictionalPressureVectorAux.C @@ -16,7 +16,7 @@ InputParameters MortarFrictionalPressureVectorAux::validParams() { InputParameters params = AuxKernel::validParams(); - params.set("execute_on") = EXEC_NONLINEAR; + params.set("execute_on") = EXEC_TIMESTEP_END; params.addClassDescription("This class creates an auxiliary vector for outputting the mortar " "frictional pressure vector."); From 4c5cace3a983eed38e48332abe4060f2299c5f9a Mon Sep 17 00:00:00 2001 From: Antonio Recuero Date: Wed, 23 Mar 2022 14:09:54 -0600 Subject: [PATCH 61/71] Use superlu_dist for contact problems (#17495) Alex and I have seen contact problems that run well fail with the 'PC failed due to FACTOR_OUTMEMORY' error intermittently. Switching to superlu_dist as the sparse system solver appears to circumvent this issue. So I am changing the settings of a number of mortar contact tests and hopefully avoid these intermittent issues. Credit to Alex Linday. --- .../3d-mortar-contact/frictional-mortar-3d-action.i | 4 ++-- .../frictional-mortar-3d-interp-geometry.i | 4 ++-- .../tests/3d-mortar-contact/frictional-mortar-3d.i | 4 ++-- .../3d-mortar-contact/frictionless-mortar-3d-action.i | 4 ++-- .../frictionless-mortar-3d-test-derivative-trimming.i | 4 ++-- .../tests/3d-mortar-contact/frictionless-mortar-3d.i | 4 ++-- .../block-dynamics-aux-fretting-wear-test.i | 4 ++-- .../tests/mortar_aux_kernels/block-dynamics-aux-vel.i | 4 ++-- .../mortar_aux_kernels/block-dynamics-aux-wear-vel.i | 4 ++-- .../tests/mortar_aux_kernels/block-dynamics-aux-wear.i | 4 ++-- .../mortar_aux_kernels/frictional-mortar-3d-status.i | 4 ++-- .../frictional-mortar-3d-dynamics-light-function.i | 10 +++++----- .../frictional-mortar-3d-dynamics-light.i | 10 +++++----- .../mortar_dynamics/frictional-mortar-3d-dynamics.i | 8 ++++---- .../test/tests/mortar_dynamics/frictional-mortar-3d.i | 10 +++++----- .../test/tests/pdass_problems/cylinder_friction.i | 4 ++-- .../tests/pdass_problems/frictional_bouncing_block.i | 6 +++--- .../pdass_problems/frictional_bouncing_block_action.i | 7 ++++--- modules/contact/test/tests/pdass_problems/ironing.i | 1 + 19 files changed, 51 insertions(+), 49 deletions(-) diff --git a/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d-action.i b/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d-action.i index aaf230e42596..a3bf2a1ae3dc 100644 --- a/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d-action.i +++ b/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d-action.i @@ -211,8 +211,8 @@ offset = 0.00 dtmin = .001 solve_type = 'PJFNK' petsc_options = '-snes_converged_reason -ksp_converged_reason -snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' - petsc_options_value = 'lu NONZERO 1e-14 1e-5' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' + petsc_options_value = 'lu superlu_dist NONZERO 1e-14 1e-5' l_max_its = 15 nl_max_its = 30 nl_rel_tol = 1e-11 diff --git a/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d-interp-geometry.i b/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d-interp-geometry.i index 2c04803e6c72..9c3f61379979 100644 --- a/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d-interp-geometry.i +++ b/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d-interp-geometry.i @@ -369,8 +369,8 @@ offset = 0.00 dtmin = .001 solve_type = 'PJFNK' petsc_options = '-snes_converged_reason -ksp_converged_reason -snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' - petsc_options_value = 'lu NONZERO 1e-14 1e-5' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' + petsc_options_value = 'lu superlu_dist NONZERO 1e-14 1e-5' l_max_its = 15 nl_max_its = 30 nl_rel_tol = 1e-11 diff --git a/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d.i b/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d.i index c714384783d7..e0159784b160 100644 --- a/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d.i +++ b/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d.i @@ -417,8 +417,8 @@ offset = 0.00 dtmin = .001 solve_type = 'PJFNK' petsc_options = '-snes_converged_reason -ksp_converged_reason -snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' - petsc_options_value = 'lu NONZERO 1e-14 1e-5' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' + petsc_options_value = 'lu superlu_dist NONZERO 1e-14 1e-5' l_max_its = 15 nl_max_its = 30 nl_rel_tol = 1e-11 diff --git a/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d-action.i b/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d-action.i index 5fe9ad108965..0c8a5d5224d1 100644 --- a/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d-action.i +++ b/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d-action.i @@ -224,8 +224,8 @@ offset = 0.00 solve_type = 'PJFNK' petsc_options = '-snes_converged_reason -ksp_converged_reason -pc_svd_monitor ' '-snes_linesearch_monitor' - petsc_options_iname = '-pc_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' - petsc_options_value = 'lu NONZERO 1e-15 1e-5' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' + petsc_options_value = 'lu superlu_dist NONZERO 1e-15 1e-5' l_max_its = 100 nl_max_its = 30 nl_abs_tol = 1e-12 diff --git a/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d-test-derivative-trimming.i b/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d-test-derivative-trimming.i index 561059e30e92..a82c6d44556d 100644 --- a/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d-test-derivative-trimming.i +++ b/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d-test-derivative-trimming.i @@ -284,8 +284,8 @@ offset = 0.00 solve_type = 'PJFNK' petsc_options = '-snes_converged_reason -ksp_converged_reason -pc_svd_monitor ' '-snes_linesearch_monitor' - petsc_options_iname = '-pc_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' - petsc_options_value = 'lu NONZERO 1e-15 1e-5' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' + petsc_options_value = 'lu superlu_dist NONZERO 1e-15 1e-5' l_max_its = 100 nl_max_its = 30 # nl_rel_tol = 1e-6 diff --git a/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d.i b/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d.i index c633150b6a77..63b2ff182e8f 100644 --- a/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d.i +++ b/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d.i @@ -283,8 +283,8 @@ offset = 0.00 solve_type = 'PJFNK' petsc_options = '-snes_converged_reason -ksp_converged_reason -pc_svd_monitor ' '-snes_linesearch_monitor' - petsc_options_iname = '-pc_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' - petsc_options_value = 'lu NONZERO 1e-15 1e-5' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' + petsc_options_value = 'lu superlu_dist NONZERO 1e-15 1e-5' l_max_its = 100 nl_max_its = 30 # nl_rel_tol = 1e-6 diff --git a/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-fretting-wear-test.i b/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-fretting-wear-test.i index 870655dcb5ce..f5cabbb6ab3d 100644 --- a/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-fretting-wear-test.i +++ b/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-fretting-wear-test.i @@ -293,8 +293,8 @@ offset = -0.045 solve_type = 'NEWTON' petsc_options = '-snes_converged_reason -ksp_converged_reason -pc_svd_monitor ' '-snes_linesearch_monitor -snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_shift_type -pc_factor_shift_amount' - petsc_options_value = 'lu NONZERO 1e-15' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount' + petsc_options_value = 'lu superlu_dist NONZERO 1e-15' nl_max_its = 40 l_max_its = 15 line_search = 'l2' diff --git a/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-vel.i b/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-vel.i index 716a3e8fb76f..2065e09f9b5c 100644 --- a/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-vel.i +++ b/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-vel.i @@ -240,8 +240,8 @@ offset = -0.19 solve_type = 'PJFNK' petsc_options = '-snes_converged_reason -ksp_converged_reason -pc_svd_monitor ' '-snes_linesearch_monitor -snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err ' - petsc_options_value = 'lu NONZERO 1e-15 1e-5' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err ' + petsc_options_value = 'lu superlu_dist NONZERO 1e-15 1e-5' nl_max_its = 20 line_search = 'none' snesmf_reuse_base = false diff --git a/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-wear-vel.i b/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-wear-vel.i index f6b26feca352..a7de3cc15ebe 100644 --- a/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-wear-vel.i +++ b/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-wear-vel.i @@ -289,8 +289,8 @@ offset = -0.05 solve_type = 'NEWTON' petsc_options = '-snes_converged_reason -ksp_converged_reason -pc_svd_monitor ' '-snes_linesearch_monitor -snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_shift_type -pc_factor_shift_amount' - petsc_options_value = 'lu NONZERO 1e-15' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount' + petsc_options_value = 'lu superlu_dist NONZERO 1e-15' nl_max_its = 40 nl_abs_tol = 1.0e-11 nl_rel_tol = 1.0e-11 diff --git a/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-wear.i b/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-wear.i index 27eeb95b051d..74cad7a7e6aa 100644 --- a/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-wear.i +++ b/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-wear.i @@ -242,8 +242,8 @@ offset = -0.05 solve_type = 'NEWTON' petsc_options = '-snes_converged_reason -ksp_converged_reason -pc_svd_monitor ' '-snes_linesearch_monitor -snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_shift_type -pc_factor_shift_amount ' - petsc_options_value = 'lu NONZERO 1e-15' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount ' + petsc_options_value = 'lu superlu_dist NONZERO 1e-15' nl_max_its = 30 line_search = 'l2' snesmf_reuse_base = false diff --git a/modules/contact/test/tests/mortar_aux_kernels/frictional-mortar-3d-status.i b/modules/contact/test/tests/mortar_aux_kernels/frictional-mortar-3d-status.i index e18ebe280be5..0065203c0333 100644 --- a/modules/contact/test/tests/mortar_aux_kernels/frictional-mortar-3d-status.i +++ b/modules/contact/test/tests/mortar_aux_kernels/frictional-mortar-3d-status.i @@ -433,8 +433,8 @@ offset = 0.00 dtmin = .02 solve_type = 'PJFNK' petsc_options = '-snes_converged_reason -ksp_converged_reason -snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' - petsc_options_value = 'lu NONZERO 1e-13 1e-7' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' + petsc_options_value = 'lu superlu_dist NONZERO 1e-13 1e-7' l_max_its = 15 nl_max_its = 90 nl_rel_tol = 1e-11 diff --git a/modules/contact/test/tests/mortar_dynamics/frictional-mortar-3d-dynamics-light-function.i b/modules/contact/test/tests/mortar_dynamics/frictional-mortar-3d-dynamics-light-function.i index fca1703b6416..cf7f24af6ec5 100644 --- a/modules/contact/test/tests/mortar_dynamics/frictional-mortar-3d-dynamics-light-function.i +++ b/modules/contact/test/tests/mortar_dynamics/frictional-mortar-3d-dynamics-light-function.i @@ -495,34 +495,34 @@ offset = 0.00 block = secondary_lower variable = mortar_normal_lm sort_by = 'id' - execute_on = NONLINEAR + execute_on = TIMESTEP_END [] [frictional-pressure] type = NodalValueSampler block = secondary_lower variable = mortar_tangential_lm sort_by = 'id' - execute_on = NONLINEAR + execute_on = TIMESTEP_END [] [frictional-pressure-3d] type = NodalValueSampler block = secondary_lower variable = mortar_tangential_3d_lm sort_by = 'id' - execute_on = NONLINEAR + execute_on = TIMESTEP_END [] [tangent_x] type = NodalValueSampler block = secondary_lower variable = mortar_tangent_x sort_by = 'id' - execute_on = NONLINEAR + execute_on = TIMESTEP_END [] [tangent_y] type = NodalValueSampler block = secondary_lower variable = mortar_tangent_y sort_by = 'id' - execute_on = NONLINEAR + execute_on = TIMESTEP_END [] [] diff --git a/modules/contact/test/tests/mortar_dynamics/frictional-mortar-3d-dynamics-light.i b/modules/contact/test/tests/mortar_dynamics/frictional-mortar-3d-dynamics-light.i index 0bc7b6dd1d30..fd6d4e54f24c 100644 --- a/modules/contact/test/tests/mortar_dynamics/frictional-mortar-3d-dynamics-light.i +++ b/modules/contact/test/tests/mortar_dynamics/frictional-mortar-3d-dynamics-light.i @@ -485,34 +485,34 @@ offset = 0.00 block = secondary_lower variable = mortar_normal_lm sort_by = 'id' - execute_on = NONLINEAR + execute_on = TIMESTEP_END [] [frictional-pressure] type = NodalValueSampler block = secondary_lower variable = mortar_tangential_lm sort_by = 'id' - execute_on = NONLINEAR + execute_on = TIMESTEP_END [] [frictional-pressure-3d] type = NodalValueSampler block = secondary_lower variable = mortar_tangential_3d_lm sort_by = 'id' - execute_on = NONLINEAR + execute_on = TIMESTEP_END [] [tangent_x] type = NodalValueSampler block = secondary_lower variable = mortar_tangent_x sort_by = 'id' - execute_on = NONLINEAR + execute_on = TIMESTEP_END [] [tangent_y] type = NodalValueSampler block = secondary_lower variable = mortar_tangent_y sort_by = 'id' - execute_on = NONLINEAR + execute_on = TIMESTEP_END [] [] diff --git a/modules/contact/test/tests/mortar_dynamics/frictional-mortar-3d-dynamics.i b/modules/contact/test/tests/mortar_dynamics/frictional-mortar-3d-dynamics.i index 1bbd7279f8f3..80dbb1970f47 100644 --- a/modules/contact/test/tests/mortar_dynamics/frictional-mortar-3d-dynamics.i +++ b/modules/contact/test/tests/mortar_dynamics/frictional-mortar-3d-dynamics.i @@ -482,27 +482,27 @@ offset = 0.00 block = secondary_lower variable = mortar_tangential_lm sort_by = 'id' - execute_on = NONLINEAR + execute_on = TIMESTEP_END [] [frictional-pressure-3d] type = NodalValueSampler block = secondary_lower variable = mortar_tangential_3d_lm sort_by = 'id' - execute_on = NONLINEAR + execute_on = TIMESTEP_END [] [tangent_x] type = NodalValueSampler block = secondary_lower variable = mortar_tangent_x sort_by = 'id' - execute_on = NONLINEAR + execute_on = TIMESTEP_END [] [tangent_y] type = NodalValueSampler block = secondary_lower variable = mortar_tangent_y sort_by = 'id' - execute_on = NONLINEAR + execute_on = TIMESTEP_END [] [] diff --git a/modules/contact/test/tests/mortar_dynamics/frictional-mortar-3d.i b/modules/contact/test/tests/mortar_dynamics/frictional-mortar-3d.i index c714384783d7..8b103f96f2d9 100644 --- a/modules/contact/test/tests/mortar_dynamics/frictional-mortar-3d.i +++ b/modules/contact/test/tests/mortar_dynamics/frictional-mortar-3d.i @@ -458,34 +458,34 @@ offset = 0.00 block = secondary_lower variable = mortar_normal_lm sort_by = 'id' - execute_on = NONLINEAR + execute_on = TIMESTEP_END [] [frictional-pressure] type = NodalValueSampler block = secondary_lower variable = mortar_tangential_lm sort_by = 'id' - execute_on = NONLINEAR + execute_on = TIMESTEP_END [] [frictional-pressure-3d] type = NodalValueSampler block = secondary_lower variable = mortar_tangential_3d_lm sort_by = 'id' - execute_on = NONLINEAR + execute_on = TIMESTEP_END [] [tangent_x] type = NodalValueSampler block = secondary_lower variable = mortar_tangent_x sort_by = 'id' - execute_on = NONLINEAR + execute_on = TIMESTEP_END [] [tangent_y] type = NodalValueSampler block = secondary_lower variable = mortar_tangent_y sort_by = 'id' - execute_on = NONLINEAR + execute_on = TIMESTEP_END [] [] diff --git a/modules/contact/test/tests/pdass_problems/cylinder_friction.i b/modules/contact/test/tests/pdass_problems/cylinder_friction.i index a8dc09d7ae45..86b4e292b323 100644 --- a/modules/contact/test/tests/pdass_problems/cylinder_friction.i +++ b/modules/contact/test/tests/pdass_problems/cylinder_friction.i @@ -217,8 +217,8 @@ solve_type = 'PJFNK' petsc_options = '-snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' - petsc_options_value = 'lu NONZERO 1e-15 1e-5' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' + petsc_options_value = 'lu superlu_dist NONZERO 1e-15 1e-5' line_search = 'none' diff --git a/modules/contact/test/tests/pdass_problems/frictional_bouncing_block.i b/modules/contact/test/tests/pdass_problems/frictional_bouncing_block.i index 01167c258fa2..7e0467b61c08 100644 --- a/modules/contact/test/tests/pdass_problems/frictional_bouncing_block.i +++ b/modules/contact/test/tests/pdass_problems/frictional_bouncing_block.i @@ -168,9 +168,9 @@ offset = 1e-2 dtmin = .01 solve_type = 'PJFNK' petsc_options = '-snes_converged_reason -ksp_converged_reason -pc_svd_monitor ' - '-snes_linesearch_monitor ' - petsc_options_iname = '-pc_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' - petsc_options_value = 'lu NONZERO 1e-15 1e-5' + '-snes_linesearch_monitor' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' + petsc_options_value = 'lu superlu_dist NONZERO 1e-15 1e-5' l_max_its = 30 nl_max_its = 40 line_search = 'none' diff --git a/modules/contact/test/tests/pdass_problems/frictional_bouncing_block_action.i b/modules/contact/test/tests/pdass_problems/frictional_bouncing_block_action.i index 5e093ae3b2b7..63bcec8134a1 100644 --- a/modules/contact/test/tests/pdass_problems/frictional_bouncing_block_action.i +++ b/modules/contact/test/tests/pdass_problems/frictional_bouncing_block_action.i @@ -113,10 +113,11 @@ offset = 1e-2 dt = 0.25 # 0.1 for finer meshes (uniform_refine) dtmin = .01 solve_type = 'PJFNK' + petsc_options = '-snes_converged_reason -ksp_converged_reason -pc_svd_monitor ' - '-snes_linesearch_monitor ' - petsc_options_iname = '-pc_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' - petsc_options_value = 'lu NONZERO 1e-15 1e-5' + '-snes_linesearch_monitor' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' + petsc_options_value = 'lu superlu_dist NONZERO 1e-15 1e-5' l_max_its = 30 nl_max_its = 40 line_search = 'basic' diff --git a/modules/contact/test/tests/pdass_problems/ironing.i b/modules/contact/test/tests/pdass_problems/ironing.i index 78acc0bcb504..a4faf407b079 100644 --- a/modules/contact/test/tests/pdass_problems/ironing.i +++ b/modules/contact/test/tests/pdass_problems/ironing.i @@ -230,6 +230,7 @@ type = Transient solve_type = 'PJFNK' + petsc_options = '-snes_ksp_ew' petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' petsc_options_value = 'lu superlu_dist' line_search = 'none' From 40d7881b9b3fdc8f9841b20c486c9e35439cbed2 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Wed, 23 Mar 2022 21:01:57 +0000 Subject: [PATCH 62/71] Add zlib-devel to Docker Yum installs for Rocky Linux. Fixes #20632. --- docker_ci/yum_installs.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker_ci/yum_installs.sh b/docker_ci/yum_installs.sh index 0480eea43ece..f7df5185a61d 100755 --- a/docker_ci/yum_installs.sh +++ b/docker_ci/yum_installs.sh @@ -60,7 +60,8 @@ yum install -y \ emacs \ gtest \ sudo \ - file + file \ + zlib-devel # Clear cache yum clean all From 2bf856c66a36395479e2385e18bcce2460f23005 Mon Sep 17 00:00:00 2001 From: Antonio Recuero Date: Wed, 23 Mar 2022 16:43:11 -0600 Subject: [PATCH 63/71] Replace -pc_factor_mat_solver_package with -pc_factor_mat_solver_type in contact module. Address Alex's review. --- .../contact/examples/3d_berkovich/indenter_berkovich_friction.i | 2 +- .../test/tests/3d-mortar-contact/frictional-mortar-3d-action.i | 2 +- .../3d-mortar-contact/frictional-mortar-3d-interp-geometry.i | 2 +- .../contact/test/tests/3d-mortar-contact/frictional-mortar-3d.i | 2 +- .../tests/3d-mortar-contact/frictionless-mortar-3d-action.i | 2 +- .../frictionless-mortar-3d-test-derivative-trimming.i | 2 +- .../test/tests/3d-mortar-contact/frictionless-mortar-3d.i | 2 +- .../contact/test/tests/adaptivity/contact_initial_adaptivity.i | 2 +- .../test/tests/frictional/single_point_2d/single_point_2d.i | 2 +- .../frictional/single_point_2d/single_point_2d_predictor.i | 2 +- .../test/tests/frictional/single_point_2d/single_point_2d_tp.i | 2 +- .../sliding_elastic_blocks_2d/sliding_elastic_blocks_2d.i | 2 +- .../sliding_elastic_blocks_2d/sliding_elastic_blocks_2d_tp.i | 2 +- modules/contact/test/tests/hertz_spherical/hertz_contact.i | 2 +- .../contact/test/tests/hertz_spherical/hertz_contact_hex20.i | 2 +- .../contact/test/tests/hertz_spherical/hertz_contact_hex27.i | 2 +- .../contact/test/tests/hertz_spherical/hertz_contact_rz_quad8.i | 2 +- modules/contact/test/tests/incremental_slip/incremental_slip.i | 2 +- .../mortar_aux_kernels/block-dynamics-aux-fretting-wear-test.i | 2 +- .../test/tests/mortar_aux_kernels/block-dynamics-aux-vel.i | 2 +- .../test/tests/mortar_aux_kernels/block-dynamics-aux-wear-vel.i | 2 +- .../test/tests/mortar_aux_kernels/block-dynamics-aux-wear.i | 2 +- .../test/tests/mortar_aux_kernels/frictional-mortar-3d-status.i | 2 +- modules/contact/test/tests/pdass_problems/cylinder_friction.i | 2 +- .../test/tests/pdass_problems/frictional_bouncing_block.i | 2 +- .../tests/pdass_problems/frictional_bouncing_block_action.i | 2 +- modules/contact/test/tests/pdass_problems/ironing.i | 2 +- .../two_block_compress/two_equal_blocks_compress_2d.i | 2 +- .../two_block_compress/two_equal_blocks_compress_3d.i | 2 +- .../sliding_block/edge_dropping/two_equal_blocks_slide_2d.i | 2 +- .../sliding_block/edge_dropping/two_equal_blocks_slide_3d.i | 2 +- .../test/tests/sliding_block/in_and_out/frictionless_penalty.i | 2 +- .../in_and_out/frictionless_penalty_contact_line_search.i | 2 +- .../test/tests/sliding_block/sliding/frictional_02_aug.i | 2 +- .../test/tests/sliding_block/sliding/frictional_02_penalty.i | 2 +- .../test/tests/sliding_block/sliding/frictional_04_penalty.i | 2 +- .../contact/test/tests/sliding_block/sliding/frictionless_aug.i | 2 +- .../test/tests/sliding_block/sliding/frictionless_penalty.i | 2 +- .../hertz_cyl/half_symm_q4/hertz_cyl_half_1deg_template1.i | 2 +- .../hertz_cyl/half_symm_q4/hertz_cyl_half_1deg_template3.i | 2 +- .../hertz_cyl/half_symm_q8/hertz_cyl_half_1deg_template1.i | 2 +- .../hertz_cyl/half_symm_q8/hertz_cyl_half_1deg_template3.i | 2 +- .../hertz_cyl/quart_symm_q4/hertz_cyl_qsym_1deg_template1.i | 2 +- .../hertz_cyl/quart_symm_q8/hertz_cyl_qsym_1deg_template1.i | 2 +- .../test/tests/verification/overclosure_removal/overclosure.i | 2 +- .../patch_tests/automatic_patch_update/sliding_update.i | 2 +- .../test/tests/verification/patch_tests/brick_1/brick1_aug.i | 2 +- .../tests/verification/patch_tests/brick_1/brick1_mu_0_2_pen.i | 2 +- .../tests/verification/patch_tests/brick_1/brick1_template1.i | 2 +- .../tests/verification/patch_tests/brick_1/brick1_template2.i | 2 +- .../test/tests/verification/patch_tests/brick_2/brick2_aug.i | 2 +- .../tests/verification/patch_tests/brick_2/brick2_mu_0_2_pen.i | 2 +- .../tests/verification/patch_tests/brick_2/brick2_template1.i | 2 +- .../tests/verification/patch_tests/brick_2/brick2_template2.i | 2 +- .../tests/verification/patch_tests/brick_3/brick3_mu_0_2_pen.i | 2 +- .../tests/verification/patch_tests/brick_3/brick3_template1.i | 2 +- .../tests/verification/patch_tests/brick_3/brick3_template2.i | 2 +- .../tests/verification/patch_tests/brick_4/brick4_mu_0_2_pen.i | 2 +- .../tests/verification/patch_tests/brick_4/brick4_template1.i | 2 +- .../tests/verification/patch_tests/brick_4/brick4_template2.i | 2 +- .../test/tests/verification/patch_tests/cyl_1/cyl1_mu_0_2_pen.i | 2 +- .../test/tests/verification/patch_tests/cyl_1/cyl1_template1.i | 2 +- .../test/tests/verification/patch_tests/cyl_1/cyl1_template2.i | 2 +- .../test/tests/verification/patch_tests/cyl_2/cyl2_mu_0_2_pen.i | 2 +- .../test/tests/verification/patch_tests/cyl_2/cyl2_template1.i | 2 +- .../test/tests/verification/patch_tests/cyl_2/cyl2_template2.i | 2 +- .../test/tests/verification/patch_tests/cyl_3/cyl3_mu_0_2_pen.i | 2 +- .../test/tests/verification/patch_tests/cyl_3/cyl3_template2.i | 2 +- .../test/tests/verification/patch_tests/cyl_4/cyl4_mu_0_2_pen.i | 2 +- .../test/tests/verification/patch_tests/cyl_4/cyl4_template1.i | 2 +- .../test/tests/verification/patch_tests/cyl_4/cyl4_template2.i | 2 +- .../tests/verification/patch_tests/plane_1/plane1_mu_0_2_pen.i | 2 +- .../tests/verification/patch_tests/plane_1/plane1_template1.i | 2 +- .../tests/verification/patch_tests/plane_1/plane1_template2.i | 2 +- .../tests/verification/patch_tests/plane_2/plane2_mu_0_2_pen.i | 2 +- .../tests/verification/patch_tests/plane_2/plane2_template1.i | 2 +- .../tests/verification/patch_tests/plane_2/plane2_template2.i | 2 +- .../tests/verification/patch_tests/plane_3/plane3_mu_0_2_pen.i | 2 +- .../tests/verification/patch_tests/plane_3/plane3_template2.i | 2 +- .../tests/verification/patch_tests/plane_4/plane4_mu_0_2_pen.i | 2 +- .../tests/verification/patch_tests/plane_4/plane4_template1.i | 2 +- .../tests/verification/patch_tests/plane_4/plane4_template2.i | 2 +- .../tests/verification/patch_tests/ring_1/ring1_mu_0_2_pen.i | 2 +- .../tests/verification/patch_tests/ring_1/ring1_template1.i | 2 +- .../tests/verification/patch_tests/ring_1/ring1_template2.i | 2 +- .../tests/verification/patch_tests/ring_2/ring2_mu_0_2_pen.i | 2 +- .../tests/verification/patch_tests/ring_2/ring2_template1.i | 2 +- .../tests/verification/patch_tests/ring_2/ring2_template2.i | 2 +- .../tests/verification/patch_tests/ring_3/ring3_mu_0_2_pen.i | 2 +- .../tests/verification/patch_tests/ring_3/ring3_template1.i | 2 +- .../tests/verification/patch_tests/ring_3/ring3_template2.i | 2 +- .../tests/verification/patch_tests/ring_4/ring4_mu_0_2_pen.i | 2 +- .../tests/verification/patch_tests/ring_4/ring4_template1.i | 2 +- .../tests/verification/patch_tests/ring_4/ring4_template2.i | 2 +- .../verification/patch_tests/single_pnt_2d/single_point_2d.i | 2 +- .../single_pnt_2d/single_point_2d_contact_line_search.i | 2 +- .../patch_tests/single_pnt_2d/single_point_2d_frictional.i | 2 +- 97 files changed, 97 insertions(+), 97 deletions(-) diff --git a/modules/contact/examples/3d_berkovich/indenter_berkovich_friction.i b/modules/contact/examples/3d_berkovich/indenter_berkovich_friction.i index 967fce89c424..0343bbca10ca 100644 --- a/modules/contact/examples/3d_berkovich/indenter_berkovich_friction.i +++ b/modules/contact/examples/3d_berkovich/indenter_berkovich_friction.i @@ -192,7 +192,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d-action.i b/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d-action.i index a3bf2a1ae3dc..97013199b26a 100644 --- a/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d-action.i +++ b/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d-action.i @@ -211,7 +211,7 @@ offset = 0.00 dtmin = .001 solve_type = 'PJFNK' petsc_options = '-snes_converged_reason -ksp_converged_reason -snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' petsc_options_value = 'lu superlu_dist NONZERO 1e-14 1e-5' l_max_its = 15 nl_max_its = 30 diff --git a/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d-interp-geometry.i b/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d-interp-geometry.i index 9c3f61379979..841da40bbb0b 100644 --- a/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d-interp-geometry.i +++ b/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d-interp-geometry.i @@ -369,7 +369,7 @@ offset = 0.00 dtmin = .001 solve_type = 'PJFNK' petsc_options = '-snes_converged_reason -ksp_converged_reason -snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' petsc_options_value = 'lu superlu_dist NONZERO 1e-14 1e-5' l_max_its = 15 nl_max_its = 30 diff --git a/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d.i b/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d.i index e0159784b160..47b1ff1328a7 100644 --- a/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d.i +++ b/modules/contact/test/tests/3d-mortar-contact/frictional-mortar-3d.i @@ -417,7 +417,7 @@ offset = 0.00 dtmin = .001 solve_type = 'PJFNK' petsc_options = '-snes_converged_reason -ksp_converged_reason -snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' petsc_options_value = 'lu superlu_dist NONZERO 1e-14 1e-5' l_max_its = 15 nl_max_its = 30 diff --git a/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d-action.i b/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d-action.i index 0c8a5d5224d1..44eddb27ff04 100644 --- a/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d-action.i +++ b/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d-action.i @@ -224,7 +224,7 @@ offset = 0.00 solve_type = 'PJFNK' petsc_options = '-snes_converged_reason -ksp_converged_reason -pc_svd_monitor ' '-snes_linesearch_monitor' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' petsc_options_value = 'lu superlu_dist NONZERO 1e-15 1e-5' l_max_its = 100 nl_max_its = 30 diff --git a/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d-test-derivative-trimming.i b/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d-test-derivative-trimming.i index a82c6d44556d..2b6df34012b8 100644 --- a/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d-test-derivative-trimming.i +++ b/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d-test-derivative-trimming.i @@ -284,7 +284,7 @@ offset = 0.00 solve_type = 'PJFNK' petsc_options = '-snes_converged_reason -ksp_converged_reason -pc_svd_monitor ' '-snes_linesearch_monitor' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' petsc_options_value = 'lu superlu_dist NONZERO 1e-15 1e-5' l_max_its = 100 nl_max_its = 30 diff --git a/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d.i b/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d.i index 63b2ff182e8f..0913da149bc0 100644 --- a/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d.i +++ b/modules/contact/test/tests/3d-mortar-contact/frictionless-mortar-3d.i @@ -283,7 +283,7 @@ offset = 0.00 solve_type = 'PJFNK' petsc_options = '-snes_converged_reason -ksp_converged_reason -pc_svd_monitor ' '-snes_linesearch_monitor' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' petsc_options_value = 'lu superlu_dist NONZERO 1e-15 1e-5' l_max_its = 100 nl_max_its = 30 diff --git a/modules/contact/test/tests/adaptivity/contact_initial_adaptivity.i b/modules/contact/test/tests/adaptivity/contact_initial_adaptivity.i index ea6e6bf27aee..ff83db8ee8ca 100644 --- a/modules/contact/test/tests/adaptivity/contact_initial_adaptivity.i +++ b/modules/contact/test/tests/adaptivity/contact_initial_adaptivity.i @@ -120,7 +120,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/frictional/single_point_2d/single_point_2d.i b/modules/contact/test/tests/frictional/single_point_2d/single_point_2d.i index ff83ec0422d7..e54f2a66d080 100644 --- a/modules/contact/test/tests/frictional/single_point_2d/single_point_2d.i +++ b/modules/contact/test/tests/frictional/single_point_2d/single_point_2d.i @@ -175,7 +175,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' petsc_options = '-mat_superlu_dist_iterrefine -mat_superlu_dist_replacetinypivot' diff --git a/modules/contact/test/tests/frictional/single_point_2d/single_point_2d_predictor.i b/modules/contact/test/tests/frictional/single_point_2d/single_point_2d_predictor.i index c643ee6b63cd..1368de68ec99 100644 --- a/modules/contact/test/tests/frictional/single_point_2d/single_point_2d_predictor.i +++ b/modules/contact/test/tests/frictional/single_point_2d/single_point_2d_predictor.i @@ -174,7 +174,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/frictional/single_point_2d/single_point_2d_tp.i b/modules/contact/test/tests/frictional/single_point_2d/single_point_2d_tp.i index 7823bc71a09d..fbdb9e17037f 100644 --- a/modules/contact/test/tests/frictional/single_point_2d/single_point_2d_tp.i +++ b/modules/contact/test/tests/frictional/single_point_2d/single_point_2d_tp.i @@ -174,7 +174,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/frictional/sliding_elastic_blocks_2d/sliding_elastic_blocks_2d.i b/modules/contact/test/tests/frictional/sliding_elastic_blocks_2d/sliding_elastic_blocks_2d.i index 3c94519f45e3..5c94e7083698 100644 --- a/modules/contact/test/tests/frictional/sliding_elastic_blocks_2d/sliding_elastic_blocks_2d.i +++ b/modules/contact/test/tests/frictional/sliding_elastic_blocks_2d/sliding_elastic_blocks_2d.i @@ -199,7 +199,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/frictional/sliding_elastic_blocks_2d/sliding_elastic_blocks_2d_tp.i b/modules/contact/test/tests/frictional/sliding_elastic_blocks_2d/sliding_elastic_blocks_2d_tp.i index c5b58dfe1d4a..97f70742308e 100644 --- a/modules/contact/test/tests/frictional/sliding_elastic_blocks_2d/sliding_elastic_blocks_2d_tp.i +++ b/modules/contact/test/tests/frictional/sliding_elastic_blocks_2d/sliding_elastic_blocks_2d_tp.i @@ -200,7 +200,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/hertz_spherical/hertz_contact.i b/modules/contact/test/tests/hertz_spherical/hertz_contact.i index 3541e9cdc7f7..4259e5441f72 100644 --- a/modules/contact/test/tests/hertz_spherical/hertz_contact.i +++ b/modules/contact/test/tests/hertz_spherical/hertz_contact.i @@ -248,7 +248,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/hertz_spherical/hertz_contact_hex20.i b/modules/contact/test/tests/hertz_spherical/hertz_contact_hex20.i index f5c9ff7a7716..f1ca38ad075e 100644 --- a/modules/contact/test/tests/hertz_spherical/hertz_contact_hex20.i +++ b/modules/contact/test/tests/hertz_spherical/hertz_contact_hex20.i @@ -278,7 +278,7 @@ solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/hertz_spherical/hertz_contact_hex27.i b/modules/contact/test/tests/hertz_spherical/hertz_contact_hex27.i index 271fe3acc3ab..95be9faace4b 100644 --- a/modules/contact/test/tests/hertz_spherical/hertz_contact_hex27.i +++ b/modules/contact/test/tests/hertz_spherical/hertz_contact_hex27.i @@ -248,7 +248,7 @@ solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/hertz_spherical/hertz_contact_rz_quad8.i b/modules/contact/test/tests/hertz_spherical/hertz_contact_rz_quad8.i index c53e99460262..d0cd41bc490b 100644 --- a/modules/contact/test/tests/hertz_spherical/hertz_contact_rz_quad8.i +++ b/modules/contact/test/tests/hertz_spherical/hertz_contact_rz_quad8.i @@ -230,7 +230,7 @@ solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/incremental_slip/incremental_slip.i b/modules/contact/test/tests/incremental_slip/incremental_slip.i index e02fddd963de..c8dd7f83b3a9 100644 --- a/modules/contact/test/tests/incremental_slip/incremental_slip.i +++ b/modules/contact/test/tests/incremental_slip/incremental_slip.i @@ -169,7 +169,7 @@ #Preconditioned JFNK (default) solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-fretting-wear-test.i b/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-fretting-wear-test.i index f5cabbb6ab3d..080a031502bf 100644 --- a/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-fretting-wear-test.i +++ b/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-fretting-wear-test.i @@ -293,7 +293,7 @@ offset = -0.045 solve_type = 'NEWTON' petsc_options = '-snes_converged_reason -ksp_converged_reason -pc_svd_monitor ' '-snes_linesearch_monitor -snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -pc_factor_shift_type -pc_factor_shift_amount' petsc_options_value = 'lu superlu_dist NONZERO 1e-15' nl_max_its = 40 l_max_its = 15 diff --git a/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-vel.i b/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-vel.i index 2065e09f9b5c..9f61aa9f6275 100644 --- a/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-vel.i +++ b/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-vel.i @@ -240,7 +240,7 @@ offset = -0.19 solve_type = 'PJFNK' petsc_options = '-snes_converged_reason -ksp_converged_reason -pc_svd_monitor ' '-snes_linesearch_monitor -snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err ' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err ' petsc_options_value = 'lu superlu_dist NONZERO 1e-15 1e-5' nl_max_its = 20 line_search = 'none' diff --git a/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-wear-vel.i b/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-wear-vel.i index a7de3cc15ebe..a4b6dc6d154b 100644 --- a/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-wear-vel.i +++ b/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-wear-vel.i @@ -289,7 +289,7 @@ offset = -0.05 solve_type = 'NEWTON' petsc_options = '-snes_converged_reason -ksp_converged_reason -pc_svd_monitor ' '-snes_linesearch_monitor -snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -pc_factor_shift_type -pc_factor_shift_amount' petsc_options_value = 'lu superlu_dist NONZERO 1e-15' nl_max_its = 40 nl_abs_tol = 1.0e-11 diff --git a/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-wear.i b/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-wear.i index 74cad7a7e6aa..8ab30f024f96 100644 --- a/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-wear.i +++ b/modules/contact/test/tests/mortar_aux_kernels/block-dynamics-aux-wear.i @@ -242,7 +242,7 @@ offset = -0.05 solve_type = 'NEWTON' petsc_options = '-snes_converged_reason -ksp_converged_reason -pc_svd_monitor ' '-snes_linesearch_monitor -snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount ' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -pc_factor_shift_type -pc_factor_shift_amount ' petsc_options_value = 'lu superlu_dist NONZERO 1e-15' nl_max_its = 30 line_search = 'l2' diff --git a/modules/contact/test/tests/mortar_aux_kernels/frictional-mortar-3d-status.i b/modules/contact/test/tests/mortar_aux_kernels/frictional-mortar-3d-status.i index 0065203c0333..860fdfb239dc 100644 --- a/modules/contact/test/tests/mortar_aux_kernels/frictional-mortar-3d-status.i +++ b/modules/contact/test/tests/mortar_aux_kernels/frictional-mortar-3d-status.i @@ -433,7 +433,7 @@ offset = 0.00 dtmin = .02 solve_type = 'PJFNK' petsc_options = '-snes_converged_reason -ksp_converged_reason -snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' petsc_options_value = 'lu superlu_dist NONZERO 1e-13 1e-7' l_max_its = 15 nl_max_its = 90 diff --git a/modules/contact/test/tests/pdass_problems/cylinder_friction.i b/modules/contact/test/tests/pdass_problems/cylinder_friction.i index 86b4e292b323..0109e9065f1e 100644 --- a/modules/contact/test/tests/pdass_problems/cylinder_friction.i +++ b/modules/contact/test/tests/pdass_problems/cylinder_friction.i @@ -217,7 +217,7 @@ solve_type = 'PJFNK' petsc_options = '-snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' petsc_options_value = 'lu superlu_dist NONZERO 1e-15 1e-5' line_search = 'none' diff --git a/modules/contact/test/tests/pdass_problems/frictional_bouncing_block.i b/modules/contact/test/tests/pdass_problems/frictional_bouncing_block.i index 7e0467b61c08..f59c871365ea 100644 --- a/modules/contact/test/tests/pdass_problems/frictional_bouncing_block.i +++ b/modules/contact/test/tests/pdass_problems/frictional_bouncing_block.i @@ -169,7 +169,7 @@ offset = 1e-2 solve_type = 'PJFNK' petsc_options = '-snes_converged_reason -ksp_converged_reason -pc_svd_monitor ' '-snes_linesearch_monitor' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' petsc_options_value = 'lu superlu_dist NONZERO 1e-15 1e-5' l_max_its = 30 nl_max_its = 40 diff --git a/modules/contact/test/tests/pdass_problems/frictional_bouncing_block_action.i b/modules/contact/test/tests/pdass_problems/frictional_bouncing_block_action.i index 63bcec8134a1..031108e3754a 100644 --- a/modules/contact/test/tests/pdass_problems/frictional_bouncing_block_action.i +++ b/modules/contact/test/tests/pdass_problems/frictional_bouncing_block_action.i @@ -116,7 +116,7 @@ offset = 1e-2 petsc_options = '-snes_converged_reason -ksp_converged_reason -pc_svd_monitor ' '-snes_linesearch_monitor' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -pc_factor_shift_type -pc_factor_shift_amount -mat_mffd_err' petsc_options_value = 'lu superlu_dist NONZERO 1e-15 1e-5' l_max_its = 30 nl_max_its = 40 diff --git a/modules/contact/test/tests/pdass_problems/ironing.i b/modules/contact/test/tests/pdass_problems/ironing.i index a4faf407b079..206153001ad7 100644 --- a/modules/contact/test/tests/pdass_problems/ironing.i +++ b/modules/contact/test/tests/pdass_problems/ironing.i @@ -231,7 +231,7 @@ solve_type = 'PJFNK' petsc_options = '-snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/simple_contact/two_block_compress/two_equal_blocks_compress_2d.i b/modules/contact/test/tests/simple_contact/two_block_compress/two_equal_blocks_compress_2d.i index 133deb427fa2..eda93a77d6b2 100644 --- a/modules/contact/test/tests/simple_contact/two_block_compress/two_equal_blocks_compress_2d.i +++ b/modules/contact/test/tests/simple_contact/two_block_compress/two_equal_blocks_compress_2d.i @@ -203,7 +203,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type ' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -pc_factor_shift_type ' '-pc_factor_shift_amount' petsc_options_value = 'lu superlu_dist nonzero 1e-10' diff --git a/modules/contact/test/tests/simple_contact/two_block_compress/two_equal_blocks_compress_3d.i b/modules/contact/test/tests/simple_contact/two_block_compress/two_equal_blocks_compress_3d.i index b456cc2c253d..dd3298a4b33f 100644 --- a/modules/contact/test/tests/simple_contact/two_block_compress/two_equal_blocks_compress_3d.i +++ b/modules/contact/test/tests/simple_contact/two_block_compress/two_equal_blocks_compress_3d.i @@ -242,7 +242,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type ' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -pc_factor_shift_type ' '-pc_factor_shift_amount' petsc_options_value = 'lu superlu_dist nonzero 1e-10' diff --git a/modules/contact/test/tests/sliding_block/edge_dropping/two_equal_blocks_slide_2d.i b/modules/contact/test/tests/sliding_block/edge_dropping/two_equal_blocks_slide_2d.i index 28ecac7a9a66..74689e8d4083 100644 --- a/modules/contact/test/tests/sliding_block/edge_dropping/two_equal_blocks_slide_2d.i +++ b/modules/contact/test/tests/sliding_block/edge_dropping/two_equal_blocks_slide_2d.i @@ -203,7 +203,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type ' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -pc_factor_shift_type ' '-pc_factor_shift_amount' petsc_options_value = 'lu superlu_dist nonzero 1e-10' diff --git a/modules/contact/test/tests/sliding_block/edge_dropping/two_equal_blocks_slide_3d.i b/modules/contact/test/tests/sliding_block/edge_dropping/two_equal_blocks_slide_3d.i index d6c0b8180ee8..b0521b59d16c 100644 --- a/modules/contact/test/tests/sliding_block/edge_dropping/two_equal_blocks_slide_3d.i +++ b/modules/contact/test/tests/sliding_block/edge_dropping/two_equal_blocks_slide_3d.i @@ -242,7 +242,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -pc_factor_shift_type ' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -pc_factor_shift_type ' '-pc_factor_shift_amount' petsc_options_value = 'lu superlu_dist nonzero 1e-10' diff --git a/modules/contact/test/tests/sliding_block/in_and_out/frictionless_penalty.i b/modules/contact/test/tests/sliding_block/in_and_out/frictionless_penalty.i index 73c39c207855..29e710bd5d5a 100644 --- a/modules/contact/test/tests/sliding_block/in_and_out/frictionless_penalty.i +++ b/modules/contact/test/tests/sliding_block/in_and_out/frictionless_penalty.i @@ -156,7 +156,7 @@ solve_type = 'PJFNK' petsc_options = '-snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/sliding_block/in_and_out/frictionless_penalty_contact_line_search.i b/modules/contact/test/tests/sliding_block/in_and_out/frictionless_penalty_contact_line_search.i index 62b96bbb74fc..f9cc73de048d 100644 --- a/modules/contact/test/tests/sliding_block/in_and_out/frictionless_penalty_contact_line_search.i +++ b/modules/contact/test/tests/sliding_block/in_and_out/frictionless_penalty_contact_line_search.i @@ -160,7 +160,7 @@ solve_type = 'PJFNK' petsc_options = '-ksp_monitor_true_residual' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'contact' diff --git a/modules/contact/test/tests/sliding_block/sliding/frictional_02_aug.i b/modules/contact/test/tests/sliding_block/sliding/frictional_02_aug.i index 84dbfb2d463f..98c15ff37d8b 100644 --- a/modules/contact/test/tests/sliding_block/sliding/frictional_02_aug.i +++ b/modules/contact/test/tests/sliding_block/sliding/frictional_02_aug.i @@ -159,7 +159,7 @@ solve_type = 'PJFNK' petsc_options = '-snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/sliding_block/sliding/frictional_02_penalty.i b/modules/contact/test/tests/sliding_block/sliding/frictional_02_penalty.i index 89da352b2b03..ca8b61250b21 100644 --- a/modules/contact/test/tests/sliding_block/sliding/frictional_02_penalty.i +++ b/modules/contact/test/tests/sliding_block/sliding/frictional_02_penalty.i @@ -143,7 +143,7 @@ solve_type = 'PJFNK' petsc_options = '-snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/sliding_block/sliding/frictional_04_penalty.i b/modules/contact/test/tests/sliding_block/sliding/frictional_04_penalty.i index bf4e0b9fda7b..aa2d98d7a4da 100644 --- a/modules/contact/test/tests/sliding_block/sliding/frictional_04_penalty.i +++ b/modules/contact/test/tests/sliding_block/sliding/frictional_04_penalty.i @@ -143,7 +143,7 @@ solve_type = 'PJFNK' petsc_options = '-snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/sliding_block/sliding/frictionless_aug.i b/modules/contact/test/tests/sliding_block/sliding/frictionless_aug.i index 9b4146954e3f..1728bc0e3e85 100644 --- a/modules/contact/test/tests/sliding_block/sliding/frictionless_aug.i +++ b/modules/contact/test/tests/sliding_block/sliding/frictionless_aug.i @@ -151,7 +151,7 @@ solve_type = 'PJFNK' petsc_options = '-snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/sliding_block/sliding/frictionless_penalty.i b/modules/contact/test/tests/sliding_block/sliding/frictionless_penalty.i index a80466cd1fb4..1c7f21a6aa41 100644 --- a/modules/contact/test/tests/sliding_block/sliding/frictionless_penalty.i +++ b/modules/contact/test/tests/sliding_block/sliding/frictionless_penalty.i @@ -142,7 +142,7 @@ solve_type = 'PJFNK' petsc_options = '-snes_ksp_ew' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/hertz_cyl/half_symm_q4/hertz_cyl_half_1deg_template1.i b/modules/contact/test/tests/verification/hertz_cyl/half_symm_q4/hertz_cyl_half_1deg_template1.i index 799f3b17cad8..5bdc278a2545 100644 --- a/modules/contact/test/tests/verification/hertz_cyl/half_symm_q4/hertz_cyl_half_1deg_template1.i +++ b/modules/contact/test/tests/verification/hertz_cyl/half_symm_q4/hertz_cyl_half_1deg_template1.i @@ -327,7 +327,7 @@ #Preconditioned JFNK (default) solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/hertz_cyl/half_symm_q4/hertz_cyl_half_1deg_template3.i b/modules/contact/test/tests/verification/hertz_cyl/half_symm_q4/hertz_cyl_half_1deg_template3.i index 5453f57da78b..e61416d2afda 100644 --- a/modules/contact/test/tests/verification/hertz_cyl/half_symm_q4/hertz_cyl_half_1deg_template3.i +++ b/modules/contact/test/tests/verification/hertz_cyl/half_symm_q4/hertz_cyl_half_1deg_template3.i @@ -329,7 +329,7 @@ #Preconditioned JFNK (default) solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/hertz_cyl/half_symm_q8/hertz_cyl_half_1deg_template1.i b/modules/contact/test/tests/verification/hertz_cyl/half_symm_q8/hertz_cyl_half_1deg_template1.i index f66281bd6022..ee225cc05fc5 100644 --- a/modules/contact/test/tests/verification/hertz_cyl/half_symm_q8/hertz_cyl_half_1deg_template1.i +++ b/modules/contact/test/tests/verification/hertz_cyl/half_symm_q8/hertz_cyl_half_1deg_template1.i @@ -326,7 +326,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/hertz_cyl/half_symm_q8/hertz_cyl_half_1deg_template3.i b/modules/contact/test/tests/verification/hertz_cyl/half_symm_q8/hertz_cyl_half_1deg_template3.i index fad808bce777..e198bc85ce4f 100644 --- a/modules/contact/test/tests/verification/hertz_cyl/half_symm_q8/hertz_cyl_half_1deg_template3.i +++ b/modules/contact/test/tests/verification/hertz_cyl/half_symm_q8/hertz_cyl_half_1deg_template3.i @@ -326,7 +326,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/hertz_cyl/quart_symm_q4/hertz_cyl_qsym_1deg_template1.i b/modules/contact/test/tests/verification/hertz_cyl/quart_symm_q4/hertz_cyl_qsym_1deg_template1.i index 43e27a438aa8..3cd18414c517 100644 --- a/modules/contact/test/tests/verification/hertz_cyl/quart_symm_q4/hertz_cyl_qsym_1deg_template1.i +++ b/modules/contact/test/tests/verification/hertz_cyl/quart_symm_q4/hertz_cyl_qsym_1deg_template1.i @@ -282,7 +282,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/hertz_cyl/quart_symm_q8/hertz_cyl_qsym_1deg_template1.i b/modules/contact/test/tests/verification/hertz_cyl/quart_symm_q8/hertz_cyl_qsym_1deg_template1.i index 2a2aeaba45bf..5502d5523899 100644 --- a/modules/contact/test/tests/verification/hertz_cyl/quart_symm_q8/hertz_cyl_qsym_1deg_template1.i +++ b/modules/contact/test/tests/verification/hertz_cyl/quart_symm_q8/hertz_cyl_qsym_1deg_template1.i @@ -273,7 +273,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/overclosure_removal/overclosure.i b/modules/contact/test/tests/verification/overclosure_removal/overclosure.i index 7c09891292c8..9c0c6ce0b663 100644 --- a/modules/contact/test/tests/verification/overclosure_removal/overclosure.i +++ b/modules/contact/test/tests/verification/overclosure_removal/overclosure.i @@ -169,7 +169,7 @@ solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/automatic_patch_update/sliding_update.i b/modules/contact/test/tests/verification/patch_tests/automatic_patch_update/sliding_update.i index 8f0030c71a2e..77b269ca5a48 100644 --- a/modules/contact/test/tests/verification/patch_tests/automatic_patch_update/sliding_update.i +++ b/modules/contact/test/tests/verification/patch_tests/automatic_patch_update/sliding_update.i @@ -57,7 +57,7 @@ nl_abs_tol = 1e-4 dt = 2.0 line_search = 'none' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' timestep_tolerance = 1e-1 [] diff --git a/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_aug.i b/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_aug.i index 8f9ed8ff375c..10ac183f3c6a 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_aug.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_aug.i @@ -298,7 +298,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_mu_0_2_pen.i index 31e2855000ce..29984a142eb6 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_mu_0_2_pen.i @@ -317,7 +317,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_template1.i b/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_template1.i index 9733ce12be07..84338de11031 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_template1.i @@ -297,7 +297,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_template2.i b/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_template2.i index c0229750746a..4e07ce697bc7 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_1/brick1_template2.i @@ -298,7 +298,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_aug.i b/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_aug.i index 01b6498c14f1..402bbeae910e 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_aug.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_aug.i @@ -278,7 +278,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_mu_0_2_pen.i index 4fc0a9b796b8..ccd26eab001e 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_mu_0_2_pen.i @@ -297,7 +297,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_template1.i b/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_template1.i index 7538c7b9284e..ef8a7ccac569 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_template1.i @@ -277,7 +277,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_template2.i b/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_template2.i index b762549a7b75..1c2cf129c5e8 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_2/brick2_template2.i @@ -278,7 +278,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_mu_0_2_pen.i index 2f8f43b9e081..aa5241eb35f9 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_mu_0_2_pen.i @@ -297,7 +297,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_template1.i b/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_template1.i index 50ecb295b912..43bc0d1c8a79 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_template1.i @@ -277,7 +277,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_template2.i b/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_template2.i index fadf588f6bc6..ae6eceec616e 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_3/brick3_template2.i @@ -278,7 +278,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_mu_0_2_pen.i index b72535044b07..eb19b30499dc 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_mu_0_2_pen.i @@ -297,7 +297,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_template1.i b/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_template1.i index 4125f8a2b673..5af04954ecca 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_template1.i @@ -277,7 +277,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_template2.i b/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_template2.i index 8c3e748cfcb0..f8c0781e4986 100644 --- a/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/brick_4/brick4_template2.i @@ -278,7 +278,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_mu_0_2_pen.i index e9add197c638..013a2e27bd70 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_mu_0_2_pen.i @@ -277,7 +277,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_template1.i b/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_template1.i index 83b6673295cf..1b5cc2097fef 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_template1.i @@ -284,7 +284,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_template2.i b/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_template2.i index 99e6c22d43f6..0b9ba2ead250 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_1/cyl1_template2.i @@ -285,7 +285,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_mu_0_2_pen.i index 26a2481dc55e..007e3b91e971 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_mu_0_2_pen.i @@ -277,7 +277,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_template1.i b/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_template1.i index 53956ef8b654..a51a7ecd0ef2 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_template1.i @@ -284,7 +284,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_template2.i b/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_template2.i index 1f2d30678544..99126bafdaaf 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_2/cyl2_template2.i @@ -285,7 +285,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_3/cyl3_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/cyl_3/cyl3_mu_0_2_pen.i index f7a5145c0a9b..98f1a271a6c1 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_3/cyl3_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_3/cyl3_mu_0_2_pen.i @@ -277,7 +277,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_3/cyl3_template2.i b/modules/contact/test/tests/verification/patch_tests/cyl_3/cyl3_template2.i index c14f7fad7dce..f4a909207bc6 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_3/cyl3_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_3/cyl3_template2.i @@ -285,7 +285,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_mu_0_2_pen.i index 2f45f5dc5036..1d0bd21d5d2f 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_mu_0_2_pen.i @@ -277,7 +277,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_template1.i b/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_template1.i index 5ae76da05800..db56a0fa32ae 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_template1.i @@ -277,7 +277,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_template2.i b/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_template2.i index 7b99351ac6bc..771f3fafee2c 100644 --- a/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/cyl_4/cyl4_template2.i @@ -278,7 +278,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_mu_0_2_pen.i index 8849110ec09b..3944298354bb 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_mu_0_2_pen.i @@ -279,7 +279,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_template1.i b/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_template1.i index fef258930461..2638d27ddda3 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_template1.i @@ -259,7 +259,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_template2.i b/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_template2.i index 4b7824a23752..cde804bff182 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_1/plane1_template2.i @@ -260,7 +260,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_mu_0_2_pen.i index bda53fd281ce..1b829ec96c2e 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_mu_0_2_pen.i @@ -279,7 +279,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_template1.i b/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_template1.i index f8a32e2197d6..06479e5dec30 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_template1.i @@ -259,7 +259,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_template2.i b/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_template2.i index d79c245ae367..188c616b0abe 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_2/plane2_template2.i @@ -260,7 +260,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/plane_3/plane3_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/plane_3/plane3_mu_0_2_pen.i index dd609b7264e5..8d1d84eb98f3 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_3/plane3_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_3/plane3_mu_0_2_pen.i @@ -279,7 +279,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/plane_3/plane3_template2.i b/modules/contact/test/tests/verification/patch_tests/plane_3/plane3_template2.i index d3bf48803237..78c5ef9bb7da 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_3/plane3_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_3/plane3_template2.i @@ -264,7 +264,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_mu_0_2_pen.i index 91a0ebfa9ec7..3d0fa189407d 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_mu_0_2_pen.i @@ -279,7 +279,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_template1.i b/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_template1.i index 0cac04092c0f..2e72e3782697 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_template1.i @@ -263,7 +263,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_template2.i b/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_template2.i index dbbb9917a670..e02a22369468 100644 --- a/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/plane_4/plane4_template2.i @@ -264,7 +264,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_mu_0_2_pen.i index 45cf2f8fdb7f..a50c98224874 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_mu_0_2_pen.i @@ -271,7 +271,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_template1.i b/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_template1.i index addb81f3fd07..4451ef95ab53 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_template1.i @@ -273,7 +273,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_template2.i b/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_template2.i index 97d6d95dd752..38f3924e9825 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_1/ring1_template2.i @@ -274,7 +274,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_mu_0_2_pen.i index e1dde6efa217..6a423b926005 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_mu_0_2_pen.i @@ -271,7 +271,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_template1.i b/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_template1.i index a4338f4fc5ba..37c3fce446d7 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_template1.i @@ -271,7 +271,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_template2.i b/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_template2.i index 28b04b758be4..ec1fde446db8 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_2/ring2_template2.i @@ -272,7 +272,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_mu_0_2_pen.i index 859a393e6135..27479d85e24d 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_mu_0_2_pen.i @@ -271,7 +271,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_template1.i b/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_template1.i index 9126db977d7b..fef8475f68aa 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_template1.i @@ -271,7 +271,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' petsc_options = '-mat_superlu_dist_iterrefine -mat_superlu_dist_replacetinypivot' diff --git a/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_template2.i b/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_template2.i index c41ac0686a52..99203040bdfb 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_3/ring3_template2.i @@ -272,7 +272,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' # petsc_options = '-mat_superlu_dist_iterrefine -mat_superlu_dist_replacetinypivot' diff --git a/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_mu_0_2_pen.i b/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_mu_0_2_pen.i index e0d52ab5defd..8766d93f51e1 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_mu_0_2_pen.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_mu_0_2_pen.i @@ -271,7 +271,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_template1.i b/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_template1.i index 38ccce74a590..7a670282d56e 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_template1.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_template1.i @@ -271,7 +271,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_template2.i b/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_template2.i index 23d2df01dc9d..1e4e4af7468a 100644 --- a/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_template2.i +++ b/modules/contact/test/tests/verification/patch_tests/ring_4/ring4_template2.i @@ -272,7 +272,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/single_pnt_2d/single_point_2d.i b/modules/contact/test/tests/verification/patch_tests/single_pnt_2d/single_point_2d.i index 5dbb476cef68..6cdc4d77a70a 100644 --- a/modules/contact/test/tests/verification/patch_tests/single_pnt_2d/single_point_2d.i +++ b/modules/contact/test/tests/verification/patch_tests/single_pnt_2d/single_point_2d.i @@ -200,7 +200,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -mat_superlu_dist_iterrefine' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -mat_superlu_dist_iterrefine' petsc_options_value = 'lu superlu_dist 1' line_search = 'none' diff --git a/modules/contact/test/tests/verification/patch_tests/single_pnt_2d/single_point_2d_contact_line_search.i b/modules/contact/test/tests/verification/patch_tests/single_pnt_2d/single_point_2d_contact_line_search.i index aabffee26d52..1c55a2071cdc 100644 --- a/modules/contact/test/tests/verification/patch_tests/single_pnt_2d/single_point_2d_contact_line_search.i +++ b/modules/contact/test/tests/verification/patch_tests/single_pnt_2d/single_point_2d_contact_line_search.i @@ -180,7 +180,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package -mat_superlu_dist_iterrefine' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type -mat_superlu_dist_iterrefine' petsc_options_value = 'lu superlu_dist 1' line_search = 'contact' diff --git a/modules/contact/test/tests/verification/patch_tests/single_pnt_2d/single_point_2d_frictional.i b/modules/contact/test/tests/verification/patch_tests/single_pnt_2d/single_point_2d_frictional.i index 40d8467b0978..d0ae1efd1757 100644 --- a/modules/contact/test/tests/verification/patch_tests/single_pnt_2d/single_point_2d_frictional.i +++ b/modules/contact/test/tests/verification/patch_tests/single_pnt_2d/single_point_2d_frictional.i @@ -200,7 +200,7 @@ type = Transient solve_type = 'PJFNK' - petsc_options_iname = '-pc_type -pc_factor_mat_solver_package' + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' petsc_options_value = 'lu superlu_dist' line_search = 'none' From f7041db039fcaf08481fa64501be965fb6c83765 Mon Sep 17 00:00:00 2001 From: Logan Harbour Date: Thu, 24 Mar 2022 08:06:46 -0600 Subject: [PATCH 64/71] Move to repo root in post_checkout for Docker autobuild refs #20614 --- docker_ci/hooks/post_checkout | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docker_ci/hooks/post_checkout b/docker_ci/hooks/post_checkout index 1eee229d672b..766ab84e4bd6 100644 --- a/docker_ci/hooks/post_checkout +++ b/docker_ci/hooks/post_checkout @@ -8,6 +8,9 @@ #* Licensed under LGPL 2.1, please see LICENSE for details #* https://www.gnu.org/licenses/lgpl-2.1.html +# Move to root of the repo; we start in docker_ci +cd .. + # Docker autobuild will initialize submodules; we don't want # them in the final image because we end up cloing libmesh # and PETSc seperately, and large_media can be cloned From 96a49cd074347359a26268a4970b32eb14c5f871 Mon Sep 17 00:00:00 2001 From: Logan Harbour Date: Thu, 24 Mar 2022 08:19:14 -0600 Subject: [PATCH 65/71] Remove /hooks CODEOWNER as the dir no longer exists --- CODEOWNERS | 1 - 1 file changed, 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index fb74deb36960..0e695df49f6f 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,6 +1,5 @@ /conda @loganharbour @milljm @cticenhour /docker_ci @loganharbour -/hooks @loganharbour /m4 @lindsayad /COPYING @permcody From 540770c0b5d7195e032c4be3176e9ec8eb5b8778 Mon Sep 17 00:00:00 2001 From: Alex Lindsay Date: Thu, 24 Mar 2022 11:09:30 -0700 Subject: [PATCH 66/71] Allow creation of ADPiecewiseLinear Refs joe61vette/ASP#7 Closes #20644 --- framework/include/functions/Function.h | 1 + framework/include/functions/PiecewiseBase.h | 16 ++++++- framework/include/functions/PiecewiseLinear.h | 20 ++++++++- .../include/functions/PiecewiseLinearBase.h | 29 +++++++++++-- .../include/functions/PiecewiseTabularBase.h | 26 ++++++++++- framework/src/functions/PiecewiseBase.C | 26 ++++++++--- framework/src/functions/PiecewiseLinear.C | 16 ++++--- framework/src/functions/PiecewiseLinearBase.C | 43 +++++++++++++------ .../src/functions/PiecewiseTabularBase.C | 42 ++++++++++-------- 9 files changed, 167 insertions(+), 52 deletions(-) diff --git a/framework/include/functions/Function.h b/framework/include/functions/Function.h index 288f46d529ee..dce24242e608 100644 --- a/framework/include/functions/Function.h +++ b/framework/include/functions/Function.h @@ -251,3 +251,4 @@ class Function : public FunctionTempl Function(const InputParameters & params) : FunctionTempl(params) {} }; +typedef FunctionTempl ADFunction; diff --git a/framework/include/functions/PiecewiseBase.h b/framework/include/functions/PiecewiseBase.h index d8932847cf7c..26748878d21f 100644 --- a/framework/include/functions/PiecewiseBase.h +++ b/framework/include/functions/PiecewiseBase.h @@ -17,12 +17,13 @@ * Derived classes can either directly implement the x/y data, or provide input parameter mechanisms * for such data formulation. */ -class PiecewiseBase : public Function +template +class PiecewiseBaseTempl : public BaseClass { public: static InputParameters validParams(); - PiecewiseBase(const InputParameters & parameters); + PiecewiseBaseTempl(const InputParameters & parameters); virtual Real functionSize() const; virtual Real domain(const int i) const; @@ -39,4 +40,15 @@ class PiecewiseBase : public Function std::vector _raw_x; std::vector _raw_y; ///@} + + using BaseClass::_name; +}; + +class PiecewiseBase : public PiecewiseBaseTempl +{ +public: + PiecewiseBase(const InputParameters & params) : PiecewiseBaseTempl(params) {} + static InputParameters validParams() { return PiecewiseBaseTempl::validParams(); } }; + +typedef PiecewiseBaseTempl ADPiecewiseBase; diff --git a/framework/include/functions/PiecewiseLinear.h b/framework/include/functions/PiecewiseLinear.h index aff869467eb9..00bd9fbdf423 100644 --- a/framework/include/functions/PiecewiseLinear.h +++ b/framework/include/functions/PiecewiseLinear.h @@ -15,10 +15,26 @@ * Function which provides a piecewise continuous linear interpolation * of a provided (x,y) point data set. */ -class PiecewiseLinear : public PiecewiseLinearBase +template +class PiecewiseLinearTempl : public BaseClass { public: static InputParameters validParams(); - PiecewiseLinear(const InputParameters & parameters); + PiecewiseLinearTempl(const InputParameters & parameters); }; + +class PiecewiseLinear : public PiecewiseLinearTempl +{ +public: + PiecewiseLinear(const InputParameters & params) + : PiecewiseLinearTempl(params) + { + } + static InputParameters validParams() + { + return PiecewiseLinearTempl::validParams(); + } +}; + +typedef PiecewiseLinearTempl ADPiecewiseLinear; diff --git a/framework/include/functions/PiecewiseLinearBase.h b/framework/include/functions/PiecewiseLinearBase.h index 543aa1941c0e..d5e4eb7e9e66 100644 --- a/framework/include/functions/PiecewiseLinearBase.h +++ b/framework/include/functions/PiecewiseLinearBase.h @@ -15,16 +15,17 @@ * Base class for functions which provides a piecewise continuous linear * interpolation of an (x,y) point data set. */ -class PiecewiseLinearBase : public PiecewiseTabularBase +template +class PiecewiseLinearBaseTempl : public BaseClass { public: static InputParameters validParams(); - PiecewiseLinearBase(const InputParameters & parameters); + PiecewiseLinearBaseTempl(const InputParameters & parameters); virtual void initialSetup() override; - using Function::value; + using BaseClass::value; virtual Real value(Real t, const Point & p) const override; virtual ADReal value(const ADReal & t, const ADPoint & p) const override; @@ -44,4 +45,26 @@ class PiecewiseLinearBase : public PiecewiseTabularBase /// helper object to perform the linear interpolation of the function data std::unique_ptr _linear_interp; + + using BaseClass::_axis; + using BaseClass::_has_axis; + using BaseClass::_name; + using BaseClass::_raw_x; + using BaseClass::_raw_y; + using BaseClass::_scale_factor; +}; + +class PiecewiseLinearBase : public PiecewiseLinearBaseTempl +{ +public: + PiecewiseLinearBase(const InputParameters & params) + : PiecewiseLinearBaseTempl(params) + { + } + static InputParameters validParams() + { + return PiecewiseLinearBaseTempl::validParams(); + } }; + +typedef PiecewiseLinearBaseTempl ADPiecewiseLinearBase; diff --git a/framework/include/functions/PiecewiseTabularBase.h b/framework/include/functions/PiecewiseTabularBase.h index 6941429fbc9c..ac43150e6c3e 100644 --- a/framework/include/functions/PiecewiseTabularBase.h +++ b/framework/include/functions/PiecewiseTabularBase.h @@ -17,12 +17,13 @@ * input parameter specifications. Derived classes, which control the order (constant, linear) of * the approximation and how the (x,y) data set is generated, should be used directly. */ -class PiecewiseTabularBase : public PiecewiseBase +template +class PiecewiseTabularBaseTempl : public BaseClass { public: static InputParameters validParams(); - PiecewiseTabularBase(const InputParameters & parameters); + PiecewiseTabularBaseTempl(const InputParameters & parameters); protected: /// function value scale factor @@ -33,6 +34,12 @@ class PiecewiseTabularBase : public PiecewiseBase const bool _has_axis; ///@} + using BaseClass::_communicator; + using BaseClass::_name; + using BaseClass::_raw_x; + using BaseClass::_raw_y; + using BaseClass::isParamValid; + private: /// Reads data from supplied CSV file. void buildFromFile(); @@ -43,3 +50,18 @@ class PiecewiseTabularBase : public PiecewiseBase /// Builds data from 'xy_data' parameter. void buildFromXY(); }; + +class PiecewiseTabularBase : public PiecewiseTabularBaseTempl +{ +public: + PiecewiseTabularBase(const InputParameters & params) + : PiecewiseTabularBaseTempl(params) + { + } + static InputParameters validParams() + { + return PiecewiseTabularBaseTempl::validParams(); + } +}; + +typedef PiecewiseTabularBaseTempl ADPiecewiseTabularBase; diff --git a/framework/src/functions/PiecewiseBase.C b/framework/src/functions/PiecewiseBase.C index 0338895e1656..0a2926649f6f 100644 --- a/framework/src/functions/PiecewiseBase.C +++ b/framework/src/functions/PiecewiseBase.C @@ -10,37 +10,49 @@ #include "PiecewiseBase.h" #include "DelimitedFileReader.h" +template InputParameters -PiecewiseBase::validParams() +PiecewiseBaseTempl::validParams() { - return Function::validParams(); + return BaseClass::validParams(); } -PiecewiseBase::PiecewiseBase(const InputParameters & parameters) : Function(parameters) {} +template +PiecewiseBaseTempl::PiecewiseBaseTempl(const InputParameters & parameters) + : BaseClass(parameters) +{ +} +template Real -PiecewiseBase::functionSize() const +PiecewiseBaseTempl::functionSize() const { return _raw_x.size(); } +template Real -PiecewiseBase::domain(const int i) const +PiecewiseBaseTempl::domain(const int i) const { return _raw_x[i]; } +template Real -PiecewiseBase::range(const int i) const +PiecewiseBaseTempl::range(const int i) const { return _raw_y[i]; } +template void -PiecewiseBase::setData(const std::vector & x, const std::vector & y) +PiecewiseBaseTempl::setData(const std::vector & x, const std::vector & y) { _raw_x = x; _raw_y = y; if (_raw_x.size() != _raw_y.size()) mooseError("In PiecewiseBase ", _name, ": Lengths of x and y data do not match."); } + +template class PiecewiseBaseTempl; +template class PiecewiseBaseTempl; diff --git a/framework/src/functions/PiecewiseLinear.C b/framework/src/functions/PiecewiseLinear.C index fb68d32c94d6..1114328ca362 100644 --- a/framework/src/functions/PiecewiseLinear.C +++ b/framework/src/functions/PiecewiseLinear.C @@ -10,19 +10,25 @@ #include "PiecewiseLinear.h" registerMooseObject("MooseApp", PiecewiseLinear); +registerMooseObject("MooseApp", ADPiecewiseLinear); +template InputParameters -PiecewiseLinear::validParams() +PiecewiseLinearTempl::validParams() { - InputParameters params = PiecewiseLinearBase::validParams(); + InputParameters params = BaseClass::validParams(); params.addParam( "extrap", false, "If true, extrapolates when sample point is outside of abscissa range"); params.addClassDescription("Linearly interpolates between pairs of x-y data"); return params; } -PiecewiseLinear::PiecewiseLinear(const InputParameters & parameters) - : PiecewiseLinearBase(parameters) +template +PiecewiseLinearTempl::PiecewiseLinearTempl(const InputParameters & parameters) + : BaseClass(parameters) { - buildInterpolation(getParam("extrap")); + this->buildInterpolation(this->template getParam("extrap")); } + +template class PiecewiseLinearTempl; +template class PiecewiseLinearTempl; diff --git a/framework/src/functions/PiecewiseLinearBase.C b/framework/src/functions/PiecewiseLinearBase.C index 620ebb9a6638..38f0ead1c168 100644 --- a/framework/src/functions/PiecewiseLinearBase.C +++ b/framework/src/functions/PiecewiseLinearBase.C @@ -9,28 +9,32 @@ #include "PiecewiseLinearBase.h" +template InputParameters -PiecewiseLinearBase::validParams() +PiecewiseLinearBaseTempl::validParams() { - InputParameters params = PiecewiseTabularBase::validParams(); + InputParameters params = BaseClass::validParams(); params.addClassDescription("Linearly interpolates between pairs of x-y data"); return params; } -PiecewiseLinearBase::PiecewiseLinearBase(const InputParameters & parameters) - : PiecewiseTabularBase(parameters), _linear_interp(nullptr) +template +PiecewiseLinearBaseTempl::PiecewiseLinearBaseTempl(const InputParameters & parameters) + : BaseClass(parameters), _linear_interp(nullptr) { } +template void -PiecewiseLinearBase::initialSetup() +PiecewiseLinearBaseTempl::initialSetup() { if (!_linear_interp) mooseError("Classes derived from PiecewiseLinearBase need to call buildInterpolation()"); } +template void -PiecewiseLinearBase::buildInterpolation(const bool extrap) +PiecewiseLinearBaseTempl::buildInterpolation(const bool extrap) { // try building a linear interpolation object try @@ -43,28 +47,32 @@ PiecewiseLinearBase::buildInterpolation(const bool extrap) } } +template Real -PiecewiseLinearBase::value(Real t, const Point & p) const +PiecewiseLinearBaseTempl::value(Real t, const Point & p) const { const auto x = _has_axis ? p(_axis) : t; return _scale_factor * _linear_interp->sample(x); } +template ADReal -PiecewiseLinearBase::value(const ADReal & t, const ADPoint & p) const +PiecewiseLinearBaseTempl::value(const ADReal & t, const ADPoint & p) const { const auto x = _has_axis ? p(_axis) : t; return _scale_factor * _linear_interp->sample(x); } +template Real -PiecewiseLinearBase::timeDerivative(Real t, const Point &) const +PiecewiseLinearBaseTempl::timeDerivative(Real t, const Point &) const { return _has_axis ? 0.0 : _scale_factor * _linear_interp->sampleDerivative(t); } +template RealGradient -PiecewiseLinearBase::gradient(Real, const Point & p) const +PiecewiseLinearBaseTempl::gradient(Real, const Point & p) const { RealGradient ret; if (_has_axis) @@ -72,22 +80,29 @@ PiecewiseLinearBase::gradient(Real, const Point & p) const return ret; } +template Real -PiecewiseLinearBase::integral() const +PiecewiseLinearBaseTempl::integral() const { return _scale_factor * _linear_interp->integrate(); } +template Real -PiecewiseLinearBase::average() const +PiecewiseLinearBaseTempl::average() const { return integral() / (_linear_interp->domain(_linear_interp->getSampleSize() - 1) - _linear_interp->domain(0)); } +template void -PiecewiseLinearBase::setData(const std::vector & x, const std::vector & y) +PiecewiseLinearBaseTempl::setData(const std::vector & x, + const std::vector & y) { - PiecewiseTabularBase::setData(x, y); + BaseClass::setData(x, y); buildInterpolation(); } + +template class PiecewiseLinearBaseTempl; +template class PiecewiseLinearBaseTempl; diff --git a/framework/src/functions/PiecewiseTabularBase.C b/framework/src/functions/PiecewiseTabularBase.C index 3194e3266109..e6e7b81a974f 100644 --- a/framework/src/functions/PiecewiseTabularBase.C +++ b/framework/src/functions/PiecewiseTabularBase.C @@ -10,10 +10,11 @@ #include "PiecewiseTabularBase.h" #include "DelimitedFileReader.h" +template InputParameters -PiecewiseTabularBase::validParams() +PiecewiseTabularBaseTempl::validParams() { - InputParameters params = PiecewiseBase::validParams(); + InputParameters params = BaseClass::validParams(); MooseEnum axis("x=0 y=1 z=2"); params.addParam( @@ -36,14 +37,15 @@ PiecewiseTabularBase::validParams() return params; } -PiecewiseTabularBase::PiecewiseTabularBase(const InputParameters & parameters) - : PiecewiseBase(parameters), - _scale_factor(getParam("scale_factor")), +template +PiecewiseTabularBaseTempl::PiecewiseTabularBaseTempl(const InputParameters & parameters) + : BaseClass(parameters), + _scale_factor(this->template getParam("scale_factor")), _has_axis(isParamValid("axis")) { // determine function argument if (_has_axis) - _axis = getParam("axis"); + _axis = this->template getParam("axis"); // determine data source and check parameter consistency if (isParamValid("data_file") && !isParamValid("x") && !isParamValid("y") && @@ -61,15 +63,16 @@ PiecewiseTabularBase::PiecewiseTabularBase(const InputParameters & parameters) ": Either 'data_file', 'x' and 'y', or 'xy_data' must be specified exclusively."); } +template void -PiecewiseTabularBase::buildFromFile() +PiecewiseTabularBaseTempl::buildFromFile() { // Input parameters - const FileName & data_file_name = getParam("data_file"); - const MooseEnum & format = getParam("format"); - unsigned int x_index = getParam("x_index_in_file"); - unsigned int y_index = getParam("y_index_in_file"); - bool xy_only = getParam("xy_in_file_only"); + const FileName & data_file_name = this->template getParam("data_file"); + const MooseEnum & format = this->template getParam("format"); + unsigned int x_index = this->template getParam("x_index_in_file"); + unsigned int y_index = this->template getParam("y_index_in_file"); + bool xy_only = this->template getParam("xy_in_file_only"); if (x_index == y_index) mooseError( @@ -125,17 +128,19 @@ PiecewiseTabularBase::buildFromFile() mooseError("In ", _name, ": Lengths of x and y data do not match."); } +template void -PiecewiseTabularBase::buildFromXandY() +PiecewiseTabularBaseTempl::buildFromXandY() { - _raw_x = getParam>("x"); - _raw_y = getParam>("y"); + _raw_x = this->template getParam>("x"); + _raw_y = this->template getParam>("y"); } +template void -PiecewiseTabularBase::buildFromXY() +PiecewiseTabularBaseTempl::buildFromXY() { - std::vector xy = getParam>("xy_data"); + std::vector xy = this->template getParam>("xy_data"); unsigned int xy_size = xy.size(); if (xy_size % 2 != 0) mooseError("In ", _name, ": Length of data provided in 'xy_data' must be a multiple of 2."); @@ -149,3 +154,6 @@ PiecewiseTabularBase::buildFromXY() _raw_y.push_back(xy[i + 1]); } } + +template class PiecewiseTabularBaseTempl; +template class PiecewiseTabularBaseTempl; From 9fb386c6c40f48fca6cc974ee8a3566587a54aee Mon Sep 17 00:00:00 2001 From: Alex Lindsay Date: Thu, 24 Mar 2022 11:29:39 -0700 Subject: [PATCH 67/71] Test ADPiecewiseLinear Refs #20644 --- .../boundary_material/fv_material_quadrature.i | 13 +++++++++++++ .../materials/boundary_material/gold/ad_piecewise.e | 1 + test/tests/materials/boundary_material/tests | 11 +++++++++++ 3 files changed, 25 insertions(+) create mode 120000 test/tests/materials/boundary_material/gold/ad_piecewise.e diff --git a/test/tests/materials/boundary_material/fv_material_quadrature.i b/test/tests/materials/boundary_material/fv_material_quadrature.i index a7b5a55285fe..f3811a7d2f09 100644 --- a/test/tests/materials/boundary_material/fv_material_quadrature.i +++ b/test/tests/materials/boundary_material/fv_material_quadrature.i @@ -18,6 +18,12 @@ type = ADParsedFunction value = 'x' [] + [piecewise_linear_x] + type = ADPiecewiseLinear + x = '-1 2' + y = '-1 2' + axis = 'x' + [] [] [Variables] @@ -51,12 +57,19 @@ [] [Materials] + active = 'k1' [k1] type = ADGenericFunctorMaterial prop_names = 'k1' prop_values = linear_x block = 0 [] + [k1_piecewise] + type = ADGenericFunctorMaterial + prop_names = 'k1' + prop_values = piecewise_linear_x + block = 0 + [] [] [Executioner] diff --git a/test/tests/materials/boundary_material/gold/ad_piecewise.e b/test/tests/materials/boundary_material/gold/ad_piecewise.e new file mode 120000 index 000000000000..48e487b3f69e --- /dev/null +++ b/test/tests/materials/boundary_material/gold/ad_piecewise.e @@ -0,0 +1 @@ +fv_material_quadrature_out.e \ No newline at end of file diff --git a/test/tests/materials/boundary_material/tests b/test/tests/materials/boundary_material/tests index 63da5eb801a9..4dd8b6b098d1 100644 --- a/test/tests/materials/boundary_material/tests +++ b/test/tests/materials/boundary_material/tests @@ -26,4 +26,15 @@ requirement = 'The system shall provide location dependent boundary material property evaluations with finite volume variables.' ad_indexing_type = 'global' [../] + + [ad_piecewise_linear] + type = 'Exodiff' + input = 'fv_material_quadrature.i' + exodiff = 'ad_piecewise.e' + cli_args = "Materials/active='k1_piecewise' Outputs/file_base=ad_piecewise" + ad_indexing_type = 'global' + issues = '#20644' + design = 'PiecewiseConstant.md' + requirement = 'The system shall be able to use automatic differentiation instantiations of piecewise linear functions.' + [] [] From 95d39df18da028677a56512ec3cbd58e796e2598 Mon Sep 17 00:00:00 2001 From: Guillaume Giudicelli Date: Thu, 24 Mar 2022 15:02:23 -0700 Subject: [PATCH 68/71] Apply suggestions from code review Co-authored-by: Casey Icenhour --- .../doc/content/source/auxkernels/ScalarTagMatrixAux.md | 2 +- framework/doc/content/source/outputs/OutputWarehouse.md | 2 +- .../content/source/postprocessors/MaxVarNDofsPerElem.md | 8 ++++++-- framework/doc/content/source/variables/MooseVariableFE.md | 2 +- .../doc/content/source/vectorpostprocessors/CSVReader.md | 2 +- .../source/vectorpostprocessors/ElementsAlongLine.md | 2 +- .../vectorpostprocessors/LineMaterialRealSampler.md | 2 +- 7 files changed, 12 insertions(+), 8 deletions(-) diff --git a/framework/doc/content/source/auxkernels/ScalarTagMatrixAux.md b/framework/doc/content/source/auxkernels/ScalarTagMatrixAux.md index a47ae8ce1af2..bc8435e671d1 100644 --- a/framework/doc/content/source/auxkernels/ScalarTagMatrixAux.md +++ b/framework/doc/content/source/auxkernels/ScalarTagMatrixAux.md @@ -1,7 +1,7 @@ # ScalarTagMatrixAux The diagonal value of the matrix (associated with a tag) is retrieved for a given node -for scalar kernels. And the diagonal value is saved as an AuxVariable. +for scalar kernels, and the diagonal value is saved as an AuxVariable. The AuxVariable can then be visualized using the Exodus file output. !syntax parameters /AuxScalarKernels/ScalarTagMatrixAux diff --git a/framework/doc/content/source/outputs/OutputWarehouse.md b/framework/doc/content/source/outputs/OutputWarehouse.md index 1d22189d259f..db2503ee5c24 100644 --- a/framework/doc/content/source/outputs/OutputWarehouse.md +++ b/framework/doc/content/source/outputs/OutputWarehouse.md @@ -1,3 +1,3 @@ # OutputWarehouse -!! MOOSE Documentation Stub: Remove this line when content is added. +!alert construction title=Undocumented diff --git a/framework/doc/content/source/postprocessors/MaxVarNDofsPerElem.md b/framework/doc/content/source/postprocessors/MaxVarNDofsPerElem.md index 311334aae407..c5c314cdb7dd 100644 --- a/framework/doc/content/source/postprocessors/MaxVarNDofsPerElem.md +++ b/framework/doc/content/source/postprocessors/MaxVarNDofsPerElem.md @@ -7,5 +7,9 @@ an element. This may be useful in automatic differentiation calculations to limit the number of derivative calculations that have to be carried out. !alert note -This postprocessor is a MOOSE test object. Pass `--allow-test-objects` to a `MooseTestApp` -to be able to use it, or migrate it from the MOOSE `test/src` directory to your source directory. +This postprocessor is a MOOSE test object. Pass `--allow-test-objects` to your MOOSE or +MOOSE-based app executable to be able to use it in a simulation. If this object is needed often, +it is recommended that the developer [reach out to the MOOSE development team](https://github.com/idaholab/moose/discussions) +so that the object can be moved from `test/src` or create a new Pull Request (with contribution +guidelines found [here](https://mooseframework.inl.gov/framework/contributing.html)) +containing the move. diff --git a/framework/doc/content/source/variables/MooseVariableFE.md b/framework/doc/content/source/variables/MooseVariableFE.md index 685d7167604e..b146fc190e69 100644 --- a/framework/doc/content/source/variables/MooseVariableFE.md +++ b/framework/doc/content/source/variables/MooseVariableFE.md @@ -2,7 +2,7 @@ !syntax description /Variables/MooseVariable -!! MOOSE Documentation Stub: Remove this line when content is added. +!alert construction title=Undocumented !syntax parameters /Variables/MooseVariable diff --git a/framework/doc/content/source/vectorpostprocessors/CSVReader.md b/framework/doc/content/source/vectorpostprocessors/CSVReader.md index b2897ddff70c..ed9ed63aecc3 100644 --- a/framework/doc/content/source/vectorpostprocessors/CSVReader.md +++ b/framework/doc/content/source/vectorpostprocessors/CSVReader.md @@ -6,7 +6,7 @@ converts each column into a VectorPostprocessor vector. This object uses the ## Example Input Syntax -In this example, the `example.csv` file containings data for year/month/day is being read by +In this example, the `example.csv` file containing data for year/month/day is being read by the `CSVReader`. !listing test/tests/vectorpostprocessors/csv_reader/read.i block=VectorPostprocessors diff --git a/framework/doc/content/source/vectorpostprocessors/ElementsAlongLine.md b/framework/doc/content/source/vectorpostprocessors/ElementsAlongLine.md index e41d303f233b..5230cb2e458b 100644 --- a/framework/doc/content/source/vectorpostprocessors/ElementsAlongLine.md +++ b/framework/doc/content/source/vectorpostprocessors/ElementsAlongLine.md @@ -10,7 +10,7 @@ every element intersected by a line. The IDs are provided in a vector named `ele The user defines the line using a start and end point. The line terminates at those points, so elements on the line beyond those points are not output. -The IDs output from this class use the MOOSE integral numbering scheme, which starts +The IDs output from this class use the MOOSE internal numbering scheme, which starts with 0, so 1 should be added to them to translate them to the equivalent numbering in formats such as Exodus that start with 1. diff --git a/framework/doc/content/source/vectorpostprocessors/LineMaterialRealSampler.md b/framework/doc/content/source/vectorpostprocessors/LineMaterialRealSampler.md index 59b3b8e7fb1b..4cda32861140 100644 --- a/framework/doc/content/source/vectorpostprocessors/LineMaterialRealSampler.md +++ b/framework/doc/content/source/vectorpostprocessors/LineMaterialRealSampler.md @@ -11,7 +11,7 @@ The output to CSV is **by default** ordered as follows: - rows are ordered by point sampled along the line -- columns are ordered by alphabetical order of the properties sampled. The distance along the sampled line, and the x, y and z coordinates of the sampled points are added to the output as additional columns. +- columns are ordered by alphabetical order of the properties sampled. The distance along the sampled line and the x, y and z coordinates of the sampled points are added to the output as additional columns. ## Example Input File Syntax From 7069eea79ff4bbc4d3e445801e5f9e129cc1e8ad Mon Sep 17 00:00:00 2001 From: Daniel Schwen Date: Mon, 14 Mar 2022 17:37:18 -0600 Subject: [PATCH 69/71] Semidynamic vector improvements (#20551) --- framework/include/utils/MooseADWrapper.h | 10 ++++--- framework/include/utils/MooseUtils.h | 38 +++++++++++++++++------- unit/src/MooseUtilsTest.C | 14 +++++++++ 3 files changed, 48 insertions(+), 14 deletions(-) diff --git a/framework/include/utils/MooseADWrapper.h b/framework/include/utils/MooseADWrapper.h index dd8293c443e5..773de75aa74e 100644 --- a/framework/include/utils/MooseADWrapper.h +++ b/framework/include/utils/MooseADWrapper.h @@ -60,14 +60,16 @@ struct MooseADWrapperStruct, is_ad> namespace MooseUtils { -template +template class SemidynamicVector; } -template -struct MooseADWrapperStruct, is_ad> +template +struct MooseADWrapperStruct, is_ad> { - typedef MooseUtils::SemidynamicVector::type, N> type; + typedef MooseUtils:: + SemidynamicVector::type, N, zero_initialize> + type; }; template diff --git a/framework/include/utils/MooseUtils.h b/framework/include/utils/MooseUtils.h index 36424bc55b0a..1bbce998929c 100644 --- a/framework/include/utils/MooseUtils.h +++ b/framework/include/utils/MooseUtils.h @@ -1003,7 +1003,7 @@ buildRequiredMaterials(const Consumers & mat_consumers, * Note: due to an assertion bug in DynamicStdArrayWrapper we have to allocate one element more * until https://github.com/libMesh/MetaPhysicL/pull/8 in MetaPhysicL is available in MOOSE. */ -template +template class SemidynamicVector : public MetaPhysicL::DynamicStdArrayWrapper> { @@ -1013,23 +1013,41 @@ class SemidynamicVector SemidynamicVector(std::size_t size) : Parent() { Parent::resize(size); - // TODO: uncomment this once https://github.com/libMesh/MetaPhysicL/pull/8 - // makes it all the way into MOOSE. - // for (const auto i : make_range(size)) - // _data[i] = {}; + if constexpr (zero_init) + for (const auto i : make_range(size)) + _data[i] = {}; } void resize(std::size_t new_size) { - // const auto old_dynamic_n = Parent::size(); + const auto old_dynamic_n = Parent::size(); + Parent::resize(new_size); - // TODO: uncomment this once https://github.com/libMesh/MetaPhysicL/pull/8 - // makes it all the way into MOOSE. - // for (const auto i : make_range(old_dynamic_n, _dynamic_n)) - // _data[i] = {}; + + if constexpr (zero_init) + for (const auto i : make_range(old_dynamic_n, _dynamic_n)) + _data[i] = {}; + } + + void push_back(const T & v) + { + const auto old_dynamic_n = Parent::size(); + Parent::resize(old_dynamic_n + 1); + _data[old_dynamic_n] = v; + } + + template + void emplace_back(Args &&... args) + { + const auto old_dynamic_n = Parent::size(); + Parent::resize(old_dynamic_n + 1); + (::new (&_data[old_dynamic_n]) T(std::forward(args)...)); } std::size_t max_size() const { return N; } + + using Parent::_data; + using Parent::_dynamic_n; }; } // MooseUtils namespace diff --git a/unit/src/MooseUtilsTest.C b/unit/src/MooseUtilsTest.C index cece8df10c01..20cf19404cea 100644 --- a/unit/src/MooseUtilsTest.C +++ b/unit/src/MooseUtilsTest.C @@ -459,4 +459,18 @@ TEST(MooseUtils, SemidynamicVector) for (auto & i : ctest) count += i; EXPECT_EQ(count, 1 + 2 + 3 + 4 + 5 + 6); + + // test push back + test.push_back(100); + count = 0; + for (auto & i : ctest) + count += i; + EXPECT_EQ(count, 1 + 2 + 3 + 4 + 5 + 6 + 100); + + // test emplace_back + test.emplace_back(200); + count = 0; + for (auto & i : ctest) + count += i; + EXPECT_EQ(count, 1 + 2 + 3 + 4 + 5 + 6 + 100 + 200); } From 80758b6f490ec1e567bd5428b954f423c127e4f8 Mon Sep 17 00:00:00 2001 From: Daniel Schwen Date: Thu, 24 Mar 2022 18:56:55 -0600 Subject: [PATCH 70/71] Address comments, fix initialization (#20551) --- framework/include/utils/MooseUtils.h | 22 ++++++++++------------ unit/src/MooseUtilsTest.C | 21 ++++++++++++++++++++- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/framework/include/utils/MooseUtils.h b/framework/include/utils/MooseUtils.h index 1bbce998929c..16ca0318a3ef 100644 --- a/framework/include/utils/MooseUtils.h +++ b/framework/include/utils/MooseUtils.h @@ -999,34 +999,32 @@ buildRequiredMaterials(const Consumers & mat_consumers, * Utility class template for a semidynamic vector with a maximum size N * and a chosen dynamic size. This container avoids heap allocation and * is meant as a replacement for small local std::vector variables. - * Note: this class uses default initialization, which will not initialize built-in types. - * Note: due to an assertion bug in DynamicStdArrayWrapper we have to allocate one element more - * until https://github.com/libMesh/MetaPhysicL/pull/8 in MetaPhysicL is available in MOOSE. + * By default this class uses `value initialization`. This can be disabled + * using the third template parameter if uninitialized storage is acceptable, */ -template -class SemidynamicVector - : public MetaPhysicL::DynamicStdArrayWrapper> +template +class SemidynamicVector : public MetaPhysicL::DynamicStdArrayWrapper> { - typedef MetaPhysicL::DynamicStdArrayWrapper> Parent; + typedef MetaPhysicL::DynamicStdArrayWrapper> Parent; public: SemidynamicVector(std::size_t size) : Parent() { Parent::resize(size); - if constexpr (zero_init) + if constexpr (value_init) for (const auto i : make_range(size)) - _data[i] = {}; + _data[i] = T{}; } void resize(std::size_t new_size) { - const auto old_dynamic_n = Parent::size(); + [[maybe_unused]] const auto old_dynamic_n = Parent::size(); Parent::resize(new_size); - if constexpr (zero_init) + if constexpr (value_init) for (const auto i : make_range(old_dynamic_n, _dynamic_n)) - _data[i] = {}; + _data[i] = T{}; } void push_back(const T & v) diff --git a/unit/src/MooseUtilsTest.C b/unit/src/MooseUtilsTest.C index 20cf19404cea..1a2cd0f22c2c 100644 --- a/unit/src/MooseUtilsTest.C +++ b/unit/src/MooseUtilsTest.C @@ -436,7 +436,8 @@ TEST(MooseUtils, globCompare) TEST(MooseUtils, SemidynamicVector) { - MooseUtils::SemidynamicVector test(4); + // uninitialized storage + MooseUtils::SemidynamicVector test(4); EXPECT_EQ(test.size(), 4); EXPECT_EQ(test.max_size(), 10); @@ -474,3 +475,21 @@ TEST(MooseUtils, SemidynamicVector) count += i; EXPECT_EQ(count, 1 + 2 + 3 + 4 + 5 + 6 + 100 + 200); } + +struct Custom +{ + Custom() : _data(333) {} + int _data; +}; + +TEST(MooseUtils, SemidynamicVectorInit) +{ + // value initialized storage (default equivalent to ...) + MooseUtils::SemidynamicVector test(1000); + for (auto & i : test) + EXPECT_EQ(i, 0); + + MooseUtils::SemidynamicVector test2(100); + for (auto & i : test2) + EXPECT_EQ(i._data, 333); +} From 1424e0272829f155753d91a8ab41b0641ea2e466 Mon Sep 17 00:00:00 2001 From: Logan Harbour Date: Sun, 27 Mar 2022 13:28:18 -0600 Subject: [PATCH 71/71] Remove module cache in docker image refs #20614 --- docker_ci/hooks/post_checkout | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docker_ci/hooks/post_checkout b/docker_ci/hooks/post_checkout index 766ab84e4bd6..2dbfe0e40687 100644 --- a/docker_ci/hooks/post_checkout +++ b/docker_ci/hooks/post_checkout @@ -16,3 +16,6 @@ cd .. # and PETSc seperately, and large_media can be cloned # later if desired git submodule deinit -f large_media libmesh petsc +# The cache still exists from the checkout... and this +# is the only way to get rid of it +rm -rf .git/modules