source: trunk/SRC/ToBeReviewed/CALCULS/projectondepth.pro

Last change on this file was 495, checked in by pinsard, 10 years ago

fix thanks to coding rules; typo; dupe empty lines; trailing blanks

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 3.5 KB
Line 
1;+
2;
3; @file_comments
4; Allows to project a 3d field following a depth array.
5;
6; @categories
7; Without loop
8;
9; @param ARRAYIN {type=3d array}
10; It is a 3d array whose 3rd dimension must be equal to jpk
11;
12; @param DEPTHIN {type=2d array}
13; It is a 2d array indicating for each point n, at which depth to project
14;
15; @returns
16; A 2d array which is the projection of the 3d array following depths indicated by depthin
17;
18; @uses
19; <pro>common</pro>
20;
21; @restrictions
22; points at !values.f_nan impossible calculation. Land points masked at valmask.
23;
24; @examples
25; we build a possible depths array
26;   IDL> a=gdept[jpk-1]/(1.*jpi*jpj)*findgen(jpi,jpj)
27; We build an array to project on these depths. For the test,
28; we build a 3d array whose each vector following z is the depth.
29;   IDL> arraytest=replicate(1,jpi*jpj)#gdept
30;   IDL> arraytest=reform(arraytest,jpi,jpj,jpk, /over)
31; We test the projection of the depth array on the depth...
32;   IDL> plt, 1e6*(a-projectondepth(arraytest,a)),/nocontour
33;   ->null field at 1e-6 pres
34;
35;  verification projecting the temperature of 20°C for example...
36;
37; @history
38; Sebastien Masson (smasson\@lodyc.jussieu.fr)
39;                      15/6/2000
40;
41; @version
42; $Id$
43;
44;-
45FUNCTION projectondepth, arrayin, depthin
46;
47  compile_opt idl2, strictarrsubs
48;
49   tempsun = systime(1)         ; To key_performance
50@common
51;------------------------------------------------------------
52   depth = litchamp(depthin)
53   array = litchamp(arrayin)
54; Small verifications
55   tailledepth = size(depth)
56   taillearray = size(array)
57   if tailledepth[0] NE 2 THEN return, report('Depth array must have 2 dimensions')
58   if taillearray[0] NE 3 THEN return, report('Array in must have 3 dimensions')
59; verification of the coherence between array's size and the domain
60   grille, mask, -1, -1, -1,nx,ny,nz,firstx,firsty,firstz,lastx,lasty,lastz
61   case 1 of
62      tailledepth[1] eq jpi and tailledepth[2] eq jpj:depth=depth[firstx:lastx, firsty:lasty]
63      tailledepth[1] eq  nx and tailledepth[2] eq  ny:
64      else:return, report('Probleme d''adequation entre les tailles du domaine et celle du tableau de profondeur')
65   endcase
66   case 1 OF
67      taillearray[3] NE jpk:return, report('2d array must have its 3d dimension equal to jpk')
68      taillearray[1] eq jpi and taillearray[2] eq jpj:array=array[firstx:lastx, firsty:lasty, *]
69      taillearray[1] eq  nx and taillearray[2] eq  ny:
70      else:return, report('Probleme d''adequation entre les tailles du domaine et celle du tableau de profondeur')
71   endcase
72;
73; c''est parti
74;
75   flevel = depth2floatlevel(depth)
76; we delete points at !values.f_nan
77   notanumber = where(finite(flevel, /nan) EQ 1)
78   if notanumber[0] NE -1 then flevel[notanumber] = 0
79; we sill (delete land points at valmask for example)
80   flevel = 0 > flevel < (jpk-1)
81;
82   indexup = level2index(floor(flevel))
83   indexlow = nx*ny+indexup
84   out = where(indexlow GE nx*ny*jpk-1)
85   if out[0] NE -1 then indexlow[out] = indexlow[out]-nx*ny
86;
87   weight = flevel-floor(flevel)
88   res = array[indexup]
89   res = res+weight*(array[indexlow]-res)
90;
91; We put back points at !values.f_nan
92   if notanumber[0] NE -1 then res[notanumber] = !values.f_nan
93   if out[0] NE -1 then res[out] = !values.f_nan
94; We mask land points at valmask
95   if n_elements(valmask) EQ 0 then valmask = 1e20
96   terre = where((temporary(mask))[*, *, 0] EQ 0)
97   if terre[0] NE -1 then res[terre] = valmask
98;------------------------------------------------------------
99   if keyword_set(key_performance) THEN print, 'temps projectondepth', systime(1)-tempsun
100   return, res
101end
Note: See TracBrowser for help on using the repository browser.