Utilisation des tables en fortran pour opérations sur matrices et données groupées.
En Fortran, un tableau se déclare au moyen du décorateur dimension(...). Dimension prend pour arguments un nombre de dimensions variables, le nombre de valeurs données à dimension détermine l'ordre du tenseur.
Par exemple, déclarons deux matrices (4,2) et (2, 3) et quelques indices i,j,k.
integer, parameter :: M=4, N=3, P=2
integer :: i, j, k
integer, dimension(M, P) :: A
integer, dimension(P, N) :: B
Attention qu'en l'état il n'y a aucune garantie sur les valeurs présentes dans ces matrices, on peut les initialiser ainsi:
A = 0
B = 0
ou, pour leur donner pour valeur des entiers croissants:
A = reshape((/(real(i), i=1,M*P)/), shape(A))
B = reshape((/(real(i), i=1,P*N)/), shape(A))
$$ A = \begin{bmatrix} 1&2\\ 3&4\\ 5&6\\ 7&8\\ \end{bmatrix}, B= \begin{bmatrix} 1&2&3\\ 4&5&6\\ \end{bmatrix} $$
Pour accéder aux éléments, la notation est la suivante: pour accéder à \(a_{ij}\) et lui assigner la valeur 3.14
A(i, j) = 3.14
On peut également accéder à plein d'éléments en même temps, par exemple:
A(1:2, :) = 0.0
Va donner à \(A\) la valeur suivante, mettant les lignes de 1 à 2 à zéro: $$ A = \begin{bmatrix} 0&0\\ 0&0\\ 5&6\\ 7&8\\ \end{bmatrix} $$ On peut également sauter des lignes ainsi, allant de 1 à 4 par pas de 2, nous mettons les lignes 1 et 3 à zéro:
A(1:4:2, 1) = 0.0
$$ A = \begin{bmatrix} 0&2\\ 3&4\\ 0&6\\ 7&8\\ \end{bmatrix} $$ Les possibilités sont nombreuses, le widget ci-dessous vous permet de les tester:
A côté de ces accès, il est également possible de modifier des éléments répondant à une condition. Par exemple, passons à zéro les éléments inférieurs à 3.0:
where (A > 3.0) A = 0
$$ A = \begin{bmatrix} 1&2\\ 3&0\\ 0&0\\ 0&0\\ \end{bmatrix} $$
Cette clause where évite de devoir coder les boucles et conditions nécessaire pour effectuer la même opération. On peut lui annexer une clause elsewhere de la manière suivante pour modifier les éléments non correspondants:
where (A > 3.0)
A = 0.0
elsewhere
A = 1.0
end where
$$ A = \begin{bmatrix} 1&1\\ 1&0\\ 0&0\\ 0&0\\ \end{bmatrix} $$
Une proposition telle que \(A> 3.0\) se nomme mask, il s'agit d'un tableau conforme à \(A\) comprenant des valeurs logiques. Dans notre cas, la valeur logique de chaque élément de \(A\) correspond aux résultat de l'opération logique \(A_{ij} > 3\).
Les fonctions intrinsèques de fortran telles que sin peuvent être appliquées aux tableaux comme aux scalaires. Dans le cas d'un tableau en argument, la fonction est appliquée terme par terme.
Afin d'obtenir ce comportement, il faut ajouter le mot clé elemental à la définition:
elemental real function my_cosh(x) result(y)
real :: x
y = (exp(x) + exp(-x))/2.0
end function
Elles pourra donc être employée ainsi
real, dimension(20) :: x, y
x = (/((i-1)*3.14/19.,i=1,20)/) ! x in [0, pi]
y = my_cosh(x)
home