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

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

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


Revision 1.18 - (show annotations) (download)
Thu Mar 8 20:40:57 2001 UTC (23 years, 2 months ago) by jmc
Branch: MAIN
Changes since 1.17: +21 -22 lines
all potentials (cg2d_x, cg3d_x, phiHyd) have units of P/rho in ocean AND atmos
  affects 2D and 3D solver (Matrix divided by g) for both atmos and ocean.

1 C $Header: /u/gcmpack/models/MITgcmUV/model/src/solve_for_pressure.F,v 1.17 2001/03/06 16:57:10 jmc Exp $
2 C $Name: $
3
4 #include "CPP_OPTIONS.h"
5
6 CStartOfInterface
7 SUBROUTINE SOLVE_FOR_PRESSURE( myThid )
8 C /==========================================================\
9 C | SUBROUTINE SOLVE_FOR_PRESSURE |
10 C | o Controls inversion of two and/or three-dimensional |
11 C | elliptic problems for the pressure field. |
12 C \==========================================================/
13 IMPLICIT NONE
14
15 C == Global variables
16 #include "SIZE.h"
17 #include "EEPARAMS.h"
18 #include "PARAMS.h"
19 #include "DYNVARS.h"
20 #include "GRID.h"
21 #include "SURFACE.h"
22 #ifdef ALLOW_NONHYDROSTATIC
23 #include "CG3D.h"
24 #include "GW.h"
25 #endif
26 #ifdef ALLOW_OBCS
27 #include "OBCS.h"
28 #endif
29
30 C == Routine arguments ==
31 C myThid - Number of this instance of SOLVE_FOR_PRESSURE
32 INTEGER myThid
33 CEndOfInterface
34
35 C Local variables
36 C cg2d_x - Conjugate Gradient 2-D solver : Solution vector
37 C cg2d_b - Conjugate Gradient 2-D solver : Right-hand side vector
38 INTEGER i,j,k,bi,bj
39 _RS uf(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
40 _RS vf(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
41 _RL cg2d_x(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
42 _RL cg2d_b(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
43
44 C-- Save previous solution & Initialise Vector solution and source term :
45 DO bj=myByLo(myThid),myByHi(myThid)
46 DO bi=myBxLo(myThid),myBxHi(myThid)
47 DO j=1-OLy,sNy+OLy
48 DO i=1-OLx,sNx+OLx
49 #ifdef INCLUDE_CD_CODE
50 etaNm1(i,j,bi,bj) = etaN(i,j,bi,bj)
51 #endif
52 cg2d_x(i,j,bi,bj) = Bo_surf(i,j,bi,bj)*etaN(i,j,bi,bj)
53 cg2d_b(i,j,bi,bj) = 0.
54 #ifdef USE_NATURAL_BCS
55 & + freeSurfFac*_rA(i,j,bi,bj)*
56 & EmPmR(I,J,bi,bj)/deltaTMom
57 #endif
58 ENDDO
59 ENDDO
60 ENDDO
61 ENDDO
62
63 DO bj=myByLo(myThid),myByHi(myThid)
64 DO bi=myBxLo(myThid),myBxHi(myThid)
65 DO K=Nr,1,-1
66 DO j=1,sNy+1
67 DO i=1,sNx+1
68 uf(i,j) = _dyG(i,j,bi,bj)
69 & *drF(k)*_hFacW(i,j,k,bi,bj)
70 vf(i,j) = _dxG(i,j,bi,bj)
71 & *drF(k)*_hFacS(i,j,k,bi,bj)
72 ENDDO
73 ENDDO
74 CALL CALC_DIV_GHAT(
75 I bi,bj,1,sNx,1,sNy,K,
76 I uf,vf,
77 U cg2d_b,
78 I myThid)
79 ENDDO
80 ENDDO
81 ENDDO
82
83 C-- Add source term arising from w=d/dt (p_s + p_nh)
84 DO bj=myByLo(myThid),myByHi(myThid)
85 DO bi=myBxLo(myThid),myBxHi(myThid)
86 #ifdef ALLOW_NONHYDROSTATIC
87 DO j=1,sNy
88 DO i=1,sNx
89 cg2d_b(i,j,bi,bj) = cg2d_b(i,j,bi,bj)
90 & -freeSurfFac*_rA(i,j,bi,bj)/deltaTMom/deltaTMom
91 & *( etaN(i,j,bi,bj)
92 & +cg3d_x(i,j,1,bi,bj)*horiVertRatio/gravity )
93 cg3d_b(i,j,1,bi,bj) = cg3d_b(i,j,1,bi,bj)
94 & -freeSurfFac*_rA(i,j,bi,bj)/deltaTMom/deltaTMom
95 & *( etaN(i,j,bi,bj)
96 & +cg3d_x(i,j,1,bi,bj)*horiVertRatio/gravity )
97 C-jmc
98 c & -freeSurfFac*_rA(i,j,bi,bj)*recip_Bo(i,j,bi,bj)
99 c & *( cg2d_x(i,j,bi,bj) + cg3d_x(i,j,1,bi,bj) )
100 c & /deltaTMom/deltaTMom
101 C-jmc
102 ENDDO
103 ENDDO
104 #else
105 DO j=1,sNy
106 DO i=1,sNx
107 cg2d_b(i,j,bi,bj) = cg2d_b(i,j,bi,bj)
108 & -freeSurfFac*_rA(i,j,bi,bj)/deltaTMom/deltaTMom
109 & * etaN(i,j,bi,bj)
110 ENDDO
111 ENDDO
112 #endif
113
114 #ifdef ALLOW_OBCS
115 IF (useOBCS) THEN
116 DO i=1,sNx
117 C Northern boundary
118 IF (OB_Jn(I,bi,bj).NE.0) THEN
119 cg2d_b(I,OB_Jn(I,bi,bj),bi,bj)=0.
120 ENDIF
121 C Southern boundary
122 IF (OB_Js(I,bi,bj).NE.0) THEN
123 cg2d_b(I,OB_Js(I,bi,bj),bi,bj)=0.
124 ENDIF
125 ENDDO
126 DO j=1,sNy
127 C Eastern boundary
128 IF (OB_Ie(J,bi,bj).NE.0) THEN
129 cg2d_b(OB_Ie(J,bi,bj),J,bi,bj)=0.
130 ENDIF
131 C Western boundary
132 IF (OB_Iw(J,bi,bj).NE.0) THEN
133 cg2d_b(OB_Iw(J,bi,bj),J,bi,bj)=0.
134 ENDIF
135 ENDDO
136 ENDIF
137 #endif
138 ENDDO
139 ENDDO
140
141
142 C-- Find the surface pressure using a two-dimensional conjugate
143 C-- gradient solver.
144 C see CG2D_INTERNAL.h for the interface to this routine.
145 CALL CG2D(
146 I cg2d_b,
147 U cg2d_x,
148 I myThid )
149
150 _EXCH_XY_R8(cg2d_x, myThid )
151
152 C-- Transfert the 2D-solution to "etaN" :
153 DO bj=myByLo(myThid),myByHi(myThid)
154 DO bi=myBxLo(myThid),myBxHi(myThid)
155 DO j=1-OLy,sNy+OLy
156 DO i=1-OLx,sNx+OLx
157 etaN(i,j,bi,bj) = recip_Bo(i,j,bi,bj)*cg2d_x(i,j,bi,bj)
158 ENDDO
159 ENDDO
160 ENDDO
161 ENDDO
162
163 #ifdef ALLOW_NONHYDROSTATIC
164 IF ( nonHydrostatic ) THEN
165
166 C-- Solve for a three-dimensional pressure term (NH or IGW or both ).
167 C see CG3D.h for the interface to this routine.
168 DO bj=myByLo(myThid),myByHi(myThid)
169 DO bi=myBxLo(myThid),myBxHi(myThid)
170 DO j=1,sNy+1
171 DO i=1,sNx+1
172 uf(i,j)=-_recip_dxC(i,j,bi,bj)*
173 & (cg2d_x(i,j,bi,bj)-cg2d_x(i-1,j,bi,bj))
174 vf(i,j)=-_recip_dyC(i,j,bi,bj)*
175 & (cg2d_x(i,j,bi,bj)-cg2d_x(i,j-1,bi,bj))
176 ENDDO
177 ENDDO
178
179 #ifdef ALLOW_OBCS
180 IF (useOBCS) THEN
181 DO i=1,sNx+1
182 C Northern boundary
183 IF (OB_Jn(I,bi,bj).NE.0) THEN
184 vf(I,OB_Jn(I,bi,bj))=0.
185 ENDIF
186 C Southern boundary
187 IF (OB_Js(I,bi,bj).NE.0) THEN
188 vf(I,OB_Js(I,bi,bj)+1)=0.
189 ENDIF
190 ENDDO
191 DO j=1,sNy+1
192 C Eastern boundary
193 IF (OB_Ie(J,bi,bj).NE.0) THEN
194 uf(OB_Ie(J,bi,bj),J)=0.
195 ENDIF
196 C Western boundary
197 IF (OB_Iw(J,bi,bj).NE.0) THEN
198 uf(OB_Iw(J,bi,bj)+1,J)=0.
199 ENDIF
200 ENDDO
201 ENDIF
202 #endif
203
204 K=1
205 DO j=1,sNy
206 DO i=1,sNx
207 cg3d_b(i,j,k,bi,bj) = cg3d_b(i,j,k,bi,bj)
208 & +dRF(K)*dYG(i+1,j,bi,bj)*hFacW(i+1,j,k,bi,bj)*uf(i+1,j)
209 & -dRF(K)*dYG( i ,j,bi,bj)*hFacW( i ,j,k,bi,bj)*uf( i ,j)
210 & +dRF(K)*dXG(i,j+1,bi,bj)*hFacS(i,j+1,k,bi,bj)*vf(i,j+1)
211 & -dRF(K)*dXG(i, j ,bi,bj)*hFacS(i, j ,k,bi,bj)*vf(i, j )
212 & +( freeSurfFac*etaN(i,j,bi,bj)/deltaTMom
213 & -wVel(i,j,k+1,bi,bj)
214 & )*_rA(i,j,bi,bj)/deltaTmom
215 ENDDO
216 ENDDO
217 DO K=2,Nr-1
218 DO j=1,sNy
219 DO i=1,sNx
220 cg3d_b(i,j,k,bi,bj) = cg3d_b(i,j,k,bi,bj)
221 & +dRF(K)*dYG(i+1,j,bi,bj)*hFacW(i+1,j,k,bi,bj)*uf(i+1,j)
222 & -dRF(K)*dYG( i ,j,bi,bj)*hFacW( i ,j,k,bi,bj)*uf( i ,j)
223 & +dRF(K)*dXG(i,j+1,bi,bj)*hFacS(i,j+1,k,bi,bj)*vf(i,j+1)
224 & -dRF(K)*dXG(i, j ,bi,bj)*hFacS(i, j ,k,bi,bj)*vf(i, j )
225 & +( wVel(i,j,k ,bi,bj)
226 & -wVel(i,j,k+1,bi,bj)
227 & )*_rA(i,j,bi,bj)/deltaTmom
228
229 ENDDO
230 ENDDO
231 ENDDO
232 K=Nr
233 DO j=1,sNy
234 DO i=1,sNx
235 cg3d_b(i,j,k,bi,bj) = cg3d_b(i,j,k,bi,bj)
236 & +dRF(K)*dYG(i+1,j,bi,bj)*hFacW(i+1,j,k,bi,bj)*uf(i+1,j)
237 & -dRF(K)*dYG( i ,j,bi,bj)*hFacW( i ,j,k,bi,bj)*uf( i ,j)
238 & +dRF(K)*dXG(i,j+1,bi,bj)*hFacS(i,j+1,k,bi,bj)*vf(i,j+1)
239 & -dRF(K)*dXG(i, j ,bi,bj)*hFacS(i, j ,k,bi,bj)*vf(i, j )
240 & +( wVel(i,j,k ,bi,bj)
241 & )*_rA(i,j,bi,bj)/deltaTmom
242
243 ENDDO
244 ENDDO
245
246 #ifdef ALLOW_OBCS
247 IF (useOBCS) THEN
248 DO K=1,Nr
249 DO i=1,sNx
250 C Northern boundary
251 IF (OB_Jn(I,bi,bj).NE.0) THEN
252 cg3d_b(I,OB_Jn(I,bi,bj),K,bi,bj)=0.
253 ENDIF
254 C Southern boundary
255 IF (OB_Js(I,bi,bj).NE.0) THEN
256 cg3d_b(I,OB_Js(I,bi,bj),K,bi,bj)=0.
257 ENDIF
258 ENDDO
259 DO j=1,sNy
260 C Eastern boundary
261 IF (OB_Ie(J,bi,bj).NE.0) THEN
262 cg3d_b(OB_Ie(J,bi,bj),J,K,bi,bj)=0.
263 ENDIF
264 C Western boundary
265 IF (OB_Iw(J,bi,bj).NE.0) THEN
266 cg3d_b(OB_Iw(J,bi,bj),J,K,bi,bj)=0.
267 ENDIF
268 ENDDO
269 ENDDO
270 ENDIF
271 #endif
272
273 ENDDO ! bi
274 ENDDO ! bj
275
276 CALL CG3D( myThid )
277 _EXCH_XYZ_R8(cg3d_x, myThid )
278
279 ENDIF
280 #endif
281
282 RETURN
283 END

  ViewVC Help
Powered by ViewVC 1.1.22