10 #ifndef TPETRA_SOLVERMAP_CRSMATRIX_DEF_HPP
11 #define TPETRA_SOLVERMAP_CRSMATRIX_DEF_HPP
29 template <
class Scalar,
34 : StructuralSameTypeTransform<
CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >()
35 , newColMap_(Teuchos::null)
36 , newGraph_(Teuchos::null) {
40 template <
class Scalar,
48 template <
class Scalar,
52 typename SolverMap_CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::NewType
56 assert(!origMatrix->isGloballyIndexed());
58 this->origObj_ = origMatrix;
63 Teuchos::RCP<map_t const> origDomainMap = origMatrix->getDomainMap();
64 Teuchos::RCP<map_t const> origColMap = origMatrix->getColMap();
66 typename map_t::local_map_type localOrigDomainMap(origDomainMap->getLocalMap());
67 typename map_t::local_map_type localOrigColMap(origColMap->getLocalMap());
69 if (origDomainMap->isLocallyFitted(*origColMap)) {
70 this->newObj_ = this->origObj_;
81 size_t const origDomainMap_localSize = origDomainMap->getLocalNumElements();
82 size_t newColMap_localSize(origDomainMap_localSize);
85 size_t newColMap_extraSize(0);
86 size_t const origColMap_localSize = origColMap->getLocalNumElements();
88 Kokkos::parallel_reduce(
89 "Tpetra::SolverMap_CrsMatrix::construct::newColMap_extraSize", Kokkos::RangePolicy<typename Node::device_type::execution_space, size_t>(0, origColMap_localSize), KOKKOS_LAMBDA(
size_t const i,
size_t& sizeToUpdate)->
void {
90 GlobalOrdinal
const globalColIndex(localOrigColMap.getGlobalElement(i));
91 if (localOrigDomainMap.getLocalElement(globalColIndex) == ::Tpetra::Details::OrdinalTraits<LocalOrdinal>::invalid()) {
97 newColMap_localSize += newColMap_extraSize;
100 Kokkos::View<GlobalOrdinal*, typename Node::device_type> newColMap_globalColIndices(
"", newColMap_localSize);
104 Kokkos::parallel_for(
105 "Tpetra::SolverMap_CrsMatrix::construct::copyDomainMapToNewColMap", Kokkos::RangePolicy<typename Node::device_type::execution_space, size_t>(0, origDomainMap_localSize), KOKKOS_LAMBDA(
size_t const i)->
void {
106 newColMap_globalColIndices(i) = localOrigDomainMap.getGlobalElement(i);
115 Kokkos::parallel_scan(
116 "Tpetra::SolverMap_CrsMatrix::construct::appendNewColMap", Kokkos::RangePolicy<typename Node::device_type::execution_space, size_t>(0, origColMap_localSize), KOKKOS_LAMBDA(
size_t const i,
size_t& jToUpdate,
bool const final)->
void {
117 GlobalOrdinal
const globalColIndex(localOrigColMap.getGlobalElement(i));
118 if (localOrigDomainMap.getLocalElement(globalColIndex) == ::Tpetra::Details::OrdinalTraits<LocalOrdinal>::invalid()) {
120 newColMap_globalColIndices(origDomainMap_localSize + jToUpdate) = globalColIndex;
130 Teuchos::RCP<map_t const> origRowMap = origMatrix->getRowMap();
131 Teuchos::RCP<Teuchos::Comm<int>
const> Comm = origRowMap->getComm();
132 size_t const newColMap_localNumCols = newColMap_globalColIndices.size();
133 size_t newColMap_globalNumCols(0);
134 Teuchos::reduceAll(*Comm, Teuchos::REDUCE_SUM, 1, &newColMap_localNumCols, &newColMap_globalNumCols);
136 newColMap_ = Teuchos::rcp<map_t>(
new map_t(newColMap_globalNumCols, newColMap_globalColIndices, origDomainMap->getIndexBase(), Comm));
141 cg_t
const* origGraph =
dynamic_cast<cg_t const*
>(origMatrix->getGraph().get());
142 newGraph_ = Teuchos::rcp<cg_t>(
new cg_t(*origGraph));
143 newGraph_->resumeFill();
144 newGraph_->reindexColumns(newColMap_);
145 newGraph_->fillComplete();
150 Teuchos::RCP<cm_t> newMatrix = Teuchos::rcp<cm_t>(
new cm_t(*origMatrix, newGraph_));
155 this->newObj_ = newMatrix;
158 return this->newObj_;
167 #define TPETRA_SOLVERMAPCRSMATRIX_INSTANT(SCALAR, LO, GO, NODE) \
168 template class SolverMap_CrsMatrix<SCALAR, LO, GO, NODE>;
172 #endif // TPETRA_SOLVERMAP_CRSMATRIX_DEF_HPP
Sparse matrix that presents a row-oriented interface that lets users read or modify entries...
Declaration of the Tpetra::SolverMap_CrsMatrix class.
NewType operator()(OriginalType const &origMatrix)
A distributed graph accessed by rows (adjacency lists) and stored sparsely.
A parallel distribution of indices over processes.