6 |
SUBROUTINE CG2D( |
SUBROUTINE CG2D( |
7 |
I cg2d_b, |
I cg2d_b, |
8 |
U cg2d_x, |
U cg2d_x, |
9 |
U tolerance, |
O firstResidual, |
10 |
O residual, |
O lastResidual, |
11 |
U numIters, |
U numIters, |
12 |
I myThid ) |
I myThid ) |
13 |
C /==========================================================\ |
C /==========================================================\ |
39 |
#include "EEPARAMS.h" |
#include "EEPARAMS.h" |
40 |
#include "PARAMS.h" |
#include "PARAMS.h" |
41 |
#include "GRID.h" |
#include "GRID.h" |
42 |
#include "CG2D_INTERNAL.h" |
#include "CG2D.h" |
43 |
#include "SURFACE.h" |
#include "SURFACE.h" |
44 |
|
|
45 |
C === Routine arguments === |
C === Routine arguments === |
46 |
C myThid - Thread on which I am working. |
C myThid - Thread on which I am working. |
47 |
C cg2d_b - The source term or "right hand side" |
C cg2d_b - The source term or "right hand side" |
48 |
C cg2d_x - The solution |
C cg2d_x - The solution |
49 |
C tolerance - Entry: the tolerance of accuracy to solve to |
C firstResidual - the initial residual before any iterations |
50 |
C Exit: the initial residual before any iterations |
C lastResidual - the actual residual reached |
|
C residual - Exit: the actual residual reached |
|
51 |
C numIters - Entry: the maximum number of iterations allowed |
C numIters - Entry: the maximum number of iterations allowed |
52 |
C Exit: the actual number of iterations used |
C Exit: the actual number of iterations used |
53 |
_RL cg2d_b(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) |
_RL cg2d_b(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) |
54 |
_RL cg2d_x(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) |
_RL cg2d_x(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) |
55 |
_RL tolerance |
_RL firstResidual |
56 |
_RL residual |
_RL lastResidual |
57 |
INTEGER numIters |
INTEGER numIters |
58 |
INTEGER myThid |
INTEGER myThid |
59 |
|
|
73 |
C err - Measure of residual of Ax - b, usually the norm. |
C err - Measure of residual of Ax - b, usually the norm. |
74 |
C I, J, N - Loop counters ( N counts CG iterations ) |
C I, J, N - Loop counters ( N counts CG iterations ) |
75 |
INTEGER actualIts |
INTEGER actualIts |
76 |
_RL actualResidual,initialResidual |
_RL actualResidual |
77 |
INTEGER bi, bj |
INTEGER bi, bj |
78 |
INTEGER I, J, it2d |
INTEGER I, J, it2d |
79 |
_RL err |
_RL err |
122 |
ENDDO |
ENDDO |
123 |
ENDDO |
ENDDO |
124 |
ENDDO |
ENDDO |
125 |
|
|
126 |
|
IF (cg2dNormaliseRHS) THEN |
127 |
|
C- Normalise RHS : |
128 |
#ifdef LETS_MAKE_JAM |
#ifdef LETS_MAKE_JAM |
129 |
C _GLOBAL_MAX_R8( rhsMax, myThid ) |
C _GLOBAL_MAX_R8( rhsMax, myThid ) |
130 |
rhsMax=1. |
rhsMax=1. |
144 |
ENDDO |
ENDDO |
145 |
ENDDO |
ENDDO |
146 |
ENDDO |
ENDDO |
147 |
|
C- end Normalise RHS |
148 |
|
ENDIF |
149 |
|
|
150 |
C-- Update overlaps |
C-- Update overlaps |
151 |
_EXCH_XY_R8( cg2d_b, myThid ) |
_EXCH_XY_R8( cg2d_b, myThid ) |
195 |
exchWidthX = 1 |
exchWidthX = 1 |
196 |
exchWidthY = 1 |
exchWidthY = 1 |
197 |
myNz = 1 |
myNz = 1 |
198 |
|
IF (useCubedSphereExchange) THEN |
199 |
|
CALL EXCH_RL_CUBE( cg2d_r, |
200 |
|
I OLw, OLe, OLs, OLn, myNz, |
201 |
|
I exchWidthX, exchWidthY, |
202 |
|
I FORWARD_SIMULATION, EXCH_UPDATE_CORNERS, myThid ) |
203 |
|
ELSE |
204 |
CALL EXCH_RL( cg2d_r, |
CALL EXCH_RL( cg2d_r, |
205 |
I OLw, OLe, OLs, OLn, sNx, sNy, myNz, |
I OLw, OLe, OLs, OLn, myNz, |
206 |
I exchWidthX, exchWidthY, |
I exchWidthX, exchWidthY, |
207 |
I FORWARD_SIMULATION, EXCH_IGNORE_CORNERS, myThid ) |
I FORWARD_SIMULATION, EXCH_UPDATE_CORNERS, myThid ) |
208 |
|
ENDIF |
209 |
#endif |
#endif |
210 |
C _EXCH_XY_R8( cg2d_s, myThid ) |
C _EXCH_XY_R8( cg2d_s, myThid ) |
211 |
#ifdef LETS_MAKE_JAM |
#ifdef LETS_MAKE_JAM |
218 |
exchWidthX = 1 |
exchWidthX = 1 |
219 |
exchWidthY = 1 |
exchWidthY = 1 |
220 |
myNz = 1 |
myNz = 1 |
221 |
|
IF (useCubedSphereExchange) THEN |
222 |
|
CALL EXCH_RL_CUBE( cg2d_s, |
223 |
|
I OLw, OLe, OLs, OLn, myNz, |
224 |
|
I exchWidthX, exchWidthY, |
225 |
|
I FORWARD_SIMULATION, EXCH_UPDATE_CORNERS, myThid ) |
226 |
|
ELSE |
227 |
CALL EXCH_RL( cg2d_s, |
CALL EXCH_RL( cg2d_s, |
228 |
I OLw, OLe, OLs, OLn, sNx, sNy, myNz, |
I OLw, OLe, OLs, OLn, myNz, |
229 |
I exchWidthX, exchWidthY, |
I exchWidthX, exchWidthY, |
230 |
I FORWARD_SIMULATION, EXCH_IGNORE_CORNERS, myThid ) |
I FORWARD_SIMULATION, EXCH_UPDATE_CORNERS, myThid ) |
231 |
|
ENDIF |
232 |
#endif |
#endif |
233 |
_GLOBAL_SUM_R8( sumRHS, myThid ) |
_GLOBAL_SUM_R8( sumRHS, myThid ) |
234 |
C WRITE(6,*) ' mythid, err = ', mythid, SQRT(err) |
_GLOBAL_SUM_R8( err , myThid ) |
235 |
_GLOBAL_SUM_R8( err , myThid ) |
err = SQRT(err) |
236 |
|
actualIts = 0 |
237 |
|
actualResidual = err |
238 |
|
|
239 |
_BEGIN_MASTER( myThid ) |
_BEGIN_MASTER( myThid ) |
240 |
write(*,'(A,1PE30.14)') ' cg2d: Sum(rhs) = ',sumRHS |
write(*,'(A,1P2E22.14)')' cg2d: Sum(rhs),rhsMax = ', |
241 |
|
& sumRHS,rhsMax |
242 |
_END_MASTER( ) |
_END_MASTER( ) |
|
|
|
|
actualIts = 0 |
|
|
actualResidual = SQRT(err) |
|
243 |
C _BARRIER |
C _BARRIER |
244 |
c _BEGIN_MASTER( myThid ) |
c _BEGIN_MASTER( myThid ) |
245 |
c WRITE(*,'(A,I6,1PE30.14)') ' CG2D iters, err = ', |
c WRITE(*,'(A,I6,1PE30.14)') ' CG2D iters, err = ', |
246 |
c & actualIts, actualResidual |
c & actualIts, actualResidual |
247 |
c _END_MASTER( ) |
c _END_MASTER( ) |
248 |
initialResidual=actualResidual |
firstResidual=actualResidual |
249 |
|
|
250 |
|
IF ( err .LT. cg2dTolerance ) GOTO 11 |
251 |
|
|
252 |
C >>>>>>>>>>>>>>> BEGIN SOLVER <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< |
C >>>>>>>>>>>>>>> BEGIN SOLVER <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< |
253 |
DO 10 it2d=1, numIters |
DO 10 it2d=1, numIters |
256 |
C WRITE(*,*) ' CG2D: Iteration ',it2d-1,' residual = ', |
C WRITE(*,*) ' CG2D: Iteration ',it2d-1,' residual = ', |
257 |
C & actualResidual |
C & actualResidual |
258 |
CcnhDebugEnds |
CcnhDebugEnds |
|
IF ( err .LT. tolerance ) GOTO 11 |
|
259 |
C-- Solve preconditioning equation and update |
C-- Solve preconditioning equation and update |
260 |
C-- conjugate direction vector "s". |
C-- conjugate direction vector "s". |
261 |
eta_qrN = 0. _d 0 |
eta_qrN = 0. _d 0 |
313 |
exchWidthX = 1 |
exchWidthX = 1 |
314 |
exchWidthY = 1 |
exchWidthY = 1 |
315 |
myNz = 1 |
myNz = 1 |
316 |
|
IF (useCubedSphereExchange) THEN |
317 |
|
CALL EXCH_RL_CUBE( cg2d_s, |
318 |
|
I OLw, OLe, OLs, OLn, myNz, |
319 |
|
I exchWidthX, exchWidthY, |
320 |
|
I FORWARD_SIMULATION, EXCH_UPDATE_CORNERS, myThid ) |
321 |
|
ELSE |
322 |
CALL EXCH_RL( cg2d_s, |
CALL EXCH_RL( cg2d_s, |
323 |
I OLw, OLe, OLs, OLn, sNx, sNy, myNz, |
I OLw, OLe, OLs, OLn, myNz, |
324 |
I exchWidthX, exchWidthY, |
I exchWidthX, exchWidthY, |
325 |
I FORWARD_SIMULATION, EXCH_IGNORE_CORNERS, myThid ) |
I FORWARD_SIMULATION, EXCH_UPDATE_CORNERS, myThid ) |
326 |
|
ENDIF |
327 |
#endif |
#endif |
328 |
|
|
329 |
C== Evaluate laplace operator on conjugate gradient vector |
C== Evaluate laplace operator on conjugate gradient vector |
377 |
err = SQRT(err) |
err = SQRT(err) |
378 |
actualIts = it2d |
actualIts = it2d |
379 |
actualResidual = err |
actualResidual = err |
380 |
IF ( err .LT. cg2dTargetResidual ) GOTO 11 |
IF ( err .LT. cg2dTolerance ) GOTO 11 |
381 |
C _EXCH_XY_R8(cg2d_r, myThid ) |
C _EXCH_XY_R8(cg2d_r, myThid ) |
382 |
#ifdef LETS_MAKE_JAM |
#ifdef LETS_MAKE_JAM |
383 |
CALL EXCH_XY_O1_R8_JAM( cg2d_r ) |
CALL EXCH_XY_O1_R8_JAM( cg2d_r ) |
389 |
exchWidthX = 1 |
exchWidthX = 1 |
390 |
exchWidthY = 1 |
exchWidthY = 1 |
391 |
myNz = 1 |
myNz = 1 |
392 |
|
IF (useCubedSphereExchange) THEN |
393 |
|
CALL EXCH_RL_CUBE( cg2d_r, |
394 |
|
I OLw, OLe, OLs, OLn, myNz, |
395 |
|
I exchWidthX, exchWidthY, |
396 |
|
I FORWARD_SIMULATION, EXCH_UPDATE_CORNERS, myThid ) |
397 |
|
ELSE |
398 |
CALL EXCH_RL( cg2d_r, |
CALL EXCH_RL( cg2d_r, |
399 |
I OLw, OLe, OLs, OLn, sNx, sNy, myNz, |
I OLw, OLe, OLs, OLn, myNz, |
400 |
I exchWidthX, exchWidthY, |
I exchWidthX, exchWidthY, |
401 |
I FORWARD_SIMULATION, EXCH_IGNORE_CORNERS, myThid ) |
I FORWARD_SIMULATION, EXCH_UPDATE_CORNERS, myThid ) |
402 |
|
ENDIF |
403 |
#endif |
#endif |
404 |
|
|
405 |
10 CONTINUE |
10 CONTINUE |
406 |
11 CONTINUE |
11 CONTINUE |
407 |
|
|
408 |
|
IF (cg2dNormaliseRHS) THEN |
409 |
C-- Un-normalise the answer |
C-- Un-normalise the answer |
410 |
DO bj=myByLo(myThid),myByHi(myThid) |
DO bj=myByLo(myThid),myByHi(myThid) |
411 |
DO bi=myBxLo(myThid),myBxHi(myThid) |
DO bi=myBxLo(myThid),myBxHi(myThid) |
412 |
DO J=1,sNy |
DO J=1,sNy |
413 |
DO I=1,sNx |
DO I=1,sNx |
414 |
cg2d_x(I ,J ,bi,bj) = cg2d_x(I ,J ,bi,bj)/rhsNorm |
cg2d_x(I ,J ,bi,bj) = cg2d_x(I ,J ,bi,bj)/rhsNorm |
415 |
|
ENDDO |
416 |
|
ENDDO |
417 |
ENDDO |
ENDDO |
418 |
ENDDO |
ENDDO |
419 |
ENDDO |
ENDIF |
|
ENDDO |
|
420 |
|
|
421 |
C The following exchange was moved up to solve_for_pressure |
C The following exchange was moved up to solve_for_pressure |
422 |
C for compatibility with TAMC. |
C for compatibility with TAMC. |
427 |
c _END_MASTER( ) |
c _END_MASTER( ) |
428 |
|
|
429 |
C-- Return parameters to caller |
C-- Return parameters to caller |
430 |
tolerance=initialResidual |
lastResidual=actualResidual |
|
residual=actualResidual |
|
431 |
numIters=actualIts |
numIters=actualIts |
432 |
|
|
433 |
CcnhDebugStarts |
CcnhDebugStarts |