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

Last change on this file since 325 was 325, checked in by pinsard, 17 years ago

modification of some headers (+some corrections) to prepare usage of the new idldoc

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 3.5 KB
RevLine 
[2]1;+
2;
[142]3; @file_comments
4; Allows to project a 3d field following a depth array.
[2]5;
[142]6; @categories
[157]7; Without loop
[2]8;
[163]9; @param ARRAYIN {type=3d array}
[142]10; It is a 3d array whose 3rd dimension must be equal to jpk
[226]11;
[163]12; @param DEPTHIN {type=2d array}
[142]13; It is a 2d array indicating for each point n, at which depth to project
[226]14;
[142]15; @returns
[163]16; A 2d array which is the projection of the 3d array following depths indicated by depthin
[2]17;
[142]18; @uses
19; common.pro
[2]20;
[226]21; @restrictions
[142]22; points at !values.f_nan impossible calculation. Land points masked at valmask.
[2]23;
[142]24; @examples
[163]25; we build a possible depths array
[2]26;   IDL> a=gdept[jpk-1]/(1.*jpi*jpj)*findgen(jpi,jpj)
[163]27; We build an array to project on these depths. For the test,
[226]28; we build a 3d array whose each vector following z is the depth.
[2]29;   IDL> arraytest=replicate(1,jpi*jpj)#gdept
30;   IDL> arraytest=reform(arraytest,jpi,jpj,jpk, /over)
[142]31; We test the projection of the depth array on the depth...
[2]32;   IDL> plt, 1e6*(a-projectondepth(arraytest,a)),/nocontour
[142]33;   ->null field at 1e-6 pres
[2]34;
[226]35;  verification projecting the temperature of 20°C for example...
36;
[142]37; @history
[157]38; Sebastien Masson (smasson\@lodyc.jussieu.fr)
[2]39;                      15/6/2000
[142]40;
41; @version
42; $Id$
43;
[2]44;-
45FUNCTION projectondepth, arrayin, depthin
[114]46;
47  compile_opt idl2, strictarrsubs
48;
[142]49   tempsun = systime(1)         ; To key_performance
[2]50@common
51;------------------------------------------------------------
52   depth = litchamp(depthin)
53   array = litchamp(arrayin)
[142]54; Small verifications
[2]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')
[226]59; verification of the coherence between array's size and the domain
[25]60   grille, mask, -1, -1, -1,nx,ny,nz,firstx,firsty,firstz,lastx,lasty,lastz
[2]61   case 1 of
[25]62      tailledepth[1] eq jpi and tailledepth[2] eq jpj:depth=depth[firstx:lastx, firsty:lasty]
[2]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
[224]67      taillearray[3] NE jpk:return, report('2d array must have its 3d dimension equal to jpk')
[25]68      taillearray[1] eq jpi and taillearray[2] eq jpj:array=array[firstx:lastx, firsty:lasty, *]
[2]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)
[142]76; we delete points at !values.f_nan
[2]77   notanumber = where(finite(flevel, /nan) EQ 1)
78   if notanumber[0] NE -1 then flevel[notanumber] = 0
[142]79; we sill (delete land points at valmask for example)
[2]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;
[142]91; We put back points at !values.f_nan
[2]92   if notanumber[0] NE -1 then res[notanumber] = !values.f_nan
93   if out[0] NE -1 then res[out] = !values.f_nan
[142]94; We mask land points at valmask
[2]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;------------------------------------------------------------
[226]99   if keyword_set(key_performance) THEN print, 'temps projectondepth', systime(1)-tempsun
[2]100   return, res
101end
Note: See TracBrowser for help on using the repository browser.