/[MITgcm]/MITgcm_contrib/AITCZ/code/solve_for_pressure.F
ViewVC logotype

Annotation of /MITgcm_contrib/AITCZ/code/solve_for_pressure.F

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


Revision 1.1 - (hide annotations) (download)
Wed Aug 20 15:24:59 2003 UTC (21 years, 11 months ago) by czaja
Branch: MAIN
CVS Tags: HEAD
Initial creation of Arnaud's simple coupled simulation.

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

  ViewVC Help
Powered by ViewVC 1.1.22