48 #ifndef PACKAGES_XPETRA_SUP_UTILS_XPETRA_MATRIXMATRIX_HPP_
49 #define PACKAGES_XPETRA_SUP_UTILS_XPETRA_MATRIXMATRIX_HPP_
54 #include "Xpetra_CrsMatrixWrap.hpp"
55 #include "Xpetra_MapExtractor.hpp"
56 #include "Xpetra_Map.hpp"
59 #include "Xpetra_StridedMapFactory.hpp"
60 #include "Xpetra_StridedMap.hpp"
62 #ifdef HAVE_XPETRA_EPETRA
66 #ifdef HAVE_XPETRA_EPETRAEXT
67 #include <EpetraExt_MatrixMatrix.h>
68 #include <EpetraExt_RowMatrixOut.h>
69 #include <Epetra_RowMatrixTransposer.h>
72 #ifdef HAVE_XPETRA_TPETRA
73 #include <TpetraExt_MatrixMatrix.hpp>
74 #include <Tpetra_RowMatrixTransposer.hpp>
75 #include <MatrixMarket_Tpetra.hpp>
76 #include <Xpetra_TpetraCrsMatrix.hpp>
77 #include <Xpetra_TpetraMultiVector.hpp>
78 #include <Xpetra_TpetraVector.hpp>
89 template <
class Scalar,
90 class LocalOrdinal = int,
91 class GlobalOrdinal = LocalOrdinal,
98 #ifdef HAVE_XPETRA_EPETRA
103 "Cast from Xpetra::Matrix to Xpetra::CrsMatrixWrap failed");
108 "Cast from Xpetra::CrsMatrix to Xpetra::EpetraCrsMatrix failed");
110 return tmp_ECrsMtx->getEpetra_CrsMatrix();
118 "Cast from Xpetra::Matrix to Xpetra::CrsMatrixWrap failed");
124 return tmp_ECrsMtx->getEpetra_CrsMatrixNonConst();
134 "Cast from Xpetra::CrsMatrix to Xpetra::EpetraCrsMatrix failed");
136 return *tmp_ECrsMtx->getEpetra_CrsMatrix();
152 return *Teuchos::rcp_const_cast<Epetra_CrsMatrix>(tmp_ECrsMtx->getEpetra_CrsMatrix());
160 #ifdef HAVE_XPETRA_TPETRA
170 return tmp_ECrsMtx->getTpetra_CrsMatrix();
181 return tmp_ECrsMtx->getTpetra_CrsMatrixNonConst();
192 return *tmp_TCrsMtx->getTpetra_CrsMatrix();
207 return *Teuchos::rcp_const_cast<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >(tmp_TCrsMtx->getTpetra_CrsMatrix());
215 #ifdef HAVE_XPETRA_TPETRA
218 const tcrs_matrix_type& A,
bool transposeA,
const typename tcrs_matrix_type::scalar_type alpha,
219 const tcrs_matrix_type& B,
bool transposeB,
const typename tcrs_matrix_type::scalar_type beta)
224 using Teuchos::rcp_implicit_cast;
225 using Teuchos::rcpFromRef;
230 using transposer_type = Tpetra::RowMatrixTransposer<SC,LO,GO,NO>;
231 using import_type = Tpetra::Import<LO,GO,NO>;
234 Aprime = transposer_type(Aprime).createTranspose();
236 if(A.isFillComplete() && B.isFillComplete())
240 addParams->set(
"Call fillComplete",
false);
242 Tpetra::MatrixMatrix::add<SC,LO,GO,NO>(beta, transposeB, B, alpha,
false, *Aprime, *C, Teuchos::null, Teuchos::null, addParams);
243 return rcp_implicit_cast<Matrix>(
rcp(
new CrsWrap(rcp_implicit_cast<CrsType>(
rcp(
new XTCrsType(C))))));
253 Bprime = transposer_type(Bprime).createTranspose();
255 if(!(Aprime->getRowMap()->isSameAs(*(Bprime->getRowMap()))))
257 auto import =
rcp(
new import_type(Bprime->getRowMap(), Aprime->getRowMap()));
258 Bprime = Tpetra::importAndFillCompleteCrsMatrix<tcrs_matrix_type>(Bprime, *
import, Aprime->getDomainMap(), Aprime->getRangeMap());
261 LO numLocalRows = Aprime->getNodeNumRows();
264 for(
LO i = 0; i < numLocalRows; i++)
266 allocPerRow[i] = Aprime->getNumEntriesInLocalRow(i) + Bprime->getNumEntriesInLocalRow(i);
271 Tpetra::MatrixMatrix::Add<SC,LO,GO,NO>(
272 *Aprime,
false, alpha,
273 *Bprime,
false, beta,
275 return rcp(
new CrsWrap(rcp_implicit_cast<CrsType>(
rcp(
new XTCrsType(C)))));
280 #ifdef HAVE_XPETRA_EPETRAEXT
291 if(fillCompleteResult) {
292 errCode = EpetraExt::MatrixMatrix::Multiply(epA, transposeA, epB, transposeB, Ctemp,
true);
299 errCode = EpetraExt::MatrixMatrix::Multiply(epA, transposeA, epB, transposeB, Ctemp,
false);
302 long long* globalElementList =
nullptr;
303 Crowmap.MyGlobalElementsPtr(globalElementList);
305 for(
int i = 0; i < numLocalRows; i++)
311 for(
int i = 0; i < numLocalRows; i++)
313 int gid = globalElementList[i];
323 std::ostringstream buf;
325 std::string msg =
"EpetraExt::MatrixMatrix::Multiply returned nonzero error code " + buf.str();
332 template <
class Scalar,
334 class GlobalOrdinal ,
337 #undef XPETRA_MATRIXMATRIX_SHORT
367 const Matrix& B,
bool transposeB,
369 bool call_FillComplete_on_result =
true,
370 bool doOptimizeStorage =
true,
371 const std::string & label = std::string(),
382 bool haveMultiplyDoFillComplete = call_FillComplete_on_result && doOptimizeStorage;
385 #if defined(HAVE_XPETRA_EPETRA) && defined(HAVE_XPETRA_EPETRAEXT)
386 throw(
Xpetra::Exceptions::RuntimeError(
"Xpetra::MatrixMatrix::Multiply only available for GO=int or GO=long long with EpetraNode (Serial or OpenMP depending on configuration)"));
392 #ifdef HAVE_XPETRA_TPETRA
399 Tpetra::MatrixMatrix::Multiply(tpA, transposeA, tpB, transposeB, tpC, haveMultiplyDoFillComplete, label, params);
405 if (call_FillComplete_on_result && !haveMultiplyDoFillComplete) {
407 fillParams->
set(
"Optimize Storage", doOptimizeStorage);
414 RCP<Matrix> rcpA = Teuchos::rcp_const_cast<Matrix>(Teuchos::rcpFromRef(A));
415 RCP<Matrix> rcpB = Teuchos::rcp_const_cast<Matrix>(Teuchos::rcpFromRef(B));
416 C.
CreateView(
"stridedMaps", rcpA, transposeA, rcpB, transposeB);
443 bool doFillComplete =
true,
444 bool doOptimizeStorage =
true,
445 const std::string & label = std::string(),
454 if (C == Teuchos::null) {
455 double nnzPerRow = Teuchos::as<double>(0);
464 nnzPerRow *= nnzPerRow;
467 if (totalNnz < minNnz)
471 fos <<
"Matrix product nnz per row estimate = " << Teuchos::as<LO>(nnzPerRow) << std::endl;
479 fos <<
"Reuse C pattern" << std::endl;
482 Multiply(A, transposeA, B, transposeB, *C, doFillComplete, doOptimizeStorage, label, params);
498 bool callFillCompleteOnResult =
true,
bool doOptimizeStorage =
true,
const std::string& label = std::string(),
500 return Multiply(A, transposeA, B, transposeB, Teuchos::null, fos, callFillCompleteOnResult, doOptimizeStorage, label, params);
503 #ifdef HAVE_XPETRA_EPETRAEXT
508 throw(
Xpetra::Exceptions::RuntimeError(
"MLTwoMatrixMultiply only available for GO=int or GO=long long with EpetraNode (Serial or OpenMP depending on configuration)"));
526 bool doFillComplete =
true,
527 bool doOptimizeStorage =
true) {
529 "TwoMatrixMultiply for BlockedCrsMatrix not implemented for transposeA==true or transposeB==true");
540 for (
size_t i = 0; i < A.
Rows(); ++i) {
541 for (
size_t j = 0; j < B.
Cols(); ++j) {
544 for (
size_t l = 0; l < B.
Rows(); ++l) {
554 "A and B must be either both (compatible) BlockedCrsMatrix objects or both CrsMatrixWrap objects.");
558 Teuchos::rcp_const_cast<CrsGraph>(crmat1->getCrsGraph())->computeGlobalConstants();
560 Teuchos::rcp_const_cast<CrsGraph>(crmat2->getCrsGraph())->computeGlobalConstants();
563 "crmat1 does not have global constants");
565 "crmat2 does not have global constants");
567 if (crmat1->getGlobalNumEntries() == 0 || crmat2->getGlobalNumEntries() == 0)
573 if(crop1 != Teuchos::null && crop2 != Teuchos::null)
574 temp =
Multiply (*crop1,
false, *crop2,
false, fos);
584 temp =
TwoMatrixMultiplyBlock(*bop1, transposeA, *bop2, transposeB, fos, doFillComplete, doOptimizeStorage);
607 if (Cij->isFillComplete())
610 C->setMatrix(i, j, Cij);
612 C->setMatrix(i, j, Teuchos::null);
640 throw Exceptions::RuntimeError(
"TwoMatrixAdd for Epetra matrices needs <double,int,int> for Scalar, LocalOrdinal and GlobalOrdinal.");
642 #ifdef HAVE_XPETRA_TPETRA
646 Tpetra::MatrixMatrix::Add(tpA, transposeA, alpha, tpB, beta);
669 const Matrix& B,
bool transposeB,
const SC& beta,
683 if(rcpBopA == Teuchos::null && rcpBopB == Teuchos::null) {
689 #ifdef HAVE_XPETRA_TPETRA
690 using tcrs_matrix_type = Tpetra::CrsMatrix<SC,LO,GO,NO>;
692 const tcrs_matrix_type& tpA = helpers::Op2TpetraCrs(A);
693 const tcrs_matrix_type& tpB = helpers::Op2TpetraCrs(B);
694 C = helpers::tpetraAdd(tpA, transposeA, alpha, tpB, transposeB, beta);
700 if (A.
IsView(
"stridedMaps")) C->CreateView(
"stridedMaps", rcpFromRef(A));
701 if (B.
IsView(
"stridedMaps")) C->CreateView(
"stridedMaps", rcpFromRef(B));
705 else if(rcpBopA == Teuchos::null && rcpBopB != Teuchos::null) {
713 for (
size_t j = 0; j < rcpBopB->Cols(); ++j) {
715 if(rcpA != Teuchos::null &&
716 rcpBopB->getMatrix(i,j)!=Teuchos::null) {
719 *(rcpBopB->getMatrix(i,j)), transposeB, beta,
720 Cij, fos, AHasFixedNnzPerRow);
721 }
else if (rcpA == Teuchos::null &&
722 rcpBopB->getMatrix(i,j)!=Teuchos::null) {
723 Cij = rcpBopB->getMatrix(i,j);
724 }
else if (rcpA != Teuchos::null &&
725 rcpBopB->getMatrix(i,j)==Teuchos::null) {
726 Cij = Teuchos::rcp_const_cast<Matrix>(rcpA);
732 if (Cij->isFillComplete())
735 bC->setMatrix(i, j, Cij);
737 bC->setMatrix(i, j, Teuchos::null);
742 else if(rcpBopA != Teuchos::null && rcpBopB == Teuchos::null) {
749 for (
size_t i = 0; i < rcpBopA->Rows(); ++i) {
751 if(rcpBopA->getMatrix(i,j)!=Teuchos::null &&
752 rcpB!=Teuchos::null) {
754 TwoMatrixAdd(*(rcpBopA->getMatrix(i,j)), transposeA, alpha,
755 *rcpB, transposeB, beta,
756 Cij, fos, AHasFixedNnzPerRow);
757 }
else if (rcpBopA->getMatrix(i,j) == Teuchos::null &&
758 rcpB!=Teuchos::null) {
759 Cij = Teuchos::rcp_const_cast<Matrix>(rcpB);
760 }
else if (rcpBopA->getMatrix(i,j) != Teuchos::null &&
761 rcpB==Teuchos::null) {
762 Cij = rcpBopA->getMatrix(i,j);
768 if (Cij->isFillComplete())
771 bC->setMatrix(i, j, Cij);
773 bC->setMatrix(i, j, Teuchos::null);
795 for (
size_t i = 0; i < rcpBopA->Rows(); ++i) {
796 for (
size_t j = 0; j < rcpBopB->Cols(); ++j) {
799 if(rcpBopA->getMatrix(i,j)!=Teuchos::null &&
800 rcpBopB->getMatrix(i,j)!=Teuchos::null) {
802 TwoMatrixAdd(*(rcpBopA->getMatrix(i,j)), transposeA, alpha,
803 *(rcpBopB->getMatrix(i,j)), transposeB, beta,
804 Cij, fos, AHasFixedNnzPerRow);
805 }
else if (rcpBopA->getMatrix(i,j) == Teuchos::null &&
806 rcpBopB->getMatrix(i,j)!=Teuchos::null) {
807 Cij = rcpBopB->getMatrix(i,j);
808 }
else if (rcpBopA->getMatrix(i,j) != Teuchos::null &&
809 rcpBopB->getMatrix(i,j)==Teuchos::null) {
810 Cij = rcpBopA->getMatrix(i,j);
816 if (Cij->isFillComplete())
819 bC->setMatrix(i, j, Cij);
821 bC->setMatrix(i, j, Teuchos::null);
833 #ifdef HAVE_XPETRA_EPETRA
870 const Matrix& B,
bool transposeB,
872 bool call_FillComplete_on_result =
true,
873 bool doOptimizeStorage =
true,
874 const std::string & label = std::string(),
884 bool haveMultiplyDoFillComplete = call_FillComplete_on_result && doOptimizeStorage;
889 #if defined(HAVE_XPETRA_EPETRA) && defined(HAVE_XPETRA_EPETRAEXT)
890 helpers::epetraExtMult(A, transposeA, B, transposeB, C, haveMultiplyDoFillComplete);
895 #ifdef HAVE_XPETRA_TPETRA
896 # if ((defined(EPETRA_HAVE_OMP) && (!defined(HAVE_TPETRA_INST_OPENMP) || !defined(HAVE_TPETRA_INST_INT_INT))) || \
897 (!defined(EPETRA_HAVE_OMP) && (!defined(HAVE_TPETRA_INST_SERIAL) || !defined(HAVE_TPETRA_INST_INT_INT))))
900 const Tpetra::CrsMatrix<SC,LO,GO,NO> & tpA = helpers::Op2TpetraCrs(A);
901 const Tpetra::CrsMatrix<SC,LO,GO,NO> & tpB = helpers::Op2TpetraCrs(B);
902 Tpetra::CrsMatrix<SC,LO,GO,NO> & tpC = helpers::Op2NonConstTpetraCrs(C);
906 Tpetra::MatrixMatrix::Multiply(tpA, transposeA, tpB, transposeB, tpC, haveMultiplyDoFillComplete, label, params);
913 if (call_FillComplete_on_result && !haveMultiplyDoFillComplete) {
915 fillParams->
set(
"Optimize Storage",doOptimizeStorage);
922 RCP<Matrix> rcpA = Teuchos::rcp_const_cast<Matrix>(Teuchos::rcpFromRef(A));
923 RCP<Matrix> rcpB = Teuchos::rcp_const_cast<Matrix>(Teuchos::rcpFromRef(B));
924 C.
CreateView(
"stridedMaps", rcpA, transposeA, rcpB, transposeB);
950 const Matrix& B,
bool transposeB,
953 bool doFillComplete =
true,
954 bool doOptimizeStorage =
true,
955 const std::string & label = std::string(),
963 #if defined(HAVE_XPETRA_EPETRA) && defined(HAVE_XPETRA_EPETRAEXT) && defined(HAVE_XPETRA_ML_MMM)
969 RCP<Matrix> C = Convert_Epetra_CrsMatrix_ToXpetra_CrsMatrixWrap<SC,LO,GO,NO> (epC);
970 if (doFillComplete) {
972 fillParams->
set(
"Optimize Storage", doOptimizeStorage);
979 C->CreateView(
"stridedMaps", rcpFromRef(A), transposeA, rcpFromRef(B), transposeB);
988 if (C == Teuchos::null) {
989 double nnzPerRow = Teuchos::as<double>(0);
998 nnzPerRow *= nnzPerRow;
1001 if (totalNnz < minNnz)
1005 fos <<
"Matrix product nnz per row estimate = " << Teuchos::as<LO>(nnzPerRow) << std::endl;
1014 fos <<
"Reuse C pattern" << std::endl;
1017 Multiply(A, transposeA, B, transposeB, *C, doFillComplete, doOptimizeStorage, label, params);
1033 const Matrix& B,
bool transposeB,
1035 bool callFillCompleteOnResult =
true,
1036 bool doOptimizeStorage =
true,
1037 const std::string & label = std::string(),
1039 return Multiply(A, transposeA, B, transposeB, Teuchos::null, fos, callFillCompleteOnResult, doOptimizeStorage, label, params);
1042 #if defined(HAVE_XPETRA_EPETRA) && defined(HAVE_XPETRA_EPETRAEXT)
1047 #if defined(HAVE_XPETRA_ML_MMM)
1049 ML_Comm_Create(&comm);
1050 fos <<
"****** USING ML's MATRIX MATRIX MULTIPLY ******" << std::endl;
1055 ML_Comm_Set_UsrComm(comm,Mcomm->
GetMpiComm());
1058 EpetraExt::CrsMatrix_SolverMap Atransform;
1059 EpetraExt::CrsMatrix_SolverMap Btransform;
1067 ML_Operator* ml_As = ML_Operator_Create(comm);
1068 ML_Operator* ml_Bs = ML_Operator_Create(comm);
1071 ML_Operator* ml_AtimesB = ML_Operator_Create(comm);
1074 ML_2matmult(ml_As,ml_Bs,ml_AtimesB,ML_CSR_MATRIX);
1076 ML_Operator_Destroy(&ml_As);
1077 ML_Operator_Destroy(&ml_Bs);
1082 int N_local = ml_AtimesB->invec_leng;
1083 ML_CommInfoOP* getrow_comm = ml_AtimesB->getrow->pre_comm;
1085 ML_Comm* comm_AB = ml_AtimesB->comm;
1091 for (
int i = 0; i < getrow_comm->N_neighbors; i++) {
1092 N_rcvd += (getrow_comm->neighbors)[i].N_rcv;
1093 N_send += (getrow_comm->neighbors)[i].N_send;
1094 if ( ((getrow_comm->neighbors)[i].N_rcv != 0) &&
1095 ((getrow_comm->neighbors)[i].rcv_list != NULL) ) flag = 1;
1099 std::vector<double> dtemp(N_local + N_rcvd + 1);
1100 std::vector<int> cmap (N_local + N_rcvd + 1);
1101 for (
int i = 0; i < N_local; ++i) {
1103 dtemp[i] = (double) cmap[i];
1105 ML_cheap_exchange_bdry(&dtemp[0],getrow_comm,N_local,N_send,comm_AB);
1107 int count = N_local;
1108 const int neighbors = getrow_comm->N_neighbors;
1109 for (
int i = 0; i < neighbors; i++) {
1110 const int nrcv = getrow_comm->neighbors[i].N_rcv;
1111 for (
int j = 0; j < nrcv; j++)
1112 cmap[getrow_comm->neighbors[i].rcv_list[j]] = (
int) dtemp[count++];
1115 for (
int i = 0; i < N_local+N_rcvd; ++i)
1116 cmap[i] = (
int)dtemp[i];
1134 int educatedguess = 0;
1135 for (
int i = 0; i < myrowlength; ++i) {
1137 ML_get_matrix_row(ml_AtimesB, 1, &i, &allocated, &bindx, &val, &rowlength, 0);
1138 if (rowlength>educatedguess)
1139 educatedguess = rowlength;
1145 std::vector<int> gcid(educatedguess);
1146 for (
int i = 0; i < myrowlength; ++i) {
1147 const int grid = rowmap.
GID(i);
1149 ML_get_matrix_row(ml_AtimesB, 1, &i, &allocated, &bindx, &val, &rowlength, 0);
1150 if (!rowlength)
continue;
1151 if ((
int)gcid.size() < rowlength) gcid.resize(rowlength);
1152 for (
int j = 0; j < rowlength; ++j) {
1153 gcid[j] = gcmap.
GID(bindx[j]);
1157 int err = result->InsertGlobalValues(grid, rowlength, val, &gcid[0]);
1158 if (err != 0 && err != 1) {
1159 std::ostringstream errStr;
1160 errStr <<
"Epetra_CrsMatrix::InsertGlobalValues returned err=" << err;
1165 if (bindx) ML_free(bindx);
1166 if (val) ML_free(val);
1167 ML_Operator_Destroy(&ml_AtimesB);
1168 ML_Comm_Destroy(&comm);
1176 "No ML multiplication available. This feature is currently not supported by Xpetra.");
1195 bool doFillComplete =
true,
1196 bool doOptimizeStorage =
true) {
1198 "TwoMatrixMultiply for BlockedCrsMatrix not implemented for transposeA==true or transposeB==true");
1209 for (
size_t i = 0; i < A.
Rows(); ++i) {
1210 for (
size_t j = 0; j < B.
Cols(); ++j) {
1213 for (
size_t l = 0; l < B.
Rows(); ++l) {
1223 "A and B must be either both (compatible) BlockedCrsMatrix objects or both CrsMatrixWrap objects.");
1227 Teuchos::rcp_const_cast<CrsGraph>(crmat1->getCrsGraph())->computeGlobalConstants();
1229 Teuchos::rcp_const_cast<CrsGraph>(crmat2->getCrsGraph())->computeGlobalConstants();
1232 "crmat1 does not have global constants");
1234 "crmat2 does not have global constants");
1236 if (crmat1->getGlobalNumEntries() == 0 || crmat2->getGlobalNumEntries() == 0)
1243 if(crop1 != Teuchos::null && crop2 != Teuchos::null)
1244 temp =
Multiply (*crop1,
false, *crop2,
false, fos);
1254 temp =
TwoMatrixMultiplyBlock(*bop1, transposeA, *bop2, transposeB, fos, doFillComplete, doOptimizeStorage);
1277 if (Cij->isFillComplete())
1280 C->setMatrix(i, j, Cij);
1282 C->setMatrix(i, j, Teuchos::null);
1307 "TwoMatrixAdd: matrix row maps are not the same.");
1310 #if defined(HAVE_XPETRA_EPETRA) && defined(HAVE_XPETRA_EPETRAEXT)
1315 int rv = EpetraExt::MatrixMatrix::Add(epA, transposeA, alpha, epB, beta);
1319 std::ostringstream buf;
1324 #ifdef HAVE_XPETRA_TPETRA
1325 # if ((defined(EPETRA_HAVE_OMP) && (!defined(HAVE_TPETRA_INST_OPENMP) || !defined(HAVE_TPETRA_INST_INT_INT))) || \
1326 (!defined(EPETRA_HAVE_OMP) && (!defined(HAVE_TPETRA_INST_SERIAL) || !defined(HAVE_TPETRA_INST_INT_INT))))
1332 Tpetra::MatrixMatrix::Add(tpA, transposeA, alpha, tpB, beta);
1356 const Matrix& B,
bool transposeB,
const SC& beta,
1365 if(rcpBopA == Teuchos::null && rcpBopB == Teuchos::null) {
1373 #if defined(HAVE_XPETRA_EPETRA) && defined(HAVE_XPETRA_EPETRAEXT)
1378 size_t maxNzInA = 0;
1379 size_t maxNzInB = 0;
1380 size_t numLocalRows = 0;
1388 if (maxNzInA == 1 || maxNzInB == 1 || AHasFixedNnzPerRow) {
1393 if ((maxNzInA == 1 && maxNzInB > 1) || AHasFixedNnzPerRow) {
1394 for (
size_t i = 0; i < numLocalRows; ++i)
1398 for (
size_t i = 0; i < numLocalRows; ++i)
1402 fos <<
"MatrixMatrix::TwoMatrixAdd : special case detected (one matrix has a fixed nnz per row)"
1403 <<
", using static profiling" << std::endl;
1412 fos <<
"MatrixMatrix::TwoMatrixAdd : ** WARNING ** estimate could be badly wrong because second summand is transposed" << std::endl;
1418 int rv = EpetraExt::MatrixMatrix::Add(epA, transposeA, alpha, epB, transposeB, beta, ref2epC);
1426 #ifdef HAVE_XPETRA_TPETRA
1427 # if ((defined(EPETRA_HAVE_OMP) && (!defined(HAVE_TPETRA_INST_OPENMP) || !defined(HAVE_TPETRA_INST_INT_INT))) || \
1428 (!defined(EPETRA_HAVE_OMP) && (!defined(HAVE_TPETRA_INST_SERIAL) || !defined(HAVE_TPETRA_INST_INT_INT))))
1431 using tcrs_matrix_type = Tpetra::CrsMatrix<SC,LO,GO,NO>;
1432 const tcrs_matrix_type& tpA = helpers::Op2TpetraCrs(A);
1433 const tcrs_matrix_type& tpB = helpers::Op2TpetraCrs(B);
1434 C = helpers::tpetraAdd(tpA, transposeA, alpha, tpB, transposeB, beta);
1442 if (A.
IsView(
"stridedMaps")) C->CreateView(
"stridedMaps", rcpFromRef(A));
1443 if (B.
IsView(
"stridedMaps")) C->CreateView(
"stridedMaps", rcpFromRef(B));
1447 else if(rcpBopA == Teuchos::null && rcpBopB != Teuchos::null) {
1455 for (
size_t j = 0; j < rcpBopB->Cols(); ++j) {
1457 if(rcpA != Teuchos::null &&
1458 rcpBopB->getMatrix(i,j)!=Teuchos::null) {
1461 *(rcpBopB->getMatrix(i,j)), transposeB, beta,
1462 Cij, fos, AHasFixedNnzPerRow);
1463 }
else if (rcpA == Teuchos::null &&
1464 rcpBopB->getMatrix(i,j)!=Teuchos::null) {
1465 Cij = rcpBopB->getMatrix(i,j);
1466 }
else if (rcpA != Teuchos::null &&
1467 rcpBopB->getMatrix(i,j)==Teuchos::null) {
1468 Cij = Teuchos::rcp_const_cast<Matrix>(rcpA);
1470 Cij = Teuchos::null;
1474 if (Cij->isFillComplete())
1476 Cij->fillComplete();
1477 bC->setMatrix(i, j, Cij);
1479 bC->setMatrix(i, j, Teuchos::null);
1484 else if(rcpBopA != Teuchos::null && rcpBopB == Teuchos::null) {
1492 for (
size_t i = 0; i < rcpBopA->Rows(); ++i) {
1494 if(rcpBopA->getMatrix(i,j)!=Teuchos::null &&
1495 rcpB!=Teuchos::null) {
1497 TwoMatrixAdd(*(rcpBopA->getMatrix(i,j)), transposeA, alpha,
1498 *rcpB, transposeB, beta,
1499 Cij, fos, AHasFixedNnzPerRow);
1500 }
else if (rcpBopA->getMatrix(i,j) == Teuchos::null &&
1501 rcpB!=Teuchos::null) {
1502 Cij = Teuchos::rcp_const_cast<Matrix>(rcpB);
1503 }
else if (rcpBopA->getMatrix(i,j) != Teuchos::null &&
1504 rcpB==Teuchos::null) {
1505 Cij = rcpBopA->getMatrix(i,j);
1507 Cij = Teuchos::null;
1511 if (Cij->isFillComplete())
1513 Cij->fillComplete();
1514 bC->setMatrix(i, j, Cij);
1516 bC->setMatrix(i, j, Teuchos::null);
1539 for (
size_t i = 0; i < rcpBopA->Rows(); ++i) {
1540 for (
size_t j = 0; j < rcpBopB->Cols(); ++j) {
1543 if(rcpBopA->getMatrix(i,j)!=Teuchos::null &&
1544 rcpBopB->getMatrix(i,j)!=Teuchos::null) {
1547 TwoMatrixAdd(*(rcpBopA->getMatrix(i,j)), transposeA, alpha,
1548 *(rcpBopB->getMatrix(i,j)), transposeB, beta,
1549 Cij, fos, AHasFixedNnzPerRow);
1550 }
else if (rcpBopA->getMatrix(i,j) == Teuchos::null &&
1551 rcpBopB->getMatrix(i,j)!=Teuchos::null) {
1552 Cij = rcpBopB->getMatrix(i,j);
1553 }
else if (rcpBopA->getMatrix(i,j) != Teuchos::null &&
1554 rcpBopB->getMatrix(i,j)==Teuchos::null) {
1555 Cij = rcpBopA->getMatrix(i,j);
1557 Cij = Teuchos::null;
1561 if (Cij->isFillComplete())
1564 Cij->fillComplete();
1565 bC->setMatrix(i, j, Cij);
1567 bC->setMatrix(i, j, Teuchos::null);
1612 const Matrix& B,
bool transposeB,
1614 bool call_FillComplete_on_result =
true,
1615 bool doOptimizeStorage =
true,
1616 const std::string & label = std::string(),
1627 bool haveMultiplyDoFillComplete = call_FillComplete_on_result && doOptimizeStorage;
1630 #if defined(HAVE_XPETRA_EPETRA) && defined(HAVE_XPETRA_EPETRAEXT)
1631 helpers::epetraExtMult(A, transposeA, B, transposeB, C, haveMultiplyDoFillComplete);
1636 #ifdef HAVE_XPETRA_TPETRA
1637 # if ((defined(EPETRA_HAVE_OMP) && (!defined(HAVE_TPETRA_INST_OPENMP) || !defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \
1638 (!defined(EPETRA_HAVE_OMP) && (!defined(HAVE_TPETRA_INST_SERIAL) || !defined(HAVE_TPETRA_INST_INT_LONG_LONG))))
1641 const Tpetra::CrsMatrix<SC,LO,GO,NO> & tpA = helpers::Op2TpetraCrs(A);
1642 const Tpetra::CrsMatrix<SC,LO,GO,NO> & tpB = helpers::Op2TpetraCrs(B);
1643 Tpetra::CrsMatrix<SC,LO,GO,NO> & tpC = helpers::Op2NonConstTpetraCrs(C);
1647 Tpetra::MatrixMatrix::Multiply(tpA, transposeA, tpB, transposeB, tpC, haveMultiplyDoFillComplete, label, params);
1654 if(call_FillComplete_on_result && !haveMultiplyDoFillComplete) {
1656 fillParams->
set(
"Optimize Storage",doOptimizeStorage);
1663 RCP<Matrix> rcpA = Teuchos::rcp_const_cast<Matrix>(Teuchos::rcpFromRef(A));
1664 RCP<Matrix> rcpB = Teuchos::rcp_const_cast<Matrix>(Teuchos::rcpFromRef(B));
1665 C.
CreateView(
"stridedMaps", rcpA, transposeA, rcpB, transposeB);
1691 const Matrix& B,
bool transposeB,
1694 bool doFillComplete =
true,
1695 bool doOptimizeStorage =
true,
1696 const std::string & label = std::string(),
1705 if (C == Teuchos::null) {
1706 double nnzPerRow = Teuchos::as<double>(0);
1715 nnzPerRow *= nnzPerRow;
1718 if (totalNnz < minNnz)
1722 fos <<
"Matrix product nnz per row estimate = " << Teuchos::as<LO>(nnzPerRow) << std::endl;
1730 fos <<
"Reuse C pattern" << std::endl;
1733 Multiply(A, transposeA, B, transposeB, *C, doFillComplete, doOptimizeStorage, label, params);
1749 const Matrix& B,
bool transposeB,
1751 bool callFillCompleteOnResult =
true,
1752 bool doOptimizeStorage =
true,
1753 const std::string & label = std::string(),
1755 return Multiply(A, transposeA, B, transposeB, Teuchos::null, fos, callFillCompleteOnResult, doOptimizeStorage, label, params);
1758 #if defined(HAVE_XPETRA_EPETRA) && defined(HAVE_XPETRA_EPETRAEXT)
1764 "No ML multiplication available. This feature is currently not supported by Xpetra.");
1782 bool doFillComplete =
true,
1783 bool doOptimizeStorage =
true) {
1785 "TwoMatrixMultiply for BlockedCrsMatrix not implemented for transposeA==true or transposeB==true");
1796 for (
size_t i = 0; i < A.
Rows(); ++i) {
1797 for (
size_t j = 0; j < B.
Cols(); ++j) {
1800 for (
size_t l = 0; l < B.
Rows(); ++l) {
1810 "A and B must be either both (compatible) BlockedCrsMatrix objects or both CrsMatrixWrap objects.");
1814 Teuchos::rcp_const_cast<CrsGraph>(crmat1->getCrsGraph())->computeGlobalConstants();
1816 Teuchos::rcp_const_cast<CrsGraph>(crmat2->getCrsGraph())->computeGlobalConstants();
1819 "crmat1 does not have global constants");
1821 "crmat2 does not have global constants");
1823 if (crmat1->getGlobalNumEntries() == 0 || crmat2->getGlobalNumEntries() == 0)
1829 if(crop1 != Teuchos::null && crop2 != Teuchos::null)
1830 temp =
Multiply (*crop1,
false, *crop2,
false, fos);
1840 temp =
TwoMatrixMultiplyBlock(*bop1, transposeA, *bop2, transposeB, fos, doFillComplete, doOptimizeStorage);
1863 if (Cij->isFillComplete())
1866 C->setMatrix(i, j, Cij);
1868 C->setMatrix(i, j, Teuchos::null);
1893 "TwoMatrixAdd: matrix row maps are not the same.");
1896 #if defined(HAVE_XPETRA_EPETRA) && defined(HAVE_XPETRA_EPETRAEXT)
1901 int rv = EpetraExt::MatrixMatrix::Add(epA, transposeA, alpha, epB, beta);
1905 std::ostringstream buf;
1910 #ifdef HAVE_XPETRA_TPETRA
1911 # if ((defined(EPETRA_HAVE_OMP) && (!defined(HAVE_TPETRA_INST_OPENMP) || !defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \
1912 (!defined(EPETRA_HAVE_OMP) && (!defined(HAVE_TPETRA_INST_SERIAL) || !defined(HAVE_TPETRA_INST_INT_LONG_LONG))))
1918 Tpetra::MatrixMatrix::Add(tpA, transposeA, alpha, tpB, beta);
1942 const Matrix& B,
bool transposeB,
const SC& beta,
1949 if(rcpBopA == Teuchos::null && rcpBopB == Teuchos::null) {
1951 "TwoMatrixAdd: matrix row maps are not the same.");
1954 #if defined(HAVE_XPETRA_EPETRA) && defined(HAVE_XPETRA_EPETRAEXT)
1959 size_t maxNzInA = 0;
1960 size_t maxNzInB = 0;
1961 size_t numLocalRows = 0;
1969 if (maxNzInA == 1 || maxNzInB == 1 || AHasFixedNnzPerRow) {
1974 if ((maxNzInA == 1 && maxNzInB > 1) || AHasFixedNnzPerRow) {
1975 for (
size_t i = 0; i < numLocalRows; ++i)
1979 for (
size_t i = 0; i < numLocalRows; ++i)
1983 fos <<
"MatrixMatrix::TwoMatrixAdd : special case detected (one matrix has a fixed nnz per row)"
1984 <<
", using static profiling" << std::endl;
1993 fos <<
"MatrixMatrix::TwoMatrixAdd : ** WARNING ** estimate could be badly wrong because second summand is transposed" << std::endl;
1999 int rv = EpetraExt::MatrixMatrix::Add(epA, transposeA, alpha, epB, transposeB, beta, ref2epC);
2007 #ifdef HAVE_XPETRA_TPETRA
2008 # if ((defined(EPETRA_HAVE_OMP) && (!defined(HAVE_TPETRA_INST_OPENMP) || !defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \
2009 (!defined(EPETRA_HAVE_OMP) && (!defined(HAVE_TPETRA_INST_SERIAL) || !defined(HAVE_TPETRA_INST_INT_LONG_LONG))))
2013 using tcrs_matrix_type = Tpetra::CrsMatrix<SC,LO,GO,NO>;
2016 C = helpers::tpetraAdd(tpA, transposeA, alpha, tpB, transposeB, beta);
2024 if (A.
IsView(
"stridedMaps")) C->CreateView(
"stridedMaps", rcpFromRef(A));
2025 if (B.
IsView(
"stridedMaps")) C->CreateView(
"stridedMaps", rcpFromRef(B));
2029 else if(rcpBopA == Teuchos::null && rcpBopB != Teuchos::null) {
2037 for (
size_t j = 0; j < rcpBopB->Cols(); ++j) {
2039 if(rcpA != Teuchos::null &&
2040 rcpBopB->getMatrix(i,j)!=Teuchos::null) {
2043 *(rcpBopB->getMatrix(i,j)), transposeB, beta,
2044 Cij, fos, AHasFixedNnzPerRow);
2045 }
else if (rcpA == Teuchos::null &&
2046 rcpBopB->getMatrix(i,j)!=Teuchos::null) {
2047 Cij = rcpBopB->getMatrix(i,j);
2048 }
else if (rcpA != Teuchos::null &&
2049 rcpBopB->getMatrix(i,j)==Teuchos::null) {
2050 Cij = Teuchos::rcp_const_cast<Matrix>(rcpA);
2052 Cij = Teuchos::null;
2056 if (Cij->isFillComplete())
2058 Cij->fillComplete();
2059 bC->setMatrix(i, j, Cij);
2061 bC->setMatrix(i, j, Teuchos::null);
2066 else if(rcpBopA != Teuchos::null && rcpBopB == Teuchos::null) {
2074 for (
size_t i = 0; i < rcpBopA->Rows(); ++i) {
2076 if(rcpBopA->getMatrix(i,j)!=Teuchos::null &&
2077 rcpB!=Teuchos::null) {
2079 TwoMatrixAdd(*(rcpBopA->getMatrix(i,j)), transposeA, alpha,
2080 *rcpB, transposeB, beta,
2081 Cij, fos, AHasFixedNnzPerRow);
2082 }
else if (rcpBopA->getMatrix(i,j) == Teuchos::null &&
2083 rcpB!=Teuchos::null) {
2084 Cij = Teuchos::rcp_const_cast<Matrix>(rcpB);
2085 }
else if (rcpBopA->getMatrix(i,j) != Teuchos::null &&
2086 rcpB==Teuchos::null) {
2087 Cij = rcpBopA->getMatrix(i,j);
2089 Cij = Teuchos::null;
2093 if (Cij->isFillComplete())
2095 Cij->fillComplete();
2096 bC->setMatrix(i, j, Cij);
2098 bC->setMatrix(i, j, Teuchos::null);
2121 for (
size_t i = 0; i < rcpBopA->Rows(); ++i) {
2122 for (
size_t j = 0; j < rcpBopB->Cols(); ++j) {
2125 if(rcpBopA->getMatrix(i,j)!=Teuchos::null &&
2126 rcpBopB->getMatrix(i,j)!=Teuchos::null) {
2129 TwoMatrixAdd(*(rcpBopA->getMatrix(i,j)), transposeA, alpha,
2130 *(rcpBopB->getMatrix(i,j)), transposeB, beta,
2131 Cij, fos, AHasFixedNnzPerRow);
2132 }
else if (rcpBopA->getMatrix(i,j) == Teuchos::null &&
2133 rcpBopB->getMatrix(i,j)!=Teuchos::null) {
2134 Cij = rcpBopB->getMatrix(i,j);
2135 }
else if (rcpBopA->getMatrix(i,j) != Teuchos::null &&
2136 rcpBopB->getMatrix(i,j)==Teuchos::null) {
2137 Cij = rcpBopA->getMatrix(i,j);
2139 Cij = Teuchos::null;
2143 if (Cij->isFillComplete())
2146 Cij->fillComplete();
2147 bC->setMatrix(i, j, Cij);
2149 bC->setMatrix(i, j, Teuchos::null);
2162 #define XPETRA_MATRIXMATRIX_SHORT
int NumMyElements() const
const Epetra_Map & ColMap() const
int ExtractGlobalRowView(int GlobalRow, int &NumEntries, double *&Values, int *&Indices) const
int NumGlobalEntries(long long Row) const
const Epetra_Map & RangeMap() const
virtual int InsertGlobalValues(int GlobalRow, int NumEntries, const double *Values, const int *Indices)
const Epetra_Map & DomainMap() const
const Epetra_Map & RowMap() const
const Epetra_Comm & Comm() const
MPI_Comm GetMpiComm() const
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
static RCP< Time > getNewTimer(const std::string &name)
virtual size_t Rows() const
number of row blocks
RCP< const MapExtractor > getDomainMapExtractor() const
Returns map extractor for domain map.
bool isFillComplete() const
Returns true if fillComplete() has been called and the matrix is in compute mode.
RCP< const Map > getDomainMap() const
Returns the Map associated with the domain of this operator.
RCP< const Map > getRangeMap() const
Returns the Map associated with the range of this operator.
RCP< const MapExtractor > getRangeMapExtractor() const
Returns map extractor class for range map.
virtual size_t Cols() const
number of column blocks
Teuchos::RCP< Matrix > getMatrix(size_t r, size_t c) const
return block (r,c)
Concrete implementation of Xpetra::Matrix.
RCP< CrsMatrix > getCrsMatrix() const
Exception indicating invalid cast attempted.
Exception throws to report incompatible objects (like maps).
Exception throws to report errors in the internal logical of the program.
Tpetra::CrsMatrix< SC, LO, GO, NO > tcrs_matrix_type
static const Epetra_CrsMatrix & Op2EpetraCrs(const Matrix &Op)
static Tpetra::CrsMatrix< SC, LO, GO, NO > & Op2NonConstTpetraCrs(const Matrix &Op)
static RCP< const Epetra_CrsMatrix > Op2EpetraCrs(RCP< Matrix > Op)
static const Tpetra::CrsMatrix< SC, LO, GO, NO > & Op2TpetraCrs(const Matrix &Op)
static RCP< const Tpetra::CrsMatrix< SC, LO, GO, NO > > Op2TpetraCrs(RCP< Matrix > Op)
static Epetra_CrsMatrix & Op2NonConstEpetraCrs(const Matrix &Op)
static RCP< Tpetra::CrsMatrix< SC, LO, GO, NO > > Op2NonConstTpetraCrs(RCP< Matrix > Op)
static Teuchos::RCP< Matrix > tpetraAdd(const tcrs_matrix_type &A, bool transposeA, const typename tcrs_matrix_type::scalar_type alpha, const tcrs_matrix_type &B, bool transposeB, const typename tcrs_matrix_type::scalar_type beta)
static RCP< Epetra_CrsMatrix > Op2NonConstEpetraCrs(RCP< Matrix > Op)
static void epetraExtMult(const Matrix &A, bool transposeA, const Matrix &B, bool transposeB, Matrix &C, bool fillCompleteResult)
static RCP< Matrix > Build(const RCP< const Map > &rowMap)
static void TwoMatrixAdd(const Matrix &A, bool transposeA, const SC &alpha, const Matrix &B, bool transposeB, const SC &beta, RCP< Matrix > &C, Teuchos::FancyOStream &fos, bool AHasFixedNnzPerRow=false)
Helper function to calculate C = alpha*A + beta*B.
static void TwoMatrixAdd(const Matrix &A, bool transposeA, SC alpha, Matrix &B, SC beta)
Helper function to calculate B = alpha*A + beta*B.
static RCP< Matrix > Multiply(const Matrix &A, bool transposeA, const Matrix &B, bool transposeB, Teuchos::FancyOStream &fos, bool callFillCompleteOnResult=true, bool doOptimizeStorage=true, const std::string &label=std::string(), const RCP< ParameterList > ¶ms=null)
Helper function to do matrix-matrix multiply.
static RCP< BlockedCrsMatrix > TwoMatrixMultiplyBlock(const BlockedCrsMatrix &A, bool transposeA, const BlockedCrsMatrix &B, bool transposeB, Teuchos::FancyOStream &fos, bool doFillComplete=true, bool doOptimizeStorage=true)
Helper function to do matrix-matrix multiply "in-place".
static void Multiply(const Matrix &A, bool transposeA, const Matrix &B, bool transposeB, Matrix &C, bool call_FillComplete_on_result=true, bool doOptimizeStorage=true, const std::string &label=std::string(), const RCP< ParameterList > ¶ms=null)
static RCP< Matrix > Multiply(const Matrix &A, bool transposeA, const Matrix &B, bool transposeB, RCP< Matrix > C_in, Teuchos::FancyOStream &fos, bool doFillComplete=true, bool doOptimizeStorage=true, const std::string &label=std::string(), const RCP< ParameterList > ¶ms=null)
Helper function to do matrix-matrix multiply.
static RCP< Epetra_CrsMatrix > MLTwoMatrixMultiply(const Epetra_CrsMatrix &epA, const Epetra_CrsMatrix &epB, Teuchos::FancyOStream &fos)
static void TwoMatrixAdd(const Matrix &A, bool transposeA, SC alpha, Matrix &B, SC beta)
Helper function to calculate B = alpha*A + beta*B.
static RCP< Matrix > Multiply(const Matrix &A, bool transposeA, const Matrix &B, bool transposeB, RCP< Matrix > C_in, Teuchos::FancyOStream &fos, bool doFillComplete=true, bool doOptimizeStorage=true, const std::string &label=std::string(), const RCP< ParameterList > ¶ms=null)
Helper function to do matrix-matrix multiply.
static RCP< Matrix > Multiply(const Matrix &A, bool transposeA, const Matrix &B, bool transposeB, Teuchos::FancyOStream &fos, bool callFillCompleteOnResult=true, bool doOptimizeStorage=true, const std::string &label=std::string(), const RCP< ParameterList > ¶ms=null)
Helper function to do matrix-matrix multiply.
static RCP< BlockedCrsMatrix > TwoMatrixMultiplyBlock(const BlockedCrsMatrix &A, bool transposeA, const BlockedCrsMatrix &B, bool transposeB, Teuchos::FancyOStream &fos, bool doFillComplete=true, bool doOptimizeStorage=true)
Helper function to do matrix-matrix multiply "in-place".
static void TwoMatrixAdd(const Matrix &A, bool transposeA, const SC &alpha, const Matrix &B, bool transposeB, const SC &beta, RCP< Matrix > &C, Teuchos::FancyOStream &fos, bool AHasFixedNnzPerRow=false)
Helper function to calculate C = alpha*A + beta*B.
static RCP< Epetra_CrsMatrix > MLTwoMatrixMultiply(const Epetra_CrsMatrix &, const Epetra_CrsMatrix &, Teuchos::FancyOStream &)
static void Multiply(const Matrix &A, bool transposeA, const Matrix &B, bool transposeB, Matrix &C, bool call_FillComplete_on_result=true, bool doOptimizeStorage=true, const std::string &label=std::string(), const RCP< ParameterList > ¶ms=null)
static void TwoMatrixAdd(const Matrix &A, bool transposeA, SC alpha, Matrix &B, SC beta)
Helper function to calculate B = alpha*A + beta*B.
static RCP< Matrix > Multiply(const Matrix &A, bool transposeA, const Matrix &B, bool transposeB, Teuchos::FancyOStream &fos, bool callFillCompleteOnResult=true, bool doOptimizeStorage=true, const std::string &label=std::string(), const RCP< ParameterList > ¶ms=null)
Helper function to do matrix-matrix multiply.
static RCP< BlockedCrsMatrix > TwoMatrixMultiplyBlock(const BlockedCrsMatrix &A, bool transposeA, const BlockedCrsMatrix &B, bool transposeB, Teuchos::FancyOStream &fos, bool doFillComplete=true, bool doOptimizeStorage=true)
Helper function to do matrix-matrix multiply "in-place".
static RCP< Matrix > Multiply(const Matrix &A, bool transposeA, const Matrix &B, bool transposeB, RCP< Matrix > C_in, Teuchos::FancyOStream &fos, bool doFillComplete=true, bool doOptimizeStorage=true, const std::string &label=std::string(), const RCP< ParameterList > ¶ms=null)
Helper function to do matrix-matrix multiply.
static RCP< Epetra_CrsMatrix > MLTwoMatrixMultiply(const Epetra_CrsMatrix &epA, const Epetra_CrsMatrix &epB, Teuchos::FancyOStream &fos)
static void TwoMatrixAdd(const Matrix &A, bool transposeA, const SC &alpha, const Matrix &B, bool transposeB, const SC &beta, RCP< Matrix > &C, Teuchos::FancyOStream &fos, bool AHasFixedNnzPerRow=false)
Helper function to calculate C = alpha*A + beta*B.
static void Multiply(const Matrix &A, bool transposeA, const Matrix &B, bool transposeB, Matrix &C, bool call_FillComplete_on_result=true, bool doOptimizeStorage=true, const std::string &label=std::string(), const RCP< ParameterList > ¶ms=null)
Xpetra-specific matrix class.
virtual global_size_t getGlobalNumEntries() const =0
Returns the global number of entries in this matrix.
void CreateView(viewLabel_t viewLabel, const RCP< const Map > &rowMap, const RCP< const Map > &colMap)
virtual global_size_t getGlobalNumRows() const =0
Returns the number of global rows in this matrix.
virtual size_t getNodeNumRows() const =0
Returns the number of matrix rows owned on the calling node.
virtual bool isFillComplete() const =0
Returns true if fillComplete() has been called and the matrix is in compute mode.
virtual size_t getNodeMaxNumRowEntries() const =0
Returns the maximum number of entries across all rows/columns on this node.
virtual void fillComplete(const RCP< const Map > &domainMap, const RCP< const Map > &rangeMap, const RCP< ParameterList > ¶ms=null)=0
Signal that data entry is complete, specifying domain and range maps.
virtual size_t getNumEntriesInLocalRow(LocalOrdinal localRow) const =0
Returns the current number of entries on this node in the specified local row.
bool IsView(const viewLabel_t viewLabel) const
virtual const RCP< const Map > & getRowMap() const
Returns the Map that describes the row distribution in this matrix.
virtual Teuchos::RCP< const Map > getRangeMap() const =0
The Map associated with the range of this operator, which must be compatible with Y....
virtual Teuchos::RCP< const Map > getDomainMap() const =0
The Map associated with the domain of this operator, which must be compatible with X....
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
#define TEUCHOS_UNREACHABLE_RETURN(dummyReturnVal)
std::string toString(const T &t)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)