forked from 1b-agent/fieldcraft-upstream
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
41 lines
2.0 KiB
JSON
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"
|
|
}
|
|
]
|
|
}
|