home *** CD-ROM | disk | FTP | other *** search
- SUBROUTINE STRCO(T,LDT,N,RCOND,Z,JOB)
- INTEGER LDT,N,JOB
- REAL T(LDT,1),Z(1)
- REAL RCOND
- C
- C STRCO ESTIMATES THE CONDITION OF A REAL TRIANGULAR MATRIX.
- C
- C ON ENTRY
- C
- C T REAL(LDT,N)
- C T CONTAINS THE TRIANGULAR MATRIX. THE ZERO
- C ELEMENTS OF THE MATRIX ARE NOT REFERENCED, AND
- C THE CORRESPONDING ELEMENTS OF THE ARRAY CAN BE
- C USED TO STORE OTHER INFORMATION.
- C
- C LDT INTEGER
- C LDT IS THE LEADING DIMENSION OF THE ARRAY T.
- C
- C N INTEGER
- C N IS THE ORDER OF THE SYSTEM.
- C
- C JOB INTEGER
- C = 0 T IS LOWER TRIANGULAR.
- C = NONZERO T IS UPPER TRIANGULAR.
- C
- C ON RETURN
- C
- C RCOND REAL
- C AN ESTIMATE OF THE RECIPROCAL CONDITION OF T .
- C FOR THE SYSTEM T*X = B , RELATIVE PERTURBATIONS
- C IN T AND B OF SIZE EPSILON MAY CAUSE
- C RELATIVE PERTURBATIONS IN X OF SIZE EPSILON/RCOND .
- C IF RCOND IS SO SMALL THAT THE LOGICAL EXPRESSION
- C 1.0 + RCOND .EQ. 1.0
- C IS TRUE, THEN T MAY BE SINGULAR TO WORKING
- C PRECISION. IN PARTICULAR, RCOND IS ZERO IF
- C EXACT SINGULARITY IS DETECTED OR THE ESTIMATE
- C UNDERFLOWS.
- C
- C Z REAL(N)
- C A WORK VECTOR WHOSE CONTENTS ARE USUALLY UNIMPORTANT.
- C IF T IS CLOSE TO A SINGULAR MATRIX, THEN Z IS
- C AN APPROXIMATE NULL VECTOR IN THE SENSE THAT
- C NORM(A*Z) = RCOND*NORM(A)*NORM(Z) .
- C
- C LINPACK. THIS VERSION DATED 08/14/78 .
- C CLEVE MOLER, UNIVERSITY OF NEW MEXICO, ARGONNE NATIONAL LAB.
- C
- C SUBROUTINES AND FUNCTIONS
- C
- C BLAS SAXPY,SSCAL,SASUM
- C FORTRAN ABS,AMAX1,SIGN
- C
- C INTERNAL VARIABLES
- C
- REAL W,WK,WKM,EK
- REAL TNORM,YNORM,S,SM,SASUM
- INTEGER I1,J,J1,J2,K,KK,L
- LOGICAL LOWER
- C
- LOWER = JOB .EQ. 0
- C
- C COMPUTE 1-NORM OF T
- C
- TNORM = 0.0E0
- DO 10 J = 1, N
- L = J
- IF (LOWER) L = N + 1 - J
- I1 = 1
- IF (LOWER) I1 = J
- TNORM = AMAX1(TNORM,SASUM(L,T(I1,J),1))
- 10 CONTINUE
- C
- C RCOND = 1/(NORM(T)*(ESTIMATE OF NORM(INVERSE(T)))) .
- C ESTIMATE = NORM(Z)/NORM(Y) WHERE T*Z = Y AND TRANS(T)*Y = E .
- C TRANS(T) IS THE TRANSPOSE OF T .
- C THE COMPONENTS OF E ARE CHOSEN TO CAUSE MAXIMUM LOCAL
- C GROWTH IN THE ELEMENTS OF Y .
- C THE VECTORS ARE FREQUENTLY RESCALED TO AVOID OVERFLOW.
- C
- C SOLVE TRANS(T)*Y = E
- C
- EK = 1.0E0
- DO 20 J = 1, N
- Z(J) = 0.0E0
- 20 CONTINUE
- DO 100 KK = 1, N
- K = KK
- IF (LOWER) K = N + 1 - KK
- IF (Z(K) .NE. 0.0E0) EK = SIGN(EK,-Z(K))
- IF (ABS(EK-Z(K)) .LE. ABS(T(K,K))) GO TO 30
- S = ABS(T(K,K))/ABS(EK-Z(K))
- CALL SSCAL(N,S,Z,1)
- EK = S*EK
- 30 CONTINUE
- WK = EK - Z(K)
- WKM = -EK - Z(K)
- S = ABS(WK)
- SM = ABS(WKM)
- IF (T(K,K) .EQ. 0.0E0) GO TO 40
- WK = WK/T(K,K)
- WKM = WKM/T(K,K)
- GO TO 50
- 40 CONTINUE
- WK = 1.0E0
- WKM = 1.0E0
- 50 CONTINUE
- IF (KK .EQ. N) GO TO 90
- J1 = K + 1
- IF (LOWER) J1 = 1
- J2 = N
- IF (LOWER) J2 = K - 1
- DO 60 J = J1, J2
- SM = SM + ABS(Z(J)+WKM*T(K,J))
- Z(J) = Z(J) + WK*T(K,J)
- S = S + ABS(Z(J))
- 60 CONTINUE
- IF (S .GE. SM) GO TO 80
- W = WKM - WK
- WK = WKM
- DO 70 J = J1, J2
- Z(J) = Z(J) + W*T(K,J)
- 70 CONTINUE
- 80 CONTINUE
- 90 CONTINUE
- Z(K) = WK
- 100 CONTINUE
- S = 1.0E0/SASUM(N,Z,1)
- CALL SSCAL(N,S,Z,1)
- C
- YNORM = 1.0E0
- C
- C SOLVE T*Z = Y
- C
- DO 130 KK = 1, N
- K = N + 1 - KK
- IF (LOWER) K = KK
- IF (ABS(Z(K)) .LE. ABS(T(K,K))) GO TO 110
- S = ABS(T(K,K))/ABS(Z(K))
- CALL SSCAL(N,S,Z,1)
- YNORM = S*YNORM
- 110 CONTINUE
- IF (T(K,K) .NE. 0.0E0) Z(K) = Z(K)/T(K,K)
- IF (T(K,K) .EQ. 0.0E0) Z(K) = 1.0E0
- I1 = 1
- IF (LOWER) I1 = K + 1
- IF (KK .GE. N) GO TO 120
- W = -Z(K)
- CALL SAXPY(N-KK,W,T(I1,K),1,Z(I1),1)
- 120 CONTINUE
- 130 CONTINUE
- C MAKE ZNORM = 1.0
- S = 1.0E0/SASUM(N,Z,1)
- CALL SSCAL(N,S,Z,1)
- YNORM = S*YNORM
- C
- IF (TNORM .NE. 0.0E0) RCOND = YNORM/TNORM
- IF (TNORM .EQ. 0.0E0) RCOND = 0.0E0
- RETURN
- END