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 |