37 params.addParam<
int>(
"maximum_lagrangian_update_iterations",
39 "Maximum number of update Lagrangian Multiplier iterations per step");
45 : _maximum_number_lagrangian_iterations(params.
get<
int>(
"maximum_lagrangian_update_iterations"))
70 _lagrangian_iteration_number = 0;
85 const PetscInt nfuncs,
90 Real my_max_funcs = std::numeric_limits<int>::max();
91 Real my_div_threshold = std::numeric_limits<Real>::max();
107 _console <<
"Augmented Lagrangian contact iteration " << _lagrangian_iteration_number
110 bool repeat_augmented_lagrange_step =
false;
112 if (reason == MooseNonlinearConvergenceReason::CONVERGED_FNORM_ABS ||
113 reason == MooseNonlinearConvergenceReason::CONVERGED_FNORM_RELATIVE ||
114 reason == MooseNonlinearConvergenceReason::CONVERGED_SNORM_RELATIVE)
116 if (_lagrangian_iteration_number < _maximum_number_lagrangian_iterations)
118 auto & nonlinear_sys = currentNonlinearSystem();
119 nonlinear_sys.update();
123 const auto displaced_problem = getDisplacedProblem();
124 const auto & penetration_locators =
125 (displaced_problem ? displaced_problem->geomSearchData() : geomSearchData())
126 ._penetration_locators;
130 std::list<std::shared_ptr<MechanicalContactConstraint>> mccs;
131 for (
const auto & pair : penetration_locators)
133 const auto & boundaries = pair.first;
140 mccs.emplace_back(
nullptr);
141 for (
const auto & nc : ncs)
142 if (
const auto mcc = std::dynamic_pointer_cast<MechanicalContactConstraint>(nc); !mcc)
143 mooseError(
"AugmentedLagrangianContactProblem: dynamic cast of " 144 "MechanicalContactConstraint object failed.");
151 if (mcc->secondaryBoundary() != boundaries.second ||
152 mcc->primaryBoundary() != boundaries.first)
160 if (repeat_augmented_lagrange_step || !mcc->AugmentedLagrangianContactConverged())
162 repeat_augmented_lagrange_step =
true;
169 const auto & pmuos = this->_app.template getInterfaceObjects<AugmentedLagrangeInterface>();
170 for (
auto * pmuo : pmuos)
173 if (!repeat_augmented_lagrange_step && !pmuo->isAugmentedLagrangianConverged())
174 repeat_augmented_lagrange_step =
true;
179 this->_communicator.max(repeat_augmented_lagrange_step);
182 if (repeat_augmented_lagrange_step)
184 _lagrangian_iteration_number++;
189 for (
const auto & mcc : mccs)
190 mcc->updateAugmentedLagrangianMultiplier(
false);
193 for (
const auto & pmuo : pmuos)
194 pmuo->updateAugmentedLagrangianMultipliers();
197 for (
const auto & pmuo : pmuos)
198 pmuo->augmentedLagrangianSetup();
201 reason = MooseNonlinearConvergenceReason::ITERATING;
202 _console <<
"Augmented Lagrangian Multiplier needs updating." << std::endl;
205 _console <<
"Augmented Lagrangian contact constraint enforcement is satisfied." 211 _console <<
"Maximum Augmented Lagrangian contact iterations have been reached." << std::endl;
212 reason = MooseNonlinearConvergenceReason::DIVERGED_FUNCTION_COUNT;
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()
MooseNonlinearConvergenceReason
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void ErrorVector unsigned int
const Elem & get(const ElemType type_in)