home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Geek Gadgets 1
/
ADE-1.bin
/
ade-dist
/
octave-1.1.1p1-src.tgz
/
tar.out
/
fsf
/
octave
/
libcruft
/
linpack
/
dgbsl.f
< prev
next >
Wrap
Text File
|
1996-09-28
|
4KB
|
136 lines
SUBROUTINE DGBSL(ABD,LDA,N,ML,MU,IPVT,B,JOB)
INTEGER LDA,N,ML,MU,IPVT(1),JOB
DOUBLE PRECISION ABD(LDA,1),B(1)
C
C DGBSL SOLVES THE DOUBLE PRECISION BAND SYSTEM
C A * X = B OR TRANS(A) * X = B
C USING THE FACTORS COMPUTED BY DGBCO OR DGBFA.
C
C ON ENTRY
C
C ABD DOUBLE PRECISION(LDA, N)
C THE OUTPUT FROM DGBCO OR DGBFA.
C
C LDA INTEGER
C THE LEADING DIMENSION OF THE ARRAY ABD .
C
C N INTEGER
C THE ORDER OF THE ORIGINAL MATRIX.
C
C ML INTEGER
C NUMBER OF DIAGONALS BELOW THE MAIN DIAGONAL.
C
C MU INTEGER
C NUMBER OF DIAGONALS ABOVE THE MAIN DIAGONAL.
C
C IPVT INTEGER(N)
C THE PIVOT VECTOR FROM DGBCO OR DGBFA.
C
C B DOUBLE PRECISION(N)
C THE RIGHT HAND SIDE VECTOR.
C
C JOB INTEGER
C = 0 TO SOLVE A*X = B ,
C = NONZERO TO SOLVE TRANS(A)*X = B , WHERE
C TRANS(A) IS THE TRANSPOSE.
C
C ON RETURN
C
C B THE SOLUTION VECTOR X .
C
C ERROR CONDITION
C
C A DIVISION BY ZERO WILL OCCUR IF THE INPUT FACTOR CONTAINS A
C ZERO ON THE DIAGONAL. TECHNICALLY THIS INDICATES SINGULARITY
C BUT IT IS OFTEN CAUSED BY IMPROPER ARGUMENTS OR IMPROPER
C SETTING OF LDA . IT WILL NOT OCCUR IF THE SUBROUTINES ARE
C CALLED CORRECTLY AND IF DGBCO HAS SET RCOND .GT. 0.0
C OR DGBFA HAS SET INFO .EQ. 0 .
C
C TO COMPUTE INVERSE(A) * C WHERE C IS A MATRIX
C WITH P COLUMNS
C CALL DGBCO(ABD,LDA,N,ML,MU,IPVT,RCOND,Z)
C IF (RCOND IS TOO SMALL) GO TO ...
C DO 10 J = 1, P
C CALL DGBSL(ABD,LDA,N,ML,MU,IPVT,C(1,J),0)
C 10 CONTINUE
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 DAXPY,DDOT
C FORTRAN MIN0
C
C INTERNAL VARIABLES
C
DOUBLE PRECISION DDOT,T
INTEGER K,KB,L,LA,LB,LM,M,NM1
C
M = MU + ML + 1
NM1 = N - 1
IF (JOB .NE. 0) GO TO 50
C
C JOB = 0 , SOLVE A * X = B
C FIRST SOLVE L*Y = B
C
IF (ML .EQ. 0) GO TO 30
IF (NM1 .LT. 1) GO TO 30
DO 20 K = 1, NM1
LM = MIN0(ML,N-K)
L = IPVT(K)
T = B(L)
IF (L .EQ. K) GO TO 10
B(L) = B(K)
B(K) = T
10 CONTINUE
CALL DAXPY(LM,T,ABD(M+1,K),1,B(K+1),1)
20 CONTINUE
30 CONTINUE
C
C NOW SOLVE U*X = Y
C
DO 40 KB = 1, N
K = N + 1 - KB
B(K) = B(K)/ABD(M,K)
LM = MIN0(K,M) - 1
LA = M - LM
LB = K - LM
T = -B(K)
CALL DAXPY(LM,T,ABD(LA,K),1,B(LB),1)
40 CONTINUE
GO TO 100
50 CONTINUE
C
C JOB = NONZERO, SOLVE TRANS(A) * X = B
C FIRST SOLVE TRANS(U)*Y = B
C
DO 60 K = 1, N
LM = MIN0(K,M) - 1
LA = M - LM
LB = K - LM
T = DDOT(LM,ABD(LA,K),1,B(LB),1)
B(K) = (B(K) - T)/ABD(M,K)
60 CONTINUE
C
C NOW SOLVE TRANS(L)*X = Y
C
IF (ML .EQ. 0) GO TO 90
IF (NM1 .LT. 1) GO TO 90
DO 80 KB = 1, NM1
K = N - KB
LM = MIN0(ML,N-K)
B(K) = B(K) + DDOT(LM,ABD(M+1,K),1,B(K+1),1)
L = IPVT(K)
IF (L .EQ. K) GO TO 70
T = B(L)
B(L) = B(K)
B(K) = T
70 CONTINUE
80 CONTINUE
90 CONTINUE
100 CONTINUE
RETURN
END