Actuator line

With mode = alm the blade force nodes themselves are the actuator points. After every OpenFAST step, the positions it reports for the rotating, yawed and deflected blades (num_force_points_blade per blade, root to tip, plus the hub node) carry minus its node forces into the spreading.

  • The flow sees three moving lines of force and the tip and root vortices they shed.

  • The integrated source equals minus the full thrust vector. No in-plane force is lost.

  • Velocities are still sampled at OpenFAST’s structural nodes. Wake_Mod must be 0, and the hub-axis check applies as for the disk.

Kernel width

Hold the kernel at a fixed length as the mesh is refined: 0.035 rotor diameters (8.4 m for the IEA 15 MW) with the FLLC. That is 0.84 cells on 10 m cells and 1.68 on 5 m cells. fllc = automatic sets it so. Held at a fixed number of cells instead, the kernel shrinks with the mesh: 0.8 cells on 2.5 m cells (2 m) gave 15 % less power than OpenFAST.

Tip-travel limit

The line must not jump over cells between steps. Every step ERF computes the cells the blade tip sweeps,

\[N_{tip} = \frac{\Omega\, R\, \Delta t}{\min(\Delta x, \Delta y, \Delta z)},\]

with \(\Omega\) the rotor speed and \(R\) the largest distance of a blade node from the hub axis. It aborts when \(N_{tip}\) exceeds alm_max_tip_cells (default 1), naming the largest erf.fixed_dt that passes. For the IEA 15 MW at rated speed (tip speed about 95 m/s) one cell per step means \(\Delta t \le \min(\Delta x, \Delta y, \Delta z)/95\) s, with \(\Delta t\) the anchor level’s step, not erf.fixed_dt. The check runs every step because OpenFAST may change the rotor speed.

Effective \(\Delta z\) on terrain and stretched meshes

On a terrain-fitted or stretched mesh \(\Delta z\) comes from the physical cells in the box the disk sweeps: the hub plus and minus \(R\sqrt{1 - n_d^2}\) along each direction \(d\) for the hub axis \(\mathbf{n}\), plus the blades’ off-plane distance times \(|n_d|\).

Each cell counts with its height divided by the largest share \(q_s\) of the tip speed that can cross it.

  • The tip’s vertical speed at a height of the disk is at most \(\Omega\sqrt{R^2 - r_z^2}\) for any yaw, tilt or cone, with \(r_z\) the vertical part of the tip’s in-plane offset. So \(q = \sqrt{R^2 - d^2}/R\), with \(d\) the distance from hub height to the cell’s nearest point, less the off-plane distance times \(|n_z|\).

  • A tip moving sideways also crosses a sloping face. With \(G\) the steepest slope of the cell’s two faces, \(q_s = \min(\sqrt{1 + G^2},\, q + G)\).

\(\Delta z\) is the smallest height over \(q_s\). On a flat mesh a cell at hub height counts in full. On a stretched mesh, the short cells near the ground that the tip crosses mostly sideways do not stop a run. On the Askervein test the limit comes from a 43.9 m flank cell whose 22 degree faces make it count as 40.7 m; the guard’s step is 0.96 of the exact one.

The limiting height is searched for every rotor at the first step and after every regrid. It is searched again for a rotor only when its hub, tip radius, axis or off-plane distance has moved more than a tenth of the smallest cell size, as a floating platform’s hub does. One integer reduction per step tells the ranks whether any has. erf.moving_bodies.verify_tip_cells = true checks the kept heights against a fresh search every step.

Filtered lifting-line correction (FLLC)

Why. A line spread with a kernel of several metres sees a weaker induced velocity at its own points than a real blade, whose kernel is of the order of the chord. The blades then see too much wind, and the line over-predicts power, more so for wider kernels.

What it does. The FLLC (Martinez-Tossas and Meneveau, 2019; generalized to variable chord by Martinez-Tossas, Sakievich, Churchfield and Meneveau, Wind Energy 27:101, 2024) computes the velocity that the line’s own trailing vorticity induces at the line, for the kernel used and for the optimal one. It adds the relaxed difference to the velocities OpenFAST receives at its blade nodes. It is on by default with mode = alm.

For each blade, with \(\mathbf{F}\) the force on the fluid per unit density, \(\mathbf{v}\) the relative velocity (flow minus blade motion) and \(dr\) the node width, the lift per unit span is

\[\mathbf{G} = \frac{1}{dr}\left(\mathbf{F} - \mathbf{v}\,\frac{\mathbf{F}\cdot\mathbf{v}}{|\mathbf{v}|^2}\right),\]

and the induced velocity of the sources \(\mathbf{G}/|\mathbf{v}|\) is

\[\mathbf{u}(r) = \frac{1}{2\pi} \sum_j \frac{\mathbf{G}_j}{|\mathbf{v}_j|} \, k(|r - r_j|, \epsilon_j) \, dr_j, \qquad k(r, \epsilon) = \frac{e^{-r^2/\epsilon^2}}{\epsilon^2} + \frac{e^{-r^2/\epsilon^2} - 1}{2 r^2}.\]

\(k\) is the derivative form of the Gaussian-filtered vortex kernel; its far field is \(-1/(2r^2)\). The correction is

\[\Delta\mathbf{u} \leftarrow (1 - f)\,\Delta\mathbf{u} + f\,(\mathbf{u}_{opt} - \mathbf{u}_{les}),\]

with \(f\) = fllc_relax, \(\mathbf{u}_{les}\) computed with the line’s epsilon and \(\mathbf{u}_{opt}\) with \(\epsilon_{opt}\) = fllc_eps_chord × chord. It is a downwash when the line’s kernel is wider than the optimal one, and vanishes when they coincide.

  • Optimal width. A quarter chord by default. fllc = automatic uses 0.15, the lower end of the optimal range 0.1 to 0.25, which matched OpenFAST better for the IEA 15 MW. The chord is OpenFAST’s at each force node.

  • Span grid. The sum runs over a fine grid of spacing \(\epsilon_{opt}\) / fllc_eps_dr, onto which \(\mathbf{G}/|\mathbf{v}|\) and \(\epsilon_{opt}\) are interpolated, since the optimal kernel is far narrower than the node spacing.

  • Timing. Computed from the loads of the step just taken, applied after sampling by linear interpolation along the span, starting at fllc_start_time.

  • State. Checkpointed. <output_root>_fllc.csv records its largest and RMS value.

  • Density. Loads are divided by the body’s air_density, which must equal the model’s AirDens.

The implementation follows Kynema’s variable-chord operator.