;+ ; ; @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$ ; ;- ; ; 1 2 3 4 5 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 hovmoller 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