/[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.43 - (hide annotations) (download)
Tue Dec 14 16:54:08 2004 UTC (19 years, 5 months ago) by edhill
Branch: MAIN
CVS Tags: checkpoint57b_post
Changes since 1.42: +3 -3 lines
 o every instance of _END_MASTER() has been found and replaced with
   _END_MASTER( myThid ) in order to satisfy certain picky Sun
   preprocessors

1 edhill 1.43 C $Header: /u/gcmpack/MITgcm/model/src/solve_for_pressure.F,v 1.42 2003/11/04 18:40:58 edhill Exp $
2 heimbach 1.21 C $Name: $
3 cnh 1.1
4 edhill 1.39 #include "PACKAGES_CONFIG.h"
5 adcroft 1.5 #include "CPP_OPTIONS.h"
6 cnh 1.1
7 cnh 1.27 CBOP
8     C !ROUTINE: SOLVE_FOR_PRESSURE
9     C !INTERFACE:
10 jmc 1.29 SUBROUTINE SOLVE_FOR_PRESSURE(myTime, myIter, myThid)
11 cnh 1.27
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 adcroft 1.8 IMPLICIT NONE
22 cnh 1.4 C == Global variables
23     #include "SIZE.h"
24     #include "EEPARAMS.h"
25     #include "PARAMS.h"
26     #include "DYNVARS.h"
27 edhill 1.41 #ifdef ALLOW_CD_CODE
28     #include "CD_CODE_VARS.h"
29     #endif
30 adcroft 1.12 #include "GRID.h"
31 jmc 1.17 #include "SURFACE.h"
32 jmc 1.28 #include "FFIELDS.h"
33 adcroft 1.9 #ifdef ALLOW_NONHYDROSTATIC
34 adcroft 1.25 #include "SOLVE_FOR_PRESSURE3D.h"
35 adcroft 1.9 #include "GW.h"
36 adcroft 1.12 #endif
37 adcroft 1.11 #ifdef ALLOW_OBCS
38 adcroft 1.9 #include "OBCS.h"
39 adcroft 1.11 #endif
40 adcroft 1.22 #include "SOLVE_FOR_PRESSURE.h"
41 cnh 1.4
42 jmc 1.32 C === Functions ====
43     LOGICAL DIFFERENT_MULTIPLE
44     EXTERNAL DIFFERENT_MULTIPLE
45    
46 cnh 1.27 C !INPUT/OUTPUT PARAMETERS:
47 cnh 1.1 C == Routine arguments ==
48 jmc 1.28 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 jmc 1.29 INTEGER myThid
54 cnh 1.4
55 cnh 1.27 C !LOCAL VARIABLES:
56 adcroft 1.22 C == Local variables ==
57 cnh 1.6 INTEGER i,j,k,bi,bj
58 adcroft 1.9 _RS uf(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
59     _RS vf(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
60 adcroft 1.22 _RL firstResidual,lastResidual
61 jmc 1.36 _RL tmpFac
62 adcroft 1.19 INTEGER numIters
63 adcroft 1.25 CHARACTER*(MAX_LEN_MBUF) msgBuf
64 cnh 1.27 CEOP
65 jmc 1.17
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 edhill 1.40 #ifdef ALLOW_CD_CODE
72 jmc 1.17 etaNm1(i,j,bi,bj) = etaN(i,j,bi,bj)
73 jmc 1.26 #endif
74 jmc 1.18 cg2d_x(i,j,bi,bj) = Bo_surf(i,j,bi,bj)*etaN(i,j,bi,bj)
75 jmc 1.17 cg2d_b(i,j,bi,bj) = 0.
76     ENDDO
77     ENDDO
78 jmc 1.29 IF (useRealFreshWaterFlux) THEN
79 jmc 1.36 tmpFac = freeSurfFac*convertEmP2rUnit
80 mlosch 1.35 IF (exactConserv)
81 jmc 1.36 & tmpFac = freeSurfFac*convertEmP2rUnit*implicDiv2DFlow
82 jmc 1.29 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 jmc 1.17 ENDDO
90     ENDDO
91 adcroft 1.12
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 jmc 1.17 U cg2d_b,
107 adcroft 1.12 I myThid)
108     ENDDO
109     ENDDO
110     ENDDO
111 cnh 1.4
112 adcroft 1.12 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 adcroft 1.13 #ifdef ALLOW_NONHYDROSTATIC
116 jmc 1.28 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 adcroft 1.33 & -freeSurfFac*_rA(i,j,bi,bj)/deltaTMom/deltaTfreesurf
121 jmc 1.28 & *( 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 adcroft 1.33 & -freeSurfFac*_rA(i,j,bi,bj)/deltaTMom/deltaTfreesurf
125 jmc 1.28 & *( etaN(i,j,bi,bj)
126     & +phi_nh(i,j,1,bi,bj)*horiVertRatio/gravity )
127     ENDDO
128 adcroft 1.12 ENDDO
129 jmc 1.28 ELSEIF ( exactConserv ) THEN
130 adcroft 1.13 #else
131 jmc 1.26 IF ( exactConserv ) THEN
132 edhill 1.39 #endif /* ALLOW_NONHYDROSTATIC */
133 jmc 1.26 DO j=1,sNy
134     DO i=1,sNx
135     cg2d_b(i,j,bi,bj) = cg2d_b(i,j,bi,bj)
136 adcroft 1.33 & -freeSurfFac*_rA(i,j,bi,bj)/deltaTMom/deltaTfreesurf
137 jmc 1.26 & * 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 adcroft 1.33 & -freeSurfFac*_rA(i,j,bi,bj)/deltaTMom/deltaTfreesurf
145 jmc 1.26 & * etaN(i,j,bi,bj)
146     ENDDO
147 adcroft 1.12 ENDDO
148 jmc 1.26 ENDIF
149 adcroft 1.12
150     #ifdef ALLOW_OBCS
151 adcroft 1.14 IF (useOBCS) THEN
152 adcroft 1.12 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 jmc 1.31 cg2d_x(I,OB_Jn(I,bi,bj),bi,bj)=0.
157 adcroft 1.12 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 jmc 1.31 cg2d_x(I,OB_Js(I,bi,bj),bi,bj)=0.
162 adcroft 1.12 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 jmc 1.31 cg2d_x(OB_Ie(J,bi,bj),J,bi,bj)=0.
169 adcroft 1.12 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 jmc 1.31 cg2d_x(OB_Iw(J,bi,bj),J,bi,bj)=0.
174 adcroft 1.12 ENDIF
175     ENDDO
176     ENDIF
177     #endif
178     ENDDO
179     ENDDO
180    
181 edhill 1.42 #ifdef ALLOW_DEBUG
182 heimbach 1.38 IF ( debugLevel .GE. debLevB ) THEN
183 adcroft 1.23 CALL DEBUG_STATS_RL(1,cg2d_b,'cg2d_b (SOLVE_FOR_PRESSURE)',
184     & myThid)
185 adcroft 1.24 ENDIF
186 adcroft 1.23 #endif
187 adcroft 1.12
188 cnh 1.1 C-- Find the surface pressure using a two-dimensional conjugate
189     C-- gradient solver.
190 adcroft 1.22 C see CG2D.h for the interface to this routine.
191     firstResidual=0.
192     lastResidual=0.
193 adcroft 1.19 numIters=cg2dMaxIters
194 cnh 1.1 CALL CG2D(
195 adcroft 1.22 U cg2d_b,
196 cnh 1.6 U cg2d_x,
197 adcroft 1.22 O firstResidual,
198     O lastResidual,
199 adcroft 1.19 U numIters,
200 cnh 1.1 I myThid )
201 adcroft 1.19 _EXCH_XY_R8(cg2d_x, myThid )
202 adcroft 1.23
203 edhill 1.42 #ifdef ALLOW_DEBUG
204 heimbach 1.38 IF ( debugLevel .GE. debLevB ) THEN
205 adcroft 1.23 CALL DEBUG_STATS_RL(1,cg2d_x,'cg2d_x (SOLVE_FOR_PRESSURE)',
206     & myThid)
207 adcroft 1.24 ENDIF
208 adcroft 1.23 #endif
209 cnh 1.1
210 jmc 1.32 C- dump CG2D output at monitorFreq (to reduce size of STD-OUTPUT files) :
211     IF ( DIFFERENT_MULTIPLE(monitorFreq,myTime,
212     & myTime-deltaTClock) ) THEN
213 heimbach 1.38 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 edhill 1.43 _END_MASTER( myThid )
222 heimbach 1.38 ENDIF
223 jmc 1.32 ENDIF
224 jmc 1.17
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 jmc 1.18 etaN(i,j,bi,bj) = recip_Bo(i,j,bi,bj)*cg2d_x(i,j,bi,bj)
231 jmc 1.17 ENDDO
232     ENDDO
233     ENDDO
234     ENDDO
235 adcroft 1.10
236 adcroft 1.9 #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 jmc 1.18 uf(i,j)=-_recip_dxC(i,j,bi,bj)*
246 adcroft 1.9 & (cg2d_x(i,j,bi,bj)-cg2d_x(i-1,j,bi,bj))
247 jmc 1.18 vf(i,j)=-_recip_dyC(i,j,bi,bj)*
248 adcroft 1.9 & (cg2d_x(i,j,bi,bj)-cg2d_x(i,j-1,bi,bj))
249     ENDDO
250     ENDDO
251    
252 adcroft 1.12 #ifdef ALLOW_OBCS
253 adcroft 1.14 IF (useOBCS) THEN
254 adcroft 1.9 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 adcroft 1.12 #endif
276 adcroft 1.9
277 adcroft 1.12 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 jmc 1.18 & +( freeSurfFac*etaN(i,j,bi,bj)/deltaTMom
286     & -wVel(i,j,k+1,bi,bj)
287 adcroft 1.12 & )*_rA(i,j,bi,bj)/deltaTmom
288     ENDDO
289     ENDDO
290     DO K=2,Nr-1
291 adcroft 1.9 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 adcroft 1.12 & +( wVel(i,j,k ,bi,bj)
299     & -wVel(i,j,k+1,bi,bj)
300     & )*_rA(i,j,bi,bj)/deltaTmom
301    
302 adcroft 1.9 ENDDO
303     ENDDO
304     ENDDO
305 adcroft 1.12 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 adcroft 1.14 IF (useOBCS) THEN
321 adcroft 1.12 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 adcroft 1.9
346     ENDDO ! bi
347     ENDDO ! bj
348    
349 adcroft 1.25 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 mlosch 1.37 IF ( DIFFERENT_MULTIPLE(monitorFreq,myTime,
362     & myTime-deltaTClock) ) THEN
363 heimbach 1.38 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 edhill 1.43 _END_MASTER( myThid )
372 heimbach 1.38 ENDIF
373 mlosch 1.37 ENDIF
374 adcroft 1.9
375     ENDIF
376     #endif
377 cnh 1.1
378     RETURN
379     END

  ViewVC Help
Powered by ViewVC 1.1.22