/[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.18 - (hide annotations) (download)
Thu Mar 8 20:40:57 2001 UTC (23 years, 2 months ago) by jmc
Branch: MAIN
Changes since 1.17: +21 -22 lines
all potentials (cg2d_x, cg3d_x, phiHyd) have units of P/rho in ocean AND atmos
  affects 2D and 3D solver (Matrix divided by g) for both atmos and ocean.

1 jmc 1.18 C $Header: /u/gcmpack/models/MITgcmUV/model/src/solve_for_pressure.F,v 1.17 2001/03/06 16:57:10 jmc Exp $
2 jmc 1.16 C $Name: $
3 cnh 1.1
4 adcroft 1.5 #include "CPP_OPTIONS.h"
5 cnh 1.1
6     CStartOfInterface
7     SUBROUTINE SOLVE_FOR_PRESSURE( myThid )
8     C /==========================================================\
9     C | SUBROUTINE SOLVE_FOR_PRESSURE |
10     C | o Controls inversion of two and/or three-dimensional |
11     C | elliptic problems for the pressure field. |
12     C \==========================================================/
13 adcroft 1.8 IMPLICIT NONE
14 cnh 1.1
15 cnh 1.4 C == Global variables
16     #include "SIZE.h"
17     #include "EEPARAMS.h"
18     #include "PARAMS.h"
19     #include "DYNVARS.h"
20 adcroft 1.12 #include "GRID.h"
21 jmc 1.17 #include "SURFACE.h"
22 adcroft 1.9 #ifdef ALLOW_NONHYDROSTATIC
23     #include "CG3D.h"
24     #include "GW.h"
25 adcroft 1.12 #endif
26 adcroft 1.11 #ifdef ALLOW_OBCS
27 adcroft 1.9 #include "OBCS.h"
28 adcroft 1.11 #endif
29 cnh 1.4
30 cnh 1.1 C == Routine arguments ==
31     C myThid - Number of this instance of SOLVE_FOR_PRESSURE
32     INTEGER myThid
33     CEndOfInterface
34 cnh 1.4
35     C Local variables
36 jmc 1.17 C cg2d_x - Conjugate Gradient 2-D solver : Solution vector
37     C cg2d_b - Conjugate Gradient 2-D solver : Right-hand side vector
38 cnh 1.6 INTEGER i,j,k,bi,bj
39 adcroft 1.9 _RS uf(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
40     _RS vf(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
41 jmc 1.17 _RL cg2d_x(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
42     _RL cg2d_b(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
43    
44     C-- Save previous solution & Initialise Vector solution and source term :
45     DO bj=myByLo(myThid),myByHi(myThid)
46     DO bi=myBxLo(myThid),myBxHi(myThid)
47     DO j=1-OLy,sNy+OLy
48     DO i=1-OLx,sNx+OLx
49     #ifdef INCLUDE_CD_CODE
50     etaNm1(i,j,bi,bj) = etaN(i,j,bi,bj)
51     #endif
52 jmc 1.18 cg2d_x(i,j,bi,bj) = Bo_surf(i,j,bi,bj)*etaN(i,j,bi,bj)
53 jmc 1.17 cg2d_b(i,j,bi,bj) = 0.
54     #ifdef USE_NATURAL_BCS
55 jmc 1.18 & + freeSurfFac*_rA(i,j,bi,bj)*
56 jmc 1.17 & EmPmR(I,J,bi,bj)/deltaTMom
57     #endif
58     ENDDO
59     ENDDO
60     ENDDO
61     ENDDO
62 adcroft 1.12
63     DO bj=myByLo(myThid),myByHi(myThid)
64     DO bi=myBxLo(myThid),myBxHi(myThid)
65     DO K=Nr,1,-1
66     DO j=1,sNy+1
67     DO i=1,sNx+1
68     uf(i,j) = _dyG(i,j,bi,bj)
69     & *drF(k)*_hFacW(i,j,k,bi,bj)
70     vf(i,j) = _dxG(i,j,bi,bj)
71     & *drF(k)*_hFacS(i,j,k,bi,bj)
72     ENDDO
73     ENDDO
74     CALL CALC_DIV_GHAT(
75     I bi,bj,1,sNx,1,sNy,K,
76     I uf,vf,
77 jmc 1.17 U cg2d_b,
78 adcroft 1.12 I myThid)
79     ENDDO
80     ENDDO
81     ENDDO
82 cnh 1.4
83 adcroft 1.12 C-- Add source term arising from w=d/dt (p_s + p_nh)
84     DO bj=myByLo(myThid),myByHi(myThid)
85     DO bi=myBxLo(myThid),myBxHi(myThid)
86 adcroft 1.13 #ifdef ALLOW_NONHYDROSTATIC
87 adcroft 1.12 DO j=1,sNy
88     DO i=1,sNx
89     cg2d_b(i,j,bi,bj) = cg2d_b(i,j,bi,bj)
90 jmc 1.18 & -freeSurfFac*_rA(i,j,bi,bj)/deltaTMom/deltaTMom
91     & *( etaN(i,j,bi,bj)
92     & +cg3d_x(i,j,1,bi,bj)*horiVertRatio/gravity )
93 adcroft 1.13 cg3d_b(i,j,1,bi,bj) = cg3d_b(i,j,1,bi,bj)
94 jmc 1.18 & -freeSurfFac*_rA(i,j,bi,bj)/deltaTMom/deltaTMom
95     & *( etaN(i,j,bi,bj)
96     & +cg3d_x(i,j,1,bi,bj)*horiVertRatio/gravity )
97     C-jmc
98     c & -freeSurfFac*_rA(i,j,bi,bj)*recip_Bo(i,j,bi,bj)
99     c & *( cg2d_x(i,j,bi,bj) + cg3d_x(i,j,1,bi,bj) )
100     c & /deltaTMom/deltaTMom
101     C-jmc
102 adcroft 1.12 ENDDO
103     ENDDO
104 adcroft 1.13 #else
105 adcroft 1.12 DO j=1,sNy
106     DO i=1,sNx
107 adcroft 1.13 cg2d_b(i,j,bi,bj) = cg2d_b(i,j,bi,bj)
108 jmc 1.18 & -freeSurfFac*_rA(i,j,bi,bj)/deltaTMom/deltaTMom
109     & * etaN(i,j,bi,bj)
110 adcroft 1.12 ENDDO
111     ENDDO
112     #endif
113    
114     #ifdef ALLOW_OBCS
115 adcroft 1.14 IF (useOBCS) THEN
116 adcroft 1.12 DO i=1,sNx
117     C Northern boundary
118     IF (OB_Jn(I,bi,bj).NE.0) THEN
119     cg2d_b(I,OB_Jn(I,bi,bj),bi,bj)=0.
120     ENDIF
121     C Southern boundary
122     IF (OB_Js(I,bi,bj).NE.0) THEN
123     cg2d_b(I,OB_Js(I,bi,bj),bi,bj)=0.
124     ENDIF
125     ENDDO
126     DO j=1,sNy
127     C Eastern boundary
128     IF (OB_Ie(J,bi,bj).NE.0) THEN
129     cg2d_b(OB_Ie(J,bi,bj),J,bi,bj)=0.
130     ENDIF
131     C Western boundary
132     IF (OB_Iw(J,bi,bj).NE.0) THEN
133     cg2d_b(OB_Iw(J,bi,bj),J,bi,bj)=0.
134     ENDIF
135     ENDDO
136     ENDIF
137     #endif
138     ENDDO
139     ENDDO
140    
141    
142 cnh 1.1 C-- Find the surface pressure using a two-dimensional conjugate
143     C-- gradient solver.
144 jmc 1.17 C see CG2D_INTERNAL.h for the interface to this routine.
145 cnh 1.1 CALL CG2D(
146 cnh 1.6 I cg2d_b,
147     U cg2d_x,
148 cnh 1.1 I myThid )
149    
150 adcroft 1.10 _EXCH_XY_R8(cg2d_x, myThid )
151 jmc 1.17
152     C-- Transfert the 2D-solution to "etaN" :
153     DO bj=myByLo(myThid),myByHi(myThid)
154     DO bi=myBxLo(myThid),myBxHi(myThid)
155     DO j=1-OLy,sNy+OLy
156     DO i=1-OLx,sNx+OLx
157 jmc 1.18 etaN(i,j,bi,bj) = recip_Bo(i,j,bi,bj)*cg2d_x(i,j,bi,bj)
158 jmc 1.17 ENDDO
159     ENDDO
160     ENDDO
161     ENDDO
162 adcroft 1.10
163 adcroft 1.9 #ifdef ALLOW_NONHYDROSTATIC
164     IF ( nonHydrostatic ) THEN
165    
166     C-- Solve for a three-dimensional pressure term (NH or IGW or both ).
167     C see CG3D.h for the interface to this routine.
168     DO bj=myByLo(myThid),myByHi(myThid)
169     DO bi=myBxLo(myThid),myBxHi(myThid)
170     DO j=1,sNy+1
171     DO i=1,sNx+1
172 jmc 1.18 uf(i,j)=-_recip_dxC(i,j,bi,bj)*
173 adcroft 1.9 & (cg2d_x(i,j,bi,bj)-cg2d_x(i-1,j,bi,bj))
174 jmc 1.18 vf(i,j)=-_recip_dyC(i,j,bi,bj)*
175 adcroft 1.9 & (cg2d_x(i,j,bi,bj)-cg2d_x(i,j-1,bi,bj))
176     ENDDO
177     ENDDO
178    
179 adcroft 1.12 #ifdef ALLOW_OBCS
180 adcroft 1.14 IF (useOBCS) THEN
181 adcroft 1.9 DO i=1,sNx+1
182     C Northern boundary
183     IF (OB_Jn(I,bi,bj).NE.0) THEN
184     vf(I,OB_Jn(I,bi,bj))=0.
185     ENDIF
186     C Southern boundary
187     IF (OB_Js(I,bi,bj).NE.0) THEN
188     vf(I,OB_Js(I,bi,bj)+1)=0.
189     ENDIF
190     ENDDO
191     DO j=1,sNy+1
192     C Eastern boundary
193     IF (OB_Ie(J,bi,bj).NE.0) THEN
194     uf(OB_Ie(J,bi,bj),J)=0.
195     ENDIF
196     C Western boundary
197     IF (OB_Iw(J,bi,bj).NE.0) THEN
198     uf(OB_Iw(J,bi,bj)+1,J)=0.
199     ENDIF
200     ENDDO
201     ENDIF
202 adcroft 1.12 #endif
203 adcroft 1.9
204 adcroft 1.12 K=1
205     DO j=1,sNy
206     DO i=1,sNx
207     cg3d_b(i,j,k,bi,bj) = cg3d_b(i,j,k,bi,bj)
208     & +dRF(K)*dYG(i+1,j,bi,bj)*hFacW(i+1,j,k,bi,bj)*uf(i+1,j)
209     & -dRF(K)*dYG( i ,j,bi,bj)*hFacW( i ,j,k,bi,bj)*uf( i ,j)
210     & +dRF(K)*dXG(i,j+1,bi,bj)*hFacS(i,j+1,k,bi,bj)*vf(i,j+1)
211     & -dRF(K)*dXG(i, j ,bi,bj)*hFacS(i, j ,k,bi,bj)*vf(i, j )
212 jmc 1.18 & +( freeSurfFac*etaN(i,j,bi,bj)/deltaTMom
213     & -wVel(i,j,k+1,bi,bj)
214 adcroft 1.12 & )*_rA(i,j,bi,bj)/deltaTmom
215     ENDDO
216     ENDDO
217     DO K=2,Nr-1
218 adcroft 1.9 DO j=1,sNy
219     DO i=1,sNx
220     cg3d_b(i,j,k,bi,bj) = cg3d_b(i,j,k,bi,bj)
221     & +dRF(K)*dYG(i+1,j,bi,bj)*hFacW(i+1,j,k,bi,bj)*uf(i+1,j)
222     & -dRF(K)*dYG( i ,j,bi,bj)*hFacW( i ,j,k,bi,bj)*uf( i ,j)
223     & +dRF(K)*dXG(i,j+1,bi,bj)*hFacS(i,j+1,k,bi,bj)*vf(i,j+1)
224     & -dRF(K)*dXG(i, j ,bi,bj)*hFacS(i, j ,k,bi,bj)*vf(i, j )
225 adcroft 1.12 & +( wVel(i,j,k ,bi,bj)
226     & -wVel(i,j,k+1,bi,bj)
227     & )*_rA(i,j,bi,bj)/deltaTmom
228    
229 adcroft 1.9 ENDDO
230     ENDDO
231     ENDDO
232 adcroft 1.12 K=Nr
233     DO j=1,sNy
234     DO i=1,sNx
235     cg3d_b(i,j,k,bi,bj) = cg3d_b(i,j,k,bi,bj)
236     & +dRF(K)*dYG(i+1,j,bi,bj)*hFacW(i+1,j,k,bi,bj)*uf(i+1,j)
237     & -dRF(K)*dYG( i ,j,bi,bj)*hFacW( i ,j,k,bi,bj)*uf( i ,j)
238     & +dRF(K)*dXG(i,j+1,bi,bj)*hFacS(i,j+1,k,bi,bj)*vf(i,j+1)
239     & -dRF(K)*dXG(i, j ,bi,bj)*hFacS(i, j ,k,bi,bj)*vf(i, j )
240     & +( wVel(i,j,k ,bi,bj)
241     & )*_rA(i,j,bi,bj)/deltaTmom
242    
243     ENDDO
244     ENDDO
245    
246     #ifdef ALLOW_OBCS
247 adcroft 1.14 IF (useOBCS) THEN
248 adcroft 1.12 DO K=1,Nr
249     DO i=1,sNx
250     C Northern boundary
251     IF (OB_Jn(I,bi,bj).NE.0) THEN
252     cg3d_b(I,OB_Jn(I,bi,bj),K,bi,bj)=0.
253     ENDIF
254     C Southern boundary
255     IF (OB_Js(I,bi,bj).NE.0) THEN
256     cg3d_b(I,OB_Js(I,bi,bj),K,bi,bj)=0.
257     ENDIF
258     ENDDO
259     DO j=1,sNy
260     C Eastern boundary
261     IF (OB_Ie(J,bi,bj).NE.0) THEN
262     cg3d_b(OB_Ie(J,bi,bj),J,K,bi,bj)=0.
263     ENDIF
264     C Western boundary
265     IF (OB_Iw(J,bi,bj).NE.0) THEN
266     cg3d_b(OB_Iw(J,bi,bj),J,K,bi,bj)=0.
267     ENDIF
268     ENDDO
269     ENDDO
270     ENDIF
271     #endif
272 adcroft 1.9
273     ENDDO ! bi
274     ENDDO ! bj
275    
276     CALL CG3D( myThid )
277 adcroft 1.10 _EXCH_XYZ_R8(cg3d_x, myThid )
278 adcroft 1.9
279     ENDIF
280     #endif
281 cnh 1.1
282     RETURN
283     END

  ViewVC Help
Powered by ViewVC 1.1.22