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

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

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


Revision 1.6 - (hide annotations) (download)
Tue Mar 6 17:02:57 2001 UTC (23 years, 3 months ago) by jmc
Branch: MAIN
Changes since 1.5: +18 -18 lines
change local variable names etaN & etaNM1 (now global state variables)

1 jmc 1.6 C $Header: /u/gcmpack/models/MITgcmUV/model/src/cg3d.F,v 1.5 2001/02/04 14:38:46 cnh Exp $
2     C $Name: $
3 adcroft 1.1
4     #include "CPP_OPTIONS.h"
5    
6     #define VERBOSE
7    
8     SUBROUTINE CG3D(
9     I myThid )
10     C /==========================================================\
11     C | SUBROUTINE CG3D |
12     C | o Three-dimensional grid problem conjugate-gradient |
13     C | inverter (with preconditioner). |
14     C |==========================================================|
15     C | Con. grad is an iterative procedure for solving Ax = b. |
16     C | It requires the A be symmetric. |
17     C | This implementation assumes A is a five-diagonal |
18     C | matrix of the form that arises in the discrete |
19     C | representation of the del^2 operator in a |
20     C | two-dimensional space. |
21     C | Notes: |
22     C | ====== |
23     C | This implementation can support shared-memory |
24     C | multi-threaded execution. In order to do this COMMON |
25     C | blocks are used for many of the arrays - even ones that |
26     C | are only used for intermedaite results. This design is |
27     C | OK if you want to all the threads to collaborate on |
28     C | solving the same problem. On the other hand if you want |
29     C | the threads to solve several different problems |
30     C | concurrently this implementation will not work. |
31     C \==========================================================/
32     IMPLICIT NONE
33    
34     C === Global data ===
35     #include "SIZE.h"
36     #include "EEPARAMS.h"
37     #include "PARAMS.h"
38     #include "GRID.h"
39     #include "CG3D.h"
40    
41     C === Routine arguments ===
42     C myThid - Thread on which I am working.
43     INTEGER myThid
44    
45 adcroft 1.4 #ifdef ALLOW_NONHYDROSTATIC
46    
47 adcroft 1.1 C === Local variables ====
48     C actualIts - Number of iterations taken
49     C actualResidual - residual
50     C bi - Block index in X and Y.
51     C bj
52 jmc 1.6 C eta_qrN - Used in computing search directions
53     C eta_qrNM1 suffix N and NM1 denote current and
54 adcroft 1.1 C cgBeta previous iterations respectively.
55     C alpha
56     C sumRHS - Sum of right-hand-side. Sometimes this is a
57     C useful debuggin/trouble shooting diagnostic.
58     C For neumann problems sumRHS needs to be ~0.
59     C or they converge at a non-zero residual.
60     C err - Measure of residual of Ax - b, usually the norm.
61     C I, J, N - Loop counters ( N counts CG iterations )
62     INTEGER actualIts
63     _RL actualResidual
64     INTEGER bi, bj
65     INTEGER I, J, K, it3d
66     INTEGER KM1, KP1
67     _RL err
68 jmc 1.6 _RL eta_qrN
69     _RL eta_qrNM1
70 adcroft 1.1 _RL cgBeta
71     _RL alpha
72     _RL sumRHS
73     _RL rhsMax
74     _RL rhsNorm
75    
76     INTEGER OLw
77     INTEGER OLe
78     INTEGER OLn
79     INTEGER OLs
80     INTEGER exchWidthX
81     INTEGER exchWidthY
82     INTEGER myNz
83     _RL topLevFac
84    
85     C-- Initialise inverter
86 jmc 1.6 eta_qrNM1 = 1. D0
87 adcroft 1.1
88     C-- Normalise RHS
89     rhsMax = 0. _d 0
90     DO bj=myByLo(myThid),myByHi(myThid)
91     DO bi=myBxLo(myThid),myBxHi(myThid)
92     DO K=1,Nr
93     DO J=1,sNy
94     DO I=1,sNx
95     cg3d_b(I,J,K,bi,bj) = cg3d_b(I,J,K,bi,bj)*cg3dNorm
96     rhsMax = MAX(ABS(cg3d_b(I,J,K,bi,bj)),rhsMax)
97     ENDDO
98     ENDDO
99     ENDDO
100     ENDDO
101     ENDDO
102 adcroft 1.2 _GLOBAL_MAX_R8( rhsMax, myThid )
103 adcroft 1.1 rhsNorm = 1. _d 0
104     IF ( rhsMax .NE. 0. ) rhsNorm = 1. _d 0 / rhsMax
105     DO bj=myByLo(myThid),myByHi(myThid)
106     DO bi=myBxLo(myThid),myBxHi(myThid)
107     DO K=1,Nr
108     DO J=1,sNy
109     DO I=1,sNx
110     cg3d_b(I,J,K,bi,bj) = cg3d_b(I,J,K,bi,bj)*rhsNorm
111     cg3d_x(I,J,K,bi,bj) = cg3d_x(I,J,K,bi,bj)*rhsNorm
112     ENDDO
113     ENDDO
114     ENDDO
115     ENDDO
116     ENDDO
117    
118     C-- Update overlaps
119     _EXCH_XYZ_R8( cg3d_b, myThid )
120     _EXCH_XYZ_R8( cg3d_x, myThid )
121    
122     #ifdef NONO
123     CcnhDebugStarts
124     C-- Initial residual calculation
125     err = 0. _d 0
126     sumRHS = 0. _d 0
127     DO bj=myByLo(myThid),myByHi(myThid)
128     DO bi=myBxLo(myThid),myBxHi(myThid)
129     DO J=1,sNy
130     DO I=1,sNx
131     alpha = 0. _d 0
132     DO K=1,Nr
133     KM1 = K-1
134     IF ( KM1 .EQ. 0 ) KM1 = 1
135     KP1 = K+1
136     IF ( KP1 .EQ. Nr+1 ) KP1 = 1
137     cg3d_r(I,J,K,bi,bj) = cg3d_b(I,J,K,bi,bj) -( 0.
138     & +aW3d(I ,J ,K ,bi,bj)*cg3d_x(I-1,J ,K ,bi,bj)
139     & +aW3d(I+1,J ,K ,bi,bj)*cg3d_x(I+1,J ,K ,bi,bj)
140     & +aS3d(I ,J ,K ,bi,bj)*cg3d_x(I ,J-1,K ,bi,bj)
141     & +aS3d(I ,J+1,K ,bi,bj)*cg3d_x(I ,J+1,K ,bi,bj)
142     & +aV3d(I ,J ,K ,bi,bj)*cg3d_x(I ,J ,KM1,bi,bj)
143     & +aV3d(I ,J ,KP1,bi,bj)*cg3d_x(I ,J ,KP1,bi,bj)
144     & -aW3d(I ,J ,K ,bi,bj)*cg3d_x(I ,J ,K ,bi,bj)
145     & -aW3d(I+1,J ,K ,bi,bj)*cg3d_x(I ,J ,K ,bi,bj)
146     & -aS3d(I ,J ,K ,bi,bj)*cg3d_x(I ,J ,K ,bi,bj)
147     & -aS3d(I ,J+1,K ,bi,bj)*cg3d_x(I ,J ,K ,bi,bj)
148     & -aV3d(I ,J ,K ,bi,bj)*cg3d_x(I ,J ,K ,bi,bj)
149     & -aV3d(I ,J ,KP1,bi,bj)*cg3d_x(I ,J ,K ,bi,bj)
150     & )
151     alpha = alpha
152     & +cg3d_r(I,J,K,bi,bj)
153     sumRHS = sumRHS
154     & +cg3d_b(I,J,K,bi,bj)
155     ENDDO
156     err = err + alpha*alpha
157     ENDDO
158     ENDDO
159     ENDDO
160     ENDDO
161     WRITE(6,*) 'DEBUG mythid, err = ', mythid, SQRT(err)
162 adcroft 1.2 _GLOBAL_SUM_R8( err , myThid )
163     _GLOBAL_SUM_R8( sumRHS , myThid )
164 adcroft 1.1 _BEGIN_MASTER( myThid )
165     write(0,*) 'DEBUG cg3d: Sum(rhs) = ',sumRHS
166     _END_MASTER( )
167     actualIts = 0
168     actualResidual = SQRT(err)
169     C _BARRIER
170     _BEGIN_MASTER( myThid )
171     WRITE(0,'(A,I6,1PE30.14)') 'DEBUG CG3D iters, err = ',
172     & actualIts, actualResidual
173     _END_MASTER( )
174     CcnhDebugEnds
175     #endif
176    
177     C-- Initial residual calculation
178     err = 0. _d 0
179     sumRHS = 0. _d 0
180     DO bj=myByLo(myThid),myByHi(myThid)
181     DO bi=myBxLo(myThid),myBxHi(myThid)
182     DO K=1,Nr
183     KM1 = K-1
184     IF ( K .EQ. 1 ) KM1 = 1
185     KP1 = K+1
186     IF ( K .EQ. Nr ) KP1 = 1
187     topLevFac = 0.
188     IF ( K .EQ. 1) topLevFac = 1.
189     DO J=1,sNy
190     DO I=1,sNx
191     cg3d_s(I,J,K,bi,bj) = 0.
192     cg3d_r(I,J,K,bi,bj) = cg3d_b(I,J,K,bi,bj) -( 0.
193     & +aW3d(I ,J ,K ,bi,bj)*cg3d_x(I-1,J ,K ,bi,bj)
194     & +aW3d(I+1,J ,K ,bi,bj)*cg3d_x(I+1,J ,K ,bi,bj)
195     & +aS3d(I ,J ,K ,bi,bj)*cg3d_x(I ,J-1,K ,bi,bj)
196     & +aS3d(I ,J+1,K ,bi,bj)*cg3d_x(I ,J+1,K ,bi,bj)
197     & +aV3d(I ,J ,K ,bi,bj)*cg3d_x(I ,J ,KM1,bi,bj)
198     & +aV3d(I ,J ,KP1,bi,bj)*cg3d_x(I ,J ,KP1,bi,bj)
199     & -aW3d(I ,J ,K ,bi,bj)*cg3d_x(I ,J ,K ,bi,bj)
200     & -aW3d(I+1,J ,K ,bi,bj)*cg3d_x(I ,J ,K ,bi,bj)
201     & -aS3d(I ,J ,K ,bi,bj)*cg3d_x(I ,J ,K ,bi,bj)
202     & -aS3d(I ,J+1,K ,bi,bj)*cg3d_x(I ,J ,K ,bi,bj)
203     & -aV3d(I ,J ,K ,bi,bj)*cg3d_x(I ,J ,K ,bi,bj)
204     & -aV3d(I ,J ,KP1,bi,bj)*cg3d_x(I ,J ,K ,bi,bj)
205     & -freeSurfFac*_rA(i,j,bi,bj)* horiVertRatio*
206     & cg3d_x(I ,J ,K,bi,bj)/deltaTMom/deltaTMom*cg3dNorm
207     & *topLevFac
208     & )
209     err = err
210     & +cg3d_r(I,J,K,bi,bj)*cg3d_r(I,J,K,bi,bj)
211     sumRHS = sumRHS
212     & +cg3d_b(I,J,K,bi,bj)
213     ENDDO
214     ENDDO
215     ENDDO
216     ENDDO
217     ENDDO
218     C _EXCH_XYZ_R8( cg3d_r, myThid )
219     OLw = 1
220     OLe = 1
221     OLn = 1
222     OLs = 1
223     exchWidthX = 1
224     exchWidthY = 1
225     myNz = Nr
226     CALL EXCH_RL( cg3d_r,
227     I OLw, OLe, OLs, OLn, myNz,
228     I exchWidthX, exchWidthY,
229     I FORWARD_SIMULATION, EXCH_IGNORE_CORNERS, myThid )
230     C _EXCH_XYZ_R8( cg3d_s, myThid )
231     OLw = 1
232     OLe = 1
233     OLn = 1
234     OLs = 1
235     exchWidthX = 1
236     exchWidthY = 1
237     myNz = Nr
238     CALL EXCH_RL( cg3d_s,
239     I OLw, OLe, OLs, OLn, myNz,
240     I exchWidthX, exchWidthY,
241     I FORWARD_SIMULATION, EXCH_IGNORE_CORNERS, myThid )
242 adcroft 1.2 _GLOBAL_SUM_R8( sumRHS, myThid )
243     _GLOBAL_SUM_R8( err , myThid )
244 adcroft 1.1
245     _BEGIN_MASTER( myThid )
246     write(0,'(A,1PE30.14)') ' cg3d: Sum(rhs) = ',sumRHS
247     _END_MASTER( )
248    
249     actualIts = 0
250     actualResidual = SQRT(err)
251     C _BARRIER
252     _BEGIN_MASTER( myThid )
253     WRITE(0,'(A,I6,1PE30.14)') ' CG3D iters, err = ',
254     & actualIts, actualResidual
255     _END_MASTER( )
256    
257     C >>>>>>>>>>>>>>> BEGIN SOLVER <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
258     DO 10 it3d=1, cg3dMaxIters
259    
260     CcnhDebugStarts
261     #ifdef VERBOSE
262     IF ( mod(it3d-1,10).EQ.0)
263     & WRITE(0,*) ' CG3D: Iteration ',it3d-1,
264     & ' residual = ',actualResidual
265     #endif
266     CcnhDebugEnds
267     IF ( actualResidual .LT. cg3dTargetResidual ) GOTO 11
268     C-- Solve preconditioning equation and update
269     C-- conjugate direction vector "s".
270     C Note. On the next to loops over all tiles the inner loop ranges
271     C in sNx and sNy are expanded by 1 to avoid a communication
272     C step. However this entails a bit of gynamastics because we only
273 jmc 1.6 C want eta_qrN for the interior points.
274     eta_qrN = 0. _d 0
275 adcroft 1.1 DO bj=myByLo(myThid),myByHi(myThid)
276     DO bi=myBxLo(myThid),myBxHi(myThid)
277     DO K=1,1
278     DO J=1-1,sNy+1
279     DO I=1-1,sNx+1
280     cg3d_q(I,J,K,bi,bj) =
281     & zMC(I ,J ,K,bi,bj)*cg3d_r(I ,J ,K,bi,bj)
282     ENDDO
283     ENDDO
284     ENDDO
285     DO K=2,Nr
286     DO J=1-1,sNy+1
287     DO I=1-1,sNx+1
288     cg3d_q(I,J,K,bi,bj) =
289     & zMC(I,J,K,bi,bj)*(cg3d_r(I,J,K ,bi,bj)
290     & -zML(I,J,K,bi,bj)*cg3d_q(I,J,K-1,bi,bj))
291     ENDDO
292     ENDDO
293     ENDDO
294     DO K=Nr,Nr
295     caja IF (Nr .GT. 1) THEN
296     caja DO J=1-1,sNy+1
297     caja DO I=1-1,sNx+1
298     caja cg3d_q(I,J,K,bi,bj) =
299     caja & zMC(i,j,k,bi,bj)*(cg3d_r(i,j,k ,bi,bj)
300     caja & -zML(i,j,k,bi,bj)*cg3d_q(i,j,k-1,bi,bj))
301     caja ENDDO
302     caja ENDDO
303     caja ENDIF
304     DO J=1,sNy
305     DO I=1,sNx
306 jmc 1.6 eta_qrN = eta_qrN
307 adcroft 1.1 & +cg3d_q(I,J,K,bi,bj)*cg3d_r(I,J,K,bi,bj)
308     ENDDO
309     ENDDO
310     ENDDO
311     DO K=Nr-1,1,-1
312     DO J=1-1,sNy+1
313     DO I=1-1,sNx+1
314     cg3d_q(I,J,K,bi,bj) =
315     & cg3d_q(I,J,K,bi,bj)
316     & -zMU(I,J,K,bi,bj)*cg3d_q(I,J,K+1,bi,bj)
317     ENDDO
318     ENDDO
319     DO J=1,sNy
320     DO I=1,sNx
321 jmc 1.6 eta_qrN = eta_qrN
322 adcroft 1.1 & +cg3d_q(I,J,K,bi,bj)*cg3d_r(I,J,K,bi,bj)
323     ENDDO
324     ENDDO
325     ENDDO
326     ENDDO
327     ENDDO
328     caja
329 jmc 1.6 caja eta_qrN=0.
330 adcroft 1.1 caja DO bj=myByLo(myThid),myByHi(myThid)
331     caja DO bi=myBxLo(myThid),myBxHi(myThid)
332     caja DO K=1,Nr
333     caja DO J=1,sNy
334     caja DO I=1,sNx
335 jmc 1.6 caja eta_qrN = eta_qrN
336 adcroft 1.1 caja & +cg3d_q(I,J,K,bi,bj)*cg3d_r(I,J,K,bi,bj)
337     caja ENDDO
338     caja ENDDO
339     caja ENDDO
340     caja ENDDO
341     caja ENDDO
342     caja
343    
344 jmc 1.6 _GLOBAL_SUM_R8(eta_qrN, myThid)
345 adcroft 1.1 CcnhDebugStarts
346 jmc 1.6 C WRITE(0,*) ' CG3D: Iteration ',it3d-1,' eta_qrN = ',eta_qrN
347 adcroft 1.1 CcnhDebugEnds
348 jmc 1.6 cgBeta = eta_qrN/eta_qrNM1
349 adcroft 1.1 CcnhDebugStarts
350     C WRITE(0,*) ' CG3D: Iteration ',it3d-1,' beta = ',cgBeta
351     CcnhDebugEnds
352 jmc 1.6 eta_qrNM1 = eta_qrN
353 adcroft 1.1
354     DO bj=myByLo(myThid),myByHi(myThid)
355     DO bi=myBxLo(myThid),myBxHi(myThid)
356     DO K=1,Nr
357     DO J=1-1,sNy+1
358     DO I=1-1,sNx+1
359     cg3d_s(I,J,K,bi,bj) = cg3d_q(I,J,K,bi,bj)
360     & + cgBeta*cg3d_s(I,J,K,bi,bj)
361     ENDDO
362     ENDDO
363     ENDDO
364     ENDDO
365     ENDDO
366    
367     C== Evaluate laplace operator on conjugate gradient vector
368     C== q = A.s
369     alpha = 0. _d 0
370     DO bj=myByLo(myThid),myByHi(myThid)
371     DO bi=myBxLo(myThid),myBxHi(myThid)
372     IF ( Nr .GT. 1 ) THEN
373     DO K=1,1
374     DO J=1,sNy
375     DO I=1,sNx
376     cg3d_q(I,J,K,bi,bj) =
377     & aW3d(I ,J ,K ,bi,bj)*cg3d_s(I-1,J ,K ,bi,bj)
378     & +aW3d(I+1,J ,K ,bi,bj)*cg3d_s(I+1,J ,K ,bi,bj)
379     & +aS3d(I ,J ,K ,bi,bj)*cg3d_s(I ,J-1,K ,bi,bj)
380     & +aS3d(I ,J+1,K ,bi,bj)*cg3d_s(I ,J+1,K ,bi,bj)
381     & +aV3d(I ,J ,K+1,bi,bj)*cg3d_s(I ,J ,K+1,bi,bj)
382     & -aW3d(I ,J ,K ,bi,bj)*cg3d_s(I ,J ,K ,bi,bj)
383     & -aW3d(I+1,J ,K ,bi,bj)*cg3d_s(I ,J ,K ,bi,bj)
384     & -aS3d(I ,J ,K ,bi,bj)*cg3d_s(I ,J ,K ,bi,bj)
385     & -aS3d(I ,J+1,K ,bi,bj)*cg3d_s(I ,J ,K ,bi,bj)
386     & -aV3d(I ,J ,K+1,bi,bj)*cg3d_s(I ,J ,K ,bi,bj)
387     & -freeSurfFac*_rA(i,j,bi,bj)* horiVertRatio*
388     & cg3d_s(I ,J ,K,bi,bj)/deltaTMom/deltaTMom*cg3dNorm
389     alpha = alpha+cg3d_s(I,J,K,bi,bj)*cg3d_q(I,J,K,bi,bj)
390     ENDDO
391     ENDDO
392     ENDDO
393     ELSE
394     DO K=1,1
395     DO J=1,sNy
396     DO I=1,sNx
397     cg3d_q(I,J,K,bi,bj) =
398     & aW3d(I ,J ,K ,bi,bj)*cg3d_s(I-1,J ,K ,bi,bj)
399     & +aW3d(I+1,J ,K ,bi,bj)*cg3d_s(I+1,J ,K ,bi,bj)
400     & +aS3d(I ,J ,K ,bi,bj)*cg3d_s(I ,J-1,K ,bi,bj)
401     & +aS3d(I ,J+1,K ,bi,bj)*cg3d_s(I ,J+1,K ,bi,bj)
402     & -aW3d(I ,J ,K ,bi,bj)*cg3d_s(I ,J ,K ,bi,bj)
403     & -aW3d(I+1,J ,K ,bi,bj)*cg3d_s(I ,J ,K ,bi,bj)
404     & -aS3d(I ,J ,K ,bi,bj)*cg3d_s(I ,J ,K ,bi,bj)
405     & -aS3d(I ,J+1,K ,bi,bj)*cg3d_s(I ,J ,K ,bi,bj)
406     & -freeSurfFac*_rA(i,j,bi,bj)* horiVertRatio*
407     & cg3d_s(I ,J ,K,bi,bj)/deltaTMom/deltaTMom*cg3dNorm
408     alpha = alpha+cg3d_s(I,J,K,bi,bj)*cg3d_q(I,J,K,bi,bj)
409     ENDDO
410     ENDDO
411     ENDDO
412     ENDIF
413     DO K=2,Nr-1
414     DO J=1,sNy
415     DO I=1,sNx
416     cg3d_q(I,J,K,bi,bj) =
417     & aW3d(I ,J ,K ,bi,bj)*cg3d_s(I-1,J ,K ,bi,bj)
418     & +aW3d(I+1,J ,K ,bi,bj)*cg3d_s(I+1,J ,K ,bi,bj)
419     & +aS3d(I ,J ,K ,bi,bj)*cg3d_s(I ,J-1,K ,bi,bj)
420     & +aS3d(I ,J+1,K ,bi,bj)*cg3d_s(I ,J+1,K ,bi,bj)
421     & +aV3d(I ,J ,K ,bi,bj)*cg3d_s(I ,J ,K-1,bi,bj)
422     & +aV3d(I ,J ,K+1,bi,bj)*cg3d_s(I ,J ,K+1,bi,bj)
423     & -aW3d(I ,J ,K ,bi,bj)*cg3d_s(I ,J ,K ,bi,bj)
424     & -aW3d(I+1,J ,K ,bi,bj)*cg3d_s(I ,J ,K ,bi,bj)
425     & -aS3d(I ,J ,K ,bi,bj)*cg3d_s(I ,J ,K ,bi,bj)
426     & -aS3d(I ,J+1,K ,bi,bj)*cg3d_s(I ,J ,K ,bi,bj)
427     & -aV3d(I ,J ,K ,bi,bj)*cg3d_s(I ,J ,K ,bi,bj)
428     & -aV3d(I ,J ,K+1,bi,bj)*cg3d_s(I ,J ,K ,bi,bj)
429     alpha = alpha+cg3d_s(I,J,K,bi,bj)*cg3d_q(I,J,K,bi,bj)
430     ENDDO
431     ENDDO
432     ENDDO
433     IF ( Nr .GT. 1 ) THEN
434     DO K=Nr,Nr
435     DO J=1,sNy
436     DO I=1,sNx
437     cg3d_q(I,J,K,bi,bj) =
438     & aW3d(I ,J ,K ,bi,bj)*cg3d_s(I-1,J ,K ,bi,bj)
439     & +aW3d(I+1,J ,K ,bi,bj)*cg3d_s(I+1,J ,K ,bi,bj)
440     & +aS3d(I ,J ,K ,bi,bj)*cg3d_s(I ,J-1,K ,bi,bj)
441     & +aS3d(I ,J+1,K ,bi,bj)*cg3d_s(I ,J+1,K ,bi,bj)
442     & +aV3d(I ,J ,K ,bi,bj)*cg3d_s(I ,J ,K-1,bi,bj)
443     & -aW3d(I ,J ,K ,bi,bj)*cg3d_s(I ,J ,K ,bi,bj)
444     & -aW3d(I+1,J ,K ,bi,bj)*cg3d_s(I ,J ,K ,bi,bj)
445     & -aS3d(I ,J ,K ,bi,bj)*cg3d_s(I ,J ,K ,bi,bj)
446     & -aS3d(I ,J+1,K ,bi,bj)*cg3d_s(I ,J ,K ,bi,bj)
447     & -aV3d(I ,J ,K ,bi,bj)*cg3d_s(I ,J ,K ,bi,bj)
448     alpha = alpha+cg3d_s(I,J,K,bi,bj)*cg3d_q(I,J,K,bi,bj)
449     ENDDO
450     ENDDO
451     ENDDO
452     ENDIF
453     ENDDO
454     ENDDO
455 adcroft 1.2 _GLOBAL_SUM_R8(alpha,myThid)
456 adcroft 1.1 CcnhDebugStarts
457     C WRITE(0,*) ' CG3D: Iteration ',it3d-1,' SUM(s*q)= ',alpha
458     CcnhDebugEnds
459 jmc 1.6 alpha = eta_qrN/alpha
460 adcroft 1.1 CcnhDebugStarts
461     C WRITE(0,*) ' CG3D: Iteration ',it3d-1,' alpha= ',alpha
462     CcnhDebugEnds
463    
464     C== Update solution and residual vectors
465     C Now compute "interior" points.
466     err = 0. _d 0
467     DO bj=myByLo(myThid),myByHi(myThid)
468     DO bi=myBxLo(myThid),myBxHi(myThid)
469     DO K=1,Nr
470     DO J=1,sNy
471     DO I=1,sNx
472     cg3d_x(I,J,K,bi,bj)=cg3d_x(I,J,K,bi,bj)
473     & +alpha*cg3d_s(I,J,K,bi,bj)
474     cg3d_r(I,J,K,bi,bj)=cg3d_r(I,J,K,bi,bj)
475     & -alpha*cg3d_q(I,J,K,bi,bj)
476     err = err+cg3d_r(I,J,K,bi,bj)*cg3d_r(I,J,K,bi,bj)
477     ENDDO
478     ENDDO
479     ENDDO
480     ENDDO
481     ENDDO
482    
483 adcroft 1.2 _GLOBAL_SUM_R8( err , myThid )
484 adcroft 1.1 err = SQRT(err)
485     actualIts = it3d
486     actualResidual = err
487     IF ( actualResidual .LT. cg3dTargetResidual ) GOTO 11
488     C _EXCH_XYZ_R8(cg3d_r, myThid )
489     OLw = 1
490     OLe = 1
491     OLn = 1
492     OLs = 1
493     exchWidthX = 1
494     exchWidthY = 1
495     myNz = Nr
496     CALL EXCH_RL( cg3d_r,
497     I OLw, OLe, OLs, OLn, myNz,
498     I exchWidthX, exchWidthY,
499     I FORWARD_SIMULATION, EXCH_IGNORE_CORNERS, myThid )
500    
501     10 CONTINUE
502     11 CONTINUE
503    
504     C-- Un-normalise the answer
505     DO bj=myByLo(myThid),myByHi(myThid)
506     DO bi=myBxLo(myThid),myBxHi(myThid)
507     DO K=1,Nr
508     DO J=1,sNy
509     DO I=1,sNx
510     cg3d_x(I,J,K,bi,bj) = cg3d_x(I,J,K,bi,bj)/rhsNorm
511     ENDDO
512     ENDDO
513     ENDDO
514     ENDDO
515     ENDDO
516    
517 adcroft 1.3 Cadj _EXCH_XYZ_R8(cg3d_x, myThid )
518 adcroft 1.1 _BEGIN_MASTER( myThid )
519     WRITE(0,'(A,I6,1PE30.14)') ' CG3D iters, err = ',
520     & actualIts, actualResidual
521     _END_MASTER( )
522    
523     CcnhDebugStarts
524     C CALL PLOT_FIELD_XYRL( cg2d_x, 'CALC_MOM_RHS CG2D_X' , 1, myThid )
525     C err = 0. _d 0
526     C DO bj=myByLo(myThid),myByHi(myThid)
527     C DO bi=myBxLo(myThid),myBxHi(myThid)
528     C DO J=1,sNy
529     C DO I=1,sNx
530     C cg2d_r(I,J,bi,bj) = cg2d_b(I,J,bi,bj) -
531     C & (aW2d(I ,J ,bi,bj)*cg2d_x(I-1,J ,bi,bj)
532     C & +aW2d(I+1,J ,bi,bj)*cg2d_x(I+1,J ,bi,bj)
533     C & +aS2d(I ,J ,bi,bj)*cg2d_x(I ,J-1,bi,bj)
534     C & +aS2d(I ,J+1,bi,bj)*cg2d_x(I ,J+1,bi,bj)
535     C & -aW2d(I ,J ,bi,bj)*cg2d_x(I ,J ,bi,bj)
536     C & -aW2d(I+1,J ,bi,bj)*cg2d_x(I ,J ,bi,bj)
537     C & -aS2d(I ,J ,bi,bj)*cg2d_x(I ,J ,bi,bj)
538     C & -aS2d(I ,J+1,bi,bj)*cg2d_x(I ,J ,bi,bj))
539     C err = err +
540     C & cg2d_r(I,J,bi,bj)*cg2d_r(I,J,bi,bj)
541     C ENDDO
542     C ENDDO
543     C ENDDO
544     C ENDDO
545 adcroft 1.2 C _GLOBAL_SUM_R8( err , myThid )
546 adcroft 1.1 C write(0,*) 'cg2d: Ax - b = ',SQRT(err)
547     CcnhDebugEnds
548    
549     #endif /* ALLOW_NONHYDROSTATIC */
550    
551     RETURN
552     END

  ViewVC Help
Powered by ViewVC 1.1.22