next up previous contents
Next: 5. Data Structure Up: mainexpand Previous: 3. Interface Routines: ComLib   Contents

4. I/O

To be provided by D. Gazen (Target date: 9th April 1999)

En attendant la version de D.Gazen, voici les principaux changements dans le code pour les E/S notes par P. Jabouille.

fmopen, fmclos, fmlook deviennent fmopen_ll, fmclos_ll, fmlook_ll et il faut faire USE MODE_FM pour les utiliser. ( fmfree n'existe plus et fmattr n'est plus necessaire). Pour fmopen_ll preciser READ ou WRITE a la place de NEW ou OLD

pour fmread faire USE MODE_FMREAD (au lieu de MODI_FMREAD) et pour fmwrit faire USE MODE_FMWRIT (au lieu de MODI_FMWRIT)

Il est possible de classer les champs manipules dans Meso-NH en trois grandes categories :

- les champs notes 'XY' : il s'agit de champs dont le profil est de la forme (x,y,...) ou la premiere dimension porte sur l'axe des X et la seconde dimension sur l'axe des Y. Cette categorie regroupe par exemple les champs surfaciques (x,y), les champs 3D (x,y,z) tq UM, UT ... Lorsque ce type de champ est lu dans un fichier MesoNH, chaque processeur recoit la portion du champ correspondant au decoupage suivant X et Y. Au cours de l'ecriture, les processeurs envoient leur portion du champ au proc I/O pour que ce dernier puisse ecrire le champ entier dans le fichier.

- les champs notes 'XX' : il s'agit des champs dont le profil est de la forme (x,...) ou la premiere dimension porte sur l'axe des X. Le champ XXHAT(x) rentre justement dans cette categorie. Au cours de la lecture parallele d'un champ de ce type, chaque processeur recoit la portion correspondant au decoupage suivant X. Dans l'operation d'ecriture, le processeur I/O recolte les portions qui lui manquent suivant X.

- les champs notes 'YY' : il il s'agit des champs dont le profil est de la forme (x,...) ou la premiere dimension porte sur l'axe des Y. Le champ XYHAT(y) rentre justement dans cette categorie. La lecture et l'ecriture suit les memes regles que precedemment, mais suivant Y dans ce cas.

- les autres champs notes '-' qui ne sont pas fonction du decoupage suivant X et Y comme par exemple les termes de forcages suivant z. En parallele, les champs de ce type sont identiques sur tous les processeurs. A la lecture, le processeur qui gere les I/O diffuse (broadcast) un tel champ aux autres processeurs. Au cours de l'ecriture, le proc I/O effectue l'ecriture d'un tel champ sans attendre aucune info des autres processeurs.

Les routines I/O paralleles peuvent a present gerer ces differentes categories de champ. Pour cela, les interfaces de FMREAD et FMWRIT ont ete modifiees en remplacant l'argument entier KLENG (representant la taille du champ passe en argument, devenu inutile par la presence de l'interface) par l'argument HDIR :

FMREAD(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,KLENCH,HCOMMENT,KRESP)

(in) (in) (in) (in) (out) (out) (out) (out) (out)

FMWRIT(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,KLENCH,HCOMMENT,KRESP)

(in) (in) (in) (in) (in) (in) (in) (in) (out)

Cet argument de type CHARACTER peut prendre les valeurs suivantes:

'XY' : pour identifier les champs XY

'XX' : pour identifier les champs XX

'YY' : pour identifier les champs YY

'-' : pour identifier les champs a diffuser

Dans cette version FMREAD et FMWRIT sont concues pour prendre en compte des champs :

- reels : scalaires,1D,2D,3D,4D

- entiers : scalaires,1D,2D

- logiques et caracteres

Remarques :

1) les champs 1D ne peuvent pas etre de type 'XY'.

2) les logiques et caracteres sont forces a '-' (diffusion en lecture).

3) il est important de donner a HDIR une valeur correspondant a la categorie du champ passe en parametre, sinon le comportement du programme sera indefini (il n'y a pas de verification dans la routine)

Si vous tournez sur 1 processeur, les fmread et fmwrit focntionnent comme avant mais il faut quand meme les appeler avec un argument HDIR de 2 caracteres.

Il y a maintenant des routines pour lire directement un tableau LB (fmread_lb, fmwrit_lb). La lecture des champs LB pour l'initialisation ou les conditions aux limites est maintenat regroupee dans la routine INI_LB (de meme il existe une routine INI_LS pour les LS).

Pour les fichiers non fm faire open_ll et close_ll (mettre USE MODE_IO_ll) pas de modifications des read() et write() il faut preciser READ ou WRITE a l'ouverture de ces fichiers. Il est preferable d'utiliser open_ll meme sur un PROC mais On peut toujours utiliser des open(unit=n,...)

ATTENTION : au niveau du fonctionnement, il est imperatif de realiser l'ouverture (OPEN Fortran) entre deux appels FMATTR_ll successifs.

En effet l'exemple de codage suivant est incorrect :

CALL FMATTR_ll(HFILEM1,HFIPRI,KNUMBR1,IRESP)

CALL FMATTR_ll(HFILEM2,HFIPRI,KNUMBR2,IRESP)

OPEN(UNIT=KNUMBR1,FILE=HFILEM1)

OPEN(UNIT=KNUMBR2,FILE=HFILEM2)

car KNUMBR1 et KNUMBR2 vont avoir la meme valeur.

Le code correct est:

CALL FMATTR_ll(HFILEM1,HFIPRI,KNUMBR1,IRESP)

OPEN(UNIT=KNUMBR1,FILE=HFILEM1)

CALL FMATTR(HFILEM2,HFIPRI,KNUMBR2,IRESP)

OPEN(UNIT=KNUMBR2,FILE=HFILEM2)

Ce pb est du au fait que la determination d'une unite logique fortran libre s'effectue en regardant si une unite est connectee a un fichier (et c'est le OPEN Fortran qui etablit cette connexion).


next up previous contents
Next: 5. Data Structure Up: mainexpand Previous: 3. Interface Routines: ComLib   Contents
serveur WWW de Meso-NH
2001-11-15