blob: 3c22a86094bd3ddb31493f63f09115d0106124fd [file] [log] [blame]
subroutine dpbfa(abd,lda,n,m,info)
integer lda,n,m,info
double precision abd(lda,n)
c
c dpbfa factors a double precision symmetric positive definite
c matrix stored in band form.
c
c dpbfa is usually called by dpbco, but it can be called
c directly with a saving in time if rcond is not needed.
c
c on entry
c
c abd double precision(lda, n)
c the matrix to be factored. the columns of the upper
c triangle are stored in the columns of abd and the
c diagonals of the upper triangle are stored in the
c rows of abd . see the comments below for details.
c
c lda integer
c the leading dimension of the array abd .
c lda must be .ge. m + 1 .
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 0 .le. m .lt. n .
c
c on return
c
c abd an upper triangular matrix r , stored in band
c form, so that a = trans(r)*r .
c
c info integer
c = 0 for normal return.
c = k if the leading minor of order k is not
c positive definite.
c
c band storage
c
c if a is a symmetric positive definite band matrix,
c the following program segment will set up the input.
c
c m = (band width above diagonal)
c do 20 j = 1, n
c i1 = max0(1, j-m)
c do 10 i = i1, j
c k = i-j+m+1
c abd(k,j) = a(i,j)
c 10 continue
c 20 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 ddot
c fortran max0,sqrt
c
c internal variables
c
double precision ddot,t
double precision s
integer ik,j,jk,k,mu
c begin block with ...exits to 40
c
c
do 30 j = 1, n
info = j
s = 0.0d0
ik = m + 1
jk = max0(j-m,1)
mu = max0(m+2-j,1)
if (m .lt. mu) go to 20
do 10 k = mu, m
t = abd(k,j) - ddot(k-mu,abd(ik,jk),1,abd(mu,j),1)
t = t/abd(m+1,jk)
abd(k,j) = t
s = s + t*t
ik = ik - 1
jk = jk + 1
10 continue
20 continue
s = abd(m+1,j) - s
c ......exit
if (s .le. 0.0d0) go to 40
abd(m+1,j) = sqrt(s)
30 continue
info = 0
40 continue
return
end