Blame view

fvn_sparse/UMFPACK/Demo/readhb.f 3.55 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
  c=======================================================================
  c== readhb =============================================================
  c=======================================================================
  
  c-----------------------------------------------------------------------
  c UMFPACK Version 4.4, Copyright (c) 2005 by Timothy A. Davis.  CISE
  c Dept, Univ. of Florida.  All Rights Reserved.  See ../Doc/License for
  c License.  web: http://www.cise.ufl.edu/research/sparse/umfpack
  c-----------------------------------------------------------------------
  
  c readhb:
  c       read a sparse matrix in the Harwell/Boeing format and
  c       output a matrix in triplet format.
  c
  c usage (for example):
  c
  c       in a Unix shell:
  c       readhb < HB/arc130.rua > tmp/A
  c
  c       Then, in MATLAB, you can do the following:
  c       >> load tmp/A
  c       >> A = spconvert (A) ;
  c       >> spy (A)
  
          integer nzmax, nmax
          parameter (nzmax = 20000000, nmax = 250000)
          integer Ptr (nmax), Index (nzmax), n, nz, totcrd, ptrcrd,
       $          indcrd, valcrd, rhscrd, ncol, nrow, nrhs, row, col, p
          character title*72, key*30, type*3, ptrfmt*16,
       $          indfmt*16, valfmt*20, rhsfmt*20
          logical sym
          double precision Value (nzmax), skew
          character rhstyp*3
          integer nzrhs, nel
  
          integer ne, nnz
  
  c-----------------------------------------------------------------------
  
  c       read header information from Harwell/Boeing matrix
  
          read (5, 10, err = 998)
       $          title, key,
       $          totcrd, ptrcrd, indcrd, valcrd, rhscrd,
       $          type, nrow, ncol, nz, nel,
       $          ptrfmt, indfmt, valfmt, rhsfmt
          if (rhscrd .gt. 0) then
  c          new Harwell/Boeing format:
             read (5, 20, err = 998) rhstyp,nrhs,nzrhs
             endif
  10      format (a72, a8 / 5i14 / a3, 11x, 4i14 / 2a16, 2a20)
  20      format (a3, 11x, 2i14)
  
          skew = 0.0
          if (type (2:2) .eq. 'Z' .or. type (2:2) .eq. 'z') skew = -1.0
          if (type (2:2) .eq. 'S' .or. type (2:2) .eq. 's') skew =  1.0
          sym = skew .ne. 0.0
  
          write (0, 31) key
  31      format ('Matrix key: ', a8)
  
          n = max (nrow, ncol)
  
          if (n .ge. nmax .or. nz .gt. nzmax) then
             write (0, *) 'Matrix too big!'
             write (0, *) '(recompile readhb.f with larger nzmax, nmax)'
             stop
          endif
  
          read (5, ptrfmt, err = 998) (Ptr (p), p = 1, ncol+1)
          read (5, indfmt, err = 998) (Index (p), p = 1, nz)
  
          do 55 col = ncol+2, n+1
             Ptr (col) = Ptr (ncol+1)
  55      continue
  
  c       read the values
          if (valcrd .gt. 0) then
             read (5, valfmt, err = 998) (Value (p), p = 1, nz)
          else
             do 50 p = 1, nz
                Value (p) = 1
  50         continue
          endif
  
  c  create the triplet form of the input matrix
  
          ne = 0
          nnz = 0
          do 100 col = 1, n
             do 90 p = Ptr (col), Ptr (col+1) - 1
                row = Index (p)
  
                ne = ne + 1
                    nnz = nnz + 1
                    write (6, 200) row, col, Value (p)
  
                if (sym .and. row .ne. col) then
                   ne = ne + 1
                   if (Value (p) .ne. 0) then
                      nnz = nnz + 1
                      write (6, 200) col, row, skew * Value (p)
                   endif
                endif
  
  90            continue
  100        continue
  200     format (2i7, e30.18e3)
  
  c       write (0,*) 'Number of entries: ',ne,' True nonzeros: ', nnz
          stop
  
  998     write (0,*) 'Read error: Harwell/Boeing matrix'
          stop
          end