Program Nr_Conditie
!  Program principal pt. Numarul de conditie
! Matricea A = matricea data (n,n); Matricea B = matricea inversa (n,n).
! Norma-infinit & Norma-1. 
!
! Fisier de date (intrare/iesire)
! 1) Titlu: 80 caractere
! 2) n: nr. de ecuatii
! 3) Matricea coeficientilor "A": n x n (Se scrie asa cum e data - pe linii si coloane)
!
! 4) Cod_inversare coeficienti, Cod_Tiparire: 0/#0. 
!    - Cod_Inversare coeficienti: #0 => a(i,j) -> 1./a(i,j)
!    - Cod_Tiparire: #0: se tipareste si A^(-1)
! 5) Cod_Norma
!	 - Cod_Norma: 0 = norma-infinit (norma liniilor);
!				  1 = Norma-1 (norma coloanelor)
!				  2 = Norma-2: Nu e implementata (Se ia implicit, norma-infinit).
!
real, allocatable :: A(:,:), B(:,:)
character(80) titlu, fname*260
real Norm1, Norm$, Norm2
real prag /1E-6/


print '(a,\)', ' Nume fisier de intrare: '
read '(a)', fname
open(1,file=fname,status='old', form ='formatted')
read(1,'(a)') TITLU
! Citeste n, nb:
read(1,*) n

allocate (A(n,n), B(n,n))
A =0.0; B =0.0

! Citeste matricea coeficientilor (pe linii):
read(1,*) ((A(i,j),j=1,n),i=1,n)

read(1,*) kod_inv, kod_Print	

read(1,*) kod_norma		! 0 =infinit; 1 =norma-1; 2 =norma-2

if(kod_Inv /=0) then
do i=1,n
do j=1,n
a(i,j) =1./a(i,j)
enddo
enddo
endif

! Atribuie vectorii termenilor liberi = vectorii unitate
do i =1,n
B(i, i) =1.0
enddo

! Calculeaza norma lui A (inainte de eliminare):
select case(kod_norma)
case(0)
C = Norm$(n, A)

case(1)
C = Norm1(n, A)

case default
C = Norm$(n, A)
end select

! nb =n
	call ELIM2(n, n, A, B, prag, kod)

if(kod <0) then
write(1, '(/, a)') '* Matrice aproape singulara.'
goto 500
endif

! Tipareste matricea inversa:
if(kod_Print /=0) then
write(1, '(/, a)') ' Matricea inversa:'

do i =1,n
write(1, '(<n>G15.7)') B(i,:) 
enddo
endif

! Norma inversei:
write(1,*)
select case(kod_norma)
case(0)
write(1, 10) ' Norma-infinit (norma liniilor):'
Cinv= Norm$(n, B)

case(1)
write(1, 10) ' Norma-1 (norma coloanelor):'
Cinv= Norm1(n, B)

case default
write(1, *) 'Norma nedefinita: Se ia Norma-infinit (norma liniilor)'
Cinv= Norm$(n, B)
end select

write(1, '(/, a, 1pg15.7)') ' Norm(A) =', C
write(1, '(a, 1pg15.7)') ' Norm(A-invers) =', Cinv

! Calculeaza numarul de conditie:
Cond =C*Cinv

print '(/,a)', ' '//trim(titlu)
print '(a, 1pg15.7)', " Numarul de conditie =", Cond

write(1, '(a)')
write(1, 10) " Numarul de conditie =", Cond

10 format(a, 1pg15.7)

500 deallocate(A, B)

END program Nr_Conditie

