78 |
C !LOCAL VARIABLES: |
C !LOCAL VARIABLES: |
79 |
C == Local variables == |
C == Local variables == |
80 |
INTEGER i,j |
INTEGER i,j |
|
_RL zero, one, half |
|
81 |
_RL alphaRho(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
_RL alphaRho(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
82 |
_RL dRlocM,dRlocP, ddRloc, locAlpha |
_RL dRlocM,dRlocP, ddRloc, locAlpha |
83 |
_RL ddPIm, ddPIp, rec_dRm, rec_dRp |
_RL ddPIm, ddPIp, rec_dRm, rec_dRp |
84 |
_RL surfPhiFac |
_RL surfPhiFac |
|
PARAMETER ( zero= 0. _d 0 , one= 1. _d 0 , half= .5 _d 0 ) |
|
85 |
LOGICAL useDiagPhiRlow, addSurfPhiAnom |
LOGICAL useDiagPhiRlow, addSurfPhiAnom |
86 |
CEOP |
CEOP |
87 |
useDiagPhiRlow = .TRUE. |
useDiagPhiRlow = .TRUE. |
182 |
#endif /* ALLOW_SHELFICE */ |
#endif /* ALLOW_SHELFICE */ |
183 |
|
|
184 |
#ifdef ALLOW_MOM_COMMON |
#ifdef ALLOW_MOM_COMMON |
185 |
C Quasi-hydrostatic terms are added in as if they modify the buoyancy |
C-- Quasi-hydrostatic terms are added in as if they modify the buoyancy |
186 |
IF (quasiHydrostatic) THEN |
IF (quasiHydrostatic) THEN |
187 |
CALL MOM_QUASIHYDROSTATIC(bi,bj,k,uVel,vVel,alphaRho,myThid) |
CALL MOM_QUASIHYDROSTATIC(bi,bj,k,uVel,vVel,alphaRho,myThid) |
188 |
ENDIF |
ENDIF |
213 |
DO j=jMin,jMax |
DO j=jMin,jMax |
214 |
DO i=iMin,iMax |
DO i=iMin,iMax |
215 |
phiHydC(i,j) = phiHydF(i,j) |
phiHydC(i,j) = phiHydF(i,j) |
216 |
& + half*drF(k)*gravity*alphaRho(i,j)*recip_rhoConst |
& + halfRL*drF(k)*gravity*alphaRho(i,j)*recip_rhoConst |
217 |
phiHydF(i,j) = phiHydF(i,j) |
phiHydF(i,j) = phiHydF(i,j) |
218 |
& + drF(k)*gravity*alphaRho(i,j)*recip_rhoConst |
& + drF(k)*gravity*alphaRho(i,j)*recip_rhoConst |
219 |
ENDDO |
ENDDO |
229 |
phiHydC(i,j) = ddRloc*gravity*alphaRho(i,j)*recip_rhoConst |
phiHydC(i,j) = ddRloc*gravity*alphaRho(i,j)*recip_rhoConst |
230 |
ELSE |
ELSE |
231 |
phiHydC(i,j) = phiHydF(i,j) |
phiHydC(i,j) = phiHydF(i,j) |
232 |
& + half*drF(k)*gravity*alphaRho(i,j)*recip_rhoConst |
& + halfRL*drF(k)*gravity*alphaRho(i,j)*recip_rhoConst |
233 |
ENDIF |
ENDIF |
234 |
phiHydF(i,j) = phiHydC(i,j) |
phiHydF(i,j) = phiHydC(i,j) |
235 |
& + half*drF(k)*gravity*alphaRho(i,j)*recip_rhoConst |
& + halfRL*drF(k)*gravity*alphaRho(i,j)*recip_rhoConst |
236 |
ENDDO |
ENDDO |
237 |
ENDDO |
ENDDO |
238 |
ENDIF |
ENDIF |
243 |
C---------- This discretization is the "energy conserving" form |
C---------- This discretization is the "energy conserving" form |
244 |
C which has been used since at least Adcroft et al., MWR 1997 |
C which has been used since at least Adcroft et al., MWR 1997 |
245 |
|
|
246 |
dRlocM=half*drC(k) |
dRlocM = halfRL*drC(k) |
247 |
IF (k.EQ.1) dRlocM=rF(k)-rC(k) |
IF (k.EQ.1) dRlocM=rF(k)-rC(k) |
248 |
IF (k.EQ.Nr) THEN |
IF (k.EQ.Nr) THEN |
249 |
dRlocP=rC(k)-rF(k+1) |
dRlocP=rC(k)-rF(k+1) |
250 |
ELSE |
ELSE |
251 |
dRlocP=half*drC(k+1) |
dRlocP=halfRL*drC(k+1) |
252 |
ENDIF |
ENDIF |
253 |
IF ( uniformFreeSurfLev ) THEN |
IF ( uniformFreeSurfLev ) THEN |
254 |
DO j=jMin,jMax |
DO j=jMin,jMax |
260 |
ENDDO |
ENDDO |
261 |
ENDDO |
ENDDO |
262 |
ELSE |
ELSE |
263 |
rec_dRm = one/(rF(k)-rC(k)) |
rec_dRm = oneRL/(rF(k)-rC(k)) |
264 |
rec_dRp = one/(rC(k)-rF(k+1)) |
rec_dRp = oneRL/(rC(k)-rF(k+1)) |
265 |
DO j=jMin,jMax |
DO j=jMin,jMax |
266 |
DO i=iMin,iMax |
DO i=iMin,iMax |
267 |
IF (k.EQ.kSurfC(i,j,bi,bj)) THEN |
IF (k.EQ.kSurfC(i,j,bi,bj)) THEN |
269 |
#ifdef NONLIN_FRSURF |
#ifdef NONLIN_FRSURF |
270 |
ddRloc = ddRloc + surfPhiFac*etaH(i,j,bi,bj) |
ddRloc = ddRloc + surfPhiFac*etaH(i,j,bi,bj) |
271 |
#endif |
#endif |
272 |
phiHydC(i,j) =( MAX(zero,ddRloc)*rec_dRm*dRlocM |
phiHydC(i,j) =( MAX(zeroRL,ddRloc)*rec_dRm*dRlocM |
273 |
& +MIN(zero,ddRloc)*rec_dRp*dRlocP |
& +MIN(zeroRL,ddRloc)*rec_dRp*dRlocP |
274 |
& )*gravity*alphaRho(i,j)*recip_rhoConst |
& )*gravity*alphaRho(i,j)*recip_rhoConst |
275 |
ELSE |
ELSE |
276 |
phiHydC(i,j) = phiHydF(i,j) |
phiHydC(i,j) = phiHydF(i,j) |
277 |
& +dRlocM*gravity*alphaRho(i,j)*recip_rhoConst |
& +dRlocM*gravity*alphaRho(i,j)*recip_rhoConst |
326 |
DO i=iMin,iMax |
DO i=iMin,iMax |
327 |
locAlpha=alphaRho(i,j)+rhoConst |
locAlpha=alphaRho(i,j)+rhoConst |
328 |
alphaRho(i,j)=maskC(i,j,k,bi,bj)* |
alphaRho(i,j)=maskC(i,j,k,bi,bj)* |
329 |
& (one/locAlpha - recip_rhoConst) |
& (oneRL/locAlpha - recip_rhoConst) |
330 |
ENDDO |
ENDDO |
331 |
ENDDO |
ENDDO |
332 |
|
|
333 |
|
#ifdef ALLOW_MOM_COMMON |
334 |
|
C-- Quasi-hydrostatic terms are added as if they modify the specific-volume |
335 |
|
IF (quasiHydrostatic) THEN |
336 |
|
CALL MOM_QUASIHYDROSTATIC(bi,bj,k,uVel,vVel,alphaRho,myThid) |
337 |
|
ENDIF |
338 |
|
#endif /* ALLOW_MOM_COMMON */ |
339 |
|
|
340 |
C---- Hydrostatic pressure at cell centers |
C---- Hydrostatic pressure at cell centers |
341 |
|
|
342 |
IF (integr_GeoPot.EQ.1) THEN |
IF (integr_GeoPot.EQ.1) THEN |
357 |
phiHydC(i,j) = ddRloc*alphaRho(i,j) |
phiHydC(i,j) = ddRloc*alphaRho(i,j) |
358 |
c--to reproduce results of c48d_post: uncomment those 4+1 lines |
c--to reproduce results of c48d_post: uncomment those 4+1 lines |
359 |
c phiHydC(i,j)=phiHydF(i,j) |
c phiHydC(i,j)=phiHydF(i,j) |
360 |
c & +(hFacC(i,j,k,bi,bj)-half)*drF(k)*alphaRho(i,j) |
c & +(hFacC(i,j,k,bi,bj)-halfRL)*drF(k)*alphaRho(i,j) |
361 |
c phiHydF(i,j)=phiHydF(i,j) |
c phiHydF(i,j)=phiHydF(i,j) |
362 |
c & + hFacC(i,j,k,bi,bj)*drF(k)*alphaRho(i,j) |
c & + hFacC(i,j,k,bi,bj)*drF(k)*alphaRho(i,j) |
363 |
ELSE |
ELSE |
364 |
phiHydC(i,j) = phiHydF(i,j) + half*drF(k)*alphaRho(i,j) |
phiHydC(i,j) = phiHydF(i,j) + halfRL*drF(k)*alphaRho(i,j) |
365 |
c phiHydF(i,j) = phiHydF(i,j) + drF(k)*alphaRho(i,j) |
c phiHydF(i,j) = phiHydF(i,j) + drF(k)*alphaRho(i,j) |
366 |
ENDIF |
ENDIF |
367 |
c-- and comment this last one: |
c-- and comment this last one: |
368 |
phiHydF(i,j) = phiHydC(i,j) + half*drF(k)*alphaRho(i,j) |
phiHydF(i,j) = phiHydC(i,j) + halfRL*drF(k)*alphaRho(i,j) |
369 |
c----- |
c----- |
370 |
ENDDO |
ENDDO |
371 |
ENDDO |
ENDDO |
373 |
ELSE |
ELSE |
374 |
C -- Finite Difference Form, with Part-Cell Bathy |
C -- Finite Difference Form, with Part-Cell Bathy |
375 |
|
|
376 |
dRlocM=half*drC(k) |
dRlocM = halfRL*drC(k) |
377 |
IF (k.EQ.1) dRlocM=rF(k)-rC(k) |
IF (k.EQ.1) dRlocM=rF(k)-rC(k) |
378 |
IF (k.EQ.Nr) THEN |
IF (k.EQ.Nr) THEN |
379 |
dRlocP=rC(k)-rF(k+1) |
dRlocP=rC(k)-rF(k+1) |
380 |
ELSE |
ELSE |
381 |
dRlocP=half*drC(k+1) |
dRlocP=halfRL*drC(k+1) |
382 |
ENDIF |
ENDIF |
383 |
rec_dRm = one/(rF(k)-rC(k)) |
rec_dRm = oneRL/(rF(k)-rC(k)) |
384 |
rec_dRp = one/(rC(k)-rF(k+1)) |
rec_dRp = oneRL/(rC(k)-rF(k+1)) |
385 |
|
|
386 |
DO j=jMin,jMax |
DO j=jMin,jMax |
387 |
DO i=iMin,iMax |
DO i=iMin,iMax |
393 |
#ifdef NONLIN_FRSURF |
#ifdef NONLIN_FRSURF |
394 |
ddRloc = ddRloc + surfPhiFac*etaH(i,j,bi,bj) |
ddRloc = ddRloc + surfPhiFac*etaH(i,j,bi,bj) |
395 |
#endif |
#endif |
396 |
phiHydC(i,j) =( MAX(zero,ddRloc)*rec_dRm*dRlocM |
phiHydC(i,j) =( MAX(zeroRL,ddRloc)*rec_dRm*dRlocM |
397 |
& +MIN(zero,ddRloc)*rec_dRp*dRlocP |
& +MIN(zeroRL,ddRloc)*rec_dRp*dRlocP |
398 |
& )*alphaRho(i,j) |
& )*alphaRho(i,j) |
399 |
ELSE |
ELSE |
400 |
phiHydC(i,j) = phiHydF(i,j) + dRlocM*alphaRho(i,j) |
phiHydC(i,j) = phiHydF(i,j) + dRlocM*alphaRho(i,j) |
415 |
C-- virtual potential temperature anomaly (including water vapour effect) |
C-- virtual potential temperature anomaly (including water vapour effect) |
416 |
DO j=jMin,jMax |
DO j=jMin,jMax |
417 |
DO i=iMin,iMax |
DO i=iMin,iMax |
418 |
alphaRho(i,j)=maskC(i,j,k,bi,bj) |
alphaRho(i,j) = ( tFld(i,j,k,bi,bj) |
419 |
& *( tFld(i,j,k,bi,bj)*(sFld(i,j,k,bi,bj)*atm_Rq+one) |
& *( sFld(i,j,k,bi,bj)*atm_Rq + oneRL ) |
420 |
& -tRef(k) ) |
& - tRef(k) )*maskC(i,j,k,bi,bj) |
421 |
ENDDO |
ENDDO |
422 |
ENDDO |
ENDDO |
423 |
|
|
424 |
|
#ifdef ALLOW_MOM_COMMON |
425 |
|
C-- Quasi-hydrostatic terms are added in as if they modify the Pot.Temp |
426 |
|
IF (quasiHydrostatic) THEN |
427 |
|
CALL MOM_QUASIHYDROSTATIC(bi,bj,k,uVel,vVel,alphaRho,myThid) |
428 |
|
ENDIF |
429 |
|
#endif /* ALLOW_MOM_COMMON */ |
430 |
|
|
431 |
C--- Integrate d Phi / d pi |
C--- Integrate d Phi / d pi |
432 |
|
|
433 |
IF (integr_GeoPot.EQ.0) THEN |
IF (integr_GeoPot.EQ.0) THEN |
443 |
& -((rC( k )/atm_Po)**atm_kappa) ) |
& -((rC( k )/atm_Po)**atm_kappa) ) |
444 |
ELSE |
ELSE |
445 |
ddPIm=atm_Cp*( ((rC(k-1)/atm_Po)**atm_kappa) |
ddPIm=atm_Cp*( ((rC(k-1)/atm_Po)**atm_kappa) |
446 |
& -((rC( k )/atm_Po)**atm_kappa) )*half |
& -((rC( k )/atm_Po)**atm_kappa) )*halfRL |
447 |
ENDIF |
ENDIF |
448 |
IF (k.EQ.Nr) THEN |
IF (k.EQ.Nr) THEN |
449 |
ddPIp=atm_Cp*( ((rC( k )/atm_Po)**atm_kappa) |
ddPIp=atm_Cp*( ((rC( k )/atm_Po)**atm_kappa) |
450 |
& -((rF(k+1)/atm_Po)**atm_kappa) ) |
& -((rF(k+1)/atm_Po)**atm_kappa) ) |
451 |
ELSE |
ELSE |
452 |
ddPIp=atm_Cp*( ((rC( k )/atm_Po)**atm_kappa) |
ddPIp=atm_Cp*( ((rC( k )/atm_Po)**atm_kappa) |
453 |
& -((rC(k+1)/atm_Po)**atm_kappa) )*half |
& -((rC(k+1)/atm_Po)**atm_kappa) )*halfRL |
454 |
ENDIF |
ENDIF |
455 |
C-------- This discretization is the energy conserving form |
C-------- This discretization is the energy conserving form |
456 |
DO j=jMin,jMax |
DO j=jMin,jMax |
509 |
& -((rC( k )/atm_Po)**atm_kappa) ) |
& -((rC( k )/atm_Po)**atm_kappa) ) |
510 |
ELSE |
ELSE |
511 |
ddPIm=atm_Cp*( ((rC(k-1)/atm_Po)**atm_kappa) |
ddPIm=atm_Cp*( ((rC(k-1)/atm_Po)**atm_kappa) |
512 |
& -((rC( k )/atm_Po)**atm_kappa) )*half |
& -((rC( k )/atm_Po)**atm_kappa) )*halfRL |
513 |
ENDIF |
ENDIF |
514 |
IF (k.EQ.Nr) THEN |
IF (k.EQ.Nr) THEN |
515 |
ddPIp=atm_Cp*( ((rC( k )/atm_Po)**atm_kappa) |
ddPIp=atm_Cp*( ((rC( k )/atm_Po)**atm_kappa) |
516 |
& -((rF(k+1)/atm_Po)**atm_kappa) ) |
& -((rF(k+1)/atm_Po)**atm_kappa) ) |
517 |
ELSE |
ELSE |
518 |
ddPIp=atm_Cp*( ((rC( k )/atm_Po)**atm_kappa) |
ddPIp=atm_Cp*( ((rC( k )/atm_Po)**atm_kappa) |
519 |
& -((rC(k+1)/atm_Po)**atm_kappa) )*half |
& -((rC(k+1)/atm_Po)**atm_kappa) )*halfRL |
520 |
ENDIF |
ENDIF |
521 |
rec_dRm = one/(rF(k)-rC(k)) |
rec_dRm = oneRL/(rF(k)-rC(k)) |
522 |
rec_dRp = one/(rC(k)-rF(k+1)) |
rec_dRp = oneRL/(rC(k)-rF(k+1)) |
523 |
DO j=jMin,jMax |
DO j=jMin,jMax |
524 |
DO i=iMin,iMax |
DO i=iMin,iMax |
525 |
IF (k.EQ.kSurfC(i,j,bi,bj)) THEN |
IF (k.EQ.kSurfC(i,j,bi,bj)) THEN |
527 |
#ifdef NONLIN_FRSURF |
#ifdef NONLIN_FRSURF |
528 |
ddRloc = ddRloc + surfPhiFac*etaH(i,j,bi,bj) |
ddRloc = ddRloc + surfPhiFac*etaH(i,j,bi,bj) |
529 |
#endif |
#endif |
530 |
phiHydC(i,j) =( MAX(zero,ddRloc)*rec_dRm*ddPIm |
phiHydC(i,j) =( MAX(zeroRL,ddRloc)*rec_dRm*ddPIm |
531 |
& +MIN(zero,ddRloc)*rec_dRp*ddPIp ) |
& +MIN(zeroRL,ddRloc)*rec_dRp*ddPIp |
532 |
& *alphaRho(i,j) |
& )*alphaRho(i,j) |
533 |
ELSE |
ELSE |
534 |
phiHydC(i,j) = phiHydF(i,j) +ddPIm*alphaRho(i,j) |
phiHydC(i,j) = phiHydF(i,j) +ddPIm*alphaRho(i,j) |
535 |
ENDIF |
ENDIF |