! Descompunerea Cholesky: A=L*LT
! Matricea A = simetrica + pozitiv definita
! Elementele lui L se determina pe coloane.
! Matricea L in locatiile matricii A (stocare compacta)
!
subroutine cholesky(n, a, kod)

real(4) a(n*(n+1)/2)
real(4) ljj, lij
integer width


kod =0

! Calculeza pentru j=1: l(1,1) and l(i,1):
a(1) =sqrt(a(1))
do i =2,n
ii =loca(i,1)
a(ii) = a(ii)/a(1)
enddo


Col_DO: do j =2,n
ljj =0.
	do k =1,j-1
	jk =loca(j,k)
	ljj =ljj +a(jk)**2
	enddo
jj =loca(j,j)
ljj= a(jj) -ljj

	! Test pozitiv definita:
	if(ljj <=0) then
	iwj =width(j)
	print '(/, a)', ' * Matricea nu este pozitiv definita:'
	print '(a, I<iwj>, a, I<iwj>, a, I<iwj>, a, 1pg15.7)', ' Linia ', j, ': l(', j, ',', j, ')^2 =', ljj

	write(1, '(/, a)') ' * Matricea nu este pozitiv definita:'
	write(1, '(a, I<iwj>, a, I<iwj>, a, I<iwj>, a, 1pg15.7)') ' Linia ', j, ': l(', j, ',', j, ')^2 =', ljj

	kod =-1
	RETURN
	endif

ljj = sqrt(ljj)
a(jj) =ljj

Line_do: do i =j+1, n
lij =0
	do k= 1,j-1
	ik =loca(i,k)
	jk =loca(j,k)
	lij = lij +a(ik)*a(jk)
	end do
ij =loca(i,j)
!jj =loca(j,j)
lij =(a(ij) -lij)/ljj
a(ij) =lij
enddo Line_do

ENDDO Col_DO

END subroutine cholesky
