You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.8 KiB
67 lines
1.8 KiB
subroutine ludcmp(ain,n,indx,d,a)
|
|
c--- Adapted from Numerical Recipes
|
|
c--- extended so that original matrix a is not destroyed
|
|
implicit none
|
|
include 'lib/TensorReduction/Include/types.f'
|
|
integer n,indx(n)
|
|
real(dp):: d,a(n,n),ain(n,n),TINY
|
|
parameter (tiny=1d-20)
|
|
integer i,imax,j,k
|
|
real(dp):: aamax,dum,sum,vv(n)
|
|
a=ain
|
|
d=1d0
|
|
do i=1,n
|
|
aamax=0d0
|
|
do j=1,n
|
|
if (abs(a(i,j)).gt.aamax) aamax=abs(a(i,j))
|
|
enddo ! 11
|
|
if (aamax.eq.0d0) stop 'singular matrix.'
|
|
vv(i)=1d0/aamax
|
|
enddo ! 12
|
|
do j=1,n
|
|
if (j.gt.1) then
|
|
do i=1,j-1
|
|
sum=a(i,j)
|
|
if (i.gt.1)then
|
|
do k=1,i-1
|
|
sum=sum-a(i,k)*a(k,j)
|
|
enddo ! 13
|
|
a(i,j)=sum
|
|
endif
|
|
enddo ! 14
|
|
endif
|
|
aamax=0d0
|
|
do i=j,n
|
|
sum=a(i,j)
|
|
if (j.gt.1)then
|
|
do k=1,j-1
|
|
sum=sum-a(i,k)*a(k,j)
|
|
enddo ! 15
|
|
a(i,j)=sum
|
|
endif
|
|
dum=vv(i)*abs(sum)
|
|
if (dum.ge.aamax) then
|
|
imax=i
|
|
aamax=dum
|
|
endif
|
|
enddo ! 16
|
|
if (j.ne.imax)then
|
|
do k=1,n
|
|
dum=a(imax,k)
|
|
a(imax,k)=a(j,k)
|
|
a(j,k)=dum
|
|
enddo ! 17
|
|
d=-d
|
|
vv(imax)=vv(j)
|
|
endif
|
|
indx(j)=imax
|
|
if(a(j,j).eq.0d0) a(j,j)=tiny
|
|
if(j.ne.n)then
|
|
dum=1d0/a(j,j)
|
|
do i=j+1,n
|
|
a(i,j)=a(i,j)*dum
|
|
enddo ! 18
|
|
endif
|
|
enddo ! 19
|
|
return
|
|
end
|