/[MITgcm]/MITgcm/model/src/ini_cg3d.F
ViewVC logotype

Contents of /MITgcm/model/src/ini_cg3d.F

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


Revision 1.10 - (show annotations) (download)
Thu Mar 8 20:45:53 2001 UTC (23 years, 3 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint38, pre38tag1, c37_adj, pre38-close, checkpoint39, checkpoint37
Branch point for: pre38
Changes since 1.9: +9 -9 lines
change units of cg3d_x (x g) to have same units as all other potential Phi

1 C $Header: /u/gcmpack/models/MITgcmUV/model/src/ini_cg3d.F,v 1.9 2001/02/04 14:38:47 cnh Exp $
2 C $Name: $
3
4 #include "CPP_OPTIONS.h"
5
6 CStartOfInterface
7 SUBROUTINE INI_CG3D( myThid )
8 C /==========================================================\
9 C | SUBROUTINE INI_CG3D |
10 C | o Initialise 3d conjugate gradient solver operators. |
11 C |==========================================================|
12 C | These arrays are purely a function of the basin geom. |
13 C | We set then here once and them use then repeatedly. |
14 C \==========================================================/
15 IMPLICIT NONE
16
17 C === Global variables ===
18 #include "SIZE.h"
19 #include "EEPARAMS.h"
20 #include "PARAMS.h"
21 #include "GRID.h"
22 c_jmc #include "DYNVARS.h"
23 #include "CG3D.h"
24 #ifdef ALLOW_OBCS
25 #include "OBCS.h"
26 #endif
27
28 C === Routine arguments ===
29 C myThid - Thread no. that called this routine.
30 INTEGER myThid
31 CEndOfInterface
32
33 #ifdef ALLOW_NONHYDROSTATIC
34
35 C === Local variables ===
36 C xG, yG - Global coordinate location.
37 C zG
38 C iG, jG - Global coordinate index
39 C bi,bj - Loop counters
40 C faceArea - Temporary used to hold cell face areas.
41 C I,J,K
42 C myNorm - Work variable used in clculating normalisation factor
43 CHARACTER*(MAX_LEN_MBUF) msgBuf
44 INTEGER bi, bj
45 INTEGER I, J, K
46 _RL faceArea
47 _RS myNorm
48 _RL aCw, aCs
49 _RL theRecip_Dr
50 _RL aU, aL, aW, aE, aN, aS, aC
51
52 CcnhDebugStarts
53 _RL phi(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
54 CcnhDebugEnds
55
56 C-- Initialise laplace operator
57 C aW3d: Ax/dX
58 C aS3d: Ay/dY
59 C aV3d: Ar/dR
60 myNorm = 0. _d 0
61 DO bj=myByLo(myThid),myByHi(myThid)
62 DO bi=myBxLo(myThid),myBxHi(myThid)
63 DO K=1,Nr
64 DO J=1,sNy
65 DO I=1,sNx
66 faceArea = _dyG(I,J,bi,bj)*drF(K)
67 & *_hFacW(I,J,K,bi,bj)
68 aW3d(I,J,K,bi,bj) = faceArea*recip_dxC(I,J,bi,bj)
69 faceArea = _dxG(I,J,bi,bj)*drF(K)
70 & *_hFacS(I,J,K,bi,bj)
71 aS3d(I,J,K,bi,bj) = faceArea*recip_dyC(I,J,bi,bj)
72 myNorm = MAX(ABS(aW3d(I,J,K,bi,bj)),myNorm)
73 myNorm = MAX(ABS(aS3d(I,J,K,bi,bj)),myNorm)
74 ENDDO
75 ENDDO
76 ENDDO
77 DO K=1,1
78 DO J=1,sNy
79 DO I=1,sNx
80 aV3d(I,J,K,bi,bj) = 0.
81 myNorm = MAX(ABS(aV3d(I,J,K,bi,bj)),myNorm)
82 ENDDO
83 ENDDO
84 ENDDO
85 DO K=2,Nr
86 DO J=1,sNy
87 DO I=1,sNx
88 IF ( _hFacC(i,j,k,bi,bj) .EQ. 0. ) THEN
89 faceArea = 0.
90 ELSE
91 faceArea = _rA(I,J,bi,bj)
92 ENDIF
93 theRecip_Dr =
94 & drC(K)
95 caja & drF(K )*_hFacC(i,j,k ,bi,bj)*0.5
96 caja & +drF(K-1)*_hFacC(i,j,k-1,bi,bj)*0.5
97 IF ( theRecip_Dr .NE. 0. )
98 & theRecip_Dr = 1. _d 0/theRecip_Dr
99 aV3d(I,J,K,bi,bj) = faceArea*theRecip_Dr
100 & *horiVertRatio*horiVertRatio
101 myNorm = MAX(ABS(aV3d(I,J,K,bi,bj)),myNorm)
102 ENDDO
103 ENDDO
104 ENDDO
105 #ifdef ALLOW_OBCS
106 DO K=1,Nr
107 IF (useOBCS) THEN
108 DO I=1,sNx
109 IF (OB_Jn(I,bi,bj).NE.0) THEN
110 aS3d(I,OB_Jn(I,bi,bj),K,bi,bj)=0.
111 aS3d(I,OB_Jn(I,bi,bj)+1,K,bi,bj)=0.
112 aW3d(I,OB_Jn(I,bi,bj),K,bi,bj)=0.
113 aW3d(I+1,OB_Jn(I,bi,bj),K,bi,bj)=0.
114 aV3d(I,OB_Jn(I,bi,bj),K,bi,bj)=0.
115 ENDIF
116 IF (OB_Js(I,bi,bj).NE.0) THEN
117 aS3d(I,OB_Js(I,bi,bj)+1,K,bi,bj)=0.
118 aS3d(I,OB_Js(I,bi,bj),K,bi,bj)=0.
119 aW3d(I,OB_Js(I,bi,bj),K,bi,bj)=0.
120 aW3d(I+1,OB_Js(I,bi,bj),K,bi,bj)=0.
121 aV3d(I,OB_Js(I,bi,bj),K,bi,bj)=0.
122 ENDIF
123 ENDDO
124 DO J=1,sNy
125 IF (OB_Ie(J,bi,bj).NE.0) THEN
126 aW3d(OB_Ie(J,bi,bj),J,K,bi,bj)=0.
127 aW3d(OB_Ie(J,bi,bj)+1,J,K,bi,bj)=0.
128 aS3d(OB_Ie(J,bi,bj),J,K,bi,bj)=0.
129 aS3d(OB_Ie(J,bi,bj),J+1,K,bi,bj)=0.
130 aV3d(OB_Ie(J,bi,bj),J,K,bi,bj)=0.
131 ENDIF
132 IF (OB_Iw(J,bi,bj).NE.0) THEN
133 aW3d(OB_Iw(J,bi,bj)+1,J,K,bi,bj)=0.
134 aW3d(OB_Iw(J,bi,bj),J,K,bi,bj)=0.
135 aS3d(OB_Iw(J,bi,bj),J,K,bi,bj)=0.
136 aS3d(OB_Iw(J,bi,bj),J+1,K,bi,bj)=0.
137 aV3d(OB_Iw(J,bi,bj),J,K,bi,bj)=0.
138 ENDIF
139 ENDDO
140 ENDIF
141 ENDDO
142 #endif
143 ENDDO
144 ENDDO
145 _GLOBAL_MAX_R4( myNorm, myThid )
146 IF ( myNorm .NE. 0. _d 0 ) THEN
147 myNorm = 1. _d 0/myNorm
148 ELSE
149 myNorm = 1. _d 0
150 ENDIF
151 cg3dNorm = myNorm
152 _BEGIN_MASTER( myThid )
153 CcnhDebugStarts
154 WRITE(msgBuf,'(A,E40.25)') '// CG3D normalisation factor = '
155 & , cg3dNorm
156 CALL PRINT_MESSAGE( msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
157 WRITE(msgBuf,*) ' '
158 CALL PRINT_MESSAGE( msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
159 CcnhDebugEnds
160 _END_MASTER( myThid )
161 DO bj=myByLo(myThid),myByHi(myThid)
162 DO bi=myBxLo(myThid),myBxHi(myThid)
163 DO K=1,Nr
164 DO J=1,sNy
165 DO I=1,sNx
166 aW3d(I,J,K,bi,bj) = aW3d(I,J,K,bi,bj)*myNorm
167 aS3d(I,J,K,bi,bj) = aS3d(I,J,K,bi,bj)*myNorm
168 aV3d(I,J,K,bi,bj) = aV3d(I,J,K,bi,bj)*myNorm
169 ENDDO
170 ENDDO
171 ENDDO
172 ENDDO
173 ENDDO
174
175 C-- Update overlap regions
176 _EXCH_XYZ_R4(aW3d, myThid)
177 _EXCH_XYZ_R4(aS3d, myThid)
178 _EXCH_XYZ_R4(aV3d, myThid)
179 CcnhDebugStarts
180 C CALL PLOT_FIELD_XYZRS( aW3d, 'AW3D INI_CG3D.1' , Nr, 1, myThid )
181 C CALL PLOT_FIELD_XYZRS( aS3d, 'AS3D INI_CG3D.1' , Nr, 1, myThid )
182 CcnhDebugEnds
183
184 C-- Initialise preconditioner
185 C For now PC is just the identity. Change to
186 C be LU factorization of d2/dz2 later. Note
187 C check for consistency with S/R CG3D before
188 C assuming zML is lower and zMU is upper!
189 DO bj=myByLo(myThid),myByHi(myThid)
190 DO bi=myBxLo(myThid),myBxHi(myThid)
191 DO K=1,Nr
192 DO J=1,sNy
193 DO I=1,sNx
194 aW = aW3d(I ,J,K,bi,bj)
195 aE = aW3d(I+1,J,K,bi,bj)
196 aN = aS3d(I,J+1,K,bi,bj)
197 aS = aS3d(I,J ,K,bi,bj)
198 IF ( K .NE. 1 ) THEN
199 aU = aV3d(I,J,K,bi,bj)
200 ELSE
201 aU = 0
202 ENDIF
203 IF ( K .NE. Nr ) THEN
204 aL = aV3d(I,J,K+1,bi,bj)
205 ELSE
206 aL = 0
207 ENDIF
208 aC = -aW-aE-aN-aS-aU-aL
209 IF ( K .EQ. 1 .AND. aC .NE. 0. ) THEN
210 aC = aC
211 & -freeSurfFac*myNorm*(horiVertRatio/gravity)*
212 & rA(I,J,bi,bj)/deltaTMom/deltaTMom
213 ENDIF
214 IF ( aC .NE. 0. ) THEN
215 zMC(i,j,k,bi,bj) = aC
216 zMU(i,j,k,bi,bj) = aL
217 zML(i,j,k,bi,bj) = aU
218 CcnhDebugStarts
219 C zMC(i,j,k,bi,bj) = 1.
220 C zMU(i,j,k,bi,bj) = 0.
221 C zML(i,j,k,bi,bj) = 0.
222 CcnhDebugEnds
223 ELSE
224 zMC(i,j,k,bi,bj) = 1. _d 0
225 zMU(i,j,k,bi,bj) = 0.
226 zML(i,j,k,bi,bj) = 0.
227 ENDIF
228 ENDDO
229 ENDDO
230 ENDDO
231 DO J=1,sNy
232 DO I=1,sNx
233 zMC(i,j,1,bi,bj)=
234 & 1. _d 0 / zMC(i,j,1,bi,bj)
235 zMU(i,j,1,bi,bj)=
236 & zMU(i,j,1,bi,bj)*zMC(i,j,1,bi,bj)
237 ENDDO
238 ENDDO
239 DO K=2,Nr
240 DO J=1,sNy
241 DO I=1,sNx
242 zMC(i,j,k,bi,bj) = 1. _d 0 /
243 & (zMC(i,j,k,bi,bj)-zML(i,j,k,bi,bj)*zMU(i,j,k-1,bi,bj))
244 zMU(i,j,k,bi,bj)=zMU(i,j,k,bi,bj)*zMC(i,j,k,bi,bj)
245 ENDDO
246 ENDDO
247 ENDDO
248 DO K=1,Nr
249 DO J=1,sNy
250 DO I=1,sNx
251 aW = aW3d(I ,J,K,bi,bj)
252 aE = aW3d(I+1,J,K,bi,bj)
253 aN = aS3d(I,J+1,K,bi,bj)
254 aS = aS3d(I,J ,K,bi,bj)
255 IF ( K .NE. 1 ) THEN
256 aU = aV3d(I,J,K-1,bi,bj)
257 ELSE
258 aU = 0
259 ENDIF
260 IF ( K .NE. Nr ) THEN
261 aL = aV3d(I,J,K+1,bi,bj)
262 ELSE
263 aL = 0
264 ENDIF
265 aC = -aW-aE-aN-aS-aU-aL
266 IF ( aC .EQ. 0. ) THEN
267 zMC(i,j,k,bi,bj) = 1.
268 zML(i,j,k,bi,bj) = 0.
269 zMU(i,j,k,bi,bj) = 0.
270 CcnhDebugStarts
271 C ELSE
272 C zMC(i,j,k,bi,bj) = 1.
273 C zML(i,j,k,bi,bj) = 0.
274 C zMU(i,j,k,bi,bj) = 0.
275 CcnhDEbugEnds
276 ENDIF
277 ENDDO
278 ENDDO
279 ENDDO
280 ENDDO
281 ENDDO
282 C-- Update overlap regions
283 _EXCH_XYZ_R4(zMC, myThid)
284 _EXCH_XYZ_R4(zML, myThid)
285 _EXCH_XYZ_R4(zMU, myThid)
286
287 CcnhDebugStarts
288 DO k=1,nr
289 DO j=1-OLy,sNy+OLy
290 DO i=1-OLx,sNx+OLx
291 phi(i,j,1,1) = zMc(i,j,k,1,1)
292 ENDDO
293 ENDDO
294 C CALL PLOT_FIELD_XYRS( phi, 'zMC INI_CG3D.1' , 1, myThid )
295 ENDDO
296 C CALL PLOT_FIELD_XYRS( zMU, 'zMU INI_CG3D.1' , Nr, 1, myThid )
297 C CALL PLOT_FIELD_XYRS( zML, 'zML INI_CG3D.1' , Nr, 1, myThid )
298 CcnhDebugEnds
299
300 C-- Set default values for initial guess and RHS
301 IF ( startTime .EQ. 0 ) THEN
302 DO bj=myByLo(myThid),myByHi(myThid)
303 DO bi=myBxLo(myThid),myBxHi(myThid)
304 DO K=1,Nr
305 DO J=1-OLy,sNy+OLy
306 DO I=1-OLx,sNx+OLx
307 cg3d_x(I,J,K,bi,bj) = 0. _d 0
308 cg3d_b(I,J,K,bi,bj) = 0. _d 0
309 #ifdef INCLUDE_CD_CODE
310 cg3d_xNM1(I,J,K,bi,bj) = 0. _d 0
311 #endif
312 ENDDO
313 ENDDO
314 ENDDO
315 ENDDO
316 ENDDO
317 C-- Update overlap regions
318 _EXCH_XYZ_R8(cg3d_x, myThid)
319 _EXCH_XYZ_R8(cg3d_b, myThid)
320 #ifdef INCLUDE_CD_CODE
321 _EXCH_XYZ_R8(cg3d_xNM1, myThid)
322 #endif
323 ENDIF
324
325 #endif /* ALLOW_NONHYDROSTATIC */
326
327 RETURN
328 END

  ViewVC Help
Powered by ViewVC 1.1.22