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 nodeLocation on facetGap at t = 0.30 ms (mm)Gap at t = 0.45 ms (mm)
1042facet center+0.21+0.04
1043facet edge−0.08−0.31
1044facet center+0.19+0.02
1045facet 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.

A. Coarse facet vs. true arc (N = 8) true arc, R = 100 mm sagitta s ≈ 0.48 mm facet-edge nodes: gap goes negative first B. Contact gap sign along slave surface gap = 0 facet center: gap > 0 facet edge: gap < 0 (penetration) Alternating sign along the surface = discretization-driven penetration C. Local refinement (N = 8 → 24 near edges) gap = 0 all gaps ≥ 0; penetration depth reduced, force ripple suppressed

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:

  1. 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 = 8 to N = 24 across the contact arc reduces the facet angle to Δθ = 3.75° and the sagitta to s ≈ 0.054 mm — about 2.7% of shell thickness, well below the level at which facet-edge penetration dominates.
  2. Use *CONTACT_AUTOMATIC_SURFACE_TO_SURFACE with SOFT = 1 only 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.

When comparing coarse and refined runs, keep the indenter velocity, contact definition, and output interval identical. Changing the time step due to the finer mesh will shift the sampling of the gap output; interpolate both histories onto a common time base before comparing peak penetration depth.

Verification Checklist

CheckCoarse run (expected)Refined run (expected)
Gap sign patternAlternating +/− along slave surfaceAll gaps ≥ 0
Max penetration depth≈ 0.3 mm at facet edges≈ 0.03 mm or less
Contact force rippleVisible high-frequency oscillationRipple attenuated, peak preserved
Contact energySmall negative excursionsNon-negative, smooth
Time stepLarger (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.