home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_progs / libs / matlab.lzh / MATLAB / MATLAB.LZH / Source / MatLab / WGECO.FOR < prev    next >
Encoding:
Text File  |  1991-04-13  |  6.5 KB  |  201 lines

  1.       SUBROUTINE WGECO (AR, AI, LDA, N, IPVT, RCOND, ZR, ZI)
  2.       IMPLICIT NONE
  3. C
  4. C FACTORS A DOUBLE-COMPLEX MATRIX BY GAUSSIAN ELIMINATION
  5. C   AND ESTIMATES THE CONDITION OF THE MATRIX
  6. C
  7. C IF RCOND IS NOT NEEDED, WGEFA IS SLIGHTLY FASTER
  8. C   TO SOLVE    A*X = B , FOLLOW WGECO BY WGESL
  9. C   TO COMPUTE  INVERSE(A)*C , FOLLOW WGECO BY WGESL
  10. C   TO COMPUTE  DETERMINANT(A) , FOLLOW WGECO BY WGEDI
  11. C   TO COMPUTE  INVERSE(A) , FOLLOW WGECO BY WGEDI
  12. C
  13. C ON ENTRY:
  14. C    A    DOUBLE-COMPLEX(LDA, N),  MATRIX TO BE FACTORED
  15. C    LDA  INTEGER,  LEADING DIMENSION OF THE ARRAY A
  16. C    N    INTEGER,  ORDER OF THE MATRIX A
  17. C
  18. C ON RETURN:
  19. C    A     AN UPPER TRIANGULAR MATRIX AND THE MULTIPLIERS WHICH WERE USED TO
  20. C            OBTAIN IT.  THE FACTORIZATION CAN BE WRITTEN  A = L*U  WHERE
  21. C            L IS A PRODUCT OF PERMUTATION AND UNIT LOWER TRIANGULAR MATRICES
  22. C            AND U IS UPPER TRIANGULAR.
  23. C    IPVT  INTEGER(N),  AN INTEGER VECTOR OF PIVOT INDICES.
  24. C    RCOND DOUBLE PRECISION,  AN ESTIMATE OF THE RECIPROCAL CONDITION OF A.
  25. C            FOR THE SYSTEM  A*X = B , RELATIVE PERTURBATIONS IN A AND B OF
  26. C            SIZE EPSILON MAY CAUSE RELATIVE PERTURBATIONS IN X OF SIZE
  27. C            EPSILON/RCOND.  IF RCOND IS SO SMALL THAT THE LOGICAL EXPRESSION
  28. C            1.0 + RCOND .EQ. 1.0  IS TRUE, THEN A MAY BE SINGULAR TO WORKING
  29. C            PRECISION.  IN PARTICULAR, RCOND IS ZERO IF EXACT SINGULARITY IS
  30. C            DETECTED OR THE ESTIMATE UNDERFLOWS.
  31. C    Z     DOUBLE-COMPLEX(N),  WORK VECTOR WHOSE CONTENTS ARE USUALLY
  32. C            UNIMPORTANT.  IF A IS CLOSE TO A SINGULAR MATRIX, THEN Z IS AN
  33. C            APPROXIMATE NULL VECTOR IN THE SENSE THAT NORM(A*Z) =
  34. C            RCOND*NORM(A)*NORM(Z).
  35. C
  36. C VERSION 07/01/79. CLEVE MOLER, UNIV OF NEW MEXICO, ARGONNE NATIONAL LAB.
  37. C
  38.       INTEGER LDA, N, IPVT(*)
  39.       DOUBLE PRECISION AR(LDA,*), AI(LDA,*), RCOND, ZR(*), ZI(*)
  40. C
  41.       DOUBLE PRECISION EKR, EKI, TR, TI, WKR, WKI, WKMR, WKMI
  42.       DOUBLE PRECISION ANORM, S, SM, YNORM
  43.       INTEGER INFO, J, K, KB, KP1, L
  44.       DOUBLE PRECISION ZDUMR, ZDUMI
  45. C
  46.       DOUBLE PRECISION CABS1, WDOTCR, WDOTCI, WASUM, FLOP
  47. C
  48. C
  49.       CABS1 (ZDUMR, ZDUMI) = DABS (ZDUMR)+DABS (ZDUMI)
  50. C
  51. C
  52. C ***      COMPUTE 1-NORM OF A
  53.       ANORM = 0.0D0
  54.       DO 10 J = 1, N
  55.         ANORM = DMAX1 (ANORM, WASUM (N, AR(1,J), AI(1,J), 1))
  56. 10    CONTINUE
  57. C
  58. C ***      FACTOR
  59.       CALL WGEFA (AR, AI, LDA, N, IPVT, INFO)
  60. C
  61. C *** RCOND = 1/(NORM(A)*(ESTIMATE OF NORM(INVERSE(A))))
  62. C     ESTIMATE = NORM(Z)/NORM(Y) WHERE  A*Z = Y  AND  CTRANS(A)*Y = E
  63. C     CTRANS(A)  IS THE CONJUGATE TRANSPOSE OF A
  64. C     THE COMPONENTS OF  E  ARE CHOSEN TO CAUSE MAXIMUM LOCAL GROWTH IN
  65. C       THE ELEMENTS OF W  WHERE  CTRANS(U)*W = E
  66. C     THE VECTORS ARE FREQUENTLY RESCALED TO AVOID OVERFLOW
  67. C
  68. C ***      SOLVE CTRANS(U)*W = E
  69.       EKR = 1.0D0
  70.       EKI = 0.0D0
  71.       DO 20 J = 1, N
  72.         ZR(J) = 0.0D0
  73.         ZI(J) = 0.0D0
  74. 20    CONTINUE
  75.       DO 110 K = 1, N
  76.         CALL WSIGN (EKR, EKI, -ZR(K), -ZI(K), EKR, EKI)
  77.         IF (CABS1 (EKR-ZR(K), EKI-ZI(K)).LE.CABS1 (AR(K,K), AI(K,K)))
  78.      .      GO TO 40
  79.         S = CABS1 (AR(K,K), AI(K,K))/CABS1 (EKR-ZR(K), EKI-ZI(K))
  80.         CALL WRSCAL (N, S, ZR, ZI, 1)
  81.         EKR = S*EKR
  82.         EKI = S*EKI
  83. 40      CONTINUE
  84.         WKR = EKR-ZR(K)
  85.         WKI = EKI-ZI(K)
  86.         WKMR = -EKR-ZR(K)
  87.         WKMI = -EKI-ZI(K)
  88.         S = CABS1 (WKR, WKI)
  89.         SM = CABS1 (WKMR, WKMI)
  90.         IF (CABS1 (AR(K,K), AI(K,K)).EQ.0.0D0) GO TO 50
  91.         CALL WDIV (WKR, WKI, AR(K,K), -AI(K,K), WKR, WKI)
  92.         CALL WDIV (WKMR, WKMI, AR(K,K), -AI(K,K), WKMR, WKMI)
  93.         GO TO 60
  94. C
  95. 50      CONTINUE
  96.         WKR = 1.0D0
  97.         WKI = 0.0D0
  98.         WKMR = 1.0D0
  99.         WKMI = 0.0D0
  100. 60      CONTINUE
  101.         KP1 = K+1
  102.         IF (KP1.GT.N) GO TO 100
  103.         DO 70 J = KP1, N
  104.           CALL WMUL (WKMR, WKMI, AR(K,J), -AI(K,J), TR, TI)
  105.           SM = FLOP (SM+CABS1 (ZR(J)+TR, ZI(J)+TI))
  106.           CALL WAXPY (1, WKR, WKI, AR(K,J), -AI(K,J),
  107.      .                1, ZR(J), ZI(J), 1)
  108.           S = FLOP (S+CABS1 (ZR(J), ZI(J)))
  109. 70      CONTINUE
  110.         IF (S.GE.SM) GO TO 90
  111.         TR = WKMR-WKR
  112.         TI = WKMI-WKI
  113.         WKR = WKMR
  114.         WKI = WKMI
  115.         DO 80 J = KP1, N
  116.           CALL WAXPY (1, TR, TI, AR(K,J), -AI(K,J), 1, ZR(J), ZI(J), 1)
  117. 80      CONTINUE
  118. 90      CONTINUE
  119. 100     CONTINUE
  120.         ZR(K) = WKR
  121.         ZI(K) = WKI
  122. 110   CONTINUE
  123.       S = 1.0D0/WASUM (N, ZR, ZI, 1)
  124.       CALL WRSCAL (N, S, ZR, ZI, 1)
  125. C
  126. C ***      SOLVE CTRANS(L)*Y = W
  127.       DO 140 KB = 1, N
  128.         K = N+1-KB
  129.         IF (K.GE.N) GO TO 120
  130.         ZR(K) = ZR(K)+WDOTCR (N-K, AR(K+1,K), AI(K+1,K),
  131.      .                        1, ZR(K+1), ZI(K+1), 1)
  132.         ZI(K) = ZI(K)+WDOTCI (N-K, AR(K+1,K), AI(K+1,K),
  133.      .                        1, ZR(K+1), ZI(K+1), 1)
  134. 120     CONTINUE
  135.         IF (CABS1 (ZR(K), ZI(K)).LE.1.0D0) GO TO 130
  136.         S = 1.0D0/CABS1 (ZR(K), ZI(K))
  137.         CALL WRSCAL (N, S, ZR, ZI, 1)
  138. 130     CONTINUE
  139.         L = IPVT(K)
  140.         TR = ZR(L)
  141.         TI = ZI(L)
  142.         ZR(L) = ZR(K)
  143.         ZI(L) = ZI(K)
  144.         ZR(K) = TR
  145.         ZI(K) = TI
  146. 140   CONTINUE
  147.       S = 1.0D0/WASUM (N, ZR, ZI, 1)
  148.       CALL WRSCAL (N, S, ZR, ZI, 1)
  149.       YNORM = 1.0D0
  150. C
  151. C ***      SOLVE L*V = Y
  152.       DO 160 K = 1, N
  153.         L = IPVT(K)
  154.         TR = ZR(L)
  155.         TI = ZI(L)
  156.         ZR(L) = ZR(K)
  157.         ZI(L) = ZI(K)
  158.         ZR(K) = TR
  159.         ZI(K) = TI
  160.         IF (K.LT.N) CALL WAXPY (N-K, TR, TI, AR(K+1,K), AI(K+1,K),
  161.      .                          1, ZR(K+1), ZI(K+1), 1)
  162.         IF (CABS1 (ZR(K), ZI(K)).LE.1.0D0) GO TO 150
  163.         S = 1.0D0/CABS1 (ZR(K), ZI(K))
  164.         CALL WRSCAL (N, S, ZR, ZI, 1)
  165.         YNORM = S*YNORM
  166. 150     CONTINUE
  167. 160   CONTINUE
  168.       S = 1.0D0/WASUM (N, ZR, ZI, 1)
  169.       CALL WRSCAL (N, S, ZR, ZI, 1)
  170.       YNORM = S*YNORM
  171. C
  172. C ***      SOLVE  U*Z = V
  173.       DO 200 KB = 1, N
  174.         K = N+1-KB
  175.         IF (CABS1 (ZR(K), ZI(K)).LE.CABS1 (AR(K,K), AI(K,K))) GO TO 170
  176.         S = CABS1 (AR(K,K), AI(K,K))/CABS1 (ZR(K), ZI(K))
  177.         CALL WRSCAL (N, S, ZR, ZI, 1)
  178.         YNORM = S*YNORM
  179. 170     CONTINUE
  180.         IF (CABS1 (AR(K,K), AI(K,K)).EQ.0.0D0) GO TO 180
  181.         CALL WDIV (ZR(K), ZI(K), AR(K,K), AI(K,K), ZR(K), ZI(K))
  182. 180     CONTINUE
  183.         IF (CABS1 (AR(K,K), AI(K,K)).NE.0.0D0) GO TO 190
  184.         ZR(K) = 1.0D0
  185.         ZI(K) = 0.0D0
  186. 190     CONTINUE
  187.         TR = -ZR(K)
  188.         TI = -ZI(K)
  189.         CALL WAXPY (K-1, TR, TI, AR(1,K), AI(1,K), 1, ZR(1), ZI(1), 1)
  190. 200   CONTINUE
  191. C
  192. C ***      MAKE ZNORM = 1.0
  193.       S = 1.0D0/WASUM (N, ZR, ZI, 1)
  194.       CALL WRSCAL (N, S, ZR, ZI, 1)
  195.       YNORM = S*YNORM
  196.       IF (ANORM.NE.0.0D0) RCOND = YNORM/ANORM
  197.       IF (ANORM.EQ.0.0D0) RCOND = 0.0D0
  198. C
  199.       RETURN
  200.       END
  201.