27#include "libmesh/string_to_enum.h"
28#include "libmesh/sparse_matrix.h"
41 params.
addParam<BoundaryName>(
"secondary",
"The secondary boundary");
43 "An integer corresponding to the direction "
44 "the variable this constraint acts on. (0 for x, "
49 "The displacements appropriate for the simulation geometry and coordinate system");
51 params.
addCoupledVar(
"secondary_gap_offset",
"offset to the gap distance from secondary side");
53 "offset to the gap distance mapped from primary side");
56 params.
set<
bool>(
"use_displaced_mesh") =
true;
60 "The penalty to apply. This can vary depending on the stiffness of your materials");
61 params.
addParam<Real>(
"penalty_multiplier",
63 "The growth factor for the penalty applied at the end of each augmented "
64 "Lagrange update iteration");
65 params.
addParam<Real>(
"friction_coefficient", 0,
"The friction coefficient");
66 params.
addParam<Real>(
"tangential_tolerance",
67 "Tangential distance to extend edges of contact surfaces");
69 "capture_tolerance", 0,
"Normal distance from surface within which nodes are captured");
71 params.
addParam<Real>(
"tension_release",
73 "Tension release threshold. A node in contact "
74 "will not be released if its tensile load is below "
75 "this value. No tension release if negative.");
80 "Whether to normalize the penalty parameter with the nodal area for penalty contact.");
82 "primary_secondary_jacobian",
84 "Whether to include jacobian entries coupling primary and secondary nodes.");
86 "connected_secondary_nodes_jacobian",
88 "Whether to include jacobian entries coupling nodes connected to secondary nodes.");
89 params.
addParam<
bool>(
"non_displacement_variables_jacobian",
91 "Whether to include jacobian entries coupling with variables that are not "
92 "displacement variables.");
93 params.
addParam<
unsigned int>(
"stick_lock_iterations",
94 std::numeric_limits<unsigned int>::max(),
95 "Number of times permitted to switch between sticking and slipping "
96 "in a solution before locking node in a sticked state.");
97 params.
addParam<Real>(
"stick_unlock_factor",
99 "Factor by which frictional capacity must be "
100 "exceeded to permit stick-locked node to slip "
102 params.
addParam<Real>(
"al_penetration_tolerance",
103 "The tolerance of the penetration for augmented Lagrangian method.");
104 params.
addParam<Real>(
"al_incremental_slip_tolerance",
105 "The tolerance of the incremental slip for augmented Lagrangian method.");
107 params.
addParam<Real>(
"al_frictional_force_tolerance",
108 "The tolerance of the frictional force for augmented Lagrangian method.");
110 "print_contact_nodes",
false,
"Whether to print the number of nodes in contact.");
113 "Apply non-penetration constraints on the mechanical deformation "
114 "using a node on face, primary/secondary algorithm, and multiple options "
115 "for the physical behavior on the interface and the mathematical "
116 "formulation for constraint enforcement");
125 _displaced_problem(parameters.get<
FEProblemBase *>(
"_fe_problem_base")->getDisplacedProblem()),
126 _component(getParam<unsigned
int>(
"component")),
127 _model(getParam<
MooseEnum>(
"model").getEnum<ContactModel>()),
128 _formulation(getParam<
MooseEnum>(
"formulation").getEnum<ContactFormulation>()),
129 _normalize_penalty(getParam<bool>(
"normalize_penalty")),
130 _penalty(getParam<Real>(
"penalty")),
131 _penalty_multiplier(getParam<Real>(
"penalty_multiplier")),
132 _friction_coefficient(getParam<Real>(
"friction_coefficient")),
133 _tension_release(getParam<Real>(
"tension_release")),
134 _capture_tolerance(getParam<Real>(
"capture_tolerance")),
135 _stick_lock_iterations(getParam<unsigned
int>(
"stick_lock_iterations")),
136 _stick_unlock_factor(getParam<Real>(
"stick_unlock_factor")),
137 _update_stateful_data(true),
138 _residual_copy(_sys.residualGhosted()),
139 _mesh_dimension(_mesh.dimension()),
140 _vars(3,
libMesh::invalid_uint),
141 _var_objects(3, nullptr),
142 _has_secondary_gap_offset(isCoupled(
"secondary_gap_offset")),
143 _secondary_gap_offset_var(_has_secondary_gap_offset ? getVar(
"secondary_gap_offset", 0)
145 _has_mapped_primary_gap_offset(isCoupled(
"mapped_primary_gap_offset")),
146 _mapped_primary_gap_offset_var(
147 _has_mapped_primary_gap_offset ? getVar(
"mapped_primary_gap_offset", 0) : nullptr),
148 _nodal_area_var(getVar(
"nodal_area", 0)),
149 _aux_system(_nodal_area_var->sys()),
150 _aux_solution(_aux_system.currentSolution()),
151 _primary_secondary_jacobian(getParam<bool>(
"primary_secondary_jacobian")),
152 _connected_secondary_nodes_jacobian(getParam<bool>(
"connected_secondary_nodes_jacobian")),
153 _non_displacement_vars_jacobian(getParam<bool>(
"non_displacement_variables_jacobian")),
155 _print_contact_nodes(getParam<bool>(
"print_contact_nodes")),
156 _augmented_lagrange_problem(
158 _lagrangian_iteration_number(_augmented_lagrange_problem
159 ? _augmented_lagrange_problem->getLagrangianIterationNumber()
184 if (
_formulation == ContactFormulation::TANGENTIAL_PENALTY &&
_model != ContactModel::COULOMB)
185 mooseError(
"The 'tangential_penalty' formulation can only be used with the 'coulomb' model");
187 if (
_model == ContactModel::GLUED)
191 mooseError(
"The friction coefficient must be nonnegative");
196 if (
_formulation == ContactFormulation::AUGMENTED_LAGRANGE)
198 if (
_model == ContactModel::GLUED)
199 mooseError(
"The Augmented Lagrangian contact formulation does not support GLUED case.");
202 mooseError(
"The Augmented Lagrangian contact formulation must use "
203 "AugmentedLagrangianContactProblem.");
206 mooseError(
"For Augmented Lagrangian contact, al_penetration_tolerance must be provided.");
210 if (
_model != ContactModel::FRICTIONLESS)
215 mooseError(
"For the Augmented Lagrangian frictional contact formualton, "
216 "al_incremental_slip_tolerance and "
217 "al_frictional_force_tolerance must be provided.");
234 if (
_formulation == ContactFormulation::AUGMENTED_LAGRANGE)
267 const Real
distance = pinfo->_normal * (pinfo->_closest_point - node) -
gapOffset(node);
269 if (beginning_of_step &&
_model == ContactModel::COULOMB)
271 pinfo->_lagrange_multiplier_slip.zero();
272 if (pinfo->isCaptured())
276 if (pinfo->isCaptured())
278 if (
_model == ContactModel::FRICTIONLESS)
281 if (
_model == ContactModel::COULOMB)
283 if (!beginning_of_step)
286 RealVectorValue pen_force_normal =
287 penalty * (-
distance) * pinfo->_normal + pinfo->_lagrange_multiplier * pinfo->_normal;
290 pinfo->_lagrange_multiplier += penalty * (-
distance);
294 ? -pen_force_normal * pinfo->_normal
297 RealVectorValue tangential_inc_slip =
298 pinfo->_incremental_slip -
299 (pinfo->_incremental_slip * pinfo->_normal) * pinfo->_normal;
303 RealVectorValue inc_pen_force_tangential =
304 pinfo->_lagrange_multiplier_slip + penalty_slip * tangential_inc_slip;
306 RealVectorValue tau_old = pinfo->_contact_force_old -
307 pinfo->_normal * (pinfo->_normal * pinfo->_contact_force_old);
309 RealVectorValue contact_force_tangential = inc_pen_force_tangential + tau_old;
310 const Real tan_mag(contact_force_tangential.norm());
314 pinfo->_lagrange_multiplier_slip =
315 -tau_old + capacity * contact_force_tangential / tan_mag;
316 if (MooseUtils::absoluteFuzzyEqual(capacity, 0.0))
324 pinfo->_lagrange_multiplier_slip += penalty_slip * tangential_inc_slip;
335 Real contactResidual = 0.0;
336 unsigned int converged = 0;
349 const Real
distance = pinfo->_normal * (pinfo->_closest_point - node) -
gapOffset(node);
351 if (pinfo->isCaptured())
353 if (contactResidual < std::abs(
distance))
354 contactResidual = std::abs(
distance);
363 if (
_model == ContactModel::COULOMB)
365 RealVectorValue contact_force_normal((pinfo->_contact_force * pinfo->_normal) *
367 RealVectorValue contact_force_tangential(pinfo->_contact_force - contact_force_normal);
369 RealVectorValue tangential_inc_slip =
370 pinfo->_incremental_slip - (pinfo->_incremental_slip * pinfo->_normal) * pinfo->_normal;
372 const Real tan_mag(contact_force_tangential.norm());
373 const Real tangential_inc_slip_mag = tangential_inc_slip.norm();
375 RealVectorValue distance_vec =
376 (pinfo->_normal * (node - pinfo->_closest_point) +
gapOffset(node)) * pinfo->_normal;
379 RealVectorValue pen_force_normal =
380 penalty * distance_vec + pinfo->_lagrange_multiplier * pinfo->_normal;
384 ? -pen_force_normal * pinfo->_normal
388 if (MooseUtils::absoluteFuzzyLessThan(tan_mag, capacity) &&
391 if (MooseUtils::absoluteFuzzyGreaterThan(tangential_inc_slip_mag,
413 _console <<
"The Augmented Lagrangian contact tangential sliding enforcement is NOT satisfied "
415 else if (converged == 2)
416 _console <<
"The Augmented Lagrangian contact tangential sliding enforcement is NOT satisfied "
418 else if (converged == 3)
419 _console <<
"The Augmented Lagrangian contact frictional force enforcement is NOT satisfied "
439 if (beginning_of_step)
443 pinfo->_contact_force_old = pinfo->_contact_force;
444 pinfo->_accumulated_slip_old = pinfo->_accumulated_slip;
445 pinfo->_frictional_energy_old = pinfo->_frictional_energy;
446 pinfo->_mech_status_old = pinfo->_mech_status;
457 pinfo->_locked_this_step = 0;
458 pinfo->_stick_locked_this_step = 0;
459 pinfo->_starting_elem = pinfo->_elem;
460 pinfo->_starting_side_num = pinfo->_side_num;
461 pinfo->_starting_closest_point_ref = pinfo->_closest_point_ref;
463 pinfo->_incremental_slip_prev_iter = pinfo->_incremental_slip;
470 bool in_contact =
false;
472 std::map<dof_id_type, PenetrationInfo *>::iterator found =
504 bool update_contact_set)
507 RealVectorValue res_vec;
510 dof_id_type dof_number = node.dof_number(0,
_vars[i], 0);
515 if (distance_vec.norm() != 0)
516 distance_vec +=
gapOffset(node) * pinfo->
_normal * distance_vec.unit() * distance_vec.unit();
518 const Real gap_size = -1.0 * pinfo->
_normal * distance_vec;
522 bool newly_captured =
false;
525 if (update_contact_set && !pinfo->
isCaptured() &&
528 newly_captured =
true;
544 RealVectorValue pen_force(penalty * distance_vec);
548 case ContactModel::FRICTIONLESS:
551 case ContactFormulation::KINEMATIC:
555 case ContactFormulation::PENALTY:
559 case ContactFormulation::AUGMENTED_LAGRANGE:
571 case ContactModel::COULOMB:
574 case ContactFormulation::KINEMATIC:
584 RealVectorValue contact_force_tangential(pinfo->
_contact_force - contact_force_normal);
586 RealVectorValue tangential_inc_slip =
591 const Real tan_mag(contact_force_tangential.norm());
592 const Real tangential_inc_slip_mag = tangential_inc_slip.norm();
593 const Real slip_tol = capacity / penalty;
596 if ((tangential_inc_slip_mag > slip_tol || tan_mag > capacity) &&
605 bool slipped_too_far =
false;
606 RealVectorValue slip_inc_direction;
607 if (tangential_inc_slip_mag > slip_tol)
609 slip_inc_direction = tangential_inc_slip / tangential_inc_slip_mag;
610 Real slip_dot_tang_force = slip_inc_direction * contact_force_tangential;
611 if (slip_dot_tang_force < capacity)
612 slipped_too_far =
true;
616 pinfo->
_contact_force = contact_force_normal + capacity * slip_inc_direction;
621 contact_force_normal + capacity * contact_force_tangential / tan_mag;
640 case ContactFormulation::PENALTY:
645 pen_force = penalty * distance_vec;
649 (pen_force * pinfo->
_normal < 0 ? -pen_force * pinfo->
_normal : 0));
657 RealVectorValue contact_force_tangential(pinfo->
_contact_force - contact_force_normal);
660 const Real tan_mag(contact_force_tangential.norm());
662 if (tan_mag > capacity)
665 contact_force_normal + capacity * contact_force_tangential / tan_mag;
666 if (MooseUtils::absoluteFuzzyEqual(capacity, 0))
676 case ContactFormulation::AUGMENTED_LAGRANGE:
681 RealVectorValue contact_force_normal =
684 RealVectorValue tangential_inc_slip =
688 RealVectorValue contact_force_tangential =
693 RealVectorValue inc_pen_force_tangential = penalty_slip * tangential_inc_slip;
697 contact_force_normal + contact_force_tangential + inc_pen_force_tangential;
699 pinfo->
_contact_force = contact_force_normal + contact_force_tangential;
704 case ContactFormulation::TANGENTIAL_PENALTY:
710 RealVectorValue contact_force_normal((-res_vec * pinfo->
_normal) * pinfo->
_normal);
714 RealVectorValue contact_force_tangential =
715 inc_pen_force_tangential +
720 const Real tan_mag(contact_force_tangential.norm());
722 if (tan_mag > capacity)
725 contact_force_normal + capacity * contact_force_tangential / tan_mag;
726 if (MooseUtils::absoluteFuzzyEqual(capacity, 0))
733 pinfo->
_contact_force = contact_force_normal + contact_force_tangential;
745 case ContactModel::GLUED:
748 case ContactFormulation::KINEMATIC:
752 case ContactFormulation::PENALTY:
756 case ContactFormulation::AUGMENTED_LAGRANGE:
769 mooseError(
"Invalid or unavailable contact model");
774 if (update_contact_set &&
_model != ContactModel::GLUED && pinfo->
isCaptured() &&
804 if (distance_vec.norm() != 0)
809 RealVectorValue pen_force(penalty * distance_vec);
811 if (
_model == ContactModel::FRICTIONLESS)
813 else if (
_model == ContactModel::COULOMB)
816 pen_force = penalty * distance_vec;
823 else if (
_model == ContactModel::GLUED)
826 else if (
_formulation == ContactFormulation::TANGENTIAL_PENALTY &&
827 _model == ContactModel::COULOMB)
834 RealVectorValue pen_force(penalty * distance_vec);
857 mooseError(
"Unhandled ConstraintJacobianType");
862 case ContactModel::FRICTIONLESS:
865 case ContactFormulation::KINEMATIC:
867 RealVectorValue jac_vec;
879 case ContactFormulation::PENALTY:
880 case ContactFormulation::AUGMENTED_LAGRANGE:
888 case ContactModel::COULOMB:
891 case ContactFormulation::KINEMATIC:
896 RealVectorValue jac_vec;
909 const Real curr_jac =
917 case ContactFormulation::PENALTY:
926 case ContactFormulation::AUGMENTED_LAGRANGE:
931 Real tang_comp = 0.0;
935 return normal_comp + tang_comp;
938 case ContactFormulation::TANGENTIAL_PENALTY:
940 RealVectorValue jac_vec;
951 Real tang_comp = 0.0;
956 return normal_comp + tang_comp;
963 case ContactModel::GLUED:
966 case ContactFormulation::KINEMATIC:
974 case ContactFormulation::PENALTY:
975 case ContactFormulation::AUGMENTED_LAGRANGE:
982 mooseError(
"Invalid or unavailable contact model");
988 case ContactModel::FRICTIONLESS:
991 case ContactFormulation::KINEMATIC:
995 RealVectorValue jac_vec;
999 jac_vec(i) = (*_jacobian)(dof_number,
1008 case ContactFormulation::PENALTY:
1009 case ContactFormulation::AUGMENTED_LAGRANGE:
1017 case ContactModel::COULOMB:
1020 case ContactFormulation::KINEMATIC:
1027 RealVectorValue jac_vec;
1032 (*_jacobian)(dof_number,
1043 const Real curr_jac =
1051 case ContactFormulation::PENALTY:
1060 case ContactFormulation::AUGMENTED_LAGRANGE:
1065 Real tang_comp = 0.0;
1069 return normal_comp + tang_comp;
1072 case ContactFormulation::TANGENTIAL_PENALTY:
1076 RealVectorValue jac_vec;
1080 jac_vec(i) = (*_jacobian)(dof_number,
1088 Real tang_comp = 0.0;
1093 return normal_comp + tang_comp;
1099 case ContactModel::GLUED:
1102 case ContactFormulation::KINEMATIC:
1105 const Real curr_jac =
1112 case ContactFormulation::PENALTY:
1113 case ContactFormulation::AUGMENTED_LAGRANGE:
1121 mooseError(
"Invalid or unavailable contact model");
1127 case ContactModel::FRICTIONLESS:
1130 case ContactFormulation::KINEMATIC:
1132 RealVectorValue jac_vec;
1143 case ContactFormulation::PENALTY:
1144 case ContactFormulation::AUGMENTED_LAGRANGE:
1151 case ContactModel::COULOMB:
1154 case ContactFormulation::KINEMATIC:
1159 RealVectorValue jac_vec;
1171 const Real secondary_jac =
1179 case ContactFormulation::PENALTY:
1188 case ContactFormulation::AUGMENTED_LAGRANGE:
1193 Real tang_comp = 0.0;
1197 return normal_comp + tang_comp;
1200 case ContactFormulation::TANGENTIAL_PENALTY:
1202 RealVectorValue jac_vec;
1212 Real tang_comp = 0.0;
1217 return normal_comp + tang_comp;
1224 case ContactModel::GLUED:
1227 case ContactFormulation::KINEMATIC:
1229 const Real secondary_jac =
1236 case ContactFormulation::PENALTY:
1237 case ContactFormulation::AUGMENTED_LAGRANGE:
1245 mooseError(
"Invalid or unavailable contact model");
1251 case ContactModel::FRICTIONLESS:
1254 case ContactFormulation::KINEMATIC:
1257 case ContactFormulation::PENALTY:
1258 case ContactFormulation::AUGMENTED_LAGRANGE:
1266 case ContactModel::COULOMB:
1267 case ContactModel::GLUED:
1270 case ContactFormulation::KINEMATIC:
1273 case ContactFormulation::PENALTY:
1283 case ContactFormulation::TANGENTIAL_PENALTY:
1285 Real tang_comp = 0.0;
1292 case ContactFormulation::AUGMENTED_LAGRANGE:
1297 Real tang_comp = 0.0;
1301 return normal_comp + tang_comp;
1309 mooseError(
"Invalid or unavailable contact model");
1325 unsigned int coupled_component;
1326 Real normal_component_in_coupled_var_dir = 1.0;
1328 normal_component_in_coupled_var_dir = pinfo->
_normal(coupled_component);
1333 mooseError(
"Unhandled ConstraintJacobianType");
1338 case ContactModel::FRICTIONLESS:
1341 case ContactFormulation::KINEMATIC:
1343 RealVectorValue jac_vec;
1355 case ContactFormulation::PENALTY:
1356 case ContactFormulation::AUGMENTED_LAGRANGE:
1364 case ContactModel::COULOMB:
1367 _formulation == ContactFormulation::TANGENTIAL_PENALTY) &&
1371 RealVectorValue jac_vec;
1383 else if ((
_formulation == ContactFormulation::PENALTY) &&
1388 else if (
_formulation == ContactFormulation::AUGMENTED_LAGRANGE)
1393 Real tang_comp = 0.0;
1397 return normal_comp + tang_comp;
1407 case ContactModel::GLUED:
1414 mooseError(
"Invalid or unavailable contact model");
1420 case ContactModel::FRICTIONLESS:
1423 case ContactFormulation::KINEMATIC:
1427 RealVectorValue jac_vec;
1431 jac_vec(i) = (*_jacobian)(dof_number,
1440 case ContactFormulation::PENALTY:
1441 case ContactFormulation::AUGMENTED_LAGRANGE:
1449 case ContactModel::COULOMB:
1451 _formulation == ContactFormulation::TANGENTIAL_PENALTY) &&
1457 RealVectorValue jac_vec;
1462 (*_jacobian)(dof_number, curr_primary_node->dof_number(0,
_vars[
_component], 0)) /
1470 else if ((
_formulation == ContactFormulation::PENALTY) &&
1475 else if (
_formulation == ContactFormulation::AUGMENTED_LAGRANGE)
1480 Real tang_comp = 0.0;
1484 return normal_comp + tang_comp;
1489 case ContactModel::GLUED:
1493 mooseError(
"Invalid or unavailable contact model");
1499 case ContactModel::FRICTIONLESS:
1502 case ContactFormulation::KINEMATIC:
1504 RealVectorValue jac_vec;
1515 case ContactFormulation::PENALTY:
1516 case ContactFormulation::AUGMENTED_LAGRANGE:
1523 case ContactModel::COULOMB:
1526 case ContactFormulation::KINEMATIC:
1531 RealVectorValue jac_vec;
1543 const Real secondary_jac =
1551 case ContactFormulation::PENALTY:
1560 case ContactFormulation::AUGMENTED_LAGRANGE:
1565 Real tang_comp = 0.0;
1569 return normal_comp + tang_comp;
1571 case ContactFormulation::TANGENTIAL_PENALTY:
1576 RealVectorValue jac_vec;
1594 case ContactModel::GLUED:
1597 case ContactFormulation::KINEMATIC:
1599 const Real secondary_jac =
1606 case ContactFormulation::PENALTY:
1607 case ContactFormulation::AUGMENTED_LAGRANGE:
1615 mooseError(
"Invalid or unavailable contact model");
1621 case ContactModel::FRICTIONLESS:
1624 case ContactFormulation::KINEMATIC:
1627 case ContactFormulation::PENALTY:
1628 case ContactFormulation::AUGMENTED_LAGRANGE:
1636 case ContactModel::COULOMB:
1638 if (
_formulation == ContactFormulation::AUGMENTED_LAGRANGE)
1649 else if (
_formulation == ContactFormulation::PENALTY &&
1658 case ContactModel::GLUED:
1664 else if (
_formulation == ContactFormulation::AUGMENTED_LAGRANGE)
1669 Real tang_comp = 0.0;
1673 return normal_comp + tang_comp;
1679 mooseError(
"Invalid or unavailable contact model");
1705 Real area = (*_aux_solution)(dof);
1821 unsigned int component;
1856 component = std::numeric_limits<unsigned int>::max();
1857 bool coupled_var_is_disp_var =
false;
1860 if (var_num ==
_vars[i])
1862 coupled_var_is_disp_var =
true;
1868 return coupled_var_is_disp_var;
1881 <<
" nodes in contact.\n";
1884 <<
" nodes in contact.\n";
void ErrorVector unsigned int
const ConsoleStream _console
MooseVariable * getVar(const std::string &var_name, unsigned int comp)
unsigned int coupledComponents(const std::string &var_name) const
virtual unsigned int coupled(const std::string &var_name, unsigned int comp=0) const
virtual bool lastSolveConverged() const=0
Executioner * getExecutioner() const
const InputParameters & parameters() const
const std::string & type() const
void mooseError(Args &&... args) const
bool isParamValid(const std::string &name) const
virtual const Node & nodeRef(const dof_id_type i) const
void scalingFactor(const std::vector< Real > &factor)
unsigned int number() const
DofValue getNodalValue(const Node &node) const
virtual const dof_id_type & nodalDofIndex() const=0
PenetrationLocator & _penetration_locator
const Node *const & _current_node
DenseMatrix< Number > _Kee
VariableTestValue _test_secondary
const Elem *const & _current_primary
std::vector< dof_id_type > _connected_dof_indices
const VariableTestValue & _test_primary
bool _overwrite_secondary_residual
DenseMatrix< Number > _Kne
static InputParameters validParams()
const VariableValue & _u_secondary
const VariablePhiValue & _phi_primary
VariablePhiValue _phi_secondary
MooseVariable & _primary_var
virtual void getConnectedDofIndices(unsigned int var_num)
MECH_STATUS_ENUM _mech_status
RealVectorValue _contact_force_old
unsigned int _locked_this_step
RealVectorValue _contact_force
Real _lagrange_multiplier
RealVectorValue _lagrange_multiplier_slip
unsigned int _stick_locked_this_step
void setNormalSmoothingMethod(std::string nsmString)
void setUpdate(bool update)
void setTangentialTolerance(Real tangential_tolerance)
void setNormalSmoothingDistance(Real normal_smoothing_distance)
std::map< dof_id_type, PenetrationInfo * > & _penetration_info
bool computingNonlinearResid() const
MooseVariableFieldBase & getVariable(THREAD_ID tid, const std::string &var_name) const
unsigned int number() const
void max(const T &r, T &o, Request &req) const
void set_union(T &data, const unsigned int root_id) const
void accumulateTaggedLocalMatrix()
void prepareMatrixTagNeighbor(Assembly &assembly, unsigned int ivar, unsigned int jvar, Moose::DGJacobianType type)
void resize(const unsigned int new_m, const unsigned int new_n)
const Parallel::Communicator & _communicator
static constexpr std::size_t dim
The following methods are specializations for using the Parallel::packed_range_* routines for a vecto...
Real distance(const Point &p)