Skip to content
Snippets Groups Projects
gsl.md 4.53 KiB
Newer Older
  • Learn to ignore specific revisions
  • Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    GSL
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ===
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    The GNU Scientific Library. Provides a wide range of mathematical routines.
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    Introduction
    ------------
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    The GNU Scientific Library (GSL) provides a wide range of mathematical routines such as random number generators, special functions and least-squares fitting. There are over 1000 functions in total. The routines have been written from scratch in C, and present a modern Applications Programming Interface (API) for C programmers, allowing wrappers to be written for very high level languages.
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    The library covers a wide range of topics in numerical computing. Routines are available for the following areas:
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
                               Complex Numbers          	Roots of Polynomials
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
                               Special Functions        	Vectors and Matrices
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
                               Permutations            	Combinations
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
                               Sorting                  	BLAS Support
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
                               Linear Algebra           	CBLAS Library
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
                               Fast Fourier Transforms  	Eigensystems
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
                               Random Numbers           	Quadrature
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
                               Random Distributions     	Quasi-Random Sequences
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
                               Histograms               	Statistics
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
                               Monte Carlo Integration  	N-Tuples
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
                               Differential Equations   	Simulated Annealing
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
                               Numerical Differentiation    Interpolation
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
                               Series Acceleration      	Chebyshev Approximations
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
                               Root-Finding             	Discrete Hankel Transforms
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
                               Least-Squares Fitting    	Minimization
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
                               IEEE Floating-Point      	Physical Constants
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
                               Basis Splines            	Wavelets
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    Modules
    -------
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    The GSL 1.16 is available on Anselm, compiled for GNU and Intel compiler. These variants are available via modules:
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    |Module|Compiler|
    |---|---|
    |  gsl/1.16-gcc|gcc 4.8.6|
    |gsl/1.16-icc(default)|icc|
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```bash
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
         $ module load gsl
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    The module sets up environment variables, required for linking and running GSL enabled applications. This particular command loads the default module, which is gsl/1.16-icc
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    Linking
    -------
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    Load an appropriate gsl module. Link using **-lgsl** switch to link your code against GSL. The GSL depends on cblas API to BLAS library, which must be supplied for linking. The BLAS may be provided, for example from the MKL library, as well as from the BLAS GSL library (-lgslcblas). Using the MKL is recommended.
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    ### Compiling and linking with Intel compilers
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```bash
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        $ module load intel
        $ module load gsl
        $ icc myprog.c -o myprog.x -Wl,-rpath=$LIBRARY_PATH -mkl -lgsl
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    ### Compiling and linking with GNU compilers
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```bash
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        $ module load gcc
        $ module load mkl
        $ module load gsl/1.16-gcc
        $ gcc myprog.c -o myprog.x -Wl,-rpath=$LIBRARY_PATH -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lgsl
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    Example
    -------
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    Following is an example of discrete wavelet transform implemented by GSL:
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```cpp
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        #include <stdio.h>
        #include <math.h>
        #include <gsl/gsl_sort.h>
        #include <gsl/gsl_wavelet.h>
    
        int
        main (int argc, char **argv)
        {
          int i, n = 256, nc = 20;
          double *data = malloc (n * sizeof (double));
          double *abscoeff = malloc (n * sizeof (double));
          size_t *p = malloc (n * sizeof (size_t));
    
          gsl_wavelet *w;
          gsl_wavelet_workspace *work;
    
          w = gsl_wavelet_alloc (gsl_wavelet_daubechies, 4);
          work = gsl_wavelet_workspace_alloc (n);
    
          for (i=0; i<n; i++)
          data[i] = sin (3.141592654*(double)i/256.0);
    
          gsl_wavelet_transform_forward (w, data, 1, n, work);
    
          for (i = 0; i < n; i++)
            {
              abscoeff[i] = fabs (data[i]);
            }
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
          gsl_sort_index (p, abscoeff, 1, n);
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
          for (i = 0; (i + nc) < n; i++)
            data[p[i]] = 0;
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
          gsl_wavelet_transform_inverse (w, data, 1, n, work);
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
          for (i = 0; i < n; i++)
            {
              printf ("%gn", data[i]);
            }
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
          gsl_wavelet_free (w);
          gsl_wavelet_workspace_free (work);
    
          free (data);
          free (abscoeff);
          free (p);
          return 0;
        }
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    Load modules and compile:
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```bash
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        $ module load intel gsl
        icc dwt.c -o dwt.x -Wl,-rpath=$LIBRARY_PATH -mkl -lgsl
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    ```
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    
    In this example, we compile the dwt.c code using the Intel compiler and link it to the MKL and GSL library, note the -mkl and -lgsl options. The library search path is compiled in, so that no modules are necessary to run the code.