Changelog#

The changes of each version, from the file CHANGELOG.md of the repository:

# Changelog

The dates of the released versions are those of their tagged commits.

## 0.5.0 (2026-10-26)

### Breaking

- The shape functions renamed from `N` to `S`, as in bfsccylinder; the
  results are unchanged. Old and new public names of `BFSCPlate2D`:
  - attributes `Nu`, `Nu_x`, `Nu_y`, `Nv`, `Nv_x`, `Nv_y`, `Nw`, `Nw_x`,
    `Nw_y` renamed `Su`, `Su_x`, `Su_y`, `Sv`, `Sv_x`, `Sv_y`, `Sw`, `Sw_x`,
    `Sw_y`;
  - methods `update_Nu`, `update_Nu_x`, `update_Nu_y`, `update_Nv`,
    `update_Nv_x`, `update_Nv_y`, `update_Nw`, `update_Nw_x`, `update_Nw_y`
    renamed `update_Su`, `update_Su_x`, `update_Su_y`, `update_Sv`,
    `update_Sv_x`, `update_Sv_y`, `update_Sw`, `update_Sw_x`,
    `update_Sw_y`.

### Python versions

- Python 3.9 is no longer supported, it reached its end of life in October 2025: Python 3.10 or newer is required, and the tests and wheels cover Python 3.10 to 3.14.

### Packaging

- Packaging: the metadata, with the version, in `pyproject.toml` (PEP 621), built with `setuptools>=77` and Cython; `setup.py` keeps only the Cython extension with the compiler flags and writes `bfscplate2d/version.py` from `pyproject.toml`. NumPy and wheel are no longer build requirements, and README.md and LICENSE are no longer installed in the root of the Python environment (`data_files`); the license is in the wheel metadata.

### New: follower pressure

- `update_fext_follower` and `update_KCfollower`, with the module constant
  `KCfollower_SPARSE_SIZE = 1056` and the element attribute
  `init_k_KCfollower`: the force vector and the unsymmetric load stiffness
  matrix of a pressure normal to the deformed mid-surface, with the area
  vector truncated to first order (`quadratic=0`) or complete
  (`quadratic=1`), and the dead part optional (`reference`). The kernels
  are written by `deriving_equations/derive_bfscplate2d_follower_pressure.py`
  and kept in sync by `regenerate.py`. New `tests/test_follower_pressure.py`.
- The Notes of `update_KCfollower` state the conditions under which the
  load stiffness matrix of the first-order area vector is symmetric, for
  the element matrix and for the assembled matrix.

### Bug fixes

- `BFSCPlate2D.__init__` sets `init_k_KCNL`, which a second call of the
  constructor left at its previous value. New test that the constructor
  sets every `init_k_*` to zero.

### Documentation

- The documentation is built by the workflow `auto_doc.yml` for every pull request and deployed to the
  `gh-pages` branch for every tag (or a manual run), with the packages of `requirements_doc.txt`.
- D1: functional docstrings of the modules, of `BFSCPlate2D` and of every
  public function.
- D2: Notes and References of the theory: Hermite interpolation of the
  BFSC element, classical laminated plate theory with the von Karman
  strains, the element matrices, the internal forces and the quadrature.
- D3: Sphinx documentation in `doc/`, with a user guide (the element,
  assembling a model, the analyses, the follower pressure) and usage
  examples `ex_*.rst` with the code of the tests.
- Solving with structsolve: the callables of `structsolve.Analysis` for an
  element loop, the boundary conditions, the follower pressure and the
  convergence criterion, in `analyses.rst` and
  `ex_structsolve_nonlinear.rst`.
- The shape functions are written `\boldsymbol{S}^u`, `\boldsymbol{S}^v`,
  `\boldsymbol{S}^w` and their derivatives, e.g. `\boldsymbol{S}^w_{,x}`,
  as in pyfe3d.
- Notation of the book in the math of the docstrings, the user guide and
  the test docstrings: vectors bold lower case without braces, e.g.
  `\boldsymbol{u}_e` (was `\{u_e\}`), the force vectors and the residual
  upper case, `\boldsymbol{F}_{int}`, `\boldsymbol{F}_{ext}` (were
  `\{f_{int}\}`, `\{f\}`), `\boldsymbol{F}_p`, `\boldsymbol{R}`; matrices
  bold upper case without brackets, e.g. `\boldsymbol{B}_m`,
  `\boldsymbol{K}_{C0}`, `\boldsymbol{K}_{CNL} + \boldsymbol{K}_{GNL}`,
  `\boldsymbol{K}_G` (were `[B_m]`, `[KC0]`, `[KCNL]`, `[KG]`), the matrix
  KCNL of `update_KCNL` being the book's nonlinear constitutive stiffness
  matrix `\boldsymbol{K}_{CNL}`, of the terms of `\boldsymbol{B}_{NL}`, plus
  the geometric term `\boldsymbol{K}_{GNL}` (KGLL in the code) of the
  membrane forces of the nonlinear strains; the operator of the nonlinear strains
  `\boldsymbol{B}_{NL}` (was `[B_{mL}]`, `BmL` in the code); the load
  stiffness matrix of `update_KCfollower` `\boldsymbol{K}_F` (was
  `[KCfollower]`), with `\boldsymbol{K}_F = \lambda
  \boldsymbol{K}_{F_{ref}}` for the pressure `\lambda p`; `\boldsymbol`
  (was `\mathbf`) and the transpose `^\top` (was `^T`). The residual is
  `\boldsymbol{R} = \boldsymbol{F}_{int} - \boldsymbol{F}_{ext}` throughout,
  also in the Notes of `update_fint`, and the examples with structsolve
  require structsolve 0.9.3 or newer, which has this residual and the
  Newton-Raphson corrections `\boldsymbol{K}_T \Delta \boldsymbol{c} =
  -\boldsymbol{R}`. The docstring of
  `derive_bfscplate2d_follower_pressure.py`, which contains a backslash, is
  a raw string. Code identifiers, plain-text comments and README.md are
  unchanged.

### Derivations

- The shape functions of the scripts of `deriving_equations/` renamed from
  `N` to `S`, with the local variables `Su1_01`, ..., `Sw3_40` (were
  `Nu1_01`, ..., `Nw3_40`) of `update_fext_follower` and
  `update_KCfollower`.
- An underscore introduces a partial derivative: the displacement
  gradients of `update_fext_follower`, `update_KCfollower`, their
  derivation script and the tests are `u_x`, `u_y`, `v_x`, `v_y`, `w_x`,
  `w_y` (were `ux`, ..., `wy`).
- `regenerate.py` looks for the operators `Su`, `Sv`, `Sw` (no longer `Nu`,
  `Nv`, `Nw`) and the gradients `u_x`, ..., `w_y`, and does not take the
  slopes `w_x = Matrix(...)` printed by the derivation of `update_KCNL` for
  generated gradients.

### Tests

- `structsolve>=0.9.3`, with its module `structsolve.convergence`, is a
  requirement of the tests, listed in
  `requirements.txt` and not in `install_requires`.
- `tests/test_static_axial_load_nonlinear.py` solves the non-linear static
  analysis with `structsolve.Analysis` instead of hand-written
  Newton-Raphson iterations, with the same reference values.
- New `tests/test_follower_pressure_structsolve.py`: the follower pressure
  on a cantilever with `structsolve.Analysis`, against the reference values
  of panels.
- `structsolve.lb` and `structsolve.freq` cross-check the solutions of
  `tests/test_linear_buckling_iso_SSSS.py` and
  `tests/test_natural_frequency.py`.

## 0.4.1 (2026-10-22)

- Build flags for speed: OpenMP removed, since no module uses `prange`;
  `-O3 -fno-math-errno` for GCC and Clang and `/O2` for MSVC; Cython line
  tracing only when `CYTHON_TRACE` is requested, with the C++ files
  regenerated when the trace mode changes; `initializedcheck=False`.

## 0.4.0 (2026-09-21)

- Fixed the tangent stiffness matrix and the internal force vector of the
  non-linear analyses, such that `KC0 + KCNL + KG` is the derivative of
  `fint`; the kernels are regenerated after the fixes of the derivations.
- Fixed and expanded non-linear tests, with the new
  `tests/test_tangent_consistency.py`.
- Python 3.13 and 3.14 support; updated versions of the GitHub actions.

## 0.3.1 (2024-09-25)

- Fixed the compatibility with integer numbers.
- New GitHub actions and deployment script.
- `tests/test_natural_frequency.py` uses `subset_by_index` of
  `scipy.linalg.eigh`.

## 0.3.0 (2023-04-12)

- Removed the dependency on the NumPy C API, improving the compatibility.
- Fixed an issue with the integer types `long` and `long long`.
- Updated workflows; the old continuous integration removed.

## 0.2.1 (2021-11-10)

- License updated to the 3-clause BSD license.

## 0.2.0 (2021-11-01)

- Geometrically non-linear analyses: `update_KCNL` and `update_fint`.

## 0.1.9 (2021-09-27)

- `update_KG_cte_N`, the geometric stiffness matrix of constant membrane
  forces `Nxx`, `Nyy` and `Nxy`, with a new test.
- Newer Python versions, faster tests and automated releases.

## 0.1.7 (2020-08-21)

- First tagged version, after the commit `REL: Version 0.1.0` of the same
  day: the BFSC plate element `BFSCPlate2D`, with `update_KC0`,
  `update_KG` and `update_M`, and the Gauss-Legendre points and weights of
  `bfscplate2d.quadrature`.