BMF

(BMF_get)



integer FUNCTION bmf_get(nom,time1,time2,i4,r4,r8,imin,imax,jmin,jmax,kmin,kmax) &
result(error)

ARGUMENTS

i4 , r4 ou r8 seront donc considéré de la forme ( imin:imax , jmin:jmax , kmin:kmax ) à l'intérieur de la routine.

DESCRIPTION

Routine qui stocke dans le vecteur approprié les données lues par bmf_gobe. Si on sait à quel type de données s'attendre, on peut passer des arguments "dummy" pour les vecteurs non-essentiels.


Le tableau à l'intérieur de la sous-routine est de la forme  ( imin:imax , jmin:jmax , kmin:kmax ) où:

imin <= 1 < ni <= imax
jmin <= 1 < nj <= jmax
kmin <= 1 < nk <= kmax,

ni,nj,nk étant les attributs du champ correspondant (voir bmf_write)

Cette formulation permet de (ici, a,b >=0):

  1. Écrire un tableau avec bmf_write de (1:nx,1:ny,1:nz) et le mettre avec bmf_get dans un tableau de dimensions suffisantes
  2. Écrire un tableau de (1-a : nx+a , 1:ny , 1:nz ) avec bmf_write (appeler bmf_write avec ni = nx + 2a, istart=1, iend=nx+2a) et le lire dans un tableau de (minx: maxx , miny:maxy , minz,maxz ) avec minx <=1-a <=nx +2a <= maxx et les relations ci-haut pour y et z (appeler bmf_get avec imin=minx+a , imax= maxx+a)
  3. Écrire un tableau de (1+a : nx-b,1:ny,1:nz) (clairement 1+a < nx -b) avec un appel standard à bmf_write et une lecture dans un tableau de (minx: maxx , miny:maxy , minz,maxz ) avec un appel standard à bmf_get.



EXEMPLE

   call bmf_init
   length=bmf_gobe(filename)

! NOTE pour des raisons de performance, il serait mieux ici d'appeler une sous-routine
! avec en argument length pour dimensionner les tableaux (automatic arrays de f90) si
! le catalogue est lu souvent. NE PAS OUBLIER de faire un deallocate quand ces vecteurs
! ne seront plus nécessaires

   allocate(ni(length))
   allocate(nj(length))
   allocate(nk(length))
   allocate(dtyp(length))
   allocate(nom(length))
   allocate(time1(length))
   allocate(time2(length))
   allocate(ndata(length))
   allocate(scrap(length))
   call bmf_catalog(nom,ni,scrap,scrap,nj,scrap,scrap,nk, &
                      scrap,scrap,time1,time2,scrap,scrap,dtyp,scrap,ndata)
   trouve=.false.
   do i=1,length
      if(nom(i).eq.'HUMI') then
          trouve=.true.
          allocate(humi(ni(i),nj(i),nk(i)))
          ivar=i
      endif
      if(trouve) exit
   enddo
! Je sais que HUMI est un reel, alors je mets -1 pour i4 et r8
   err = bmf_get('HUMI',time1(ivar),time2(ivar),-1,humi,-1,1,ni(ivar),1,nj(ivar),1,nk(ivar))
   call bmf_clear   
   deallocate(ni)
   deallocate(nj)
   deallocate(nk)
   deallocate(dtyp)
   deallocate(nom)
   deallocate(time1)
   deallocate(time2)
   deallocate(ndata)
   deallocate(scrap)


VOIR AUSSI

BMF_*


Auteur: Luc Corbeil, 6 avril 2001, 12h45


Return to RPN Libraries home page