Which way does the ALM contact row push, and what really stopped the drift?

The regression scene of 2026-10-05: a frictionless 6x6 cloth patch (20 g per vertex) resting on a fixed level 12x12 plate, ALM-DAT self-contact, margin 20 mm, gap 10 mm, K = 1000 N/m, 6 iterations, 60 Hz, 4 s. Four runs: the contact force along the stored plane normal (the design note) or along the closest-point direction (the penalty path), each with the penalty-metric floor at K on (today's default) or off (rho = m/dt² = 72 N/m, the host's support rule). Built 2026-11-05 from notes/alm-dat-force-direction/demo.py on ankac/alm-dat-main.

What the four runs say. With the floor on, the two directions behave the same: the patch settles by 0.6 cm and 0.6 cm in the first second and then stops (0.0 and 0.0 cm between 1 s and 4 s). With the floor off, both drift without end: 47.3 cm along the plane normal, 12.2 cm along the closest-point direction in 4 s, and the amounts change from run to run. So the October drift was the small-rho instability of the ALM row, and the floor at K is what stopped it. The force direction did not matter, because on today's separator the stored plane normal is the closest-point direction for every resting row (section 3). My earlier explanation, that the direction change fixed the drift, was wrong.

1. The four runs

plane normal, floor on: 0.6 cm

closest point, floor on: 0.6 cm

plane normal, floor off: 47.3 cm

closest point, floor off: 12.2 cm

2. Top view, animated, and the drift against time

The patch outline over the plate, all four runs on the same clock; the dashed outline is the start position.

drag to scrub

3. The two directions at one vertex

At 1 s, for the free vertex with the largest lateral push, every contact row it has with the plate: the stored plane normal (dashed red) and the closest-point direction (green), and the summed row forces under each convention with that run's multipliers and gaps. On the current base the two sets of arrows coincide: the separator search takes the closest-point axis as its first candidate and keeps it when it certifies the pair, so for a resting patch the certified normal is the closest-point direction. The normals lean 11 to 16 degrees because a vertex has rows with the neighbouring triangles of the triangulated plate, not only with the one below it; those lateral components cancel to about 1 mN over the patch, against a weight of 9.6 N.

4. How tilted are the normals?

Tilt from the vertical of the stored plane normals (red) and the closest-point directions (green), all rows of the free patch at 1 s. The bars overlap exactly in the floor-on runs. In the floor-off runs the patch is already sliding at 1 s, so its rows pair with other triangles and the tilts are larger.

5. What this means

floor on, rho = K = 1000 N/mfloor off, rho = m/dt² = 72 N/m
force along the plane normal0.6 cm, settled47.3 cm, still moving
force along the closest-point direction0.6 cm, settled12.2 cm, still moving