source: trunk/ToBeReviewed/CALCULS/hdyn.pro @ 25

Last change on this file since 25 was 25, checked in by pinsard, 18 years ago

upgrade of CALCULS according to cerbere.lodyc.jussieu.fr: /usr/home/smasson/SAXO_RD/ : files

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 6.6 KB
Line 
1;------------------------------------------------------------
2;------------------------------------------------------------
3;------------------------------------------------------------
4;+
5; NAME:hdyn
6;
7; PURPOSE:calcule la hauteur dynamique par rapport a un etat de
8; reference pour une profondeur de reference. Cf les mots cles pour
9; les differentes possibilites.
10; Par defaut l''etat de reference est
11; rho=1020 et la profondeur de reference est gdepw[ka] avec ka le
12; premier niveau W directement au dessus de 1000 m.
13;
14; CATEGORY: calculs de post-traitement
15;
16; CALLING SEQUENCE:res=hdyn(sn,tn)
17;
18; INPUTS:sn et tn sont des tableaux de meme taille representant la
19; salinite et la temperature.
20;
21; KEYWORD PARAMETERS:
22;
23;        GILL: activer cette cle si on veut faire le calcul de la
24;        hauteur dynamique comme ds le GILL page 215 cad par rapport a
25;        un etat de reference qui varie en profondeur et qui est
26;        determine par une temperature de reference tref a 0 degre et
27;        une salinite de reference sref a 35psu
28;
29;        LEVEL: C''est le niveau de reference a prendre. Ce niveau est
30;        definit tel que gdepw[level] est la profondeur de reference
31;
32;        SREF: donner une valeur a ce mot cle pour changer la salinite
33;        de reference utiliser ds le calcul lorsque GILL est active.
34;   
35;        TREF: donner une valeur a ce mot cle pour changer la temperature
36;        de reference utiliser ds le calcul lorsque GILL est active.
37;
38;        PROFREF: donner a ce mot cle une profondeur qui sera prise comme
39;        la profondeur de reference (ds ce cas LEVEL n'' a aucun
40;        effet). le calcul sera alors effectue jusqu''a cette
41;        profondeur en effectuant une interpolation entre le dernier
42;        niveau W au dessus de PROFREF et PROFREF.
43;
44;        SURFACE_LEVEL: C''est le niveau auquel on veut calculer la
45;        hauteur dynamique. Par defaut c''est le niveau 0.
46;
47; OUTPUTS:un tableau de la meme taille que sn et tn representant la
48; hauteur dynamique calculee a partir d''une profondeur de reference
49; et par rapport a un etat de reference.
50;
51; COMMON BLOCKS:
52;       common.pro
53;
54; SIDE EFFECTS:
55; les points pour lesquels on nje peut calcule la hauteur dynamique
56; (dont la batymetrie est moins profonde que la profondeur de
57; reference) sont mis a la valeur !values.f_nan
58;
59; RESTRICTIONS:approximation: la pression en decibars est egale a la
60; profondeur en metres (la pression augmente de 1bar tous les 10m)
61;
62; EXAMPLE:
63;
64; MODIFICATION HISTORY: Sebastien Masson (smasson@lodyc.jussieu.fr)
65;
66;-
67;------------------------------------------------------------
68;------------------------------------------------------------
69;------------------------------------------------------------
70FUNCTION hdyn,  tabsn, tabtn, TREF = tref,  SREF = sref, PROFREF = profref, LEVEL = level, GILL = gill, SURFACE_LEVEL = surface_level
71   tempsun = systime(1)         ; pour key_performance
72@common
73
74   if NOT keyword_set(surface_level) then surface_level = 0
75; utile si GILL est active
76   if NOT keyword_set(tref) then tref = 0.
77   if NOT keyword_set(sref) then sref = 35.
78; on determine si besoin est la profondeur de reference et le niveau
79; W situe directement au dessus.
80   if keyword_set(profref) then begin
81      rien = where(gdepw LE profref, level)
82      level = level-1
83      za = gdepw[level]
84   ENDIF ELSE BEGIN
85      if NOT keyword_set(level) then BEGIN
86         rien = where(gdepw LE 1000., level)
87         level = level-1
88      ENDIF
89      profref = gdepw[level]
90      za = profref
91   ENDELSE
92   tailles = size(tabsn)
93   taillet = size(tabtn)
94   if total(tailles[0:tailles[0]] NE taillet[0:taillet[0]]) NE 0 then $
95    return,  report('Les tableaux sn et tn doivent avoir la meme taille')
96   if tailles[3] NE jpk then return, report('La dim verticale des tableaux sn et tn doit etre egalre a jpk')
97   nx = nxt
98   ny = nyt
99   case (size(tabsn))[0] OF
100      3:BEGIN
101         case 1 of
102            tailles[1] eq jpi and tailles[2] eq jpj: BEGIN
103               sn = tabsn[firstxt:lastxt, firstyt:lastyt, *]
104               tn = tabtn[firstxt:lastxt, firstyt:lastyt, *]
105            end
106            tailles[1] eq  nx and tailles[2] eq  ny:BEGIN
107               sn = tabsn
108               tn = tabtn
109            end
110            else:return, report('Probleme d''adequation entre les tailles du domaine et de la boite.')
111         ENDCASE
112         if keyword_set(gill) then $
113          rhonref = rhon(replicate(sref,nx, ny, jpk),replicate(tref,nx, ny, jpk), /insitu) $
114         ELSE rhonref = 1020.
115         vol=(rhonref-rhon(sn,tn, /insitu))/rhonref
116         e33d = replicate(1, nx*ny)#e3t
117         e33d = reform(e33d, nx, ny, jpk, /over)
118         terre = where(tmask[firstxt:lastxt, firstyt:lastyt, *] EQ 0)
119         if terre[0] NE -1 then vol[terre] = !values.f_nan
120         case level of
121            0:hdyn =100.*(profref-gdepw[0])*vol[*, *, 0]
122            1:hdyn =100.*(vol*e33d)[*, *, 0]+(profref-gdepw[1])*vol[*, *, 1]
123            ELSE:hdyn =100.*total( (vol*e33d)[*, *, surface_level: level-1], 3) $
124             +(profref-gdepw[level])*vol[*, *, level]
125         endcase
126      END
127      4:BEGIN
128         case 1 of
129            tailles[1] eq jpi and tailles[2] eq jpj AND tailles[4] EQ jpt: BEGIN
130               sn = tabsn[firstxt:lastxt, firstyt:lastyt, *, *]
131               tn = tabtn[firstxt:lastxt, firstyt:lastyt, *, *]
132            end
133            tailles[1] eq  nx and tailles[2] eq  ny AND tailles[4] EQ jpt:BEGIN
134               sn = tabsn
135               tn = tabtn
136            end
137            else:return, report('Probleme d''adequation entre les tailles du domaine et de la boite.')
138         endcase
139         if keyword_set(gill) then $
140          rhonref = rhon(replicate(sref,nx, ny, jpk, jpt),replicate(tref,nx, ny, jpk, jpt), /insitu) $
141         ELSE rhonref = 1020.
142         vol=(rhonref-rhon(sn,tn, /insitu))/rhonref
143         e33d = replicate(1, nx*ny)#e3t
144         e33d = e33d[*]#replicate(1, jpt)
145         e33d = reform(e33d, nx, ny, jpk, jpt, /over)
146         mask = tmask[firstxt:lastxt, firstyt:lastyt, *]
147         mask = mask[*]#replicate(1, jpt)
148         terre = where(mask EQ 0)
149         if terre[0] NE -1 then vol[terre] = !values.f_nan
150         case level of
151            0:hdyn =100.*(profref-gdepw[0])*vol[*, *, 0, *]
152            1:hdyn =100.*(vol*e33d)[*, *, 0, *]+(profref-gdepw[1])*vol[*, *, 1, *]
153            ELSE:hdyn =100.*total( (vol*e33d)[*, *, surface_level: level-1, *], 3) $
154             +(profref-gdepw[level])*vol[*, *, level, *]
155         endcase
156      END
157      ELSE: return,  report('cas non code')
158   ENDCASE
159   varunit = 'cm'
160   varname = 'Dynamic Height (href='+strtrim(round(profref), 1)+'m)'
161   IF keyword_set(key_performance) THEN print, 'temps hdyn', systime(1)-tempsun
162
163   return, hdyn
164end
Note: See TracBrowser for help on using the repository browser.