10 #ifndef XPETRA_EPETRACRSMATRIX_HPP
11 #define XPETRA_EPETRACRSMATRIX_HPP
15 #ifdef HAVE_XPETRA_TPETRA
16 #include <Kokkos_Core.hpp>
23 #include <Epetra_CrsMatrix.h>
24 #include <Epetra_Map.h>
31 #include "Xpetra_MapFactory.hpp"
36 #if defined(XPETRA_ENABLE_DEPRECATED_CODE)
38 #if defined(Xpetra_SHOW_DEPRECATED_WARNINGS)
39 #warning "The header file Trilinos/packages/xpetra/src/CrsMatrix/Xpetra_EpetraCrsMatrix.hpp is deprecated."
43 #error "The header file Trilinos/packages/xpetra/src/CrsMatrix/Xpetra_EpetraCrsMatrix.hpp is deprecated."
49 template <
class EpetraGlobalOrdinal,
class Node>
51 :
public CrsMatrix<double, int, EpetraGlobalOrdinal, Node> {
56 #ifdef HAVE_XPETRA_TPETRA
64 "Xpetra::EpetraCrsMatrix only available for GO=int or GO=long long with EpetraNode (Serial or OpenMP depending on configuration)");
68 "Xpetra::EpetraCrsMatrix only available for GO=int or GO=long long with EpetraNode (Serial or OpenMP depending on configuration)");
77 const Teuchos::RCP<Teuchos::ParameterList> ¶ms = Teuchos::null) {
79 "Xpetra::EpetraCrsMatrix only available for GO=int or GO=long long with EpetraNode (Serial or OpenMP depending on configuration)");
85 const Teuchos::RCP<Teuchos::ParameterList> ¶ms = Teuchos::null) {
87 "Xpetra::EpetraCrsMatrix only available for GO=int or GO=long long with EpetraNode (Serial or OpenMP depending on configuration)");
94 const Teuchos::RCP<Teuchos::ParameterList> ¶ms) {
96 "Xpetra::EpetraCrsMatrix only available for GO=int or GO=long long with EpetraNode (Serial or OpenMP depending on configuration)");
103 const Teuchos::RCP<Teuchos::ParameterList> ¶ms) {
105 "Xpetra::EpetraCrsMatrix only available for GO=int or GO=long long with EpetraNode (Serial or OpenMP depending on configuration)");
107 #ifdef HAVE_XPETRA_TPETRA
111 const Teuchos::RCP<Teuchos::ParameterList> ¶ms = null) {
113 "Xpetra::EpetraCrsMatrix only available for GO=int or GO=long long with EpetraNode (Serial or OpenMP depending on configuration)");
121 const Teuchos::RCP<Teuchos::ParameterList> ¶ms = null) {
123 "Xpetra::EpetraCrsMatrix only available for GO=int or GO=long long with EpetraNode (Serial or OpenMP depending on configuration)");
134 void allocateAllValues(
size_t numNonZeros, ArrayRCP<size_t> &rowptr, ArrayRCP<LocalOrdinal> &colind, ArrayRCP<Scalar> &values) {}
135 void setAllValues(
const ArrayRCP<size_t> &rowptr,
const ArrayRCP<LocalOrdinal> &colind,
const ArrayRCP<Scalar> &values) {}
136 void getAllValues(ArrayRCP<const size_t> &rowptr, ArrayRCP<const LocalOrdinal> &colind, ArrayRCP<const Scalar> &values)
const {}
143 const RCP<ParameterList> ¶ms = Teuchos::null) {}
149 const RCP<const Comm<int> >
getComm()
const {
return Teuchos::null; }
150 const RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >
getRowMap()
const {
return Teuchos::null; }
151 const RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >
getColMap()
const {
return Teuchos::null; }
152 RCP<const CrsGraph<LocalOrdinal, GlobalOrdinal, Node> >
getCrsGraph()
const {
return Teuchos::null; }
167 typename ScalarTraits<Scalar>::magnitudeType
getFrobeniusNorm()
const {
return ScalarTraits<Scalar>::magnitude(ScalarTraits<Scalar>::zero()); }
181 void apply(
const MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &X,
MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &Y, Teuchos::ETransp mode = Teuchos::NO_TRANS,
Scalar alpha = ScalarTraits<Scalar>::one(),
Scalar beta = ScalarTraits<Scalar>::zero())
const {}
182 void apply(
const MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &X,
MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &Y, Teuchos::ETransp mode,
Scalar alpha,
Scalar beta,
bool sumInterfaceValues,
const RCP<
Import<LocalOrdinal, GlobalOrdinal, Node> > ®ionInterfaceImporter,
const Teuchos::ArrayRCP<LocalOrdinal> ®ionInterfaceLIDs)
const {}
183 const RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >
getDomainMap()
const {
return Teuchos::null; }
184 const RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >
getRangeMap()
const {
return Teuchos::null; }
187 void describe(Teuchos::FancyOStream &out,
const Teuchos::EVerbosityLevel verbLevel = Teuchos::Describable::verbLevel_default)
const {}
192 "Xpetra::EpetraCrsMatrix only available for GO=int or GO=long long with EpetraNode (Serial or OpenMP depending on configuration)");
195 Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >
getMap()
const {
return Teuchos::null; }
205 "Xpetra::EpetraCrsMatrix only available for GO=int or GO=long long with EpetraNode (Serial or OpenMP depending on configuration)");
209 #ifdef HAVE_XPETRA_TPETRA
212 "Xpetra::EpetraCrsMatrix only available for GO=int or GO=long long with EpetraNode (Serial or OpenMP depending on configuration)");
214 #if KOKKOS_VERSION >= 40799
215 typename local_matrix_type::host_mirror_type getLocalMatrixHost()
const {
220 "Xpetra::EpetraCrsMatrix only available for GO=int or GO=long long with EpetraNode (Serial or OpenMP depending on configuration)");
225 const typename local_matrix_type::StaticCrsGraphType::entries_type::non_const_type &ind,
226 const typename local_matrix_type::values_type &val) {
228 "Xpetra::EpetraCrsMatrix only available for GO=int or GO=long long with EpetraNode (Serial or OpenMP depending on configuration)");
235 #warning "Xpetra Kokkos interface for CrsMatrix is enabled (HAVE_XPETRA_KOKKOS_REFACTOR) but Tpetra is disabled. The Kokkos interface needs Tpetra to be enabled, too."
242 Scalar one = Teuchos::ScalarTraits<Scalar>::one(), negone = -one;
249 #ifndef XPETRA_EPETRA_NO_32BIT_GLOBAL_INDICES
252 :
public CrsMatrix<double, int, int, EpetraNode> {
259 #ifdef HAVE_XPETRA_TPETRA
271 , isFillResumed_(false) {}
276 , isFillResumed_(false) {}
280 : isFillResumed_(false) {
281 Teuchos::Array<int> numEntriesPerRowToAlloc(NumEntriesPerRowToAlloc.begin(), NumEntriesPerRowToAlloc.end());
282 mtx_ = Teuchos::rcp(
new Epetra_CrsMatrix(Copy, toEpetra<GlobalOrdinal, Node>(rowMap), numEntriesPerRowToAlloc.getRawPtr(),
true));
288 , isFillResumed_(false) {}
292 : isFillResumed_(false) {
293 Teuchos::Array<int> numEntriesPerRowToAlloc(NumEntriesPerRowToAlloc.begin(), NumEntriesPerRowToAlloc.end());
294 mtx_ = Teuchos::rcp(
new Epetra_CrsMatrix(Copy, toEpetra<GlobalOrdinal, Node>(rowMap), toEpetra<GlobalOrdinal, Node>(colMap), numEntriesPerRowToAlloc.getRawPtr(),
true));
300 , isFillResumed_(false) {}
307 const Teuchos::RCP<Teuchos::ParameterList> ¶ms = Teuchos::null)
308 : isFillResumed_(false) {
312 const Epetra_Map *myDomainMap = (domainMap != Teuchos::null) ? &toEpetra<GlobalOrdinal, Node>(domainMap) : 0;
313 const Epetra_Map *myRangeMap = (rangeMap != Teuchos::null) ? &toEpetra<GlobalOrdinal, Node>(rangeMap) : 0;
316 bool restrictComm =
false;
317 if (!params.is_null()) restrictComm = params->get(
"Restrict Communicator", restrictComm);
318 mtx_ = Teuchos::rcp(
new Epetra_CrsMatrix(*tSourceMatrix.getEpetra_CrsMatrix(), *tImporter.getEpetra_Import(), myDomainMap, myRangeMap, restrictComm));
319 if (restrictComm && mtx_->NumMyRows() == 0)
320 mtx_ = Teuchos::null;
328 const Teuchos::RCP<Teuchos::ParameterList> ¶ms = Teuchos::null)
329 : isFillResumed_(false) {
333 const Epetra_Map *myDomainMap = (domainMap != Teuchos::null) ? &toEpetra<GlobalOrdinal, Node>(domainMap) : 0;
334 const Epetra_Map *myRangeMap = (rangeMap != Teuchos::null) ? &toEpetra<GlobalOrdinal, Node>(rangeMap) : 0;
337 bool restrictComm =
false;
338 if (!params.is_null()) restrictComm = params->get(
"Restrict Communicator", restrictComm);
340 mtx_ = Teuchos::rcp(
new Epetra_CrsMatrix(*tSourceMatrix.getEpetra_CrsMatrix(), *tExporter.getEpetra_Export(), myDomainMap, myRangeMap, restrictComm));
348 const Teuchos::RCP<Teuchos::ParameterList> ¶ms)
349 : isFillResumed_(false) {
354 const Epetra_Map *myDomainMap = (domainMap != Teuchos::null) ? &toEpetra<GlobalOrdinal, Node>(domainMap) : 0;
355 const Epetra_Map *myRangeMap = (rangeMap != Teuchos::null) ? &toEpetra<GlobalOrdinal, Node>(rangeMap) : 0;
358 bool restrictComm =
false;
359 if (!params.is_null()) restrictComm = params->get(
"Restrict Communicator", restrictComm);
360 mtx_ = Teuchos::rcp(
new Epetra_CrsMatrix(*tSourceMatrix.getEpetra_CrsMatrix(), *tImporter.getEpetra_Import(), tdImporter->getEpetra_Import().get(), myDomainMap, myRangeMap, restrictComm));
361 if (restrictComm && mtx_->NumMyRows() == 0)
362 mtx_ = Teuchos::null;
370 const Teuchos::RCP<Teuchos::ParameterList> ¶ms)
371 : isFillResumed_(false) {
376 const Epetra_Map *myDomainMap = (domainMap != Teuchos::null) ? &toEpetra<GlobalOrdinal, Node>(domainMap) : 0;
377 const Epetra_Map *myRangeMap = (rangeMap != Teuchos::null) ? &toEpetra<GlobalOrdinal, Node>(rangeMap) : 0;
380 bool restrictComm =
false;
381 if (!params.is_null()) restrictComm = params->get(
"Restrict Communicator", restrictComm);
383 mtx_ = Teuchos::rcp(
new Epetra_CrsMatrix(*tSourceMatrix.getEpetra_CrsMatrix(), *tExporter.getEpetra_Export(), tdExporter->getEpetra_Export().get(), myDomainMap, myRangeMap, restrictComm));
386 #ifdef HAVE_XPETRA_TPETRA
413 const Teuchos::RCP<Teuchos::ParameterList> ¶ms = null)
414 :
EpetraCrsMatrixT(lclMatrix, rowMap, colMap, Teuchos::null, Teuchos::null, params) {}
422 const Teuchos::RCP<Teuchos::ParameterList> ¶ms = null) {
425 typedef typename local_matrix_type::value_type value_type;
426 typedef typename local_matrix_type::ordinal_type ordinal_type;
429 ordinal_type lclNumRows = lclMatrix.numRows();
430 ordinal_type lclNumCols = lclMatrix.numCols();
434 "Xpetra::EpetraCrsMatrixT: number of rows in local matrix and number of local entries in row map do not match!");
436 "Xpetra::EpetraCrsMatrixT: number of columns in local matrix and number of local entries in column map do not match!");
438 Teuchos::ArrayRCP<size_t> NumEntriesPerRowToAlloc(lclNumRows);
439 for (ordinal_type r = 0; r < lclNumRows; ++r) {
441 auto rowview = lclMatrix.row(r);
442 NumEntriesPerRowToAlloc[r] = rowview.length;
446 isFillResumed_ =
false;
447 Teuchos::Array<int> numEntriesPerRowToAlloc(NumEntriesPerRowToAlloc.begin(), NumEntriesPerRowToAlloc.end());
448 mtx_ = Teuchos::rcp(
new Epetra_CrsMatrix(Copy, toEpetra<GlobalOrdinal, Node>(rowMap), toEpetra<GlobalOrdinal, Node>(colMap), numEntriesPerRowToAlloc.getRawPtr(),
true));
451 for (ordinal_type r = 0; r < lclNumRows; ++r) {
453 auto rowview = lclMatrix.row(r);
456 Teuchos::ArrayRCP<ordinal_type> indout(rowview.length, Teuchos::ScalarTraits<ordinal_type>::zero());
457 Teuchos::ArrayRCP<value_type> valout(rowview.length, Teuchos::ScalarTraits<value_type>::zero());
459 for (ordinal_type c = 0; c < rowview.length; c++) {
460 value_type value = rowview.value(c);
461 ordinal_type colidx = rowview.colidx(c);
464 "Xpetra::EpetraCrsMatrixT: local matrix contains column elements which are not in the provided column map!");
469 insertLocalValues(r, indout.view(0, indout.size()), valout.view(0, valout.size()));
473 if (!domainMap.is_null() && !rangeMap.is_null())
474 this->fillComplete(domainMap, rowMap, params);
476 this->fillComplete(rowMap, rowMap, params);
491 XPETRA_ERR_CHECK(mtx_->InsertGlobalValues(globalRow, vals.size(), vals.getRawPtr(), cols.getRawPtr()));
497 XPETRA_ERR_CHECK(mtx_->InsertMyValues(localRow, vals.size(), vals.getRawPtr(), cols.getRawPtr()));
505 const std::string tfecfFuncName(
"replaceGlobalValues");
506 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(!isFillActive(), std::runtime_error,
507 ": Fill must be active in order to call this method. If you have already "
508 "called fillComplete(), you need to call resumeFill() before you can "
511 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(values.size() != indices.size(),
512 std::runtime_error,
": values.size() must equal indices.size().");
515 XPETRA_ERR_CHECK(mtx_->ReplaceGlobalValues(globalRow, indices.size(), values.getRawPtr(), indices.getRawPtr()));
523 const std::string tfecfFuncName(
"replaceLocalValues");
524 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(!isFillActive(), std::runtime_error,
525 ": Fill must be active in order to call this method. If you have already "
526 "called fillComplete(), you need to call resumeFill() before you can "
529 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(values.size() != indices.size(),
530 std::runtime_error,
": values.size() must equal indices.size().");
533 XPETRA_ERR_CHECK(mtx_->ReplaceMyValues(localRow, indices.size(), values.getRawPtr(), indices.getRawPtr()));
539 mtx_->PutScalar(alpha);
550 void allocateAllValues(
size_t numNonZeros, ArrayRCP<size_t> &rowptr, ArrayRCP<LocalOrdinal> &colind, ArrayRCP<Scalar> &values) {
558 rowptr.resize(getLocalNumRows() + 1);
561 bool ownMemory =
false;
565 Epetra_IntSerialDenseVector &myColind = mtx_->ExpertExtractIndices();
566 myColind.Resize(numNonZeros);
567 colind = Teuchos::arcp(myColind.Values(), lowerOffset, numNonZeros, ownMemory);
571 double *&myValues = mtx_->ExpertExtractValues();
573 myValues =
new double[numNonZeros];
574 values = Teuchos::arcp(myValues, lowerOffset, numNonZeros, ownMemory);
578 void setAllValues(
const ArrayRCP<size_t> &rowptr,
const ArrayRCP<LocalOrdinal> &colind,
const ArrayRCP<Scalar> &values) {
583 "An exception is thrown to let you know that the size of your rowptr array is incorrect.");
585 "An exception is thrown to let you know that you mismatched your pointers.");
588 if (values.size() > 0) {
590 "An exception is thrown to let you know that you mismatched your pointers.");
592 "An exception is thrown to let you know that you mismatched your pointers.");
597 const size_t N = getLocalNumRows();
599 Epetra_IntSerialDenseVector &myRowptr = mtx_->ExpertExtractIndexOffset();
600 myRowptr.Resize(N + 1);
601 for (
size_t i = 0; i < N + 1; i++)
602 myRowptr[i] = Teuchos::as<int>(rowptr[i]);
606 void getAllValues(ArrayRCP<const size_t> &rowptr, ArrayRCP<const LocalOrdinal> &colind, ArrayRCP<const Scalar> &values)
const {
610 bool ownMemory =
false;
612 const size_t n = getLocalNumRows();
613 const size_t nnz = getLocalNumEntries();
617 Epetra_IntSerialDenseVector &myRowptr = mtx_->ExpertExtractIndexOffset();
618 rowptr.resize(n + 1);
619 for (
size_t i = 0; i < n + 1; i++)
620 (*const_cast<size_t *>(&rowptr[i])) = Teuchos::as<size_t>(myRowptr[i]);
623 colind = Teuchos::arcp(mtx_->ExpertExtractIndices().Values(), lowerOffset, nnz, ownMemory);
626 values = Teuchos::arcp(mtx_->ExpertExtractValues(), lowerOffset, nnz, ownMemory);
634 bool ownMemory =
false;
636 const size_t nnz = getLocalNumEntries();
638 values = Teuchos::arcp(mtx_->ExpertExtractValues(), lowerOffset, nnz, ownMemory);
649 const RCP<ParameterList> & = Teuchos::null) {
653 isFillResumed_ =
false;
656 const Epetra_Import *myimport = 0;
657 const Epetra_Export *myexport = 0;
659 if (!importer.is_null()) {
661 myimport = eImporter.getEpetra_Import().getRawPtr();
663 if (!exporter.is_null()) {
665 myexport = eExporter.getEpetra_Export().getRawPtr();
668 rv = mtx_->ExpertStaticFillComplete(toEpetra<GlobalOrdinal, Node>(domainMap), toEpetra<GlobalOrdinal, Node>(rangeMap), myimport, myexport);
670 TEUCHOS_TEST_FOR_EXCEPTION(rv != 0, std::runtime_error,
"Xpetra::EpetraCrsMatrixT::expertStaticFillComplete FAILED!");
678 void resumeFill(
const RCP<ParameterList> & = Teuchos::null) {
682 isFillResumed_ =
true;
690 isFillResumed_ =
false;
692 bool doOptimizeStorage =
true;
693 if (params != null && params->get(
"Optimize Storage",
true) ==
false) doOptimizeStorage =
false;
694 mtx_->FillComplete(toEpetra<GlobalOrdinal, Node>(domainMap), toEpetra<GlobalOrdinal, Node>(rangeMap), doOptimizeStorage);
702 if (isFillResumed_ ==
true) {
703 isFillResumed_ =
false;
707 bool doOptimizeStorage =
true;
708 if (params != null && params->get(
"Optimize Storage",
true) ==
false) doOptimizeStorage =
false;
709 mtx_->FillComplete(doOptimizeStorage);
717 const RCP<const Epetra_Import> &myImport = eImporter.getEpetra_Import();
719 if (myImport == Teuchos::null)
720 rv = mtx_->ReplaceDomainMapAndImporter(toEpetra<GlobalOrdinal, Node>(newDomainMap), 0);
722 rv = mtx_->ReplaceDomainMapAndImporter(toEpetra<GlobalOrdinal, Node>(newDomainMap), &*myImport);
723 TEUCHOS_TEST_FOR_EXCEPTION(rv != 0, std::runtime_error,
"Xpetra::EpetraCrsMatrixT::replaceDomainMapAndImporter FAILED!");
738 const RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >
getRowMap()
const {
740 return toXpetra<GlobalOrdinal, Node>(mtx_->RowMap());
744 const RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >
getColMap()
const {
746 return toXpetra<GlobalOrdinal, Node>(mtx_->ColMap());
750 RCP<const CrsGraph<LocalOrdinal, GlobalOrdinal, Node> >
getCrsGraph()
const {
752 return toXpetra<GlobalOrdinal, Node>(mtx_->Graph());
758 return mtx_->NumGlobalRows64();
764 return mtx_->NumGlobalCols64();
770 return mtx_->NumMyRows();
776 return mtx_->NumMyCols();
782 return mtx_->NumGlobalNonzeros64();
788 return mtx_->NumMyNonzeros();
794 return mtx_->NumMyEntries(localRow);
800 return mtx_->NumGlobalEntries(globalRow);
806 return mtx_->GlobalMaxNumEntries();
812 return mtx_->MaxNumEntries();
818 return mtx_->IndicesAreLocal();
824 return mtx_->IndicesAreGlobal();
833 return mtx_->Filled();
839 return !isFillComplete();
845 return mtx_->NormFrobenius();
859 XPETRA_ERR_CHECK(mtx_->ExtractMyRowCopy(LocalRow, Indices.size(), numEntries, Values.getRawPtr(), Indices.getRawPtr()));
860 NumEntries = numEntries;
868 XPETRA_ERR_CHECK(mtx_->ExtractGlobalRowCopy(GlobalRow, Indices.size(), numEntries, Values.getRawPtr(), Indices.getRawPtr()));
869 NumEntries = numEntries;
880 XPETRA_ERR_CHECK(mtx_->ExtractGlobalRowView(GlobalRow, numEntries, eValues, eIndices));
881 if (numEntries == 0) {
886 indices = ArrayView<const GlobalOrdinal>(eIndices, numEntries);
887 values = ArrayView<const double>(eValues, numEntries);
898 XPETRA_ERR_CHECK(mtx_->ExtractMyRowView(LocalRow, numEntries, eValues, eIndices));
899 if (numEntries == 0) {
904 indices = ArrayView<const int>(eIndices, numEntries);
905 values = ArrayView<const double>(eValues, numEntries);
911 XPETRA_ERR_CHECK(mtx_->ExtractDiagonalCopy(toEpetra<GlobalOrdinal, Node>(diag)));
931 mtx_->ReplaceDiagonalValues(toEpetra<GlobalOrdinal, Node>(diag));
947 void apply(
const MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &X,
MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &Y, Teuchos::ETransp mode = Teuchos::NO_TRANS,
Scalar alpha = ScalarTraits<Scalar>::one(),
Scalar beta = ScalarTraits<Scalar>::zero())
const {
955 TEUCHOS_TEST_FOR_EXCEPTION((mode != Teuchos::NO_TRANS) && (mode != Teuchos::TRANS),
Xpetra::Exceptions::NotImplemented,
"Xpetra::EpetraCrsMatrixT->apply() only accept mode == NO_TRANS or mode == TRANS");
959 TEUCHOS_TEST_FOR_EXCEPTION(mtx_->UseTranspose(),
Xpetra::Exceptions::NotImplemented,
"An exception is throw to let you know that Xpetra::EpetraCrsMatrixT->apply() do not take into account the UseTranspose() parameter of Epetra_CrsMatrix.");
961 RCP<Epetra_MultiVector> epY = eY.getEpetra_MultiVector();
964 RCP<Epetra_MultiVector> tmp = Teuchos::rcp(
new Epetra_MultiVector(*epY));
966 XPETRA_ERR_CHECK(mtx_->Multiply(eTrans, *eX.getEpetra_MultiVector(), *tmp));
973 void apply(
const MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &X,
MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &Y, Teuchos::ETransp mode,
Scalar alpha,
Scalar beta,
bool sumInterfaceValues,
const RCP<
Import<LocalOrdinal, GlobalOrdinal, Node> > ®ionInterfaceImporter,
const Teuchos::ArrayRCP<LocalOrdinal> ®ionInterfaceLIDs)
const {
978 const RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >
getDomainMap()
const {
980 return toXpetra<GlobalOrdinal, Node>(mtx_->DomainMap());
984 const RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >
getRangeMap()
const {
986 return toXpetra<GlobalOrdinal, Node>(mtx_->RangeMap());
999 std::ostringstream oss;
1001 if (isFillComplete()) {
1002 oss <<
"{status = fill complete"
1003 <<
", global rows = " << getGlobalNumRows()
1004 <<
", global cols = " << getGlobalNumCols()
1005 <<
", global num entries = " << getGlobalNumEntries()
1008 oss <<
"{status = fill not complete"
1009 <<
", global rows = " << getGlobalNumRows()
1016 void describe(Teuchos::FancyOStream &out,
const Teuchos::EVerbosityLevel verbLevel = Teuchos::Describable::verbLevel_default)
const {
1022 using Teuchos::VERB_DEFAULT;
1023 using Teuchos::VERB_EXTREME;
1024 using Teuchos::VERB_HIGH;
1025 using Teuchos::VERB_LOW;
1026 using Teuchos::VERB_MEDIUM;
1027 using Teuchos::VERB_NONE;
1028 Teuchos::EVerbosityLevel vl = verbLevel;
1029 if (vl == VERB_DEFAULT) vl = VERB_LOW;
1030 RCP<const Comm<int> > comm = this->getComm();
1031 const int myImageID = comm->getRank(),
1032 numImages = comm->getSize();
1034 for (
size_t dec = 10; dec < getGlobalNumRows(); dec *= 10) {
1037 width = std::max<size_t>(width, 11) + 2;
1038 Teuchos::OSTab tab(out);
1046 if (vl != VERB_NONE) {
1047 if (myImageID == 0) out << this->description() << std::endl;
1049 if (isFillComplete() && myImageID == 0) {
1050 out <<
"Global max number of entries = " << getGlobalMaxNumRowEntries() << std::endl;
1053 if (vl == VERB_MEDIUM || vl == VERB_HIGH || vl == VERB_EXTREME) {
1054 if (myImageID == 0) out <<
"\nRow map: " << std::endl;
1055 getRowMap()->describe(out, vl);
1057 if (getColMap() != null) {
1058 if (getColMap() == getRowMap()) {
1059 if (myImageID == 0) out <<
"\nColumn map is row map.";
1061 if (myImageID == 0) out <<
"\nColumn map: " << std::endl;
1062 getColMap()->describe(out, vl);
1065 if (getDomainMap() != null) {
1066 if (getDomainMap() == getRowMap()) {
1067 if (myImageID == 0) out <<
"\nDomain map is row map.";
1068 }
else if (getDomainMap() == getColMap()) {
1069 if (myImageID == 0) out <<
"\nDomain map is row map.";
1071 if (myImageID == 0) out <<
"\nDomain map: " << std::endl;
1072 getDomainMap()->describe(out, vl);
1075 if (getRangeMap() != null) {
1076 if (getRangeMap() == getDomainMap()) {
1077 if (myImageID == 0) out <<
"\nRange map is domain map." << std::endl;
1078 }
else if (getRangeMap() == getRowMap()) {
1079 if (myImageID == 0) out <<
"\nRange map is row map." << std::endl;
1081 if (myImageID == 0) out <<
"\nRange map: " << std::endl;
1082 getRangeMap()->describe(out, vl);
1085 if (myImageID == 0) out << std::endl;
1088 if (vl == VERB_MEDIUM || vl == VERB_HIGH || vl == VERB_EXTREME) {
1089 for (
int imageCtr = 0; imageCtr < numImages; ++imageCtr) {
1090 if (myImageID == imageCtr) {
1091 out <<
"Node ID = " << imageCtr << std::endl;
1104 out <<
"Node number of entries = " << getLocalNumEntries() << std::endl;
1105 out <<
"Node max number of entries = " << getLocalMaxNumRowEntries() << std::endl;
1113 if (vl == VERB_HIGH || vl == VERB_EXTREME) {
1114 for (
int imageCtr = 0; imageCtr < numImages; ++imageCtr) {
1115 if (myImageID == imageCtr) {
1116 out << std::setw(width) <<
"Node ID"
1117 << std::setw(width) <<
"Global Row"
1118 << std::setw(width) <<
"Num Entries";
1119 if (vl == VERB_EXTREME) {
1120 out << std::setw(width) <<
"(Index,Value)";
1123 for (
size_t r = 0; r < getLocalNumRows(); ++r) {
1124 const size_t nE = getNumEntriesInLocalRow(r);
1126 out << std::setw(width) << myImageID
1127 << std::setw(width) << gid
1128 << std::setw(width) << nE;
1129 if (vl == VERB_EXTREME) {
1130 if (isGloballyIndexed()) {
1131 ArrayView<const GlobalOrdinal> rowinds;
1132 ArrayView<const Scalar> rowvals;
1133 getGlobalRowView(gid, rowinds, rowvals);
1134 for (
size_t j = 0; j < nE; ++j) {
1135 out <<
" (" << rowinds[j]
1136 <<
", " << rowvals[j]
1139 }
else if (isLocallyIndexed()) {
1140 ArrayView<const LocalOrdinal> rowinds;
1141 ArrayView<const Scalar> rowvals;
1142 getLocalRowView(r, rowinds, rowvals);
1143 for (
size_t j = 0; j < nE; ++j) {
1144 out <<
" (" << getColMap()->getGlobalElement(rowinds[j])
1145 <<
", " << rowvals[j]
1162 Teuchos::LabeledObject::setObjectLabel(objectLabel);
1163 mtx_->SetLabel(objectLabel.c_str());
1169 : mtx_(Teuchos::rcp(new Epetra_CrsMatrix(*(matrix.mtx_))))
1170 , isFillResumed_(false) {}
1176 Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >
getMap()
const {
1178 return toXpetra<GlobalOrdinal, Node>(mtx_->Map());
1189 RCP<const Epetra_CrsMatrix> v = tSource.getEpetra_CrsMatrix();
1190 int err = mtx_->Import(*v, *tImporter.getEpetra_Import(),
toEpetra(CM));
1191 TEUCHOS_TEST_FOR_EXCEPTION(err != 0, std::runtime_error,
"Catch error code returned by Epetra.");
1202 RCP<const Epetra_CrsMatrix> v = tDest.getEpetra_CrsMatrix();
1203 int err = mtx_->Export(*v, *tImporter.getEpetra_Import(),
toEpetra(CM));
1204 TEUCHOS_TEST_FOR_EXCEPTION(err != 0, std::runtime_error,
"Catch error code returned by Epetra.");
1215 RCP<const Epetra_CrsMatrix> v = tSource.getEpetra_CrsMatrix();
1216 int err = mtx_->Import(*v, *tExporter.getEpetra_Export(),
toEpetra(CM));
1217 TEUCHOS_TEST_FOR_EXCEPTION(err != 0, std::runtime_error,
"Catch error code returned by Epetra.");
1228 RCP<const Epetra_CrsMatrix> v = tDest.getEpetra_CrsMatrix();
1229 int err = mtx_->Export(*v, *tExporter.getEpetra_Export(),
toEpetra(CM));
1230 TEUCHOS_TEST_FOR_EXCEPTION(err != 0, std::runtime_error,
"Caught nonzero error code " + std::to_string(err) +
" returned by Epetra.");
1235 const Epetra_Map *newMapEpetra = (!newMap.is_null()) ? &toEpetra<GlobalOrdinal, Node>(newMap) : 0;
1236 int err = mtx_->RemoveEmptyProcessesInPlace(newMapEpetra);
1237 TEUCHOS_TEST_FOR_EXCEPTION(err != 0, std::runtime_error,
"Caught nonzero error code " + std::to_string(err) +
" returned by Epetra.");
1251 , isFillResumed_(false) {}
1259 #ifdef HAVE_XPETRA_TPETRA
1265 "Xpetra::EpetraCrsMatrx only available on host for GO=int or GO=long long with EpetraNode (Serial or OpenMP depending on configuration)");
1268 return getLocalMatrixHost();
1271 #if KOKKOS_VERSION >= 40799
1272 typename local_matrix_type::host_mirror_type getLocalMatrixHost()
const {
1276 RCP<Epetra_CrsMatrix> matrix = getEpetra_CrsMatrixNonConst();
1278 const int numRows = matrix->NumMyRows();
1279 const int numCols = matrix->NumMyCols();
1280 const int nnz = matrix->NumMyNonzeros();
1285 int rv = matrix->ExtractCrsDataPointers(rowptr, colind, vals);
1286 TEUCHOS_TEST_FOR_EXCEPTION(rv, std::runtime_error,
"Xpetra::CrsMatrix<>::getLocalMatrix: failed in ExtractCrsDataPointers");
1289 typename local_matrix_type::row_map_type::non_const_type kokkosRowPtr(Kokkos::ViewAllocateWithoutInitializing(
"local row map"), numRows + 1);
1290 for (
size_t i = 0; i < kokkosRowPtr.size(); i++)
1291 kokkosRowPtr(i) = Teuchos::asSafe<typename local_matrix_type::row_map_type::value_type>(rowptr[i]);
1294 typename local_matrix_type::index_type kokkosColind(colind, nnz);
1295 typename local_matrix_type::values_type kokkosVals(vals, nnz);
1303 const typename local_matrix_type::StaticCrsGraphType::entries_type::non_const_type &ind,
1304 const typename local_matrix_type::values_type &val) {
1307 "An exception is thrown to let you know that the size of your rowptr array is incorrect.");
1309 "An exception is thrown to let you know that you mismatched your pointers.");
1312 if (val.size() > 0) {
1313 std::cout << ind.data() <<
" " << mtx_->ExpertExtractIndices().Values() << std::endl;
1315 "An exception is thrown to let you know that you mismatched your pointers.");
1317 "An exception is thrown to let you know that you mismatched your pointers.");
1322 const size_t N = getLocalNumRows();
1324 Epetra_IntSerialDenseVector &myRowptr = mtx_->ExpertExtractIndexOffset();
1325 myRowptr.Resize(N + 1);
1326 for (
size_t i = 0; i < N + 1; i++)
1327 myRowptr[i] = Teuchos::as<int>(ptr(i));
1335 #warning "Xpetra Kokkos interface for CrsMatrix is enabled (HAVE_XPETRA_KOKKOS_REFACTOR) but Tpetra is disabled. The Kokkos interface needs Tpetra to be enabled, too."
1343 Scalar one = Teuchos::ScalarTraits<Scalar>::one(), negone = -one;
1346 R.
update(one, B, negone);
1363 #endif //#ifndef XPETRA_EPETRA_NO_32BIT_GLOBAL_INDICES
1365 #ifndef XPETRA_EPETRA_NO_64BIT_GLOBAL_INDICES
1368 :
public CrsMatrix<double, int, long long, EpetraNode> {
1375 #ifdef HAVE_XPETRA_TPETRA
1387 , isFillResumed_(false) {}
1391 : isFillResumed_(false) {
1392 Teuchos::Array<int> numEntriesPerRowToAlloc(NumEntriesPerRowToAlloc.begin(), NumEntriesPerRowToAlloc.end());
1393 mtx_ = Teuchos::rcp(
new Epetra_CrsMatrix(Copy, toEpetra<GlobalOrdinal, Node>(rowMap), numEntriesPerRowToAlloc.getRawPtr(),
true));
1399 , isFillResumed_(false) {}
1403 : isFillResumed_(false) {
1404 Teuchos::Array<int> numEntriesPerRowToAlloc(NumEntriesPerRowToAlloc.begin(), NumEntriesPerRowToAlloc.end());
1405 mtx_ = Teuchos::rcp(
new Epetra_CrsMatrix(Copy, toEpetra<GlobalOrdinal, Node>(rowMap), toEpetra<GlobalOrdinal, Node>(colMap), numEntriesPerRowToAlloc.getRawPtr(),
true));
1411 , isFillResumed_(false) {}
1418 const Teuchos::RCP<Teuchos::ParameterList> ¶ms = Teuchos::null)
1419 : isFillResumed_(false) {
1423 const Epetra_Map *myDomainMap = (domainMap != Teuchos::null) ? &toEpetra<GlobalOrdinal, Node>(domainMap) : 0;
1424 const Epetra_Map *myRangeMap = (rangeMap != Teuchos::null) ? &toEpetra<GlobalOrdinal, Node>(rangeMap) : 0;
1427 bool restrictComm =
false;
1428 if (!params.is_null()) restrictComm = params->get(
"Restrict Communicator", restrictComm);
1429 mtx_ = Teuchos::rcp(
new Epetra_CrsMatrix(*tSourceMatrix.getEpetra_CrsMatrix(), *tImporter.getEpetra_Import(), myDomainMap, myRangeMap, restrictComm));
1430 if (restrictComm && mtx_->NumMyRows() == 0)
1431 mtx_ = Teuchos::null;
1439 const Teuchos::RCP<Teuchos::ParameterList> ¶ms = Teuchos::null)
1440 : isFillResumed_(false) {
1444 const Epetra_Map *myDomainMap = (domainMap != Teuchos::null) ? &toEpetra<GlobalOrdinal, Node>(domainMap) : 0;
1445 const Epetra_Map *myRangeMap = (rangeMap != Teuchos::null) ? &toEpetra<GlobalOrdinal, Node>(rangeMap) : 0;
1448 bool restrictComm =
false;
1449 if (!params.is_null()) restrictComm = params->get(
"Restrict Communicator", restrictComm);
1451 mtx_ = Teuchos::rcp(
new Epetra_CrsMatrix(*tSourceMatrix.getEpetra_CrsMatrix(), *tExporter.getEpetra_Export(), myDomainMap, myRangeMap, restrictComm));
1459 const Teuchos::RCP<Teuchos::ParameterList> ¶ms)
1460 : isFillResumed_(false) {
1465 const Epetra_Map *myDomainMap = (domainMap != Teuchos::null) ? &toEpetra<GlobalOrdinal, Node>(domainMap) : 0;
1466 const Epetra_Map *myRangeMap = (rangeMap != Teuchos::null) ? &toEpetra<GlobalOrdinal, Node>(rangeMap) : 0;
1469 bool restrictComm =
false;
1470 if (!params.is_null()) restrictComm = params->get(
"Restrict Communicator", restrictComm);
1471 mtx_ = Teuchos::rcp(
new Epetra_CrsMatrix(*tSourceMatrix.getEpetra_CrsMatrix(), *tImporter.getEpetra_Import(), tdImporter->getEpetra_Import().get(), myDomainMap, myRangeMap, restrictComm));
1472 if (restrictComm && mtx_->NumMyRows() == 0)
1473 mtx_ = Teuchos::null;
1481 const Teuchos::RCP<Teuchos::ParameterList> ¶ms)
1482 : isFillResumed_(false) {
1487 const Epetra_Map *myDomainMap = (domainMap != Teuchos::null) ? &toEpetra<GlobalOrdinal, Node>(domainMap) : 0;
1488 const Epetra_Map *myRangeMap = (rangeMap != Teuchos::null) ? &toEpetra<GlobalOrdinal, Node>(rangeMap) : 0;
1491 bool restrictComm =
false;
1492 if (!params.is_null()) restrictComm = params->get(
"Restrict Communicator", restrictComm);
1494 mtx_ = Teuchos::rcp(
new Epetra_CrsMatrix(*tSourceMatrix.getEpetra_CrsMatrix(), *tExporter.getEpetra_Export(), tdExporter->getEpetra_Export().get(), myDomainMap, myRangeMap, restrictComm));
1497 #ifdef HAVE_XPETRA_TPETRA
1520 const local_matrix_type &lclMatrix,
1521 const Teuchos::RCP<Teuchos::ParameterList> ¶ms = null)
1522 :
EpetraCrsMatrixT(lclMatrix, rowMap, colMap, Teuchos::null, Teuchos::null, params) {}
1530 const Teuchos::RCP<Teuchos::ParameterList> ¶ms = null) {
1533 typedef typename local_matrix_type::value_type value_type;
1534 typedef typename local_matrix_type::ordinal_type ordinal_type;
1537 ordinal_type lclNumRows = lclMatrix.numRows();
1538 ordinal_type lclNumCols = lclMatrix.numCols();
1542 "Xpetra::EpetraCrsMatrixT: number of rows in local matrix and number of local entries in row map do not match!");
1544 "Xpetra::EpetraCrsMatrixT: number of columns in local matrix and number of local entries in column map do not match!");
1546 Teuchos::ArrayRCP<size_t> NumEntriesPerRowToAlloc(lclNumRows);
1547 for (ordinal_type r = 0; r < lclNumRows; ++r) {
1549 auto rowview = lclMatrix.row(r);
1550 NumEntriesPerRowToAlloc[r] = rowview.length;
1554 isFillResumed_ =
false;
1555 Teuchos::Array<int> numEntriesPerRowToAlloc(NumEntriesPerRowToAlloc.begin(), NumEntriesPerRowToAlloc.end());
1556 mtx_ = Teuchos::rcp(
new Epetra_CrsMatrix(Copy, toEpetra<GlobalOrdinal, Node>(rowMap), toEpetra<GlobalOrdinal, Node>(colMap), numEntriesPerRowToAlloc.getRawPtr(),
true));
1559 for (ordinal_type r = 0; r < lclNumRows; ++r) {
1561 auto rowview = lclMatrix.row(r);
1564 Teuchos::ArrayRCP<ordinal_type> indout(rowview.length, Teuchos::ScalarTraits<ordinal_type>::zero());
1565 Teuchos::ArrayRCP<value_type> valout(rowview.length, Teuchos::ScalarTraits<value_type>::zero());
1567 for (ordinal_type c = 0; c < rowview.length; c++) {
1568 value_type value = rowview.value(c);
1569 ordinal_type colidx = rowview.colidx(c);
1571 TEUCHOS_TEST_FOR_EXCEPTION(colMap->isNodeLocalElement(colidx) ==
false,
Xpetra::Exceptions::RuntimeError,
"Xpetra::EpetraCrsMatrixT: local matrix contains column elements which are not in the provided column map!");
1576 insertLocalValues(r, indout.view(0, indout.size()), valout.view(0, valout.size()));
1580 if (!domainMap.is_null() && !rangeMap.is_null())
1581 this->fillComplete(domainMap, rowMap, params);
1583 this->fillComplete(rowMap, rowMap, params);
1598 XPETRA_ERR_CHECK(mtx_->InsertGlobalValues(globalRow, vals.size(), vals.getRawPtr(), cols.getRawPtr()));
1604 XPETRA_ERR_CHECK(mtx_->InsertMyValues(localRow, vals.size(), vals.getRawPtr(), cols.getRawPtr()));
1612 const std::string tfecfFuncName(
"replaceGlobalValues");
1613 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(!isFillActive(), std::runtime_error,
1614 ": Fill must be active in order to call this method. If you have already "
1615 "called fillComplete(), you need to call resumeFill() before you can "
1618 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(values.size() != indices.size(),
1619 std::runtime_error,
": values.size() must equal indices.size().");
1622 XPETRA_ERR_CHECK(mtx_->ReplaceGlobalValues(globalRow, indices.size(), values.getRawPtr(), indices.getRawPtr()));
1630 const std::string tfecfFuncName(
"replaceLocalValues");
1631 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(!isFillActive(), std::runtime_error,
1632 ": Fill must be active in order to call this method. If you have already "
1633 "called fillComplete(), you need to call resumeFill() before you can "
1636 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(values.size() != indices.size(),
1637 std::runtime_error,
": values.size() must equal indices.size().");
1640 XPETRA_ERR_CHECK(mtx_->ReplaceMyValues(localRow, indices.size(), values.getRawPtr(), indices.getRawPtr()));
1646 mtx_->PutScalar(alpha);
1657 void allocateAllValues(
size_t numNonZeros, ArrayRCP<size_t> &rowptr, ArrayRCP<LocalOrdinal> &colind, ArrayRCP<Scalar> &values) {
1665 rowptr.resize(getLocalNumRows() + 1);
1667 int lowerOffset = 0;
1668 bool ownMemory =
false;
1672 Epetra_IntSerialDenseVector &myColind = mtx_->ExpertExtractIndices();
1673 myColind.Resize(numNonZeros);
1674 colind = Teuchos::arcp(myColind.Values(), lowerOffset, numNonZeros, ownMemory);
1678 double *&myValues = mtx_->ExpertExtractValues();
1680 myValues =
new double[numNonZeros];
1681 values = Teuchos::arcp(myValues, lowerOffset, numNonZeros, ownMemory);
1685 void setAllValues(
const ArrayRCP<size_t> &rowptr,
const ArrayRCP<LocalOrdinal> &colind,
const ArrayRCP<Scalar> &values) {
1690 "An exception is thrown to let you know that the size of your rowptr array is incorrect.");
1692 "An exception is thrown to let you know that you mismatched your pointers.");
1695 if (values.size() > 0) {
1697 "An exception is thrown to let you know that you mismatched your pointers.");
1699 "An exception is thrown to let you know that you mismatched your pointers.");
1704 const size_t N = getLocalNumRows();
1706 Epetra_IntSerialDenseVector &myRowptr = mtx_->ExpertExtractIndexOffset();
1707 myRowptr.Resize(N + 1);
1708 for (
size_t i = 0; i < N + 1; i++)
1709 myRowptr[i] = Teuchos::as<int>(rowptr[i]);
1713 void getAllValues(ArrayRCP<const size_t> &rowptr, ArrayRCP<const LocalOrdinal> &colind, ArrayRCP<const Scalar> &values)
const {
1716 int lowerOffset = 0;
1717 bool ownMemory =
false;
1719 const size_t n = getLocalNumRows();
1720 const size_t nnz = getLocalNumEntries();
1724 Epetra_IntSerialDenseVector &myRowptr = mtx_->ExpertExtractIndexOffset();
1725 rowptr.resize(n + 1);
1726 for (
size_t i = 0; i < n + 1; i++)
1727 (*const_cast<size_t *>(&rowptr[i])) = Teuchos::as<size_t>(myRowptr[i]);
1730 colind = Teuchos::arcp(mtx_->ExpertExtractIndices().Values(), lowerOffset, nnz, ownMemory);
1733 values = Teuchos::arcp(mtx_->ExpertExtractValues(), lowerOffset, nnz, ownMemory);
1740 int lowerOffset = 0;
1741 bool ownMemory =
false;
1743 const size_t nnz = getLocalNumEntries();
1745 values = Teuchos::arcp(mtx_->ExpertExtractValues(), lowerOffset, nnz, ownMemory);
1757 const RCP<ParameterList> & = Teuchos::null) {
1761 isFillResumed_ =
false;
1764 const Epetra_Import *myimport = 0;
1765 const Epetra_Export *myexport = 0;
1767 if (!importer.is_null()) {
1769 myimport = eImporter.getEpetra_Import().getRawPtr();
1771 if (!exporter.is_null()) {
1773 myexport = eExporter.getEpetra_Export().getRawPtr();
1776 rv = mtx_->ExpertStaticFillComplete(toEpetra<GlobalOrdinal, Node>(domainMap), toEpetra<GlobalOrdinal, Node>(rangeMap), myimport, myexport);
1778 TEUCHOS_TEST_FOR_EXCEPTION(rv != 0, std::runtime_error,
"Xpetra::EpetraCrsMatrixT::expertStaticFillComplete FAILED!");
1790 isFillResumed_ =
true;
1798 if (isFillResumed_ ==
true) {
1799 isFillResumed_ =
false;
1803 bool doOptimizeStorage =
true;
1804 if (params != null && params->get(
"Optimize Storage",
true) ==
false) doOptimizeStorage =
false;
1805 mtx_->FillComplete(toEpetra<GlobalOrdinal, Node>(domainMap), toEpetra<GlobalOrdinal, Node>(rangeMap), doOptimizeStorage);
1813 if (isFillResumed_ ==
true) {
1814 isFillResumed_ =
false;
1818 bool doOptimizeStorage =
true;
1819 if (params != null && params->get(
"Optimize Storage",
true) ==
false) doOptimizeStorage =
false;
1820 mtx_->FillComplete(doOptimizeStorage);
1828 const RCP<const Epetra_Import> &myImport = eImporter.getEpetra_Import();
1830 if (myImport == Teuchos::null)
1831 rv = mtx_->ReplaceDomainMapAndImporter(toEpetra<GlobalOrdinal, Node>(newDomainMap), 0);
1833 rv = mtx_->ReplaceDomainMapAndImporter(toEpetra<GlobalOrdinal, Node>(newDomainMap), &*myImport);
1834 TEUCHOS_TEST_FOR_EXCEPTION(rv != 0, std::runtime_error,
"Xpetra::EpetraCrsMatrixT::replaceDomainMapAndImporter FAILED!");
1849 const RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >
getRowMap()
const {
1851 return toXpetra<GlobalOrdinal, Node>(mtx_->RowMap());
1855 const RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >
getColMap()
const {
1857 return toXpetra<GlobalOrdinal, Node>(mtx_->ColMap());
1861 RCP<const CrsGraph<LocalOrdinal, GlobalOrdinal, Node> >
getCrsGraph()
const {
1863 return toXpetra<GlobalOrdinal, Node>(mtx_->Graph());
1869 return mtx_->NumGlobalRows64();
1875 return mtx_->NumGlobalCols64();
1881 return mtx_->NumMyRows();
1887 return mtx_->NumMyCols();
1893 return mtx_->NumGlobalNonzeros64();
1899 return mtx_->NumMyNonzeros();
1905 return mtx_->NumMyEntries(localRow);
1911 return mtx_->NumGlobalEntries(globalRow);
1917 return mtx_->GlobalMaxNumEntries();
1923 return mtx_->MaxNumEntries();
1929 return mtx_->IndicesAreLocal();
1935 return mtx_->IndicesAreGlobal();
1944 return mtx_->Filled();
1950 return !isFillComplete();
1956 return mtx_->NormFrobenius();
1969 int numEntries = -1;
1970 XPETRA_ERR_CHECK(mtx_->ExtractMyRowCopy(LocalRow, Indices.size(), numEntries, Values.getRawPtr(), Indices.getRawPtr()));
1971 NumEntries = numEntries;
1978 int numEntries = -1;
1979 XPETRA_ERR_CHECK(mtx_->ExtractGlobalRowCopy(GlobalRow, Indices.size(), numEntries, Values.getRawPtr(), Indices.getRawPtr()));
1980 NumEntries = numEntries;
1991 XPETRA_ERR_CHECK(mtx_->ExtractGlobalRowView(GlobalRow, numEntries, eValues, eIndices));
1992 if (numEntries == 0) {
1997 indices = ArrayView<const GlobalOrdinal>(eIndices, numEntries);
1998 values = ArrayView<const double>(eValues, numEntries);
2009 XPETRA_ERR_CHECK(mtx_->ExtractMyRowView(LocalRow, numEntries, eValues, eIndices));
2010 if (numEntries == 0) {
2015 indices = ArrayView<const int>(eIndices, numEntries);
2016 values = ArrayView<const double>(eValues, numEntries);
2022 mtx_->ExtractDiagonalCopy(toEpetra<GlobalOrdinal, Node>(diag));
2042 mtx_->ReplaceDiagonalValues(toEpetra<GlobalOrdinal, Node>(diag));
2058 void apply(
const MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &X,
MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &Y, Teuchos::ETransp mode = Teuchos::NO_TRANS,
Scalar alpha = ScalarTraits<Scalar>::one(),
Scalar beta = ScalarTraits<Scalar>::zero())
const {
2066 TEUCHOS_TEST_FOR_EXCEPTION((mode != Teuchos::NO_TRANS) && (mode != Teuchos::TRANS),
Xpetra::Exceptions::NotImplemented,
"Xpetra::EpetraCrsMatrixT->apply() only accept mode == NO_TRANS or mode == TRANS");
2070 TEUCHOS_TEST_FOR_EXCEPTION(mtx_->UseTranspose(),
Xpetra::Exceptions::NotImplemented,
"An exception is throw to let you know that Xpetra::EpetraCrsMatrixT->apply() do not take into account the UseTranspose() parameter of Epetra_CrsMatrix.");
2072 RCP<Epetra_MultiVector> epY = eY.getEpetra_MultiVector();
2075 RCP<Epetra_MultiVector> tmp = Teuchos::rcp(
new Epetra_MultiVector(*epY));
2076 tmp->PutScalar(0.0);
2077 XPETRA_ERR_CHECK(mtx_->Multiply(eTrans, *eX.getEpetra_MultiVector(), *tmp));
2083 void apply(
const MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &X,
MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> &Y, Teuchos::ETransp mode,
Scalar alpha,
Scalar beta,
bool sumInterfaceValues,
const RCP<
Import<LocalOrdinal, GlobalOrdinal, Node> > ®ionInterfaceImporter,
const Teuchos::ArrayRCP<LocalOrdinal> ®ionInterfaceLIDs)
const {
2088 const RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >
getDomainMap()
const {
2090 return toXpetra<GlobalOrdinal, Node>(mtx_->DomainMap());
2094 const RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >
getRangeMap()
const {
2096 return toXpetra<GlobalOrdinal, Node>(mtx_->RangeMap());
2109 std::ostringstream oss;
2111 if (isFillComplete()) {
2112 oss <<
"{status = fill complete"
2113 <<
", global rows = " << getGlobalNumRows()
2114 <<
", global cols = " << getGlobalNumCols()
2115 <<
", global num entries = " << getGlobalNumEntries()
2118 oss <<
"{status = fill not complete"
2119 <<
", global rows = " << getGlobalNumRows()
2126 void describe(Teuchos::FancyOStream &out,
const Teuchos::EVerbosityLevel verbLevel = Teuchos::Describable::verbLevel_default)
const {
2132 using Teuchos::VERB_DEFAULT;
2133 using Teuchos::VERB_EXTREME;
2134 using Teuchos::VERB_HIGH;
2135 using Teuchos::VERB_LOW;
2136 using Teuchos::VERB_MEDIUM;
2137 using Teuchos::VERB_NONE;
2138 Teuchos::EVerbosityLevel vl = verbLevel;
2139 if (vl == VERB_DEFAULT) vl = VERB_LOW;
2140 RCP<const Comm<int> > comm = this->getComm();
2141 const int myImageID = comm->getRank(),
2142 numImages = comm->getSize();
2144 for (
size_t dec = 10; dec < getGlobalNumRows(); dec *= 10) {
2147 width = std::max<size_t>(width, 11) + 2;
2148 Teuchos::OSTab tab(out);
2156 if (vl != VERB_NONE) {
2157 if (myImageID == 0) out << this->description() << std::endl;
2159 if (isFillComplete() && myImageID == 0) {
2160 out <<
"Global max number of entries = " << getGlobalMaxNumRowEntries() << std::endl;
2163 if (vl == VERB_MEDIUM || vl == VERB_HIGH || vl == VERB_EXTREME) {
2164 if (myImageID == 0) out <<
"\nRow map: " << std::endl;
2165 getRowMap()->describe(out, vl);
2167 if (getColMap() != null) {
2168 if (getColMap() == getRowMap()) {
2169 if (myImageID == 0) out <<
"\nColumn map is row map.";
2171 if (myImageID == 0) out <<
"\nColumn map: " << std::endl;
2172 getColMap()->describe(out, vl);
2175 if (getDomainMap() != null) {
2176 if (getDomainMap() == getRowMap()) {
2177 if (myImageID == 0) out <<
"\nDomain map is row map.";
2178 }
else if (getDomainMap() == getColMap()) {
2179 if (myImageID == 0) out <<
"\nDomain map is row map.";
2181 if (myImageID == 0) out <<
"\nDomain map: " << std::endl;
2182 getDomainMap()->describe(out, vl);
2185 if (getRangeMap() != null) {
2186 if (getRangeMap() == getDomainMap()) {
2187 if (myImageID == 0) out <<
"\nRange map is domain map." << std::endl;
2188 }
else if (getRangeMap() == getRowMap()) {
2189 if (myImageID == 0) out <<
"\nRange map is row map." << std::endl;
2191 if (myImageID == 0) out <<
"\nRange map: " << std::endl;
2192 getRangeMap()->describe(out, vl);
2195 if (myImageID == 0) out << std::endl;
2198 if (vl == VERB_MEDIUM || vl == VERB_HIGH || vl == VERB_EXTREME) {
2199 for (
int imageCtr = 0; imageCtr < numImages; ++imageCtr) {
2200 if (myImageID == imageCtr) {
2201 out <<
"Node ID = " << imageCtr << std::endl;
2214 out <<
"Node number of entries = " << getLocalNumEntries() << std::endl;
2215 out <<
"Node max number of entries = " << getLocalMaxNumRowEntries() << std::endl;
2223 if (vl == VERB_HIGH || vl == VERB_EXTREME) {
2224 for (
int imageCtr = 0; imageCtr < numImages; ++imageCtr) {
2225 if (myImageID == imageCtr) {
2226 out << std::setw(width) <<
"Node ID"
2227 << std::setw(width) <<
"Global Row"
2228 << std::setw(width) <<
"Num Entries";
2229 if (vl == VERB_EXTREME) {
2230 out << std::setw(width) <<
"(Index,Value)";
2233 for (
size_t r = 0; r < getLocalNumRows(); ++r) {
2234 const size_t nE = getNumEntriesInLocalRow(r);
2236 out << std::setw(width) << myImageID
2237 << std::setw(width) << gid
2238 << std::setw(width) << nE;
2239 if (vl == VERB_EXTREME) {
2240 if (isGloballyIndexed()) {
2241 ArrayView<const GlobalOrdinal> rowinds;
2242 ArrayView<const Scalar> rowvals;
2243 getGlobalRowView(gid, rowinds, rowvals);
2244 for (
size_t j = 0; j < nE; ++j) {
2245 out <<
" (" << rowinds[j]
2246 <<
", " << rowvals[j]
2249 }
else if (isLocallyIndexed()) {
2250 ArrayView<const LocalOrdinal> rowinds;
2251 ArrayView<const Scalar> rowvals;
2252 getLocalRowView(r, rowinds, rowvals);
2253 for (
size_t j = 0; j < nE; ++j) {
2254 out <<
" (" << getColMap()->getGlobalElement(rowinds[j])
2255 <<
", " << rowvals[j]
2272 Teuchos::LabeledObject::setObjectLabel(objectLabel);
2273 mtx_->SetLabel(objectLabel.c_str());
2279 : mtx_(Teuchos::rcp(new Epetra_CrsMatrix(*(matrix.mtx_))))
2280 , isFillResumed_(false) {}
2286 Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> >
getMap()
const {
2288 return toXpetra<GlobalOrdinal, Node>(mtx_->Map());
2299 RCP<const Epetra_CrsMatrix> v = tSource.getEpetra_CrsMatrix();
2300 int err = mtx_->Import(*v, *tImporter.getEpetra_Import(),
toEpetra(CM));
2301 TEUCHOS_TEST_FOR_EXCEPTION(err != 0, std::runtime_error,
"Catch error code returned by Epetra.");
2312 RCP<const Epetra_CrsMatrix> v = tDest.getEpetra_CrsMatrix();
2313 int err = mtx_->Export(*v, *tImporter.getEpetra_Import(),
toEpetra(CM));
2314 TEUCHOS_TEST_FOR_EXCEPTION(err != 0, std::runtime_error,
"Catch error code returned by Epetra.");
2325 RCP<const Epetra_CrsMatrix> v = tSource.getEpetra_CrsMatrix();
2326 int err = mtx_->Import(*v, *tExporter.getEpetra_Export(),
toEpetra(CM));
2327 TEUCHOS_TEST_FOR_EXCEPTION(err != 0, std::runtime_error,
"Catch error code returned by Epetra.");
2338 RCP<const Epetra_CrsMatrix> v = tDest.getEpetra_CrsMatrix();
2339 int err = mtx_->Export(*v, *tExporter.getEpetra_Export(),
toEpetra(CM));
2340 TEUCHOS_TEST_FOR_EXCEPTION(err != 0, std::runtime_error,
"Catch error code returned by Epetra.");
2345 const Epetra_Map *newMapEpetra = (!newMap.is_null()) ? &toEpetra<GlobalOrdinal, Node>(newMap) : 0;
2346 int err = mtx_->RemoveEmptyProcessesInPlace(newMapEpetra);
2347 TEUCHOS_TEST_FOR_EXCEPTION(err != 0, std::runtime_error,
"Caught nonzero error code " + std::to_string(err) +
" returned by Epetra.");
2361 , isFillResumed_(false) {}
2369 #ifdef HAVE_XPETRA_TPETRA
2370 local_matrix_type getLocalMatrix()
const {
2372 RCP<Epetra_CrsMatrix> matrix = getEpetra_CrsMatrixNonConst();
2374 const int numRows = matrix->NumMyRows();
2375 const int numCols = matrix->NumMyCols();
2376 const int nnz = matrix->NumMyNonzeros();
2381 int rv = matrix->ExtractCrsDataPointers(rowptr, colind, vals);
2382 TEUCHOS_TEST_FOR_EXCEPTION(rv, std::runtime_error,
"Xpetra::CrsMatrix<>::getLocalMatrix: failed in ExtractCrsDataPointers");
2385 typename local_matrix_type::row_map_type::non_const_type kokkosRowPtr(Kokkos::ViewAllocateWithoutInitializing(
"local row map"), numRows + 1);
2386 for (
size_t i = 0; i < kokkosRowPtr.size(); i++)
2387 kokkosRowPtr(i) = Teuchos::asSafe<typename local_matrix_type::row_map_type::value_type>(rowptr[i]);
2390 typename local_matrix_type::index_type kokkosColind(colind, nnz);
2391 typename local_matrix_type::values_type kokkosVals(vals, nnz);
2393 local_matrix_type localMatrix = local_matrix_type(
"LocalMatrix", numRows, numCols, nnz, kokkosVals, kokkosRowPtr, kokkosColind);
2399 const typename local_matrix_type::StaticCrsGraphType::entries_type::non_const_type &ind,
2400 const typename local_matrix_type::values_type &val) {
2403 "An exception is thrown to let you know that the size of your rowptr array is incorrect.");
2405 "An exception is thrown to let you know that you mismatched your pointers.");
2408 if (val.size() > 0) {
2410 "An exception is thrown to let you know that you mismatched your pointers.");
2412 "An exception is thrown to let you know that you mismatched your pointers.");
2417 const size_t N = getLocalNumRows();
2419 Epetra_IntSerialDenseVector &myRowptr = mtx_->ExpertExtractIndexOffset();
2420 myRowptr.Resize(N + 1);
2421 for (
size_t i = 0; i < N + 1; i++)
2422 myRowptr[i] = Teuchos::as<int>(ptr(i));
2430 #warning "Xpetra Kokkos interface for CrsMatrix is enabled (HAVE_XPETRA_KOKKOS_REFACTOR) but Tpetra is disabled. The Kokkos interface needs Tpetra to be enabled, too."
2439 Scalar one = Teuchos::ScalarTraits<Scalar>::one(), negone = -one;
2441 R.
update(one, B, negone);
2451 #endif // #ifndef XPETRA_EPETRA_NO_64BIT_GLOBAL_INDICES
2455 #define XPETRA_EPETRACRSMATRIX_SHORT
2456 #endif // XPETRA_EPETRACRSMATRIX_HPP
EpetraCrsMatrixT(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rowMap, size_t maxNumEntriesPerRow, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
size_t getLocalNumCols() const
Returns the number of columns connected to the locally owned rows of this matrix. ...
void setObjectLabel(const std::string &objectLabel)
global_size_t getGlobalNumCols() const
Number of global columns in the matrix.
void rightScale(const Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &x)
void doImport(const DistObject< char, LocalOrdinal, GlobalOrdinal, Node > &source, const Export< LocalOrdinal, GlobalOrdinal, Node > &exporter, CombineMode CM)
Import (using an Exporter).
void insertGlobalValues(GlobalOrdinal globalRow, const ArrayView< const GlobalOrdinal > &cols, const ArrayView< const Scalar > &vals)
Insert matrix entries, using global IDs.
void leftScale(const Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &x)
void getLocalDiagCopy(Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &diag, const Kokkos::View< const size_t *, typename Node::device_type, Kokkos::MemoryUnmanaged > &offsets) const
void getLocalRowView(LocalOrdinal LocalRow, ArrayView< const LocalOrdinal > &indices, ArrayView< const Scalar > &values) const
bool isGloballyIndexed() const
If matrix indices are in the global range, this function returns true. Otherwise, this function retur...
EpetraCrsMatrixT(const Teuchos::RCP< const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &sourceMatrix, const Export< LocalOrdinal, GlobalOrdinal, Node > &RowExporter, const Teuchos::RCP< const Export< LocalOrdinal, GlobalOrdinal, Node > > DomainExporter, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap, const Teuchos::RCP< Teuchos::ParameterList > ¶ms)
bool supportsRowViews() const
Returns true if getLocalRowView() and getGlobalRowView() are valid for this class.
EpetraCrsMatrixT(const Teuchos::RCP< const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &sourceMatrix, const Import< LocalOrdinal, GlobalOrdinal, Node > &RowImporter, const Teuchos::RCP< const Import< LocalOrdinal, GlobalOrdinal, Node > > DomainImporter, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap, const Teuchos::RCP< Teuchos::ParameterList > ¶ms)
RCP< const Epetra_CrsMatrix > getEpetra_CrsMatrix() const
Get the underlying Epetra matrix.
EpetraCrsMatrixT(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 > &=Teuchos::null)
Constructor specifying row and column Maps and number of entries in each row.
size_t getLocalNumEntries() const
Returns the local number of entries in this matrix.
void setAllValues(const ArrayRCP< size_t > &rowptr, const ArrayRCP< LocalOrdinal > &colind, const ArrayRCP< Scalar > &values)
EpetraCrsMatrixT(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rowMap, const ArrayRCP< const size_t > &NumEntriesPerRowToAlloc, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
virtual ~EpetraCrsMatrixT()
EpetraCrsMatrixT(const Teuchos::RCP< const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &sourceMatrix, const Import< LocalOrdinal, GlobalOrdinal, Node > &importer, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap=Teuchos::null, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Constructor for a fused import.
void scale(const Scalar &alpha)
Scale the current values of a matrix, this = alpha*this.
void getAllValues(ArrayRCP< const size_t > &rowptr, ArrayRCP< const LocalOrdinal > &colind, ArrayRCP< const Scalar > &values) const
Gets the 1D pointer arrays of the graph.
EpetraCrsMatrixT(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=Teuchos::null)
EpetraCrsMatrixT(const Teuchos::RCP< Epetra_CrsMatrix > &mtx)
CrsMatrix< double, int, GlobalOrdinal, Node >::scalar_type Scalar
size_t getLocalNumRows() const
Returns the number of matrix rows owned on the calling node.
size_t getLocalMaxNumRowEntries() const
Returns the maximum number of entries across all rows/columns on this node.
void getLocalRowView(LocalOrdinal LocalRow, ArrayView< const LocalOrdinal > &indices, ArrayView< const Scalar > &values) const
Extract a const, non-persisting view of local indices in a specified row of the matrix.
CrsMatrix< double, int, GlobalOrdinal, Node >::local_ordinal_type LocalOrdinal
void allocateAllValues(size_t numNonZeros, ArrayRCP< size_t > &rowptr, ArrayRCP< LocalOrdinal > &colind, ArrayRCP< Scalar > &values)
Allocates and returns ArrayRCPs of the Crs arrays — This is an Xpetra-only routine.
void residual(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &B, MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &R) const
void leftScale(const Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &x)
size_t getGlobalMaxNumRowEntries() const
Returns the maximum number of entries across all rows/columns on all nodes.
RCP< const CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > getCrsGraph() const
Returns the CrsGraph associated with this matrix.
bool isFillComplete() const
Returns true if the matrix is in compute mode, i.e. if fillComplete() has been called.
void setAllValues(const typename local_matrix_type::row_map_type &ptr, const typename local_matrix_type::StaticCrsGraphType::entries_type::non_const_type &ind, const typename local_matrix_type::values_type &val)
ScalarTraits< Scalar >::magnitudeType getFrobeniusNorm() const
Returns the Frobenius norm of the matrix.
CrsMatrix< double, int, GlobalOrdinal, Node >::local_ordinal_type LocalOrdinal
const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getColMap() const
Returns the Map that describes the column distribution in this matrix.
void doImport(const DistObject< char, LocalOrdinal, GlobalOrdinal, Node > &source, const Import< LocalOrdinal, GlobalOrdinal, Node > &importer, CombineMode CM)
EpetraCrsMatrixT(const Teuchos::RCP< const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &sourceMatrix, const Export< LocalOrdinal, GlobalOrdinal, Node > &exporter, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap=Teuchos::null, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
void replaceLocalValues(LocalOrdinal localRow, const ArrayView< const LocalOrdinal > &cols, const ArrayView< const Scalar > &vals)
EpetraCrsMatrixT(const Teuchos::RCP< const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &sourceMatrix, const Import< LocalOrdinal, GlobalOrdinal, Node > &RowImporter, const Teuchos::RCP< const Import< LocalOrdinal, GlobalOrdinal, Node > > DomainImporter, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap, const Teuchos::RCP< Teuchos::ParameterList > ¶ms)
void getGlobalRowView(GlobalOrdinal GlobalRow, ArrayView< const GlobalOrdinal > &indices, ArrayView< const Scalar > &values) const
EpetraCrsMatrixT(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 > &=Teuchos::null)
Constructor specifying column Map and number of entries in each row.
bool haveGlobalConstants() const
Returns true if globalConstants have been computed; false otherwise.
void setAllValues(const ArrayRCP< size_t > &rowptr, const ArrayRCP< LocalOrdinal > &colind, const ArrayRCP< Scalar > &values)
Sets the 1D pointer arrays of the graph.
RCP< const CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > getCrsGraph() const
Returns the CrsGraph associated with this matrix.
void resumeFill(const RCP< ParameterList > ¶ms=null)
global_size_t getGlobalNumRows() const
Number of global elements in the row map of this matrix.
ScalarTraits< Scalar >::magnitudeType getFrobeniusNorm() const
Returns the Frobenius norm of the matrix.
void getAllValues(ArrayRCP< Scalar > &values)
void expertStaticFillComplete(const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap, const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap, const RCP< const Import< LocalOrdinal, GlobalOrdinal, Node > > &importer=Teuchos::null, const RCP< const Export< LocalOrdinal, GlobalOrdinal, Node > > &exporter=Teuchos::null, const RCP< ParameterList > &=Teuchos::null)
Expert static fill complete.
void doExport(const DistObject< char, LocalOrdinal, GlobalOrdinal, Node > &dest, const Export< LocalOrdinal, GlobalOrdinal, Node > &exporter, CombineMode CM)
void allocateAllValues(size_t numNonZeros, ArrayRCP< size_t > &rowptr, ArrayRCP< LocalOrdinal > &colind, ArrayRCP< Scalar > &values)
void replaceDiag(const Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &diag)
bool hasMatrix() const
Does this have an underlying matrix.
RCP< Epetra_CrsMatrix > mtx_
The underlying actual matrix object.
void getLocalRowCopy(LocalOrdinal LocalRow, const ArrayView< LocalOrdinal > &Indices, const ArrayView< Scalar > &Values, size_t &NumEntries) const
Extract a list of entries in a specified local row of the matrix. Put into storage allocated by calli...
void fillComplete(const RCP< ParameterList > ¶ms=Teuchos::null)
Signal that data entry is complete.
RCP< Epetra_CrsMatrix > getEpetra_CrsMatrixNonConst() const
EpetraCrsMatrixT(const Teuchos::RCP< const CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > &graph, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
bool isGloballyIndexed() const
If matrix indices are in the global range, this function returns true. Otherwise, this function retur...
void setAllToScalar(const Scalar &alpha)
Set all matrix entries equal to scalarThis.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Print the object with some verbosity level to an FancyOStream object.
global_size_t getGlobalNumEntries() const
Returns the global number of entries in this matrix.
bool supportsRowViews() const
Returns true if getLocalRowView() and getGlobalRowView() are valid for this class.
EpetraCrsMatrixT(const Teuchos::RCP< const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &sourceMatrix, const Export< LocalOrdinal, GlobalOrdinal, Node > &exporter, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap=Teuchos::null, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Constructor for a fused export.
Xpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node >::node_type node_type
CrsMatrix< double, int, GlobalOrdinal, Node >::scalar_type Scalar
ScalarTraits< Scalar >::magnitudeType getFrobeniusNorm() const
Returns the Frobenius norm of the matrix.
size_t getLocalNumRows() const
Returns the number of matrix rows owned on the calling node.
LocalOrdinal GetStorageBlockSize() const
Returns the block size of the storage mechanism, which is usually 1, except for Tpetra::BlockCrsMatri...
std::string description() const
A simple one-line description of this object.
Xpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node >::node_type node_type
void getLocalDiagCopy(Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &, const Kokkos::View< const size_t *, typename Node::device_type, Kokkos::MemoryUnmanaged > &) const
Get a copy of the diagonal entries owned by this node, with local row indices, using row offsets...
local_matrix_type getLocalMatrixDevice() const
Compatibility layer for accessing the matrix data through a Kokkos interface.
size_t getNumEntriesInGlobalRow(GlobalOrdinal globalRow) const
Returns the current number of entries on this node in the specified (locally owned) global row...
const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getRowMap() const
Returns the Map that describes the row distribution in this matrix.
void getLocalDiagCopy(Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &diag) const
Get a copy of the diagonal entries owned by this node, with local row indices.
Exception throws to report errors in the internal logical of the program.
LocalOrdinal local_ordinal_type
void removeEmptyProcessesInPlace(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &newMap)
void removeEmptyProcessesInPlace(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &newMap)
void doImport(const DistObject< char, LocalOrdinal, GlobalOrdinal, Node > &source, const Export< LocalOrdinal, GlobalOrdinal, Node > &exporter, CombineMode CM)
Import (using an Exporter).
size_t getLocalNumRows() const
Returns the number of matrix rows owned on the calling node.
EpetraCrsMatrixT(const EpetraCrsMatrixT &matrix)
virtual ~EpetraCrsMatrixT()
Destructor.
Xpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node >::node_type node_type
bool supportsRowViews() const
Returns true if getLocalRowView() and getGlobalRowView() are valid for this class.
Xpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node >::local_matrix_type local_matrix_type
EpetraCrsMatrixT(const EpetraCrsMatrixT &matrix)
Deep copy constructor.
void replaceDomainMapAndImporter(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &newDomainMap, Teuchos::RCP< const Import< LocalOrdinal, GlobalOrdinal, Node > > &newImporter)
Replaces the current domainMap and importer with the user-specified objects.
size_t getLocalNumCols() const
Returns the number of columns connected to the locally owned rows of this matrix. ...
bool isLocallyIndexed() const
If matrix indices are in the local range, this function returns true. Otherwise, this function return...
size_t getNumEntriesInLocalRow(LocalOrdinal localRow) const
Returns the current number of entries on this node in the specified local row.
const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getDomainMap() const
Returns the Map associated with the domain of this operator. This will be null until fillComplete() i...
EpetraCrsMatrixT(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rowMap, size_t maxNumEntriesPerRow, const Teuchos::RCP< Teuchos::ParameterList > &=Teuchos::null)
Constructor specifying fixed number of entries for each row.
size_t getNumEntriesInLocalRow(LocalOrdinal localRow) const
std::string description() const
A simple one-line description of this object.
void getLocalDiagCopy(Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &, const Teuchos::ArrayView< const size_t > &) const
Get a copy of the diagonal entries owned by this node, with local row indices, using row offsets...
EpetraCrsMatrixT(const local_matrix_type &lclMatrix, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rowMap, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &colMap, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap=Teuchos::null, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=null)
virtual void update(const Scalar &alpha, const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, const Scalar &beta)=0
Update multi-vector values with scaled values of A, this = beta*this + alpha*A.
const RCP< const Comm< int > > getComm() const
Returns the communicator.
void fillComplete(const RCP< ParameterList > ¶ms=Teuchos::null)
Signal that data entry is complete.
void insertLocalValues(LocalOrdinal localRow, const ArrayView< const LocalOrdinal > &cols, const ArrayView< const Scalar > &vals)
Insert matrix entries, using local IDs.
void replaceLocalValues(LocalOrdinal localRow, const ArrayView< const LocalOrdinal > &indices, const ArrayView< const Scalar > &values)
Replace matrix entries, using local IDs.
void resumeFill(const RCP< ParameterList > &=Teuchos::null)
bool isFillComplete() const
Returns true if the matrix is in compute mode, i.e. if fillComplete() has been called.
void getLocalDiagCopy(Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &, const Kokkos::View< const size_t *, typename Node::device_type, Kokkos::MemoryUnmanaged > &) const
Get a copy of the diagonal entries owned by this node, with local row indices, using row offsets...
void rightScale(const Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &x)
Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getMap() const
Implements DistObject interface.
void insertLocalValues(LocalOrdinal localRow, const ArrayView< const LocalOrdinal > &cols, const ArrayView< const Scalar > &vals)
Insert matrix entries, using local IDs.
void replaceGlobalValues(GlobalOrdinal globalRow, const ArrayView< const GlobalOrdinal > &indices, const ArrayView< const Scalar > &values)
Replace matrix entries, using global IDs.
void replaceDomainMapAndImporter(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &newDomainMap, Teuchos::RCP< const Import< LocalOrdinal, GlobalOrdinal, Node > > &newImporter)
Replaces the current domainMap and importer with the user-specified objects.
void doImport(const DistObject< char, LocalOrdinal, GlobalOrdinal, Node > &source, const Import< LocalOrdinal, GlobalOrdinal, Node > &importer, CombineMode CM)
Import.
void leftScale(const Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &x)
void getGlobalRowView(GlobalOrdinal GlobalRow, ArrayView< const GlobalOrdinal > &indices, ArrayView< const Scalar > &values) const
Extract a const, non-persisting view of global indices in a specified row of the matrix.
EpetraCrsMatrixT(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rowMap, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &colMap, const local_matrix_type &lclMatrix, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=null)
RCP< Epetra_CrsMatrix > getEpetra_CrsMatrixNonConst() const
Get the underlying Epetra matrix.
bool isLocallyIndexed() const
If matrix indices are in the local range, this function returns true. Otherwise, this function return...
void setAllToScalar(const Scalar &alpha)
EpetraCrsMatrixT(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rowMap, const ArrayRCP< const size_t > &NumEntriesPerRowToAlloc, const Teuchos::RCP< Teuchos::ParameterList > &=Teuchos::null)
Constructor specifying (possibly different) number of entries in each row.
bool hasMatrix() const
Does this have an underlying matrix.
void expertStaticFillComplete(const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap, const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap, const RCP< const Import< LocalOrdinal, GlobalOrdinal, Node > > &importer=Teuchos::null, const RCP< const Export< LocalOrdinal, GlobalOrdinal, Node > > &exporter=Teuchos::null, const RCP< ParameterList > &=Teuchos::null)
Expert static fill complete.
size_t getLocalNumEntries() const
Returns the local number of entries in this matrix.
void apply(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, Scalar alpha=ScalarTraits< Scalar >::one(), Scalar beta=ScalarTraits< Scalar >::zero()) const
Computes the sparse matrix-multivector multiplication.
virtual ~EpetraCrsMatrixT()
Destructor.
void setAllToScalar(const Scalar &alpha)
Set all matrix entries equal to scalarThis.
std::string description() const
A simple one-line description of this object.
size_t getLocalMaxNumRowEntries() const
Returns the maximum number of entries across all rows/columns on this node.
void doImport(const DistObject< char, LocalOrdinal, GlobalOrdinal, Node > &source, const Import< LocalOrdinal, GlobalOrdinal, Node > &importer, CombineMode CM)
Import.
void rightScale(const Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &x)
#define XPETRA_ERR_CHECK(arg)
void getGlobalRowCopy(GlobalOrdinal GlobalRow, const ArrayView< GlobalOrdinal > &Indices, const ArrayView< Scalar > &Values, size_t &NumEntries) const
Extract a list of entries in a specified global row of this matrix. Put into pre-allocated storage...
const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getRangeMap() const
Returns the Map associated with the range of this operator, which must be compatible with Y...
size_t getLocalMaxNumRowEntries() const
Returns the maximum number of entries across all rows/columns on this node.
void getLocalRowView(LocalOrdinal LocalRow, ArrayView< const LocalOrdinal > &indices, ArrayView< const Scalar > &values) const
Extract a const, non-persisting view of local indices in a specified row of the matrix.
EpetraCrsMatrixT(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rowMap, size_t maxNumEntriesPerRow, const Teuchos::RCP< Teuchos::ParameterList > &=Teuchos::null)
Constructor specifying fixed number of entries for each row.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Print the object with some verbosity level to an FancyOStream object.
size_t getNumEntriesInGlobalRow(GlobalOrdinal globalRow) const
Returns the current number of entries on this node in the specified (locally owned) global row...
const RCP< const Comm< int > > getComm() const
bool isFillComplete() const
Returns true if the matrix is in compute mode, i.e. if fillComplete() has been called.
void getLocalDiagOffsets(Teuchos::ArrayRCP< size_t > &) const
Get offsets of the diagonal entries in the matrix.
bool haveGlobalConstants() const
Returns true if globalConstants have been computed; false otherwise.
LocalOrdinal GetStorageBlockSize() const
Returns the block size of the storage mechanism, which is usually 1, except for Tpetra::BlockCrsMatri...
void getAllValues(ArrayRCP< Scalar > &values)
Gets the 1D pointer arrays of the graph.
void insertGlobalValues(GlobalOrdinal globalRow, const ArrayView< const GlobalOrdinal > &cols, const ArrayView< const Scalar > &vals)
RCP< const Epetra_CrsMatrix > getEpetra_CrsMatrix() const
Get the underlying Epetra matrix.
local_matrix_type::HostMirror getLocalMatrixHost() const
void getLocalDiagCopy(Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &diag) const
Get a copy of the diagonal entries owned by this node, with local row indices.
EpetraCrsMatrixT(const Teuchos::RCP< const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &sourceMatrix, const Import< LocalOrdinal, GlobalOrdinal, Node > &RowImporter, const Teuchos::RCP< const Import< LocalOrdinal, GlobalOrdinal, Node > > DomainImporter, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap, const Teuchos::RCP< Teuchos::ParameterList > ¶ms)
bool isFillActive() const
Returns true if the matrix is in edit mode.
RCP< Epetra_CrsMatrix > getEpetra_CrsMatrixNonConst() const
Get the underlying Epetra matrix.
EpetraCrsMatrixT(const local_matrix_type &lclMatrix, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rowMap, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &colMap, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap=Teuchos::null, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=null)
EpetraCrsMatrixT(const EpetraCrsMatrixT &matrix)
Deep copy constructor.
void scale(const Scalar &alpha)
Scale the current values of a matrix, this = alpha*this.
EpetraCrsMatrixT(const Teuchos::RCP< const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &sourceMatrix, const Export< LocalOrdinal, GlobalOrdinal, Node > &RowExporter, const Teuchos::RCP< const Export< LocalOrdinal, GlobalOrdinal, Node > > DomainExporter, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap, const Teuchos::RCP< Teuchos::ParameterList > ¶ms)
void getAllValues(ArrayRCP< Scalar > &values)
Gets the 1D pointer arrays of the graph.
void apply(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, Scalar alpha=ScalarTraits< Scalar >::one(), Scalar beta=ScalarTraits< Scalar >::zero()) const
void replaceDiag(const Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &diag)
Replace the diagonal entries of the matrix.
void apply(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Y, Teuchos::ETransp mode, Scalar alpha, Scalar beta, bool sumInterfaceValues, const RCP< Import< LocalOrdinal, GlobalOrdinal, Node > > ®ionInterfaceImporter, const Teuchos::ArrayRCP< LocalOrdinal > ®ionInterfaceLIDs) const
EpetraCrsMatrixT(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rowMap, const ArrayRCP< const size_t > &NumEntriesPerRowToAlloc, const Teuchos::RCP< Teuchos::ParameterList > &=Teuchos::null)
Constructor specifying (possibly different) number of entries in each row.
void getGlobalRowCopy(GlobalOrdinal GlobalRow, const ArrayView< GlobalOrdinal > &Indices, const ArrayView< Scalar > &Values, size_t &NumEntries) const
void doExport(const DistObject< char, LocalOrdinal, GlobalOrdinal, Node > &dest, const Export< LocalOrdinal, GlobalOrdinal, Node > &exporter, CombineMode CM)
Export (using an Importer).
void allocateAllValues(size_t numNonZeros, ArrayRCP< size_t > &rowptr, ArrayRCP< LocalOrdinal > &colind, ArrayRCP< Scalar > &values)
Allocates and returns ArrayRCPs of the Crs arrays — This is an Xpetra-only routine.
RCP< const Epetra_CrsMatrix > getEpetra_CrsMatrix() const
global_size_t getGlobalNumRows() const
Number of global elements in the row map of this matrix.
Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getMap() const
Implements DistObject interface.
void getAllValues(ArrayRCP< const size_t > &rowptr, ArrayRCP< const LocalOrdinal > &colind, ArrayRCP< const Scalar > &values) const
Gets the 1D pointer arrays of the graph.
void residual(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &B, MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &R) const
void replaceDiag(const Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &diag)
Replace the diagonal entries of the matrix.
Exception throws when you call an unimplemented method of Xpetra.
Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getMap() const
The Map describing the parallel distribution of this object.
bool isGloballyIndexed() const
If matrix indices are in the global range, this function returns true. Otherwise, this function retur...
void getLocalDiagOffsets(Teuchos::ArrayRCP< size_t > &offsets) const
Get offsets of the diagonal entries in the matrix.
size_t getLocalNumCols() const
Returns the number of matrix columns owned on the calling node.
void getGlobalRowView(GlobalOrdinal GlobalRow, ArrayView< const GlobalOrdinal > &indices, ArrayView< const Scalar > &values) const
Extract a const, non-persisting view of global indices in a specified row of the matrix.
void insertLocalValues(LocalOrdinal localRow, const ArrayView< const LocalOrdinal > &cols, const ArrayView< const Scalar > &vals)
void insertGlobalValues(GlobalOrdinal globalRow, const ArrayView< const GlobalOrdinal > &cols, const ArrayView< const Scalar > &vals)
Insert matrix entries, using global IDs.
void removeEmptyProcessesInPlace(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &newMap)
#define XPETRA_DYNAMIC_CAST(type, obj, newObj, exceptionMsg)
void setAllValues(const ArrayRCP< size_t > &rowptr, const ArrayRCP< LocalOrdinal > &colind, const ArrayRCP< Scalar > &values)
Sets the 1D pointer arrays of the graph.
size_t global_size_t
Global size_t object.
size_t getGlobalMaxNumRowEntries() const
Returns the maximum number of entries across all rows/columns on all nodes.
void doExport(const DistObject< char, LocalOrdinal, GlobalOrdinal, Node > &dest, const Import< LocalOrdinal, GlobalOrdinal, Node > &importer, CombineMode CM)
Export.
Xpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node >::local_matrix_type local_matrix_type
void getGlobalRowCopy(GlobalOrdinal GlobalRow, const ArrayView< GlobalOrdinal > &Indices, const ArrayView< Scalar > &Values, size_t &NumEntries) const
Extract a list of entries in a specified global row of this matrix. Put into pre-allocated storage...
void expertStaticFillComplete(const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap, const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap, const RCP< const Import< LocalOrdinal, GlobalOrdinal, Node > > &importer=Teuchos::null, const RCP< const Export< LocalOrdinal, GlobalOrdinal, Node > > &exporter=Teuchos::null, const RCP< ParameterList > ¶ms=Teuchos::null)
EpetraCrsMatrixT(const Teuchos::RCP< Epetra_CrsMatrix > &mtx)
EpetraCrsMatrixT constructor to wrap a Epetra_CrsMatrix object.
LocalOrdinal GetStorageBlockSize() const
Returns the block size of the storage mechanism, which is usually 1, except for Tpetra::BlockCrsMatri...
const RCP< const Comm< int > > getComm() const
Returns the communicator.
local_matrix_type getLocalMatrixDevice() const
const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getColMap() const
Returns the Map that describes the column distribution in this matrix.
void fillComplete(const RCP< ParameterList > ¶ms=null)
Signal that data entry is complete.
size_t getLocalNumEntries() const
Returns the local number of entries in this matrix.
#define XPETRA_RCP_DYNAMIC_CAST(type, obj, newObj, exceptionMsg)
global_size_t getGlobalNumCols() const
Number of global columns in the matrix.
EpetraCrsMatrixT(const Teuchos::RCP< const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &sourceMatrix, const Import< LocalOrdinal, GlobalOrdinal, Node > &importer, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap=Teuchos::null, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Constructor for a fused import.
void setObjectLabel(const std::string &objectLabel)
void scale(const Scalar &alpha)
EpetraCrsMatrixT(const Teuchos::RCP< const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &sourceMatrix, const Export< LocalOrdinal, GlobalOrdinal, Node > &RowExporter, const Teuchos::RCP< const Export< LocalOrdinal, GlobalOrdinal, Node > > DomainExporter, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap, const Teuchos::RCP< Teuchos::ParameterList > ¶ms)
Xpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node >::local_matrix_type local_matrix_type
void replaceGlobalValues(GlobalOrdinal globalRow, const ArrayView< const GlobalOrdinal > &cols, const ArrayView< const Scalar > &vals)
Tpetra::KokkosCompat::KokkosSerialWrapperNode EpetraNode
void replaceGlobalValues(GlobalOrdinal globalRow, const ArrayView< const GlobalOrdinal > &indices, const ArrayView< const Scalar > &values)
Replace matrix entries, using global IDs.
bool hasMatrix() const
Does this have an underlying matrix.
void getLocalRowCopy(LocalOrdinal LocalRow, const ArrayView< LocalOrdinal > &Indices, const ArrayView< Scalar > &Values, size_t &NumEntries) const
Extract a list of entries in a specified local row of the matrix. Put into storage allocated by calli...
bool isFillActive() const
Returns true if the matrix is in edit mode.
EpetraCrsMatrixT(const Teuchos::RCP< Epetra_CrsMatrix > &mtx)
EpetraCrsMatrixT constructor to wrap a Epetra_CrsMatrix object.
void residual(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &B, MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &R) const
size_t getNumEntriesInLocalRow(LocalOrdinal localRow) const
Returns the current number of entries on this node in the specified local row.
void doExport(const DistObject< char, LocalOrdinal, GlobalOrdinal, Node > &dest, const Import< LocalOrdinal, GlobalOrdinal, Node > &importer, CombineMode CM)
const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getRowMap() const
Returns the Map that describes the row distribution in this matrix.
void doExport(const DistObject< char, LocalOrdinal, GlobalOrdinal, Node > &dest, const Import< LocalOrdinal, GlobalOrdinal, Node > &importer, CombineMode CM)
Export.
void fillComplete(const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap, const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap, const RCP< ParameterList > ¶ms=null)
const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getDomainMap() const
Returns the Map associated with the domain of this operator. This will be null until fillComplete() i...
EpetraCrsMatrixT(const Teuchos::RCP< const CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > &graph, const Teuchos::RCP< Teuchos::ParameterList > &=Teuchos::null)
Constructor specifying a previously constructed graph.
EpetraCrsMatrixT(const Teuchos::RCP< const CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > &graph, const Teuchos::RCP< Teuchos::ParameterList > &=Teuchos::null)
Constructor specifying a previously constructed graph.
bool isFillActive() const
Returns true if the matrix is in edit mode.
global_size_t getGlobalNumEntries() const
Returns the global number of entries in this matrix.
CombineMode
Xpetra::Combine Mode enumerable type.
void doExport(const DistObject< char, LocalOrdinal, GlobalOrdinal, Node > &dest, const Export< LocalOrdinal, GlobalOrdinal, Node > &exporter, CombineMode CM)
Export (using an Importer).
const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getRangeMap() const
Returns the Map associated with the range of this operator, which must be compatible with Y...
#define XPETRA_MONITOR(funcName)
void setAllValues(const typename local_matrix_type::row_map_type &ptr, const typename local_matrix_type::StaticCrsGraphType::entries_type::non_const_type &ind, const typename local_matrix_type::values_type &val)
bool isLocallyIndexed() const
If matrix indices are in the local range, this function returns true. Otherwise, this function return...
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Print the object with some verbosity level to an FancyOStream object.
void setAllValues(const typename local_matrix_type::row_map_type &ptr, const typename local_matrix_type::StaticCrsGraphType::entries_type::non_const_type &ind, const typename local_matrix_type::values_type &val)
void doImport(const DistObject< char, LocalOrdinal, GlobalOrdinal, Node > &source, const Export< LocalOrdinal, GlobalOrdinal, Node > &exporter, CombineMode CM)
void getLocalDiagOffsets(Teuchos::ArrayRCP< size_t > &) const
Get offsets of the diagonal entries in the matrix.
void apply(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, Scalar alpha=ScalarTraits< Scalar >::one(), Scalar beta=ScalarTraits< Scalar >::zero()) const
Computes the sparse matrix-multivector multiplication.
RCP< Epetra_CrsMatrix > mtx_
const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getColMap() const
Returns the Map that describes the column distribution in this matrix.
global_size_t getGlobalNumEntries() const
Returns the global number of entries in this matrix.
EpetraCrsMatrixT(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rowMap)
Constructor for empty DynamicProfile matrix (no space is preallocated).
const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getRowMap() const
Returns the Map that describes the row distribution in this matrix.
bool haveGlobalConstants() const
Returns true if globalConstants have been computed; false otherwise.
void apply(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Y, Teuchos::ETransp mode, Scalar alpha, Scalar beta, bool sumInterfaceValues, const RCP< Import< LocalOrdinal, GlobalOrdinal, Node > > ®ionInterfaceImporter, const Teuchos::ArrayRCP< LocalOrdinal > ®ionInterfaceLIDs) const
KokkosSparse::CrsMatrix< impl_scalar_type, LocalOrdinal, execution_space, void, typename local_graph_type::size_type > local_matrix_type
The specialization of Kokkos::CrsMatrix that represents the part of the sparse matrix on each MPI pro...
void getLocalDiagCopy(Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &, const Teuchos::ArrayView< const size_t > &) const
Get a copy of the diagonal entries owned by this node, with local row indices, using row offsets...
global_size_t getGlobalNumCols() const
Number of global columns in the matrix.
void getLocalDiagCopy(Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &diag, const Teuchos::ArrayView< const size_t > &offsets) const
CrsMatrix< double, int, GlobalOrdinal, Node >::local_ordinal_type LocalOrdinal
local_matrix_type::HostMirror getLocalMatrixHost() const
size_t getNumEntriesInGlobalRow(GlobalOrdinal globalRow) const
Returns the current number of entries in the specified global row.
void fillComplete(const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap, const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap, const RCP< ParameterList > ¶ms=Teuchos::null)
Signal that data entry is complete, specifying domain and range maps.
EpetraCrsMatrixT(const Teuchos::RCP< const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &sourceMatrix, const Import< LocalOrdinal, GlobalOrdinal, Node > &importer, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap=Teuchos::null, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
void apply(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Y, Teuchos::ETransp mode, Scalar alpha, Scalar beta, bool sumInterfaceValues, const RCP< Import< LocalOrdinal, GlobalOrdinal, Node > > ®ionInterfaceImporter, const Teuchos::ArrayRCP< LocalOrdinal > ®ionInterfaceLIDs) const
EpetraCrsMatrixT(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 > &=Teuchos::null)
Constructor specifying column Map and fixed number of entries for each row.
void fillComplete(const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap, const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap, const RCP< ParameterList > ¶ms=Teuchos::null)
Signal that data entry is complete, specifying domain and range maps.
void getAllValues(ArrayRCP< const size_t > &rowptr, ArrayRCP< const LocalOrdinal > &colind, ArrayRCP< const Scalar > &values) const
EpetraCrsMatrixT(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 > &=Teuchos::null)
Constructor specifying column Map and fixed number of entries for each row.
global_size_t getGlobalNumRows() const
Number of global elements in the row map of this matrix.
bool isFillResumed_
Flag to keep track of fill status.
const Epetra_CrsGraph & toEpetra(const RCP< const CrsGraph< int, GlobalOrdinal, Node > > &graph)
EpetraCrsMatrixT(const Teuchos::RCP< const CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &sourceMatrix, const Export< LocalOrdinal, GlobalOrdinal, Node > &exporter, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap=Teuchos::null, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Constructor for a fused export.
void getLocalDiagCopy(Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &diag) const
const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getDomainMap() const
Returns the Map associated with the domain of this operator. This will be null until fillComplete() i...
void setObjectLabel(const std::string &objectLabel)
CrsMatrix< double, int, GlobalOrdinal, Node >::scalar_type Scalar
RCP< const CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > getCrsGraph() const
Returns the CrsGraph associated with this matrix.
void getLocalRowCopy(LocalOrdinal LocalRow, const ArrayView< LocalOrdinal > &Indices, const ArrayView< Scalar > &Values, size_t &NumEntries) const
size_t getGlobalMaxNumRowEntries() const
Returns the maximum number of entries across all rows/columns on all nodes.
EpetraCrsMatrixT(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rowMap, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &colMap, const local_matrix_type &lclMatrix, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=null)
Constructor specifying column Map and a local matrix, which the resulting CrsMatrix views...
const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getRangeMap() const
Returns the Map associated with the range of this operator, which must be compatible with Y...
EpetraGlobalOrdinal GlobalOrdinal
RCP< const CrsGraph< int, GlobalOrdinal, Node > > toXpetra(const Epetra_CrsGraph &g)
void replaceLocalValues(LocalOrdinal localRow, const ArrayView< const LocalOrdinal > &indices, const ArrayView< const Scalar > &values)
Replace matrix entries, using local IDs.
EpetraCrsMatrixT(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=Teuchos::null)
EpetraCrsMatrixT(const local_matrix_type &lclMatrix, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rowMap, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &colMap, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap=Teuchos::null, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=null)
void resumeFill(const RCP< ParameterList > &=Teuchos::null)
void replaceDomainMapAndImporter(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &newDomainMap, Teuchos::RCP< const Import< LocalOrdinal, GlobalOrdinal, Node > > &newImporter)