Contact

Description

The Contact block can be used to specify parameters related to mechanical contact enforcement in MOOSE simulations. The ContactAction is associated with this input block, and is the class that performs the associated model setup tasks. Use of the ContactAction is not strictly required, but it greatly simplifies the setup of a simulation using contact enforcement. A high-level description of the contact problem is provided here.

This block can be used to specify mechanical normal and tangential contact using several possible models for the physical behavior of the interaction:

  • frictionless

  • glued

  • coulomb (frictional)

Contact enforcement using node/face primary/secondary algorithms is available using the following mathematical formulations:

  • kinematic

  • penalty

  • tangential penalty (kinematic normal constraint with penalty tangential constraint)

  • augmented lagrange

  • reduced active nonlinear function set (RANFS)

In addition, face/face contact using a mortar method can also be specified using this block.

Constructed Objects

The primary task performed by this action is creating the Constraint classes that perform the contact enforcement. The type of Constraint class(es) constructed depend on the formulation and physical interaction model specified using the formulation and model parameters. Table 1 shows the Constraint classes that can be created for various types of contact enforcement.

Table 1: Constraint objects constructed by ContactAction

In addition to the Constraint class, several other objects are created, as shown in

Table 2: Other objects constructed by ContactAction

Constructed ObjectPurpose
ContactPressureAuxCompute contact pressure and store in an AuxVariable
PenetrationCompute contact penetration and store in an AuxVariable
NodalAreaCompute nodal area and store in an AuxVariable

Notes on Node/Face Contact Enforcement

The node/face contact enforcement is based on a primary/secondary algorithm, in which contact is enforced at the nodes on the secondary surface, which cannot penetrate faces on the primary surface. As with all such approaches, for the best results, the primary surface should be the coarser of the two surfaces.

The contact enforcement system relies on MOOSE's geometric search system to provide the candidate set of faces that can interact with a secondary node at a given time. The set of candidate faces is controlled by the patch_size parameter and the patch_update_strategy options in the Mesh block. The patch size must be large enough to accommodate the sliding that occurs during a time step. It is generally recommended that the patch_update_strategy=auto be used.

The formulation parameter specifies the technique used to enforce contact. The DEFAULT option uses a kinematic enforcement algorithm that transfers the internal forces at secondary nodes to the corresponding primary face, and forces the secondary node to be at a specific location on the primary face using a penalty parameter. The converged solution with this approach results no penetration between the surfaces. The PENALTY algorithm employs a penalty approach, where the penetration between the surfaces is penalized, and the converged solution has a small penetration, which is inversely proportional to the penalty parameter.

Regardless of the formulation used, the robustness of the mechanical contact algorithm is affected by the penalty parameter. If the parameter is too small, there will be excessive penetrations with the penalty formulation, and convergence will suffer with the kinematic formulation. If the parameter is too large, the solver may struggle due to poor conditioning.

System Parameter

The system parameter is deprecated and currently defaults to Constraint.

Gap offset parameters

Gap offset can be provided to the current contact formulation enforced using the MechanicalContactConstraint. It can be either secondary_gap_offset (gap offset from secondary side) or mapped_primary_gap_offset (gap offset from primary side but mapped to secondary side). Use of these gap offset parameters treats the surfaces as if they were virtually extended (positive offset value) or narrowed (negative offset value) by the specified amount, so that the surfaces are treated as if they are closer or further away than they actually are. There is no deformation within the material in this gap offset region.

Example Input syntax

Node/face frictionless contact:

[Contact]
  [./leftright]
    secondary = 3
    primary = 2
    model = frictionless
    penalty = 1e+6
    normal_smoothing_distance = 0.1
  [../]
[]
(modules/contact/test/tests/sliding_block/sliding/frictionless_kinematic.i)

Node/face frictional contact:

[Contact]
  [./leftright]
    secondary = 3
    primary = 2
    model = coulomb
    penalty = 1e+7
    friction_coefficient = 0.2
    formulation = penalty
    normal_smoothing_distance = 0.1
  [../]
[]
(modules/contact/test/tests/sliding_block/sliding/frictional_02_penalty.i)

Normal (frictionless) mortar contact:

[Contact]
  [frictionless]
    mesh = simple_mesh
    primary = 2
    secondary = 1
    formulation = mortar
  []
[]
(modules/contact/test/tests/mechanical-small-problem/frictionless-nodal-lm-mortar-disp-action.i)

Normal and tangential (frictional) mortar contact:

[Contact]
  [frictional]
    mesh = revised_file_mesh
    primary = 20
    secondary = 10
    formulation = mortar
    model = coulomb
    friction_coefficient = 0.1
  []
[]
(modules/contact/test/tests/bouncing-block-contact/frictional-nodal-min-normal-lm-mortar-fb-tangential-lm-mortar-action.i)

Gap offset:

[Contact]
  [./leftright]
    master = 2
    slave = 3
    model = frictionless
    penalty = 1e+6
    secondary_gap_offset = secondary_gap_offset
    mapped_primary_gap_offset = mapped_primary_gap_offset
  [../]
[]
(modules/contact/test/tests/mechanical_constraint/frictionless_kinematic_gap_offsets.i)

Input Parameters

  • active__all__ If specified only the blocks named will be visited and made active

    Default:__all__

    C++ Type:std::vector

    Options:

    Description:If specified only the blocks named will be visited and made active

  • al_frictional_force_toleranceThe tolerance of the frictional force for augmented Lagrangian method.

    C++ Type:double

    Options:

    Description:The tolerance of the frictional force for augmented Lagrangian method.

  • al_incremental_slip_toleranceThe tolerance of the incremental slip for augmented Lagrangian method.

    C++ Type:double

    Options:

    Description:The tolerance of the incremental slip for augmented Lagrangian method.

  • al_penetration_toleranceThe tolerance of the penetration for augmented Lagrangian method.

    C++ Type:double

    Options:

    Description:The tolerance of the penetration for augmented Lagrangian method.

  • c_normal1Parameter for balancing the size of the gap and contact pressure

    Default:1

    C++ Type:double

    Options:

    Description:Parameter for balancing the size of the gap and contact pressure

  • c_tangential1Parameter for balancing the contact pressure and velocity

    Default:1

    C++ Type:double

    Options:

    Description:Parameter for balancing the contact pressure and velocity

  • capture_tolerance0Normal distance from surface within which nodes are captured

    Default:0

    C++ Type:double

    Options:

    Description:Normal distance from surface within which nodes are captured

  • disp_xThe x displacement

    C++ Type:VariableName

    Options:

    Description:The x displacement

  • disp_yThe y displacement

    C++ Type:VariableName

    Options:

    Description:The y displacement

  • disp_zThe z displacement

    C++ Type:VariableName

    Options:

    Description:The z displacement

  • displacementsThe displacements appropriate for the simulation geometry and coordinate system

    C++ Type:std::vector

    Options:

    Description:The displacements appropriate for the simulation geometry and coordinate system

  • formulationkinematicThe contact formulation

    Default:kinematic

    C++ Type:MooseEnum

    Options:ranfs kinematic penalty augmented_lagrange tangential_penalty mortar

    Description:The contact formulation

  • friction_coefficient0The friction coefficient

    Default:0

    C++ Type:double

    Options:

    Description:The friction coefficient

  • inactiveIf specified blocks matching these identifiers will be skipped.

    C++ Type:std::vector

    Options:

    Description:If specified blocks matching these identifiers will be skipped.

  • mapped_primary_gap_offsetOffset to gap distance mapped from primary side

    C++ Type:VariableName

    Options:

    Description:Offset to gap distance mapped from primary side

  • meshThe mesh generator for mortar method

    C++ Type:MeshGeneratorName

    Options:

    Description:The mesh generator for mortar method

  • modelfrictionlessThe contact model to use

    Default:frictionless

    C++ Type:MooseEnum

    Options:frictionless glued coulomb

    Description:The contact model to use

  • normal_lm_scaling1Scaling factor to apply to the normal LM variable

    Default:1

    C++ Type:double

    Options:

    Description:Scaling factor to apply to the normal LM variable

  • normal_smoothing_distanceDistance from edge in parametric coordinates over which to smooth contact normal

    C++ Type:double

    Options:

    Description:Distance from edge in parametric coordinates over which to smooth contact normal

  • normal_smoothing_methodMethod to use to smooth normals

    C++ Type:MooseEnum

    Options:edge_based nodal_normal_based

    Description:Method to use to smooth normals

  • normalize_penaltyFalseWhether to normalize the penalty parameter with the nodal area.

    Default:False

    C++ Type:bool

    Options:

    Description:Whether to normalize the penalty parameter with the nodal area.

  • orderFIRSTThe finite element order: FIRST, SECOND, etc.

    Default:FIRST

    C++ Type:MooseEnum

    Options:CONSTANT FIRST SECOND THIRD FOURTH

    Description:The finite element order: FIRST, SECOND, etc.

  • penalty1e+08The penalty to apply. This can vary depending on the stiffness of your materials

    Default:1e+08

    C++ Type:double

    Options:

    Description:The penalty to apply. This can vary depending on the stiffness of your materials

  • ping_pong_protectionFalseWhether to protect against ping-ponging, e.g. the oscillation of the secondary node between two different primary faces, by tying the secondary node to the edge between the involved primary faces

    Default:False

    C++ Type:bool

    Options:

    Description:Whether to protect against ping-ponging, e.g. the oscillation of the secondary node between two different primary faces, by tying the secondary node to the edge between the involved primary faces

  • primaryThe primary surface

    C++ Type:BoundaryName

    Options:

    Description:The primary surface

  • primary_secondary_jacobianTrueWhether to include Jacobian entries coupling primary and secondary nodes.

    Default:True

    C++ Type:bool

    Options:

    Description:Whether to include Jacobian entries coupling primary and secondary nodes.

  • secondaryThe secondary surface

    C++ Type:BoundaryName

    Options:

    Description:The secondary surface

  • secondary_gap_offsetOffset to gap distance from secondary side

    C++ Type:VariableName

    Options:

    Description:Offset to gap distance from secondary side

  • tangential_lm_scaling1Scaling factor to apply to the tangential LM variable

    Default:1

    C++ Type:double

    Options:

    Description:Scaling factor to apply to the tangential LM variable

  • tangential_toleranceTangential distance to extend edges of contact surfaces

    C++ Type:double

    Options:

    Description:Tangential distance to extend edges of contact surfaces

  • tension_release0Tension release threshold. A node in contact will not be released if its tensile load is below this value. No tension release if negative.

    Default:0

    C++ Type:double

    Options:

    Description:Tension release threshold. A node in contact will not be released if its tensile load is below this value. No tension release if negative.

  • use_dualFalseWhether to use the dual mortar approach

    Default:False

    C++ Type:bool

    Options:

    Description:Whether to use the dual mortar approach