|
|
1.1 ! root 1: SUBROUTINE WGEDI(AR,AI,LDA,N,IPVT,DETR,DETI,WORKR,WORKI,JOB) ! 2: INTEGER LDA,N,IPVT(1),JOB ! 3: DOUBLE PRECISION AR(LDA,1),AI(LDA,1),DETR(2),DETI(2),WORKR(1), ! 4: * WORKI(1) ! 5: C ! 6: C WGEDI COMPUTES THE DETERMINANT AND INVERSE OF A MATRIX ! 7: C USING THE FACTORS COMPUTED BY WGECO OR WGEFA. ! 8: C ! 9: C ON ENTRY ! 10: C ! 11: C A DOUBLE-COMPLEX(LDA, N) ! 12: C THE OUTPUT FROM WGECO OR WGEFA. ! 13: C ! 14: C LDA INTEGER ! 15: C THE LEADING DIMENSION OF THE ARRAY A . ! 16: C ! 17: C N INTEGER ! 18: C THE ORDER OF THE MATRIX A . ! 19: C ! 20: C IPVT INTEGER(N) ! 21: C THE PIVOT VECTOR FROM WGECO OR WGEFA. ! 22: C ! 23: C WORK DOUBLE-COMPLEX(N) ! 24: C WORK VECTOR. CONTENTS DESTROYED. ! 25: C ! 26: C JOB INTEGER ! 27: C = 11 BOTH DETERMINANT AND INVERSE. ! 28: C = 01 INVERSE ONLY. ! 29: C = 10 DETERMINANT ONLY. ! 30: C ! 31: C ON RETURN ! 32: C ! 33: C A INVERSE OF ORIGINAL MATRIX IF REQUESTED. ! 34: C OTHERWISE UNCHANGED. ! 35: C ! 36: C DET DOUBLE-COMPLEX(2) ! 37: C DETERMINANT OF ORIGINAL MATRIX IF REQUESTED. ! 38: C OTHERWISE NOT REFERENCED. ! 39: C DETERMINANT = DET(1) * 10.0**DET(2) ! 40: C WITH 1.0 .LE. CABS1(DET(1) .LT. 10.0 ! 41: C OR DET(1) .EQ. 0.0 . ! 42: C ! 43: C ERROR CONDITION ! 44: C ! 45: C A DIVISION BY ZERO WILL OCCUR IF THE INPUT FACTOR CONTAINS ! 46: C A ZERO ON THE DIAGONAL AND THE INVERSE IS REQUESTED. ! 47: C IT WILL NOT OCCUR IF THE SUBROUTINES ARE CALLED CORRECTLY ! 48: C AND IF WGECO HAS SET RCOND .GT. 0.0 OR WGEFA HAS SET ! 49: C INFO .EQ. 0 . ! 50: C ! 51: C LINPACK. THIS VERSION DATED 07/01/79 . ! 52: C CLEVE MOLER, UNIVERSITY OF NEW MEXICO, ARGONNE NATIONAL LAB. ! 53: C ! 54: C SUBROUTINES AND FUNCTIONS ! 55: C ! 56: C BLAS WAXPY,WSCAL,WSWAP ! 57: C FORTRAN DABS,MOD ! 58: C ! 59: C INTERNAL VARIABLES ! 60: C ! 61: DOUBLE PRECISION TR,TI ! 62: DOUBLE PRECISION TEN ! 63: INTEGER I,J,K,KB,KP1,L,NM1 ! 64: C ! 65: DOUBLE PRECISION ZDUMR,ZDUMI ! 66: DOUBLE PRECISION CABS1 ! 67: CABS1(ZDUMR,ZDUMI) = DABS(ZDUMR) + DABS(ZDUMI) ! 68: C ! 69: C COMPUTE DETERMINANT ! 70: C ! 71: IF (JOB/10 .EQ. 0) GO TO 80 ! 72: DETR(1) = 1.0D0 ! 73: DETI(1) = 0.0D0 ! 74: DETR(2) = 0.0D0 ! 75: DETI(2) = 0.0D0 ! 76: TEN = 10.0D0 ! 77: DO 60 I = 1, N ! 78: IF (IPVT(I) .EQ. I) GO TO 10 ! 79: DETR(1) = -DETR(1) ! 80: DETI(1) = -DETI(1) ! 81: 10 CONTINUE ! 82: CALL WMUL(AR(I,I),AI(I,I),DETR(1),DETI(1),DETR(1),DETI(1)) ! 83: C ...EXIT ! 84: C ...EXIT ! 85: IF (CABS1(DETR(1),DETI(1)) .EQ. 0.0D0) GO TO 70 ! 86: 20 IF (CABS1(DETR(1),DETI(1)) .GE. 1.0D0) GO TO 30 ! 87: DETR(1) = TEN*DETR(1) ! 88: DETI(1) = TEN*DETI(1) ! 89: DETR(2) = DETR(2) - 1.0D0 ! 90: DETI(2) = DETI(2) - 0.0D0 ! 91: GO TO 20 ! 92: 30 CONTINUE ! 93: 40 IF (CABS1(DETR(1),DETI(1)) .LT. TEN) GO TO 50 ! 94: DETR(1) = DETR(1)/TEN ! 95: DETI(1) = DETI(1)/TEN ! 96: DETR(2) = DETR(2) + 1.0D0 ! 97: DETI(2) = DETI(2) + 0.0D0 ! 98: GO TO 40 ! 99: 50 CONTINUE ! 100: 60 CONTINUE ! 101: 70 CONTINUE ! 102: 80 CONTINUE ! 103: C ! 104: C COMPUTE INVERSE(U) ! 105: C ! 106: IF (MOD(JOB,10) .EQ. 0) GO TO 160 ! 107: DO 110 K = 1, N ! 108: CALL WDIV(1.0D0,0.0D0,AR(K,K),AI(K,K),AR(K,K),AI(K,K)) ! 109: TR = -AR(K,K) ! 110: TI = -AI(K,K) ! 111: CALL WSCAL(K-1,TR,TI,AR(1,K),AI(1,K),1) ! 112: KP1 = K + 1 ! 113: IF (N .LT. KP1) GO TO 100 ! 114: DO 90 J = KP1, N ! 115: TR = AR(K,J) ! 116: TI = AI(K,J) ! 117: AR(K,J) = 0.0D0 ! 118: AI(K,J) = 0.0D0 ! 119: CALL WAXPY(K,TR,TI,AR(1,K),AI(1,K),1,AR(1,J),AI(1,J),1) ! 120: 90 CONTINUE ! 121: 100 CONTINUE ! 122: 110 CONTINUE ! 123: C ! 124: C FORM INVERSE(U)*INVERSE(L) ! 125: C ! 126: NM1 = N - 1 ! 127: IF (NM1 .LT. 1) GO TO 150 ! 128: DO 140 KB = 1, NM1 ! 129: K = N - KB ! 130: KP1 = K + 1 ! 131: DO 120 I = KP1, N ! 132: WORKR(I) = AR(I,K) ! 133: WORKI(I) = AI(I,K) ! 134: AR(I,K) = 0.0D0 ! 135: AI(I,K) = 0.0D0 ! 136: 120 CONTINUE ! 137: DO 130 J = KP1, N ! 138: TR = WORKR(J) ! 139: TI = WORKI(J) ! 140: CALL WAXPY(N,TR,TI,AR(1,J),AI(1,J),1,AR(1,K),AI(1,K),1) ! 141: 130 CONTINUE ! 142: L = IPVT(K) ! 143: IF (L .NE. K) ! 144: * CALL WSWAP(N,AR(1,K),AI(1,K),1,AR(1,L),AI(1,L),1) ! 145: 140 CONTINUE ! 146: 150 CONTINUE ! 147: 160 CONTINUE ! 148: RETURN ! 149: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.