Files
jyvikoandClaude Opus 5.5 9c1c8f75c2 mesh: the tet mesher takes its input in a canonical order (#115)
SolidCraft lists a solid's faces in a different order from run to run
(the rounded box, for one), which reordered the triangle soup and the
face tags with every coordinate the same; welding keeps the first copy
it meets and every later stage visits ids in order, so the tet mesh
changed between runs. CanonicalSoup sorts the triangles by their
coordinates, numbers vertices by first use and face tags by first
appearance, and maps the tags back; mesh.tet.generate and the corpus
use it.

Tests: the washer's tet10 mesh has a fixed fingerprint (identical on
arm64 and x86-64 builds); a reordered, renumbered input gives the same
mesh; heavy: rounded-box and filleted-bracket mesh bit for bit the same
on repeated runs and with 1 and 8 threads.

The bracket oracle cases stay unfrozen: SolidCraft's tessellation
itself differs in the last bits between arm64 and x86-64. The coarse
case moves to 203.6 MPa with the canonical order; its band is 5%.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UhhZMBTviDQxZvwnyP89fo
2026-10-16 17:43:30 -04:00

41 lines
2.0 KiB
JSON

{
"title": "Filleted L-bracket under a side load: the peak von Mises stress on the R6 fillet, fine tet10 mesh",
"kind": "theory",
"source": "mesh convergence of the finite element solution (P. J. Roache, Verification and Validation in Computational Science and Engineering, Hermosa, 1998, ch. 5): the bracket has no closed-form stress; the reference is the mesh-independent peak of a four-level study of quadratic tetrahedral meshes refined by √2 in size and in curvature resolution (README.md); equilibrium",
"slow": true,
"quantities": [
{
"id": "fillet_peak",
"quantity": "largest nodal von Mises stress on the fillet face (MPa)",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"set": "fillet"
},
"pointer": "/max_von_mises/value"
},
"value": 213.0,
"tolerance": {
"relative": 0.03
},
"reason": "the four-level study gives 213.3, 210.6, 214.3, 213.3 MPa (2k to 13.5k elements): the bending stress is converged across the fillet, and the peak nodal value moves only with which of the fillet's tessellation lines (fixed angles, through every level) carries the largest node, by under 2%",
"fixture": false,
"fixture_reason": "the peak depends on the tet mesh, which is generated from SolidCraft's tessellation of the bracket; that tessellation is not bit-identical across platforms (its coordinates differ in the last bits between arm64 and x86-64 builds, issue #115). The tet mesher itself gives the same mesh for the same tessellation on every platform, run and thread count (fieldcraft-mesh `the_quality_mesh_is_the_same_on_every_platform`, testkit `tet_meshes_do_not_depend_on_the_run_or_the_thread_count`), so the quantity can be frozen once the tessellation is reproducible; until then the reference tolerance gates it"
},
{
"id": "reaction",
"quantity": "total reaction x (N)",
"measure": {
"from": "solve",
"pointer": "/reaction_total/0"
},
"value": -2000.0,
"tolerance": {
"relative": 1e-09
},
"reason": "equilibrium holds to rounding"
}
]
}