invma1
C INVMA1 SOURCE PV 20/09/15 21:15:06 10713 C C_______________________________________________________________________ C C SOUS PROGRAMME QUI CALCUL L INVERSE D UNE MATRICE CARRE D ORDRE N C C LA METHODE DE GAUSS JORDAN EST UTILISE C C ISING = 1 SI LA MATRICE EST SINGULIERE C = 0 SINON C_______________________________________________________________________ C IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) DIMENSION A(NDI,*) DIMENSION IPIV(10),INDXR(10),INDXC(10) -INC CCREEL C C INITIALISATION DES VARIABLES C ISING = 0 C TEST SUR N IF(N.GT.10) THEN ISING = 1 RETURN ENDIF C DO 10 I = 1,N IPIV(I) = 0 * inutile de remettre indxr et indxc a zero ** INDXR(I) = 0 ** INDXC(I) = 0 10 CONTINUE C C REDUCTION DES COLONNES ET RECHERCHE DU PIVOT C irow=1 icol=1 DO 20 I = 1,N BIG = 0.D0 DO 30 J = 1,N IF (IPIV(J).NE.1) THEN DO 40 K = 1,N IF (IPIV(K).EQ.0) THEN ** IF (ABS(A(J,K)).GE.BIG) THEN IF (.NOT.(ABS(A(J,K)).LT.BIG)) THEN BIG = ABS(A(J,K)) IROW = J ICOL = K ENDIF ELSEIF (IPIV(K).GT.1) THEN C C LA MATRICE EST SINGULIERE C ISING = 1 GOTO 95 ENDIF 40 CONTINUE ENDIF IF (.not.(BIG.LT.XGRAND)) then ISING = 1 GOTO 95 ENDIF 30 CONTINUE IPIV(ICOL) = IPIV(ICOL) + 1 C C LE PIVOT A ETE TROUVE C => CHANGEMENT DE COLONNE C IF (IROW.NE.ICOL) THEN DO 50 L = 1,N DUM = A(IROW,L) A(IROW,L) = A(ICOL,L) A(ICOL,L) = DUM 50 CONTINUE C ENDIF INDXR(I) =IROW INDXC(I) = ICOL C IF (A(ICOL,ICOL).EQ.0.D0) THEN C C LA MATRICE EST SINGULIERE C ISING = 1 GOTO 95 ENDIF C PIVINV = 1.D0/A(ICOL,ICOL) A(ICOL,ICOL) = 1.D0 DO 60 L = 1,N A(ICOL,L) = A(ICOL,L)*PIVINV 60 CONTINUE C C REDUCTION DES COLONNES C DO 70 LL = 1,N IF(LL.NE.ICOL) THEN DUM = A(LL,ICOL) A(LL,ICOL) = 0.D0 DO 80 L = 1,N A(LL,L) = A(LL,L) - A(ICOL,L)*DUM 80 CONTINUE ENDIF 70 CONTINUE 20 CONTINUE C C CHANGEMENT DE COLONNE POUR OBTENIR L INVERSE C DO 91 L = N,1,-1 IF(INDXR(L).NE.INDXC(L)) THEN DO 92 K = 1,N DUM = A(K,INDXR(L)) A(K,INDXR(L)) = A(K,INDXC(L)) A(K,INDXC(L)) = DUM 92 CONTINUE ENDIF 91 CONTINUE C 95 CONTINUE C END
© Cast3M 2003 - Tous droits réservés.
Mentions légales