source: trunk/PLOTS/DIVERS/checkfield.pro @ 2

Last change on this file since 2 was 2, checked in by opalod, 22 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 17.1 KB
Line 
1;------------------------------------------------------------
2;------------------------------------------------------------
3;------------------------------------------------------------
4;+
5; NAME:checkfield
6;
7; PURPOSE:en entree de plt, pltz, pltt et plt1d, verifie que le
8; champ donne a bien une taille compatible avec le domaine et fait au
9; besoin les moyennes pour ressortir en fin de fonction un tableau 2d
10; si on fait un plot du type: 'xy', 'xz', 'xt', 'yz', 'yt', 'zt' ou un
11; tableau 1d si on fait un plot du type 'x', 'y', 'z', 't'.
12;
13; CATEGORY:en entree de plt, pltz, pltt et plt1d
14;
15; CALLING SEQUENCE:res=checkfield(field, procedure)
16;
17; INPUTS:
18;        filed: un champ recomdant aux criteres de litchamp.pro, cf.
19;        IDL>xhelp,'litchamp'
20;
21; KEYWORD PARAMETERS:
22;
23; OUTPUTS:
24;
25; COMMON BLOCKS:common.pro
26;
27; SIDE EFFECTS:
28;
29; RESTRICTIONS:
30;
31; EXAMPLE:
32;
33; MODIFICATION HISTORY:Sebastien Masson (smasson@lodyc.jussieu.fr)
34;                      08/02/2000
35;-
36;------------------------------------------------------------
37;------------------------------------------------------------
38;------------------------------------------------------------
39FUNCTION checkfield, field, procedure, TYPE = type, BOITE = boite, DIREC = direc, NOQUESTION = noquestion, VECTEUR = vecteur, _EXTRA = ex
40;--------------------------------------------------------------
41@common
42;--------------------------------------------------------------
43; I1) lecture du champ
44;--------------------------------------------------------------
45   if n_elements(field) EQ 0 then return, report('field undefined')
46   z2d = litchamp(field)
47   nan = total(finite(z2d,/nan)) < 1
48;---------------------------------------------------------------
49; redefinition du domaine
50;---------------------------------------------------------------
51   minprof = 0
52   profdefault = 200
53   if keyword_set(boite) then BEGIN
54;
55;      if n_elements(integration3d) EQ 0 THEN integration3d = n_elements(boite) ne 4
56;
57      neleboitein = N_Elements(Boite)
58      Case neleboitein Of
59         1:boite=[lon1, lon2, lat1, lat2, minprof,boite[0]]
60         2:boite=[lon1, lon2, lat1, lat2, boite[0],boite[1]]
61         4:$
62          if strpos(type, 'z') NE -1 THEN boite=[Boite, minprof, profdefault] $
63         ELSE boite=[Boite, prof1, prof2]
64         5:boite=[Boite[0:3], minprof, Boite[4]]
65         6:boite=Boite
66         Else: return, report('Mauvaise Definition de Boite')
67      ENDCASE
68   ENDIF ELSE neleboitein = 0
69; la procedure domdef determine les elements qui sont a l''interieur
70; de la boite.
71; si on fait un plot contenant l''axe z:
72; Suivant l''axe z si on veut par ex faire un dessin
73; entre 0 et 1000 il se peut que l''on selectionne les niveaux
74; correspondants aux profondeurs comprises entre 0 et 900m (vu la
75; discretisation assez lache de cet axe qd on atteint des profondeurs
76; elevees). Pour ne pas que le dessin s''arrete a 900 mais bien a
77; 1000, on va aller chercher le niveau au dessous de 1000, d''ou la
78; manip suivante sur la boite: l''approfondir de 1 niveau sur la
79; verticale (si possible) sans changer les y range.
80   if strpos(type, 'z') NE -1 THEN BEGIN
81      if NOT keyword_set(boite) then boite = 1.*[lon1,lon2,lat1,lat2,minprof, profdefault]
82      !y.range = [boite[5], boite[4]] ;on garde les yranges (axe z) avant de changer la boite.
83      profmax = boite[5]
84      if vargrid EQ 'W' then gdep = gdepw ELSE gdep = gdept
85; check with vertical grid limits (nearest level)
86      gwork = gdep
87; check the increse or decrese of the z axis
88      IF gwork[1] LE gwork[0] THEN gwork = reverse(gdep, 1)
89      niveauprof = where(gwork ge boite[5]) & niveauprof = niveauprof[0]
90      if niveauprof NE -1 then boite[5] = gwork[niveauprof]+1
91   ENDIF
92   if keyword_set(boite) then BEGIN
93      if keyword_set(vecteur) then grillechoice = [vargrid, 'T', 'U', 'V'] ELSE grillechoice = [vargrid, 'T']
94      if neleboitein LE 2 then domdef, boite, GRILLE=grillechoice ELSE domdef, boite, GRILLE=grillechoice, _extra = ex
95   ENDIF
96;--------------------------------------------------------------
97; verification de la taille du tableau d''entree et de la valeur de type
98;--------------------------------------------------------------
99   grille, mask, glam, gphi, gdep, nx, ny,nz,premierx,premiery,premierz,dernierx,derniery,dernierz
100   taille=size(z2d)
101   case taille[0] of
102;--------------------------------------------------------------
103      0:BEGIN
104         if z2d EQ -1 then $
105          return, report('Attention le tableau est egale a -1. Probleme lors de la lecture...') $
106         ELSE return, report('Attention le tableau est un scalaire')
107      END
108;--------------------------------------------------------------
109      1:BEGIN
110         nele = n_elements(z2d)
111         case type of
112            't':if jpt NE nele then $
113             return, report('jpt: '+strtrim(jpt, 1)+' n''est pas egale au nombres d''elements du vecteur: '+strtrim(nele, 1))
114            'x':BEGIN
115               case nele of
116                  jpi:z2d = z2d[premierx:dernierx]
117                  nx:
118                  ELSE:return, report('nx: '+strtrim(nx, 1)+' n''est pas egale au nombres d''elements du vecteur: '+strtrim(nele, 1))
119               endcase
120            end
121            'y':BEGIN
122               case nele of
123                  jpj:z2d = z2d[premiery:derniery]
124                  ny:
125                  ELSE:return, report('ny: '+strtrim(ny, 1)+' n''est pas egale au nombres d''elements du vecteur: '+strtrim(nele, 1))
126               endcase
127            END
128            'z':BEGIN
129               case nele of
130                  jpk:z2d = z2d[premierz:dernierz]
131                  nz:
132                  ELSE:return, report('nz: '+strtrim(nz, 1)+' n''est pas egale au nombres d''elements du vecteur: '+strtrim(nele, 1))
133               endcase
134            END
135            ELSE:return, report('imcompatibilite entre type: '+type+' et la taille du tableau 1d en entree: '+strtrim(nele, 1))
136         ENDCASE
137      END
138;--------------------------------------------------------------
139      2:BEGIN
140         case type of
141            'x':BEGIN
142               case taille[2] of
143                  ny:direc = 'y'
144                  jpj:direc = 'y'
145                  jpt:direc = 't'
146                  ELSE:return, report('imcompatibilite entre type: '+type+' et la taille du tableau 2d en entree: '+strtrim(taille[1], 1)+'*'+strtrim(taille[2], 1))
147               endcase
148            end
149            'y':BEGIN
150               case 1 of
151                  taille[1] EQ jpi OR taille[1] EQ nx:direc = 'x'
152                  taille[2] EQ jpt:direc = 't'
153                  ELSE:return, report('imcompatibilite entre type: '+type+' et la taille du tableau 2d en entree: '+strtrim(taille[1], 1)+'*'+strtrim(taille[2], 1))
154               endcase
155            END
156            'z':BEGIN
157               if taille[2] EQ jpt then direc = 't' $
158               ELSE return, report('imcompatibilite entre type: '+type+' et la taille du tableau 2d en entree: '+strtrim(taille[1], 1)+'*'+strtrim(taille[2], 1))
159            END
160            't':BEGIN
161               case 1 of
162                  taille[1] EQ jpi OR taille[1] EQ nx:BEGIN
163                     direc = 'x'
164                     timearray = 1
165                  END
166                  jpt EQ 1:BEGIN
167                     ras = report('Field average: '+strtrim(moyenne(z2d, 'xy', boite = boite, NAN = nan, _extra = ex), 1)+' in box: '+tostr(boite))
168                     return,  -1
169                  END
170                  ELSE: return, report('imcompatibilite entre type: '+type+' et la taille du tableau 2d en entree: '+strtrim(taille[1], 1)+'*'+strtrim(taille[2], 1))
171               ENDCASE
172            END
173            'xy':BEGIN
174               case 1 of
175                  taille[1] eq  nx and taille[2] eq  ny:
176                  taille[1] eq jpi and taille[2] eq jpj:z2d=z2d[premierx:dernierx, premiery:derniery]
177                  else:return, report('Probleme d''adequation entre les tailles du domaine nx*ny '+strtrim(nx, 1)+'*'+strtrim(ny, 1)+' et du tableau '+strtrim(taille[1], 1)+'*'+strtrim(taille[2], 1))
178               endcase
179               if vargrid EQ 'W' then niveau = premierzw+1 ELSE niveau = premierzt+1
180            END
181            'xz':BEGIN
182               case 1 of
183                  taille[1] eq jpi and taille[2] eq jpk:z2d = z2d[premierx:dernierx,premierz:dernierz]
184                  taille[1] eq nx and taille[2] eq jpk:z2d = z2d[*,premierz:dernierz]
185                  taille[1] eq nx and taille[2] eq nz:
186                  else:return, report('Probleme d''adequation entre les tailles du domaine nx*nz '+strtrim(nx, 1)+'*'+strtrim(nz, 1)+'et du tableau'+strtrim(taille[1], 1)+'*'+strtrim(taille[2], 1))
187               endcase
188            END
189            'yz':BEGIN
190               case 1 of
191                  taille[1] eq jpj and taille[2] eq jpk:z2d = z2d[premiery:derniery,premierz:dernierz]
192                  taille[1] eq ny and taille[2] eq jpk:z2d = z2d[*,premierz:dernierz]
193                  taille[1] eq ny and taille[2] eq nz:
194                  else:return, report('Probleme d''adequation entre les tailles du domaine ny*nz '+strtrim(ny, 1)+'*'+strtrim(nz, 1)+'et du tableau'+strtrim(taille[1], 1)+'*'+strtrim(taille[2], 1))
195               endcase
196            END
197            'xt':BEGIN
198               case 1 of
199                  taille[1] eq jpi and taille[2] eq jpt:z2d = z2d[premierx:dernierx,*]
200                  taille[1] eq nx and taille[2] eq jpt:
201                  else:return, report('Probleme d''adequation entre les tailles du domaine nx*jpt '+strtrim(nx, 1)+'*'+strtrim(jpt, 1)+'et du tableau'+strtrim(taille[1], 1)+'*'+strtrim(taille[2], 1))
202               endcase
203            END
204            'yt':BEGIN
205               case 1 of
206                  taille[1] eq jpj and taille[2] eq jpt:z2d = z2d[premiery:derniery,*]
207                  taille[1] eq ny and taille[2] eq jpt:
208                  else:return, report('Probleme d''adequation entre les tailles du domaine ny*jpt '+strtrim(ny, 1)+'*'+strtrim(jpt, 1)+'et du tableau'+strtrim(taille[1], 1)+'*'+strtrim(taille[2], 1))
209               endcase
210            END
211            'zt':BEGIN
212               case 1 of
213                  taille[1] eq jpk and taille[2] eq jpt:z2d = z2d[premierz:dernierz,*]
214                  taille[1] eq nz and taille[2] eq jpt:
215                  else:return, report('Probleme d''adequation entre les tailles du domaine nz*jpt '+strtrim(nz, 1)+'*'+strtrim(jpt, 1)+'et du tableau'+strtrim(taille[1], 1)+'*'+strtrim(taille[2], 1))
216               endcase
217            END
218         endcase
219      END
220;--------------------------------------------------------------
221      3:BEGIN
222         case type of
223            'x':BEGIN
224               case taille[3] of
225                  nz:direc = 'yz'
226                  jpk:direc = 'yz'
227                  jpt:direc = 'yt'
228                  ELSE:return, report('imcompatibilite entre type: '+type+' et la taille du tableau 3d en entree: '+strtrim(taille[1], 1)+'*'+strtrim(taille[2], 1)+'*'+strtrim(taille[3], 1))
229               endcase
230            END
231            'y':BEGIN
232               case taille [3] of
233                  nz:direc = 'xz'
234                  jpk:direc = 'xz'
235                  jpt:direc = 'xt'
236                  ELSE:return, report('imcompatibilite entre type: '+type+' et la taille du tableau 3d en entree: '+strtrim(taille[1], 1)+'*'+strtrim(taille[2], 1)+'*'+strtrim(taille[3], 1))
237               endcase
238            END
239            'z':BEGIN
240               case taille [3] of
241                  nz:direc = 'xy'
242                  jpk:direc = 'xy'
243                  ELSE:return, report('imcompatibilite entre type: '+type+' et la taille du tableau 3d en entree: '+strtrim(taille[1], 1)+'*'+strtrim(taille[2], 1)+'*'+strtrim(taille[3], 1))
244               endcase
245            END
246            't':BEGIN
247               IF jpt EQ 1 THEN BEGIN
248                  ras = report('Field average: '+strtrim(moyenne(z2d, 'xyz', boite = boite, NAN = nan, _extra = ex), 1)+' in box: '+tostr(boite))
249                  return,  -1
250               ENDIF ELSE BEGIN
251                  direc = 'xy'
252                  timearray = 1
253               ENDELSE
254            END
255            'xy':BEGIN
256               case 1 of
257                  taille[3] EQ jpt:BEGIN
258                     direc = 't'
259                     if vargrid EQ 'W' then niveau = premierzw+1 ELSE niveau = premierzt+1
260                  END
261                  taille[3] EQ nz OR taille[3] EQ jpk:BEGIN
262                     if keyword_set(boite) OR keyword_set(noquestion) then begin
263                        direc = 'z'
264                        if vargrid EQ 'W' then niveau = premierzw+1 ELSE niveau = premierzt+1
265                     ENDIF ELSE BEGIN
266                        if vargrid EQ 'W' then premierz = premierzw ELSE premierz = premierzt
267                        if NZ NE 1 then begin
268                           niveau = xquestion('Le tableau d''entree est un tableau 3d,' $
269                                              +'!C a quel niveau faut-il faire le graphique?', '1', /chkwidget)
270                           niveau = 1 > fix(niveau) < (jpk-premierz)
271                           case 1 of
272                              taille[1] EQ nx AND taille[2] EQ ny: $
273                               z2d=z2d[*, *,niveau-1]
274                              taille[1] EQ jpi AND taille[2] EQ jpj: $
275                               z2d=z2d[premierx:dernierx, premiery:derniery,niveau-1]
276                              ELSE:return, report('imcompatibilite entre type: '+type+' et la taille du tableau 3d en entree: '+strtrim(taille[1], 1)+'*'+strtrim(taille[2], 1)+'*'+strtrim(taille[3], 1))
277                           endcase
278                        ENDIF ELSE niveau = 1
279                        niveau = premierz+niveau
280                     endelse   
281                  END
282                  ELSE:return, report('imcompatibilite entre type: '+type+' et la taille du tableau 3d en entree: '+strtrim(taille[1], 1)+'*'+strtrim(taille[2], 1)+'*'+strtrim(taille[3], 1))
283               endcase
284            END
285            'xz':BEGIN
286               case 1 of
287                  (taille[2] EQ ny OR taille[2] EQ jpj) AND taille[3] EQ jpk:BEGIN
288                     z2d = z2d[*, *, premierz:dernierz]
289                     direc = 'y'
290                  END
291                  (taille[2] EQ ny OR taille[2] EQ jpj) AND taille[3] EQ nz:direc = 'y'
292                  taille[3] EQ jpt:direc = 't'
293                  ELSE:return, report('imcompatibilite entre type: '+type+' et la taille du tableau 3d en entree: '+strtrim(taille[1], 1)+'*'+strtrim(taille[2], 1)+'*'+strtrim(taille[3], 1))
294               endcase
295            END
296            'yz':BEGIN
297               case 1 of
298                  (taille[1] EQ nx OR taille[1] EQ jpi) AND taille[3] EQ jpk:BEGIN
299                     z2d = z2d[*, *, premierz:dernierz]
300                     direc = 'x'
301                  END
302                  (taille[1] EQ nx OR taille[1] EQ jpi) AND taille[3] EQ nz:direc = 'x'
303                  ELSE:return, report('imcompatibilite entre type: '+type+' et la taille du tableau 3d en entree: '+strtrim(taille[1], 1)+'*'+strtrim(taille[2], 1)+'*'+strtrim(taille[3], 1))
304               endcase
305            END
306         'xt':BEGIN & direc = 'y' & timearray = 1 & end
307         'yt':BEGIN & direc = 'x' & timearray = 1 & end
308            'zt':return, report('imcompatibilite entre type: '+type+' et la taille du tableau 3d en entree: '+strtrim(taille[1], 1)+'*'+strtrim(taille[2], 1)+'*'+strtrim(taille[3], 1))
309         ENDCASE
310      end
311;--------------------------------------------------------------
312      4:BEGIN
313         case type of
314            'x':direc = 'yzt'
315            'y':direc = 'xzt'
316            'z':direc = 'xyt'
317            't':direc = 'xyz'
318            'xy':BEGIN
319               if keyword_set(boite) OR keyword_set(noquestion) then begin
320                  if vargrid EQ 'W' then niveau = premierzw+1 ELSE niveau = premierzt+1
321                  direc = 'zt'
322               ENDIF ELSE BEGIN
323                  if vargrid EQ 'W' then premierz = premierzw ELSE premierz = premierzt
324                  if NZ NE 1 then begin
325                     niveau = xquestion('Le tableau d''entree est un tableau 4d,' $
326                                        +'!C a quel niveau faut-il faire le graphique?', '1', /chkwidget)
327                     niveau = 1 > fix(niveau) < (jpk-premierz)
328                     z2d=reform(z2d[*,*,niveau-1, *], /over)
329                  ENDIF ELSE niveau = 1
330                  niveau = premierz+niveau
331                  direc = 't'
332               ENDELSE
333            END
334            'xz':direc = 'yt'
335            'yz':direc = 'xt'
336            'xt':direc = 'yz'
337            'yt':direc = 'xz'
338            'zt':direc = 'xy'
339         endcase
340      END
341   ENDCASE
342;--------------------------------------------------------------
343   if keyword_set(direc) then begin
344      if strpos(direc, 't') NE -1 OR keyword_set(timearray) OR taille[0] EQ 4 then $
345       z2d = grossemoyenne(z2d, direc, boite = boite, NAN = nan, /nodomdef, _extra = ex) $
346      ELSE z2d = moyenne(z2d, direc, boite = boite, NAN = nan, /nodomdef, _extra = ex)
347   ENDIF
348;--------------------------------------------------------------
349;--------------------------------------------------------------
350;--------------------------------------------------------------
351;--------------------------------------------------------------
352   return, z2d
353end
Note: See TracBrowser for help on using the repository browser.