;+
;
; @file_comments
; lit les fichiers Vairmer de date1 a date2 et en sort un tableau
; 1D, 2D ou 3D qui peut etre reutilise pour une courbe / hov / animation
; cette fonction modifie aussi les variables globales:
; varname: huit lettres: nom Vairmer du champ a tracer
; vargrid:1 lettre : nom de la grille
; varexp: trois lettres :nom de l'experience
;
; @obsolete
;
; @categories
; Graphics, Reading
;
; @examples
;
; IDL> resultat=lec('nom_Vairmer',date1,date2,'nomexp','direc',BOITE=boite)
;
; @param nomchamp {in}{required}
; nom de champ Vairmer (chaine de 8 caracteres commencant par VO ou SO
;
; @param date1 {in}{required}
; date de depart de la serie temporelle a extraire
;
; @param date2 {in}{required}
; date de fin de la serie temporelle a extraire
;
; @param nomexp {in}{required} {default=prefix}
; nom de l'experience a lire
;
; @param direc {in}{required}
; 'x' 'y' 'z' 'xy' 'xz' 'yz' 'xyz' 'xt' 'yt' 'zt' 'xyt' 'xzt'
; 'yzt' 'xyzt' directions selon lesquelles effectuer les moyennes
; (si rien n'est donne on n'effectue pas de moyenne)
;
; @keyword BOITE {in}
; boite sur laquelle integrer (par defaut tout le domaine)
;
; @keyword ANOM {in}
; type de fichiers ('SE','AN','') a relire pour calc une anomalie
;
; @keyword EXPANOM {in}
; experience pour laquelle on veut calculer une anomalie
; par defaut la meme que nomexp
;
; @uses
; common
; vraidate
; juldate
;
; @history
; Jerome Vialard (jv\@lodyc.jussieu.fr)
; 2/7/98
;
; @version
; $Id$
;
;-
function lect, nomchamp,date1,date2,nomexp,direc,BOITE=boite, $
ANOM=anom,EXPANOM=expanom
;,REPEAT=repeat
;
compile_opt idl2, strictarrsubs, obsolete
;
@common
tempsun = systime(1) ; pour key_performance
;
nomchamp = strupcase(nomchamp)
date1=vraidate(date1)
date2=vraidate(date2)
;
dim=string(format='(a2)',nomchamp)
;
;------------------------------------------------------------
; specification de la date et de l'experience
;------------------------------------------------------------
;
if fictype(date1) ne fictype(date2) then $
return, report('Les deux dates doivent correspondre au meme type de fic vairmer')
fictyp = fictype(date1)
;-------------------------------------------------------------
; creation du nom du fichier
;-------------------------------------------------------------
if n_elements(nomexp) EQ 0 then nomexp = prefix
ficname=iodir+nomchamp+'.'+strcompress(date1,/remove_all)
ficname=ficname +'-'+fictyp+'-'+strcompress(date2,/remove_all)+'.'+nomexp
if (keyword_set(anom)) then ficname=ficname +'.'+anom
if (keyword_set(expanom)) then ficname=ficname +'-'+expanom
case n_elements(boite) of
4 : box = strcompress(string(format='(i4,"_",i4,"_",i4,"_",i4)',boite) $
,/remove_all)
6 : box = strcompress(string(format='(i4,"_",i4,"_",i4,"_",i4,"_",i4,"_",i4)',boite),/remove_all)
else: box= strcompress(string(format='(i4,"_",i4,"_",i4,"_",i4,"_",i4,"_",i4)',[lon1,lon2,lat1,lat2,prof1,prof2]),/remove_all)
ENDCASE
if n_elements(direc) EQ 0 then direc = ''
ficname=ficname+'.'+box+'.'+direc+'.hovdat'
;-------------------------------------------------------------
; Est ce que le fichier de hovmoeller existe ?
;-------------------------------------------------------------
;
; structure du fichier :
; jpt (valeur de la dim temporelle), dimtableau (dimension du tableau)
; dimttab[0], dimttab[1], ... (valeur des dim )
; time (axe des tps), ttab (tableau a lire)
; def du domaine (lon1,lon2,... ,prof1,prof2)
;
get_lun, numlec
openr, numlec, ficname, /get_lun,ERROR=err, /swap_if_little_endian
if (err eq 0) then begin
jpt = long(1)
dimtableau = long(1)
readu, numlec, jpt,dimtableau
case dimtableau of
1 : begin
n1 = long(1)
readu, numlec,n1
ttab = fltarr(n1)
end
2 : begin
n1 = long(1)
n2 = long(1)
readu, numlec,n1,n2
ttab = fltarr(n1,n2)
end
3 : begin
n1 = long(1)
n2 = long(1)
n3 = long(1)
readu, numlec,n1,n2,n3
ttab = fltarr(n1,n2,n3)
end
endcase
time = lonarr(jpt)
; lecture axe des tps et du tableau
readu, numlec,time, ttab
newboite = fltarr(6)
; lecture du domaine
readu, numlec,newboite
domdef, newboite
; lecture info complementaire : nom du champs, de l'experience
varname='aaaaaaaa'
readu, numlec, varname
vargrid='a'
readu, numlec, vargrid
varexp='aaa'
readu, numlec, varexp
;
close, numlec
free_lun, numlec
return, ttab
ENDIF
close, numlec
free_lun, numlec
;-------------------------------------------------------------
; changement de domaine
;-------------------------------------------------------------
if keyword_set(boite) then BEGIN
Case 1 Of
N_Elements(Boite) Eq 1:bte=[lon1, lon2, lat1, lat2, 0.,boite[0]]
N_Elements(Boite) Eq 2:bte=[lon1, lon2, lat1, lat2, boite[0],boite[1]]
N_Elements(Boite) Eq 4:bte=[Boite, prof1, prof2]
N_Elements(Boite) Eq 5:bte=[Boite[0:3], 0, Boite[4]]
N_Elements(Boite) Eq 6:bte=Boite
Else: return, report('Mauvaise Definition de Boite')
endcase
oldboite = [lon1, lon2, lat1, lat2, prof1, prof2]
domdef, bte
ENDIF
;-------------------------------------------------------------
; Boucle de lecture des fichiers
;-------------------------------------------------------------
case fictyp of
'DA' : dec = 0.
'MO' : dec = 14.
'SE' : dec = 14.
'AN' : dec = 182.
endcase
;initialisation des variables associees au tps
time = lonarr(jptmax)
jpt = 0
vdat = date1
; debut de la boucle
while (vdat le date2) do begin
;---------------------------------------------------------------
; lecture du fichier a la date vdat (vairmer)
;---------------------------------------------------------------
tab = lec(nomchamp,vdat,nomexp,ANOM=anom,EXPANOM=expanom)
;---------------------------------------------------------------
; attribution du mask et des tableaux de longitude et latitude...
;---------------------------------------------------------------
if jpt EQ 0 THEN grille, mask, glam, gphi, gdep, nx, ny,nz,premierx,premiery,premierz,dernierx, derniery, dernierz
;---------------------------------------------------------------
if (n_elements(tab) eq 1 and tab[0] eq -1) then begin
goto, incrdate
endif else begin
jpt = jpt + 1
if (jpt gt jptmax) then return, report('lect : augmenter jptmax')
endelse
;--------------------------------------------------------
; Moyenne du champs tab
;--------------------------------------------------------
IF n_params() EQ 5 THEN if direc NE '' then BEGIN
if nx EQ 1 OR ny EQ 1 OR nz EQ 1 THEN BEGIN
if string(format='(a2)',nomchamp) EQ 'SO' then tab = reform(tab, nx, ny, /over) $
ELSE tab = reform(tab, nx, ny, nz, /over)
ENDIF
tab = moyenne(tab,direc)
endif
if (jpt eq 1) then begin
ttab = tab
endif else BEGIN
ttab = colle(ttab, tab, (size(tab))[0]+1 )
endelse
time[jpt-1] = juldate(vdat)+dec
;--------------------------------------------------------
; Incrementation de la date
;--------------------------------------------------------
incrdate :
case fictyp of
'DA' : caldat,juldate(vdat)+1,month,day,year
'MO' : begin
caldat,julday(month,1,year)+jourdsmois(),month,day,year
day=0
end
'SE' : month=month+1
'AN' : year=year+1
endcase
;------------------------------------------------------------
; Fin de boucle de lecture des fichiers
;------------------------------------------------------------
vdat=long(10000)*year+long(100)*month+day
ENDWHILE
if ttab[0] EQ -1 then return, report('Aucun fichier n''a ete lu!')
;------------------------------------------------------------
; Ecriture du fichier
;------------------------------------------------------------
get_lun, numlec
openw, numlec, ficname, /get_lun, /swap_if_little_endian
taille = size(ttab)
writeu, numlec, long(jpt),long(taille[0])
case taille[0] of
1 : writeu, numlec,long(taille[1])
2 : writeu, numlec,long(taille[1]),long(taille[2])
3 : writeu, numlec,long(taille[1]),long(taille[2]),long(taille[3])
endcase
writeu, numlec,long(time[0:jpt-1]), ttab
writeu, numlec,float([lon1, lon2, lat1, lat2, prof1, prof2])
; ecriture info complementaire : nom du champs, de l'experience
writeu, numlec, strmid(varname,0,8)
writeu, numlec, strmid(vargrid,0,1)
writeu, numlec, strmid(varexp,0,3)
;
close, numlec
free_lun, numlec
;-------------------------------------------------------
;if keyword_set(repeat) then begin
; jpt = jpt * repeat
; if (jpt gt jptmax) then begin
; print, 'lect : augmenter jptmax'
; goto, fini
; endif
; tabadd = ttab
; ti
;endif
;--------------------------------------------------------
if n_elements(oldboite) NE 0 then domdef, oldboite
;
close, /all
;
IF keyword_set(key_performance) THEN print, 'temps lect', systime(1)-tempsun
;
return, ttab
end