opencad
← Machines
MachineFAIL 11/12

FAN-01 axial fan

EAA benchmark low-pressure axial fan with a nine-blade rotor in its rig, with fluid regions and an MRF flow analysis.

Facts

Backend
build123d
Gates
11 pass, 1 fail, 2 n/a
Envelope
1200.0 × 1374.0 × 1200.0 mm
Bodies
6 (4 purchased, 2 derived)
Joints
5
Simulations
2
Truth case
yes, scored against held-back geometry

Assembled machine

FileKindSize
fan-01.stepSTEP13.7 MB
fan-01.stlSTL64.9 MB

Source

assembly.yaml (design contract)

Design intent

FAN-01 low-pressure axial fan (EAA benchmark fan N1UG) analysed from its supplied CAD in the rig frame: the nine-blade rotor (tip radius 247.5) turns on a revolute joint about +y through (x, z) = (-400, 1515) inside the stationary duct (inlet nozzle, Ø500 bore, diffuser), with the shaft and the downstream hub disc turning with it. The stationary flow boundary the CAD lacks is derived: the chamber wall the duct passes through where the diffuser begins. The hub closure the rotor ring mounts on is the supplied rotor's own closed web disc (y -410.6..-404.5), so no derived plug is built. The air is a derived fluid body: the chamber-side settling region upstream of the nozzle, the duct, and the ambient-side discharge region downstream of the diffuser, between an inlet cap and an outlet cap. A steady OpenFOAM MRF analysis predicts the total-to-static pressure rise at 0.994, 1.403 and 1.804 m3/s and the rotor torque at 1.403 m3/s, all at 1486 rpm, with a mesh-refinement pair at the design flow. Authoritative: sources/fan01-packet.md and the four STEP files; figure-1-setup.png is illustrative.

Failing gates

refinement. The geometry and handoff are published as built; read each gate below before printing.

Gates

TierGateResultEvidence
Aparts_pass
Every part design passed its own 12 gates and has a handoff STEP
n/aresults/build123d/fan-01/parts.json designs.<design>.gates_ok:
Abom_complete
Every body of the bill of materials is in the export, once, with a placement
PASSresults/build123d/fan-01/verify.json solid_count = 6 (expected 6); placements.missing = []; unmatched = []
Ajoint_fidelity
Every joint's child frame lies on its parent frame (axis, offset, rest angle)
PASSresults/build123d/fan-01/verify.json joints.joints.<joint>.checks; failing: none
Aclearances
Static clearances and seats at rest
PASSresults/build123d/fan-01/verify.json clearances.<name>; failing: none
Amotion_clear
Every drive moves through its range without interference; gears mesh; ratios match tooth counts
PASSresults/build123d/fan-01/kinematics.json motions.<name>.max_interference: spin=0
Afluid_domain
Each fluid region is one sealed piece within its volume band and agrees with the source's fluid body
PASSresults/build123d/fan-01/domains.json fluids.<name>: air sealed=True volume=1850924899.7123868
Bexport_agreement
Each exported body equals its part handoff x placement; the assembled envelope matches
PASSresults/build123d/fan-01/verify.json agreement.bodies.<body>.volume_rel/hausdorff_mm; envelope.max_error = 0.0 (tol 0.5)
Bperformance
Every predicted observable meets the requirement the sources state over its numerical band (value +- 2 u_numerical)
n/aresults/build123d/fan-01/simulate.json observables.<id>.requirement:
Bconservation
Energy, mass and force balances of every analysis close within their tolerance
PASSresults/build123d/fan-01/simulate.json simulations.<id>.conservation: mrfDesign.mass_balance=2.6679971490182154e-05, mrfOffDesign.mass_balance=4.1425166297483736e-05
Brefinement
Every prediction of a mesh ladder is resolved: all its levels finished and the grid-convergence index is within tolerance
FAILresults/build123d/fan-01/simulate.json simulations.<id>.refinement.observables: mrfDesign: dpts_q1403 GCI 0.0513 unresolved (GCI 0.0513 > 0.05; a finest step refines only inside regions: the rest of the mesh is not assessed there), torque_q1403 GCI 0.0172 unre…
Means: the prediction depends on the mesh: its discretisation error is unknown or above tolerance, so it supports no value
Csource_hygiene
The assembly source imports only its declared inputs, formats and lints clean
PASSresults/build123d/fan-01/verify.json hygiene: cad_refs=[] truth_refs=[]; ruff format True, ruff check True
Cboundaries_complete
Every face of a bounded body carries exactly one named boundary
PASSresults/build123d/fan-01/domains.json boundaries.<body>.unassigned/conflicts: none
Cprovenance
Stage JSONs carry provenance stamps; part handoffs are hash-bound; inputs carry provenance
PASSresults/build123d/fan-01/<stage>.json provenance present for ['verify', 'kinematics', 'domains', 'simulate']; parts.json designs.<d>.step_sha256 present: True
Cevidence_separation
No worker-visible artefact reads truth; the assembly source only places declared inputs
PASSresults/build123d/fan-01/verify.json hygiene.truth_refs = []

Bill of materials

BodyKindDesignMaterial
ductpurchased
rotorpurchased
shaftpurchased
hubDiscpurchased
chamberWallderived
airderived