diff options
author | jthorn <jthorn@f88db872-0e4f-0410-b76b-b9085cfa78c5> | 2003-06-02 15:09:31 +0000 |
---|---|---|
committer | jthorn <jthorn@f88db872-0e4f-0410-b76b-b9085cfa78c5> | 2003-06-02 15:09:31 +0000 |
commit | 8c1df307defb9c192ba2445e7c5da1e07f5038ab (patch) | |
tree | 0ff37b99cd57ef45ec0ca6da7b818dca6ed1bf65 /src/sparse-matrix | |
parent | 45d0f56612e0fd0651591cf6830c9ede411725d9 (diff) |
ilucg.h move here from ../../elliptic/
and update prototypes for remaining code
[sd]ilucg.f77 convert from being Fortran logical functions
to subroutines, add explicit error return argument
git-svn-id: http://svn.einsteintoolkit.org/cactus/EinsteinAnalysis/AHFinderDirect/trunk@1073 f88db872-0e4f-0410-b76b-b9085cfa78c5
Diffstat (limited to 'src/sparse-matrix')
-rw-r--r-- | src/sparse-matrix/ilucg/dilucg.f77 | 38 | ||||
-rw-r--r-- | src/sparse-matrix/ilucg/ilucg.h | 35 | ||||
-rw-r--r-- | src/sparse-matrix/ilucg/silucg.f77 | 38 |
3 files changed, 81 insertions, 30 deletions
diff --git a/src/sparse-matrix/ilucg/dilucg.f77 b/src/sparse-matrix/ilucg/dilucg.f77 index 7ed9049..411240d 100644 --- a/src/sparse-matrix/ilucg/dilucg.f77 +++ b/src/sparse-matrix/ilucg/dilucg.f77 @@ -1,4 +1,8 @@ - LOGICAL FUNCTION DILUCG(N,IA,JA,A,B,X,ITEMP,RTEMP,EPS,ITER,IE) + SUBROUTINE DILUCG(N,IA,JA,A, + $ B,X, + $ ITEMP,RTEMP, + $ EPS,ITER, + $ ISTATUS,IERROR) IMPLICIT DOUBLE PRECISION (A-H,O-Z) DIMENSION IA(*),JA(*),A(*),B(*),X(*),ITEMP(*),RTEMP(*) C @@ -26,19 +30,23 @@ C IS DEEMED TO HAVE OCCURED WHEN THE INFINITY-NORM OF THE C CHANGE IN THE SOLUTION IN ONE ITERATION IS .LE. EPS * THE 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.0 WILL ALLOW THE LAST TWO -C HEXADECIMAL DIGITS OF THE SOLUTION TO BE IN ERROR. +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 IE IS AN INTEGER VARIABLE. FOR NORMAL RETURN, IT GIVES +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 -C THE FUNCTION RETURNS .FALSE. IF ALL'S WELL, .TRUE. ON AN ERROR RETURN. -C -C (MODIFIED TO RETURN LOGICAL VALUE, J. THORNBURG, 13/MAY/85.) -C (MODIFIED TO ADD CONVERGENCE CRITERIA, J. THORNBURG, 17/MAY/85.) -C (MODIFIED CONVERGENCE CRITERIA, J. THORNBURG, 4/AUG/89.) -C (MODIFIED TO AVOID SKIP RETURNS, J. THORNBURG, 10/SEP/89.) +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 C REFERENCE: C D.S.KERSHAW,"THE INCOMPLETE CHOLESKY-CONJUGATE GRADIENT @@ -47,7 +55,7 @@ C J.COMPUT.PHYS. JAN 1978 PP 43-65 C LOGICAL DLU0 NP=IABS(N) - IE=0 + ISTATUS=0 IF (NP.EQ.0) GO TO 20 C CALCULATE INDICES FOR BREAKING UP TEMPORARY ARRAYS. N1=NP+1 @@ -66,16 +74,16 @@ 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),IE)) GOTO 20 + * ITEMP(ILU),ITEMP(JLU),ITEMP(ID),RTEMP(IR),ISTATUS)) 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,IE) - DILUCG = .FALSE. + * EPS,ITER,ISTATUS) + IERROR = 0 RETURN -20 DILUCG = .TRUE. +20 IERROR = -1 RETURN END diff --git a/src/sparse-matrix/ilucg/ilucg.h b/src/sparse-matrix/ilucg/ilucg.h new file mode 100644 index 0000000..9d839c9 --- /dev/null +++ b/src/sparse-matrix/ilucg/ilucg.h @@ -0,0 +1,35 @@ +/* ilucg.h -- C/C++ prototypes for [sd]ilucg() routines */ +/* $Header$ */ + +/* + * prerequisites: + * "cctk.h" + * "config.h" // for "integer" = Fortran integer + */ + +#ifdef __cplusplus +extern "C" + { +#endif + +/* + * ***** ILUCG ***** + */ +void CCTK_FCALL + CCTK_FNAME(silucg)(const integer* N, + const integer IA[], const integer JA[], const float A[], + const float B[], float X[], + integer ITEMP[], float RTEMP[], + const float* EPS, const integer* ITER, + integer* ISTATUS, integer* IERROR); +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); + +#ifdef __cplusplus + } /* extern "C" */ +#endif diff --git a/src/sparse-matrix/ilucg/silucg.f77 b/src/sparse-matrix/ilucg/silucg.f77 index 6eaa94b..09610e0 100644 --- a/src/sparse-matrix/ilucg/silucg.f77 +++ b/src/sparse-matrix/ilucg/silucg.f77 @@ -1,4 +1,8 @@ - LOGICAL FUNCTION SILUCG(N,IA,JA,A,B,X,ITEMP,RTEMP,EPS,ITER,IE) + SUBROUTINE SILUCG(N,IA,JA,A, + $ B,X, + $ ITEMP,RTEMP, + $ EPS,ITER, + $ ISTATUS,IERROR) IMPLICIT REAL (A-H,O-Z) DIMENSION IA(*),JA(*),A(*),B(*),X(*),ITEMP(*),RTEMP(*) C @@ -26,19 +30,23 @@ C IS DEEMED TO HAVE OCCURED WHEN THE INFINITY-NORM OF THE C CHANGE IN THE SOLUTION IN ONE ITERATION IS .LE. EPS * THE 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 TWO -C HEXADECIMAL DIGITS OF THE SOLUTION TO BE IN ERROR. +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 IE IS AN INTEGER VARIABLE. FOR NORMAL RETURN, IT GIVES +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 -C THE FUNCTION RETURNS .FALSE. IF ALL'S WELL, .TRUE. ON AN ERROR RETURN. -C -C (MODIFIED TO RETURN LOGICAL VALUE, J. THORNBURG, 13/MAY/85.) -C (MODIFIED TO ADD CONVERGENCE CRITERIA, J. THORNBURG, 17/MAY/85.) -C (MODIFIED CONVERGENCE CRITERIA, J. THORNBURG, 4/AUG/89.) -C (MODIFIED TO AVOID SKIP RETURNS, J. THORNBURG, 10/SEP/89.) +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 C REFERENCE: C D.S.KERSHAW,"THE INCOMPLETE CHOLESKY-CONJUGATE GRADIENT @@ -47,7 +55,7 @@ C J.COMPUT.PHYS. JAN 1978 PP 43-65 C LOGICAL SLU0 NP=IABS(N) - IE=0 + ISTATUS=0 IF (NP.EQ.0) GO TO 20 C CALCULATE INDICES FOR BREAKING UP TEMPORARY ARRAYS. N1=NP+1 @@ -66,16 +74,16 @@ 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),IE)) GOTO 20 + * ITEMP(ILU),ITEMP(JLU),ITEMP(ID),RTEMP(IR),ISTATUS)) 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,IE) - SILUCG = .FALSE. + * EPS,ITER,ISTATUS) + IERROR = 0 RETURN -20 SILUCG = .TRUE. +20 IERROR = -1 RETURN END |