23 params.
addClassDescription(
"Computes the mortar normal contact force via a penalty approach.");
28 "penalty_multiplier > 0",
29 "The penalty growth factor between augmented Lagrange " 30 "iterations if weighted gap does not get closed fast enough. For frictional simulations, " 31 "values smaller than 100 are recommended, e.g. 5.");
35 "Whether to use the physical normal gap (not scaled by mortar integration) and normalize the " 36 "penalty coefficient with a representative lower-dimensional volume assigned to the node in " 37 "the contacting boundary. This parameter is defaulted to 'true' in the contact action.");
39 "penetration_tolerance",
40 "penetration_tolerance > 0",
41 "Acceptable penetration distance at which augmented Lagrange iterations can be stopped");
43 "max_penalty_multiplier",
45 "max_penalty_multiplier >= 1.0",
46 "Maximum multiplier applied to penalty factors when adaptivity is used in an augmented " 47 "Lagrange setting. The penalty factor supplied by the user is used as a reference.");
48 MooseEnum adaptivity_penalty_normal(
"SIMPLE BUSSETTA",
"SIMPLE");
49 adaptivity_penalty_normal.addDocumentation(
50 "SIMPLE",
"Keep multiplying by the penalty multiplier between AL iterations");
51 adaptivity_penalty_normal.addDocumentation(
53 "Modify the penalty using an algorithm from Bussetta et al, 2012, Comput Mech 49:259-275 " 54 "between AL iterations.");
56 "adaptivity_penalty_normal",
57 adaptivity_penalty_normal,
58 "The augmented Lagrange update strategy used on the normal penalty coefficient.");
61 "Auxiliary variable that is utilized together with the " 62 "penalty approach to interpolate the resulting contact tractions using dual bases.");
64 "Augmented Lagrange");
72 _penalty(getParam<
Real>(
"penalty")),
73 _penalty_multiplier(getParam<
Real>(
"penalty_multiplier")),
74 _penetration_tolerance(
75 isParamValid(
"penetration_tolerance") ? getParam<
Real>(
"penetration_tolerance") : 0.0),
76 _augmented_lagrange_problem(
78 _lagrangian_iteration_number(_augmented_lagrange_problem
79 ? _augmented_lagrange_problem->getLagrangianIterationNumber()
81 _dt(_fe_problem.dt()),
82 _use_physical_gap(getParam<bool>(
"use_physical_gap")),
83 _aux_lm_var(isCoupled(
"aux_lm") ? getVar(
"aux_lm", 0) : nullptr),
84 _max_penalty_multiplier(getParam<
Real>(
"max_penalty_multiplier")),
88 auto check_type = [
this](
const auto & var,
const auto & var_name)
92 "The displacement variables must have degrees of freedom exclusively on " 93 "nodes, e.g. they should probably be of finite element type 'Lagrange'.");
102 "This parameter must be supplied if and only if an augmented Lagrange problem " 143 const auto lagrange_multiplier =
147 auto normal_pressure = std::min(0.0, penalty * gap + lagrange_multiplier);
226 Real max_positive_gap = 0.0;
227 Real min_negative_gap = 0.0;
237 max_positive_gap = std::max(max_positive_gap, gap);
238 min_negative_gap = std::min(min_negative_gap, gap);
244 std::vector<Real> recv;
246 recv.resize(this->_communicator.size());
248 0, -min_negative_gap > max_positive_gap ? min_negative_gap : max_positive_gap, recv);
252 min_negative_gap = *std::min_element(recv.begin(), recv.end());
253 max_positive_gap = *std::max_element(recv.begin(), recv.end());
256 const Real reported_gap =
257 -min_negative_gap > max_positive_gap ? min_negative_gap : max_positive_gap;
264 "). Iteration number is: ",
274 "). Iteration number is: ",
303 const auto gap =
getNormalGap(static_cast<const Node *>(dof_object));
306 const auto possible_normalization =
312 if (lagrange_multiplier + gap * penalty / possible_normalization <= 0)
313 lagrange_multiplier += gap * penalty / possible_normalization;
315 lagrange_multiplier = 0.0;
343 if (previous_gap > 0.0)
350 if (previous_gap * gap < 0)
353 eval_tn = penalty * previous_gap;
364 const bool condition_one = std::abs(std::abs(previous_gap / gap) - 1.0) < 0.01;
365 const bool condition_two = std::abs(gap) > 1.01 * std::abs(previous_gap);
367 if (previous_gap * gap < 0)
371 (gap - previous_gap));
373 penalty = std::abs(penalty * previous_gap / 10.0 / gap);
377 if (std::abs(gap - previous_gap) >
382 else if (condition_two)
383 penalty *= 10.0 * previous_gap / gap;
const Real _max_penalty_multiplier
Maximum multiplier applied to the initial penalty factor in AL.
virtual MooseMesh & mesh()=0
ADReal adPhysicalGap(const std::pair< ADReal, Real > &gap) const
virtual void augmentedLagrangianSetup() override
static const unsigned int _no_iterations
virtual Real getNormalLagrangeMultiplier(const Node *const node) const
std::unordered_map< const DofObject *, ADReal > _dof_to_normal_pressure
Map from degree of freedom to normal pressure for reporting.
V findValue(const std::unordered_map< K, V > &map, const K &key, const V &default_value=0) const
Find a value in a map or return a default if the key doesn't exist.
const Real _penalty
The penalty factor.
void bussettaAdaptivePenalty(const Real previous_gap, const Real gap, Real &penalty, Real &eval_tn)
Adaptive, local penalty for AL.
void gather(const unsigned int root_id, const T &send_data, std::vector< T, A > &recv) const
AugmentedLagrangianContactProblemInterface *const _augmented_lagrange_problem
augmented Lagrange problem and iteration number
virtual void timestepSetup() override
const bool _use_physical_gap
Use scaled or physical gap.
const Real & _dt
Current delta t... or timestep size.
virtual void updateAugmentedLagrangianMultipliers() override
virtual void initialize() override
const MooseVariable *const _disp_z_var
The z displacement variable.
static InputParameters validParams()
void mooseInfoRepeated(Args &&... args)
processor_id_type rank() const
Interface class for user objects that support the augmented Lagrange formalism as implemented in Augm...
User object for computing weighted gaps and contact pressure for penalty based mortar constraints...
const bool _has_disp_z
For 2D mortar contact no displacement will be specified, so const pointers used.
const Parallel::Communicator & _communicator
virtual Real getNormalContactPressure(const Node *const node) const override
ADVariableValue _contact_pressure
The contact pressure on the mortar segument quadrature points.
void adaptiveNormalPenalty(const Real previous_gap, const Real gap, Real &penalty)
See Algorithm 3 of 'The adapted augmented Lagrangian method: a new method for the resolution of the m...
const libMesh::QBase *const & _qrule_msm
bool isParamValid(const std::string &name) const
virtual Real getNormalGap(const Node *const) const
Elem const *const & _lower_secondary_elem
virtual const ADVariableValue & contactPressure() const override
const Real _penetration_tolerance
penetration tolerance for augmented Lagrange contact
virtual void initialize() override
PenaltyWeightedGapUserObject(const InputParameters ¶meters)
OutputTools< Real >::VariableTestValue VariableTestValue
const VariableTestValue * _test
A pointer to the test function associated with the weighted gap.
virtual const Node * nodePtr(const dof_id_type i) const
std::unordered_map< const DofObject *, Real > _dof_to_local_penalty
Map from degree of freedom to local penalty value.
unsigned int n_points() const
virtual void reinit() override
void paramError(const std::string ¶m, Args... args) const
virtual const VariableTestValue & test() const override
enum PenaltyWeightedGapUserObject::AdaptivityNormalPenalty _adaptivity_normal
virtual bool isAugmentedLagrangianConverged() override
static InputParameters validParams()
Creates dof object to weighted gap map.
const MooseVariable *const _aux_lm_var
The auxiliary Lagrange multiplier variable (used together whith the Petrov-Galerkin approach) ...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::unordered_map< const DofObject *, Real > _dof_to_previous_gap
Map from degree of freedom to previous AL iteration gap values.
const Real _penalty_multiplier
penalty growth factor for augmented Lagrange
const MooseVariable *const _disp_y_var
The y displacement variable.
virtual const FieldVariablePhiValue & phiLower() const override
std::unordered_map< const DofObject *, Real > _dof_to_lagrange_multiplier
Map from degree of freedom to augmented lagrange multiplier.
IntRange< T > make_range(T beg, T end)
Real _dt_old
previous timestep size
void resize(unsigned int size)
virtual void finalize() override
Real physicalGap(const std::pair< ADReal, Real > &gap) const
Compute physical gap from integration gap quantity.
const unsigned int & _lagrangian_iteration_number
const MooseVariable *const _disp_x_var
The x displacement variable.
AdaptivityNormalPenalty
The adaptivity method for the penalty factor at augmentations.
std::unordered_map< const DofObject *, std::pair< ADReal, Real > > _dof_to_weighted_gap
A map from node to weighted gap and normalization (if requested)
registerMooseObject("ContactApp", PenaltyWeightedGapUserObject)
virtual void finalize() override