Blame view

fvn_sparse/AMD/Demo/amd_f77demo.f 6.25 KB
422234dc3   daniau   git-svn-id: https...
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