Statistiques
| Révision :

root / src / minv.f90 @ 7

Historique | Voir | Annoter | Télécharger (3,03 ko)

1 1 equemene
      SUBROUTINE MINV(A,N,D)
2 1 equemene
3 1 equemene
      IMPLICIT NONE
4 1 equemene
      integer, parameter :: KINT = kind(1)
5 1 equemene
      integer, parameter :: KREAL = kind(1.0d0)
6 1 equemene
7 1 equemene
      REAL(KREAL), INTENT(INOUT) :: A(N*N)
8 1 equemene
      INTEGER(KINT), INTENT(IN) :: N
9 1 equemene
      REAL(KREAL), INTENT(OUT) :: D
10 1 equemene
11 1 equemene
12 1 equemene
!**********************************************************************
13 1 equemene
!*
14 1 equemene
!*     INVERT A MATRIX USING GAUSS-JORDAN METHOD.  PART OF DIIS
15 1 equemene
!*     A - INPUT MATRIX (MUST BE A GENERAL MATRIX), DESTROYED IN
16 1 equemene
!*        COMPUTATION AND REPLACED BY RESULTANT INVERSE.
17 1 equemene
!*     N - ORDER OF MATRIX A
18 1 equemene
!*     D - RESULTANT DETERMINANT
19 1 equemene
!*
20 1 equemene
!**********************************************************************
21 1 equemene
      INTEGER(KINT), ALLOCATABLE :: L(:), M(:)
22 1 equemene
      INTEGER(KINT) :: I,J,K,NK,KK,KI,KJ,IZ,IJ,JP,JK,IK,JR,JQ,JI
23 1 equemene
24 1 equemene
      REAL(KREAL) :: BigA,Hold
25 1 equemene
26 1 equemene
      ALLOCATE(L(N),M(N))
27 1 equemene
!
28 1 equemene
!     SEARCH FOR LARGEST ELEMENT
29 1 equemene
!
30 1 equemene
      D=1.0D0
31 1 equemene
      NK=-N
32 1 equemene
      DO 180 K=1,N
33 1 equemene
         NK=NK+N
34 1 equemene
         L(K)=K
35 1 equemene
         M(K)=K
36 1 equemene
         KK=NK+K
37 1 equemene
         BIGA=A(KK)
38 1 equemene
         DO 20 J=K,N
39 1 equemene
            IZ=N*(J-1)
40 1 equemene
            DO 20 I=K,N
41 1 equemene
               IJ=IZ+I
42 1 equemene
   10          IF (ABS(BIGA).LT.ABS(A(IJ)))THEN
43 1 equemene
                  BIGA=A(IJ)
44 1 equemene
                  L(K)=I
45 1 equemene
                  M(K)=J
46 1 equemene
               ENDIF
47 1 equemene
   20    CONTINUE
48 1 equemene
!
49 1 equemene
!     INTERCHANGE ROWS
50 1 equemene
!
51 1 equemene
         J=L(K)
52 1 equemene
         IF (J-K) 50,50,30
53 1 equemene
   30    KI=K-N
54 1 equemene
         DO 40 I=1,N
55 1 equemene
            KI=KI+N
56 1 equemene
            HOLD=-A(KI)
57 1 equemene
            JI=KI-K+J
58 1 equemene
            A(KI)=A(JI)
59 1 equemene
   40    A(JI)=HOLD
60 1 equemene
!
61 1 equemene
!     INTERCHANGE COLUMNS
62 1 equemene
!
63 1 equemene
   50    I=M(K)
64 1 equemene
         IF (I-K) 80,80,60
65 1 equemene
   60    JP=N*(I-1)
66 1 equemene
         DO 70 J=1,N
67 1 equemene
            JK=NK+J
68 1 equemene
            JI=JP+J
69 1 equemene
            HOLD=-A(JK)
70 1 equemene
            A(JK)=A(JI)
71 1 equemene
   70    A(JI)=HOLD
72 1 equemene
!C
73 1 equemene
!C     DIVIDE COLUMN BY MINUS PIVOT (VALUE OF PIVOT ELEMENT IS
74 1 equemene
!C     CONTAINED IN BIGA)
75 1 equemene
!C
76 1 equemene
   80    IF (BIGA) 100,90,100
77 1 equemene
   90    D=0.0
78 1 equemene
         RETURN
79 1 equemene
  100    DO 120 I=1,N
80 1 equemene
            IF (I-K) 110,120,110
81 1 equemene
  110       IK=NK+I
82 1 equemene
            A(IK)=A(IK)/(-BIGA)
83 1 equemene
  120    CONTINUE
84 1 equemene
!C  REDUCE MATRIX
85 1 equemene
         DO 150 I=1,N
86 1 equemene
            IK=NK+I
87 1 equemene
            HOLD=A(IK)
88 1 equemene
            IJ=I-N
89 1 equemene
            DO 150 J=1,N
90 1 equemene
               IJ=IJ+N
91 1 equemene
               IF (I-K) 130,150,130
92 1 equemene
  130          IF (J-K) 140,150,140
93 1 equemene
  140          KJ=IJ-I+K
94 1 equemene
               A(IJ)=HOLD*A(KJ)+A(IJ)
95 1 equemene
  150    CONTINUE
96 1 equemene
!C
97 1 equemene
!C     DIVIDE ROW BY PIVOT
98 1 equemene
!C
99 1 equemene
         KJ=K-N
100 1 equemene
         DO 170 J=1,N
101 1 equemene
            KJ=KJ+N
102 1 equemene
            IF (J-K) 160,170,160
103 1 equemene
  160       A(KJ)=A(KJ)/BIGA
104 1 equemene
  170    CONTINUE
105 1 equemene
!C
106 1 equemene
!C     PRODUCT OF PIVOTS
107 1 equemene
!C
108 1 equemene
         D=MAX(-1.D25,MIN(1.D25,D))
109 1 equemene
         D=D*BIGA
110 1 equemene
!C
111 1 equemene
!C     REPLACE PIVOT BY RECIPROCAL
112 1 equemene
!C
113 1 equemene
         A(KK)=1.0/BIGA
114 1 equemene
  180 CONTINUE
115 1 equemene
!C
116 1 equemene
!C     FINAL ROW AND COLUMN INTERCHANGE
117 1 equemene
!C
118 1 equemene
      K=N
119 1 equemene
  190 K=(K-1)
120 1 equemene
      IF (K) 260,260,200
121 1 equemene
  200 I=L(K)
122 1 equemene
      IF (I-K) 230,230,210
123 1 equemene
  210 JQ=N*(K-1)
124 1 equemene
      JR=N*(I-1)
125 1 equemene
      DO 220 J=1,N
126 1 equemene
         JK=JQ+J
127 1 equemene
         HOLD=A(JK)
128 1 equemene
         JI=JR+J
129 1 equemene
         A(JK)=-A(JI)
130 1 equemene
  220 A(JI)=HOLD
131 1 equemene
  230 J=M(K)
132 1 equemene
      IF (J-K) 190,190,240
133 1 equemene
  240 KI=K-N
134 1 equemene
      DO 250 I=1,N
135 1 equemene
         KI=KI+N
136 1 equemene
         HOLD=A(KI)
137 1 equemene
         JI=KI-K+J
138 1 equemene
         A(KI)=-A(JI)
139 1 equemene
  250 A(JI) =HOLD
140 1 equemene
      GO TO 190
141 1 equemene
  260 RETURN
142 1 equemene
      END