Statistiques
| Révision :

root / src / minv.f90 @ 1

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

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