lu6Lt Subroutine

private subroutine lu6Lt(inform, m, n, v, lena, luparm, parmlu, a, indc, indr, lenc)

Arguments

Type IntentOptional Attributes Name
integer(kind=ip), intent(out) :: inform
integer(kind=ip), intent(in) :: m
integer(kind=ip), intent(in) :: n
real(kind=rp), intent(inout) :: v(m)
integer(kind=ip), intent(in) :: lena
integer(kind=ip), intent(inout) :: luparm(30)
real(kind=rp), intent(inout) :: parmlu(30)
real(kind=rp), intent(in) :: a(lena)
integer(kind=ip), intent(in) :: indc(lena)
integer(kind=ip), intent(in) :: indr(lena)
integer(kind=ip), intent(in) :: lenc(n)

Called by

proc~~lu6lt~~CalledByGraph proc~lu6lt lusol::lu6Lt proc~lu6sol lusol::lu6sol proc~lu6sol->proc~lu6lt proc~lu8rpc lusol::lu8rpc proc~lu8rpc->proc~lu6sol proc~solve lusol_ez_module::solve proc~solve->proc~lu6sol proc~test_1 main::test_1 proc~test_1->proc~solve proc~test_2 main::test_2 proc~test_2->proc~solve program~main~2 main program~main~2->proc~test_1 program~main~2->proc~test_2

Source Code

  subroutine lu6Lt ( inform, m, n, v, &
                     lena, luparm, parmlu, a, indc, indr, lenc )

    integer(ip),   intent(in)    :: m, n, lena
    integer(ip),   intent(in)    :: indc(lena), indr(lena), lenc(n)
    real(rp),      intent(in)    :: a(lena)
    integer(ip),   intent(inout) :: luparm(30)
    real(rp),      intent(inout) :: parmlu(30), v(m)
    integer(ip),   intent(out)   :: inform

    !------------------------------------------------------------------
    ! lu6Lt  solves   L'v = v(input).
    !
    ! 15 Dec 2002: First version derived from lu6sol.
    ! 15 Dec 2002: Current version.
    ! 13 Dec 2011: First f90 version.
    !------------------------------------------------------------------

    integer(ip) :: i, ipiv, j, k, l, l1, l2, len, lenL, lenL0, numL0
    real(rp)    :: small, sum


    numL0  = luparm(20)
    lenL0  = luparm(21)
    lenL   = luparm(23)
    small  = parmlu(3)
    inform = 0
    l1     = lena - lenL + 1
    l2     = lena - lenL0

    !***** This loop could be coded specially.
    do l = l1, l2
       j     = indc(l)
       if (abs(v(j)) > small) then
          i     = indr(l)
          v(i)  = v(i) + a(l)*v(j)
       end if
    end do

    do k = numL0, 1, -1
       len   = lenc(k)
       sum   = zero
       l1    = l2 + 1
       l2    = l2 + len

       !***** This loop could be coded specially.
       do l = l1, l2
          j     = indc(l)
          sum   = sum + a(l)*v(j)
       end do

       ipiv    = indr(l1)
       v(ipiv) = v(ipiv) + sum
    end do

    ! Exit.

    luparm(10) = inform

  end subroutine lu6Lt