|
2 | 2 |
|
3 | 3 | [](https://github.com/SMI-Lab-Inha/pyBModes/actions/workflows/ci.yml) |
4 | 4 | [](https://github.com/SMI-Lab-Inha/pyBModes/actions/workflows/validation.yml) |
5 | | -[](https://pybmodes.readthedocs.io/en/latest/) |
| 5 | +[](https://pybmodes.readthedocs.io/en/latest/) |
6 | 6 | [](https://anaconda.org/conda-forge/pybmodes) |
7 | 7 | [](https://www.python.org/downloads/) |
8 | 8 | [](LICENSE) |
9 | 9 |
|
10 | 10 | `pybmodes` is a pure-Python finite-element library for wind-turbine blade and tower modal analysis. It reads OpenFAST (ElastoDyn / SubDyn / HydroDyn / MoorDyn), BModes `.bmi`, and WISDEM / WindIO ontology YAML inputs; solves the coupled flap–lag–torsion–axial vibration modes with a 15-DOF Bernoulli-Euler beam element; and emits ElastoDyn-compatible mode-shape polynomials, MAC-tracked Campbell diagrams, and bundled Markdown / HTML / CSV reports. |
11 | 11 |
|
12 | | -Validated against the BModes Fortran reference solver on six benchmark cases (NREL 5MW land + OC3 monopile + OC3 Hywind floating spar, IEA-3.4-130-RWT, BModes CertTest 03 / 04) to **better than 0.01 %** on every comparison. As of 1.8.0 the dedicated [Validation workflow](https://github.com/SMI-Lab-Inha/pyBModes/actions/workflows/validation.yml) (weekly cron + `workflow_dispatch`) enforces the strict tolerance in CI for the cases whose external data is clonable from a public GitHub repository **at a manifest-pinned SHA**. Cloning is manifest-driven (`verify_external_data.py --clone`), so CI fetches and `--strict`-checks every **required** entry: the NREL 5MW family in [`OpenFAST/r-test`](https://github.com/OpenFAST/r-test), all four IEA Task-37 reference turbines ([`IEA-3.4-130-RWT`](https://github.com/IEAWindTask37/IEA-3.4-130-RWT), [`IEA-10.0-198-RWT`](https://github.com/IEAWindTask37/IEA-10.0-198-RWT), [`IEA-15-240-RWT`](https://github.com/IEAWindTask37/IEA-15-240-RWT), [`IEA-22-280-RWT`](https://github.com/IEAWindTask37/IEA-22-280-RWT)), and the [`WISDEM`](https://github.com/WISDEM/WISDEM) WindIO examples — a missing or off-pin required clone hard-fails the run. Only the `optional = true` entries (MoorPy / RAFT cross-reference clones) are left out of CI as maintainer-local checks. Publishing to PyPI is itself gated on a green run of this workflow for the tagged commit. The two BModes CertTest cases (Test03, Test04) depend on `external/BModes`, a NREL download not on GitHub; those tests skip cleanly when the data is absent and stay maintainer-local enforcement. The per-PR `ci.yml` continues to run the self-contained suite (synthetic + closed-form-referenced) and tolerates "no tests collected" on the integration step when the runner has no upstream data. See [`VALIDATION.md`](VALIDATION.md) for the full per-case matrix and [`external/MANIFEST.toml`](https://github.com/SMI-Lab-Inha/pyBModes/blob/master/external/MANIFEST.toml) for the manifest-pinned commit SHAs plus line-ending-normalized SHA-256 hashes for the text validation decks. |
| 12 | +Validated against the BModes Fortran reference solver on six benchmark cases (NREL 5MW land + OC3 monopile + OC3 Hywind floating spar, IEA-3.4-130-RWT, BModes CertTest 03 / 04) to **better than 0.01 %** on every comparison. As of 1.8.0 the dedicated [Validation workflow](https://github.com/SMI-Lab-Inha/pyBModes/actions/workflows/validation.yml) (weekly cron + `workflow_dispatch`) enforces the strict tolerance in CI for the cases whose external data is clonable from a public GitHub repository **at a manifest-pinned SHA**. Cloning is manifest-driven (`verify_external_data.py --clone`), so CI fetches and `--strict`-checks every **required** entry: the NREL 5MW family in [`OpenFAST/r-test`](https://github.com/OpenFAST/r-test), all four IEA Task-37 reference turbines ([`IEA-3.4-130-RWT`](https://github.com/IEAWindTask37/IEA-3.4-130-RWT), [`IEA-10.0-198-RWT`](https://github.com/IEAWindTask37/IEA-10.0-198-RWT), [`IEA-15-240-RWT`](https://github.com/IEAWindTask37/IEA-15-240-RWT), [`IEA-22-280-RWT`](https://github.com/IEAWindTask37/IEA-22-280-RWT)), and the [`WISDEM`](https://github.com/WISDEM/WISDEM) WindIO examples — a missing or off-pin required clone hard-fails the run. Only the `optional = true` entries (MoorPy / RAFT cross-reference clones) are left out of CI as maintainer-local checks. Publishing to PyPI is itself gated on a green run of this workflow for the tagged commit. The two BModes CertTest cases (Test03, Test04) depend on `external/BModes`, a NREL download not on GitHub; those tests skip cleanly when the data is absent and stay maintainer-local enforcement. The per-PR `ci.yml` continues to run the self-contained suite (synthetic + closed-form-referenced) and tolerates "no tests collected" on the integration step when the runner has no upstream data. See [`VALIDATION.md`](VALIDATION.md) for the full per-case matrix and [`external/MANIFEST.toml`](https://github.com/SMI-Lab-Inha/pyBModes/blob/main/external/MANIFEST.toml) for the manifest-pinned commit SHAs plus line-ending-normalized SHA-256 hashes for the text validation decks. |
13 | 13 |
|
14 | 14 | ## Documentation |
15 | 15 |
|
16 | | -Full documentation is published on [Read the Docs](https://pybmodes.readthedocs.io/en/latest/) (the status badge above shows whether that build is live); the table below links straight to the rendered pages. The source lives under [`docs/`](https://github.com/SMI-Lab-Inha/pyBModes/tree/master/docs) if you'd rather read it on GitHub, and you can build it offline (below). |
| 16 | +Full documentation is published on [Read the Docs](https://pybmodes.readthedocs.io/en/latest/) (the status badge above shows whether that build is live); the table below links straight to the rendered pages. The source lives under [`docs/`](https://github.com/SMI-Lab-Inha/pyBModes/tree/main/docs) if you'd rather read it on GitHub, and you can build it offline (below). |
17 | 17 |
|
18 | 18 | | Page | What's there | |
19 | 19 | | --- | --- | |
@@ -56,7 +56,7 @@ Or from conda-forge: |
56 | 56 | conda install -c conda-forge pybmodes |
57 | 57 | ``` |
58 | 58 |
|
59 | | -That installs the runtime core (`numpy` + `scipy`). Add an extra for optional features — `[plots]`, `[windio]`, `[notebook]`, `[docs]` (matrix below). For a source / editable checkout (contributors, or tracking `master`): |
| 59 | +That installs the runtime core (`numpy` + `scipy`). Add an extra for optional features — `[plots]`, `[windio]`, `[notebook]`, `[docs]` (matrix below). For a source / editable checkout (contributors, or tracking `main`): |
60 | 60 |
|
61 | 61 | ```bash |
62 | 62 | git clone https://github.com/SMI-Lab-Inha/pyBModes.git |
|
0 commit comments