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

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

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


Revision 1.34 - (show 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 C $Header: /u/gcmpack/models/MITgcmUV/model/src/cg2d.F,v 1.33 2001/05/29 14:01:36 adcroft Exp $
2 C $Name: $
3
4 #include "CPP_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: CG2D
8 C !INTERFACE:
9 SUBROUTINE CG2D(
10 I cg2d_b,
11 U cg2d_x,
12 O firstResidual,
13 O lastResidual,
14 U numIters,
15 I myThid )
16 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 IMPLICIT NONE
43 C === Global data ===
44 #include "SIZE.h"
45 #include "EEPARAMS.h"
46 #include "PARAMS.h"
47 #include "GRID.h"
48 #include "CG2D.h"
49 #include "SURFACE.h"
50
51 C !INPUT/OUTPUT PARAMETERS:
52 C === Routine arguments ===
53 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 C firstResidual - the initial residual before any iterations
57 C lastResidual - the actual residual reached
58 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 _RL firstResidual
63 _RL lastResidual
64 INTEGER numIters
65 INTEGER myThid
66
67 C !LOCAL VARIABLES:
68 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 C eta_qrN - Used in computing search directions
74 C eta_qrNM1 suffix N and NM1 denote current and
75 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 _RL actualResidual
85 INTEGER bi, bj
86 INTEGER I, J, it2d
87 _RL err
88 _RL eta_qrN
89 _RL eta_qrNM1
90 _RL cgBeta
91 _RL alpha
92 _RL sumRHS
93 _RL rhsMax
94 _RL rhsNorm
95
96 INTEGER OLw
97 INTEGER OLe
98 INTEGER OLn
99 INTEGER OLs
100 INTEGER exchWidthX
101 INTEGER exchWidthY
102 INTEGER myNz
103 CEOP
104
105
106 CcnhDebugStarts
107 C CHARACTER*(MAX_LEN_FNAM) suff
108 CcnhDebugEnds
109
110
111 C-- Initialise inverter
112 eta_qrNM1 = 1. _d 0
113
114 CcnhDebugStarts
115 C _EXCH_XY_R8( cg2d_b, myThid )
116 C CALL PLOT_FIELD_XYRL( cg2d_b, 'CG2D.0 CG2D_B' , 1, myThid )
117 C suff = 'unnormalised'
118 C CALL WRITE_FLD_XY_RL ( 'cg2d_b.',suff, cg2d_b, 1, myThid)
119 C STOP
120 CcnhDebugEnds
121
122 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
135 IF (cg2dNormaliseRHS) THEN
136 C- Normalise RHS :
137 #ifdef LETS_MAKE_JAM
138 C _GLOBAL_MAX_R8( rhsMax, myThid )
139 rhsMax=1.
140 #else
141 _GLOBAL_MAX_R8( rhsMax, myThid )
142 Catm rhsMax=1.
143 #endif
144 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 C- end Normalise RHS
157 ENDIF
158
159 C-- Update overlaps
160 _EXCH_XY_R8( cg2d_b, myThid )
161 _EXCH_XY_R8( cg2d_x, myThid )
162 CcnhDebugStarts
163 C CALL PLOT_FIELD_XYRL( cg2d_b, 'CG2D.1 CG2D_B' , 1, myThid )
164 C suff = 'normalised'
165 C CALL WRITE_FLD_XY_RL ( 'cg2d_b.',suff, cg2d_b, 1, myThid)
166 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 & -aS2d(I ,J+1,bi,bj)*cg2d_x(I ,J ,bi,bj)
185 & -freeSurfFac*_rA(i,j,bi,bj)*recip_Bo(i,j,bi,bj)*
186 & cg2d_x(I ,J ,bi,bj)/deltaTMom/deltaTMom*cg2dNorm
187 & )
188 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 C _EXCH_XY_R8( cg2d_r, myThid )
197 #ifdef LETS_MAKE_JAM
198 CALL EXCH_XY_O1_R8_JAM( cg2d_r )
199 #else
200 OLw = 1
201 OLe = 1
202 OLn = 1
203 OLs = 1
204 exchWidthX = 1
205 exchWidthY = 1
206 myNz = 1
207 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 CALL EXCH_RL( cg2d_r,
214 I OLw, OLe, OLs, OLn, myNz,
215 I exchWidthX, exchWidthY,
216 I FORWARD_SIMULATION, EXCH_UPDATE_CORNERS, myThid )
217 ENDIF
218 #endif
219 C _EXCH_XY_R8( cg2d_s, myThid )
220 #ifdef LETS_MAKE_JAM
221 CALL EXCH_XY_O1_R8_JAM( cg2d_s )
222 #else
223 OLw = 1
224 OLe = 1
225 OLn = 1
226 OLs = 1
227 exchWidthX = 1
228 exchWidthY = 1
229 myNz = 1
230 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 CALL EXCH_RL( cg2d_s,
237 I OLw, OLe, OLs, OLn, myNz,
238 I exchWidthX, exchWidthY,
239 I FORWARD_SIMULATION, EXCH_UPDATE_CORNERS, myThid )
240 ENDIF
241 #endif
242 _GLOBAL_SUM_R8( sumRHS, myThid )
243 _GLOBAL_SUM_R8( err , myThid )
244 err = SQRT(err)
245 actualIts = 0
246 actualResidual = err
247
248 _BEGIN_MASTER( myThid )
249 write(*,'(A,1P2E22.14)')' cg2d: Sum(rhs),rhsMax = ',
250 & sumRHS,rhsMax
251 _END_MASTER( )
252 C _BARRIER
253 c _BEGIN_MASTER( myThid )
254 c WRITE(*,'(A,I6,1PE30.14)') ' CG2D iters, err = ',
255 c & actualIts, actualResidual
256 c _END_MASTER( )
257 firstResidual=actualResidual
258
259 IF ( err .LT. cg2dTolerance ) GOTO 11
260
261 C >>>>>>>>>>>>>>> BEGIN SOLVER <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
262 DO 10 it2d=1, numIters
263
264 CcnhDebugStarts
265 C WRITE(*,*) ' CG2D: Iteration ',it2d-1,' residual = ',
266 C & actualResidual
267 CcnhDebugEnds
268 C-- Solve preconditioning equation and update
269 C-- conjugate direction vector "s".
270 eta_qrN = 0. _d 0
271 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 & 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 CcnhDebugStarts
282 C cg2d_q(I,J,bi,bj) = cg2d_r(I ,J ,bi,bj)
283 CcnhDebugEnds
284 eta_qrN = eta_qrN
285 & +cg2d_q(I,J,bi,bj)*cg2d_r(I,J,bi,bj)
286 ENDDO
287 ENDDO
288 ENDDO
289 ENDDO
290
291 _GLOBAL_SUM_R8(eta_qrN, myThid)
292 CcnhDebugStarts
293 C WRITE(*,*) ' CG2D: Iteration ',it2d-1,' eta_qrN = ',eta_qrN
294 CcnhDebugEnds
295 cgBeta = eta_qrN/eta_qrNM1
296 CcnhDebugStarts
297 C WRITE(*,*) ' CG2D: Iteration ',it2d-1,' beta = ',cgBeta
298 CcnhDebugEnds
299 eta_qrNM1 = eta_qrN
300
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 cg2d_s(I,J,bi,bj) = cg2d_q(I,J,bi,bj)
306 & + cgBeta*cg2d_s(I,J,bi,bj)
307 ENDDO
308 ENDDO
309 ENDDO
310 ENDDO
311
312 C-- Do exchanges that require messages i.e. between
313 C-- processes.
314 C _EXCH_XY_R8( cg2d_s, myThid )
315 #ifdef LETS_MAKE_JAM
316 CALL EXCH_XY_O1_R8_JAM( cg2d_s )
317 #else
318 OLw = 1
319 OLe = 1
320 OLn = 1
321 OLs = 1
322 exchWidthX = 1
323 exchWidthY = 1
324 myNz = 1
325 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 CALL EXCH_RL( cg2d_s,
332 I OLw, OLe, OLs, OLn, myNz,
333 I exchWidthX, exchWidthY,
334 I FORWARD_SIMULATION, EXCH_UPDATE_CORNERS, myThid )
335 ENDIF
336 #endif
337
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 & -freeSurfFac*_rA(i,j,bi,bj)*recip_Bo(i,j,bi,bj)*
355 & cg2d_s(I ,J ,bi,bj)/deltaTMom/deltaTMom*cg2dNorm
356 alpha = alpha+cg2d_s(I,J,bi,bj)*cg2d_q(I,J,bi,bj)
357 ENDDO
358 ENDDO
359 ENDDO
360 ENDDO
361 _GLOBAL_SUM_R8(alpha,myThid)
362 CcnhDebugStarts
363 C WRITE(*,*) ' CG2D: Iteration ',it2d-1,' SUM(s*q)= ',alpha
364 CcnhDebugEnds
365 alpha = eta_qrN/alpha
366 CcnhDebugStarts
367 C WRITE(*,*) ' CG2D: Iteration ',it2d-1,' alpha= ',alpha
368 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 _GLOBAL_SUM_R8( err , myThid )
386 err = SQRT(err)
387 actualIts = it2d
388 actualResidual = err
389 IF ( err .LT. cg2dTolerance ) GOTO 11
390 C _EXCH_XY_R8(cg2d_r, myThid )
391 #ifdef LETS_MAKE_JAM
392 CALL EXCH_XY_O1_R8_JAM( cg2d_r )
393 #else
394 OLw = 1
395 OLe = 1
396 OLn = 1
397 OLs = 1
398 exchWidthX = 1
399 exchWidthY = 1
400 myNz = 1
401 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 CALL EXCH_RL( cg2d_r,
408 I OLw, OLe, OLs, OLn, myNz,
409 I exchWidthX, exchWidthY,
410 I FORWARD_SIMULATION, EXCH_UPDATE_CORNERS, myThid )
411 ENDIF
412 #endif
413
414 10 CONTINUE
415 11 CONTINUE
416
417 IF (cg2dNormaliseRHS) THEN
418 C-- Un-normalise the answer
419 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 ENDDO
427 ENDDO
428 ENDIF
429
430 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 c _BEGIN_MASTER( myThid )
434 c WRITE(*,'(A,I6,1PE30.14)') ' CG2D iters, err = ',
435 c & actualIts, actualResidual
436 c _END_MASTER( )
437
438 C-- Return parameters to caller
439 lastResidual=actualResidual
440 numIters=actualIts
441
442 CcnhDebugStarts
443 C CALL PLOT_FIELD_XYRL( cg2d_x, 'CALC_MOM_RHS CG2D_X' , 1, myThid )
444 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 C _GLOBAL_SUM_R8( err , myThid )
465 C write(*,*) 'cg2d: Ax - b = ',SQRT(err)
466 CcnhDebugEnds
467
468 RETURN
469 END

  ViewVC Help
Powered by ViewVC 1.1.22