Professional Documents
Culture Documents
Bienvenue sur la FAQ fortran, elle essayera de donner une rponse aux questions de base du FORTRAN. Je tiens souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont exactes ; les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prtend pas non plus tre complte, des cours et une listes de livres sont donns dans la FAQ et sur dveloppez.com .
FAQ FORTRAN
1. 2. 3. 4. 5. 6. 7. 8.
Information gnrale : (12) ........................................................................................................................................................4 Les variables en FORTRAN (13) ............................................................................................................................................. 9 Les boucles (9) ........................................................................................................................................................................ 15 O l'on apprend lire crire et compter ! (6) .........................................................................................................................19 Les fichiers (9) .........................................................................................................................................................................23 Les chanes de caractres (5) .................................................................................................................................................. 28 Les variables indices (listes, tableaux ...) : (10) .................................................................................................................... 31 Le programme principal et les sous programmes (6) ............................................................................................................. 35
-3Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
-4Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
-5Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Depuis Fortran 90 le format libre est disponnible qui est plus souple. Cependant beaucoup de programme sont encore crit en format fixe ou dans un mlange des deux. Voici les principales caractristiques du format libre : Le code peut commencer la premire colonne. Les lignes du code ont une longueur maximale de 132 caractres. Les commentaires sont introduit par un ! (attention tout le reste de la ligne est un commentaire). Le & signifie que les instructions continuent la ligne suivante. Le ; permet de sparer deux instructions crites sur une mme ligne.
La structure gnrale du code est ensuite assez classique. Voici le fameux programme bonjour crit en format libre : Le format libre
PROGRAM bonjour ! une ligne de commentaire commence par un ! ! declaration des variables ! les instructions write(*,*)"bonjour" ! fin du programme
-6Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Le format libre
END PROGRAM bonjour
Remarque : Il suffit de END, le nom du programme est facultatif. Pour arrter un programme avant la fin du code, on utilise l'instruction stop. Celle-ci stoppera l'xcution. Il est possible de faire suivre l'instruction stop d'un message qui s'affichera lors de l'arrt du programme. Cela peut tre utile pour dbeuguer un programme, par exemple :
STOP "ligne 156"
L'instruction pause, permet de faire une pause dans l'excution du programme sans pour autant l'arrter compltement.
FAQ FORTRAN
En format fixe
!23456 END PROGRAM ligne
A partir du fortran90, qui utilise le format libre, il suffit de placer un & la fin de la ligne pour indiquer qu'elle continue la ligne suivante. Voici un exemple :
PROGRAM ligne write(*,*)"blablablablablabla", & "et reblablabla" END PROGRAM ligne
-8Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Sommaire > Les variables en FORTRAN Quels sont les caractres utilisables pour les variables en FORTRAN ?
Auteurs : Germain Salvato-Vallverdu , En fortran, les variables ainsi que les noms de programmes, de sous programmes, de fonctions ou de modules sont limits 31 caractres et doivent obligatoirement commencer par une lettre. En fortran, sont considrs comme des lettres les 26 lettres de l'alphabet latin plus le caractre underscore _ . On peut ensuite utiliser les 26 lettres de l'alphabet latin le caractre underscore ou un chiffre. Exemples de noms de variables
! variables correctes _top top top122 _abcdefghijklmnopqrstuvwxyz1234 ! 31 characteres max ! variables incorectes 2var ! les variables doivent commencer par une lettres var-top ! pas de tiret var*top ! pas d'toile var+top ! pas de plus tat ! pas de lettre accentue 12345678910abcdefghijklmnopqrstuvwxyz_ ! trop de caractres
ATTENTION : Fortran ne prend pas en compte la casse des caractres. Ainsi Vect VECT et vect sont les mmes variables.
-9Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
- 10 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
- 11 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
- 12 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Avec 10bits l'exposant maximum pour un double prcision est de 1023. Comme le nombre est stock en base 2, la mantisse est multiplie au maximum par 21023 (et pas 101023). La gamme de nombres pouvant tre enregistre en rel double prcision est donc entre 10-308 et 10+308. Avec 7bits l'exposant maximum pour un simple prcision est de 127. La gamme de nombres pouvant tre enregistre en rel simple prcision est donc entre 10-38 et 10+38. La fonction huge() permet d'afficher la valeur des nombres maximum utilisables. Utilisation de la fonction huge
write(*,*)"Le plus grand entier ", huge (0) write(*,*)"Le plus grand rel ", huge (0.0) write(*,*)"Le plus grand rel en double prcision ",huge (0.0d0)
L'instruction suivante dfinit que toutes les variables qui commencent par une lettre entre i et n inclu soient de type integer et que les autres soient de type real (on remarquera que i et n sont les deux premires lettres de integer). On peut dfinir un type implicite pour les double prcision en remplaant real par double precision dans l'instruction suivante. Dclaration implicite des
PROGRAM bonjour implicit real (a-h,o-z) ! il est inutiles de dclarer les variables i,j et d de l'exemple prcdent ! suite du programme utilisant i j et d END PROGRAM bonjour
La commande implicit none est une nouveaut du FORTRAN90 et divise la communaut des utilisateurs de FORTRAN. Certains considrent que la dclaration implicite des variables simplifie et limite grandement la dclaration des variables. D'autres trouvent que la dclaration implicite est dangereuse et rend plus difficle la lecture d'un programme. Nous ne trancherons pas sur cette question ici, chacun de faire son choix.
- 13 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Avantages de la dclaration implicite des variables Simplification et allgement de la dclaration des variables Avantages de la dclaration explicite de toutes les variables Evite les erreurs duent aux fautes de frappes des variables Facilite la lecture d'un programme inconnue
- 14 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Sommaire > Les boucles Comment dire Si ... et Sinon ... (Boucle IF THEN ELSE) ?
Auteurs : Germain Salvato-Vallverdu , La structure If...Then...(ElseIf)...Else...EndIf permet d'introduire des conditions et d'excuter certaines lignes de code si ces conditions sont vrais. Syntaxe gnrale d'une boucle IF
If ( condition1 ) Then ! instructions raliser ElseIf (condition2 ) Then ! instructions raliser ElseIf (condition3 ) Then ! instructions raliser Else ! instructions raliser Endif si condition1 est vrai si condition2 est vrai si condition3 est vrai si aucun des trois conditions n'est vrai
Si on a une seule condition et une seule instruction, on peut galement utiliser le If logique dont la syntaxe est : Syntaxe du If logique
If ( condition ) instruction raliser si condition est vrai
Il est dangereux d'crire une condition d'galit entre des rels. En effet, les nombres rels sont soumis un arrondi du leur enregistrement sur un nombre limit de bits. Il s'en suit que la manipulation des rels peut conduire l'introduction d'erreur numrique. Celle-ci sont gnralement suffisament faible pour ne pas perturber les rsultats mais aboutissent au fait que 2 rels ne sont, en pratique, jamais gaux car ils n'ont pas t arrondis de la mme manire.
- 15 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
- 16 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Les lments dfinissant le debut, la fin et le pas de la boucle peuvent tre des expressions arithmtiques entires. Il est possible de ne pas dfinir de compteur et de faire une boucle infinie. Il faut alors ajouter une instruction de sortie l'intrieur de la boucle en utilisant la commande exit
- 17 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
- 18 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Sommaire > O l'on apprend lire crire et compter ! Comment faire crire quelque chose ?
Auteurs : Germain Salvato-Vallverdu , On utilise tout simplement la traduction litrale de l'anglais, la commande write dont voici la syntaxe gnrale : Syntaxe gnrale de la commande write
write( "o" , "comment") ! o = o est ce que je dois crire. ! comment = comment est ce que je dois crire, le format.
On spcifie o est ce qu'on doit crire en donnant le numro logique de la sortie utiliser. Par exemple, 6 dsigne l'cran. On spcifie comment est ce qu'on doit crire en donnant le format faire un lien vers format. Un exemple d'utilisation de la commande write
! exemples pour crire bonjour ! sur la sortie standard au format standard write(*,*)"bonjour" ! sur la sortie 18 au format a qui est celui des chaine de caractres write( 18 , "(a)" )"bonjour"
Les toiles dsignes les valeurs par dfaut. La sortie standard de la commande write est l'cran, Le format toile est un format standard qui dpend des compilateurs. En gnral, les numros logiques de 1 10 sont rservs et dsignent divers prifriques de l'ordinateur (par exemple 6 est l'cran). Les nombres suivants peuvent tre attribu des fichiers ou d'autres prifriques. Si l'on souhaite crire plusieurs variables ou chanes de caractres, on les spare par une virgule. Exemple avec plusieurs variables
real::a,b,c a = 2.0 b = 4.0 c = 6.0 write(*,*)"a = ",a," b = ",b," c = ",c
On spcifie o est ce qu'on doit lire en donnant le numro logique de l'entre utiliser. Par exemple, 5 dsigne le clavier. On spcifie comment est ce qu'on doit lire en donnant le format dans lequel est crit ce que l'on souhaite lire. faire un lien vers format.
- 19 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
La structure prcdente contenant un write-read-write est vivement recommande car elle permet de vrifier ce que l'on a lu. Pour lire plusieurs variables en mme temps, on les spare par une virgule. Dans l'exemple suivant, l'utilisateur devra saisir son nom puis tapper "Entre", puis saisir son prnom et tapper "Entre". Exemples de lectures avec la commande read
write(*,*)"Quel est votre nom et votre prenom ?" read(*,*)nom,prenom write(*,*)" nom = ",nom," prenom = ",prenom
- 20 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
100
Avec iostat On peut utiliser l'option iostat dans l'instruction read qui permet d'enregistrer dans un entier un nombre qui permet d'indentifier s'il y a une erreur et de quel type. La valeur de l'entier dpend du compilateur mais son signe est normalis. Si l'entier est nul, il n'y a pas d'erreur. Dans le cas de la lecture d'un fichier, une valeur ngative signifie que l'on a atteint la fin du fichier. Une valeur positive signifie toujours une erreur. Exemple d'utilisation de iostat
PROGRAM erreur implicit none integer::entier,io write(*,*)"entrer un entier" read(*,"(i5)",iostat=io)entier If( io /= 0 ) Then write(*,"(i5)")entier Else STOP "erreur de lecture" Endif ! suite des instructions ... END PROGRAM erreur
- 21 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Oprateurs mathmatiques
! multiplication de i et j prod = i * j ! division de i et j div = i / j ! i puissance j pui = i ** j END PROGRAM calcul
- 22 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Sommaire > Les fichiers Comment est crit le contenu d'un fichier ?
Auteurs : Germain Salvato-Vallverdu , Il existe deux types de fichiers : les fichiers ASCII et les fichiers binaires. Les fichiers ASCII sont des fichiers dans lesquels ce qui est crit est format et lisible par quelqu'un, par exemple un fichier texte. Comme leur nom l'indique les fichiers binaires sont crits en langage binaire et ne sont pas directement lisible par quelqu'un. Il doit se servir d'un programme pour les lires et formater ce qu'ils contiennent. En FORTRAN, on peut crer soit des fichiers formats (ASCII) soit des fichiers binaires et lire ou crire sur ces deux types de fichiers. Pour cela on spcifie lors de l'ouverture du fichier de quel type il est avec l'option form. Choix du type de contenu d'un fichier
! ouverture d'un fichier binaire open(11, file="fichier_binaire", form="unformatted") ! ouverture d'un fichier ASCII open(11, file="fichier_ASCII", form="formatted")
Par dfaut, si l'on ne prcise pas l'option form dans l'instruction open les fichiers sont formats (ASCII).
- 23 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Par dfaut les fichiers sont des fichiers ASCII (formats) et accs squentiel. Voici une syntaxe plus complte de l'instruction open. Pour connatre l'ensemble des options consulter l'un des cours disponibles.
- 24 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
- 25 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
! existe = .true. write(*,*)"le fichier existe" ElseIf( .NOT. existe) Then ! existe = .false. write(*,*)"le fichier n'existe pas" STOP Endif
1000
Lors de la lecture d'un fichier, on peut rajouter dans l'instruction read l'option iostat=entier. Si la fin du fichier est atteinte, entier prendra une valeur ngative. La valeur dpend du compilateur on testera donc simplement le signe. Dtection de la fin du fichier avec iostat
! on va lire un fichier dont on ne connait pas le nombre de ligne open(10, file="fichier") i=0 Do read(10,*,iostat=io)var1,var2 If( io < 0 ) exit i = i + 1 Enddo write(*,*)"la lecture a atteind la fin du fichier"
- 26 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
- 27 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Sommaire > Les chanes de caractres Comment affecter une valeur une chane de caractres ?
Auteurs : Germain Salvato-Vallverdu , Une chane de caractres se note entre guillemets simples ou doubles. On affecte une valeur une chane de caractres avec le signe = comme pour les autres types de variable. Exemple de chane de caractres
character(len=20)::chaine chaine = "une chaine de caractre"
Une chane de caractres a une certaine longueur, donne lors de sa dclaration (le paramtre len). Elle ne peut pas contenir plus de caractres que le nombre indiqu lors de sa dclaration. Si la chane de caracres que l'on veut enregistrer dans une variable est plus longue que la longueur de la variable, seuls les premiers caractres sont enregistrs. Si la chane de caractres que l'on veut enregistrer dans une variable est plus courte que la longueur de la variable les caractres manquants sont complts par des espaces (peut dpendre du compilateur). Exemples
character(len=4)::courte character(len=20)::longue courte = "bonjour" ! la variable courte ne contient que "bonj" longue = "bonjour" ! la variable longue contient "bonjour
"
- 28 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Cette fonction peut tre trs utile par exemple pour reprer une ligne dans un fichier o est inscrit un repre. Exemple d'utilisation de index
... character(len=100)::ligne integer::k ! ouverture du fichier open(10,file="resultats",action="read") ! recherche du repre Do ligne = "" read(10,"(a)")ligne k = index( ligne , "repere" ) ! si k n'est pas 0 c'est que ligne contient "repere" If( k /= 0 ) exit Enddo ! lecture des informations souhaites sur ligne ou sur la suite du fichier ...
L'criture dans une variable chane de caractre par rapport une simple affectation prsente l'intrt que l'on peut choisir le format dans lequel on crit.
- 29 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
XX
Attention, fortran complte les automatiquement les chanes de caractres par des espaces, donc si on remplace le contenu d'une variable chane de caractre par son contenu en ayant supprim les espaces ils sont rajouts automatiquement pour complter la longueur de la variable chane de caractres. Attention la longueur des chanes
! on reprend l'exemple prcdent character(len=10)::chaine character(len=7)::courte chaine = "bonjour" ! chaine contient "bonjour
"
chaine = trim(chaine) ! comme les caractres manquants sont complts par des espaces ! chaine contient toujours "bonjour " courte = trim(chaine) ! courte contient "bonjour"
La fonction trim est trs utile pour crire des noms de fichier dans une variable chane de caractres car elle permet d'avoir des noms de fichier sans espaces.
- 30 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Sommaire > Les variables indices (listes, tableaux ...) : Qu'est ce qu'une variable indice ?
Auteurs : Germain Salvato-Vallverdu , Une variable simple correspond une zone mmoire et contient une valeur. Il est possible de regrouper sous un mme nom de variable un ensemble de zone mmoire et donc un ensemble de valeurs. Chaque valeur (ou zone mmoire) de la mme variable est alors reprs par un indice. C'est variables sont, par exemple, des listes (variables un indices) ou des tableaux (variables 2 indices) ect ... Elles sont trs largement utilise dans les programmes.
On remarque que lorsqu'on donne la dimension d'une liste ou d'un tableaun, on peut prciser les valeurs min et max des indices. Ceux-ci ne commencent pas forcment 1 ou 0. Dans le troisime exemple on ne donne que la dimension, 10, l'indice commence alors 1. Dans une dclaration dynamique, on ne prcise que le nombre d'indices souhaits. Puis, pendant l'excution, on alloue, avec la commande allocate, la mmoire ncessaire au moment ou on a besoin de la variable. On peut ensuite librer la zone mmoire lorsqu'on n'en a plus besoin, avec la commande deallocate. Dclaration dynamique
! une liste d'entier integer,dimension(:),allocatable::liste allocate( liste( ndim ) ) .... deallocate( liste(:) ) ! un tableau de rel double prcision double precision,dimension(:,:),allocatable::tableau allocate( tableau( 1:ndim ,-ndim:ndim ) ) ....
- 31 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Dclaration dynamique
deallocate( tableau(:,:) )
L'intrt d'allouer les variables indices de faon dynamique est de n'utiliser que la mmoire ncessaire au moment o on en a besoin. De plus, on peut calculer la dimension d'une variable indice dans le programme et avoir une variable indice de la dimension souhaite. Remarque : Dans les sous programmes la dclaration dynamique est impossible, sauf dans le cas des modules. Dans le cas de la dclaration statique, l'utilisation des paramtres pour dclarer les dimensions des variables est utile.
Comment agir sur tout ou une partie d'une variable indice ? (Fortran90)
Auteurs : Germain Salvato-Vallverdu , En fortran77, pour agir sur plusieurs lments d'une variable indice, il faut crire une instruction pour chaque lment ou crire une boucle. Le fortran90 permet d'agir sur plusieurs lments en une seule instructions. affectation multiple
integer,parameter::ndim=10 integer,dimension(1:ndim)::liste double precision,dimension(ndim,ndim)::matrice ! liste(:) se rfre l'ensemble des lments de liste ! matrice(:,:) se rfre l'ensemble des lments de matrice ! j'affecte 0 tous les lments de liste liste(:) = 0 ! j'affecte 0.d0 tous les lments de matrice matrice(:,:) = 0.d0 ! on met un 1.d0 dans la premire ligne de matrice matrice(1,:) = 1.d0 ! on met un 2 dans les lments de ndim/2 ndim de liste liste( ndim/2 : ndim ) = 2
- 32 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Remarque : Il n'est pas ncessaire de prciser les : entre parenthses, le nom de la variable est suffisant. Cependant par un souci de clart et de lisibilit du programme il est prfrable de l'crire.
La multiplication ou division de variables indices ayant un sens particulier (produit scalaire, produit de matrice), des fonctions spciales sont disponibles. Remarque : Il n'est pas ncessaire de prciser les : entre parenthses, le nom de la variable est suffisant. Cependant par un souci de clart et de lisibilit du programme il est prfrable de l'crire.
FAQ FORTRAN
Exemple de produit
double precision,dimension(ndim)::liste double precision,dimension(ndim,ndim)::matrice double precision::produit produit = product( liste(:) ) produit = product( matrice(:,:) )
ATTENTION : Comme dans un produit de matrice, le nombre de colonnes du premier argument de matmult doit tre gal au nombre de lignes du second argument.
- 34 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Sommaire > Le programme principal et les sous programmes Quelle est la diffrence entre une FUNCTION et une SUBROUTINE ?
Auteurs : Germain Salvato-Vallverdu , Les function et les subroutine sont littralement traduits de l'anglais par fonction et sous-programme. Ce sont les deux types de sous programmes disponnibles en Fortran. Les diffrences majeures entre une fonction et une subroutine sont : Une function est galement une variable qui contient le rsultat de la fonction alors que le ou les rsultats d'une subroutine sont en paramtres. Il s'ensuit qu'une fonction doit tre dclare. Pour appeler une subroutine on utilise la commande call alors qu'une function n'en a pas besoin. Une function doit forcment renvoyer un rsultat stock dans une variable (qui peut tre un tableau). Une subroutine peut ne renvoyer aucun rsultat et juste raliser une action (crire dans un fichier, nettoyer l'cran ...). Les fonctions Voyons un exemple simple d'une fonction et de son appel. Une fonction est, par exemple, de la forme f(x) = a*x + b. Voici un programme qui utilise cette fonction : Un exemple de fonction
PROGRAM test_function ! programme principal implicit none integer::i real::f,a,b,x,y a = 1.d0 b = 2.d0 x=0.d0 Do i=1,100 x = x + 0.1d0 write(*,*)x,f(a,b,x) Enddo ! autre exemple x=0.d0 Do i=1,100 x = x + 0.1d0 y = f(a,b,x) write(*,*)x,y Enddo END PROGRAM test_function ! * * * * * * * * * * * * FUNCTION f(a,b,x) implicit none real,intent(in)::a,b,x real::f ! dans une fonction son nom est dclar f = a*x + b ! quelque part dans une fonction on doit assigner une valeur f END FUNCTION f
! appel de la fonction
! appel de la fonction
Les subroutines
- 35 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Pour continuer l'exemple prcdent, on peut programmer une subroutine qui va lire les paramtres a et b de la fonction f(a,b,x). Un Exemple de subroutine
PROGRAM test_function ! programme principal ! la subroutine n'est pas dclare implicit none integer::i real::a,b,f,x call lec(a,b) ! on utilise call pour appeler une subroutine
x = 0.d0 Do i=1,100 x = x + 0.1d0 write(*,*)x,f(a,b,x) Enddo END PROGRAM test_function ! * * * * * * * * * * * * * * SUBROUTINE lec(a,b) implicit none real,intent(out)::a,b
write(*,*)"entrer a et b" read(*,*)a,b write(*,*)"a = ",a write(*,*)"b = ",b END SUBROUTINE lec ! * * * * * * * * * * * * * * FUNCTION f(a,b,x) implicit none real,intent(in)::a,b,x real::f ! dans une fonction son nom est dclar f = a*x + b ! quelque part dans une fonction on doit assigner une valeur f END FUNCTION f
Les argument d'une subroutine peuvent tre de plusieurs types argument sortant : integer,intent(out)::p1 argument entrant : integer,intent(in)::p2 argument entrant/sortant : integer,intent(inout)::p3 Les arguments entrants ne peuvent pas tre modifis dans la subroutine. Une subroutine doit assigner une valeur un argument sortant.
- 36 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
L'entier correspond la place de l'argument. Par exemple, dans notre cas, 1 correspond p1, 2 p2 et 3 p3. La valeur 0 permet de rcuprer le nom du programme. Ceci peut tre mis profit pour si l'excutable est enregistr sous des noms diffrents afin d'avoir une excution diffrente selon le nom du programme. Les paramtres p1, p2 ou p3 sont enregistrs dans une variable de type chane de caractres. Voici un exemple d'utilisation : Exemple d'utilisation de getarg
PROGRAM test_getarg implicit none integer::i,p1,p2,p3 integer,dimension(3)::p character(len=10)::parm,nom ! on rcupre le nom du programme call getarg(0,nom) ! on rcupre les valeurs des paramtres call getarg(1,parm) read(parm,*)p1 call getarg(2,parm) read(parm,*)p2 call getarg(3,parm) read(parm,*)p3 ! on peut faire une boucle Do i=1,3 call getarg(i,parm) read(parm,*)p(i) Enddo END PROGRAM test_getarg
FAQ FORTRAN
ne doivent pas tre modifi), sortant (ils viennent de la subroutine vers le programme appelant et doivent tre assigns) ou les deux. Exemple d'arguments
PROGRAM test_arg implicit none integer::a,b,c a = 2 c = 1 call sub(a,b,c) END PROGRAM test_arg ! * * * * * * * SUBROUTINE sub(a,b,c) ! il n'est pas ncessaire que ! mais a facilite la lecture implicit none integer,intent(in)::a ! integer,intent(out)::b ! integer,intent(inout)::c ! b = a + c c = c + 1 END SUBROUTINE sub
les arguments aient le mme nom, seule la position est importante du programme a n'est pas modifiable b doit tre assign c peut tre modifi
Il n'est pas obligatoire de prciser l'intent, cela peut cependant viter certaines erreurs et facilite la lecture du programme.
Comment utiliser un common pour partager des variables entre sous programmes (F77) ?
Auteurs : Germain Salvato-Vallverdu , Le common permet de dclarer un zone mmoire commune dans laquelle seront enregistres des variables. Elles seront accessibles par tous les sous programmes dans lesquels le common est dclar. Reprenons l'exemple utilis par les arguments pour comparer. Utilisation d'un common pour transferer des variables
! * * * * ! syntaxe d'un common common /nom de la zone commune/ liste des variables ! * * * * PROGRAM test_arg implicit none integer::a,b,c common /arg/ a,b,c a = 2 c = 1 call sub END PROGRAM test_arg ! * * * * * * *
! je dclare le common
- 38 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Il n'est plus ncessaire de donner les variables a,b et c en argument de la subroutine sub car elles sont accessibles par l'intermdiaire du common. Dans ce cas les variables de la zone commune sont toutes modifiables par la subroutine, pour prciser un intent il faut utiliser les paramtres. Pour ne pas avoir recrire dans chaque sous programme le common, il tait courant d'inclure un fichier qui contenait les variables du common. Ceci avait galement l'avantage de ne pas avoir modifier tous les common dans tous les sous programmes chaque modification. Voici un exemple : Utilisation de include
PROGRAM test_arg implicit none include "arg" a = 2 c = 1 call sub END PROGRAM test_arg ! * * * * * * * SUBROUTINE sub implicit none include "arg" b = a + c c = c + 1 END SUBROUTINE sub ! * * * * * * * * * * * * * * * !contenu du fichier arg integer::a,b,c common /arg/ a,b,c
Comment utiliser un module pour partager des variables entre sous programmes (F90) ?
Auteurs : Germain Salvato-Vallverdu , Les modules sont la grande nouveaut du fortran 90 et apporte au fortran un soupon de programmation oriente objet. L'utilisation des modules pour partager des variables entre des sous programmes n'est qu'une infime partie de ce qu'ils apportent. Dans ce cas, leur utilisation est similaire celle du common. On va crer un module, dans lequel seront dclares des variables qui seront disponnibles dans tous les sous programmes qui utilisent le module.
- 39 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
L'utilisation d'un module apporte cependant une contrainte. Ils doivent tre compils avant le programme principal. Plusieurs solutions sont possibles : Lors de la compilation placer le nom du module en premier, par exemple : ifort module.f90 program.f90 Si le programme est court et que tous les sous programmes et modules sont dans un mme fichier, placer les modules en premier, en tte du fichier dans l'ordre qu'ils apparaissent. Puis compiler simplement le fichier comme un programme normal. Compilez l'avance vos modules (s'arrter la compilation, cration de l'objet). Puis lors de la compilation du programme ajouter les .o des modules.
Pour les compilateurs ifort, g95 ou gfortran, la compilation (cration de l'objet) se fait en ajoutant l'option -c. Il est possible de n'utiliser qu'une partie d'un module avec l'instruction only. On va ainsi slectionner les variables qui seront accessibles et celles qui ne le seront pas. Voici un exemple : Utilisation de only
MODULE arg implicit none integer::a,b,c double precision::x END MODULE arg ! * * * * * * * PROGRAM test_arg USE arg, only : a,c implicit none a = 2 c = 1
- 40 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/
FAQ FORTRAN
Utilisation de only
call sub END PROGRAM test_arg ! * * * * * * * SUBROUTINE sub USE arg, only : a,b,c implicit none b = a + c c = c + 1 END SUBROUTINE sub
- 41 Copyright 2008 Developpez LLC. Tout droits rservs Developpez LLC. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://fortran.developpez.com/faq/