dbnslv Subroutine

private pure subroutine dbnslv(w, nroww, nrow, nbandl, nbandu, b)

Companion routine to dbnfac. it returns the solution x of the linear system a*x = b in place of b, given the lu-factorization for a in the work array w from dbnfac.

(with , as stored in w), the unit lower triangular system is solved for , and y stored in b. then the upper triangular system is solved for x. the calculations are so arranged that the innermost loops stay within columns.

History

  • banslv written by carl de boor [5]
  • dbnslv from SLATEC library [1]
  • Jacob Williams, 5/10/2015 : converted to free-form Fortran.

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(in), dimension(nroww,nrow) :: w

describes the lu-factorization of a banded matrix a of order nrow as constructed in dbnfac.

integer(kind=ip), intent(in) :: nroww

describes the lu-factorization of a banded matrix a of order nrow as constructed in dbnfac.

integer(kind=ip), intent(in) :: nrow

describes the lu-factorization of a banded matrix a of order nrow as constructed in dbnfac.

integer(kind=ip), intent(in) :: nbandl

describes the lu-factorization of a banded matrix a of order nrow as constructed in dbnfac.

integer(kind=ip), intent(in) :: nbandu

describes the lu-factorization of a banded matrix a of order nrow as constructed in dbnfac.

real(kind=wp), intent(inout), dimension(nrow) :: b
  • in: right side of the system to be solved
  • out: the solution x, of order nrow

Called by

proc~~dbnslv~~CalledByGraph proc~dbnslv dbnslv proc~dbintk dbintk proc~dbintk->proc~dbnslv proc~dbtpcf dbtpcf proc~dbtpcf->proc~dbnslv proc~dbtpcf->proc~dbintk proc~db1ink_default db1ink_default proc~db1ink_default->proc~dbtpcf proc~db2ink_default db2ink_default proc~db2ink_default->proc~dbtpcf proc~db3ink_default db3ink_default proc~db3ink_default->proc~dbtpcf proc~db4ink_default db4ink_default proc~db4ink_default->proc~dbtpcf proc~db5ink_default db5ink_default proc~db5ink_default->proc~dbtpcf proc~db6ink_default db6ink_default proc~db6ink_default->proc~dbtpcf interface~db1ink db1ink interface~db1ink->proc~db1ink_default proc~db1ink_multi db1ink_multi interface~db1ink->proc~db1ink_multi interface~db2ink db2ink interface~db2ink->proc~db2ink_default proc~db2ink_multi db2ink_multi interface~db2ink->proc~db2ink_multi interface~db3ink db3ink interface~db3ink->proc~db3ink_default proc~db3ink_multi db3ink_multi interface~db3ink->proc~db3ink_multi interface~db4ink db4ink interface~db4ink->proc~db4ink_default proc~db4ink_multi db4ink_multi interface~db4ink->proc~db4ink_multi interface~db5ink db5ink interface~db5ink->proc~db5ink_default proc~db5ink_multi db5ink_multi interface~db5ink->proc~db5ink_multi interface~db6ink db6ink interface~db6ink->proc~db6ink_default proc~db6ink_multi db6ink_multi interface~db6ink->proc~db6ink_multi proc~db1ink_multi->proc~db1ink_default proc~db2ink_multi->proc~db2ink_default proc~db3ink_multi->proc~db3ink_default proc~db4ink_multi->proc~db4ink_default proc~db5ink_multi->proc~db5ink_default proc~db6ink_multi->proc~db6ink_default proc~initialize_1d_auto_knots bspline_1d%initialize_1d_auto_knots proc~initialize_1d_auto_knots->interface~db1ink proc~initialize_1d_auto_knots_multi bspline_1d%initialize_1d_auto_knots_multi proc~initialize_1d_auto_knots_multi->interface~db1ink proc~initialize_1d_specify_knots bspline_1d%initialize_1d_specify_knots proc~initialize_1d_specify_knots->interface~db1ink proc~initialize_1d_specify_knots_multi bspline_1d%initialize_1d_specify_knots_multi proc~initialize_1d_specify_knots_multi->interface~db1ink proc~initialize_2d_auto_knots bspline_2d%initialize_2d_auto_knots proc~initialize_2d_auto_knots->interface~db2ink proc~initialize_2d_auto_knots_multi bspline_2d%initialize_2d_auto_knots_multi proc~initialize_2d_auto_knots_multi->interface~db2ink proc~initialize_2d_specify_knots bspline_2d%initialize_2d_specify_knots proc~initialize_2d_specify_knots->interface~db2ink proc~initialize_2d_specify_knots_multi bspline_2d%initialize_2d_specify_knots_multi proc~initialize_2d_specify_knots_multi->interface~db2ink proc~initialize_3d_auto_knots bspline_3d%initialize_3d_auto_knots proc~initialize_3d_auto_knots->interface~db3ink proc~initialize_3d_auto_knots_multi bspline_3d%initialize_3d_auto_knots_multi proc~initialize_3d_auto_knots_multi->interface~db3ink proc~initialize_3d_specify_knots bspline_3d%initialize_3d_specify_knots proc~initialize_3d_specify_knots->interface~db3ink proc~initialize_3d_specify_knots_multi bspline_3d%initialize_3d_specify_knots_multi proc~initialize_3d_specify_knots_multi->interface~db3ink proc~initialize_4d_auto_knots bspline_4d%initialize_4d_auto_knots proc~initialize_4d_auto_knots->interface~db4ink proc~initialize_4d_auto_knots_multi bspline_4d%initialize_4d_auto_knots_multi proc~initialize_4d_auto_knots_multi->interface~db4ink proc~initialize_4d_specify_knots bspline_4d%initialize_4d_specify_knots proc~initialize_4d_specify_knots->interface~db4ink proc~initialize_4d_specify_knots_multi bspline_4d%initialize_4d_specify_knots_multi proc~initialize_4d_specify_knots_multi->interface~db4ink proc~initialize_5d_auto_knots bspline_5d%initialize_5d_auto_knots proc~initialize_5d_auto_knots->interface~db5ink proc~initialize_5d_auto_knots_multi bspline_5d%initialize_5d_auto_knots_multi proc~initialize_5d_auto_knots_multi->interface~db5ink proc~initialize_5d_specify_knots bspline_5d%initialize_5d_specify_knots proc~initialize_5d_specify_knots->interface~db5ink proc~initialize_5d_specify_knots_multi bspline_5d%initialize_5d_specify_knots_multi proc~initialize_5d_specify_knots_multi->interface~db5ink proc~initialize_6d_auto_knots bspline_6d%initialize_6d_auto_knots proc~initialize_6d_auto_knots->interface~db6ink proc~initialize_6d_auto_knots_multi bspline_6d%initialize_6d_auto_knots_multi proc~initialize_6d_auto_knots_multi->interface~db6ink proc~initialize_6d_specify_knots bspline_6d%initialize_6d_specify_knots proc~initialize_6d_specify_knots->interface~db6ink proc~initialize_6d_specify_knots_multi bspline_6d%initialize_6d_specify_knots_multi proc~initialize_6d_specify_knots_multi->interface~db6ink proc~bspline_1d_constructor_auto_knots bspline_1d_constructor_auto_knots proc~bspline_1d_constructor_auto_knots->proc~initialize_1d_auto_knots proc~bspline_1d_constructor_specify_knots bspline_1d_constructor_specify_knots proc~bspline_1d_constructor_specify_knots->proc~initialize_1d_specify_knots proc~bspline_2d_constructor_auto_knots bspline_2d_constructor_auto_knots proc~bspline_2d_constructor_auto_knots->proc~initialize_2d_auto_knots proc~bspline_2d_constructor_specify_knots bspline_2d_constructor_specify_knots proc~bspline_2d_constructor_specify_knots->proc~initialize_2d_specify_knots proc~bspline_3d_constructor_auto_knots bspline_3d_constructor_auto_knots proc~bspline_3d_constructor_auto_knots->proc~initialize_3d_auto_knots proc~bspline_3d_constructor_specify_knots bspline_3d_constructor_specify_knots proc~bspline_3d_constructor_specify_knots->proc~initialize_3d_specify_knots proc~bspline_4d_constructor_auto_knots bspline_4d_constructor_auto_knots proc~bspline_4d_constructor_auto_knots->proc~initialize_4d_auto_knots proc~bspline_4d_constructor_specify_knots bspline_4d_constructor_specify_knots proc~bspline_4d_constructor_specify_knots->proc~initialize_4d_specify_knots proc~bspline_5d_constructor_auto_knots bspline_5d_constructor_auto_knots proc~bspline_5d_constructor_auto_knots->proc~initialize_5d_auto_knots proc~bspline_5d_constructor_specify_knots bspline_5d_constructor_specify_knots proc~bspline_5d_constructor_specify_knots->proc~initialize_5d_specify_knots proc~bspline_6d_constructor_auto_knots bspline_6d_constructor_auto_knots proc~bspline_6d_constructor_auto_knots->proc~initialize_6d_auto_knots proc~bspline_6d_constructor_specify_knots bspline_6d_constructor_specify_knots proc~bspline_6d_constructor_specify_knots->proc~initialize_6d_specify_knots interface~bspline_1d bspline_1d interface~bspline_1d->proc~bspline_1d_constructor_auto_knots interface~bspline_1d->proc~bspline_1d_constructor_specify_knots interface~bspline_2d bspline_2d interface~bspline_2d->proc~bspline_2d_constructor_auto_knots interface~bspline_2d->proc~bspline_2d_constructor_specify_knots interface~bspline_3d bspline_3d interface~bspline_3d->proc~bspline_3d_constructor_auto_knots interface~bspline_3d->proc~bspline_3d_constructor_specify_knots interface~bspline_4d bspline_4d interface~bspline_4d->proc~bspline_4d_constructor_auto_knots interface~bspline_4d->proc~bspline_4d_constructor_specify_knots interface~bspline_5d bspline_5d interface~bspline_5d->proc~bspline_5d_constructor_auto_knots interface~bspline_5d->proc~bspline_5d_constructor_specify_knots interface~bspline_6d bspline_6d interface~bspline_6d->proc~bspline_6d_constructor_auto_knots interface~bspline_6d->proc~bspline_6d_constructor_specify_knots

Source Code

    pure subroutine dbnslv(w,nroww,nrow,nbandl,nbandu,b)

    integer(ip),intent(in) :: nroww   !! describes the lu-factorization of a banded matrix a of order `nrow`
                                      !! as constructed in [[dbnfac]].
    integer(ip),intent(in) :: nrow    !! describes the lu-factorization of a banded matrix a of order `nrow`
                                      !! as constructed in [[dbnfac]].
    integer(ip),intent(in) :: nbandl  !! describes the lu-factorization of a banded matrix a of order `nrow`
                                      !! as constructed in [[dbnfac]].
    integer(ip),intent(in) :: nbandu  !! describes the lu-factorization of a banded matrix a of order `nrow`
                                      !! as constructed in [[dbnfac]].
    real(wp),dimension(nroww,nrow),intent(in) :: w !! describes the lu-factorization of a banded matrix a of
                                                   !! order `nrow` as constructed in [[dbnfac]].
    real(wp),dimension(nrow),intent(inout) :: b  !! * **in**: right side of the system to be solved
                                                 !! * **out**: the solution x, of order nrow

    integer(ip) :: i, j, jmax, middle, nrowm1

    middle = nbandu + 1_ip
    if (nrow/=1_ip) then

        nrowm1 = nrow - 1_ip
        if (nbandl/=0_ip) then

            ! forward pass
            ! for i=1,2,...,nrow-1, subtract right side(i)*(i-th column of l)
            !                       from right side (below i-th row).
            do i=1_ip,nrowm1
                jmax = min(nbandl,nrow-i)
                do j=1_ip,jmax
                    b(i+j) = b(i+j) - b(i)*w(middle+j,i)
                end do
            end do

        end if

        ! backward pass
        ! for i=nrow,nrow-1,...,1, divide right side(i) by i-th diagonal
        !                          entry of u, then subtract right side(i)*(i-th column
        !                          of u) from right side (above i-th row).
        if (nbandu<=0_ip) then
            ! a is lower triangular.
            do i=1_ip,nrow
                b(i) = b(i)/w(1_ip,i)
            end do
            return
        end if

        i = nrow
        do
            b(i) = b(i)/w(middle,i)
            jmax = min(nbandu,i-1_ip)
            do j=1_ip,jmax
                b(i-j) = b(i-j) - b(i)*w(middle-j,i)
            end do
            i = i - 1_ip
            if (i<=1_ip) exit
        end do

    end if

    b(1_ip) = b(1_ip)/w(middle,1_ip)

    end subroutine dbnslv