Ce format a l'avantage d'être compact et pratiquement autodescriptif (si on se limite à des grilles régulières). On retrouve a peu de choses prés les éléments qui composent un fichier bimg, mais sous une forme d'acces direct.
Chaque fichier bimg est un fichier de type binaire, 'unformatted', à accès direct. Le premier record est réservé pour une entête qui contient l'info concernant le fichier, ( en particulier la longueur en octets des records) puis à partir du record 2, les données sont stockées, 1 champs 2D/record.
Plutot q'un long
discours, je propose de de commenter un programme f77 lisant un fichier
dimg, pour expliquer le format:
PROGRAM dimg_demo_lec
IMPLICIT NONE
INTEGER jpi,jpj,jpk,jpt,jpdim
PARAMETER (jpi=100,jpj=100,jpk=20)
PARAMETER (jpt=100,jpdim=2)
C
CHARACTER*80 comment1
CHARACTER*4 cVER
C
INTEGER irecl, irec
INTEGER ni,nj,nk,nt,ndim ! Real dimension of the fields
C
REAL x1, y1, dx, dy , spval ! x1 = x of point(1,1)
C ! y1 = y of point (1,1)
C ! dx = x-grid spacing
C ! dy = y-grid spacing
C ! spval : missing/bad/masked
C ! values are supposed spval
C
REAL dep(jpk) ! array for vertical dep
REAL time(jpt) ! array for times
REAL ptab(jpi,jpj,jpk,jpt,jpdim) ! data array
C ! In application it can be
C ! only 2D (jpi,jpj)
C various
INTEGER numdimg ! logical unit for dimgfile
INTEGER ji,jj,jk,jt,jdim ! loop counter
C
CCC
CC Open file the first time with dummy record length:
CC
numdimg=10
OPEN(numdimg,FILE='dimgfile',
. FORM ='UNFORMATTED',
. ACCESS ='DIRECT',
. RECL =88)
READ(numdimg,REC=1) cVER,comment1,irecl
CLOSE(numdimg)
IF ( cVER .NE. '@!01' ) THEN
PRINT *,' This file is not DIMG file'
STOP
END IF
OPEN(numdimg,FILE='dimgfile',
. FORM ='UNFORMATTED',
. ACCESS ='DIRECT',
. RECL =irecl)
READ(numdimg,REC=1) cVER,comment1,irecl,
. ni,nj,nk,nt,ndim,
. x1,y1,dx,dy,spval,
. (dep(jk),jk=1,nk),
. (time(jt),jt=1,nt)
C
C Enter the time loop
DO jt = 1, nt
C enter vertical loop
DO jk=1,nk
C at each level, many 'dimensions' can exists e.g. u,v,w for 3d vector
DO jdim = 1,ndim
C compute record number corresponding to (jt,jk,jdim):
irec = 2 + (jt -1)*nk*ndim + (jk -1 )*ndim + (jdim -1)
C Note that the i,j loops are implicit: ! rec hold 1 2D field.
READ(numdimg,REC=irec)(( ptab(ji,jj,jk,jt,jdim),ji=1,ni),jj=1,nj)
C IF we use only 2D array, this is the place to work with the current
C 2D field at ime jt, dep jk and dim jdim ...
C
C...
C
C...
END DO
END DO
END DO
CLOSE(numdimg)
C
C Now enjoy working with ptab ...
END
Le
format dimg est donc tres simple à lire ou à écrire.
Si l'on travaille avec une grille irrégulière, on définit
cette grille dans un fichier bimg indépendant
á 1 niveau, 2 dim qui contient comme données, sur la dimension
1, les valeurs x(ji,jj) et sur la dimension 2 les valeurs y(ji,jj).