SUBROUTINE ELIM (AB, n, ncol, prag, kod, pivot)
! Rezolvitor pentru sisteme lniare, prin:
! Eliminare GAUSS, cu pivotare partiala.
! Termeni liberi multipli (numar ="nb") - in coloanele care extind matricea A.
! Parametri:
! n: Numarul ecuatiilor
! AB(n, ncol): matricea coeficintilor extinsa cu termenii liberi.
! ncol =n +nb: numar total ce coloane in "AB"
! Solutia eate returnata in coloanele extinse din "AB".
! kod = 0/#0: O.K./ pivot ~=0 (< prag)

real ab(n, ncol), temp_row(ncol)
real mik


! REDUCERE: Linia curenta = "k"
Main_DO: DO k =1, n-1
! Indicele liniei pivotului
ipvt =k; pivot =ab(k,k)
	do irow =k+1,n
	if(abs(ab(irow,k)) >abs(pivot)) then
	ipvt =irow
	pivot =ab(irow,k)
	endif
	enddo

! Test marime pivot: pivot =ab(ipvt, k)
	if(abs(pivot) < prag) then
	kod = -k
	return
	endif

! Inter-schimba liniile "k" si "ipvt"
! Nu, daca ipvt =k:
if(ipvt /=k) then
temp_row =ab(k,:)
ab(k,:) =ab(ipvt,:)
ab(ipvt,:) =temp_row
endif

! Pivot =ab(k,k)
! Reducere sub a(k,k), in coloanele kcol =k+1,...,n,...,ncol:
row: DO irow =k+1, n
! Nu, daca deja a(irow, k)=0:
if(ab(irow, k) ==0) then
cycle row
else
mik =ab(irow, k)/ab(k,k)	!pivot
	col: do jcol =k+1, ncol
	ab(irow, jcol) =ab(irow, jcol) -mik*ab(k, jcol)
	enddo col
endif
ENDDO row

Enddo Main_DO

! Test pentru a(n,n):
	if(abs(ab(n,n)) < prag) then
	kod = -n
	pivot =ab(n,n)
	return
	endif

kod =0
! BACK SUBSTITUTION:
! Ciclu pentru numarul de termeni liberi:
RHS: DO jB =n+1, ncol
ab(n, jB) =ab(n, jB)/ab(n,n)

do k = n-1, 1, -1
sum =0.
	do jcol =k+1, n
	sum =sum +ab(k, jcol)*ab(jcol, jB)
	enddo
ab(k, jB) =(ab(k,jB) -sum)/ab(k,k)
enddo

ENDDO RHS

END

