← Back to the examples

What you need to run it: the Python API (Automation) only. One motion zone, the sliding band and eddy currents are all free-tier capabilities, and the mesh is well under the free node budget.

What this one is for

This is the motion demo of the set, and the only example whose eddy currents are produced by movement rather than by an AC source. Nothing in the model carries an impressed current. The source is a permanent magnet, and every ampere in the rail is there because the rail is sliding.

It is therefore the shortest complete demonstration of Nabla's sliding band on a device with no rotor, no windings and no machine module — and the three rules that make a band work are each written out at the site in the script where they apply.

At a glance

QuantityValueUnit
Magnet arrayone per 25 mm pole pitch, 10 mm thick, alternating, N42
Back-iron10 mm, linear, μr = 2000
Airgap, magnet face to rail3mm
Rail6 thick × 50 wide, aluminium, σ = 3.5e7 S/mmm
Brake8 poles (the model is one pole pitch)
Peak drag864 at 10 m/sN
Drag at 0.5 / 20 / 60 m/s94.0 / 774.0 / 560.2N
Power balance, |F|v vs Joule loss1.75 worst (tolerance 4)%
Low-speed slope vs closed form23.51 vs 23.54 N/(m/s), 0.1% apart
Mesh3393 nodes, P1
Wall time, 11 runs / 1228 steps1 min 22s

The model is one pole pitch

The magnet array and the rail are both uniform along the direction of travel, so the device is periodic with the magnet pitch — and anti-periodic over one of them, because the next magnet is the same magnet upside down. The model is therefore one pole pitch wide, with parallel anti-periodic sides and an anti-periodic linear sliding band, and it stands for an infinitely long brake. That is what makes the whole eleven-point sweep fit in under a minute and a half on 3393 nodes.

The back-iron is linear on purpose. This example is about eddy currents, not about a BH table, and at this magnet loading the iron never approaches its knee; turning saturation on would make every step a Newton loop and change nothing worth reporting.

The sliding band — three rules

This is the part worth copying, and each rule has bitten real models before.

  1. The speed is in model length units per time unit. A linear motion profile's value is millimetres per second on a millimetre model — the peer of a circular profile's degrees per second. Getting it wrong gives a perfectly converged solution at a thousandth of the intended speed.
  2. The strip between the band's two rings must not be meshed. The band's job is to stitch the moving ring to the stationary one at each step, and it can only do that if the two rings are genuinely separate boundaries of the mesh. Here they sit 1 mm apart inside the 3 mm airgap and the strip between them is a hole, never a region. Nabla's rule M16 refuses a mesh that fills it — but the failure M16 prevents is silent at zero displacement, so a standstill check passes and the moving solution bleeds away instead. Do not write the script so that M16 has to catch you.
  3. The motion zone must end between the two rings. The band decides what the solver couples; the zone decides what post-processing translates into the lab frame. A zone drawn past its own ring translates stationary air at probe and render time while the force stays plausible — a defect that hides.

The window sides are drawn as two runs for the same reason: nothing may cross the band strip, so each side is interrupted there, and every interval ends exactly where a layer does so that no side segment carries a T-junction — which is what a periodic marker gets lost to.

The result

Drag and rail Joule loss against speed

  speed    drag/pitch   drag(8 poles)     Joule       |F|*v    balance
    0.5 m/s     11.75 N        94.0 N         5.8 W         5.9 W     0.92%
    1.0 m/s     23.02 N       184.2 N        22.9 W        23.0 W     0.42%
    2.0 m/s     43.84 N       350.7 N        87.5 W        87.7 W     0.19%
    5.0 m/s     87.35 N       698.8 N       436.4 W       436.8 W     0.08%
    7.0 m/s    101.23 N       809.8 N       707.9 W       708.6 W     0.10%
   10.0 m/s    107.99 N       863.9 N      1077.6 W      1079.9 W     0.21%
   15.0 m/s    104.12 N       833.0 N      1557.1 W      1561.8 W     0.30%
   20.0 m/s     96.75 N       774.0 N      1927.0 W      1935.0 W     0.41%
   40.0 m/s     78.40 N       627.2 N      3101.2 W      3135.9 W     1.12%
   60.0 m/s     70.02 N       560.2 N      4128.9 W      4201.4 W     1.75%

The shape is the physics. Drag rises linearly with speed while the induced field is negligible, peaks at 10 m/s at 864 N, and falls beyond it as the eddy currents begin to shield the rail from the magnets. A brake designed on the rising branch and operated past the peak brakes less the faster it goes, which is why the peak is the number that matters. The dissipated power keeps climbing throughout — it is |F|v, and the force falls more slowly than the speed rises.

Eddy-current density in the rail at 5 m/s, settled

That is the drag itself: a current sheet in the rail, lagging behind the magnet it was induced by. The gap across the middle of the picture is the band strip — it is a hole, so there is nothing there to draw.

The checks

Power balance — the tight anchor. |F|v against the rail's Joule loss, required within 4 %, worst case 1.75 %. These are two entirely independent post-processing paths on the same solution — a Maxwell-stress contour integral on the band, and a volume integral of J²/σ over the rail — and nothing else in the model dissipates, so they have to agree.

Low-speed slope — the analytic anchor. With the induced field neglected, J = σvBy, so dF/dv = σ·t·⟨By²⟩·A. Measuring ⟨By²⟩ inside the rail on the stationary solution gives 0.0897 T², predicting 23.54 N/(m/s) per pole pitch against 23.51 measured at 0.5 m/s — 0.1 % apart. The tolerance is deliberately loose at 25 %, because the closed form ignores the induced field entirely; the agreement being this good is a property of this operating point, not a promise.

The zero-speed point is the uncertainty band on the whole curve. No motion means no eddy currents — the Joule loss comes back at 4.8e-30 W — so the drag there is exactly zero. What the force integral reads instead, 0.378 N, is its own noise floor, and it reads on every other point too: 0.35 % of the peak, but 3.2 % of the 0.5 m/s point. The example prints it rather than subtracting it. It moved from 0.132 N to 0.378 N on refinement, so it is mesh noise and not a physical offset.

Two mesh and window decisions, measured rather than assumed

How long a run has to be. Each speed runs for the longer of three pole pitches of travel and five of the rail's own diffusion times (1.6 ms for 6 mm of aluminium). At 0.5 m/s the travel window binds; at 20 m/s three pitches is only 3.75 ms, barely two diffusion times, and the drag would be averaged over a startup that has not finished. Measured: at 20 m/s the power balance closes to 6.1 % on a 3-pitch window and 2.0 % on a 6-pitch one, while doubling the step count on the 3-pitch window moves it by 0.08 %. The error was settling, not time discretization, and the fix is a longer run rather than a finer one.

The rail mesh is the one number that is not comfort. The skin depth at the top swept speed is 1.74 mm inside a 6 mm rail, so the rail needs several elements through depth. Measured at 60 m/s:

Rail meshNodesJoule loss|F|·vPower balance
0.15 mm²17583950 W4208 W6.55 %
0.05 mm²33934129 W4201 W1.75 %

It is the Joule integral that moves, not the force contour: an under-resolved skin layer under-reads J²/σ. Halving the time step at either mesh changes the balance by 0.01 %.

Caveats

  • The 40 and 60 m/s points carry about 3 % of Backward-Euler time-discretization error in the absolute drag. The power balance cannot see it, because both sides move together. Those two points exist to show the falling branch; the interesting range, up to 20 m/s, is converged.
  • Both irons are linear, so this example says nothing about a saturating back-iron. A back-iron thin enough to saturate is a different — and worse — device.

Running it

python eddy_current_brake.py            # build, solve the sweep, check, plot
python eddy_current_brake.py --coarse   # every mesh area x4, 28 s
python eddy_current_brake.py --no-solve # geometry and mesh only

--coarse reproduces the whole curve to within 2 % and is judged against a looser power-balance bar, because its rail cannot resolve the skin depth at the top two speeds — and the run says so.

Try this next

  • The airgap is the single biggest lever on the drag, and it enters roughly squared.
  • Rail thickness and conductivity set the low-speed slope and move the peak: more of either means more drag at low speed and an earlier peak.
  • Pole pitch — a longer pitch pushes the peak to a higher speed, because the excitation frequency a given speed produces is lower.
  • Make it rotary. A disc between magnet poles is the same example with a circular motion and arc band boundary conditions instead of the line pair — and the speed then goes in degrees per second.

About these numbers

This is a demonstration brake, not a product. Every figure on this page came out of the run described here at the settings the script ships with. For accuracy against a stated reference and tolerance, the validation dossier is where that question belongs.