odrv Subroutine

public subroutine odrv(N, Ia, Ja, A, P, Ip, Nsp, Isp, Path, Flag)

Name

odrv(3f) [M_odepack] - driver for sparse matrix reordering routines

Description

odrv finds a minimum degree ordering of the rows and columns of a matrix m stored in (ia,ja,a) format (see below). for the reordered matrix, the work and storage required to perform gaussian elimination is (usually) significantly less.

note.. odrv and its subordinate routines have been modified to compute orderings for general matrices, not necessarily having any symmetry. the miminum degree ordering is computed for the structure of the symmetric matrix m + m-transpose. modifications to the original odrv module have been made in the coding in subroutine mdi, and in the initial comments in subroutines odrv and md.

if only the nonzero entries in the upper triangle of m are being stored, then odrv symmetrically reorders (ia,ja,a), (optionally) with the diagonal entries placed first in each row. this is to ensure that if m(i,j) will be in the upper triangle of m with respect to the new ordering, then m(i,j) is stored in row i (and thus m(j,i) is not stored), whereas if m(i,j) will be in the strict lower triangle of m, then m(j,i) is stored in row j (and thus m(i,j) is not stored).

storage of sparse matrices

the nonzero entries of the matrix m are stored row-by-row in the array a. to identify the individual nonzero entries in each row, we need to know in which column each entry lies. these column indices are stored in the array ja. i.e., if a(k) = m(i,j), then ja(k) = j. to identify the individual rows, we need to know where each row starts. these row pointers are stored in the array ia. i.e., if m(i,j) is the first nonzero entry (stored) in the i-th row and a(k) = m(i,j), then ia(i) = k. moreover, ia(n+1) points to the first location following the last element in the last row. thus, the number of entries in the i-th row is ia(i+1) - ia(i), the nonzero entries in the i-th row are stored consecutively in

            a(ia(i)),  a(ia(i)+1),  ..., a(ia(i+1)-1),

and the corresponding column indices are stored consecutively in

            ja(ia(i)), ja(ia(i)+1), ..., ja(ia(i+1)-1).

when the coefficient matrix is symmetric, only the nonzero entries in the upper triangle need be stored. for example, the matrix

             ( 1  0  2  3  0 )
             ( 0  4  0  0  0 )
         m = ( 2  0  5  6  0 )
             ( 3  0  6  7  8 )
             ( 0  0  0  8  9 )

could be stored as

            - 1  2  3  4  5  6  7  8  9 10 11 12 13
         ---+--------------------------------------
         ia - 1  4  5  8 12 14
         ja - 1  3  4  2  1  3  4  1  3  4  5  4  5
          a - 1  2  3  4  2  5  6  3  6  7  8  8  9

or (symmetrically) as

            - 1  2  3  4  5  6  7  8  9
         ---+--------------------------
         ia - 1  4  5  7  9 10
         ja - 1  3  4  2  3  4  4  5  5
          a - 1  2  3  4  5  6  7  8  9          .

parameters

    n    - order of the matrix

    ia   - integer one-dimensional array containing pointers to delimit
           rows in ja and a.  dimension = n+1

    ja   - integer one-dimensional array containing the column indices
           corresponding to the elements of a.  dimension = number of
           nonzero entries in (the upper triangle of) m

    a    - real one-dimensional array containing the nonzero entries in
           (the upper triangle of) m, stored by rows.  dimension =
           number of nonzero entries in (the upper triangle of) m

    p    - integer one-dimensional array used to return the permutation
           of the rows and columns of m corresponding to the minimum
           degree ordering.  dimension = n

    ip   - integer one-dimensional array used to return the inverse of
           the permutation returned in p.  dimension = n

    nsp  - declared dimension of the one-dimensional array isp.  nsp
           must be at least  3n+4k,  where k is the number of nonzeroes
           in the strict upper triangle of m

    isp  - integer one-dimensional array used for working storage.
           dimension = nsp

    path - integer path specification.  values and their meanings are -
             1  find minimum degree ordering only
             2  find minimum degree ordering and reorder symmetrically
                  stored matrix (used when only the nonzero entries in
                  the upper triangle of m are being stored)
             3  reorder symmetrically stored matrix as specified by
                  input permutation (used when an ordering has already
                  been determined and only the nonzero entries in the
                  upper triangle of m are being stored)
             4  same as 2 but put diagonal entries at start of each row
             5  same as 3 but put diagonal entries at start of each row

    flag - integer error flag.  values and their meanings are -
               0    no errors detected
              9n+k  insufficient storage in md
             10n+1  insufficient storage in odrv
             11n+1  illegal path specification

Arguments

Type IntentOptional Attributes Name
integer :: N
integer, dimension(*) :: Ia
integer, dimension(*) :: Ja
real(kind=dp), dimension(*) :: A
integer, dimension(*) :: P
integer, dimension(*) :: Ip
integer, intent(in) :: Nsp
integer, dimension(*) :: Isp
integer, intent(in) :: Path
integer, intent(inout) :: Flag

Called by

proc~~odrv~2~~CalledByGraph proc~odrv~2 M_odepack::odrv proc~dprep M_odepack.f90::dprep proc~dprep->proc~odrv~2 proc~dprepi M_odepack.f90::dprepi proc~dprepi->proc~odrv~2 proc~dprepi~2 dprepi.inc::dprepi proc~dprepi~2->proc~odrv~2 proc~dprep~2 dprep.inc::dprep proc~dprep~2->proc~odrv~2