Subroutine LUDCMP(A,N,INDX,D,CODE)
integer, parameter :: NMAX=10
double precision, parameter :: TINY=1.5D-16
double precision :: AMAX,DUM, SUM, A(N,N),VV(NMAX)
INTEGER :: CODE, D, INDX(N)
integer :: N
! .. local ..
integer :: I, J, K, IMAX
D=1; CODE=0
DO I=1,N
AMAX=0.d0
DO J=1,N
IF (DABS(A(I,J)).GT.AMAX) AMAX=DABS(A(I,J))
END DO ! j loop
IF(AMAX.LT.TINY) THEN
CODE = 1
RETURN
END IF
VV(I) = 1.d0 / AMAX
END DO ! i loop
DO J=1,N
DO I=1,J-1
SUM = A(I,J)
DO K=1,I-1
SUM = SUM - A(I,K)*A(K,J)
END DO ! k loop
A(I,J) = SUM
END DO ! i loop
AMAX = 0.d0
DO I=J,N
SUM = A(I,J)
DO K=1,J-1
SUM = SUM - A(I,K)*A(K,J)
END DO ! k loop
A(I,J) = SUM
DUM = VV(I)*DABS(SUM)
IF(DUM.GE.AMAX) THEN
IMAX = I
AMAX = DUM
END IF
END DO ! i loop
IF(J.NE.IMAX) THEN
DO K=1,N
DUM = A(IMAX,K)
A(IMAX,K) = A(J,K)
A(J,K) = DUM
END DO ! k loop
D = -D
VV(IMAX) = VV(J)
END IF
INDX(J) = IMAX
IF(DABS(A(J,J)) < TINY) A(J,J) = TINY
IF(J.NE.N) THEN
DUM = 1.d0 / A(J,J)
DO I=J+1,N
A(I,J) = A(I,J)*DUM
END DO ! i loop
END IF
END DO ! j loop
RETURN
END subroutine LUDCMP