/[MITgcm]/MITgcm/model/src/ini_phiref.F
ViewVC logotype

Contents of /MITgcm/model/src/ini_phiref.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.4 - (show annotations) (download)
Tue Oct 17 18:52:34 2006 UTC (17 years, 8 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint58r_post, mitgcm_mapl_00, checkpoint58v_post, checkpoint58s_post, checkpoint58t_post, checkpoint58q_post, checkpoint58u_post
Changes since 1.3: +2 -1 lines
clean-up multi-threaded problems (reported by debugger tcheck on ACES).

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

  ViewVC Help
Powered by ViewVC 1.1.22