35 "Computes the mortar frictional contact force via a penalty approach.");
37 "The penalty factor for frictional interaction. If not provide, the normal " 38 "penalty factor is also used for the frictional problem.");
40 "The friction coefficient ruling Coulomb friction equations.");
62 _penalty(getParam<
Real>(
"penalty")),
63 _penalty_friction(isParamValid(
"penalty_friction") ? getParam<
Real>(
"penalty_friction")
64 : getParam<
Real>(
"penalty")),
65 _friction_coefficient(getParam<
Real>(
"friction_coefficient")),
66 _epsilon_tolerance(1.0e-40)
70 mooseError(
"PenaltySimpleCohesiveZoneModel constraints cannot be enforced with an augmented " 71 "Lagrange approach.");
93 auto & [accumulated_slip, old_accumulated_slip] = map_pr.second;
94 old_accumulated_slip = accumulated_slip;
103 auto & [tangential_traction, old_tangential_traction] = map_pr.second;
106 tangential_traction = {0.0, 0.0};
110 delta_tangential_lm.setZero();
177 if (normal_lm < -TOLERANCE && normal_pressure > TOLERANCE)
181 const auto & real_tangential_velocity =
183 const ADTwoVector slip_distance = {real_tangential_velocity[0] *
_dt,
184 real_tangential_velocity[1] *
_dt};
187 const auto & tangential_lm =
193 ADTwoVector inner_iteration_penalty_friction = penalty_friction * slip_distance;
199 penalty_friction * slip_distance.norm() >
202 inner_iteration_penalty_friction =
204 (penalty_friction * slip_distance.norm())) *
205 penalty_friction * slip_distance;
209 old_tangential_traction + tangential_lm + inner_iteration_penalty_friction;
212 ADReal tangential_trial_traction_norm = 0;
213 if (std::abs(tangential_trial_traction(0)) + std::abs(tangential_trial_traction(1)) >
215 tangential_trial_traction_norm = tangential_trial_traction.norm();
218 tangential_traction = tangential_trial_traction;
223 tangential_traction -=
224 phi_trial * tangential_trial_traction / tangential_trial_traction_norm;
232 accumulated_slip.setZero();
233 tangential_traction.setZero();
238 const auto & test_i = (*_test)[i];
registerMooseObject("ContactApp", PenaltySimpleCohesiveZoneModel)
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.
virtual const ADVariableValue & contactTangentialPressureDirTwo() const override
std::unordered_map< const DofObject *, TwoVector > _dof_to_frictional_lagrange_multipliers
Map from degree of freedom to augmented lagrange multiplier.
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 void reinit() override
const Real & _dt
Current delta t... or timestep size.
PenaltySimpleCohesiveZoneModel(const InputParameters ¶meters)
virtual void initialize() override
User object for computing weighted gaps and contact pressure for penalty based mortar constraints...
virtual const VariableTestValue & test() const override
Creates dof object to weighted tangential velocities map.
virtual void prepareJumpKinematicQuantities()
DualNumber< Real, DNDerivativeType, true > ADReal
const libMesh::QBase *const & _qrule_msm
const Real _epsilon_tolerance
Tolerance to avoid NaN/Inf in automatic differentiation operations.
Elem const *const & _lower_secondary_elem
virtual void initialize() override
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 void timestepSetup()
virtual void computeFandR(const Node *const)
const Real _penalty_friction
The penalty factor for the frictional constraints.
OutputTools< Real >::VariableTestValue VariableTestValue
const VariableTestValue * _test
A pointer to the test function associated with the weighted gap.
virtual void timestepSetup() override
ADVariableValue _frictional_contact_traction_two
The second frictional contact pressure on the mortar segment quadrature points.
unsigned int n_points() const
virtual void reinit() override
static InputParameters validParams()
std::unordered_map< const DofObject *, std::pair< ADTwoVector, TwoVector > > _dof_to_tangential_traction
Map from degree of freedom to current and old tangential traction.
static InputParameters validParams()
virtual void computeBilinearMixedModeTraction(const Node *const)
Encapsulate the CZM constitutive behavior.
virtual void computeGlobalTraction(const Node *const)
Compute global traction for mortar application.
const Real _friction_coefficient
The friction coefficient.
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_local_penalty_friction
Map from degree of freedom to local friction penalty value.
ADVariableValue _frictional_contact_traction_one
The first frictional contact pressure on the mortar segment quadrature points.
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)
virtual void finalize() override
void mooseError(Args &&... args) const
A two-component zero initialized vector used for tangential quantities.
User object that interface pressure resulting from a simple traction separation law.
static InputParameters validParams()
const MooseVariable *const _disp_x_var
The x displacement variable.
virtual const ADVariableValue & contactTangentialPressureDirOne() const override
virtual void finalize() override