ARPACK

De Wiki de Calcul Québec
Aller à : Navigation, rechercher
Autres langues :anglais 100% • ‎français 100%

Description

ARPACK (Arnoldi Package) est une bibliothèque mathématique regroupant un ensemble de fonctions pour résoudre des problèmes aux valeurs propres de très grandes tailles. Cette bibliothèque permet de ne calculer que certaines valeurs propres et les vecteurs propres correspondants. Il est particulièrement utile pour les systèmes impliquant des matrices creuses de très grande taille. Les fonctions sont bâties sur une variante du processus d'Arnoldi appelée Méthode de Lanczos à redémarrage implicite.

La bibliothèque Arpack fut originalement écrite en Fortran 77, cependant, on retrouve une interface C++ appelée Arpack++. De base, Arpack opère de façon série (un peu de multithreading est possible via BLAS), toutefois, il existe une version parallèle bâtie sur MPI: Parpack. Elle permet d'utiliser plusieurs nœuds. Cette bibliothèque offre une version parallèle de toute les fonctions de base de Arpack.

Un guide pour les utilisateurs est disponible en ligne sur le site de Rice University. La bibliothèque est bâtie sur LAPACK et BLAS. Il est donc possible d'utiliser des versions optimisées de ces bibliothèques afin d'accélérer le calcul. Afin, d'obtenir certaines fonctionalité supplémentaires avec Arpack++, il est utile de préinstaller SuperLU et UMFPACK.

Exemples

Voici un petit exemple d'utilisation d'Arpack en Fortran où l'on veut calculer les deux premières valeurs propres et les vecteurs propres correspondant pour une matrice 3x3.


Fichier : ex_arpack.f90
!****************************************************************
!*********     MODULE DE TRANSPORT DE LA MATRICE        *********
!****************************************************************
MODULE GENERAL
REAL(KIND=8) :: MATRICE(3,3)
END MODULE GENERAL
!****************************************************************
 
 
!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 
!****************************************************************
!***************      PROGRAMME PRINCIPAL      ******************
!****************************************************************
PROGRAM EX_ARPACK
 
 
!--------------------------------
!DECLARATION DES VARIABLES
!--------------------------------
USE GENERAL
IMPLICIT NONE
INTEGER :: IDO=0, N=3, NEV=2, NCV=3, LDV=3
INTEGER :: IPARAM(11)=0, LWORKL, INFO=0
INTEGER :: IPNTR(11)=0, POURSUITE=1
INTEGER :: LDZ=3
LOGICAL :: SELECTION(3)
REAL(KIND=8) :: TOL=0D0, RESID(3), V(3,3)
REAL(KIND=8) :: WORKD(9), WORKL(81)
REAL(KIND=8) :: Z(3,2), D(2), SIGMA
!---------------------------------
 
 
!---------------------------------
!ENTREE DE LA MATRICE
!---------------------------------
MATRICE=0D0
MATRICE(1,1)=2D0
MATRICE(1,3)=1D0
MATRICE(2,2)=1D0
MATRICE(3,1)=1D0
MATRICE(3,3)=2D0
!----------------------------------
 
 
!----------------------------------
!CALCULS VALEURS ET VECTEURS PROPRES
!----------------------------------
IPARAM(1)=1  
IPARAM(3)=25
IPARAM(7)=1
LWORKL=9+72
DO WHILE (POURSUITE==1) 
   CALL DSAUPD(IDO,'I',N,'SM',NEV,TOL,RESID,NCV,V, &
        & LDV, IPARAM, IPNTR, WORKD, WORKL, LWORKL, INFO)
   IF (IDO==1 .OR. IDO==-1) THEN
      CALL MAT_VEC(WORKD(IPNTR(1)),WORKD(IPNTR(2)))
   ELSE IF (IDO==99) THEN
      POURSUITE=0
   END IF
END DO
!------------------------------------
 
 
!------------------------------------
!POST PROCESSING AVEC DSEUPD
!------------------------------------
CALL DSEUPD(.TRUE.,'A',SELECTION,D,Z,LDZ,SIGMA, &
     & 'I', N, 'SM', NEV, TOL, RESID, NCV, V, &
     & LDV, IPARAM, IPNTR, WORKD, WORKL, LWORKL, INFO)
!------------------------------------
!****************************************************************
 
 
!****************************************************************
!**************        AFFICHAGE DES RESULTATS       ************
!****************************************************************
PRINT*, '#1 : '
PRINT*, '    VALEUR PROPRE -> ', D(1)
PRINT*, '    VECTEUR PROPRE -> ', Z(:,1)
PRINT*, '#2 : '
PRINT*, '    VALEUR PROPRE -> ', D(2)
PRINT*, '    VECTEUR PROPRE -> ', Z(:,2)
!****************************************************************
 
 
!****************************************************************
!******************      FIN DU PROGRAMME       *****************
!****************************************************************
END PROGRAM EX_ARPACK
!****************************************************************
 
 
!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
!****************************************************************
!*******     MULTIPLICATION MATRICE - VECTEUR        ************
!****************************************************************
!CALCUL DE {Y}=[A]*{X}
SUBROUTINE MAT_VEC(X,Y)
!--------------------------------------------
 
!--------------------------------------------
!DECLARATION DES VARIABLES
!--------------------------------------------
USE GENERAL
IMPLICIT NONE
INTEGER :: I, J
REAL(KIND=8) :: X(3), Y(3)
!--------------------------------------------
 
!--------------------------------------------
!MULTIPLICATION MATRICE - VECT.
!--------------------------------------------
Y=0D0
DO I=1,3
   DO J=1,3
      Y(I)=Y(I)+MATRICE(I,J)*X(J)
   END DO
END DO
!--------------------------------------------
 
!--------------------------------------------
!FIN DE LA SOUS-ROUTINE
!--------------------------------------------
END SUBROUTINE
!--------------------------------------------
!****************************************************************


Cet exemple peut se compiler aisément. Par exemple, si vous utilisez Lapack et Blas de la bibliothèque Math Kernel Library, la compilation pourra se faire avec le compilateur Fortran d'Intel de cette façon:

[nom@serveur $] 
ifort ex_arpack.f90 -larpack -lmkl_lapack95_lp64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm


Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Ressources de Calcul Québec
Outils
Partager