GSL - GNU Scientific Library¶
GSL is an open-source numerical library, primarily for C and C++ use
The GSL library is available as a module on Apocrita. The library contains a wide variety of numerical routines including statistical, root finding, random numbers and sorting routines.
Using GSL¶
Compiling using GSL¶
GSL provides library objects and header files, along with a utility program to show the configuration of the installed library. On Apocrita GSL is provided both with and without an included CBLAS implementation.
To use a GSL routine in a C program it is necessary to use the appropriate
header file when compiling and to link against the library. The header
file will be named like gsl/gsl_category.h
where category
is the topic
of the required functions. For example, to use the function gsl_sf_zeta_int
to calculate the Riemann zeta function:
#include <stdio.h>
#include "gsl/gsl_sf_zeta.h"
int main (int argc, char *argv[]) {
printf("zeta for n=2: %17.16f\n", gsl_sf_zeta_int(2));
return 0;
}
The required header file is given in the documentation for the function.
GSL installations on Apocrita support using pkg-config
and gsl-config
to
indicate the compile and link options to pass to the compiler when building
code against GSL. For example, the output may look like:
$ module load gsl
$ gsl-config --cflags
-I<gsl_path>/include
$ gsl-config --libs
-L<gsl_path>/lib -lgsl -lgslcblas -lm
$ gsl-config --libs-without-cblas
-L<gsl_path>/lib -lgsl -lm
We recommend using gsl-config
to ensure that all library dependencies and
compilation flags are captured.
To put these values on the compilation command line one can use command substitution:
gcc my_gsl_using_program.c $(gsl-config --cflags --libs)
Using GSL with other programming languages¶
Although GSL is provided with a C programming interface compatible with C++, it is possible to use the library from other programming languages. Repositories for languages such as Python and R often include packages with interfaces for GSL and in Fortran the C API may be used either directly using the standard C interoperability features or indirectly using third-party libraries.
An interface for Fortran use is available on Apocrita, but interfacing libraries and packages are not currently installed system-wide on Apocrita for other languages.
Fortran¶
We have installed the FGSL wrappers on Apocrita. The available modules can be seen with the command
module avail fgsl
The FGSL wrappers provide a Fortran module file which means that you must choose a module suitable for use with the compiler you are using. The modules are set up to depend on a particular compiler module; you will have a module load conflict if trying to use an incompatible compiler module.
The module help fgsl/<version>
command shows the compatible compiler:
$ module help fgsl/1.3.0
-------------------------------------------------------------------
Module Specific Help for ...:
Adds fgsl (Intel) to your environment
Version 1.3.0
-------------------------------------------------------------------
With FGSL wrapping the GSL library, it is also necessary for the GSL library to be compatible. Again, the FGSL module is set up to automatically load a compatible GSL module and a conflict will arise if an incompatible GSL module was previously loaded. This also means that it is not necessary to load a GSL module in addition to an FGSL module to be able to use the wrappers and the underlying library.
The table below shows the currently installed module and its compatibility:
FGSL version | Compatible GSL version | Compatible compiler module |
---|---|---|
1.3.0 | 2.4 | intel/2018.3 |
Once the FGSL, GSL and compiler modules have been loaded, the Fortran
wrappers may be compiled using the options provided by pkg-config
. For
example, to compile with ifort
:
ifort my_fgsl_prog.f90 `pkg-config --libs --cflags gsl`
The FGSL implementation provides a module fgsl
which provides access to all
definitions:
use fgsl, only : fgsl_double
real(fgsl_double) x
end program
Documentation¶
- GSL HTML manual
gsl-config
has a man page available on Apocrita.