Fortran port (stub) of the Bessels.jl repository
Building
Currently available functions are in the bessel_constants
module:
besselj0(x)
besselj1(x)
besselj(nu, x)
bessely0(x)
bessely1(x)
besselk0(x)
besselk1(x)
besseli0(x)
besseli1(x)
gamma_BK(x)
Not yet implemented:
bessely(nu, x)
besseli(nu, x)
besselk(nu, x)
besselh(nu, k, x)
hankelh1(nu, x)
hankelh2(nu, x)
sphericalbesselj(nu, x)
sphericalbessely(nu, x)
Bessels.sphericalbesseli(nu, x)
Bessels.sphericalbesselk(nu, x)
airyai(x)
airyaiprime(x)
airybi(x)
airybiprime(x)
A simple build can be achieved by running:
gfortran -ffree-line-length-none -O3 -march=native -ffast-math src/3rd_party/ribesl.f src/3rd_party/rkbesl.f src/bessels_constants.f90 src/bessels.f90 test/bessels_test.f90 -o bessels_test.exe
These are the results of a sample performance test on an M1 Mac with gfortran 12.1.0. For the functions where an intrinsic Fortran equivalent is available, the intrinsic version is compared against. For all others, the netlib specfun package is employed, in the current refactoring by Scivision.
[bessel_j0] INTRINSIC time used: 37.5113 ns/eval, sum(z)=9476.3324505667606
[bessel_j0] PACKAGE time used: 17.8369 ns/eval, sum(z)=9476.3324505666478
[bessel_j1] INTRINSIC time used: 36.7986 ns/eval, sum(z)=-284.46168826127564
[bessel_j1] PACKAGE time used: 17.8452 ns/eval, sum(z)=-284.46168826129275
[bessel_y0] INTRINSIC time used: 28.4847 ns/eval, sum(z)=1376.4176554633455
[bessel_y0] PACKAGE time used: 18.0247 ns/eval, sum(z)=1376.4176554633682
[bessel_y1] INTRINSIC time used: 28.5509 ns/eval, sum(z)=-33903.574400809193
[bessel_y1] PACKAGE time used: 17.9210 ns/eval, sum(z)=-33903.574400809302
[bessel_k0] NETLIB time used: 44.2205 ns/eval, sum(z)=168876.38538504631
[bessel_k0] PACKAGE time used: 6.0067 ns/eval, sum(z)=168876.38538504628
[bessel_k1] NETLIB time used: 27.2245 ns/eval, sum(z)=29117.807091784642
[bessel_k1] PACKAGE time used: 5.9314 ns/eval, sum(z)=448921.45244578301
[bessel_i0] NETLIB time used: 1962.9280 ns/eval, sum(z)=0.95961921716826134E+263
[bessel_i0] PACKAGE time used: 10.3035 ns/eval, sum(z)=0.95961921716826120E+263
[bessel_i1] NETLIB time used: 479.3809 ns/eval, sum(z)=0.11073899685120145E+48
[bessel_i1] PACKAGE time used: 10.4763 ns/eval, sum(z)=0.11017821571878319E+48
[gamma] INTRINSIC time used: 37.9529 ns/eval, sum(z)=0.14440233357737784E+68
[gamma] PACKAGE time used: 26.1333 ns/eval, sum(z)=0.14440233357737787E+68
this package is approximately 2x faster than gcc's intrinsic function. For the non-fortran-intrinsic functions, this package is ludicrously faster than the netlib counterpart!