source: trunk/CALCULS/grossemoyenne.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: 24.1 KB
Line 
1;------------------------------------------------------------
2;------------------------------------------------------------
3;------------------------------------------------------------
4;+
5; NAME: grossemoyenne
6;
7; PURPOSE:  averages a 3- or 4-d time serie field over a selected
8;           geographical area or along the time axis. For one ore more
9;           selected axes (x, y, z, t)
10;
11; CATEGORY:
12;
13; CALLING SEQUENCE: result = grossemoyenne(tab,'direc',BOITE=boite)
14;
15; INPUTS:       tab = 3 or 4d field
16;               direc ='x' 'y' 'z' 't' 'xy' 'xz' 'yz' 'xyz' 'xt' 'yt' 'zt'
17;               'xyt' 'xzt' 'yzt' or 'xyzt'
18;
19; KEYWORD PARAMETERS:
20;
21;               boite = [xmin,xmax,ymin,ymax (,(zmin,)zmax)] pour plus
22;               de detail cf domdef
23;               boite peut prendre 5 formes:
24;               [prof2], [prof1, prof2],[lon1, lon2, lat1, lat2], 
25;               [lon1, lon2, lat1, lat2, prof2],[lon1, lon2, lat1, lat2, prof1,prof2]
26;             
27;               NAN: not a number, a activer si l''on peut faire veut
28;               faire une moyenne sans tenir compte de certaines
29;               valeurs masques de tab.
30;               si les valeurs masques de tab sont la valeur consacree
31;               par IDL (!values.f_nan), il suffit de mettre /NAN.
32;               si les valeurs masques de tab on pour valeur a (a doit
33;               etre differente de 1 (correspond a nan =
34;               !values.f_nan) et de 0 (qui desactive nan).
35;               Il faut mettre NAN=a.
36;               Rq: en sorties les points de result qui sont NAN
37;               auront pour valeur a ou !values.f_nan.
38;           
39;               NODOMDEF: activer si l''on ne veut pas passer ds
40;               domdef bien que le mot cle boite soit present (comme
41;               c''est le cas qd grossemoyenne est appelee via
42;               checkfield)
43;
44;               INTEGRATION: pour faire une integrale plutot qu''une moyenne
45;           
46; OUTPUTS:
47;
48; COMMON BLOCKS:   result:un tableau
49;       common    domdef
50;
51; SIDE EFFECTS: met les valeurs correspondants a la terre a 1e20
52;
53; RESTRICTIONS:
54;
55; EXAMPLE:
56;
57; MODIFICATION HISTORY: Jerome Vialard (jv@lodyc.jussieu.fr)
58;                       2/7/98
59;                       Sebastien Masson (smasson@lodyc.jussieu.fr)
60; adaptation pour les tableaux comportants une dimension temporelle
61;                       14/8/98
62;                       15/1/98
63;                       12/3/99 adaptation pour NAN et utilisation de TEMPORARY
64;-
65;------------------------------------------------------------
66;------------------------------------------------------------
67;------------------------------------------------------------
68; PLAN DU PROGRAMME:
69;------------------------------------------------------------
70;------------------------------------------------------------
71;I) preliminaires
72;   I.1) determination des directions de moyennes d''apres direc
73;   I.2) verification de la taille du tableau d''entree
74;   I.3) obtention des facteurs d''echelles et du masque sur le sous
75;   domaine concerne par la moyenne
76;II) moyennes pour les tableaux 3d (x,y,t)
77;   II.1) verification de la coherence de la taille du tableau a
78;   moyenner
79;   II.2) renvoie sur moyenne qd une moyenne sur t est demandee
80;   II.3) differents types de moyennes possibles
81;III) moyennes pour les tableaux 4d (x,y,z,t)
82;   III.1) verification de la coherence de la taille du tableau a
83;   moyenner
84;   III.2) differents types de moyennes possibles
85;IV ) finitions
86;   IV.1) on masque les terres par une valeur a 1e+20
87;   IV.2) on remplace, quand nan ne 1, !values.f_nan par nan
88;   IV.3) on revient au sous domaine initial.
89;------------------------------------------------------------
90;------------------------------------------------------------
91;------------------------------------------------------------
92function grossemoyenne ,tab,direc,BOITE=boite, INTEGRATION=integration $
93                        , NAN = nan, NODOMDEF = nodomdef, _extra = ex
94@common
95   tempsun = systime(1)         ; pour key_performance
96;------------------------------------------------------------
97;I) preliminaires
98;------------------------------------------------------------
99   dirt = 0
100   dirx = 0
101   diry = 0
102   dirz = 0
103   dim  = 'aa'
104;------------------------------------------------------------
105; I.1) direction(s) suivants lesquelles on integre
106;------------------------------------------------------------
107   if ( strpos(direc,'t') ge 0 ) then dirt = 1
108   if ( strpos(direc,'x') ge 0 ) then dirx = 1
109   if ( strpos(direc,'y') ge 0 ) then diry = 1
110   if ( strpos(direc,'z') ge 0 ) then dirz = 1
111;------------------------------------------------------------
112; I.2) verification de la taille du tableau d'entree
113;------------------------------------------------------------
114   taille = size(tab)
115   case 1 of
116      taille[0] eq 1 :return,  report('Le tableau n''a qu''une dimension, cas non traite!')
117      taille[0] eq 2 :return,  report('Le tableau n''a qu''deux dimension, cas non traite!')
118      taille[0] eq 3 :BEGIN
119         dim = '3d'
120         if dirx eq 0 and diry eq 0 and dirt eq 0 then return, tab
121      END
122      taille[0] eq 4 :BEGIN
123         dim = '4d'
124         if dirx eq 0 and diry eq 0 and dirz eq 0 and dirt eq 0 then return, tab
125      END
126      else : return, report('Le tableau d entree doit etre a 3 ou 4 dimensions s''il ne contient pas de dim temporelle utiliser moyenne')
127   endcase
128;------------------------------------------------------------
129;   I.4) obtention des facteurs d''echelles et du masque sur le sous
130;   domaine concerne par la moyenne
131; redefinition du domaine ajuste a boite (a 6 elements)
132; ceci va nous permetre de faire les calcules que sur le sous domaine
133; comcerne par la moyenne. domdef, suivit de grille nous donne tous
134; les tableaux de la grille sur le sous domaine
135;------------------------------------------------------------
136   if keyword_set(boite) then BEGIN
137      Case 1 Of
138         N_Elements(Boite) Eq 1: bte = [lon1, lon2, lat1, lat2, 0.,boite[0]]
139         N_Elements(Boite) Eq 2: bte = [lon1, lon2, lat1, lat2, boite[0],boite[1]]
140         N_Elements(Boite) Eq 4: bte = [Boite,prof1, prof2]
141         N_Elements(Boite) Eq 5: bte = [Boite[0:3], 0, Boite[4]]
142         N_Elements(Boite) Eq 6: bte = Boite
143         Else: return, report('Mauvaise Definition de Boite')
144      endcase
145      oldboite = [lon1, lon2, lat1, lat2, prof1, prof2]
146      if NOT keyword_set(nodomdef) then domdef, bte,GRILLE=vargrid, _extra = ex
147   ENDIF
148;---------------------------------------------------------------
149; attribution du mask et des tableaux de longitude et latitude...
150;---------------------------------------------------------------
151   grille, mask, glam, gphi, gdep, nx, ny,nz,premierx,premiery,premierz, dernierx, derniery, dernierz,e1,e2,e3
152;------------------------------------------------------------
153; I.3) si dirt eq 1 on fait la moyenne temporelle et on envoie ds moyenne
154;------------------------------------------------------------
155   if dirt EQ 1 then begin
156      if dim EQ 3d then BEGIN
157      case 1 of
158         taille[1] eq jpi and taille[2] eq jpj and taille[3] eq jpt: $
159          res = tab[premierx:premierx+nx-1 $
160                    ,premiery:premiery+ny-1, *]
161         taille[1] EQ  nx and taille[2] eq  ny and taille[3] eq jpt:res=tab
162         else:return, report('Probleme d''adequation entre les tailles du domaine nx*ny*jpt '+strtrim(nx, 1)+'*'+strtrim(ny, 1)+'*'+strtrim(jpt, 1)+' et du tableau '+strtrim(taille[1], 1)+'*'+strtrim(taille[2], 1)+'*'+strtrim(taille[3], 1))
163      ENDCASE
164         divi = finite(res)
165         divi = total(temporary(divi),3, nan = keyword_set(nan))
166         notanum = where(divi EQ 0)
167         if keyword_set(integration) then begin
168            res = total(res,3, nan = nan)
169         ENDIF ELSE BEGIN
170            if keyword_set(nan) then BEGIN
171               res = total(res,3, nan = keyword_set(nan))/ (1 > divi)
172            ENDIF ELSE res = total(res,3)/(1.*taille[3])
173         ENDELSE
174      ENDIF ELSE BEGIN
175      case 1 of
176         taille[1] eq jpi and taille[2] eq jpj and taille[3] eq jpk and taille[4] eq jpt: $
177          res =tab[premierx:dernierx,premiery:derniery,premierz:dernierz, *]
178         taille[1] eq jpi and taille[2] eq jpj and taille[3] eq nz and taille[4] eq jpt: $
179          res =tab[premierx:dernierx,premiery:derniery,*, *]
180         taille[1] EQ  nx and taille[2] eq  ny and taille[3] eq nz and taille[4] eq jpt:res=tab
181         taille[1] EQ  nx and taille[2] eq  ny and taille[3] eq jpk and taille[4] eq jpt: $
182          res=tab[*, *, premierz:dernierz, *]
183         else:return, report('Probleme d''adequation entre les tailles du domaine nx*ny*nz*jpt ' $
184                             +strtrim(nx, 1)+'*'+strtrim(ny, 1)+'*'+strtrim(nz, 1)+'*' $
185                             +strtrim(jpt, 1)+' et du tableau '+strtrim(taille[1], 1)+'*' $
186                             +strtrim(taille[2], 1)+'*'+strtrim(taille[3], 1)+'*' $
187                             +strtrim(taille[4], 1))
188      endcase
189         divi = finite(res)
190         divi = total(temporary(divi),4, nan = keyword_set(nan))
191         notanum = where(divi EQ 0)
192         if keyword_set(integration) then begin
193            res = total(res,4, nan = nan)
194         ENDIF ELSE BEGIN
195            if keyword_set(nan) then begin
196               res = total(res,4, /nan)/(1 > divi)
197            ENDIF ELSE res = total(res,4)/(1.*taille[4])
198         ENDELSE
199      ENDELSE
200      if notanum[0] NE -1 then res[temporary(notanum)] = !values.f_nan
201      return,  moyenne(temporary(res), direc, BOITE = boite, NAN = nan, INTEGRATION = integration, _extra = ex)
202   endif
203;------------------------------------------------------------
204;------------------------------------------------------------
205; II) Cas serie tableaux 2d (tab3d)
206;------------------------------------------------------------
207;------------------------------------------------------------
208   if (dim eq '3d') then begin
209;---------------------------------------------------------------
210;   II.1) verification de la coherence de la taille du tableau a
211;   moyenner
212; verification de la coherence entre la taille du tableau et le
213; domaine definit par domdef
214; le tableau en entree doit avoir soit la taille du domaine total
215; (jpi,jpj,jpt) soit celle du domaine reduit (nx,ny,jpt)
216;---------------------------------------------------------------
217      case 1 of
218         taille[1] eq jpi and taille[2] eq jpj and taille[3] eq jpt: $
219          res = tab[premierx:premierx+nx-1 $
220                    ,premiery:premiery+ny-1, *]
221         taille[1] EQ  nx and taille[2] eq  ny and taille[3] eq jpt:res=tab
222         else:return, report('Probleme d''adequation entre les tailles du domaine nx*ny*jpt '+strtrim(nx, 1)+'*'+strtrim(ny, 1)+'*'+strtrim(jpt, 1)+' et du tableau '+strtrim(taille[1], 1)+'*'+strtrim(taille[2], 1)+'*'+strtrim(taille[3], 1))
223      endcase
224      if keyword_set(nan) NE 0 then BEGIN
225         if nan NE 1 then BEGIN ; si nan n''est pas !values.f_nan
226; on le met a !values.f_nan
227            if abs(nan) LT 1e6 then notanumber = where(res EQ nan) $
228            ELSE notanumber = where(abs(res) GT abs(nan)/10.)
229            if notanumber[0] NE -1 then res[temporary(notanumber)] = !values.f_nan
230         ENDIF
231      ENDIF
232;---------------------------------------------------------------
233; rq IL FAUT FAIRE ATTENTION AUX CAS OU LA DIM A MOYENNER = 1, ET
234; S'ASSURER QU'ELLE EXISTE BIEN. D'OU LES reform(...,nx,ny,...) QUI
235; PEUVENT SEMBLER INUTILE AU DEPART
236;---------------------------------------------------------------
237      if nx EQ 1 OR ny EQ 1 OR jpt EQ 1 then res=reform(res,nx,ny,jpt, /over)
238      if nx EQ 1 OR ny EQ 1 then BEGIN
239         mask =  reform(mask, nx, ny, nz, /over)
240         e1 =  reform(e1, nx, ny, /over)
241         e2 =  reform(e2, nx, ny, /over)
242      endif
243;---------------------------------------------------------------
244; II.3) differents types de moyennes
245;---------------------------------------------------------------
246      if keyword_set(nan) NE 0 then begin
247         msknan = replicate(1., nx, ny, jpt)
248         notanumber = where(finite(res) EQ 0)
249         if notanumber[0] NE -1 then msknan[temporary(notanumber)] = !values.f_nan
250      ENDIF ELSE msknan = 1
251      if nz eq jpk then mask = mask[*, *,niveau-1] ELSE mask = mask[*, *,nz-1]
252      case 1 of
253         (dirx eq 1) and (diry eq 0) : begin
254            e = temporary(e1)*temporary(mask)
255            if nx EQ 1 OR ny EQ 1 then e = reform(e, nx, ny, /over)
256            echelle = temporary(e[*])#replicate(1, jpt)
257            echelle = reform(echelle, nx, ny, jpt, /over)
258            if keyword_set(integration) then divi=1 $
259            ELSE divi = total(echelle*msknan,1, nan = nan)
260            res=total(temporary(res)*echelle,1, nan = nan)/(divi > 1.)
261            if keyword_set(nan) then begin
262               testnan = finite(temporary(msknan))+(temporary(echelle) EQ 0)
263               testnan = total(testnan,1)
264            endif
265         end
266         (dirx eq 0) and (diry eq 1) : begin
267            e = temporary(e2)*temporary(mask)
268            if nx EQ 1 OR ny EQ 1 then e = reform(e, nx, ny, /over)
269            echelle = temporary(e[*])#replicate(1, jpt)
270            echelle = reform(echelle, nx, ny, jpt, /over)
271            if keyword_set(integration) then divi=1 $
272            ELSE divi = total(echelle*msknan,2, nan = nan)
273            res=total(temporary(res)*echelle,2, nan = nan)/(divi > 1.)
274            if keyword_set(nan) then begin
275               testnan = finite(temporary(msknan))+(temporary(echelle) EQ 0)
276               testnan = total(testnan,2)
277            endif
278         end
279         (dirx eq 1) and (diry eq 1) : begin
280            echelle=(temporary(e1)*temporary(e2)*temporary(mask))[*]#replicate(1,jpt)
281            echelle=reform(echelle,nx,ny,jpt, /over)
282            if keyword_set(integration) then divi=1 $
283            ELSE divi = total(temporary(total(echelle*msknan,1, nan = nan)),1, nan = nan)
284            res = total(temporary(total(temporary(res)*echelle,1, nan=nan)),1, nan=nan)/(divi > 1.)
285            if keyword_set(nan) then begin
286               testnan = finite(temporary(msknan))+(temporary(echelle) EQ 0)
287               testnan = total(total(testnan,1),1)
288            endif
289         end
290      endcase
291   endif
292;------------------------------------------------------------
293;------------------------------------------------------------
294; III) Cas serie tableaux 3d (tab4d)
295;------------------------------------------------------------
296   if (dim eq '4d') then begin
297;---------------------------------------------------------------
298; III.1) verification de la coherence de la taille du tableau a
299; moyenner
300; verification de la coherence entre la taille du tableau et le
301; domaine definit par domdef
302; le tableau en entree doit avoir soit la taille du domaine total
303; (jpi,jpj,jpk,jpt) soit celle du domaine reduit (nx,ny,ny,jpt)
304;---------------------------------------------------------------
305      case 1 of
306         taille[1] eq jpi and taille[2] eq jpj and taille[3] eq jpk and taille[4] eq jpt: $
307          res =tab[premierx:dernierx,premiery:derniery,premierz:dernierz, *]
308         taille[1] eq jpi and taille[2] eq jpj and taille[3] eq nz and taille[4] eq jpt: $
309          res =tab[premierx:dernierx,premiery:derniery,*, *]
310         taille[1] EQ  nx and taille[2] eq  ny and taille[3] eq nz and taille[4] eq jpt:res=tab
311         taille[1] EQ  nx and taille[2] eq  ny and taille[3] eq jpk and taille[4] eq jpt: $
312          res=tab[*, *, premierz:dernierz, *]
313         else:return, report('Probleme d''adequation entre les tailles du domaine nx*ny*nz*jpt ' $
314                             +strtrim(nx, 1)+'*'+strtrim(ny, 1)+'*'+strtrim(nz, 1)+'*' $
315                             +strtrim(jpt, 1)+' et du tableau '+strtrim(taille[1], 1)+'*' $
316                             +strtrim(taille[2], 1)+'*'+strtrim(taille[3], 1)+'*' $
317                             +strtrim(taille[4], 1))
318      endcase
319      if nx EQ 1 OR ny EQ 1 OR nz EQ 1 OR jpt EQ 1 then res=reform(res,nx,ny,nz,jpt, /over)
320      if keyword_set(nan) NE 0 then BEGIN
321         if nan NE 1 then BEGIN ; si nan n''est pas !values.f_nan
322; on le met a !values.f_nan
323            if abs(nan) LT 1e6 then notanumber = where(res EQ nan) $
324            ELSE notanumber = where(abs(res) GT abs(nan)/10.)
325            if notanumber[0] NE -1 then res[temporary(notanumber)] = !values.f_nan
326         ENDIF
327      ENDIF
328;---------------------------------------------------------------
329; rq IL FAUT FAIRE ATTENTION AUX CAS OU LA DIM A MOYENNER = 1, ET
330; S'ASSURER QU'ELLE EXISTE BIEN. D'OU LES reform(...,nx,ny,...) QUI
331; PEUVENT SEMBLER INUTILE AU DEPART
332;---------------------------------------------------------------
333      if nx EQ 1 OR ny EQ 1 OR nz EQ 1 OR jpt EQ 1 then res=reform(res,nx,ny,nz,jpt, /over)
334      if nx EQ 1 OR ny EQ 1 OR nz EQ 1 then mask =  reform(mask, nx, ny, nz, /over)
335;---------------------------------------------------------------
336; III.2) differents types de moyennes
337;---------------------------------------------------------------
338      IF keyword_set(nan) NE 0 then begin
339         msknan = replicate(1., nx, ny, nz, jpt)
340         notanumber = where(finite(res) EQ 0)
341         if notanumber[0] NE -1 then msknan[temporary(notanumber)] = !values.f_nan
342      ENDIF ELSE msknan = 1
343      case 1 of
344         (dirx eq 1) and (diry eq 0) and (dirz eq 0) : begin
345            e13 = temporary(e1[*])#replicate(1.,nz)
346            e13 = reform(e13,nx,ny,nz, /over)
347            echelle = (temporary(e13)*temporary(mask))[*]#replicate(1, jpt)
348            echelle = reform(echelle, nx, ny, nz, jpt, /over)
349            if keyword_set(integration) then divi=1 $
350            ELSE begin
351               if keyword_set(nan) then divi = echelle*msknan ELSE divi = echelle
352               divi = total(temporary(divi),1, nan = nan)
353            endelse
354            res = temporary(res)*echelle
355            res = total(temporary(res),1, nan = nan)/(divi > 1)
356            if keyword_set(nan) then begin
357               testnan = finite(temporary(msknan))+(temporary(echelle) EQ 0)
358               testnan = total(testnan,1)
359            endif
360         end
361         (dirx eq 0) and (diry eq 1) and (dirz eq 0) : begin
362            e23 = temporary(e2[*])#replicate(1.,nz)
363            e23 = reform(e23,nx,ny,nz, /over)
364            echelle = (temporary(e23)*temporary(mask))[*]#replicate(1, jpt)
365            echelle = reform(echelle, nx, ny, nz, jpt, /over)
366            if keyword_set(integration) then divi=1 $
367            ELSE begin
368               if keyword_set(nan) then divi = echelle*msknan ELSE divi = echelle
369               divi = total(temporary(divi), 2, nan = nan)
370            endelse
371            res = total(temporary(res)*echelle,2, nan = nan)/(divi > 1)
372            if keyword_set(nan) then begin
373               testnan = finite(temporary(msknan))+(temporary(echelle) EQ 0)
374               testnan = total(testnan,2)
375            endif
376         end
377         (dirx eq 0) and (diry eq 0) and (dirz eq 1) : begin
378            e33 = replicate(1,1.*nx*ny)#e3
379            e33 = reform(e33,nx,ny,nz, /over)
380            echelle =(temporary(e33)*temporary(mask))[*]#replicate(1, jpt)
381            echelle = reform(echelle, nx, ny, nz, jpt, /over)
382            if keyword_set(integration) then divi=1 $
383            ELSE begin
384               if keyword_set(nan) then divi = echelle*msknan ELSE divi = echelle
385               divi = total(temporary(divi), 3, nan = nan)
386            endelse
387            res = total(temporary(res)*echelle,3, nan = nan)/(divi > 1)
388            if keyword_set(nan) then begin
389               testnan = finite(temporary(msknan))+(temporary(echelle) EQ 0)
390               testnan = total(testnan,3)
391            endif
392         end
393         (dirx eq 1) and (diry eq 1) and (dirz eq 0) : begin
394            e13 = e1[*]#replicate(1.,nz)
395            e13 = reform(e13,nx,ny,nz, /over)
396            e23 = e2[*]#replicate(1.,nz)
397            e23 = reform(e23,nx,ny,nz, /over)
398            echelle = (temporary(e13)*temporary(e23)*temporary(mask))[*]#replicate(1, jpt)
399            echelle = reform(echelle,nx,ny,nz,jpt, /over)
400            if keyword_set(integration) then divi=1 $
401            ELSE begin
402               if keyword_set(nan) then divi = echelle*msknan ELSE divi = echelle
403               divi = total(total(temporary(divi),1, nan = nan),1, nan = nan)
404            endelse
405            res =total(total(temporary(res)*echelle,1, nan = nan),1, nan = nan)/(divi > 1)
406            if keyword_set(nan) then begin
407               testnan = finite(temporary(msknan))+(temporary(echelle) EQ 0)
408               testnan = total(total(testnan,1),1)
409            endif
410         end
411         (dirx eq 1) and (diry eq 0) and (dirz eq 1) : begin
412            e133 = e1[*]#e3
413            echelle = (temporary(e133[*])*temporary(mask[*]))#replicate(1, jpt)
414            echelle = reform(echelle,nx,ny,nz,jpt, /over)
415            if keyword_set(integration) then divi=1 $
416            ELSE begin
417               if keyword_set(nan) then divi = echelle*msknan ELSE divi = echelle
418               divi = total(total(temporary(divi),1, nan = nan),2, nan = nan)
419            endelse
420            res = total(total(temporary(res)*echelle,1, nan = nan),2, nan = nan)/(divi > 1)
421            if keyword_set(nan) then begin
422               testnan = finite(temporary(msknan))+(temporary(echelle) EQ 0)
423               testnan = total(total(testnan,1),2)
424            endif
425         end
426         (dirx eq 0) and (diry eq 1) and (dirz eq 1) : begin
427            e233 = e2[*]#e3
428            echelle = (temporary(e233[*])*temporary(mask[*]))#replicate(1, jpt)
429            echelle = reform(echelle,nx,ny,nz,jpt, /over)
430            if keyword_set(integration) then divi=1 $
431            ELSE begin
432               if keyword_set(nan) then divi = echelle*msknan ELSE divi = echelle
433               divi = total(total(temporary(divi),2, nan = nan),2,nan=nan)
434            endelse
435            res =total(total(temporary(res)*echelle,2, nan = nan),2, nan = nan)/(divi > 1)
436            if keyword_set(nan) then begin
437               testnan = finite(temporary(msknan))+(temporary(echelle) EQ 0)
438               testnan = total(total(testnan,2),2)
439            endif
440         end
441         (dirx eq 1) and (diry eq 1) and (dirz eq 1) : begin
442            e1233 = (e1[*]*e2[*])#e3
443            echelle=(temporary(e1233[*])*temporary(mask[*]))#replicate(1,jpt)
444            echelle=reform(echelle,nx,ny,nz,jpt, /over)
445            if keyword_set(integration) then divi=1 $
446            ELSE begin
447               if keyword_set(nan) then divi = echelle*msknan ELSE divi = echelle
448               divi = total(total(total(temporary(divi), 1,nan=nan), 1,nan=nan), 1,nan=nan)
449            endelse
450            res =total(total(total(temporary(res)*echelle, 1,nan=nan), 1,nan=nan), 1,nan=nan)/(divi > 1)
451            if keyword_set(nan) then begin
452               testnan = finite(temporary(msknan))+(temporary(echelle) EQ 0)
453               testnan = total(total(total(testnan,1),1),1)
454            endif
455         end
456      endcase
457   endif
458;------------------------------------------------------------
459;------------------------------------------------------------
460;IV ) finitions
461;------------------------------------------------------------
462;------------------------------------------------------------
463; IV.1) on masque les terres par une valeur a 1e+20
464;------------------------------------------------------------
465   valmask = 1e+20
466   terre = where(divi EQ 0)
467   IF terre[0] NE -1 THEN BEGIN
468      res(temporary(terre)) = 1e+20
469   ENDIF
470;------------------------------------------------------------
471; IV.2) on remplace, quand nan ne 1, !values.f_nan par nan
472;------------------------------------------------------------
473   if keyword_set(nan) NE 0 then BEGIN
474      puttonan = where(temporary(testnan) EQ 0)
475      if puttonan[0] NE -1 then res[temporary(puttonan)] = !values.f_nan
476      if nan NE 1 then BEGIN
477         notanumber = where(finite(res) eq 0)
478         if notanumber[0] NE -1 then res[temporary(notanumber)] = nan
479      ENDIF
480   ENDIF
481;------------------------------------------------------------
482; IV.3) on se remplace ds le sous domaine qui etait definit a l''entree de
483; moyenne
484;------------------------------------------------------------
485   if keyword_set(boite) AND NOT keyword_set(nodomdef) then domdef, oldboite,GRILLE=vargrid
486;------------------------------------------------------------
487   if keyword_set(key_performance) THEN print, 'temps grossemoyenne', systime(1)-tempsun
488   return, res
489;------------------------------------------------------------
490;------------------------------------------------------------
491end
Note: See TracBrowser for help on using the repository browser.