/[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.36 - (show annotations) (download)
Mon Oct 7 16:20:39 2002 UTC (21 years, 7 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint46n_post, checkpoint47e_post, checkpoint46l_post, checkpoint47c_post, checkpoint50c_post, checkpoint48e_post, checkpoint50c_pre, checkpoint48i_post, checkpoint46l_pre, checkpoint50, checkpoint50b_pre, checkpoint48b_post, checkpoint48c_pre, checkpoint47d_pre, checkpoint47a_post, checkpoint48d_pre, checkpoint47i_post, checkpoint47d_post, checkpoint48d_post, checkpoint48f_post, checkpoint48h_post, checkpoint47g_post, checkpoint46j_post, checkpoint46k_post, checkpoint48a_post, checkpoint50a_post, checkpoint47j_post, branch-exfmods-tag, checkpoint48c_post, checkpoint47b_post, checkpoint46m_post, checkpoint47f_post, checkpoint50d_pre, checkpoint47, checkpoint48, checkpoint49, checkpoint48g_post, checkpoint47h_post, checkpoint50b_post
Branch point for: branch-exfmods-curt
Changes since 1.35: +4 -10 lines
* update timeave pkg for wVel diagnostic ; put convertEmP2rUnit in PARAMS.h

1 C $Header: /u/gcmpack/MITgcm/model/src/solve_for_pressure.F,v 1.35 2002/09/25 19:36:50 mlosch 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*convertEmP2rUnit
76 IF (exactConserv)
77 & tmpFac = freeSurfFac*convertEmP2rUnit*implicDiv2DFlow
78 DO j=1,sNy
79 DO i=1,sNx
80 cg2d_b(i,j,bi,bj) =
81 & tmpFac*_rA(i,j,bi,bj)*EmPmR(i,j,bi,bj)/deltaTMom
82 ENDDO
83 ENDDO
84 ENDIF
85 ENDDO
86 ENDDO
87
88 DO bj=myByLo(myThid),myByHi(myThid)
89 DO bi=myBxLo(myThid),myBxHi(myThid)
90 DO K=Nr,1,-1
91 DO j=1,sNy+1
92 DO i=1,sNx+1
93 uf(i,j) = _dyG(i,j,bi,bj)
94 & *drF(k)*_hFacW(i,j,k,bi,bj)
95 vf(i,j) = _dxG(i,j,bi,bj)
96 & *drF(k)*_hFacS(i,j,k,bi,bj)
97 ENDDO
98 ENDDO
99 CALL CALC_DIV_GHAT(
100 I bi,bj,1,sNx,1,sNy,K,
101 I uf,vf,
102 U cg2d_b,
103 I myThid)
104 ENDDO
105 ENDDO
106 ENDDO
107
108 C-- Add source term arising from w=d/dt (p_s + p_nh)
109 DO bj=myByLo(myThid),myByHi(myThid)
110 DO bi=myBxLo(myThid),myBxHi(myThid)
111 #ifdef ALLOW_NONHYDROSTATIC
112 IF ( nonHydrostatic ) THEN
113 DO j=1,sNy
114 DO i=1,sNx
115 cg2d_b(i,j,bi,bj) = cg2d_b(i,j,bi,bj)
116 & -freeSurfFac*_rA(i,j,bi,bj)/deltaTMom/deltaTfreesurf
117 & *( etaN(i,j,bi,bj)
118 & +phi_nh(i,j,1,bi,bj)*horiVertRatio/gravity )
119 cg3d_b(i,j,1,bi,bj) = cg3d_b(i,j,1,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 ENDDO
124 ENDDO
125 ELSEIF ( exactConserv ) THEN
126 #else
127 IF ( exactConserv ) THEN
128 #endif
129 DO j=1,sNy
130 DO i=1,sNx
131 cg2d_b(i,j,bi,bj) = cg2d_b(i,j,bi,bj)
132 & -freeSurfFac*_rA(i,j,bi,bj)/deltaTMom/deltaTfreesurf
133 & * etaH(i,j,bi,bj)
134 ENDDO
135 ENDDO
136 ELSE
137 DO j=1,sNy
138 DO i=1,sNx
139 cg2d_b(i,j,bi,bj) = cg2d_b(i,j,bi,bj)
140 & -freeSurfFac*_rA(i,j,bi,bj)/deltaTMom/deltaTfreesurf
141 & * etaN(i,j,bi,bj)
142 ENDDO
143 ENDDO
144 ENDIF
145
146 #ifdef ALLOW_OBCS
147 IF (useOBCS) THEN
148 DO i=1,sNx
149 C Northern boundary
150 IF (OB_Jn(I,bi,bj).NE.0) THEN
151 cg2d_b(I,OB_Jn(I,bi,bj),bi,bj)=0.
152 cg2d_x(I,OB_Jn(I,bi,bj),bi,bj)=0.
153 ENDIF
154 C Southern boundary
155 IF (OB_Js(I,bi,bj).NE.0) THEN
156 cg2d_b(I,OB_Js(I,bi,bj),bi,bj)=0.
157 cg2d_x(I,OB_Js(I,bi,bj),bi,bj)=0.
158 ENDIF
159 ENDDO
160 DO j=1,sNy
161 C Eastern boundary
162 IF (OB_Ie(J,bi,bj).NE.0) THEN
163 cg2d_b(OB_Ie(J,bi,bj),J,bi,bj)=0.
164 cg2d_x(OB_Ie(J,bi,bj),J,bi,bj)=0.
165 ENDIF
166 C Western boundary
167 IF (OB_Iw(J,bi,bj).NE.0) THEN
168 cg2d_b(OB_Iw(J,bi,bj),J,bi,bj)=0.
169 cg2d_x(OB_Iw(J,bi,bj),J,bi,bj)=0.
170 ENDIF
171 ENDDO
172 ENDIF
173 #endif
174 ENDDO
175 ENDDO
176
177 #ifndef DISABLE_DEBUGMODE
178 IF (debugMode) THEN
179 CALL DEBUG_STATS_RL(1,cg2d_b,'cg2d_b (SOLVE_FOR_PRESSURE)',
180 & myThid)
181 ENDIF
182 #endif
183
184 C-- Find the surface pressure using a two-dimensional conjugate
185 C-- gradient solver.
186 C see CG2D.h for the interface to this routine.
187 firstResidual=0.
188 lastResidual=0.
189 numIters=cg2dMaxIters
190 CALL CG2D(
191 U cg2d_b,
192 U cg2d_x,
193 O firstResidual,
194 O lastResidual,
195 U numIters,
196 I myThid )
197 _EXCH_XY_R8(cg2d_x, myThid )
198
199 #ifndef DISABLE_DEBUGMODE
200 IF (debugMode) THEN
201 CALL DEBUG_STATS_RL(1,cg2d_x,'cg2d_x (SOLVE_FOR_PRESSURE)',
202 & myThid)
203 ENDIF
204 #endif
205
206 C- dump CG2D output at monitorFreq (to reduce size of STD-OUTPUT files) :
207 IF ( DIFFERENT_MULTIPLE(monitorFreq,myTime,
208 & myTime-deltaTClock) ) THEN
209 _BEGIN_MASTER( myThid )
210 WRITE(msgBuf,'(A34,1PE24.14)') 'cg2d_init_res =',firstResidual
211 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
212 WRITE(msgBuf,'(A34,I6)') 'cg2d_iters =',numIters
213 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
214 WRITE(msgBuf,'(A34,1PE24.14)') 'cg2d_res =',lastResidual
215 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
216 _END_MASTER( )
217 ENDIF
218
219 C-- Transfert the 2D-solution to "etaN" :
220 DO bj=myByLo(myThid),myByHi(myThid)
221 DO bi=myBxLo(myThid),myBxHi(myThid)
222 DO j=1-OLy,sNy+OLy
223 DO i=1-OLx,sNx+OLx
224 etaN(i,j,bi,bj) = recip_Bo(i,j,bi,bj)*cg2d_x(i,j,bi,bj)
225 ENDDO
226 ENDDO
227 ENDDO
228 ENDDO
229
230 #ifdef ALLOW_NONHYDROSTATIC
231 IF ( nonHydrostatic ) THEN
232
233 C-- Solve for a three-dimensional pressure term (NH or IGW or both ).
234 C see CG3D.h for the interface to this routine.
235 DO bj=myByLo(myThid),myByHi(myThid)
236 DO bi=myBxLo(myThid),myBxHi(myThid)
237 DO j=1,sNy+1
238 DO i=1,sNx+1
239 uf(i,j)=-_recip_dxC(i,j,bi,bj)*
240 & (cg2d_x(i,j,bi,bj)-cg2d_x(i-1,j,bi,bj))
241 vf(i,j)=-_recip_dyC(i,j,bi,bj)*
242 & (cg2d_x(i,j,bi,bj)-cg2d_x(i,j-1,bi,bj))
243 ENDDO
244 ENDDO
245
246 #ifdef ALLOW_OBCS
247 IF (useOBCS) THEN
248 DO i=1,sNx+1
249 C Northern boundary
250 IF (OB_Jn(I,bi,bj).NE.0) THEN
251 vf(I,OB_Jn(I,bi,bj))=0.
252 ENDIF
253 C Southern boundary
254 IF (OB_Js(I,bi,bj).NE.0) THEN
255 vf(I,OB_Js(I,bi,bj)+1)=0.
256 ENDIF
257 ENDDO
258 DO j=1,sNy+1
259 C Eastern boundary
260 IF (OB_Ie(J,bi,bj).NE.0) THEN
261 uf(OB_Ie(J,bi,bj),J)=0.
262 ENDIF
263 C Western boundary
264 IF (OB_Iw(J,bi,bj).NE.0) THEN
265 uf(OB_Iw(J,bi,bj)+1,J)=0.
266 ENDIF
267 ENDDO
268 ENDIF
269 #endif
270
271 K=1
272 DO j=1,sNy
273 DO i=1,sNx
274 cg3d_b(i,j,k,bi,bj) = cg3d_b(i,j,k,bi,bj)
275 & +dRF(K)*dYG(i+1,j,bi,bj)*hFacW(i+1,j,k,bi,bj)*uf(i+1,j)
276 & -dRF(K)*dYG( i ,j,bi,bj)*hFacW( i ,j,k,bi,bj)*uf( i ,j)
277 & +dRF(K)*dXG(i,j+1,bi,bj)*hFacS(i,j+1,k,bi,bj)*vf(i,j+1)
278 & -dRF(K)*dXG(i, j ,bi,bj)*hFacS(i, j ,k,bi,bj)*vf(i, j )
279 & +( freeSurfFac*etaN(i,j,bi,bj)/deltaTMom
280 & -wVel(i,j,k+1,bi,bj)
281 & )*_rA(i,j,bi,bj)/deltaTmom
282 ENDDO
283 ENDDO
284 DO K=2,Nr-1
285 DO j=1,sNy
286 DO i=1,sNx
287 cg3d_b(i,j,k,bi,bj) = cg3d_b(i,j,k,bi,bj)
288 & +dRF(K)*dYG(i+1,j,bi,bj)*hFacW(i+1,j,k,bi,bj)*uf(i+1,j)
289 & -dRF(K)*dYG( i ,j,bi,bj)*hFacW( i ,j,k,bi,bj)*uf( i ,j)
290 & +dRF(K)*dXG(i,j+1,bi,bj)*hFacS(i,j+1,k,bi,bj)*vf(i,j+1)
291 & -dRF(K)*dXG(i, j ,bi,bj)*hFacS(i, j ,k,bi,bj)*vf(i, j )
292 & +( wVel(i,j,k ,bi,bj)
293 & -wVel(i,j,k+1,bi,bj)
294 & )*_rA(i,j,bi,bj)/deltaTmom
295
296 ENDDO
297 ENDDO
298 ENDDO
299 K=Nr
300 DO j=1,sNy
301 DO i=1,sNx
302 cg3d_b(i,j,k,bi,bj) = cg3d_b(i,j,k,bi,bj)
303 & +dRF(K)*dYG(i+1,j,bi,bj)*hFacW(i+1,j,k,bi,bj)*uf(i+1,j)
304 & -dRF(K)*dYG( i ,j,bi,bj)*hFacW( i ,j,k,bi,bj)*uf( i ,j)
305 & +dRF(K)*dXG(i,j+1,bi,bj)*hFacS(i,j+1,k,bi,bj)*vf(i,j+1)
306 & -dRF(K)*dXG(i, j ,bi,bj)*hFacS(i, j ,k,bi,bj)*vf(i, j )
307 & +( wVel(i,j,k ,bi,bj)
308 & )*_rA(i,j,bi,bj)/deltaTmom
309
310 ENDDO
311 ENDDO
312
313 #ifdef ALLOW_OBCS
314 IF (useOBCS) THEN
315 DO K=1,Nr
316 DO i=1,sNx
317 C Northern boundary
318 IF (OB_Jn(I,bi,bj).NE.0) THEN
319 cg3d_b(I,OB_Jn(I,bi,bj),K,bi,bj)=0.
320 ENDIF
321 C Southern boundary
322 IF (OB_Js(I,bi,bj).NE.0) THEN
323 cg3d_b(I,OB_Js(I,bi,bj),K,bi,bj)=0.
324 ENDIF
325 ENDDO
326 DO j=1,sNy
327 C Eastern boundary
328 IF (OB_Ie(J,bi,bj).NE.0) THEN
329 cg3d_b(OB_Ie(J,bi,bj),J,K,bi,bj)=0.
330 ENDIF
331 C Western boundary
332 IF (OB_Iw(J,bi,bj).NE.0) THEN
333 cg3d_b(OB_Iw(J,bi,bj),J,K,bi,bj)=0.
334 ENDIF
335 ENDDO
336 ENDDO
337 ENDIF
338 #endif
339
340 ENDDO ! bi
341 ENDDO ! bj
342
343 firstResidual=0.
344 lastResidual=0.
345 numIters=cg2dMaxIters
346 CALL CG3D(
347 U cg3d_b,
348 U phi_nh,
349 O firstResidual,
350 O lastResidual,
351 U numIters,
352 I myThid )
353 _EXCH_XYZ_R8(phi_nh, myThid )
354
355 _BEGIN_MASTER( myThid )
356 WRITE(msgBuf,'(A34,1PE24.14)') 'cg3d_init_res =',firstResidual
357 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
358 WRITE(msgBuf,'(A34,I6)') 'cg3d_iters =',numIters
359 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
360 WRITE(msgBuf,'(A34,1PE24.14)') 'cg3d_res =',lastResidual
361 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
362 _END_MASTER( )
363
364 ENDIF
365 #endif
366
367 RETURN
368 END

  ViewVC Help
Powered by ViewVC 1.1.22