!PROGRAM TEST_DGETRI
!C...Inversion d'une matrice
!	IMPLICIT NONE
!	DOUBLE PRECISION MAT,MATINV,M	
!	DIMENSION MAT(4,4),MATINV(4,4),M(4,4)
!C...
!	INTEGER INFO
!	INTEGER IPIV
!	DIMENSION IPIV(4)
!C...Espace de travail pour DGETRF
!	DOUBLE PRECISION WORK
!	DIMENSION WORK(80)	
!
!	INTEGER I,J
!
!C...Elements de la matrice MAT 
!C...Premiere ligne
!	MAT(1,1)=3
!	MAT(1,2)=-1
!	MAT(1,3)=2
!	MAT(1,4)=-4
!C...Deuxieme ligne	
!	MAT(2,1)=5
!	MAT(2,2)=-8
!	MAT(2,3)=4
!	MAT(2,4)=-1
!C...Toisieme ligne
!	MAT(3,1)=5
!	MAT(3,2)=6
!	MAT(3,3)=1
!	MAT(3,4)=7
!C...Quatrieme ligne
!	MAT(4,1)=1
!	MAT(4,2)=2
!	MAT(4,3)=-8
!	MAT(4,4)=7
!
!	WRITE(6,*)'MAT:'
!	DO I=1,4
!	WRITE(6,42)(MAT(I,J),J=1,4)
!	ENDDO
!
!C...Copie de MAT dans MATINV, via DCOPY (routine BLAS)
!	CALL DCOPY(4*4,MAT,1,MATINV,1)
!
!C...Decomposition LU de MATINV (==MAT pour l instant)
!C...DGETRF( M, N, A, LDA, IPIV, INFO )
!	CALL DGETRF(4,4,MATINV,4,IPIV,INFO)
!C.. en sortie, MATINV contient la decomposition LU
!C.. en sortie, INFO=0 si tout va bien
!C.. en sortie, IPIV contient la liste des permutations
!	WRITE(6,*)'EN SORTIE DE DGETRF: INFO=',INFO
!	DO I=1,4
!	WRITE(6,*)'IPIV(',I,')=',IPIV(I)
!	ENDDO
!
!C...Inversion
!C...DGETRI(N,A,LDA,IPIV,WORK,LWORK,INFO)
!C...Rem:: il faut au minimum LWORK >= N
!	CALL DGETRI(4,MATINV,4,IPIV,WORK,80,INFO)
!C.. en sortie, MATINV contient l inverse de MAT
!C.. en sortie, INFO=0 si tout va bien
!	WRITE(6,*)'EN SORTIE DE DGETRI: INFO=',INFO
!	WRITE(6,*)'MATINV:'
!	DO I=1,4
!	WRITE(6,42)(MATINV(I,J),J=1,4)
!	ENDDO
!
!C..Verification; produit MAT*MATINV, via DGEMM (routine BLAS)
!C...Produit matrice matrice C:=ALPHA*(A*B)+BETA*C
!C...DGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC)
!	CALL DGEMM('N','N',4,4,4,1.D0,MAT,4,MATINV,4,0.D0,M,4)
!
!	WRITE(6,*)'M=MAT*MATINV:'
!	DO I=1,4
!	WRITE(6,42)(M(I,J),J=1,4)
!	ENDDO
!
! 42	FORMAT(4(1X,1PE22.14))
!
!	END PROGRAM TEST_DGETRI

subroutine invertmat_L(A,noa)
use mod_script

integer,allocatable,dimension(:) :: IPIV
real(8),allocatable,dimension(:) :: work
real(8) :: A(noa,noa)
logical :: yw=.false.
if(yw)print*,'entree invertmat_L'

!...Decomposition LU de MATINV (==MAT pour l instant)
!...DGETRF( M, N, A, LDA, IPIV, INFO )

allocate(IPIV(noa))
CALL DGETRF(noa,noa,A,noa,IPIV,INFO)

!.. en sortie, A contient l inverse de A
!.. en sortie, INFO=0 si tout va bien
if(yw) then
   print*,'DGETRF'
   print*,'info',info
   call mscript(A)
endif
if(info/=0) then
   print*,'Pb dans DGETRF. info=',info
   stop
endif


!...Inversion
!...DGETRI(N,A,LDA,IPIV,WORK,LWORK,INFO)
!...Rem:: il faut au minimum LWORK >= N
allocate(work(noa))
lwork=-1
CALL DGETRI(noa,A,noa,IPIV,WORK,lwork,INFO)
lwork=work(1)
if(yw) print*,'lwork',lwork
deallocate(work)
allocate(work(lwork))
CALL DGETRI(noa,A,noa,IPIV,WORK,lwork,INFO)
!C.. en sortie, MATINV contient l inverse de MAT
!C.. en sortie, INFO=0 si tout va bien
if(info/=0) then
   print*,'Pb dans DGETRI. info=',info
   stop
endif
end


