Quickstart
The high-level ModalPipeline runs the whole workflow — MBC3 transform,
eigenanalysis, cross-operating-point tracking, Campbell assembly, and resonance
detection — over a set of operating points.
End-to-end pipeline
from vane import ModalPipeline
from vane.io.lin_reader import read_lin_file
# Each operating point is one azimuth sweep: a list of .lin files at the same
# rotor speed but different azimuths.
operating_points = [
[read_lin_file(p) for p in azimuth_files]
for azimuth_files in sweep # your grouping of .lin files
]
result = ModalPipeline().run(operating_points)
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
Grouping .lin files
OpenFAST writes one .lin file per linearization time, named
<case>.<n>.lin. Files sharing a <case> root form one operating point’s
azimuth sweep. The examples/ scripts show a directory-based grouping; the
pipeline sorts operating points by the operating parameter internally, so input
order does not matter.
Lower-level building blocks
Every stage is also available directly:
from vane.io.mbc_transform import mbc3_transform
from vane.modal.eigensolver import modes_from_mbc
from vane.modal.identifier import identify_modes
from vane.campbell.builder import build_campbell
mbc = mbc3_transform(azimuth_files) # non-rotating averaged model
solution = modes_from_mbc(mbc) # frequencies, damping, shapes
tracks = identify_modes([solution_a, solution_b]) # cross-operating-point tracks
diagram = build_campbell(tracks, rotor_speeds)
Reproducible studies
For a campaign of linearization files on disk, the study API discovers and groups the files, runs the pipeline, and records provenance — the exact source files (with content hashes), the azimuth coverage of each operating point, the tuning thresholds, and the library version — so a result can be tied back to precisely the inputs and assumptions that produced it:
from vane import discover_operating_points, run_study
operating_points = discover_operating_points("path/to/lin_files")
study = run_study(operating_points)
print(study.provenance.vane_version, study.provenance.source_files)
study.write_bundle("study_output") # provenance.json + campbell.csv
Data-free demonstration
To see the analysis path without OpenFAST data, run the synthetic quickstart, which builds a system with known modes, extracts and labels them, attaches a unified confidence, writes a CSV, and reports recovery accuracy and noise robustness:
python examples/synthetic_quickstart.py
See API reference for the full API and API contract for the guarantees each entry point makes.