/[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.32 - (show annotations) (download)
Sat Jun 15 03:18:07 2002 UTC (21 years, 11 months ago) by jmc
Branch: MAIN
Changes since 1.31: +17 -9 lines
* reduce cg2d_ output Freq to monitorFreq.

1 C $Header: /u/gcmpack/MITgcm/model/src/solve_for_pressure.F,v 1.31 2002/03/27 23:13:39 jmc Exp $
2 C $Name: $
3
4 #include "CPP_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: SOLVE_FOR_PRESSURE
8 C !INTERFACE:
9 SUBROUTINE SOLVE_FOR_PRESSURE(myTime, myIter, myThid)
10
11 C !DESCRIPTION: \bv
12 C *==========================================================*
13 C | SUBROUTINE SOLVE_FOR_PRESSURE
14 C | o Controls inversion of two and/or three-dimensional
15 C | elliptic problems for the pressure field.
16 C *==========================================================*
17 C \ev
18
19 C !USES:
20 IMPLICIT NONE
21 C == Global variables
22 #include "SIZE.h"
23 #include "EEPARAMS.h"
24 #include "PARAMS.h"
25 #include "DYNVARS.h"
26 #include "GRID.h"
27 #include "SURFACE.h"
28 #include "FFIELDS.h"
29 #ifdef ALLOW_NONHYDROSTATIC
30 #include "SOLVE_FOR_PRESSURE3D.h"
31 #include "GW.h"
32 #endif
33 #ifdef ALLOW_OBCS
34 #include "OBCS.h"
35 #endif
36 #include "SOLVE_FOR_PRESSURE.h"
37
38 C === Functions ====
39 LOGICAL DIFFERENT_MULTIPLE
40 EXTERNAL DIFFERENT_MULTIPLE
41
42 C !INPUT/OUTPUT PARAMETERS:
43 C == Routine arguments ==
44 C myTime - Current time in simulation
45 C myIter - Current iteration number in simulation
46 C myThid - Thread number for this instance of SOLVE_FOR_PRESSURE
47 _RL myTime
48 INTEGER myIter
49 INTEGER myThid
50
51 C !LOCAL VARIABLES:
52 C == Local variables ==
53 INTEGER i,j,k,bi,bj
54 _RS uf(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
55 _RS vf(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
56 _RL firstResidual,lastResidual
57 _RL tmpFac
58 INTEGER numIters
59 CHARACTER*(MAX_LEN_MBUF) msgBuf
60 CEOP
61
62 C-- Save previous solution & Initialise Vector solution and source term :
63 DO bj=myByLo(myThid),myByHi(myThid)
64 DO bi=myBxLo(myThid),myBxHi(myThid)
65 DO j=1-OLy,sNy+OLy
66 DO i=1-OLx,sNx+OLx
67 #ifdef INCLUDE_CD_CODE
68 etaNm1(i,j,bi,bj) = etaN(i,j,bi,bj)
69 #endif
70 cg2d_x(i,j,bi,bj) = Bo_surf(i,j,bi,bj)*etaN(i,j,bi,bj)
71 cg2d_b(i,j,bi,bj) = 0.
72 ENDDO
73 ENDDO
74 IF (useRealFreshWaterFlux) THEN
75 tmpFac = freeSurfFac
76 IF (exactConserv) tmpFac = freeSurfFac*implicDiv2DFlow
77 DO j=1,sNy
78 DO i=1,sNx
79 cg2d_b(i,j,bi,bj) =
80 & tmpFac*_rA(i,j,bi,bj)*EmPmR(i,j,bi,bj)/deltaTMom
81 ENDDO
82 ENDDO
83 ENDIF
84 ENDDO
85 ENDDO
86
87 DO bj=myByLo(myThid),myByHi(myThid)
88 DO bi=myBxLo(myThid),myBxHi(myThid)
89 DO K=Nr,1,-1
90 DO j=1,sNy+1
91 DO i=1,sNx+1
92 uf(i,j) = _dyG(i,j,bi,bj)
93 & *drF(k)*_hFacW(i,j,k,bi,bj)
94 vf(i,j) = _dxG(i,j,bi,bj)
95 & *drF(k)*_hFacS(i,j,k,bi,bj)
96 ENDDO
97 ENDDO
98 CALL CALC_DIV_GHAT(
99 I bi,bj,1,sNx,1,sNy,K,
100 I uf,vf,
101 U cg2d_b,
102 I myThid)
103 ENDDO
104 ENDDO
105 ENDDO
106
107 C-- Add source term arising from w=d/dt (p_s + p_nh)
108 DO bj=myByLo(myThid),myByHi(myThid)
109 DO bi=myBxLo(myThid),myBxHi(myThid)
110 #ifdef ALLOW_NONHYDROSTATIC
111 IF ( nonHydrostatic ) THEN
112 DO j=1,sNy
113 DO i=1,sNx
114 cg2d_b(i,j,bi,bj) = cg2d_b(i,j,bi,bj)
115 & -freeSurfFac*_rA(i,j,bi,bj)/deltaTMom/deltaTMom
116 & *( etaN(i,j,bi,bj)
117 & +phi_nh(i,j,1,bi,bj)*horiVertRatio/gravity )
118 cg3d_b(i,j,1,bi,bj) = cg3d_b(i,j,1,bi,bj)
119 & -freeSurfFac*_rA(i,j,bi,bj)/deltaTMom/deltaTMom
120 & *( etaN(i,j,bi,bj)
121 & +phi_nh(i,j,1,bi,bj)*horiVertRatio/gravity )
122 ENDDO
123 ENDDO
124 ELSEIF ( exactConserv ) THEN
125 #else
126 IF ( exactConserv ) THEN
127 #endif
128 DO j=1,sNy
129 DO i=1,sNx
130 cg2d_b(i,j,bi,bj) = cg2d_b(i,j,bi,bj)
131 & -freeSurfFac*_rA(i,j,bi,bj)/deltaTMom/deltaTMom
132 & * etaH(i,j,bi,bj)
133 ENDDO
134 ENDDO
135 ELSE
136 DO j=1,sNy
137 DO i=1,sNx
138 cg2d_b(i,j,bi,bj) = cg2d_b(i,j,bi,bj)
139 & -freeSurfFac*_rA(i,j,bi,bj)/deltaTMom/deltaTMom
140 & * etaN(i,j,bi,bj)
141 ENDDO
142 ENDDO
143 ENDIF
144
145 #ifdef ALLOW_OBCS
146 IF (useOBCS) THEN
147 DO i=1,sNx
148 C Northern boundary
149 IF (OB_Jn(I,bi,bj).NE.0) THEN
150 cg2d_b(I,OB_Jn(I,bi,bj),bi,bj)=0.
151 cg2d_x(I,OB_Jn(I,bi,bj),bi,bj)=0.
152 ENDIF
153 C Southern boundary
154 IF (OB_Js(I,bi,bj).NE.0) THEN
155 cg2d_b(I,OB_Js(I,bi,bj),bi,bj)=0.
156 cg2d_x(I,OB_Js(I,bi,bj),bi,bj)=0.
157 ENDIF
158 ENDDO
159 DO j=1,sNy
160 C Eastern boundary
161 IF (OB_Ie(J,bi,bj).NE.0) THEN
162 cg2d_b(OB_Ie(J,bi,bj),J,bi,bj)=0.
163 cg2d_x(OB_Ie(J,bi,bj),J,bi,bj)=0.
164 ENDIF
165 C Western boundary
166 IF (OB_Iw(J,bi,bj).NE.0) THEN
167 cg2d_b(OB_Iw(J,bi,bj),J,bi,bj)=0.
168 cg2d_x(OB_Iw(J,bi,bj),J,bi,bj)=0.
169 ENDIF
170 ENDDO
171 ENDIF
172 #endif
173 ENDDO
174 ENDDO
175
176 #ifndef DISABLE_DEBUGMODE
177 IF (debugMode) THEN
178 CALL DEBUG_STATS_RL(1,cg2d_b,'cg2d_b (SOLVE_FOR_PRESSURE)',
179 & myThid)
180 ENDIF
181 #endif
182
183 C-- Find the surface pressure using a two-dimensional conjugate
184 C-- gradient solver.
185 C see CG2D.h for the interface to this routine.
186 firstResidual=0.
187 lastResidual=0.
188 numIters=cg2dMaxIters
189 CALL CG2D(
190 U cg2d_b,
191 U cg2d_x,
192 O firstResidual,
193 O lastResidual,
194 U numIters,
195 I myThid )
196 _EXCH_XY_R8(cg2d_x, myThid )
197
198 #ifndef DISABLE_DEBUGMODE
199 IF (debugMode) THEN
200 CALL DEBUG_STATS_RL(1,cg2d_x,'cg2d_x (SOLVE_FOR_PRESSURE)',
201 & myThid)
202 ENDIF
203 #endif
204
205 C- dump CG2D output at monitorFreq (to reduce size of STD-OUTPUT files) :
206 IF ( DIFFERENT_MULTIPLE(monitorFreq,myTime,
207 & myTime-deltaTClock) ) THEN
208 _BEGIN_MASTER( myThid )
209 WRITE(msgBuf,'(A34,1PE24.14)') 'cg2d_init_res =',firstResidual
210 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
211 WRITE(msgBuf,'(A34,I6)') 'cg2d_iters =',numIters
212 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
213 WRITE(msgBuf,'(A34,1PE24.14)') 'cg2d_res =',lastResidual
214 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
215 _END_MASTER( )
216 ENDIF
217
218 C-- Transfert the 2D-solution to "etaN" :
219 DO bj=myByLo(myThid),myByHi(myThid)
220 DO bi=myBxLo(myThid),myBxHi(myThid)
221 DO j=1-OLy,sNy+OLy
222 DO i=1-OLx,sNx+OLx
223 etaN(i,j,bi,bj) = recip_Bo(i,j,bi,bj)*cg2d_x(i,j,bi,bj)
224 ENDDO
225 ENDDO
226 ENDDO
227 ENDDO
228
229 #ifdef ALLOW_NONHYDROSTATIC
230 IF ( nonHydrostatic ) THEN
231
232 C-- Solve for a three-dimensional pressure term (NH or IGW or both ).
233 C see CG3D.h for the interface to this routine.
234 DO bj=myByLo(myThid),myByHi(myThid)
235 DO bi=myBxLo(myThid),myBxHi(myThid)
236 DO j=1,sNy+1
237 DO i=1,sNx+1
238 uf(i,j)=-_recip_dxC(i,j,bi,bj)*
239 & (cg2d_x(i,j,bi,bj)-cg2d_x(i-1,j,bi,bj))
240 vf(i,j)=-_recip_dyC(i,j,bi,bj)*
241 & (cg2d_x(i,j,bi,bj)-cg2d_x(i,j-1,bi,bj))
242 ENDDO
243 ENDDO
244
245 #ifdef ALLOW_OBCS
246 IF (useOBCS) THEN
247 DO i=1,sNx+1
248 C Northern boundary
249 IF (OB_Jn(I,bi,bj).NE.0) THEN
250 vf(I,OB_Jn(I,bi,bj))=0.
251 ENDIF
252 C Southern boundary
253 IF (OB_Js(I,bi,bj).NE.0) THEN
254 vf(I,OB_Js(I,bi,bj)+1)=0.
255 ENDIF
256 ENDDO
257 DO j=1,sNy+1
258 C Eastern boundary
259 IF (OB_Ie(J,bi,bj).NE.0) THEN
260 uf(OB_Ie(J,bi,bj),J)=0.
261 ENDIF
262 C Western boundary
263 IF (OB_Iw(J,bi,bj).NE.0) THEN
264 uf(OB_Iw(J,bi,bj)+1,J)=0.
265 ENDIF
266 ENDDO
267 ENDIF
268 #endif
269
270 K=1
271 DO j=1,sNy
272 DO i=1,sNx
273 cg3d_b(i,j,k,bi,bj) = cg3d_b(i,j,k,bi,bj)
274 & +dRF(K)*dYG(i+1,j,bi,bj)*hFacW(i+1,j,k,bi,bj)*uf(i+1,j)
275 & -dRF(K)*dYG( i ,j,bi,bj)*hFacW( i ,j,k,bi,bj)*uf( i ,j)
276 & +dRF(K)*dXG(i,j+1,bi,bj)*hFacS(i,j+1,k,bi,bj)*vf(i,j+1)
277 & -dRF(K)*dXG(i, j ,bi,bj)*hFacS(i, j ,k,bi,bj)*vf(i, j )
278 & +( freeSurfFac*etaN(i,j,bi,bj)/deltaTMom
279 & -wVel(i,j,k+1,bi,bj)
280 & )*_rA(i,j,bi,bj)/deltaTmom
281 ENDDO
282 ENDDO
283 DO K=2,Nr-1
284 DO j=1,sNy
285 DO i=1,sNx
286 cg3d_b(i,j,k,bi,bj) = cg3d_b(i,j,k,bi,bj)
287 & +dRF(K)*dYG(i+1,j,bi,bj)*hFacW(i+1,j,k,bi,bj)*uf(i+1,j)
288 & -dRF(K)*dYG( i ,j,bi,bj)*hFacW( i ,j,k,bi,bj)*uf( i ,j)
289 & +dRF(K)*dXG(i,j+1,bi,bj)*hFacS(i,j+1,k,bi,bj)*vf(i,j+1)
290 & -dRF(K)*dXG(i, j ,bi,bj)*hFacS(i, j ,k,bi,bj)*vf(i, j )
291 & +( wVel(i,j,k ,bi,bj)
292 & -wVel(i,j,k+1,bi,bj)
293 & )*_rA(i,j,bi,bj)/deltaTmom
294
295 ENDDO
296 ENDDO
297 ENDDO
298 K=Nr
299 DO j=1,sNy
300 DO i=1,sNx
301 cg3d_b(i,j,k,bi,bj) = cg3d_b(i,j,k,bi,bj)
302 & +dRF(K)*dYG(i+1,j,bi,bj)*hFacW(i+1,j,k,bi,bj)*uf(i+1,j)
303 & -dRF(K)*dYG( i ,j,bi,bj)*hFacW( i ,j,k,bi,bj)*uf( i ,j)
304 & +dRF(K)*dXG(i,j+1,bi,bj)*hFacS(i,j+1,k,bi,bj)*vf(i,j+1)
305 & -dRF(K)*dXG(i, j ,bi,bj)*hFacS(i, j ,k,bi,bj)*vf(i, j )
306 & +( wVel(i,j,k ,bi,bj)
307 & )*_rA(i,j,bi,bj)/deltaTmom
308
309 ENDDO
310 ENDDO
311
312 #ifdef ALLOW_OBCS
313 IF (useOBCS) THEN
314 DO K=1,Nr
315 DO i=1,sNx
316 C Northern boundary
317 IF (OB_Jn(I,bi,bj).NE.0) THEN
318 cg3d_b(I,OB_Jn(I,bi,bj),K,bi,bj)=0.
319 ENDIF
320 C Southern boundary
321 IF (OB_Js(I,bi,bj).NE.0) THEN
322 cg3d_b(I,OB_Js(I,bi,bj),K,bi,bj)=0.
323 ENDIF
324 ENDDO
325 DO j=1,sNy
326 C Eastern boundary
327 IF (OB_Ie(J,bi,bj).NE.0) THEN
328 cg3d_b(OB_Ie(J,bi,bj),J,K,bi,bj)=0.
329 ENDIF
330 C Western boundary
331 IF (OB_Iw(J,bi,bj).NE.0) THEN
332 cg3d_b(OB_Iw(J,bi,bj),J,K,bi,bj)=0.
333 ENDIF
334 ENDDO
335 ENDDO
336 ENDIF
337 #endif
338
339 ENDDO ! bi
340 ENDDO ! bj
341
342 firstResidual=0.
343 lastResidual=0.
344 numIters=cg2dMaxIters
345 CALL CG3D(
346 U cg3d_b,
347 U phi_nh,
348 O firstResidual,
349 O lastResidual,
350 U numIters,
351 I myThid )
352 _EXCH_XYZ_R8(phi_nh, myThid )
353
354 _BEGIN_MASTER( myThid )
355 WRITE(msgBuf,'(A34,1PE24.14)') 'cg3d_init_res =',firstResidual
356 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
357 WRITE(msgBuf,'(A34,I6)') 'cg3d_iters =',numIters
358 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
359 WRITE(msgBuf,'(A34,1PE24.14)') 'cg3d_res =',lastResidual
360 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
361 _END_MASTER( )
362
363 ENDIF
364 #endif
365
366 RETURN
367 END

  ViewVC Help
Powered by ViewVC 1.1.22