Changeset 25 for trunk/ToBeReviewed/CALCULS/moyenne.pro
- Timestamp:
- 05/02/06 14:59:12 (18 years ago)
- File:
-
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/ToBeReviewed/CALCULS/moyenne.pro
r23 r25 11 11 ; CATEGORY: 12 12 ; 13 ; CALLING SEQUENCE: result = moyenne(tab,'direc',BO ITE=boite)13 ; CALLING SEQUENCE: result = moyenne(tab,'direc',BOXZOOM=boxzoom) 14 14 ; 15 15 ; INPUTS: tab = 2 or 3d field … … 18 18 ; KEYWORD PARAMETERS: 19 19 ; 20 ; BO ITE= [xmin,xmax,ymin,ymax (,(zmin,)zmax)] pour plus20 ; BOXZOOM = [xmin,xmax,ymin,ymax (,(zmin,)zmax)] pour plus 21 21 ; de detail cf domdef. 22 ; bo itepeut prendre 5 formes:23 ; [ prof2], [prof1, prof2],[lon1, lon2, lat1, lat2],24 ; [lon1, lon2, lat1, lat2, prof2],[lon1, lon2, lat1,25 ; lat2, prof1,prof2]22 ; boxzoom peut prendre 5 formes: 23 ; [vert2], [vert1, vert2],[lon1, lon2, lat1, lat2], 24 ; [lon1, lon2, lat1, lat2, vert2],[lon1, lon2, lat1, 25 ; lat2, vert1,vert2] 26 26 ; 27 27 ; NAN: not a number, a activer si l''on peut faire veut … … 38 38 ; 39 39 ; NODOMDEF: activer si l''on ne veut pas passer ds 40 ; domdef bien que le mot cle bo itesoit present (comme40 ; domdef bien que le mot cle boxzoom soit present (comme 41 41 ; c''est le cas qd moyenne est appelee via checkfield) 42 42 ; 43 43 ; INTEGRATION: pour faire une integrale plutot qu''une moyenne 44 ; 45 ; /WDEPTH: to specify that the field is at W depth instad of T 46 ; depth (automatically activated if vargrid eq 'W') 44 47 ; 45 48 ; OUTPUTS: result:un tableau … … 88 91 ;------------------------------------------------------------ 89 92 ;------------------------------------------------------------ 90 function moyenne ,tab,direc,BOITE=boite, INTEGRATION=integration $ 91 , NAN = nan, NODOMDEF = nodomdef, _extra = ex 92 @common 93 tempsun = systime(1) ; pour key_performance 93 function moyenne, tab, direc, BOXZOOM = boxzoom, INTEGRATION = integration $ 94 , NAN = nan, NODOMDEF = nodomdef, WDEPTH = wdepth $ 95 , _extra = ex 96 ;--------------------------------------------------------- 97 @cm_4mesh 98 @cm_4data 99 @cm_4cal 100 IF NOT keyword_set(key_forgetold) THEN BEGIN 101 @updatenew 102 @updatekwd 103 ENDIF 104 ;--------------------------------------------------------- 105 tempsun = systime(1) ; pour key_performance 94 106 ;------------------------------------------------------------ 95 107 ;I) preliminaires 96 108 ;------------------------------------------------------------ 97 98 99 100 109 dirt = 0 110 dirx = 0 111 diry = 0 112 dirz = 0 101 113 ;------------------------------------------------------------ 102 114 ; I.1) direction(s) suivants lesquelles on integre 103 115 ;------------------------------------------------------------ 104 if ( strpos(direc,'t') ge 0 ) then dirt = 1 105 if ( strpos(direc,'x') ge 0 ) then dirx = 1 106 if ( strpos(direc,'y') ge 0 ) then diry = 1 107 if ( strpos(direc,'z') ge 0 ) then dirz = 1 108 if (dirx eq 0 and diry eq 0 and dirz eq 0) then BEGIN 109 IF keyword_set(bavard) then $ 110 IF dirt NE 1 THEN ras = report('MOYENNE: aucune valeur de direc ne convient, le champ reste inchange') 111 return, tab 112 ENDIF 116 if ( strpos(direc, 't') ge 0 ) then dirt = 1 117 if ( strpos(direc, 'x') ge 0 ) then dirx = 1 118 if ( strpos(direc, 'y') ge 0 ) then diry = 1 119 if ( strpos(direc, 'z') ge 0 ) then dirz = 1 120 if (dirx eq 0 and diry eq 0 and dirz eq 0) then return, tab 113 121 ;------------------------------------------------------------ 114 122 ; I.2) verification de la taille du tableau d'entree 115 123 ;------------------------------------------------------------ 116 117 118 119 120 121 122 123 124 125 126 127 128 124 taille = size(tab) 125 case 1 of 126 taille[0] eq 1 :dim = '1d' 127 taille[0] eq 2 :BEGIN 128 dim = '2d' 129 if dirx eq 0 and diry eq 0 then return, tab 130 END 131 taille[0] eq 3 :BEGIN 132 dim = '3d' 133 if dirx eq 0 and diry eq 0 and dirz eq 0 then return, tab 134 END 135 else : return, report('Le tableau d''entree doit etre a 2 ou 3 dimensions s''il contient une dim temporelle utiliser grossemoyenne') 136 endcase 129 137 ;------------------------------------------------------------ 130 138 ; I.3) obtention des facteurs d''echelles et du masque sur le sous 131 139 ; domaine concerne par la moyenne 132 ; redefinition du domaine ajuste a bo ite(a 6 elements)140 ; redefinition du domaine ajuste a boxzoom (a 6 elements) 133 141 ; ceci va nous permetre de faire les calcules que sur le sous domaine 134 142 ; comcerne par la moyenne. domdef, suivit de grille nous donne tous 135 143 ; les tableaux de la grille sur le sous domaine 136 144 ;------------------------------------------------------------ 137 if keyword_set(boite) then BEGIN 138 Case 1 Of 139 N_Elements(Boite) Eq 1:bte=[lon1, lon2, lat1, lat2, 0.,boite[0]] 140 N_Elements(Boite) Eq 2:bte=[lon1, lon2, lat1, lat2, boite[0],boite[1]] 141 N_Elements(Boite) Eq 4:bte=[Boite, prof1, prof2] 142 N_Elements(Boite) Eq 5:bte=[Boite[0:3], 0, Boite[4]] 143 N_Elements(Boite) Eq 6:bte=Boite 144 Else: return, report('Mauvaise Definition de Boite') 145 endcase 146 oldboite = [lon1, lon2, lat1, lat2, prof1, prof2] 147 if NOT keyword_set(nodomdef) then domdef, bte,GRILLE=vargrid, _extra = ex 148 ENDIF 145 if keyword_set(boxzoom) then BEGIN 146 Case 1 Of 147 N_Elements(Boxzoom) Eq 1:bte = [lon1, lon2, lat1, lat2, 0., boxzoom[0]] 148 N_Elements(Boxzoom) Eq 2:bte = [lon1, lon2, lat1, lat2, boxzoom[0], boxzoom[1]] 149 N_Elements(Boxzoom) Eq 4:bte = [Boxzoom, vert1, vert2] 150 N_Elements(Boxzoom) Eq 5:bte = [Boxzoom[0:3], 0, Boxzoom[4]] 151 N_Elements(Boxzoom) Eq 6:bte = Boxzoom 152 Else: return, report('Mauvaise Definition de Boxzoom') 153 endcase 154 if NOT keyword_set(nodomdef) then BEGIN 155 savedbox = 1b 156 saveboxparam, 'boxparam4moyenne.dat' 157 domdef, bte, GRIDTYPE = vargrid, _extra = ex 158 ENDIF 159 ENDIF 149 160 ;--------------------------------------------------------------- 150 161 ; attribution du mask et des tableaux de longitude et latitude... 151 162 ;--------------------------------------------------------------- 152 grille, mask, glam, gphi, gdep, nx, ny,nz,premierx,premiery,premierz,dernierx, derniery, dernierz,e1,e2,e3 163 IF vargrid EQ 'W' THEN wdepth = 1 164 grille, mask, glam, gphi, gdep, nx, ny, nz, firstx, firsty, firstz, lastx, lasty, lastz, e1, e2, e3, WDEPTH = wdepth 153 165 ;------------------------------------------------------------ 154 166 ;------------------------------------------------------------ … … 156 168 ;------------------------------------------------------------ 157 169 ;------------------------------------------------------------ 158 if dim EQ '1d' then BEGIN 159 if n_elements(tab) NE nx*ny AND n_elements(tab) NE nx*ny*nz then $ 160 return, report('Probleme d''adequation entre les tailles du domaine et de la boite.') 161 case 1 of 162 nx EQ 1 AND ny EQ 1:BEGIN ;vecteur suivant z 163 case n_elements(tab) of 164 jpk:res = tab[premierz:dernierz] 165 nz:res = tab 166 ELSE:return, report('Probleme d''adequation entre les tailles du domaine et de la boite.') 167 ENDCASE 168 if dirz EQ 1 then BEGIN 169 dim = '3d' 170 taille = size(reform(res, nx, ny, nz)) 171 ENDIF ELSE return, res 172 END 173 ny EQ 1:BEGIN ;vecteur suivant x 174 case n_elements(tab) of 175 jpi:res = tab[premierx:dernierx] 176 nx:res = tab 177 ELSE:return, report('Probleme d''adequation entre les tailles du domaine et de la boite.') 178 ENDCASE 179 if dirx EQ 1 then BEGIN 180 dim = '2d' 181 taille = size(reform(res, nx, ny)) 182 ENDIF ELSE return, res 183 END 184 nx EQ 1:BEGIN ;vecteur suivant y 185 case n_elements(tab) of 186 jpj:res = tab[premiery:derniery] 187 ny:res = tab 188 ELSE:return, report('Probleme d''adequation entre les tailles du domaine et de la boite.') 189 ENDCASE 190 if diry EQ 1 then BEGIN 191 dim = '2d' 192 taille = size(reform(res, nx, ny)) 193 ENDIF ELSE return, res 194 END 195 endcase 196 endif 170 if dim EQ '1d' then BEGIN 171 if n_elements(tab) NE nx*ny AND n_elements(tab) NE nx*ny*nz then BEGIN 172 if keyword_set(savedbox) THEN restoreboxparam, 'boxparam4moyenne.dat' 173 return, report('Probleme d''adequation entre les tailles du domaine et de la boxzoom.') 174 ENDIF 175 case 1 of 176 nx EQ 1 AND ny EQ 1:BEGIN ;vecteur suivant z 177 case n_elements(tab) of 178 jpk:res = tab[firstz:lastz] 179 nz:res = tab 180 ELSE:BEGIN 181 if keyword_set(savedbox) THEN restoreboxparam, 'boxparam4moyenne.dat' 182 return, report('Probleme d''adequation entre les tailles du domaine et de la boxzoom.') 183 END 184 ENDCASE 185 if dirz EQ 1 then BEGIN 186 dim = '3d' 187 taille = size(reform(res, nx, ny, nz)) 188 ENDIF ELSE BEGIN 189 if keyword_set(savedbox) THEN restoreboxparam, 'boxparam4moyenne.dat' 190 return, res 191 ENDELSE 192 END 193 ny EQ 1:BEGIN ;vecteur suivant x 194 case n_elements(tab) of 195 jpi:res = tab[firstx:lastx] 196 nx:res = tab 197 ELSE:BEGIN 198 if keyword_set(savedbox) THEN restoreboxparam, 'boxparam4moyenne.dat' 199 return, report('Probleme d''adequation entre les tailles du domaine et de la boxzoom.') 200 END 201 ENDCASE 202 if dirx EQ 1 then BEGIN 203 dim = '2d' 204 taille = size(reform(res, nx, ny)) 205 ENDIF ELSE BEGIN 206 if keyword_set(savedbox) THEN restoreboxparam, 'boxparam4moyenne.dat' 207 return, res 208 ENDELSE 209 END 210 nx EQ 1:BEGIN ;vecteur suivant y 211 case n_elements(tab) of 212 jpj:res = tab[firsty:lasty] 213 ny:res = tab 214 ELSE:BEGIN 215 if keyword_set(savedbox) THEN restoreboxparam, 'boxparam4moyenne.dat' 216 return, report('Probleme d''adequation entre les tailles du domaine et de la boxzoom.') 217 END 218 ENDCASE 219 if diry EQ 1 then BEGIN 220 dim = '2d' 221 taille = size(reform(res, nx, ny)) 222 ENDIF ELSE BEGIN 223 if keyword_set(savedbox) THEN restoreboxparam, 'boxparam4moyenne.dat' 224 return, res 225 ENDELSE 226 END 227 endcase 228 endif 197 229 ;------------------------------------------------------------ 198 230 ;------------------------------------------------------------ … … 200 232 ;------------------------------------------------------------ 201 233 ;------------------------------------------------------------ 202 234 if (dim eq '2d') then begin 203 235 ;--------------------------------------------------------------- 204 236 ; II.1) verification de la coherence de la taille du tableau a … … 209 241 ; (jpi,jpj) soit celle du domaine reduit (nx,ny) 210 242 ;--------------------------------------------------------------- 211 case 1 of 212 taille[1] eq jpi and taille[2] eq jpj: $ 213 res = tab[premierx:dernierx, premiery:derniery] 214 taille[1] eq nx and taille[2] eq ny:res = tab 215 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)) 216 ENDCASE 217 if keyword_set(nan) NE 0 then BEGIN 218 if nan NE 1 then BEGIN ; si nan n''est pas !values.f_nan 243 case 1 of 244 taille[1] eq jpi and taille[2] eq jpj: $ 245 res = tab[firstx:lastx, firsty:lasty] 246 taille[1] eq nx and taille[2] eq ny:res = tab 247 else:BEGIN 248 if keyword_set(savedbox) THEN restoreboxparam, 'boxparam4moyenne.dat' 249 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)) 250 END 251 ENDCASE 252 if keyword_set(nan) NE 0 then BEGIN 253 if nan NE 1 then BEGIN ; si nan n''est pas !values.f_nan 219 254 ; on le met a !values.f_nan 220 if abs(nan) LT 1e6 then notanumber = where(res EQ nan) $ 221 ELSE notanumber = where(abs(res) GT abs(nan)/10.) 222 if notanumber[0] NE -1 then res[temporary(notanumber)] = !values.f_nan 223 ENDIF 255 if abs(nan) LT 1e6 then notanumber = where(res EQ nan) $ 256 ELSE notanumber = where(abs(res) GT abs(nan)/10.) 257 if notanumber[0] NE -1 then res[temporary(notanumber)] = !values.f_nan 224 258 ENDIF 259 ENDIF 225 260 ;--------------------------------------------------------------- 226 261 ; rq IL FAUT FAIRE ATTENTION AUX CAS OU LA DIM A MOYENNER = 1, ET … … 228 263 ; PEUVENT SEMBLER INUTILE AU DEPART 229 264 ;--------------------------------------------------------------- 230 if nx EQ 1 OR ny EQ 1 then BEGIN 231 res = reform(res, nx, ny, /over) 232 mask = reform(mask, nx, ny, nz, /over) 233 e1 = reform(e1, nx, ny, /over) 234 e2 = reform(e2, nx, ny, /over) 235 endif 265 if nx EQ 1 OR ny EQ 1 then BEGIN 266 res = reform(res, nx, ny, /over) 267 e1 = reform(e1, nx, ny, /over) 268 e2 = reform(e2, nx, ny, /over) 269 endif 270 if nx EQ 1 OR ny EQ 1 OR nz EQ 1 THEN $ 271 mask = reform(mask, nx, ny, nz, /over) 236 272 ;--------------------------------------------------------------- 237 273 ; II.3) differents types de moyennes 238 274 ;--------------------------------------------------------------- 239 if nz eq jpk then mask = mask[*, *,niveau-1] ELSE mask = mask[*, *,nz-1] 240 if keyword_set(nan) NE 0 then begin 241 msknan = replicate(1., nx, ny) 242 notanumber = where(finite(res) EQ 0) 243 if notanumber[0] NE -1 then msknan[notanumber] = !values.f_nan 244 ENDIF ELSE msknan = 1 245 case 1 of 246 (dirx eq 1) and (diry eq 0) : begin 247 e = e1*mask 248 if keyword_set(integration) then divi=1 $ 249 else begin 250 divi = e*msknan 251 if ny EQ 1 then divi = reform(divi,nx,ny, /over) 252 divi = total(divi,1, nan = nan) 253 endelse 254 res = res*e 255 if ny EQ 1 then res = reform(res,nx,ny, /over) 256 res = total(res,1, nan = nan)/(divi > 1.) 257 if keyword_set(nan) then begin 258 testnan = finite(msknan)+(1-mask) 259 if ny EQ 1 then testnan = reform(testnan,nx,ny, /over) 260 testnan = total(testnan,1) 261 endif 262 end 263 (dirx eq 0) and (diry eq 1) : begin 264 e = e2*mask 265 if keyword_set(integration) then divi=1 $ 266 else begin 267 divi = e*msknan 268 if ny EQ 1 then divi = reform(divi,nx,ny, /over) 269 divi = total(divi,2, nan = nan) 270 endelse 271 res = res*e 272 if ny EQ 1 then res = reform(res,nx,ny, /over) 273 res = total(res,2, nan = nan)/(divi > 1.) 274 if keyword_set(nan) then begin 275 testnan = finite(msknan)+(1-mask) 276 if ny EQ 1 then testnan = reform(testnan,nx,ny, /over) 277 testnan = total(testnan,2) 278 endif 279 end 280 (dirx eq 1) and (diry eq 1) : begin 281 if keyword_set(integration) then divi=1 else divi = total(e1*e2*mask*msknan, nan = nan) 282 res = total(res*e1*e2*mask, nan = nan)/(divi > 1.) 283 if keyword_set(nan) then begin 284 testnan = finite(msknan)+(1-mask) 285 testnan = total(testnan) 286 endif 287 end 288 endcase 289 endif 275 mask = mask[*, *, 0] 276 if keyword_set(nan) NE 0 then msknan = finite(res) ELSE msknan = -1 277 case 1 of 278 (dirx eq 1) and (diry eq 0) : begin 279 e = e1*mask 280 if keyword_set(integration) then divi = 1 $ 281 else begin 282 divi = e 283 IF msknan[0] NE -1 THEN divi = temporary(divi)*msknan 284 if ny EQ 1 then divi = reform(divi, nx, ny, /over) 285 divi = total(divi, 1) 286 endelse 287 res = res*e 288 if ny EQ 1 then res = reform(res, nx, ny, /over) 289 res = total(res, 1, nan = nan)/(divi > 1.) 290 if msknan[0] NE -1 then begin 291 testnan = msknan*mask 292 if ny EQ 1 then testnan = reform(testnan, nx, ny, /over) 293 testnan = total(testnan, 1)+(total(mask, 1) EQ 0) 294 endif 295 end 296 (dirx eq 0) and (diry eq 1) : begin 297 e = e2*mask 298 if keyword_set(integration) then divi = 1 $ 299 else begin 300 divi = e 301 IF msknan[0] NE -1 THEN divi = temporary(divi)*msknan 302 if ny EQ 1 then divi = reform(divi, nx, ny, /over) 303 divi = total(divi, 2) 304 endelse 305 res = res*e 306 if ny EQ 1 then res = reform(res, nx, ny, /over) 307 res = total(res, 2, nan = nan)/(divi > 1.) 308 if msknan[0] NE -1 then begin 309 testnan = msknan*mask 310 if ny EQ 1 then testnan = reform(testnan, nx, ny, /over) 311 testnan = total(testnan, 2)+(total(mask, 2) EQ 0) 312 endif 313 end 314 (dirx eq 1) and (diry eq 1) : begin 315 if keyword_set(integration) then divi = 1 else BEGIN 316 IF msknan[0] NE -1 THEN divi = total(e1*e2*mask*msknan) $ 317 ELSE divi = total(e1*e2*mask) 318 ENDELSE 319 res = total(res*e1*e2*mask, nan = nan)/(divi > 1.) 320 if msknan[0] NE -1 then begin 321 testnan = msknan*mask 322 testnan = total(testnan)+(total(mask) EQ 0) 323 endif 324 end 325 endcase 326 endif 290 327 ;------------------------------------------------------------ 291 328 ;------------------------------------------------------------ … … 293 330 ;------------------------------------------------------------ 294 331 ;------------------------------------------------------------ 295 332 if (dim eq '3d') then begin 296 333 ;--------------------------------------------------------------- 297 334 ; III.1) verification de la coherence de la taille du tableau a … … 302 339 ; (jpi,jpj,jpk) soit celle du domaine reduit (nx,ny,ny) 303 340 ;--------------------------------------------------------------- 304 case 1 of 305 taille[1] eq jpi and taille[2] eq jpj and taille[3] eq jpk: $ 306 res=tab[premierx:dernierx, premiery:derniery, premierz:dernierz] 307 taille[1] eq jpi and taille[2] eq jpj and taille[3] eq nz: $ 308 res=tab[premierx:dernierx, premiery:derniery, *] 309 taille[1] EQ nx and taille[2] eq ny and taille[3] eq nz :res=tab 310 taille[1] EQ nx and taille[2] eq ny and taille[3] eq jpk : $ 311 res=tab[*, *, premierz:dernierz] 312 else:return, report('Probleme d''adequation entre les tailles du domaine nx*ny*nz '+strtrim(nx, 1)+'*'+strtrim(ny, 1)+'*'+strtrim(nz, 1)+' et du tableau '+strtrim(taille[1], 1)+'*'+strtrim(taille[2], 1)+'*'+strtrim(taille[3], 1)) 313 endcase 314 if keyword_set(nan) NE 0 then BEGIN 315 if nan NE 1 then BEGIN ; si nan n''est pas !values.f_nan 341 case 1 of 342 taille[1] eq jpi and taille[2] eq jpj and taille[3] eq jpk: $ 343 res = tab[firstx:lastx, firsty:lasty, firstz:lastz] 344 taille[1] eq jpi and taille[2] eq jpj and taille[3] eq nz: $ 345 res = tab[firstx:lastx, firsty:lasty, *] 346 taille[1] EQ nx and taille[2] eq ny and taille[3] eq nz :res = tab 347 taille[1] EQ nx and taille[2] eq ny and taille[3] eq jpk : $ 348 res = tab[*, *, firstz:lastz] 349 else:BEGIN 350 if keyword_set(savedbox) THEN restoreboxparam, 'boxparam4moyenne.dat' 351 return, report('Probleme d''adequation entre les tailles du domaine nx*ny*nz '+strtrim(nx, 1)+'*'+strtrim(ny, 1)+'*'+strtrim(nz, 1)+' et du tableau '+strtrim(taille[1], 1)+'*'+strtrim(taille[2], 1)+'*'+strtrim(taille[3], 1)) 352 END 353 endcase 354 if keyword_set(nan) NE 0 then BEGIN 355 if nan NE 1 then BEGIN ; si nan n''est pas !values.f_nan 316 356 ; on le met a !values.f_nan 317 if abs(nan) LT 1e6 then notanumber = where(res EQ nan) $ 318 ELSE notanumber = where(abs(res) GT abs(nan)/10.) 319 if notanumber[0] NE -1 then res[temporary(notanumber)] = !values.f_nan 320 ENDIF 357 if abs(nan) LT 1e6 then notanumber = where(res EQ nan) $ 358 ELSE notanumber = where(abs(res) GT abs(nan)/10.) 359 if notanumber[0] NE -1 then res[temporary(notanumber)] = !values.f_nan 321 360 ENDIF 361 ENDIF 322 362 ;--------------------------------------------------------------- 323 363 ; rq IL FAUT FAIRE ATTENTION AUX CAS OU LA DIM A MOYENNER = 1, ET … … 325 365 ; PEUVENT SEMBLER INUTILE AU DEPART 326 366 ;--------------------------------------------------------------- 327 if nx EQ 1 OR ny EQ 1 OR nz EQ 1 then BEGIN 328 res = reform(res, nx, ny, nz, /over) 329 mask = reform(mask, nx, ny, nz, /over) 330 e1 = reform(e1, nx, ny, /over) 331 e2 = reform(e2, nx, ny, /over) 332 endif 367 if nx EQ 1 OR ny EQ 1 OR nz EQ 1 then BEGIN 368 res = reform(res, nx, ny, nz, /over) 369 e1 = reform(e1, nx, ny, /over) 370 e2 = reform(e2, nx, ny, /over) 371 endif 372 if nx EQ 1 OR ny EQ 1 OR nz EQ 1 THEN $ 373 mask = reform(mask, nx, ny, nz, /over) 374 IF keyword_set(key_partialstep) THEN BEGIN 375 ; the top of the ocean floor is 376 IF vargrid EQ 'T' OR vargrid EQ 'W' THEN bottom = total(mask, 3) $ 377 ELSE bottom = total(tmask[firstx:lastx, firsty:lasty, firstz:lastz], 3) 378 ; we suppress columns with only ocean or land 379 good = where(bottom NE 0 AND bottom NE nz) 380 ; the bottom of the ocean in 3D index is: 381 bottom = lindgen(nx*ny)+(temporary(bottom)-1L)*nx*ny 382 IF good[0] NE -1 THEN bottom = bottom[good] $ 383 ELSE bottom = -1 384 ENDIF ELSE bottom = -1 333 385 ;--------------------------------------------------------------- 334 386 ; III.2) differents types de moyennes 335 387 ;--------------------------------------------------------------- 336 if keyword_set(nan) NE 0 then begin 337 msknan = replicate(1., nx, ny, nz) 338 notanumber = where(finite(res) EQ 0) 339 if notanumber[0] NE -1 then msknan[notanumber] = !values.f_nan 340 ENDIF ELSE msknan = 1 341 case 1 of 342 (dirx eq 1) and (diry eq 0) and (dirz eq 0) : begin 343 e13 = e1[*]#replicate(1.,nz) 344 e13 = reform(e13,nx,ny,nz, /over) 345 if keyword_set(integration) then divi = 1 else begin 346 divi = e13*mask*msknan 347 if nz EQ 1 then divi = reform(divi,nx,ny,nz, /over) 348 divi = total(divi,1, nan = nan) 349 endelse 350 res = res*e13*mask 351 if nz EQ 1 then res = reform(res,nx,ny,nz, /over) 352 res = total(res,1, nan = nan)/(divi > 1.) 353 e13 = 1 354 if keyword_set(nan) then begin 355 testnan = finite(msknan)+(1-mask) 356 if nz EQ 1 then testnan = reform(testnan,nx,ny,nz, /over) 357 testnan = total(testnan,1) 358 endif 359 end 360 (dirx eq 0) and (diry eq 1) and (dirz eq 0) : begin 361 e23 = e2[*]#replicate(1.,nz) 362 e23 = reform(e23,nx,ny,nz, /over) 363 if keyword_set(integration) then divi =1 else begin 364 divi = e23*mask*msknan 365 if nz EQ 1 then divi = reform(divi,nx,ny,nz, /over) 366 divi = total(divi,2, nan = nan) 367 endelse 368 res = res*e23*mask 369 if nz EQ 1 then res = reform(res,nx,ny,nz, /over) 370 res = total(res,2, nan = nan)/(divi > 1.) 371 e23 = 1 372 if keyword_set(nan) then begin 373 testnan = finite(msknan)+(1-mask) 374 if nz EQ 1 then testnan = reform(testnan,nx,ny,nz, /over) 375 testnan = total(testnan,2) 376 endif 377 end 378 (dirx eq 0) and (diry eq 0) and (dirz eq 1) : begin 379 e33 = replicate(1,1.*nx*ny)#e3 380 e33 = reform(e33,nx,ny,nz, /over) 381 if keyword_set(integration) then divi =1 else begin 382 divi = e33*mask*msknan 383 if nz EQ 1 then divi = reform(divi,nx,ny,nz, /over) 384 divi = total(divi,3, nan = nan) 385 endelse 386 res = res*e33*mask 387 if nz EQ 1 then res = reform(res,nx,ny,nz, /over) 388 res = total(res,3, nan = nan)/(divi > 1.) 389 e33 = 1 390 if keyword_set(nan) then begin 391 testnan = finite(msknan)+(1-mask) 392 if nz EQ 1 then testnan = reform(testnan,nx,ny,nz, /over) 393 testnan = total(testnan,3) 394 endif 395 end 396 (dirx eq 1) and (diry eq 1) and (dirz eq 0) : begin 397 e123 = (e1*e2)[*]#replicate(1.,nz) 398 e123 = reform(e123,nx,ny,nz, /over) 399 if keyword_set(integration) then divi =1 else $ 400 divi = e123*mask*msknan 401 if nz EQ 1 then divi = reform(divi,nx,ny,nz, /over) 402 divi = total(total(divi,1, nan = nan),1, nan = nan) 403 res = res*e123*mask 404 if nz EQ 1 then res = reform(res,nx,ny,nz, /over) 405 res = total(total(res,1, nan = nan),1, nan = nan) / (divi > 1.) 406 e123 = 1 407 if keyword_set(nan) then begin 408 testnan = finite(msknan)+(1-mask) 409 if nz EQ 1 then testnan = reform(testnan,nx,ny,nz, /over) 410 testnan = total(total(testnan,1),1) 411 endif 412 end 413 (dirx eq 1) and (diry eq 0) and (dirz eq 1) : begin 414 e133 = e1[*]#e3 415 e133 = reform(e133,nx,ny,nz, /over) 416 divi = e133*mask*msknan 417 if nz EQ 1 then divi = reform(divi,nx,ny,nz, /over) 418 if keyword_set(integration) then divi =1 else $ 419 divi = total(total(divi,1, nan = nan),2, nan = nan) 420 res = res*e133*mask 421 if nz EQ 1 then res = reform(res,nx,ny,nz, /over) 422 res = total(total(res,1, nan = nan),2, nan = nan) / (divi > 1.) 423 e133 = 1 424 if keyword_set(nan) then begin 425 testnan = finite(msknan)+(1-mask) 426 if nz EQ 1 then testnan = reform(testnan,nx,ny,nz, /over) 427 testnan = total(total(testnan,1),2) 428 endif 429 end 430 (dirx eq 0) and (diry eq 1) and (dirz eq 1) : begin 431 e233 = e2[*]#e3 432 e233 = reform(e233,nx,ny,nz, /over) 433 divi = e233*mask*msknan 434 if nz EQ 1 then divi = reform(divi,nx,ny,nz, /over) 435 if keyword_set(integration) then divi =1 else $ 436 divi = total(total(divi,2, nan = nan),2, nan = nan) 437 res = res*e233*mask 438 if nz EQ 1 then res = reform(res,nx,ny,nz, /over) 439 res = total(total(res,2, nan = nan),2, nan = nan) / (divi > 1.) 440 e233 = 1 441 if keyword_set(nan) then begin 442 testnan = finite(msknan)+(1-mask) 443 if nz EQ 1 then testnan = reform(testnan,nx,ny,nz, /over) 444 testnan = total(total(testnan,2),2) 445 endif 446 end 447 (dirx eq 1) and (diry eq 1) and (dirz eq 1) : begin 448 e1233 = (e1*e2)[*]#e3 449 e1233 = reform(e1233,nx,ny,nz, /over) 450 if keyword_set(integration) then divi =1 else divi = total(e1233*mask*msknan, nan = nan) 451 res = total(res*e1233*mask, nan = nan) / (divi > 1.) 452 e1233 = 1 453 if keyword_set(nan) then begin 454 testnan = finite(msknan)+(1-mask) 455 testnan = total(testnan) 456 endif 457 end 458 endcase 459 endif 388 if keyword_set(nan) NE 0 then msknan = finite(res) ELSE msknan = -1 389 case 1 of 390 (dirx eq 1) and (diry eq 0) and (dirz eq 0) : begin 391 e13 = e1[*]#replicate(1., nz) 392 e13 = reform(e13, nx, ny, nz, /over) 393 IF keyword_set(key_partialstep) AND bottom[0] NE -1 $ 394 AND nx NE 1 THEN BEGIN 395 IF msknan[0] EQ -1 THEN BEGIN 396 msknan = replicate(1b, nx, ny, nz) 397 nan = 1 398 endif 399 msknan[bottom] = 0 400 res[bottom] = !values.f_nan 401 ENDIF 402 if keyword_set(integration) then divi = 1 else begin 403 divi = e13*mask 404 IF msknan[0] NE -1 THEN divi = temporary(divi)*msknan 405 if nz EQ 1 then divi = reform(divi, nx, ny, nz, /over) 406 divi = total(divi, 1) 407 ENDELSE 408 res = res*e13*mask 409 if nz EQ 1 then res = reform(res, nx, ny, nz, /over) 410 res = total(res, 1, nan = nan)/(divi > 1.) 411 e13 = 1 412 if msknan[0] NE -1 then begin 413 testnan = msknan*mask 414 if nz EQ 1 then testnan = reform(testnan, nx, ny, nz, /over) 415 testnan = total(testnan, 1)+(total(mask, 1) EQ 0) 416 endif 417 end 418 (dirx eq 0) and (diry eq 1) and (dirz eq 0) : begin 419 e23 = e2[*]#replicate(1., nz) 420 e23 = reform(e23, nx, ny, nz, /over) 421 IF keyword_set(key_partialstep) AND bottom[0] NE -1 $ 422 AND ny NE 1 THEN BEGIN 423 IF msknan[0] EQ -1 THEN BEGIN 424 msknan = replicate(1b, nx, ny, nz) 425 nan = 1 426 endif 427 msknan[bottom] = 0 428 res[bottom] = !values.f_nan 429 ENDIF 430 if keyword_set(integration) then divi = 1 else begin 431 divi = e23*mask 432 IF msknan[0] NE -1 THEN divi = temporary(divi)*msknan 433 if nz EQ 1 then divi = reform(divi, nx, ny, nz, /over) 434 divi = total(divi, 2) 435 ENDELSE 436 res = res*e23*mask 437 if nz EQ 1 then res = reform(res, nx, ny, nz, /over) 438 res = total(res, 2, nan = nan)/(divi > 1.) 439 e23 = 1 440 if msknan[0] NE -1 then begin 441 testnan = msknan*mask 442 if nz EQ 1 then testnan = reform(testnan, nx, ny, nz, /over) 443 testnan = total(testnan, 2)+(total(mask, 2) EQ 0) 444 endif 445 end 446 (dirx eq 0) and (diry eq 0) and (dirz eq 1) : begin 447 e33 = replicate(1, 1.*nx*ny)#e3 448 e33 = reform(e33, nx, ny, nz, /over) 449 IF keyword_set(key_partialstep) AND bottom[0] NE -1 THEN BEGIN 450 IF keyword_set(wdepth) THEN $ 451 e33[bottom] = (e3w_ps[firstx:lastx, firsty:lasty])[temporary(good)] $ 452 ELSE e33[bottom] = (e3t_ps[firstx:lastx, firsty:lasty])[temporary(good)] 453 ENDIF 454 if keyword_set(integration) then divi = 1 else begin 455 divi = e33*mask 456 if msknan[0] NE -1 then divi = temporary(divi)*msknan 457 if nz EQ 1 then divi = reform(divi, nx, ny, nz, /over) 458 divi = total(divi, 3) 459 ENDELSE 460 res = res*e33*mask 461 if nz EQ 1 then res = reform(res, nx, ny, nz, /over) 462 res = total(res, 3, nan = nan)/(divi > 1.) 463 e33 = 1 464 if msknan[0] NE -1 then begin 465 testnan = msknan*mask 466 if nz EQ 1 then testnan = reform(testnan, nx, ny, nz, /over) 467 testnan = total(testnan, 3)+(total(mask, 3) EQ 0) 468 endif 469 end 470 (dirx eq 1) and (diry eq 1) and (dirz eq 0) : begin 471 e123 = (e1*e2)[*]#replicate(1., nz) 472 e123 = reform(e123, nx, ny, nz, /over) 473 IF keyword_set(key_partialstep) AND bottom[0] NE -1 $ 474 AND nx*ny NE 1 THEN BEGIN 475 IF msknan[0] EQ -1 THEN BEGIN 476 msknan = replicate(1b, nx, ny, nz) 477 nan = 1 478 endif 479 msknan[bottom] = 0 480 res[bottom] = !values.f_nan 481 ENDIF 482 if keyword_set(integration) then divi = 1 else BEGIN 483 divi = e123*mask 484 IF msknan[0] NE -1 THEN divi = temporary(divi)*msknan 485 if nz EQ 1 then divi = reform(divi, nx, ny, nz, /over) 486 divi = total(total(divi, 1), 1) 487 ENDELSE 488 res = res*e123*mask 489 if nz EQ 1 then res = reform(res, nx, ny, nz, /over) 490 res = total(total(res, 1, nan = nan), 1, nan = nan) / (divi > 1.) 491 e123 = 1 492 if msknan[0] NE -1 then begin 493 testnan = msknan*mask 494 if nz EQ 1 then testnan = reform(testnan, nx, ny, nz, /over) 495 testnan = total(total(testnan, 1), 1)+(total(total(mask, 1), 1) EQ 0) 496 endif 497 end 498 (dirx eq 1) and (diry eq 0) and (dirz eq 1) : begin 499 e133 = e1[*]#e3 500 e133 = reform(e133, nx, ny, nz, /over) 501 IF keyword_set(key_partialstep) AND bottom[0] NE -1 THEN BEGIN 502 IF keyword_set(wdepth) THEN $ 503 e133[bottom] = (e1*e3w_ps[firstx:lastx, firsty:lasty])[temporary(good)] $ 504 ELSE e133[bottom] = (e1*e3t_ps[firstx:lastx, firsty:lasty])[temporary(good)] 505 ENDIF 506 if keyword_set(integration) then divi = 1 else BEGIN 507 divi = e133*mask 508 if msknan[0] NE -1 then divi = temporary(divi)*msknan 509 if nz EQ 1 then divi = reform(divi, nx, ny, nz, /over) 510 divi = total(total(divi, 1), 2) 511 ENDELSE 512 res = res*e133*mask 513 if nz EQ 1 then res = reform(res, nx, ny, nz, /over) 514 res = total(total(res, 1, nan = nan), 2, nan = nan) / (divi > 1.) 515 e133 = 1 516 if msknan[0] NE -1 then begin 517 testnan = msknan*mask 518 if nz EQ 1 then testnan = reform(testnan, nx, ny, nz, /over) 519 testnan = total(total(testnan, 1), 2)+(total(total(mask, 1), 2) EQ 0) 520 endif 521 end 522 (dirx eq 0) and (diry eq 1) and (dirz eq 1) : begin 523 e233 = e2[*]#e3 524 e233 = reform(e233, nx, ny, nz, /over) 525 IF keyword_set(key_partialstep) AND bottom[0] NE -1 THEN BEGIN 526 IF keyword_set(wdepth) THEN $ 527 e233[bottom] = (e2*e3w_ps[firstx:lastx, firsty:lasty])[temporary(good)] $ 528 ELSE e233[bottom] = (e2*e3t_ps[firstx:lastx, firsty:lasty])[temporary(good)] 529 ENDIF 530 if keyword_set(integration) then divi = 1 else BEGIN 531 divi = e233*mask 532 if msknan[0] NE -1 then divi = temporary(divi)*msknan 533 if nz EQ 1 then divi = reform(divi, nx, ny, nz, /over) 534 divi = total(total(divi, 2), 2) 535 ENDELSE 536 res = res*e233*mask 537 if nz EQ 1 then res = reform(res, nx, ny, nz, /over) 538 res = total(total(res, 2, nan = nan), 2, nan = nan) / (divi > 1.) 539 e233 = 1 540 if msknan[0] NE -1 then begin 541 testnan = msknan*mask 542 if nz EQ 1 then testnan = reform(testnan, nx, ny, nz, /over) 543 testnan = total(total(testnan, 2), 2)+(total(total(mask, 2), 2) EQ 0) 544 endif 545 end 546 (dirx eq 1) and (diry eq 1) and (dirz eq 1) : begin 547 e1233 = (e1*e2)[*]#e3 548 e1233 = reform(e1233, nx, ny, nz, /over) 549 IF keyword_set(key_partialstep) AND bottom[0] NE -1 THEN BEGIN 550 IF keyword_set(wdepth) THEN $ 551 e1233[bottom] = (e1*e2*e3w_ps[firstx:lastx, firsty:lasty])[temporary(good)] $ 552 ELSE e1233[bottom] = (e1*e2*e3t_ps[firstx:lastx, firsty:lasty])[temporary(good)] 553 ENDIF 554 if keyword_set(integration) then divi = 1 else BEGIN 555 if msknan[0] NE -1 then divi = total(e1233*mask*msknan) $ 556 ELSE divi = total(e1233*mask) 557 ENDELSE 558 res = total(res*e1233*mask, nan = nan) / (divi > 1.) 559 e1233 = 1 560 if msknan[0] NE -1 then begin 561 testnan = msknan*mask 562 testnan = total(testnan)+(total(mask) EQ 0) 563 endif 564 end 565 endcase 566 endif 460 567 ;------------------------------------------------------------ 461 568 ;------------------------------------------------------------ … … 465 572 ; IV.1) on masque les terres par une valeur a 1e+20 466 573 ;------------------------------------------------------------ 467 468 469 470 471 574 valmask = 1e+20 575 terre = where(divi EQ 0) 576 IF terre[0] NE -1 THEN BEGIN 577 res(terre) = 1e+20 578 ENDIF 472 579 ;------------------------------------------------------------ 473 580 ; IV.2) on remplace, quand nan ne 1, !values.f_nan par nan 474 581 ;------------------------------------------------------------ 475 476 477 478 479 480 481 482 582 if keyword_set(nan) NE 0 then BEGIN 583 puttonan = where(testnan EQ 0) 584 if puttonan[0] NE -1 then res[puttonan] = !values.f_nan 585 if nan NE 1 then BEGIN 586 notanumber = where(finite(res) eq 0) 587 if notanumber[0] NE -1 then res[notanumber] = nan 588 ENDIF 589 ENDIF 483 590 ;------------------------------------------------------------ 484 591 ; IV.3) on se remplace ds le sous domaine qui etait definit a l''entree de 485 592 ; moyenne 486 593 ;------------------------------------------------------------ 487 if keyword_set(boite) AND NOT keyword_set(nodomdef) then domdef, oldboite,GRILLE=vargrid488 ;------------------------------------------------------------ 489 490 594 if keyword_set(savedbox) THEN restoreboxparam, 'boxparam4moyenne.dat' 595 ;------------------------------------------------------------ 596 if keyword_set(key_performance) THEN print, 'temps moyenne', systime(1)-tempsun 597 return, res 491 598 ;------------------------------------------------------------ 492 599 ;------------------------------------------------------------
Note: See TracChangeset
for help on using the changeset viewer.