39 |
C msgBuf :: Informational/error message buffer |
C msgBuf :: Informational/error message buffer |
40 |
CHARACTER*(MAX_LEN_MBUF) msgBuf |
CHARACTER*(MAX_LEN_MBUF) msgBuf |
41 |
INTEGER k, ks, stdUnit |
INTEGER k, ks, stdUnit |
42 |
_RL rHalf(2*Nr+1) |
_RL rHalf(2*Nr+1), pRefLocF(Nr+1) |
43 |
_RL rhoRef(Nr), tLoc(Nr) |
_RL rhoRef(Nr), tLoc(Nr) |
44 |
_RL pLoc, rhoUp, rhoDw, rhoLoc |
_RL pLoc, rhoUp, rhoDw, rhoLoc |
45 |
_RL ddPI, conv_theta2T, thetaLoc |
_RL ddPI, conv_theta2T, thetaLoc |
46 |
|
C-- |
47 |
|
_RL maxResid |
48 |
|
INTEGER maxIterNb, belowCritNb |
49 |
CEOP |
CEOP |
50 |
|
|
51 |
_BEGIN_MASTER( myThid ) |
_BEGIN_MASTER( myThid ) |
59 |
DO k=1,Nr |
DO k=1,Nr |
60 |
rhoRef(k) = 0. |
rhoRef(k) = 0. |
61 |
dBdrRef(k) = 0. |
dBdrRef(k) = 0. |
62 |
|
pRef4EOS(k) = 0. |
63 |
rHalf(2*k-1) = rF(k) |
rHalf(2*k-1) = rF(k) |
64 |
rHalf(2*k) = rC(k) |
rHalf(2*k) = rC(k) |
65 |
ENDDO |
ENDDO |
70 |
wUnit2rVel(k) = 1. _d 0 |
wUnit2rVel(k) = 1. _d 0 |
71 |
ENDDO |
ENDDO |
72 |
|
|
73 |
C-- Initialise density factor for anelastic formulation: |
C- Initialise density factor for anelastic formulation: |
74 |
DO k=1,Nr |
DO k=1,Nr |
75 |
rhoFacC(k) = 1. _d 0 |
rhoFacC(k) = 1. _d 0 |
76 |
recip_rhoFacC(k) = 1. _d 0 |
recip_rhoFacC(k) = 1. _d 0 |
81 |
ENDDO |
ENDDO |
82 |
|
|
83 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
84 |
|
C-- Oceanic: define reference pressure/geo-potential vertical scale: |
85 |
|
IF ( buoyancyRelation.EQ.'OCEANIC' ) THEN |
86 |
|
phiRef(1) = phi0Ref |
87 |
|
pRefLocF(1) = rhoConst*phi0Ref |
88 |
|
IF ( gravityFile.EQ.' ' ) THEN |
89 |
|
DO k=1,Nr |
90 |
|
phiRef(2*k) = phi0Ref + (rC(k) - rF(1))*gravity*gravitySign |
91 |
|
phiRef(2*k+1) = phi0Ref + (rF(k+1)-rF(1))*gravity*gravitySign |
92 |
|
c pRef4EOS(k) = rhoConst*phiRef(2*k) |
93 |
|
c pRefLocF(k+1) = rhoConst*phiRef(2*k+1) |
94 |
|
C note: just to get the same previous machine truncation: |
95 |
|
pRef4EOS(k) = rhoConst*phi0Ref |
96 |
|
& + rhoConst*(rC(k) - rF(1))*gravity*gravitySign |
97 |
|
pRefLocF(k+1) = rhoConst*phi0Ref |
98 |
|
& + rhoConst*(rF(k+1)-rF(1))*gravity*gravitySign |
99 |
|
ENDDO |
100 |
|
ELSEIF ( integr_GeoPot.EQ.1 ) THEN |
101 |
|
DO k=1,Nr |
102 |
|
phiRef(2*k) = phiRef(2*k-1) |
103 |
|
& + halfRL*drF(k)*gravity*gravFacC(k) |
104 |
|
phiRef(2*k+1) = phiRef(2*k-1) + drF(k)*gravity*gravFacC(k) |
105 |
|
pRef4EOS(k) = rhoConst*phiRef(2*k) |
106 |
|
pRefLocF(k+1) = rhoConst*phiRef(2*k+1) |
107 |
|
ENDDO |
108 |
|
ELSE |
109 |
|
phiRef(2) = phi0Ref + drC(1)*gravity*gravFacF(1) |
110 |
|
DO k=2,Nr |
111 |
|
phiRef(2*k-1) = phiRef(2*k-2) |
112 |
|
& + halfRL*drC(k)*gravity*gravFacF(k) |
113 |
|
phiRef(2*k) = phiRef(2*k-2) + drC(k)*gravity*gravFacF(k) |
114 |
|
ENDDO |
115 |
|
k = Nr |
116 |
|
phiRef(2*k+1) = phiRef(2*k) + drC(k+1)*gravity*gravFacF(k+1) |
117 |
|
DO k=1,Nr |
118 |
|
pRef4EOS(k) = rhoConst*phiRef(2*k) |
119 |
|
pRefLocF(k+1) = rhoConst*phiRef(2*k+1) |
120 |
|
ENDDO |
121 |
|
ENDIF |
122 |
|
ELSEIF ( buoyancyRelation.EQ.'OCEANICP' ) THEN |
123 |
|
phiRef(1) = phi0Ref |
124 |
|
DO k=1,Nr |
125 |
|
phiRef(2*k) = phi0Ref - recip_rhoConst*(rC(k) - rF(1)) |
126 |
|
phiRef(2*k+1) = phi0Ref - recip_rhoConst*(rF(k+1)-rF(1)) |
127 |
|
ENDDO |
128 |
|
c ELSEIF (buoyancyRelation .EQ. 'ATMOSPHERIC') THEN |
129 |
|
C phiRef is computed later (see below) |
130 |
|
ENDIF |
131 |
|
|
132 |
|
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
133 |
IF ( eosType.EQ.'POLY3' ) THEN |
IF ( eosType.EQ.'POLY3' ) THEN |
134 |
IF ( implicitIntGravWave ) THEN |
IF ( implicitIntGravWave ) THEN |
135 |
WRITE(msgBuf,'(2A)') 'SET_REF_STATE:', |
WRITE(msgBuf,'(2A)') 'SET_REF_STATE:', |
140 |
CALL PRINT_ERROR( msgBuf , myThid ) |
CALL PRINT_ERROR( msgBuf , myThid ) |
141 |
STOP 'ABNORMAL END: S/R SET_REF_STATE' |
STOP 'ABNORMAL END: S/R SET_REF_STATE' |
142 |
ELSEIF ( nonHydrostatic .AND. |
ELSEIF ( nonHydrostatic .AND. |
143 |
& buoyancyRelation .EQ. 'OCEANICP' ) THEN |
& buoyancyRelation.EQ.'OCEANICP' ) THEN |
144 |
WRITE(msgBuf,'(2A)') 'SET_REF_STATE:', |
WRITE(msgBuf,'(2A)') 'SET_REF_STATE:', |
145 |
& ' need to compute reference density for Non-Hyd' |
& ' need to compute reference density for Non-Hyd' |
146 |
CALL PRINT_ERROR( msgBuf , myThid ) |
CALL PRINT_ERROR( msgBuf , myThid ) |
159 |
& SQUEEZE_RIGHT , myThid) |
& SQUEEZE_RIGHT , myThid) |
160 |
ENDIF |
ENDIF |
161 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
162 |
ELSEIF (buoyancyRelation .EQ. 'OCEANIC') THEN |
ELSEIF ( buoyancyRelation.EQ.'OCEANIC' ) THEN |
163 |
|
|
164 |
C-- Compute reference density profile and reference stratification |
C-- Compute reference density profile |
165 |
DO k=1,Nr |
DO k=1,Nr |
166 |
pLoc = -rhoConst*rC(k)*gravity |
pLoc = pRef4EOS(k) |
167 |
CALL FIND_RHO_SCALAR( |
CALL FIND_RHO_SCALAR( |
168 |
I tRef(k), sRef(k), pLoc, |
I tRef(k), sRef(k), pLoc, |
169 |
O rhoRef(k), myThid ) |
O rhoRef(k), myThid ) |
170 |
ENDDO |
ENDDO |
171 |
|
|
172 |
|
IF ( selectP_inEOS_Zc.EQ.1 ) THEN |
173 |
|
C-- Find reference pressure in hydrostatic balance with updated ref density |
174 |
|
maxResid = rhoConst* 1. _d -14 |
175 |
|
belowCritNb = 5 |
176 |
|
maxIterNb = 10*Nr |
177 |
|
CALL FIND_HYD_PRESS_1D( |
178 |
|
O pRef4EOS, pRefLocF, |
179 |
|
U rhoRef, |
180 |
|
I tRef, sRef, maxResid, |
181 |
|
I belowCritNb, maxIterNb, myThid ) |
182 |
|
ENDIF |
183 |
|
|
184 |
C-- Compute reference stratification: N^2 = -(g/rho_c) * d.rho/dz @ const. p |
C-- Compute reference stratification: N^2 = -(g/rho_c) * d.rho/dz @ const. p |
185 |
dBdrRef(1) = 0. _d 0 |
dBdrRef(1) = 0. _d 0 |
186 |
DO k=2,Nr |
DO k=2,Nr |
187 |
pLoc = -rhoConst*rF(k)*gravity |
pLoc = pRefLocF(k) |
188 |
CALL FIND_RHO_SCALAR( |
CALL FIND_RHO_SCALAR( |
189 |
I tRef(k-1), sRef(k-1), pLoc, |
I tRef(k-1), sRef(k-1), pLoc, |
190 |
O rhoUp, myThid ) |
O rhoUp, myThid ) |
192 |
I tRef(k), sRef(k), pLoc, |
I tRef(k), sRef(k), pLoc, |
193 |
O rhoDw, myThid ) |
O rhoDw, myThid ) |
194 |
dBdrRef(k) = (rhoDw - rhoUp)*recip_drC(k) |
dBdrRef(k) = (rhoDw - rhoUp)*recip_drC(k) |
195 |
& *recip_rhoConst*gravity |
& *recip_rhoConst*gravity*gravFacF(k) |
196 |
IF (eosType .EQ. 'LINEAR') THEN |
IF ( eosType.EQ.'LINEAR' ) THEN |
197 |
C- get more precise values (differences from above are due to machine round-off) |
C- get more precise values (differences from above are due to machine round-off) |
198 |
dBdrRef(k) = ( sBeta *(sRef(k)-sRef(k-1)) |
dBdrRef(k) = ( sBeta *(sRef(k)-sRef(k-1)) |
199 |
& -tAlpha*(tRef(k)-tRef(k-1)) |
& -tAlpha*(tRef(k)-tRef(k-1)) |
200 |
& )*recip_drC(k) |
& )*recip_drC(k) |
201 |
& *rhoNil*recip_rhoConst*gravity |
& *rhoNil*recip_rhoConst*gravity*gravFacF(k) |
202 |
ENDIF |
ENDIF |
203 |
ENDDO |
ENDDO |
204 |
|
|
205 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
206 |
ELSEIF (buoyancyRelation .EQ. 'OCEANICP') THEN |
ELSEIF ( buoyancyRelation.EQ.'OCEANICP' ) THEN |
207 |
|
|
208 |
C-- Compute reference density profile |
C-- Compute reference density profile |
209 |
DO k=1,Nr |
DO k=1,Nr |
241 |
ENDDO |
ENDDO |
242 |
|
|
243 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
244 |
ELSEIF (buoyancyRelation .EQ. 'ATMOSPHERIC') THEN |
ELSEIF ( buoyancyRelation.EQ.'ATMOSPHERIC' ) THEN |
245 |
|
|
246 |
C-- Compute reference stratification: -d.alpha/dp @ constant p |
C-- Compute reference stratification: -d.alpha/dp @ constant p |
247 |
dBdrRef(1) = 0. _d 0 |
dBdrRef(1) = 0. _d 0 |
279 |
C- Compute Reference Geopotential at Half levels : |
C- Compute Reference Geopotential at Half levels : |
280 |
C Tracer level k: phiRef(2k) ; Interface_W level k: phiRef(2k-1) |
C Tracer level k: phiRef(2k) ; Interface_W level k: phiRef(2k-1) |
281 |
|
|
282 |
phiRef(1) = 0. _d 0 |
phiRef(1) = phi0Ref |
283 |
IF ( select_rStar.GE.1 .OR. selectSigmaCoord.GE.1 ) THEN |
IF ( select_rStar.GE.1 .OR. selectSigmaCoord.GE.1 ) THEN |
284 |
C- isothermal (theta=const) reference state |
C- isothermal (theta=const) reference state |
285 |
DO k=1,Nr |
DO k=1,Nr |
328 |
C-- endif buoyancyRelation |
C-- endif buoyancyRelation |
329 |
ENDIF |
ENDIF |
330 |
|
|
|
C-- fill-in phiRef array (presently not used) |
|
|
IF ( buoyancyRelation.EQ.'OCEANIC' ) THEN |
|
|
c phiRef(1) = gravitySign*gravity*(rF(1)-Ro_SeaLevel) |
|
|
phiRef(1) = 0. _d 0 |
|
|
DO k=1,Nr |
|
|
phiRef(2*k) = gravitySign*gravity*(rC(k) - Ro_SeaLevel) |
|
|
phiRef(2*k+1) = gravitySign*gravity*(rF(k+1)-Ro_SeaLevel) |
|
|
ENDDO |
|
|
ELSEIF ( buoyancyRelation.EQ.'OCEANICP' ) THEN |
|
|
C should be : phiRef = phi_Origin - (rC - Ro_SeaLevel)/rhoConst |
|
|
C- but since the reference geopotential "phi_Origin" @ p = rF(k=1) |
|
|
C is not currently stored, we only get a relative geopotential: |
|
|
phiRef(1) = -recip_rhoConst*rF(1) |
|
|
DO k=1,Nr |
|
|
phiRef(2*k) = -recip_rhoConst*rC(k) |
|
|
phiRef(2*k+1) = -recip_rhoConst*rF(k+1) |
|
|
ENDDO |
|
|
ENDIF |
|
|
|
|
331 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
332 |
|
|
333 |
IF ( usingZCoords .AND. rhoRefFile .NE. ' ' ) THEN |
IF ( usingZCoords .AND. rhoRefFile .NE. ' ' ) THEN |
337 |
C rhoFac(k) = density ratio between layer k and top interface |
C rhoFac(k) = density ratio between layer k and top interface |
338 |
DO k=1,Nr |
DO k=1,Nr |
339 |
rhoFacC(k) = rho1Ref(k)/rhoConst |
rhoFacC(k) = rho1Ref(k)/rhoConst |
340 |
|
c rhoFacC(k) = rho1Ref(k)*recip_rhoConst |
341 |
ENDDO |
ENDDO |
342 |
DO k=2,Nr |
DO k=2,Nr |
343 |
C since rkSign=-1, recip_drC(k) = 1./(rC(k-1)-rC(k)) |
C since rkSign=-1, recip_drC(k) = 1./(rC(k-1)-rC(k)) |
360 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
361 |
|
|
362 |
C-- Write to check : |
C-- Write to check : |
363 |
IF (buoyancyRelation .EQ. 'ATMOSPHERIC') THEN |
IF ( gravityFile .NE. ' ' ) THEN |
364 |
|
C- write gravity vertical profile factor to binary file: |
365 |
|
CALL WRITE_GLVEC_RL( 'GravFacC',' ',gravFacC, Nr, -1, myThid ) |
366 |
|
CALL WRITE_GLVEC_RL( 'GravFacF',' ',gravFacF,Nr+1,-1, myThid ) |
367 |
|
ENDIF |
368 |
|
IF ( selectP_inEOS_Zc.EQ.1 ) THEN |
369 |
|
C- write (to binary file) Hyd-Pressure used in EOS: |
370 |
|
CALL WRITE_GLVEC_RL( 'PRef4EOS',' ',pRef4EOS, Nr, -1, myThid ) |
371 |
|
c CALL WRITE_GLVEC_RL( 'PRefLocF',' ',pRefLocF,Nr+1,-1, myThid ) |
372 |
|
ENDIF |
373 |
|
IF ( buoyancyRelation.EQ.'ATMOSPHERIC' ) THEN |
374 |
WRITE(msgBuf,'(A)') ' ' |
WRITE(msgBuf,'(A)') ' ' |
375 |
CALL PRINT_MESSAGE( msgBuf, stdUnit, SQUEEZE_RIGHT, myThid ) |
CALL PRINT_MESSAGE( msgBuf, stdUnit, SQUEEZE_RIGHT, myThid ) |
376 |
WRITE(msgBuf,'(A)') |
WRITE(msgBuf,'(A)') |