Académique Documents
Professionnel Documents
Culture Documents
MMR1 Programmation Fortran
MMR1 Programmation Fortran
Module
Simulation/Programmation
*********************************
Année 2006/2007
EPROM RAM
µP
I/O
Périphériques :
Clavier ;
HD ;
Ecran ;
Le langage de bas niveau « compris par l’ordinateur » est le langage machine (binaire).
Le nombre de bits constituant un mot (4, 8,16, 32, 64 ou 128) dépend du microprocesseur.
a) Les interpréteurs :
ils pilotent la traduction d’une instruction , du code source au code objet, puis il laissent le
microprocesseur exécuter le code machine obtenu. Ensuite ils recommencent pour
l’instruction suivante ( Le BASIC est un langage interprété).
b) Les compilateurs :
Il pilotent la traduction de la totalité du code source en code objet puis ils libèrent la machine
qui peut être alors autorisée à exécuter le code machine obtenu ( Le FORTRAN est un
langage compilé).
4) Débugger :
C’est un utilitaire permettant de contrôler l’exécution d’un programme et d’effectuer sa mise
au point.
−b
Si ∆=0 alors on a une racine double ( x1 = x 2 = );
2a
−b± ∆
Si ∆>0 alors on a deux racines distinctes ( x 1, 2
= );
2a
SORTIE
TEST
1)HISTORIQUE:
Le FORTRAN (FORmula TRANslateur : Traduction des formules), Créé par IBM en 1954
pour l’écriture de programme Scientifiques, est encore le plus utilisé :
*Plus ancien des langages scientifiques ce qui a donne un cumule de millions de lignes de
programmes impossibles à réécrire rapidement .
*L’évolution du langage lui même( en fonction de l’évolution matériel et des besoin plusieurs
version normalisées sont développés : American National Standars Institute (ANSI) a
développé le FORTRAN 66 (1968) puis le FORTRAN 77 (1978). ISO a développé
FORTRAN 90 (1992) actuellement on a le Fortran 95 et 2000.
Pour couper une instruction sur plusieurs lignes, on met un caractère quelconque (excepté
« 0 ») en colonne 6 des lignes de suite.
Le champ (de 73 à 80) n'est pas interprété par le compilateur FORTRAN 77. Il permet de
commenter une ligne de commande.
La figure 2.1 illustre ces règles.
En format fixe les lignes qui commencent par C,c, * ou ! En colonne 1 sont des
commentaires. Par contre en format libre seul le caractère « ! » rencontré sur une ligne
indique que ce qui suit est un commentaire. Lorsque le 1er caractère non blanc d’une ligne est
le caractère « ! » , la ligne en question est une ligne complète de commentaire
Exemple: if (n < 100 .or. n > 199) ! Test cas d'erreur
....
! On lit l'exposant
read *,x
! On lit la base
read *,y
if (y <= 0) then ! Test cas d'erreur
print *,' La base doit être un nombre >0'
else
z = y**x ! On calcule la puissance
Exple3.f90
program nom
...
end
Programme principal
Le programme principal est obligatoirement présent. Il n'existe qu'un seul programme
principal. Qui se devise en en deux parties distinctes:
a) Partie déclaration :
C'est dans cette partie qu'on définit les objets (type + nom) qui seront manipuler par le
programme.
b) Partie instructions.
Remarque: L'exécution d'un programme FORTRAN consiste à dérouler dans l'ordre toutes
les instructions de la partie exécutable du programme principal. Certaines instructions
Réels real
double precision
Complexes complex
Caractéres Character
a) Type integer
Un integer contient un entier. Il est représenté par son écriture en base 2 signée sur 4 octets
(31 bits pour la valeur plus un bit pour le signe). Ses valeurs possibles sont dans l'intervalle
[-231,231-1]. Soit dans l’intervalle [-2147483648, 2147483647].
b) Type real
un real contient un nombre réel. Il est codé en virgule flottante (floating « virgule mobile »)
sur 4 octets . Chaque nombre est représenté sous la forme x=±0.mx2e où m est la mantisse
codée sur 23 bits et e est l'exposant, codé sur 8 bits ( -127 < e < 128). Les valeurs (en valeur
absolue) sont comprises dans l'intervalle [1.401x10-45,3.403x1038] et il stocke environ 7
chiffres significatifs.
d)Type complex :
Assemblage de 2 real dans un même objet.
a) Constantes integer
Une constante de type integer est écrite sans point décimal.
Exemples : 1 123 -28 0
b) Constantes real
Une constante de type real doit obligatoirement comporter : soit le point décimal, même s'il
n'y a pas de chiffres après la virgule ; soit le caractère e pour la notation en virgule flottante.
Pour les nombres écrits 0.xxxxx, on peut omettre le 0 avant le point décimal.
d) Constantes complex
Une constante de type complex est obtenue en combinant deux constantes réelles entre
parenthèses séparées par une virgule. 2.5+i s'écrira (2.5,1.)
Le type de chaque constante doit être déclaré explicitement ou en suivant les mêmes règles de
typage automatique que les variables (cf 4.3). Une constante est toujours locale à un bloc
fonctionnel.
Exemple
4) Les variables
Une variable est un emplacement en mémoire référencé par un nom, dans lequel on peut lire
et écrire des valeurs au cours du programme. Les variables permettent (entre autres) de :
Manipuler des symboles ;
Programmer des formules.
C'est la déclaration. Elle doit être écrite dans la première partie (la partie déclaration) d'un
bloc fonctionnel (programme principal, subroutine ou fonction) dans lequel intervient la
variable.
Dans les langages modernes, toute variable doit être déclarée.
En FORTRAN, il y a des exceptions obéissant à des règles bien précises
Une variable est par défaut locale : seul le bloc fonctionnel où elle est déclarée peut y accéder.
Elle est globale si tous les blocs fonctionnels peuvent y accéder.
Pour rendre une variable globale on utilise l'instruction common voir le paragraphe (10.6).
4-1-Déclaration de variables :
Dans le programme principal, On déclare une variable entre le mot-clé Program et la
première instruction exécutable.
Dans un sous programme, on la déclare entre le mot-clé Subroutine et la première instruction
exécutable.
Dans une fonction, la déclaration se fait entre le mot clé Function et la première instruction
exécutable
Syntaxe :
type var1, var2, var3, .....
ou
type::var1,var2,var3… (obligatoire lors d’initialisation : Real:: x=102.58)
On peut déclarer plusieurs variables du même type sur une même ligne.
Exemple
integer i,j,k integer:: i,j,k
real alpha, beta ou real ::alpha, beta
double precision x,y double precision:: x,y
complex z complex ::z
Directive implicit :
Elle permet modifier ces règles par défaut de typage de manière locale à un bloc fonctionnel..
Syntaxe:
implicit type (lettre1-lettre2, lettre3, ....) Toute variable commençant par une lettre comprise
entre lettre1 et lettre2 ou par lettre3 sera par défaut du type indiqué
Exemples
implicit real (a-c,e,w-z) : Tout ce qui commence par a,b,c,e,w,x,y,z sera real
implicit double precision (a-h,o-z) : tout ce qui commence par i,j,k,l,m,n sera integer, tout
le reste double precision (Très Utilisé ).
implicit complex (z): Tout ce qui commence par z est complex par défaut.
implicit none : Aucune variable n'est utilisable si elle n'est pas déclarée.
Fonctionnement :
Lit la valeur de toutes les variables à droite du signe = ;
Effectue les opérations demandées ;
Affecte le résultat à la variable à gauche de =.
Exemple : i = i + 1
Augmente le contenu de la variable i de 1 (on dit aussi « incrémenter » une variable).
opérateur Operating
* multiplication
/ division
** puissance
5-2-Les expressions :
+O1 Égale à O1
O1 - O2 Soustrait O2 à O1
-O1 Inverse le signe de O1
O1 * O2 Multiplie O2 par O1
O1 / O2 O1 devisé par O2
O1 ** O2 Élève O1 à la puissance O2
Exemples
b**2 sera du type de b.
4*a*c sera du type le plus fort de a et de c.
Si a et c sont real, et b double precision, le résultat de b**2-4*a*c sera double precision,
mais attention, le produit a*c sera effectué en simple précision, d'où une perte de précision
possible.
Pièges classiques
2/3 sera du type integer. Autrement dit la division effectuée sera une division entière, et le
résultat sera 0. Pour calculer effectivement deux tiers en réel,
écrire : 2./3 , 2/3. ou 2./3.
Idem pour i/j où i et j sont deux variables integer. Écrire : real(i)/j
5-5-Opérateurs relationnels:
Opérateurs Opérations
.LT. Ou < Strictement plus petit Ces opérateurs admettent des opérande de
type integer , real ou character.
opérateur opération
.NOT. Négation logique Les opérandes doivent être des expression de type logical
L .NOT.L
L : Variable logique (type logical)
.TRUE .FALS.
.FALS. .TRUE.
Expression Interprétation
C1 // C2 Concatène C1 avec C2 C1 et C2 sont deux chaînes de caractères
Exemple:
‘BON’ // ‘jour’ donne ‘BONJOUR’
Character (len=10):: C1=‘BON’
C1=C1//’JOUR’ ! INVALIDE
C1=TRIM(C1)//’JOUR’ ! VALIDE
5-8-Fonctions mathématiques:
Une fonction FORTRAN est une boite dans laquelle rentre un ensemble de grandeurs d'un
type donné (les arguments) et de laquelle sort une grandeur d'un type donné (cf 10.4).
Certaines fonctions mathématiques sont prédéfinies dans le langage (tables 5.8.1 et 5.8.2). On
n'utilisera pas la même fonction selon le type de l'argument. Par exemple la fonction sinus
sera SIN pour un argument réel, DSIN pour un argument double precision, CSIN pour un
argument complexe.
Important :
Le ou les arguments d'une fonction sont toujours entre parenthèses.
Chaque fonction a son domaine de définition. Son non-respect entraîne une erreur
d'exécution, c'est-à-dire que le programme s'arrête.
Exemples
z=(a*sin(x)+b*cos(y)) / (a*sinh(x)+b*cosh(y))
Pour définir p en double precision :
pi=4d0*datan(1d0)
5-9-Fonctions de conversion
Ces fonctions permettent de convertir explicitement des données d'un type en un autre type.
La figure 5.9.1 donne les noms des différentes fonctions permettant à partir d'un type initial
d'obtenir un autre type de valeur.
6-Entrées / Sorties
On appelle « Entrées / Sorties », tout ce qui permet à un programme de dialoguer avec
l'extérieur :
• l'utilisateur via le clavier, l'écran, une imprimante, etc. ;
• les disques via des fichiers ;
• d'autres machines via le réseau ;
• ...
Le langage FORTRAN permet d'écrire ou de lire des données sur différentes choses.
Pour écrire, on utilise l'instruction write :
• à l'écran ,
• sur un fichier,
• dans une chaîne de caractères.
Pour lire, on utilise l'instruction read :
• sur le clavier,
• dans un fichier.
• dans une chaîne de caractères.
Exemples
write(*,*) i,j,x,y :écrit les valeurs des variables i,j,x,y sur une ligne, séparées par des blancs.
write(*,*) 'z vaut',z :écrit la chaîne « z vaut », suivie de la valeur de la variable z.
Important : se souvenir qu'une instruction write écrit une ligne puis revient à la ligne. Donc
un write est égal à une ligne d'affichage.
6-2-Formats d'écriture
Un format est une série de codes, chaque code définissant le format d'écriture d'un élément
d'une donnée.
a) Définition du format
Deux solutions :
Directement dans l'instruction write avec une chaîne de caractères :
write(*,'format') liste
nn format(définition du format)
write(*,nn)
Cette solution permet d'utiliser le même format dans plusieurs instructions write.
b) Format entier
Dans un format, la notation in permet d'afficher un entier. L'entier est écrit sur n caractères en
tout : S'il y a besoin de plus, l'écriture échoue.
Si cela suffit, on ajoute éventuellement des blancs à gauche.
Exemples :
i=11 10 format(i6,i6)
j=20312 i=11
write(*,'(i6,i6)') i,j ou j=20312
write(*,10) i,j
donne:
Exemples :
x=-1456.2
y=1.6e-19
write(*,'(e14.5,e14.5)') x,y
Affiche
Pour x
Suivit pour y de
d) Format chaîne:
Dans un format, la notation an permet d'afficher une chaîne de caractères.
Si n est spécifié, la chaîne est écrite sur n caractères en tout, en ajoutant des blancs à gauche
pour compléter.
Si n n'est pas spécifié,
la chaîne est écrite avec son nombre de caractères total (tel que déclaré!).
.
Exemples de formats mixtes
i=36
px=-1456.2
write(*,'(a,i4,a,e12.5)') 'i vaut', i, ' et x vaut', px
affichera
i vaut 36 et x vaut -0.14562E+04
Les formatages doivent être utilisés si c'est absolument nécessaire. Dans la plupart des cas le
format par défaut (*) suffit largement, et il est inutile de perdre du temps a formater les sorties
écran.
a) Principe
On lit une ligne de caractères d'un seul coup, la lecture étant validée par :
la frappe de la touche RETURN pour une lecture clavier,
une fin de ligne pour une lecture de fichier texte.
Les données sur une même ligne doivent être séparées par des blancs.
b)Syntaxe
read(unité de lecture, formatage) liste de variables
L'unité de lecture est un entier (voir « fichiers » ). Pour le clavier, on utilise *.
Le formatage indique sous quelle forme on va lire les données
(voir write).
c)Conseil
Le plus simple est d'utiliser tout le temps le format libre *. Exception: pour lire des variables
caractères ou chaînes de caractères, le format libre ne fonctionne pas.
Utiliser le format chaîne a.
c) Example
real a,b,c
read(*,*) a,b,c
attend de l'utilisateur qu'il frappe trois réels au clavier séparés par des espaces puis la touche
RETURN ( ). On peut entrer les nombres en format virgule flottante.
Pour entrer (1,2) dans a, (1,6.10-19) dans b et (32) dans c, l'utilisateur pourra taper :
1.2 1.6e-19 32
Un exemple classique d'écriture suivie d'une lecture sur la même ligne :
Le message sera affiché, mais le curseur ne reviendra à la ligne que lorsque l'utilisateur aura
entré x suivi de RETURN. Programme:
write(*,'(a,$)')'Entrez x :'
read(*,*)x
print*,x
end
7-1-Instructions conditionnelles
a) Objectif
Exécuter une séquence d'instructions si une condition logique est vérifiée, sinon en exécuter
une autre.
b) Syntaxes et exemples :
*Pour exécuter une série d'instructions uniquement si une condition logique est vraie :
syntaxe :
if (condition logique) then Programme :
…. ...
endif
x=12.5;y=8.
If(x>=y)then
Print*,’x=’,x,’et’,’y=’,y
endif
end
Puisque la condition logique est vraie, le programme ci-contre affichera sur l’écran
x=12.500000 et y= 8.000000
On peut aussi spécifier une autre série d'instructions à exécuter si la condition logique est
fausse :
Programme:
Syntaxe : a=5;b=6
if (condition logique) then D=b**2-4*a*c
...... If(D>=0)then
else Print*,’racines reelles’
...... Else
endif Print*,’pas de racines dans R’
Endif
end
Le programme exécute le bloc d'instructions suivant la première condition logique vraie puis
reprend après endif. Ainsi le programme2 ci-dessus affichera « NEGATIF » et le
programme3 affichera « POSITIF »
Si aucune condition logique n'est vraie, le bloc else est exécuté. Ainsi le programme1
calculera Z et affichera Z=153.0000
7-2 Test arithmétique:
a) Syntax :
If(u) n1,n2,n3 u: variable ou expression arithmétique
b) Fonctionnement:
C) Programme de résolution d’une équation
du 2éme ordre, utilisant le teste arithmétique:
a=50.2;b=407.3,c=18.
D=b**2-4*a*c
If(D)1,2,3
3 Print*,’x1=‘,(-b+sqrt(D))/(2*a)
Print*,’x2=‘,(-b-sqrt(D))/(2*a)
Goto 4
2 Print*,’x1=X2=‘,-b/(2*a)
goto4
1 Print*,’pas de racine dans R’
4 END
L’éxécution donne: x1=-4.4436906E-02
FORTRAN Pr . LAHCEN EL ARROUM 21
x2=-8.0169109.
Si on change la valeur de b par 47 l’exécution donne: « Pas de racine dans R ».
7-3- Boucles:
Une boucle permet d’exécuter une séquence d’instructions plusieurs fois d’affilée. Le nombre
de boucle peut être déterminé à l’avance ou par basculement d’une condition logique.
a) Syntaxes
b) Fonctionnement
PROGRAM iteration_do
INTEGER i, somme, n
n=100! affectation de n
somme=0
DO i=1,n,1
somme=somme+i
END DO
print*,'somme=',somme
END PROGRAM iteration_do
Resultat: somme=5050
a) Syntaxe
do while (condition logique)
...
...
...
enddo
b) Fonctionnement
On rentre dans la boucle seulement si la condition logique vaut .true. et on exécute la boucle
tant qu'elle reste à .true..
Dès qu'à la fin d'une boucle, la condition est .false., l'exécution reprend après enddo.
c) Remarque:
Le programme ou la condition logique reste toujours vrais (.tue.), ne s’arrêtera jamais
1
d- exemple: Sommation de la série ∑ n >=1
jusqu'a ce que le terme général soit
n2
inférieur a ε fois la somme partielle courante :
PROGRAM iteration_while
INTEGER :: n ; DOUBLE PRECISION :: somme
DOUBLE PRECISION, PARAMETER :: epsilon = 1.d-3
LOGICAL :: fini
! Initialisation
n=0; somme=0.d0; fini=.FALSE.
DO WHILE (.not. fini)
n=n+1
somme=somme + 1d0/n**2
fini=(1d0/n**2 .LT. epsilon*somme)
END DO
print *,"Nombre d'iterations : ", n
print *,"Somme = ", somme
END PROGRAM iteration_while
Do
bloc1
IF (expression) EXIT
Bloc2
…..
end do
PROGRAM iteration_exit
integer::n=0,somme=0
Do
n=n+1
Somme=somme+n
If(n==100)exit
Enddo
Print*,’somme=‘,somme
En arrivant sur une telle ligne, le programme est branché directement sur la ligne
comportant le label mentionné. En général,, cette ligne contient seulement l'instruction
qui ne fait rien continue.
a- Exemple:
program somme_produit
doubleprecision::a,b,somme,prod;integer::oper
write(*,*) 'donner deux réels'; read(*,*)a,b
write(*,*)'donner 1 (produit) un autre entier pour (por somme)';read(*,*)oper
if(oper==1) then
prod=a*b;print*,'a*b=',prod
goto 10
endif
somme=a+b;print*,'a+b=',somme
10 continue
End
9-Les tableaux
A partir des types simples du FORTRAN (qu’on a déjà vu), on peut former des
vecteurs, des matrices, et même des tableaux à plusieurs indices.
9-1-Déclaration
type var (m1,m2,….,mn)
type , dimension(m1,m2,….,mn)::liste_tab (recommandée)
Exemples:
real v(100)
double precision a(100,100)
integer i(20)
INTEGER, PARAMETER :: m = 10
REAL, DIMENSION(0:m-1) :: Y
REAL, DIMENSION(1+m*m,10) :: Z
REAL, DIMENSION(100) :: R
REAL, DIMENSION(1:5,1:5, 1:5) :: S
REAL, DIMENSION(-10:-1) :: X
Exemple:
REAL, DIMENSION(15) :: X
REAL, DIMENSION(1:5,1:3) :: Y, Z
REAL, DIMENSION(5,3) :: C
C(1,1),C(2,1),..,C(5,1),C(1,2),C(2,2),..,C(5,3)
9-4- Initialisation:
a- 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 a 5 l'ensemble d'un tableaux :
real,dimension(2,3)::mat=5.
do i=1,2
do j=1,3
print*,'line',i ;print*,mat(i,j);
enddo
enddo
end
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/)
print*,ints(1),ints(2),ints(8),ints(10)
print*,colours(2)
end
C- 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 a 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écifies au moyen d'une boucle DO implicite :
(tab(i), i = m1,m2[,m3]).
Exemple:
Exemple:
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
Exemple:
REAL, DIMENSION(1:6,1:8) :: P
Exercice1:
Écrire un programme complet qui lit au clavier deux matrices de même taille m x n et effectue
leur somme. On part du principe que ces matrices ont au plus 50 lignes et 80 colonnes. On
déclare donc 3 tableaux 50 x 80, et on utilise deux variables nligne et ncolon pour stocker les
tailles réelles des matrices que l'on traite. Ces tailles réelles sont bien sûr demandées à
l'utilisateur.
parameter (mligne=50, mcolon=80)
double precision, dimension (mligne, mcolon)::a,b,c
integer nligne, ncolon
write(*,*) 'Nombre de lignes des matrices'
read(*,*) nligne
write(*,*)'Nombre de colonnes des matrices'
read(*,*) ncolon
write(*,*)'Matrice a'
do i=1,nligne
read(*,*) (a(i,j), j=1,ncolon)
enddo
write(*,*)'Matrice b'
do i=1,nligne
read(*,*) (b(i,j), j=1,ncolon)
enddo
do i=1,nligne
do j=1,ncolon
c(i,j)=a(i,j)+b(i,j)
enddo
Print*,(c(i,j),j=1,ncolon)
enddo
end
Exercice 2:
implicit none
real,dimension(1:2,1:3)::a;real, dimension(2:3,2:4)::b;real,dimension(-1:0,0:2)::c
real,dimension(2,3)::ma;real,dimension(3,2)::mb;real,dimension(2,2)::mc;integer i,j,k
data ((a(i,j),i=1,2),j=1,3)/1.,2.,3.,4.,5.,6./,((b(i,j),i=2,3),j=2,4)/1.,2.,3.,4.,5.,6./
data ((ma(i,j),i=1,2),j=1,3)/1.,2.,3.,4.,5.,6./,((mb(i,j),i=1,3),j=1,2)/1.,2.,3.,4.,5.,6./
c=a*b !c,a,b sont conformants
print*,'comment les données sont rangées dans la mémoire ma par
exple';print*;print*!aeré
do i=1,2
print*,(ma(i,j),j=1,3)
enddo;print*;print*
print*,'produit intrinseque de a et b qui est different du produit de matrice
';print*;print*
do i=-1,0
print*,(c(i,j),j=0,2)
enddo;print*;print*
do 1 i=1,2
do 2 j=1,2
mc(i,j)=0
do 3 k=1,3
mc(i,j)=mc(i,j)+ma(i,k)*mb(k,j)
3 continue
2 continue
1 continue
print*,'produit de deux matrice mc=ma*mb';print*;print*
do 4 i=1,2
print*,(mc(i,j),j=1,2)
4 continue;print*;print*
end
22.00000 49.00000
28.00000 64.00000
Calculer les coordonnées polaires d'un point défini par un couple de réels (x,y) :
Second objectif :
On a un problème décomposable en plusieurs sous problèmes. On cherche à
« enfermer » chaque sous problème dans un bloc et à faire communiquer ces blocs.
Exemple : écrire un programme qui lit trois matrices au clavier, en fait le produit, puis affiche
le résultat. On écrira trois blocs de base :
un qui permet de lire une matrice au clavier
Les objets FORTRAN correspondants à ces blocs sont les subroutines ou les fonctions.
Chacun de ces blocs peut être écrit séparément, et il est relié à l'extérieur par des « portes »
d'entrée/sortie repérées par un nom .
Ce nom n'a de sens que pour le bloc, et il est là pour identifier une entrée ou une sortie.
Les connexions des boites avec l'extérieur sont appelés en FORTRAN
« paramètres formels », et seront traités comme des variables dans les instructions
exécutables.
10-1-Les subroutines
C'est une séquence d'instructions appelable d'un point quelconque du programme. Elle peut
être appelée depuis le programme principal, ou depuis une autre subroutine ou fonction.
Une subroutine est définie par :
un nom
des paramètres formels, qui ont comme les variables :
un nom
un type
Écriture d'une subroutine
subroutine nomsub(pf1, pf2, pf3, ...)
type pf1
type pf2
type pf2
...
Déclaration des variables locales
...
Instructions exécutables
...
return
end
Les instructions de la subroutine peuvent manipuler :
les paramètres formels (comme des variables normales),
les variables locales,
les variables d'un common.
Sytaxe: Exemple:
10-4-Déclaration external
Objectif
Program integral
double precision somf
external f
double precision f
call integ(1d0,2d0,f,somf)
print*,'intergral de f=',somf
end
subroutine integ(a,b,f,valint)
Double precision a,b,valint,h
external f
Double precision f
x1=a;x2=b;h=(b-a)/10000.
x=x1;valint=0
8 valint=valint+(f(x+h)+f(x))*h/2.
x=x+h
if(x.lt.x2) goto 8
return
end
Double precision function f(x)
f=x**2+3d0
return
end
a b c1 c2
Rang
profil
b) que peut-on dires de ces tableaux :
c) Apres exécution de ce programme, donner les tableaux :
? ? ? ? ? ? ? ? ? ? ? ?
a = ? ? ? , b = ? ? ? , c1 = ? ? ? , c 2 = ? ? ?
? ? ? ? ? ? ? ? ? ? ? ?
1) a- Ecrire un sous-programme Fortran qui calcule le produit Pm=m1*m2 de deux
4
matrices m1(3,4) et m2(4,4), sachant que) Pm( i , j ) = ∑ m1( i , k ) * m 2( k , j )
k =1
b- Ecrire un programme principal :
-qui lit m1 et m2 (au clavier)
-qui appelle le sous- programme précédant et affiche Pm sur l’écran.
c) 1 7 4 1 7 4 1 49 16 1 1 1
a = 3 9 6 , b = 3 9 6 , c1 = 9 81 36 , c 2 = 1 1 1
5 2 8 5 2 8 25 4 64 1 1 1
Exe3-(5poits)
a) Ce programme permet de calculer l’intégral de la fonction x**2+3 dans l’intervalle [1,2]
b) On remplace type:
External f
Double precision f
• Dans la Fonction par:
11- Fichiers:
Accès à un fichier = Lecture ou Écriture dans ce fichier.
En Fortran ,il y a des fichiers à accès séquentiel et des fichier à accès direct.
Fichiers à accès séquentiel: à partir de l'ouverture du fichier, on lit les données dans l'ordre où
elles sont stockées, sans pouvoir accéder directement à une donnée particulière. Au fur et à
mesure des lectures ou écritures, un pointeur de fichier avance automatiquement d'une donnée
à la suivante.
Fichiers à accès direct: pour ces fichiers on accède directement à une donnée particulière.
On ne parlera que des Fichiers à accès séquentiel:
Les fichiers séquentiels sont divisés en deux types : le fichiers formatés et les fichiers
binaires.
a) Syntaxe
open(numéro d'unité, file=chaîne de caractère, form=chaîne de caractères, status=chaîne
de caractères, err=numéro de label)
Lors de l'ouverture d'un fichier, le pointeur de fichier est automatiquement placé avant la
première donnée, sauf s'il est ouvert avec status='append'.
b)Description
Numéro d'unité : tout entier compris entre 10 et 99. On peut également mettre une variable
integer contenant cet entier.
file=
suivi d'une constante chaîne de caractère indiquant le nom du fichier en clair
par (exemple ‘ProdMat') ou bien une variable de type chaîne contenant le nom du
fichier.
form=
chaîne de caractère pouvant être :
'formatted' ouvre ou crée un fichier formaté. C'est le défaut.
'unformatted' ouvre ou crée un fichier binaire.
status=
chaîne de caractère pouvant être :
'new' crée un nouveau fichier, ou génère une erreur s'il existe.
'old' ouvre un ancien fichier, ou génère une erreur s'il n'existe pas.
'unknown' ouvre le fichier quoi qu'il arrive. C'est le défaut.
'append' ouvre le fichier et se place automatiquement à la fin de celui-ci.
err=
numéro de label vers lequel le programme sera dérouté en cas d'erreur à l'ouverture.
Exemples
open(10,file=‘ProdMat'):
ouvre le fichier formaté ProdMat du répertoire courant, qu'il existe ou non, et l'attache à
l'unité 10.
integer unite
character*80 nomfich
...
unite=10
end=numéro de label : Utilisable en lecture (lorsqu'on arrive à la fin du fichier, autrement dit
quand il n'y a plus rien à lire, le programme est dérouté vers le label mentionné).
Remarque importante : Lorsque l'on effectue une instruction write dans un fichier
séquentiel, toutes les données suivant la position courante du pointeur de fichier sont
effacées.
Ainsi si l'on ouvre un fichier existant avec comme status 'old' ou 'unknown', et que l'on fait
tout de suite un write, toutes les données seront effacées. Aussi, si l'on veut ajouter des
données dans un fichier déjà existant, il faut l'ouvrir avec status='append'.
b) Exemples:
Stockage de données x,y:
Écrire un programme (ou une subroutine ) recevant en entrée deux vecteurs x et y double
précision contenant n données chacun, et une chaîne de 80 caractères contenant un nom de
fichier, qui écrit sur un fichier texte une valeur de x et une valeur de y par ligne.
open(20,file='nomfich')
n=10
do i=1,n
x(i)=dfloat(i);y(i)=x(i)**2
write(20,*) x(i), y(i)
enddo
close(20)
! return
end
Si on enlève! On a une subroutine qu’on peut appeler d’un programme principal
L’exécution donne un fichier texte qu’on peut lire avec Word par exemple:
1.00000000000000 1.00000000000000
2.00000000000000 4.00000000000000
3.00000000000000 9.00000000000000
4.00000000000000 16.0000000000000
5.00000000000000 25.0000000000000
6.00000000000000 36.0000000000000
7.00000000000000 49.0000000000000
8.00000000000000 64.0000000000000
9.00000000000000 81.0000000000000
10.0000000000000 100.000000000000
character*80 ligne
open(20,file='nomfich.txt')
10 continue
read(20,'(a)', end=99) ligne
write(*,*) ligne
goto 10
99 continue
end
1.00000000000000 1.00000000000000
2.00000000000000 4.00000000000000
3.00000000000000 9.00000000000000
4.00000000000000 16.0000000000000
5.00000000000000 25.0000000000000
6.00000000000000 36.0000000000000
7.00000000000000 49.0000000000000
8.00000000000000 64.0000000000000
9.00000000000000 81.0000000000000
10.0000000000000 100.000000000000
Press any key to continue
On utilise beaucoup les fichiers séquentiels binaires (.dat). Ces fichiers n’occupent pas autant
de place mémoire que les fichiers texte. On peut traité facilement ces fichiers en utilisant un
utilitaire qui est ORIGINE.
Exemple:
Double precision :: x,y
Integer i
Open (2, file='yfctx.dat')
Do i=1,10
x=dfloat(i)
Y=x**2
Write(2,*) x,y
end do
end
Exécution:
Lecture avec origine: Traçage de y en fonction de x avec origine:
1 1 100
2 4
3 9 80
4 16
5 25 60
6 36
Y
7 49 40
8 64
20
9 81
10 100 0
1 2 3 4 5 6 7 8 9 10 11
x
A -7,10543E-15 9,20956E-15
Y
B1 1,77636E-15 3,8463E-15 40
B2 1 3,40768E-16
------------------------------------------------------------ 20
R-Square(COD) SD N P 0
1 2 3 4 5 6 7 8 9 10 11
------------------------------------------------------------ x
1 7,83025E-15 10 <0.0001
------------------------------------------------------------
12- Compilation et exécution d’un programme Fortran:
12-1-Sous Windows (extension .for, .f ou .f90):
•Saisir le programme
•Compiler le programme (build puis compile )
NB:
*assurer que vous êtes entrain de compiler le programme concerné (dernière version) si non
fermer tous les workspace puis ouvrir le programme corrigé.
*Les versions visuel Fortran imposent certaines limites ( dimension des tableaux, temps
d’exécution ect..):
•Si votre programme nécessite d’enlever ces contraintes , alors procéder comme suite:
Progect
settings
Fortan
Run time
Enlever les contrainte ( enlever x)
* Exécution ( build puis Execute)
f 77 nomfich.f
Le fichier se nome alors a.out . Si vous préférer appeler votre exécutable Chose utiliser
l’option –O
Il existe de nombreuses options de f 77. En voici deux qui sont très utiles:
f 77 – g nomfich.f –O chose
- g est indispensable si vous voulez par la suite déboguer votre programme. L’oubli de – g
rendra impossible l’utilisation du débugger. Utiliser –g systématiquement lorsque vous mettez
au point votre programme.
CP Progam1.f90 Program1.f
NB: Quel que soit le support du cours utilisé. Le fortran (et tout autre Langage)
s’apprend par l’application. A force de Forger on devient forgeron.
(3) Langage Fortran support de cours :Patrick Corde et Anne Fouilloux; INSTITUT DU
DEVELOPPEMENTET DES RESSOURCE EN INFORMATIQUE SCIENTIFIQUE ;
(Messagerie : Prenom.Nom@idris.fr).
(5) Fortran 90 Les concepts fondamentaux; Michael Met calf et John Reid; Edit EFNOR..
………………