- cohesive_zone_quantityThe desired cohesive zone model quantity to output as an auxiliary variable.
C++ Type:MooseEnum
Controllable:No
Description:The desired cohesive zone model quantity to output as an auxiliary variable.
- user_objectThe mortar cohesive zone modeling user object to get values from. Note that the user object must implement the corresponding getter function.
C++ Type:UserObjectName
Controllable:No
Description:The mortar cohesive zone modeling user object to get values from. Note that the user object must implement the corresponding getter function.
- variableThe name of the variable that this object applies to
C++ Type:AuxVariableName
Unit:(no unit assumed)
Controllable:No
Description:The name of the variable that this object applies to
CohesiveZoneMortarUserObjectAux
Description
The CohesiveZoneMortarUserObjectAux outputs various cohesive zone quantities that are helpful for analyzing or debugging cohesive zone or debonding simulation results. This auxiliary kernel is to be used in conjunction with mortar cohesive zone user objects, namely BilinearMixedModeCohesiveZoneModel.
Quantities that this object can output include:
mode_mixity_ratio: shear-to-opening mode mixity ratio.cohesive_damage: scalar damage variable.local_normal_jump: local normal displacement jump.local_tangential_jump: legacy name for the first local tangential displacement jump component.local_tangential_jump_1: first local tangential displacement jump component.local_tangential_jump_2: second local tangential displacement jump component.local_tangential_jump_effective: magnitude of the local tangential displacement jump,sqrt(t1^2 + t2^2).cohesive_traction_normal: local normal cohesive traction component.cohesive_traction_tangential_1: first local tangential cohesive traction component.cohesive_traction_tangential_2: second local tangential cohesive traction component.cohesive_traction_tangential_magnitude: magnitude of the local tangential cohesive traction,sqrt(t1^2 + t2^2).cohesive_traction_effective: full local cohesive traction norm,sqrt(tn^2 + t1^2 + t2^2).
The traction components are output in the local coordinate system follow the convention used internally in the model, which is that for local_normal_jump opening is positive and for cohesive_traction_normal tensile traction is negative.
Input Parameters
- blockThe list of blocks (ids or names) that this object will be applied
C++ Type:std::vector<SubdomainName>
Controllable:No
Description:The list of blocks (ids or names) that this object will be applied
- boundaryThe list of boundaries (ids or names) from the mesh where this object applies
C++ Type:std::vector<BoundaryName>
Controllable:No
Description:The list of boundaries (ids or names) from the mesh where this object applies
- check_boundary_restrictedTrueWhether to check for multiple element sides on the boundary in the case of a boundary restricted, element aux variable. Setting this to false will allow contribution to a single element's elemental value(s) from multiple boundary sides on the same element (example: when the restricted boundary exists on two or more sides of an element, such as at a corner of a mesh
Default:True
C++ Type:bool
Controllable:No
Description:Whether to check for multiple element sides on the boundary in the case of a boundary restricted, element aux variable. Setting this to false will allow contribution to a single element's elemental value(s) from multiple boundary sides on the same element (example: when the restricted boundary exists on two or more sides of an element, such as at a corner of a mesh
Optional Parameters
- control_tagsAdds user-defined labels for accessing object parameters via control logic.
C++ Type:std::vector<std::string>
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
Controllable:Yes
Description:Set the enabled status of the MooseObject.
- search_methodnearest_node_connected_sidesChoice of search algorithm. All options begin by finding the nearest node in the primary boundary to a query point in the secondary boundary. In the default nearest_node_connected_sides algorithm, primary boundary elements are searched iff that nearest node is one of their nodes. This is fast to determine via a pregenerated node-to-elem map and is robust on conforming meshes. In the optional all_proximate_sides algorithm, primary boundary elements are searched iff they touch that nearest node, even if they are not topologically connected to it. This is more CPU-intensive but is necessary for robustness on any boundary surfaces which has disconnections (such as Flex IGA meshes) or non-conformity (such as hanging nodes in adaptively h-refined meshes).
Default:nearest_node_connected_sides
C++ Type:MooseEnum
Options:nearest_node_connected_sides, all_proximate_sides
Controllable:No
Description:Choice of search algorithm. All options begin by finding the nearest node in the primary boundary to a query point in the secondary boundary. In the default nearest_node_connected_sides algorithm, primary boundary elements are searched iff that nearest node is one of their nodes. This is fast to determine via a pregenerated node-to-elem map and is robust on conforming meshes. In the optional all_proximate_sides algorithm, primary boundary elements are searched iff they touch that nearest node, even if they are not topologically connected to it. This is more CPU-intensive but is necessary for robustness on any boundary surfaces which has disconnections (such as Flex IGA meshes) or non-conformity (such as hanging nodes in adaptively h-refined meshes).
- seed0The seed for the master random number generator
Default:0
C++ Type:unsigned int
Controllable:No
Description:The seed for the master random number generator
- use_displaced_meshFalseWhether 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:False
C++ Type:bool
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
- 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.
- 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
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.
Material Property Retrieval Parameters
Input Files
- (modules/contact/test/tests/cohesive_zone_model/traction_curve_modeI_viscous.i)
- (modules/contact/test/tests/cohesive_zone_model/traction_cycle_modeI.i)
- (modules/contact/test/tests/cohesive_zone_model/traction_curve_modeI_3d_inclined.i)
- (modules/contact/test/tests/cohesive_zone_model/traction_curve_mixed.i)
- (modules/contact/test/tests/cohesive_zone_model/compression_shear_toggle.i)
- (modules/contact/examples/mortar_czm/debond_recontact.i)
- (modules/contact/test/tests/cohesive_zone_model/cohesive_friction.i)
- (modules/contact/test/tests/cohesive_zone_model/robustness_brittle_interface.i)
- (modules/contact/test/tests/cohesive_zone_model/traction_curve_modeIII_3d.i)
- (modules/contact/test/tests/cohesive_zone_model/mortar_czm_analysis.i)
- (modules/contact/test/tests/cohesive_zone_model/traction_curve_modeI_3d.i)
- (modules/contact/examples/mortar_czm/progressive_debonding.i)
- (modules/contact/test/tests/cohesive_zone_model/traction_curve_modeI.i)
- (modules/contact/test/tests/cohesive_zone_model/traction_curve_modeII.i)
- (modules/contact/test/tests/cohesive_zone_model/robustness_pure_shear_limit.i)
(modules/contact/test/tests/cohesive_zone_model/traction_curve_modeI_viscous.i)
# Purpose: Verify viscously regularized mode-I traction-separation output.
# Assertion: The viscously regularized traction-separation response matches the CSV gold curve.
# Why this exists: Protects the viscous regularization option of the bilinear cohesive law.
[Mesh]
[base]
type = GeneratedMeshGenerator
dim = 2
xmax = 1.1
ymax = 1
xmin = -0.1
nx = 1
ny = 1
[]
[rename_base]
type = RenameBoundaryGenerator
input = base
old_boundary = 'top bottom left right'
new_boundary = 'top_base bottom_base left_base right_base'
[]
[base_id]
type = SubdomainIDGenerator
input = rename_base
subdomain_id = 1
[]
[top]
type = GeneratedMeshGenerator
dim = 2
xmax = 1
ymin = 1
ymax = 2
nx = 1
ny = 1
[]
[rename_top]
type = RenameBoundaryGenerator
input = top
old_boundary = 'top bottom left right'
new_boundary = '100 101 102 103'
[]
[top_id]
type = SubdomainIDGenerator
input = rename_top
subdomain_id = 2
[]
[combined]
type = MeshCollectionGenerator
inputs = 'base_id top_id'
[]
[top_node]
type = ExtraNodesetGenerator
coord = '0 2 0'
input = combined
new_boundary = top_node
[]
[bottom_node]
type = ExtraNodesetGenerator
coord = '-0.1 0 0'
input = top_node
new_boundary = bottom_node
[]
[secondary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10001
new_block_name = 'secondary_lower'
sidesets = 'top_base'
input = bottom_node
[]
[primary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10000
sidesets = '101'
new_block_name = 'primary_lower'
input = secondary
[]
allow_renumbering = false
[]
[GlobalParams]
displacements = 'disp_x disp_y'
[]
[Physics]
[SolidMechanics]
[QuasiStatic]
[all]
strain = FINITE
add_variables = true
use_automatic_differentiation = true
decomposition_method = TaylorExpansion
block = '1 2'
[]
[]
[]
[]
[AuxVariables]
[damage]
[]
[local_normal_jump]
[]
[cohesive_traction_normal]
[]
[cohesive_traction_effective]
[]
[]
[AuxKernels]
[cohesive_damage]
type = CohesiveZoneMortarUserObjectAux
variable = damage
user_object = czm_uo
cohesive_zone_quantity = cohesive_damage
[]
[local_normal_jump]
type = CohesiveZoneMortarUserObjectAux
variable = local_normal_jump
user_object = czm_uo
cohesive_zone_quantity = local_normal_jump
[]
[cohesive_traction_normal]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_normal
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_normal
[]
[cohesive_traction_effective]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_effective
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_effective
[]
[]
[BCs]
[anchor_bottom_x]
type = DirichletBC
preset = true
value = 0.0
boundary = bottom_node
variable = disp_x
[]
[anchor_top_x]
type = DirichletBC
preset = true
boundary = top_node
variable = disp_x
value = 0
[]
[top]
type = FunctionDirichletBC
boundary = 100
variable = disp_y
function = '0.3*t'
preset = true
[]
[roller_bottom_y]
type = DirichletBC
boundary = bottom_base
variable = disp_y
value = 0
preset = true
[]
[]
[Materials]
[normal_strength]
type = GenericConstantMaterial
prop_names = 'normal_strength'
prop_values = '50'
[]
[shear_strength]
type = GenericConstantMaterial
prop_names = 'shear_strength'
prop_values = '50'
[]
[stress]
type = ADComputeFiniteStrainElasticStress
block = '1 2'
[]
[elasticity_tensor]
type = ADComputeElasticityTensor
fill_method = symmetric_isotropic_E_nu
C_ijkl = '1e8 0.3'
block = '1 2'
[]
[]
[UserObjects]
[czm_uo]
type = BilinearMixedModeCohesiveZoneModel
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
disp_x = disp_x
disp_y = disp_y
secondary_variable = disp_x
use_physical_gap = true
correct_edge_dropping = true
set_compressive_traction_to_zero = true
friction_coefficient = 0.0
penalty = 0.0
penalty_friction = 0.0
normal_strength = 'normal_strength'
shear_strength = 'shear_strength'
penalty_stiffness = 1000
power_law_parameter = 2.0
GI_c = 5
GII_c = 5
viscosity = 1e-2
displacements = 'disp_x disp_y'
[]
[]
[Constraints]
[x]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[y]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[c_x]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[c_y]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[]
[Postprocessors]
[jump_n]
type = ElementAverageValue
variable = local_normal_jump
block = secondary_lower
[]
[traction_n]
type = ElementAverageValue
variable = cohesive_traction_normal
block = secondary_lower
[]
[traction_eff]
type = ElementAverageValue
variable = cohesive_traction_effective
block = secondary_lower
[]
[cohesive_damage]
type = ElementAverageValue
variable = damage
block = secondary_lower
[]
[]
[Preconditioning]
[smp]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
line_search = none
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
automatic_scaling = true
compute_scaling_once = false
off_diagonals_in_auto_scaling = true
l_max_its = 2
l_tol = 1e-14
nl_max_its = 100
nl_rel_tol = 1e-12
nl_abs_tol = 1e-11
start_time = 0.0
dt = 0.01
end_time = 1.0
dtmin = 0.01
[]
[Outputs]
exodus = false
csv = true
[]
(modules/contact/test/tests/cohesive_zone_model/traction_cycle_modeI.i)
# Purpose: Verify irreversible damage behavior in a mode-I load-unload-reload traction cycle.
# Assertion: Reload response follows damaged stiffness and does not heal, matching the CSV gold cycle curve.
# Why this exists: Confirms damage monotonicity and non-healing assumptions in cyclic cohesive loading.
[Mesh]
[base]
type = GeneratedMeshGenerator
dim = 2
xmax = 1.1
ymax = 1
xmin = -0.1
nx = 1
ny = 1
[]
[rename_base]
type = RenameBoundaryGenerator
input = base
old_boundary = 'top bottom left right'
new_boundary = 'top_base bottom_base left_base right_base'
[]
[base_id]
type = SubdomainIDGenerator
input = rename_base
subdomain_id = 1
[]
[top]
type = GeneratedMeshGenerator
dim = 2
xmax = 1
ymin = 1
ymax = 2
nx = 1
ny = 1
[]
[rename_top]
type = RenameBoundaryGenerator
input = top
old_boundary = 'top bottom left right'
new_boundary = '100 101 102 103'
[]
[top_id]
type = SubdomainIDGenerator
input = rename_top
subdomain_id = 2
[]
[combined]
type = MeshCollectionGenerator
inputs = 'base_id top_id'
[]
[top_node]
type = ExtraNodesetGenerator
coord = '0 2 0'
input = combined
new_boundary = top_node
[]
[bottom_node]
type = ExtraNodesetGenerator
coord = '-0.1 0 0'
input = top_node
new_boundary = bottom_node
[]
[secondary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10001
new_block_name = 'secondary_lower'
sidesets = 'top_base'
input = bottom_node
[]
[primary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10000
sidesets = '101'
new_block_name = 'primary_lower'
input = secondary
[]
allow_renumbering = false
[]
[GlobalParams]
displacements = 'disp_x disp_y'
[]
[Physics]
[SolidMechanics]
[QuasiStatic]
[all]
strain = FINITE
add_variables = true
use_automatic_differentiation = true
decomposition_method = TaylorExpansion
block = '1 2'
[]
[]
[]
[]
[AuxVariables]
[damage]
[]
[local_normal_jump]
[]
[cohesive_traction_normal]
[]
[]
[AuxKernels]
[cohesive_damage]
type = CohesiveZoneMortarUserObjectAux
variable = damage
user_object = czm_uo
cohesive_zone_quantity = cohesive_damage
[]
[local_normal_jump]
type = CohesiveZoneMortarUserObjectAux
variable = local_normal_jump
user_object = czm_uo
cohesive_zone_quantity = local_normal_jump
[]
[cohesive_traction_normal]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_normal
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_normal
[]
[]
[BCs]
[anchor_bottom_x]
type = DirichletBC
preset = true
value = 0.0
boundary = bottom_node
variable = disp_x
[]
[anchor_top_x]
type = DirichletBC
preset = true
boundary = top_node
variable = disp_x
value = 0
[]
[top]
type = FunctionDirichletBC
boundary = 100
variable = disp_y
function = 'if(t<=0.3,0.4*t,if(t<=0.6,0.12-0.4*(t-0.3),0.4*(t-0.6)))'
preset = true
[]
[roller_bottom_y]
type = DirichletBC
boundary = bottom_base
variable = disp_y
value = 0
preset = true
[]
[]
[Materials]
[normal_strength]
type = GenericConstantMaterial
prop_names = 'normal_strength'
prop_values = '50'
[]
[shear_strength]
type = GenericConstantMaterial
prop_names = 'shear_strength'
prop_values = '50'
[]
[stress]
type = ADComputeFiniteStrainElasticStress
block = '1 2'
[]
[elasticity_tensor]
type = ADComputeElasticityTensor
fill_method = symmetric_isotropic_E_nu
C_ijkl = '1e8 0.3'
block = '1 2'
[]
[]
[UserObjects]
[czm_uo]
type = BilinearMixedModeCohesiveZoneModel
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
disp_x = disp_x
disp_y = disp_y
secondary_variable = disp_x
use_physical_gap = true
correct_edge_dropping = true
set_compressive_traction_to_zero = true
friction_coefficient = 0.0
penalty = 0.0
penalty_friction = 0.0
normal_strength = 'normal_strength'
shear_strength = 'shear_strength'
penalty_stiffness = 1000
power_law_parameter = 2.0
GI_c = 5
GII_c = 5
displacements = 'disp_x disp_y'
[]
[]
[Constraints]
[x]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[y]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[c_x]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[c_y]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[]
[Postprocessors]
[jump_n]
type = ElementAverageValue
variable = local_normal_jump
block = secondary_lower
[]
[traction_n]
type = ElementAverageValue
variable = cohesive_traction_normal
block = secondary_lower
[]
[cohesive_damage]
type = ElementAverageValue
variable = damage
block = secondary_lower
[]
[]
[Preconditioning]
[smp]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
line_search = none
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
automatic_scaling = true
compute_scaling_once = false
off_diagonals_in_auto_scaling = true
l_max_its = 2
l_tol = 1e-14
nl_max_its = 100
nl_rel_tol = 1e-12
nl_abs_tol = 1e-11
start_time = 0.0
dt = 0.02
end_time = 0.9
dtmin = 0.02
[]
[Outputs]
exodus = false
csv = true
[]
(modules/contact/test/tests/cohesive_zone_model/traction_curve_modeI_3d_inclined.i)
# Purpose: Verify mode-I traction-separation with a 45-degree inclined 3D interface.
# Assertion: A rotated 3D interface produces local-frame normal, tangential, effective traction, and damage outputs matching the CSV gold curve.
# Why this exists: Confirms local-frame outputs remain correct on interfaces not aligned with the global axes.
[Mesh]
[base]
type = GeneratedMeshGenerator
dim = 3
xmax = 1.1
xmin = -0.1
ymax = 1
zmax = 1
nx = 1
ny = 1
nz = 1
[]
[rename_base]
type = RenameBoundaryGenerator
input = base
old_boundary = 'top bottom left right front back'
new_boundary = 'top_base bottom_base left_base right_base front_base back_base'
[]
[base_id]
type = SubdomainIDGenerator
input = rename_base
subdomain_id = 1
[]
[top]
type = GeneratedMeshGenerator
dim = 3
xmax = 1
ymin = 1
ymax = 2
zmax = 1
nx = 1
ny = 1
nz = 1
[]
[rename_top]
type = RenameBoundaryGenerator
input = top
old_boundary = 'top bottom left right front back'
new_boundary = '100 101 102 103 104 105'
[]
[top_id]
type = SubdomainIDGenerator
input = rename_top
subdomain_id = 2
[]
[combined]
type = MeshCollectionGenerator
inputs = 'base_id top_id'
[]
# Rotate the entire mesh 45 degrees about the z-axis
[rotate]
type = TransformGenerator
input = combined
transform = ROTATE
vector_value = '0 0 45'
[]
# Rotated coordinates: (0,2,0) -> (-sqrt(2), sqrt(2), 0)
[top_node]
type = ExtraNodesetGenerator
coord = '-1.4142135623731 1.4142135623731 0'
input = rotate
new_boundary = top_node
[]
# Rotated coordinates: (-0.1,0,0) -> (-0.1*cos45, -0.1*sin45, 0)
[bottom_node]
type = ExtraNodesetGenerator
coord = '-0.070710678118655 -0.070710678118655 0'
input = top_node
new_boundary = bottom_node
[]
[secondary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10001
new_block_name = 'secondary_lower'
sidesets = 'top_base'
input = bottom_node
[]
[primary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10000
sidesets = '101'
new_block_name = 'primary_lower'
input = secondary
[]
allow_renumbering = false
[]
[GlobalParams]
displacements = 'disp_x disp_y disp_z'
[]
[Physics]
[SolidMechanics]
[QuasiStatic]
[all]
strain = FINITE
add_variables = true
use_automatic_differentiation = true
decomposition_method = TaylorExpansion
block = '1 2'
[]
[]
[]
[]
[AuxVariables]
[damage]
[]
[local_normal_jump]
[]
[cohesive_traction_normal]
[]
[cohesive_traction_tangential_1]
[]
[cohesive_traction_tangential_2]
[]
[cohesive_traction_effective]
[]
[]
[AuxKernels]
[cohesive_damage]
type = CohesiveZoneMortarUserObjectAux
variable = damage
user_object = czm_uo
cohesive_zone_quantity = cohesive_damage
[]
[local_normal_jump]
type = CohesiveZoneMortarUserObjectAux
variable = local_normal_jump
user_object = czm_uo
cohesive_zone_quantity = local_normal_jump
[]
[cohesive_traction_normal]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_normal
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_normal
[]
[cohesive_traction_tangential_1]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_tangential_1
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_tangential_1
[]
[cohesive_traction_tangential_2]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_tangential_2
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_tangential_2
[]
[cohesive_traction_effective]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_effective
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_effective
[]
[]
[BCs]
# Fix bottom boundary in all directions
[fix_bottom_x]
type = DirichletBC
boundary = bottom_base
variable = disp_x
value = 0
preset = true
[]
[fix_bottom_y]
type = DirichletBC
boundary = bottom_base
variable = disp_y
value = 0
preset = true
[]
[anchor_bottom_z]
type = DirichletBC
boundary = bottom_node
variable = disp_z
value = 0
preset = true
[]
# Top boundary: apply displacement along rotated normal [-1/sqrt(2), 1/sqrt(2), 0]
# Original: disp_y = 0.3*t along [0,1,0]
# Rotated: disp_x = -0.3*t/sqrt(2), disp_y = 0.3*t/sqrt(2)
[top_x]
type = FunctionDirichletBC
boundary = 100
variable = disp_x
function = '-0.21213203435596*t'
preset = true
[]
[top_y]
type = FunctionDirichletBC
boundary = 100
variable = disp_y
function = '0.21213203435596*t'
preset = true
[]
[anchor_top_z]
type = DirichletBC
preset = true
boundary = top_node
variable = disp_z
value = 0
[]
[]
[Materials]
[normal_strength]
type = GenericConstantMaterial
prop_names = 'normal_strength'
prop_values = '50'
[]
[shear_strength]
type = GenericConstantMaterial
prop_names = 'shear_strength'
prop_values = '50'
[]
[stress]
type = ADComputeFiniteStrainElasticStress
block = '1 2'
[]
[elasticity_tensor]
type = ADComputeElasticityTensor
fill_method = symmetric_isotropic_E_nu
C_ijkl = '1e8 0.3'
block = '1 2'
[]
[]
[UserObjects]
[czm_uo]
type = BilinearMixedModeCohesiveZoneModel
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
disp_x = disp_x
disp_y = disp_y
disp_z = disp_z
secondary_variable = disp_x
use_physical_gap = true
correct_edge_dropping = true
set_compressive_traction_to_zero = true
friction_coefficient = 0.0
penalty = 0.0
penalty_friction = 0.0
normal_strength = 'normal_strength'
shear_strength = 'shear_strength'
penalty_stiffness = 1000
power_law_parameter = 2.0
GI_c = 5
GII_c = 5
displacements = 'disp_x disp_y disp_z'
[]
[]
[Constraints]
[x]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[y]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[z]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_z
component = z
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[c_x]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[c_y]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[c_z]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_z
component = z
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[]
[Postprocessors]
[jump_n]
type = ElementAverageValue
variable = local_normal_jump
block = secondary_lower
[]
[traction_n]
type = ElementAverageValue
variable = cohesive_traction_normal
block = secondary_lower
[]
[traction_t1]
type = ElementAverageValue
variable = cohesive_traction_tangential_1
block = secondary_lower
[]
[traction_t2]
type = ElementAverageValue
variable = cohesive_traction_tangential_2
block = secondary_lower
[]
[traction_eff]
type = ElementAverageValue
variable = cohesive_traction_effective
block = secondary_lower
[]
[cohesive_damage]
type = ElementAverageValue
variable = damage
block = secondary_lower
[]
[]
[Preconditioning]
[smp]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
line_search = none
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
automatic_scaling = true
compute_scaling_once = false
off_diagonals_in_auto_scaling = true
l_max_its = 2
l_tol = 1e-14
nl_max_its = 100
nl_rel_tol = 1e-12
nl_abs_tol = 1e-11
start_time = 0.0
dt = 0.01
end_time = 1.0
dtmin = 0.01
[]
[Outputs]
exodus = false
csv = true
[]
(modules/contact/test/tests/cohesive_zone_model/traction_curve_mixed.i)
# Purpose: Verify mixed-mode traction-separation response for POWER_LAW and CLI-overridden BK criteria.
# Assertion: Mixed-mode jump-traction curves for both criteria match their CSV gold baselines within tolerance.
# Why this exists: Confirms criterion-specific mixed-mode damage behavior remains stable across constitutive options.
[Mesh]
[base]
type = GeneratedMeshGenerator
dim = 2
xmax = 1.1
ymax = 1
xmin = -0.1
nx = 1
ny = 1
[]
[rename_base]
type = RenameBoundaryGenerator
input = base
old_boundary = 'top bottom left right'
new_boundary = 'top_base bottom_base left_base right_base'
[]
[base_id]
type = SubdomainIDGenerator
input = rename_base
subdomain_id = 1
[]
[top]
type = GeneratedMeshGenerator
dim = 2
xmax = 1
ymin = 1
ymax = 2
nx = 1
ny = 1
[]
[rename_top]
type = RenameBoundaryGenerator
input = top
old_boundary = 'top bottom left right'
new_boundary = '100 101 102 103'
[]
[top_id]
type = SubdomainIDGenerator
input = rename_top
subdomain_id = 2
[]
[combined]
type = MeshCollectionGenerator
inputs = 'base_id top_id'
[]
[top_node]
type = ExtraNodesetGenerator
coord = '0 2 0'
input = combined
new_boundary = top_node
[]
[bottom_node]
type = ExtraNodesetGenerator
coord = '-0.1 0 0'
input = top_node
new_boundary = bottom_node
[]
[secondary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10001
new_block_name = 'secondary_lower'
sidesets = 'top_base'
input = bottom_node
[]
[primary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10000
sidesets = '101'
new_block_name = 'primary_lower'
input = secondary
[]
allow_renumbering = false
[]
[GlobalParams]
displacements = 'disp_x disp_y'
[]
[Physics]
[SolidMechanics]
[QuasiStatic]
[all]
strain = FINITE
add_variables = true
use_automatic_differentiation = true
decomposition_method = TaylorExpansion
block = '1 2'
[]
[]
[]
[]
[AuxVariables]
[mode_mixity_ratio]
[]
[damage]
[]
[local_normal_jump]
[]
[local_tangential_jump_1]
[]
[cohesive_traction_normal]
[]
[cohesive_traction_tangential_magnitude]
[]
[cohesive_traction_effective]
[]
[]
[AuxKernels]
[mode_mixity_ratio]
type = CohesiveZoneMortarUserObjectAux
variable = mode_mixity_ratio
user_object = czm_uo
cohesive_zone_quantity = mode_mixity_ratio
[]
[cohesive_damage]
type = CohesiveZoneMortarUserObjectAux
variable = damage
user_object = czm_uo
cohesive_zone_quantity = cohesive_damage
[]
[local_normal_jump]
type = CohesiveZoneMortarUserObjectAux
variable = local_normal_jump
user_object = czm_uo
cohesive_zone_quantity = local_normal_jump
[]
[local_tangential_jump_1]
type = CohesiveZoneMortarUserObjectAux
variable = local_tangential_jump_1
user_object = czm_uo
cohesive_zone_quantity = local_tangential_jump_1
[]
[cohesive_traction_normal]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_normal
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_normal
[]
[cohesive_traction_tangential_magnitude]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_tangential_magnitude
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_tangential_magnitude
[]
[cohesive_traction_effective]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_effective
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_effective
[]
[]
[BCs]
[fix_bottom_x]
type = DirichletBC
preset = true
value = 0.0
boundary = bottom_base
variable = disp_x
[]
[top_x]
type = FunctionDirichletBC
boundary = 100
variable = disp_x
function = '0.2*t'
preset = true
[]
[top_y]
type = FunctionDirichletBC
boundary = 100
variable = disp_y
function = '0.2*t'
preset = true
[]
[roller_bottom_y]
type = DirichletBC
boundary = bottom_base
variable = disp_y
value = 0
preset = true
[]
[]
[Materials]
[normal_strength]
type = GenericConstantMaterial
prop_names = 'normal_strength'
prop_values = '50'
[]
[shear_strength]
type = GenericConstantMaterial
prop_names = 'shear_strength'
prop_values = '50'
[]
[stress]
type = ADComputeFiniteStrainElasticStress
block = '1 2'
[]
[elasticity_tensor]
type = ADComputeElasticityTensor
fill_method = symmetric_isotropic_E_nu
C_ijkl = '1e8 0.3'
block = '1 2'
[]
[]
[UserObjects]
[czm_uo]
type = BilinearMixedModeCohesiveZoneModel
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
disp_x = disp_x
disp_y = disp_y
secondary_variable = disp_x
use_physical_gap = true
correct_edge_dropping = true
set_compressive_traction_to_zero = true
friction_coefficient = 0.0
penalty = 0.0
penalty_friction = 0.0
normal_strength = 'normal_strength'
shear_strength = 'shear_strength'
penalty_stiffness = 1000
power_law_parameter = 2.0
mixed_mode_criterion = POWER_LAW
GI_c = 5
GII_c = 2
displacements = 'disp_x disp_y'
[]
[]
[Constraints]
[x]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[y]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[c_x]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[c_y]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[]
[Postprocessors]
[mode_mixity]
type = ElementAverageValue
variable = mode_mixity_ratio
block = secondary_lower
[]
[jump_n]
type = ElementAverageValue
variable = local_normal_jump
block = secondary_lower
[]
[jump_t]
type = ElementAverageValue
variable = local_tangential_jump_1
block = secondary_lower
[]
[traction_n]
type = ElementAverageValue
variable = cohesive_traction_normal
block = secondary_lower
[]
[traction_t]
type = ElementAverageValue
variable = cohesive_traction_tangential_magnitude
block = secondary_lower
[]
[traction_eff]
type = ElementAverageValue
variable = cohesive_traction_effective
block = secondary_lower
[]
[cohesive_damage]
type = ElementAverageValue
variable = damage
block = secondary_lower
[]
[]
[Preconditioning]
[smp]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
line_search = none
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
automatic_scaling = true
compute_scaling_once = false
off_diagonals_in_auto_scaling = true
l_max_its = 2
l_tol = 1e-14
nl_max_its = 100
nl_rel_tol = 1e-12
nl_abs_tol = 1e-11
start_time = 0.0
dt = 0.01
end_time = 1.0
dtmin = 0.01
[]
[Outputs]
exodus = false
csv = true
[]
(modules/contact/test/tests/cohesive_zone_model/compression_shear_toggle.i)
# Purpose: Verify the compressive-traction toggle behavior under combined compression and shear loading.
# Assertion: Normal cohesive traction is suppressed when enabled and retained when disabled, matching CSV gold baselines.
# Why this exists: Confirms the set_compressive_traction_to_zero switch produces the expected alternate constitutive behavior.
[Mesh]
[base]
type = GeneratedMeshGenerator
dim = 2
xmax = 1.1
ymax = 1
xmin = -0.1
nx = 1
ny = 1
[]
[rename_base]
type = RenameBoundaryGenerator
input = base
old_boundary = 'top bottom left right'
new_boundary = 'top_base bottom_base left_base right_base'
[]
[base_id]
type = SubdomainIDGenerator
input = rename_base
subdomain_id = 1
[]
[top]
type = GeneratedMeshGenerator
dim = 2
xmax = 1
ymin = 1
ymax = 2
nx = 1
ny = 1
[]
[rename_top]
type = RenameBoundaryGenerator
input = top
old_boundary = 'top bottom left right'
new_boundary = '100 101 102 103'
[]
[top_id]
type = SubdomainIDGenerator
input = rename_top
subdomain_id = 2
[]
[combined]
type = MeshCollectionGenerator
inputs = 'base_id top_id'
[]
[top_node]
type = ExtraNodesetGenerator
coord = '0 2 0'
input = combined
new_boundary = top_node
[]
[bottom_node]
type = ExtraNodesetGenerator
coord = '-0.1 0 0'
input = top_node
new_boundary = bottom_node
[]
[secondary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10001
new_block_name = 'secondary_lower'
sidesets = 'top_base'
input = bottom_node
[]
[primary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10000
sidesets = '101'
new_block_name = 'primary_lower'
input = secondary
[]
allow_renumbering = false
[]
[GlobalParams]
displacements = 'disp_x disp_y'
[]
[Physics]
[SolidMechanics]
[QuasiStatic]
[all]
strain = FINITE
add_variables = true
use_automatic_differentiation = true
decomposition_method = TaylorExpansion
block = '1 2'
[]
[]
[]
[]
[AuxVariables]
[local_normal_jump]
[]
[local_tangential_jump_1]
[]
[cohesive_traction_normal]
[]
[cohesive_traction_tangential_magnitude]
[]
[]
[AuxKernels]
[local_normal_jump]
type = CohesiveZoneMortarUserObjectAux
variable = local_normal_jump
user_object = czm_uo
cohesive_zone_quantity = local_normal_jump
[]
[local_tangential_jump_1]
type = CohesiveZoneMortarUserObjectAux
variable = local_tangential_jump_1
user_object = czm_uo
cohesive_zone_quantity = local_tangential_jump_1
[]
[cohesive_traction_normal]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_normal
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_normal
[]
[cohesive_traction_tangential_magnitude]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_tangential_magnitude
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_tangential_magnitude
[]
[]
[BCs]
[fix_bottom_x]
type = DirichletBC
preset = true
value = 0.0
boundary = bottom_base
variable = disp_x
[]
[top_x]
type = FunctionDirichletBC
boundary = 100
variable = disp_x
function = '0.1*t'
preset = true
[]
[top_y]
type = FunctionDirichletBC
boundary = 100
variable = disp_y
function = '-0.1*t'
preset = true
[]
[roller_bottom_y]
type = DirichletBC
boundary = bottom_base
variable = disp_y
value = 0
preset = true
[]
[]
[Materials]
[normal_strength]
type = GenericConstantMaterial
prop_names = 'normal_strength'
prop_values = '50'
[]
[shear_strength]
type = GenericConstantMaterial
prop_names = 'shear_strength'
prop_values = '50'
[]
[stress]
type = ADComputeFiniteStrainElasticStress
block = '1 2'
[]
[elasticity_tensor]
type = ADComputeElasticityTensor
fill_method = symmetric_isotropic_E_nu
C_ijkl = '1e8 0.3'
block = '1 2'
[]
[]
[UserObjects]
[czm_uo]
type = BilinearMixedModeCohesiveZoneModel
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
disp_x = disp_x
disp_y = disp_y
secondary_variable = disp_x
use_physical_gap = true
correct_edge_dropping = true
set_compressive_traction_to_zero = true
friction_coefficient = 0.0
penalty = 0.0
penalty_friction = 0.0
normal_strength = 'normal_strength'
shear_strength = 'shear_strength'
penalty_stiffness = 1000
power_law_parameter = 2.0
GI_c = 5
GII_c = 5
displacements = 'disp_x disp_y'
[]
[]
[Constraints]
[x]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[y]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[c_x]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[c_y]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[]
[Postprocessors]
[jump_n]
type = ElementAverageValue
variable = local_normal_jump
block = secondary_lower
[]
[jump_t]
type = ElementAverageValue
variable = local_tangential_jump_1
block = secondary_lower
[]
[traction_n]
type = ElementAverageValue
variable = cohesive_traction_normal
block = secondary_lower
[]
[traction_t]
type = ElementAverageValue
variable = cohesive_traction_tangential_magnitude
block = secondary_lower
[]
[]
[Preconditioning]
[smp]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
line_search = none
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
automatic_scaling = true
compute_scaling_once = false
off_diagonals_in_auto_scaling = true
l_max_its = 2
l_tol = 1e-14
nl_max_its = 100
nl_rel_tol = 1e-12
nl_abs_tol = 1e-11
start_time = 0.0
dt = 0.02
end_time = 0.3
dtmin = 0.02
[]
[Outputs]
exodus = false
csv = true
[]
(modules/contact/examples/mortar_czm/debond_recontact.i)
# Purpose: Verify that a fully debonded interface (omega=1) re-establishes compressive contact on closure.
# Verifies: damage stays at 1 after full decohesion; compressive traction is nonzero on recontact via penalty contact.
[Mesh]
[base]
type = GeneratedMeshGenerator
dim = 2
xmax = 1.1
ymax = 1
xmin = -0.1
nx = 1
ny = 1
[]
[rename_base]
type = RenameBoundaryGenerator
input = base
old_boundary = 'top bottom left right'
new_boundary = 'top_base bottom_base left_base right_base'
[]
[base_id]
type = SubdomainIDGenerator
input = rename_base
subdomain_id = 1
[]
[top]
type = GeneratedMeshGenerator
dim = 2
xmax = 1
ymin = 1
ymax = 2
nx = 1
ny = 1
[]
[rename_top]
type = RenameBoundaryGenerator
input = top
old_boundary = 'top bottom left right'
new_boundary = '100 101 102 103'
[]
[top_id]
type = SubdomainIDGenerator
input = rename_top
subdomain_id = 2
[]
[combined]
type = MeshCollectionGenerator
inputs = 'base_id top_id'
[]
[top_node]
type = ExtraNodesetGenerator
coord = '0 2 0'
input = combined
new_boundary = top_node
[]
[bottom_node]
type = ExtraNodesetGenerator
coord = '-0.1 0 0'
input = top_node
new_boundary = bottom_node
[]
[secondary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10001
new_block_name = 'secondary_lower'
sidesets = 'top_base'
input = bottom_node
[]
[primary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10000
sidesets = '101'
new_block_name = 'primary_lower'
input = secondary
[]
allow_renumbering = false
[]
[GlobalParams]
displacements = 'disp_x disp_y'
[]
[Physics]
[SolidMechanics]
[QuasiStatic]
[all]
strain = FINITE
add_variables = true
use_automatic_differentiation = true
decomposition_method = TaylorExpansion
block = '1 2'
[]
[]
[]
[]
[AuxVariables]
[damage]
[]
[local_normal_jump]
[]
[cohesive_traction_normal]
[]
[]
[AuxKernels]
[cohesive_damage]
type = CohesiveZoneMortarUserObjectAux
variable = damage
user_object = czm_uo
cohesive_zone_quantity = cohesive_damage
[]
[local_normal_jump]
type = CohesiveZoneMortarUserObjectAux
variable = local_normal_jump
user_object = czm_uo
cohesive_zone_quantity = local_normal_jump
[]
[cohesive_traction_normal]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_normal
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_normal
[]
[]
[BCs]
[anchor_bottom_x]
type = DirichletBC
preset = true
value = 0.0
boundary = bottom_node
variable = disp_x
[]
[anchor_top_x]
type = DirichletBC
preset = true
boundary = top_node
variable = disp_x
value = 0
[]
# Open past delta_f (=0.2mm at K=1000, N=50, GI_c=5) then reverse into compression.
# delta_f = 2*GI_c/N = 0.2; loading reaches 0.24 (full debond) then reverses to -0.096.
[top]
type = FunctionDirichletBC
boundary = 100
variable = disp_y
function = 'if(t<=0.8, 0.3*t, 0.24 - 0.48*(t-0.8))'
preset = true
[]
[roller_bottom_y]
type = DirichletBC
boundary = bottom_base
variable = disp_y
value = 0
preset = true
[]
[]
[Materials]
[normal_strength]
type = GenericConstantMaterial
prop_names = 'normal_strength'
prop_values = '50'
[]
[shear_strength]
type = GenericConstantMaterial
prop_names = 'shear_strength'
prop_values = '50'
[]
[stress]
type = ADComputeFiniteStrainElasticStress
block = '1 2'
[]
[elasticity_tensor]
type = ADComputeElasticityTensor
fill_method = symmetric_isotropic_E_nu
C_ijkl = '1e8 0.3'
block = '1 2'
[]
[]
[UserObjects]
[czm_uo]
type = BilinearMixedModeCohesiveZoneModel
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
disp_x = disp_x
disp_y = disp_y
secondary_variable = disp_x
use_physical_gap = true
correct_edge_dropping = true
set_compressive_traction_to_zero = true
friction_coefficient = 0.0
penalty = 1e4
penalty_friction = 0.0
normal_strength = 'normal_strength'
shear_strength = 'shear_strength'
penalty_stiffness = 1000
power_law_parameter = 2.0
GI_c = 5
GII_c = 5
displacements = 'disp_x disp_y'
[]
[]
[Constraints]
[x]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[y]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[c_x]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[c_y]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[]
[Postprocessors]
[jump_n]
type = ElementAverageValue
variable = local_normal_jump
block = secondary_lower
[]
[traction_n]
type = ElementAverageValue
variable = cohesive_traction_normal
block = secondary_lower
[]
[cohesive_damage]
type = ElementAverageValue
variable = damage
block = secondary_lower
[]
# Total interface traction (CZM + penalty contact) from bulk stress equilibrium.
# After full debond (omega=1), CZM traction_n = 0, but this captures penalty contact compression.
[total_traction_y]
type = ADSidesetReaction
stress_tensor = stress
boundary = top_base
direction = '0 1 0'
[]
[]
[Preconditioning]
[smp]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
line_search = none
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
automatic_scaling = true
compute_scaling_once = false
off_diagonals_in_auto_scaling = true
l_max_its = 2
l_tol = 1e-14
nl_max_its = 100
nl_rel_tol = 1e-12
nl_abs_tol = 1e-11
start_time = 0.0
dt = 0.02
end_time = 1.36
dtmin = 0.02
[]
[Outputs]
exodus = false
csv = true
[]
(modules/contact/test/tests/cohesive_zone_model/cohesive_friction.i)
[Mesh]
[base]
type = GeneratedMeshGenerator
dim = 2
xmax = 1.1
ymax = 1
xmin = -0.1
nx = 1
ny = 1
[]
[rename_base]
type = RenameBoundaryGenerator
input = base
old_boundary = 'top bottom left right'
new_boundary = 'top_base bottom_base left_base right_base'
[]
[base_id]
type = SubdomainIDGenerator
input = rename_base
subdomain_id = 1
[]
[top]
type = GeneratedMeshGenerator
dim = 2
xmax = 1
ymin = 1
ymax = 2
nx = 1
ny = 1
[]
[rename_top]
type = RenameBoundaryGenerator
input = top
old_boundary = 'top bottom left right'
new_boundary = '100 101 102 103'
[]
[top_id]
type = SubdomainIDGenerator
input = rename_top
subdomain_id = 2
[]
[combined]
type = MeshCollectionGenerator
inputs = 'base_id top_id'
[]
[top_node]
type = ExtraNodesetGenerator
coord = '0 2 0'
input = combined
new_boundary = top_node
[]
[bottom_node]
type = ExtraNodesetGenerator
coord = '-0.1 0 0'
input = top_node
new_boundary = bottom_node
[]
[secondary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10001
new_block_name = 'secondary_lower'
sidesets = 'top_base'
input = bottom_node
[]
[primary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10000
sidesets = '101'
new_block_name = 'primary_lower'
input = secondary
[]
allow_renumbering = false
[]
[GlobalParams]
displacements = 'disp_x disp_y'
[]
[AuxVariables]
[penalty_normal_pressure]
order = FIRST
family = LAGRANGE
[]
[mode_mixity_ratio]
[]
[damage]
[]
[local_normal_jump]
[]
[local_tangential_jump]
[]
[]
[AuxKernels]
[penalty_normal_pressure_auxk]
type = MortarUserObjectAux
variable = penalty_normal_pressure
user_object = czm_uo
contact_quantity = normal_pressure
[]
[mode_mixity_ratio]
type = CohesiveZoneMortarUserObjectAux
variable = mode_mixity_ratio
user_object = czm_uo
cohesive_zone_quantity = mode_mixity_ratio
[]
[cohesive_damage]
type = CohesiveZoneMortarUserObjectAux
variable = damage
user_object = czm_uo
cohesive_zone_quantity = cohesive_damage
[]
[local_normal_jump]
type = CohesiveZoneMortarUserObjectAux
variable = local_normal_jump
user_object = czm_uo
cohesive_zone_quantity = local_normal_jump
[]
[local_tangential_jump]
type = CohesiveZoneMortarUserObjectAux
variable = local_tangential_jump
user_object = czm_uo
cohesive_zone_quantity = local_tangential_jump
[]
[]
[Physics]
[SolidMechanics]
[QuasiStatic]
generate_output = 'stress_yy'
[all]
strain = FINITE
add_variables = true
use_automatic_differentiation = true
decomposition_method = EigenSolution
generate_output = 'vonmises_stress'
block = '1 2'
[]
[]
[]
[]
[BCs]
[fix_x]
type = DirichletBC
preset = false
value = 0.0
boundary = bottom_node
variable = disp_x
[]
[fix_top]
type = FunctionDirichletBC
preset = false
boundary = 100
variable = disp_x
function = 0.2*t
[]
[top]
type = FunctionDirichletBC
boundary = 100
variable = disp_y
function = -0.01
preset = false
[]
[bottom]
type = DirichletBC
boundary = bottom_base
variable = disp_y
value = 0
preset = false
[]
[]
[Materials]
[normal_strength]
type = GenericConstantMaterial
prop_names = 'normal_strength'
prop_values = '1e3'
[]
[shear_strength]
type = GenericConstantMaterial
prop_names = 'shear_strength'
prop_values = '100'
[]
[stress]
type = ADComputeFiniteStrainElasticStress
block = '1 2'
[]
[elasticity_tensor]
type = ADComputeElasticityTensor
fill_method = symmetric_isotropic_E_nu
C_ijkl = '1e6 0.3'
block = '1'
[]
[elasticity_tensor2]
type = ADComputeElasticityTensor
fill_method = symmetric_isotropic_E_nu
C_ijkl = '1e5 0.3'
block = '2'
[]
[]
[Preconditioning]
[smp]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
automatic_scaling = true
compute_scaling_once = false
off_diagonals_in_auto_scaling = true
l_max_its = 2
l_tol = 1e-14
nl_max_its = 20
nl_rel_tol = 1e-12
nl_abs_tol = 1e-9
start_time = 0.0
dt = 0.1
end_time = 1.6
[]
[Outputs]
exodus = true
[]
[UserObjects]
[czm_uo]
type = BilinearMixedModeCohesiveZoneModel
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
disp_x = disp_x
disp_y = disp_y
secondary_variable = disp_x
use_physical_gap = true
set_compressive_traction_to_zero = true
correct_edge_dropping = true
penalty_friction = 5e6
penalty = 1e5
friction_coefficient = 0.1
# bilinear model parameters
normal_strength = 'normal_strength'
shear_strength = 'shear_strength'
penalty_stiffness = 1e6
power_law_parameter = 2
GI_c = 123
GII_c = 54
displacements = 'disp_x disp_y'
[]
[]
[Constraints]
[x]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[y]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[t_x]
type = TangentialMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
weighted_velocities_uo = czm_uo
[]
[t_y]
type = TangentialMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
weighted_velocities_uo = czm_uo
[]
[c_x]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[c_y]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[]
(modules/contact/test/tests/cohesive_zone_model/robustness_brittle_interface.i)
# Purpose: Verify stable behavior when the softening zone is nearly zero (brittle limit).
# Assertion: Traction output stays finite and damage bounded when delta_f is only marginally larger than delta_0, matching the CSV gold baseline.
# Why this exists: Guards solver and constitutive robustness in the near-brittle limit of the bilinear law.
# Parameters: K=1000, N=50 -> delta_0 = 0.05.
# GI_c = 1.3 -> delta_f = 2*1.3/50 = 0.052, giving delta_f/delta_0 = 1.04 (near-brittle).
# Viscosity = 1e-3 is used to regularize the abrupt damage jump and aid convergence.
[Mesh]
[base]
type = GeneratedMeshGenerator
dim = 2
xmax = 1.1
ymax = 1
xmin = -0.1
nx = 1
ny = 1
[]
[rename_base]
type = RenameBoundaryGenerator
input = base
old_boundary = 'top bottom left right'
new_boundary = 'top_base bottom_base left_base right_base'
[]
[base_id]
type = SubdomainIDGenerator
input = rename_base
subdomain_id = 1
[]
[top]
type = GeneratedMeshGenerator
dim = 2
xmax = 1
ymin = 1
ymax = 2
nx = 1
ny = 1
[]
[rename_top]
type = RenameBoundaryGenerator
input = top
old_boundary = 'top bottom left right'
new_boundary = '100 101 102 103'
[]
[top_id]
type = SubdomainIDGenerator
input = rename_top
subdomain_id = 2
[]
[combined]
type = MeshCollectionGenerator
inputs = 'base_id top_id'
[]
[top_node]
type = ExtraNodesetGenerator
coord = '0 2 0'
input = combined
new_boundary = top_node
[]
[bottom_node]
type = ExtraNodesetGenerator
coord = '-0.1 0 0'
input = top_node
new_boundary = bottom_node
[]
[secondary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10001
new_block_name = 'secondary_lower'
sidesets = 'top_base'
input = bottom_node
[]
[primary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10000
sidesets = '101'
new_block_name = 'primary_lower'
input = secondary
[]
allow_renumbering = false
[]
[GlobalParams]
displacements = 'disp_x disp_y'
[]
[Physics]
[SolidMechanics]
[QuasiStatic]
[all]
strain = FINITE
add_variables = true
use_automatic_differentiation = true
decomposition_method = TaylorExpansion
block = '1 2'
[]
[]
[]
[]
[AuxVariables]
[damage]
[]
[local_normal_jump]
[]
[cohesive_traction_normal]
[]
[cohesive_traction_effective]
[]
[]
[AuxKernels]
[cohesive_damage]
type = CohesiveZoneMortarUserObjectAux
variable = damage
user_object = czm_uo
cohesive_zone_quantity = cohesive_damage
[]
[local_normal_jump]
type = CohesiveZoneMortarUserObjectAux
variable = local_normal_jump
user_object = czm_uo
cohesive_zone_quantity = local_normal_jump
[]
[cohesive_traction_normal]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_normal
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_normal
[]
[cohesive_traction_effective]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_effective
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_effective
[]
[]
[BCs]
[anchor_bottom_x]
type = DirichletBC
preset = true
value = 0.0
boundary = bottom_node
variable = disp_x
[]
[anchor_top_x]
type = DirichletBC
preset = true
boundary = top_node
variable = disp_x
value = 0
[]
[top]
type = FunctionDirichletBC
boundary = 100
variable = disp_y
function = '0.3*t'
preset = true
[]
[roller_bottom_y]
type = DirichletBC
boundary = bottom_base
variable = disp_y
value = 0
preset = true
[]
[]
[Materials]
[normal_strength]
type = GenericConstantMaterial
prop_names = 'normal_strength'
prop_values = '50'
[]
[shear_strength]
type = GenericConstantMaterial
prop_names = 'shear_strength'
prop_values = '50'
[]
[stress]
type = ADComputeFiniteStrainElasticStress
block = '1 2'
[]
[elasticity_tensor]
type = ADComputeElasticityTensor
fill_method = symmetric_isotropic_E_nu
C_ijkl = '1e8 0.3'
block = '1 2'
[]
[]
[UserObjects]
[czm_uo]
type = BilinearMixedModeCohesiveZoneModel
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
disp_x = disp_x
disp_y = disp_y
secondary_variable = disp_x
use_physical_gap = true
correct_edge_dropping = true
set_compressive_traction_to_zero = true
friction_coefficient = 0.0
penalty = 0.0
penalty_friction = 0.0
normal_strength = 'normal_strength'
shear_strength = 'shear_strength'
penalty_stiffness = 1000
power_law_parameter = 2.0
GI_c = 1.3
GII_c = 1.3
viscosity = 1e-3
displacements = 'disp_x disp_y'
[]
[]
[Constraints]
[x]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[y]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[c_x]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[c_y]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[]
[Postprocessors]
[jump_n]
type = ElementAverageValue
variable = local_normal_jump
block = secondary_lower
[]
[traction_n]
type = ElementAverageValue
variable = cohesive_traction_normal
block = secondary_lower
[]
[traction_eff]
type = ElementAverageValue
variable = cohesive_traction_effective
block = secondary_lower
[]
[cohesive_damage]
type = ElementAverageValue
variable = damage
block = secondary_lower
[]
[]
[Preconditioning]
[smp]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
line_search = none
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
automatic_scaling = true
compute_scaling_once = false
off_diagonals_in_auto_scaling = true
l_max_its = 2
l_tol = 1e-14
nl_max_its = 100
nl_rel_tol = 1e-12
nl_abs_tol = 1e-11
start_time = 0.0
dt = 0.01
end_time = 1.0
dtmin = 0.01
[]
[Outputs]
exodus = false
csv = true
[]
(modules/contact/test/tests/cohesive_zone_model/traction_curve_modeIII_3d.i)
# Purpose: Verify pre-debond out-of-plane mode-III CZM outputs in a 3D single-element geometry.
# Assertion: z-shear produces local_tangential_jump_2, local_tangential_jump_effective, and cohesive_traction_tangential_2 matching the CSV gold curve while normal and first tangential traction remain negligible.
# Why this exists: Protects the second local tangential component output before full debond, where post-debond jump output is unstable.
[Mesh]
[base]
type = GeneratedMeshGenerator
dim = 3
xmax = 1.1
xmin = -0.1
ymax = 1
zmax = 1
nx = 1
ny = 1
nz = 1
[]
[rename_base]
type = RenameBoundaryGenerator
input = base
old_boundary = 'top bottom left right front back'
new_boundary = 'top_base bottom_base left_base right_base front_base back_base'
[]
[base_id]
type = SubdomainIDGenerator
input = rename_base
subdomain_id = 1
[]
[top]
type = GeneratedMeshGenerator
dim = 3
xmax = 1
ymin = 1
ymax = 2
zmax = 1
nx = 1
ny = 1
nz = 1
[]
[rename_top]
type = RenameBoundaryGenerator
input = top
old_boundary = 'top bottom left right front back'
new_boundary = '100 101 102 103 104 105'
[]
[top_id]
type = SubdomainIDGenerator
input = rename_top
subdomain_id = 2
[]
[combined]
type = MeshCollectionGenerator
inputs = 'base_id top_id'
[]
[top_node]
type = ExtraNodesetGenerator
coord = '0 2 0'
input = combined
new_boundary = top_node
[]
[bottom_node]
type = ExtraNodesetGenerator
coord = '-0.1 0 0'
input = top_node
new_boundary = bottom_node
[]
[secondary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10001
new_block_name = 'secondary_lower'
sidesets = 'top_base'
input = bottom_node
[]
[primary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10000
sidesets = '101'
new_block_name = 'primary_lower'
input = secondary
[]
allow_renumbering = false
[]
[GlobalParams]
displacements = 'disp_x disp_y disp_z'
[]
[Physics]
[SolidMechanics]
[QuasiStatic]
[all]
strain = FINITE
add_variables = true
use_automatic_differentiation = true
decomposition_method = TaylorExpansion
block = '1 2'
[]
[]
[]
[]
[AuxVariables]
[damage]
[]
[local_normal_jump]
[]
[cohesive_traction_normal]
[]
[cohesive_traction_tangential_1]
[]
[cohesive_traction_tangential_2]
[]
[cohesive_traction_effective]
[]
[local_tangential_jump_1]
[]
[local_tangential_jump_2]
[]
[local_tangential_jump_effective]
[]
[]
[AuxKernels]
[cohesive_damage]
type = CohesiveZoneMortarUserObjectAux
variable = damage
user_object = czm_uo
cohesive_zone_quantity = cohesive_damage
[]
[local_normal_jump]
type = CohesiveZoneMortarUserObjectAux
variable = local_normal_jump
user_object = czm_uo
cohesive_zone_quantity = local_normal_jump
[]
[cohesive_traction_normal]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_normal
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_normal
[]
[cohesive_traction_tangential_1]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_tangential_1
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_tangential_1
[]
[cohesive_traction_tangential_2]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_tangential_2
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_tangential_2
[]
[cohesive_traction_effective]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_effective
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_effective
[]
[local_tangential_jump_1]
type = CohesiveZoneMortarUserObjectAux
variable = local_tangential_jump_1
user_object = czm_uo
cohesive_zone_quantity = local_tangential_jump_1
[]
[local_tangential_jump_2]
type = CohesiveZoneMortarUserObjectAux
variable = local_tangential_jump_2
user_object = czm_uo
cohesive_zone_quantity = local_tangential_jump_2
[]
[local_tangential_jump_effective]
type = CohesiveZoneMortarUserObjectAux
variable = local_tangential_jump_effective
user_object = czm_uo
cohesive_zone_quantity = local_tangential_jump_effective
[]
[]
[BCs]
[anchor_bottom_x]
type = DirichletBC
preset = true
value = 0.0
boundary = bottom_node
variable = disp_x
[]
[roller_bottom_y]
type = DirichletBC
boundary = bottom_base
variable = disp_y
value = 0
preset = true
[]
[fix_bottom_z]
type = DirichletBC
boundary = bottom_base
variable = disp_z
value = 0
preset = true
[]
[anchor_top_x]
type = DirichletBC
preset = true
boundary = top_node
variable = disp_x
value = 0
[]
[roller_top_y]
type = DirichletBC
preset = true
boundary = 100
variable = disp_y
value = 0
[]
[top_z]
type = FunctionDirichletBC
boundary = 100
variable = disp_z
function = '0.3*t'
preset = true
[]
[]
[Materials]
[normal_strength]
type = GenericConstantMaterial
prop_names = 'normal_strength'
prop_values = '50'
[]
[shear_strength]
type = GenericConstantMaterial
prop_names = 'shear_strength'
prop_values = '50'
[]
[stress]
type = ADComputeFiniteStrainElasticStress
block = '1 2'
[]
[elasticity_tensor]
type = ADComputeElasticityTensor
fill_method = symmetric_isotropic_E_nu
C_ijkl = '1e8 0.3'
block = '1 2'
[]
[]
[UserObjects]
[czm_uo]
type = BilinearMixedModeCohesiveZoneModel
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
disp_x = disp_x
disp_y = disp_y
disp_z = disp_z
secondary_variable = disp_x
use_physical_gap = true
correct_edge_dropping = true
set_compressive_traction_to_zero = true
friction_coefficient = 0.0
penalty = 0.0
penalty_friction = 0.0
normal_strength = 'normal_strength'
shear_strength = 'shear_strength'
penalty_stiffness = 1000
power_law_parameter = 2.0
GI_c = 5
GII_c = 5
displacements = 'disp_x disp_y disp_z'
[]
[]
[Constraints]
[x]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[y]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[z]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_z
component = z
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[c_x]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[c_y]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[c_z]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_z
component = z
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[]
[Postprocessors]
[jump_n]
type = ElementAverageValue
variable = local_normal_jump
block = secondary_lower
[]
[traction_n]
type = ElementAverageValue
variable = cohesive_traction_normal
block = secondary_lower
[]
[traction_t1]
type = ElementAverageValue
variable = cohesive_traction_tangential_1
block = secondary_lower
[]
[traction_t2]
type = ElementAverageValue
variable = cohesive_traction_tangential_2
block = secondary_lower
[]
[traction_eff]
type = ElementAverageValue
variable = cohesive_traction_effective
block = secondary_lower
[]
[cohesive_damage]
type = ElementAverageValue
variable = damage
block = secondary_lower
[]
[jump_t]
type = ElementAverageValue
variable = local_tangential_jump_2
block = secondary_lower
[]
[jump_t_eff]
type = ElementAverageValue
variable = local_tangential_jump_effective
block = secondary_lower
[]
[]
[Preconditioning]
[smp]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
line_search = none
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
automatic_scaling = true
compute_scaling_once = false
off_diagonals_in_auto_scaling = true
l_max_its = 2
l_tol = 1e-14
nl_max_its = 100
nl_rel_tol = 1e-12
nl_abs_tol = 1e-11
start_time = 0.0
dt = 0.01
# End just before complete debond (damage = 1 at t = 0.67): post-failure the block
# slides freely and the tangential jump output is no longer meaningful.
end_time = 0.66
dtmin = 0.01
[]
[Outputs]
exodus = false
csv = true
[]
(modules/contact/test/tests/cohesive_zone_model/mortar_czm_analysis.i)
[Mesh]
[msh]
type = GeneratedMeshGenerator
dim = 2
xmax = 1
ymax = 1
nx = 5
ny = 5
boundary_name_prefix = bottom
[]
[msh_id]
type = SubdomainIDGenerator
input = msh
subdomain_id = 1
[]
[msh_two]
type = GeneratedMeshGenerator
dim = 2
xmax = 1
ymin = 1
ymax = 2
nx = 5
ny = 5
boundary_name_prefix = top
boundary_id_offset = 10
[]
[msh_two_id]
type = SubdomainIDGenerator
input = msh_two
subdomain_id = 2
[]
[combined]
type = MeshCollectionGenerator
inputs = 'msh_id msh_two_id'
[]
[top_node]
type = ExtraNodesetGenerator
coord = '0 2 0'
input = combined
new_boundary = top_node
[]
[bottom_node]
type = ExtraNodesetGenerator
coord = '0 0 0'
input = top_node
new_boundary = bottom_node
[]
# Build subdomains
[secondary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10001
new_block_name = 'secondary_lower'
sidesets = 'bottom_top'
input = bottom_node
[]
[primary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10000
sidesets = 'top_bottom'
new_block_name = 'primary_lower'
input = secondary
[]
allow_renumbering = false
[]
[GlobalParams]
displacements = 'disp_x disp_y'
[]
[Physics]
[SolidMechanics]
[QuasiStatic]
generate_output = 'stress_yy'
[all]
strain = FINITE
add_variables = true
use_automatic_differentiation = true
decomposition_method = TaylorExpansion
block = '1 2'
[]
[]
[]
[]
[BCs]
[fix_x]
type = DirichletBC
preset = true
value = 0.0
boundary = bottom_node
variable = disp_x
[]
[lateral_top]
type = FunctionDirichletBC
boundary = top_top
variable = disp_x
function = 'if(t<=0.3,t,if(t<=0.6,0.3-(t-0.3),0.6-t))'
preset = true
[]
[top]
type = FunctionDirichletBC
boundary = top_top
variable = disp_y
function = 'if(t<=0.3,t,if(t<=0.6,0.3-(t-0.3),0.6-t))'
preset = true
[]
[bottom]
type = DirichletBC
boundary = bottom_bottom
variable = disp_y
value = 0
preset = true
[]
[]
[AuxVariables]
[mode_mixity_ratio]
[]
[damage]
[]
[local_normal_jump]
[]
[local_tangential_jump]
[]
[]
[AuxKernels]
[mode_mixity_ratio]
type = CohesiveZoneMortarUserObjectAux
variable = mode_mixity_ratio
user_object = czm_uo
cohesive_zone_quantity = mode_mixity_ratio
boundary = 'bottom_top'
[]
[cohesive_damage]
type = CohesiveZoneMortarUserObjectAux
variable = damage
user_object = czm_uo
cohesive_zone_quantity = cohesive_damage
boundary = 'bottom_top'
[]
[local_normal_jump]
type = CohesiveZoneMortarUserObjectAux
variable = local_normal_jump
user_object = czm_uo
cohesive_zone_quantity = local_normal_jump
boundary = 'bottom_top'
[]
[local_tangential_jump]
type = CohesiveZoneMortarUserObjectAux
variable = local_tangential_jump
user_object = czm_uo
cohesive_zone_quantity = local_tangential_jump
boundary = 'bottom_top'
[]
[]
[Materials]
[stress]
type = ADComputeFiniteStrainElasticStress
block = '1 2'
[]
[elasticity_tensor]
type = ADComputeElasticityTensor
fill_method = symmetric9
C_ijkl = '1.684e5 0.176e5 0.176e5 1.684e5 0.176e5 1.684e5 0.754e5 0.754e5 0.754e5'
block = '1 2'
[]
[normal_strength]
type = GenericFunctionMaterial
prop_names = 'N'
prop_values = 'if(x<0.5,1,100)*1e4'
[]
[]
[Preconditioning]
[smp]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = 'NEWTON'
line_search = none
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
automatic_scaling = true
l_max_its = 2
l_tol = 1e-14
nl_max_its = 30
nl_rel_tol = 1e-10
nl_abs_tol = 1e-10
start_time = 0.0
dt = 0.0005
end_time = 0.01
dtmin = 0.0001
[]
[Outputs]
exodus = true
[]
[UserObjects]
[czm_uo]
type = BilinearMixedModeCohesiveZoneModel
primary_boundary = 'top_bottom'
secondary_boundary = 'bottom_top'
primary_subdomain = 10000
secondary_subdomain = 10001
disp_x = disp_x
disp_y = disp_y
friction_coefficient = 0.1 # with 2.0 works
secondary_variable = disp_x
penalty = 0e6
penalty_friction = 1e4
use_physical_gap = true
correct_edge_dropping = true
normal_strength = N
shear_strength = 1e3
viscosity = 1e-3
penalty_stiffness = 1e6
mixed_mode_criterion = POWER_LAW
power_law_parameter = 2.2
GI_c = 1e3
GII_c = 1e2
displacements = 'disp_x disp_y'
[]
[]
[Constraints]
[x]
type = NormalMortarMechanicalContact
primary_boundary = 'top_bottom'
secondary_boundary = 'bottom_top'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
correct_edge_dropping = true
[]
[y]
type = NormalMortarMechanicalContact
primary_boundary = 'top_bottom'
secondary_boundary = 'bottom_top'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
correct_edge_dropping = true
[]
[c_x]
type = MortarGenericTraction
primary_boundary = 'top_bottom'
secondary_boundary = 'bottom_top'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
correct_edge_dropping = true
[]
[c_y]
type = MortarGenericTraction
primary_boundary = 'top_bottom'
secondary_boundary = 'bottom_top'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
correct_edge_dropping = true
[]
[]
(modules/contact/test/tests/cohesive_zone_model/traction_curve_modeI_3d.i)
# Purpose: Verify mode-I traction-separation behavior in a 3D single-element geometry.
# Assertion: Normal traction follows the CSV gold curve while both tangential traction components remain negligible.
# Why this exists: Protects the 3D local-frame split of normal versus tangential traction components.
[Mesh]
[base]
type = GeneratedMeshGenerator
dim = 3
xmax = 1.1
xmin = -0.1
ymax = 1
zmax = 1
nx = 1
ny = 1
nz = 1
[]
[rename_base]
type = RenameBoundaryGenerator
input = base
old_boundary = 'top bottom left right front back'
new_boundary = 'top_base bottom_base left_base right_base front_base back_base'
[]
[base_id]
type = SubdomainIDGenerator
input = rename_base
subdomain_id = 1
[]
[top]
type = GeneratedMeshGenerator
dim = 3
xmax = 1
ymin = 1
ymax = 2
zmax = 1
nx = 1
ny = 1
nz = 1
[]
[rename_top]
type = RenameBoundaryGenerator
input = top
old_boundary = 'top bottom left right front back'
new_boundary = '100 101 102 103 104 105'
[]
[top_id]
type = SubdomainIDGenerator
input = rename_top
subdomain_id = 2
[]
[combined]
type = MeshCollectionGenerator
inputs = 'base_id top_id'
[]
[top_node]
type = ExtraNodesetGenerator
coord = '0 2 0'
input = combined
new_boundary = top_node
[]
[top_roller_node]
type = ExtraNodesetGenerator
coord = '1 2 0'
input = top_node
new_boundary = top_roller_node
[]
[bottom_node]
type = ExtraNodesetGenerator
coord = '-0.1 0 0'
input = top_roller_node
new_boundary = bottom_node
[]
[bottom_roller_node]
type = ExtraNodesetGenerator
coord = '1.1 0 0'
input = bottom_node
new_boundary = bottom_roller_node
[]
[secondary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10001
new_block_name = 'secondary_lower'
sidesets = 'top_base'
input = bottom_roller_node
[]
[primary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10000
sidesets = '101'
new_block_name = 'primary_lower'
input = secondary
[]
allow_renumbering = false
[]
[GlobalParams]
displacements = 'disp_x disp_y disp_z'
[]
[Physics]
[SolidMechanics]
[QuasiStatic]
[all]
strain = FINITE
add_variables = true
use_automatic_differentiation = true
decomposition_method = TaylorExpansion
block = '1 2'
[]
[]
[]
[]
[AuxVariables]
[damage]
[]
[local_normal_jump]
[]
[cohesive_traction_normal]
[]
[cohesive_traction_tangential_1]
[]
[cohesive_traction_tangential_2]
[]
[cohesive_traction_effective]
[]
[]
[AuxKernels]
[cohesive_damage]
type = CohesiveZoneMortarUserObjectAux
variable = damage
user_object = czm_uo
cohesive_zone_quantity = cohesive_damage
[]
[local_normal_jump]
type = CohesiveZoneMortarUserObjectAux
variable = local_normal_jump
user_object = czm_uo
cohesive_zone_quantity = local_normal_jump
[]
[cohesive_traction_normal]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_normal
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_normal
[]
[cohesive_traction_tangential_1]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_tangential_1
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_tangential_1
[]
[cohesive_traction_tangential_2]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_tangential_2
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_tangential_2
[]
[cohesive_traction_effective]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_effective
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_effective
[]
[]
[BCs]
[anchor_bottom_x]
type = DirichletBC
preset = true
value = 0.0
boundary = bottom_node
variable = disp_x
[]
[anchor_bottom_z]
type = DirichletBC
preset = true
value = 0.0
boundary = bottom_node
variable = disp_z
[]
[roller_bottom_z]
type = DirichletBC
preset = true
value = 0.0
boundary = bottom_roller_node
variable = disp_z
[]
[roller_bottom_y]
type = DirichletBC
boundary = bottom_base
variable = disp_y
value = 0
preset = true
[]
[anchor_top_x]
type = DirichletBC
preset = true
boundary = top_node
variable = disp_x
value = 0
[]
[anchor_top_z]
type = DirichletBC
preset = true
boundary = top_node
variable = disp_z
value = 0
[]
[roller_top_z]
type = DirichletBC
preset = true
boundary = top_roller_node
variable = disp_z
value = 0
[]
[top]
type = FunctionDirichletBC
boundary = 100
variable = disp_y
function = '0.3*t'
preset = true
[]
[]
[Materials]
[normal_strength]
type = GenericConstantMaterial
prop_names = 'normal_strength'
prop_values = '50'
[]
[shear_strength]
type = GenericConstantMaterial
prop_names = 'shear_strength'
prop_values = '50'
[]
[stress]
type = ADComputeFiniteStrainElasticStress
block = '1 2'
[]
[elasticity_tensor]
type = ADComputeElasticityTensor
fill_method = symmetric_isotropic_E_nu
C_ijkl = '1e8 0.3'
block = '1 2'
[]
[]
[UserObjects]
[czm_uo]
type = BilinearMixedModeCohesiveZoneModel
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
disp_x = disp_x
disp_y = disp_y
disp_z = disp_z
secondary_variable = disp_x
use_physical_gap = true
correct_edge_dropping = true
set_compressive_traction_to_zero = true
friction_coefficient = 0.0
penalty = 0.0
penalty_friction = 0.0
normal_strength = 'normal_strength'
shear_strength = 'shear_strength'
penalty_stiffness = 1000
power_law_parameter = 2.0
GI_c = 5
GII_c = 5
displacements = 'disp_x disp_y disp_z'
[]
[]
[Constraints]
[x]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[y]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[z]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_z
component = z
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[c_x]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[c_y]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[c_z]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_z
component = z
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[]
[Postprocessors]
[jump_n]
type = ElementAverageValue
variable = local_normal_jump
block = secondary_lower
[]
[traction_n]
type = ElementAverageValue
variable = cohesive_traction_normal
block = secondary_lower
[]
[traction_t1]
type = ElementAverageValue
variable = cohesive_traction_tangential_1
block = secondary_lower
[]
[traction_t2]
type = ElementAverageValue
variable = cohesive_traction_tangential_2
block = secondary_lower
[]
[traction_eff]
type = ElementAverageValue
variable = cohesive_traction_effective
block = secondary_lower
[]
[cohesive_damage]
type = ElementAverageValue
variable = damage
block = secondary_lower
[]
[]
[Preconditioning]
[smp]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
line_search = none
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
automatic_scaling = true
compute_scaling_once = false
off_diagonals_in_auto_scaling = true
l_max_its = 2
l_tol = 1e-14
nl_max_its = 100
nl_rel_tol = 1e-12
nl_abs_tol = 1e-11
start_time = 0.0
dt = 0.01
end_time = 1.0
dtmin = 0.01
[]
[Outputs]
exodus = false
csv = true
[]
(modules/contact/examples/mortar_czm/progressive_debonding.i)
# Purpose: Verify heterogeneous interface debonding with spatially varying normal strength.
# Setup: Two 5x5 blocks, mode-I pull to t=0.3. Left half (x<0.5) has N=1e4 (weak),
# right half (x>=0.5) has N=1e6 (strong). K=1e6, GI_c=1e3, GII_c=1e2, viscosity=1e-3.
# Exercises: Asymmetric damage initiation, load redistribution (weak->strong), near-brittle
# snap-through with viscous regularization, and full debonding of both sides.
# Outputs: Exodus with interface fields on secondary_lower, CSV with PointValue at x=0.25/0.75.
[Mesh]
[msh]
type = GeneratedMeshGenerator
dim = 2
xmax = 1
ymax = 1
nx = 5
ny = 5
boundary_name_prefix = bottom
[]
[msh_id]
type = SubdomainIDGenerator
input = msh
subdomain_id = 1
[]
[msh_two]
type = GeneratedMeshGenerator
dim = 2
xmax = 1
ymin = 1
ymax = 2
nx = 5
ny = 5
boundary_name_prefix = top
boundary_id_offset = 10
[]
[msh_two_id]
type = SubdomainIDGenerator
input = msh_two
subdomain_id = 2
[]
[combined]
type = MeshCollectionGenerator
inputs = 'msh_id msh_two_id'
[]
[top_node]
type = ExtraNodesetGenerator
coord = '0 2 0'
input = combined
new_boundary = top_node
[]
[bottom_node]
type = ExtraNodesetGenerator
coord = '0 0 0'
input = top_node
new_boundary = bottom_node
[]
# Build subdomains
[secondary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10001
new_block_name = 'secondary_lower'
sidesets = 'bottom_top'
input = bottom_node
[]
[primary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10000
sidesets = 'top_bottom'
new_block_name = 'primary_lower'
input = secondary
[]
allow_renumbering = false
[]
[GlobalParams]
displacements = 'disp_x disp_y'
[]
[Physics]
[SolidMechanics]
[QuasiStatic]
generate_output = 'stress_yy'
[all]
strain = FINITE
add_variables = true
use_automatic_differentiation = true
decomposition_method = TaylorExpansion
block = '1 2'
[]
[]
[]
[]
[BCs]
[anchor_bottom_x]
type = DirichletBC
preset = true
value = 0.0
boundary = bottom_node
variable = disp_x
[]
[anchor_top_x]
type = DirichletBC
preset = true
boundary = top_node
variable = disp_x
value = 0
[]
[top]
type = FunctionDirichletBC
boundary = top_top
variable = disp_y
function = 'if(t<=0.3,t,if(t<=0.6,0.3-(t-0.3),0.6-t))'
preset = true
[]
[roller_bottom_y]
type = DirichletBC
boundary = bottom_bottom
variable = disp_y
value = 0
preset = true
[]
[]
[AuxVariables]
[damage]
block = secondary_lower
[]
[local_normal_jump]
block = secondary_lower
[]
[cohesive_traction_normal]
block = secondary_lower
[]
[cohesive_traction_tangential_magnitude]
block = secondary_lower
[]
[mode_mixity_ratio]
block = secondary_lower
[]
[]
[AuxKernels]
[cohesive_damage]
type = CohesiveZoneMortarUserObjectAux
variable = damage
user_object = czm_uo
cohesive_zone_quantity = cohesive_damage
[]
[local_normal_jump]
type = CohesiveZoneMortarUserObjectAux
variable = local_normal_jump
user_object = czm_uo
cohesive_zone_quantity = local_normal_jump
[]
[cohesive_traction_normal]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_normal
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_normal
[]
[cohesive_traction_tangential_magnitude]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_tangential_magnitude
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_tangential_magnitude
[]
[mode_mixity_ratio]
type = CohesiveZoneMortarUserObjectAux
variable = mode_mixity_ratio
user_object = czm_uo
cohesive_zone_quantity = mode_mixity_ratio
[]
[]
[Materials]
[stress]
type = ADComputeFiniteStrainElasticStress
block = '1 2'
[]
[elasticity_tensor]
type = ADComputeElasticityTensor
fill_method = symmetric9
C_ijkl = '1.684e5 0.176e5 0.176e5 1.684e5 0.176e5 1.684e5 0.754e5 0.754e5 0.754e5'
block = '1 2'
[]
[normal_strength]
type = GenericFunctionMaterial
prop_names = 'N'
prop_values = 'if(x<0.5,1,100)*1e4'
[]
[]
[Preconditioning]
[smp]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = 'NEWTON'
line_search = none
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
automatic_scaling = true
l_max_its = 2
l_tol = 1e-14
nl_max_its = 30
nl_rel_tol = 1e-11
nl_abs_tol = 1e-11
start_time = 0.0
dt = 0.01
end_time = 0.3
dtmin = 1e-4
[]
[Postprocessors]
# Left side (weak: N = 1e4) - sample at x=0.25 on interface
[damage_left]
type = PointValue
variable = damage
point = '0.25 1.0 0'
[]
[jump_n_left]
type = PointValue
variable = local_normal_jump
point = '0.25 1.0 0'
[]
[traction_n_left]
type = PointValue
variable = cohesive_traction_normal
point = '0.25 1.0 0'
[]
# Right side (strong: N = 1e6) - sample at x=0.75 on interface
[damage_right]
type = PointValue
variable = damage
point = '0.75 1.0 0'
[]
[jump_n_right]
type = PointValue
variable = local_normal_jump
point = '0.75 1.0 0'
[]
[traction_n_right]
type = PointValue
variable = cohesive_traction_normal
point = '0.75 1.0 0'
[]
[]
[Outputs]
exodus = true
csv = true
[]
[UserObjects]
[czm_uo]
type = BilinearMixedModeCohesiveZoneModel
primary_boundary = 'top_bottom'
secondary_boundary = 'bottom_top'
primary_subdomain = 10000
secondary_subdomain = 10001
disp_x = disp_x
disp_y = disp_y
friction_coefficient = 0.1 # with 2.0 works
secondary_variable = disp_x
penalty = 0e6
penalty_friction = 1e4
use_physical_gap = true
correct_edge_dropping = true
normal_strength = N
shear_strength = 1e3
viscosity = 1e-3
penalty_stiffness = 1e6
power_law_parameter = 2.2
GI_c = 1e3
GII_c = 1e2
displacements = 'disp_x disp_y'
[]
[]
[Constraints]
[x]
type = NormalMortarMechanicalContact
primary_boundary = 'top_bottom'
secondary_boundary = 'bottom_top'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
correct_edge_dropping = true
[]
[y]
type = NormalMortarMechanicalContact
primary_boundary = 'top_bottom'
secondary_boundary = 'bottom_top'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
correct_edge_dropping = true
[]
[c_x]
type = MortarGenericTraction
primary_boundary = 'top_bottom'
secondary_boundary = 'bottom_top'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
correct_edge_dropping = true
[]
[c_y]
type = MortarGenericTraction
primary_boundary = 'top_bottom'
secondary_boundary = 'bottom_top'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
correct_edge_dropping = true
[]
[]
(modules/contact/test/tests/cohesive_zone_model/traction_curve_modeI.i)
# Purpose: Verify monotonic mode-I traction-separation behavior and exposed normal jump/traction outputs.
# Assertion: Mode-I cohesive traction and jump response match CSV gold curves across default and CLI-varied timestep, mesh, mismatch, and parallel runs.
# Why this exists: Protects the bilinear normal traction law output under temporal and spatial changes.
[Mesh]
[base]
type = GeneratedMeshGenerator
dim = 2
xmax = 1.1
ymax = 1
xmin = -0.1
nx = 1
ny = 1
[]
[rename_base]
type = RenameBoundaryGenerator
input = base
old_boundary = 'top bottom left right'
new_boundary = 'top_base bottom_base left_base right_base'
[]
[base_id]
type = SubdomainIDGenerator
input = rename_base
subdomain_id = 1
[]
[top]
type = GeneratedMeshGenerator
dim = 2
xmax = 1
ymin = 1
ymax = 2
nx = 1
ny = 1
[]
[rename_top]
type = RenameBoundaryGenerator
input = top
old_boundary = 'top bottom left right'
new_boundary = '100 101 102 103'
[]
[top_id]
type = SubdomainIDGenerator
input = rename_top
subdomain_id = 2
[]
[combined]
type = MeshCollectionGenerator
inputs = 'base_id top_id'
[]
[top_node]
type = ExtraNodesetGenerator
coord = '0 2 0'
input = combined
new_boundary = top_node
[]
[bottom_node]
type = ExtraNodesetGenerator
coord = '-0.1 0 0'
input = top_node
new_boundary = bottom_node
[]
[secondary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10001
new_block_name = 'secondary_lower'
sidesets = 'top_base'
input = bottom_node
[]
[primary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10000
sidesets = '101'
new_block_name = 'primary_lower'
input = secondary
[]
allow_renumbering = false
[]
[GlobalParams]
displacements = 'disp_x disp_y'
[]
[Physics]
[SolidMechanics]
[QuasiStatic]
[all]
strain = FINITE
add_variables = true
use_automatic_differentiation = true
decomposition_method = TaylorExpansion
block = '1 2'
[]
[]
[]
[]
[AuxVariables]
[mode_mixity_ratio]
[]
[damage]
[]
[local_normal_jump]
[]
[local_tangential_jump_1]
[]
[cohesive_traction_normal]
[]
[cohesive_traction_tangential_magnitude]
[]
[cohesive_traction_effective]
[]
[]
[AuxKernels]
[mode_mixity_ratio]
type = CohesiveZoneMortarUserObjectAux
variable = mode_mixity_ratio
user_object = czm_uo
cohesive_zone_quantity = mode_mixity_ratio
[]
[cohesive_damage]
type = CohesiveZoneMortarUserObjectAux
variable = damage
user_object = czm_uo
cohesive_zone_quantity = cohesive_damage
[]
[local_normal_jump]
type = CohesiveZoneMortarUserObjectAux
variable = local_normal_jump
user_object = czm_uo
cohesive_zone_quantity = local_normal_jump
[]
[local_tangential_jump_1]
type = CohesiveZoneMortarUserObjectAux
variable = local_tangential_jump_1
user_object = czm_uo
cohesive_zone_quantity = local_tangential_jump_1
[]
[cohesive_traction_normal]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_normal
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_normal
[]
[cohesive_traction_tangential_magnitude]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_tangential_magnitude
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_tangential_magnitude
[]
[cohesive_traction_effective]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_effective
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_effective
[]
[]
[BCs]
[anchor_bottom_x]
type = DirichletBC
preset = true
value = 0.0
boundary = bottom_node
variable = disp_x
[]
[anchor_top_x]
type = DirichletBC
preset = true
boundary = top_node
variable = disp_x
value = 0
[]
[top]
type = FunctionDirichletBC
boundary = 100
variable = disp_y
function = '0.3*t'
preset = true
[]
[roller_bottom_y]
type = DirichletBC
boundary = bottom_base
variable = disp_y
value = 0
preset = true
[]
[]
[Materials]
[normal_strength]
type = GenericConstantMaterial
prop_names = 'normal_strength'
prop_values = '50'
[]
[shear_strength]
type = GenericConstantMaterial
prop_names = 'shear_strength'
prop_values = '50'
[]
[stress]
type = ADComputeFiniteStrainElasticStress
block = '1 2'
[]
[elasticity_tensor]
type = ADComputeElasticityTensor
fill_method = symmetric_isotropic_E_nu
C_ijkl = '1e8 0.3'
block = '1 2'
[]
[]
[UserObjects]
[czm_uo]
type = BilinearMixedModeCohesiveZoneModel
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
disp_x = disp_x
disp_y = disp_y
secondary_variable = disp_x
use_physical_gap = true
correct_edge_dropping = true
set_compressive_traction_to_zero = true
friction_coefficient = 0.0
penalty = 0.0
penalty_friction = 0.0
normal_strength = 'normal_strength'
shear_strength = 'shear_strength'
penalty_stiffness = 1000
power_law_parameter = 2.0
GI_c = 5
GII_c = 5
displacements = 'disp_x disp_y'
[]
[]
[Constraints]
[x]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[y]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[c_x]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[c_y]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[]
[Postprocessors]
[jump_n]
type = ElementAverageValue
variable = local_normal_jump
block = secondary_lower
[]
[jump_t]
type = ElementAverageValue
variable = local_tangential_jump_1
block = secondary_lower
[]
[traction_n]
type = ElementAverageValue
variable = cohesive_traction_normal
block = secondary_lower
[]
[traction_t]
type = ElementAverageValue
variable = cohesive_traction_tangential_magnitude
block = secondary_lower
[]
[traction_eff]
type = ElementAverageValue
variable = cohesive_traction_effective
block = secondary_lower
[]
[cohesive_damage]
type = ElementAverageValue
variable = damage
block = secondary_lower
[]
[energy_rate]
type = ParsedPostprocessor
expression = 'abs(traction_n) * 0.3'
pp_names = 'traction_n'
[]
[energy_dissipated]
type = TimeIntegratedPostprocessor
value = energy_rate
[]
[]
[Preconditioning]
[smp]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
line_search = none
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
automatic_scaling = true
compute_scaling_once = false
off_diagonals_in_auto_scaling = true
l_max_its = 2
l_tol = 1e-14
nl_max_its = 100
nl_rel_tol = 1e-12
nl_abs_tol = 1e-11
start_time = 0.0
dt = 0.01
end_time = 1.0
dtmin = 0.01
[]
[Outputs]
exodus = false
csv = true
[]
(modules/contact/test/tests/cohesive_zone_model/traction_curve_modeII.i)
# Purpose: Verify mode-II dominant traction-separation behavior with tangential jump and shear traction outputs.
# Assertion: Tangential jump-traction response matches the CSV gold reference within tight tolerance.
# Why this exists: Protects shear-dominant cohesive constitutive behavior against regressions.
[Mesh]
[base]
type = GeneratedMeshGenerator
dim = 2
xmax = 1.1
ymax = 1
xmin = -0.1
nx = 1
ny = 1
[]
[rename_base]
type = RenameBoundaryGenerator
input = base
old_boundary = 'top bottom left right'
new_boundary = 'top_base bottom_base left_base right_base'
[]
[base_id]
type = SubdomainIDGenerator
input = rename_base
subdomain_id = 1
[]
[top]
type = GeneratedMeshGenerator
dim = 2
xmax = 1
ymin = 1
ymax = 2
nx = 1
ny = 1
[]
[rename_top]
type = RenameBoundaryGenerator
input = top
old_boundary = 'top bottom left right'
new_boundary = '100 101 102 103'
[]
[top_id]
type = SubdomainIDGenerator
input = rename_top
subdomain_id = 2
[]
[combined]
type = MeshCollectionGenerator
inputs = 'base_id top_id'
[]
[top_left_node]
type = ExtraNodesetGenerator
coord = '0 2 0'
input = combined
new_boundary = top_left_node
[]
[top_right_node]
type = ExtraNodesetGenerator
coord = '1 2 0'
input = top_left_node
new_boundary = top_right_node
[]
[bottom_node]
type = ExtraNodesetGenerator
coord = '-0.1 0 0'
input = top_right_node
new_boundary = bottom_node
[]
[secondary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10001
new_block_name = 'secondary_lower'
sidesets = 'top_base'
input = bottom_node
[]
[primary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10000
sidesets = '101'
new_block_name = 'primary_lower'
input = secondary
[]
allow_renumbering = false
[]
[GlobalParams]
displacements = 'disp_x disp_y'
[]
[Physics]
[SolidMechanics]
[QuasiStatic]
[all]
strain = FINITE
add_variables = true
use_automatic_differentiation = true
decomposition_method = TaylorExpansion
block = '1 2'
[]
[]
[]
[]
[AuxVariables]
[mode_mixity_ratio]
[]
[damage]
[]
[local_normal_jump]
[]
[local_tangential_jump_1]
[]
[cohesive_traction_normal]
[]
[cohesive_traction_tangential_magnitude]
[]
[cohesive_traction_effective]
[]
[]
[AuxKernels]
[mode_mixity_ratio]
type = CohesiveZoneMortarUserObjectAux
variable = mode_mixity_ratio
user_object = czm_uo
cohesive_zone_quantity = mode_mixity_ratio
[]
[cohesive_damage]
type = CohesiveZoneMortarUserObjectAux
variable = damage
user_object = czm_uo
cohesive_zone_quantity = cohesive_damage
[]
[local_normal_jump]
type = CohesiveZoneMortarUserObjectAux
variable = local_normal_jump
user_object = czm_uo
cohesive_zone_quantity = local_normal_jump
[]
[local_tangential_jump_1]
type = CohesiveZoneMortarUserObjectAux
variable = local_tangential_jump_1
user_object = czm_uo
cohesive_zone_quantity = local_tangential_jump_1
[]
[cohesive_traction_normal]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_normal
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_normal
[]
[cohesive_traction_tangential_magnitude]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_tangential_magnitude
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_tangential_magnitude
[]
[cohesive_traction_effective]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_effective
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_effective
[]
[]
[BCs]
[fix_bottom_x]
type = DirichletBC
preset = true
value = 0.0
boundary = bottom_base
variable = disp_x
[]
[top]
type = FunctionDirichletBC
boundary = 100
variable = disp_x
function = '0.3*t'
preset = true
[]
[top_y_rollers]
type = DirichletBC
boundary = 'top_left_node top_right_node'
variable = disp_y
value = 0
preset = true
[]
[roller_bottom_y]
type = DirichletBC
boundary = bottom_base
variable = disp_y
value = 0
preset = true
[]
[]
[Materials]
[normal_strength]
type = GenericConstantMaterial
prop_names = 'normal_strength'
prop_values = '50'
[]
[shear_strength]
type = GenericConstantMaterial
prop_names = 'shear_strength'
prop_values = '50'
[]
[stress]
type = ADComputeFiniteStrainElasticStress
block = '1 2'
[]
[elasticity_tensor]
type = ADComputeElasticityTensor
fill_method = symmetric_isotropic_E_nu
C_ijkl = '1e8 0.3'
block = '1 2'
[]
[]
[UserObjects]
[czm_uo]
type = BilinearMixedModeCohesiveZoneModel
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
disp_x = disp_x
disp_y = disp_y
secondary_variable = disp_x
use_physical_gap = true
correct_edge_dropping = true
set_compressive_traction_to_zero = true
friction_coefficient = 0.0
penalty = 0.0
penalty_friction = 0.0
normal_strength = 'normal_strength'
shear_strength = 'shear_strength'
penalty_stiffness = 1000
power_law_parameter = 2.0
GI_c = 5
GII_c = 5
displacements = 'disp_x disp_y'
[]
[]
[Constraints]
[x]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[y]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[c_x]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[c_y]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[]
[Postprocessors]
[mode_mixity]
type = ElementAverageValue
variable = mode_mixity_ratio
block = secondary_lower
[]
[jump_n]
type = ElementAverageValue
variable = local_normal_jump
block = secondary_lower
[]
[jump_t]
type = ElementAverageValue
variable = local_tangential_jump_1
block = secondary_lower
[]
[traction_n]
type = ElementAverageValue
variable = cohesive_traction_normal
block = secondary_lower
[]
[traction_t]
type = ElementAverageValue
variable = cohesive_traction_tangential_magnitude
block = secondary_lower
[]
[traction_eff]
type = ElementAverageValue
variable = cohesive_traction_effective
block = secondary_lower
[]
[cohesive_damage]
type = ElementAverageValue
variable = damage
block = secondary_lower
[]
[]
[Preconditioning]
[smp]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
line_search = none
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
automatic_scaling = true
compute_scaling_once = false
off_diagonals_in_auto_scaling = true
l_max_its = 2
l_tol = 1e-14
nl_max_its = 100
nl_rel_tol = 1e-12
nl_abs_tol = 1e-11
start_time = 0.0
dt = 0.01
end_time = 1.0
dtmin = 0.01
[]
[Outputs]
exodus = false
csv = true
[]
(modules/contact/test/tests/cohesive_zone_model/robustness_pure_shear_limit.i)
# Purpose: Verify numerical stability when normal opening is near zero under dominant shear loading.
# Assertion: Dominant-shear output stays finite when the mode-mixity ratio is large, matching the CSV gold baseline.
# Why this exists: Guards the mode-mixity computation against the near-zero normal-opening limit.
[Mesh]
[base]
type = GeneratedMeshGenerator
dim = 2
xmax = 1.1
ymax = 1
xmin = -0.1
nx = 1
ny = 1
[]
[rename_base]
type = RenameBoundaryGenerator
input = base
old_boundary = 'top bottom left right'
new_boundary = 'top_base bottom_base left_base right_base'
[]
[base_id]
type = SubdomainIDGenerator
input = rename_base
subdomain_id = 1
[]
[top]
type = GeneratedMeshGenerator
dim = 2
xmax = 1
ymin = 1
ymax = 2
nx = 1
ny = 1
[]
[rename_top]
type = RenameBoundaryGenerator
input = top
old_boundary = 'top bottom left right'
new_boundary = '100 101 102 103'
[]
[top_id]
type = SubdomainIDGenerator
input = rename_top
subdomain_id = 2
[]
[combined]
type = MeshCollectionGenerator
inputs = 'base_id top_id'
[]
[top_node]
type = ExtraNodesetGenerator
coord = '0 2 0'
input = combined
new_boundary = top_node
[]
[bottom_node]
type = ExtraNodesetGenerator
coord = '-0.1 0 0'
input = top_node
new_boundary = bottom_node
[]
[secondary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10001
new_block_name = 'secondary_lower'
sidesets = 'top_base'
input = bottom_node
[]
[primary]
type = LowerDBlockFromSidesetGenerator
new_block_id = 10000
sidesets = '101'
new_block_name = 'primary_lower'
input = secondary
[]
allow_renumbering = false
[]
[GlobalParams]
displacements = 'disp_x disp_y'
[]
[Physics]
[SolidMechanics]
[QuasiStatic]
[all]
strain = FINITE
add_variables = true
use_automatic_differentiation = true
decomposition_method = TaylorExpansion
block = '1 2'
[]
[]
[]
[]
[AuxVariables]
[damage]
[]
[local_normal_jump]
[]
[local_tangential_jump_1]
[]
[cohesive_traction_normal]
[]
[cohesive_traction_tangential_magnitude]
[]
[cohesive_traction_effective]
[]
[]
[AuxKernels]
[cohesive_damage]
type = CohesiveZoneMortarUserObjectAux
variable = damage
user_object = czm_uo
cohesive_zone_quantity = cohesive_damage
[]
[local_normal_jump]
type = CohesiveZoneMortarUserObjectAux
variable = local_normal_jump
user_object = czm_uo
cohesive_zone_quantity = local_normal_jump
[]
[local_tangential_jump_1]
type = CohesiveZoneMortarUserObjectAux
variable = local_tangential_jump_1
user_object = czm_uo
cohesive_zone_quantity = local_tangential_jump_1
[]
[cohesive_traction_normal]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_normal
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_normal
[]
[cohesive_traction_tangential_magnitude]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_tangential_magnitude
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_tangential_magnitude
[]
[cohesive_traction_effective]
type = CohesiveZoneMortarUserObjectAux
variable = cohesive_traction_effective
user_object = czm_uo
cohesive_zone_quantity = cohesive_traction_effective
[]
[]
[BCs]
[fix_bottom_x]
type = DirichletBC
preset = true
value = 0.0
boundary = bottom_base
variable = disp_x
[]
# Near-zero normal opening to exercise the epsilon_tolerance path in computeModeMixity.
[top_y]
type = FunctionDirichletBC
boundary = 100
variable = disp_y
function = '1e-6*t'
preset = true
[]
# Dominant shear loading drives damage via tangential jump.
[top_x]
type = FunctionDirichletBC
boundary = 100
variable = disp_x
function = '0.3*t'
preset = true
[]
[roller_bottom_y]
type = DirichletBC
boundary = bottom_base
variable = disp_y
value = 0
preset = true
[]
[]
[Materials]
[normal_strength]
type = GenericConstantMaterial
prop_names = 'normal_strength'
prop_values = '50'
[]
[shear_strength]
type = GenericConstantMaterial
prop_names = 'shear_strength'
prop_values = '50'
[]
[stress]
type = ADComputeFiniteStrainElasticStress
block = '1 2'
[]
[elasticity_tensor]
type = ADComputeElasticityTensor
fill_method = symmetric_isotropic_E_nu
C_ijkl = '1e8 0.3'
block = '1 2'
[]
[]
[UserObjects]
[czm_uo]
type = BilinearMixedModeCohesiveZoneModel
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
disp_x = disp_x
disp_y = disp_y
secondary_variable = disp_x
use_physical_gap = true
correct_edge_dropping = true
set_compressive_traction_to_zero = true
friction_coefficient = 0.0
penalty = 0.0
penalty_friction = 0.0
normal_strength = 'normal_strength'
shear_strength = 'shear_strength'
penalty_stiffness = 1000
power_law_parameter = 2.0
GI_c = 5
GII_c = 5
displacements = 'disp_x disp_y'
[]
[]
[Constraints]
[x]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[y]
type = NormalMortarMechanicalContact
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
weighted_gap_uo = czm_uo
[]
[c_x]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_x
component = x
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[c_y]
type = MortarGenericTraction
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
secondary_variable = disp_y
component = y
use_displaced_mesh = true
compute_lm_residuals = false
cohesive_zone_uo = czm_uo
[]
[]
[Postprocessors]
[jump_n]
type = ElementAverageValue
variable = local_normal_jump
block = secondary_lower
[]
[jump_t]
type = ElementAverageValue
variable = local_tangential_jump_1
block = secondary_lower
[]
[traction_n]
type = ElementAverageValue
variable = cohesive_traction_normal
block = secondary_lower
[]
[traction_t]
type = ElementAverageValue
variable = cohesive_traction_tangential_magnitude
block = secondary_lower
[]
[traction_eff]
type = ElementAverageValue
variable = cohesive_traction_effective
block = secondary_lower
[]
[cohesive_damage]
type = ElementAverageValue
variable = damage
block = secondary_lower
[]
[]
[Preconditioning]
[smp]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
line_search = none
petsc_options_iname = '-pc_type'
petsc_options_value = 'lu'
automatic_scaling = true
compute_scaling_once = false
off_diagonals_in_auto_scaling = true
l_max_its = 2
l_tol = 1e-14
nl_max_its = 100
nl_rel_tol = 1e-12
nl_abs_tol = 1e-11
start_time = 0.0
dt = 0.01
end_time = 1.0
dtmin = 0.01
[]
[Outputs]
exodus = false
csv = true
[]