Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/code_review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ body:
attributes:
label: Review scope
description: Branch, tag, or commit SHA the review was done against.
placeholder: "e.g. master @ b41a05c, dev @ 8af258e"
placeholder: "e.g. main @ b41a05c, dev @ 8af258e"
validations:
required: true

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: CI

on:
push:
branches: [master, main]
branches: [main, dev]
pull_request:

jobs:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ on:
workflow_dispatch:
inputs:
ref:
description: "Branch / tag / SHA to test (default: master)"
description: "Branch / tag / SHA to test (default: main)"
required: false
default: "master"
default: "main"

permissions:
contents: read
Expand Down
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,21 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

## [Unreleased]

(nothing yet)

## [1.19.1] — 2026-10-21

### Changed

- **The default branch is now `main`**, renamed from `master`, with
development happening on `dev`. Existing `master` links on GitHub
redirect, but a local clone that tracks `master` should run
`git branch -m master main && git fetch && git branch -u origin/main main`.
- **The documentation badge displays again** on GitHub and PyPI. It
pointed at Read the Docs' legacy badge endpoint, which rate-limits the
image proxies both sites fetch README images through (HTTP 429), so it
rendered as a broken image. It is now served through shields.io.

### Fixed

- **The sparse solver path dropped negative modes.** Above 500 DOF a
Expand Down
4 changes: 2 additions & 2 deletions CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ authors:
email: jaehoon.seo@inha.ac.kr
affiliation: "Marine Structural Mechanics and Integrity Lab (SMI Lab), Inha University"
orcid: "https://orcid.org/0000-0003-1047-2119"
version: 1.19.0
date-released: "2026-09-30"
version: 1.19.1
date-released: "2026-10-21"
license: Apache-2.0
repository-code: "https://github.com/SMI-Lab-Inha/pyBModes"
url: "https://github.com/SMI-Lab-Inha/pyBModes"
Expand Down
8 changes: 4 additions & 4 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ pip install -e ".[dev,plots]"
pytest
```

The default `pytest` run uses only self-contained tests (synthetic decks + closed-form references). The `integration` marker gates tests that need upstream OpenFAST / BModes data; place those clones under `external/` (gitignored). See [installation](https://github.com/SMI-Lab-Inha/pyBModes/blob/master/docs/installation.rst) for the full Windows + conda quickstart.
The default `pytest` run uses only self-contained tests (synthetic decks + closed-form references). The `integration` marker gates tests that need upstream OpenFAST / BModes data; place those clones under `external/` (gitignored). See [installation](https://github.com/SMI-Lab-Inha/pyBModes/blob/main/docs/installation.rst) for the full Windows + conda quickstart.

## Ground rules

Expand Down Expand Up @@ -51,7 +51,7 @@ pip install pre-commit
pre-commit install
```

This runs ruff (auto-fix), the standard hygiene hooks (trailing-whitespace, end-of-file-fixer, YAML / TOML validation, large-file guard, merge-conflict marker check), `codespell`, and `insert-license` — which inserts the Apache 2.0 boilerplate header into any new `.py` file under `src/pybmodes/`, `scripts/`, `cases/`, or `noxfile.py` that doesn't already have it (template at [`.license_header.txt`](https://github.com/SMI-Lab-Inha/pyBModes/blob/master/.license_header.txt)). To run manually:
This runs ruff (auto-fix), the standard hygiene hooks (trailing-whitespace, end-of-file-fixer, YAML / TOML validation, large-file guard, merge-conflict marker check), `codespell`, and `insert-license` — which inserts the Apache 2.0 boilerplate header into any new `.py` file under `src/pybmodes/`, `scripts/`, `cases/`, or `noxfile.py` that doesn't already have it (template at [`.license_header.txt`](https://github.com/SMI-Lab-Inha/pyBModes/blob/main/.license_header.txt)). To run manually:

```bash
pre-commit run --all-files
Expand Down Expand Up @@ -114,8 +114,8 @@ For maintainers, the full pre-tag sequence is in [`https://pybmodes.readthedocs.

## Reporting issues

Open a [GitHub issue](https://github.com/SMI-Lab-Inha/pyBModes/issues). For security-sensitive reports, see [`SECURITY.md`](https://github.com/SMI-Lab-Inha/pyBModes/blob/master/SECURITY.md).
Open a [GitHub issue](https://github.com/SMI-Lab-Inha/pyBModes/issues). For security-sensitive reports, see [`SECURITY.md`](https://github.com/SMI-Lab-Inha/pyBModes/blob/main/SECURITY.md).

## Code of conduct

This project follows the [Contributor Covenant](https://github.com/SMI-Lab-Inha/pyBModes/blob/master/CODE_OF_CONDUCT.md).
This project follows the [Contributor Covenant](https://github.com/SMI-Lab-Inha/pyBModes/blob/main/CODE_OF_CONDUCT.md).
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,18 @@

[![CI](https://github.com/SMI-Lab-Inha/pyBModes/actions/workflows/ci.yml/badge.svg)](https://github.com/SMI-Lab-Inha/pyBModes/actions/workflows/ci.yml)
[![Validation](https://github.com/SMI-Lab-Inha/pyBModes/actions/workflows/validation.yml/badge.svg)](https://github.com/SMI-Lab-Inha/pyBModes/actions/workflows/validation.yml)
[![Docs](https://readthedocs.org/projects/pybmodes/badge/?version=latest)](https://pybmodes.readthedocs.io/en/latest/)
[![Docs](https://img.shields.io/readthedocs/pybmodes/latest?label=docs)](https://pybmodes.readthedocs.io/en/latest/)
[![conda-forge](https://img.shields.io/conda/vn/conda-forge/pybmodes.svg)](https://anaconda.org/conda-forge/pybmodes)
[![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-blue.svg)](https://www.python.org/downloads/)
[![License: Apache 2.0](https://img.shields.io/badge/license-Apache%202.0-green.svg)](LICENSE)

`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.

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.
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.

## Documentation

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).
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).

| Page | What's there |
| --- | --- |
Expand Down Expand Up @@ -56,7 +56,7 @@ Or from conda-forge:
conda install -c conda-forge pybmodes
```

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`):
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`):

```bash
git clone https://github.com/SMI-Lab-Inha/pyBModes.git
Expand Down
Loading
Loading