subroutine lupiv(a, ip, det)
implicit none
real(8), intent (inout) :: a(:,:)
integer, intent (out) :: ip(:)
real(8), intent (out) :: det
real(8) :: piv
integer :: i, j, k, n, ipiv, ipi, ipk, index
n = size(ip)
det = 1d0
ip = (/(i, i=1, n)/)
index = 0
do k = 1, n-1
piv = a(ip(k), k)
ipiv = k
do i = k+1, n
if(dabs(piv) < dabs(a(ip(i), k)))then
piv = a(ip(i), k)
ipiv = i
end if
end do
if(abs(piv) < 1d-12) then
print*, "Pivote nulo en la etapa: ", k
print*, "¡La matriz del sistema es Singular!"
stop
end if
if(ipiv /= k) then
ipk = ip(ipiv)
ip(ipiv) = ip(k)
ip(k) = ipk
index = index + 1
else
ipk = ip(k)
end if
det = det*piv
do i = k+1, n
ipi = ip(i)
a(ipi, k) = a(ipi, k)/piv
do j = k+1,n
a(ipi, j) = a(ipi, j)-a(ipi, k)*a(ipk, j)
end do
end do
end do
piv = a(ip(n), n)
if(dabs(piv) < 1d-12) then
print*, "Pivote nulo en la etapa: ", n
print*, "¡La matriz del sistema es Singular!"
stop
end if
det = det*piv*(-1)**index
print*, "Determinante: ", det
return
end subroutine lupiv