Blame view
fvn_sparse/AMD/Demo/amd_f77demo.f
6.25 KB
422234dc3 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 |