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

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

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


Revision 1.4 - (hide annotations) (download)
Mon May 24 15:42:23 1999 UTC (25 years ago) by adcroft
Branch: MAIN
CVS Tags: checkpoint23, checkpoint24
Changes since 1.3: +5 -1 lines
Added CPP macro ALLOW_OBCS to include/exclude open boundary code.

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

  ViewVC Help
Powered by ViewVC 1.1.22