www.mooseframework.org
AugmentedLagrangianContactProblem.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
11 
12 // MOOSE includes
13 #include "AuxiliarySystem.h"
14 #include "DisplacedProblem.h"
15 #include "MooseApp.h"
16 #include "MooseMesh.h"
17 #include "MooseVariable.h"
18 #include "NearestNodeLocator.h"
19 #include "NonlinearSystem.h"
20 #include "PenetrationLocator.h"
21 
22 #include "SystemBase.h"
23 #include "Assembly.h"
24 #include "Executioner.h"
25 #include "AddVariableAction.h"
26 #include "ConstraintWarehouse.h"
27 
29 
30 template <>
31 InputParameters
33 {
34  InputParameters params = validParams<ReferenceResidualProblem>();
35  params.addParam<int>("maximum_lagrangian_update_iterations",
36  100,
37  "Maximum number of update Lagrangian Multiplier iterations per step");
38  return params;
39 }
40 
42  : ReferenceResidualProblem(params),
43  _num_lagmul_iterations(0),
44  _max_lagmul_iters(getParam<int>("maximum_lagrangian_update_iterations"))
45 {
46 }
47 
48 void
50 {
52  ReferenceResidualProblem::timestepSetup();
53 }
54 
55 MooseNonlinearConvergenceReason
57  const PetscInt it,
58  const Real xnorm,
59  const Real snorm,
60  const Real fnorm,
61  const Real rtol,
62  const Real divtol,
63  const Real stol,
64  const Real abstol,
65  const PetscInt nfuncs,
66  const PetscInt /*max_funcs*/,
67  const PetscBool force_iteration,
68  const Real ref_resid,
69  const Real /*div_threshold*/)
70 {
71 
72  Real my_max_funcs = std::numeric_limits<int>::max();
73  Real my_div_threshold = std::numeric_limits<Real>::max();
74 
75  MooseNonlinearConvergenceReason reason =
76  ReferenceResidualProblem::checkNonlinearConvergence(msg,
77  it,
78  xnorm,
79  snorm,
80  fnorm,
81  rtol,
82  divtol,
83  stol,
84  abstol,
85  nfuncs,
86  my_max_funcs,
87  force_iteration,
88  ref_resid,
89  my_div_threshold);
90 
91  _console << "Augmented Lagrangian contact iteration " << _num_lagmul_iterations << "\n";
92 
93  bool _augLM_repeat_step;
94 
95  if (reason == MooseNonlinearConvergenceReason::CONVERGED_FNORM_ABS ||
96  reason == MooseNonlinearConvergenceReason::CONVERGED_FNORM_RELATIVE ||
97  reason == MooseNonlinearConvergenceReason::CONVERGED_SNORM_RELATIVE)
98  {
100  {
101  NonlinearSystemBase & nonlinear_sys = getNonlinearSystemBase();
102  nonlinear_sys.update();
103 
104  const ConstraintWarehouse & constraints = nonlinear_sys.getConstraintWarehouse();
105 
106  std::map<std::pair<unsigned int, unsigned int>, PenetrationLocator *> * penetration_locators =
107  NULL;
108 
109  bool displaced = false;
110  _augLM_repeat_step = false;
111  if (getDisplacedProblem() == NULL)
112  {
113  GeometricSearchData & geom_search_data = geomSearchData();
114  penetration_locators = &geom_search_data._penetration_locators;
115  }
116  else
117  {
118  GeometricSearchData & displaced_geom_search_data = getDisplacedProblem()->geomSearchData();
119  penetration_locators = &displaced_geom_search_data._penetration_locators;
120  displaced = true;
121  }
122 
123  for (const auto & it : *penetration_locators)
124  {
125  PenetrationLocator & pen_loc = *(it.second);
126 
127  BoundaryID slave_boundary = pen_loc._slave_boundary;
128 
129  if (constraints.hasActiveNodeFaceConstraints(slave_boundary, displaced))
130  {
131  const auto & ncs = constraints.getActiveNodeFaceConstraints(slave_boundary, displaced);
132 
133  for (const auto & nc : ncs)
134  {
135  if (std::dynamic_pointer_cast<MechanicalContactConstraint>(nc) == NULL)
136  mooseError("AugmentedLagrangianContactProblem: dynamic cast of "
137  "MechanicalContactConstraint object failed.");
138 
139  if (!(std::dynamic_pointer_cast<MechanicalContactConstraint>(nc))
140  ->AugmentedLagrangianContactConverged())
141  {
142  (std::dynamic_pointer_cast<MechanicalContactConstraint>(nc))
143  ->updateAugmentedLagrangianMultiplier(false);
144  _augLM_repeat_step = true;
145  break;
146  }
147  }
148  }
149  }
150 
151  if (_augLM_repeat_step)
152  {
153  // force it to keep iterating
154  reason = MooseNonlinearConvergenceReason::ITERATING;
155  _console << "Augmented Lagrangian Multiplier needs updating." << std::endl;
157  }
158  else
159  _console << "Augmented Lagrangian contact constraint enforcement is satisfied."
160  << std::endl;
161  }
162  else
163  {
164  // maxed out
165  _console << "Maximum Augmented Lagrangian contact iterations have been reached." << std::endl;
166  reason = MooseNonlinearConvergenceReason::DIVERGED_FUNCTION_COUNT;
167  }
168  }
169 
170  return reason;
171 }
AugmentedLagrangianContactProblem
Class to manage nested solution for augmented Lagrange contact.
Definition: AugmentedLagrangianContactProblem.h:28
AugmentedLagrangianContactProblem::_num_lagmul_iterations
int _num_lagmul_iterations
Definition: AugmentedLagrangianContactProblem.h:53
validParams< AugmentedLagrangianContactProblem >
InputParameters validParams< AugmentedLagrangianContactProblem >()
Definition: AugmentedLagrangianContactProblem.C:32
AugmentedLagrangianContactProblem::_max_lagmul_iters
int _max_lagmul_iters
Definition: AugmentedLagrangianContactProblem.h:54
AugmentedLagrangianContactProblem::timestepSetup
virtual void timestepSetup() override
Definition: AugmentedLagrangianContactProblem.C:49
AugmentedLagrangianContactProblem::AugmentedLagrangianContactProblem
AugmentedLagrangianContactProblem(const InputParameters &params)
Definition: AugmentedLagrangianContactProblem.C:41
registerMooseObject
registerMooseObject("ContactApp", AugmentedLagrangianContactProblem)
AugmentedLagrangianContactProblem::checkNonlinearConvergence
virtual MooseNonlinearConvergenceReason checkNonlinearConvergence(std::string &msg, const PetscInt it, const Real xnorm, const Real snorm, const Real fnorm, const Real rtol, const Real divtol, const Real stol, const Real abstol, const PetscInt nfuncs, const PetscInt max_funcs, const PetscBool force_iteration, const Real ref_resid, const Real div_threshold) override
Definition: AugmentedLagrangianContactProblem.C:56
AugmentedLagrangianContactProblem.h