Skip to content

Commit

Permalink
Support mortar meshes without corresponding mortar constraints
Browse files Browse the repository at this point in the history
  • Loading branch information
lindsayad committed Feb 2, 2022
1 parent 9f6e7ca commit a41cffe
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 30 deletions.
3 changes: 2 additions & 1 deletion framework/include/constraints/ConstraintWarehouse.h
Expand Up @@ -57,6 +57,8 @@ class ConstraintWarehouse : public MooseObjectWarehouse<Constraint>
* Deterimine if active objects exist.
*/
bool hasActiveNodalConstraints() const;
bool hasActiveMortarConstraints(const std::pair<BoundaryID, BoundaryID> & 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,
Expand Down Expand Up @@ -110,4 +112,3 @@ class ConstraintWarehouse : public MooseObjectWarehouse<Constraint>
std::map<std::pair<SubdomainID, SubdomainID>, MooseObjectWarehouse<NodeElemConstraint>>
_displaced_node_elem_constraints;
};

10 changes: 9 additions & 1 deletion framework/src/constraints/ConstraintWarehouse.C
Expand Up @@ -131,9 +131,17 @@ ConstraintWarehouse::getActiveNodeFaceConstraints(BoundaryID boundary_id, bool d
return it->second.getActiveObjects();
}

bool
ConstraintWarehouse::hasActiveMortarConstraints(
const std::pair<BoundaryID, BoundaryID> & 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<std::shared_ptr<MortarConstraintBase>> &
ConstraintWarehouse::getActiveMortarConstraints(
const std::pair<BoundaryID, BoundaryID> & mortar_interface_key, bool displaced) const
const std::pair<BoundaryID, BoundaryID> & mortar_interface_key, const bool displaced) const
{
std::map<std::pair<BoundaryID, BoundaryID>,
MooseObjectWarehouse<MortarConstraintBase>>::const_iterator it,
Expand Down
40 changes: 12 additions & 28 deletions framework/src/systems/NonlinearSystemBase.C
Expand Up @@ -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(
Expand All @@ -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(
Expand Down Expand Up @@ -3311,33 +3317,11 @@ NonlinearSystemBase::setPreviousNewtonSolution(const NumericVector<Number> & 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
Expand Down

0 comments on commit a41cffe

Please sign in to comment.