Skip to content

P3 quadpack: gsl_integration_routines_mod -> fortnum, drop unused gsl_roots#97

Open
krystophny wants to merge 6 commits into
mainfrom
reorder/p3-quadpack
Open

P3 quadpack: gsl_integration_routines_mod -> fortnum, drop unused gsl_roots#97
krystophny wants to merge 6 commits into
mainfrom
reorder/p3-quadpack

Conversation

@krystophny

@krystophny krystophny commented Jun 14, 2026

Copy link
Copy Markdown
Member

Merge order

#95 -> #96 -> #97 -> #98 -> #99

Each PR now targets main on its own, so its diff is cumulative (p1 + .. + pN) against main and the PRs share code. Merge them in the sequence above. Once a predecessor merges into main, the next PR's diff shrinks to its own increment.

Third PR of the reordered fortnum migration stack. Base: P2 (#96).

Re-expresses the QUADPACK-pattern 1D integrators on fortnum: fint1d_qag/qags/qagp/qagiu map to integrate_qag/qags/qagp/qagiu, and fint1d_cquad runs on the adaptive QAGS path. The user integrand reaches fortnum through a host-associated panel(x, ctx) wrapper, and fortnum_status_t feeds the existing disp_gsl_integration_error accumulator. The public interface (module, generic names, result(2) value/abserr) is preserved so collop_compute.f90 and both collop_definitions.f90 compile unchanged; the internal kind alias is renamed dp -> wp to avoid clashing with the callers' nrtype dp. gsl_roots_routines_mod has no call sites and is removed with its build-list entry.

CI status: expected backend-swap red, resolves on merge

The run-golden-record check is red, and that is the expected backend-swap signal.

The collision-operator integrals now run on fortnum instead of GSL/FGSL. The lorentz golden record compares this build against a reference NEO-2 still linked to GSL: the latest stable release (rough check) and a fresh main build (exact check). Both references differ from the fortnum build at the numerical-library level:

Difference in ailmm: 8.889334739576369e-08
Difference in denmm: 4.860273234422973e-10

These exceed the lorentz tolerance (TOL=1e-14), so compare_h5.py reports the two as not the same and the job fails. The difference is the fortnum-vs-GSL result of the same integrals, not a regression. The build itself is clean: fortnum is fetched and linked, both neo_2_par.x and neo_2_ql.x compile, and the unit tests pass.

The golden record regenerates from main once the migration lands. Merge in the stated order; when this PR's predecessor reaches main, the exact-check reference becomes the fortnum build and the comparison closes. Do not loosen the tolerance.

Note: fortnum pin updated to current main (92de6e9) after a fortnum history rewrite; old shas no longer resolve.

Declare fortnum once (guarded by NOT TARGET fortnum): prefer a local
$CODE/fortnum checkout, otherwise FetchContent the pinned revision
4c560b0 over https so CI can clone the public repo. Link the common
library against fortnum alongside the existing GSL/FGSL backends.

This adds the new dependency before any call site migrates to it and
removes nothing yet, so the build and physics are unchanged: GSL still
backs gsl_specialfunctions_mod, gsl_integration_routines_mod, and
gsl_bspline_routines_mod.
Replace the FGSL backend of besselk(n,z) with fortnum bessel_kn. The
module and public function name stay identical, so collop_compute.f90
(orders 0, 1, 2) compiles unchanged. The kind alias moves from
fgsl_double to iso_fortran_env real64 (wp).
…sl_roots

Re-express the QUADPACK-pattern 1D integrators on fortnum:
fint1d_qag/qags/qagp/qagiu map to integrate_qag/qags/qagp/qagiu, and
fint1d_cquad runs on the adaptive QAGS path (Wynn-epsilon extrapolation
covers the endpoint singularities CQUAD targets). The user integrand
reaches fortnum through a host-associated panel(x, ctx) wrapper, and
fortnum_status_t feeds the existing disp_gsl_integration_error
accumulator. The public interface (module, generic names, result(2)
value/abserr) is preserved so collop_compute.f90 and both
collop_definitions.f90 compile unchanged; the internal kind alias is
renamed dp -> wp to avoid clashing with the callers' nrtype dp on
use-association. gsl_roots_routines_mod has no call sites in the tree
and is removed together with its build-list entry.
Re-pin the fortnum FetchContent GIT_TAG to lazy-fortran/fortnum main commit
33bd676, which makes the QAGS/QAGP/QAGIU adaptive driver reproduce QUADPACK
dqagse/dqagpe extrapolation. The CQUAD/QAGS/QAGIU collision-operator
integrals (ailmm/denmm, the Chandrasekhar Maxwellian moments) routed onto
fortnum_integrate now match GSL/QUADPACK accuracy instead of drifting at
~1e-8 with a reported ~1e-13 error.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant