forked from 1b-agent/fieldcraft-upstream
The end-to-end demo met a raw-CDT sliver that the validity gate accepted (exactly positive) and the solver refused. Now: - One validity criterion, `fieldcraft_model::admissible_jacobian` (normalized Jacobian above 1e-12), used by the implicit solver (fem `positive_inverse`), the explicit tet4/hex8 kinematics and the mesh gate, which proves it on the whole element (tet4: the solvers' own Jacobian; curved kinds: a Bernstein floor), so whatever passes the gate passes the solvers. - CDT rounding repaired by flips on the rounded mesh (Diazzi et al. 2023 §5.1) instead of the ±2-ulp nudge. - `fieldcraft-mesh::tet`: a mutable tetrahedral complex whose every change is a checked replacement (positive and admissible tetrahedra, faces matched with opposite orientation) with an exact undo log; edge removal (Klincsek), multi-face removal, Delaunay insertion with boundary faces, edge collapse; a curvature- and thickness-graded size field; constrained Delaunay refinement with encroachment splits; ODT smoothing; the Klingner–Shewchuk schedule; boundary vertices moved onto the exact B-rep surfaces at the end; tet10 with mid-edge nodes on the geometry. - `mesh.tet.generate` gains size, order, quality, quality_target, curvature_angle, grading, max_passes, max_points and reports the CDT's and the mesh's quality; `solve.probe` takes a set and reports its largest von Mises stress. - Oracle cases filleted-bracket-fillet-stress(-coarse): the fillet's peak von Mises stress on tet10 meshes of 2k and 13.5k elements, 213.3 MPa (a four-level study stays within 1.8%); the CDT cases keep the raw tetrahedralization. - Corpus quality columns: all 20 valid parts mesh and pass the gate. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm
90 lines
968 B
JSON
90 lines
968 B
JSON
{
|
|
"commands": [
|
|
{
|
|
"command": "sketch.create",
|
|
"params": {
|
|
"plane": "XY",
|
|
"name": "Profile"
|
|
}
|
|
},
|
|
{
|
|
"command": "sketch.line",
|
|
"params": {
|
|
"points": [
|
|
[
|
|
0,
|
|
0
|
|
],
|
|
[
|
|
60,
|
|
0
|
|
],
|
|
[
|
|
60,
|
|
8
|
|
],
|
|
[
|
|
8,
|
|
8
|
|
],
|
|
[
|
|
8,
|
|
50
|
|
],
|
|
[
|
|
0,
|
|
50
|
|
]
|
|
],
|
|
"closed": true
|
|
}
|
|
},
|
|
{
|
|
"command": "sketch.finish",
|
|
"params": {}
|
|
},
|
|
{
|
|
"command": "solid.extrude",
|
|
"params": {
|
|
"distance": 40,
|
|
"body_name": "Bracket"
|
|
}
|
|
},
|
|
{
|
|
"command": "solid.fillet",
|
|
"params": {
|
|
"edges": [
|
|
[
|
|
8,
|
|
8,
|
|
20
|
|
]
|
|
],
|
|
"radius": 6
|
|
}
|
|
},
|
|
{
|
|
"command": "solid.hole",
|
|
"params": {
|
|
"position": [
|
|
40,
|
|
8,
|
|
20
|
|
],
|
|
"diameter": 8
|
|
}
|
|
},
|
|
{
|
|
"command": "solid.hole",
|
|
"params": {
|
|
"position": [
|
|
8,
|
|
32,
|
|
20
|
|
],
|
|
"diameter": 8
|
|
}
|
|
}
|
|
]
|
|
}
|