- cohesive_zone_uoThe cohesive zone user object.
C++ Type:UserObjectName
Controllable:No
Description:The cohesive zone user object.
- componentThe force component constraint that this object is supplying
C++ Type:MooseEnum
Controllable:No
Description:The force component constraint that this object is supplying
- primary_boundaryThe name of the primary boundary sideset.
C++ Type:BoundaryName
Controllable:No
Description:The name of the primary boundary sideset.
- primary_subdomainThe name of the primary subdomain.
C++ Type:SubdomainName
Controllable:No
Description:The name of the primary subdomain.
- secondary_boundaryThe name of the secondary boundary sideset.
C++ Type:BoundaryName
Controllable:No
Description:The name of the secondary boundary sideset.
- secondary_subdomainThe name of the secondary subdomain.
C++ Type:SubdomainName
Controllable:No
Description:The name of the secondary subdomain.
MortarGenericTraction
The MortarGenericTraction class is used to apply global traction vectors on domain boundaries using a mortar formulation. This object queries an interface traction vector from a mortar user object and applies it.
Used to apply tangential stresses from frictional contact using lagrange multipliers
Input Parameters
- aux_lmAuxiliary Lagrange multiplier variable that is utilized together with the Petrov-Galerkin approach.
C++ Type:std::vector<VariableName>
Unit:(no unit assumed)
Controllable:No
Description:Auxiliary Lagrange multiplier variable that is utilized together with the Petrov-Galerkin approach.
- compute_lm_residualFalse
Default:False
C++ Type:bool
Controllable:No
- compute_lm_residualsTrueWhether to compute Lagrange Multiplier residuals
Default:True
C++ Type:bool
Controllable:No
Description:Whether to compute Lagrange Multiplier residuals
- compute_primal_residualsTrueWhether to compute residuals for the primal variable.
Default:True
C++ Type:bool
Controllable:No
Description:Whether to compute residuals for the primal variable.
- correct_edge_droppingFalseWhether to enable correct edge dropping treatment for mortar constraints. When disabled any Lagrange Multiplier degree of freedom on a secondary element without full primary contributions will be set (strongly) to 0.
Default:False
C++ Type:bool
Controllable:No
Description:Whether to enable correct edge dropping treatment for mortar constraints. When disabled any Lagrange Multiplier degree of freedom on a secondary element without full primary contributions will be set (strongly) to 0.
- debug_meshFalseWhether this constraint is going to enable mortar segment mesh debug information. An exodusfile will be generated if the user sets this flag to true
Default:False
C++ Type:bool
Controllable:No
Description:Whether this constraint is going to enable mortar segment mesh debug information. An exodusfile will be generated if the user sets this flag to true
- derivative_threshold1e-17Threshold to discard automatic differentiation derivatives. This number is chosen on the order of the machine epsilon based on current experience.
Default:1e-17
C++ Type:Real
Unit:(no unit assumed)
Controllable:No
Description:Threshold to discard automatic differentiation derivatives. This number is chosen on the order of the machine epsilon based on current experience.
- ghost_higher_d_neighborsFalseWhether we should ghost higher-dimensional neighbors. This is necessary when we are doing second order mortar with finite volume primal variables, because in order for the method to be second order we must use cell gradients, which couples in the neighbor cells.
Default:False
C++ Type:bool
Controllable:No
Description:Whether we should ghost higher-dimensional neighbors. This is necessary when we are doing second order mortar with finite volume primal variables, because in order for the method to be second order we must use cell gradients, which couples in the neighbor cells.
- ghost_point_neighborsFalseWhether we should ghost point neighbors of secondary face elements, and consequently also their mortar interface couples.
Default:False
C++ Type:bool
Controllable:No
Description:Whether we should ghost point neighbors of secondary face elements, and consequently also their mortar interface couples.
- interpolate_normalsFalseWhether to interpolate the nodal normals (e.g. classic idea of evaluating field at quadrature points). If this is set to false, then non-interpolated nodal normals will be used, and then the _normals member should be indexed with _i instead of _qp
Default:False
C++ Type:bool
Controllable:No
Description:Whether to interpolate the nodal normals (e.g. classic idea of evaluating field at quadrature points). If this is set to false, then non-interpolated nodal normals will be used, and then the _normals member should be indexed with _i instead of _qp
- minimum_projection_angle40Parameter to control which angle (in degrees) is admissible for the creation of mortar segments. If set to a value close to zero, very oblique projections are allowed, which can result in mortar segments solving physics not meaningfully, and overprojection of primary nodes onto the mortar segment mesh in extreme cases. In 3D with mortar_3d_subpatch_plane = GEOMETRIC_NORMAL, this parameter also controls which primary and secondary subpatch normal pairings are admissible before polygon clipping.
Default:40
C++ Type:Real
Unit:(no unit assumed)
Controllable:No
Description:Parameter to control which angle (in degrees) is admissible for the creation of mortar segments. If set to a value close to zero, very oblique projections are allowed, which can result in mortar segments solving physics not meaningfully, and overprojection of primary nodes onto the mortar segment mesh in extreme cases. In 3D with mortar_3d_subpatch_plane = GEOMETRIC_NORMAL, this parameter also controls which primary and secondary subpatch normal pairings are admissible before polygon clipping.
- mortar_3d_qp_mappingNORMAL_PROJECTIONMethod used to map quadrature points on 3D mortar segments to primary and secondary parent-face reference coordinates. This parameter has no effect for 2D mortar.
Default:NORMAL_PROJECTION
C++ Type:MooseEnum
Options:NORMAL_PROJECTION, REFERENCE_INTERPOLATION
Controllable:No
Description:Method used to map quadrature points on 3D mortar segments to primary and secondary parent-face reference coordinates. This parameter has no effect for 2D mortar.
- mortar_3d_subpatch_planeGEOMETRIC_NORMALMethod used to construct the local 3D mortar subpatch planes used for projection and clipping. GEOMETRIC_NORMAL uses the geometric normal of each linear or bilinear secondary subpatch. AVERAGED_NODAL_NORMAL uses the averaged nodal normal on each secondary subpatch.
Default:GEOMETRIC_NORMAL
C++ Type:MooseEnum
Options:GEOMETRIC_NORMAL, AVERAGED_NODAL_NORMAL
Controllable:No
Description:Method used to construct the local 3D mortar subpatch planes used for projection and clipping. GEOMETRIC_NORMAL uses the geometric normal of each linear or bilinear secondary subpatch. AVERAGED_NODAL_NORMAL uses the averaged nodal normal on each secondary subpatch.
- periodicFalseWhether this constraint is going to be used to enforce a periodic condition. This has the effect of changing the normals vector for projection from outward to inward facing
Default:False
C++ Type:bool
Controllable:No
Description:Whether this constraint is going to be used to enforce a periodic condition. This has the effect of changing the normals vector for projection from outward to inward facing
- primary_variablePrimal variable on primary surface. If this parameter is not provided then the primary variable will be initialized to the secondary variable
C++ Type:VariableName
Unit:(no unit assumed)
Controllable:No
Description:Primal variable on primary surface. If this parameter is not provided then the primary variable will be initialized to the secondary variable
- secondary_variablePrimal variable on secondary surface.
C++ Type:VariableName
Unit:(no unit assumed)
Controllable:No
Description:Primal variable on secondary surface.
- segment_quadratureDEFAULTMortar segment quadrature order. For 2D mortar DEFAULT is recommended. For 3D mortar, quad faces are integrated using triangular mortar segments. A finite element family of order p based on a quadrilateral element actually has polynomial order of 2*p because of the tensor-product nature of the element. Consequently, for exact integraton of something like a mass matrix term, if one is using a first order Lagrange variable (as an example), the 'segment_quadrature' should be set to 'fourth' because we double the polynomial order on the triangle to match the tensor product order on the quad, and then double again since we are multiplying the test and trial (shape) function polynomials for the mass matrix term.
Default:DEFAULT
C++ Type:MooseEnum
Options:DEFAULT, FIRST, SECOND, THIRD, FOURTH, FIFTH, SIXTH, SEVENTH, EIGHTH, NINTH
Controllable:No
Description:Mortar segment quadrature order. For 2D mortar DEFAULT is recommended. For 3D mortar, quad faces are integrated using triangular mortar segments. A finite element family of order p based on a quadrilateral element actually has polynomial order of 2*p because of the tensor-product nature of the element. Consequently, for exact integraton of something like a mass matrix term, if one is using a first order Lagrange variable (as an example), the 'segment_quadrature' should be set to 'fourth' because we double the polynomial order on the triangle to match the tensor product order on the quad, and then double again since we are multiplying the test and trial (shape) function polynomials for the mass matrix term.
- triangulate_trianglesFalseWhether a clipped 3D mortar polygon that is already a triangle should still be subdivided during triangulation. When enabled, already-triangular polygons are subdivided with the centroid-based path because the vertex-fan, ear-clipping, and Delaunay backends cannot refine a triangle any further on their own.
Default:False
C++ Type:bool
Controllable:No
Description:Whether a clipped 3D mortar polygon that is already a triangle should still be subdivided during triangulation. When enabled, already-triangular polygons are subdivided with the centroid-based path because the vertex-fan, ear-clipping, and Delaunay backends cannot refine a triangle any further on their own.
- triangulationcentroidStrategy used to triangulate clipped 3D mortar polygons into mortar segments. The default is 'centroid' to preserve the legacy 3D mortar segmentation behavior.
Default:centroid
C++ Type:MooseEnum
Options:vertex, centroid, ear_clipping, delaunay
Controllable:No
Description:Strategy used to triangulate clipped 3D mortar polygons into mortar segments. The default is 'centroid' to preserve the legacy 3D mortar segmentation behavior.
- use_petrov_galerkinFalseWhether to use the Petrov-Galerkin approach for the mortar-based constraints. If set to true, we use the standard basis as the test function and dual basis as the shape function for the interpolation of the Lagrange multiplier variable.
Default:False
C++ Type:bool
Controllable:No
Description:Whether to use the Petrov-Galerkin approach for the mortar-based constraints. If set to true, we use the standard basis as the test function and dual basis as the shape function for the interpolation of the Lagrange multiplier variable.
- variableThe name of the lagrange multiplier variable that this constraint is applied to. This parameter may not be supplied in the case of using penalty methods for example
C++ Type:NonlinearVariableName
Unit:(no unit assumed)
Controllable:No
Description:The name of the lagrange multiplier variable that this constraint is applied to. This parameter may not be supplied in the case of using penalty methods for example
Optional Parameters
- absolute_value_vector_tagsThe tags for the vectors this residual object should fill with the absolute value of the residual contribution
C++ Type:std::vector<TagName>
Controllable:No
Description:The tags for the vectors this residual object should fill with the absolute value of the residual contribution
- extra_matrix_tagsThe extra tags for the matrices this Kernel should fill
C++ Type:std::vector<TagName>
Controllable:No
Description:The extra tags for the matrices this Kernel should fill
- extra_vector_tagsThe extra tags for the vectors this Kernel should fill
C++ Type:std::vector<TagName>
Controllable:No
Description:The extra tags for the vectors this Kernel should fill
- matrix_onlyFalseWhether this object is only doing assembly to matrices (no vectors)
Default:False
C++ Type:bool
Controllable:No
Description:Whether this object is only doing assembly to matrices (no vectors)
- matrix_tagssystemThe tag for the matrices this Kernel should fill
Default:system
C++ Type:MultiMooseEnum
Options:nontime, system
Controllable:No
Description:The tag for the matrices this Kernel should fill
- vector_tagsnontimeThe tag for the vectors this Kernel should fill
Default:nontime
C++ Type:MultiMooseEnum
Options:nontime, time
Controllable:No
Description:The tag for the vectors this Kernel should fill
Contribution To Tagged Field Data 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.
- implicitTrueDetermines whether this object is calculated using an implicit or explicit form
Default:True
C++ Type:bool
Controllable:No
Description:Determines whether this object is calculated using an implicit or explicit form
- 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/mortar_czm_analysis.i)
- (modules/contact/test/tests/cohesive_zone_model/traction_cycle_modeI.i)
- (modules/contact/test/tests/cohesive_zone_model/traction_curve_mixed.i)
- (modules/contact/test/tests/cohesive_zone_model/traction_curve_modeI_viscous.i)
- (modules/contact/test/tests/cohesive_zone_model/traction_curve_modeII.i)
- (modules/contact/test/tests/cohesive_zone_model/mortar_czm.i)
- (modules/contact/test/tests/cohesive_zone_model/bilinear_mixed_mortar_only_czm.i)
- (modules/contact/examples/mortar_czm/progressive_debonding.i)
- (modules/contact/test/tests/cohesive_zone_model/robustness_pure_shear_limit.i)
- (modules/contact/test/tests/cohesive_zone_model/cohesive_friction.i)
- (modules/contact/examples/mortar_czm/debond_recontact.i)
- (modules/contact/test/tests/cohesive_zone_model/traction_curve_modeI.i)
- (modules/contact/test/tests/cohesive_zone_model/traction_curve_modeI_3d_inclined.i)
- (modules/contact/test/tests/cohesive_zone_model/compression_shear_toggle.i)
- (modules/contact/test/tests/cohesive_zone_model/bilinear_mixed_compare.i)
- (modules/contact/test/tests/cohesive_zone_model/traction_curve_modeI_3d.i)
- (modules/contact/test/tests/cohesive_zone_model/traction_curve_modeIII_3d.i)
- (modules/contact/test/tests/cohesive_zone_model/robustness_brittle_interface.i)
(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_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_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/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_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/mortar_czm.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
[]
[fix_top]
type = DirichletBC
preset = true
boundary = top_top
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
[]
[bottom]
type = DirichletBC
boundary = bottom_bottom
variable = disp_y
value = 0
preset = true
[]
[]
[AuxVariables]
[]
[AuxKernels]
[]
[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.05
dtmin = 0.01
[]
[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
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/bilinear_mixed_mortar_only_czm.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
[]
patch_update_strategy = auto
patch_size = 20
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
generate_output = 'vonmises_stress'
block = '1 2'
[]
[]
[]
[]
[BCs]
[fix_x]
type = DirichletBC
preset = true
value = 0.0
boundary = bottom_node
variable = disp_x
[]
[fix_top]
type = DirichletBC
preset = true
boundary = 100
variable = disp_x
value = 0
[]
[top]
type = FunctionDirichletBC
boundary = 100
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_base
variable = disp_y
value = 0
preset = true
[]
[]
[Materials]
[normal_strength]
type = GenericConstantMaterial
prop_names = 'normal_strength'
prop_values = '1e3'
[]
[shear_strength]
type = GenericConstantMaterial
prop_names = 'shear_strength'
prop_values = '7.5e2'
[]
[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'
[]
[]
[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 = 150
nl_rel_tol = 1e-14
nl_abs_tol = 1e-12
start_time = 0.0
dt = 0.1
end_time = 1.0
dtmin = 0.1
[]
[Outputs]
exodus = true
[]
[UserObjects]
[czm_uo]
type = BilinearMixedModeCohesiveZoneModel
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
correct_edge_dropping = true
disp_x = disp_x
disp_y = disp_y
friction_coefficient = 0.0 # with 2.0 works
secondary_variable = disp_x
penalty = 0e6
penalty_friction = 0e4
use_physical_gap = true
set_compressive_traction_to_zero = true
# bilinear model parameters
normal_strength = 'normal_strength'
shear_strength = 'shear_strength'
penalty_stiffness = 200
power_law_parameter = 0.1
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
[]
[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/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/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
[]
(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/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/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_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/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/test/tests/cohesive_zone_model/bilinear_mixed_compare.i)
[Mesh]
[base]
type = GeneratedMeshGenerator
dim = 2
xmax = 1.0
ymax = 1
xmin = -0.0
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.0 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
[]
patch_update_strategy = auto
patch_size = 20
allow_renumbering = false
[]
[GlobalParams]
displacements = 'disp_x disp_y'
[]
[Physics]
[SolidMechanics]
[QuasiStatic]
generate_output = 'stress_yy vonmises_stress stress_xy'
[all]
strain = FINITE
add_variables = true
use_automatic_differentiation = true
decomposition_method = TaylorExpansion
generate_output = 'vonmises_stress stress_yy stress_xy'
block = '1 2'
[]
[]
[]
[]
[BCs]
[fix_x]
type = DirichletBC
preset = true
value = 0.0
boundary = bottom_node
variable = disp_x
[]
[fix_top]
type = DirichletBC
preset = true
boundary = 100
variable = disp_x
value = 0
[]
[top]
type = FunctionDirichletBC
boundary = 100
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_base
variable = disp_y
value = 0
preset = true
[]
[]
[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'
[]
[]
[Postprocessors]
[stress_yy]
type = ElementExtremeValue
variable = stress_yy
value_type = max
block = '1 2'
[]
[]
[Preconditioning]
[smp]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = 'PJFNK'
line_search = 'none'
# petsc_options = '-pc_svd_monitor -ksp_monitor_singular_values'
petsc_options_iname = '-pc_type -pc_factor_mat_solver_package'
petsc_options_value = 'svd superlu_dist'
automatic_scaling = true
l_max_its = 2
l_tol = 1e-14
nl_max_its = 150
nl_rel_tol = 1e-14
nl_abs_tol = 1e-12
start_time = 0.0
dt = 0.01
end_time = 0.85
dtmin = 0.01
[]
[Outputs]
exodus = true
csv = true
[]
[UserObjects]
[czm_uo]
type = BilinearMixedModeCohesiveZoneModel
primary_boundary = 101
secondary_boundary = 'top_base'
primary_subdomain = 10000
secondary_subdomain = 10001
correct_edge_dropping = true
disp_x = disp_x
disp_y = disp_y
friction_coefficient = 0.0 # with 2.0 works
secondary_variable = disp_x
penalty = 0e6
penalty_friction = 0e4
use_physical_gap = true
# bilinear parameters
normal_strength = 1e4
shear_strength = 1e3
penalty_stiffness = 1e6
power_law_parameter = 2.2
viscosity = 1.0e-3
GI_c = 1e3
GII_c = 1e2
displacements = 'disp_x disp_y'
[]
[]
[Constraints]
[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/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/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/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
[]