From bbcf186a00a50ccd00651b5c71324475982ed836 Mon Sep 17 00:00:00 2001 From: Fande Kong Date: Tue, 10 Aug 2021 14:07:53 -0600 Subject: [PATCH] Added a parameter to allow uniform refinements when using a pre-split mesh Closes #18575 --- framework/include/mesh/MooseMesh.h | 8 ++++++++ framework/src/actions/SetupMeshCompleteAction.C | 10 ++++++++-- framework/src/mesh/MooseMesh.C | 6 ++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/framework/include/mesh/MooseMesh.h b/framework/include/mesh/MooseMesh.h index 7ef6a39f9e6b..4e03cf99ecfa 100644 --- a/framework/include/mesh/MooseMesh.h +++ b/framework/include/mesh/MooseMesh.h @@ -488,6 +488,11 @@ class MooseMesh : public MooseObject, public Restartable, public PerfGraphInterf */ void setUniformRefineLevel(unsigned int); + /** + * Whether or not allow uniform refinements when using a pre-split mesh + */ + bool allowUniformRefineWhenUseSplit() const { return _allow_uniform_refine_when_use_split; } + /** * This will add the boundary ids to be ghosted to this processor */ @@ -1122,6 +1127,9 @@ class MooseMesh : public MooseObject, public Restartable, public PerfGraphInterf /// The level of uniform refinement requested (set to zero if AMR is disabled) unsigned int _uniform_refine_level; + /// Whether or not to allow uniform refinements when using a pre-split mesh + bool _allow_uniform_refine_when_use_split; + /// true if mesh is changed (i.e. after adaptivity step) bool _is_changed; diff --git a/framework/src/actions/SetupMeshCompleteAction.C b/framework/src/actions/SetupMeshCompleteAction.C index 749a006615b6..330e1c360f06 100644 --- a/framework/src/actions/SetupMeshCompleteAction.C +++ b/framework/src/actions/SetupMeshCompleteAction.C @@ -49,8 +49,14 @@ SetupMeshCompleteAction::act() { // we don't need to run mesh modifiers *again* after they ran already during the mesh // splitting process - //if (_app.isUseSplit()) - // return; + // A uniform refinement is helpful for some instances when using a pre-split mesh. + // For example, a 'coarse' mesh might completely resolve geometry (also is large) + // but does not have enough resolution for the interior. For this scenario, + // we pre-split the coarse mesh, and load the pre-split mesh in parallel, + // and then do a few levels of uniform refinements to have a fine mesh that + // potentially resolves physics features. + if (_app.isUseSplit() && !_mesh->allowUniformRefineWhenUseSplit()) + return; // uniform refinement has been done on master, so skip if (_app.masterMesh()) diff --git a/framework/src/mesh/MooseMesh.C b/framework/src/mesh/MooseMesh.C index 8074bee22d57..766d7d56c0fc 100644 --- a/framework/src/mesh/MooseMesh.C +++ b/framework/src/mesh/MooseMesh.C @@ -145,6 +145,10 @@ MooseMesh::validParams() false, "True to build the lower-dimensional mesh for all sides."); + params.addParam("allow_uniform_refine_when_use_split", + false, + "True to allow uniform refinements when using a pre-split mesh."); + // This indicates that the derived mesh type accepts a MeshGenerator, and should be set to true in // derived types that do so. params.addPrivateParam("_mesh_generator_mesh", false); @@ -173,6 +177,7 @@ MooseMesh::MooseMesh(const InputParameters & parameters) _partitioner_overridden(false), _custom_partitioner_requested(false), _uniform_refine_level(0), + _allow_uniform_refine_when_use_split(getParam("allow_uniform_refine_when_use_split")), _is_nemesis(getParam("nemesis")), _node_to_elem_map_built(false), _node_to_active_semilocal_elem_map_built(false), @@ -241,6 +246,7 @@ MooseMesh::MooseMesh(const MooseMesh & other_mesh) _partitioner_overridden(other_mesh._partitioner_overridden), _custom_partitioner_requested(other_mesh._custom_partitioner_requested), _uniform_refine_level(other_mesh.uniformRefineLevel()), + _allow_uniform_refine_when_use_split(other_mesh._allow_uniform_refine_when_use_split), _is_nemesis(false), _node_to_elem_map_built(false), _node_to_active_semilocal_elem_map_built(false),