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

Contents 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 - (show 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 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