source: trunk/SRC/ToBeReviewed/CALCULS/depth2level.pro @ 114

Last change on this file since 114 was 114, checked in by smasson, 18 years ago

new compilation options (compile_opt idl2, strictarrsubs) in each routine

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 4.8 KB
Line 
1;------------------------------------------------------------
2;------------------------------------------------------------
3;------------------------------------------------------------
4;+
5; NAME: depth2level
6;
7; PURPOSE: permet de passer d''un tableau 2d de profondeur au tableau
8; 2d correspondant de niveaux.
9;
10; CATEGORY: SANS BOUCLE
11;
12; CALLING SEQUENCE: res=depth2level(depth2d)
13;
14; INPUTS: depth2d tableau 2d de profondeur (ou une structure repondant
15; aux criteres de litchamp)
16;
17; KEYWORD PARAMETERS:
18;
19;      /UPPER: (active par defaut) on selectionne le niveau
20;      directement au dessus de la profondeur
21;
22;      /LOWER: on selectionne le niveau directement au dessous de la
23;      profondeur
24;
25;      /CLOSER: on selectionne le niveau le plus proche de la
26;      profondeur
27;
28;      /NOMASK: pour ne pas masquer les points terres
29;
30; OUTPUTS: un tableau 2d contenant les valeurs des niveaux.
31;
32; COMMON BLOCKS:common.pro
33;
34; SIDE EFFECTS:pour les profondeurs hors des valeurs de gdep, la
35; valeur !values.f_nan est retournee.
36; Si la profondeur est superieur a celle du fond, on retourne
37; jpk-1dans le cas upper, et !values.f_nan ds le cas lower.
38;
39; RESTRICTIONS:
40;
41; EXAMPLE:
42;
43; MODIFICATION HISTORY: Sebastien Masson (smasson@lodyc.jussieu.fr)
44;                       17/6/1999
45;                       15/6/2000 accepte !values.f_nan
46;-
47;------------------------------------------------------------
48;------------------------------------------------------------
49;------------------------------------------------------------
50FUNCTION depth2level, tab, LOWER = lower, UPPER = upper, CLOSER = closer $
51                      , NOMASK = nomask, _extra = ex
52;
53  compile_opt idl2, strictarrsubs
54;
55   tempsun = systime(1)         ; pour key_performance
56@common
57;------------------------------------------------------------
58   upper = 1
59   if keyword_set(lower) THEN upper = 0
60;------------------------------------------------------------
61; lecture du champ d''entree et recuperation de la taille du sous
62; domaine utilise
63;------------------------------------------------------------
64   in = litchamp(tab)
65   grille,mask,-1,-1,gdep,nx,ny,nz,firstx,firsty,firstz,lastx,lasty,lastz
66;---------------------------------------------------------------
67; verification de la coherence entre la taille du tableau et le domaine definit par domdef
68;---------------------------------------------------------------
69   IF ny EQ 1 THEN in = reform(in, nx, ny, /over)
70   taille = size(in)
71   if taille[0] NE 2 then return, report('le champ en entree doit contenir un tableau 2d')
72   case 1 of
73      taille[1] eq jpi and taille[2] eq jpj:in=in[firstx:lastx, firsty:lasty]
74      taille[1] eq  nx and taille[2] eq  ny:
75      else:return, report('Probleme d''adequation entre les tailles du domaine et celle du champ.')
76   endcase
77;------------------------------------------------------------
78;------------------------------------------------------------
79;------------------------------------------------------------
80; vire les points a !values.f_nan
81   notanumber = where(finite(in, /nan) EQ 1)
82   if notanumber[0] NE -1 then in[notanumber] = 0
83;------------------------------------------------------------
84; on transforme le tableau 2d de profondeur en tableau 2d de niveaux
85; correspondant aux profondeurs
86;------------------------------------------------------------
87; on passe en tableaux qui ont la taille des tableaux 3d
88   prof=replicate(1,nx*ny)#gdep[firstz:lastz]
89   in = in[*]#replicate(1, nz)
90;
91   mask01 = (prof[*] LT in[*])
92   mask01 = reform(mask01, nx, ny, nz)
93   levels = total(mask01, 3)
94   notvalid = where(levels EQ nz)
95   if keyword_set(upper) then begin
96      levels = levels-1
97      notvalid = where(levels EQ -1)
98   ENDIF ELSE notvalid = where(levels EQ nz)
99   IF notvalid[0] NE -1 THEN levels[notvalid] = !values.f_nan
100
101; si closer est active
102   if keyword_set(closer) then begin
103      test = [ [[litchamp(tab)-level2depth(levels)]] $
104               , [[level2depth( (levels+1)<(jpk-1) )-litchamp(tab)]] ]
105      test = test[*, *, 0]-test[*, *, 1]
106      changer = where(test GE 0)
107      if changer[0] NE -1 then levels[changer] = (levels[changer]+1) < (jpk-1)
108   endif
109;------------------------------------------------------------
110; on replace les points a !values.f_nan
111   if notanumber[0] NE -1 then levels[notanumber] = !values.f_nan
112; on masque les points terres a valmask
113   if NOT keyword_set(nomask) then begin
114      if n_elements(valmask) EQ 0 then valmask = 1e20
115      terre = where(mask[*, *, 0] EQ 0)
116      if terre[0] NE -1 then levels[terre] = valmask
117   endif
118;------------------------------------------------------------
119;------------------------------------------------------------
120;------------------------------------------------------------
121   if keyword_set(key_performance) THEN print, 'temps depth2level', systime(1)-tempsun
122   return, levels
123end
Note: See TracBrowser for help on using the repository browser.