+++ /dev/null
- subroutine dpbsl(abd,lda,n,m,b)
-
- integer lda,n,m
- double precision abd(lda,n),b(n)
-c
-c dpbsl solves the double precision symmetric positive definite
-c band system a*x = b
-c using the factors computed by dpbco or dpbfa.
-c
-c on entry
-c
-c abd double precision(lda, n)
-c the output from dpbco or dpbfa.
-c
-c lda integer
-c the leading dimension of the array abd .
-c
-c n integer
-c the order of the matrix a .
-c
-c m integer
-c the number of diagonals above the main diagonal.
-c
-c b double precision(n)
-c the right hand side vector.
-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
-c a zero on the diagonal. technically this indicates
-c singularity but it is usually caused by improper subroutine
-c arguments. it will not occur if the subroutines are called
-c correctly and info .eq. 0 .
-c
-c to compute inverse(a) * c where c is a matrix
-c with p columns
-c call dpbco(abd,lda,n,rcond,z,info)
-c if (rcond is too small .or. info .ne. 0) go to ...
-c do 10 j = 1, p
-c call dpbsl(abd,lda,n,c(1,j))
-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,la,lb,lm
-c
-c solve trans(r)*y = b
-c
- do 10 k = 1, n
- lm = min0(k-1,m)
- la = m + 1 - lm
- lb = k - lm
- t = ddot(lm,abd(la,k),1,b(lb),1)
- b(k) = (b(k) - t)/abd(m+1,k)
- 10 continue
-c
-c solve r*x = y
-c
- do 20 kb = 1, n
- k = n + 1 - kb
- lm = min0(k-1,m)
- la = m + 1 - lm
- lb = k - lm
- b(k) = b(k)/abd(m+1,k)
- t = -b(k)
- call daxpy(lm,t,abd(la,k),1,b(lb),1)
- 20 continue
- return
- end
-