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

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

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


Revision 1.24 - (hide annotations) (download)
Wed Jun 6 15:14:06 2001 UTC (22 years, 11 months ago) by adcroft
Branch: MAIN
Changes since 1.23: +5 -1 lines
Missed the IF(debugMode) around DEBUG stuff.

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

  ViewVC Help
Powered by ViewVC 1.1.22