IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Les notions de base du Fortran

Support de cours


précédentsommairesuivant

6. Tableaux

6-1. Déclaration

Un tableau est un ensemble d'éléments de même type contigus en mémoire.

Pour déclarer un tableau, il est recommandé d'utiliser l'attribut DIMENSION :

 
Sélectionnez
TYPE, DIMENSION(expr1,...,exprn) :: liste tab

avec :

  • kitxmlcodeinlinelatexdvpn \le 7finkitxmlcodeinlinelatexdvp i.e un tableau peut avoir jusqu'à 7 dimensions ;
  • expri sert à indiquer l'étendue dans la dimension correspondante. C'est une expression qui peut être spécifiée à l'aide :

    • d'une constante entière (littérale ou symbolique) ; dans ce cas, la borne inférieure du tableau est 1,
    • d'une expression de la forme cste1 : cste2 avec cste1, cste2 des constantes entières telles que cste1 <= cste2 ;
  • liste_tab est une liste de tableaux.
Exemples
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
INTEGER, PARAMETER              :: lda = 6
REAL, DIMENSION(0:lda-1)        :: Y
REAL, DIMENSION(1+lda*lda,10)   :: Z

REAL, DIMENSION(100)            :: R
REAL, DIMENSION(1:5,1:5, 1:5)   :: S
REAL, DIMENSION(-10:-1)         :: X

Remarque : les dimensions d'un tableau peuvent aussi être spécifiées sans l'attribut DIMENSION :

 
Sélectionnez
REAL :: T(10,10), U(4,2), G(-1:10,4:9,1:3)

Attention, cette notation n'est pas recommandée !

6-2. Définitions (rang, profil, étendue)

  • Le rang (rank) d'un tableau est son nombre de dimensions.
  • Le nombre d'éléments dans une dimension s'appelle l'étendue (extent) du tableau dans cette dimension.
  • Le profil (shape) d'un tableau est un vecteur dont chaque élément est l'étendue du tableau dans la dimension correspondante.
  • La taille (size) d'un tableau est le produit des éléments du vecteur correspondant à son profil.
  • Deux tableaux sont dits conformants s'ils ont le même profil.
Exemples
Sélectionnez
1.
2.
REAL, DIMENSION(15)      :: X
REAL, DIMENSION(1:5,1:3) :: Y, Z
  • Le tableau X est de rang 1, Y et Z sont de rang 2.
  • L'étendue de X est 15, Y et Z ont une étendue de 5 et 3.
  • Le profil de X est le vecteur (/ 15 /), celui de Y et Z est le vecteur (/ 5,3 /).
  • La taille des tableaux X, Y et Z est 15.
  • Les tableaux Y et Z sont conformants.

6-2-1. Ordre des éléments

En mémoire la notion de tableau n'existe pas : les éléments sont rangés les uns à la suite des autres.

Pour accéder à ces éléments, dans l'ordre mémoire, Fortran fait d'abord varier le premier indice, puis le second et ainsi de suite.

Par exemple, les éléments d'un tableau à deux dimensions sont ordonnés comme suit :

 
Sélectionnez
1.
2.
REAL, DIMENSION(5,3) :: C
C(1,1),C(2,1),..,C(5,1),C(1,2),C(2,2),..,C(5,3)
Image non disponible

6-3. Initialisation

6-3-1. Le symbole « = »

Fortran permet de manipuler globalement l'ensemble des éléments d'un tableau.

On pourra alors utiliser le symbole = comme pour l'initialisation d'une variable scalaire.

Exemple : pour initialiser à 3 l'ensemble d'un vecteur :

 
Sélectionnez
1.
REAL, DIMENSION(100) :: X = 3.

6-3-2. Le constructeur de vecteurs

Un constructeur de vecteur est un vecteur de scalaires dont les valeurs sont encadrées par les caractères (/ et /) :

 
Sélectionnez
tableau = (/ expr1, expr2, ..., exprn /)
  • tableau est un tableau de rang 1 ;
  • expri est :

    • un scalaire,
    • une boucle DO implicite de la forme (expr_scalaire, variable = m1,m2[,m3]) avec variable une variable INTEGER correspondant à l'indice de cette boucle et m1, m2, m3 des constantes entières délimitant la boucle (voir boucle DO) ;
  • le constructeur et le tableau tableau doivent être conformants.
Exemple
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
IMPLICIT NONE

REAL, DIMENSION(4)             :: heights = &
                 (/ 5.10, 5.6, 4.0, 3.6 /)

CHARACTER(len=5), DIMENSION(3) :: colours = &
                 (/ 'RED ', 'GREEN', 'BLUE ' /)

INTEGER                        :: i
INTEGER, DIMENSION(10)         :: ints = &
                 (/ 100, (i, i=1,8), 100 /)

6-3-3. L'instruction DATA

Comme pour les variables simples, on peut utiliser l'instruction DATA pour initialiser les tableaux lors de leur déclaration. Elle permet d'initialiser tout ou partie de tableaux à l'aide d'une liste de constantes encadrée par le caractère / (la notation n*valeur peut être employée pour répéter une même valeur).

Les éléments à initialiser peuvent être spécifiés au moyen d'une boucle DO implicite : (tab(i), i = m1,m2[,m3]).

Exemple
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
IMPLICIT NONE
INTEGER                 :: i, j

REAL, DIMENSION(20)     :: A, B
INTEGER, DIMENSION(10)  :: ints
REAL, DIMENSION(2,3)    :: MAT

DATA A/20*7.0/, B/10., 3.87, 10.5/
DATA (ints(i),i=1,4)/4*6.0/, A(10)/-1.0/
DATA MAT/1., 2., 3., 4., 5., 6./
DATA ((MAT(i,j),j=1,3),i=1,2)/1., 2., 3., &
                              4., 5., 6./

6-4. Manipulation de tableaux

6-4-1. Expressions de type tableau

Les tableaux peuvent être utilisés en tant qu'opérandes dans une expression :

  • les opérateurs intrinsèques sont applicables à des tableaux conformants ;
  • les fonctions élémentaires s'appliquent à l'ensemble du tableau.

Dans ces cas, les fonctions ou opérateurs sont appliqués à chaque élément du tableau (log, sqrt…).

Exemple
Sélectionnez
1.
2.
3.
4.
5.
6.
  REAL, DIMENSION(-4:0,0:2) :: B
  REAL, DIMENSION(5,3)      :: C
  REAL, DIMENSION(0:4,0:2)  :: D
       ...
  B = C * D - B**2
  B = SIN(C)+COS(D)

6-4-2. Sections de tableaux

Les sections régulières de tableaux sont décrites à l'aide d'un triplet :

 
Sélectionnez
[limite1]:[limite2][:pas]
  • cette notation est équivalente à une pseudoboucle ;
  • une section de tableau est aussi un tableau ;
  • le rang d'une section de tableau est inférieur ou égal à celui du tableau global ;
  • la section démarre à limite1 et se termine à ou avant limite2 ;
  • pas est l'incrément des indices.
Exemples
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
A(:)        ! Le tableau global
A(3:9)      ! A(3) à A(9) par pas de 1
A(3:9:1)    ! Idem
A(m:n)      ! A(m) à A(n)
A(m:n:k)    ! A(m) à A(n) par pas de k
A(8:3:-1)   ! A(8) à A(3) par pas de -1
A(8:3)      ! A(8) à A(3), pas de 1 => taille nulle
A(m:)       ! de A(m) à la borne supérieure de A
A(:n)       ! de la borne inférieure de A à A(n)
A(::2)      ! borne inf. de A à borne sup., pas de 2
A(m:m)      ! section constituée de 1 élément
            ! (ce n'est pas un scalaire !)
A(m)        ! section équivalente à un scalaire

Seules les opérations sur des sections conformantes sont valides :

 
Sélectionnez
1.
2.
3.
4.
5.
REAL, DIMENSION(1:6,1:8) :: P

P(1:3,1:4)     = P(1:6:2,1:8:2)  ! VALIDE
P(2:8:2,1:7:3) = P(1:3,1:4)      ! INVALIDE
P(2:6:2,1:7:3) = P(2:5,7)        ! INVALIDE

Exemples

 
Sélectionnez
REAL, DIMENSION(1:6,1:8) :: P
Image non disponible

Attention, P(2:5,7) est une section 1D tandis que P(2:5,7:7) est une section 2D : ces 2 tableaux ne sont donc pas conformants.


précédentsommairesuivant

Copyright © 2006 Patrick Corde et Anne Fouilloux. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.