home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 September
/
Simtel20_Sept92.cdr
/
msdos
/
fortran
/
linpklib.arc
/
SPTSL.FOR
< prev
next >
Wrap
Text File
|
1984-01-06
|
3KB
|
92 lines
SUBROUTINE SPTSL(N,D,E,B)
INTEGER N
REAL D(1),E(1),B(1)
C
C SPTSL GIVEN A POSITIVE DEFINITE TRIDIAGONAL MATRIX AND A RIGHT
C HAND SIDE WILL FIND THE SOLUTION.
C
C ON ENTRY
C
C N INTEGER
C IS THE ORDER OF THE TRIDIAGONAL MATRIX.
C
C D REAL(N)
C IS THE DIAGONAL OF THE TRIDIAGONAL MATRIX.
C ON OUTPUT D IS DESTROYED.
C
C E REAL(N)
C IS THE OFFDIAGONAL OF THE TRIDIAGONAL MATRIX.
C E(1) THROUGH E(N-1) SHOULD CONTAIN THE
C OFFDIAGONAL.
C
C B REAL(N)
C IS THE RIGHT HAND SIDE VECTOR.
C
C ON RETURN
C
C B CONTAINS THE SOULTION.
C
C LINPACK. THIS VERSION DATED 08/14/78 .
C JACK DONGARRA, ARGONNE NATIONAL LABORATORY.
C
C NO EXTERNALS
C FORTRAN MOD
C
C INTERNAL VARIABLES
C
INTEGER K,KBM1,KE,KF,KP1,NM1,NM1D2
REAL T1,T2
C
C CHECK FOR 1 X 1 CASE
C
IF (N .NE. 1) GO TO 10
B(1) = B(1)/D(1)
GO TO 70
10 CONTINUE
NM1 = N - 1
NM1D2 = NM1/2
IF (N .EQ. 2) GO TO 30
KBM1 = N - 1
C
C ZERO TOP HALF OF SUBDIAGONAL AND BOTTOM HALF OF
C SUPERDIAGONAL
C
DO 20 K = 1, NM1D2
T1 = E(K)/D(K)
D(K+1) = D(K+1) - T1*E(K)
B(K+1) = B(K+1) - T1*B(K)
T2 = E(KBM1)/D(KBM1+1)
D(KBM1) = D(KBM1) - T2*E(KBM1)
B(KBM1) = B(KBM1) - T2*B(KBM1+1)
KBM1 = KBM1 - 1
20 CONTINUE
30 CONTINUE
KP1 = NM1D2 + 1
C
C CLEAN UP FOR POSSIBLE 2 X 2 BLOCK AT CENTER
C
IF (MOD(N,2) .NE. 0) GO TO 40
T1 = E(KP1)/D(KP1)
D(KP1+1) = D(KP1+1) - T1*E(KP1)
B(KP1+1) = B(KP1+1) - T1*B(KP1)
KP1 = KP1 + 1
40 CONTINUE
C
C BACK SOLVE STARTING AT THE CENTER, GOING TOWARDS THE TOP
C AND BOTTOM
C
B(KP1) = B(KP1)/D(KP1)
IF (N .EQ. 2) GO TO 60
K = KP1 - 1
KE = KP1 + NM1D2 - 1
DO 50 KF = KP1, KE
B(K) = (B(K) - E(K)*B(K+1))/D(K)
B(KF+1) = (B(KF+1) - E(KF)*B(KF))/D(KF+1)
K = K - 1
50 CONTINUE
60 CONTINUE
IF (MOD(N,2) .EQ. 0) B(1) = (B(1) - E(1)*B(2))/D(1)
70 CONTINUE
RETURN
END