Quick start
VANE works on OpenFAST linearization (.lin) files. This page shows the shortest
routes from those files to identified modes, a Campbell diagram and a state-space model.
To produce the .lin files with VANE, see The OpenFAST linearization sweep.
The modal pipeline
ModalPipeline runs the whole analysis over a set of operating points:
the MBC3 transform, the eigensolution, physical labelling, cross-operating-point
tracking, Campbell assembly and resonance detection.
from vane import ModalPipeline, discover_operating_points
# One entry per operating point; each holds the .lin files of its azimuth sweep.
operating_points = discover_operating_points("path/to/lin_files")
result = ModalPipeline().run(operating_points, parameter_name="wind_speed")
for track in result.campbell.tracks:
print(track.label.label, track.natural_frequencies_hz)
for crossing in result.resonances:
print(f"{crossing.harmonic}P at {crossing.rotor_speed_rpm:.1f} rpm")
system = result.state_space(0) # A, B, C, D at the first operating point
discover_operating_points() groups the files of a directory into operating
points. OpenFAST writes one .lin file per linearization time, named
<case>.<n>.lin; files that share a <case> root form one operating point’s azimuth
sweep, and a directory per operating point is read recursively. A list of lists of
LinFile objects (from read_lin_file()) works equally
well. The pipeline sorts the operating points by the operating parameter, so the input
order does not matter.
The operating parameter is rotor speed by default (parameter_name="rotor_speed_rpm").
Above rated wind the trimmed rotor speed is constant, so a sweep that extends past rated
must use parameter_name="wind_speed"; the pipeline rejects a rotor-speed axis on
which two points coincide rather than switching silently. Resonance (nP crossing)
detection needs the rotor-speed axis, so a wind-speed run reports none. See
Campbell diagrams for the details.
A reproducible study
run_study() runs the same pipeline and records the provenance of the
result: the source files with their content hashes, the azimuth coverage of each
operating point, the tracking settings, the environment and the VANE version.
from vane import discover_operating_points, run_study
study = run_study(discover_operating_points("path/to/lin_files"))
print(study.provenance.vane_version, study.provenance.n_tracks)
# provenance.json, campbell.csv and a self-contained report.html
study.write_bundle("study_output")
The HTML report holds the validation checks, the warnings, the Campbell diagram, the tracking diagnostics and the file hashes, so every figure can be traced to its inputs.
The command line
The vane command offers the same three entry points:
$ vane modes case.1.lin case.2.lin case.3.lin -o modes.csv
$ vane campbell path/to/lin_files --parameter wind -o campbell.csv
$ vane study path/to/lin_files --parameter wind -o study_output
vane modes tabulates the modes of one operating point, vane campbell writes the
tracked Campbell table (.csv, .json, .xlsx or .mat by suffix, or the
terminal without -o), and vane study writes the study bundle. vane study
also accepts --tracking simultaneous, --branch-review, --resolve and
--no-report; vane --help and vane <command> --help list every option, and
vane --version prints the version.
Where to go next
The OpenFAST linearization sweep: run OpenFAST over an operating curve to produce the
.linfiles, including floating turbines.Mode identification: the individual steps (MBC3, eigensolution, participation, labels, tracking) and their options.
Campbell diagrams: Campbell diagrams, excitation lines and resonance crossings.
State-space export: state-space, reduced-order, Kalman-filter and LPV models.
Azimuth averaging: how large the error of the azimuth-averaged model is, and how many azimuths a linearization needs.