Tpetra::CrsMatrix: Implement "DualView" (better: "dual view") semantics
*Created by: mhoemmen*
@trilinos/tpetra Tpetra::MultiVector already implements "dual view" semantics. We need the other modifiable Tpetra classes to implement this as well.
Tpetra::CrsMatrix needs to implement the following interface:
- `sync<MemorySpace>()`: Sync _to_ the given memory space
- `modify<MemorySpace>()`: Mark data in the given memory space as modified
- `bool need_sync<MemorySpace>() const`: Do we need a sync _to_ the given memory space?
- `local_matrix_type getLocalMatrix<MemorySpace>() const`: Get the KokkosSparse::CrsMatrix living in the given memory space
Currently, `getLocalMatrix` is not templated, and returns the version of the data living in `Tpetra::CrsMatrix::device_type::memory_space`. Tpetra::CrsMatrix does not yet provide any of the other methods.
It does not make sense for Tpetra::CrsGraph to implement dual view semantics until that class' interface allows thread-parallel graph construction (other than by constructing a Kokkos::StaticCrsGraph in a thread-parallel way, and handing it to Tpetra::CrsGraph's constructor). Thus, this Tpetra::CrsMatrix issue only refers to the fixed graph case -- either when the matrix was created using a const graph, or after the matrix's first `fillComplete` call.
issue