/[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.42 - (show annotations) (download)
Tue Nov 4 18:40:58 2003 UTC (20 years, 6 months ago) by edhill
Branch: MAIN
CVS Tags: checkpoint52l_pre, hrcube4, hrcube5, checkpoint52d_pre, checkpoint56b_post, checkpoint52j_pre, checkpoint54d_post, checkpoint54e_post, checkpoint52l_post, checkpoint52k_post, checkpoint55, checkpoint54, checkpoint57, checkpoint56, checkpoint53, checkpoint52, checkpoint52f_post, checkpoint54f_post, checkpoint51t_post, checkpoint55i_post, checkpoint52i_pre, hrcube_1, hrcube_2, hrcube_3, checkpoint51s_post, checkpoint55c_post, checkpoint52e_pre, checkpoint52e_post, checkpoint53d_post, checkpoint57a_post, checkpoint52b_pre, checkpoint54b_post, checkpoint52m_post, checkpoint55g_post, checkpoint52b_post, checkpoint52c_post, checkpoint52f_pre, checkpoint55d_post, checkpoint54a_pre, checkpoint53c_post, checkpoint55d_pre, checkpoint55j_post, checkpoint54a_post, checkpoint55h_post, checkpoint55b_post, checkpoint53a_post, checkpoint55f_post, checkpoint52d_post, checkpoint53g_post, checkpoint52a_pre, checkpoint52i_post, checkpoint52h_pre, checkpoint56a_post, checkpoint53f_post, checkpoint52j_post, branch-netcdf, checkpoint52n_post, checkpoint53b_pre, checkpoint56c_post, checkpoint57a_pre, checkpoint55a_post, checkpoint53b_post, checkpoint52a_post, ecco_c52_e35, checkpoint53d_pre, checkpoint55e_post, checkpoint54c_post, checkpoint51u_post
Branch point for: netcdf-sm0
Changes since 1.41: +3 -3 lines
 o cleanup: convert '#ifndef DISABLE_DEBUGMODE"' to '#ifdef ALLOW_DEBUG"'

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

  ViewVC Help
Powered by ViewVC 1.1.22