Beruflich Dokumente
Kultur Dokumente
10 fvrier 2012
Langage Fortran
10 fvrier 2012
1 / 247
Environnement systme Procdures daccs lenvironnement Tableaux dynamiques Introduction Passage en argument de procdure Composante allouable dun type driv Allocation dun scalaire ALLOCATABLE Allocation/rallocation via laectation Procdure MOVE_ALLOC de rallocation Nouveauts concernant les modules Lattribut PROTECTED Linstruction IMPORT du bloc interface USE et renommage doprateurs Entres-sorties - Partie I Constantes denvironnement pour les entres_sorties Nouveaux paramtres des instructions OPEN/READ/WRITE Entres-sorties asynchrones Entres-sorties en mode stream Pointeurs Vocation (INTENT) des arguments muets pointeurs Association et reprolage Procedures Dclaration de procdures Pointeurs de procdures
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 2 / 247
Nouveauts concernant les types drivs Constructeurs de structures Visibilit des composantes Paramtres dun type driv
Constructeur et type paramtrable Assumed-type-parameter et deered-type-parameter
Variable polymorphique
Dnition Argument muet polymorphique Variable polymorphique : attributs POINTER, ALLOCATABLE Construction SELECT TYPE Type eectif dune variable polymorphique
Variable polymorphique et oprateur daectation Composante pointeur de procdure Procdures attaches un type
Procdure Procdure Procdure Procdure attache attache attache attache par nom par nom gnrique par oprateur via le mot-cl FINAL
Langage Fortran 10 fvrier 2012 3 / 247
Type abstrait
8
Entres-sorties - Partie II Traitement personnalis des objets de type driv Interoprabilit entre entits C et Fortran Introduction Les types intrinsques Les tableaux Les variables globales Types drivs Fortran/structures de donnes C Les pointeurs Arguments dappel/arguments muets
Arguments de types intrinsques Arguments de types pointeurs : le type C_PTR Arguments de types structure de donnes
Modules intrinsques Fonctions dinterrogation Procdures de gestion du mode darrondi Gestion des exceptions Procdures de gestion des interruptions Procdures de gestion du contexte arithmtique Modules intrinsques
Module IEEE_EXCEPTIONS Module IEEE_ARITHMETIC Module IEEE_FEATURES
Documentations
11
Divers numration Bloc associate Attribut volatile Longueurs des identicateurs et des instructions Constantes binaires, octales et hexadcimales Nouveauts concernant certaines fonctions intrinsques Messages derreurs Constantes complexes
Langage Fortran
10 fvrier 2012
5 / 247
Environnement systme
Environnement systme Procdures daccs lenvironnement Tableaux dynamiques Nouveauts concernant les modules Entres-sorties - Partie I Pointeurs Procedures Nouveauts concernant les types drivs Entres-sorties - Partie II Interoprabilit entre entits C et Fortran Arithmtique IEEE et traitement des exceptions
10
Langage Fortran
10 fvrier 2012
6 / 247
Environnement systme
11
Divers
Langage Fortran
10 fvrier 2012
7 / 247
Environnement systme
commande (y compris les arguments sils existent) qui a servi lancer lexcutable. Elle sera valorise avec des blancs si la rcupration est impossible ; length est un entier qui sera valoris la longueur de la chane de caractres ci-dessus. Si impossibilit, 0 sera retourne ; status est un entier qui sert de code retour. Sa valeur sera :
0 si lexcution sest bien droule ; -1 si largument command a t prcise avec une taille infrieure la longueur de la
commande ;
> 0 si lexcution sest termine en erreur.
Exemple
program p implicit none character ( len =:) , allocatable :: commande integer long call GET_COMMAND ( LENGTH = long ) allocate ( character ( len = long ) :: commande ) call GET_COMMAND ( COMMAND = commande ) print * , " Commande lance == > " , commande deallocate ( commande ) end program p
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 8 / 247
Environnement systme
dsir parmi ceux spcis lors du lancement de lexcutable. La valeur 0 fait rfrence au nom de lexcutable et la fonction COMMAND_ARGUMENT_COUNT retourne le nombre darguments qui suivent ; value est une chane de caractres dans laquelle sera retourne largument dsign ci-dessus. Une chane blancs sera renvoye si la valorisation est impossible ; length est un entier qui sera valoris la longueur de la chane de caractres ci-dessus. Si impossibilit, 0 sera retourne ; status est un entier qui sert de code retour qui est valoris de la mme faon que pour la procdure GET_COMMAND.
Exemple
program p implicit none character ( len =:) , allocatable :: arg integer long , i do i =0 , C O M M A N D _ A R G U M E N T _ C O U N T () call G E T _ C O M M A N D _ A R G U M E N T ( NUMBER =i , LENGTH = long ) allocate ( character ( len = long ) :: arg ) call G E T _ C O M M A N D _ A R G U M E N T ( NUMBER =i , VALUE= arg ) print * , " Argument de rang " , i , " == > " , arg deallocate ( arg ) end do end program p
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 9 / 247
Environnement systme
GET_ENVIRONMENT_VARIABLE( name [,value] [,length] [,status] [,trim_name] ) name est une chane de caractres valorise au nom de la variable denvironnement
dont on dsire le contenu ; value est une chane de caractres dans laquelle sera retourne le contenu de la variable denvironnement fournie ci-dessus. Une chane blancs sera renvoye dans les cas suivant :
la variable denvironnement indique nexiste pas ; la variable denvironnement existe mais son contenu est vide ; la notion de variable denvironnement nexiste pas sur la plateforme utilise.
denvironnement fournie si celle-ci existe et a un contenu dni. Sinon 0 sera la valeur retourne. status est un entier qui sert de code retour qui est valoris de faon suivante :
si la variable denvironnement existe avec un contenu vide ou bien admet une valeur
ny a pas de notion de variable denvironnement sur la plateforme utilise. trim_name est un logique. Sil est fourni avec .FALSE. comme valeur alors les
caractres blancs situs la n du paramtre name seront considrs comme signicatifs. Ils seront ignors dans les autres cas.
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 10 / 247
Environnement systme
Exemple program p implicit none character ( len =:) , allocatable :: path integer long call G E T _ E N V I R O N M E N T _ V A R I A B L E ( NAME = " PATH " , LENGTH = long ) allocate ( character ( len = long ) :: path ) call G E T _ E N V I R O N M E N T _ V A R I A B L E ( NAME = " PATH " , VALUE= path ) print * , " PATH = " , path deallocate ( path ) end program p
Langage Fortran
10 fvrier 2012
11 / 247
Tableaux dynamiques
Environnement systme Tableaux dynamiques Introduction Passage en argument de procdure Composante allouable dun type driv Allocation dun scalaire ALLOCATABLE Allocation/rallocation via laectation Procdure MOVE_ALLOC de rallocation Nouveauts concernant les modules Entres-sorties - Partie I Pointeurs Procedures Nouveauts concernant les types drivs Entres-sorties - Partie II
Langage Fortran
10 fvrier 2012
12 / 247
Tableaux dynamiques
Interoprabilit entre entits C et Fortran Arithmtique IEEE et traitement des exceptions Divers
10
11
Langage Fortran
10 fvrier 2012
13 / 247
Tableaux dynamiques
Introduction
Introduction
En Fortran 95, du fait des insusances notoires des tableaux dynamiques (attribut ALLOCATABLE), on leur substituait souvent les pointeurs plus puissants, mais prsentant des inconvnients en terme de performance. En Fortran 2003, les tableaux allouables sont dsormais grs par un descripteur interne analogue celui dun pointeur. Ce descripteur peut tre vu comme un type driv semi-priv contenant, entre autres, ladresse dune zone dynamique anonyme. Il en rsulte que lon pourra dsormais tirer prot des avantages jusque-l rservs aux tableaux dclars avec lattribut POINTER. Ces avantages sont abords ci-aprs. On rservera alors lusage des pointeurs aux fonctionnalits qui leur sont propres : notion dalias dynamique dentits ventuellement complexes, gestion de listes chanes, pointeurs de procdures dans les types drivs, ...
Langage Fortran
10 fvrier 2012
14 / 247
Tableaux dynamiques
En Fortran 95, un tableau allouable ne pouvait tre pass en argument dappel que sil tait dj allou. Au sein de la procdure appele, il tait considr comme un simple tableau prol implicite (sans lattribut ALLOCATABLE). En Fortran 2003 et en contexte dinterface explicite, un argument muet peut avoir lattribut ALLOCATABLE. Largument dappel correspondant devra aussi avoir cet attribut ainsi que le mme rang et le mme type/sous-type, sans tre ncessairement dj allou. Dans le cas o le tableau est allou avant dtre transmis, il sera possible de rcuprer ses bornes au sein de la procdure appele comme ctait le cas auparavant au moyen de lattribut POINTER. Exemple
program alloca implicit none real , dimension (:) , ALLOCATABLE :: vec_x , vec_y allocate ( vec_y ( -2:100) ) call sp ( vec_x , vec_y ) print * , vec_x ((/ lbound ( vec_x ) , ubound ( vec_x ) /)) , deallocate ( vec_x ); deallocate ( vec_y ) CONTAINS subroutine sp ( v_x , v_y ) real , dimension (:) , ALLOCATABLE , intent ( inout ) :: ALLOCATE ( v_x (256)); call random_number ( v_x ); call print * , " Bornes inf / sup ( v_y ) : " , lbound ( v_y ) , end subroutine sp end program alloca
Remarque : Si un argument muet a la vocation INTENT(OUT), largument dappel correspondant est automatiquement dsallou lappel de la procdure (sil tait allou).
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 15 / 247
Tableaux dynamiques
Remarques : Cest bien entendu le descripteur du tableau allouable qui sera stock dans la composante A de mat. Quand un objet de type driv est dsallou, toute composante ayant lattribut ALLOCATABLE est automatiquement dsalloue. Si un destructeur (nal subroutine voir page 97) est attach lobjet, il est appliqu avant la dsallocation de cette composante.
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 16 / 247
Tableaux dynamiques
Dans cet exemple, la fonction strdup retourne une chane de caractres allouable dont la longueur est celle de la chane passe en argument dbarrasse des blancs de n. Lallocation est eectue laide de linstruction ALLOCATE en explicitant le type et la longueur dsire.
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 17 / 247
Tableaux dynamiques
Si var_alloc est dj alloue, elle est automatiquement dsalloue si des dirences concernant le prol ou la valeur des length type parameters (cf. 8.2) existent entre var_alloc et expression. Si var_alloc est ou devient dsalloue, alors elle est ralloue selon le prol et les paramtres de type de expression.
La variable scalaire NAME de type CHARACTER sera alloue lors de la premire aectation avec une longueur LEN=9. Lors de la 2e aectation, elle sera dsalloue puis ralloue avec une longueur LEN=20.
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 18 / 247
Tableaux dynamiques
noter que cette possibilit de rallocation dynamique facilite la gestion des chanes dynamiques ainsi que le respect de la contrainte de conformance lors dune aectation de tableaux. Ainsi par exemple :
real , ALLOCATABLE , dimension (:) :: x ... ! -- allocate ( x ( count ( masque )) ) <--- Devient inutile ! ... x = pack ( tableau , masque )
Le tableau x est automatiquement allou/rallou avec le bon prol sans que lon ait se proccuper du nombre dlments vrais de masque. Note :
ce processus dallocation/rallocation automatique peut tre inhib en mentionnant
gauche de laectation, la prsence du caractre : signie quon fait rfrence un sous-ensemble dune entit (NAME ou x) qui doit exister et donc tre dj alloue.
Langage Fortran
10 fvrier 2012
19 / 247
Tableaux dynamiques
est INTENT(INOUT) ;
TO fait rfrence une entit allouable de type compatible avec FROM et de mme
rang. Sa vocation est INTENT(OUT). En retour de ce sous-programme, le tableau allouable TO dsigne le tableau allouable FROM ; la zone mmoire pralablement dsigne par TO est dsalloue. En fait, cest un moyen permettant de vider le descripteur de FROM aprs lavoir recopi dans celui de TO.
Si FROM nest pas allou en entre, TO devient non allou en sortie ; sinon, TO devient allou avec les mmes caractristiques (type dynamique,
paramtres de type, bornes de tableau, valeurs) que FROM avait en entre. Parce que la vocation de TO est INTENT(OUT), il y aura dsallocation de celui-ci ;
Si TO a lattribut TARGET, tout pointeur initialement associ FROM devient associ
TO.
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 20 / 247
Tableaux dynamiques
Exemple real , ALLOCATABLE , dimension (:) :: grid , tempgrid ... ALLOCATE ( grid ( - N : N )) ! Allocation initiale de grid ... ALLOCATE ( tempgrid ( -2* N :2* N )) ! Allocation d une grille plus grande ... ! tempgrid (::2) = grid ! Redistr ibution des valeurs de grid ... ! call MOVE_ALLOC ( TO = grid , FROM = tempgrid )
TO
x
grid
FROM
N 4
+N
x
tempgrid
2N
3
+2N
Tableaux dynamiques
Exemple prcdent en Fortran 95 real , ALLOCATABLE , dimension (:) :: grid , tempgrid ... ! ALLOCATE ( grid ( - N : N )) ! Allocation initiale de grid ... ! ALLOCATE ( tempgrid ( -2* N :2* N )) ! Allocation d une grille plus grande ... ! tempgrid (::2) = grid ! Redistr ibution des valeurs de grid ... ! DEALLOCATE ( grid (:) ) ALLOCATE ( grid ( -2* N :2* N ) ) grid (:) = tempgrid (:) DEALLOCATE ( tempgrid (:) )
Langage Fortran
10 fvrier 2012
22 / 247
Environnement systme Tableaux dynamiques Nouveauts concernant les modules Lattribut PROTECTED Linstruction IMPORT du bloc interface USE et renommage doprateurs Entres-sorties - Partie I Pointeurs Procedures Nouveauts concernant les types drivs Entres-sorties - Partie II Interoprabilit entre entits C et Fortran Arithmtique IEEE et traitement des exceptions
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 23 / 247
10
11
Divers
Langage Fortran
10 fvrier 2012
24 / 247
Lattribut PROTECTED
Lattribut PROTECTED
De mme que la vocation INTENT(in) protge les arguments muets dune procdure, lattribut PROTECTED protge les entits dclares avec cet attribut dans un module ; elles sont exportables (use association) mais pas modiables en dehors du module o est faite la dclaration :
real ( kind = my_prec ) , PROTECTED , dimension (10 ,4) :: tab cet attribut nest spciable que dans le module o est faite la dclaration, pas dans
Langage Fortran
10 fvrier 2012
25 / 247
IMPORT sans liste permet limportation de toutes les entits vues par host association.
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 26 / 247
Les oprateurs non intrinsques dun module peuvent tre renomms au moment de leur importation via linstruction USE. Voici un exemple :
USE my_module OPERATOR (. MY_OPER .) = > OPERATOR (. OPER .)
Langage Fortran
10 fvrier 2012
27 / 247
Entres-sorties - Partie I
Environnement systme Tableaux dynamiques Nouveauts concernant les modules Entres-sorties - Partie I Constantes denvironnement pour les entres_sorties Nouveaux paramtres des instructions OPEN/READ/WRITE Entres-sorties asynchrones Entres-sorties en mode stream Pointeurs Procedures Nouveauts concernant les types drivs Entres-sorties - Partie II Interoprabilit entre entits C et Fortran
Langage Fortran
10 fvrier 2012
28 / 247
Entres-sorties - Partie I
10
11
Langage Fortran
10 fvrier 2012
29 / 247
Entres-sorties - Partie I
Le compilateur Fortran 2003 est livr avec plusieurs modules intrinsques notamment ISO_FORTRAN_ENV permettant laccs des entits publiques qui concernent lenvironnement :
INPUT_UNIT, OUTPUT_UNIT et ERROR_UNIT sont des constantes symboliques de type
entier correspondant aux numros des units logiques relatifs lentre standard, la sortie standard et la sortie derreur. Ils remplacent avantageusement lastrisque employ traditionnellement au niveau du paramtre UNIT des instructions READ/WRITE .
IOSTAT_END et IOSTAT_EOR sont des constantes symboliques de type entier
correspondant aux valeurs ngatives prises par le paramtre IOSTAT des instructions dentre/sortie en cas de n de chier ou n denregistrement. Cela permet denrichir la portabilit dun code Fortran. Cependant, les cas derreurs gnrent une valeur positive restant dpendante du constructeur.
Langage Fortran
10 fvrier 2012
30 / 247
Entres-sorties - Partie I
rcuprant un message si une erreur, une n de chier ou une n denregistrement intervient lissue de lentre-sortie. ROUND : lors dune entre-sortie formate le mode darrondi peut tre contrl laide du paramtre ROUND de instruction OPEN qui peut prendre comme valeurs : "up", "down", "zero", "nearest", "compatible" ou "processor_defined". Cette valeur peut tre change au niveau des instructions READ/WRITE laide du mme paramtre ou via les spcications de format ru, rd, rz, rn, rc et rp. La valeur par dfaut dpend du processeur utilis. SIGN : ce paramtre a t ajout linstruction OPEN pour la gestion du signe + des donnes numriques en sortie. Il peut prendre les valeurs : "suppress", "plus" ou "processor_defined". Cette valeur peut tre change au moment de linstruction WRITE laide du mme paramtre, ou bien laide des spcications de format ss, sp et s. La valeur par dfaut est "processor_defined". IOSTAT : deux nouvelles fonctions lmentaires is_iostat_end et is_iostat_eor permettent de tester la valeur de lentier rfrenc au niveau du paramtre IOSTAT de linstruction READ. Elles retournent la valeur vraie si une n de chier ou une n denregistrement a t dtecte. Remarque : les paramtres comme IOSTAT peuvent dornavant rfrencer tout type dentier.
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 31 / 247
Entres-sorties - Partie I
Exemple
program io use I S O_F OR TRAN_E NV implicit none character ( len =256) :: integer ( kind =2) :: integer :: real :: namelist / var /i , a , b
message stat i a, b
open ( UNIT =1 , FILE = " new_param_d ata " , & FORM = " formatted " , ACTION = " read " , & ACCESS = " sequential " , ROUND = " up " ) open ( UNIT = OUTPUT_UNIT , SIGN = " plus " ) do read ( UNIT =1 , FMT = " ( i4 ,1 x , rd , f8 .6 ,1 x , rn , f10 .1) " , & IOSTAT =stat, IOMSG = message ) i , a , b if ( is_iostat_end ( stat ) ) exit if ( stat > 0 ) then write ( OUTPUT_UNIT , * ) message ; exit end if write ( OUTPUT_UNIT , NML = var ) end do close ( UNIT =1 ) end program io
Langage Fortran
10 fvrier 2012
32 / 247
Entres-sorties - Partie I
Entres-sorties asynchrones
Entres-sorties asynchrones
Les entres-sorties peuvent tre faites en mode asynchrone, permettant ainsi au programme de continuer son excution pendant que lentre-sortie est en cours. Ce mode de fonctionnement nest possible que pour les chiers externes ouverts avec le paramtre ASYNCHRONOUS=yes. Ce mme paramtre sera fourni galement au niveau de linstruction READ/WRITE si lon dsire lancer une telle entre-sortie, sinon, par dfaut ou en prcisant le paramtre ASYNCHRONOUS=no, elle sera synchrone quel que soit le mode douverture eectue. Une synchronisation peut tre demande explicitement laide de linstruction WAIT. Celle-ci est implicite la rencontre dun INQUIRE ou dun CLOSE sur le chier. Pour cette instruction on retrouve certains paramtres des instructions READ/WRITE tels que : UNIT, END, EOR, ERR, IOSTAT, IOMSG, ERR, ID Le paramtre ID fait rfrence une variable entire qui a t prlablement valorise lissue dune opration dentre-sortie. Sil nest pas spci au niveau de linstruction WAIT, celle-ci concerne toutes les entres-sorties en cours.
Langage Fortran
10 fvrier 2012
33 / 247
Entres-sorties - Partie I
Entres-sorties asynchrones
Exemple
program io use I S O_F OR TRAN_E NV implicit none character ( len =256) integer ( kind =2) integer real real , dimension (1024*1024) namelist / var /i , a , b , c
:: :: :: :: ::
open ( UNIT =1 , FILE = " new_param_d ata " , FORM = " formatted " , ACTION = " read " , & ACCESS = " sequential " , ASYNCHRONOUS = " yes " , ROUND = " up " ) open ( UNIT = OUTPUT_UNIT , SIGN = " plus " ) do read ( UNIT =1 , FMT = " ( i4 ,1 x , rd , f8 .6 ,1 x , rn , f10 .1) " , & IOSTAT = etat , ASYNCHRONOUS = " yes " , ID = ident , IOMSG = message ) i , a , b if ( etat /= 0 ) then ; call trait_erreur ; exit ; end if call random_number ( tab ) write ( UNIT = OUTPUT_UNIT , FMT =* ) tab ( [ lbound ( tab ) , ubound ( tab ) ] ) WAIT ( UNIT =1 , ID = ident , IOSTAT = etat , IOMSG = message ) if ( etat /= 0 ) then ; call trait_erreur ; exit ; end if c = i * a + b ; write ( OUTPUT_UNIT , NML = var ) end do close ( UNIT =1 ) contains subroutine trait_erreur if ( is_iostat_end ( etat ) ) write ( OUTPUT_UNIT , " ( Fin de fichier atteinte . ) " ) if ( etat > 0 ) write ( OUTPUT_UNIT , * ) message end subroutine trait_erreur end program io
Langage Fortran
10 fvrier 2012
34 / 247
Entres-sorties - Partie I
Entres-sorties asynchrones
un nouvel attribut ASYNCHRONOUS dans le but davertir le compilateur du risque encouru optimiser des portions de code les manipulant. En eet, le rsultat de cette optimisation pourrait tre un dplacement dinstructions rfrenant ces entits avant une instruction de synchronisation.
On peut prciser explicitement cet attribut lors de la dclaration : INTEGER, ASYNCHRONOUS, DIMENSION(10 ,40) :: TAB
Langage Fortran
10 fvrier 2012
35 / 247
Entres-sorties - Partie I
Le paramtre ACCESS de linstruction OPEN admet une troisime valeur "STREAM" permettant deectuer des entres-sorties en saranchissant de la notion denregistrement : le chier est considr comme tant une suite dunits (unit reprsentant loctet ou le mot suivant lenvironnement). Lentre-sortie est faite soit relativement la position courante, soit une position donne.
Le chier peut tre format ou non. La position courante est mesure en units en partant de 1. Le paramtre POS de
entre Fortran et C.
Langage Fortran
10 fvrier 2012
36 / 247
Entres-sorties - Partie I
Exemple double precision :: d integer :: rang ... open ( UNIT =1 , ... , ACCESS = " STREAM " , form = " unformatted " ) ... inquire ( UNIT =1 , POS = rang ) ! sauvegarde de la position courante . write ( UNIT =1 ) d ! par rapport la position courante . ... ! par rapport la position sauvegarde dans rang . write ( UNIT =1 , POS = rang ) d +1
Note :
sous UNIX/LINUX les chiers ne contiennent pas de marque physique de n de
chier. Cest une notion purement logique. De ce fait le dernier enregistrement dun chier accd en mode stream est considr comme incomplet. En consquence, si on lit plus de donnes que cet enregistrement nen contient une n de chier sera dtect comme le montre lexemple suivant.
Langage Fortran
10 fvrier 2012
37 / 247
Entres-sorties - Partie I
Exemple
program lire character ( len =80) enreg character ( len =256) message integer ios open ( UNIT =1 , FILE = " data " , ACCESS = " stream " , & ACTION = " read " , FORM = " formatted " ) do read ( unit =1 , fmt = " ( a ) " , iomsg = message , iostat = ios ) enreg if ( ios /= 0 ) then ; print * , message ; exit ; end if print " ( a ) " , trim ( enreg ) end do close ( unit =1 ) end program lire
Pointeurs
Environnement systme Tableaux dynamiques Nouveauts concernant les modules Entres-sorties - Partie I Pointeurs Vocation (INTENT) des arguments muets pointeurs Association et reprolage Procedures Nouveauts concernant les types drivs Entres-sorties - Partie II Interoprabilit entre entits C et Fortran Arithmtique IEEE et traitement des exceptions
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 39 / 247
10
Pointeurs
11
Divers
Langage Fortran
10 fvrier 2012
40 / 247
Pointeurs
Langage Fortran
10 fvrier 2012
41 / 247
Pointeurs
Exemple (suite) program copie use m implicit none integer n type ( vecteur ) , pointer :: vec1 , vec2 allocate ( vec1 ) read * , vec1 % n allocate ( vec1 % v ( -1: vec1 %n -2) ) call random_number ( vec1 % v ) call copy ( vec1 , vec1 ) call copy ( vec2 , vec1 ) write ( UNIT = OUTPUT_UNIT , FMT =* ) vec2 % v ( [ 1 , ubound ( vec2 % v ) ] ) deallocate ( vec1 % v ) deallocate ( vec2 % v ) deallocate ( vec1 ) deallocate ( vec2 ) end program copie
Langage Fortran
10 fvrier 2012
42 / 247
Pointeurs
Association et reprolage
Association et reprolage
cible,
de modier de plus le prol uniquement dans le cas dune cible de rang 1. Exemple program profil integer , parameter integer , parameter real , dimension (N , M ) , target real , dimension (: ,:) , pointer
:: :: :: ::
N =100 , M =200 NXL =5 , NXU =20 , NYL =10 , NYU =30 mat bloc_mat
call random_number ( mat ) bloc_mat ( 0: , 0: ) = > mat ( NXL : NXU , NYL : NYU ) print * , " Bornes sup de bloc_mat : " , ubound ( bloc_mat ) end program profil
Langage Fortran
10 fvrier 2012
43 / 247
Pointeurs
Association et reprolage
Exemple (suite) ! Le sous - programme suivant rcupre un tableau de rang 1 ! ( champ _vecteurs ) suppos contenir les coordonnes d une ! srie de vecteurs dans un espace 3 dimensions . subroutine sp ( champ_vecteurs , n ) real , dimension (:) , target :: cha mp_vecte urs integer :: n , nb_vecteurs real , dimension (: ,:) , pointer :: matrice nb_vecteurs = size ( champ_vect eurs )/3 matrice (1:3 ,1: nb_vecteurs ) = > cham p_vecteu rs ... end subroutine sp ! Sous - programme dans lequel on dsire avoir une vue matricielle ! du vecteur " vec " puis considrer la diagonale de cette matrice . subroutine sp ( n ) integer n real , dimension ( n * n ) , target :: vec real , dimension (: ,:) , pointer :: matrice real , dimension (:) , pointer :: diag call random_number ( vec ) ! matrice ( n , n ) = > vec ( INVALIDE ) matrice ( 1: n , 1: n ) = > vec ; diag = > vec ( 1:: n +1 ) end subroutine sp
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 44 / 247
Procedures
Environnement systme Tableaux dynamiques Nouveauts concernant les modules Entres-sorties - Partie I Pointeurs Procedures Dclaration de procdures Pointeurs de procdures
Interface implicite Interface explicite
Nouveauts concernant les types drivs Entres-sorties - Partie II Interoprabilit entre entits C et Fortran
Langage Fortran
10 fvrier 2012
45 / 247
Procedures
10
11
Langage Fortran
10 fvrier 2012
46 / 247
Procedures
Dclaration de procdures
Dclaration de procdures
Lorsque lon dsire transmettre une procdure en argument, il est ncessaire dinformer le compilateur que celui-ci est de type procdural, ceci au moyen de lattribut EXTERNAL. Il est dsormais possible de le dclarer de faon beaucoup plus prcise grce linstruction PROCEDURE. Cette instruction peut servir galement dclarer des pointeurs de procdures (voir ci-aprs) ainsi que toute procdure non ncessairement transmise en argument an, par exemple, de lui associer par la suite un pointeur. La forme la plus simple (et de ce fait la plus pauvre) de dclaration de procdure est : PROCEDURE() sub Elle est quivalente la dclaration EXTERNAL sub employe auparavant. Rien nest prcis sur le type de procdure : cest le mode de linterface implicite.
Langage Fortran
10 fvrier 2012
47 / 247
Procedures
Dclaration de procdures
Pour une procdure de type FUNCTION, on peut indiquer le type retourn comme dans la dclaration : PROCEDURE(REAL) :: func Ici, func dsigne une procdure de type FUNCTION retournant un rsultat de type REAL. Rien de plus nest prcis, on est toujours en mode dinterface implicite. Si lon dsire utiliser le mode dinterface explicite, on indiquera un nom de procdure ou bien le nom dun bloc interface abstrait servant de modle. Exemple
module m implicit none abstract interface function func ( x ) double precision , intent ( in ) :: x double precision func end function func end interface contains function integrale ( borne_i , borne_s , pas , f ) double precision :: borne_i , borne_s , integrale , h integer :: pas , i PROCEDURE ( func ) :: f h = ( borne_s - borne_i )/ pas integrale = 0. do i =0 , pas -1 integrale = integrale + h * f ( borne_i + i * h ) end do end function integrale function carre ( x ) double precision , intent ( in ) :: x double precision carre carre = x * x end function carre end module m
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 48 / 247
Procedures
Dclaration de procdures
Exemple (suite) program p use m implicit none double precision :: b_inf , b_sup , aire integer :: pas b_inf = 1. b_sup = 6. pas = 200000 aire = integrale ( b_inf , b_sup , pas , carre ) print " ( Aire : , f11 .6) " , aire end program p
Remarques :
le bloc interface est un bloc interface abstrait qui permet de dnir un modle de
moyen de linstruction PROCEDURE laquelle on a indiqu le nom du modle ci-dessus permettant ainsi de abiliser lappel f eectu plus loin.
Langage Fortran
10 fvrier 2012
49 / 247
Procedures
Pointeurs de procdures
Pointeurs de procdures
Les pointeurs peuvent tre associs des cibles de type procdure. On parlera alors de pointeurs de procdures, assimilables aux pointeurs de fonctions en langage C. Voici quelques aspects concernant ces pointeurs :
linterface peut tre implicite ou explicite (cf. ci-aprs) ; une fonction peut retourner un pointeur de procdure ; au moment de lassociation p => proc dun pointeur de procdure p laide de
loprateur classique => , le compilateur vrie (si linterface est explicite) la compatibilit des interfaces procdurales comme pour lappel classique dune procdure. Loprande de droite peut tre au choix :
une procdure ; un pointeur de procdure ; une fonction retournant un pointeur de procdure.
Langage Fortran
10 fvrier 2012
50 / 247
Procedures
Pointeurs de procdures
Interface implicite
Voici trois possibilits de les dclarer en mode dinterface implicite : Premire possibilit (pour une fonction seulement) avec lattribut POINTER :
REAL, EXTERNAL, POINTER : : p REAL, EXTERNAL : : f, g ... p => f print *, p(..., ..., ...) ... p => g print *, p(..., ..., ...) Deuxime possibilit avec les attributs PROCEDURE() et POINTER ; dans
lexemple, p est un pointeur en mode dinterface implicite, ltat indtermin, pouvant tre associ une fonction ou un sous-programme :
PROCEDURE(), POINTER : : p Troisime possibilit (pour une fonction seulement) avec lattribut PROCEDURE
rfrenant un type pour expliciter partiellement un pointeur de fonction en le dclarant par exemple sous la forme : PROCEDURE(complex), POINTER : : p p ne pourra alors tre associ qu une fonction retournant un objet de type complex. Bien entendu, comme pour les appels de procdures, il est plutt conseill dutiliser le mode dinterface explicite an que le compilateur puisse contrler la cohrence des associations de pointeurs de procdures... La abilit est ce prix ! Voyons quelles sont les possibilits de les dclarer en mode dinterface explicite.
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 51 / 247
Procedures
Pointeurs de procdures
Interface explicite
Attribut PROCEDURE faisant rfrence une procdure modle existante. Voici par
exemple la dclaration de p initialement ltat nul avec la mme interface que celle du sous-programme proc (obligatoirement en mode dinterface explicite) :
Exemple module m contains subroutine proc ( a , b ) real , dimension (:) , intent ( in ) :: a real , dimension (:) , intent ( out ) :: b . . . end subroutine proc end module m program prog use m PROCEDURE ( proc ) , POINTER :: p = > NULL () . . . end program prog
Langage Fortran
10 fvrier 2012
52 / 247
Procedures
Pointeurs de procdures
dfaut dune procdure pouvant servir de modle pour expliciter linterface, il est
aussi possible de dnir un bloc interface virtuel (abstract interface) tel que :
ABSTRACT INTERFACE SUBROUTINE sub( x, y ) REAL, intent(out) :: x REAL, intent(in) :: y END SUBROUTINE sub END INTERFACE
Ce bloc interface virtuel peut tre utilis (via lattribut PROCEDURE) au moment de la dclaration dun pointeur de procdure comme p1 ou mme dune procdure externe comme proc dans lexemple ci-dessous :
Exemple PROCEDURE ( sub ) , POINTER :: p1 = > NULL () PROCEDURE ( sub ) :: proc REAL :: var p1 = > proc . . . CALL p1 ( x= var , y=3.14 ) PRINT * , ASSOCIATED ( p1 , proc )
Langage Fortran
10 fvrier 2012
53 / 247
Environnement systme Tableaux dynamiques Nouveauts concernant les modules Entres-sorties - Partie I Pointeurs Procedures Nouveauts concernant les types drivs Constructeurs de structures Visibilit des composantes Paramtres dun type driv
Constructeur et type paramtrable Assumed-type-parameter et deered-type-parameter
Variable polymorphique
Dnition
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 54 / 247
Argument muet polymorphique Variable polymorphique : attributs POINTER, ALLOCATABLE Construction SELECT TYPE Type eectif dune variable polymorphique
Variable polymorphique et oprateur daectation Composante pointeur de procdure Procdures attaches un type
Procdure Procdure Procdure Procdure attache attache attache attache par nom par nom gnrique par oprateur via le mot-cl FINAL
Hritage
Hritage dune procdure attache un type Surcharge dune procdure attache un type Polymorphisme dynamique Procdure attache un type non surchargeable Exemple rcapitulatif
Type abstrait
8
Entres-sorties - Partie II Interoprabilit entre entits C et Fortran Arithmtique IEEE et traitement des exceptions Divers
10
11
Langage Fortran
10 fvrier 2012
55 / 247
Constructeurs de structures
Constructeurs de structures
Lors de la valorisation dun type driv via un constructeur de structure, il est dsormais possible daecter les composantes par mots cls :
Exemple type couleur character ( len =16) :: nom real , dimension (3) :: compos end type couleur ... type ( couleur ) :: c ... c = couleur ( nom = " rose_saumon " , compos =[ 0.72 , 0.33 , 0.05 ] ) ...
Langage Fortran
10 fvrier 2012
56 / 247
Constructeurs de structures
Remarques
Si une composante dun type driv une valeur par dfaut, largument
explicitement prcise devront tre accessible au sein de lunit de programme dans laquelle cet appel apparat,
Pour une composante comportant lattribut pointer, cest une association (au sens
du symbole => ) qui seectuera avec largument prcis au niveau du constructeur. On pourra indiquer la fonction NULL pour forcer la composante ltat nul de faon explicite,
Pour une composante comportant lattribut allocatable, largument prcis au
niveau du constructeur devra tre de mme type et de mme rang. Sil a lattribut allocatable, il peut tre ou non allou. Comme pour une composante pointer, on pourra prciser la fonction NULL mais sans argument : la composante sera alors dans ltat "non allou".
Langage Fortran
10 fvrier 2012
57 / 247
Constructeurs de structures
Exemple
module m type t real , dimension (:) , pointer :: p = > NULL () character ( len =:) , allocatable :: chaine real , dimension (: ,:) , allocatable :: matrice end type t end module m program construct use I S O_F OR TRAN_E NV ; use m ; implicit none type ( t ) u real , dimension (:) , pointer :: q real , dimension (20) , target :: v real , dimension (2 ,3) :: mat1 real , dimension (: ,:) , allocatable :: mat2 integer i call random_number ( v ); call random_number ( mat1 ); q = > v u = t ( p =v , chaine = " Mozart " , matrice = mat1 ) write ( OUTPUT_UNIT , *) u %p, u %chaine, len( u %chaine) if ( allocated ( u %matrice) ) call sortie ! <== . true . u = t ( p =q , chaine = " Beethoven " , matrice = mat2 ) write ( OUTPUT_UNIT , *) u %p, u %chaine, len ( u %chaine) if ( allocated ( u %matrice) ) call sortie ! <== . false . u = t ( p =v , chaine = " Verdi " , matrice = NULL () ) write ( OUTPUT_UNIT , *) u %p, u %chaine, len ( u %chaine) if ( allocated ( u %matrice) ) call sortie ! <== . false . u = t ( chaine = " Wagner " , matrice = NULL () ) write ( OUTPUT_UNIT , *) u %chaine, len( u %chaine) mat2 = mat1 ; u = t ( p =q , chaine = " Schubert " , matrice = mat2 ) write ( OUTPUT_UNIT , *) u %p, u %chaine, len ( u %chaine) if ( allocated ( u %matrice) ) call sortie ! <== . true . contains subroutine sortie do i =1 , size ( u %matrice ,1) write ( OUTPUT_UNIT , *) u %matrice(i ,:) end do end subroutine sortie end program construct
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 58 / 247
Constructeurs de structures
Une procdure gnrique peut avoir le mme nom quun constructeur de structure. Un appel valide lun des constituants de la famille gnrique ne doit pas rentrer en conit avec lappel du constructeur. Si aucun constituant ne fait laaire, cest le constructeur intrinsque qui sera activ. Cette technique peut tre employe an de surcharger un constructeur, comme le montre lexemple suivant :
Exemple
module m type mycomplex real :: rho , theta ! <=== Coordonnes polaires end type mycomplex ! interface mycomplex module procedure complex_to_mycomplex , t w o _ r e a l s _ t o _ m y c o m p l e x end interface mycomplex contains function c o m p l e x _ t o _ m y c o m p l e x ( c ) result ( myc ) complex , intent ( in ) :: c type ( mycomplex ) :: myc myc % rho = abs ( c ) if ( real ( c ) /= 0 ) then myc % theta = atan ( aimag ( c )/ real ( c ) ) else myc % theta = asin (1.) end if end function c o m p l e x _ t o _ m y c o m p l e x
Langage Fortran
10 fvrier 2012
59 / 247
Constructeurs de structures
Exemple
function t w o _ r e a l s _ t o _ m y c o m p l e x (x,y) result ( myc ) real , intent ( in ) :: x, y type ( mycomplex ) :: myc myc %rho = sqrt ( x*x + y*y ) if ( x /= 0 ) then myc %theta = atan ( y/x ) else myc %theta = asin (1.) end if end function t w o _ r e a l s _ t o _ m y c o m p l e x end module m program p use I S O_F OR TRAN_E NV use m type ( mycomplex ) :: a , b , c complex :: w w = ( 0. ,1. ) a = mycomplex ( theta =5.6 , rho =1.0 ) ! Appel b = mycomplex ( w ) ! Appel c = mycomplex ( x =0.5 , y =3.**.5/2. ) ! Appel write ( OUTPUT_UNIT , * ) " A ( rho , theta ) : " , a %rho, write ( OUTPUT_UNIT , * ) " B ( rho , theta ) : " , b %rho, write ( OUTPUT_UNIT , * ) " C ( rho , theta ) : " , c %rho, end program p
Langage Fortran
10 fvrier 2012
60 / 247
Langage Fortran
10 fvrier 2012
61 / 247
En Fortran 2003, il est dsormais possible de dterminer quelles seront les composantes prives et quelles sont celles qui seront publiques. Les mots-cls private et public semploient comme pour un module : linstruction private positionne un accs par dfaut, celui-ci pouvant tre surcharg laide de lattribut public/private indiqu lors de la dnition des composantes :
Exemple
module m1 type t private integer :: i integer , public :: j real :: r end type t end module m1 module m2 type t private integer :: i , j real :: r end type t contains function t ( i , j , r ) integer , intent ( in ) :: i , j real , intent ( in ) :: r type ( t ) :: t t%i = i; t%j = j; t%r = r end function t subroutine sortie ( obj ) use I S O_F ORTRAN_EN V type ( t ) , intent ( in ) :: obj write ( OUTPUT_UNIT , * ) obj end subroutine sortie end module m2
Langage Fortran
10 fvrier 2012
62 / 247
Exemple program p use m1 type ( t ) obj obj %i = 1 obj %j = 2 print * , obj %r obj = t ( i =1 , j =2 , r =2.718 ) call sub contains subroutine sub use m2 type ( t ) :: obj obj = t ( i =1 , j =2 , r =3. ) call sortie ( obj ) end subroutine sub end program p ! ! ! ! invalide valide invalide invalide : : : : i j r i est priv au module est public est priv au module et r sont privs
! valide
Note :
Dans la procdure sub, la fonction t appele est bien celle dnie dans le module
m2 : il ny a aucune ambiguit avec lappel du constructeur car les composantes du type tant prives, celui-ci nest pas activable explicitement.
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 63 / 247
caractres et le sous-type. Nuance importante, le premier nest pas discriminant pour la gnricit et pas ncessairement connu la compilation, tandis que le deuxime lest. Fortran 2003 permet de dnir pour un type driv des composantes particulires. On leur indiquera lattribut LEN ou KIND, elles serviront paramtrer le type et pourront tre utilises lors de la dnition des autres composantes. Il est possible de leur donner une valeur qui servira de valeur par dfaut lors de la dclaration dobjets de ce type. Remarque sur leur emploi au sein du type :
ceux avec lattribut LEN ne peuvent apparatre quau niveau dune
specication-expression permettant de dnir par exemple une longueur de chanes ou des bornes de tableaux,
ceux avec lattribut KIND peuvent de plus apparatre au niveau dune
initialization-expression.
Langage Fortran
10 fvrier 2012
64 / 247
Exemple type obj_mat (K , DIM , LN ) ! --------------------------------------------integer , KIND :: K=4 integer , LEN :: DIM, LN = 100 ! --------------------------------------------real ( kind =K) , dimension (DIM,DIM) :: tab = 0. character ( len =LN) :: type_mat = " " end type obj_mat ... type ( obj_mat ( DIM =256)) :: mat1 type ( obj_mat ( K =8 , DIM =512 , LN =30)) :: mat2 ...
Les paramtres K, DIM et LN sont obligatoirement de type entier avec un attribut KIND/LEN. Seuls ceux ayant lattribut KIND sont discriminants au niveau de la gnricit des
fonctions. Ceux avec lattribut LEN font partie des length type parameters par opposition aux kind type parameters. Pour une meilleure lisibilit, on a prcis ces paramtres en majuscules an de mieux les direncier des composantes du type, lesquelles apparaissent en minuscules.
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 65 / 247
type champ_vecteur (N ,D , K ) integer , KIND :: K = kind(1.0) integer , LEN :: D = 2 , N real ( kind =K) , dimension (D,N) :: champ end type champ_vecteur integer , parameter :: prec = s e l e c t e d _ r e a l _ k i n d (9 ,99) type ( champ_vecteur ( K = prec , N =100)) :: c . . . c = champ_vecteur ( K = prec , N =100)( champ =1. _prec )
Note : il est possible dadresser les composantes dun type driv ayant lattribut LEN ou KIND laide du symbole % . Ce procd sapplique galement aux types intrinsques :
subroutine sub ( ch , len ) character ( len =*) , intent ( inout ) integer , intent ( in ) integer , parameter real ( kind = prec ) , dimension (10)
:: :: :: ::
print * , len, ch %len, t %kind ! len(ch) ambigu ici, kind(t) est valide. end subroutine
Langage Fortran
10 fvrier 2012
66 / 247
Assumed-type-parameter et deered-type-parameter
Par analogie avec les tableaux taille implicite (assumed-size-array ), lors dune dclaration, il est possible dintroduire le caractre * pour les paramtres ayant lattribut LEN (assumed-type-parameter ). Cette forme peut tre employe pour un argument muet dune procdure :
subroutine im p r es s i o n_ ch a m p ( c ) integer , parameter :: prec = s e l e c t e d _ r e a l _ k i n d (9 ,99) type ( champ_vecteur ( K = prec , D =* , N =*)) :: c ... print * , c %d, c %n end subroutine i m p re s s i o n _ c h am p
De mme, toujours pour ces paramtres, le caractre : peut tre utilis (deered-type-parameter ), comme pour la longueur dune chane de caractres ou les dimensions dun tableau :
integer , parameter :: prec = s e l e c t e d _ r e a l _ k i n d (9 ,99) type ( champ_vecteur ( K = prec , D =: , N =:)) , pointer :: p type ( champ_vecteur ( K = prec , D =3 , N =200)) , target :: cible ... p = > cible
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 67 / 247
Langage Fortran
10 fvrier 2012
68 / 247
Langage Fortran
10 fvrier 2012
70 / 247
Variable polymorphique
Cest une variable dont le type peut varier au cours de lexcution. Celle-ci doit avoir lattribut POINTER ou ALLOCATABLE ou bien tre un argument muet dune procdure. Pour sa dclaration, on spcie le mot-cl CLASS la place de TYPE.
Exemple type point real :: x , y end type point CLASS ( point ) , pointer :: p
Dans cet exemple, le pointeur p pourra tre associ un objet de type point et toutes les extensions ventuelles de ce type. Le type indiqu au niveau du mot-cl CLASS doit forcment tre un type driv extensible, ce qui exclut les types intrinsques et les types drivs pour lesquels on a prcis lattribut sequence ou bind.
Langage Fortran
10 fvrier 2012
71 / 247
Variable polymorphique
dclaration permettant ainsi de leur donner nimporte quel type dynamique : on les appelle unlimited polymorphic et on leur spcie CLASS(*) lors de la dclaration.
Langage Fortran
10 fvrier 2012
72 / 247
Variable polymorphique
Variable polymorphique
Les exemples suivant prsentent la faon dont lassociation entre les arguments rels et muets seectue dans le cas de variable polymorphique. Lassociation entre argument rel (actual-argument) et argument muet (dummy-argument) seectue selon la rgle suivante :
si largument muet est dun type x, le type dclar de largument rel doit tre le
mme ; si largument muet est polymorphique, le type dclar de largument rel doit tre le mme que celui de largument muet ou bien dun type tendu.
Exemple module m type point2d ; real x , y ; end type point2d type , extends ( point2d ) :: point2d_coul real , dimension (3) :: compos_rvb end type point2d_coul contains ! procdures clsub1 , clsub2 , tsub1 , tsub2 listes ci - dessous end module m
Langage Fortran
10 fvrier 2012
74 / 247
Variable polymorphique
Exemple subroutine sp ( c1 , c2 ) use m CLASS ( point2d ) c1 ; CLASS ( point2d_coul ) c2 TYPE ( point2d ) t1 ; TYPE ( point2d_coul ) t2 Argument muet polymorphique, argument rel dun type fix ! valide call clsub1 ( t1 ) call clsub1 ( t2 ) ! valide call clsub2 ( t1 ) ! invalide call clsub2 ( t2 ) ! valide Argument muet dun type fix, argument rel polymorphique call tsub1 ( c1 ) ! valide call tsub1 ( c2 ) ! invalide call tsub1 ( c2 % point2d ) ! valide call tsub2 ( c1 ) ! invalide select type ( c1 ) class is ( point2d_coul ) ! valide call tsub2 ( c1 ) ... end select ! valide call tsub2 ( c2 ) Argument muet et argument rel polymorphiques call clsub1 ( c1 ) ! valide call clsub1 ( c2 ) ! valide call clsub2 ( c1 ) ! invalide end subroutine sp
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 75 / 247
Variable polymorphique
:: :: :: :: ::
p2d p3d ptr2d_1 , ptr2d_2 ptr3d point ptr2d_1 ptr2d_2 ptr3d ptr2d_2 point2d point3d point3d point2d
ptr2d_1 = > p2d ! type dynamique de ptr2d_2 = > p3d ! type dynamique de ptr3d = > p3d ! type dynamique de ptr2d_2 = > ptr2d_1 ! type dynamique de ptr3d = > ptr2d_1 ! Interdit ALLOCATE ( ptr2d_1 ) ! type ALLOCATE ( point3d :: ptr2d_2 ) ! type ALLOCATE ( point3d_coul :: point ) ... end program p
Langage Fortran
10 fvrier 2012
76 / 247
Variable polymorphique
Une variable polymorphique peut galement tre alloue en faisant rfrence une variable non polymorphique prexistante. Celle-ci sert de modle, son type sera celui de la variable alloue et son contenu sera copi. Pour eectuer ce type dallocation, on spcie le mot-cl SOURCE= au niveau de linstruction allocate permettant de prciser lobjet source dsir.
Exemple program p use m type ( point2d ) :: p2d type ( point3d ) :: p3d class ( point2d ) , allocatable :: ptr p2d = point2d ( x =1.5 , y =2. ) p3d = point3d ( x =1.5 , y =2. , z =3. ) ALLOCATE ( ptr , SOURCE = p2d ) ... deallocate ( ptr ) ALLOCATE ( ptr , SOURCE = p3d ) ... deallocate ( ptr ) end program p
Langage Fortran
10 fvrier 2012
77 / 247
Variable polymorphique
Langage Fortran
10 fvrier 2012
78 / 247
Variable polymorphique
Exemple (suite)
subroutine init ( obj, rvb, nom CLASS ( couleur ) , real , dimension (:) , character ( len =*) , optional , ) intent ( out ) :: obj intent ( in ) :: rvb intent ( in ) :: nom
obj%compos = rvb select type ( obj ) CLASS is ( coul_label ) if ( . not . present (nom) ) then obj%nom= " Noir " else obj%nom=nom end if end select end subroutine init end module m program p use m CLASS ( couleur ) , allocatable :: c type ( couleur ) :: coul allocate ( coul_label :: c ) call init ( obj =c , rvb =[ 0.8 , 0.8 , 0.8 ] , nom = " Gris clair " ) call output ( c ); deallocate ( c ) coul = couleur ( compos =[ 0.8 , 0.8 , 0.8 ] ) allocate ( c , source = coul ) call output ( c ); deallocate ( c ) end program p Nom : Gris clair , composantes : 0.8000000119 0.8000000119 0.8000000119 Composantes : 0.8000000119 0.8000000119 0.8000000119
Langage Fortran
10 fvrier 2012
79 / 247
Variable polymorphique
Langage Fortran
10 fvrier 2012
80 / 247
Variable polymorphique
Notes : Cest le type dynamique de lobjet qui est analys. La slection du bloc dinstructions excuter se fait daprs les rgles suivantes :
sil existe une instruction TYPE IS correspondant au type, le bloc qui suit est excut ; sinon, sil existe une seule instruction CLASS IS rpondant au type (lobjet est du
type ou dun type tendu de celui spci), le bloc qui suit est excut ;
sinon, sil existe plusieurs instructions CLASS IS correspondant au type, cest le bloc de linstruction CLASS IS rfrenant le type le plus proche de celui de lobjet qui est
excut ;
sinon, sil existe une instruction CLASS DEFAULT, cest son bloc qui est excut.
Langage Fortran
10 fvrier 2012
81 / 247
Variable polymorphique
Deux nouvelles fonctions intrinsques permettent de dterminer le type dune variable polymorphique au moment de lexcution :
EXTENDS_TYPE_OF( a, mold ) Celle-ci retourne vrai si le type dynamique de a est une extension de celui de mold.
Langage Fortran
10 fvrier 2012
82 / 247
Variable polymorphique
Exemple function distance ( p1 , p2 ) CLASS ( point2d ) p1 , p2 real distance ! Calcul de la distance entre les points p1 et p2 if ( SAME_TYPE_AS ( p1 , p2 ) then SELECT TYPE ( p1 ) CLASS IS ( point2d ) distance = sqrt ( ( p2 %x - p1 % x )**2 + ( p2 %y - p1 % y )**2 ) CLASS IS ( point3d ) distance = sqrt ( ( p2 %x - p1 % x )**2 + ( p2 %y - p1 % y )**2 + & ( p2 %z - p1 % z )**2 ) CLASS DEFAULT print * , " Erreur : type non reconnu " ; distance = -1. END SELECT else print * , " Erreur : les objets p1 et p2 & & doivent tre de mme type " distance = -2. endif end function distance
Langage Fortran
10 fvrier 2012
83 / 247
Un pointeur de procdure peut apparatre en tant que composante dun type driv. Lassociation puis lappel de la procdure cible seectue partir dun objet du type
premier argument la procdure cible (passed-object dummy argument). Celui-ci doit obligatoirement tre dclar comme objet polymorphique donc avec lattribut CLASS.
Lattribut NOPASS, indiqu lors de la dclaration de la composante, empche cette
Langage Fortran
10 fvrier 2012
85 / 247
Exemple
module m use I S O_F OR TRAN_E NV TYPE mytype private real :: x integer :: i PROCEDURE ( proc ) , public , POINTER , PASS :: p PROCEDURE ( func ) , public , POINTER , NOPASS :: q END TYPE mytype abstract interface subroutine proc ( this , r , i ) import mytype CLASS ( mytype ) , intent ( inout ) :: this real , intent ( in ) :: r integer , intent ( in ) :: i end subroutine proc function func ( x ) real x , func end function func end interface contains subroutine set ( this , r , i ) CLASS ( mytype ) , intent ( inout ) :: this real , intent ( in ) :: r integer , intent ( in ) :: i this % x = r ; this % i = i write ( OUTPUT_UNIT , " ( THIS % X = , f6 .2 ,/ , THIS % I = , i6 ) " ) this %x , this % i end subroutine set function f ( x ) real x , f f = x * exp ( x ) end function f end module m
Langage Fortran
10 fvrier 2012
86 / 247
Exemple (suite) program prog use m TYPE ( mytype ) :: a real :: y a % p = > set call a % p ( 3.14 , 100 ) ! quivalent " call set ( a , 3.14 , 100 )" a%q => f y = a % q ( Log ( 3.14 ) ) write ( OUTPUT_UNIT , " ( Y = , f6 .2) " ) y end program prog
Remarque :
En Fortran 95, un bloc interface ne pouvait accder aux entits (dnition de type driv par ex.) de lunit hte (module ou unit de programme). Linstruction IMPORT
permet limportation (host association) de ces entits dans un bloc interface. Do la prsence de linstruction import mytype au sein de labstract interface. IMPORT sans aucune spcication permet limportation de toutes les entits vues par host association.
Langage Fortran
10 fvrier 2012
87 / 247
Souvent, en programmation oriente objet, on dsire appeler une procdure pour eectuer un traitement dont la nature dpend du type dynamique dun objet polymorphique. Ceci est mis en uvre au moyen de procdures attaches un type driv (type-bound procedures) qui rcuprent en entre lobjet lorigine de lappel dni comme argument muet polymorphique. Celles-ci peuvent faire lobjet dune surcharge lors dextensions du type. Dans dautres langages comme C++ on les appelle des mthodes ou services ; leur invocation est vue comme lenvoi dun message un objet dont la nature peut tre rsolue lexcution (polymorphisme dynamique) ou la compilation (polymorphisme statique). Ce type de procdure peut videmment semployer pour un type driv simple non tendu. Elles doivent tre dnies en contexte dinterface explicite. Au sein du type, elles apparassent aprs le mot-cl CONTAINS lequel annonce la type-bound procedure section. Par dfaut, leur accs est public indpendamment du mode daccs des composantes du type. Comme pour les composantes linstruction private en tte de section permet de changer le mode daccs par dfaut, sachant quil sera possible de le prciser au niveau de chaque procdure comme attribut.
Langage Fortran
10 fvrier 2012
88 / 247
Pour attacher des procdures (type-bound procedures) un type on emploie la ou les instructions PROCEDURE et GENERIC. Cet attachement seectue laide dun binding-name. Le nom de la procdure peut tre celui-ci ou bien un nom prcis la suite des caractres => au niveau de linstruction PROCEDURE. La syntaxe de ces instructions est la suivante :
1 2
GENERIC [, access-spec] :: generic-spec => binding-name-list binding-attr-list : PASS, NOPASS, NON_OVERRIDABLE, DEFERRED ou access-spec access-spec : PUBLIC ou PRIVATE
Notes :
la deuxime syntaxe de linstruction PROCEDURE concerne les types abstraits,
ou des entrs-sorties portant sur des objets de type driv (voir page 129).
Langage Fortran
10 fvrier 2012
89 / 247
Langage Fortran
10 fvrier 2012
90 / 247
Une procdure externe peut tre attache un type. Dans ce cas, videmment, on prcisera obligatoirement lattribut NOPASS au moment de lattachement. On fournira de plus un bloc interface an que linterface soit explicite.
Exemple subroutine toto( ... ) ... end subroutine toto module m type T private integer i contains private PROCEDURE , PUBLIC , NOPASS :: toto end type T interface subroutine toto( ... ) ... end subroutine toto end interface end module m
Langage Fortran
10 fvrier 2012
91 / 247
Langage Fortran
10 fvrier 2012
92 / 247
Exemple (suite)
subroutine affect_s ( a , b ) class ( matrix ( K = single , N =* , M =*)) , intent ( inout ) :: a class ( matrix ( K = single , N =* , M =*)) , intent ( in ) :: b if ( any ( shape ( a % A ) /= shape ( b % A ) ) ) stop " Erreur : objets non conformants " a % A (: ,:) = b % A (: ,:) end subroutine affect_s ! --------------------------------subroutine affect_d ( a , b ) class ( matrix ( K =double, N =* , M =*)) , intent ( inout ) :: a class ( matrix ( K =double, N =* , M =*)) , intent ( in ) :: b if ( any ( shape ( a % A ) /= shape ( b % A ) ) a % A (: ,:) = b % A (: ,:) end subroutine affect_d end module mod program prog use mod type ( matrix ( K = double , N =5 , M =10)) :: type ( matrix ( K = single , N =20 , M =60)) :: ... mat1s = mat2s + mat3s ! Appel add_s ... mat1d = mat2d + mat3d ! Appel add_d end program prog ) stop " Erreur : objets non conformants "
mat1d , mat2d , mat3d mat1s , mat2s , mat3s puis affect_s puis affect_d
Langage Fortran
10 fvrier 2012
94 / 247
Cest une procdure de type subroutine qui sexcute lorsquun objet cesse dexister.
Pour cela, au sein du type driv correspondant lobjet, on spcie le mot-cl FINAL auquel on associe une liste de sous-programmes (nal subroutines) appels destructeurs ;
Ceux-ci admettent un seul argument muet du type de celui dni ; Pour un objet allou dynamiquement laide de linstruction ALLOCATE, le
linstruction STOP ou END de lunit principale, aucune procdure de nalisation nest excute.
Langage Fortran
10 fvrier 2012
95 / 247
Exemple module mod implicit none type t ( K ) integer , KIND :: K real ( kind =K) , pointer , dimension (:) :: v = > null () contains FINAL :: finalize_scal , finalize_vect end type t contains subroutine finalize_scal ( x ) ! --> Arg . scalaire type ( t ( K =4)) :: x if ( associated ( x % v ) ) deallocate ( x % v ) end subroutine finalize_scal subroutine finalize_vect ( x ) ! --> Arg . vecteur type ( t ( K =4)) , dimension (:) :: x integer i do i =1 , size ( x ) if ( associated ( x ( i )% v ) ) deallocate ( x ( i )% v ) end do end subroutine finalize_vect end module mod
Langage Fortran
10 fvrier 2012
96 / 247
Exemple (suite) program prog use mod implicit none type ( t ( K =4)) , dimension (:) , allocatable :: obj integer i allocate ( obj (100) ) do i =1 ,100 allocate ( obj ( i )% v (100) ) call random_number ( obj ( i )% v ) print * , obj ( i )% v (100) end do deallocate ( obj ) end program prog
Remarque :
Ainsi, lors de la dsallocation de lobjet obj cest le destructeur finalize_vect qui
sera excut.
Langage Fortran
10 fvrier 2012
97 / 247
Langage Fortran
10 fvrier 2012
98 / 247
Exemple (suite) subroutine fin_base ( this ) type ( base ) :: this print * , " Finalisation du type base . " if ( associated ( this % p ) ) deallocate ( this % p ) end subroutine fin_base subroutine fin_t ( this ) type ( t ) :: this print * , " Finalisation du type t . " if ( associated ( this % q ) ) deallocate ( this % q ) end subroutine fin_t end module m program t y pe _e x t e n t _ f i n al use m type ( t ) , allocatable :: obj allocate ( obj ); allocate ( obj % p (100) ) call random_number ( obj % p ) print * , obj % p ( [ 1 , 50 , 100 ] ) allocate ( obj % q (200) ) call random_number ( obj % q ) print * , obj % q ( [ 1 , 50 , 100 , 150 , 200 ] ) deallocate ( obj ) end program typ e_ e xt e n t _ f i n a l
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 99 / 247
Lexemple prcdent produit les rsulats suivant : 0.7826369256E-05 0.4364113808 0.4153946042 0.5373039246 0.4885145426 0.8246973753 0.6163503528 0.7947697639 Finalisation du type t. Finalisation du type base. Remarques :
Si on dclare lobjet obj tel que type(t) :: obj , aucune procdure de
nalisation nest excute, cette dclaration gurant dans lunit de programme principale.
Pour une hierarchie de types, ce processus de nalisation sapplique de faon
rcursive en partant du type le plus riche en remontant successivement au type de base. Les procdures de nalisation sont alors excutes dans cet ordre sur la partie de lobjet concerne.
Les composantes possdant lattribut ALLOCATABLE sont automatiquement libres
par le compilateur lors de la destruction dun objet : il est alors inutile de prvoir une procdure de nalisation pour eectuer explicitement cette libration mmoire.
Langage Fortran
10 fvrier 2012
100 / 247
Hritage
Hritage
Hritage
Hritage
Exemple (suite) contains subroutine sortie_mat_s ( this ) class ( matrix ( K = simple , N =* , M =*)) , intent ( in ) :: this print " (2( a , i0 ) , a ) " , " ORDRE = [ " , this %N, " ," , this %M, " ] " print * , " dernier lment = > " , & this % a ( ubound ( this %a ,1) , ubound ( this %a ,2) ) end subroutine sortie_mat_s ! -------------------------subroutine sortie_mat_d ( this ) class ( matrix ( K =double, N =* , M =*)) , intent ( in ) :: this print " (2( a , i0 ) , a ) " , " ORDRE = [ " , this %N, " ," , this %M, " ] " print * , " dernier lment = > " , & this % a ( ubound ( this %a ,1) , ubound ( this %a ,2) ) end subroutine sortie_mat_d ! -------------------------subroutine sortie_mat_ e_s ( this ) class ( matrix_e ( K = simple , N =* , M =* , LN =*)) , intent ( in ) :: this call this % matrix % sortie print * , " nom = " , this %nom end subroutine sortie_mat_ e_s ! ---------------------------subroutine sortie_mat_ e_d ( this ) class ( matrix_e ( K =double, N =* , M =* , LN =*)) , intent ( in ) :: this call this % matrix % sortie print * , " nom = " , this %nom end subroutine sortie_mat_ e_d
Langage Fortran
10 fvrier 2012
104 / 247
Hritage
Exemple (suite)
real function max_s ( this ) class ( matrix ( K = simple , N =* , M =*)) , intent ( in ) :: this max_s = MAXVAL ( array = this %a ) end function max_s ! ----------------real ( kind = double ) function max_d ( this ) class ( matrix ( K =double, N =* , M =*)) , intent ( in ) :: this max_d = MAXVAL ( array = this %a ) end function max_d end module mod ! program prog use mod integer , parameter :: N1 =10 , M1 =20 , n2 =20 , M2 =50 type ( matrix ( K = simple , N = N1 , M = M1 )) :: objs type ( matrix_e ( K =double, N = N2 , M = M2 )) :: objd_e real ( kind = simple ) , dimension ( N1 , M1 ) :: mat1 real ( kind =double) , dimension ( N2 , M2 ) :: mat2 mat1 = reshape ( source =[ (i , i =1 , N1 * M1 ) ] , shape =shape( mat1 ) ) mat2 = reshape ( source =[ (i , i =1 , N2 * M2 ) ] , shape =shape( mat2 ) ) objs = matrix ( K = simple , N = N1 , M = M1 )( a = mat1 ) objd_e = matrix_e ( K =double, N = N2 , M = M2 )( a = mat2 , nom = " matrice gnrale " ) call objs % sortie ; call objd_e % sortie print * , " MAXS = " , objs % max () , " , MAXD = " , objd_e % max () end program prog
Langage Fortran
10 fvrier 2012
105 / 247
Hritage
Polymorphisme dynamique
Dans les exemples prcdents, les objets partir desquels les procdures type_bound sont appeles sont dun type x : le compilateur sait alors quelle procdure appeler. Si lon dsire bncier du polymorphisme dynamique, on dclare lobjet p de lexemple prcdent comme argument muet polymorphique. Cela permet dappeler la procdure affichage correspondant au type dynamique de lobjet qui est lorigine de lappel.
Exemple program dynamic use pointext type ( point2d ) p2d type ( point3d ) p3d ... call affiche( p2d ); call affiche( p3d ) contains subroutine affiche( p ) CLASS ( point2d ) , intent ( in ) :: p ! --- ---- Polymorphisme dynamique -- - - - - - call p % affichage ( " Voici mes coordonnes " ) end subroutine affiche end program dynamic
La fonction affiche sappliquera alors tout nouveau type tendu ultrieurement dni sans avoir la recompiler.
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 106 / 247
Hritage
Hritage
Dans cet exemple les oprateurs + et = sont surchargs au sein des deux types T et TT (extension du prcdent). On remarque que les interfaces des fonctions de surcharge doivent tre les mmes hormis le passed-object dummy argument.
Exemple rcapitulatif module m use I SO _FORT RA N_ EN V type T real x contains procedure , private :: plus = > plus_T procedure , private :: egal = > egal_T procedure :: affiche = > affiche_T generic :: operator (+) = > plus generic :: assignment (=) = > egal end type T type , extends ( T ) :: TT integer i contains procedure , private :: plus = > plus_TT procedure , private :: egal = > egal_TT procedure :: affiche = > affiche_TT end type TT
Langage Fortran
10 fvrier 2012
108 / 247
Hritage
Langage Fortran
10 fvrier 2012
109 / 247
Hritage
Langage Fortran
10 fvrier 2012
110 / 247
Hritage
Exemple rcapitulatif (suite) program p use m type ( TT ) :: b1 , b2 , b type ( T ) :: a a = b1 = b2 = b = call T ( x =1. ) TT ( x =2. , i =100 ) TT ( x =3. , i =200 ) b1 + b2 b % affiche
b = a + b2 call b % affiche b = b2 + a call b % affiche b = a + a call b % affiche a = b + b call a % affiche end program p
Langage Fortran
10 fvrier 2012
111 / 247
Hritage
Mme exemple en C++ # include < iostream > using namespace std ; class T { protected : double x ; public : T ( double x = 0. ) : ~ T () {} friend T operator +( T & operator =( const void affiche () { cout << " x : " << } }; x ( x ) {} const T & , const T & ); T & );
x << endl ;
Langage Fortran
10 fvrier 2012
112 / 247
Hritage
Mme exemple en C++ (suite) class TT : public T { int i ; public : TT ( double x = 0. , int i = 0 ) : T ( x ) { this - > i = i ; } friend TT operator +( const TT & , const TT & ); TT & operator =( const TT &); TT & operator =( const T &); void affiche () { T :: affiche (); cout << " i : " << i << endl ; } }; T operator +( const T & t1 , const T & t2 ) { T r; r . x = t1 . x + t2 . x ; return r ; } T & T :: operator =( const T & t ) { x = t.x; return * this ; }
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 113 / 247
Hritage
Mme exemple en C++ (suite) TT operator +( const TT & tt1 , const TT & tt2 ) { TT r ; ( T &) r = operator +( ( T &) tt1 , ( T &) tt2 ); r . i = tt1 . i + tt2 . i ; return r ; } TT & TT :: operator =( const T & t ) { ( T &)(* this ) = t ; return * this ; } TT & TT :: operator =( const TT & tt ) { ( T &)(* this ) = ( T &) tt ; i = tt . i ; return * this ; }
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 114 / 247
Hritage
Mme exemple en C++ (suite) main () { T a; TT b1 , b2 , b ; a = T (1.); b1 = TT (2. ,100); b2 = TT (3. ,200); b = b1 + b2 ; b . affiche (); b = a + b2 ; b . affiche (); b = b2 + a ; b . affiche (); b = a + a; b . affiche (); a = b + b; a . affiche (); }
Langage Fortran
10 fvrier 2012
115 / 247
Type abstrait
Type abstrait
Cest un type qui sert de base de futures extensions. Parmi les procdures qui lui sont attaches certaines peuvent tre dclares avec lattribut DEFERRED indiquant quelles seront dnies au sein de types tendus. Pour celles-ci :
il sera ncessaire de fournir un nom dinterface entre parenthses la suite du
mot-cl PROCEDURE ;
aucun nom de procdure nest fourni, seule la prsence dun binding-name est
ncessaire ;
Lattribut DEFERRED doit tre prcis si et seulement si un nom dinterface est fourni ; La dnition dun type abstrait seectue en prcisant le mot-cl ABSTRACT ; Il nest pas possible de dclarer des objets de ce type. Par contre, celui-ci peut tre
Langage Fortran
10 fvrier 2012
116 / 247
Type abstrait
Exemple module m use I SO _FORT RA N_ EN V type , abstract :: figure_geo contains procedure :: aire procedure :: volume procedure ( aff ) , deferred :: a f f i c h a g e _ f i g u re procedure ( aff ) , deferred :: a f f i c h a g e _ c o n s t i t u a n t s end type figure_geo type , extends ( figure_geo ) :: point private double precision x , y contains procedure :: a f f i ch a g e _ f i g u r e
=> & affichage_figure_point procedure :: a f f i c h a g e _ c o n s t i t u a n t s = > & affichage_constituants_point end type point
Langage Fortran
10 fvrier 2012
117 / 247
Type abstrait
Exemple (suite)
type , extends ( point ) :: cercle private double precision rayon contains procedure :: aire = > aire_cercle procedure :: af fi ch a ge _ fi gu r e => affichage_figure_cercle procedure :: a f f i c h a g e _ c o n s t i t u a n t s = > a f f i c h a g e _ c o n s t i t u a n t s _ c e r c l e end type cercle type , extends ( cercle ) :: cylindre private double precision hauteur contains procedure :: aire procedure :: volume procedure :: af fi ch a ge _ fi gu r e procedure :: a f f i c h a g e _ c o n s t i t u a n t s end type cylindre
abstract interface subroutine aff ( this ) import figure_geo class ( figure_geo ) , intent ( in ) :: this end subroutine aff end interface
Langage Fortran
10 fvrier 2012
118 / 247
Type abstrait
Exemple (suite) contains ! Constructeurs function point ( x , y ) double precision , intent ( in ) :: x , y type ( point ) :: point point % x = x ; point % y = y end function point ! function cercle ( x , y , r ) double precision , intent ( in ) :: x , y , r type ( cercle ) :: cercle cercle % point = point ( x , y ) cercle % rayon = r end function cercle ! function cylindre ( x , y , r , h ) double precision , intent ( in ) :: x , y , r , h type ( cylindre ) :: cylindre cylindre % cercle = cercle ( x , y , r ) cylindre % hauteur = h end function cylindre
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 119 / 247
Type abstrait
Exemple (suite) function aire( this ) class ( figure_geo ) , intent ( in ) :: this double precision :: aire aire = 0. d0 end function aire ! function volume( this ) class ( figure_geo ) , intent ( in ) :: this double precision :: volume volume = 0. d0 end function volume ! function aire_cercle ( this ) class ( cercle ) , intent ( in ) :: this double precision :: aire_cercle aire_cercle = acos ( -1. d0 )* this % rayon * this % rayon end function aire_cercle ! function aire_cylindre ( this ) class ( cylindre ) , intent ( in ) :: this double precision :: aire_cylindre aire_cylindre = 2. d0 * this % cercle % aire () + & 2. d0 * acos ( -1. d0 )* this % rayon * this % hauteur end function aire_cylindre
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 120 / 247
Type abstrait
Exemple (suite) function v ol ume _c yl indre ( this ) class ( cylindre ) , intent ( in ) :: this double precision :: v ol um e _c yl in d re v ol um e_ c yl in dr e = this % cercle % aire ()* this % hauteur end function v ol u me _c yl in d re ! subroutine a f f i c h a g e _ f i g u r e _ p o i n t ( this ) class ( point ) , intent ( in ) :: this write ( OUTPUT_UNIT , * ) " == > POINT " end subroutine a f f i c h a g e _ f i g u r e _ p o i n t ! subroutine a f f i c h a g e _ f i g u r e _ c e r c l e ( this ) class ( cercle ) , intent ( in ) :: this write ( OUTPUT_UNIT , * ) " == > CERCLE " end subroutine a f f i c h a g e _ f i g u r e _ c e r c l e ! subroutine a f f i c h a g e _ f i g u r e _ c y l i n d r e ( this ) class ( cylindre ) , intent ( in ) :: this write ( OUTPUT_UNIT , * ) " == > CYLINDRE " end subroutine a f f i c h a g e _ f i g u r e _ c y l i n d r e
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 121 / 247
Type abstrait
Exemple (suite) subroutine a f f i c h a g e _ c o n s t i t u a n t s _ p o i n t ( this ) class ( point ) , intent ( in ) :: this write ( OUTPUT_UNIT , " (a , f0 .2 , a , f0 .2 , a ) " ) & " Coordonnees : [ " , this %x , " ," , this %y , " ] " end subroutine a f f i c h a g e _ c o n s t i t u a n t s _ p o i n t ! subroutine a f f i c h a g e _ c o n s t i t u a n t s _ c e r c l e ( this ) class ( cercle ) , intent ( in ) :: this call this % point % a f f i c h a g e _ c o n s t i t u a n t s write ( OUTPUT_UNIT , " (a , f10 .2) " ) " Rayon : " , this % rayon end subroutine a f f i c h a g e _ c o n s t i t u a n t s _ c e r c l e ! subroutine a f f i c h a g e _ c o n s t i t u a n t s _ c y l i n d r e ( this ) class ( cylindre ) , intent ( in ) :: this call this % cercle % a f f i c h a g e _ c o n s t i t u a n t s write ( OUTPUT_UNIT , " (a , f10 .2) " ) " Hauteur : " , this % hauteur end subroutine a f f i c h a g e _ c o n s t i t u a n t s _ c y l i n d r e end module m
Remarque :
les constructeurs ont t rednis car ceux par dfaut ne peuvent tre appels pour
Type abstrait
Exemple (suite) module outils use m type tab_ptr class ( figure_geo ) , allocatable :: figure end type tab_ptr contains subroutine sor ties_figure ( f ) CLASS ( figure_geo ) , intent ( in ) :: f call f % a ffi ch a g e_ f i g u r e call f % a f f i c h a g e _ c o n s t i t u a n t s write ( OUTPUT_UNIT , " (a , f10 .2) " ) " Aire : " , f % aire () write ( OUTPUT_UNIT , " (a , f10 .2) " ) " Volume : " , f % volume () end subroutine sor ties_fig ure end module outils
Langage Fortran
10 fvrier 2012
123 / 247
Type abstrait
Exemple (suite)
program prog use outils type ( point ) p type ( cercle ) c type ( cylindre ) cyl p = point ( x =1. d0 , y =5. d0 ) c = cercle ( x =0. d0 , y =5. d0 , r =10. d0 ) cyl = cylindre ( x =0. d0 , y =5. d0 , r =10. d0 , h =100. d0 ) call tableau contains subroutine tableau type ( tab_ptr ) , dimension (3) :: tab_figures integer n allocate ( tab_figures (1)% figure , source = p ) allocate ( tab_figures (2)% figure , source = c ) allocate ( tab_figures (3)% figure , source = cyl ) do n =1 , size ( tab_figures ,1) call sorties_figur e ( tab_figures ( n )% figure ) deallocate ( tab_figures ( n )% figure ) end do end subroutine tableau end program prog
Langage Fortran
10 fvrier 2012
124 / 247
Entres-sorties - Partie II
Environnement systme Tableaux dynamiques Nouveauts concernant les modules Entres-sorties - Partie I Pointeurs Procedures Nouveauts concernant les types drivs Entres-sorties - Partie II Traitement personnalis des objets de type driv Interoprabilit entre entits C et Fortran Arithmtique IEEE et traitement des exceptions
10
Langage Fortran
10 fvrier 2012
125 / 247
Entres-sorties - Partie II
11
Divers
Langage Fortran
10 fvrier 2012
126 / 247
Entres-sorties - Partie II
Au-del du traitement standard, il devient possible de contrler les oprations dentre-sortie portant sur un objet de type driv (public ou semi-priv) via une ou plusieurs procdures de type SUBROUTINE. Il existe 4 catgories de procdures (lecture/criture et avec/sans format) qui peuvent tre attaches de faon gnrique (generic bindings) au type driv de lobjet via des instructions du type :
GENERIC GENERIC GENERIC GENERIC :: :: :: :: READ(FORMATTED) READ(UNFORMATTED) WRITE(FORMATTED) WRITE(UNFORMATTED) => => => => lecture_format1, lecture_format2 lecture_nonformat1, lecture_nonformat2 ecriture_format1, ecriture_format2 ecriture_nonformat1, ecriture_nonformat2
insres au sein de la dnition du type comme nous le verrons dans les exemples plus loin. droite des ches, on trouve le nom des procdures qui seront discrimines la compilation en fonction du type driv de lobjet trait et de la valeur eective des sous-types (paramtre KIND) de ses composantes (paramtrables la dclaration).
Langage Fortran
10 fvrier 2012
127 / 247
Entres-sorties - Partie II
Une alternative lattachement gnrique prcdent est de regrouper lensemble des direntes procdures (concernant ventuellement plusieurs types drivs) au sein dun bloc interface :
INTERFACE READ(FORMATTED) MODULE PROCEDURE lecture_format1, lecture_format2, ... END INTERFACE READ(FORMATTED)
Concernant les entres-sorties avec format, un nouveau descripteur de format DT a t dni. Il sapplique un objet de type driv de la liste dentre-sortie et a pour forme : DT [chane de caractres] [(liste dentiers)] La chane de caractres et le tableau dentiers, qui peuvent apparatre avec ce descripteur, sont automatiquement transmis en argument dentre de la procdure appele. Ils sont la libre disposition du programmeur pour paramtrer le traitement. Note :
toutes ces notions sont reprables dans la documentation anglaise sous les mots-cls
dtio-generic-spec et dtv-type-spec.
Langage Fortran
10 fvrier 2012
128 / 247
Entres-sorties - Partie II
dtv : objet de type driv qui est lorigine de lappel (discriminant en cas dattachement gnrique de plusieurs procdures), unite : numro de lunit logique sur laquelle a t connect le chier (0 pour un chier interne), iotype : chane de caractres indique au niveau du descripteur de format DT, v_list : tableau dentiers indiqu au niveau du descripteur de format DT, etat : rete en retour ltat de lentre-sortie, msg : contient en retour le texte dun message derreur si etat est non nul.
Langage Fortran
10 fvrier 2012
129 / 247
Entres-sorties - Partie II
Exemple
module couleur_mod type couleur character ( len =:) , allocatable :: nom real , dimension (3) :: compos contains procedure :: ecr_format generic :: write ( formatted ) = > ecr_format ! <=== generic end type couleur contains subroutine ecr_format( dtv , unite , iotype , v_list , etat , msg ) class ( couleur ) , intent ( in ) :: dtv integer , intent ( in ) :: unite character ( len =*) , intent ( in ) :: iotype integer , dimension (:) , intent ( in ) :: v_list integer , intent ( out ) :: etat character ( len =*) , intent ( inout ) :: msg character ( len =10) , dimension (2) :: format write ( format(1) , " (a , i2 , a ) " ) " (a ,3 f " , v_list (1) , " .2) " write ( format(2) , " (a , i2 , a ) " ) " (3 f " , v_list (1) , " .2) " select case ( iotype ) case ( " namelist " ) ; write ( unit = unite , fmt =* ) case ( " listdirected " ); write ( unit = unite , fmt =* ) case ( " dtcomplet " ) ; write ( unit = unite , fmt =format(1) ) case default ; write ( unit = unite , fmt =format(2) ) end select end subroutine ecr_format end module couleur_mod
binding .
dtv % nom , dtv % compos dtv % nom , dtv % compos dtv % nom , dtv % compos dtv % compos
Langage Fortran
10 fvrier 2012
130 / 247
Entres-sorties - Partie II
Exemple (suite) PROGRAM exemple USE couleur_mod IMPLICIT NONE TYPE ( couleur ) REAL INTEGER CHARACTER ( len =132) NAMELIST / liste / x ,
:: :: :: :: y,
c1 , c2 x, y i , ios message c1
c1 = couleur ( nom = " gris_clair " , compos =[ 0.8 , 0.8 , 0.8 ] ) c2 = couleur ( nom = " gris_fonce " , compos =[ 0.2 , 0.2 , 0.2 ] ) i = 1756; x = 9.81; y = 2.718 WRITE ( UNIT =1 , FMT = " ( I0 , DT COMPLET (6) , 2 F6 .2 ) " , & IOSTAT = ios , IOMSG = message ) i , c1 , x , y if ( ios /= 0 ) PRINT * , ios , message WRITE ( UNIT =1 , FMT = " ( F7 .3 , DT (7) , DT COMPLET (5) ) " , & IOSTAT = ios , IOMSG = message ) x , c1 , c2 if ( ios /= 0 ) PRINT * , ios , message WRITE ( UNIT =1 , FMT =* , IOSTAT = ios , IOMSG = message ) x , c1 , i , y if ( ios /= 0 ) PRINT * , ios , message WRITE ( UNIT =1 , NML = liste ) if ( ios /= 0 ) PRINT * , ios , message END PROGRAM exemple
Langage Fortran
10 fvrier 2012
131 / 247
Entres-sorties - Partie II
Exemple de traitement dun fichier binaire MODULE couleur_mod TYPE couleur CHARACTER ( len =16) :: nom REAL , DIMENSION (3) :: compos CONTAINS PROCEDURE :: lec_binaire ! === Generic binding === GENERIC :: READ ( UNFORMATTED ) = > lec_binaire END TYPE couleur CONTAINS SUBROUTINE lec_binaire( dtv , unite , etat , msg ) CLASS ( couleur ) , INTENT ( inout ) :: dtv INTEGER , INTENT ( in ) :: unite INTEGER , INTENT ( out ) :: etat CHARACTER ( len =*) , INTENT ( inout ) :: msg READ ( UNIT = unite , IOSTAT = etat , IOMSG = msg ) dtv % nom , dtv % compos END SUBROUTINE lec_binaire END MODULE couleur_mod
Langage Fortran
10 fvrier 2012
132 / 247
Entres-sorties - Partie II
Exemple de traitement dun fichier binaire (suite) PROGRAM exemple USE couleur_mod IMPLICIT NONE TYPE ( couleur ) :: c REAL :: x , y INTEGER :: i , ios CHARACTER ( len =132) :: message ... READ ( UNIT =1 , IOSTAT = ios , IOMSG = message ) i , c , x , y DO WHILE ( ios == 0 ) ... READ ( UNIT =1 , IOSTAT = ios , IOMSG = message ) i , c , x , y END DO IF ( ios > 0 ) THEN PRINT * , message STOP 4 END IF END PROGRAM exemple
Entres-sorties - Partie II
Exemple de traitement rcursif MODULE list_module TYPE node integer :: value = 0 type ( node ) , pointer :: next_node = > null () CONTAINS PROCEDURE :: pwf GENERIC :: WRITE ( FORMATTED ) = > pwf ! <=== Generic binding . END TYPE node CONTAINS RECURSIVE SUBROUTINE pwf( dtv , unite , iotype , v_list , etat , msg ) CLASS ( node ) , INTENT ( in ) :: dtv INTEGER , INTENT ( in ) :: unite CHARACTER ( len =*) , INTENT ( in ) :: iotype INTEGER , DIMENSION (:) , INTENT ( in ) :: v_list INTEGER , INTENT ( out ) :: etat CHARACTER ( len =*) , INTENT ( inout ) :: msg WRITE ( UNIT = unite , FMT = " ( I9 ) " , IOSTAT = etat ) dtv % value if ( etat /= 0 ) return if ( ASSOCIATED ( dtv % next_node ) ) & WRITE ( UNIT = unite , FMT = " (/ , dt ) " , IOSTAT = etat ) dtv % next_node END SUBROUTINE pwf END MODULE list_module
Langage Fortran
10 fvrier 2012
134 / 247
Entres-sorties - Partie II
Note : dans ce dernier exemple, une n denregistrement est gnre uniquement lors de lcriture eectue au sein du programme principal. Par contre, concernant les critures de plus bas niveau ( savoir celles eectues dans la procdure pwf rattache au type node) une n denregistrement devra tre trate explicitement. Ce qui explique la prsence du caractre / dans le format de linstruction :
WRITE ( UNIT = unite , FMT = " (/ , dt ) " , IOSTAT = etat ) dtv % next_node
Langage Fortran
10 fvrier 2012
135 / 247
Entres-sorties - Partie II
Si lon dsire prciser un objet de type driv au sein dune liste dentres-sorties, il est obligatoire de dnir une procdure dentres-sorties pour ce type dans le cas o il contient une composante avec lattribut allocatable ou pointer. Cest galement le cas si lobjet prcis est polymorphique.
Exemple incorrect module m use I SO _FORT RA N_ EN V type cel integer i; real r contains procedure :: affichage end type cel contains subroutine affichage( this ) class ( cel ) , intent ( in ) :: this write ( OUTPUT_UNIT , * ) this end subroutine affichage end module m program p use m type ( cel ) :: c = cel ( r = acos ( -1.) , i =1756 ) call c % affichage end program p
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 136 / 247
Entres-sorties - Partie II
Exemple correct
module m use I S O_F OR TRAN_E NV type cel integer i real r contains procedure :: ecriture GENERIC :: WRITE ( FORMATTED ) = > ecriture ! <=== Generic binding . procedure :: affichage end type cel contains subroutine ecriture( dtv , unite , iotype , v_list , etat , msg ) class ( cel ) , intent ( in ) :: dtv integer , intent ( in ) :: unite character ( len =*) , intent ( in ) :: iotype integer , dimension (:) , intent ( in ) :: v_list integer , intent ( out ) :: etat character ( len =*) , intent ( inout ) :: msg write ( unite , * ) dtv %i , dtv % r end subroutine ecriture subroutine affichage( this ) class ( cel ) , intent ( in ) :: this write ( OUTPUT_UNIT , * ) this end subroutine affichage end module m program p use m type ( cel ) :: c = cel ( r = acos ( -1.) , i =1756 ) call c % affichage end program p
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 137 / 247
Environnement systme Tableaux dynamiques Nouveauts concernant les modules Entres-sorties - Partie I Pointeurs Procedures Nouveauts concernant les types drivs Entres-sorties - Partie II Interoprabilit entre entits C et Fortran Introduction Les types intrinsques Les tableaux Les variables globales Types drivs Fortran/structures de donnes C
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 138 / 247
11
Langage Fortran
10 fvrier 2012
139 / 247
Introduction
Linteroprabilit entre une entit Fortran et une entit C existe lorsquil est possible de les dclarer de part et dautre de faon ce quelles puissent tre mise en relation. Linteroprabilit suppose videmment que lon ne manipule que des entits (variables, fonctions, concepts, ...) communes aux deux langages, ce qui impose un certain nombre de restrictions et de contraintes. Pour faciliter le travail du programmeur et amliorer la portabilit de son code, la norme Fortran 2003 fournit un certain nombre de nouveaux lments syntaxiques ncessaires pour faciliter la dnition dentits interoprables . Le module intrinsque ISO_C_BINDING contient des constantes symboliques qui permettent linteroprabilit avec C pour un certain nombre dentits que nous allons passer en revue . . .
Langage Fortran
10 fvrier 2012
140 / 247
Note : une chane de caractres tant considre en C comme un tableau de caractres (avec comme dernier lment le caractre NULL), elle est interoprable avec lidenticateur dclar en Fortran sous la forme : CHARACTER(kind=C_CHAR), dimension(*) :: chaine
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 141 / 247
Dune faon gnrale, une variable scalaire est interoprable si son type ainsi que les ventuels paramtres de ce type sont interoprables et que celle-ci nadmet ni lattribut POINTER ni lattribut ALLOCATABLE. Dautres constantes symboliques permettent de faire rfrence des caractres spciaux comme : Nom C_NULL_CHAR C_ALERT C_BACKSPACE C_HORIZONTAL_TAB C_NEW_LINE C_VERTICAL_TAB C_FORM_FEED C_CARRIAGE_RETURN Signication en C null character alert backspace horizontal tab line feed/new line vertical tab form feed carriage return Valeur ASCII achar(0) achar(7) achar(8) achar(9) achar(10) achar(11) achar(12) achar(13) quivalent C \0 \a \b \t \n \v \f \r
Langage Fortran
10 fvrier 2012
142 / 247
Les tableaux
Les tableaux
Un tableau Fortran est interoprable sil est dun type interoprable (ainsi que les ventuels paramtres de ce type) et de prol explicite ou de taille implicite. De plus pour les tableaux multidimensionns, lordre des indices doit tre invers. Ainsi les tableaux Fortran : integer(kind=C_INT), dimension(18,3:7,*) integer(kind=C_INT), dimension(18,3:7,100) :: :: t1 t2
Langage Fortran
10 fvrier 2012
143 / 247
Ces variables Fortran sont interoprables avec celles dnies en C au niveau externe par :
Langage Fortran
Remarques : une variable globale Fortran doit avoir t dclare avec lattribut BIND(C) pour pouvoir tre mise en correspondance avec une variable externe C, si cet attribut a t spci sans le paramtre NAME, une rfrence externe est gnre entirement en minuscules, si le paramtre NAME a t prcis, sa valeur correspond au nom de la rfrence externe gnre, en respectant les minuscules et/ou majuscules employes.
Exemple module m use ISO_C_BINDING interface subroutine sp ( mat1 , mat2 , n , chaine ) bind ( C ) import C_FLOAT , C_DOUBLE , C_INT , C_CHAR real ( kind = C_FLOAT ) , dimension (3 ,6) :: mat1 real ( kind = C_DOUBLE ) , dimension (5 ,*) :: mat2 integer ( kind = C_INT ) :: n character ( kind = C_CHAR ) , dimension (*) :: chaine end subroutine sp end interface integer ( kind = C_INT ) , bind ( C ) :: entier_ externe real ( kind = C_DOUBLE ) , bind ( C ) :: double_ externe end module m
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 145 / 247
Exemple (suite) program prog use m use I SO _FORT RA N_ EN V real ( kind = C_FLOAT ) , dimension (3 ,6) :: m1 real ( kind = C_DOUBLE ) , dimension (5 ,7) :: m2 character ( kind = C_CHAR , len =*) , parameter :: chaine = & " I n t er o p er a b i l i t e Fortran / C " // C_NULL_CHAR integer i enti er_externe = 1756 doub le_externe = acos ( -1. _C_DOUBLE ) call random_number ( m1 ); call random_number ( m2 ) call sp ( m1 , m2 , 7 _C_INT , chaine ) write ( OUTPUT_UNIT , " (/ , 2a , Matrices Fortran 2003 ,/) " ) & C_HORIZONTAL_TAB , C _H O R I Z O N T A L _ T A B do i =1 , size ( m1 ,1) write ( OUTPUT_UNIT , " (6 f9 .6) " ) m1 (i ,:) end do print * do i =1 , size ( m2 ,1) write ( OUTPUT_UNIT , " (7 f9 .6) " ) m2 (i ,:) end do end program prog
Langage Fortran
10 fvrier 2012
146 / 247
Exemple (suite) # include < stdio .h > int entier_externe ; double double _externe ; void sp ( float m1 [6][3] , double m2 [][5] , int *n , char * ch ) { int i , j ; printf ( " \ t \ t % s \ n \ n " , ch ); printf ( " ent ier_externe = % d \ n " , enti er_exter ne ); printf ( " dou ble_externe = % f \ n " , doub le_exter ne ); printf ( " \ t \ tMatrices C \ n \ n " ); for ( j =0; j <3; j ++ ) { for ( i =0; i <6; i ++ ) printf ( " % f " , m1 [ i ][ j ] ); printf ( " \ n " ); } printf ( " \ n " ); for ( j =0; j <5; j ++ ) { for ( i =0; i <* n ; i ++ ) printf ( " % f " , m2 [ i ][ j ] ); printf ( " \ n " ); } return ; }
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 147 / 247
Note :
un type est interoprable si toutes ses composantes le sont : les entits ALLOCATABLE
en sont donc exclues, de mme aucune procdure ne peut lui tre attache. Dans le cas contraire, les types C_PTR et C_FUNPTR peuvent tre employs an de considrer un objet de ce type comme une entit opaque. (cf. lexemple 4 page 171).
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 148 / 247
Les pointeurs
Les pointeurs
Les pointeurs C, quels quils soient, sont interoprables avec des pointeurs Fortran particuliers du type driv semi-priv C_PTR dont une composante prive contient ladresse cache dune cible. On retrouve l lanalogie avec le descripteur du pointeur Fortran qui est sous-jacent lattribut POINTER. Le pointeur en Fortran est un concept abstrait et puissant nautorisant pas (abilit oblige) la manipulation arithmtique directe de ladresse qui reste cache. La ncessit de dnir les pointeurs de type C_PTR, souvent appels pointeurs C par opposition aux pointeurs Fortran, se justie en partie par le fait que contrairement ces derniers ils ne peuvent/doivent pas dsigner une zone mmoire non contigu. De plus, le type C_PTR est utilisable dans un contexte dinteroprabilit avec tout type de pointeur C (typ ou non void*).
Langage Fortran
10 fvrier 2012
149 / 247
Les pointeurs
Toutes les manipulations relatives aux pointeurs C se font via des oprateurs ou des procdures (mthodes), ainsi :
C_LOC(X) : fonction retournant un scalaire de type C_PTR renfermant ladresse de
son argument X au sens de lopration unaire & du langage C. Largument X doit avoir lattribut POINTER ou TARGET et tre soit :
une variable de type et paramtres de type interoprables ; une variable scalaire non polymorphique sans length type parameters.
Si la variable X admet lattribut ALLOCATABLE, elle devra tre alloue. Si elle admet lattribut POINTER elle devra tre scalaire et associe. Si cest un tableau, il devra tre de taille non nulle. use ISO_C_BINDING real(C_FLOAT), dimension(10), target type(C_PTR) buf = C_LOC(X)
Pour un argument non interoprable, cette fonction peut tre employe pour
:: ::
X buf
transmettre une fonction C ladresse dun objet opaque. Cette fonction naura alors dautre choix que dinterprter cette adresse comme tant de type void * : aucune indirection ne sera alors possible.
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 150 / 247
Les pointeurs
C_F_POINTER(CPTR, FPTR [,SHAPE]) cette procdure convertit CPTR de type C_PTR en un pointeur Fortran FPTR (SHAPE spcier si la cible est un tableau) ;
C_ASSOCIATED(C_PTR_1[, C_PTR_2]) cette procdure vrie que deux pointeurs C (de type C_PTR) sont identiques ou que le premier est ltat nul.
Notes :
Ces entits permettent linteroprabilit des tableaux dynamiques : un tableau
Fortran allou peut tre adress en C et un tableau allou en C peut ensuite tre associ un pointeur Fortran.
Langage Fortran
10 fvrier 2012
151 / 247
correspondant nest plus pass par rfrence (adresse), mais via une copie temporaire dans le stack. noter que la copie en retour nest pas faite, ce qui est exclusif de intent(OUT/INOUT) ! attribut BIND(C [,NAME=...]) obligatoire :
lors de la dnition dune procdure Fortran interoprable laquelle est appele en C, la dnition du bloc interface associ la fonction C appele depuis Fortran.
Le paramtre NAME permet de donner un nom la rfrence externe comme pour les variables globales dj vues ;
interface explicite et attribut BIND(C) obligatoire, arguments muets tous interoprables (non optionnels) et en cohrence avec ceux du
prototype C ;
une fonction Fortran doit retourner un scalaire interoprable et un sous-programme
Dans un premier exemple, Fortran appelle une fonction C laquelle il transmet deux arguments :
un tableau pass classiquement par rfrence suivi dune variable entire passe par
valeur.
Exemple : fonction C appele depuis Fortran module m use , intrinsic :: ISO_C_BINDING interface function C_FUNC (array, N ) BIND (C , NAME = " C_Func " ) import C_INT , C_FLOAT implicit none real ( kind = C_FLOAT ) :: C_FUNC real ( kind = C_FLOAT ) , dimension (*) :: array integer ( kind = C_INT ) , VALUE :: N end function C_FUNC end interface end module m
Langage Fortran
10 fvrier 2012
153 / 247
Exemple : fonction C appele depuis Fortran (suite) program p use m integer ( kind = C_INT ) , parameter :: n = 18 real ( C_FLOAT ) , dimension ( n ) :: tab real ( kind = C_FLOAT ) :: y call random_number ( tab ) y = C_FUNC ( array = tab , N= n ) print * , " Val . retourne par la fonction : " , y end program p float C_Func ( float * buf , int count ) { float somme = 0. ; for ( int i =0; i < count ; i ++ ) somme += buf [ i ] ; return somme ; }
Langage Fortran
10 fvrier 2012
154 / 247
Fonction C appele
Arguments muets float* buf int count
18 Prototype
integer(C_INT) :: n 18
Bloc Interface
integer(C_INT), VALUE :: N real(C_FLOAT), dimension(*) :: array
Stack
&tab[0]
18
Langage Fortran
10 fvrier 2012
155 / 247
Dans ce deuxime exemple, C appelle une procdure Fortran laquelle il transmet trois arguments :
une variable entire passe par valeur ; une variable relle passe par rfrence ; un tableau taille implicite pass par rfrence. Exemple : procdure Fortran appele depuis C void f1 ( double *b , double d [] , long taille_d ); int main () { double beta = 378.0 ; double delta [] = { 17. , 12.3 , 3.14 , 2.718 , 0.56 , 22.67 , 25.8 , 89. , 76.5 , 80. } ; long taille_delta = sizeof delta / sizeof delta [0] ; f1 ( & beta , delta , taille_delta ) ; return 0; } subroutine F1 (B , D , TAILLE_D ) BIND (C , NAME = " f1 " ) use , intrinsic :: ISO_C_BINDING implicit none real ( C_DOUBLE ) , intent ( inout ) :: B real ( C_DOUBLE ) , dimension (*) , intent ( in ) :: D integer ( kind = C_LONG ) , VALUE :: TAILLE_D print * , " B = " , B , " D ( " , TAILLE_D , " )= " , D ( TAILLE_D ) end subroutine F1
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 156 / 247
17.0
1 12.3 3 3.14
80.0
Stack
long taille_delta
10
&beta
&delta[0]
10
Langage Fortran
10 fvrier 2012
157 / 247
Langage Fortran
10 fvrier 2012
158 / 247
Dans cet exemple, Fortran alloue et valorise un tableau deux dimensions. Son adresse traduite en un pointeur C laide de la fonction C_LOC est transmise par valeur une fonction C. De plus la fonction C rcupre les dimensions du tableau qui lui ont t passes par valeur. Notes :
le tableau Fortran dclar avec lattribut ALLOCATABLE nest pas interoprable. Le
norme C99.
Langage Fortran
10 fvrier 2012
159 / 247
Exemple1 : Fortran C (argument C_PTR pass par valeur) program EXEMPLE_1 use , intrinsic :: ISO_C_BINDING real ( kind = C_FLOAT ) , dimension (: ,:) , allocatable , target :: mat integer ( kind = C_INT ) :: n , m interface ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -! subroutine c_func ( n , m , v ) bind (C , name = " fct " ) import C_INT , C_PTR integer ( kind = C_INT ) , VALUE :: n , m type ( C_PTR ) , VALUE :: v ! ou (*) real ( kind = C_FLOAT ) , dimension (*) :: v end subroutine c_func end interface ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -! read * , n , m ; allocate ( mat (n , m ) ) call random_number ( mat ) call c_func ( n , m , C_LOC ( mat ) ) ! ou (*) call c_func ( n , m , mat ) print * , " SOMME = " , sum ( array = mat , dim =1 ); deallocate ( mat ) end program EXEMPLE_1 Version C89 Version C99
void fct ( int n , int m , float * vec ) { float ** mat ; int i, j; mat = malloc ( m * sizeof ( float *) ); for ( i =0 , j =0; i < m ; i ++ , j += n ) mat [ i ] = vec +j , mat [ i ][ n -1] *= 2.; free ( mat ); }
Patrick Corde Herv Delouis
void fct ( int n , int m , float mat [ m ][ n ]) { for ( int i =0; i < m ; i ++ ) mat [ i ][ n -1] *= 2.; return ; }
Langage Fortran
10 fvrier 2012
160 / 247
Exemple 1 : Fortran ==> C (argument C_PTR pass par valeur) Appelant Fortran + B.I. + BIND(C)
Arguments dappel 32 integer(C_INT) :: n, m 20 n m mat(n,m)
Fonction C appele
Arguments muets
11111 00000 11111 00000 11111 00000 11111 00000 11111 00000
32
Prototype
Bloc Interface
integer(C_INT), VALUE :: n, m type(C_PTR), VALUE :: v
Stack
20
Dans cet exemple, Fortran souhaite sous-traiter une fonction C lallocation dune matrice n*m quil rfrencera ensuite via un pointeur Fortran. lappel de la fonction C, Fortran passe par valeur les deux dimensions n et m dsires et passe par rfrence un pointeur interoprable non encore associ. La fonction C appele alloue une zone mmoire de n*m rels. Son adresse est stocke dans lobjet Fortran pointeurC de type C_PTR. En retour de la fonction C, Fortran convertit lobjet pointeurC en un pointeur Fortran classique (via la procdure C_F_POINTER) qui devient ainsi associ la matrice alloue en C. Ensuite cet objet pointeurC est transmis par valeur une autre fonction C an de librer la zone alloue.
Langage Fortran
10 fvrier 2012
162 / 247
Exemple2 : Fortran C (argument C_PTR pass par rfrence) program exemple2 use ISO_C_BINDING integer ( kind = C_INT ) :: n , m type ( C_PTR ) :: pointeurC real ( kind = C_FLOAT ) , dimension (: ,:) , pointer :: p_mat interface subroutine c_alloc ( ptrC , n , m ) bind (C , name = " C_alloc " ) import C_PTR , C_INT type ( C_PTR ) , intent ( out ) :: ptrC integer ( kind = C_INT ) , VALUE :: n , m end subroutine c_alloc subroutine c_free ( ptrC ) bind (C , name = " C_free " ) import C_PTR type ( C_PTR ) , VALUE :: ptrC end subroutine c_free end interface read * , n , m ; call c_alloc ( pointeurC , n , m ) call C_F_POINTER ( CPTR = pointeurC , FPTR = p_mat , shape =(/ n , m /) ) call random_number ( p_mat ) print * , " SOMME = " , sum ( array = p_mat , dim =1 ) call c_free ( pointeurC ) end program exemple2 void C_alloc ( float ** p , int n , int m ) { * p = malloc ( n * m * sizeof ( float ) ); return ; } void C_free ( float * p ) { free ( p ); return ; }
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 163 / 247
Exemple 2 : Fortran ==> C (argument C_PTR pass par rfrence) Appelant Fortran + B.I. + BIND(C)
Arguments dappel type(C_PTR) :: pointeurC float **p
Fonction C appele
Arguments muets
R C_F_POINTE
p_mat integer(C_INT) :: n, m pointeurC 24 n 12 m
*p=malloc(n*m*sizeof(float))
Langage Fortran
10 fvrier 2012
164 / 247
Dans cet exemple, C souhaite sous-traiter des sous-programmes Fortran la gestion (allocation, valorisation, traitement, libration) dun vecteur de 100 rels. lappel du sous-programme for_alloc, C passe en argument ladresse &vec dun pointeur de rels. Dans le sous-programme for_alloc, largument pointeurC muet correspondant est un pointeur de type C_PTR de vocation INTENT(OUT) sans lattribut VALUE. Fortran alloue un tableau de la taille requise dont ladresse est retourne C via largument de sortie pointeurC valoris laide de la fonction C_LOC. En retour du sous-programme Fortran, C peut accder la zone dynamique par lintermdiaire du pointeur vec.
Langage Fortran
10 fvrier 2012
165 / 247
Exemple 3 : C Fortran (argument C_PTR pass par rfrence) # include < stdio .h > void F_alloc ( float ** , int ); void F_moyenne ( float * , int ); void F_free ( void ); int main () { const int n = 100; float * vec ; F_alloc ( & vec , n ); printf ( " vec [50] = % f \ n " , vec [50] ); F_moyenne ( vec , n ); F_free (); return 0; }
Langage Fortran
10 fvrier 2012
166 / 247
Exemple 3 : C Fortran (argument C_PTR pass par rfrence) (suite) module creer_liberer use ISO_C_BINDING real ( kind = C_FLOAT ) , dimension (:) , allocatable , target :: vecteur contains subroutine for_alloc ( pointeurC , n ) BIND (C , name = " F_alloc " ) type ( C_PTR ) , intent ( out ) :: pointeurC integer ( kind = C_INT ) , VALUE :: n allocate ( vecteur ( n ) ) call random_number ( vecteur ) pointeurC = C_LOC ( vecteur ) end subroutine for_alloc subroutine for_free () BIND (C , name = " F_free " ) if ( allocated ( vecteur ) ) deallocate ( vecteur ) end subroutine for_free end module creer_liberer module calculs use ISO_C_BINDING contains subroutine moyenne ( pointeurC , n ) BIND (C , name = " F_moyenne " ) type ( C_PTR ) , VALUE :: pointeurC integer ( C_INT ) , VALUE :: n real ( kind = C_FLOAT ) , dimension (:) , pointer :: p call C_F_POINTER ( CPTR = pointeurC , FPTR =p , shape =(/ n /) ) print * , " MOYENNE = " , sum ( p ) / n end subroutine moyenne end module calculs
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 167 / 247
Stack
100
C_PTR pointeurC
Appel : F_alloc(&vec, n)
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 168 / 247
dans le module creer_liberer. Dans le cas contraire (dclar localement la procdure for_alloc) il ne sera plus possible de le librer au sein de la procdure for_free car la libration ne peut se faire quen mentionnant le nom du tableau.
Lentit vecteur pourrait tre dclare avec lattribut pointer ( la place de
allocatable, target) ; Dans ce cas, sa conversion en pointeur C interoprable ne pourrait se faire que sous la forme C_LOC(vecteur(1)) car, selon la norme, largument de C_LOC ne peut tre un pointeur Fortran associ un tableau.
Si cette entit est dclare localement la procdure for_alloc avec lattribut
pointer, elle ne pourra tre libre au sein de la procdure for_free qu laide dun pointeur global lequel aura t associ lors de lallocation : pour la bonne raison que linformation indiquant quil sagit dune cible dynamique est stocke dans le descripteur de pointeur. Cependant le plus simple, dans le cas dune dclaration locale, est dallouer et de dsallouer lespace au sein de la mme procdure.
Langage Fortran
10 fvrier 2012
169 / 247
Exemple 4 : C Fortran (argument C_PTR pass par rfrence et par valeur) module g es t io n_ ce l lu le use ISO_C_BINDING type pass integer n real , allocatable , dimension (:) :: a ... end type pass type ( pass ) , pointer :: p_cel contains subroutine init ( data , n ) BIND ( C ) type ( C_PTR ) , intent ( out ) :: data integer ( C_INT ) , VALUE :: n allocate ( p_cel ) p_cel % n = n allocate ( p_cel % a ( n )) data = C_LOC ( p_cel ) end subroutine init subroutine add ( data , ... ) BIND ( C ) type ( C_PTR ) , VALUE :: data . . . call C_F_POINTER ( data , p_cel ) . . . end subroutine add end module ges ti on _c e ll ul e
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 170 / 247
Exemple 4 : C Fortran (argument C_PTR pass par rfrence et par valeur) int main () { void *p , * q ; ... init ( &p , 100 init ( &q , 200 ... add ( p , ... ) add ( q , ... ) return 0; }
) ; ) ; ; ;
Remarque :
Dans cet exemple, la fonction C_LOC est utilise pour transmettre la fonction main
ladresse dun objet opaque. Celle-ci considre cette adresse comme tant de type void * : elle ne peut donc eectuer aucune indirection. Cette adresse est ensuite transmise la procdure Fortran add ;
La fonction main gre de facon abstraite un travail sous la responsabilit de
Fortran.
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 171 / 247
Exemple Fortran C (suite) # include < stdio .h > typedef struct { int len; float * p ; } vecteur ; void C_moyenne ( vecteur vec ) { float moy ; printf ( " Le vecteur vec a % d lments .\ n " , vec .len ) ; moy = 0. ; for ( int i =0; i < vec .len; i ++ ) moy += vec . p [ i ] ; moy /= vec .len ; printf ( " Moyenne = % f \ n " , moy ) ; return ; }
Langage Fortran
10 fvrier 2012
173 / 247
Exemple 1 : Fortran ==> C (structure de donnes en argument avec composante pointeur) Appelant Fortran + B.I. + BIND(C)
Arguments dappel
Fonction C appele
tab
Arguments muets
Structure v
100
1 b) a 2 (t OC L C_ 100
vecteur vec
Tableau dynamique
ptr_C
Prototype
Bloc Interface
type(vecteur), VALUE :: vec
Stack
len 100 p &tab[0]
Langage Fortran
10 fvrier 2012
174 / 247
Interoprabilit dune structure de donnes passe par valeur et contenant une composante pointeur associe une cible dynamique. Dans cet exemple la cible est alloue en C puis valorise dans le sous-programme Fortran appel.
Exemple C Fortran module m use ISO_C_BINDING implicit none type , BIND ( C ) :: vecteur integer ( kind = C_INT ) :: n ! Composante dynamique type " pointeur C " type ( C_PTR ) :: pointeurC end type vecteur contains subroutine valorisation ( v ) BIND (C , NAME = " F_val " ) type ( vecteur ) , VALUE :: v real ( kind = C_FLOAT ) , dimension (:) , pointer :: pointeurF print * , " Taille du vecteur allou en C : " , v % n ! -- Conversion du " pointeur C " en pointeur Fortran call C_F_POINTER ( CPTR = v % pointeurC , FPTR = pointeurF , & SHAPE =[ v % n ] ) call random_number ( pointeurF ) end subroutine valorisation end module m
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 175 / 247
Exemple C Fortran (suite) # include < stdio .h > # include < stdlib .h > typedef struct { int len; float * p ; } vecteur ; void F_val ( vecteur v ); int main () { float moy ; vecteur vec ; moy = 0. ; vec . p = ( float *) calloc ( vec .len=1000 , sizeof ( float )) ; F_val ( vec ) ; for ( int i =0; i < vec .len; i ++ ) moy += vec . p [ i ] ; moy /= vec .len ; printf ( " Moyenne = % f \ n " , moy ) ; free ( vec . p ) ; return 0 ; }
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 176 / 247
Exemple 2 : C ==> Fortran (structure de donnes en argument avec composante pointeur) Appelant C
Arguments dappel
vecteur vec
len p
1000
n 1000
0 1 2 Tableau dynamique 999
vec.p
Structure
v
pointeurC
pointeurF
C_F_POINTER
Prototype C
Stack
vecteur vec
1000 len
&vec.p[0] p
Appel : F_val(vec)
Langage Fortran
10 fvrier 2012
177 / 247
Reprenons ce mme exemple en passant cette fois-ci le vecteur vec par rfrence.
Exemple C Fortran void F_val ( vecteur *); int main () { . . . F_val ( & vec ) ; . . . } module m . . . contains subroutine valorisation ( v ) BIND (C , NAME = " F_val " ) type ( vecteur ) , intent ( in ) :: v . . . end subroutine valorisation end module m
Langage Fortran
10 fvrier 2012
178 / 247
Exemple dinteroprabilit avec des types drivs/structures # include # include # include # include < stdio .h > < stdlib .h > < string .h > < math .h >
typedef struct { int i , j ; } Pair ; typedef struct { int n; double r ; int n_ch ; char ** tab_chaines ; int nb_pairs ; Pair * p ; } Cel ;
Langage Fortran
10 fvrier 2012
179 / 247
Exemple dinteroprabilit avec des types drivs/structures (suite) int main () { void Ap_For ( Cel ); Cel c ; c . n = 1756 , c . r = acos ( -1. ) , c . n_ch = 10; c . tab_chaines = calloc ( c . n_ch , sizeof ( char *) ); for ( int n =0; n < c . n_ch ; n ++ ) { char buffer [] = " File numberxx " ; sprintf ( buffer +11 , " %02 d " , n ); c . tab_chaines [ n ] = strdup ( buffer ); } c . p = calloc ( c . nb_pairs =3 , sizeof ( Pair ) ); for ( int n =0; n < c . nb_pairs ; n ++ ) c . p [ n ]. i = n +1000 , c . p [ n ]. j = n +2000; Ap_For ( c ); for ( int n =0; n < c . n_ch ; n ++ ) free ( c . tab_chaines [ n ] ); free ( c . tab_chaines ); free ( c . p ); return 0; }
Langage Fortran
10 fvrier 2012
180 / 247
Exemple dinteroprabilit avec des types drivs/structures (suite) module m use ISO_C_BINDING type , bind ( C ) :: pair integer ( kind = C_INT ) i integer ( kind = C_INT ) j end type pair type , bind ( C ) :: cellule integer ( kind = C_INT ) n real ( kind = C_DOUBLE ) r integer ( kind = C_INT ) n_ch type ( C_PTR ) p integer ( kind = C_INT ) n_pairs type ( C_PTR ) q end type cellule type ( C_PTR ) , dimension (:) , pointer :: tab_ptr character ( len =: , kind = C_CHAR ) , pointer :: chaine type ( pair ) , dimension (:) , pointer :: p_pair
Langage Fortran
10 fvrier 2012
181 / 247
Exemple dinteroprabilit avec des types drivs/structures (suite) contains subroutine sp ( c ) bind ( C , name = " Ap_For " ) use I SO_F OR T RA N_ EN V type ( cellule ) , VALUE :: c integer i , n_char call C_F_POINTER ( CPTR = c %p , FPTR = tab_ptr , shape =(/ c % n_ch /)) do i =1 , c % n_ch call C_F_POINTER ( CPTR = tab_ptr ( i ) , FPTR = chaine ) n_char = 1 do while ( chaine ( n_char : n_char ) /= C_NULL_CHAR ) n_char = n_char + 1 end do write ( OUTPUT_UNIT , * ) chaine (1: n_char ) end do call C_F_POINTER ( CPTR = c %q , FPTR = p_pair , shape =(/ c % n_pairs /)) do i =1 , c % n_pairs write ( OUTPUT_UNIT , * ) p_pair ( i )% i , p_pair ( i )% j end do end subroutine sp end module m
Langage Fortran
10 fvrier 2012
182 / 247
Au mme titre que les pointeurs C, les pointeurs de fonction sont interoprables avec les pointeurs de procdures au moyen du type opaque C_FUNPTR. Pour grer ladresse qui y est encapsule, on dispose des services suivant :
fonction C_FUNLOC(X)
qui retourne ladresse C dune procdure Fortran X (ayant obligatoirement lattribut BIND(C)) dans un scalaire de type C_FUNPTR, qui convertit un pointeur de fonction de type C_FUNPTR (CPTR) en un pointeur de procdure Fortran (FPTR).
Langage Fortran
10 fvrier 2012
183 / 247
Exemple module m use ISO_C_BINDING implicit none interface subroutine appel_C () bind ( C ) end subroutine appel_C end interface type ( C_FUNPTR ) , bind ( C ) :: addr , addr_func contains function carre ( x ) bind ( C ) real ( C_FLOAT ) , VALUE , INTENT ( IN ) :: x real ( C_FLOAT ) :: carre carre = x * x end function carre end module m
Langage Fortran
10 fvrier 2012
184 / 247
Exemple (suite) program p use m implicit none procedure ( carre ) , pointer :: ptr_proc , fonction ptr_proc = > carre addr = C_FUNLOC ( carre ) ! addr = C_FUNLOC ( ptr_proc ) call appel_C call C_ F _P RO CP O IN TE R ( CPTR = addr_func , FPTR = fonction ) print * , fonction ( 2.718 ); end program p
Langage Fortran
10 fvrier 2012
185 / 247
Exemple (suite) # include < stdio .h > float (* addr )( float ); float (* addr_func )( float ); float f ( float x ) { return x * x * x ; } void appel_c ( void ) { printf ( " % f \ n " , addr ( 3.14 f ) ); addr_func = f ; return ; }
Langage Fortran
10 fvrier 2012
186 / 247
Environnement systme Tableaux dynamiques Nouveauts concernant les modules Entres-sorties - Partie I Pointeurs Procedures Nouveauts concernant les types drivs Entres-sorties - Partie II Interoprabilit entre entits C et Fortran Arithmtique IEEE et traitement des exceptions
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 187 / 247
10
Standard IEEE-754
Valeurs spciales Exceptions Mode darrondi
Modules intrinsques Fonctions dinterrogation Procdures de gestion du mode darrondi Gestion des exceptions Procdures de gestion des interruptions Procdures de gestion du contexte arithmtique Modules intrinsques
Module IEEE_EXCEPTIONS Module IEEE_ARITHMETIC Module IEEE_FEATURES
Documentations
11
Divers
Langage Fortran
10 fvrier 2012
188 / 247
Standard IEEE-754
Le standard IEEE-754 concernant larithmtique relle ottante ainsi que le traitement des exceptions dnit un systme de reprsentation des nombres ottants. Ce systme permet la reprsentation des valeurs spciales suivantes :
NaN (Not a Number ) : valeur dune expression mathmatique indtermine comme
0/0, 0 , /,
0+ , 0 ;
1 ;
Dans tout systme de reprsentation, en loccurrence celui dni par le standard IEEE, lensemble des rels reprsentables est un ensemble ni.
Langage Fortran
10 fvrier 2012
189 / 247
Standard IEEE-754
Exceptions
Dans des cas extrmes, une opration arithmtique peut produire comme rsultat une des valeurs spciales indiques ci-dessus ou bien une valeur en dehors de lensemble des valeurs reprsentables. De tels cas gnrent des vnements de type exception. Le standard IEEE dnit 5 classes dexception :
overow : valeur calcule trop grande, underow : valeur calcule trop petite, division par zro, opration invalide : valeur calcule gale NaN, opration inexacte : valeur calcule non reprsentable exactement (implique un
arrondi). Dans le cas dun underow, la valeur calcule est soit une valeur dnormalise (gradual underow ) soit 0 (abrupt underow ) selon le choix du programmeur. Lorsquune exception se produit, un ag spcique est positionn.
Langage Fortran
10 fvrier 2012
190 / 247
Standard IEEE-754
Mode darrondi
Lorsque la valeur calcule nest pas reprsentable, une exception de type opration inexacte est gnre et le calcul se poursuit avec une valeur approche (arrondie). Le standard IEEE dnit 4 modes darrondi :
toward nearest (dfaut sur IBM xlf) ; toward zro ; toward +INF (+) ; toward -INF ().
Langage Fortran
10 fvrier 2012
191 / 247
Modules intrinsques
Modules intrinsques
Trois modules intrinsques permettent laccs aux fonctionnalits dnies par le standard IEEE :
IEEE_ARITHMETIC, IEEE_EXCEPTIONS, IEEE_FEATURES.
Langage Fortran
10 fvrier 2012
192 / 247
Fonctions dinterrogation
Fonctions dinterrogation
Ce sont des fonctions dinterrogation sur lenvironnement utilis an de savoir sil est conforme en tout ou partie au standard IEEE :
IEEE_SUPPORT_STANDARD(x), IEEE_SUPPORT_DATATYPE(x), IEEE_SUPPORT_DENORMAL(x), IEEE_SUPPORT_INF(x), IEEE_SUPPORT_NAN(x),
Elles retournent une valeur logique indiquant si lenvironnement utilis respecte le standard ou un aspect du standard pour le type de largument rel x fourni.
Langage Fortran
10 fvrier 2012
193 / 247
Fonctions dinterrogation
Il existe des fonctions permettant de connatre la classe ou le type de valeur dun rel x (NaN, , ngatif, positif, nul, ... ). Lappel ces fonctions nest possible que si la fonction IEEE_SUPPORT_DATATYPE applique ce rel retourne la valeur vraie. Les classes sont dnies via des constantes symboliques dun type prdni (IEEE_CLASS_TYPE) dont voici la liste :
IEEE_SIGNALING_NAN (NaNS), IEEE_QUIET_NAN (NaNQ), IEEE_NEGATIVE_INF, IEEE_POSITIVE_INF, IEEE_NEGATIVE_DENORMAL, IEEE_POSITIVE_DENORMAL, IEEE_NEGATIVE_NORMAL, IEEE_NEGATIVE_ZERO, IEEE_POSITIVE_NORMAL, IEEE_POSITIVE_ZERO, IEEE_OTHER_VALUE IEEE_CLASS(x), IEEE_IS_NAN(x), IEEE_IS_FINITE(x), IEEE_IS_NEGATIVE(x), IEEE_IS_NORMAL(x).
De plus la fonction IEEE_VALUE(x, class) gnre un rel dun type (celui de x) et dune classe donns. Lexemple qui suit permet de rcuprer la classe dun rel x lu dans le chier fort.1.
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 194 / 247
Fonctions dinterrogation
Exemple
program class use I E EE_ AR ITHMET IC implicit none type ( I EE E_C LAS S_TYPE ) :: class_type real :: x , y read ( unit =1 ) x if ( I E E E _ S U P P O R T _ D A T A T Y P E ( x ) ) then class_type = IEEE_CLASS ( x ) if ( IE EE _SU PP ORT _N A N ( x ) ) then if ( class_type == I E E E _ S IG N AL I N G _ N A N ) & print * , " X is a I EE E _ S I G N A L IN G _N A N " if ( class_type == IEE E_QUI ET_N AN ) & print * , " X is a I EEE_QUIET _NAN " end if if ( I EE E_ SU P POR T_ I NF ( x ) ) then if ( class_type == IE E E _ NE GA T IV E _ I N F ) & print * , " X is a I E E E_ N E G A TI V E _ I N F number " if ( class_type == IE E E _ PO SI T IV E _ I N F ) & print * , " X is a I E E E_ P O S I TI V E _ I N F number " end if if ( I E E E _ S U P P O R T _ D E N O R M A L ( x ) ) then if ( class_type == I E E E _ N E G A T I V E _ D E N O R M A L ) & print * , " X is a I E E E _ N E G A T I V E _ D E N O R M A L number " if ( class_type == I E E E _ P O S I T I V E _ D E N O R M A L ) & print * , " X is a I E E E _ P O S I T I V E _ D E N O R M A L number " end if if ( class_type == I E E E _ N E G A T I V E _ N O R M A L ) & print * , " X is a I E E E _ N E G A T I V E _ N O R M A L number " if ( class_type == I E E E _ P O S I T I V E _ N O R M A L ) & print * , " X is a I E E E _ P O S I T I V E _ N O R M A L number " if ( class_type == I E E E _ N E G A T I V E _ Z E R O ) & print * , " X is a IE E E _N E G A T I V E _ Z E R O number " if ( class_type == I E E E _ P O S I T I V E _ Z E R O ) & print * , " X is a IE E E _P O S I T I V E _ Z E R O number " end if y = IEEE_VALUE ( x , class_type ); print * , y end program class
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 195 / 247
Langage Fortran
10 fvrier 2012
196 / 247
Ces dirents drapeaux sont rfrencs laide de constantes symboliques dun type prdni (IEEE_FLAG_TYPE) :
IEEE_UNDERFLOW, IEEE_OVERFLOW, IEEE_DIVIDE_BY_ZERO, IEEE_INVALID IEEE_INEXACT
Langage Fortran
10 fvrier 2012
197 / 247
De plus, deux constantes symboliques de type tableau (IEEE_USUAL, IEEE_ALL) permettent de rfrencer tout ou partie de ces drapeaux : IEEE_USUAL = (/ IEEE_OVERFLOW, IEEE_DIVIDE_BY_ZERO, IEEE_INVALID /) IEEE_ALL = (/ IEEE_USUAL, IEEE_UNDERFLOW, IEEE_INEXACT /) Ces constantes symboliques sont principalement utilises comme argument de fonctions telles que : IEEE_GET_FLAG(flag, flag_value) IEEE_SET_FLAG(flag, flag_value) Ces procdures retournent dans largument flag_value un logique signalant ltat de lexception indique en 1er argument sous forme dune des constantes symboliques prcdentes.
Langage Fortran
10 fvrier 2012
198 / 247
Exemple program except use I EE E_EXC EP TI ON S implicit none real va le ur _c a lc ul ee logical flag_value call IEEE_SET_FLAG ( IEEE_ALL , . false . ) v al eu r_ cal cu le e = 2.453*4.532 print * , " val eu r_calcu l e : " , v a le ur _c a lc ul ee call IEEE_GET_FLAG ( IEEE_INEXACT , flag_value ) if ( flag_value ) print * , " Valeur calcule inexacte . " end program except
Note :
lors de lappel et du retour dune procdure, le contexte de gestion de larithmtique
IEEE est sauvegard puis restaur. Pour des raisons de performance, ce processus peut tre inhib sur certains environnements via une option du compilateur (cf. option -qnostrictieeemod de xlf sur IBM).
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 199 / 247
Lorsquune exception de type underow se produit, le rsultat du calcul est soit 0 (abrupt underow ) soit un nombre dnormalis si le processeur supporte de tels nombres (gradual underow ). Les deux sous-programmes suivants permettent de grer le mode dunderow dsir (gradual underow ou abrupt underow ) : IEEE_GET_UNDERFLOW_MODE(gradual) IEEE_SET_UNDERFLOW_MODE(gradual)
Exemple
use IE EE _ ARI TH MET IC implicit none logical :: s a v e _ u n d e r f l o w _ m o d e ! Sauvegarde du mode d underflow courant . call I E E E _ G E T _ U N D E R F L O W _ M O D E ( GRADUAL = s a v e _ u n d e r f l o w _ m o d e ) ! Position nement du mode abrupt underflow CALL I E E E _ S E T _ U N D E R F L O W _ M O D E ( GRADUAL =. false . ) ! Calculs dans le mode abrupt underflow ; une valeur ! trop petite est alors remplace par zro . . . . ! Restauration du mode d underflow sauvegard . CALL I E E E _ S E T _ U N D E R F L O W _ M O D E ( GRADUAL = s a v e _ u n d e r f l o w _ m o d e )
Langage Fortran
10 fvrier 2012
200 / 247
Exemple
use IE EE _ ARI TH MET IC implicit none real :: x , zero logical , dimension (5) :: flags logical :: arret read * , zero , arret ! zero = 0. ! Mode d interruption suite une division par zro . call I E E E _ S E T _ H A L T I N G _ M O D E ( IEEE_DIVIDE_BY_ZERO , arret ) x = 1./ zero ; print * , x call IEEE_GET_FLAG ( IEEE_ALL , flags ) print * , flags
Langage Fortran
10 fvrier 2012
201 / 247
Deux autres sous-programmes grent ltat de lenvironnement relatif larithmtique ottante (drapeaux dexceptions et dinterruptions, mode darrondi) : IEEE_GET_STATUS(status_value) IEEE_SET_STATUS(status_value) Largument status_value est du type IEEE_STATUS_TYPE ; il contient en entre (SET) ou en sortie (GET) ltat de tous les drapeaux relatifs larithmtique ottante.
Langage Fortran
10 fvrier 2012
202 / 247
Exemple use IEEE_ EXCEPTIONS implicit none type ( IE EE _ S TA T US_TY P E ) status_value ! ! Sauvegarde de tout le contexte flottant IEEE . call IE E E_GET_S TA TU S ( status_value ) ! ! Mettre tous les " drapeaux " de type exception faux . call IEEE_SET_FLAG ( IEEE_ALL , . false . ) ! ! Calculs avec traitement des exceptions ventuelles . ... ! Restauration de tout le contexte flottant IEEE prcdent . call IE E E_SET_S TA TU S ( status_value ) ...
Langage Fortran
10 fvrier 2012
203 / 247
Exemple complmentaire sur les exceptions use IEEE_ EXCEPTIONS implicit none type ( IEE E_FLAG_TYPE ) , dimension (2) , parameter :: & out_of_range = (/ IEEE_OVERFLOW , IEEE _UNDERFL OW /) logical , dimension (2) :: flags_range logical , dimension (5) :: flags_all call I E E E _ S E T _ H A L T I N G _ M O D E ( IEEE_ALL , . false . ) ... ... call IEEE_GET_FLAG ( out_of_range , flags_range ) if ( any ( flags_range ) ) then ! Une exception du type " underflow " ou " overflow " s est produite . ... end if ... ... call IEEE_GET_FLAG ( IEEE_ALL , flags_all ) ! <== Procdure lmentaire if ( any ( flags_all ) ) then ! Une exception quelconque s est produite . ... end if
Langage Fortran
10 fvrier 2012
204 / 247
Modules intrinsques
Modules intrinsques
La disponibilit des modules IEEE_ARITHMETIC, IEEE_EXCEPTIONS et IEEE_FEATURES dpend de lenvironnement utilis, de mme que les constantes symboliques dnies dans le module IEEE_FEATURES, dans le cas o celui-ci est fourni. Le module IEEE_ARITHMETIC se comporte comme sil contenait une instruction use IEEE_EXCEPTIONS. Si, dans une unit de programme, le module IEEE_ARITHMETIC ou IEEE_EXCEPTIONS est accessible, les fonctionnalits IEEE_OVERFLOW et IEEE_DIVIDE_BY_ZERO sont supportes dans cette unit pour tout type de rels et de complexes. On utilisera la fonction IEEE_SUPPORT_FLAG an de savoir si les autres fonctionnalits le sont. Ces modules dnissent 5 types drivs dont les composantes sont prives et un ensemble de procdures.
Langage Fortran
10 fvrier 2012
205 / 247
Modules intrinsques
Module IEEE_EXCEPTIONS
Il dnit les types : IEEE_FLAG_TYPE permettant didentier un type dexception particulier. Les valeurs possibles sont les constantes symboliques suivantes :
Il dnit les fonctions dinterrogations suivantes : IEEE_SUPPORT_FLAG, IEEE_SUPPORT_HALTING, Il dnit les sous-programmes lmentaires suivants : IEEE_GET_FLAG, IEEE_GET_HALTING_MODE, Il dnit les sous-programmes non lmentaires suivants : IEEE_GET_STATUS, IEEE_SET_FLAG, IEEE_SET_HALTING_MODE, IEEE_SET_STATUS
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 206 / 247
Modules intrinsques
Module IEEE_ARITHMETIC
Il dnit les types :
IEEE_CLASS_TYPE permettant didentier la classe dun rel. Les valeurs possibles
IEEE_SIGNALING_NAN, IEEE_QUIET_NAN, IEEE_NEGATIVE_INF, IEEE_NEGATIVE_NORMAL, IEEE_NEGATIVE_DENORMAL, IEEE_NEGATIVE_ZERO, IEEE_POSITIVE_ZERO, IEEE_POSITIVE_DENORMAL, IEEE_POSITIVE_NORMAL, IEEE_POSITIVE_INF, IEEE_OTHER_VALUE
De plus, il surdnit les oprateurs == et /= pour deux valeurs dun de ces types.
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 207 / 247
Modules intrinsques
Modules intrinsques
Langage Fortran
10 fvrier 2012
209 / 247
Modules intrinsques
Module IEEE_FEATURES
Il dnit les constantes symboliques (du type IEEE_FEATURES_TYPE) associes des fonctionnalits IEEE :
IEEE_DATATYPE, IEEE_DENORMAL, IEEE_DIVIDE, IEEE_HALTING, IEEE_INEXACT_FLAG, IEEE_INF, IEEE_INVALID_FLAG, IEEE_NAN, IEEE_ROUNDING, IEEE_SQRT, IEEE_UNDERFLOW_FLAG
Langage Fortran
10 fvrier 2012
210 / 247
Modules intrinsques
Pour un processeur donn, une partie de ces fonctionnalits peuvent tre naturelles et seront donc mises en uvre en labsence du module IEEE_FEATURES. Pour ce processeur, le fait de coder linstruction use IEEE_FEATURES dans une unit de programme aura pour eet de solliciter dautres fonctionnalits au prix dun surcot. Le programmeur peut demander laccs, laide de la clause ONLY de linstruction use prcdente, une fonctionnalit particulire laquelle peut tre :
naturelle ; gnratrice dun surcot ; non disponible, un message derreur sera alors mis par le compilateur.
Langage Fortran
10 fvrier 2012
211 / 247
Documentations
Documentations
arithmetic ;
http://www-1.ibm.com/support/docview.wss?uid=swg27003923&aid=1
Langage Fortran
10 fvrier 2012
212 / 247
Divers
Environnement systme Tableaux dynamiques Nouveauts concernant les modules Entres-sorties - Partie I Pointeurs Procedures Nouveauts concernant les types drivs Entres-sorties - Partie II Interoprabilit entre entits C et Fortran Arithmtique IEEE et traitement des exceptions
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 213 / 247
10
Divers
11
Divers numration Bloc associate Attribut volatile Longueurs des identicateurs et des instructions Constantes binaires, octales et hexadcimales Nouveauts concernant certaines fonctions intrinsques Messages derreurs Constantes complexes
Langage Fortran
10 fvrier 2012
214 / 247
Divers
numration
numration
Une numration est un ensemble de constantes symboliques appeles numrateurs. Ces numrations facilitent linteroprabilit avec celles du langage C. Cependant on peut les utiliser en dehors de ce contexte.
ENUM, BIND(C) ENUMERATOR [::] liste ... END ENUM
Remarques : aucun nouveau type nest cr selon ce procd ; la prsence de BIND(C) est obligatoire ; la valeur dun numrateur est :
prcdent augment de 1. Exemple enum , bind ( C ) enumerator :: red =4 , blue =9 enumerator yellow end enum
celle indique lors dune ventuelle initialisation ; si aucune initialisation nest fournie, sa valeur est 0 sil est le premier, sinon celle du
Cet exemple permet de dnir un ensemble de constantes symboliques red, blue et yellow qui auront les valeurs 4, 9 et 10 respectivement.
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 215 / 247
Divers
Bloc associate
Bloc associate
La construction associate permet dassocier un nom une variable ou une expression au sein dun bloc.
Exemple ... associate ( z = > exp ( -( x **2+ y **2) ) * cos ( theta ) ) print * , a +z , a - z end associate ... associate ( xc = > ax % b (i , j )% c ) xc % dv = xc % dv + product ( xc % ev (1: n ) ) end associate ... associate ( array = > ax % b (i ,:)% c ) array( n )% ev = array(n -1)% ev end associate ... associate ( w = > result (i , j )% w , zx = > ax % b (i , j )% d , zy = > ay % b (i , j )% d ) w = zx * x + zy * y end associate
Langage Fortran
10 fvrier 2012
216 / 247
Divers
Attribut volatile
Attribut volatile
Ce nouvel attribut indiqu lors de la dclaration dune variable indique au compilateur que celle-ci peut tout moment tre modie en dehors du programme Fortran. Toute rfrence cette variable obligera le compilateur charger son contenu de la mmoire et non dun registre. De ce fait, loptimisation est dsactive lors de lutilisation de telles variables. La raison dtre de cet attribut est dinteroprer avec des bibliothques de traitement parallles telles MPI lesquelles permettent deectuer des transferts de donnes asynchrones dun processeur vers un autre. Dans lexemple qui suit, une demande de transfert de la donne data est eectue en mode asynchrone via lappel mpi_isend, la synchronisation est faite ensuite laide de mpi_wait. Le compilateur peut, des ns doptimisation, dplacer linstruction daectation data = newdata avant la demande de synchronisation, ce qui pourrait avoir pour eet de transfrer la nouvelle valeur de la variable data, le transfert tant asynchrone. Pour viter toute optimisation de ce genre, on prcise lattribut volatile lors de la dclaration de la variable data.
Langage Fortran
10 fvrier 2012
217 / 247
Divers
Attribut volatile
Exemple subroutine transfert ( ... ) use mpi double precision , allocatable , dimension (:) :: newdata double precision , allocatable , dimension (:) , volatile :: data ... call mpi_isend ( data, size (data) , mpi_double_precision , & dest , tag , comm , request , ierr ) ... call mpi_wait ( request , status ) data = newdata ... end subroutine transfert
Langage Fortran
10 fvrier 2012
218 / 247
Divers
La longueur maximum pour un identicateur est passe de 31 63 caractres. En Fortran 90/95 une instruction est limite 40 lignes (20 en format xe). Cette limite passe dornavant 256 lignes quel que soit le format. Une instruction peut donc dsormais admettre 255 lignes suites. La raison de cette augmentation est de pouvoir analyser certains programmes Fortran gnrs de faon automatique.
Langage Fortran
10 fvrier 2012
219 / 247
Divers
Prcdemment, les constantes binaires, octales et hexadcimales (ou boz constants) ne pouvaient apparatre quau sein dinstructions de type DATA. Il est maintenant possible de les spcier lors dun appel aux fonctions intrinsques cmplx, dble, real et int.
Exemple integer :: i , j data i / z " 3 f7 " / j = int ( z " 3 f7 " )
Langage Fortran
10 fvrier 2012
220 / 247
Divers
Langage Fortran
10 fvrier 2012
221 / 247
Divers
Messages derreurs
Messages derreurs
Lors de lutilisation des instructions ALLOCATE ou DEALLOCATE il est possible de personnaliser le traitement derreur en spciant le mot-cl STAT=. Mais linconvnient est que le message produit par laction standard en labsence de ce mot-cl napparat plus. Il est maintenant possible de le rcuprer au moyen dune nouvelle clause (ERRMSG=) que lon peut indiquer au niveau de ces instructions.
Exemple program p use I SO _FORT RA N_ EN V character ( len =256) :: error_message integer :: etat ... allocate ( x ( n ) , STAT = etat , ERRMSG = error_message ) if ( etat > 0 ) then write ( OUTPUT_UNIT , * ) & " Erreur lors de l allocation de X : " , error_message ... end if ... end program p
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 222 / 247
Divers
Constantes complexes
Constantes complexes
On peut crire des constantes complexes laide de constantes symboliques relles ou entires.
Exemple real , parameter :: zero = 0 , one = 1 complex , parameter :: i = ( zero , one )
Langage Fortran
10 fvrier 2012
223 / 247
Annexe A : exercices
12
13
Langage Fortran
10 fvrier 2012
224 / 247
Annexe A : exercices
noncs
Exercice 1
Corrigez lerreur que comporte le programme suivant. Piste celle-ci intervient au moment de la dsallocation : la modication dun mot-cl sut.
program prog implicit none type t real , pointer :: p end type t real , pointer :: pr type ( t ) :: obj allocate ( pr ) pr = 3.14 call sp ( pr ) print * , obj % p call libere contains subroutine sp ( r ) real , target :: r obj % p = > r end subroutine sp subroutine libere integer ierr ! deallocate ( obj %p , stat = ierr ) ! print * , " ierr = " , ierr deallocate ( obj % p ) end subroutine libere end program prog
Langage Fortran
10 fvrier 2012
225 / 247
Annexe A : exercices
noncs
Exercice 2
Compltez le programme suivant qui se propose de copier le chier exo2.data. Son nom ainsi que celui en sortie seront fournis au lancement de lexcutable. Chaque enregistrement du chier en entre est lu par blocs successifs de longueur fournie dans le chier exo2.nml.
program prog use IS O_ FORT RAN _E NV use outils implicit none character ( len =:) , allocatable :: nom_fichier_acopier , no m _ f i c h i er_ co pie character ( len =:) , allocatable :: nom_executable , bloc , buffer integer taille_bloc , in_unit , out_unit , ios namelist / param / taille_bloc ! Rcupration du nom de l excutable puis du nom du fichier copier ainsi que ! celui du fichier crer fournis sur la ligne de commande . Pensez proposer ! un " usage " ! si le nombre des arguments fourni n est pas adquate . in_unit = recup_unit () open ( unit = in_unit , file = " exo2 . nml " , & action = " read " , status = " old " , form = " formatted " ) read ( unit = in_unit , nml = param ); close ( unit = in_unit ) open ( unit = in_unit , file = nom_fichier_acopier , & action = " read " , status = " old " , form = " formatted " ) out_unit = recup_unit () open ( unit = out_unit , file = nom_fichier_copie , & action = " write " , status = " replace " , form = " formatted " ) write ( OUTPUT_UNIT , *) " La lecture s effectuera avec des blocs de " , taille_bloc , " octets . " allocate ( character ( len = taille_bloc ) :: bloc ) do ios = lire_enreg ( ZONE= buffer ) if ( is_iostat_end ( ios ) ) exit write ( unit = out_unit , fmt = " ( a ) " ) trim ( buffer ) end do close ( unit = in_unit ); close ( unit = out_unit ) CONTAINS ! Ecriture de la fonction " lire_enreg " laquelle valorise son argument avec le ! contenu d un en registrement complet . Cette fonction retourne l tat de la lecture . ... ! Ecriture de la procdure " usage " appel lorsque le nombre d arguments sur la ! ligne de commandes est invalide . end program prog
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 226 / 247
Annexe A : exercices
noncs
Exercice 3
Cet exercice propose de calculer les valeurs et/ou vecteurs propres de dirents types de matrices. Pour cela, il sappuie sur le concept de polymorphisme dynamique attach la hierarchie de classes suivantes :
Matrice
matrice_reelle
matrice_cmplx
matrice_reelle_vp
matrice_reelle_sym
matrice_hermitienne
matrice_cmplx_vp
matrice_reelle_sym_vp
matrice_hermitienne_vp
On demande dtendre lapplication tratant les matrices relles en dveloppant la partie du graphe en pointills concernant les matrices complexes.
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 227 / 247
Annexe A : exercices
noncs
Lapplication existante est constitu du programme principal ainsi que de deux modules stocks dans les chiers sources prog_matrice.f90, mat_base.f90 et mat_real.f90 :
Le module mat_base dnit le type abstrait matrice avec ses type_bound procedures dnir lors de la drivation, ainsi que deux procdures :
poly_assign : procdure de surcharge de laectation entre objets polymorphes ; calculs : procdure eectuant le calcul des valeurs et/ou vecteurs propres de lobjet
Lapplication est interface avec la bibliothque lapack95 pour le calcul des valeurs et des vecteurs propres. Les sous-programmes utiliss sont LA_GEEV, LA_SYEV et LA_HEEV (Pour leurs prototypes se reporter lannexe B page 245 ). Pour compiler et excuter cet exercice lancez la commande make.
Langage Fortran
10 fvrier 2012
228 / 247
Annexe A : exercices
noncs
Exercice 4
# include < string .h > # include < stdlib .h > void c_chaine ( char ** chaine ) { * chaine = strdup ( " Wolfgang Amadeus Mozart " ); return ; } void c_chaine_free ( char * chaine ) { free ( chaine ); return ; }
Langage Fortran
10 fvrier 2012
229 / 247
Annexe A : exercices
noncs
Compltez la partie Fortran suivante contenant lappel aux deux fonctions prcdentes : program inter use ISO_C_BINDING , only : C_PTR , C_CHAR , C_NULL_CHAR , C_F_POINTER implicit none interface ! Interface Fortran pour les fonctions ! C : c_chaine et c_chaine_free ... end interface ! Dclaration des variables " ptr " et " chaine " ! utilises ci - dessous ... call c_chaine ( ptr ) chaine = recup_chaine ( ptr ) print * , " Longueur chaine : " , len( chaine ) print * , " chaine : " , chaine contains ! Ecriture de la fonction " recup_chaine ". ! Celle - ci retourne une copie de la chane alloue en C . ! Pensez la desallouer une fois la copie effectue . ... end program inter
Langage Fortran
10 fvrier 2012
230 / 247
Annexe A : exercices
Exercices : corrigs
Corrig de lexercice 1 program prog implicit none type t real , pointer :: p end type t real , pointer :: pr type ( t ) :: obj allocate ( pr ) pr = 3.14 call sp ( pr ) print * , obj % p call libere contains subroutine sp ( r ) ! Il faut indiquer ici l attribut POINTER afin de transmettre le descripteur de ! pointeur lequel indique que la cible est dynamique ( information utilise lors ! de l excution de l instruction deallocate . real , pointer :: r obj % p = > r ! Copie des descripteurs . end subroutine sp subroutine libere integer ierr ! deallocate ( obj %p , stat = ierr ) ! print * , " ierr = " , ierr deallocate ( obj % p ) ! L information est prsente . end subroutine libere end program prog
Langage Fortran
10 fvrier 2012
231 / 247
Annexe A : exercices
Exercices : corrigs
Corrig de lexercice 2
program prog use I S O_F OR TRAN_E NV use outils implicit none character ( len =:) , allocatable :: nom_fichier_acopier , n o m_ f ic h ie r_ cop ie character ( len =:) , allocatable :: nom_executable , bloc , buffer integer taille_bloc , in_unit , out_unit , ios , long namelist / param / taille_bloc ! Rcupration du nom de l excutable . call g e t _ c o m m a n d _ a r g u m e n t ( number =0 , length = long ) allocate ( character ( len = long ) :: nom_ex ecutable ) call g e t _ c o m m a n d _ a r g u m e n t ( number =0 , value= nom_e xecutable ) if ( c o m m a n d _ a r g u m e n t _ c o u n t () /= 2 ) call usage ! Rcupration du nom du fichier copier . call g e t _ c o m m a n d _ a r g u m e n t ( number =1 , length = long ) allocate ( character ( len = long ) :: n o m _ f i c h i e r _ a c o p i e r ) call g e t _ c o m m a n d _ a r g u m e n t ( number =1 , value= n o m _ f i c h i e r _ a c o p i e r ) ! Rcupration du nom du fichier de sortie . call g e t _ c o m m a n d _ a r g u m e n t ( number =2 , length = long ) allocate ( character ( len = long ) :: n o m _ f ic h ie r _c o p i e ) call g e t _ c o m m a n d _ a r g u m e n t ( number =2 , value= n om _f i ch i e r _ c o p ie )
Langage Fortran
10 fvrier 2012
232 / 247
Annexe A : exercices
Exercices : corrigs
Corrig de lexercice 2 (suite) in_unit = recup_unit () open ( unit = in_unit , file = " exo2 . nml " , & action = " read " , status = " old " , form = " formatted " ) read ( unit = in_unit , nml = param ) close ( unit = in_unit ) open ( unit = in_unit , action = " read " , file = nom_fichier_acopier , & status = " old " , form = " formatted " )
out_unit = recup_unit () open ( unit = out_unit , file = nom_fichier_copie , & action = " write " , status = " replace " , form = " formatted " ) write ( OUTPUT_UNIT , * ) " La lecture s effectuera avec des blocs de " , & taille_bloc , " octets . " allocate ( character ( len = taille_bloc ) :: bloc ) do ios = lire_enreg ( ZONE= buffer ) if ( is_iostat_end ( ios ) ) exit write ( unit = out_unit , fmt = " ( a ) " ) trim ( buffer ) end do close ( unit = in_unit ) close ( unit = out_unit ) CONTAINS
Langage Fortran
10 fvrier 2012
233 / 247
Annexe A : exercices
Exercices : corrigs
Corrig de lexercice 2 (suite) function lire_enreg ( zone ) result ( ios ) character ( len =:) , allocatable :: zone character ( len =:) , allocatable :: zone_etendue integer :: ios integer :: nb_blocs , nb_car ! On reste positionn dans l en regi strem ent pour ! pouvoir lire le bloc suivant s il existe . read ( unit = in_unit , fmt = " ( a ) " , advance = " no " , iostat = ios ) bloc if ( is_iostat_end ( ios ) ) return ! Si fin de fichier zone = bloc if ( . not . is_iostat_eor ( ios ) ) then ! Si la fin d enregistrement n est pas atteinte nb_blocs = 2 do ! On tend la zone d un bloc allocate ( character ( len = nb_blocs * taille_bloc ) :: zone_etendue ) nb_car = len ( zone ) zone_etendue (1: nb_car ) = zone call MOVE_ALLOC ( TO = zone , FROM = zone_etendue ) read ( unit = in_unit , fmt = " ( a ) " , advance = " no " , iostat = ios ) zone ( nb_car +1:) if ( is_iostat_eor ( ios ) ) exit ! Si fin d en regi strem ent nb_blocs = nb_blocs + 1 end do end if end function lire_enreg subroutine usage write ( ERROR_UNIT , " (3 a ) " ) " Usage : " , nom_executable , " fichier1 fichier2 " stop 4 end subroutine usage end program prog
Langage Fortran
10 fvrier 2012
234 / 247
Annexe A : exercices
Exercices : corrigs
Corrig de lexercice 3 module mat_cmplx use mat_base use imp implicit none type , extends ( matrice ) :: matrice_cmplx private complex ( kind = WP ) , dimension (: ,:) , allocatable :: mat complex ( kind = WP ) , dimension (:) , allocatable :: valp contains procedure , N ON_ OVER RI D AB LE :: get_ordre = > ge t_ o rd re_ cmpl x procedure :: propres = > propres_cmplx procedure :: sorties = > sorties_cmplx end type matrice_cmplx type , extends ( matrice_cmplx ) :: m a tr i ce _ c m p l x_ v ec p private complex ( kind = WP ) , dimension (: ,:) , allocatable :: vecp contains procedure :: propres = > p r op r e s _ c m p l x _v e c p procedure :: sorties = > s o rt i e s _ c m p l x _v e c p end type m a t r i ce _ cm p l x _ v e c p type , extends ( matrice_cmplx ) :: m a t r i c e _ h e r m i t i e n n e private contains procedure :: propres = > p r o p r e s _ h e r m i t i e n n e end type m a t r i c e _ h e r m i t i e n n e
Langage Fortran
10 fvrier 2012
235 / 247
Annexe A : exercices
Exercices : corrigs
type , extends ( m a t ri c e _ h e r m i t i e n n e ) :: m a t r i c e _ h e r m i t i e n n e _ v e c p private complex ( kind = WP ) , dimension (: ,:) , allocatable :: vecp contains procedure :: propres = > p r o p r e s _ h e r m i t i e n n e _ v e c p procedure :: sorties = > s o r t i e s _ h e r m i t i e n n e _ v e c p end type m a t r i c e _ h e r m i t i e n n e _ v e c p interface matrice_cmplx module procedure matrice_cmplx end interface matrice_cmplx interface m a tr i c e_ c m p l x _ v e cp module procedure m a t r i c e _ c m p l x_ v e c p end interface m a t ri c e _c m p l x _ v e c p interface m a t r i c e _ h e r m i t i e n n e module procedure m a t r i c e _ h e r m i t i e n n e end interface m a t r i c e _ h e r m i t i e n n e interface m a t r i c e _ h e r m i t i e n n e _ v e c p module procedure m a t r i c e _ h e r m i t i e n n e _ v e c p end interface m a t r i c e _ h e r m i t i e n n e _ v e c p
Langage Fortran
10 fvrier 2012
236 / 247
Annexe A : exercices
Exercices : corrigs
Corrig de lexercice 3 (suite) contains function matrice_cmplx ( fichier ) character ( len =*) , intent ( in ) :: fichier type ( matrice_cmplx ) :: matrice_cmplx integer n , i , j associate ( t = > matrice_cmplx ) open ( unit =1 , file = fichier , action = " read " , form = " formatted " , access = " sequential " ) read ( unit =1 , fmt = " (a , / , i4 ) " ) type_matrice , n t % type = type_matrice allocate ( t % mat ( n , n ) , t % valp ( n ) ) read ( unit =1 , fmt =* ) (( t % mat (i , j ) , j =1 , n ) , i =1 , n ) close ( unit =1 ) t % objet_complet = . false . end associate end function matrice_cmplx function m a t r i ce _ c mp l x _ v e c p ( fichier ) character ( len =*) , intent ( in ) :: fichier type ( m a t r i ce _ c m p l x _ v e cp ) :: m a t r i c e _c m p l x _ ve c p integer n m a t r i ce _ cm p l x_ v ec p % matrice_cmplx = matrice_cmplx ( fichier ) n = m a t r i ce _ cm p l x _ v e c p %get_ordre() allocate ( m a t ri c e _ c mp l x _v e c p % vecp (n , n ) ) end function m a tr i c e _ c m p l x _ v e cp function m a t r i c e _ h e r m i t i e n n e ( fichier ) character ( len =*) , intent ( in ) :: fichier type ( m a t r i c e _ h e r m i t i e n n e ) :: m a t r i c e _ h e r m i t i e n n e m a t r i c e _ h e r m i t i e n n e % matrice_cmplx = matrice_cmplx ( fichier ) end function m a t r i c e _ h e r m i t i e n n e
Langage Fortran
10 fvrier 2012
237 / 247
Annexe A : exercices
Exercices : corrigs
Corrig de lexercice 3 (suite) function m a t r i c e _ h e r m i t i e n n e _ v e c p ( fichier ) character ( len =*) , intent ( in ) :: fichier type ( m a t r i c e _ h e r m i t i e n n e _ v e c p ) :: m a t r i c e _ h e r m i t i e n n e _ v e c p integer n m a t r i c e _ h e r m i t i e n n e _ v e c p % m a t r i c e _ h e r m i t i e n n e = m a t r i c e _ h e r m i t i e n n e ( fichier ) n = m a t r i c e _ h e r m i t i e n n e _ v e c p % get \ _ordre () allocate ( m a t r i c e _ h e r m i t i e n n e _ v e c p % vecp (n , n ) ) end function m a t r i c e _ h e r m i t i e n n e _ v e c p function g et _ordre_ cm p lx ( this ) class ( matrice_cmplx ) , intent ( in ) :: this integer g et_ ordre_cmp lx get_ or dre_ cmplx = size ( this % mat , 1 ) end function g et_ordr e_ c mp lx subroutine propres_cmplx ( this ) class ( matrice_cmplx ) , intent ( inout ) :: this call la_geev ( this % mat , this % valp ) this % objet_complet = . true . end subroutine propres_cmplx subroutine p r o pr e s _ c m p l x _ ve c p ( this ) class ( m a t r i c e _ cm p l x_ v e c p ) , intent ( inout ) :: this call la_geev ( this % mat , this % valp , VR= this % vecp ) this % objet_complet = . true . end subroutine p r o p r e s _ cm p lx _ v e c p
Langage Fortran
10 fvrier 2012
238 / 247
Annexe A : exercices
Exercices : corrigs
Corrig de lexercice 3 (suite) subroutine p r o p r e s _ h e r m i t i e n n e ( this ) class ( m a t r i c e _ h e r m i t i e n n e ) , intent ( inout ) :: this REAL ( WP ) , DIMENSION (:) , ALLOCATABLE :: W integer n n = this %get_ordre() allocate ( W ( n ) ) call la_heev ( this % mat , w ) this % valp (:) = W (:) deallocate ( W ) this % objet_complet = . true . end subroutine p r o p r e s _ h e r m i t i e n n e subroutine p r o p r e s _ h e r m i t i e n n e _ v e c p ( this ) class ( m a t r i c e _ h e r m i t i e n n e _ v e c p ) , intent ( inout ) :: this REAL ( WP ) , DIMENSION (:) , ALLOCATABLE :: W integer n n = this %get_ordre() allocate ( W ( n ) ) call la_heev ( this % mat , w , JOBZ= V ) this % valp (:) = W (:) this % vecp (: ,:) = this % mat (: ,:) deallocate ( W ) this % objet_complet = . true . end subroutine p r o p r e s _ h e r m i t i e n n e _ v e c p
Langage Fortran
10 fvrier 2012
239 / 247
Annexe A : exercices
Exercices : corrigs
Corrig de lexercice 3 (suite) subroutine sorties_cmplx ( this ) class ( matrice_cmplx ) , intent ( in ) :: this if ( . not . this % objet_complet ) then call sortie ( libelle= this % type , tableau = this % mat ) else call sortie ( libelle= " Valeurs propres " , tableau= this % valp ) end if end subroutine sorties_cmplx subroutine so r ti e s _ c m p l x _ ve c p ( this ) class ( m at r i ce _ c m p l x _ v ec p ) , intent ( in ) :: this call this % matrice_cmplx %sorties if ( this % objet_complet ) & call sortie ( libelle= " Vecteurs propres " , tableau= this % vecp ) end subroutine s or t i e s _ c m p l x _ v e c p subroutine s o r t i e s _ h e r m i t i e n n e _ v e c p ( this ) class ( m a t r i c e _ h e r m i t i e n n e _ v e c p ) , intent ( in ) :: this call this % m a t r i c e _ h e r m i t i e n n e %sorties if ( this % objet_complet ) & call sortie ( libelle= " Vecteurs propres " , tableau= this % vecp ) end subroutine s o r t i e s _ h e r m i t i e n n e _ v e c p end module mat_cmplx
Langage Fortran
10 fvrier 2012
240 / 247
Annexe A : exercices
Exercices : corrigs
Corrig de lexercice 4
program inter use ISO_C_BINDING , only : C_PTR , C_CHAR , C_NULL_CHAR , C_F_POINTER implicit none interface subroutine C_chaine ( p ) bind ( C ) import C_PTR type ( C_PTR ) :: p ! Par rfrence end subroutine C_chaine subroutine C_chaine_free ( p ) bind ( C ) import C_PTR type ( C_PTR ) , value :: p ! Par valeur end subroutine C_chaine_free end interface type ( C_PTR ) :: ptr character ( len =: , kind = C_CHAR ) , allocatable :: chaine ! Le pointeur C ptr doit tre pass par rfrence , ! car c est la fonction c_chaine qui le valorise . call c_chaine ( ptr ) chaine = recup_chaine ( ptr ) print * , " Longueur chaine : " , len( chaine ) print * , " chaine : " , chaine contains
Langage Fortran
10 fvrier 2012
241 / 247
Annexe A : exercices
Exercices : corrigs
function recup_chaine ( ptr ) type ( C_PTR ) :: ptr character ( len =: , kind = C_CHAR ) , allocatable :: recup_chaine character ( len =: , kind = C_CHAR ) , pointer :: chaine integer i , ierr ! Conversion du pointeur C ptr en un pointeur Fortran chaine . call C_F_POINTER ( CPTR = ptr , FPTR = chaine ) ! Recherche du caractre \0 fin de chane C i = 1 do while ( chaine ( i : i ) /= C_NULL_CHAR ) i = i + 1 end do recup_chaine = chaine (1: i -1) call c_chaine_free ( ptr ) end function recup_chaine end program inter
Langage Fortran
10 fvrier 2012
242 / 247
Annexe B
12
13
Langage Fortran
10 fvrier 2012
243 / 247
Annexe B
Prototype LA_GEEV
Prototype LA_GEEV
SUBROUTINE LA_GEEV ( A , <w > , VL = vl , VR = vr , INFO = info ) < type >( < wp >) , INTENT ( INOUT ) :: A (: ,:) < type >( < wp >) , INTENT ( OUT ) :: <w (:) > < type >( < wp >) , INTENT ( OUT ) , OPTIONAL :: VL (: ,:) , VR (: ,:) INTEGER , INTENT ( OUT ) , OPTIONAL :: INFO o < type > ::= REAL | COMPLEX <wp > ::= KIND (1.0) | KIND (1.0 D0 ) <w > ::= WR , WI | W <w (:) > ::= WR (:) , WI (:) | W (:)
( entre / sortie ) matrice carre relle ou complexe dont on dsire les valeurs et / ou vecteur propres . En sortie son contenu est dtruit . ( sortie ) vecteur ( s ) rels ou complexe dans lesquels seront stockes les valeurs propres . Dans le cas rel , on prcise deux vecteurs WR et WI dans lesquels seront stockes respectivem ent les parties relles et imaginaires des valeurs propres . Une valeur propre et sa conjugue sont stockes de faon conscutive , celle ayant la partie imaginaire positive avant l autre . Dans le cas complexe , un seul vecteur W de type complexe est ncessaire , lequel est valoris l aide des valeurs propres .
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 244 / 247
<w >
Annexe B
Prototype LA_GEEV
INFO
Langage Fortran
10 fvrier 2012
245 / 247
Annexe B
Prototype LA_SYEV/LA_HEEV
Prototype LA_SYEV/LA_HEEV
SUBROUTINE LA_SYEV / LA_HEEV ( A , W , JOBZ , UPLO , INFO ) < type >( < wp >) , INTENT ( INOUT ) :: A (: ,:) REAL ( < wp >) , INTENT ( OUT ) :: W (:) CHARACTER ( LEN =1) , INTENT ( IN ) , OPTIONAL :: JOBZ , UPLO INTEGER , INTENT ( OUT ) , OPTIONAL :: INFO o < type > ::= REAL | COMPLEX <wp > ::= KIND (1.0) | KIND (1.0 D0 )
( entre / sortie ) matrice carre relle ou complexe dont on dsire les valeurs et / ou vecteur propres . En entre seul la partie triangulaire suprieure ( UPLO = " U " ) ou infrieure ( UPLO = " L " ) est considre . En sortie : - si JOBZ = " V " et INFO = 0 , A contient les vecteurs propres orthogonaux , - si JOBZ = " N " , la partie de A considre est dtruite . ( sortie ) vecteur rel . Si INFO = 0 , il contient les valeurs propres stockes en ordre croissant ,
Langage Fortran
10 fvrier 2012
246 / 247
Annexe B
Prototype LA_SYEV/LA_HEEV
JOBZ
( entre / optionnel ) type CHARACTER ( len =1) = " N " : seules les valeurs propres sont calcules , = " V " : calcul des valeurs et vecteurs propres . Si JOBZ est absent , JOBZ = " N " est pris par dfaut , ( entre / optionnel ) type CHARACTER ( len =1) = " U " : seule la partie triangulaire suprieure de la matrice A est analyse , = " L " : seule la partie triangulaire infrieure de la matrice A est analyse , Si UPLO est absent , UPLO = " U " est pris par dfaut , ( sortie ) entier refltant l tat du traitement : = 0 : avec succs , < 0 : si INFO = -i , le ime argument une valeur invalide , > 0 : si INFO = i , l algorithme utilis diverge . Si cet argument est absent et qu une erreur se produit , le programme s arrte avec un message d erreur .
UPLO
INFO
Langage Fortran
10 fvrier 2012
247 / 247
Annexe B
Prototype LA_SYEV/LA_HEEV
Symboles
numrateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 numration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .217 dtio-generic-pec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 generic binding type driv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 operator binding type driv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 override type bound procedure (generic binding) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105, 107 type bound procedure (specic binding) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 type bound procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 type-bound procedure specic binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 type-bound procedure : : generic binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 type-bound procedure : : operator binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 type-bound procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .89 unlimited polymorphic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
A
ABSTRACT INTERFACE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55, 89 abstract interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 adresse cible C_LOC(X) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 aectation et allocation automatique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19, 21 ALLOCATABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 argument de procdure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 composante type driv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 scalaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 allocatable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 allocation via aectation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 arguments ligne de commande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 arrondi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 247 / 247
Annexe B
Prototype LA_SYEV/LA_HEEV
associate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 association pointeur de procdure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 asynchrones - E./S. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35, 37 ASYNCHRONOUS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35, 37 attribut EXTERNAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
B
BIND(C) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147, 149, 153, 173, 177 bloc interface IMPORT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 bound procedure (generic binding) surcharge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105, 107 bound procedure (specic binding) surcharge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 BOZ Constante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
C
C_ALERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 C_ASSOCIATED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 C_BACKSPACE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 C_BOOL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 C_CARRIAGE_RETURN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 C_CHAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 C_DOUBLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 C_F_PROCPOINTER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 C_FLOAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 C_FLOAT_COMPLEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 C_FORM_FEED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 C_FUNLOC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 C_FUNPTR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .149, 153 C_HORIZONTAL_TAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 C_INT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 C_LOC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151, 153, 173 Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 247 / 247
Annexe B
Prototype LA_SYEV/LA_HEEV
C_LONG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 C_NEW_LINE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 C_NULL_CHAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 C_PTR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149, 151, 153, 173, 177 C_SHORT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 C_VERTICAL_TAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 calloc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175, 177 CHARACTER interoprabilit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 CLASS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 CLASS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 Clause ERRMSG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 COMMAND_ARGUMENT_COUNT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 common interoprabilit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 Constante BOZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 Constantes complexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 constantes denvironnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 constructeur de type driv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57, 59, 61
D
dnormalise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 declared type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 descripteur de format DT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 destructeur type driv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97, 99, 101 division par zro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 DT descripteur format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 dynamic type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
E
Entres-Sorties mode stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Entres/sorties asynchrones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 247 / 247
Annexe B
Prototype LA_SYEV/LA_HEEV
ENUM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 enum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 ENUMERATOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 environnement constantes d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 ERROR_UNIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 EXTENDS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 EXTENDS_TYPE_OF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 extension dun type drive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .69 extension dun type drive paramtr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
F
FINAL procdure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97, 99, 101 nal subroutine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 fonction C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .175, 177
G
GENERIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 GENERIC : : ASSIGNMENT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 GENERIC : : OPERATOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 generic binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 GET_COMMAND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 GET_COMMAND_ARGUMENT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 GET_ENVIRONMENT_VARIABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
H
hritage procdure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
I
ID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 IEEE_ALL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199, 203, 205 IEEE_ARITHMETIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 247 / 247
Annexe B
Prototype LA_SYEV/LA_HEEV
IEEE_CLASS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 IEEE_CLASS_TYPE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 IEEE_DIVIDE_BY_ZERO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199, 203 IEEE_EXCEPTIONS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 IEEE_FEATURES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 IEEE_GET_FLAG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201, 203 IEEE_GET_HALTING_MODE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 IEEE_GET_ROUNDING_MODE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 IEEE_GET_STATUS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 IEEE_GET_UNDERFLOW_MODE(gradual) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 IEEE_INEXACT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199, 201 IEEE_INVALID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 IEEE_IS_FINITE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 IEEE_IS_NAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 IEEE_IS_NEGATIVE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 IEEE_IS_NORMAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 IEEE_NEGATIVE_DENORMAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195, 197 IEEE_NEGATIVE_INF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195, 197 IEEE_NEGATIVE_NORMAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195, 197 IEEE_NEGATIVE_ZERO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195, 197 IEEE_OTHER_VALUE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 IEEE_OVERFLOW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 IEEE_POSITIVE_DENORMAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195, 197 IEEE_POSITIVE_INF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195, 197 IEEE_POSITIVE_NORMAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195, 197 IEEE_POSITIVE_ZERO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195, 197 IEEE_QUIET_NAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 IEEE_ROUND_VALUE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .197 IEEE_SET_FLAG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 IEEE_SET_HALTING_MODE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 IEEE_SET_ROUNDING_MODE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 IEEE_SET_STATUS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 IEEE_SET_UNDERFLOW_MODE(gradual) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 IEEE_SIGNALING_NAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 IEEE_STATUS_TYPE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 247 / 247
Annexe B
Prototype LA_SYEV/LA_HEEV
IEEE_SUPPORT_DATATYPE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195, 197 IEEE_SUPPORT_DENORMAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .195 IEEE_SUPPORT_INF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .195 IEEE_SUPPORT_NAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 IEEE_SUPPORT_STANDARD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 IEEE_UNDERFLOW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 IEEE_UP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 IEEE_USUAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 IEEE_VALUE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195, 197 IMPORT bloc interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 INPUT_UNIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 instruction PROCEDURE interface explicite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 interface implicite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 INTENT pointeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Interface procdure Fortran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 interoprabilit Fortran-C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 interoprabilit Fortran/C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 IOMSG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 IOSTAT_END . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 IOSTAT_EOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .31 is_iostat_end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 ISO_C_BINDING . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141, 149, 151 ISO_FORTRAN_ENV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
K
KIND paramtre type driv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .65, 67 kind type parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
L
LA_GEEV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 247 / 247
Annexe B
Prototype LA_SYEV/LA_HEEV
LA_HEEV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 LA_SYEV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 LEN paramtre type driv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .65, 67 length type parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 ligne de commande arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Longueur identicateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 Longueur intructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
M
module importation dentits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 protection dentits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 renommage doprateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 MOVE_ALLOC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21, 23
N
NAME= . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 NaN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 NON_OVERRIDABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .109 Nouveauts fonctions intrinsques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
O
oprateur renommage via USE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 OUTPUT_UNIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 overow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
P
paramtres dun type driv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 PASS, NOPASS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 POINTER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 247 / 247
Annexe B
Prototype LA_SYEV/LA_HEEV
pointeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 interoprabilit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 procdure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 reprolage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 vocation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 pointeur C valeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 pointeur de procdure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51, 53, 55, 153 association . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 interface implicite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 pointeur polymorphique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 polymorphisme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 POS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 PRIVATE type driv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 procdure pointeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51, 53, 55, 87, 153 PROCEDURE attribut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53, 55 PROCEDURE() - attribut pointeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 PROTECTED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 PUBLIC type driv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
R
rallocation et aectation automatique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 rallocation via aectation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 reprolage et association . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
S
SAME_TYPE_AS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83, 85 scalaire ALLOCATABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 SELECT TYPE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79, 85 Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 247 / 247
Annexe B
Prototype LA_SYEV/LA_HEEV
select type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 standard IEEE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 struct . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 structure interoprabilit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173, 177 structure C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 surcharge type bound procedure (generic binding) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105, 107 type bound procedure (specic binding) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
T
tableau dynamique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15 tableaux interoprabilit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 toward + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 toward . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 toward nearest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 toward zero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 traitement des interruptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 traitement exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 type driv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 generic binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 composante ALLOCATABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 constructeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57, 59 destructeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97, 99, 101 E./S. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 GENERIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 paramtre KIND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65, 67 paramtre LEN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65, 67 paramtres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 PRIVATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 PUBLIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 surcharge constructeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 247 / 247
Annexe B
Prototype LA_SYEV/LA_HEEV
visibilit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 type driv : operator binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 type drive extension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 type drive tendu constructeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 type drive paramtr constructeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 extension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 type-bound procedure section . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 typedef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
U
underow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191, 193
V
valeurs spciales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 VALUE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173, 177 attribut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 variable polymorphique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .73 ALLOCATABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77, 79 ALLOCATE avec mot-cl SOURCE= . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 argument muet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 POINTER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 visibilit type driv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 volatile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
W
WAIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Langage Fortran
10 fvrier 2012
247 / 247