source: trunk/SRC/ToBeReviewed/CALCULS/rhon.pro @ 159

Last change on this file since 159 was 142, checked in by navarro, 18 years ago

english and nicer header (2a)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 4.7 KB
Line 
1;+
2   ;;
3   ;; Calcul de la fonction d'etat (issue de eos.F)
4   ;;
5   ;; Creation : 1997 / G. Roullet
6   ;; adaptation pour les tableaux z,zt,xyz,xyzt
7   ;; par seb.
8   ;;
9;
10; @todo seb
11;
12;-
13FUNCTION rhon, sn, tn, INSITU = insitu, SIGMA_N = sigma_n
14;
15  compile_opt idl2, strictarrsubs
16;
17@common
18   tempsun = systime(1)         ; pour key_performance
19      sn = -1e5 > double(sn) < 1e5
20      tn = -1e5 > double(tn) < 1e5
21
22
23      IF keyword_set(sigma_n) then insitu = 1
24
25   taille = size(sn)
26   case taille[0] of
27      0:BEGIN                   ;z
28         zrhop=0d
29         jkmax = 1
30      END
31      1:BEGIN                   ;z
32         zrhop=dblarr(taille[1])
33         jkmax = taille[1]
34      END
35      2:BEGIN                   ;xy (jpt=1) ou zt
36         zrhop=dblarr(taille[1],taille[2])
37         if jpt EQ 1 then jkmax = 1 ELSE jkmax = taille[1]
38      END
39      3:BEGIN                   ;xyz (jpt=1) ou xyt
40         zrhop=dblarr(taille[1],taille[2],taille[3])
41         if jpt EQ 1 then jkmax = taille[3] ELSE jkmax = 1
42      END
43      4:BEGIN                   ;xyzt
44         zrhop=dblarr(taille[1],taille[2],taille[3],taille[4] )
45         jkmax = taille[3]
46      END
47   endcase
48   
49
50
51   FOR jk = 0, jkmax-1 DO BEGIN
52
53      case taille[0] of
54         0:BEGIN                ;z
55            ztt = tn
56            zs = sn
57         END
58         1:BEGIN                ;z
59            ztt = tn[jk]
60            zs = sn[jk]
61         END
62         2:BEGIN                ;xy (jpt=1) ou zt
63            if jpt EQ 1 then begin
64               ztt = tn
65               zs = sn
66            ENDIF ELSE BEGIN
67               ztt = tn[jk, *]
68               zs = sn[jk, *]
69            ENDELSE
70         END
71         3:BEGIN                ;xyz (jpt=1) ou xyt
72            if jpt EQ 1 then begin
73               ztt = tn[*, *, jk]
74               zs = sn[*, *,jk]
75            endif ELSE BEGIN
76               ztt = tn
77               zs = sn
78            ENDELSE
79         END
80         4:BEGIN                ;xyzt
81            ztt = tn[*, *, jk, *]
82            zs = sn[*, *,jk, *]
83         END
84      endcase
85      if n_elements(sigma_n) NE 0 then zh = 1000.*sigma_n ELSE zh = gdept[jk]
86; ...   square root salinity
87      zsr= sqrt(abs(zs))
88; ...   compute density pure water at atm pressure
89      zr1=((((6.536332e-9*ztt-1.120083e-6)*ztt+1.001685e-4)*ztt-9.095290e-3)*ztt+6.793952e-2)*ztt+999.842594
90; ...   seawater density atm pressure
91      zr2= (((5.3875e-9*ztt-8.2467e-7)*ztt+7.6438e-5)*ztt-4.0899e-3)*ztt+0.824493
92      zr3= (-1.6546e-6*ztt+1.0227e-4)*ztt-5.72466e-3
93      zr4= 4.8314e-4
94;
95; ...   potential density (reference to the surface)
96      case taille[0] of
97         0: zrhop    = (zr4*zs + zr3*zsr + zr2)*zs + zr1
98         1: zrhop[jk]= (zr4*zs + zr3*zsr + zr2)*zs + zr1
99         2:BEGIN
100            if jpt EQ 1 then zrhop = (zr4*zs + zr3*zsr + zr2)*zs + zr1 $
101            ELSE zrhop[jk, *]= (zr4*zs + zr3*zsr + zr2)*zs + zr1
102         END
103         3:BEGIN
104            if jpt EQ 1 then zrhop[*, *,jk]= (zr4*zs + zr3*zsr + zr2)*zs + zr1 $
105             ELSE zrhop = (zr4*zs + zr3*zsr + zr2)*zs + zr1
106         END
107         4: zrhop[*, *,jk, *]= (zr4*zs + zr3*zsr + zr2)*zs + zr1
108      endcase
109
110      IF n_elements(insitu) EQ 1 THEN BEGIN
111; ...   add the compression terms
112         ze = (-3.508914e-8*ztt-1.248266e-8)*ztt-2.595994e-6
113         zbw= ( 1.296821e-6*ztt-5.782165e-9)*ztt+1.045941e-4
114         zb = zbw + ze * zs
115;
116         zd = -2.042967e-2
117         zc = (-7.267926e-5*ztt+2.598241e-3)*ztt+0.1571896
118         zaw = ((5.939910e-6*ztt+2.512549e-3)*ztt-0.1028859)*ztt -4.721788
119         za = ( zd*zsr + zc)*zs + zaw
120;
121         zb1= (-0.1909078*ztt+7.390729)*ztt-55.87545
122         za1= ((2.326469e-3*ztt+1.553190)*ztt-65.00517)*ztt+1044.077
123         zkw= (((-1.361629e-4*ztt-1.852732e-2)*ztt-30.41638)*ztt+2098.925)*ztt+190925.6
124         zk0= (zb1*zsr + za1)*zs + zkw
125;
126; ...   masked in situ density
127         case taille[0] of
128            0: zrhop = zrhop / (1.0-zh/(zk0-zh*(za-zh*zb)))
129            1: zrhop[jk] = zrhop[jk] / (1.0-zh/(zk0-zh*(za-zh*zb)))
130            2:BEGIN
131               if jpt EQ 1 then zrhop = zrhop / (1.0-zh/(zk0-zh*(za-zh*zb))) $
132               ELSE zrhop[jk, *] = zrhop[jk, *] / (1.0-zh/(zk0-zh*(za-zh*zb)))
133            END
134            3:BEGIN
135               if jpt EQ 1 then zrhop[*, *,jk] = zrhop[*, *,jk] / (1.0-zh/(zk0-zh*(za-zh*zb))) $
136               ELSE zrhop = zrhop / (1.0-zh/(zk0-zh*(za-zh*zb)))
137            END
138            4: zrhop[*, *,jk, *] = zrhop[*, *,jk, *] / (1.0-zh/(zk0-zh*(za-zh*zb)))
139         endcase
140         
141      ENDIF
142   ENDFOR
143   
144   terre = where(tn GE 1e6)
145   if terre[0] NE -1 then zrhop[terre] = valmask
146
147   if keyword_set(key_performance) THEN print, 'temps rhon', systime(1)-tempsun
148
149   
150   return, zrhop
151END
152
153
Note: See TracBrowser for help on using the repository browser.