subroutine nnsc(N,R,C,Il,Jl,Ijl,L,D,Iu,Ju,Iju,U,Z,B,Tmp)
!
! real l(*), d(*), u(*), b(*), z(*), tmp(*), tmpk, sum
integer , intent(in) :: N
integer , intent(in) , dimension(*) :: R
integer , intent(in) , dimension(*) :: C
integer , intent(in) , dimension(*) :: Il
integer , intent(in) , dimension(*) :: Jl
integer , intent(in) , dimension(*) :: Ijl
real(kind=dp) , intent(in) , dimension(*) :: L
real(kind=dp) , intent(in) , dimension(*) :: D
integer , intent(in) , dimension(*) :: Iu
integer , intent(in) , dimension(*) :: Ju
integer , intent(in) , dimension(*) :: Iju
real(kind=dp) , intent(in) , dimension(*) :: U
real(kind=dp) , intent(out) , dimension(*) :: Z
real(kind=dp) , intent(in) , dimension(*) :: B
real(kind=dp) , intent(inout) , dimension(*) :: Tmp
!
integer :: i , j , jmax , jmin , k , ml , mu
real(kind=dp) :: sum , tmpk
!
! ****** set tmp to reordered b *************************************
do k = 1 , N
Tmp(k) = B(R(k))
enddo
! ****** solve ly = b by forward substitution *********************
do k = 1 , N
jmin = Il(k)
jmax = Il(k+1) - 1
tmpk = -D(k)*Tmp(k)
Tmp(k) = -tmpk
if ( jmin<=jmax ) then
ml = Ijl(k) - jmin
do j = jmin , jmax
Tmp(Jl(ml+j)) = Tmp(Jl(ml+j)) + tmpk*L(j)
enddo
endif
enddo
! ****** solve ux = y by back substitution ************************
k = N
do i = 1 , N
sum = -Tmp(k)
jmin = Iu(k)
jmax = Iu(k+1) - 1
if ( jmin<=jmax ) then
mu = Iju(k) - jmin
do j = jmin , jmax
sum = sum + U(j)*Tmp(Ju(mu+j))
enddo
endif
Tmp(k) = -sum
Z(C(k)) = -sum
k = k - 1
enddo
end subroutine nnsc