Sie sind auf Seite 1von 129

Langage Fortran

Patrick Corde Herv Delouis


Patrick.Corde@idris.fr

10 fvrier 2012

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

1 / 247

Table des matires I


1

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

Table des matires II


Interface implicite Interface explicite

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

Extension dun type driv


Type driv non paramtr Constructeur dun type driv tendu Type driv paramtr

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

Patrick Corde Herv Delouis

Table des matires III


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 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

Pointeur de fonction/pointeur de procdure : le type C_FUNPTR


10

Arithmtique IEEE et traitement des exceptions Standard IEEE-754


Valeurs spciales
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 4 / 247

Table des matires IV


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 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

Patrick Corde Herv Delouis

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

6 / 247

Environnement systme

11

Divers

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

7 / 247

Environnement systme

Procdures daccs lenvironnement

Meilleure intgration lenvironnement systme


Il est dsormais possible daccder de faon portable aux arguments de la ligne de commande et aux variables denvironnement laides de procdures. GET_COMMAND( [command] [,length] [,status] )
command est une chane de caractres dans laquelle sera stock le nom de la

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

Procdures daccs lenvironnement

GET_COMMAND_ARGUMENT( number [,value] [,length] [,status] )


number est un entier qui est fourni en entre. Il indique le numro de largument

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

Procdures daccs lenvironnement

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.

length est un entier qui sera valoris la longueur de la valeur de la variable

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

retourne avec succs, 0 sera la valeur retourne ;


si la variable denvironnement existe et admet un contenu dont la taille est suprieure

celle de la chane de caractres fournie via le paramtre value, -1 sera retourne ;


ce code de retour est valoris 1 si la variable denvironnement nexiste pas et 2 si il

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

Procdures daccs lenvironnement

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

Patrick Corde Herv Delouis

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

12 / 247

Tableaux dynamiques

Interoprabilit entre entits C et Fortran Arithmtique IEEE et traitement des exceptions Divers

10

11

Patrick Corde Herv Delouis

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, ...

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

14 / 247

Tableaux dynamiques

Passage en argument de procdure

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

vec_y ((/ -2 , 100 /))

v_x , v_y random_number ( v_y ) ubound ( v_y )

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

Composante allouable dun type driv

Composante allouable dun type driv


Lattribut ALLOCATABLE est dsormais autoris au niveau dune composante dun type driv. En Fortran-95, seul lattribut POINTER permettait de grer des composantes dynamiques.
Exemple
program alloca type obj_mat integer :: N , M real , dimension (: ,:) , ALLOCATABLE :: A end type obj_mat type ( obj_mat ) :: mat read * , mat %N , mat % M allocate ( mat % A ( mat %N , mat % M ) ); call random_number ( mat % A ) print * , mat % A ( (/ 1 , mat % N /) , (/ 1 , mat % M /) ) deallocate ( mat % A ) end program alloca

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

Allocation dun scalaire ALLOCATABLE

Allocation dun scalaire ALLOCATABLE


Lattribut ALLOCATABLE peut dornavant sappliquer un scalaire, notamment une chane de caractres.
Exemple
module m implicit none contains function strdup ( ch_in ) character ( len =*) :: ch_in character ( len =:) , ALLOCATABLE :: strdup allocate ( character ( len = len_trim ( ch_in )) :: strdup ) strdup = trim ( ch_in ) end function strdup end module m program alloca_char use m implicit none character ( len =256) :: ch_in character ( len =:) , ALLOCATABLE :: ch_out read ( * , " ( A ) " ) ch_in ; ch_out = strdup ( ch_in ) print " ( i0 ,1 x , a ) " , len ( ch_out ) , ch_out deallocate ( ch_out ) end program alloca_char

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

Allocation/rallocation via laectation

Allocation/rallocation via laectation


Une allocation/rallocation dune entit var_alloc (scalaire ou tableau ayant lattribut ALLOCATABLE) peut se faire implicitement lors dune opration daectation du type : var_alloc = expression
1

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.

Voici un exemple permettant le traitement dune chane de caractres de longueur variable :


character (:) , ALLOCATABLE :: NAME . . . . NAME = " Beethoven " ; ...; NAME = " Ludwig - Van Beethoven "

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

Allocation/rallocation via laectation

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

explicitement tout ou partie de lobjet :


NAME(:) = " chaine_de_car " // " acteres " x (1: count ( masque )) = pack ( tableau , masque )

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

19 / 247

Tableaux dynamiques

Procdure MOVE_ALLOC de rallocation

Procdure MOVE_ALLOC de rallocation


MOVE_ALLOC(FROM, TO) Ce sous-programme permet de transfrer une allocation dun objet allouable un autre.
FROM fait rfrence une entit allouable de nimporte quel type/rang. Sa vocation

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

Procdure MOVE_ALLOC de rallocation

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

Fig. 1: Schma correspond au move_alloc prcdent


Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 21 / 247

Tableaux dynamiques

Procdure MOVE_ALLOC de rallocation

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 (:) )

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

22 / 247

Nouveauts concernant les modules

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

Nouveauts concernant les modules

11

Divers

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

24 / 247

Nouveauts concernant les modules

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

ceux qui limportent (USE) ;


les sous-objets ventuels dun objet protg reoivent lattribut PROTECTED ; pour un pointeur, cest lassociation et non la cible qui est protge.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

25 / 247

Nouveauts concernant les modules

Linstruction IMPORT du bloc interface

Linstruction IMPORT du bloc interface


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 :
Exemple module truc type couleur character ( len =16) :: nom real , dimension (3) :: compos end type couleur interface function demi_teinte ( col_in ) IMPORT :: couleur ! Importation du type couleur type ( couleur ) , intent ( in ) :: col_in type ( couleur ) :: demi_teinte end function demi_teinte end interface contains ... end module truc

IMPORT sans liste permet limportation de toutes les entits vues par host association.
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 26 / 247

Nouveauts concernant les modules

USE et renommage doprateurs

USE et renommage doprateurs

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 .)

Patrick Corde Herv Delouis

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

28 / 247

Entres-sorties - Partie I

10

Arithmtique IEEE et traitement des exceptions Divers

11

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

29 / 247

Entres-sorties - Partie I

Constantes denvironnement pour les entres_sorties

Constantes denvironnement pour les entres_sorties

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

30 / 247

Entres-sorties - Partie I

Nouveaux paramtres des instructions OPEN/READ/WRITE

Nouveaux paramtres des instructions OPEN/READ/WRITE


IOMSG : ce paramtre des instructions READ/WRITE identie une chane de caractres

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

Nouveaux paramtres des instructions OPEN/READ/WRITE

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

Patrick Corde Herv Delouis

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.

Patrick Corde Herv Delouis

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

:: :: :: :: ::

message etat i , ident a, b, c tab

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

34 / 247

Entres-sorties - Partie I

Entres-sorties asynchrones

Toute entit faisant lobjet dentres-sorties asynchrones rcupre automatiquement

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

35 / 247

Entres-sorties - Partie I

Entres-sorties en mode stream

Entres-sorties en mode stream

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

linstruction INQUIRE permet de la connatre.


Le paramtre POS (expression entire) des instructions READ/WRITE indique la

position dans le chier partir de laquelle seectuera lentre-sortie.


Cette nouvelle mthode daccs facilite notamment lchange de chiers binaires

entre Fortran et C.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

36 / 247

Entres-sorties - Partie I

Entres-sorties en mode stream

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

37 / 247

Entres-sorties - Partie I

Entres-sorties en mode stream

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

Contenu suppos du chier data :


Wolfgang Amadeus Mozart Ludwig - Van Beethoven Gustav Mahler

Ce programme produit la sortie suivante :


Wolfgang Amadeus Mozart Ludwig - Van Beethoven " stream . f90 " , line 10: 1525 -001 The READ statement on the file data cannot be completed because the end of the file was reached . The program will stop .
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 38 / 247

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

40 / 247

Pointeurs

Vocation (INTENT) des arguments muets pointeurs

Vocation (INTENT) des arguments muets pointeurs


Contrairement Fortran 95, il est possible de dnir la vocation (attribut INTENT) des arguments muets pointeurs au sein dune procdure. Cest lassociation qui est concerne et non la cible. INTENT(IN) : le pointeur ne pourra ni tre associ, ni mis ltat nul, ni allou au sein de la procdure ; INTENT(OUT) : le pointeur est forc ltat indni lentre de la procdure ; INTENT(INOUT) : le pointeur peut la fois transmettre une association prtablie et retourner une nouvelle association. Exemple
module m use I S O_F OR TRAN_E NV implicit none type vecteur integer n real , dimension (:) , allocatable :: v end type vecteur contains subroutine copy ( v2 , v1 ) type ( vecteur ) , POINTER , INTENT ( INOUT ) :: v2 type ( vecteur ) , POINTER , INTENT ( IN ) :: v1 if ( associated ( v2 ) . AND . associated ( v1 , v2 ) ) return if ( . not . associated ( v2 ) ) allocate ( v2 ) v2 = v1 print * , lbound ( v2 % v ) , ubound ( v2 % v ) ! lbound ( v1 % v ) , ubound ( v1 % v ) end subroutine copy end module m

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

41 / 247

Pointeurs

Vocation (INTENT) des arguments muets 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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

42 / 247

Pointeurs

Association et reprolage

Association et reprolage

Lors de lassociation dun pointeur une cible il est dornavant possible :


dindiquer un nouveau prol au niveau du pointeur tout en respectant le rang de la

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

Patrick Corde Herv Delouis

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

45 / 247

Procedures

10

Arithmtique IEEE et traitement des exceptions Divers

11

Patrick Corde Herv Delouis

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.

Patrick Corde Herv Delouis

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

procdure pour des dclarations ultrieures,


la dclaration de largument muet f au sein de la fonction integrale est eectue au

moyen de linstruction PROCEDURE laquelle on a indiqu le nom du modle ci-dessus permettant ainsi de abiliser lappel f eectu plus loin.

Patrick Corde Herv Delouis

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.

Patrick Corde Herv Delouis

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

Patrick Corde Herv Delouis

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 )

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

53 / 247

Nouveauts concernant les types drivs

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

Extension dun type driv


Type driv non paramtr Constructeur dun type driv tendu Type driv paramtr

Variable polymorphique
Dnition
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 54 / 247

Nouveauts concernant les types drivs

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

55 / 247

Nouveauts concernant les types drivs

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 ] ) ...

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

56 / 247

Nouveauts concernant les types drivs

Constructeurs de structures

Remarques
Si une composante dun type driv une valeur par dfaut, largument

correspondant au niveau du constructeur se comporte comme un argument optionnel,


Lors de lappel au constructeur intrinsque, le type ainsi que chaque composante

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".

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

57 / 247

Nouveauts concernant les types drivs

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

Nouveauts concernant les types drivs

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

59 / 247

Nouveauts concernant les types drivs

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

constructeur intrinsque complex_to_mycomplex two_reals_to_mycomplex a %theta b %theta c %theta

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

60 / 247

Nouveauts concernant les types drivs

Visibilit des composantes

Visibilit des composantes


En Fortran 95, un type driv pouvait seulement tre public, priv ou semi-priv :
Exemple ! ------ type publique - -----type st r uct_pub li qu e integer :: i , j real , dimension (160) :: tab end type st ru ct _p u bl iq ue ! - - -- - - - - type priv - - - - - - - - type , private :: struct_privee integer :: i , j real , dimension (160) :: tab end type struct_privee ! ----- type semi - priv -----type s t r u c t _ s e m i _ p r i v e e private integer :: i , j real , dimension (160) :: tab end type s t ru c t _ s e m i_ p r i v e e

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

61 / 247

Nouveauts concernant les types drivs

Visibilit des composantes

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

62 / 247

Nouveauts concernant les types drivs

Visibilit des composantes

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

Nouveauts concernant les types drivs

Paramtres dun type driv

Paramtres dun type driv

En Fortran 95, les types intrinsques taient dj paramtrables ; en particulier le type


CHARACTER(LEN= , KIND= ) a deux paramtres valeur entire pour spcier le nombre de

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

64 / 247

Nouveauts concernant les types drivs

Paramtres dun type driv

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

Nouveauts concernant les types drivs

Paramtres dun type driv

Constructeur et type paramtrable

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)

:: :: :: ::

ch len prec = s e l e c t ed _ r e a l _ k i n d (9 ,99) t

print * , len, ch %len, t %kind ! len(ch) ambigu ici, kind(t) est valide. end subroutine

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

66 / 247

Nouveauts concernant les types drivs

Paramtres dun type driv

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

Nouveauts concernant les types drivs

Extension dun type driv

Extension dun type driv non paramtr


Un type existant peut tre enrichi. Pour cela, on dnit un nouveau type en rfrenant le type que lon dsire tendre au moyen de lattribut EXTENDS. Un type comportant lattribut SEQUENCE ou BIND nest pas un type extensible.
Exemple module m type coul real , dimension (3) :: compos end type coul type , extends ( coul ) :: coul_ext character ( len =:) , allocatable :: nom end type coul_ext end module m program p use m type ( coul_ext ) :: c c % coul % compos = [ 1. , 1. , 0. ] ! ou c % compos = [ 1. , 1. , 0. ] c % nom = " Jaune " print * , c % compos , c % nom end program p

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

68 / 247

Nouveauts concernant les types drivs

Extension dun type driv

Constructeur dun type driv tendu


Lors de lextension dun type drive, le ou les types tendus possdent leur contructeur du nom du type tendu. Reprenons lexemple prcdent avec appel du constructeur pour le type tendu.
Exemple module m type coul real , dimension (3) :: compos end type coul type , extends (coul) :: coul_ext character ( len =:) , allocatable :: nom end type coul_ext end module m program p use m type ( coul_ext ) :: ce ; type (coul) :: c ce = coul_ext ( compos =[ 1. , 0. , 0. ] , nom = " Rouge " ) print * , ce %compos, ce %nom ce = coul_ext ( coul =coul([ 0. , 1. , 0. ]) , nom = " Vert " ) print * , ce %compos, ce %nom c = coul( compos =[ 0. , 0. , 1. ] ) ! le cas suivant est correct mme si les ! composantes du type " coul " sont prives . ce = coul_ext ( coul =c , nom = " Bleu " ) end program p
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 69 / 247

Nouveauts concernant les types drivs

Extension dun type driv

Type driv paramtr


Lorsquun type paramtr est tendu, le nouveau type hrite des paramtres du type quil complte et peut en dnir de nouveaux, comme le montre lexemple suivant :
module m implicit none integer , parameter , private :: prec =kind(1.0) type champ_vect (N ,D , K ) integer , kind :: K = prec integer , len :: D = 2 , N real ( kind =K) , dimension (D,N) :: champ = 0. end type champ_vect type , extends ( champ_vect ) :: ch am p_ v ec t _l ab e l ( LN ) integer , len :: LN = 100 character ( len =LN) :: label = " " end type c h a mp_v ec t _l ab e l end module m program p use m implicit none integer , parameter :: prec =kind(1. d0 ) type ( c h a mp _v ect_ la b el ( N =100)) :: c1 type ( c h a mp _v ect_ la b el ( K = prec , D =3 , N =200 , LN =30)) :: c2 integer l c1 = c ha mp_ vec t _la be l ( N =100)( label = " champ de forces l e c t ro m ag n ti q ue s " ) l = len( " champ de vitesses " ) c2 = c ha mp_ vec t _la be l ( K = prec , D =3 , N =200 , LN = l )( label = " champ de vitesses " ) end program p

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

70 / 247

Nouveauts concernant les types drivs

Variable polymorphique

Variable polymorphique : dnition

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

71 / 247

Nouveauts concernant les types drivs

Variable polymorphique

Variable polymorphique : remarques

Une variable polymorphique ne peut gurer comme membre de gauche de

linstruction daectation intrinsque ;


On appelle declared type le type indiqu la dclaration au moyen du mot-cl CLASS

et dynamic type le type rel de lobjet lexcution ;


On a la possibilit de se dnir galement des variables sans aucun type la

dclaration permettant ainsi de leur donner nimporte quel type dynamique : on les appelle unlimited polymorphic et on leur spcie CLASS(*) lors de la dclaration.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

72 / 247

Nouveauts concernant les types drivs

Variable polymorphique

Argument muet polymorphique


Son type dynamique est celui de largument rel fourni lappel. Cela permet dappliquer tous les types tendus une procdure dnie pour le type de base.
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 type , extents ( point2d ) :: point3d real z end type point3d type , extends ( point3d ) :: point3d_coul real , dimension (3) :: compos_rvb end type point3d_coul contains ! Calcul de la distance entre les points p1 et p2 function distance ( p1 , p2 ) CLASS ( point2d ) p1 , p2 real distance ... end function distance end module m
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 73 / 247

Nouveauts concernant les types drivs

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

subroutine clsub1 ( c ) CLASS ( point2d ) c ... end subroutine clsub1

subroutine clsub2 ( c ) CLASS ( point2d_coul ) c ... end subroutine clsub2

subroutine tsub1 ( c ) TYPE ( point2d ) c ... end subroutine tsub1

subroutine tsub2 ( c ) TYPE ( point2d_coul ) c ... end subroutine tsub2

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

74 / 247

Nouveauts concernant les types drivs

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

Nouveauts concernant les types drivs

Variable polymorphique

Variable polymorphique : attributs POINTER, ALLOCATABLE


Une variable polymorphique ayant lattribut POINTER (ou pointeur polymorphique) a pour type dynamique celui de sa cible. De mme, le type dynamique dune variable polymorphique ayant lattribut ALLOCATABLE est celui fourni lors de son allocation.
Exemple program p use m type ( point2d ) , type ( point3d ) , CLASS ( point2d ) , CLASS ( point3d ) , CLASS ( point2d ) ,

target target pointer pointer allocatable

:: :: :: :: ::

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

dynamique de la cible point2d dynamique de la cible point3d

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

76 / 247

Nouveauts concernant les types drivs

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

77 / 247

Nouveauts concernant les types drivs

Variable polymorphique

Construction SELECT TYPE


Cette construction permet lexcution de blocs dinstructions en fonction du type dynamique dune variable polymorphique.
Exemple module m use I SO _FORT RA N_ EN V type couleur real , dimension (3) :: compos end type couleur type , extends ( couleur ) :: coul_label character ( len =:) , allocatable :: nom end type coul_label contains subroutine output ( obj ) CLASS ( couleur ) , intent ( in ) :: obj select type ( obj ) CLASS is ( couleur ) write ( OUTPUT_UNIT , * ) " Composantes : " , obj % compos CLASS is ( coul_label ) write ( OUTPUT_UNIT , * ) " Nom : " , trim ( obj % nom ) , & " , composantes : " , obj % compos end select end subroutine output

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

78 / 247

Nouveauts concernant les types drivs

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

79 / 247

Nouveauts concernant les types drivs

Variable polymorphique

Exemple : variable polymorphique gnrique


module m type t integer i end type t type tt real x end type tt contains subroutine sp ( obj ) class (*) , intent ( out ) :: obj ! unlimited polymorphic object select type ( obj ) type is ( t ) obj % i = 1756 type is ( tt ) obj % x = acos ( -1.) type is ( real ) obj = exp ( 1. ) type is ( character ( len =*)) obj = " Pression initiale " end select end subroutine sp end module m program unlim use m type ( t ) obj_t type ( tt ) obj_tt real x character ( len =100) texte call sp ( obj_t ); call sp ( obj_tt ); call sp ( x ); call sp ( texte ); end program unlim print print print print *, *, *, *, obj_t obj_tt x trim ( texte )

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

80 / 247

Nouveauts concernant les types drivs

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

81 / 247

Nouveauts concernant les types drivs

Variable polymorphique

Type eectif dune variable polymorphique

Deux nouvelles fonctions intrinsques permettent de dterminer le type dune variable polymorphique au moment de lexcution :

SAME_TYPE_AS( a, b ) Cette fonction retourne vrai si a et b ont le mme type dynamique.

EXTENDS_TYPE_OF( a, mold ) Celle-ci retourne vrai si le type dynamique de a est une extension de celui de mold.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

82 / 247

Nouveauts concernant les types drivs

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

83 / 247

Nouveauts concernant les types drivs

Variable polymorphique et oprateur daectation

Variable polymorphique et oprateur daectation


Une variable polymorphique ne peut gurer comme oprande de gauche de loprateur daectation intrinsque. Mais sil sagit dune surcharge de cet oprateur lopration devient valide comme le montre lexemple suivant :
Exemple
module m type base integer i end type base type , extends ( base ) :: t real r end type t interface assignment (=) module procedure affect end interface assignment (=) contains subroutine affect ( a , b ) class ( base ) , allocatable , intent ( out ) :: a class ( base ) , intent ( in ) :: b allocate ( a , source = b ) end subroutine affect end module m program p use m class ( base ) , allocatable :: obj type ( t ) source source% i = 1756; source% r = acos ( -1. ) obj = source end program p
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 84 / 247

Nouveauts concernant les types drivs

Composante pointeur de procdure

Composante pointeur de procdure

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

driv au moyen du symbole % comme pour laccs aux composantes habituelles.


Par dfaut, lobjet qui est lorigine de lappel est transmis implicitement comme

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

transmission implicite : dans ce cas, si on dsire transmettre lobjet, on le fera explicitement.


Lattribut PASS peut tre indiqu soit pour conrmer le mode par dfaut soit pour

transmettre implicitement lobjet vers un autre argument que le premier.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

85 / 247

Nouveauts concernant les types drivs

Composante pointeur de procdure

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

86 / 247

Nouveauts concernant les types drivs

Composante pointeur de procdure

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

87 / 247

Nouveauts concernant les types drivs

Procdures attaches un type

Procdures attaches un type (type-bound procedures)

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

88 / 247

Nouveauts concernant les types drivs

Procdures attaches un type

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

PROCEDURE [, binding-attr-list ::] binding-name [=> procedure-name] PROCEDURE(interface-name), binding-attr-list :: binding-name

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,

lattribut DEFERRED est alors obligatoire (voir page 117) ;


linstruction GENERIC permet de faire de la gnricit de la surcharge doprateurs

ou des entrs-sorties portant sur des objets de type driv (voir page 129).

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

89 / 247

Nouveauts concernant les types drivs

Procdures attaches un type

Procdure attache par nom (specic binding)


Exemple module m type T ... ! --> Dclaration des composantes ... ! --> du type driv T contains PROCEDURE :: proc = > my_proc ! Procdure publique end type T contains subroutine my_proc ( b , x , y ) class ( T ) , intent ( inout ) :: b ! --> Passed - object dummy argument real , intent ( in ) :: x , y . . . end subroutine my_proc end module m type ( T ) :: obj real :: x1 , y1 . . . call obj % proc ( x1 , y1 ) . . .

! --> call my_proc ( obj , x1 , x2 )

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

90 / 247

Nouveauts concernant les types drivs

Procdures attaches un type

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

91 / 247

Nouveauts concernant les types drivs

Procdures attaches un type

Procdure attache par nom gnrique (generic binding)


Exemple
module mod integer , parameter :: single =kind(1.0), double=kind(1.d0) type matrix (K , N , M ) integer , kind :: K; integer , len :: N, M real ( kind =K) , dimension (N,M) :: A contains PROCEDURE , PRIVATE :: max_s PROCEDURE , PRIVATE :: max_d GENERIC :: max = > max_s , max_d end type matrix contains real ( kind = single ) function max_s ( this ) class ( matrix ( K = single , 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 type ( matrix ( K = single , N =10 , M =20)) :: obj1 type ( matrix ( K =double, N =20 , M =50)) :: obj2 real ( kind = single ) maxs real ( kind =double) maxd . . . maxs = obj1 % max (); maxd = obj2 % max () end program prog

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

92 / 247

Nouveauts concernant les types drivs

Procdures attaches un type

Procdure attache par oprateur (operator binding)


Exemple
module mod integer , parameter :: single =kind(1.0), double=kind(1.d0) type matrix (K , N , M ) integer , kind :: K integer , len :: N, M real ( kind =K) , dimension(N,M) :: A contains PROCEDURE , PRIVATE :: add_s PROCEDURE , PRIVATE :: add_d PROCEDURE , PRIVATE :: affect_s PROCEDURE , PRIVATE :: affect_d GENERIC :: OPERATOR (+) = > add_s , add_d GENERIC :: ASSIGNMENT (=) = > affect_s , affect_d end type matrix contains function add_s( a , b ) class ( matrix ( K = single , N =* , M =*)) , intent ( in ) :: a , b ! " type " et non " class ". type ( matrix ( K = single , N =: , M =:)) , allocatable :: add_s if ( any ( shape ( a % A ) /= shape ( b % A ) ) ) stop " Erreur : objets non conformants " allocate ( matrix ( K = single , N = a %N, M = a %M) :: add_s ) add_s % A (: ,:) = a % A (: ,:) + b % A (: ,:) end function add_s function add_d( a , b ) class ( matrix ( K =double, N =* , M =*)) , intent ( in ) :: a , b ! " type " et non " class ". type ( matrix ( K =double, N = a %N, M = a %M)) :: add_d if ( any ( shape ( a % A ) /= shape ( b % A ) ) ) stop " Erreur : objets non conformants " add_d % A (: ,:) = a % A (: ,:) + b % A (: ,:) end function add_d
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 93 / 247

Nouveauts concernant les types drivs

Procdures attaches un type

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

94 / 247

Nouveauts concernant les types drivs

Procdures attaches un type

Procdure attache mot-cl FINAL (nal binding)

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

destructeur est appel au moment de sa dsallocation eectue au moyen de linstruction DEALLOCATE ;


Pour un objet automatique, le destructeur est appel lorsque lunit de programme,

au sein de laquelle lobjet est dni, est dsactive ;


Par contre, si le programme sarrte suite une erreur ou bien lors de lexcution de

linstruction STOP ou END de lunit principale, aucune procdure de nalisation nest excute.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

95 / 247

Nouveauts concernant les types drivs

Procdures attaches un type

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

96 / 247

Nouveauts concernant les types drivs

Procdures attaches un type

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

97 / 247

Nouveauts concernant les types drivs

Procdures attaches un type

Pour un type tendu, lors de la destruction dun objet de ce type :


si le type tendu contient une procdure de nalisation, celle-ci est dabord excute, puis la procdure de nalisation du type parent, si elle existe, est excute avec en

argument la composante de lobjet correspondant au type parent.


Exemple module m type base real , dimension (:) , pointer :: p = > NULL () contains FINAL :: fin_base end type base type , extends ( base ) :: t real , dimension (:) , pointer :: q = > NULL () contains FINAL :: fin_t end type t contains

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

98 / 247

Nouveauts concernant les types drivs

Procdures attaches un type

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

Nouveauts concernant les types drivs

Procdures attaches un type

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

100 / 247

Nouveauts concernant les types drivs

Hritage

Hritage dune procdure attache un type


Un type tendu dun type extensible hrite la fois de ses composantes mais galement de ses procdures qui lui sont attaches.
Exemple
module point private type , public :: point2d real x , y contains PROCEDURE , PASS :: affichage = > affichage_2d end type contains subroutine affichage_2d ( this , texte ) CLASS ( point2d ) , intent ( in ) :: this CHARACTER ( len =*) , intent ( in ) :: texte print * , texte ; print * , " X = " , this % x ; print * , " Y = " , this % y end subroutine affichage_2d end module point module pointcoul use point private type , public , extends ( point2d ) :: point2d_coul real , dimension (3) :: compos_rvb end type point2d_coul end module pointcoul program p use pointcoul type ( point2d_coul ) :: pcoul call pcoul % affichage ( " Voici mes coordonnes " ) end program p
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 101 / 247

Nouveauts concernant les types drivs

Hritage

Surcharge dune procdure type-bound (specic binding)


Lors de la dnition dun type tendu dun type extensible il est possible dtendre ou surcharger (override) les procdures type_bound.
Exemple module pointext use point type , public , extends ( point2d ) :: point3d real z contains PROCEDURE , PASS :: affichage = > affichage_3d end type contains subroutine affichage_3d ( this , texte ) CLASS ( point3d ) , intent ( in ) :: this CHARACTER ( len =*) , intent ( in ) :: texte call this % point2d % affichage ( texte ) print * , " Z = " , this % z end subroutine affichage_3d end module pointext program p use pointext type ( point3d ) pt call pt % affichage ( " Voici mes coordonnes " ) end program p
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 102 / 247

Nouveauts concernant les types drivs

Hritage

Surcharge dune procdure type-bound (generic binding)


Exemple module mod implicit none integer , parameter :: simple = kind(1.), double = kind(1.d0) type matrix (K , N , M ) integer , kind :: K; integer , len :: N, M real ( kind =K) , dimension (N,M) :: a =1. contains PROCEDURE , PRIVATE :: maxs = > max_s PROCEDURE , PRIVATE :: maxd = > max_d PROCEDURE , PRIVATE :: sorties = > sortie_mat_s PROCEDURE , PRIVATE :: sortied = > sortie_mat_d GENERIC :: max = > maxs, maxd GENERIC :: sortie = > sorties, sortied end type matrix ! type , extends ( matrix ) :: matrix_e ( LN ) integer , len :: LN = 30 character ( len =LN) :: nom contains PROCEDURE , PRIVATE :: sorties = > sortie_m at_e_s PROCEDURE , PRIVATE :: sortied = > sortie_m at_e_d end type matrix_e
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 103 / 247

Nouveauts concernant les types drivs

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

104 / 247

Nouveauts concernant les types drivs

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

105 / 247

Nouveauts concernant les types drivs

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

Nouveauts concernant les types drivs

Hritage

Procdure attache un type non surchargeable


Lattribut NON_OVERRIDABLE la dclaration dune procdure type-bound permet dinterdire toute surcharge lors dextensions ventuelles de ce type.
Exemple module m type mycomplex real theta , rho contains PROCEDURE , PASS , NO N_ O VE RR ID A BL E :: real = > real_part PROCEDURE , PASS , NO N_ O VE RR ID A BL E :: imag = > imag_part end type contains function real_part ( a ) class ( mycomplex ) , intent ( in ) :: a real real_part real_part = a % rho * cos ( a % theta ) end function real_part function imag_part ( a ) class ( mycomplex ) , intent ( in ) :: a real imag_part real_part = a % rho * sin ( a % theta ) end function imag_part end module m
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 107 / 247

Nouveauts concernant les types drivs

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

108 / 247

Nouveauts concernant les types drivs

Hritage

Exemple rcapitulatif (suite)


contains function plus_T ( this , b ) class ( T ) , intent ( in ) :: this , b class ( T ) , allocatable :: plus_T allocate ( T :: plus_T ); plus_T % x = this % x + b % x end function plus_T function plus_TT ( this , b ) class ( TT ) , intent ( in ) :: this ! doit respecter l interface class ( T ) , intent ( in ) :: b ! de la fonction " plus_T " class ( T ) , allocatable :: plus_TT ! hormis l argument this . if ( SAME_TYPE_AS ( b , this ) ) then allocate ( TT :: plus_TT ) else allocate ( T :: plus_TT ) end if select type ( plus_TT ) type is ( T ) plus_TT = this % T + b type is ( TT ) plus_TT % T = this % T + b select type ( b ) type is ( TT ) plus_TT % i = this % i + b % i end select end select end function plus_TT

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

109 / 247

Nouveauts concernant les types drivs

Hritage

Exemple rcapitulatif (suite)


subroutine egal_T ( this , b ) class ( T ) , intent ( out ) :: this class ( T ) , intent ( in ) :: b this % x = b % x end subroutine egal_T subroutine egal_TT ( this , b ) class ( TT ) , intent ( out ) :: this class ( T ) , intent ( in ) :: b this % T = b select type ( b ) type is ( TT ) this % i = b % i end select end subroutine egal_TT subroutine affiche_T ( this ) class ( T ) , intent ( in ) :: this write ( OUTPUT_UNIT , " (a , f0 .0) " ) " X = " , this % x end subroutine affiche_T subroutine affiche_TT ( this ) class ( TT ) , intent ( in ) :: this call this % T % affiche ; write ( OUTPUT_UNIT , " (a , i0 ) " ) " I = " , this % i end subroutine affiche_TT end module m

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

110 / 247

Nouveauts concernant les types drivs

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

111 / 247

Nouveauts concernant les types drivs

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 ;

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

112 / 247

Nouveauts concernant les types drivs

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

Nouveauts concernant les types drivs

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

Nouveauts concernant les types drivs

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 (); }

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

115 / 247

Nouveauts concernant les types drivs

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

utilis pour la dclaration de variables polymorphiques ;


Lextension dun tel type peut se faire au moyen dun type tendu normal ou dun

nouveau type abstrait.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

116 / 247

Nouveauts concernant les types drivs

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

117 / 247

Nouveauts concernant les types drivs

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

=> => => =>

aire_cylindre vo lum e_cy li n dr e affichage_figure_cylindre affichage_constituants_cylindre

abstract interface subroutine aff ( this ) import figure_geo class ( figure_geo ) , intent ( in ) :: this end subroutine aff end interface

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

118 / 247

Nouveauts concernant les types drivs

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

Nouveauts concernant les types drivs

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

Nouveauts concernant les types drivs

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

Nouveauts concernant les types drivs

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

valoriser des composantes qui sont prives.


Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 122 / 247

Nouveauts concernant les types drivs

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

123 / 247

Nouveauts concernant les types drivs

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

Patrick Corde Herv Delouis

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

125 / 247

Entres-sorties - Partie II

11

Divers

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

126 / 247

Entres-sorties - Partie II

Traitement personnalis des objets de type driv

Traitement personnalis des objets de type driv

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).

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

127 / 247

Entres-sorties - Partie II

Traitement personnalis des objets de type driv

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

128 / 247

Entres-sorties - Partie II

Traitement personnalis des objets de type driv

Ce type de procdure doit respecter le prototype suivant :


SUBROUTINE lecture_format (dtv, unite, iotype, v_list, etat, msg ) SUBROUTINE ecrit_nonformat(dtv, unite, etat, msg )

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

129 / 247

Entres-sorties - Partie II

Traitement personnalis des objets de type driv

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

130 / 247

Entres-sorties - Partie II

Traitement personnalis des objets de type driv

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

131 / 247

Entres-sorties - Partie II

Traitement personnalis des objets de type driv

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

132 / 247

Entres-sorties - Partie II

Traitement personnalis des objets de type driv

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

Remarque : cette nouveaut permet de bncier du concept dabstraction des donnes.


Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 133 / 247

Entres-sorties - Partie II

Traitement personnalis des objets de type driv

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

134 / 247

Entres-sorties - Partie II

Traitement personnalis des objets de type driv

Ce module pourra semployer de la faon suivante :


Exemple de traitement rcursif (suite) PROGRAM liste USE liste_module INTEGER :: unite , etat TYPE ( node ) :: racine ... ! Cration d une liste chane avec racine comme noeud primaire . ... ! Impression de la liste . WRITE ( UNIT = unite , FMT = " ( dt ) " , IOSTAT = etat ) racine END PROGRAM liste

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

135 / 247

Entres-sorties - Partie II

Traitement personnalis des objets de type driv

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

Traitement personnalis des objets de type driv

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

Interoprabilit entre entits C et Fortran

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

Interoprabilit entre entits C et Fortran

Les pointeurs Arguments dappel/arguments muets


Arguments de types intrinsques Arguments de types pointeurs : le type C_PTR Arguments de types structure de donnes

Pointeur de fonction/pointeur de procdure : le type C_FUNPTR


10

Arithmtique IEEE et traitement des exceptions Divers

11

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

139 / 247

Interoprabilit entre entits C et Fortran

Introduction

Interoprabilit entre entits C et Fortran

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 . . .

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

140 / 247

Interoprabilit entre entits C et Fortran

Les types intrinsques

Les types intrinsques


Le tableau suivant prsente des correspondances entre entits de type intrinsques au moyen de constantes symboliques dnies dans le module ISO_C_BINDING : Type/sous-type en Fortran INTEGER(kind=C_INT) INTEGER(kind=C_SHORT) INTEGER(kind=C_LONG) REAL(kind=C_FLOAT) REAL(kind=C_DOUBLE) COMPLEX(kind=C_FLOAT_COMPLEX) LOGICAL(kind=C_BOOL) CHARACTER(kind=C_CHAR) etc. Type correspondant en C int short int long int oat double oat _Complex _Bool char ...

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

Interoprabilit entre entits C et Fortran

Les types intrinsques

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

142 / 247

Interoprabilit entre entits C et Fortran

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

sont interoprables avec les tableaux ainsi dclars en C :

int t1[][5][18] int t2[100][5][18]

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

143 / 247

Interoprabilit entre entits C et Fortran

Les variables globales

Les variables globales


Une variable externe C peut interoprer avec un bloc COMMON ou avec une variable dclare dans un module Fortran.
Exemple module variables_C use , intrinsic :: ISO_C_BINDING integer ( C_INT ) , bind ( C ) :: c_extern integer ( C_LONG ) :: fort_var BIND ( C , NAME = " C_var " ) :: fort_var common / COM / r , s common / SINGLE / t real ( kind = C_FLOAT ) :: r , s , t bind ( C ) :: / COM / , / SINGLE / end module variables_C

Ces variables Fortran sont interoprables avec celles dnies en C au niveau externe par :

int c_extern ; long C_var ; struct float r, s ; com ; float single ;


10 fvrier 2012 144 / 247

Patrick Corde Herv Delouis

Langage Fortran

Interoprabilit entre entits C et Fortran

Les variables globales

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

Interoprabilit entre entits C et Fortran

Les variables globales

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

146 / 247

Interoprabilit entre entits C et Fortran

Les variables globales

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

Interoprabilit entre entits C et Fortran

Types drivs Fortran/structures de donnes C

Types drivs Fortran/structures de donnes C


Un objet de type C_struct ainsi dni en C :
typedef struct { int m , n ; float r ; } C_struct ;

est interoprable avec une structure Fortran du type F_struct suivant :


use , intrinsic :: ISO_C_BINDING type , BIND ( C ) :: F_struct integer ( kind = C_INT ) :: m , n real ( kind = C_FLOAT ) :: r end type F_struct

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

Interoprabilit entre entits C et Fortran

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*).

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

149 / 247

Interoprabilit entre entits C et Fortran

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

Interoprabilit entre entits C et Fortran

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

151 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

Arguments de types intrinsques


attribut VALUE pour les arguments muets scalaires. Largument dappel

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

doit correspondre un prototype C retournant le type void ;


un argument du prototype C de type pointeur peut tre associ un argument muet

Fortran classique sans lattribut VALUE (cf. exemple suivant) ;


un argument du prototype C qui nest pas de type pointeur doit tre associ un

argument muet avec lattribut VALUE (cf. exemple suivant).


Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 152 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

153 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

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 ; }

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

154 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

Exemple : fonction C appele depuis Fortran Appelant Fortran + B.I. + BIND(C)


Arguments dappel 1 2 real(C_FLOAT) :: tab(18)

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

Appel : y = C_FUNC(array=tab, N=n)

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

155 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

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

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

Exemple : procdure Fortran appele depuis C Appelant C


Arguments dappel &beta 378.0 real(C_DOUBLE), intent(inout) :: B beta double delta[]
0

Sousprogr. Fortran appel BIND(C)


Arguments muets

17.0

real(C_DOUBLE), intent(in) :: D(*) integer(C_LONG), VALUE :: TAILLE_D

1 12.3 3 3.14

80.0

Stack
long taille_delta

10

&beta

&delta[0]

10

Appel : f1(&beta, delta, taille_delta)

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

157 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

Arguments de types pointeurs : le type C_PTR


Fortran C Passage par valeur (VALUE) La fonction C rcupre le contenu de la composante adresse encapsule dans largument de type C_PTR ncessairement dj associ ; intent(OUT/INOUT) interdit. exemple 1 ci-aprs C Fortran Passage par valeur (VALUE) C passe Fortran un pointeur dj valoris ; intent(OUT/INOUT) interdit. exemple 4 ci-aprs Passage par rfrence C doit passer ladresse (&p) dun pointeur qui pourra donc tre associ dans la procdure Fortran. exemple 3 et 4 ci-aprs Passage par rfrence La fonction C rcupre ladresse de la composante adresse encapsule dans largument de type C_PTR non ncessairement associ ; exemple 2 ci-aprs

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

158 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

Exemple 1 : Fortran C (argument C_PTR pass par valeur)

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

type C_PTR employ ici permet de contourner ce problme ;


on donne deux versions de la fonction C, lune respectant la norme C89, lautre la

norme C99.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

159 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

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

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

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

Type C_PTR C_LOC(mat)

11111 00000 11111 00000 11111 00000 11111 00000 11111 00000
32

float *vec int n int m

Prototype

Bloc Interface
integer(C_INT), VALUE :: n, m type(C_PTR), VALUE :: v

Stack
20

Appel : call c_func(n, m, C_LOC(mat))


Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 161 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

Exemple 2 : Fortran C (argument C_PTR pass par rfrence)

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

162 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

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

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

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

int n int m Prototype

*p=malloc(n*m*sizeof(float))

Stack Bloc Interface


type(C_PTR), intent(out) :: ptrC integer(C_INT), VALUE :: n, m 24 12

Appel : call c_alloc(pointeurC, n, m)

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

164 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

Exemple 3 : C Fortran (argument C_PTR pass par rfrence)

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

165 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

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; }

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

166 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

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

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

Exemple 3 : C ==> Fortran (argument C_PTR pass par rfrence) Appelant C


Arguments dappel const int n=100; 100 integer(C_INT), VALUE :: n n type(C_PTR), intent(out) :: pointeurC &vec vec (float *vec;) C_LOC
1 2 3 100

Sousprogramme Fortran appel


Arguments muets

Cible dynamique vecteur

Stack
100

C_PTR pointeurC

Appel : F_alloc(&vec, n)
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 168 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

Notes sur lexemple 3 ci-dessus :


Le tableau dynamique vecteur (allocatable) est dclar comme entit globale

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

169 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

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

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

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

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

Arguments de types structure de donnes


Exemple Fortran C module m use ISO_C_BINDING type , BIND ( C ) :: vecteur integer ( kind = C_INT ) :: n type ( C_PTR ) :: pointeur_C end type vecteur interface ! < - - - - - - - - - - Bloc interface de la fonction C subroutine moyenne ( vec ) BIND (c , name = " C_moyenne " ) import vecteur type ( vecteur ) , VALUE :: vec end subroutine moyenne end interface end module m program p use m type ( vecteur ) :: v real ( C_FLOAT ) , allocatable , dimension (:) , target :: tab v % n = 100; allocate ( tab ( v % n )); call random_number ( tab ) v % pointeur_C = C_LOC ( tab ); call moyenne (vec= v ) ! <--- Appel fonction C deallocate ( tab ) end program p
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 172 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

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 ; }

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

173 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

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]

Appel : call moyenne(vec=v)

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

174 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

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

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

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

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

Exemple 2 : C ==> Fortran (structure de donnes en argument avec composante pointeur) Appelant C
Arguments dappel

Fonction Fortran appele


Arguments muets

vecteur vec

len p

1000

type(vecteur), VALUE, intent(in) :: v

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)

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

177 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

178 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

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 ;

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

179 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

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; }

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

180 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

181 / 247

Interoprabilit entre entits C et Fortran

Arguments dappel/arguments muets

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

182 / 247

Interoprabilit entre entits C et Fortran

Pointeur de fonction/pointeur de procdure : le type C_FUNPTR

Pointeur de fonction/pointeur de procdure : le type C_FUNPTR

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).

sous-programme C_F_PROCPOINTER(CPTR, FPTR)

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

183 / 247

Interoprabilit entre entits C et Fortran

Pointeur de fonction/pointeur de procdure : le type C_FUNPTR

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

184 / 247

Interoprabilit entre entits C et Fortran

Pointeur de fonction/pointeur de procdure : le type C_FUNPTR

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

185 / 247

Interoprabilit entre entits C et Fortran

Pointeur de fonction/pointeur de procdure : le type C_FUNPTR

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 ; }

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

186 / 247

Arithmtique IEEE et traitement des exceptions

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

Arithmtique IEEE et traitement des exceptions

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

188 / 247

Arithmtique IEEE et traitement des exceptions

Standard IEEE-754

Arithmtique IEEE et traitement des exceptions

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 ;

+INF (+), -INF () ;

dnormalises : concernent les trs petites valeurs.

Dans tout systme de reprsentation, en loccurrence celui dni par le standard IEEE, lensemble des rels reprsentables est un ensemble ni.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

189 / 247

Arithmtique IEEE et traitement des exceptions

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

190 / 247

Arithmtique IEEE et traitement des exceptions

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 ().

Note : aucune valeur par dfaut nest prvue par la norme !

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

191 / 247

Arithmtique IEEE et traitement des exceptions

Modules intrinsques

Modules intrinsques

Trois modules intrinsques permettent laccs aux fonctionnalits dnies par le standard IEEE :
IEEE_ARITHMETIC, IEEE_EXCEPTIONS, IEEE_FEATURES.

Ces modules contiennent des dnitions :


de types, de constantes symboliques, de procdures.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

192 / 247

Arithmtique IEEE et traitement des exceptions

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

193 / 247

Arithmtique IEEE et traitement des exceptions

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).

Ces fonctions sont les suivantes :

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

Arithmtique IEEE et traitement des exceptions

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

Arithmtique IEEE et traitement des exceptions

Procdures de gestion du mode darrondi

Procdures de gestion du mode darrondi


Le mode darrondi utilis lors de calculs est gr par deux sous-programmes (les dirents modes sont dnis laide des constantes symboliques IEEE_NEAREST, IEEE_UP, IEEE_DOWN, IEEE_TO_ZERO du type prdni IEEE_ROUND_VALUE) : IEEE_GET_ROUNDING_MODE(round_value) IEEE_SET_ROUNDING_MODE(round_value)
Exemple
use IE EE _ ARI TH MET IC implicit none type ( I EE E_R OUND_TY PE ) :: round_value ! Sauvegarde du mode d arrondi courant . call I E E E _ G E T _ R O U N D I N G _ M O D E ( round_value ) ! Position nement du mode d arrondi toward + INF call I E E E _ S E T _ R O U N D I N G _ M O D E ( IEEE_UP ) ... ... ! Restauration du mode d arrondi sauvegard . call I E E E _ S E T _ R O U N D I N G _ M O D E ( round_value )

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

196 / 247

Arithmtique IEEE et traitement des exceptions

Gestion des exceptions

Gestion des exceptions


Le programmeur, aprs avoir dtect la survenance dune exception, a la possibilit de lancer un traitement personnalis. chacune des 5 classes dexception correspondent 2 drapeaux :
lun indiquant si lvnement relatif lexception sest ralis ; lautre signalant si ce type dexception provoque une interruption du programme.

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

197 / 247

Arithmtique IEEE et traitement des exceptions

Gestion des exceptions

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

198 / 247

Arithmtique IEEE et traitement des exceptions

Gestion des exceptions

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

Arithmtique IEEE et traitement des exceptions

Gestion des exceptions

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 )

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

200 / 247

Arithmtique IEEE et traitement des exceptions

Procdures de gestion des interruptions

Procdures de gestion des interruptions


Lorsquune exception est gnre, le programme peut sarrter ou bien continuer. Ce mode de fonctionnement est contrl par les sous-programmes suivants : IEEE_GET_HALTING_MODE(flag, halting) IEEE_SET_HALTING_MODE(flag, halting)

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

201 / 247

Arithmtique IEEE et traitement des exceptions

Procdures de gestion du contexte arithmtique

Procdures de gestion du contexte arithmtique

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

202 / 247

Arithmtique IEEE et traitement des exceptions

Procdures de gestion du contexte arithmtique

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 ) ...

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

203 / 247

Arithmtique IEEE et traitement des exceptions

Procdures de gestion du contexte arithmtique

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

204 / 247

Arithmtique IEEE et traitement des exceptions

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

205 / 247

Arithmtique IEEE et traitement des exceptions

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 :

IEEE_INVALID, IEEE_OVERFLOW, IEEE_DIVIDE_BY_ZERO, IEEE_UNDERFLOW, IEEE_INEXACT

IEEE_STATUS_TYPE pour la sauvegarde de lenvironnement ottant.

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

Arithmtique IEEE et traitement des exceptions

Modules intrinsques

Module IEEE_ARITHMETIC
Il dnit les types :
IEEE_CLASS_TYPE permettant didentier la classe dun rel. Les valeurs possibles

sont les constantes symboliques suivantes :


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

IEEE_ROUND_TYPE permettant didentier le mode darrondi. Les valeurs possibles

sont les constantes symboliques suivantes :


IEEE_NEAREST, IEEE_TO_ZERO, IEEE_UP, IEEE_DOWN, IEEE_OTHER

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

Arithmtique IEEE et traitement des exceptions

Modules intrinsques

Il dnit les fonctions dinterrogation suivantes :


IEEE_SUPPORT_DATATYPE, IEEE_SUPPORT_DENORMAL, IEEE_SUPPORT_DIVIDE, IEEE_SUPPORT_INF

Il dnit les fonctions lmentaires suivantes :


IEEE_CLASS, IEEE_COPY_SIGN, IEEE_IS_FINITE, IEEE_IS_NAN, IEEE_IS_NORMAL, IEEE_IS_NEGATIVE, IEEE_LOGB, IEEE_NEXT_AFTER, IEEE_REM, IEEE_RINT, IEEE_SCALEB, IEEE_UNORDERED, IEEE_VALUE
Patrick Corde Herv Delouis Langage Fortran 10 fvrier 2012 208 / 247

Arithmtique IEEE et traitement des exceptions

Modules intrinsques

Il dnit la fonction de transformation suivante :


IEEE_SELECTED_REAL_KIND

Il dnit les sous-programmes non lmentaires suivants :


IEEE_GET_ROUNDING_MODE, IEEE_GET_UNDERFLOW_MODE, IEEE_SET_ROUNDING_MODE, IEEE_SET_UNDERFLOW_MODE

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

209 / 247

Arithmtique IEEE et traitement des exceptions

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

210 / 247

Arithmtique IEEE et traitement des exceptions

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.

Exemple USE , INTRINSIC :: IEEE_FEATURES , ONLY : IEEE_DIVIDE

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

211 / 247

Arithmtique IEEE et traitement des exceptions

Documentations

Documentations

http://www.dkuug.dk/jtc1/sc22/open/n3661.pdf Exceptions and IEEE

arithmetic ;
http://www-1.ibm.com/support/docview.wss?uid=swg27003923&aid=1

Chapter 16. Floating-point Control and Inquiry Procedures ;


http://cch.loria.fr/documentation/IEEE754/ACM/goldberg.pdf

Patrick Corde Herv Delouis

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

Patrick Corde Herv Delouis

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

Patrick Corde Herv Delouis

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.

Patrick Corde Herv Delouis

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

218 / 247

Divers

Longueurs des identicateurs et des instructions

Longueurs des identicateurs et des instructions

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

219 / 247

Divers

Constantes binaires, octales et hexadcimales

Constantes binaires, octales et hexadcimales

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 " )

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

220 / 247

Divers

Nouveauts concernant certaines fonctions intrinsques

Nouveauts concernant certaines fonctions intrinsques


Les fonctions intrinsques max, maxval, min et minval admettent dsormais des arguments de type CHARACTER. Un nouvel argument kind peut tre prcis pour les fonctions intrinsques count, iachar, ichar, index, lbound, len, len_trim, maxloc, minloc, scan, shape, size, ubound et verify. Cela peut tre trs utile dans le cas o lentier par dfaut na pas le gabarit susant pour rcuprer le rsultat de ces fonctions (sur des machines 64-bits par exemple).
Exemple program p use I SO _FORT RA N_ EN V real , dimension (: ,: ,: ,:) , allocatable :: a allocate ( a (64 ,1024 ,1024 ,1024) ) ... write ( OUTPUT_UNIT , *) size ( a , kind = s e l e c t e d _ in t _ ki nd (12) ) ... end program p

Patrick Corde Herv Delouis

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 )

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

223 / 247

Annexe A : exercices

12

Annexe A : exercices noncs Exercices : corrigs Annexe B

13

Patrick Corde Herv Delouis

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

Patrick Corde Herv Delouis

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

polymorphe transmis en argument.


Le module mat_reel dnit les types tendus :

matrice_reelle ; matrice_reelle_vp ; matrice_reelle_sym ; matrice_reelle_sym_vp.


ainsi que les constructeurs et les procdures rattaches ces types. NOTES :

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.

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

228 / 247

Annexe A : exercices

noncs

Exercice 4

Soit les deux fonctions suivantes crites en langage C :

# 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 ; }

Patrick Corde Herv Delouis

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

Patrick Corde Herv Delouis

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

Patrick Corde Herv Delouis

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 )

Patrick Corde Herv Delouis

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

Patrick Corde Herv Delouis

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

Patrick Corde Herv Delouis

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

235 / 247

Annexe A : exercices

Exercices : corrigs

Corrig de lexercice 3 (suite)

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

Patrick Corde Herv Delouis

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

Patrick Corde Herv Delouis

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

Patrick Corde Herv Delouis

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

Patrick Corde Herv Delouis

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

Patrick Corde Herv Delouis

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

241 / 247

Annexe A : exercices

Exercices : corrigs

Corrig de lexercice 4 (suite)

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

242 / 247

Annexe B

12

Annexe A : exercices Annexe B Prototype LA_GEEV Prototype LA_SYEV/LA_HEEV

13

Patrick Corde Herv Delouis

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

Prototype LA_GEEV (suite)


VL , VR ( sortie / optionnels ) matrices relles ou complexes valorises respective ment l aide des vecteurs propres gauche et droite . Le stockage est effectu dans l ordre des valeurs propres . Chaque vecteur propre est calibr de sorte que sa norme euclidienne est gale 1 et sa partie relle plus grande que sa partie imaginaire . Dans le cas d une matrice relle , les valeurs propres ainsi que les vecteurs propres sont conjugus deux deux . Les valeurs de deux vecteurs propres conjugus sont donnes par : V(j) = VL ( VR )(: , j ) + i * VL ( VR )(: , j +1) V ( j +1) = VL ( VR )(: , j ) - i * VL ( VR )(: , j +1) Dans le cas complexe : V ( j ) = VL ( VR )(: , j ) ( 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 QR utilis n est pas arriv calculer toutes les valeurs propres . Dans ce cas aucun vecteur propre n a t calcul . Les lments [ i +1: n ] du vecteur <w > contiennent les valeurs propres qui ont converg ( n dsignant l ordre de la matrice A ). Si cet argument est absent et qu une erreur se produit , le programme s arrte avec un message d erreur .

INFO

Patrick Corde Herv Delouis

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 ,

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

246 / 247

Annexe B

Prototype LA_SYEV/LA_HEEV

Prototype LA_SYEV/LA_HEEV (suite)

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

Patrick Corde Herv Delouis

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

Patrick Corde Herv Delouis

Langage Fortran

10 fvrier 2012

247 / 247

Das könnte Ihnen auch gefallen