58 auto reason = T::checkConvergence(iter);
60 auto & fe_problem_base = this->getMooseApp().feProblem();
65 bool repeat_augmented_lagrange_step =
false;
70 if (_lagrangian_iteration_number < _maximum_number_lagrangian_iterations)
73 auto & nonlinear_sys = fe_problem_base.currentNonlinearSystem();
74 nonlinear_sys.update();
80 : fe_problem_base.geomSearchData())
81 ._penetration_locators;
85 std::list<std::shared_ptr<MechanicalContactConstraint>> mccs;
86 for (
const auto & pair : penetration_locators)
88 const auto & boundaries = pair.first;
95 mccs.emplace_back(
nullptr);
96 for (
const auto & nc : ncs)
97 if (
const auto mcc = std::dynamic_pointer_cast<MechanicalContactConstraint>(nc); !mcc)
98 mooseError(
"AugmentedLagrangianContactProblem: dynamic cast of " 99 "MechanicalContactConstraint object failed.");
106 if (mcc->secondaryBoundary() != boundaries.second ||
107 mcc->primaryBoundary() != boundaries.first)
115 if (repeat_augmented_lagrange_step || !mcc->AugmentedLagrangianContactConverged())
117 repeat_augmented_lagrange_step =
true;
124 const auto & pmuos = this->_app.template getInterfaceObjects<AugmentedLagrangeInterface>();
125 for (
auto * pmuo : pmuos)
128 if (!repeat_augmented_lagrange_step && !pmuo->isAugmentedLagrangianConverged())
129 repeat_augmented_lagrange_step =
true;
134 this->_communicator.max(repeat_augmented_lagrange_step);
137 if (repeat_augmented_lagrange_step)
139 _lagrangian_iteration_number++;
140 Moose::out <<
"Augmented Lagrangian contact repeat " << _lagrangian_iteration_number
146 for (
const auto & mcc : mccs)
147 mcc->updateAugmentedLagrangianMultiplier(
false);
150 for (
const auto & pmuo : pmuos)
151 pmuo->updateAugmentedLagrangianMultipliers();
154 for (
const auto & pmuo : pmuos)
155 pmuo->augmentedLagrangianSetup();
159 Moose::out <<
"Augmented Lagrangian Multiplier needs updating.";
162 Moose::out <<
"Augmented Lagrangian contact constraint enforcement is satisfied.";
167 Moose::out <<
"Maximum Augmented Lagrangian contact iterations have been reached.";
std::shared_ptr< DisplacedProblem > displaced_problem
void mooseError(Args &&... args)
const std::vector< std::shared_ptr< NodeFaceConstraint > > & getActiveNodeFaceConstraints(BoundaryID boundary_id, bool displaced) const
bool hasActiveNodeFaceConstraints(BoundaryID boundary_id, bool displaced) const
InputParameters validParams()