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

Annotation of /MITgcm/model/src/calc_grad_phi_hyd.F

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


Revision 1.5 - (hide annotations) (download)
Fri Aug 1 04:03:54 2003 UTC (20 years, 10 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint51e_post
Changes since 1.4: +62 -9 lines
* atmospheric p*: geopotential anomaly scaled by (p/p_0)^kappa instead of (p/p_0)
* add a curious option (select_rStar=1,nonlinFreeSurf=4) to test p*
* specific volume (used to compute geopotential) includes water vapor effect

1 jmc 1.5 C $Header: /u/gcmpack/MITgcm/model/src/calc_grad_phi_hyd.F,v 1.4 2003/02/26 03:16:54 jmc Exp $
2 jmc 1.1 C $Name: $
3    
4     #include "CPP_OPTIONS.h"
5    
6     CBOP
7     C !ROUTINE: CALC_GRAD_PHI_HYD
8     C !INTERFACE:
9     SUBROUTINE CALC_GRAD_PHI_HYD(
10     I k, bi, bj, iMin,iMax, jMin,jMax,
11 jmc 1.3 I phiHydC, alphRho, tFld, sFld,
12 jmc 1.1 O dPhiHydX, dPhiHydY,
13     I myTime, myIter, myThid)
14     C !DESCRIPTION: \bv
15     C *==========================================================*
16     C | S/R CALC_GRAD_PHI_HYD
17     C | o Calculate the gradient of Hydrostatic potential anomaly
18     C *==========================================================*
19     C \ev
20    
21     C !USES:
22     IMPLICIT NONE
23     C == Global variables ==
24     #include "SIZE.h"
25     #include "EEPARAMS.h"
26     #include "PARAMS.h"
27     #include "GRID.h"
28     #include "SURFACE.h"
29 jmc 1.3 #include "DYNVARS.h"
30 jmc 1.1
31     C !INPUT/OUTPUT PARAMETERS:
32     C == Routine Arguments ==
33     C bi,bj :: tile index
34     C iMin,iMax,jMin,jMax :: Loop counters
35 jmc 1.3 C phiHydC :: Hydrostatic Potential anomaly
36 jmc 1.1 C (atmos: =Geopotential ; ocean-z: =Pressure/rho)
37     C alphRho :: Density (z-coord) or specific volume (p-coord)
38     C tFld :: Potential temp.
39     C sFld :: Salinity
40     C dPhiHydX,Y :: Gradient (X & Y directions) of Hyd. Potential
41     C myTime :: Current time
42     C myIter :: Current iteration number
43     C myThid :: Instance number for this call of the routine.
44     INTEGER k, bi,bj, iMin,iMax, jMin,jMax
45 jmc 1.3 c _RL phiHyd(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
46     _RL phiHydC(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
47 jmc 1.1 _RL alphRho(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
48     _RL tFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
49     _RL sFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
50     _RL dPhiHydX(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
51     _RL dPhiHydY(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
52     _RL myTime
53     INTEGER myIter, myThid
54    
55     #ifdef INCLUDE_PHIHYD_CALCULATION_CODE
56    
57     C !LOCAL VARIABLES:
58     C == Local variables ==
59     C i,j :: Loop counters
60     INTEGER i,j
61     _RL varLoc(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
62 jmc 1.3 _RL factorZ, factorP, conv_theta2T
63 jmc 1.5 _RL factPI
64     CHARACTER*(MAX_LEN_MBUF) msgBuf
65 jmc 1.1 CEOP
66    
67 jmc 1.3 #ifdef NONLIN_FRSURF
68 jmc 1.5 IF (select_rStar.GE.2 .AND. nonlinFreeSurf.GE.4 ) THEN
69     C- Integral of b.dr = rStarFac * Integral of b.dr* :
70     C and will add later (select_rStar=2) the contribution of
71     C the slope of the r* coordinate.
72     IF ( buoyancyRelation .EQ. 'ATMOSPHERIC' ) THEN
73     C- Consistent with Phi'= Integr[ theta'.dPi ] :
74     DO j=jMin-1,jMax
75     DO i=iMin-1,iMax
76     varLoc(i,j) = phiHydC(i,j)*rStarFacC(i,j,bi,bj)**atm_kappa
77     & + phi0surf(i,j,bi,bj)
78     ENDDO
79     ENDDO
80     ELSE
81     DO j=jMin-1,jMax
82     DO i=iMin-1,iMax
83     varLoc(i,j) = phiHydC(i,j)*rStarFacC(i,j,bi,bj)
84     & + phi0surf(i,j,bi,bj)
85     ENDDO
86     ENDDO
87     ENDIF
88     ELSEIF (select_rStar.GE.1 .AND. nonlinFreeSurf.GE.4 ) THEN
89     C- Integral of b.dr but scaled to correspond to a fixed r-level (=r*)
90     C no contribution of the slope of the r* coordinate (select_rStar=1)
91     IF ( buoyancyRelation .EQ. 'ATMOSPHERIC' ) THEN
92     C- Consistent with Phi'= Integr[ theta'.dPi ] :
93     DO j=jMin-1,jMax
94     DO i=iMin-1,iMax
95     IF (Ro_surf(i,j,bi,bj).EQ.rC(k)) THEN
96     factPI=atm_Cp*( ((etaH(i,j,bi,bj)+rC(k))/atm_Po)**atm_kappa
97     & -( rC(k) /atm_Po)**atm_kappa
98     & )
99     varLoc(i,j) = factPI*alphRho(i,j)
100     ELSEIF (Ro_surf(i,j,bi,bj).NE.0. _d 0) THEN
101     factPI = (rC(k)/Ro_surf(i,j,bi,bj))**atm_kappa
102     varLoc(i,j) = phiHydC(i,j)
103     & *(rStarFacC(i,j,bi,bj)**atm_kappa - factPI)
104     & /(1. _d 0 -factPI)
105     & + phi0surf(i,j,bi,bj)
106     ENDIF
107     ENDDO
108     ENDDO
109     ELSE
110     DO j=jMin-1,jMax
111     DO i=iMin-1,iMax
112     IF (Ro_surf(i,j,bi,bj).EQ.rC(k)) THEN
113     WRITE(msgBuf,'(2A)') 'CALC_GRAD_PHI_HYD: ',
114     & 'Problem when Ro_surf=rC with select_rStar,integr_GeoPot=1,4'
115     CALL PRINT_ERROR( msgBuf , myThid)
116     STOP 'CALC_GRAD_PHI_HYD: Pb in r* options implementation'
117     ELSE
118     varLoc(i,j) = phiHydC(i,j)
119     & *(etaH(i,j,bi,bj)+Ro_surf(i,j,bi,bj)-rC(k))
120     & / (Ro_surf(i,j,bi,bj)-rC(k))
121     & + phi0surf(i,j,bi,bj)
122     ENDIF
123     ENDDO
124 jmc 1.3 ENDDO
125 jmc 1.5 ENDIF
126 jmc 1.3 ELSE
127     #else /* NONLIN_FRSURF */
128     IF (.TRUE.) THEN
129     #endif /* NONLIN_FRSURF */
130     DO j=jMin-1,jMax
131     DO i=iMin-1,iMax
132     varLoc(i,j) = phiHydC(i,j)+phi0surf(i,j,bi,bj)
133     ENDDO
134     ENDDO
135     ENDIF
136 jmc 1.1
137 jmc 1.3 C-- Zonal & Meridional gradient of potential anomaly
138 jmc 1.1 DO j=jMin,jMax
139     DO i=iMin,iMax
140     dPhiHydX(i,j) = _recip_dxC(i,j,bi,bj)
141     & *( varLoc(i,j)-varLoc(i-1,j) )
142     dPhiHydY(i,j) = _recip_dyC(i,j,bi,bj)
143     & *( varLoc(i,j)-varLoc(i,j-1) )
144     ENDDO
145     ENDDO
146 jmc 1.3
147     #ifdef NONLIN_FRSURF
148     IF (select_rStar.GE.2 .AND. nonlinFreeSurf.GE.1 ) THEN
149     IF ( buoyancyRelation .EQ. 'OCEANIC' ) THEN
150     C-- z* coordinate slope term: rho'/rho0 * Grad_r(g.z)
151     factorZ = gravity*recip_rhoConst*0.5 _d 0
152     DO j=jMin-1,jMax
153     DO i=iMin-1,iMax
154     varLoc(i,j) = etaH(i,j,bi,bj)
155     & *(1. _d 0 + rC(k)*recip_Rcol(i,j,bi,bj))
156     ENDDO
157     ENDDO
158     DO j=jMin,jMax
159     DO i=iMin,iMax
160     dPhiHydX(i,j) = dPhiHydX(i,j)
161     & +factorZ*(alphRho(i-1,j)+alphRho(i,j))
162     & *(varLoc(i,j)-varLoc(i-1,j))
163     & *recip_dxC(i,j,bi,bj)
164     dPhiHydY(i,j) = dPhiHydY(i,j)
165     & +factorZ*(alphRho(i,j-1)+alphRho(i,j))
166     & *(varLoc(i,j)-varLoc(i,j-1))
167     & *recip_dyC(i,j,bi,bj)
168     ENDDO
169     ENDDO
170     ELSEIF (buoyancyRelation .EQ. 'OCEANICP' ) THEN
171     C-- p* coordinate slope term: alpha' * Grad_r( p )
172     factorP = 0.5 _d 0
173     DO j=jMin,jMax
174     DO i=iMin,iMax
175     dPhiHydX(i,j) = dPhiHydX(i,j)
176     & +factorP*(alphRho(i-1,j)+alphRho(i,j))
177     & *(rStarFacC(i,j,bi,bj)-rStarFacC(i-1,j,bi,bj))
178     & *rC(k)*recip_dxC(i,j,bi,bj)
179     dPhiHydY(i,j) = dPhiHydY(i,j)
180     & +factorP*(alphRho(i,j-1)+alphRho(i,j))
181     & *(rStarFacC(i,j,bi,bj)-rStarFacC(i,j-1,bi,bj))
182     & *rC(k)*recip_dyC(i,j,bi,bj)
183     ENDDO
184     ENDDO
185     ELSEIF ( buoyancyRelation .EQ. 'ATMOSPHERIC' ) THEN
186     C-- p* coordinate slope term: alpha' * Grad_r( p )
187     conv_theta2T = (rC(k)/atm_Po)**atm_kappa
188     factorP = (atm_Rd/rC(k))*conv_theta2T*0.5 _d 0
189     DO j=jMin,jMax
190     DO i=iMin,iMax
191     dPhiHydX(i,j) = dPhiHydX(i,j)
192 jmc 1.5 & +factorP*(alphRho(i-1,j)+alphRho(i,j))
193 jmc 1.3 & *(rStarFacC(i,j,bi,bj)-rStarFacC(i-1,j,bi,bj))
194     & *rC(k)*recip_dxC(i,j,bi,bj)
195     dPhiHydY(i,j) = dPhiHydY(i,j)
196 jmc 1.5 & +factorP*(alphRho(i,j-1)+alphRho(i,j))
197 jmc 1.3 & *(rStarFacC(i,j,bi,bj)-rStarFacC(i,j-1,bi,bj))
198     & *rC(k)*recip_dyC(i,j,bi,bj)
199     ENDDO
200     ENDDO
201     ENDIF
202     ENDIF
203     #endif /* NONLIN_FRSURF */
204 jmc 1.1
205     #endif /* INCLUDE_PHIHYD_CALCULATION_CODE */
206    
207     RETURN
208     END

  ViewVC Help
Powered by ViewVC 1.1.22