;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ ;+ ; NAME: depth2level ; ; PURPOSE: permet de passer d''un tableau 2d de profondeur au tableau ; 2d correspondant de niveaux. ; ; CATEGORY: SANS BOUCLE ; ; CALLING SEQUENCE: res=depth2level(depth2d) ; ; INPUTS: depth2d tableau 2d de profondeur (ou une structure repondant ; aux criteres de litchamp) ; ; KEYWORD PARAMETERS: ; ; /UPPER: (active par defaut) on selectionne le niveau ; directement au dessus de la profondeur ; ; /LOWER: on selectionne le niveau directement au dessous de la ; profondeur ; ; /CLOSER: on selectionne le niveau le plus proche de la ; profondeur ; ; /NOMASK: pour ne pas masquer les points terres ; ; OUTPUTS: un tableau 2d contenant les valeurs des niveaux. ; ; COMMON BLOCKS:common.pro ; ; SIDE EFFECTS:pour les profondeurs hors des valeurs de gdep, la ; valeur !values.f_nan est retournee. ; Si la profondeur est superieur a celle du fond, on retourne ; jpk-1dans le cas upper, et !values.f_nan ds le cas lower. ; ; RESTRICTIONS: ; ; EXAMPLE: ; ; MODIFICATION HISTORY: Sebastien Masson (smasson@lodyc.jussieu.fr) ; 17/6/1999 ; 15/6/2000 accepte !values.f_nan ;- ;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ FUNCTION depth2level, tab, LOWER = lower, UPPER = upper, CLOSER = closer $ , NOMASK = nomask, _extra = ex tempsun = systime(1) ; pour key_performance @common ;------------------------------------------------------------ upper = 1 if keyword_set(lower) THEN upper = 0 ;------------------------------------------------------------ ; lecture du champ d''entree et recuperation de la taille du sous ; domaine utilise ;------------------------------------------------------------ in = litchamp(tab) grille,mask,glam,gphi,gdep,nx,ny,nz,premierx,premiery,premierz,dernierx,derniery,dernierz glam = 1 gphi = 1 ;--------------------------------------------------------------- ; verification de la coherence entre la taille du tableau et le domaine definit par domdef ;--------------------------------------------------------------- IF ny EQ 1 THEN in = reform(in, nx, ny, /over) taille = size(in) if taille[0] NE 2 then return, report('le champ en entree doit contenir un tableau 2d') case 1 of taille[1] eq jpi and taille[2] eq jpj:in=in[premierx:dernierx, premiery:derniery] taille[1] eq nx and taille[2] eq ny: else:return, report('Probleme d''adequation entre les tailles du domaine et celle du champ.') endcase ;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ ; vire les points a !values.f_nan notanumber = where(finite(in, /nan) EQ 1) if notanumber[0] NE -1 then in[notanumber] = 0 ;------------------------------------------------------------ ; on transforme le tableau 2d de profondeur en tableau 2d de niveaux ; correspondant aux profondeurs ;------------------------------------------------------------ ; on passe en tableaux qui ont la taille des tableaux 3d prof=replicate(1,nx*ny)#gdep[premierz:dernierz] in = in[*]#replicate(1, nz) ; mask01 = (prof[*] LT in[*]) mask01 = reform(mask01, nx, ny, nz) levels = total(mask01, 3) notvalid = where(levels EQ nz) if keyword_set(upper) then begin levels = levels-1 notvalid = where(levels EQ 0) ENDIF ELSE notvalid = where(levels EQ nz) IF notvalid[0] NE -1 THEN levels[notvalid] = !values.f_nan ; si closer est active if keyword_set(closer) then begin test = [ [[litchamp(tab)-level2depth(levels)]] $ , [[level2depth( (levels+1)<(jpk-1) )-litchamp(tab)]] ] test = test[*, *, 0]-test[*, *, 1] changer = where(test GE 0) if changer[0] NE -1 then levels[changer] = (levels[changer]+1) < (jpk-1) endif ;------------------------------------------------------------ ; on replace les points a !values.f_nan if notanumber[0] NE -1 then levels[notanumber] = !values.f_nan ; on masque les points terres a valmask if NOT keyword_set(nomask) then begin if n_elements(valmask) EQ 0 then valmask = 1e20 terre = where(mask[*, *, 0] EQ 0) if terre[0] NE -1 then levels[terre] = valmask endif ;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ if keyword_set(key_performance) THEN print, 'temps depth2level', systime(1)-tempsun return, levels end