Setting up turbine cases¶
This page lists what a case needs. How the coupling works is in How the coupling works;
every input is in Inputs. The decks in Exec/CanonicalTests/MovingBodies are runnable
examples of every feature.
Turning the bodies on¶
Two lines select GALE and name the bodies. Each body then has its own
erf.moving_bodies.<name>.* block.
erf.structures.model = gale
erf.moving_bodies.bodies = T1 T2
The run must use the anelastic solver with a fixed time step, and floating-point traps must be off with OpenFAST turbines. The full list of requirements is in Limitations. The run stops at start-up, naming the input, when one is not met.
The OpenFAST model¶
Any standard OpenFAST model works. GALE reads four settings from it and checks them at start-up:
File and setting |
Required value |
Reason |
|---|---|---|
|
|
ERF supplies the inflow. |
|
ERF’s density at the hub, within |
OpenFAST’s loads go into ERF’s air. |
AeroDyn |
|
Induction is counted once: either by the resolved flow or by AeroDyn. |
AeroDyn |
|
The tower’s wake already reaches the blades through the flow. |
Because of the Wake_Mod rule, one model file serves either the corrected disk or the line, not
both.
Time step¶
The bodies’ step must be a whole multiple of OpenFAST’s DT. The bodies’ step is
erf.fixed_dt divided by the time refinement down to the anchor level.
Example
With DT = 0.005 s, erf.fixed_dt = 0.15 works on two levels (0.075 s) but not on three
(0.0375 s). 0.16 works on three (0.04 s).
An actuator line also has a tip-travel limit: the blade tip may sweep at most
alm_max_tip_cells cells per step (default 1). The start-up message names the largest
erf.fixed_dt that passes. The limit applies to the anchor level’s step. For the IEA 15 MW the
power-curve runs used erf.fixed_dt of 0.15 s with a 10 m anchor level (two levels, 0.075 s
anchor step) and 0.16 s with a 5 m anchor level (three levels, 0.04 s).
Minimal decks¶
The default and the configuration calibrated against standalone OpenFAST. The AeroDyn file
must set Wake_Mod = 1.
erf.moving_bodies.T1.type = openfast_turbine
erf.moving_bodies.T1.mode = adm
erf.moving_bodies.T1.fst_file = IEA15-land.fst
erf.moving_bodies.T1.base_pos = 750. 600. 0. # z above the terrain surface
erf.moving_bodies.T1.epsilon = 2.0 # kernel width, in cells
erf.moving_bodies.T1.num_points_t = 24
fllc = automatic sets the kernel width, the correction and 300 points per blade from the
rotor size. The AeroDyn file must set Wake_Mod = 0.
erf.moving_bodies.T1.type = openfast_turbine
erf.moving_bodies.T1.mode = alm
erf.moving_bodies.T1.fst_file = IEA15-land.fst
erf.moving_bodies.T1.base_pos = 750. 600. 0.
erf.moving_bodies.T1.fllc = automatic
No OpenFAST. A uniformly loaded disk with a closed-form thrust.
erf.moving_bodies.D1.type = ct_disk
erf.moving_bodies.D1.base_pos = 750. 600. 0.
erf.moving_bodies.D1.rotor_radius = 120.
erf.moving_bodies.D1.hub_height = 150.
erf.moving_bodies.D1.ct = 0.75
Each deck also needs the solver lines:
erf.compressibility_type = Anelastic
erf.timestepping_type = MidPoint
erf.vert_implicit = true
erf.use_fft = true
erf.fixed_dt = 0.2
amrex.fpe_trap_invalid = 0
Recommended settings¶
Topic |
Recommendation |
|---|---|
Disk or line |
Use the corrected disk for farms and RANS or ABL studies. Use the line with the FLLC for LES that resolves the blades. |
Disk kernel |
Keep \(\epsilon \le 0.5 R\), so the filter width \(\sqrt{6}\,\epsilon\) stays within 1.25 rotor radii. Example: 1.5 cells of 40 m for a 120 m rotor. |
Line kernel |
Hold it at a fixed length, 0.035 rotor diameters (8.4 m for the IEA 15 MW), not a fixed
number of cells. |
Grid |
At least 8 cells across the rotor. A fine patch around the rotor carries the bodies; no finer level may cover them. |
Boundaries |
Inflow at |
Terrain |
Give |
Accuracy against standalone OpenFAST, IEA 15 MW, uniform inflow¶
Fixed rotor speed, 10.59 m/s:
Disk set-up |
Thrust / BEM |
Power / BEM |
|---|---|---|
disk_corrected (default), 20 m or 10 m cells |
0.997 to 1.001 |
0.993 to 1.000 |
upstream sampling, two diameters ahead |
0.993 |
0.999 |
plain disk sampling, 20 m cells |
1.093 |
1.328 |
With the ROSCO controller, error in power / thrust. ERF averaged over 300 to 360 s, OpenFAST
over 120 to 700 s, following the Kynema-SGF calibration by G. R. Yalla
(gyalla/ALM_Calibrations). Line: fllc = automatic. Above rated (10.6 m/s) the controller
holds power, so thrust is the test.
U (m/s) |
Disk, 20 m (1 level) |
Line, 10 m (2 levels) |
Line, 5 m (3 levels) |
|---|---|---|---|
5.0 |
−0.2 % / −0.1 % |
+1.4 % / +0.6 % |
+3.7 % / +1.6 % |
6.5 |
−0.2 % / −0.1 % |
−1.1 % / −0.4 % |
+1.3 % / +0.7 % |
9.0 |
−0.2 % / −0.1 % |
−3.8 % / −1.9 % |
−1.1 % / −0.4 % |
11.0 |
0.0 % / +0.1 % |
0.0 % / +6.6 % |
0.0 % / +4.3 % |
14.0 |
0.0 % / 0.0 % |
0.0 % / +2.5 % |
0.0 % / +2.0 % |
Decks, controller inputs and scripts are in Exec/CanonicalTests/MovingBodies/OpenFAST_IEA15_PowerCurve.
The ROSCO library is not in the repository.
Outputs¶
Logs are written every diagnostics_int steps. A body’s files start with output_root,
by default <diagnostics_dir>/<name> (moving_bodies/T1). A given output_root is used as
it is, relative to the run folder. The farm files are always in diagnostics_dir.
File |
Contents |
|---|---|
|
Turbine: rotor speed, thrust vector, torque, power, hub axis, tower and nacelle forces, total load. Forces are on the structure. |
|
Turbine: velocity handed to OpenFAST at the hub and blade mean, after corrections. |
|
|
|
Line with FLLC: largest and RMS correction. |
|
|
|
Velocity on wake lines, instantaneous and time-averaged. |
|
Mean, RMS, min and max of each body quantity from |
|
Force put into the flow, integrated over the domain. Equals minus the bodies’ load. |
|
Farm total load and power. |
|
Terrain height under each body. |
Rows of _erf, _flow and total_load carry the time at the end of their step. The others
carry the time at the start of the step whose forcing they describe. OpenFAST writes its own
.out files as configured in the .fst.
diagnostics_format = per_rank or farm gathers the per-body logs into one file per rank or
one per farm, with a body column.
Large farms¶
Use at least as many ranks as turbines. A rank steps its turbines one after another.
Write logs every 10 to 100 steps (
diagnostics_int). OpenFAST’s.outkeeps the full rate.Sample wake lines rarely (
wake.intof 50 to 200 steps), only where needed.Use
diagnostics_format = farm(orper_rank) andstats_intof a few hundred steps.Measure with
timing_intbefore tuning. A-DERF_ENABLE_TINY_PROFILE=ONbuild gives more detail.
Restarting¶
Checkpoints hold the OpenFAST state and every running quantity, so a restart continues bit for
bit. It may use another number of ranks. It must keep the same bodies, inputs, anchor level and
erf.fixed_dt, and it may not run past the stop time the turbines started with (OpenFAST stores
it). The run stops, naming the input, otherwise.
To run past that stop time, copy the checkpoint, delete its moving_bodies folder and restart
from the copy. The turbines then start afresh at the checkpoint’s time, as they do from a
precursor checkpoint written without bodies.