- smoke test comparing dry/wet equilibrium calculation against PyPartMC (thanks zdaq12)
- avoiding divide-by-zero warnings in `EffectiveRadius` product
- fix physical unit in size-spectrum products (thanks sajjadazimi)
- better array-valued argument handling in `Formulae` methods using `numba.vectorize` (thanks claresinger)
- new method: `Builder::replace_dynamic()` (edejong-caltech)
- handling NVRTC_PATH env var to point ThrustRTC to non-standard location of nVidia libs (abulenok)
- new backend methods: `min_pair`, `divide_if_not_zero` (edejong-caltech)
- GPU support for freezing
- 3D displacement incl. GPU support (abulenok)
- Straub fragmentation function (edejong-caltech)
- breakup algorithm improvements incl. reworked limiter logic, `fragment_size` instead of `min_volume`, fragmentation function updates (edejong-caltech)
- backends: fixed `__init__` calls in multiple-inheritance contexts
- FakeThrust fixes to better match ThrustRTC API (abulenok)
- make formulae available at attribute mapper scope so `request_attribute` can be called without constraints
- storage, attribute, mesh common code: improved test coverage, cleanups, docstrings (abulenok!)
- multi-stage Github Actions workflow (pylint, no-numba unit tests, etc first, only then run all the tests
- updates to make the code clean with newer versions of pylint
- new tests for displacement, freezing, breakup, mesh, builder, formulae and storage logic