From a41cffe3d59210ca8ea0ac3b0950a14b7ce26a31 Mon Sep 17 00:00:00 2001 From: Alex Lindsay Date: Wed, 2 Feb 2022 12:34:16 -0800 Subject: [PATCH] Support mortar meshes without corresponding mortar constraints Closes #20214 --- .../include/constraints/ConstraintWarehouse.h | 3 +- .../src/constraints/ConstraintWarehouse.C | 10 ++++- framework/src/systems/NonlinearSystemBase.C | 40 ++++++------------- 3 files changed, 23 insertions(+), 30 deletions(-) diff --git a/framework/include/constraints/ConstraintWarehouse.h b/framework/include/constraints/ConstraintWarehouse.h index 865b79fa9ead..f33517d3f8fc 100644 --- a/framework/include/constraints/ConstraintWarehouse.h +++ b/framework/include/constraints/ConstraintWarehouse.h @@ -57,6 +57,8 @@ class ConstraintWarehouse : public MooseObjectWarehouse * Deterimine if active objects exist. */ bool hasActiveNodalConstraints() const; + bool hasActiveMortarConstraints(const std::pair & mortar_interface_key, + bool displaced) const; bool hasActiveElemElemConstraints(const InterfaceID interface_id, bool displaced) const; bool hasActiveNodeFaceConstraints(BoundaryID boundary_id, bool displaced) const; bool hasActiveNodeElemConstraints(SubdomainID secondary_id, @@ -110,4 +112,3 @@ class ConstraintWarehouse : public MooseObjectWarehouse std::map, MooseObjectWarehouse> _displaced_node_elem_constraints; }; - diff --git a/framework/src/constraints/ConstraintWarehouse.C b/framework/src/constraints/ConstraintWarehouse.C index 1737e5675423..8bfa53feb3a9 100644 --- a/framework/src/constraints/ConstraintWarehouse.C +++ b/framework/src/constraints/ConstraintWarehouse.C @@ -131,9 +131,17 @@ ConstraintWarehouse::getActiveNodeFaceConstraints(BoundaryID boundary_id, bool d return it->second.getActiveObjects(); } +bool +ConstraintWarehouse::hasActiveMortarConstraints( + const std::pair & mortar_interface_key, const bool displaced) const +{ + const auto & constraints = displaced ? _displaced_mortar_constraints : _mortar_constraints; + return constraints.find(mortar_interface_key) != constraints.end(); +} + const std::vector> & ConstraintWarehouse::getActiveMortarConstraints( - const std::pair & mortar_interface_key, bool displaced) const + const std::pair & mortar_interface_key, const bool displaced) const { std::map, MooseObjectWarehouse>::const_iterator it, diff --git a/framework/src/systems/NonlinearSystemBase.C b/framework/src/systems/NonlinearSystemBase.C index 318bb4def41c..ed490fa96949 100644 --- a/framework/src/systems/NonlinearSystemBase.C +++ b/framework/src/systems/NonlinearSystemBase.C @@ -294,7 +294,10 @@ NonlinearSystemBase::initialSetup() _fe_problem.getMortarInterfaces(/*displaced=*/false); for (const auto & mortar_interface : undisplaced_mortar_interfaces) { - auto primary_secondary_boundary_pair = mortar_interface.first; + const auto primary_secondary_boundary_pair = mortar_interface.first; + if (!_constraints.hasActiveMortarConstraints(primary_secondary_boundary_pair, false)) + continue; + const auto & mortar_generation_object = mortar_interface.second; auto & mortar_constraints = _constraints.getActiveMortarConstraints( @@ -313,7 +316,10 @@ NonlinearSystemBase::initialSetup() { mooseAssert(_fe_problem.getDisplacedProblem(), "Cannot create displaced mortar functors when the displaced problem is null"); - auto primary_secondary_boundary_pair = mortar_interface.first; + const auto primary_secondary_boundary_pair = mortar_interface.first; + if (!_constraints.hasActiveMortarConstraints(primary_secondary_boundary_pair, true)) + continue; + const auto & mortar_generation_object = mortar_interface.second; auto & mortar_constraints = _constraints.getActiveMortarConstraints( @@ -3311,33 +3317,11 @@ NonlinearSystemBase::setPreviousNewtonSolution(const NumericVector & sol void NonlinearSystemBase::mortarConstraints() { - const auto & undisplaced_mortar_interfaces = _fe_problem.getMortarInterfaces(/*displaced=*/false); - - for (const auto & mortar_interface : undisplaced_mortar_interfaces) - { - auto it = _undisplaced_mortar_functors.find(mortar_interface.first); + for (auto & map_pr : _undisplaced_mortar_functors) + map_pr.second(); - mooseAssert(it != _undisplaced_mortar_functors.end(), - "No ComputeMortarFunctor exists for the specified primary-secondary boundary " - "pair, primary " - << mortar_interface.first.first << " and secondary " - << mortar_interface.first.second); - it->second(); - } - - const auto & displaced_mortar_interfaces = _fe_problem.getMortarInterfaces(/*displaced=*/true); - - for (const auto & mortar_interface : displaced_mortar_interfaces) - { - auto it = _displaced_mortar_functors.find(mortar_interface.first); - - mooseAssert(it != _displaced_mortar_functors.end(), - "No ComputeMortarFunctor exists for the specified primary-secondary boundary " - "pair, primary " - << mortar_interface.first.first << " and secondary " - << mortar_interface.first.second); - it->second(); - } + for (auto & map_pr : _displaced_mortar_functors) + map_pr.second(); } void