Skip to content

perazz/fortran-bessels

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

45 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

fortran-bessels

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!

Releases

No releases published

Packages

No packages published