196 const Node * node = pinfo->_node;
198 RealVectorValue res_vec;
202 dof_id_type dof_number = node->dof_number(0,
_vars[i], 0);
206 RealVectorValue distance_vec(_mesh.nodeRef(node->id()) - pinfo->_closest_point);
207 const Real gap_size = -1. * pinfo->_normal * distance_vec;
211 bool newly_captured =
false;
214 if (update_contact_set && !pinfo->isCaptured() &&
217 newly_captured =
true;
223 ++pinfo->_locked_this_step;
226 if (!pinfo->isCaptured())
231 RealVectorValue pen_force(
_penalty * distance_vec);
240 pinfo->_contact_force = -pinfo->_normal * (pinfo->_normal * res_vec);
243 pinfo->_contact_force = pinfo->_normal * (pinfo->_normal * pen_force);
246 pinfo->_contact_force =
248 (pinfo->_normal * (pen_force + pinfo->_lagrange_multiplier * pinfo->_normal)));
251 mooseError(
"Invalid contact formulation");
254 pinfo->_mech_status = PenetrationInfo::MS_SLIPPING;
259 pinfo->_incremental_slip +
260 (pinfo->_normal * (_mesh.nodeRef(node->id()) - pinfo->_closest_point)) * pinfo->_normal;
261 pen_force =
_penalty * distance_vec;
269 (res_vec * pinfo->_normal > 0 ? res_vec * pinfo->_normal : 0));
272 pinfo->_contact_force =
274 (pinfo->_contact_force_old - pinfo->_normal * (pinfo->_normal * pinfo->_contact_force_old));
275 RealVectorValue contact_force_normal((pinfo->_contact_force * pinfo->_normal) * pinfo->_normal);
276 RealVectorValue contact_force_tangential(pinfo->_contact_force - contact_force_normal);
279 const Real tan_mag(contact_force_tangential.norm());
281 if (tan_mag > capacity)
283 pinfo->_contact_force = contact_force_normal + capacity * contact_force_tangential / tan_mag;
284 pinfo->_mech_status = PenetrationInfo::MS_SLIPPING;
288 pinfo->_mech_status = PenetrationInfo::MS_STICKING;
297 pinfo->_contact_force = -res_vec;
300 pinfo->_contact_force = pen_force;
303 pinfo->_contact_force =
304 pen_force + pinfo->_lagrange_multiplier * distance_vec / distance_vec.norm();
307 mooseError(
"Invalid contact formulation");
310 pinfo->_mech_status = PenetrationInfo::MS_STICKING;
314 mooseError(
"Invalid or unavailable contact model");
321 const Real contact_pressure = -(pinfo->_normal * pinfo->_contact_force) / area;
325 pinfo->_contact_force.zero();
330 pinfo->_lagrange_multiplier -=
getPenalty(*pinfo) * gap_size;