Metal sheets on the film: VBD sags a stiff sheet at real density, and the hinge network bends unlike a plate¶
Status: open. J2 metal sheets (SCR-WP7-15 P3) are on main; their laws run mass-scaled, which hides both limits. A J2
film runs 20 VBD iterations from the inertial start. That stops the sag from yielding for a 6061 or brass sheet on 5 mm
cells; steel, stainless and copper sheets, and any metal on finer cells, still yield under their own weight before
anything presses them. add_cloth with a j2 material always makes a film sheet. Design, laws and the full numbers are in the sheet-plasticity
development notes (not shipped).
What is wrong¶
- A stiff sheet sags, and the sag could yield.
scene.add_cloth(..., thickness=t, material="aluminium_6061_t6")(anyplastic.model: j2card) routescloth_film. At the card's real density VBD's Gauss-Seidel does not reach a metal sheet's statics in a step's iterations, so a sheet draped over a bar or laid on supports droops far below its static shape: a metal sheet in a scene looks floppy. - At VBD's 10 iterations that sag bent the sheet past yield. The sheet then kept a dent nothing pressed, and
plastic_strainread it. - At 20, the J2 film's default, it still does for most sheets: a 6 cm, 0.25 mm sheet at rest on two supports
reads ε̄p 0 in 6061 and brass on 5 mm cells, 0.001-0.007 in steel, stainless and copper, and 0.009-0.016 in
6061 and steel on 3 mm cells (a finer mesh sags more: 2 mm, then 5-9 mm).
sim.check()stays ok. The sag is 1,000 x or more the static one. - A dented sheet on box edges creeps. Released from a press, it stays on round or box supports. On round supports it settles within 1 mm; on the sharp edges of boxes it keeps sliding sideways, about 1 mm/s.
- VBD's adaptive start throws a dented sheet. With
alloy_initial_guess="adaptive"(the J2 default in b650fd2fd only), a dented metal sheet released from a press walked sideways and climbed off its supports, whilesim.check()stayed ok. Stiff CLOTH_VBD sheets did the same until WP2's 24178a806, which starts them inertial. - The hinge network is not the plate. Each hinge carries the plane-strain J2 section on its own curvature. Bent along the mesh grid that is exact, but:
- under a concentrated load (a cylinder pressing a strip) the network is more compliant than the plate;
- bent at an angle to the grid it is stiffer below yield (up to 1.5 × at 45°), and past yield it carries more moment than the plate (up to 1.94 ×);
- a dent's kept depth therefore depends on the mesh.
Number¶
- Sag (CPU, main a08d7007e): a 1 mm steel strip on two supports 100 mm apart, dt 2e-5, 50 ms. The static sag is 5.4 µm, and the first swing reaches 10.8 µm. Measured sag by solver setting:
- default start, 20 iterations: 1,170 µm;
alloy_initial_guess="adaptive": 42 µm;- adaptive plus
alloy_chebyshev_rho0.9: 100 µm at 20 iterations, 49 µm at 60.
At dt 1 ms the real-density strip fell off its supports in every variant. - Sag that yields, through the API (CPU, dt 0.01, a 6 cm, 0.25 mm 6061 sheet, res 13, 1.5 s):
| case | inertial, 10 iterations (before P3's follow-ups) | adaptive, 10 (b650fd2fd) | inertial, 20 (the J2 default now) |
|---|---|---|---|
| hung over a 20 mm bar | droops 9 mm, ε̄p 9.6e-4 | rings 1.5-5 mm, ε̄p 0 | 5.1 mm, ε̄p 0 |
| on two 10 mm round supports 4 cm apart (static sag ~2 µm) | 2.7 mm, ε̄p 1.8e-3 | 0.27-0.36 mm, ε̄p 0 | 1.9 mm, ε̄p 0 |
OSS-17 measured the 10-iteration inertial start independently: 10-15 mm and 0.0041 over a bar; 0.0003-0.0012
after a 0.14-0.3 mm drop onto round supports. At 40 iterations the bar droop is 3.1 mm. With
alloy_chebyshev_rho 0.9 on the inertial start at 20 (main 4522df750): bar 3.2 mm, round supports 1.5 mm, ε̄p 0,
every press-and-release case below stays on its supports, 1.14 x the step cost. Still 100 x or more the statics,
so the default stays as it is.
- Yield at rest, by metal and mesh (CPU, dt 0.01, main 270ead86d; the 6 cm, 0.25 mm sheet laid on two 10 mm round
supports 4 cm apart, nothing pressing; found by the pre-release audit, then re-measured).
Sag and largest ε̄p at 0.2 s, and at 1.0 s where they moved:
| material | res 13 (5 mm cells) | res 21 (3 mm cells) |
|---|---|---|
| aluminium_6061_t6 | 2.2 mm, 0 | 5.4 mm, 0.0085 (7.7 mm at 1 s) |
| steel_carbon | 2.2 mm, 0.0025 | 7.6 mm, 0.0152 (9.0 mm, 0.0159 at 1 s) |
| stainless_304 | 2.1 mm, 0.0015 | |
| copper_c110 | 3.5 mm, 0.0072 |
The audit's rows (a 0.2 mm lower start): brass 0, steel 0.0014, stainless 0.0007, copper 0.0055 at res 13; 6061 on
2 mm cells (res 31) 0.110, sag 10.3 mm; a 0.5 mm 6061 sheet at res 13 0.0014. Scene dt 0.005 gave identical
digits, an L4 the same to 4 digits. The static sag is about 2 µm and its strain 1e-6.
- Press and release (OSS-17's rig, CPU, dt 0.01; test_a_dented_sheet_released_fast_stays_on_its_supports): the
same sheet on two 10 mm round supports 4 cm apart (or 2 cm boxes 5 cm apart), pressed 15 mm by a kinematic 5 mm
sphere, released at 0.1 m/s (fast) or 0.02 m/s (slow), watched to t 3 s:
- inertial, 10: stays on round supports; on boxes it went INVALID (PEN_FAIL, contact 0.6 mm deep; scene dt 0.005
gave identical digits);
- adaptive, 10: walks sideways 0.1 s after the release ends, climbs to 74-80 mm (supports' tops at 50 mm), on the
ground by t 2.9; on boxes it rises 12 mm and falls off. Slow: stays on, but creeps upward (52.5 -> 56.1 mm in
1.4 s). At 40 iterations the same (80 mm); with Chebyshev 0.9 at 40 it climbs slower (61 mm at t 3). Nothing
flags it: sim.check() stays ok, health reads DEGRADED (UNCONVERGED) as during any press, and the film ledger's
largest one-step energy gain does not move (6.9 µJ, from the press): the ~0.6 mJ climb comes over ~70 steps;
- inertial, 20: stays on both, fast or slow. Round: settles, 0.7 mm sideways. Boxes: 2.3 mm sideways in 2.2 s and
still moving. A flat sheet at rest stays still with every start.
- Network (CPU; the strip and can rows mass-scaled ×10⁴ / ×10³, quasi-static):
- elastic 3-point bending of a 1 mm steel strip deflects 1.20 / 1.27 / 1.33 × the plane-strain beam for 5 / 10 /
20 mm strips (a narrow real plate: 1.10 ×);
- pure bending at 30° / 45° to the grid (sheet_laws.s1_off_axis): below yield its stiffness is 1.375 / 1.5 ×
the plate's; past yield (8 κ_y) it carries 1.80 / 1.94 × the plate's moment and keeps 0.92 of the plate's
curvature. Both are pinned by test_s1_off_axis_measures_the_hinge_networks_anisotropy;
- a 0.2 mm tinplate can wall pressed 8 mm by a fingertip keeps 1.07 / 0.96 / 0.68 mm on 32 x 8 / 48 x 14 /
64 x 20 walls. With the stretch cap at 5 % instead of σ_y/E it keeps 0.14 mm (48 x 14).
Why¶
- Sag: a metal sheet's bending stiffness D/dx⁴ dwarfs its mass per step (ρ t / dt²), and VBD's per-vertex Gauss-Seidel moves a long-wavelength bend a little per iteration. The inertial start puts a full step of gravity into every vertex's guess, and too few iterations leave much of it in the result. More iterations take it out.
- Adaptive start: it keeps gravity in a vertex's guess only where the vertex accelerated downward on the last step (Chen et al. 2024). That removes most of the sag (the 1 mm strip: 1,170 -> 42 µm). But a stiff sheet far from converged follows its guess, so gravity then acts one step late. A restoring force with a lag feeds energy in, and a dented sheet resting on two supports rocks itself off them.
- Network, a film model property (SC8's film; the J2 section only uses it):
- The membrane runs at 1e-4 of the material for VBD, and the strain cap carries the stretch, so in-plane shear and twist are nearly free below the cap and rigid past it.
- On the alternating right-triangle grid the axis hinges read κxx and κyy and the diagonals the twist κxy. With ke = D/l_h on all of them the energy is κxx² + κyy² + 4 κxy², where a plate's cylinders take 2 κxy².
- Under a concentrated load the rows zig-zag cell by cell, a mesh-scale mode that only the diagonal hinges resist.
- Each hinge yields on its own curvature: there is no plate plasticity (no biaxial interaction).
- Halving the diagonals' section (tried as P3b, not landed) makes elastic cylinders exact at every angle (1.000), but makes the zig-zag cheaper: 3-point compliance 1.51-1.61 ×, and the strip's set no longer matches its hinges. Past yield it still carries 1.38 / 1.44 ×, since independent hinges sum to 1.5 M_p at 45°.
Workaround¶
- Shape and dent laws: run mass-scaled with gravity off and a slow press, as S2 / S3 do (
sheet_dent.py,sheet_can.py). Light hinge damping while the sheet yields, and heavy damping once nothing yields any more. - A J2 film runs 20 iterations. More cut the sag further (40: 3.1 mm over the bar, 2x the cost); in engine-layer
rigs pass
iterations=to SolverFilm. - Keep
alloy_initial_guess="adaptive"off a J2 sheet that moves under gravity. The mass-scaled laws run with gravity off, where it changes nothing. - Give a pressed metal sheet round supports (
add_cylinder), not sharp box edges. - Read
plastic_strainon the sheet at rest, before the press: anything above 0 there is the sag, not the task. Count only what the press adds, and keep the mesh coarse (5 mm cells or larger): a finer one sags and yields more. - Bend along the mesh grid where the bend line is known (a fold, a cylinder press): the network is exact there.
- Read a dent's depth as mesh-dependent: compare meshes before trusting a number.
Planned fix¶
After the 1109 release. More iterations and Chebyshev buy factors of 1.3-1.6; the sag needs a solve that moves the whole sheet's bend at once (a Newton or multigrid step on the bending, in SC8's film or VBD; WP2's cloth-stiff-sheet-sag has the same need). - J2 films run 20 iterations from the inertial start. An adaptive start without the lag (or one used only near convergence) is the VBD accelerators' owners' call (WP2, WP11). CLOTH_VBD keeps it for fabrics, which the drape needs, and since 24178a806 starts sheets with a bending length over 50 mm (PET, nylon, PP, cardboard) inertial; their sag is cloth-stiff-sheet-sag.md. - A plate-like network needs hourglass control, or another bending discretization, in SC8's film. That is a film design change, not a J2 one.