Releases: itpplasma/libneo
Releases · itpplasma/libneo
v2026.04.13
Changes since v2025.11.25
Major features
- Chartmap coordinate system: VMEC-extended mode (cubic Hermite), VMEC-to-wall mode (STL boundary), coordinate conversion API, rho validation, wall matching, boundary parameterization, normal-offset boundary, real-Cartesian Boozer support (#153, #155, #156, #158, #159, #162, #165, #166, #167, #168, #169, #170, #174, #176, #178, #181, #182, #184, #186, #188, #189, #192, #194, #196, #239, #241, #242, #243, #244, #247, #249, #252, #253, #254, #261)
- GPU spline: Many-point batch API with OpenACC, CPU hot-path optimizations, derivative evaluation (#200, #219, #220, #221, #224, #227, #228)
- ODE integrator: Event detection, extracted as standalone library (#198, #256)
- EQDSK: R,Z to flux coordinate interpolation and Sphinx docs (#254)
Build / CI
- Nix flake for reproducible builds (#273)
- Automatic dependency fetching with ABI smoke tests (#206)
- Switch to GitHub-hosted CI runners (#246)
- Fix CI by mirroring map2disc to GitHub (MPCDF GitLab unreachable from Actions)
- Coils: split filaments at zero-current separators (#245)
Cleanup
- Remove JOREK field support from neo_field (#270)
- Remove dead minpack dependency (#262)
- Remove dead code: boozer.f90, solve_systems.f90, io.f90, gbpi_mod (#216, #218)
Bug fixes
- Fix interval clamping at x=xmax boundary (#220)
- Fix der2_rmix correctness (#228)
- Fix missing OpenACC preprocessor guards (#221)
- Fix boozer_coordinates_mod exports for SIMPLE v1.5.1 (#224)
- Fix GCC16 OpenACC benchmark illegal memory access (#213)
- Fix cyl_to_geoflux consistency with cached forward transform (#252)
- Fix spl_per recursive (#251)
- Fix chartmap derivative indexing (#180)
Testing
- Improve test coverage with meaningful non-tautological tests (#233, #234)
- Harden chartmap eval and odeint failure handling (#247)
- Chartmap derivative consistency and boundary validation tests (#182, #188)
Full changelog: v2025.11.25...v2026.04.13
v2025.11.25
Changes since v2025.07.30
Features
- ODE integrator: Context support for odeint_allroutines, trampoline elimination (#115, #120)
- Batch splines: Batch construction and evaluation for multiple quantities (#123)
- Coils: STELLOPT/MAKEGRID parser and tests, Aphi derivative fixes (#113, #124, #145), STELLOPT-to-biotsavart converter
- VMEC: Cylindrical conversion utilities and tests (#125, #128, #129)
- Geoflux coordinates: Add geoflux coordinate support (#131)
- Simpson integration: Add Simpson integration utility (#132)
- Vector potential: Anvac read/write, gauging routines, sign fix
Build / CI
- Make OpenMP optional
- Raise CMake minimum to 3.22 (#134)
- Add test toggle option (#133)
- Add automated test dashboard with PR support (#139)
- CI: run Python tests, harden imports, simplify dependency installation
- Remove coverage workflow (moved to Codacy)
Bug fixes
- Fix field_eq reinit and restore Boozer tests (#143)
- Fix coil Aphi derivatives (#145)
- Fix ntor0 field reconstruction (#147)
- Fix stretch_coords for arbitrary-size convexwall files (#112)
- Fix off-by-one error in linspace
- Fix sign error in gauged_Anvac_from_Bnvac
- Fix flaky test_jorek_field with deterministic seeds (#140)
Refactoring
- Standardize naming conventions for Nemov and vector potential routines
- Decouple VMEC wrappers from canonical helpers (#129)
- Unify test output directories (#142)
NEO-2 compatibility
Tagged in sync with NEO-2 v2025.11.25 for reproducible builds.
Full changelog: v2025.07.30...v2025.11.25
v1.0.0: VMEC refactor (#110)
### **PR Type**
Enhancement
___
### **Description**
• Refactored VMEC data processing code into modular structure with
multiple focused subroutines
• Created new module interfaces for MINPACK numerical optimization
library
• Enhanced VMEC allocation routines with proper error handling and
NetCDF file validation
• Added CMake build configuration for contrib libraries including RKF45
and MINPACK
• Improved code organization by wrapping standalone subroutines into
proper modules
• Fixed mathematical notation and cleaned up unused variables in MINPACK
code
• Added fallback logic for `rmajor` calculation and corrected `phi` sign
with TODO note
___
### **Changes walkthrough** 📝
<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Enhancement</strong></td><td><details><summary>3
files</summary><table>
<tr>
<td>
<details>
<summary><strong>spline_vmec_data.f90</strong><dd><code>VMEC data
processing refactor into modular structure</code>
</dd></summary>
<hr>
src/spline_vmec_data.f90
• Converted standalone subroutine to module structure with multiple
<br>subroutines<br> • Refactored large monolithic code into smaller,
focused <br>subroutines for better organization<br> • Added new
interpolation and <br>field computation subroutines for VMEC data
processing<br> • Improved code <br>modularity by separating spline
operations, coordinate <br>transformations, and field calculations
</details>
</td>
<td><a
href="https://github.com/itpplasma/libneo/pull/110/files#diff-ef8e0074cf383180eacbfea58fb7676cb506d4f38698f4e2b2742604e24816fe">+927/-781</a></td>
</tr>
<tr>
<td>
<details>
<summary><strong>vmecinm_m.f90</strong><dd><code>Refactor VMEC
subroutines into module with sign fix</code>
</dd></summary>
<hr>
src/vmecinm_m.f90
• Wrapped existing subroutines <code>vmecin</code> and
<code>stevvo</code> in a new module <br><code>vmecin_sub</code><br> •
Added local <code>pi</code> parameter definition and commented out
<br><code>math_constants</code> import<br> • Changed sign of
<code>phi</code> calculation from positive <br>to negative with TODO
comment<br> • Added fallback logic for <code>rmajor</code> when <br>it's
zero using <code>rmnc(1,0)</code><br> • Improved code formatting and
spacing <br>consistency
</details>
</td>
<td><a
href="https://github.com/itpplasma/libneo/pull/110/files#diff-8a547c66f446eb4a986391409ebdda7d8256b373e5439cbe02bb94499907534b">+136/-131</a></td>
</tr>
<tr>
<td>
<details>
<summary><strong>minpack_interfaces.f90</strong><dd><code>Add MINPACK
library interface declarations module</code>
</dd></summary>
<hr>
src/contrib/minpack_interfaces.f90
• Created new module <code>minpack_interfaces</code> with explicit
interface <br>declarations<br> • Defined interfaces for various MINPACK
numerical <br>optimization routines<br> • Includes interfaces for
functions like <code>enorm</code>, <br><code>dogleg</code>,
<code>fdjac1</code>, <code>hybrd</code>, <code>lmder</code>, etc.<br> •
All interfaces use proper Fortran <br>intent declarations for parameters
</details>
</td>
<td><a
href="https://github.com/itpplasma/libneo/pull/110/files#diff-e9bac5cedf472f1f00413329af7118ce0dab6ffcf2930fa0a354d6a1a5844a6b">+155/-0</a>
</td>
</tr>
</table></details></td></tr><tr><td><strong>Formatting</strong></td><td><details><summary>1
files</summary><table>
<tr>
<td>
<details>
<summary><strong>minpack.f90</strong><dd><code>Code cleanup and
documentation improvements in MINPACK</code>
</dd></summary>
<hr>
src/contrib/minpack.f90
• Updated mathematical notation in comments from Q' to Q^T for
<br>transpose operations<br> • Removed unused variable declarations
(<code>i</code>, <code>j</code>, <br><code>lwa</code>) to clean up
code<br> • Fixed comment typo changing "Powell's method" <br>to "Powell
method"<br> • Added missing newline at end of file
</details>
</td>
<td><a
href="https://github.com/itpplasma/libneo/pull/110/files#diff-0719ba66b06eb6b9dde9fe08e43f7c3b00f1846bc3dfdb5562a9d8eb56cbbcb2">+41/-49</a>
</td>
</tr>
</table></details></td></tr><tr><td><strong>Error
handling</strong></td><td><details><summary>1 files</summary><table>
<tr>
<td>
<details>
<summary><strong>new_vmec_allocation_stuff.f90</strong><dd><code>Enhance
VMEC allocation with error handling module</code>
</dd></summary>
<hr>
src/new_vmec_allocation_stuff.f90
• Wrapped existing subroutines in new module
<code>vmec_alloc_sub</code><br> • Added <br>explicit NetCDF file
existence checking with error handling<br> • Replaced
<br><code>nc_open</code> with direct <code>nf90_open</code> call for
better error control<br> • Added <br>proper error messages and
<code>error stop</code> for missing files<br> • Improved code
<br>formatting and added more comments
</details>
</td>
<td><a
href="https://github.com/itpplasma/libneo/pull/110/files#diff-5194824bccc4616b80fa97589af08fad69813ce65504859b6956fa644ca553ec">+39/-33</a>
</td>
</tr>
</table></details></td></tr><tr><td><strong>Configuration
changes</strong></td><td><details><summary>2 files</summary><table>
<tr>
<td>
<details>
<summary><strong>CMakeLists.txt</strong><dd><code>Add CMake build
configuration for contrib libraries</code>
</dd></summary>
<hr>
src/contrib/CMakeLists.txt
• Created new CMake configuration for contrib directory<br> • Added
RKF45 <br>library build from external source with LGPL license<br> •
Configured <br>CONTRIB library with minpack interfaces and
implementation<br> • Added <br>compiler-specific warning suppressions
for legacy minpack code
</details>
</td>
<td><a
href="https://github.com/itpplasma/libneo/pull/110/files#diff-184abe703a937b92a8a80a88db5b8bdbe6b57832a06fc1a92124f4bfd913a33d">+17/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>CMakeLists.txt</strong><dd><code>Include contrib
subdirectory in main build</code>
</dd></summary>
<hr>
CMakeLists.txt
• Added `src/contrib` subdirectory to the build system
</details>
</td>
<td><a
href="https://github.com/itpplasma/libneo/pull/110/files#diff-1e7de1ae2d059d21e1dd75d5812d5a34b0222cef273b7c3a2af62eb747f9d20a">+1/-0</a>
</td>
</tr>
</table></details></td></tr><tr><td><strong>Additional
files</strong></td><td><details><summary>1 files</summary><table>
<tr>
<td><strong>CMakeSources.in</strong></td>
<td><a
href="https://github.com/itpplasma/libneo/pull/110/files#diff-57f249c75b1b84ad15fd6cf875a7960543824832ae3e9ac70336eb7038f6ff1a">+0/-6</a>
</td>
</tr>
</table></details></td></tr></tr></tbody></table>
___
> <details> <summary> Need help?</summary><li>Type <code>/help how to
...</code> in the comments thread for any questions about Qodo Merge
usage.</li><li>Check out the <a
href="https://qodo-merge-docs.qodo.ai/usage-guide/">documentation</a>
for more information.</li></details>