Le format DIMG

Le format dimg a été développé pour le projet CLIPPER afin d'étendre le concept du format bimg à des fichiers d'acces direct, seuls utiles pour des simulations tournant sur ordinateur massivement parrallele en mémoire distribuée.

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