30 "Computes the mortar frictional contact force via a penalty approach.");
32 "The penalty factor for frictional interaction. If not provide, the normal " 33 "penalty factor is also used for the frictional problem.");
35 "The friction coefficient ruling Coulomb friction equations.");
39 "Acceptable slip distance at which augmented Lagrange iterations can be stopped");
40 MooseEnum adaptivity_penalty_friction(
"SIMPLE FRICTION_LIMIT",
"FRICTION_LIMIT");
41 adaptivity_penalty_friction.addDocumentation(
42 "SIMPLE",
"Keep multiplying by the frictional penalty multiplier between AL iterations");
43 adaptivity_penalty_friction.addDocumentation(
45 "This strategy will be guided by the Coulomb limit and be less reliant on the initial " 46 "penalty factor provided by the user.");
48 "adaptivity_penalty_friction",
49 adaptivity_penalty_friction,
50 "The augmented Lagrange update strategy used on the frictional penalty coefficient.");
52 "penalty_multiplier_friction",
54 "penalty_multiplier_friction > 0",
55 "The penalty growth factor between augmented Lagrange " 56 "iterations for penalizing relative slip distance if the node is under stick conditions.");
77 _penalty(getParam<
Real>(
"penalty")),
78 _penalty_friction(isParamValid(
"penalty_friction") ? getParam<
Real>(
"penalty_friction")
79 : getParam<
Real>(
"penalty")),
80 _slip_tolerance(isParamValid(
"slip_tolerance") ? getParam<
Real>(
"slip_tolerance") : 0.0),
81 _friction_coefficient(getParam<
Real>(
"friction_coefficient")),
82 _penalty_multiplier_friction(getParam<
Real>(
"penalty_multiplier_friction")),
85 _epsilon_tolerance(1.0e-40)
90 "This parameter must be supplied if and only if an augmented Lagrange problem " 125 auto & [step_slip, old_step_slip] = map_pr.second;
126 old_step_slip = {0.0, 0.0};
127 step_slip = {0.0, 0.0};
133 auto & [accumulated_slip, old_accumulated_slip] = map_pr.second;
134 old_accumulated_slip = accumulated_slip;
143 auto & [tangential_traction, old_tangential_traction] = map_pr.second;
146 tangential_traction = {0.0, 0.0};
150 delta_tangential_lm.setZero();
252 if (normal_lm < -TOLERANCE && normal_pressure > TOLERANCE)
256 const auto & real_tangential_velocity =
258 const ADTwoVector slip_distance = {real_tangential_velocity[0] *
_dt,
259 real_tangential_velocity[1] *
_dt};
262 const auto & tangential_lm =
268 ADTwoVector inner_iteration_penalty_friction = penalty_friction * slip_distance;
273 penalty_friction * slip_distance.norm() >
276 inner_iteration_penalty_friction =
278 (penalty_friction * slip_distance.norm())) *
279 penalty_friction * slip_distance;
283 old_tangential_traction + tangential_lm + inner_iteration_penalty_friction;
286 ADReal tangential_trial_traction_norm = tangential_trial_traction.norm();
288 tangential_traction = tangential_trial_traction;
293 tangential_traction -=
294 phi_trial * tangential_trial_traction / tangential_trial_traction_norm;
306 accumulated_slip.setZero();
307 tangential_traction.setZero();
312 const auto & test_i = (*_test)[i];
335 auto & [step_slip, old_step_slip] = map_pr.second;
336 old_step_slip = step_slip;
339 std::pair<Real, dof_id_type> max_slip{0.0, 0};
343 const auto & tangential_traction = traction_pair.first;
355 const auto & real_tangential_velocity =
368 const auto new_slip =
369 std::make_pair<Real, dof_id_type>(slip_velocity.norm() *
_dt, dof_object->id());
370 if (new_slip > max_slip)
391 ", but slip tolerance is chosen to be ",
408 if (penalty_friction == 0.0)
415 const auto & real_tangential_velocity =
422 const TwoVector tangential_trial_traction =
423 old_tangential_traction + tangential_lm + penalty_friction * slip_velocity *
_dt;
424 const Real tangential_trial_traction_norm = tangential_trial_traction.norm();
427 if (tangential_trial_traction_norm * (1 + TOLERANCE) <=
430 tangential_lm += penalty_friction * slip_velocity *
_dt;
434 tangential_lm = -tangential_trial_traction / tangential_trial_traction_norm *
435 penalty_friction * normal_lm -
436 old_tangential_traction;
453 if (step_slip.first.dot(step_slip.second) > 0.0 && std::abs(normal_lm) > TOLERANCE &&
461 else if (step_slip.first.dot(step_slip.second) < 0.0)
462 penalty_friction /= 2.0;
ADVariableValue _frictional_contact_traction_one
The first frictional contact pressure on the mortar segment quadrature points.
virtual void finalize() override
const Real _max_penalty_multiplier
Maximum multiplier applied to the initial penalty factor in AL.
virtual MooseMesh & mesh()=0
ADVariableValue _frictional_contact_traction_two
The second frictional contact pressure on the mortar segment quadrature points.
std::unordered_map< const DofObject *, std::pair< TwoVector, TwoVector > > _dof_to_accumulated_slip
Map from degree of freedom to current and old accumulated slip.
virtual Real getAccumulatedSlip(const Node *const node, const unsigned int component) const override
const Real _epsilon_tolerance
Tolerance to avoid NaN/Inf in automatic differentiation operations.
virtual void updateAugmentedLagrangianMultipliers() override
std::unordered_map< const DofObject *, ADReal > _dof_to_normal_pressure
Map from degree of freedom to normal pressure for reporting.
virtual bool isAugmentedLagrangianConverged() override
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.
static const std::string component
AugmentedLagrangianContactProblemInterface *const _augmented_lagrange_problem
augmented Lagrange problem and iteration number
std::unordered_map< const DofObject *, std::array< ADReal, 2 > > _dof_to_real_tangential_velocity
A map from node to two interpolated, physical tangential velocities.
virtual const ADVariableValue & contactTangentialPressureDirTwo() const override
const Real & _dt
Current delta t... or timestep size.
virtual void updateAugmentedLagrangianMultipliers() override
virtual void initialize() override
AdaptivityFrictionalPenalty
The adaptivity method for the penalty factor at augmentations.
void mooseInfoRepeated(Args &&... args)
processor_id_type rank() const
PenaltyFrictionUserObject(const InputParameters ¶meters)
std::unordered_map< const DofObject *, TwoVector > _dof_to_frictional_lagrange_multipliers
Map from degree of freedom to augmented lagrange multiplier.
std::unordered_map< const DofObject *, std::pair< ADTwoVector, TwoVector > > _dof_to_tangential_traction
Map from degree of freedom to current and old tangential traction.
User object for computing weighted gaps and contact pressure for penalty based mortar constraints...
const Real _penalty_multiplier_friction
Penalty growth factor for augmented Lagrange.
const Parallel::Communicator & _communicator
Creates dof object to weighted tangential velocities map.
DualNumber< Real, DNDerivativeType, true > ADReal
virtual void timestepSetup() override
const libMesh::QBase *const & _qrule_msm
std::unordered_map< const DofObject *, std::pair< TwoVector, TwoVector > > _dof_to_step_slip
Map from degree of freedom to current and old step slip.
bool isParamValid(const std::string &name) const
User object that computes tangential pressures due to friction using a penalty approach, following J.C.
virtual void reinit() override
Elem const *const & _lower_secondary_elem
std::unordered_map< const DofObject *, Real > _dof_to_local_penalty_friction
Map from degree of freedom to local friction penalty value.
enum PenaltyFrictionUserObject::AdaptivityFrictionalPenalty _adaptivity_friction
virtual void timestepSetup()
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
const Real _friction_coefficient
The friction coefficient.
unsigned int n_points() const
virtual Real getDeltaTangentialLagrangeMultiplier(const Node *const node, const unsigned int component) const override
virtual const ADVariableValue & contactTangentialPressureDirOne() const override
virtual void reinit() override
void paramError(const std::string ¶m, Args... args) const
virtual bool isAugmentedLagrangianConverged() override
static InputParameters validParams()
const Real _slip_tolerance
Acceptable slip distance for augmented Lagrange convergence.
const Real _penalty_friction
The penalty factor for the frictional constraints.
static InputParameters validParams()
Creates dof object to weighted gap map.
virtual Real getFrictionalContactPressure(const Node *const node, const unsigned int component) const override
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
void max(const T &r, T &o, Request &req) const
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)
void resize(unsigned int size)
registerMooseObject("ContactApp", PenaltyFrictionUserObject)
virtual void finalize() override
virtual const VariableTestValue & test() const override
A two-component zero initialized vector used for tangential quantities.
static InputParameters validParams()
const MooseVariable *const _disp_x_var
The x displacement variable.
virtual void initialize() override
virtual Real getTangentialVelocity(const Node *const node, const unsigned int component) const override