      subroutine bchslv ( w, nbands, nrow, b )
c  from  * a practical guide to splines *  by c. de boor    
c  solves the linear system     c*x = b   of order  n r o w  for  x
c  provided  w  contains the cholesky factorization for the banded (sym-
c  metric) positive definite matrix  c  as constructed in the subroutine
c    b c h f a c  (quo vide).
c
c******  i n p u t  ******
c  nrow.....is the order of the matrix  c .
c  nbands.....indicates the bandwidth of  c .
c  w.....contains the cholesky factorization for  c , as output from
c        subroutine bchfac  (quo vide).
c  b.....the vector of length  n r o w  containing the right side.
c
c******  o u t p u t  ******
c  b.....the vector of length  n r o w  containing the solution.
c
c******  m e t h o d  ******
c  with the factorization  c = l*d*l-transpose  available, where  l  is
c  unit lower triangular and  d  is diagonal, the triangular system
c  l*y = b  is solved for  y (forward substitution), y is stored in  b,
c  the vector  d**(-1)*y is computed and stored in  b, then the triang-
c  ular system  l-transpose*x = d**(-1)*y is solved for  x (backsubstit-
c  ution).
      integer nbands,nrow,   j,jmax,n,nbndm1
      real w(nbands,nrow),b(nrow)
      if (nrow .gt. 1)                  go to 21
      b(1) = b(1)*w(1,1)
                                        return
c
c                 forward substitution. solve l*y = b for y, store in b.
   21 nbndm1 = nbands - 1
      do 30 n=1,nrow
         jmax = min0(nbndm1,nrow-n)
         if (jmax .lt. 1)               go to 30
         do 25 j=1,jmax
   25       b(j+n) = b(j+n) - w(j+1,n)*b(n)
   30    continue
c
c     backsubstitution. solve l-transp.x = d**(-1)*y  for x, store in b.
      n = nrow    
   39    b(n) = b(n)*w(1,n)   
         jmax = min0(nbndm1,nrow-n)
         if (jmax .lt. 1)               go to 40
         do 35 j=1,jmax
   35       b(n) = b(n) - w(j+1,n)*b(j+n)
   40    n = n-1  
         if (n .gt. 0)                  go to 39
                                        return
      end
