1 |
C $Header: /u/gcmpack/MITgcm/model/src/ini_phiref.F,v 1.3 2006/02/23 20:51:38 jmc Exp $ |
2 |
C $Name: $ |
3 |
|
4 |
#include "CPP_OPTIONS.h" |
5 |
|
6 |
CBOP |
7 |
C !ROUTINE: INI_PHIREF |
8 |
C !INTERFACE: |
9 |
SUBROUTINE INI_PHIREF( |
10 |
I myThid ) |
11 |
C !DESCRIPTION: \bv |
12 |
C *==========================================================* |
13 |
C | SUBROUTINE INI_PHIREF |
14 |
C | o Set reference potential at level center and |
15 |
C | level interface, using tRef,sRef profiles. |
16 |
C | note: use same discretisation as in calc_phi_hyd |
17 |
C | o Set also reference stratification here (for implicit |
18 |
C | Internal Gravity Waves) since it uses also the |
19 |
C | same reference density. |
20 |
C *==========================================================* |
21 |
C \ev |
22 |
|
23 |
C !USES: |
24 |
IMPLICIT NONE |
25 |
C == Global variables == |
26 |
#include "SIZE.h" |
27 |
#include "EEPARAMS.h" |
28 |
#include "PARAMS.h" |
29 |
#include "GRID.h" |
30 |
#include "EOS.h" |
31 |
|
32 |
C !INPUT/OUTPUT PARAMETERS: |
33 |
C == Routine arguments == |
34 |
INTEGER myThid |
35 |
|
36 |
C !LOCAL VARIABLES: |
37 |
C == Local variables == |
38 |
C msgBuf :: Informational/error meesage buffer |
39 |
CHARACTER*(MAX_LEN_MBUF) msgBuf |
40 |
INTEGER k, ks, stdUnit |
41 |
_RL rHalf(2*Nr+1) |
42 |
_RL rhoRef(Nr) |
43 |
_RL pLoc, rhoUp, rhoDw |
44 |
_RL ddPI, conv_theta2T |
45 |
CEOP |
46 |
|
47 |
_BEGIN_MASTER( myThid ) |
48 |
|
49 |
DO k=1,2*Nr |
50 |
phiRef(k) = 0. |
51 |
ENDDO |
52 |
stdUnit = standardMessageUnit |
53 |
|
54 |
DO k=1,Nr |
55 |
rhoRef(k) = 0. |
56 |
rHalf(2*k-1) = rF(k) |
57 |
rHalf(2*k) = rC(k) |
58 |
ENDDO |
59 |
rHalf(2*Nr+1) = rF(Nr+1) |
60 |
|
61 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
62 |
IF ( eosType.EQ.'POLY3' ) THEN |
63 |
IF ( implicitIntGravWave ) THEN |
64 |
WRITE(msgBuf,'(A)') |
65 |
& 'INI_PHIREF: need to compute reference density for Impl.IGW' |
66 |
CALL PRINT_ERROR( msgBuf , myThid) |
67 |
WRITE(msgBuf,'(2A)') |
68 |
& 'INI_PHIREF: but FIND_RHO_SCALAR(EOS="POLY3")', |
69 |
& ' not (yet) implemented' |
70 |
CALL PRINT_ERROR( msgBuf , myThid) |
71 |
STOP 'ABNORMAL END: S/R INI_PHIREF' |
72 |
ELSE |
73 |
WRITE(msgBuf,'(A)') |
74 |
& 'INI_PHIREF: Unable to compute reference stratification' |
75 |
CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, |
76 |
& SQUEEZE_RIGHT , myThid) |
77 |
WRITE(msgBuf,'(A)') |
78 |
& 'INI_PHIREF: with EOS="POLY3" ; set dBdrRef(1:Nr) to zeros' |
79 |
CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, |
80 |
& SQUEEZE_RIGHT , myThid) |
81 |
ENDIF |
82 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
83 |
ELSEIF (buoyancyRelation .EQ. 'OCEANIC') THEN |
84 |
|
85 |
C-- Compute reference density profile and reference stratification |
86 |
DO k=1,Nr |
87 |
pLoc = -rhoConst*rC(k)*gravity |
88 |
CALL FIND_RHO_SCALAR( |
89 |
I tRef(k), sRef(k), pLoc, |
90 |
O rhoRef(k), myThid ) |
91 |
rhoRef(k) = rhoRef(k) + rhoConst |
92 |
ENDDO |
93 |
|
94 |
C-- Compute reference stratification: N^2 = -(g/rho_c) * d.rho/dz @ const. p |
95 |
dBdrRef(1) = 0. _d 0 |
96 |
DO k=2,Nr |
97 |
pLoc = -rhoConst*rF(k)*gravity |
98 |
CALL FIND_RHO_SCALAR( |
99 |
I tRef(k-1), sRef(k-1), pLoc, |
100 |
O rhoUp, myThid ) |
101 |
CALL FIND_RHO_SCALAR( |
102 |
I tRef(k), sRef(k), pLoc, |
103 |
O rhoDw, myThid ) |
104 |
dBdrRef(k) = (rhoDw - rhoUp)*recip_drC(k) |
105 |
& *recip_rhoConst*gravity |
106 |
IF (eosType .EQ. 'LINEAR') THEN |
107 |
C- get more precise values (differences from above are due to machine round-off) |
108 |
dBdrRef(k) = ( sBeta *(sRef(k)-sRef(k-1)) |
109 |
& -tAlpha*(tRef(k)-tRef(k-1)) |
110 |
& )*recip_drC(k) |
111 |
& *rhoNil*recip_rhoConst*gravity |
112 |
ENDIF |
113 |
ENDDO |
114 |
|
115 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
116 |
ELSEIF (buoyancyRelation .EQ. 'OCEANICP') THEN |
117 |
|
118 |
C-- Compute reference density profile |
119 |
DO k=1,Nr |
120 |
pLoc = rC(k) |
121 |
CALL FIND_RHO_SCALAR( |
122 |
I tRef(k), sRef(k), pLoc, |
123 |
O rhoRef(k), myThid ) |
124 |
rhoRef(k) = rhoRef(k) + rhoConst |
125 |
ENDDO |
126 |
|
127 |
C-- Compute reference stratification: -d.alpha/dp @ constant p |
128 |
dBdrRef(1) = 0. _d 0 |
129 |
DO k=2,Nr |
130 |
pLoc = rF(k) |
131 |
CALL FIND_RHO_SCALAR( |
132 |
I tRef(k-1), sRef(k-1), pLoc, |
133 |
O rhoDw, myThid ) |
134 |
CALL FIND_RHO_SCALAR( |
135 |
I tRef(k), sRef(k), pLoc, |
136 |
O rhoUp, myThid ) |
137 |
dBdrRef(k) = (rhoDw - rhoUp)*recip_drC(k) |
138 |
& / (rhoDw+rhoConst) |
139 |
& / (rhoUp+rhoConst) |
140 |
ENDDO |
141 |
|
142 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
143 |
ELSEIF (buoyancyRelation .EQ. 'ATMOSPHERIC') THEN |
144 |
|
145 |
C-- Compute reference stratification: -d.alpha/dp @ constant p |
146 |
dBdrRef(1) = 0. _d 0 |
147 |
DO k=2,Nr |
148 |
conv_theta2T = (rF(k)/atm_Po)**atm_kappa |
149 |
c dBdrRef(k) = (tRef(k) - tRef(k-1))*recip_drC(k) |
150 |
c & * conv_theta2T*atm_Rd/rF(k) |
151 |
ddPI=atm_Cp*( ((rC(k-1)/atm_Po)**atm_kappa) |
152 |
& -((rC( k )/atm_Po)**atm_kappa) ) |
153 |
dBdrRef(k) = (tRef(k) - tRef(k-1))*recip_drC(k) |
154 |
& * ddPI*recip_drC(k) |
155 |
ENDDO |
156 |
|
157 |
C- Compute Reference Geopotential at Half levels : |
158 |
C Tracer level: phiRef(2k) ; Interface_W level: phiRef(2k+1) |
159 |
|
160 |
phiRef(1) = 0. _d 0 |
161 |
|
162 |
IF (integr_GeoPot.EQ.1) THEN |
163 |
C- Finite Volume Form, linear by half level : |
164 |
DO k=1,2*Nr |
165 |
ks = (k+1)/2 |
166 |
ddPI=atm_Cp*( ((rHalf( k )/atm_Po)**atm_kappa) |
167 |
& -((rHalf(k+1)/atm_Po)**atm_kappa) ) |
168 |
phiRef(k+1) = phiRef(k)+ddPI*tRef(ks) |
169 |
ENDDO |
170 |
C------ |
171 |
ELSE |
172 |
C- Finite Difference Form, linear between Tracer level : |
173 |
C works with integr_GeoPot = 0, 2 or 3 |
174 |
k = 1 |
175 |
ddPI=atm_Cp*( ((rF(k)/atm_Po)**atm_kappa) |
176 |
& -((rC(k)/atm_Po)**atm_kappa) ) |
177 |
phiRef(2*k) = phiRef(1) + ddPI*tRef(k) |
178 |
DO k=1,Nr-1 |
179 |
ddPI=atm_Cp*( ((rC( k )/atm_Po)**atm_kappa) |
180 |
& -((rC(k+1)/atm_Po)**atm_kappa) ) |
181 |
phiRef(2*k+1) = phiRef(2*k) + ddPI*0.5*tRef(k) |
182 |
phiRef(2*k+2) = phiRef(2*k) |
183 |
& + ddPI*0.5*(tRef(k)+tRef(k+1)) |
184 |
ENDDO |
185 |
k = Nr |
186 |
ddPI=atm_Cp*( ((rC( k )/atm_Po)**atm_kappa) |
187 |
& -((rF(k+1)/atm_Po)**atm_kappa) ) |
188 |
phiRef(2*k+1) = phiRef(2*k) + ddPI*tRef(k) |
189 |
C------ |
190 |
ENDIF |
191 |
|
192 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
193 |
ELSE |
194 |
STOP 'INI_PHIREF: Bad value of buoyancyRelation !' |
195 |
C-- endif buoyancyRelation |
196 |
ENDIF |
197 |
|
198 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
199 |
|
200 |
C-- Write to check : |
201 |
IF (buoyancyRelation .EQ. 'ATMOSPHERIC') THEN |
202 |
WRITE(msgBuf,'(A)') ' ' |
203 |
CALL PRINT_MESSAGE( msgBuf, stdUnit, SQUEEZE_RIGHT, myThid ) |
204 |
WRITE(msgBuf,'(A)') |
205 |
& 'INI_PHIREF: PhiRef/g [m] at level Center (integer)' |
206 |
CALL PRINT_MESSAGE( msgBuf, stdUnit, SQUEEZE_RIGHT, myThid ) |
207 |
WRITE(msgBuf,'(A)') |
208 |
& ' and at level Interface (half-int.) :' |
209 |
CALL PRINT_MESSAGE( msgBuf, stdUnit, SQUEEZE_RIGHT, myThid ) |
210 |
DO k=1,2*Nr+1 |
211 |
WRITE(msgBuf,'(A,F5.1,A,F10.1,A,F12.3)') |
212 |
& ' K=',k*0.5,' ; r=',rHalf(k),' ; phiRef/g=', |
213 |
& phiRef(k)*recip_gravity |
214 |
CALL PRINT_MESSAGE(msgBuf, stdUnit, SQUEEZE_RIGHT, myThid ) |
215 |
ENDDO |
216 |
ENDIF |
217 |
|
218 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
219 |
|
220 |
_END_MASTER( myThid ) |
221 |
_BARRIER |
222 |
|
223 |
RETURN |
224 |
END |