46 #ifndef XPETRA_TPETRACRSMATRIX_DEF_HPP
47 #define XPETRA_TPETRACRSMATRIX_DEF_HPP
49 #include <Xpetra_MultiVectorFactory.hpp>
51 #include "Tpetra_Details_residual.hpp"
55 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
57 : mtx_(Teuchos::rcp(new Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>(
toTpetra(rowMap), maxNumEntriesPerRow, params))) {}
59 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
60 TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::TpetraCrsMatrix(
const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &rowMap,
const ArrayRCP<const size_t> &NumEntriesPerRowToAlloc,
const Teuchos::RCP<Teuchos::ParameterList> ¶ms)
61 : mtx_(Teuchos::rcp(new Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>(
toTpetra(rowMap), NumEntriesPerRowToAlloc(), params))) {}
63 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
64 TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::TpetraCrsMatrix(
const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &rowMap,
const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &colMap,
size_t maxNumEntriesPerRow,
const Teuchos::RCP<Teuchos::ParameterList> ¶ms)
65 : mtx_(Teuchos::rcp(new Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>(
toTpetra(rowMap),
toTpetra(colMap), maxNumEntriesPerRow, params))) {}
67 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
68 TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::TpetraCrsMatrix(
const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &rowMap,
const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &colMap,
const ArrayRCP<const size_t> &NumEntriesPerRowToAlloc,
const Teuchos::RCP<Teuchos::ParameterList> ¶ms)
69 : mtx_(Teuchos::rcp(new Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>(
toTpetra(rowMap),
toTpetra(colMap), NumEntriesPerRowToAlloc(), params))) {}
71 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
72 TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::TpetraCrsMatrix(
const Teuchos::RCP<
const CrsGraph<LocalOrdinal, GlobalOrdinal, Node>> &graph,
const Teuchos::RCP<Teuchos::ParameterList> ¶ms)
73 : mtx_(Teuchos::rcp(new Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>(
toTpetra(graph), params))) {}
75 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
76 TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::TpetraCrsMatrix(
const Teuchos::RCP<
const CrsGraph<LocalOrdinal, GlobalOrdinal, Node>> &graph,
typename Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::local_matrix_type::values_type &values,
const Teuchos::RCP<Teuchos::ParameterList> ¶ms)
77 : mtx_(Teuchos::rcp(new Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>(
toTpetra(graph), values, params))) {}
79 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
80 TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::TpetraCrsMatrix(
const Teuchos::RCP<const CrsMatrix> &sourceMatrix,
81 const Import<LocalOrdinal, GlobalOrdinal, Node> &importer,
82 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &domainMap,
83 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &rangeMap,
84 const Teuchos::RCP<Teuchos::ParameterList> ¶ms) {
85 typedef Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> MyTpetraCrsMatrix;
86 XPETRA_DYNAMIC_CAST(
const TpetraCrsMatrixClass, *sourceMatrix, tSourceMatrix,
"Xpetra::TpetraCrsMatrix constructor only accepts Xpetra::TpetraCrsMatrix as the input argument.");
87 RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> v = tSourceMatrix.getTpetra_CrsMatrix();
89 RCP<const Tpetra::Map<LocalOrdinal, GlobalOrdinal, Node>> myDomainMap = domainMap != Teuchos::null ?
toTpetra(domainMap) : Teuchos::null;
90 RCP<const Tpetra::Map<LocalOrdinal, GlobalOrdinal, Node>> myRangeMap = rangeMap != Teuchos::null ?
toTpetra(rangeMap) : Teuchos::null;
91 mtx_ = Tpetra::importAndFillCompleteCrsMatrix<MyTpetraCrsMatrix>(tSourceMatrix.getTpetra_CrsMatrix(),
toTpetra(importer), myDomainMap, myRangeMap, params);
92 bool restrictComm =
false;
93 if (!params.is_null()) restrictComm = params->get(
"Restrict Communicator", restrictComm);
94 if (restrictComm && mtx_->getRowMap().is_null()) mtx_ = Teuchos::null;
97 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
98 TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::TpetraCrsMatrix(
const Teuchos::RCP<const CrsMatrix> &sourceMatrix,
99 const Export<LocalOrdinal, GlobalOrdinal, Node> &exporter,
100 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &domainMap,
101 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &rangeMap,
102 const Teuchos::RCP<Teuchos::ParameterList> ¶ms) {
103 typedef Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> MyTpetraCrsMatrix;
104 XPETRA_DYNAMIC_CAST(
const TpetraCrsMatrixClass, *sourceMatrix, tSourceMatrix,
"Xpetra::TpetraCrsMatrix constructor only accepts Xpetra::TpetraCrsMatrix as the input argument.");
105 RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> v = tSourceMatrix.getTpetra_CrsMatrix();
107 RCP<const Tpetra::Map<LocalOrdinal, GlobalOrdinal, Node>> myDomainMap = domainMap != Teuchos::null ?
toTpetra(domainMap) : Teuchos::null;
108 RCP<const Tpetra::Map<LocalOrdinal, GlobalOrdinal, Node>> myRangeMap = rangeMap != Teuchos::null ?
toTpetra(rangeMap) : Teuchos::null;
109 mtx_ = Tpetra::exportAndFillCompleteCrsMatrix<MyTpetraCrsMatrix>(tSourceMatrix.getTpetra_CrsMatrix(),
toTpetra(exporter), myDomainMap, myRangeMap, params);
112 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
113 TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::TpetraCrsMatrix(
const Teuchos::RCP<const CrsMatrix> &sourceMatrix,
114 const Import<LocalOrdinal, GlobalOrdinal, Node> &RowImporter,
115 const Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node>> DomainImporter,
116 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &domainMap,
117 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &rangeMap,
118 const Teuchos::RCP<Teuchos::ParameterList> ¶ms) {
119 typedef Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> MyTpetraCrsMatrix;
120 XPETRA_DYNAMIC_CAST(
const TpetraCrsMatrixClass, *sourceMatrix, tSourceMatrix,
"Xpetra::TpetraCrsMatrix constructor only accepts Xpetra::TpetraCrsMatrix as the input argument.");
121 RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> v = tSourceMatrix.getTpetra_CrsMatrix();
123 RCP<const Tpetra::Map<LocalOrdinal, GlobalOrdinal, Node>> myDomainMap = domainMap != Teuchos::null ?
toTpetra(domainMap) : Teuchos::null;
124 RCP<const Tpetra::Map<LocalOrdinal, GlobalOrdinal, Node>> myRangeMap = rangeMap != Teuchos::null ?
toTpetra(rangeMap) : Teuchos::null;
126 mtx_ = Tpetra::importAndFillCompleteCrsMatrix<MyTpetraCrsMatrix>(tSourceMatrix.getTpetra_CrsMatrix(),
toTpetra(RowImporter),
toTpetra(*DomainImporter), myDomainMap, myRangeMap, params);
127 bool restrictComm =
false;
128 if (!params.is_null()) restrictComm = params->get(
"Restrict Communicator", restrictComm);
129 if (restrictComm && mtx_->getRowMap().is_null()) mtx_ = Teuchos::null;
132 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
133 TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::TpetraCrsMatrix(
const Teuchos::RCP<const CrsMatrix> &sourceMatrix,
134 const Export<LocalOrdinal, GlobalOrdinal, Node> &RowExporter,
135 const Teuchos::RCP<
const Export<LocalOrdinal, GlobalOrdinal, Node>> DomainExporter,
136 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &domainMap,
137 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &rangeMap,
138 const Teuchos::RCP<Teuchos::ParameterList> ¶ms) {
139 typedef Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> MyTpetraCrsMatrix;
140 XPETRA_DYNAMIC_CAST(
const TpetraCrsMatrixClass, *sourceMatrix, tSourceMatrix,
"Xpetra::TpetraCrsMatrix constructor only accepts Xpetra::TpetraCrsMatrix as the input argument.");
141 RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> v = tSourceMatrix.getTpetra_CrsMatrix();
143 RCP<const Tpetra::Map<LocalOrdinal, GlobalOrdinal, Node>> myDomainMap = domainMap != Teuchos::null ?
toTpetra(domainMap) : Teuchos::null;
144 RCP<const Tpetra::Map<LocalOrdinal, GlobalOrdinal, Node>> myRangeMap = rangeMap != Teuchos::null ?
toTpetra(rangeMap) : Teuchos::null;
146 mtx_ = Tpetra::exportAndFillCompleteCrsMatrix<MyTpetraCrsMatrix>(tSourceMatrix.getTpetra_CrsMatrix(),
toTpetra(RowExporter),
toTpetra(*DomainExporter), myDomainMap, myRangeMap, params);
151 #ifdef HAVE_XPETRA_TPETRA
152 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
153 TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::TpetraCrsMatrix(
const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &rowMap,
154 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &colMap,
155 const local_matrix_type &lclMatrix,
156 const Teuchos::RCP<Teuchos::ParameterList> ¶ms)
157 : mtx_(Teuchos::rcp(new Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>(toTpetra(rowMap), toTpetra(colMap), lclMatrix, params))) {}
159 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
160 TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::TpetraCrsMatrix(
161 const local_matrix_type &lclMatrix,
162 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &rowMap,
163 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &colMap,
164 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &domainMap,
165 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &rangeMap,
166 const Teuchos::RCP<Teuchos::ParameterList> ¶ms)
167 : mtx_(Teuchos::rcp(new Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>(lclMatrix, toTpetra(rowMap), toTpetra(colMap), toTpetra(domainMap), toTpetra(rangeMap), params))) {}
169 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
170 TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::TpetraCrsMatrix(
171 const local_matrix_type &lclMatrix,
172 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &rowMap,
173 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &colMap,
174 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &domainMap,
175 const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node>> &rangeMap,
176 const Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node>> &importer,
177 const Teuchos::RCP<
const Export<LocalOrdinal, GlobalOrdinal, Node>> &exporter,
178 const Teuchos::RCP<Teuchos::ParameterList> ¶ms)
179 : mtx_(Teuchos::rcp(new Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>(lclMatrix, toTpetra(rowMap), toTpetra(colMap), toTpetra(domainMap), toTpetra(rangeMap), toTpetra(importer), toTpetra(exporter), params))) {}
182 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
185 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
188 mtx_->insertGlobalValues(globalRow, cols, vals);
191 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
194 mtx_->insertLocalValues(localRow, cols, vals);
197 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
200 mtx_->replaceGlobalValues(globalRow, cols, vals);
203 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
205 const ArrayView<const LocalOrdinal> &cols,
206 const ArrayView<const Scalar> &vals) {
208 typedef typename ArrayView<const LocalOrdinal>::size_type size_type;
209 const LocalOrdinal numValid =
210 mtx_->replaceLocalValues(localRow, cols, vals);
211 TEUCHOS_TEST_FOR_EXCEPTION(
212 static_cast<size_type>(numValid) != cols.size(), std::runtime_error,
213 "replaceLocalValues returned " << numValid <<
" != cols.size() = " << cols.size() <<
".");
216 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
219 mtx_->setAllToScalar(alpha);
222 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
228 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
231 rowptr.resize(getLocalNumRows() + 1);
232 colind.resize(numNonZeros);
233 values.resize(numNonZeros);
236 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
239 mtx_->setAllValues(rowptr, colind, values);
242 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
248 rowptr = Kokkos::Compat::persistingView(mtx_->getLocalRowPtrsHost());
249 colind = Kokkos::Compat::persistingView(mtx_->getLocalIndicesHost());
250 values = Teuchos::arcp_reinterpret_cast<
const Scalar>(
251 Kokkos::Compat::persistingView(mtx_->getLocalValuesHost(
255 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
260 values = Teuchos::arcp_reinterpret_cast<Scalar>(
261 Kokkos::Compat::persistingView(mtx_->getLocalValuesDevice(
265 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
268 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
271 mtx_->resumeFill(params);
274 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
280 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
283 mtx_->fillComplete(params);
286 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
290 RCP<const Tpetra::Import<LocalOrdinal, GlobalOrdinal, Node>> myImport = tImporter.getTpetra_Import();
291 mtx_->replaceDomainMapAndImporter(
toTpetra(newDomainMap), myImport);
294 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
299 const RCP<ParameterList> ¶ms) {
301 RCP<const Tpetra::Import<LocalOrdinal, GlobalOrdinal, Node>> myImport;
302 RCP<const Tpetra::Export<LocalOrdinal, GlobalOrdinal, Node>> myExport;
304 if (importer != Teuchos::null) {
306 myImport = tImporter.getTpetra_Import();
308 if (exporter != Teuchos::null) {
310 myExport = tExporter.getTpetra_Export();
313 mtx_->expertStaticFillComplete(
toTpetra(domainMap),
toTpetra(rangeMap), myImport, myExport, params);
316 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
322 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
328 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
331 return toXpetra(mtx_->getCrsGraph());
334 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
337 return mtx_->getGlobalNumRows();
340 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
343 return mtx_->getGlobalNumCols();
346 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
349 return mtx_->getLocalNumRows();
352 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
355 return mtx_->getLocalNumCols();
358 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
361 return mtx_->getGlobalNumEntries();
364 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
367 return mtx_->getLocalNumEntries();
370 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
373 return mtx_->getNumEntriesInLocalRow(localRow);
376 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
379 return mtx_->getNumEntriesInGlobalRow(globalRow);
382 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
385 return mtx_->getGlobalMaxNumRowEntries();
388 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
391 return mtx_->getLocalMaxNumRowEntries();
394 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
397 return mtx_->isLocallyIndexed();
400 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
403 return mtx_->isGloballyIndexed();
406 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
409 return mtx_->isFillComplete();
412 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
415 return mtx_->isFillActive();
418 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
421 return mtx_->getFrobeniusNorm();
424 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
427 return mtx_->supportsRowViews();
430 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
433 typename Tpetra::CrsGraph<LocalOrdinal, GlobalOrdinal, Node>::nonconst_local_inds_host_view_type indices(
"indices", Indices.size());
434 typename Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::nonconst_values_host_view_type values(
"values", Values.size());
436 mtx_->getLocalRowCopy(LocalRow, indices, values, NumEntries);
437 for (
size_t i = 0; i < NumEntries; ++i) {
438 Indices[i] = indices(i);
439 Values[i] = values(i);
443 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
446 typename Tpetra::CrsGraph<LocalOrdinal, GlobalOrdinal, Node>::nonconst_global_inds_host_view_type indices(
"indices", Indices.size());
447 typename Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::nonconst_values_host_view_type values(
"values", Values.size());
449 mtx_->getGlobalRowCopy(GlobalRow, indices, values, NumEntries);
450 for (
size_t i = 0; i < NumEntries; ++i) {
451 Indices[i] = indices(i);
452 Values[i] = values(i);
456 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
459 typename Tpetra::CrsGraph<LocalOrdinal, GlobalOrdinal, Node>::global_inds_host_view_type indices;
460 typename Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::values_host_view_type values;
462 mtx_->getGlobalRowView(GlobalRow, indices, values);
463 Indices = ArrayView<const GlobalOrdinal>(indices.data(), indices.extent(0));
464 Values = ArrayView<const Scalar>(
reinterpret_cast<const Scalar *
>(values.data()), values.extent(0));
467 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
470 typename Tpetra::CrsGraph<LocalOrdinal, GlobalOrdinal, Node>::local_inds_host_view_type indices;
471 typename Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::values_host_view_type values;
473 mtx_->getLocalRowView(LocalRow, indices, values);
474 Indices = ArrayView<const LocalOrdinal>(indices.data(), indices.extent(0));
475 Values = ArrayView<const Scalar>(
reinterpret_cast<const Scalar *
>(values.data()), values.extent(0));
478 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
484 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
485 void TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::apply(
const MultiVector &X,
MultiVector &Y, Teuchos::ETransp mode, Scalar alpha, Scalar beta,
bool sumInterfaceValues,
const RCP<
Import<LocalOrdinal, GlobalOrdinal, Node>> ®ionInterfaceImporter,
const Teuchos::ArrayRCP<LocalOrdinal> ®ionInterfaceLIDs)
const {
487 RCP<const Map<LocalOrdinal, GlobalOrdinal, Node>> regionInterfaceMap = regionInterfaceImporter->getTargetMap();
489 if (sumInterfaceValues) {
493 matvecInterfaceTmp->doImport(Y, *regionInterfaceImporter,
INSERT);
498 ArrayRCP<Scalar> interfaceData = matvecInterfaceTmp->getDataNonConst(0);
499 for (LocalOrdinal interfaceIdx = 0; interfaceIdx < static_cast<LocalOrdinal>(interfaceData.size()); ++interfaceIdx) {
500 YData[regionInterfaceLIDs[interfaceIdx]] += interfaceData[interfaceIdx];
505 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
508 return toXpetra(mtx_->getDomainMap());
511 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
514 return toXpetra(mtx_->getRangeMap());
517 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
520 return mtx_->description();
523 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
526 mtx_->describe(out, verbLevel);
529 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
532 Teuchos::LabeledObject::setObjectLabel(objectLabel);
533 mtx_->setObjectLabel(objectLabel);
536 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
538 : mtx_(Teuchos::rcp(new Tpetra::
CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>(*(matrix.mtx_), Teuchos::Copy))) {}
540 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
544 mtx_->getLocalDiagCopy(*tDiag.getTpetra_Vector());
547 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
550 mtx_->getLocalDiagOffsets(offsets);
553 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
556 mtx_->getLocalDiagCopy(*(
toTpetra(diag)), offsets);
559 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
562 mtx_->getLocalDiagCopy(*(
toTpetra(diag)), offsets);
565 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
568 Tpetra::replaceDiagonalCrsMatrix(*mtx_, *(
toTpetra(diag)));
571 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
577 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
583 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
589 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
595 RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> v = tSource.getTpetra_CrsMatrix();
601 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
607 RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> v = tDest.getTpetra_CrsMatrix();
611 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
617 RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> v = tSource.getTpetra_CrsMatrix();
621 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
627 RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> v = tDest.getTpetra_CrsMatrix();
631 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
634 mtx_->removeEmptyProcessesInPlace(
toTpetra(newMap));
637 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
639 return !mtx_.is_null();
642 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
646 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
650 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
654 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
669 #endif // XPETRA_TPETRACRSMATRIX_DEF_HPP
void replaceDiag(const Vector &diag)
Replace the diagonal entries of the matrix.
void leftScale(const Vector &x)
Left scale operator with given vector values.
static Teuchos::RCP< MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Build(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node >> &map, size_t NumVectors, bool zeroOut=true)
Constructor specifying the number of non-zeros for all rows.
constexpr struct ReadOnlyStruct ReadOnly
void getLocalDiagOffsets(Teuchos::ArrayRCP< size_t > &offsets) const
Get offsets of the diagonal entries in the matrix.
void removeEmptyProcessesInPlace(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &newMap)
void getLocalDiagCopy(Vector &diag) const
Get a copy of the diagonal entries owned by this node, with local row indices.
bool haveGlobalConstants() const
Returns true if globalConstants have been computed; false otherwise.
void residual(const MultiVector &X, const MultiVector &B, MultiVector &R) const
Compute a residual R = B - (*this) * X.
Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getMap() const
Implements DistObject interface.
void doExport(const DistObject< char, LocalOrdinal, GlobalOrdinal, Node > &dest, const Import< LocalOrdinal, GlobalOrdinal, Node > &importer, CombineMode CM)
Export.
RCP< const Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > toTpetra(const RCP< const CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > &graph)
#define XPETRA_DYNAMIC_CAST(type, obj, newObj, exceptionMsg)
virtual Teuchos::ArrayRCP< Scalar > getDataNonConst(size_t j)=0
View of the local values in a particular vector of this multivector.
size_t global_size_t
Global size_t object.
TpetraCrsMatrix(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rowMap, size_t maxNumEntriesPerRow, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Constructor specifying fixed number of entries for each row.
RCP< const Tpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getTpetra_CrsMatrix() const
Get the underlying Tpetra matrix.
RCP< Tpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getTpetra_CrsMatrixNonConst() const
Get the underlying Tpetra matrix.
bool hasMatrix() const
Does this have an underlying matrix.
CombineMode
Xpetra::Combine Mode enumerable type.
constexpr struct ReadWriteStruct ReadWrite
#define XPETRA_MONITOR(funcName)
void doImport(const DistObject< char, LocalOrdinal, GlobalOrdinal, Node > &source, const Import< LocalOrdinal, GlobalOrdinal, Node > &importer, CombineMode CM)
Import.
void rightScale(const Vector &x)
Right scale operator with given vector values.
RCP< const CrsGraph< int, GlobalOrdinal, Node > > toXpetra(const Epetra_CrsGraph &g)