oracle: filleted L-bracket on the octree all-hex mesh

A slow theory case: the corpus bracket meshed by mesh.hex.octree at 7, 5 and 4 mm, clamped
at the base and loaded by 2 kN. Checks equilibrium, that every element is certified valid,
the mesh volume against the CAD volume, the beam bending stress of the upright leg
(sigma = M c / I = 145.3 MPa, within 5%) and the convergence of the fillet von Mises stress
against the 4 mm mesh.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm
This commit is contained in:
jyvikoandClaude Opus 5.5 authored and Irakli Kourtis committed 2026-10-14 07:38:11 -04:00
1 parent 7d2696057f
commit a719ae7e5b
6 files changed
+479 -1

No files matched your search

@@ -0,0 +1,21 @@
# Filleted L-bracket on the octree all-hex mesh
The corpus part `filleted-bracket` (an 8 mm thick L, 60 × 50 × 40 mm, an R6 fillet inside the
corner and a Ø8 hole through each leg), built with SolidCraft from `design.json` and meshed by
`mesh.hex.octree` (hex8 with incompatible modes, steel E = 210 GPa, ν = 0.3). The bottom face of
the horizontal leg (`F2:side:l1`) is clamped and the top face of the upright leg (`F2:side:l5`)
carries 2 kN along +x.
Checked on the 5 mm mesh: equilibrium; the certified validity of every element; the mesh volume
against the CAD volume; the bending stress of the upright leg at y = 19 on both faces,
σ_yy = M c / I = 2000 · 31 · 4 / 1706.7 = 145.3 MPa (M is exact by statics, the plane-section
stress is the reference, the corner and a hole are near). The von Mises stress at the middle of
the fillet, which has no closed form, is checked for convergence against the 4 mm mesh:
| mesh size | hexahedra | fillet von Mises (MPa) | σ_yy outer / inner at y = 19 (MPa) |
|---|---|---|---|
| 7 mm | 4291 | 138.5 | 149.4 / −146.9 |
| 5 mm | 13273 | 144.5 | 149.3 / −147.3 |
| 4 mm (reference) | 21508 | 143.2 | 147.4 / −145.5 |
A 3 mm mesh needs more than the direct solver's factor cap.
@@ -0,0 +1,89 @@
{
"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
}
}
]
}
@@ -0,0 +1,99 @@
{
"title": "Filleted L-bracket on the octree all-hex mesh: equilibrium, beam bending, fillet stress convergence",
"kind": "theory",
"source": "equilibrium; Euler–Bernoulli bending of the 8 × 40 mm leg, σ = M c / I with M = F (50 − y) (S. P. Timoshenko, J. N. Goodier, Theory of Elasticity, 3rd ed., 1970, §102); grid convergence of the fillet stress against the 4 mm mesh of this case (P. J. Roache, Verification and Validation in Computational Science and Engineering, 1998, ch. 5)",
"slow": true,
"quantities": [
{
"id": "reaction_x",
"quantity": "x reaction on the clamped face (5 mm mesh)",
"measure": {
"from": "solve5",
"pointer": "/reaction_total/0"
},
"value": -2000.0,
"tolerance": {
"relative": 1e-06
},
"reason": "the reactions balance the 2 kN load to solver precision"
},
{
"id": "invalid",
"quantity": "elements the certified Jacobian check does not prove valid (5 mm mesh)",
"measure": {
"from": "quality5",
"pointer": "/invalid/count"
},
"value": 0.0,
"tolerance": {
"exact": true
},
"reason": "the octree mesher returns only elements proven valid"
},
{
"id": "volume",
"quantity": "mesh volume against the CAD volume (5 mm mesh)",
"measure": {
"from": "mesh5",
"pointer": "/bodies/0/volume"
},
"value": 32144.778925,
"tolerance": {
"relative": 0.003
},
"reason": "bilinear boundary faces on the R6 fillet and the two Ø8 holes, and the 1e-3 chordal tessellation they are fitted to"
},
{
"id": "syy_outer",
"quantity": "σ_yy on the outer face of the upright leg at y = 19, z = 6 (5 mm mesh)",
"measure": {
"from": "probe5",
"pointer": "/nodes/1/stress/1"
},
"value": 145.3125,
"tolerance": {
"relative": 0.05
},
"reason": "beam theory ignores the corner 5 mm below and the hole 9 mm above; the probe takes the nearest node's extrapolated stress"
},
{
"id": "syy_inner",
"quantity": "σ_yy on the inner face of the upright leg at y = 19, z = 6 (5 mm mesh)",
"measure": {
"from": "probe5",
"pointer": "/nodes/2/stress/1"
},
"value": -145.3125,
"tolerance": {
"relative": 0.05
},
"reason": "as for the outer face"
},
{
"id": "fillet_7",
"quantity": "von Mises stress at the middle of the fillet, 7 mm mesh",
"measure": {
"from": "probe7",
"pointer": "/nodes/0/von_mises"
},
"value": 143.21,
"tolerance": {
"relative": 0.05
},
"reason": "the coarsest mesh, within 5% of the 4 mm mesh"
},
{
"id": "fillet_5",
"quantity": "von Mises stress at the middle of the fillet, 5 mm mesh",
"measure": {
"from": "probe5",
"pointer": "/nodes/0/von_mises"
},
"value": 143.21,
"tolerance": {
"relative": 0.02
},
"reason": "converging: within 2% of the 4 mm mesh"
}
]
}
@@ -0,0 +1,33 @@
{
"note": "FieldCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
"values": {
"fillet_5": {
"band": 1.4452906175564113e-7,
"value": 144.52906175564112
},
"fillet_7": {
"band": 1.4321000000000002e-7,
"value": 138.5286423070889
},
"invalid": {
"band": 0.0,
"value": 0.0
},
"reaction_x": {
"band": 2.0000000000000003e-6,
"value": -1999.999999998785
},
"syy_inner": {
"band": 1.472793063397077e-7,
"value": -147.2793063397077
},
"syy_outer": {
"band": 1.4926027331710374e-7,
"value": 149.26027331710372
},
"volume": {
"band": 0.00003217691091849411,
"value": 32176.910918494108
}
}
}
@@ -0,0 +1,228 @@
[
{
"command": "model.material.create",
"params": {
"name": "Steel",
"elastic": {
"type": "isotropic",
"young": 210000.0,
"poisson": 0.3
}
}
},
{
"command": "mesh.hex.octree",
"params": {
"body": "Bracket",
"size": 7.0
},
"id": "mesh7"
},
{
"command": "model.set.create",
"params": {
"name": "all",
"geometry": [
{
"body": "Bracket"
}
]
}
},
{
"command": "model.set.create",
"params": {
"name": "base",
"geometry": [
{
"body": "Bracket",
"face": "F2:side:l1"
}
]
}
},
{
"command": "model.set.create",
"params": {
"name": "top",
"geometry": [
{
"body": "Bracket",
"face": "F2:side:l5"
}
]
}
},
{
"command": "model.section.create",
"params": {
"name": "solid",
"set": "all",
"material": "Steel",
"kind": {
"type": "solid"
},
"formulation": {
"incompatible_modes": true
}
}
},
{
"command": "model.boundary_condition.create",
"params": {
"name": "clamp",
"type": "fixed",
"target": {
"set": "base"
}
}
},
{
"command": "model.load.create",
"params": {
"name": "F",
"type": "force",
"target": {
"set": "top"
},
"vector": [
2000.0,
0,
0
]
}
},
{
"command": "model.step.create",
"params": {
"name": "Load",
"procedure": {
"type": "static"
},
"boundary_conditions": [
"clamp"
],
"loads": [
"F"
]
}
},
{
"command": "mesh.quality",
"params": {},
"id": "quality7"
},
{
"command": "solve.static",
"params": {},
"id": "solve7"
},
{
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
9.757359312880714,
9.757359312880714,
10.0
],
[
0.0,
19.0,
6.0
],
[
8.0,
19.0,
6.0
]
]
},
"id": "probe7"
},
{
"command": "mesh.hex.octree",
"params": {
"body": "Bracket",
"size": 5.0
},
"id": "mesh5"
},
{
"command": "mesh.quality",
"params": {},
"id": "quality5"
},
{
"command": "solve.static",
"params": {},
"id": "solve5"
},
{
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
9.757359312880714,
9.757359312880714,
10.0
],
[
0.0,
19.0,
6.0
],
[
8.0,
19.0,
6.0
]
]
},
"id": "probe5"
},
{
"command": "mesh.hex.octree",
"params": {
"body": "Bracket",
"size": 4.0
},
"id": "mesh4"
},
{
"command": "mesh.quality",
"params": {},
"id": "quality4"
},
{
"command": "solve.static",
"params": {},
"id": "solve4"
},
{
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
9.757359312880714,
9.757359312880714,
10.0
],
[
0.0,
19.0,
6.0
],
[
8.0,
19.0,
6.0
]
]
},
"id": "probe4"
}
]