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

Last change on this file since 97 was 97, checked in by pinsard, 18 years ago

start to modify headers of Obsolete *.pro files for better idldoc output

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