integer FUNCTION bmf_get(nom,time1,time2,i4,r4,r8,imin,imax,jmin,jmax,kmin,kmax) &
result(error)
ARGUMENTS
- nom nom de la variable
character*4
- time1 timestamp 1 (yyymmdd)
integer
- time2 timestamp2 (hhmmsscc)
integer
- i4 vecteur dest. entier
(dtyp=40)
integer
- r4 vecteur dest. réel (dtyp=41)
real
- r8 vecteur dest. réel*8
(dtyp=81)
real*8
- (ijk)min tailles inférieures du tableau destination
integer
- (ijk)max tailles supérieures du tableau de
destination integer
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):
- É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
- É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)
- É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