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

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

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


Revision 1.34 - (hide annotations) (download)
Wed Sep 26 18:09:14 2001 UTC (22 years, 7 months ago) by cnh
Branch: MAIN
CVS Tags: checkpoint44e_post, checkpoint44f_post, checkpoint43a-release1mods, chkpt44d_post, release1_p1, release1_p2, checkpoint44e_pre, release1_b1, checkpoint43, release1_chkpt44d_post, release1-branch_tutorials, chkpt44a_post, checkpoint44h_pre, chkpt44c_pre, checkpoint45a_post, ecco_c44_e19, ecco_c44_e18, ecco_c44_e17, ecco_c44_e16, checkpoint44g_post, release1-branch-end, release1_final_v1, checkpoint44b_post, checkpoint44h_post, ecco_c44_e22, chkpt44a_pre, ecco_c44_e23, ecco_c44_e20, ecco_c44_e21, ecco-branch-mod1, ecco-branch-mod2, ecco-branch-mod3, ecco-branch-mod4, ecco-branch-mod5, release1_beta1, checkpoint44b_pre, checkpoint42, checkpoint41, checkpoint44, checkpoint45, chkpt44c_post, checkpoint44f_pre, release1-branch_branchpoint
Branch point for: release1_final, release1-branch, release1, ecco-branch, release1_coupled
Changes since 1.33: +33 -24 lines
Bringing comments up to data and formatting for document extraction.

1 cnh 1.34 C $Header: /home/ubuntu/mnt/e9_copy/MITgcm/model/src/cg2d.F,v 1.34 2001/09/26 18:09:14 cnh Exp $
2 adcroft 1.33 C $Name: $
3 cnh 1.1
4 cnh 1.16 #include "CPP_OPTIONS.h"
5 cnh 1.1
6 cnh 1.34 CBOP
7     C !ROUTINE: CG2D
8     C !INTERFACE:
9 cnh 1.1 SUBROUTINE CG2D(
10 cnh 1.14 I cg2d_b,
11     U cg2d_x,
12 adcroft 1.33 O firstResidual,
13     O lastResidual,
14 adcroft 1.30 U numIters,
15 cnh 1.1 I myThid )
16 cnh 1.34 C !DESCRIPTION: \bv
17     C *==========================================================*
18     C | SUBROUTINE CG2D
19     C | o Two-dimensional grid problem conjugate-gradient
20     C | inverter (with preconditioner).
21     C *==========================================================*
22     C | Con. grad is an iterative procedure for solving Ax = b.
23     C | It requires the A be symmetric.
24     C | This implementation assumes A is a five-diagonal
25     C | matrix of the form that arises in the discrete
26     C | representation of the del^2 operator in a
27     C | two-dimensional space.
28     C | Notes:
29     C | ======
30     C | This implementation can support shared-memory
31     C | multi-threaded execution. In order to do this COMMON
32     C | blocks are used for many of the arrays - even ones that
33     C | are only used for intermedaite results. This design is
34     C | OK if you want to all the threads to collaborate on
35     C | solving the same problem. On the other hand if you want
36     C | the threads to solve several different problems
37     C | concurrently this implementation will not work.
38     C *==========================================================*
39     C \ev
40    
41     C !USES:
42 adcroft 1.18 IMPLICIT NONE
43 cnh 1.1 C === Global data ===
44     #include "SIZE.h"
45     #include "EEPARAMS.h"
46     #include "PARAMS.h"
47 cnh 1.4 #include "GRID.h"
48 adcroft 1.33 #include "CG2D.h"
49 jmc 1.29 #include "SURFACE.h"
50 cnh 1.1
51 cnh 1.34 C !INPUT/OUTPUT PARAMETERS:
52 cnh 1.1 C === Routine arguments ===
53 adcroft 1.30 C myThid - Thread on which I am working.
54     C cg2d_b - The source term or "right hand side"
55     C cg2d_x - The solution
56 adcroft 1.33 C firstResidual - the initial residual before any iterations
57     C lastResidual - the actual residual reached
58 adcroft 1.30 C numIters - Entry: the maximum number of iterations allowed
59     C Exit: the actual number of iterations used
60     _RL cg2d_b(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
61     _RL cg2d_x(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
62 adcroft 1.33 _RL firstResidual
63     _RL lastResidual
64 adcroft 1.30 INTEGER numIters
65 cnh 1.1 INTEGER myThid
66    
67 cnh 1.34 C !LOCAL VARIABLES:
68 cnh 1.1 C === Local variables ====
69     C actualIts - Number of iterations taken
70     C actualResidual - residual
71     C bi - Block index in X and Y.
72     C bj
73 jmc 1.28 C eta_qrN - Used in computing search directions
74     C eta_qrNM1 suffix N and NM1 denote current and
75 cnh 1.1 C cgBeta previous iterations respectively.
76     C alpha
77     C sumRHS - Sum of right-hand-side. Sometimes this is a
78     C useful debuggin/trouble shooting diagnostic.
79     C For neumann problems sumRHS needs to be ~0.
80     C or they converge at a non-zero residual.
81     C err - Measure of residual of Ax - b, usually the norm.
82     C I, J, N - Loop counters ( N counts CG iterations )
83     INTEGER actualIts
84 adcroft 1.33 _RL actualResidual
85 cnh 1.1 INTEGER bi, bj
86     INTEGER I, J, it2d
87 cnh 1.14 _RL err
88 jmc 1.28 _RL eta_qrN
89     _RL eta_qrNM1
90 cnh 1.14 _RL cgBeta
91     _RL alpha
92     _RL sumRHS
93     _RL rhsMax
94     _RL rhsNorm
95 cnh 1.1
96 cnh 1.13 INTEGER OLw
97     INTEGER OLe
98     INTEGER OLn
99     INTEGER OLs
100     INTEGER exchWidthX
101     INTEGER exchWidthY
102     INTEGER myNz
103 cnh 1.34 CEOP
104 cnh 1.13
105    
106 cnh 1.12 CcnhDebugStarts
107 adcroft 1.24 C CHARACTER*(MAX_LEN_FNAM) suff
108 cnh 1.12 CcnhDebugEnds
109    
110    
111 cnh 1.1 C-- Initialise inverter
112 jmc 1.28 eta_qrNM1 = 1. _d 0
113 cnh 1.1
114 cnh 1.10 CcnhDebugStarts
115 cnh 1.11 C _EXCH_XY_R8( cg2d_b, myThid )
116     C CALL PLOT_FIELD_XYRL( cg2d_b, 'CG2D.0 CG2D_B' , 1, myThid )
117 cnh 1.12 C suff = 'unnormalised'
118     C CALL WRITE_FLD_XY_RL ( 'cg2d_b.',suff, cg2d_b, 1, myThid)
119 cnh 1.14 C STOP
120 cnh 1.10 CcnhDebugEnds
121    
122 cnh 1.1 C-- Normalise RHS
123     rhsMax = 0. _d 0
124     DO bj=myByLo(myThid),myByHi(myThid)
125     DO bi=myBxLo(myThid),myBxHi(myThid)
126     DO J=1,sNy
127     DO I=1,sNx
128     cg2d_b(I,J,bi,bj) = cg2d_b(I,J,bi,bj)*cg2dNorm
129     rhsMax = MAX(ABS(cg2d_b(I,J,bi,bj)),rhsMax)
130     ENDDO
131     ENDDO
132     ENDDO
133     ENDDO
134 adcroft 1.33
135     IF (cg2dNormaliseRHS) THEN
136     C- Normalise RHS :
137 adcroft 1.23 #ifdef LETS_MAKE_JAM
138 adcroft 1.25 C _GLOBAL_MAX_R8( rhsMax, myThid )
139     rhsMax=1.
140 adcroft 1.23 #else
141     _GLOBAL_MAX_R8( rhsMax, myThid )
142 adcroft 1.26 Catm rhsMax=1.
143 adcroft 1.23 #endif
144 cnh 1.1 rhsNorm = 1. _d 0
145     IF ( rhsMax .NE. 0. ) rhsNorm = 1. _d 0 / rhsMax
146     DO bj=myByLo(myThid),myByHi(myThid)
147     DO bi=myBxLo(myThid),myBxHi(myThid)
148     DO J=1,sNy
149     DO I=1,sNx
150     cg2d_b(I,J,bi,bj) = cg2d_b(I,J,bi,bj)*rhsNorm
151     cg2d_x(I,J,bi,bj) = cg2d_x(I,J,bi,bj)*rhsNorm
152     ENDDO
153     ENDDO
154     ENDDO
155     ENDDO
156 adcroft 1.33 C- end Normalise RHS
157     ENDIF
158 cnh 1.1
159     C-- Update overlaps
160     _EXCH_XY_R8( cg2d_b, myThid )
161     _EXCH_XY_R8( cg2d_x, myThid )
162     CcnhDebugStarts
163 cnh 1.11 C CALL PLOT_FIELD_XYRL( cg2d_b, 'CG2D.1 CG2D_B' , 1, myThid )
164 cnh 1.12 C suff = 'normalised'
165     C CALL WRITE_FLD_XY_RL ( 'cg2d_b.',suff, cg2d_b, 1, myThid)
166 cnh 1.1 CcnhDebugEnds
167    
168     C-- Initial residual calculation
169     err = 0. _d 0
170     sumRHS = 0. _d 0
171     DO bj=myByLo(myThid),myByHi(myThid)
172     DO bi=myBxLo(myThid),myBxHi(myThid)
173     DO J=1,sNy
174     DO I=1,sNx
175     cg2d_s(I,J,bi,bj) = 0.
176     cg2d_r(I,J,bi,bj) = cg2d_b(I,J,bi,bj) -
177     & (aW2d(I ,J ,bi,bj)*cg2d_x(I-1,J ,bi,bj)
178     & +aW2d(I+1,J ,bi,bj)*cg2d_x(I+1,J ,bi,bj)
179     & +aS2d(I ,J ,bi,bj)*cg2d_x(I ,J-1,bi,bj)
180     & +aS2d(I ,J+1,bi,bj)*cg2d_x(I ,J+1,bi,bj)
181     & -aW2d(I ,J ,bi,bj)*cg2d_x(I ,J ,bi,bj)
182     & -aW2d(I+1,J ,bi,bj)*cg2d_x(I ,J ,bi,bj)
183     & -aS2d(I ,J ,bi,bj)*cg2d_x(I ,J ,bi,bj)
184 cnh 1.4 & -aS2d(I ,J+1,bi,bj)*cg2d_x(I ,J ,bi,bj)
185 jmc 1.29 & -freeSurfFac*_rA(i,j,bi,bj)*recip_Bo(i,j,bi,bj)*
186 cnh 1.4 & cg2d_x(I ,J ,bi,bj)/deltaTMom/deltaTMom*cg2dNorm
187     & )
188 cnh 1.1 err = err +
189     & cg2d_r(I,J,bi,bj)*cg2d_r(I,J,bi,bj)
190     sumRHS = sumRHS +
191     & cg2d_b(I,J,bi,bj)
192     ENDDO
193     ENDDO
194     ENDDO
195     ENDDO
196 cnh 1.13 C _EXCH_XY_R8( cg2d_r, myThid )
197 adcroft 1.23 #ifdef LETS_MAKE_JAM
198     CALL EXCH_XY_O1_R8_JAM( cg2d_r )
199     #else
200 cnh 1.13 OLw = 1
201     OLe = 1
202     OLn = 1
203     OLs = 1
204     exchWidthX = 1
205     exchWidthY = 1
206     myNz = 1
207 adcroft 1.33 IF (useCubedSphereExchange) THEN
208     CALL EXCH_RL_CUBE( cg2d_r,
209     I OLw, OLe, OLs, OLn, myNz,
210     I exchWidthX, exchWidthY,
211     I FORWARD_SIMULATION, EXCH_UPDATE_CORNERS, myThid )
212     ELSE
213 cnh 1.13 CALL EXCH_RL( cg2d_r,
214 adcroft 1.33 I OLw, OLe, OLs, OLn, myNz,
215 cnh 1.13 I exchWidthX, exchWidthY,
216 adcroft 1.33 I FORWARD_SIMULATION, EXCH_UPDATE_CORNERS, myThid )
217     ENDIF
218 adcroft 1.23 #endif
219 cnh 1.13 C _EXCH_XY_R8( cg2d_s, myThid )
220 adcroft 1.23 #ifdef LETS_MAKE_JAM
221     CALL EXCH_XY_O1_R8_JAM( cg2d_s )
222     #else
223 cnh 1.13 OLw = 1
224     OLe = 1
225     OLn = 1
226     OLs = 1
227     exchWidthX = 1
228     exchWidthY = 1
229     myNz = 1
230 adcroft 1.33 IF (useCubedSphereExchange) THEN
231     CALL EXCH_RL_CUBE( cg2d_s,
232     I OLw, OLe, OLs, OLn, myNz,
233     I exchWidthX, exchWidthY,
234     I FORWARD_SIMULATION, EXCH_UPDATE_CORNERS, myThid )
235     ELSE
236 cnh 1.13 CALL EXCH_RL( cg2d_s,
237 adcroft 1.33 I OLw, OLe, OLs, OLn, myNz,
238 cnh 1.13 I exchWidthX, exchWidthY,
239 adcroft 1.33 I FORWARD_SIMULATION, EXCH_UPDATE_CORNERS, myThid )
240     ENDIF
241 adcroft 1.23 #endif
242 adcroft 1.33 _GLOBAL_SUM_R8( sumRHS, myThid )
243     _GLOBAL_SUM_R8( err , myThid )
244     err = SQRT(err)
245     actualIts = 0
246     actualResidual = err
247 cnh 1.13
248     _BEGIN_MASTER( myThid )
249 adcroft 1.33 write(*,'(A,1P2E22.14)')' cg2d: Sum(rhs),rhsMax = ',
250     & sumRHS,rhsMax
251 cnh 1.13 _END_MASTER( )
252 cnh 1.1 C _BARRIER
253 adcroft 1.30 c _BEGIN_MASTER( myThid )
254 heimbach 1.31 c WRITE(*,'(A,I6,1PE30.14)') ' CG2D iters, err = ',
255 adcroft 1.30 c & actualIts, actualResidual
256     c _END_MASTER( )
257 adcroft 1.33 firstResidual=actualResidual
258    
259     IF ( err .LT. cg2dTolerance ) GOTO 11
260 cnh 1.1
261     C >>>>>>>>>>>>>>> BEGIN SOLVER <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
262 adcroft 1.30 DO 10 it2d=1, numIters
263 cnh 1.1
264     CcnhDebugStarts
265 heimbach 1.31 C WRITE(*,*) ' CG2D: Iteration ',it2d-1,' residual = ',
266 cnh 1.14 C & actualResidual
267 cnh 1.1 CcnhDebugEnds
268     C-- Solve preconditioning equation and update
269     C-- conjugate direction vector "s".
270 jmc 1.28 eta_qrN = 0. _d 0
271 cnh 1.1 DO bj=myByLo(myThid),myByHi(myThid)
272     DO bi=myBxLo(myThid),myBxHi(myThid)
273     DO J=1,sNy
274     DO I=1,sNx
275     cg2d_q(I,J,bi,bj) =
276 cnh 1.3 & pC(I ,J ,bi,bj)*cg2d_r(I ,J ,bi,bj)
277     & +pW(I ,J ,bi,bj)*cg2d_r(I-1,J ,bi,bj)
278     & +pW(I+1,J ,bi,bj)*cg2d_r(I+1,J ,bi,bj)
279     & +pS(I ,J ,bi,bj)*cg2d_r(I ,J-1,bi,bj)
280     & +pS(I ,J+1,bi,bj)*cg2d_r(I ,J+1,bi,bj)
281 cnh 1.4 CcnhDebugStarts
282     C cg2d_q(I,J,bi,bj) = cg2d_r(I ,J ,bi,bj)
283     CcnhDebugEnds
284 jmc 1.28 eta_qrN = eta_qrN
285 cnh 1.1 & +cg2d_q(I,J,bi,bj)*cg2d_r(I,J,bi,bj)
286     ENDDO
287     ENDDO
288     ENDDO
289     ENDDO
290    
291 jmc 1.28 _GLOBAL_SUM_R8(eta_qrN, myThid)
292 cnh 1.1 CcnhDebugStarts
293 heimbach 1.31 C WRITE(*,*) ' CG2D: Iteration ',it2d-1,' eta_qrN = ',eta_qrN
294 cnh 1.1 CcnhDebugEnds
295 jmc 1.28 cgBeta = eta_qrN/eta_qrNM1
296 cnh 1.1 CcnhDebugStarts
297 heimbach 1.31 C WRITE(*,*) ' CG2D: Iteration ',it2d-1,' beta = ',cgBeta
298 cnh 1.1 CcnhDebugEnds
299 jmc 1.28 eta_qrNM1 = eta_qrN
300 cnh 1.1
301     DO bj=myByLo(myThid),myByHi(myThid)
302     DO bi=myBxLo(myThid),myBxHi(myThid)
303     DO J=1,sNy
304     DO I=1,sNx
305 cnh 1.14 cg2d_s(I,J,bi,bj) = cg2d_q(I,J,bi,bj)
306     & + cgBeta*cg2d_s(I,J,bi,bj)
307 cnh 1.1 ENDDO
308     ENDDO
309     ENDDO
310     ENDDO
311    
312     C-- Do exchanges that require messages i.e. between
313     C-- processes.
314 cnh 1.13 C _EXCH_XY_R8( cg2d_s, myThid )
315 adcroft 1.23 #ifdef LETS_MAKE_JAM
316     CALL EXCH_XY_O1_R8_JAM( cg2d_s )
317     #else
318 cnh 1.13 OLw = 1
319     OLe = 1
320     OLn = 1
321     OLs = 1
322     exchWidthX = 1
323     exchWidthY = 1
324     myNz = 1
325 adcroft 1.33 IF (useCubedSphereExchange) THEN
326     CALL EXCH_RL_CUBE( cg2d_s,
327     I OLw, OLe, OLs, OLn, myNz,
328     I exchWidthX, exchWidthY,
329     I FORWARD_SIMULATION, EXCH_UPDATE_CORNERS, myThid )
330     ELSE
331 cnh 1.13 CALL EXCH_RL( cg2d_s,
332 adcroft 1.33 I OLw, OLe, OLs, OLn, myNz,
333 cnh 1.13 I exchWidthX, exchWidthY,
334 adcroft 1.33 I FORWARD_SIMULATION, EXCH_UPDATE_CORNERS, myThid )
335     ENDIF
336 adcroft 1.23 #endif
337 cnh 1.1
338     C== Evaluate laplace operator on conjugate gradient vector
339     C== q = A.s
340     alpha = 0. _d 0
341     DO bj=myByLo(myThid),myByHi(myThid)
342     DO bi=myBxLo(myThid),myBxHi(myThid)
343     DO J=1,sNy
344     DO I=1,sNx
345     cg2d_q(I,J,bi,bj) =
346     & aW2d(I ,J ,bi,bj)*cg2d_s(I-1,J ,bi,bj)
347     & +aW2d(I+1,J ,bi,bj)*cg2d_s(I+1,J ,bi,bj)
348     & +aS2d(I ,J ,bi,bj)*cg2d_s(I ,J-1,bi,bj)
349     & +aS2d(I ,J+1,bi,bj)*cg2d_s(I ,J+1,bi,bj)
350     & -aW2d(I ,J ,bi,bj)*cg2d_s(I ,J ,bi,bj)
351     & -aW2d(I+1,J ,bi,bj)*cg2d_s(I ,J ,bi,bj)
352     & -aS2d(I ,J ,bi,bj)*cg2d_s(I ,J ,bi,bj)
353     & -aS2d(I ,J+1,bi,bj)*cg2d_s(I ,J ,bi,bj)
354 jmc 1.29 & -freeSurfFac*_rA(i,j,bi,bj)*recip_Bo(i,j,bi,bj)*
355 cnh 1.4 & cg2d_s(I ,J ,bi,bj)/deltaTMom/deltaTMom*cg2dNorm
356 cnh 1.1 alpha = alpha+cg2d_s(I,J,bi,bj)*cg2d_q(I,J,bi,bj)
357     ENDDO
358     ENDDO
359     ENDDO
360     ENDDO
361 adcroft 1.20 _GLOBAL_SUM_R8(alpha,myThid)
362 cnh 1.1 CcnhDebugStarts
363 heimbach 1.31 C WRITE(*,*) ' CG2D: Iteration ',it2d-1,' SUM(s*q)= ',alpha
364 cnh 1.1 CcnhDebugEnds
365 jmc 1.28 alpha = eta_qrN/alpha
366 cnh 1.1 CcnhDebugStarts
367 heimbach 1.31 C WRITE(*,*) ' CG2D: Iteration ',it2d-1,' alpha= ',alpha
368 cnh 1.1 CcnhDebugEnds
369    
370     C== Update solution and residual vectors
371     C Now compute "interior" points.
372     err = 0. _d 0
373     DO bj=myByLo(myThid),myByHi(myThid)
374     DO bi=myBxLo(myThid),myBxHi(myThid)
375     DO J=1,sNy
376     DO I=1,sNx
377     cg2d_x(I,J,bi,bj)=cg2d_x(I,J,bi,bj)+alpha*cg2d_s(I,J,bi,bj)
378     cg2d_r(I,J,bi,bj)=cg2d_r(I,J,bi,bj)-alpha*cg2d_q(I,J,bi,bj)
379     err = err+cg2d_r(I,J,bi,bj)*cg2d_r(I,J,bi,bj)
380     ENDDO
381     ENDDO
382     ENDDO
383     ENDDO
384    
385 adcroft 1.20 _GLOBAL_SUM_R8( err , myThid )
386 cnh 1.1 err = SQRT(err)
387     actualIts = it2d
388     actualResidual = err
389 adcroft 1.33 IF ( err .LT. cg2dTolerance ) GOTO 11
390 cnh 1.13 C _EXCH_XY_R8(cg2d_r, myThid )
391 adcroft 1.23 #ifdef LETS_MAKE_JAM
392     CALL EXCH_XY_O1_R8_JAM( cg2d_r )
393     #else
394 cnh 1.13 OLw = 1
395     OLe = 1
396     OLn = 1
397     OLs = 1
398     exchWidthX = 1
399     exchWidthY = 1
400     myNz = 1
401 adcroft 1.33 IF (useCubedSphereExchange) THEN
402     CALL EXCH_RL_CUBE( cg2d_r,
403     I OLw, OLe, OLs, OLn, myNz,
404     I exchWidthX, exchWidthY,
405     I FORWARD_SIMULATION, EXCH_UPDATE_CORNERS, myThid )
406     ELSE
407 cnh 1.13 CALL EXCH_RL( cg2d_r,
408 adcroft 1.33 I OLw, OLe, OLs, OLn, myNz,
409     I exchWidthX, exchWidthY,
410     I FORWARD_SIMULATION, EXCH_UPDATE_CORNERS, myThid )
411     ENDIF
412 adcroft 1.23 #endif
413 cnh 1.13
414 cnh 1.1 10 CONTINUE
415     11 CONTINUE
416    
417 adcroft 1.33 IF (cg2dNormaliseRHS) THEN
418 cnh 1.1 C-- Un-normalise the answer
419 adcroft 1.33 DO bj=myByLo(myThid),myByHi(myThid)
420     DO bi=myBxLo(myThid),myBxHi(myThid)
421     DO J=1,sNy
422     DO I=1,sNx
423     cg2d_x(I ,J ,bi,bj) = cg2d_x(I ,J ,bi,bj)/rhsNorm
424     ENDDO
425     ENDDO
426 cnh 1.1 ENDDO
427     ENDDO
428 adcroft 1.33 ENDIF
429 cnh 1.1
430 adcroft 1.22 C The following exchange was moved up to solve_for_pressure
431     C for compatibility with TAMC.
432     C _EXCH_XY_R8(cg2d_x, myThid )
433 adcroft 1.30 c _BEGIN_MASTER( myThid )
434 heimbach 1.31 c WRITE(*,'(A,I6,1PE30.14)') ' CG2D iters, err = ',
435 adcroft 1.30 c & actualIts, actualResidual
436     c _END_MASTER( )
437    
438     C-- Return parameters to caller
439 adcroft 1.33 lastResidual=actualResidual
440 adcroft 1.30 numIters=actualIts
441 cnh 1.1
442     CcnhDebugStarts
443 cnh 1.7 C CALL PLOT_FIELD_XYRL( cg2d_x, 'CALC_MOM_RHS CG2D_X' , 1, myThid )
444 cnh 1.1 C err = 0. _d 0
445     C DO bj=myByLo(myThid),myByHi(myThid)
446     C DO bi=myBxLo(myThid),myBxHi(myThid)
447     C DO J=1,sNy
448     C DO I=1,sNx
449     C cg2d_r(I,J,bi,bj) = cg2d_b(I,J,bi,bj) -
450     C & (aW2d(I ,J ,bi,bj)*cg2d_x(I-1,J ,bi,bj)
451     C & +aW2d(I+1,J ,bi,bj)*cg2d_x(I+1,J ,bi,bj)
452     C & +aS2d(I ,J ,bi,bj)*cg2d_x(I ,J-1,bi,bj)
453     C & +aS2d(I ,J+1,bi,bj)*cg2d_x(I ,J+1,bi,bj)
454     C & -aW2d(I ,J ,bi,bj)*cg2d_x(I ,J ,bi,bj)
455     C & -aW2d(I+1,J ,bi,bj)*cg2d_x(I ,J ,bi,bj)
456     C & -aS2d(I ,J ,bi,bj)*cg2d_x(I ,J ,bi,bj)
457     C & -aS2d(I ,J+1,bi,bj)*cg2d_x(I ,J ,bi,bj))
458     C err = err +
459     C & cg2d_r(I,J,bi,bj)*cg2d_r(I,J,bi,bj)
460     C ENDDO
461     C ENDDO
462     C ENDDO
463     C ENDDO
464 adcroft 1.20 C _GLOBAL_SUM_R8( err , myThid )
465 heimbach 1.31 C write(*,*) 'cg2d: Ax - b = ',SQRT(err)
466 cnh 1.1 CcnhDebugEnds
467    
468 adcroft 1.19 RETURN
469 cnh 1.1 END

  ViewVC Help
Powered by ViewVC 1.1.22