No runs are mounted here
That is expected on the hosted copy of this site. An optimization run is gigabytes of your own search history, so it is never committed to the repository and never published — it lives in a folder next to your checkout. This page is the viewer; you supply the runs.
- Clone the project and install the two dev dependencies:
git clone https://github.com/a19grey/Axial_flow_Web_Simulator cd Axial_flow_Web_Simulator && npm install
- Run a study. It is resumable and unattended — stop it and re-run with
--resumeand it picks up with every finished evaluation still cached:node cli/study.js run studies/printed-rotor-shape.json --hours 8
- Start the local server and come back to this page. It mounts your runs folder
(
../axialflow-runs/, or$AXIALFLOW_RUNS) at/runs/:npm start
Then flip through with the arrow keys, or render the whole night to a movie with
node cli/frames.js <run-dir> --video. The archive format, the ledger and the
jq queries that answer questions about a run are written up in
docs/runs.md. Meanwhile the
field solver itself runs entirely in this browser and needs none of
the above.
What this is, and what every word on it means
The tool
This project is a magnetostatic field solver for axial-flux motors that runs entirely in a browser on WebGPU, plus a headless driver that points it at an optimizer and leaves it running overnight. A study declares a baseline machine, a set of design variables with bounds, an objective, and manufacturing gates; the driver then searches that space for hours and writes every design it tried to a run archive. This page reads one of those archives back. It solves nothing — every outline here is redrawn from its design’s own saved spec through the same curve and routing code the solver rasterized it with, which is why a night’s search scrubs like video. To see fields, open a design in the solver.
What a score is
Every design is scored at equal copper loss, not equal current. The baseline machine’s own loss becomes the run’s budget, and each variant is handed whatever current puts it on that budget — so a design that wins is one that makes more torque out of the same heat, rather than one that was quietly given more amps. The objective is usually shear rather than torque, because dividing by the swept area makes it size-free and stops a bigger machine from winning for being bigger. Torque is averaged over a full ripple period, and the current phase is chosen in closed form rather than swept.
Reading the plan view
The machine is drawn looking down the shaft. The faint circles are the stator’s active annulus and the faint spokes its coil pitch — the frame both halves are read against. A rotor pole is drawn as more than one outline, because a pole is a three-dimensional thing seen from above:
- solid
- the pole at the gap face, the end nearest the board. This is the one that matters magnetically, and the only one that is filled.
- dashed
- the same pole where it meets the yoke, the back iron it is attached to. The offset between solid and dashed is the loft: if the dashed outline is smaller, the pole tapers; if it is swung round, the pole is skewed; if it sits exactly on the solid one, the two ends are the same size.
- dotted
- an interior section, drawn only when the pole reaches outside the other two. A loft is a Bézier against height and a Bézier passes through only its first and last control values, so a pole can bulge or waist in the middle and come back to the same size at both ends — the two face outlines would then be identical and the shape would look unlofted. The caption says which height it is and how far outside the pair it reaches.
The coloured loops are the coils, one closed curve per turn, coloured by phase. They are the real routed turns rather than a sketch — the same polygons that became Biot-Savart segments — so a coil whose offsets pinch looks pinched. A red dashed circle, when one appears, is the containment bound the rotor is not supposed to reach past.
Reading a design vector
Variables are declared as ratios, not millimetre lengths. That is what makes
a result transferable to another diameter instead of true only at this one, and it removes most
of the coupling between variables, which makes the space far easier to search. ro
below is the baseline’s outer radius.
- riOverRo
- the stator’s inner radius over its outer radius — how much of the disc is active annulus and how much is bore
- gapOverRo
- the mechanical air gap between the rotor pole face and the board, over the outer radius. The single most influential variable in every study so far.
- poleHeightOverGap
- the rotor pole’s axial height in units of the air gap — how tall the iron is compared with the distance it has to reach across
- yokeOverRo
- the rotor’s back-iron thickness over the outer radius — how much return path the flux is given
- fill
- how far into the coil outline to wind, as a fraction of the room the outline actually has. The turn count is an output of this, not an input.
The rest of a vector describes shapes, in normalized wedge coordinates where
u runs 0 at a feature’s inner radius to 1 at its outer, and v is
the angle in units of the feature’s own pitch — so v = ±0.5 is
where neighbouring poles or coils would touch.
- pole.*, coil.*
- a closed outline.
trailnandleadnare the two sides at station n, marching from the inner radius outward; the pair cannot cross, so the shape is always simple. After a ladder rung they become free control points,vn, and the shape is no longer obliged to be two monotone sides. - sweep.*
- the loft: how a rotor pole’s footprint changes as it climbs from the
gap face to the yoke.
scalegrows or pinches it,widenfans it angularly without growing it radially,twistswings its centre line. Each is a short Bézier against height, so one value is a constant, two a ramp, and three a flare or a waist — shapes a printer makes and a lamination or a mould cannot.
Hover any row in the panel on the right and you get that variable’s definition built from the study’s own declaration: what it writes, through what expression, between what bounds, and where in its range this particular design sits. A variable pinned to a bound is the search telling you the bound is in the way.
How a run is organized
A study runs in stages, and they are not interchangeable:
- baseline — score the starting design; its copper loss becomes the budget every later design is held to.
- noise — score the same design at two or three mesh refinements, to measure how much the score moves for reasons that are not the design. No later improvement smaller than this floor means anything.
- screen — nudge each variable alone and rank them by the swing, so the ones that do nothing can be set aside with the measurement kept.
- scan — a space-filling sample on the cheap mesh, to find basins rather than to find an optimum.
- rankcheck — re-score the scan’s best on the finer mesh and check the ordering survives. This is the stage that earns the right to screen cheaply.
- refine — CMA-ES from the best basins.
- ladder — double the control points of every shape in the design and restart at exactly the same design, so each rung only has to buy what its extra freedom is worth. A rung whose gain is inside the noise floor is where refining stops paying.
- confirm — the finalists on the fine mesh, with the convergence evidence attached. A design that does not survive refinement was never a design.
Runs are resumable and append-only: every finished evaluation is cached by the hash of its
normalized spec, so stopping a study and re-running it with --resume costs nothing.
The archive format, the ledger schema and the jq queries that answer questions
about a run are documented in docs/runs.md.
What to distrust
- The absolute numbers. The loss budget is far above what a board this size would survive thermally. Shear at fixed loss is very nearly scale-free, so the ranking transfers; the watts do not.
- Linear iron. The solver is linear, so nothing saturates. A peak B far above ~1.5 T is a field real steel would not give the design.
- Ripple. Reported, never constrained. A design can win here by being violently uneven.
- Mesh, not physics. Surface spread is the disagreement between two independent stress surfaces in the same field; treat it as the error bar on the score.