3. Detect and Fix Penetration Caused by Coarse Mesh in a Curved Contact Surface
Why a Curved Shell Contact Pair Penetrates at Coarse Discretization
In LS-DYNA, a shell contact surface is not a smooth analytic curve — it is a faceted polygonal approximation of that curve. When the mesh is coarse relative to the curvature radius, the chordal deviation between the true surface and the facet plane becomes large. Two consequences follow: the contact gap measured at facet centers can look acceptable while the gap at facet edges is already negative, and the penalty force that should resist penetration is applied along facet normals that rotate abruptly from element to element. The result is a characteristic signature: localized penetration concentrated at facet edges, and a contact force history that oscillates as slave nodes migrate from one facet to the next.
This case builds a deliberately under-resolved curved shell contact pair, extracts the contact gap to locate the penetration, then refines only the region around the offending facet edges and quantifies the reduction in both penetration depth and force oscillation. The distinguishing task here is curvature-driven discretization error, not initial gap violation or penalty scaling.
Reference Model and Deliberate Coarse Discretization
The model is a quarter-cylinder shell (radius R = 100 mm, arc span 90°, thickness t = 2 mm) pressed by a rigid spherical indenter of radius r = 40 mm moving radially inward at constant velocity. The shell uses *MAT_ELASTIC (steel: RO = 7.85e-9 t/mm³, E = 210000 MPa, PR = 0.3) with *SECTION_SHELL and five through-thickness integration points. The indenter is a rigid body with prescribed motion.
The coarse mesh is chosen so that the chordal deviation is intentionally visible. With N = 8 elements across the 90° arc, the facet angle is Δθ = 11.25° and the sagitta (maximum deviation of the chord from the true arc) is:
s = R · (1 − cos(Δθ/2)) = 100 · (1 − cos(5.625°)) ≈ 0.482 mm
That is roughly a quarter of the shell thickness — large enough that a slave node sitting near a facet edge can register penetration before the facet center does. The contact definition uses *CONTACT_AUTOMATIC_SURFACE_TO_SURFACE with the shell as the slave side, SOFT = 0 (default penalty), and SF = 1.0 so that the penalty stiffness is not masking the geometry effect.
*CONTACT_AUTOMATIC_SURFACE_TO_SURFACE
$# ssid msid sstyp mstyp sboxid mboxid spr mpr
1 2 0 0 0 0 0 0
$# fs fd dc vc vdcp penmax bt dt
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
$# sfs sfm sst mst sfst sfmt fsf vsf
1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0
To make the gap observable, request contact gap output on the slave side and write it at a fine interval:
*DATABASE_ASCII
$# dt binary lcur ioopt
0.01 0 0 1
$# option
CONTACT_GAP
Also enable *DATABASE_BINARY_D3PLOT at DT = 0.05 so the penetration pattern can be inspected visually alongside the numeric gap history.
Reading the Contact Gap to Locate Penetration
After the run, the contact_gap ASCII file lists, per slave node, the gap value at each output time. A positive value is a gap, zero is touching, and a negative value is penetration. The diagnostic pattern to look for in the coarse run is spatial clustering at facet edges: nodes near element boundaries show negative gaps while nodes near element centers remain positive at the same time step. A representative excerpt from the coarse run (illustrative values consistent with the geometry above) looks like this:
| Slave node | Location on facet | Gap at t = 0.30 ms (mm) | Gap at t = 0.45 ms (mm) |
|---|---|---|---|
| 1042 | facet center | +0.21 | +0.04 |
| 1043 | facet edge | −0.08 | −0.31 |
| 1044 | facet center | +0.19 | +0.02 |
| 1045 | facet edge | −0.11 | −0.34 |
The alternating sign along the slave surface is the fingerprint of facet-edge penetration. If instead the negative gaps were uniformly distributed across the whole surface, the cause would be an initial gap violation or a thickness offset problem rather than discretization. That distinction matters because the fix is different.
Cross-check with the global contact energy in glstat: a coarse-mesh penetration case typically shows a small but persistent negative contact energy contribution (energy added back to the system as nodes are pushed out of penetration) and a contact force history with visible high-frequency ripple. Plot rcforc (resultant contact force) against time — the ripple period corresponds to the time it takes a slave node to traverse one facet, which is a direct confirmation that the oscillation is geometric in origin.
Local Refinement Strategy
Refining the entire shell is wasteful and changes the model's mass and time step globally. The targeted fix is to refine only the slave-side region where the gap output showed negative values. Two practical approaches:
- Rebuild the slave patch with graded mesh. Keep the coarse mesh elsewhere, but subdivide the two or three elements adjacent to each facet-edge penetration zone. Going from
N = 8toN = 24across the contact arc reduces the facet angle toΔθ = 3.75°and the sagitta tos ≈ 0.054 mm— about 2.7% of shell thickness, well below the level at which facet-edge penetration dominates. - Use
*CONTACT_AUTOMATIC_SURFACE_TO_SURFACEwithSOFT = 1only as a secondary check. Soft constraint contact smooths the normal direction and can mask the geometric error, so it is useful for confirming the diagnosis but should not replace the mesh fix when the goal is to demonstrate the discretization effect.
After refinement, re-run with the same CONTACT_GAP output and compare the two gap histories node-by-node. The expected outcome is that the previously negative facet-edge nodes now report gaps at or above zero, and the maximum penetration depth (the most negative gap value anywhere in the file) drops by roughly an order of magnitude. The rcforc history should show the high-frequency ripple attenuated, with the dominant force peak preserved — confirming that the physical contact response is unchanged while the numerical artifact is removed.
Verification Checklist
| Check | Coarse run (expected) | Refined run (expected) |
|---|---|---|
| Gap sign pattern | Alternating +/− along slave surface | All gaps ≥ 0 |
| Max penetration depth | ≈ 0.3 mm at facet edges | ≈ 0.03 mm or less |
| Contact force ripple | Visible high-frequency oscillation | Ripple attenuated, peak preserved |
| Contact energy | Small negative excursions | Non-negative, smooth |
| Time step | Larger (coarse mesh) | Smaller (refined patch) |
If the refined run still shows negative gaps at the same nodes, the cause is no longer discretization — check for initial penetration or a shell thickness offset before refining further. If the force ripple persists despite clean gaps, the oscillation is likely penalty-stiffness driven rather than geometric, which is a separate tuning problem.