diff options
author | jthorn <jthorn@f88db872-0e4f-0410-b76b-b9085cfa78c5> | 2003-06-04 11:50:47 +0000 |
---|---|---|
committer | jthorn <jthorn@f88db872-0e4f-0410-b76b-b9085cfa78c5> | 2003-06-04 11:50:47 +0000 |
commit | b5f6b97b07884e44b5ed6b6ca256edd230f978cf (patch) | |
tree | d20426e615840fd36ce8be64ede30ac695d87d8b | |
parent | 2e72b0e19eb45f00fb6fc7411d1bb9e3be0b3d8f (diff) |
changes to ILUCG subroutines
* change interface slightly
* revise convergence criteria
git-svn-id: http://svn.einsteintoolkit.org/cactus/EinsteinAnalysis/AHFinderDirect/trunk@1093 f88db872-0e4f-0410-b76b-b9085cfa78c5
-rw-r--r-- | src/sparse-matrix/ilucg/dilucg.f77 | 40 | ||||
-rw-r--r-- | src/sparse-matrix/ilucg/ilucg.h | 4 | ||||
-rw-r--r-- | src/sparse-matrix/ilucg/make.code.defn | 2 | ||||
-rw-r--r-- | src/sparse-matrix/ilucg/silucg.f77 | 36 |
4 files changed, 47 insertions, 35 deletions
diff --git a/src/sparse-matrix/ilucg/dilucg.f77 b/src/sparse-matrix/ilucg/dilucg.f77 index 411240d..11d6c4b 100644 --- a/src/sparse-matrix/ilucg/dilucg.f77 +++ b/src/sparse-matrix/ilucg/dilucg.f77 @@ -1,8 +1,9 @@ - SUBROUTINE DILUCG(N,IA,JA,A, + SUBROUTINE DILUCG(N, + $ IA,JA,A, $ B,X, $ ITEMP,RTEMP, - $ EPS,ITER, - $ ISTATUS,IERROR) + $ EPS,MAXITER, + $ ISTATUS) IMPLICIT DOUBLE PRECISION (A-H,O-Z) DIMENSION IA(*),JA(*),A(*),B(*),X(*),ITEMP(*),RTEMP(*) C @@ -32,21 +33,21 @@ C INFINITY-NORM OF THE CURRENT SOLUTION. HOWEVER, IF EPS C .LT. 0.0D0, IT IS INTERNALLY SCALED BY THE MACHINE PRECISION, C SO THAT, FOR EXAMPLE, EPS = -256.0D0 WILL ALLOW THE LAST 8 BITS C OF THE SOLUTION TO BE IN ERROR. -C ITER GIVES THE REQUESTED NUMBER OF ITERATIONS, OR IS 0 FOR "NO LIMIT". -C ISTATUS IS AN INTEGER VARIABLE. FOR NORMAL RETURN, IT GIVES -C THE NUMBER OF ITERATIONS DONE (NEGATIVE IS NO CONVERGENCE). -C ON ERROR RETURN, THE ROW IN ERROR. -C IERROR IS AN INTEGER VARIABLE. IT IS SET TO 0 FOR A SUCCESSFUL -C SOLUTION (REACHED CONVERGENCE CRITERION), OR NEGATIVE FOR AN -C ERROR (INCLUDING FAILURE TO CONVERGE WITHIN THE REQUESTED NUMBER -C OF ITERATIONS). +C MAXITER GIVES THE REQUESTED NUMBER OF ITERATIONS, +C OR IS 0 FOR "NO LIMIT". +C ISTATUS IS AN INTEGER VARIABLE, WHICH IS SET TO: +C -I IF THERE IS AN ERROR IN THE MATRIX STRUCTURE IN ROW I +C (SUCH AS A ZERO ELEMENT ON THE DIAGONAL). +C 0 IF THE ITERATION FAILED TO REACH THE CONVERGENCE CRITERION +C IN ITER ITERATIONS. +C +I IF THE ITERATION CONVERGED IN I ITERATIONS. C C MODIFICATIONS C * RETURN LOGICAL VALUE, J. THORNBURG, 13/MAY/85. C * ADD CONVERGENCE CRITERIA, J. THORNBURG, 17/MAY/85. C * CHANGED CONVERGENCE CRITERIA, J. THORNBURG, 4/AUG/89. C * AVOID SKIP RETURNS, J. THORNBURG, 10/SEP/89. -C * CHANGE FUNCTION BACK TO SUBROUTINE, J. THORNBURG, 2.JUN.2003 +C * CHANGE FUNCTION BACK TO SUBROUTINE, J. THORNBURG, 3.JUN.2003 C C REFERENCE: C D.S.KERSHAW,"THE INCOMPLETE CHOLESKY-CONJUGATE GRADIENT @@ -74,16 +75,19 @@ C CALCULATE INDICES FOR BREAKING UP TEMPORARY ARRAYS. IF (N.LT.0) GO TO 10 C DO INCOMPLETE LU DECOMPOSITION IF (DLU0(NP,IA,JA,A,ITEMP(IC),ITEMP(JC),ITEMP(JCI),RTEMP(IALU), - * ITEMP(ILU),ITEMP(JLU),ITEMP(ID),RTEMP(IR),ISTATUS)) GOTO 20 + * ITEMP(ILU),ITEMP(JLU),ITEMP(ID),RTEMP(IR),IERROR)) GOTO 20 C AND DO CONJUGATE GRADIENT ITERATIONS C CALL MODIFIED TO ADD ADJUSTABLE CONVERGENCE CRITERIA EPS C - J. THORNBURG, 17/MAY/85. 10 CALL DNCG0(NP,IA,JA,A,B,X,ITEMP(ILU),ITEMP(JLU),ITEMP(ID), * RTEMP(IALU),RTEMP(IR),RTEMP(IP),RTEMP(IS1),RTEMP(IS2), - * EPS,ITER,ISTATUS) - IERROR = 0 + * EPS,MAXITER,ITER) +C ITER IS ACTUAL NUMBER OF ITERATIONS (NEGATIVE IF NO CONVERGENCE) + ISTATUS = ITER + IF (ITER .LT. 0) ISTATUS = 0 RETURN -20 IERROR = -1 +C ERROR RETURN FROM INCOMPLETE LU DECOMPOSITION +20 ISTATUS = -IERROR RETURN END @@ -112,7 +116,9 @@ C ILU AND JLU CORRESPONDS TO IA AND JA BUT FOR ALU. C ID IS AN INTEGER ARRAY DIMENSIONED N. IT CONTAINS C INDICES TO THE DIAGONAL ELEMENTS OF U. C V IS A REAL SCRATCH VECTOR OF LENGTH N. -C IE GIVES THE ROW NUMBER IN ERROR. +C IE GIVES THE ROW NUMBER IN ERROR IF AN ERROR OCCURED +C (RETURN VALUE .TRUE.), OR IS UNUSED IF ALL IS WELL +C (RETURN VALUE .FALSE.). C C RETURN VALUE = .FALSE. IF ALL IS WELL, .TRUE. IF ERROR. C diff --git a/src/sparse-matrix/ilucg/ilucg.h b/src/sparse-matrix/ilucg/ilucg.h index 9d839c9..60cd98b 100644 --- a/src/sparse-matrix/ilucg/ilucg.h +++ b/src/sparse-matrix/ilucg/ilucg.h @@ -21,14 +21,14 @@ void CCTK_FCALL const float B[], float X[], integer ITEMP[], float RTEMP[], const float* EPS, const integer* ITER, - integer* ISTATUS, integer* IERROR); + integer* ISTATUS); void CCTK_FCALL CCTK_FNAME(dilucg)(const integer* N, const integer IA[], const integer JA[], const double A[], const double B[], double X[], integer ITEMP[], double RTEMP[], const double* EPS, const integer* ITER, - integer* ISTATUS, integer* IERROR); + integer* ISTATUS); #ifdef __cplusplus } /* extern "C" */ diff --git a/src/sparse-matrix/ilucg/make.code.defn b/src/sparse-matrix/ilucg/make.code.defn index 035b988..9a3d4ce 100644 --- a/src/sparse-matrix/ilucg/make.code.defn +++ b/src/sparse-matrix/ilucg/make.code.defn @@ -1,4 +1,4 @@ -# specification of things to be compiled in this directory +# Cactus specification of things to be compiled in this directory # $Header$ # Source files in this directory diff --git a/src/sparse-matrix/ilucg/silucg.f77 b/src/sparse-matrix/ilucg/silucg.f77 index 09610e0..fc97c3b 100644 --- a/src/sparse-matrix/ilucg/silucg.f77 +++ b/src/sparse-matrix/ilucg/silucg.f77 @@ -1,4 +1,5 @@ - SUBROUTINE SILUCG(N,IA,JA,A, + SUBROUTINE SILUCG(N, + $ IA,JA,A, $ B,X, $ ITEMP,RTEMP, $ EPS,ITER, @@ -32,21 +33,21 @@ C INFINITY-NORM OF THE CURRENT SOLUTION. HOWEVER, IF EPS C .LT. 0.0, IT IS INTERNALLY SCALED BY THE MACHINE PRECISION, C SO THAT, FOR EXAMPLE, EPS = -256.0 WILL ALLOW THE LAST 8 BITS C OF THE SOLUTION TO BE IN ERROR. -C ITER GIVES THE REQUESTED NUMBER OF ITERATIONS, OR IS 0 FOR "NO LIMIT". -C ISTATUS IS AN INTEGER VARIABLE. FOR NORMAL RETURN, IT GIVES -C THE NUMBER OF ITERATIONS DONE (NEGATIVE IS NO CONVERGENCE). -C ON ERROR RETURN, THE ROW IN ERROR. -C IERROR IS AN INTEGER VARIABLE. IT IS SET TO 0 FOR A SUCCESSFUL -C SOLUTION (REACHED CONVERGENCE CRITERION), OR NEGATIVE FOR AN -C ERROR (INCLUDING FAILURE TO CONVERGE WITHIN THE REQUESTED NUMBER -C OF ITERATIONS). +C MAXITER GIVES THE REQUESTED NUMBER OF ITERATIONS, +C OR IS 0 FOR "NO LIMIT". +C ISTATUS IS AN INTEGER VARIABLE, WHICH IS SET TO: +C -I IF THERE IS AN ERROR IN THE MATRIX STRUCTURE IN ROW I +C (SUCH AS A ZERO ELEMENT ON THE DIAGONAL). +C 0 IF THE ITERATION FAILED TO REACH THE CONVERGENCE CRITERION +C IN ITER ITERATIONS. +C +I IF THE ITERATION CONVERGED IN I ITERATIONS. C C MODIFICATIONS C * RETURN LOGICAL VALUE, J. THORNBURG, 13/MAY/85. C * ADD CONVERGENCE CRITERIA, J. THORNBURG, 17/MAY/85. C * CHANGED CONVERGENCE CRITERIA, J. THORNBURG, 4/AUG/89. C * AVOID SKIP RETURNS, J. THORNBURG, 10/SEP/89. -C * CHANGE FUNCTION BACK TO SUBROUTINE, J. THORNBURG, 2.JUN.2003 +C * CHANGE FUNCTION BACK TO SUBROUTINE, J. THORNBURG, 3.JUN.2003 C C REFERENCE: C D.S.KERSHAW,"THE INCOMPLETE CHOLESKY-CONJUGATE GRADIENT @@ -74,16 +75,19 @@ C CALCULATE INDICES FOR BREAKING UP TEMPORARY ARRAYS. IF (N.LT.0) GO TO 10 C DO INCOMPLETE LU DECOMPOSITION IF (SLU0(NP,IA,JA,A,ITEMP(IC),ITEMP(JC),ITEMP(JCI),RTEMP(IALU), - * ITEMP(ILU),ITEMP(JLU),ITEMP(ID),RTEMP(IR),ISTATUS)) GOTO 20 + * ITEMP(ILU),ITEMP(JLU),ITEMP(ID),RTEMP(IR),IERROR)) GOTO 20 C AND DO CONJUGATE GRADIENT ITERATIONS C CALL MODIFIED TO ADD ADJUSTABLE CONVERGENCE CRITERIA EPS C - J. THORNBURG, 17/MAY/85. 10 CALL SNCG0(NP,IA,JA,A,B,X,ITEMP(ILU),ITEMP(JLU),ITEMP(ID), * RTEMP(IALU),RTEMP(IR),RTEMP(IP),RTEMP(IS1),RTEMP(IS2), - * EPS,ITER,ISTATUS) - IERROR = 0 + * EPS,MAXITER,ITER) +C ITER IS ACTUAL NUMBER OF ITERATIONS (NEGATIVE IF NO CONVERGENCE) + ISTATUS = ITER + IF (ITER .LT. 0) ISTATUS = 0 RETURN -20 IERROR = -1 +C ERROR RETURN FROM INCOMPLETE LU DECOMPOSITION +20 ISTATUS = -IERROR RETURN END @@ -112,7 +116,9 @@ C ILU AND JLU CORRESPONDS TO IA AND JA BUT FOR ALU. C ID IS AN INTEGER ARRAY DIMENSIONED N. IT CONTAINS C INDICES TO THE DIAGONAL ELEMENTS OF U. C V IS A REAL SCRATCH VECTOR OF LENGTH N. -C IE GIVES THE ROW NUMBER IN ERROR. +C IE GIVES THE ROW NUMBER IN ERROR IF AN ERROR OCCURED +C (RETURN VALUE .TRUE.), OR IS UNUSED IF ALL IS WELL +C (RETURN VALUE .FALSE.). C C RETURN VALUE = .FALSE. IF ALL IS WELL, .TRUE. IF ERROR. C |