www.mooseframework.org
Public Member Functions | Private Attributes | List of all members
AugmentedLagrangianContactProblem Class Reference

Class to manage nested solution for augmented Lagrange contact. More...

#include <AugmentedLagrangianContactProblem.h>

Inheritance diagram for AugmentedLagrangianContactProblem:
[legend]

Public Member Functions

 AugmentedLagrangianContactProblem (const InputParameters &params)
 
virtual ~AugmentedLagrangianContactProblem ()
 
virtual void timestepSetup () override
 
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
 

Private Attributes

int _num_lagmul_iterations
 
int _max_lagmul_iters
 

Detailed Description

Class to manage nested solution for augmented Lagrange contact.

The AugmentedLagrangianContactProblem manages the nested solution procedure, repeating the solution until convergence has been achieved, checking for convergence, and updating the Lagrangian multipliers.

Definition at line 28 of file AugmentedLagrangianContactProblem.h.

Constructor & Destructor Documentation

◆ AugmentedLagrangianContactProblem()

AugmentedLagrangianContactProblem::AugmentedLagrangianContactProblem ( const InputParameters &  params)

Definition at line 41 of file AugmentedLagrangianContactProblem.C.

42  : ReferenceResidualProblem(params),
44  _max_lagmul_iters(getParam<int>("maximum_lagrangian_update_iterations"))
45 {
46 }

◆ ~AugmentedLagrangianContactProblem()

virtual AugmentedLagrangianContactProblem::~AugmentedLagrangianContactProblem ( )
inlinevirtual

Definition at line 32 of file AugmentedLagrangianContactProblem.h.

32 {}

Member Function Documentation

◆ checkNonlinearConvergence()

MooseNonlinearConvergenceReason AugmentedLagrangianContactProblem::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 
)
overridevirtual

Definition at line 56 of file AugmentedLagrangianContactProblem.C.

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 }

◆ timestepSetup()

void AugmentedLagrangianContactProblem::timestepSetup ( )
overridevirtual

Definition at line 49 of file AugmentedLagrangianContactProblem.C.

50 {
52  ReferenceResidualProblem::timestepSetup();
53 }

Member Data Documentation

◆ _max_lagmul_iters

int AugmentedLagrangianContactProblem::_max_lagmul_iters
private

Definition at line 54 of file AugmentedLagrangianContactProblem.h.

Referenced by checkNonlinearConvergence().

◆ _num_lagmul_iterations

int AugmentedLagrangianContactProblem::_num_lagmul_iterations
private

Definition at line 53 of file AugmentedLagrangianContactProblem.h.

Referenced by checkNonlinearConvergence(), and timestepSetup().


The documentation for this class was generated from the following files:
AugmentedLagrangianContactProblem::_num_lagmul_iterations
int _num_lagmul_iterations
Definition: AugmentedLagrangianContactProblem.h:53
AugmentedLagrangianContactProblem::_max_lagmul_iters
int _max_lagmul_iters
Definition: AugmentedLagrangianContactProblem.h:54