lu6L Subroutine

private subroutine lu6L(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~~lu6l~~CalledByGraph proc~lu6l lusol::lu6L proc~lu6sol lusol::lu6sol proc~lu6sol->proc~lu6l 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 lu6L  ( 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

    !------------------------------------------------------------------
    ! lu6L   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, ldummy, len, lenL, lenL0, numL, numL0
    real(rp)    :: small, vpiv

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

    do k = 1, numL0
       len   = lenc(k)
       l     = l1
       l1    = l1 - len
       ipiv  = indr(l1)
       vpiv  = v(ipiv)

       if (abs(vpiv) > small) then
          !***** This loop could be coded specially.
          do ldummy = 1, len
             l    = l - 1
             j    = indc(l)
             v(j) = v(j) + a(l)*vpiv
          end do
       end if
    end do

    l      = lena - lenL0 + 1
    numL   = lenL - lenL0

    !***** This loop could be coded specially.

    do ldummy = 1, numL
       l      = l - 1
       i      = indr(l)
       if (abs(v(i)) > small) then
          j    = indc(l)
          v(j) = v(j) + a(l)*v(i)
       end if
    end do

    ! Exit.

    luparm(10) = inform

  end subroutine lu6L