Retour

Utilisation de la libraire GNU Scientific Library

Télécharger et installer GSL

Il arrive très souvent que dans l'écriture de codes de calcul nous ayons besoin de routines hyper-classiques, du style inversion de matrice, calcul de valeurs propres, fonctions statistiques diverses, résolution d'EDO, etc. On peut s'amuser à développer sa propre librairie de routines. Mais cela prend du temps et n'est pas très efficace! On risque le bug et il n'est pas certain que le code produit soit optimisé.
En physique numérique, on préfère faire appel à des librairies déjà toutes faites: elles ont été testées par des milliers de personnes et leur code est optimisé. Bien sur, il y aura toujours des grincheux pour dire le contraire, mais bon!
Professionnellement, il est indispensable de bien connaître une ou même plusieurs librairies de calcul scientifique, généralistes ou spécialisées (FFT, algèbre linéaire par exemple). Il faut donc commencer par en choisir une et s'y investir. Pour nos applications "amateur", je vous propose de se consacrer à la librairie GNU Scientific Library. C'est un soft libre, comme son nom l'indique (et donc gratuit) et comme le veut la philosophie de ce site. On la doit pour l'essentiel à des physiciens de Los Alamos.
Je l'ai choisi dans sa version 1.8 car il existe un manuel papier (que vous trouverez sans problème sur Amazon ). En effet, la documentation est sans doute le plus important dans l'usage d'une librairie! En pratiquant, vous comprendrez vite ce que je veux dire...
J'ai aussi choisi de l'utiliser avec Dev Cpp. D'abord, parce qu'elle a été développée pour travailler en C. Ensuite, parce qu'il en existe un package pour Dev Cpp, d'installation très simple. Et enfin,parce qu'avec FORTRAN, j'utilise la librairie SLATEC (d'origine Sandia Labs), très semblable mais écrite en FORTRAN et assez pénible à utiliser en C.
Commençez donc par télécharger le package gsl-1.8 que j'ai placé sur le site. Puis installez-le sur votre PC, en double-cliquant sur l'icone et en suivant les instructions. Il faut bien sur que vous ayez installé Dev Cpp au préalable!

GSL en C/C++ avec DevCpp

Pour utiliser GSL dans un programme sous Dev Cpp, il faut modifier les options du projet. Vous allez donc dans Project/Project Options et vous remplissez les zones:

en supposant bien sur que vous ayez choisi les répertoires par défaut pour Dev-Cpp et GSL!
Voici un programme de calcul et de tracé d'une FFT d'un créneau sur 128 points, histoire de montrer la concision apportée par l'usage de librairies, ici GSL pour le calcul de la FFT et Dislin pour le graphique :


//******************************************************************************

// Calcul d'une FFT avec le librairie GSL

// Dominique Lefebvre TangenteX.com Novembre 2009

//******************************************************************************

#include <cstdlib>

#include <iostream>

#include <math.h>

#include <dislin_d.h>

#include <gsl\gsl_errno.h>

#include <gsl\gsl_fft_complex.h>

#define REAL(z,i) ((z)[2*(i)])

#define IMAG(z,i) ((z)[2*(i)+1])

#define N 128

using namespace std;

//******************************************************************************

//routines de service

//******************************************************************************

void InitGraphDislin(void)

{

metafl("XWIN");

disini();

pagera();

pagfll(255);

color("black");

winfnt("arial");

return;

}

//******************************************************************************

// programme principal

//******************************************************************************

int main(int argc, char *argv[])

{

int i; double data[2*N];

// Mise a 0 des tableaux;

for (i=0;i<N;i++)

{

REAL(data,i) = 0.0;

IMAG(data,i) = 0.0;

}

// Initialisation de la librairie graphique

InitGraphDislin();

wintit("FFT d'une impulsion");

graf(0, N-1, 0, 20,-0.5,2,-0.5,0.5);

titlin("Transformee de Fourier d'une impulsion",1);

title();

// Initialisation de la forme de l'impulsion

REAL(data,0) = 1.0;

for(i=1;i<=10;i++) REAL(data,i) = REAL(data,N-i) = 1.0;

// Tracé de l'impulsion

color("blue");

rlstrt(0,REAL(data,0)); // positionnement à l'origine

for(i=1;i<N;i++) rline(i-1,REAL(data,i-1),i,REAL(data,i));

// Calcul de la FFT

gsl_fft_complex_radix2_forward(data,1,N);

// Tracé de la FFT

color("red");

rlstrt(0,REAL(data,0)/sqrt(N)); // positionnement à l'origine

for(i=1;i<N;i++) rline(i-1,REAL(data,i-1)/sqrt(N),i,REAL(data,i)/sqrt(N));

disfin();

return EXIT_SUCCESS;

}

Le source du programme est disponible ici.

Pour compiler et linker le programme avec dislin, notez les points suivants:

Ce faisant, la compilation et le link devraient se passer sans problème! Si il y a un problème, revoir votre installation ou/et le type de variables utilisées.
Je vous laisse découvrir la puissance de GSL et dislin à travers ce programme ...


Contenu et design par Dominique Lefebvre - tangenteX.com novembre 2009 -- Vous pouvez me joindre par ou sur PhysiqueX

Licence Creative Commons

Cette œuvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 3.0 France .