OpenFAST coupling
The Op3 -> OpenFAST bridge produces SoilDyn-compatible input files from any Op3 foundation handle.
SoilDyn export
- op3.openfast_coupling.soildyn_export.write_soildyn_input(out_path: str | Path, K: ndarray, *, location_xyz: tuple[float, float, float] = (0.0, 0.0, 0.0), damping: ndarray | None = None, provenance: str = 'Op^3 PISA') Path[source]
Write a SoilDyn input file using the Op^3 6x6 stiffness matrix.
- Parameters:
out_path – Destination file path.
K – 6x6 stiffness matrix in SI units (N/m for translational, Nm/rad for rotational, off-diagonal in mixed units per OpenFAST convention).
location_xyz – Coupling point in OpenFAST global coordinates (typically the tower base or the SubDyn interface node).
damping – Optional 6x6 damping matrix. If None, a zero matrix is written.
provenance – String describing where K came from (e.g. “Op^3 PISA Burd 2020” or “Op^3 Mode D alpha=2.0”).
- op3.openfast_coupling.soildyn_export.write_soildyn_from_pisa(out_path: str | Path, *, diameter_m: float, embed_length_m: float, soil_profile: list, location_xyz: tuple[float, float, float] = (0.0, 0.0, 0.0), n_segments: int = 50) Path[source]
Convenience: build a PISA K matrix and write it as a SoilDyn .dat in one call. Equivalent to calling pisa_pile_stiffness_6x6() then write_soildyn_input().
- op3.openfast_coupling.soildyn_export.write_soildyn_multipoint(out_path: str | Path, points: list[dict], *, provenance: str = 'Op^3 multi-point') Path[source]
Write a multi-point SoilDyn input file using CalcOption=3 layout (one independent 6x6 K per coupling point). Each
pointsentry must be a dict with keys:location: (x, y, z) tupleK: 6x6 ndarraydamping: optional 6x6 ndarray (defaults to zero)label: optional string label
This is the format used by the OC6 Phase II REDWIN DLL test case and is the natural target for the Op^3 Mode D dissipation-weighted custom DLL: each tripod leg gets its own K matrix derived from a different soil profile (e.g. one leg in dense sand, two legs in clay) and the dissipation weighting can be applied per-point.
Note: stock OpenFAST v5.0.0 SoilDyn requires the corresponding SubDyn mesh nodes to exist within 0.1 m of each location.
End-to-end example
from op3.openfast_coupling.soildyn_export import write_soildyn_from_pisa
from op3.standards.pisa import SoilState
profile = [
SoilState(0.0, 5.0e7, 35, "sand"),
SoilState(15.0, 1.0e8, 35, "sand"),
SoilState(36.0, 1.5e8, 36, "sand"),
]
write_soildyn_from_pisa(
"SiteA-Ref4MW_SoilDyn.dat",
diameter_m=6.0, embed_length_m=36.0,
soil_profile=profile,
location_xyz=(-24.80, 0.0, -45.0),
)
Then in the OpenFAST .fst:
1 CompSoil - Compute soil-structural dynamics (switch) {1=SoilDyn}
"SiteA-Ref4MW_SoilDyn.dat" SoilFile
Reference paper
Bergua, R., Robertson, A., Jonkman, J., & Platt, A. (2021). “Specification Document for OC6 Phase II: Verification of an Advanced Soil-Structure Interaction Model for Offshore Wind Turbines”. NREL/TP-5000-79989. https://doi.org/10.2172/1811648
The OC6 Phase II project is the international validation effort that delivered the SoilDyn module to OpenFAST. Op3 should be benchmarked against the OC6 Phase II datasets for any publication-grade SSI claims.