PenaltyFrictionUserObject

Description

The PenaltyFrictionUserObject object computes tangential pressures due to Coulomb friction by looping over mortar segments. The accumulated tangential slip is penalized by a penalty_friction factor. As the slip accumulates, the frictional pressure(s) saturates at the Coulomb limit. Note that a high enough value of the penalty_friction value is required to obtain realistic frictional pressure; otherwise, the tangential model will underpredict frictional forces. That is, higher values of the penalty_friction parameter will more accurately predict the stick and slip Coulomb behavior at the expense of worsening the convergence behavior. The slip_tolerance parameter can be chosen to limit the amount of relative slip at nodes that are not slipping (at the Coulomb limit).

The tangential traction (or tractions for a three-dimensional problem) generated by this object contains Jacobian information as a consequence of using automatic differentiation objects. These tractions are directly applied on the contacting surfaces by TangentialMortarMechanicalContact. That is, the tangential contact pressure values computed by this object serve a purpose analogous to the Lagrange multipliers when exact enforcement is used (see ComputeFrictionalForceLMMechanicalContact). This object is set up automatically when using the contact action.

This object is built from within the contact action when the formulation MORTAR_PENALTY and the model COULOMB is selected. The action sets the use_physical_gap parameter to true, which allows the user to select a normal contact penalty parameter on the order of the stiffness of the materials coming into contact. Also, to ensure solution stability, dual bases (i.e. use_dual = true) are employed by default to interpolate the contact traction when using the contact action.

An augmented Lagrange (AL) approach can be used to enforce the contact constraints to a user-prescribed tolerance. That tolerance can be the normal gap distance (distance to exact enforcement if in contact) or the relative slip tolerance for slipping nodes. The AL approach solves the original MOOSE problem, in which contact is enforced using a pure penalty approach, taking the necessary nonlinear iterations and updates "fixed" Lagrange multipliers in an outer loop. This process repeats until the contact-related tolerances are met. The "fixed" Lagrange multipliers represent accumulated normal and tangential tractions over the AL iterations (see (Wriggers, 2006)). Usage of AL with this mortar constraint allows for, simultaneously 1. Having a contact formulation that, upon AL convergence, will yield results equivalent to Lagrange multiplier-enforced dual mortar, 2. Enforcement of the contact constraint to a user-prescribed tolerance (analogous to Lagrange multiplier enforcement, see ComputeWeightedGapLMMechanicalContact), and 3. Keeps the system's condition number as if mechanical contact is not present; as long as the initial penalty coefficients are selected on the order of the material stiffnesses.

schooltip:Augmented Lagrange with mortar contact

For the reasons stated above, it is recommended to use an AL approach with the mortar penalty objects.

Example of usage in the contact action:

[Contact]
  [al_friction]
    formulation = mortar_penalty
    model = coulomb
    primary = '2'
    secondary = '3'
    penalty = 1e5
    penalty_friction = 1e8
    friction_coefficient = 0.4
    al_penetration_tolerance = 1e-7
    al_incremental_slip_tolerance = 1.0 # Not active
    penalty_multiplier = 100
    penalty_multiplier_friction = 1
  []
[]
(modules/contact/test/tests/pdass_problems/cylinder_friction_penalty_frictional_al_action.i)

which can be combined with an augmented Lagrange problem:

[Problem]
  type = AugmentedLagrangianContactFEProblem
  extra_tag_vectors = 'ref'
[]
(modules/contact/test/tests/pdass_problems/cylinder_friction_penalty_frictional_al_action.i)

See below an example of solver options with iterative preconditioners (e.g. algebraic multigrid) in a mortar mechanical contact problem. This solver selection can enable the simulation of very large contact mechanics problems with the more memory efficient iterative procedures:

[Executioner]
  type = Transient
  solve_type = 'NEWTON'

  petsc_options = '-ksp_snes_ew'
  petsc_options_iname = '-ksp_gmres_restart -pc_type -pc_hypre_type -pc_hypre_boomeramg_max_iter'
  petsc_options_value = ' 201                hypre    boomeramg      8'

  line_search = 'none'

  nl_abs_tol = 1e-10
  nl_rel_tol = 1e-8
  nl_max_its = 50
  l_tol = 1e-05
  l_abs_tol = 1e-13

  start_time = 0.0
  end_time = 0.2 # 1.0
  dt = 0.1
  dtmin = 0.1

  [Predictor]
    type = SimplePredictor
    scale = 1.0
  []

  automatic_scaling = true
  compute_scaling_once = false
  off_diagonals_in_auto_scaling = true
[]
(modules/contact/test/tests/pdass_problems/cylinder_friction_penalty_frictional_al_action_amg.i)

Input Parameters

  • disp_xThe x displacement variable

    C++ Type:std::vector<VariableName>

    Unit:(no unit assumed)

    Controllable:No

    Description:The x displacement variable

  • disp_yThe y displacement variable

    C++ Type:std::vector<VariableName>

    Unit:(no unit assumed)

    Controllable:No

    Description:The y displacement variable

  • friction_coefficientThe friction coefficient ruling Coulomb friction equations.

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:The friction coefficient ruling Coulomb friction equations.

  • penaltyThe penalty factor

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:The penalty factor

  • primary_boundaryThe name of the primary boundary sideset.

    C++ Type:BoundaryName

    Unit:(no unit assumed)

    Controllable:No

    Description:The name of the primary boundary sideset.

  • primary_subdomainThe name of the primary subdomain.

    C++ Type:SubdomainName

    Unit:(no unit assumed)

    Controllable:No

    Description:The name of the primary subdomain.

  • secondary_boundaryThe name of the secondary boundary sideset.

    C++ Type:BoundaryName

    Unit:(no unit assumed)

    Controllable:No

    Description:The name of the secondary boundary sideset.

  • secondary_subdomainThe name of the secondary subdomain.

    C++ Type:SubdomainName

    Unit:(no unit assumed)

    Controllable:No

    Description:The name of the secondary subdomain.

  • secondary_variablePrimal variable on secondary surface.

    C++ Type:VariableName

    Unit:(no unit assumed)

    Controllable:No

    Description:Primal variable on secondary surface.

Required Parameters

  • adaptivity_penalty_frictionFRICTION_LIMITThe augmented Lagrange update strategy used on the frictional penalty coefficient.

    Default:FRICTION_LIMIT

    C++ Type:MooseEnum

    Unit:(no unit assumed)

    Options:SIMPLE, FRICTION_LIMIT

    Controllable:No

    Description:The augmented Lagrange update strategy used on the frictional penalty coefficient.

  • adaptivity_penalty_normalSIMPLEThe augmented Lagrange update strategy used on the normal penalty coefficient.

    Default:SIMPLE

    C++ Type:MooseEnum

    Unit:(no unit assumed)

    Options:SIMPLE, BUSSETTA

    Controllable:No

    Description:The augmented Lagrange update strategy used on the normal penalty coefficient.

  • aux_lmAuxiliary variable that is utilized together with the penalty approach to interpolate the resulting contact tractions using dual bases.

    C++ Type:std::vector<VariableName>

    Unit:(no unit assumed)

    Controllable:No

    Description:Auxiliary variable that is utilized together with the penalty approach to interpolate the resulting contact tractions using dual bases.

  • correct_edge_droppingFalseWhether to enable correct edge dropping treatment for mortar constraints. When disabled any Lagrange Multiplier degree of freedom on a secondary element without full primary contributions will be set (strongly) to 0.

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether to enable correct edge dropping treatment for mortar constraints. When disabled any Lagrange Multiplier degree of freedom on a secondary element without full primary contributions will be set (strongly) to 0.

  • debug_meshFalseWhether this constraint is going to enable mortar segment mesh debug information. An exodusfile will be generated if the user sets this flag to true

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether this constraint is going to enable mortar segment mesh debug information. An exodusfile will be generated if the user sets this flag to true

  • disp_zThe z displacement variable

    C++ Type:std::vector<VariableName>

    Unit:(no unit assumed)

    Controllable:No

    Description:The z displacement variable

  • ghost_higher_d_neighborsFalseWhether we should ghost higher-dimensional neighbors. This is necessary when we are doing second order mortar with finite volume primal variables, because in order for the method to be second order we must use cell gradients, which couples in the neighbor cells.

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether we should ghost higher-dimensional neighbors. This is necessary when we are doing second order mortar with finite volume primal variables, because in order for the method to be second order we must use cell gradients, which couples in the neighbor cells.

  • ghost_point_neighborsFalseWhether we should ghost point neighbors of secondary face elements, and consequently also their mortar interface couples.

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether we should ghost point neighbors of secondary face elements, and consequently also their mortar interface couples.

  • interpolate_normalsFalseWhether to interpolate the nodal normals (e.g. classic idea of evaluating field at quadrature points). If this is set to false, then non-interpolated nodal normals will be used, and then the _normals member should be indexed with _i instead of _qp

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether to interpolate the nodal normals (e.g. classic idea of evaluating field at quadrature points). If this is set to false, then non-interpolated nodal normals will be used, and then the _normals member should be indexed with _i instead of _qp

  • minimum_projection_angle40Parameter to control which angle (in degrees) is admissible for the creation of mortar segments. If set to a value close to zero, very oblique projections are allowed, which can result in mortar segments solving physics not meaningfully, and overprojection of primary nodes onto the mortar segment mesh in extreme cases. This parameter is mostly intended for mortar mesh debugging purposes in two dimensions.

    Default:40

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:Parameter to control which angle (in degrees) is admissible for the creation of mortar segments. If set to a value close to zero, very oblique projections are allowed, which can result in mortar segments solving physics not meaningfully, and overprojection of primary nodes onto the mortar segment mesh in extreme cases. This parameter is mostly intended for mortar mesh debugging purposes in two dimensions.

  • penalty_frictionThe penalty factor for frictional interaction. If not provide, the normal penalty factor is also used for the frictional problem.

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:The penalty factor for frictional interaction. If not provide, the normal penalty factor is also used for the frictional problem.

  • penalty_multiplier_friction1The penalty growth factor between augmented Lagrange iterations for penalizing relative slip distance if the node is under stick conditions.

    Default:1

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:The penalty growth factor between augmented Lagrange iterations for penalizing relative slip distance if the node is under stick conditions.

  • periodicFalseWhether this constraint is going to be used to enforce a periodic condition. This has the effect of changing the normals vector for projection from outward to inward facing

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether this constraint is going to be used to enforce a periodic condition. This has the effect of changing the normals vector for projection from outward to inward facing

  • primary_variablePrimal variable on primary surface. If this parameter is not provided then the primary variable will be initialized to the secondary variable

    C++ Type:VariableName

    Unit:(no unit assumed)

    Controllable:No

    Description:Primal variable on primary surface. If this parameter is not provided then the primary variable will be initialized to the secondary variable

  • prop_getter_suffixAn optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.

    C++ Type:MaterialPropertyName

    Unit:(no unit assumed)

    Controllable:No

    Description:An optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.

  • slip_toleranceAcceptable slip distance at which augmented Lagrange iterations can be stopped

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:Acceptable slip distance at which augmented Lagrange iterations can be stopped

  • use_interpolated_stateFalseFor the old and older state use projected material properties interpolated at the quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:For the old and older state use projected material properties interpolated at the quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.

  • use_physical_gapFalseWhether to use the physical normal gap (not scaled by mortar integration) and normalize the penalty coefficient with a representative lower-dimensional volume assigned to the node in the contacting boundary. This parameter is defaulted to 'true' in the contact action.

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether to use the physical normal gap (not scaled by mortar integration) and normalize the penalty coefficient with a representative lower-dimensional volume assigned to the node in the contacting boundary. This parameter is defaulted to 'true' in the contact action.

Optional Parameters

  • allow_duplicate_execution_on_initialFalseIn the case where this UserObject is depended upon by an initial condition, allow it to be executed twice during the initial setup (once before the IC and again after mesh adaptivity (if applicable).

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:In the case where this UserObject is depended upon by an initial condition, allow it to be executed twice during the initial setup (once before the IC and again after mesh adaptivity (if applicable).

  • control_tagsAdds user-defined labels for accessing object parameters via control logic.

    C++ Type:std::vector<std::string>

    Unit:(no unit assumed)

    Controllable:No

    Description:Adds user-defined labels for accessing object parameters via control logic.

  • enableTrueSet the enabled status of the MooseObject.

    Default:True

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:Yes

    Description:Set the enabled status of the MooseObject.

  • execution_order_group0Execution order groups are executed in increasing order (e.g., the lowest number is executed first). Note that negative group numbers may be used to execute groups before the default (0) group. Please refer to the user object documentation for ordering of user object execution within a group.

    Default:0

    C++ Type:int

    Unit:(no unit assumed)

    Controllable:No

    Description:Execution order groups are executed in increasing order (e.g., the lowest number is executed first). Note that negative group numbers may be used to execute groups before the default (0) group. Please refer to the user object documentation for ordering of user object execution within a group.

  • force_postauxFalseForces the UserObject to be executed in POSTAUX

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Forces the UserObject to be executed in POSTAUX

  • force_preauxFalseForces the UserObject to be executed in PREAUX

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Forces the UserObject to be executed in PREAUX

  • force_preicFalseForces the UserObject to be executed in PREIC during initial setup

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Forces the UserObject to be executed in PREIC during initial setup

  • use_displaced_meshTrueWhether or not this object should use the displaced mesh for computation. Note that in the case this is true but no displacements are provided in the Mesh block the undisplaced mesh will still be used.

    Default:True

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether or not this object should use the displaced mesh for computation. Note that in the case this is true but no displacements are provided in the Mesh block the undisplaced mesh will still be used.

Advanced Parameters

  • max_penalty_multiplier1000Maximum multiplier applied to penalty factors when adaptivity is used in an augmented Lagrange setting. The penalty factor supplied by the user is used as a reference.

    Default:1000

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:Maximum multiplier applied to penalty factors when adaptivity is used in an augmented Lagrange setting. The penalty factor supplied by the user is used as a reference.

  • penalty_multiplier1The penalty growth factor between augmented Lagrange iterations if weighted gap does not get closed fast enough. For frictional simulations, values smaller than 100 are recommended, e.g. 5.

    Default:1

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:The penalty growth factor between augmented Lagrange iterations if weighted gap does not get closed fast enough. For frictional simulations, values smaller than 100 are recommended, e.g. 5.

  • penetration_toleranceAcceptable penetration distance at which augmented Lagrange iterations can be stopped

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:Acceptable penetration distance at which augmented Lagrange iterations can be stopped

Augmented Lagrange Parameters

Input Files

References

  1. Peter Wriggers. Computational Contact Mechanics. Springer Berlin Heidelberg, Berlin, Heidelberg, 2006.[BibTeX]