aboutsummaryrefslogtreecommitdiff
path: root/src/sparse-matrix
diff options
context:
space:
mode:
authorjthorn <jthorn@f88db872-0e4f-0410-b76b-b9085cfa78c5>2003-06-02 15:09:31 +0000
committerjthorn <jthorn@f88db872-0e4f-0410-b76b-b9085cfa78c5>2003-06-02 15:09:31 +0000
commit8c1df307defb9c192ba2445e7c5da1e07f5038ab (patch)
tree0ff37b99cd57ef45ec0ca6da7b818dca6ed1bf65 /src/sparse-matrix
parent45d0f56612e0fd0651591cf6830c9ede411725d9 (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.f7738
-rw-r--r--src/sparse-matrix/ilucg/ilucg.h35
-rw-r--r--src/sparse-matrix/ilucg/silucg.f7738
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