52 template<
class EpetraGlobalOrdinal,
class Node>
54 : mtx_(
Teuchos::
rcp(new Epetra_CrsMatrix(
Copy,
toEpetra<EpetraGlobalOrdinal,Node>(rowMap), maxNumEntriesPerRow,
toEpetra(pftype)))), isFillResumed_(false)
55 #ifdef HAVE_XPETRA_KOKKOS_REFACTOR
56 , isInitializedLocalMatrix_(false)
62 template<
class EpetraGlobalOrdinal,
class Node>
63 EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::EpetraCrsMatrixT(
const RCP<
const Map< LocalOrdinal, GlobalOrdinal, Node > > &rowMap,
const ArrayRCP< const size_t > &NumEntriesPerRowToAlloc,
ProfileType pftype,
const Teuchos::RCP< Teuchos::ParameterList > &plist)
64 : isFillResumed_(false)
65 #ifdef HAVE_XPETRA_KOKKOS_REFACTOR
66 , isInitializedLocalMatrix_(false)
69 Teuchos::Array<int> numEntriesPerRowToAlloc(NumEntriesPerRowToAlloc.begin(), NumEntriesPerRowToAlloc.end());
70 mtx_ =
Teuchos::rcp(
new Epetra_CrsMatrix(Copy, toEpetra<EpetraGlobalOrdinal,Node>(rowMap), numEntriesPerRowToAlloc.getRawPtr(),
toEpetra(pftype)));
75 template<
class EpetraGlobalOrdinal,
class Node>
76 EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::EpetraCrsMatrixT(
const RCP<
const Map< LocalOrdinal, GlobalOrdinal, Node > > &rowMap,
const RCP<
const Map< LocalOrdinal, GlobalOrdinal, Node > > &colMap,
size_t maxNumEntriesPerRow,
ProfileType pftype,
const Teuchos::RCP< Teuchos::ParameterList > &plist)
77 : mtx_(
Teuchos::
rcp(new Epetra_CrsMatrix(
Copy,
toEpetra<EpetraGlobalOrdinal,Node>(rowMap),
toEpetra<EpetraGlobalOrdinal,Node>(colMap), maxNumEntriesPerRow,
toEpetra(pftype)))), isFillResumed_(false)
78 #ifdef HAVE_XPETRA_KOKKOS_REFACTOR
79 , isInitializedLocalMatrix_(false)
85 template<
class EpetraGlobalOrdinal,
class Node>
86 EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::EpetraCrsMatrixT(
const RCP<
const Map< LocalOrdinal, GlobalOrdinal, Node > > &rowMap,
const RCP<
const Map< LocalOrdinal, GlobalOrdinal, Node > > &colMap,
const ArrayRCP< const size_t > &NumEntriesPerRowToAlloc,
ProfileType pftype,
const Teuchos::RCP< Teuchos::ParameterList > &plist)
87 : isFillResumed_(false)
88 #ifdef HAVE_XPETRA_KOKKOS_REFACTOR
89 , isInitializedLocalMatrix_(false)
92 Teuchos::Array<int> numEntriesPerRowToAlloc(NumEntriesPerRowToAlloc.begin(), NumEntriesPerRowToAlloc.end());
93 mtx_ =
Teuchos::rcp(
new Epetra_CrsMatrix(Copy, toEpetra<EpetraGlobalOrdinal,Node>(rowMap), toEpetra<EpetraGlobalOrdinal,Node>(colMap), numEntriesPerRowToAlloc.getRawPtr(),
toEpetra(pftype)));
98 template<
class EpetraGlobalOrdinal,
class Node>
100 : mtx_(
Teuchos::
rcp(new Epetra_CrsMatrix(
Copy,
toEpetra<EpetraGlobalOrdinal,Node>(graph)))), isFillResumed_(false)
101 #ifdef HAVE_XPETRA_KOKKOS_REFACTOR
102 , isInitializedLocalMatrix_(false)
108 template<
class EpetraGlobalOrdinal,
class Node>
109 EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::EpetraCrsMatrixT(
const EpetraCrsMatrixT& matrix)
110 : mtx_(
Teuchos::
rcp(new Epetra_CrsMatrix(*(matrix.mtx_)))), isFillResumed_(false)
111 #ifdef HAVE_XPETRA_KOKKOS_REFACTOR
112 , isInitializedLocalMatrix_(false)
118 template<
class EpetraGlobalOrdinal,
class Node>
119 EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::EpetraCrsMatrixT(
const Teuchos::RCP<
const CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >& sourceMatrix,
120 const Import<LocalOrdinal,GlobalOrdinal,Node> &importer,
121 const Teuchos::RCP<
const Map<LocalOrdinal,GlobalOrdinal,Node> >& domainMap,
122 const Teuchos::RCP<
const Map<LocalOrdinal,GlobalOrdinal,Node> >& rangeMap,
124 isFillResumed_(false)
125 #ifdef HAVE_XPETRA_KOKKOS_REFACTOR
126 , isInitializedLocalMatrix_(false)
129 XPETRA_DYNAMIC_CAST(
const EpetraCrsMatrixT<GlobalOrdinal COMMA Node>, *sourceMatrix, tSourceMatrix,
"Xpetra::EpetraCrsMatrixT constructor only accepts Xpetra::EpetraCrsMatrixT as an input argument.");
130 XPETRA_DYNAMIC_CAST(
const EpetraImportT<GlobalOrdinal COMMA Node>, importer, tImporter,
"Xpetra::EpetraCrsMatrixT constructor only accepts Xpetra::EpetraImportT as an input argument.");
132 const Epetra_Map* myDomainMap = (domainMap!=Teuchos::null)? &toEpetra<EpetraGlobalOrdinal,Node>(domainMap): 0;
133 const Epetra_Map* myRangeMap = (rangeMap !=Teuchos::null)? &toEpetra<EpetraGlobalOrdinal,Node>(rangeMap) : 0;
136 bool restrictComm=
false;
137 if(!params.
is_null()) restrictComm = params->
get(
"Restrict Communicator",restrictComm);
138 mtx_ =
Teuchos::rcp(
new Epetra_CrsMatrix(*tSourceMatrix.getEpetra_CrsMatrix(),*tImporter.getEpetra_Import(),myDomainMap,myRangeMap,restrictComm));
139 if(restrictComm && mtx_->NumMyRows()==0)
145 template<
class EpetraGlobalOrdinal,
class Node>
147 const Export<LocalOrdinal,EpetraGlobalOrdinal,Node> &exporter,
148 const Teuchos::RCP<
const Map<LocalOrdinal,EpetraGlobalOrdinal,Node> >& domainMap,
149 const Teuchos::RCP<
const Map<LocalOrdinal,EpetraGlobalOrdinal,Node> >& rangeMap,
151 isFillResumed_(false)
152 #ifdef HAVE_XPETRA_KOKKOS_REFACTOR
153 , isInitializedLocalMatrix_(false)
156 XPETRA_DYNAMIC_CAST(
const EpetraCrsMatrixT<GlobalOrdinal COMMA Node>, *sourceMatrix, tSourceMatrix,
"Xpetra::EpetraCrsMatrixT constructor only accepts Xpetra::EpetraCrsMatrixT as an input argument.");
157 XPETRA_DYNAMIC_CAST(
const EpetraExportT<GlobalOrdinal COMMA Node>, exporter, tExporter,
"Xpetra::EpetraCrsMatrixT constructor only accepts Xpetra::EpetraExportT as an input argument.");
159 const Epetra_Map* myDomainMap = (domainMap!=Teuchos::null)? &toEpetra<EpetraGlobalOrdinal,Node>(domainMap): 0;
160 const Epetra_Map* myRangeMap = (rangeMap !=Teuchos::null)? &toEpetra<EpetraGlobalOrdinal,Node>(rangeMap) : 0;
163 bool restrictComm=
false;
164 if(!params.
is_null()) restrictComm = params->
get(
"Restrict Communicator",restrictComm);
166 mtx_ =
Teuchos::rcp(
new Epetra_CrsMatrix(*tSourceMatrix.getEpetra_CrsMatrix(),*tExporter.getEpetra_Export(),myDomainMap,myRangeMap,restrictComm));
171 #ifdef HAVE_XPETRA_KOKKOS_REFACTOR 172 template<
class EpetraGlobalOrdinal,
class Node>
173 EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::EpetraCrsMatrixT (
const Teuchos::RCP<
const Map<LocalOrdinal,GlobalOrdinal,Node> >& rowMap,
174 const Teuchos::RCP<
const Map<LocalOrdinal,GlobalOrdinal,Node> >& colMap,
175 const local_matrix_type& lclMatrix,
178 typedef typename local_matrix_type::size_type size_type;
179 typedef typename local_matrix_type::value_type value_type;
180 typedef typename local_matrix_type::ordinal_type ordinal_type;
183 ordinal_type lclNumRows = lclMatrix.numRows ();
184 ordinal_type lclNumCols = lclMatrix.numCols ();
190 std::vector<GlobalOrdinal> domainMapGids;
193 for (ordinal_type r = 0; r < lclNumRows; ++r) {
195 Kokkos::SparseRowView<local_matrix_type,size_type> rowview = lclMatrix.template row<size_type>(r);
196 NumEntriesPerRowToAlloc[r] = rowview.length;
200 isFillResumed_ =
false;
201 Teuchos::Array<int> numEntriesPerRowToAlloc(NumEntriesPerRowToAlloc.begin(), NumEntriesPerRowToAlloc.end());
202 mtx_ =
Teuchos::rcp(
new Epetra_CrsMatrix(Copy, toEpetra<EpetraGlobalOrdinal,Node>(rowMap), toEpetra<EpetraGlobalOrdinal,Node>(colMap), numEntriesPerRowToAlloc.getRawPtr(),
toEpetra(
DynamicProfile)));
205 for (ordinal_type r = 0; r < lclNumRows; ++r) {
207 Kokkos::SparseRowView<local_matrix_type,size_type> rowview = lclMatrix.template row<size_type>(r);
213 for(ordinal_type c = 0; c < rowview.length; c++) {
214 value_type value = rowview.value (c);
215 ordinal_type colidx = rowview.colidx (c);
223 GlobalOrdinal gcid = colMap->getGlobalElement(c);
224 if(rowMap->isNodeGlobalElement(gcid)) domainMapGids.push_back(gcid);
226 insertLocalValues(r, indout.view(0,indout.size()), valout.view(0,valout.size()));
231 std::sort(domainMapGids.begin(), domainMapGids.end());
232 domainMapGids.erase(std::unique(domainMapGids.begin(), domainMapGids.end()), domainMapGids.end());
238 this->fillComplete(domainMap, rowMap, params);
241 isInitializedLocalMatrix_ =
false;
247 template<
class EpetraGlobalOrdinal,
class Node>
248 void EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::insertGlobalValues(GlobalOrdinal globalRow,
const ArrayView<const GlobalOrdinal> &cols,
const ArrayView<const Scalar> &vals) {
250 XPETRA_ERR_CHECK(mtx_->InsertGlobalValues(globalRow, vals.size(), vals.getRawPtr(), cols.getRawPtr()));
255 template<
class EpetraGlobalOrdinal,
class Node>
256 void EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::insertLocalValues(LocalOrdinal localRow,
const ArrayView<const LocalOrdinal> &cols,
const ArrayView<const Scalar> &vals) {
258 XPETRA_ERR_CHECK(mtx_->InsertMyValues(localRow, vals.size(), vals.getRawPtr(), cols.getRawPtr()));
263 template<
class EpetraGlobalOrdinal,
class Node>
264 void EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::replaceGlobalValues(GlobalOrdinal globalRow,
const ArrayView< const GlobalOrdinal > &indices,
const ArrayView< const Scalar > &values) {
268 const std::string tfecfFuncName(
"replaceGlobalValues");
270 ": Fill must be active in order to call this method. If you have already " 271 "called fillComplete(), you need to call resumeFill() before you can " 275 std::runtime_error,
": values.size() must equal indices.size().");
278 XPETRA_ERR_CHECK(mtx_->ReplaceGlobalValues(globalRow, indices.size(), values.getRawPtr(), indices.getRawPtr()));
284 template<
class EpetraGlobalOrdinal,
class Node>
285 void EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::replaceLocalValues(LocalOrdinal localRow,
const ArrayView< const LocalOrdinal > &indices,
const ArrayView< const Scalar > &values) {
289 const std::string tfecfFuncName(
"replaceLocalValues");
291 ": Fill must be active in order to call this method. If you have already " 292 "called fillComplete(), you need to call resumeFill() before you can " 296 std::runtime_error,
": values.size() must equal indices.size().");
299 XPETRA_ERR_CHECK(mtx_->ReplaceMyValues(localRow, indices.size(), values.getRawPtr(), indices.getRawPtr()));
305 template<
class EpetraGlobalOrdinal,
class Node>
306 void EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::allocateAllValues(
size_t numNonZeros, ArrayRCP<size_t>& rowptr, ArrayRCP<LocalOrdinal>& colind, ArrayRCP<Scalar>& values) {
314 rowptr.resize(getNodeNumRows()+1);
317 bool ownMemory =
false;
321 Epetra_IntSerialDenseVector& myColind = mtx_->ExpertExtractIndices();
322 myColind.Resize(numNonZeros);
323 colind = Teuchos::arcp(myColind.Values(), lowerOffset, numNonZeros, ownMemory);
327 double *& myValues = mtx_->ExpertExtractValues();
329 myValues =
new double[numNonZeros];
330 values = Teuchos::arcp(myValues,lowerOffset,numNonZeros,ownMemory);
335 template<
class EpetraGlobalOrdinal,
class Node>
336 void EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::setAllValues(
const ArrayRCP<size_t>& rowptr,
const ArrayRCP<LocalOrdinal>& colind,
const ArrayRCP<Scalar>& values) {
341 "An exception is thrown to let you know that the size of your rowptr array is incorrect.");
343 "An exception is thrown to let you know that you mismatched your pointers.");
346 if (values.size() > 0) {
348 "An exception is thrown to let you know that you mismatched your pointers.");
350 "An exception is thrown to let you know that you mismatched your pointers.");
355 const size_t N = getNodeNumRows();
357 Epetra_IntSerialDenseVector& myRowptr = mtx_->ExpertExtractIndexOffset();
358 myRowptr.Resize(N+1);
359 for (
size_t i = 0; i < N+1; i++)
360 myRowptr[i] = Teuchos::as<int>(rowptr[i]);
364 template<
class EpetraGlobalOrdinal,
class Node>
365 void EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::getAllValues(ArrayRCP<const size_t>& rowptr, ArrayRCP<const LocalOrdinal>& colind, ArrayRCP<const Scalar>& values)
const {
369 bool ownMemory =
false;
371 const size_t n = getNodeNumRows();
372 const size_t nnz = getNodeNumEntries();
376 Epetra_IntSerialDenseVector& myRowptr = mtx_->ExpertExtractIndexOffset();
378 for (
size_t i = 0; i < n+1; i++)
379 (*const_cast<size_t*>(&rowptr[i])) = Teuchos::as<size_t>(myRowptr[i]);
382 colind = Teuchos::arcp(mtx_->ExpertExtractIndices().Values(), lowerOffset, nnz, ownMemory);
385 values = Teuchos::arcp(mtx_->ExpertExtractValues(), lowerOffset, nnz, ownMemory);
389 template<
class EpetraGlobalOrdinal,
class Node>
390 void EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::resumeFill(
const RCP< ParameterList > ¶ms) {
394 isFillResumed_ =
true;
398 template<
class EpetraGlobalOrdinal,
class Node>
399 bool EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::isFillComplete()
const {
XPETRA_MONITOR(
"EpetraCrsMatrixT::isFillComplete");
if (isFillResumed_)
return false;
else return mtx_->Filled(); }
402 template<
class EpetraGlobalOrdinal,
class Node>
403 bool EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::isFillActive()
const {
XPETRA_MONITOR(
"EpetraCrsMatrixT::isFillActive");
return !isFillComplete(); }
406 template<
class EpetraGlobalOrdinal,
class Node>
407 bool EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::supportsRowViews()
const {
XPETRA_MONITOR(
"EpetraCrsMatrixT::supportsRowViews");
return true; }
412 template<
class EpetraGlobalOrdinal,
class Node>
413 void EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::getLocalRowCopy(LocalOrdinal LocalRow,
const ArrayView<LocalOrdinal> &Indices,
const ArrayView<Scalar> &Values,
size_t &NumEntries)
const {
417 XPETRA_ERR_CHECK(mtx_->ExtractMyRowCopy(LocalRow, Indices.size(), numEntries, Values.getRawPtr(), Indices.getRawPtr()));
418 NumEntries = numEntries;
422 template<
class EpetraGlobalOrdinal,
class Node>
423 void EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::getGlobalRowCopy(GlobalOrdinal GlobalRow,
const ArrayView<GlobalOrdinal> &Indices,
const ArrayView<Scalar> &Values,
size_t &NumEntries)
const {
427 XPETRA_ERR_CHECK(mtx_->ExtractGlobalRowCopy(GlobalRow, Indices.size(), numEntries, Values.getRawPtr(), Indices.getRawPtr()));
428 NumEntries = numEntries;
432 template<
class EpetraGlobalOrdinal,
class Node>
433 void EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::getGlobalRowView(GlobalOrdinal GlobalRow, ArrayView<const GlobalOrdinal> &indices, ArrayView<const Scalar> &values)
const {
438 GlobalOrdinal * eIndices;
440 XPETRA_ERR_CHECK(mtx_->ExtractGlobalRowView(GlobalRow, numEntries, eValues, eIndices));
441 if (numEntries == 0) { eValues = NULL; eIndices = NULL; }
443 indices = ArrayView<const GlobalOrdinal>(eIndices, numEntries);
444 values = ArrayView<const double>(eValues, numEntries);
448 template<
class EpetraGlobalOrdinal,
class Node>
449 void EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::getLocalRowView(LocalOrdinal LocalRow, ArrayView<const LocalOrdinal> &indices, ArrayView<const Scalar> &values)
const {
456 XPETRA_ERR_CHECK(mtx_->ExtractMyRowView(LocalRow, numEntries, eValues, eIndices));
457 if (numEntries == 0) { eValues = NULL; eIndices = NULL; }
459 indices = ArrayView<const int>(eIndices, numEntries);
460 values = ArrayView<const double>(eValues, numEntries);
464 template<
class EpetraGlobalOrdinal,
class Node>
465 void EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::apply(
const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Y,
Teuchos::ETransp mode, Scalar alpha, Scalar beta)
const {
470 XPETRA_DYNAMIC_CAST(
const EpetraMultiVectorT<GlobalOrdinal COMMA Node>, X, eX,
"Xpetra::EpetraCrsMatrixT->apply() only accept Xpetra::EpetraMultiVectorT as input arguments.");
471 XPETRA_DYNAMIC_CAST( EpetraMultiVectorT<GlobalOrdinal COMMA Node>, Y, eY,
"Xpetra::EpetraCrsMatrixT->apply() only accept Xpetra::EpetraMultiVectorT as input arguments.");
479 RCP<Epetra_MultiVector> epY = eY.getEpetra_MultiVector();
482 RCP<Epetra_MultiVector> tmp =
Teuchos::rcp(
new Epetra_MultiVector(*epY));
484 XPETRA_ERR_CHECK(mtx_->Multiply(eTrans, *eX.getEpetra_MultiVector(), *tmp));
491 template<
class EpetraGlobalOrdinal,
class Node>
492 std::string EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::description()
const {
496 std::ostringstream oss;
498 if (isFillComplete()) {
499 oss <<
"{status = fill complete" 500 <<
", global rows = " << getGlobalNumRows()
501 <<
", global cols = " << getGlobalNumCols()
502 <<
", global num entries = " << getGlobalNumEntries()
506 oss <<
"{status = fill not complete" 507 <<
", global rows = " << getGlobalNumRows()
515 template<
class EpetraGlobalOrdinal,
class Node>
530 RCP<const Comm<int> > comm = this->getComm();
531 const int myImageID = comm->getRank(),
532 numImages = comm->getSize();
534 for (
size_t dec=10; dec<getGlobalNumRows(); dec *= 10) {
537 width = std::max<size_t>(width,11) + 2;
547 if (myImageID == 0) out << this->description() << std::endl;
549 if (isFillComplete() && myImageID == 0) {
550 out <<
"Global number of diagonals = " << getGlobalNumDiags() << std::endl;
551 out <<
"Global max number of entries = " << getGlobalMaxNumRowEntries() << std::endl;
555 if (myImageID == 0) out <<
"\nRow map: " << std::endl;
556 getRowMap()->describe(out,vl);
558 if (getColMap() != null) {
559 if (getColMap() == getRowMap()) {
560 if (myImageID == 0) out <<
"\nColumn map is row map.";
563 if (myImageID == 0) out <<
"\nColumn map: " << std::endl;
564 getColMap()->describe(out,vl);
567 if (getDomainMap() != null) {
568 if (getDomainMap() == getRowMap()) {
569 if (myImageID == 0) out <<
"\nDomain map is row map.";
571 else if (getDomainMap() == getColMap()) {
572 if (myImageID == 0) out <<
"\nDomain map is row map.";
575 if (myImageID == 0) out <<
"\nDomain map: " << std::endl;
576 getDomainMap()->describe(out,vl);
579 if (getRangeMap() != null) {
580 if (getRangeMap() == getDomainMap()) {
581 if (myImageID == 0) out <<
"\nRange map is domain map." << std::endl;
583 else if (getRangeMap() == getRowMap()) {
584 if (myImageID == 0) out <<
"\nRange map is row map." << std::endl;
587 if (myImageID == 0) out <<
"\nRange map: " << std::endl;
588 getRangeMap()->describe(out,vl);
591 if (myImageID == 0) out << std::endl;
595 for (
int imageCtr = 0; imageCtr < numImages; ++imageCtr) {
596 if (myImageID == imageCtr) {
597 out <<
"Node ID = " << imageCtr << std::endl;
610 out <<
"Node number of entries = " << getNodeNumEntries() << std::endl;
611 if (isFillComplete()) {
612 out <<
"Node number of diagonals = " << getNodeNumDiags() << std::endl;
614 out <<
"Node max number of entries = " << getNodeMaxNumRowEntries() << std::endl;
623 for (
int imageCtr = 0; imageCtr < numImages; ++imageCtr) {
624 if (myImageID == imageCtr) {
625 out << std::setw(width) <<
"Node ID" 626 << std::setw(width) <<
"Global Row" 627 << std::setw(width) <<
"Num Entries";
629 out << std::setw(width) <<
"(Index,Value)";
632 for (
size_t r=0; r < getNodeNumRows(); ++r) {
633 const size_t nE = getNumEntriesInLocalRow(r);
634 GlobalOrdinal gid = getRowMap()->getGlobalElement(r);
635 out << std::setw(width) << myImageID
636 << std::setw(width) << gid
637 << std::setw(width) << nE;
639 if (isGloballyIndexed()) {
640 ArrayView<const GlobalOrdinal> rowinds;
641 ArrayView<const Scalar> rowvals;
642 getGlobalRowView(gid,rowinds,rowvals);
643 for (
size_t j=0; j < nE; ++j) {
644 out <<
" (" << rowinds[j]
645 <<
", " << rowvals[j]
649 else if (isLocallyIndexed()) {
650 ArrayView<const LocalOrdinal> rowinds;
651 ArrayView<const Scalar> rowvals;
652 getLocalRowView(r,rowinds,rowvals);
653 for (
size_t j=0; j < nE; ++j) {
654 out <<
" (" << getColMap()->getGlobalElement(rowinds[j])
655 <<
", " << rowvals[j]
674 template<
class EpetraGlobalOrdinal,
class Node>
675 void EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::doImport(
const DistObject<char, LocalOrdinal, GlobalOrdinal, Node> &source,
676 const Import<LocalOrdinal, GlobalOrdinal, Node> &importer,
CombineMode CM) {
679 XPETRA_DYNAMIC_CAST(
const EpetraCrsMatrixT<GlobalOrdinal COMMA Node>, source, tSource,
"Xpetra::EpetraCrsMatrixT::doImport only accept Xpetra::EpetraCrsMatrixT as input arguments.");
680 XPETRA_DYNAMIC_CAST(
const EpetraImportT<GlobalOrdinal COMMA Node>, importer, tImporter,
"Xpetra::EpetraCrsMatrixT::doImport only accept Xpetra::EpetraImportT as input arguments.");
682 RCP<const Epetra_CrsMatrix> v = tSource.getEpetra_CrsMatrix();
683 int err = mtx_->Import(*v, *tImporter.getEpetra_Import(),
toEpetra(CM));
688 template<
class EpetraGlobalOrdinal,
class Node>
689 void EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::doExport(
const DistObject<char, LocalOrdinal, GlobalOrdinal, Node> &dest,
690 const Import<LocalOrdinal, GlobalOrdinal, Node>& importer,
CombineMode CM) {
693 XPETRA_DYNAMIC_CAST(
const EpetraCrsMatrixT<GlobalOrdinal COMMA Node>, dest, tDest,
"Xpetra::EpetraCrsMatrixT::doImport only accept Xpetra::EpetraCrsMatrixT as input arguments.");
694 XPETRA_DYNAMIC_CAST(
const EpetraImportT<GlobalOrdinal COMMA Node>, importer, tImporter,
"Xpetra::EpetraCrsMatrixT::doImport only accept Xpetra::EpetraImportT as input arguments.");
696 RCP<const Epetra_CrsMatrix> v = tDest.getEpetra_CrsMatrix();
697 int err = mtx_->Export(*v, *tImporter.getEpetra_Import(),
toEpetra(CM));
702 template<
class EpetraGlobalOrdinal,
class Node>
703 void EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::doImport(
const DistObject<char, LocalOrdinal, GlobalOrdinal, Node> &source,
704 const Export<LocalOrdinal, GlobalOrdinal, Node>& exporter,
CombineMode CM) {
707 XPETRA_DYNAMIC_CAST(
const EpetraCrsMatrixT<GlobalOrdinal COMMA Node>, source, tSource,
"Xpetra::EpetraCrsMatrixT::doImport only accept Xpetra::EpetraCrsMatrixT as input arguments.");
708 XPETRA_DYNAMIC_CAST(
const EpetraExportT<GlobalOrdinal COMMA Node>, exporter, tExporter,
"Xpetra::EpetraCrsMatrixT::doImport only accept Xpetra::EpetraImportT as input arguments.");
710 RCP<const Epetra_CrsMatrix> v = tSource.getEpetra_CrsMatrix();
711 int err = mtx_->Import(*v, *tExporter.getEpetra_Export(),
toEpetra(CM));
717 template<
class EpetraGlobalOrdinal,
class Node>
718 void EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::doExport(
const DistObject<char, LocalOrdinal, GlobalOrdinal, Node> &dest,
719 const Export<LocalOrdinal, GlobalOrdinal, Node>& exporter,
CombineMode CM) {
722 XPETRA_DYNAMIC_CAST(
const EpetraCrsMatrixT<GlobalOrdinal COMMA Node>, dest, tDest,
"Xpetra::EpetraCrsMatrixT::doImport only accept Xpetra::EpetraCrsMatrixT as input arguments.");
723 XPETRA_DYNAMIC_CAST(
const EpetraExportT<GlobalOrdinal COMMA Node>, exporter, tExporter,
"Xpetra::EpetraCrsMatrixT::doImport only accept Xpetra::EpetraImportT as input arguments.");
725 RCP<const Epetra_CrsMatrix> v = tDest.getEpetra_CrsMatrix();
726 int err = mtx_->Export(*v, *tExporter.getEpetra_Export(),
toEpetra(CM));
731 template<
class EpetraGlobalOrdinal,
class Node>
732 void EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::fillComplete(
const RCP<
const Map< LocalOrdinal, GlobalOrdinal, Node > > &domainMap,
733 const RCP<
const Map< LocalOrdinal, GlobalOrdinal, Node > > &rangeMap,
734 const RCP< ParameterList > ¶ms) {
738 if (isFillResumed_ ==
true) { isFillResumed_ =
false;
return; }
740 bool doOptimizeStorage =
true;
741 if (params != null && params->get(
"Optimize Storage",
true) ==
false) doOptimizeStorage =
false;
742 mtx_->FillComplete(toEpetra<EpetraGlobalOrdinal,Node>(domainMap), toEpetra<EpetraGlobalOrdinal,Node>(rangeMap), doOptimizeStorage);
746 template<
class EpetraGlobalOrdinal,
class Node>
747 void EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::fillComplete(
const RCP< ParameterList > ¶ms) {
751 if (isFillResumed_ ==
true) { isFillResumed_ =
false;
return; }
753 bool doOptimizeStorage =
true;
754 if (params != null && params->get(
"Optimize Storage",
true) ==
false) doOptimizeStorage =
false;
755 mtx_->FillComplete(doOptimizeStorage);
759 template<
class EpetraGlobalOrdinal,
class Node>
760 void EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::replaceDomainMapAndImporter(
const Teuchos::RCP<
const Map< LocalOrdinal, GlobalOrdinal, Node > >& newDomainMap,
Teuchos::RCP<
const Import<LocalOrdinal,GlobalOrdinal,Node> > & newImporter) {
762 XPETRA_DYNAMIC_CAST(
const EpetraImportT<GlobalOrdinal COMMA Node>, *newImporter, eImporter,
"Xpetra::EpetraCrsMatrixT::replaceDomainMapAndImporter only accepts Xpetra::EpetraImportT.");
764 const RCP<const Epetra_Import> & myImport = eImporter.getEpetra_Import();
766 if(myImport==Teuchos::null)
767 rv=mtx_->ReplaceDomainMapAndImporter( toEpetra<EpetraGlobalOrdinal,Node>(newDomainMap),0);
769 rv=mtx_->ReplaceDomainMapAndImporter( toEpetra<EpetraGlobalOrdinal,Node>(newDomainMap),&*myImport);
774 template<
class EpetraGlobalOrdinal,
class Node>
775 void EpetraCrsMatrixT<EpetraGlobalOrdinal, Node>::expertStaticFillComplete(
const RCP<
const Map<LocalOrdinal,GlobalOrdinal,Node> > & domainMap,
776 const RCP<
const Map<LocalOrdinal,GlobalOrdinal,Node> > & rangeMap,
777 const RCP<
const Import<LocalOrdinal,GlobalOrdinal,Node> > &importer,
778 const RCP<
const Export<LocalOrdinal,GlobalOrdinal,Node> > &exporter,
779 const RCP<ParameterList> & params) {
782 const Epetra_Import * myimport =0;
783 const Epetra_Export * myexport =0;
785 if(!importer.is_null()) {
786 XPETRA_DYNAMIC_CAST(
const EpetraImportT<GlobalOrdinal COMMA Node>, *importer, eImporter,
"Xpetra::EpetraCrsMatrixT::expertStaticFillComplete only accepts Xpetra::EpetraImportT.");
787 myimport = eImporter.getEpetra_Import().getRawPtr();
789 if(!exporter.is_null()) {
790 XPETRA_DYNAMIC_CAST(
const EpetraExportT<GlobalOrdinal COMMA Node>, *exporter, eExporter,
"Xpetra::EpetraCrsMatrixT::expertStaticFillComplete only accepts Xpetra::EpetraImportT.");
791 myexport = eExporter.getEpetra_Export().getRawPtr();
794 rv=mtx_->ExpertStaticFillComplete(toEpetra<EpetraGlobalOrdinal,Node>(domainMap), toEpetra<EpetraGlobalOrdinal,Node>(rangeMap), myimport, myexport);
801 #ifndef XPETRA_EPETRA_NO_32BIT_GLOBAL_INDICES 802 #ifdef HAVE_XPETRA_TPETRA 803 #ifdef HAVE_XPETRA_SERIAL 804 template class EpetraCrsMatrixT<int, Kokkos::Compat::KokkosSerialWrapperNode >;
806 #ifdef HAVE_XPETRA_PTHREAD 807 template class EpetraCrsMatrixT<int, Kokkos::Compat::KokkosThreadsWrapperNode>;
809 #ifdef HAVE_XPETRA_OPENMP 810 template class EpetraCrsMatrixT<int, Kokkos::Compat::KokkosOpenMPWrapperNode >;
812 #ifdef HAVE_XPETRA_CUDA 813 typedef Kokkos::Compat::KokkosCudaWrapperNode default_node_type;
814 template class EpetraCrsMatrixT<int, default_node_type >;
819 template class EpetraCrsMatrixT<int, default_node_type >;
820 #endif // HAVE_XPETRA_TPETRA 823 #ifndef XPETRA_EPETRA_NO_64BIT_GLOBAL_INDICES 824 #ifdef HAVE_XPETRA_TPETRA 825 #ifdef HAVE_XPETRA_SERIAL 826 template class EpetraCrsMatrixT<long long, Kokkos::Compat::KokkosSerialWrapperNode >;
828 #ifdef HAVE_XPETRA_PTHREAD 829 template class EpetraCrsMatrixT<long long, Kokkos::Compat::KokkosThreadsWrapperNode>;
831 #ifdef HAVE_XPETRA_OPENMP 832 template class EpetraCrsMatrixT<long long, Kokkos::Compat::KokkosOpenMPWrapperNode >;
834 #ifdef HAVE_XPETRA_CUDA 835 typedef Kokkos::Compat::KokkosCudaWrapperNode default_node_type;
836 template class EpetraCrsMatrixT<long long, default_node_type >;
841 template class EpetraCrsMatrixT<long long, default_node_type >;
842 #endif // HAVE_XPETRA_TPETRA static Teuchos::RCP< Map< LocalOrdinal, GlobalOrdinal, Node > > Build(UnderlyingLib lib, global_size_t numGlobalElements, GlobalOrdinal indexBase, const Teuchos::RCP< const Teuchos::Comm< int > > &comm, LocalGlobal lg=Xpetra::GloballyDistributed, const Teuchos::RCP< Node > &node=defaultArgNode())
Map constructor with Xpetra-defined contiguous uniform distribution.
T & get(const std::string &name, T def_value)
#define TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(throw_exception_test, Exception, msg)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Exception throws to report errors in the internal logical of the program.
const Epetra_CrsGraph & toEpetra(const RCP< const CrsGraph< int, GlobalOrdinal, Node > > &graph)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
#define XPETRA_ERR_CHECK(arg)
void resize(size_type new_size, const value_type &x=value_type())
Exception throws when you call an unimplemented method of Xpetra.
#define XPETRA_DYNAMIC_CAST(type, obj, newObj, exceptionMsg)
CombineMode
Xpetra::Combine Mode enumerable type.
#define XPETRA_MONITOR(funcName)
EpetraCrsMatrixT(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rowMap, size_t maxNumEntriesPerRow, ProfileType pftype=DynamicProfile, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)