amd_f77demo.f
6.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
C ======================================================================
C === Fortran AMD demo main program ====================================
C ======================================================================
C ----------------------------------------------------------------------
C AMD, Copyright (c) by Timothy A. Davis, Patrick R.
C Amestoy, and Iain S. Duff. See ../README.txt for
C License. email: davis at cise.ufl.edu CISE Department, Univ. of
C Florida. web: http://www.cise.ufl.edu/research/sparse/amd
C ----------------------------------------------------------------------
C A simple Fortran 77 main program that illustrates the use of the
C Fortran version of AMD (both the AMD and AMDBAR routines). Note
C that aggressive absorption has no effect on this particular matrix.
C AP and AI contain the symmetric can_24 Harwell/Boeing matrix,
C including upper and lower triangular parts, but excluding the
C diagonal entries. Note that this matrix is 1-based, with row
C and column indices in the range 1 to N.
INTEGER N, NZ, IWLEN, PFREE, I, J, K, JNEW, P, INEW,
$ METHOD, NCMPA
PARAMETER (N = 24, NZ = 136, IWLEN = 200)
INTEGER PE (N), DEGREE (N), NV (N), NEXT (N), PERM (N), W (N),
$ HEAD (N), PINV (N), LEN (N), AP (N+1), AI (NZ), IW (IWLEN)
CHARACTER A (24,24)
DATA AP
$ / 1, 9, 14, 19, 24, 29, 34, 42, 50, 53, 61, 66, 71,
$ 76, 81, 86, 91, 94, 102, 110, 118, 123, 131, 134, 137 /
DATA AI /
$ 6, 7, 13, 14, 18, 19, 20, 22,
$ 9, 10, 14, 15, 18,
$ 7, 12, 21, 22, 23,
$ 8, 11, 16, 19, 20,
$ 8, 10, 15, 16, 17,
$ 1, 7, 13, 14, 18,
$ 1, 3, 6, 12, 13, 20, 22, 24,
$ 4, 5, 10, 15, 16, 17, 18, 19,
$ 2, 10, 15,
$ 2, 5, 8, 9, 14, 15, 18, 19,
$ 4, 19, 20, 21, 22,
$ 3, 7, 13, 22, 24,
$ 1, 6, 7, 12, 24,
$ 1, 2, 6, 10, 18,
$ 2, 5, 8, 9, 10,
$ 4, 5, 8, 17, 19,
$ 5, 8, 16,
$ 1, 2, 6, 8, 10, 14, 19, 20,
$ 1, 4, 8, 10, 11, 16, 18, 20,
$ 1, 4, 7, 11, 18, 19, 21, 22,
$ 3, 11, 20, 22, 23,
$ 1, 3, 7, 11, 12, 20, 21, 23,
$ 3, 21, 22,
$ 7, 12, 13 /
C print the input matrix
PRINT 11, N, N, NZ
11 FORMAT ('AMD Fortran 77 demo, with the 24-by-24',
$ ' Harwell/Boeing matrix, can_24:'
$ /, 'Input matrix: ', I2, '-by-', I2,' with ',I3,' entries',
$ /, 'Note that the Fortran version of AMD requires that'
$ /, 'no diagonal entries be present.')
DO 20 J = 1, N
PRINT 21, J, AP (J+1) - AP (J), AP (J), AP (J+1)-1
21 FORMAT ( /, 'Column: ', I2, ' number of entries: ', I2,
$ ' with row indices in AI (', I3, ' ... ', I3, ')')
PRINT 10, ((AI (P)), P = AP (J), AP (J+1) - 1)
10 FORMAT (' row indices: ', 24I3)
20 CONTINUE
C print a character plot of the input matrix. This is only
C reasonable because the matrix is small.
PRINT 31
31 FORMAT ('Plot of input matrix pattern:')
DO 50 J = 1,N
DO 30 I = 1,N
A (I, J) = '.'
30 CONTINUE
C add the diagonal entry to the plot
A (J, J) = 'X'
DO 40 P = AP (J), AP (J+1) - 1
I = AI (P)
A (I, J) = 'X'
40 CONTINUE
50 CONTINUE
PRINT 60, ((MOD (J, 10)), J = 1,N)
60 FORMAT (' ', 24I2)
DO 80 I = 1,N
PRINT 70, I, (A (I, J), J = 1,N)
70 FORMAT (' ', I2, ': ', 24A2)
80 CONTINUE
DO 190 METHOD = 1,2
C load the matrix into AMD's workspace
DO 90 J = 1,N
PE (J) = AP (J)
LEN (J) = AP (J+1) - AP (J)
90 CONTINUE
DO 100 P = 1,NZ
IW (P) = AI (P)
100 CONTINUE
PFREE = NZ + 1
C order the matrix using AMD or AMDBAR
IF (METHOD .EQ. 1) THEN
PRINT 101
101 FORMAT (/, '------------------------------------------',
$ /, 'ordering the matrix with AMD',
$ /, '------------------------------------------')
CALL AMD (N, PE, IW, LEN, IWLEN, PFREE, NV, NEXT,
$ PERM, HEAD, PINV, DEGREE, NCMPA, W)
ELSE
PRINT 102
102 FORMAT (/, '------------------------------------------',
$ /, 'ordering the matrix with AMDBAR',
$ /, '------------------------------------------')
CALL AMDBAR (N, PE, IW, LEN, IWLEN, PFREE, NV, NEXT,
$ PERM, HEAD, PINV, DEGREE, NCMPA, W)
ENDIF
C print the permutation vector, PERM, and its inverse, PINV.
C row/column J = PERM (K) is the Kth row/column in the
C permuted matrix.
PRINT 110, (PERM (K), K = 1,N)
110 FORMAT (/, 'Permutation vector: ', /, 24I3)
PRINT 120, (PINV (J), J = 1,N)
120 FORMAT (/, 'Inverse permutation vector: ', /, 24I3)
C print a character plot of the permuted matrix.
PRINT 121
121 FORMAT ('Plot of permuted matrix pattern:')
DO 150 JNEW = 1,N
J = PERM (JNEW)
DO 130 INEW = 1,N
A (INEW, JNEW) = '.'
130 CONTINUE
C add the diagonal entry to the plot
A (JNEW, JNEW) = 'X'
DO 140 P = AP (J), AP (J+1) - 1
INEW = PINV (AI (P))
A (INEW, JNEW) = 'X'
140 CONTINUE
150 CONTINUE
PRINT 60, ((MOD (J, 10)), J = 1,N)
DO 160 I = 1,N
PRINT 70, I, (A (I, J), J = 1,N)
160 CONTINUE
C print the permuted matrix, PERM*A*PERM'
DO 180 JNEW = 1,N
J = PERM (JNEW)
PRINT 171, JNEW, J, AP (J+1) - AP (J)
171 FORMAT (/, 'New column: ', I2, ' old column: ', I2,
$ ' number of entries: ', I2)
PRINT 170, (PINV (AI (P)), P = AP (J), AP (J+1) - 1)
170 FORMAT (' new row indices: ', 24I3)
180 CONTINUE
190 CONTINUE
END