Files
jyvikoandClaude Opus 5.5 227c4544ed solver: mortar contact in 2D models
Plane strain, plane stress and axisymmetric models take contact pairs and
general (self) contact on the linear edges of tri3 and quad4 elements:
edges oriented out of their elements, the edge mortar of fem with the
thickness or 2 pi r in the weights, the element's area over the edge's
length as the thickness under it, and the in-plane rows of the tangent
blocks. Verified by the contact patch test in plane strain and
axisymmetric (to 1e-9 small sliding, 1e-4 finite), Hertz's line contact
on quad4 edges (Johnson 1985, 4.3; equal to the hex8 model's to 1e-5),
and a hybrid rubber C-ring closing on itself that moves node for node as
the one-layer solid ring.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01UhhZMBTviDQxZvwnyP89fo
2026-10-14 16:30:44 -04:00

432 lines
9.7 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"title": "Contact patch test, axisymmetric: two rings with non-matching edges in axial compression (implicit mortar contact)",
"kind": "theory",
"source": "The contact patch test: a contact discretisation must transmit a uniform pressure across a non-matching interface exactly; Taylor & Papadopoulos, On a patch test for contact problems in two dimensions, Nonlinear Computational Mechanics, Springer 1991, 690–702; passed by 2D mortar methods: Yang, Laursen & Meng, IJNME 62:1183–1225, 2005. Uniaxial stress between frictionless supports is uniform in both blocks",
"quantities": [
{
"id": "small_lower_corner",
"quantity": "Small: σ_yy of element 4 over that of element 7",
"measure": {
"command": "solve.probe",
"params": {
"step": "Small",
"elements": [
4
]
},
"pointer": "/elements/0/stress/0/1",
"over": {
"command": "solve.probe",
"params": {
"step": "Small",
"elements": [
7
]
},
"pointer": "/elements/0/stress/0/1"
}
},
"value": 1.0,
"tolerance": {
"relative": 1e-06
},
"reason": "small sliding is linear and its edge mortar integrals exact (degree-3 Gauss on the overlaps): the uniform stress is the discrete solution up to the convergence tolerance"
},
{
"id": "small_lower_far",
"quantity": "Small: σ_yy of element 6 over that of element 7",
"measure": {
"command": "solve.probe",
"params": {
"step": "Small",
"elements": [
6
]
},
"pointer": "/elements/0/stress/0/1",
"over": {
"command": "solve.probe",
"params": {
"step": "Small",
"elements": [
7
]
},
"pointer": "/elements/0/stress/0/1"
}
},
"value": 1.0,
"tolerance": {
"relative": 1e-06
},
"reason": "as for the corner element"
},
{
"id": "small_lower_base",
"quantity": "Small: σ_yy of element 1 over that of element 7",
"measure": {
"command": "solve.probe",
"params": {
"step": "Small",
"elements": [
1
]
},
"pointer": "/elements/0/stress/0/1",
"over": {
"command": "solve.probe",
"params": {
"step": "Small",
"elements": [
7
]
},
"pointer": "/elements/0/stress/0/1"
}
},
"value": 1.0,
"tolerance": {
"relative": 1e-06
},
"reason": "as for the corner element"
},
{
"id": "small_upper_top",
"quantity": "Small: σ_yy of element 10 over that of element 7",
"measure": {
"command": "solve.probe",
"params": {
"step": "Small",
"elements": [
10
]
},
"pointer": "/elements/0/stress/0/1",
"over": {
"command": "solve.probe",
"params": {
"step": "Small",
"elements": [
7
]
},
"pointer": "/elements/0/stress/0/1"
}
},
"value": 1.0,
"tolerance": {
"relative": 1e-06
},
"reason": "as for the corner element"
},
{
"id": "small_lateral",
"quantity": "Small: σ_xx of element 6 over its σ_yy (uniaxial stress: 0)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Small",
"elements": [
6
]
},
"pointer": "/elements/0/stress/0/0",
"over": {
"command": "solve.probe",
"params": {
"step": "Small",
"elements": [
6
]
},
"pointer": "/elements/0/stress/0/1"
}
},
"value": 0.0,
"tolerance": {
"absolute": 1e-06
},
"reason": "a frictionless interface (and symmetry plane) leaves the blocks free to expand sideways; the non-matching interface must not hold them"
},
{
"id": "small_pressure",
"quantity": "Small: the contact pressure at the secondary node (1.5, 1) over −σ_yy of element 7",
"measure": {
"command": "solve.probe",
"params": {
"step": "Small",
"at": [
[
1.5,
1.0,
0.0
]
]
},
"pointer": "/nodes/0/contact/0/pressure",
"over": {
"command": "solve.probe",
"params": {
"step": "Small",
"elements": [
7
]
},
"pointer": "/elements/0/stress/0/1",
"scale": -1.0
}
},
"value": 1.0,
"tolerance": {
"relative": 1e-06
},
"reason": "the mortar multipliers are the nodal values of the contact pressure, uniform and equal to the stress across the interface"
},
{
"id": "small_force",
"quantity": "Small: the integrated contact pressure over the reaction at the pushed top",
"measure": {
"from": "small",
"pointer": "/contacts/0/normal_force",
"over": {
"command": "results.reactions",
"params": {
"step": "Small",
"sets": [
"top"
]
},
"pointer": "/sets/0/force/1",
"scale": -1.0
}
},
"value": 1.0,
"tolerance": {
"relative": 1e-06
},
"reason": "the pressure carries the whole load across the interface (both are totals over the circumference)"
},
{
"id": "finite_lower_corner",
"quantity": "Finite: σ_yy of element 4 over that of element 7",
"measure": {
"command": "solve.probe",
"params": {
"step": "Finite",
"elements": [
4
]
},
"pointer": "/elements/0/stress/0/1",
"over": {
"command": "solve.probe",
"params": {
"step": "Finite",
"elements": [
7
]
},
"pointer": "/elements/0/stress/0/1"
}
},
"value": 1.0,
"tolerance": {
"relative": 0.0002
},
"reason": "finite sliding is exact up to the geometric terms of the gaps the augmentation leaves (10⁻⁵ of the element thickness) and the default convergence tolerances"
},
{
"id": "finite_lower_far",
"quantity": "Finite: σ_yy of element 6 over that of element 7",
"measure": {
"command": "solve.probe",
"params": {
"step": "Finite",
"elements": [
6
]
},
"pointer": "/elements/0/stress/0/1",
"over": {
"command": "solve.probe",
"params": {
"step": "Finite",
"elements": [
7
]
},
"pointer": "/elements/0/stress/0/1"
}
},
"value": 1.0,
"tolerance": {
"relative": 0.0002
},
"reason": "as for the corner element"
},
{
"id": "finite_lower_base",
"quantity": "Finite: σ_yy of element 1 over that of element 7",
"measure": {
"command": "solve.probe",
"params": {
"step": "Finite",
"elements": [
1
]
},
"pointer": "/elements/0/stress/0/1",
"over": {
"command": "solve.probe",
"params": {
"step": "Finite",
"elements": [
7
]
},
"pointer": "/elements/0/stress/0/1"
}
},
"value": 1.0,
"tolerance": {
"relative": 0.0002
},
"reason": "as for the corner element"
},
{
"id": "finite_upper_top",
"quantity": "Finite: σ_yy of element 10 over that of element 7",
"measure": {
"command": "solve.probe",
"params": {
"step": "Finite",
"elements": [
10
]
},
"pointer": "/elements/0/stress/0/1",
"over": {
"command": "solve.probe",
"params": {
"step": "Finite",
"elements": [
7
]
},
"pointer": "/elements/0/stress/0/1"
}
},
"value": 1.0,
"tolerance": {
"relative": 0.0002
},
"reason": "as for the corner element"
},
{
"id": "finite_lateral",
"quantity": "Finite: σ_xx of element 6 over its σ_yy (uniaxial stress: 0)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Finite",
"elements": [
6
]
},
"pointer": "/elements/0/stress/0/0",
"over": {
"command": "solve.probe",
"params": {
"step": "Finite",
"elements": [
6
]
},
"pointer": "/elements/0/stress/0/1"
}
},
"value": 0.0,
"tolerance": {
"absolute": 0.0002
},
"reason": "a frictionless interface (and symmetry plane) leaves the blocks free to expand sideways; the non-matching interface must not hold them"
},
{
"id": "finite_pressure",
"quantity": "Finite: the contact pressure at the secondary node (1.5, 1) over −σ_yy of element 7",
"measure": {
"command": "solve.probe",
"params": {
"step": "Finite",
"at": [
[
1.5,
1.0,
0.0
]
]
},
"pointer": "/nodes/0/contact/0/pressure",
"over": {
"command": "solve.probe",
"params": {
"step": "Finite",
"elements": [
7
]
},
"pointer": "/elements/0/stress/0/1",
"scale": -1.0
}
},
"value": 1.0,
"tolerance": {
"relative": 0.0002
},
"reason": "the mortar multipliers are the nodal values of the contact pressure, uniform and equal to the stress across the interface"
},
{
"id": "finite_force",
"quantity": "Finite: the integrated contact pressure over the reaction at the pushed top",
"measure": {
"from": "finite",
"pointer": "/contacts/0/normal_force",
"over": {
"command": "results.reactions",
"params": {
"step": "Finite",
"sets": [
"top"
]
},
"pointer": "/sets/0/force/1",
"scale": -1.0
}
},
"value": 1.0,
"tolerance": {
"relative": 0.0002
},
"reason": "the pressure carries the whole load across the interface (both are totals over the circumference)"
},
{
"id": "small_stress",
"quantity": "Small: σ_yy of element 7 (uniaxial stress E ε = −10 for the 1% squeeze)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Small",
"elements": [
7
]
},
"pointer": "/elements/0/stress/0/1"
},
"value": -10.0,
"tolerance": {
"relative": 0.0001
},
"reason": "the squeeze less the penetration the augmented Lagrangian leaves (up to 10⁻⁵ of the element thickness)"
}
]
}