Inputs¶
All keys start with erf.moving_bodies.. Per-body keys sit under
erf.moving_bodies.<name>., one block per name in bodies. The tables give the key without
the prefix.
General rules:
erf.structures.model = galeturns the bodies on. Without it the keys are ignored, andamrex.parmparse.verbose = 1lists them as unused. With it,bodiesmust be set.Every value is range-checked at start-up. The run stops, naming the key, when one is out of range or not finite.
A key the chosen options do not use gives a warning. One exception aborts:
epsilon_towerorepsilon_nacellegiven while the tower or nacelle switch is not set at all.A restart must keep every key that places or forces a body. A change stops the run, naming the key. A key the body does not use may change:
nacelle_areawithoutnacelle_cd, andcorrection_timewith a fixedcorrection_relax.Run requirements (solver, time step, levels, traps) are in Limitations.
Every key is also in one annotated deck, Master reference deck.
Bodies¶
Key |
Description |
Values |
Default |
|---|---|---|---|
|
Names of the bodies. |
strings |
required |
|
Kind of body. |
|
required |
|
Tower base x, y, z (m). On a terrain-fitted mesh z is the height above the surface; 0 puts the base on the ground. |
3 reals |
required |
|
Prefix of the body’s log files. Must be unique. |
string |
|
|
Density (kg/m³) used in the |
> 0 |
1.225 |
OpenFAST turbine¶
Key |
Description |
Values |
Default |
|---|---|---|---|
|
OpenFAST primary file. See the four settings it must hold. |
string |
required |
|
How loads reach the flow: as rings (disk), from the moving blade nodes (line), or not at all (one-way). |
|
|
|
Force points per blade. |
int > 0 (≥ 2 with FLLC) |
50 |
|
Tower force points. 0 puts no tower force in the flow. |
int ≥ 0 |
0 |
|
Drag coefficient of a nacelle drag point at the hub. 0 is off. |
≥ 0 |
0 |
|
Nacelle frontal area (m²). Must be positive when |
≥ 0 |
0 |
Kernel widths¶
Widths are in cells of the anchor level’s x spacing. See Tower, nacelle and kernel widths for how to choose them.
Key |
Description |
Values |
Default |
|---|---|---|---|
|
Width of the rotor’s points (line nodes, disk rings, |
> 0 |
2.0 |
|
Width of the tower force points. |
> 0 |
|
|
Width of the nacelle point. |
> 0 |
|
Actuator disk¶
For mode = adm.
Key |
Description |
Values |
Default |
|---|---|---|---|
|
Points per ring. |
int ≥ 2 |
16 |
|
One ring per blade node, or one shared ring per radial station. |
|
|
|
Where the velocity handed to OpenFAST comes from. See Actuator disk. |
|
|
|
Distance ahead of the hub, in diameters, for |
> 0 |
2.0 (turbine), 1.0 ( |
|
Under-relaxation of the recovered free stream. −1 chooses it from the loop gain; 1 is the unrelaxed update. |
−1, or (0, 1] |
−1 |
|
Decay time (s) of a free-stream error with |
−1, 0, or > 0 |
−1 |
Actuator line¶
For mode = alm. FLLC is the filtered lifting-line correction.
Key |
Description |
Values |
Default |
|---|---|---|---|
|
Turns the FLLC on. |
|
|
|
Relaxation factor of the correction. |
(0, 1] |
0.1 |
|
Simulation time (s) from which the correction applies. This is ERF’s time, not time since the bodies started. |
≥ 0 |
0 |
|
Optimal kernel width, in chords. |
> 0 |
0.25 |
|
Span grid spacing is optimal width / |
> 0 |
1.0 |
|
Most cells a blade tip may sweep per step. Above it the run stops and names the largest
|
> 0 |
1.0 |
Prescribed-Ct disk¶
For type = ct_disk. num_points_t, sample_diameters_upstream and air_density also
apply.
Key |
Description |
Values |
Default |
|---|---|---|---|
|
Name of a turbine table, |
table name |
unset |
|
Disk radius (m). Not with |
> 0 |
required without |
|
Disk centre above the base (m). With |
> |
required (table’s with |
|
Thrust coefficient on the upstream speed. Not with |
(0, 1) |
required without |
|
Disk normal, degrees from +x in the horizontal plane. |
real |
0 |
|
Rings of the polar point grid. |
int > 0 |
8 |
Run-wide¶
Key |
Description |
Values |
Default |
|---|---|---|---|
|
Level the bodies live on. −1 is |
−1 to |
−1 |
|
Allowed relative difference between ERF’s density at a hub (or disk centre) and the model’s. |
≥ 0 |
0.05 |
|
Folder of the turbine tables a |
path |
|
|
Testing aid: a uniform velocity given to every node in place of the flow. |
3 reals |
unset |
Diagnostics¶
Key |
Description |
Values |
Default |
|---|---|---|---|
|
Steps between log rows. |
int > 0 |
1 |
|
Folder of the logs. |
string |
|
|
One file per body, per rank, or per farm. |
|
|
|
Simulation time (s) from which statistics and wake averages accumulate. |
≥ 0 |
0 |
|
Steps between rewrites of the statistics and wake averages. 0 rewrites them at every write. |
int ≥ 0 |
0 |
|
Most log files a rank keeps open. 0 takes a quarter of the open-file limit. |
int ≥ 0 |
0 |
|
Steps between timing summaries per phase. 0 is off. |
int ≥ 0 |
0 |
Wake lines¶
Lines behind every rotor: one horizontal and one vertical at each distance.
Key |
Description |
Values |
Default |
|---|---|---|---|
|
Distances behind the rotor, in diameters. |
reals > 0 |
unset (no lines) |
|
Half-length of each line, in diameters. |
> 0 |
1.5 |
|
Points per line. |
int ≥ 2 |
61 |
|
Steps between samples. 0 uses |
int ≥ 0 |
|
Debugging and performance¶
Key |
Description |
Values |
Default |
|---|---|---|---|
|
Steps between the collective check of the exchange envelopes. Between checks each owner checks its own points and aborts if they leave. |
int ≥ 1 |
1 |
|
Checks the cached tip-travel cell heights against a fresh search every step. |
true, false |
false |
Master reference deck¶
Exec/CanonicalTests/MovingBodies/inputs_gale_master_reference lists every GALE key in one
file, with its default, range and units, grouped as above. Copy the lines a case needs. It is a
reference, not a runnable case: some keys in it exclude each other.
inputs_gale_master_reference
# GALE master input reference
#
# Every GALE input, with its default, range and units. GALE's inputs are erf.structures.model and
# the erf.moving_bodies.* keys. ERF's own inputs (mesh, solver, boundaries) are not listed here;
# see the ERF documentation.
#
# This is a reference, not a runnable case. Some keys exclude each other; each one says which.
# Runnable decks are in the folders next to this file.
#
# Conventions:
# - The value shown is the default. "required" means there is none.
# - Every value is range-checked at start-up. The run stops, naming the key, when one is out of
# range or not finite.
# - A key the chosen options do not use prints a warning.
# - A restart must keep every key that places or forces a body; a change stops the run. Keys a
# body does not use are not compared: nacelle_area without nacelle_cd, correction_time with a
# fixed correction_relax.
# - Kernel widths (epsilon*) are in cells of the anchor level's x spacing.
#
# Kept in sync with MovingBodiesInputs::read (Turbines/ERF_MovingBodiesInputs.cpp) and
# Docs/sphinx_doc/Inputs.rst.
# =================================================================================================
# 1. Turning GALE on
# =================================================================================================
erf.structures.model = gale # selects GALE; without it the keys below are ignored
erf.moving_bodies.bodies = T1 D1 # required: body names, one block per name (no duplicates)
# =================================================================================================
# 2. Every body (openfast_turbine and ct_disk)
# =================================================================================================
erf.moving_bodies.T1.type = openfast_turbine # required: openfast_turbine | ct_disk
erf.moving_bodies.T1.base_pos = 750. 600. 0. # required: tower base x y z (m); on a terrain-
# fitted mesh z is the height above the surface
erf.moving_bodies.T1.epsilon = 2.0 # > 0 (cells): width of the rotor's points.
# Excludes fllc = automatic, which sets it
erf.moving_bodies.T1.output_root = moving_bodies/T1 # log-file prefix; default <diagnostics_dir>/<name>;
# must differ between bodies
erf.moving_bodies.T1.num_points_t = 16 # >= 2: points per ring (mode = adm, ct_disk)
erf.moving_bodies.T1.air_density = 1.225 # > 0 (kg/m^3): must equal the model's AirDens;
# checked against ERF's density at the hub
erf.moving_bodies.T1.sample_diameters_upstream = 2.0 # > 0 (rotor diameters ahead of the hub);
# default 2.0 for a turbine (sampling = upstream),
# 1.0 for a ct_disk
# =================================================================================================
# 3. OpenFAST turbine (type = openfast_turbine)
# =================================================================================================
# The OpenFAST model must set CompInflow = 2; AirDens = air_density; Wake_Mod = 0 with sampling = disk
# (and mode = alm), 1 with upstream or disk_corrected; TwrShadow = 0 when tower force points are on.
erf.moving_bodies.T1.fst_file = IEA15-land.fst # required: OpenFAST primary file
erf.moving_bodies.T1.mode = adm # adm (disk rings) | alm (actuator line) |
# none (one-way: no force into the flow)
erf.moving_bodies.T1.num_force_points_blade = 50 # >= 1 (>= 2 with fllc): force points per blade.
# Excludes fllc = automatic (300)
erf.moving_bodies.T1.num_force_points_tower = 0 # >= 0: tower force points; 0 = no tower force
erf.moving_bodies.T1.nacelle_cd = 0.0 # >= 0: nacelle drag coefficient; 0 = off
erf.moving_bodies.T1.nacelle_area = 0.0 # >= 0 (m^2): must be > 0 when nacelle_cd > 0
# --- 3a. Component kernel widths -----------------------------------------------------------------
erf.moving_bodies.T1.epsilon_tower = 2.0 # > 0 (cells); default epsilon. Aborts when given
# and num_force_points_tower was never set
erf.moving_bodies.T1.epsilon_nacelle = 2.0 # > 0 (cells); default epsilon. Aborts when given
# and nacelle_cd was never set; nacelle_cd *
# nacelle_area must not exceed 2 pi eps^2 (m)
# --- 3b. Actuator disk (mode = adm) --------------------------------------------------------------
erf.moving_bodies.T1.adm_spreading = rings # rings (one per blade node) | merged_rings (one
# per radial station)
erf.moving_bodies.T1.sampling = disk_corrected # disk | upstream | disk_corrected; default
# disk_corrected (adm), disk (alm, none);
# upstream and disk_corrected need mode = adm
erf.moving_bodies.T1.correction_relax = -1 # disk_corrected: -1 (from the loop gain) or (0, 1];
# 1 = unrelaxed update
erf.moving_bodies.T1.correction_time = -1 # disk_corrected with correction_relax = -1 (s):
# -1 = rotor radius / free stream; 0 = none; or > 0
# --- 3c. Actuator line (mode = alm) --------------------------------------------------------------
erf.moving_bodies.T1.fllc = true # true | false | automatic; default true (alm),
# false otherwise; needs mode = alm.
# automatic sets epsilon = 0.035 D,
# fllc_eps_chord = 0.15, fllc_eps_dr = 3,
# fllc_start_time = 5 s, num_force_points_blade
# = 300; giving any of those with it aborts
erf.moving_bodies.T1.fllc_relax = 0.1 # (0, 1]: relaxation of the correction
erf.moving_bodies.T1.fllc_start_time = 0.0 # >= 0 (s, simulation time). Excludes automatic
erf.moving_bodies.T1.fllc_eps_chord = 0.25 # > 0 (chords): optimal kernel width. Excludes automatic
erf.moving_bodies.T1.fllc_eps_dr = 1.0 # > 0: span spacing = optimal width / fllc_eps_dr.
# Excludes automatic
# =================================================================================================
# 4. Prescribed-Ct disk (type = ct_disk)
# =================================================================================================
# Also uses base_pos, epsilon, output_root, num_points_t, air_density, sample_diameters_upstream
# (section 2). OpenFAST keys given for a ct_disk print a warning.
erf.moving_bodies.D1.type = ct_disk
erf.moving_bodies.D1.base_pos = 1500. 600. 0.
erf.moving_bodies.D1.rotor_radius = 120. # required without turbine, > 0 (m)
erf.moving_bodies.D1.hub_height = 150. # required, > rotor_radius (m above the base);
# with turbine, the table's unless given, and
# required when the table gives no single one
erf.moving_bodies.D1.ct = 0.75 # required without turbine, in (0, 1): thrust
# coefficient on the upstream speed
erf.moving_bodies.D2.type = ct_disk
erf.moving_bodies.D2.base_pos = 2500. 600. 0.
erf.moving_bodies.D2.turbine = NREL_5MW_126 # unset by default: name of a table in
# turbine_data_dir; rotor_radius = D/2 and Ct(U)
# come from it; excludes ct and rotor_radius
erf.moving_bodies.D1.yaw = 0.0 # degrees from +x in the horizontal plane
erf.moving_bodies.D1.num_points_r = 8 # >= 1: rings of the polar point grid
# =================================================================================================
# 5. Run-wide
# =================================================================================================
erf.moving_bodies.anchor_level = -1 # level the bodies live on; -1 = amr.max_level;
# otherwise 0 .. amr.max_level
erf.moving_bodies.density_tolerance = 0.05 # >= 0 (relative): ERF's density at a hub vs the
# model's
erf.moving_bodies.alm_max_tip_cells = 1.0 # > 0: most cells a blade tip may sweep per step;
# the abort names the largest erf.fixed_dt
# that passes
erf.moving_bodies.turbine_data_dir = Turbines/Data/PowerCurves # folder of the turbine tables;
# default: that folder of the GALE source tree
# (build-time path); relative = from the run
# directory
erf.moving_bodies.prescribed_velocity = 10. 0. 0. # testing aid, unset by default: uniform velocity
# given to every node in place of the flow;
# no wake lines are then written
# =================================================================================================
# 6. Diagnostics and statistics
# =================================================================================================
erf.moving_bodies.diagnostics_int = 1 # >= 1 (steps between log rows)
erf.moving_bodies.diagnostics_dir = moving_bodies
erf.moving_bodies.diagnostics_format = per_turbine # per_turbine | per_rank | farm
erf.moving_bodies.avg_start = 0.0 # >= 0 (s): statistics and wake averages start here
erf.moving_bodies.stats_int = 0 # >= 0 (steps between rewrites of _stats and
# _wake_avg); 0 = at every write
erf.moving_bodies.max_open_logs = 0 # >= 0: log files a rank keeps open; 0 = a quarter
# of the open-file limit
erf.moving_bodies.timing_int = 0 # >= 0 (steps between timing summaries); 0 = off
# =================================================================================================
# 7. Wake lines (behind every rotor)
# =================================================================================================
erf.moving_bodies.wake.lines_xD = 2 4 7 # > 0 (rotor diameters behind the rotor); unset =
# no lines
erf.moving_bodies.wake.half_width = 1.5 # > 0 (rotor diameters): half-length of each line
erf.moving_bodies.wake.num_points = 61 # >= 2: points per line
erf.moving_bodies.wake.int = 0 # >= 0 (steps between samples); 0 = diagnostics_int
# =================================================================================================
# 8. Debugging and performance
# =================================================================================================
erf.moving_bodies.envelope_check_interval = 1 # >= 1 (steps between collective envelope checks)
erf.moving_bodies.verify_tip_cells = false # true: check cached tip-travel cell heights
# against a fresh search every step (alm)