Tpetra::CrsGraph::getLocalDiagOffsets: Use LocalOrdinal instead of size_t for offsets
Created by: mhoemmen
This doesn't block #212 (closed), but is related. In particular, #205 (closed) makes it easier to use whatever offset type we want in Tpetra, since the proposed search code is agnostic of the offset type.
Tpetra::CrsGraph::getLocalDiagOffsets computes the offset of each row's diagonal entry. Tpetra uses this to speed up extracting the diagonal entries of a CrsMatrix, and the block diagonal entries of a BlockCrsMatrix.
getLocalDiagOffsets computes offsets relative to each row. Thus, the type used to store offsets need only be able to represent the number of entries in a single row. If there are no duplicates in the row,
LocalOrdinal thus suffices. If
LocalOrdinal is 32 bits, this saves space and speeds up the computation.
There are no duplicates if the graph or matrix is fillComplete. Epetra never has duplicates in the graph, because insertion always merges; it never stores duplicates. #119 means that in Tpetra, it is technically possible to insert more duplicate entries in a row than the number of columns in the matrix. However, that is a weird edge case. Furthermore, there is no advantage to having a single type (currently
size_t) for offsets, independent of other template parameters, because the main customer (Ifpack2) of
getLocalDiagOffsets takes the same template parameters as Tpetra classes anyway.