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

Last change on this file since 297 was 297, checked in by pinsard, 17 years ago

typo

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