Vous êtes sur la page 1sur 34

Programmation

pour le calcul scientifique

UE 2A005 – 2nd semestre 2018-19


Sorbonne Université

Responsable :
Ivan Delbende
Ivan.Delbende@sorbonne-universite.fr

Cours 5a : Tableaux (2/2)


Rappel : rang, étendue, profil,
tableaux conformants
● rang (rank) : nombre des dimensions d'un tableau.
● étendue (extent) : nombre d’éléments suivant
une des dimensions du tableau
● profil (shape) : vecteur dont le i-ième élément est
l'étendue du tableau suivant la i-ième dimension
● taille (size) : nombre total d'éléments, c'est le
produit des éléments du profil.

Deux tableaux sont dits


conformants
s'ils ont le même profil 2
Rappel : tableaux
statiques versus dynamiques
● Tableau statique : la ● Tableau dynamique :
déclaration spécifie le la déclaration ne précise
type, le rang, et des que le type et le rang
étendues constantes
INTEGER, PARAMETER :: n_col=10 INTEGER :: n_col, ok
REAL, DIMENSION(200, 0:n_col-1) :: mat REAL, DIMENSION(:, :), ALLOCATABLE :: mat

 le tableau est créé au  le tableau n'est vraiment


début de l’exécution du créé qu'à son allocation (qui
programme, et détruit à la spécifie les étendues), et
fin détruit à sa désallocation
READ *, n_col
ALLOCATE(mat(200, 0:n_col-1), STAT=ok)
IF (ok/=0) STOP ''Probleme allocation mat''
… ! Utilisation possible du tableau mat
… 
...
DEALLOCATE(mat)
3
Manipulation de tableaux (1)

● En FORTRAN 90, il est possible d'effectuer des


opérations globales sur les tableaux
Exemple pour des tableaux
REAL, DIMENSION(2,0:3) :: A, B, C
on peut écrire… ce qui équivaut à…
C = SQRT(2*A + A*B - 1) DO i = 1, 2
DO j = 0, 3
C(i,j) = SQRT(2*A(i,j) + A(i,j)*B(i,j) – 1)
END DO
END DO

● C'est ce que l'on appelle « utiliser la notation


vectorielle » pour les tableaux
4
Manipulation de tableaux (2)
● Opérations globales permises
➢ Opération entre 2 tableaux : les opérateurs
arithmétiques, relationnels et logiques sont A=B+C
utilisables pour des tableaux conformants
uniquement.
➢ Opération entre 1 tableau et 1 scalaire :
l'opération est effectuée avec le scalaire pour A=2*A+1.5
chaque élément du tableau.
➢ Fonction élémentaire (ABS, LOG, SQRT...)
sur un tableau : la fonction est appliquée à A=ABS(B)
chaque élément du tableau.
● Entrées-sorties standards sur les tableaux
➢ READ *, tab
➢ PRINT *, tab
 saisie/affichage suivant l'ordre naturel
5
Manipulation de tableaux (3)
Exemple
PROGRAM notation_vectorielle
IMPLICIT NONE
REAL, DIMENSION (2, 3) :: A, B
REAL, DIMENSION (0:1, 0:2) :: C
LOGICAL, DIMENSION (2, 3) :: D

PRINT *, "Entrez A : "


READ *, A

B = 2*ABS(A) - 1
C=A+B
D=A<B

PRINT *, 'A = ', A ; PRINT *, 'B = ', B


PRINT *, 'C = ', C ; PRINT *, 'D = ', D
END PROGRAM notation_vectorielle

A quoi équivaut l'instruction « B = 2 * ABS(A) - 1 » ?


6
Manipulation de tableaux (4)

ATTENTION, IL Y A QUELQUES SUBTILITÉS !


REAL, DIMENSION(2,3) :: A, B
REAL, DIMENSION(0:1,0:2) :: C

● IF (A<B) THEN : incorrect !


Dans IF (condition) THEN, la condition doit être un
scalaire de type LOGICAL, ici c'est un tableau !!
● D'autre part, C= A+B n'est pas équivalent à
DO j = 1, 3
DO i = 1, 2
C(i, j) = A(i,j) + B(i,j)
END DO Pourquoi ?
END DO Quelle est la version correcte ?
7
Manipulation de tableaux (4)

ATTENTION, IL Y A QUELQUES SUBTILITÉS !


REAL, DIMENSION(2,3) :: A, B
REAL, DIMENSION(0:1,0:2) :: C

● IF (A<B) THEN : incorrect !


Dans IF (condition) THEN, la condition doit être un
scalaire de type LOGICAL, ici c'est un tableau !!
● D'autre part, C= A+B n'est pas équivalent à
DO j = 1, 3 DO j = 1, 3
DO i = 1, 2 DO i = 1, 2
C(i, j) = A(i,j) + B(i,j) mais à : C(i-1, j-1) = A(i,j) + B(i,j)
END DO END DO
END DO END DO
Incorrect : on sort des bornes de C Version correcte 8
Sections de tableaux (1)

● En FORTRAN 90, il est possible d'effectuer des


opérations sur des sections de tableaux
Exemples
INTEGER, DIMENSION(10) :: vect
REAL, DIMENSION(5,10) :: mat

● on peut écrire…
DO i = 3, 7
vect(3:7) = -1 vect(i) = -1
END DO
ce qui équivaut à…
on peut écrire… DO i = 1, 3
DO j = 6, 10, 2
mat(1:3, 6:10:2) = 0. mat(i,j) = 0.
END DO
ce qui équivaut à… END DO 9
Sections de tableaux (2)

Une section de tableau est décrite à l'aide du triplet :


[limite1] : [limite2] [:pas]
➢ Cette notation est équivalente à une pseudo-boucle
➢ La section démarre à limite1 et ne dépasse pas limite2
➢ Le pas peut être >0 ou <0 (il est de 1 par défaut)
➢ La notation « : » isolé désigne toute l'étendue dans la
dimension (toutes les lignes, ou toutes les colonnes...)
➢ Propriétés :
- une section de tableau est aussi un tableau
- le rang d'une section de tableau est inférieur ou égal à celui
du tableau global
 Seules les opérations sur des sections
conformantes sont autorisées !
10
Sections de tableaux (3)
Exercice 1 : un tableau est déclaré comme suit :
INTEGER, DIMENSION(10) :: A = (/ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 /)
Déterminer les sections suivantes
A(:) A(3:9) A(3:9:1) A(8:3:-1) A(8:3)
A(m:) A(:n) A(::2) A(m:m)

Exercice 2 : que contient le tableau suivant ?

REAL, DIMENSION (5, 5) :: A


INTEGER :: i
DO i = 1, 5
A(i, :) = 2 * i
END DO

Exercice 3 : comment afficher une matrice ?


11
Sections de tableaux (4)

ATTENTION !
● Quand un tableau ou une section est présent des
deux côtés d’une affectation, le membre de droite
est évalué d’abord complètement, puis affecté au
membre de gauche.

Exemple
INTEGER, DIMENSION(10) :: vect
● l’instruction
DO i = 1, 10
vect(1:10) = vect(10:1:-1)
vect(i) = vect(11-i)
END DO
…n’est pas équivalente à
Pourquoi ? A quoi équivaut-elle alors ? 12
Sections de tableaux (4)

ATTENTION !
● Quand un tableau ou une section est présent des
deux côtés d’une affectation, le membre de droite
est évalué d’abord complètement, puis affecté au
membre de gauche.

Exemple
INTEGER, DIMENSION(10) :: vect, temp
● l’instruction
DO i = 1, 10
vect(1:10) = vect(10:1:-1) temp(i) = vect(11-i)
END DO
…est équivalente à… vect = temp

autre écriture : vect = vect(10:1:-1) 13


Instruction WHERE

● Effectuer des opérations uniquement sur certains


éléments du tableau (ceux pour lesquels
l'expression logique testée est vraie)
INTEGER, DIMENSION(100) :: num, denom
REAL, DIMENSION (100) :: quot = 0.0
! Initialisation des tableaux 'num' et 'denom'
...
! Remplissage du tableau 'quot' en évitant les divisions par 0 :
WHERE (denom /= 0) quot = REAL(num) / denom

● Forme complète : WHERE (mask)


bloc1
ELSEWHERE
bloc2
END WHERE 14
Programmation
pour le calcul scientifique

UE 2A005 – 2nd semestre 2018-19


Sorbonne Université

Responsable :
Ivan Delbende
Ivan.Delbende@sorbonne-universite.fr

Cours 5b : Fonctions (1/2)


FUNCTION : Qu'est-ce que c'est?

● C'est une procédure, c'est à dire :


➢ une portion de code (des instructions)
➢ qui ne fait pas directement partie du
programme principal
➢ qui est appelée par le programme principal
(ou par une autre procédure)
● Une fonction est une procédure dont l'appel
retourne (renvoie) un résultat

● Nous allons voir :


➢ des fonctions intrinsèques (= qui font partie
du langage FORTRAN 90)
➢ des fonctions définies par le programmeur. 2
Fonctions intrinsèques

● Nous avons déjà rencontré des fonctions du


FORTRAN 90, par exemple : n = FLOOR(pi)
FLOOR retourne la partie entière de l'argument
réel (ici pi).
● Il faut bien distinguer
➢ le type de la fonction, de la valeur retournée (ici entier)
➢ le type de l'argument (ici le réel pi) ou des arguments
● L'expression correspondant à l'appel de la fonction
est remplacée par la valeur retournée.
REAL :: x = 2., y = 2., r
Exemple
r = SQRT (x*x + y*y)
PRINT *, 'distance : ', r, 'angle (rad.) : ', ATAN (y / x)
3
Fonctions intrinsèques
mathématiques
Type de Nom de la Remarque Type de
fonction l'argument
la
fonction
REAL ACOS (x) x entre -1. et 1. [pi=ACOS(-1.)] REAL :: x
ASIN (x) x entre -1. et 1.
ATAN (x)
COSH (x)
SINH (x)
TANH (x)
TAN (x)
LOG10 (x) logarithme base 10, x > 0.
REAL (or COS (x) REAL (or
COMPLEX) SIN (x) COMPLEX) :: x
EXP (x)
LOG (x) logarithme népérien, x non nul
si x est réel, x > 0
SQRT (x) si x est réel, x positif ou nul
REAL ATAN2 (y, x) argument du complexe x + iy REAL :: y, x 4
Fonctions intrinsèques
de conversion
Type de la Nom de la La fonction retourne : Type de
fonction fonction l'argument

INTEGER or ABS (a) la valeur absolue de a INTEGER or


REAL REAL :: a
REAL ABS (z) le module de z COMPLEX :: z

INTEGER FLOOR (r) l'entier immédiatement REAL :: r


inférieur ou égal à r
(partie entière au sens math.)
CEILING (r) l'entier immédiatement
supérieur ou égal à r
NINT (r) L'entier le plus proche de r
REAL REAL (a) la valeur de a typée en REAL INTEGER or
REAL :: a
REAL REAL (z) la partie réelle de z COMPLEX :: z

REAL AIMAG (z) la partie imaginaire de z COMPLEX :: z


COMPLEX CMPLX (x, y) le complexe z = x + iy REAL :: x, y 5
Fonctions intrinsèques
de conversion (2)
Exercice : on veut calculer la trajectoire d'une
balle de t=0 à t=t_fin par pas de dt (dt et t_fin
donnés). Ecrire la boucle correspondante.
REAL  :: t_fin = 10., dt =0.1 ! [0, t_fin] est divisé en 100 intervalles
INTEGER  :: i, n_iter

6
Fonctions intrinsèques
de conversion (2)
Exercice : on veut calculer la trajectoire d'une
balle de t=0 à t=t_fin par pas de dt (dt et t_fin
donnés). Ecrire la boucle correspondante.
REAL  :: t_fin = 10., dt =0.1 ! [0, t_fin] est divisé en 100 intervalles
INTEGER  :: i, n_iter

niter = NINT ( t_fin / dt )  ! donne 100, FLOOR (...) donnerait 99 ou 100


DO i = 1, n_iter ; …. ; END DO

7
Fonctions intrinsèques
de conversion (2)
Exercice : on veut calculer la trajectoire d'une
balle de t=0 à t=t_fin par pas de dt (dt et t_fin
donnés). Ecrire la boucle correspondante.
REAL  :: t_fin = 10., dt =0.1 ! [0, t_fin] est divisé en 100 intervalles
INTEGER  :: i, n_iter

niter = NINT ( t_fin / dt )  ! donne 100, FLOOR (...) donnerait 99 ou 100


DO i = 1, n_iter ; …. ; END DO
Donner l'ordre de grandeur n d'un nombre x,
défini comme l'entier n tel que
10 n⩽|x|<10n+1

8
Fonctions intrinsèques
de conversion (2)
Exercice : on veut calculer la trajectoire d'une
balle de t=0 à t=t_fin par pas de dt (dt et t_fin
donnés). Ecrire la boucle correspondante.
REAL  :: t_fin = 10., dt =0.1 ! [0, t_fin] est divisé en 100 intervalles
INTEGER  :: i, n_iter

niter = NINT ( t_fin / dt )  ! donne 100, FLOOR (...) donnerait 99 ou 100


DO i = 1, n_iter ; …. ; END DO
Donner l'ordre de grandeur n d'un nombre x,
défini comme l'entier n tel que
10 n⩽|x|<10n+1
REAL  :: x = 0.023765
INTEGER  :: n
n = FLOOR ( LOG10 (ABS (x) ) )  ! donne -2
9
Fonctions intrinsèques
sans conversion
Type de la Nom de la La fonction Type de
fonction fonction retourne : l'argument

COMPLEX CONJG (z) le conjugué de z COMPLEX :: z


INTEGER MAX (a1, a2, ...) le max de a1, a2, … INTEGER or
or REAL MIN (a1, a2, ...) le min de a1, a2, ... REAL :: a1, a2, ...
INTEGER MODULO (a, b) le reste de la division INTEGER or
or REAL [mieux que MOD(...)] de a par b (avec un REAL :: a, b
quotient entier)
SIGN (a, b) → +|a| si b⩾0
−|a| si b<0

Effectuer une tâche toutes les p itérations :


INTEGER  :: i, n_iter = 100, p = 5 ! On veut afficher la position de
DO i = 1, n_iter ! la balle toutes les p itérations
IF ( ) THEN
PRINT *, '' Iteration no '', i ; PRINT *, '' Position de la balle '',...
END IF
END DO 10
Fonctions intrinsèques
sans conversion
Type de la Nom de la La fonction Type de
fonction fonction retourne : l'argument

COMPLEX CONJG (z) le conjugué de z COMPLEX :: z


INTEGER MAX (a1, a2, ...) le max de a1, a2, … INTEGER or
or REAL MIN (a1, a2, ...) le min de a1, a2, ... REAL :: a1, a2, ...
INTEGER MODULO (a, b) le reste de la division INTEGER or
or REAL [mieux que MOD(...)] de a par b (avec un REAL :: a, b
quotient entier)
SIGN (a, b) → +|a| si b⩾0
−|a| si b<0

Effectuer une tâche toutes les p itérations :


INTEGER  :: i, n_iter = 100, p = 5 ! On veut afficher la position de
DO i = 1, n_iter ! la balle toutes les p itérations
IF ( MODULO (i, p) == 0 ) THEN
PRINT *, '' Iteration no '', i ; PRINT *, '' Position de la balle '',...
END IF
END DO 11
Fonctions intrinsèques
concernant les tableaux
Type de la Nom de la La fonction retourne : Type de
fonction fonction l'argument
INTEGER or MAXVAL (tab) la plus grande valeur du INTEGER or
REAL tableau tab REAL,
MINVAL (tab) la plus petite valeur du DIMENSION
tableau tab (…) :: tab
SUM (tab) la somme de tous les
éléments du tableau tab
PRODUCT (tab) le produit de tous les
éléments du tableau tab

LOGICAL ALL (mask) .TRUE. si et seulement si LOGICAL,


tous les éléments du DIMENSION
tableau mask sont .TRUE. (…) :: mask
ANY (mask) .TRUE. si un au moins des
éléments du tableau mask
est .TRUE.
INTEGER COUNT (mask) le nombre LOGICAL,
d'éléments .TRUE. du DIMENSION
tableau mask (…) :: mask 12
Fonctions intrinsèques
concernant les tableaux (2)
Calculer, pour un vecteur v donné de
composantes vi, les normes suivantes :
2
‖v‖1 =∑i |v i| ‖v‖2 = √ i i
∑ v ‖v‖∞=max i (|v i|)

PROGRAM normes
INTEGER, PARAMETER  :: nmax = 3
REAL, DIMENSION (nmax)  :: vec
REAL  :: norme1, norme2, norme_sup

PRINT *, 'Entrez les composantes du vecteur'


READ *, vec
norme1 = SUM ( ABS (vec) )  ; PRINT *, norme1
norme2 = SQRT ( SUM ( vec ** 2 ) )  ; PRINT *, norme2
norme_sup = MAXVAL ( ABS (vec) )  ; PRINT *, norme_sup
END PROGRAM normes
13
Fonctions intrinsèques
concernant les tableaux (3)
Tester si, pour deux matrices A et B, on a :
∀ i et j , A ij >B ij
IF ( ALL (A>B) ) PRINT *, '' Aij > Bij pour tous les couples (i,j)''

Tester si, pour deux matrices A et B, on a :


∃(i , j) tel que A ij > Bij
IF ( ANY (A>B) ) PRINT *, '' Il existe (i,j) tel que Aij > Bij ''

Compter combien de relations A ij >B ij sont


vérifiées :
PRINT *, '' La relation Aij > Bij est verifiee '', COUNT ( A>B ), ''
fois.''
14
Fonctions intrinsèques
concernant les tableaux (4)
Type de la Nom de la fonction La fonction retourne : Type de
fonction l'argument
INTEGER SIZE (tab, dim) l'étendue du tableau tab <any_type>,
suivant la dimension dim DIMENSION
LBOUND (tab, dim) le premier indice de tab (…) :: tab
suivant la dimension dim
UBOUND (tab, dim) le dernier indice de tab INTEGER ::
suivant la dimension dim dim
LOGICAL ALLOCATED (tab) .TRUE. si le tableau tab est <any type>,
déjà alloué DIMENSION
(…) :: tab
INTEGER, SHAPE (tab) le vecteur profil du tableau <any_type>,
DIMENSION(:)
tab DIMENSION
(…) :: tab
➢ SIZE (tab, 1) retourne le nombre de lignes de tab,
➢ SIZE (tab, 2) retourne le nombre de colonnes de tab, etc.
➢ ATTENTION ! SIZE (tab) avec un seul argument tableau
retourne la taille totale de tab (le nombre total d'éléments) 15
La fonction intrinsèque
DOT_PRODUCT (vec1, vec2)
Elle retourne le produit scalaire de deux
vecteurs vec1 et vec2 conformants :
➢ Si vec1 et vec2 sont des vecteurs d'entiers ou de réels,
l'expression est équivalente à SUM ( vec1 * vec2 )
➢ Si vec1 et vec2 sont des vecteurs complexes, elle est
équivalente à SUM ( CONJG (vec1) * vec2 )
➢ Si vec1 et vec2 sont des vecteurs de booléens, elle est
équivalente à ANY (vec1 .AND. vec2)
REAL, DIMENSION (3) :: vec1 = (/ 1., -0.5, 2. /), vec2 = (/ 2., 2., -0.5 /)
PRINT *, 'Produit scalaire = ', DOT_PRODUCT (vec1, vec2)
IF (ABS(DOT_PRODUCT (vec1, vec2)) < 1.E-7) THEN
PRINT *, 'Les vecteurs sont orthogonaux !'
END IF

norme2 = SQRT ( DOT_PRODUCT (vec, vec) )


! fonctionne pour des vecteurs réels mais aussi complexes
16
La fonction intrinsèque
MATMUL (mat1, mat2)
Elle retourne le produit matriciel de deux
matrices mat1 et mat2
➢ Le nombre de colonnes de mat1 doit être égal au
nombre de lignes de mat2, etc...
INTEGER, PARAMETER :: n1 = 10, n2 = 5, n3 = 8
REAL, DIMENSION (n1, n2)  :: mat1
REAL, DIMENSION (n2, n3)  :: mat2
REAL, DIMENSION (n1, n3)  :: mat3
DO i = 1, n1 mat3 = MATMUL (mat1, mat2)
DO j = 1, n3
mat3 (i, j) = 0.
DO k = 1, n2
mat3 (i, j) = mat3 (i, j) + mat1 (i, k) * mat2 (k, j)
END DO
END DO
END DO 17
NE PAS CONFONDRE
PRODUIT MATRICIEL
A = MATMUL (B, C)
où l'on a des contraintes sur
les profils de A, B et C
et
PRODUIT CONTRACTÉ
A=B*C
où A, B et C sont conformants 18
Fonctions intrinsèques
concernant les tableaux (6)

Type de la Nom de la La fonction retourne : Type de


fonction fonction l'argument
REAL DOT_PRODUCT le produit scalaire ou REAL or
(vec1, vec2) hermitien de vec1 et COMPLEX,
vec2 DIMENSION(:) ::
vec1, vec2
<any_type>, MATMUL (tab1, le produit matriciel de <any_type>,
DIMENSION tab2) tab1 et tab2 DIMENSION
(:,:) or (:) (:,:) or (:)  :: tab1,
tab2
avec condition de
compatibilité des
dimensions

19
Fonctions intrinsèques
concernant les tableaux (5)
Type de la Nom de la La fonction retourne : Type de
fonction fonction l'argument
INTEGER, MAXLOC (tab) la position relative de la INTEGER or
DIMENSION plus grande valeur du REAL,
(rang_tab) tableau tab DIMENSION
MINLOC (tab) la position relative de la (…) :: tab
plus petite valeur du
tableau tab

<any_type>, TRANSPOSE (tab) la transposée de la <any_type>,


DIMENSION matrice contenue dans le DIMENSION
( :, :) tableau tab de rang 2 ( :, :) :: tab

<any_type>, RESHAPE (vec, Un tableau de profil prof <any_type>,


DIMENSION prof) formé des éléments du DIMENSION
(…) vecteur vec (:) :: vec
INTEGER,
DIMENSION
(:) :: prof
20

Vous aimerez peut-être aussi