source: trunk/SRC/Obsolete/lec.pro @ 371

Last change on this file since 371 was 371, checked in by pinsard, 16 years ago

improvements of headers (alignments of IDL prompt in examples)

  • Property svn:keywords set to Id
File size: 14.8 KB
Line 
1;+
2;
3; @file_comments
4; lit les fichiers Vairmer en sort:
5; un tableau 2d ou 3d en fonction de nomchamp qui est le nom
6; du champ a extraire (2d s'il commence par SO et 3d s'il commence par VO)
7; cette fonction modifie aussi les variables globales:
8; varname: trois lettres: nom de l'experience
9; vargrid: nom de la grille
10; vardate: date (yy)yymmdd
11; varexp: nom Vairmer du champ a tracer
12;
13; @obsolete
14;
15; @categories
16; Graphics, Reading
17;
18; @examples
19;
20;   IDL> resultat=lec('nom_Vairmer'[,date[,'nom_experience']])
21;
22; @param nomchamp {in}{required}
23; 2 choix possibles:
24;             1) nom de champ Vairmer (chaine de 8 caracteres en majuscule ou
25; minuscule commencant par vo ou so). Dans cette methode on saute directement
26; d'en-tete en en-tete jusqu'a trouver le bon fichier.
27;             2) chaine de caracteres commencant par vo ou so suivit du
28; numero de champ a aller chercher (par ex 'vo5'). Cette methode est un peu
29; plus rapide car elle va directement chercher le fichier qui nous interesse.
30;
31; @param date {in}{optional}
32; nombres de 6 ou 8 chiffres (anneemoisjour, par ex:19980507)
33;
34; @param nomexp {in}{optional}
35; trois lettres designant le nom de l'experience
36;
37;
38; @keyword ANOM {in}
39; type du fichier vairmer par rapport auquel on doit calculer
40;             l'anomalie ('EX','AN','SE','MO','')
41;
42; @keyword ECRIT {in}
43; permet d'imprimer tous les noms vairmer que contient le fichier.
44; ds ce cas en input on met seulement 'vo' ou 'so' la fonction retourne le
45; nombre de fichiers lus.
46;
47; @keyword BOITE
48;
49; @keyword EXPANOM {in}
50; si on calcule l'anom par rapport a une exper differente
51;
52; @keyword FILENAME
53; string pour passer directement le nom du champ sans
54;       utiliser les inputs: nom_Vairmer',date,'nom_experience'. Rq si
55;       ces inputs sont qd meme donnes ils ne sont pas modifies par
56;       filename.
57;
58; @keyword GRID
59; lorsque ce mot clef est active, lec retourne la liste
60;       des types de grilles (T, U...) auxquelles se rapportent les
61;       variables. ds ce cas en input on met seulement 'vo' ou 'so'.
62;
63; @keyword NAME
64; lorsque ce mot clef est active, lec retourne la liste
65;       des noms des variables. ds ce cas en input on met seulement
66;       'vo' ou 'so'.
67;
68; @keyword TOUT
69; oblige lec a lire le champ sur tout le domaine qui a
70;       etait selectionne pour la cession en cours (jpi,jpj,jpk)
71;
72; @returns
73; un tableau 2 ou 3d. sans le mot cle /TOUT, sa taille est
74; celle du sous domaine definit par <pro>domdef</pro>(nx,ny,nz). avec /TOUT le
75; champ a la taille du  domaine qui a etait selectionne pour la
76; cession en cours (jpi,jpj,jpk).
77; pour les sous domaines cf:
78;        <a href="http://www.ipsl.jussieu.fr/~smlod/sousdomaine.html">
79; Retourne -1 en cas d'erreur.
80;
81; @uses
82; <pro>common</pro>
83; <pro>isnumber</pro>
84; <pro>fivardate</pro>
85;
86; @history
87; Sebastien Masson (smasson\@lodyc.jussieu.fr)
88;                       26/5/98
89;                       Jerome Vialard : adaptation au format vairmer
90;                                        keyword anom et expanom
91;                       1/7/98
92;                       Sebastien Masson (masque des terres)
93;                       14/8/98
94;                       Sebastien Masson (decoupe pour les sous domaines...)
95;                       2/99
96;
97; @version
98; $Id$
99;
100;-
101FUNCTION lec, nomchamp,date,nomexp $
102            , ECRIT=ecrit, ANOM=anom, BOITE=boite, EXPANOM=expanom $
103            , TOUT=tout, GRID=grid, NAME=name, filename=FILENAME
104;
105  compile_opt idl2, strictarrsubs, obsolete
106;
107@common
108   tempsun = systime(1)         ; pour key_performance
109   z = -1
110;
111   if keyword_set(filename) then BEGIN
112      CASE strupcase(strmid(!version.os_family, 0, 3)) of
113         'MAC':sep = ':'
114         'WIN':sep = '\'
115         ELSE:sep = '/'
116      ENDCASE
117      fname = strmid(filename, rstrpos(filename, sep)+1)
118      if n_elements(nomchamp) EQ 0 then nomchamp = strmid(fname,6, 2)
119      if n_elements(date) EQ 0 then date = long(strmid(fname,8))
120      if n_elements(nomexp) EQ 0 then nomexp = strmid(fname,0, 3)
121   endif
122;
123   nomchamp=strupcase(nomchamp)
124   dim=string(format='(a2)',nomchamp)
125;print, 'nom de l''experience: ',nomchamp
126;------------------------------------------------------------
127; specification de la date et de l'experience
128;------------------------------------------------------------
129   case n_params() OF
130      0:BEGIN
131         if keyword_set(filename) then begin
132            rien=juldate(date)
133            prefix=nomexp
134         ENDIF ELSE return, report('Donnez un argument en entree ou utilisez le mot clef FILENAME')
135      END
136      1:date=long(day)+long(month)*100+long(year)*10000
137      2:rien=juldate(date)
138      3:begin
139         rien=juldate(date)
140         prefix=nomexp
141      end
142   endcase
143;------------------------------------------------------------
144; verification de la dim du fichier
145;------------------------------------------------------------
146   if dim ne 'SO' and dim ne 'VO' then return, report('le nom du champ doit commencer par VO ou SO')
147;------------------------------------------------------------
148;   constitution de l'adresse ou aller chercher le fichier
149;--------------------------------------------------------------
150   s_fichier=ficdate(date,dim)
151;--------------------------------------------------------------------
152; ouverture du fichier a l'adresse s_fichier
153;--------------------------------------------------------------------
154   openr, numlec, s_fichier, /get_lun,ERROR=err, /swap_if_little_endian
155   if err ne 0 then begin
156;  print,!err_string
157      return, -1
158   endif
159;taille en octet du fichier
160   infofichier=fstat(numlec)
161;---------------------------------------------------------------------
162; definition de la taille du fichier a aller chercher: jpidta,jpjdta,jpkdta...
163;---------------------------------------------------------------------
164   if n_elements(jpidta) EQ 0 THEN BEGIN
165      if n_elements(ixmindta) EQ 0 OR n_elements(ixmaxdta) EQ 0 then $
166       jpidta = jpiglo else jpidta = ixmaxdta-ixmindta+1
167   endif
168   if n_elements(jpjdta) EQ 0 THEN BEGIN
169      if n_elements(iymindta) EQ 0 OR n_elements(iymaxdta) EQ 0 then $
170       jpjdta = jpjglo else jpjdta = iymaxdta-iymindta+1
171   endif
172   if n_elements(jpkdta) EQ 0 THEN BEGIN
173      if n_elements(izmindta) EQ 0 OR n_elements(izmaxdta) EQ 0 then $
174       jpkdta = jpkglo else jpkdta = izmaxdta-izmindta+1
175   endif
176;---------------------------------------------------------------------
177; lecture des champs directement vers le champ ou l'en-tete que l'on recherche
178; il faut savoir que:
179;  le fortran ajoute au debut et a la fin de chaque write 4 octets de controle
180;  les reels du model sont codes sur 4 octets
181;  un caractere fait 1 octet
182;-----------------------------------------------------------------------
183;4 chaines de 8 caracteres+un tableau de reels+4 trucs de controle (pour les
184; 2 write):
185   if dim eq 'VO' then $
186    taillebloc=4*8+long(jpidta)*jpjdta*jpkdta*4+4*4 else $
187    taillebloc=4*8+long(jpidta)*jpjdta*4+4*4
188;---------------------------------------------------------------------
189; choix du type de lecture
190;---------------------------------------------------------------------
191   typelec=strmid(nomchamp,2,strlen(nomchamp))
192   test=isnumber(typelec,numerochamp)
193   if test eq 0 then begin
194;--------------------------------------------------------------------
195; 1) LECTURE DIRECTE D'EN-TETE en EN-TETE
196;--------------------------------------------------------------------
197      numerochamp=1
198;---------------------------------------------------------------------
199; lecture des noms de champ
200;---------------------------------------------------------------------
201      resname = ''
202      resgrid = ''
203      while numerochamp*taillebloc le infofichier.size do begin
204         offset=(numerochamp-1)*taillebloc+4
205         a=assoc(numlec,bytarr(8,/nozero), offset)
206         varname=string(a[0])
207         if keyword_set(ecrit) OR keyword_set(name) OR keyword_set(grid) $
208          then begin
209            vargrid=a[1]
210            vargrid=string(vargrid[7])
211            vardate=strtrim(long(string(a[2])), 2)
212            varexp=strtrim(a[3], 2)
213            if keyword_set(ecrit) THEN $
214             print, numerochamp,' ',varname,' ',vargrid,' ',vardate,' ',varexp
215            resname = [resname, varname]
216            resgrid = [resgrid, vargrid]
217         endif
218         if nomchamp eq varname then begin
219            vargrid=a[1]
220            vargrid=string(vargrid[7])
221            vardate=strtrim(long(string(a[2])), 2)
222            varexp=strtrim(a[3], 2)
223            goto,sortieboucle
224         endif
225         numerochamp=numerochamp+1
226      ENDWHILE
227      free_lun,numlec
228      close, numlec
229      case 1 of
230         keyword_set(ecrit):return, numerochamp-1
231         keyword_set(name):return, resname[1:numerochamp-1]
232         keyword_set(grid):$
233          return, strmid(resgrid[1:numerochamp-1],0 > (strlen(resgrid[0])-2))
234         ELSE:return, report('Ce nom Vairmer de champ n''existe pas ds le fichier: '+infofichier.name)
235      endcase
236   endif else begin
237;----------------------------------------------------------------------
238; 2) LECTURE DIRECTEMENT DU CHAMP QUE L'ON VEUT
239;---------------------------------------------------------------------
240;---------------------------------------------------------------------
241; test pour savoir si numero de champ est accessible
242;---------------------------------------------------------------------
243      if taillebloc*numerochamp gt infofichier.size then $
244       return, report('Ce numero de champ n''existe pas. Le fichier '+infofichier.name+' ne contient que ',infofichier.size/taillebloc,' champs.')
245;---------------------------------------------------------------------
246; lecture de l'en-tete numero numerochamp
247;---------------------------------------------------------------------
248      offset=(numerochamp-1)*taillebloc+4
249      a=assoc(numlec,bytarr(8,/nozero), offset)
250      varname=string(a[0])
251      vargrid=a[1]
252      vargrid=string(vargrid[7])
253      vardate=string(a[2])
254      varexp=string(a[3])
255   endelse
256sortieboucle:
257;---------------------------------------------------------------------
258; lecture du champ lui-meme
259;---------------------------------------------------------------------
260   offset=(numerochamp-1)*taillebloc+(8+4*8)+4
261   if dim eq 'VO' then $
262    a=assoc(numlec,fltarr(jpidta,jpjdta,jpkdta,/nozero), offset) else $
263    a=assoc(numlec,fltarr(jpidta,jpjdta,/nozero), offset)
264   z=a[0]
265;---------------------------------------------------------------------
266; on initialise les ixmindta, iymindta  au besoin
267;---------------------------------------------------------------------
268   if n_elements(ixmindta) EQ 0 OR n_elements(ixmaxdta) EQ 0 then BEGIN
269      ixmindta = 0
270      ixmaxdta = jpidta-1
271   endif
272   if n_elements(iymindta) EQ 0 OR n_elements(iymaxdta) EQ 0 then BEGIN
273      iymindta = 0
274      iymaxdta = jpjdta-1
275   endif
276   if n_elements(izmin) EQ 0 OR n_elements(izmax) EQ 0 then BEGIN
277      izmindta = 0
278      izmaxdta = jpkdta-1
279   endif
280;---------------------------------------------------------------------
281; on reduit z selon les valeurs de ixmindta, iymindta, ...
282;---------------------------------------------------------------------
283   if dim EQ 'SO' then z = z[ixminmesh-ixmindta:ixmaxmesh-ixmindta $
284                             ,iyminmesh-iymindta:iymaxmesh-iymindta] $
285   ELSE z = z[ixminmesh-ixmindta:ixmaxmesh-ixmindta $
286              , iyminmesh-iymindta:iymaxmesh-iymindta, izminmesh-izmindta:izmaxmesh-izmindta]
287;---------------------------------------------------------------------
288; on shift z si key_shift est defini
289;---------------------------------------------------------------------
290   if n_elements(key_shift) NE 0 THEN BEGIN
291      if dim EQ 'SO' then z = shift(z,key_shift, 0) $
292      ELSE z = shift(z,key_shift, 0, 0)
293   endif
294;---------------------------------------------------------------------
295;  si /TOUT n''est pas active, on coupe z pour qu''il soit a la taille
296;  du zoom: nx,ny nz
297;---------------------------------------------------------------------
298   if NOT keyword_set(tout) then BEGIN
299;-------------------------------------------------------------
300; changement de domaine
301;-------------------------------------------------------------
302      if keyword_set(boite) then BEGIN
303         Case 1 Of
304            N_Elements(Boite) Eq 1:bte=[lon1, lon2, lat1, lat2, 0.,boite[0]]
305            N_Elements(Boite) Eq 2:bte=[lon1, lon2, lat1, lat2, boite[0],boite[1]]
306            N_Elements(Boite) Eq 4:bte=[Boite, prof1, prof2]
307            N_Elements(Boite) Eq 5:bte=[Boite[0:3], 0, Boite[4]]
308            N_Elements(Boite) Eq 6:bte=Boite
309            Else: return, report('Mauvaise Definition de Boite')
310         endcase
311         oldboite = [lon1, lon2, lat1, lat2, prof1, prof2]
312         domdef, bte,GRILLE=vargrid
313      ENDIF
314;-------------------------------------------------------------
315      grille,mask,glam,gphi,gdep,nx,ny,nz,premierx,premiery,premierz,dernierx,derniery,dernierz
316      if nx EQ 1 OR ny EQ 1 OR nz EQ 1 then mask = reform(mask, nx, ny, nz, /over)
317      if dim EQ 'SO' then z = z[premierx:dernierx, premiery:derniery]  $
318      ELSE z = z[premierx:dernierx, premiery:derniery, premierz:dernierz]
319   ENDIF ELSE BEGIN
320      case vargrid OF           ; on recupere le mask en entier ds le cas ou /TOUT
321         'U':mask = umask()     ; n''est pas active et on le choisit en fonction
322         'T':mask = tmask       ;  de la valeur de vargrid
323         'W':mask = tmask
324         'V':mask = vmask()
325         'F':mask = fmask()
326      ENDCASE
327   ENDELSE
328;---------------------------------------------------------------------
329; calcul d'une anomalie si le keyword anom est active
330;---------------------------------------------------------------------
331   if keyword_set(anom) then begin
332      case anom of
333         'EX' : adate = 0
334         'AN' : adate = floor(date/10000)*10000
335         'SE' : adate = floor(date - floor(date/10000)*10000)/100 * 100
336         'MO' : adate = floor(date/100)*100
337         'DA' : adate = date - floor(date/10000)*10000
338         ''   : adate = date - floor(date/10000)*10000
339         else : return, report('Anom doit etre egal a EX,AN,SE,MO,DA ')
340      endcase
341      if keyword_set(expanom) then nomexpa = expanom $
342      else nomexpa = nomexp
343      if keyword_set(bavard) THEN print, nomchamp,' - ',adate,' - ',nomexpa
344      z = z - lec(nomchamp,adate,nomexpa, TOUT = tout)
345   endif
346;---------------------------------------------------------------------
347; on masque les terres par valmask
348;---------------------------------------------------------------------
349   IF n_elements(valmask) EQ 0 THEN valmask = 1e20
350   if dim EQ 'SO' then BEGIN
351      terre = where(mask[*,*,0] EQ 0)
352      if terre[0] NE -1 then z[terre] = valmask
353   ENDIF ELSE BEGIN
354      terre = where(mask[*,*,0] EQ 0)
355      if terre[0] NE -1 then z[where(mask EQ 0)] = valmask
356   ENDELSE
357;---------------------------------------------------------------------
358   free_lun,numlec
359   close, numlec
360;---------------------------------------------------------------------
361   if n_elements(oldboite) NE 0 then domdef,  oldboite
362   IF keyword_set(key_performance) EQ 1 THEN print, 'temps lec', systime(1)-tempsun
363;
364   return,reform(z)
365
366end
367
Note: See TracBrowser for help on using the repository browser.