Subroutine LUdecomp_C(A, n, order, do_pvt, kodPivot, kod)

! Calculeaza descompunerea LU a matricii A - descompunerea Crout. 
! U are 1 pe diagonala (CROUT). 
! Stocate compacta: L, U in A. 
! Pivotare partiala - prin apel APVT
! Ordinea liniilor e stocata in vectorul ORDER.
! ORDER se utilizeaza pentru ordonarea m.II - la rezolvare (LUsolve)
! Parametri:
! A = matricea sistemului
! n = numarul de ecuatii
! ndim = prima dimensiune a matricii A
! Order = vector intreg
! kod = cod de test pivot: kod =0: o.k.; kod <0: pivot <prag
! Indici: i* =linie; j*, k* =coloana
! Produsele in dubla precizie

real A(n,n)
integer order(n)
real prag /1E-6/	! prag pentru Pivot
real(8) dsum
integer width

common no_interchange, kodPrint
logical do_pvt

kod =0

! Initializeaza ORDER:
do i =1, n
order(i) =i
end do

!no_interchange =0 - in Main

! Pivoteaza pentru col. 1:
Pvt1_If: if(do_pvt) then
call APVT_C(A, n, order, 1, kodPivot, prag)
endif Pvt1_If

	if(kodPrint >=2) then
	if(do_pvt) then
	iwn =width(n)
	write(1, '(/, a, <n>(I<iwn>,1x))') 'Pas 1 - ORDER: ', order
	endif
!		if(kodPrint >=2) write(1,*) a(1,1)
	endif

! Mesaj pentru Pivot < prag:
if (abs(a(1, 1)) < prag) then
write (*,*) ' Pivot(1) =', a(1,1), ' <', prag
write (1,*) ' Pivot(1) =', a(1,1), ' <', prag

kod =-1
return
endif


! Linia 1 - L:
do kcol =2, n
a(1, kcol) = a(1,kcol)/a(1, 1)	!jcol =1
enddo

! Calculeaza L si U: 
! L pe coloane, cu apel APVT.

Main_DO: do jcol =2, n-1

Pvt_If: if(do_pvt) then
! Cautare pivot si test prag:
call APVT_C(A, n, order, jcol, kodPivot, prag)
endif Pvt_If

! Coloana "jcol" a lui L:
j1 = jcol-1

do i =jcol, n
dsum =0.
	do kcol =1, j1
	dsum =dsum +dprod(a(i, kcol), a(kcol, jcol))
	enddo
a(i, jcol) =a(i, jcol) -dsum
enddo

	if(kodPrint >=1) then
	if(do_pvt) then
	iwn =width(n); iwr =width(jcol);
	write(1, '(/, a, I<iwr>, a, <n>(I<iwn>, 1x))') 'Pas ' , jcol, ' - ORDER: ', order(jcol:n)
	endif
	
!	if(kodPrint >=2) write(1,*) a(jcol,jcol)
	endif

if (abs(a(jcol, jcol)) < prag) then
iwj =width(jcol)
write(*, '(/, a, I<iwj>, a, 1pg15.7, a, 1pg15.7)') 'l(', jcol, ') =', a(jcol,jcol), ' <', prag
write(1, '(/, a, I<iwj>, a, 1pg15.7, a, 1pg15.7)') 'l(', jcol, ') =', a(jcol,jcol), ' <', prag

kod =-1
RETURN
endif

! Linia din U:
j2 =jcol+1
do kcol =j2, n
dsum =0.D0
	do i =1, j1
	dsum =dsum +dprod(a(jcol, i), a(i, kcol))
	enddo
a(jcol, kcol) =(a(jcol, kcol) -dsum)/a(jcol, jcol)
enddo

enddo Main_DO

! Ultimul element din L:
dsum =0.D0
do kcol =1, n-1
dsum =dsum +dprod(a(n, kcol), a(kcol, n))
enddo
a(n,n) =a(n,n) -dsum

	if(kodPrint >=1) then
	if(do_pvt) then
	iwn =width(n);
	write(1, '(/, a, I<iwn>, a, <n>(I<iwn>, 1x))') 'Pas ' , n, ' - ORDER: ', order(n)
	endif
	
!	if(kodPrint >=2) write(1,*) a(n,n)
	endif

if (abs(a(n,n)) < prag) then
!write (*,*) " Pivot mai mic decat", prag
iwn =width(n)
write(*, '(/, a, I<iwj>, a, 1pg15.7, a, 1pg15.7)') 'Pivot(', n, ') =', a(n,n), ' <', prag
write(1, '(/, a, I<iwj>, a, 1pg15.7, a, 1pg15.7)') 'Pivot(', n, ') =', a(n,n), ' <', prag

kod =-1
RETURN
endif

kod =0

END Subroutine LUdecomp_C

