46 #ifndef MUELU_UTILITIES_DEF_HPP 47 #define MUELU_UTILITIES_DEF_HPP 49 #include <Teuchos_DefaultComm.hpp> 50 #include <Teuchos_ParameterList.hpp> 54 #ifdef HAVE_MUELU_EPETRA 56 # include "Epetra_MpiComm.h" 60 #if defined(HAVE_MUELU_EPETRA) && defined(HAVE_MUELU_EPETRAEXT) 67 #include <Xpetra_EpetraUtils.hpp> 68 #include <Xpetra_EpetraMultiVector.hpp> 72 #ifdef HAVE_MUELU_TPETRA 73 #include <MatrixMarket_Tpetra.hpp> 74 #include <Tpetra_RowMatrixTransposer.hpp> 75 #include <TpetraExt_MatrixMatrix.hpp> 76 #include <Xpetra_TpetraMultiVector.hpp> 77 #include <Xpetra_TpetraCrsMatrix.hpp> 78 #include <Xpetra_TpetraBlockCrsMatrix.hpp> 81 #ifdef HAVE_MUELU_EPETRA 82 #include <Xpetra_EpetraMap.hpp> 85 #include <Xpetra_BlockedCrsMatrix.hpp> 87 #include <Xpetra_Import.hpp> 88 #include <Xpetra_ImportFactory.hpp> 89 #include <Xpetra_Map.hpp> 90 #include <Xpetra_MapFactory.hpp> 91 #include <Xpetra_Matrix.hpp> 92 #include <Xpetra_MatrixFactory.hpp> 93 #include <Xpetra_MultiVector.hpp> 94 #include <Xpetra_MultiVectorFactory.hpp> 95 #include <Xpetra_Operator.hpp> 96 #include <Xpetra_Vector.hpp> 97 #include <Xpetra_VectorFactory.hpp> 99 #include <Xpetra_MatrixMatrix.hpp> 102 #if defined(HAVE_MUELU_EPETRA) && defined(HAVE_MUELU_ML) 103 #include <ml_operator.h> 104 #include <ml_epetra_utils.h> 109 #ifdef HAVE_MUELU_EPETRA 110 using Xpetra::EpetraCrsMatrix;
111 using Xpetra::EpetraMultiVector;
114 #ifdef HAVE_MUELU_EPETRA 116 template<
typename SC,
typename LO,
typename GO,
typename NO>
120 #ifdef HAVE_MUELU_EPETRA 121 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
123 RCP<const EpetraMultiVector > tmpVec = rcp_dynamic_cast<EpetraMultiVector>(Vec);
124 if (tmpVec == Teuchos::null)
125 throw Exceptions::BadCast(
"Cast from Xpetra::MultiVector to Xpetra::EpetraMultiVector failed");
126 return tmpVec->getEpetra_MultiVector();
129 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
131 RCP<const EpetraMultiVector> tmpVec = rcp_dynamic_cast<EpetraMultiVector>(Vec);
132 if (tmpVec == Teuchos::null)
133 throw Exceptions::BadCast(
"Cast from Xpetra::MultiVector to Xpetra::EpetraMultiVector failed");
134 return tmpVec->getEpetra_MultiVector();
137 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
139 const EpetraMultiVector& tmpVec =
dynamic_cast<const EpetraMultiVector&
>(Vec);
140 return *(tmpVec.getEpetra_MultiVector());
143 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
145 const EpetraMultiVector& tmpVec =
dynamic_cast<const EpetraMultiVector&
>(Vec);
146 return *(tmpVec.getEpetra_MultiVector());
149 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
151 RCP<const CrsMatrixWrap> crsOp = rcp_dynamic_cast<
const CrsMatrixWrap>(Op);
152 if (crsOp == Teuchos::null)
154 const RCP<const EpetraCrsMatrix>& tmp_ECrsMtx = rcp_dynamic_cast<
const EpetraCrsMatrix>(crsOp->getCrsMatrix());
155 if (tmp_ECrsMtx == Teuchos::null)
156 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::EpetraCrsMatrix failed");
157 return tmp_ECrsMtx->getEpetra_CrsMatrix();
160 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
162 RCP<const CrsMatrixWrap> crsOp = rcp_dynamic_cast<
const CrsMatrixWrap>(Op);
163 if (crsOp == Teuchos::null)
165 const RCP<const EpetraCrsMatrix> &tmp_ECrsMtx = rcp_dynamic_cast<
const EpetraCrsMatrix>(crsOp->getCrsMatrix());
166 if (tmp_ECrsMtx == Teuchos::null)
167 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::EpetraCrsMatrix failed");
168 return tmp_ECrsMtx->getEpetra_CrsMatrixNonConst();
171 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
174 const CrsMatrixWrap& crsOp =
dynamic_cast<const CrsMatrixWrap&
>(Op);
176 const EpetraCrsMatrix& tmp_ECrsMtx =
dynamic_cast<const EpetraCrsMatrix&
>(*crsOp.getCrsMatrix());
177 return *tmp_ECrsMtx.getEpetra_CrsMatrix();
178 }
catch (std::bad_cast) {
179 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::EpetraCrsMatrix failed");
181 }
catch (std::bad_cast) {
186 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
189 CrsMatrixWrap& crsOp =
dynamic_cast<CrsMatrixWrap&
>(Op);
191 EpetraCrsMatrix& tmp_ECrsMtx =
dynamic_cast<EpetraCrsMatrix&
>(*crsOp.getCrsMatrix());
192 return *tmp_ECrsMtx.getEpetra_CrsMatrixNonConst();
193 }
catch (std::bad_cast) {
194 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::EpetraCrsMatrix failed");
196 }
catch (std::bad_cast) {
201 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
203 RCP<const Xpetra::EpetraMap> xeMap = rcp_dynamic_cast<
const Xpetra::EpetraMap>(rcpFromRef(map));
204 if (xeMap == Teuchos::null)
205 throw Exceptions::BadCast(
"Utils::Map2EpetraMap : Cast from Xpetra::Map to Xpetra::EpetraMap failed");
206 return xeMap->getEpetra_Map();
210 #ifdef HAVE_MUELU_TPETRA 211 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
212 RCP<const Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
214 RCP<const TpetraMultiVector > tmpVec = rcp_dynamic_cast<TpetraMultiVector>(Vec);
215 if (tmpVec == Teuchos::null)
216 throw Exceptions::BadCast(
"Cast from Xpetra::MultiVector to Xpetra::TpetraMultiVector failed");
217 return tmpVec->getTpetra_MultiVector();
220 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
222 RCP<const TpetraMultiVector> tmpVec = rcp_dynamic_cast<TpetraMultiVector>(Vec);
223 if (tmpVec == Teuchos::null)
224 throw Exceptions::BadCast(
"Cast from Xpetra::MultiVector to Xpetra::TpetraMultiVector failed");
225 return tmpVec->getTpetra_MultiVector();
228 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
230 const TpetraMultiVector& tmpVec =
dynamic_cast<const TpetraMultiVector&
>(Vec);
231 return *(tmpVec.getTpetra_MultiVector());
234 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
236 const TpetraMultiVector& tmpVec =
dynamic_cast<const TpetraMultiVector&
>(Vec);
237 return tmpVec.getTpetra_MultiVector();
240 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
241 const Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>&
243 const TpetraMultiVector& tmpVec =
dynamic_cast<const TpetraMultiVector&
>(Vec);
244 return *(tmpVec.getTpetra_MultiVector());
247 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
250 RCP<const CrsMatrixWrap> crsOp = rcp_dynamic_cast<
const CrsMatrixWrap>(Op);
251 if (crsOp == Teuchos::null)
253 const RCP<const TpetraCrsMatrix> &tmp_ECrsMtx = rcp_dynamic_cast<
const TpetraCrsMatrix>(crsOp->getCrsMatrix());
254 if (tmp_ECrsMtx == Teuchos::null)
255 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::TpetraCrsMatrix failed");
256 return tmp_ECrsMtx->getTpetra_CrsMatrix();
259 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
261 RCP<const CrsMatrixWrap> crsOp = rcp_dynamic_cast<
const CrsMatrixWrap>(Op);
262 if (crsOp == Teuchos::null)
264 const RCP<const TpetraCrsMatrix> &tmp_ECrsMtx = rcp_dynamic_cast<
const TpetraCrsMatrix>(crsOp->getCrsMatrix());
265 if (tmp_ECrsMtx == Teuchos::null)
266 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::TpetraCrsMatrix failed");
267 return tmp_ECrsMtx->getTpetra_CrsMatrixNonConst();
270 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
273 const CrsMatrixWrap& crsOp =
dynamic_cast<const CrsMatrixWrap&
>(Op);
275 const TpetraCrsMatrix& tmp_ECrsMtx =
dynamic_cast<const TpetraCrsMatrix&
>(*crsOp.getCrsMatrix());
276 return *tmp_ECrsMtx.getTpetra_CrsMatrix();
277 }
catch (std::bad_cast) {
278 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::TpetraCrsMatrix failed");
280 }
catch (std::bad_cast) {
285 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
288 CrsMatrixWrap& crsOp =
dynamic_cast<CrsMatrixWrap&
>(Op);
290 TpetraCrsMatrix& tmp_ECrsMtx =
dynamic_cast<TpetraCrsMatrix&
>(*crsOp.getCrsMatrix());
291 return *tmp_ECrsMtx.getTpetra_CrsMatrixNonConst();
292 }
catch (std::bad_cast) {
293 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::TpetraCrsMatrix failed");
295 }
catch (std::bad_cast) {
300 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
302 RCP<const CrsMatrixWrap> crsOp = rcp_dynamic_cast<
const CrsMatrixWrap>(Op);
303 if (crsOp == Teuchos::null)
306 RCP<const CrsMatrix> crsMat = crsOp->getCrsMatrix();
307 const RCP<const TpetraCrsMatrix> tmp_Crs = rcp_dynamic_cast<
const TpetraCrsMatrix>(crsMat);
308 RCP<const Xpetra::TpetraBlockCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tmp_BlockCrs;
309 if(!tmp_Crs.is_null()) {
310 return tmp_Crs->getTpetra_CrsMatrixNonConst();
313 tmp_BlockCrs= rcp_dynamic_cast<
const Xpetra::TpetraBlockCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(crsMat);
314 if (tmp_BlockCrs.is_null())
315 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::TpetraCrsMatrix and Xpetra::TpetraBlockCrsMatrix failed");
316 return tmp_BlockCrs->getTpetra_BlockCrsMatrixNonConst();
320 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
322 RCP<const CrsMatrixWrap> crsOp = rcp_dynamic_cast<
const CrsMatrixWrap>(Op);
323 if (crsOp == Teuchos::null)
326 RCP<const CrsMatrix> crsMat = crsOp->getCrsMatrix();
327 const RCP<const TpetraCrsMatrix> tmp_Crs = rcp_dynamic_cast<
const TpetraCrsMatrix>(crsMat);
328 RCP<const Xpetra::TpetraBlockCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tmp_BlockCrs;
329 if(!tmp_Crs.is_null()) {
330 return tmp_Crs->getTpetra_CrsMatrixNonConst();
333 tmp_BlockCrs= rcp_dynamic_cast<
const Xpetra::TpetraBlockCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(crsMat);
334 if (tmp_BlockCrs.is_null())
335 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::TpetraCrsMatrix and Xpetra::TpetraBlockCrsMatrix failed");
336 return tmp_BlockCrs->getTpetra_BlockCrsMatrixNonConst();
341 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
343 const RCP<const TpetraMap>& tmp_TMap = rcp_dynamic_cast<
const TpetraMap>(rcpFromRef(map));
344 if (tmp_TMap == Teuchos::null)
345 throw Exceptions::BadCast(
"Utils::Map2TpetraMap : Cast from Xpetra::Map to Xpetra::TpetraMap failed");
346 return tmp_TMap->getTpetra_Map();
350 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
353 return Teuchos::null;
355 return rcp(
new CrsMatrixWrap(Op));
358 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
361 size_t numRows = A.getRowMap()->getNodeNumElements();
362 Teuchos::ArrayRCP<SC> diag(numRows);
364 Teuchos::ArrayView<const LO> cols;
365 Teuchos::ArrayView<const SC> vals;
366 for (
size_t i = 0; i < numRows; ++i) {
367 A.getLocalRowView(i, cols, vals);
370 for (; j < cols.size(); ++j) {
371 if (Teuchos::as<size_t>(cols[j]) == i) {
376 if (j == cols.size()) {
378 diag[i] = Teuchos::ScalarTraits<SC>::zero();
385 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
387 RCP<const Map> rowMap = A.getRowMap();
388 RCP<Vector> diag = VectorFactory::Build(rowMap);
389 ArrayRCP<SC> diagVals = diag->getDataNonConst(0);
391 size_t numRows = rowMap->getNodeNumElements();
393 Teuchos::ArrayView<const LO> cols;
394 Teuchos::ArrayView<const SC> vals;
395 for (
size_t i = 0; i < numRows; ++i) {
396 A.getLocalRowView(i, cols, vals);
399 for (; j < cols.size(); ++j) {
400 if (Teuchos::as<size_t>(cols[j]) == i) {
401 if(Teuchos::ScalarTraits<SC>::magnitude(vals[j]) > tol)
402 diagVals[i] = Teuchos::ScalarTraits<SC>::one() / vals[j];
404 diagVals[i]=Teuchos::ScalarTraits<SC>::zero();
408 if (j == cols.size()) {
410 diagVals[i]=Teuchos::ScalarTraits<SC>::zero();
420 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
422 size_t numRows = A.getRowMap()->getNodeNumElements();
423 Teuchos::ArrayRCP<SC> diag(numRows);
425 Teuchos::ArrayView<const LO> cols;
426 Teuchos::ArrayView<const SC> vals;
427 for (
size_t i = 0; i < numRows; ++i) {
428 A.getLocalRowView(i, cols, vals);
430 diag[i] = Teuchos::ScalarTraits<Scalar>::zero();
431 for (LO j = 0; j < cols.size(); ++j) {
432 diag[i] += Teuchos::ScalarTraits<Scalar>::magnitude(vals[j]);
439 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
441 RCP<const Map> rowMap = A.getRowMap(), colMap = A.getColMap();
442 RCP<Vector> localDiag = VectorFactory::Build(rowMap);
445 const CrsMatrixWrap* crsOp =
dynamic_cast<const CrsMatrixWrap*
>(&A);
449 Teuchos::ArrayRCP<size_t> offsets;
450 crsOp->getLocalDiagOffsets(offsets);
451 crsOp->getLocalDiagCopy(*localDiag,offsets());
454 ArrayRCP<SC> localDiagVals = localDiag->getDataNonConst(0);
455 Teuchos::ArrayRCP<SC> diagVals = GetMatrixDiagonal(A);
456 for (LO i = 0; i < localDiagVals.size(); i++)
457 localDiagVals[i] = diagVals[i];
458 localDiagVals = diagVals = null;
461 RCP<Vector> diagonal = VectorFactory::Build(colMap);
462 RCP< const Import> importer;
463 importer = A.getCrsGraph()->getImporter();
464 if (importer == Teuchos::null) {
465 importer = ImportFactory::Build(rowMap, colMap);
467 diagonal->doImport(*localDiag, *(importer), Xpetra::INSERT);
472 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
474 #ifdef HAVE_MUELU_TPETRA 476 Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& tpOp = Op2NonConstTpetraCrs(Op);
478 Tpetra::Vector<SC,LO,GO,NO> x(tpOp.getRowMap(), scalingVector());
480 Tpetra::Vector<SC,LO,GO,NO> xi(tpOp.getRowMap());
492 #endif // HAVE_MUELU_TPETRA 495 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
496 Teuchos::Array<typename Teuchos::ScalarTraits<Scalar>::magnitudeType>
498 TEUCHOS_TEST_FOR_EXCEPTION(X.getNumVectors() != RHS.getNumVectors(),
Exceptions::RuntimeError,
"Number of solution vectors != number of right-hand sides")
499 const size_t numVecs = X.getNumVectors();
501 RCP<MultiVector> RES = Residual(Op, X, RHS);
502 Teuchos::Array<Magnitude> norms(numVecs);
508 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
510 Residual(
const Operator& Op,
const MultiVector& X,
const MultiVector& RHS) {
511 TEUCHOS_TEST_FOR_EXCEPTION(X.getNumVectors() != RHS.getNumVectors(),
Exceptions::RuntimeError,
"Number of solution vectors != number of right-hand sides")
512 const size_t numVecs = X.getNumVectors();
514 SC one = Teuchos::ScalarTraits<Scalar>::one(), negone = -one, zero = Teuchos::ScalarTraits<Scalar>::zero();
516 RCP<MultiVector> RES = MultiVectorFactory::Build(Op.getRangeMap(), numVecs,
false);
517 Op.apply(X, *RES, Teuchos::NO_TRANS, one, zero);
518 RES->update(one, RHS, negone);
523 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
525 Write(
"rowmap_" + fileName, *(Op.getRowMap()));
526 Write(
"colmap_" + fileName, *(Op.getColMap()));
527 Write(
"domainmap_" + fileName, *(Op.getDomainMap()));
528 Write(
"rangemap_" + fileName, *(Op.getRangeMap()));
530 const CrsMatrixWrap& crsOp =
dynamic_cast<const CrsMatrixWrap&
>(Op);
531 RCP<const CrsMatrix> tmp_CrsMtx = crsOp.getCrsMatrix();
532 #if defined(HAVE_MUELU_EPETRA) 533 const RCP<const EpetraCrsMatrix>& tmp_ECrsMtx = rcp_dynamic_cast<
const EpetraCrsMatrix>(tmp_CrsMtx);
534 if (tmp_ECrsMtx != Teuchos::null) {
535 #if defined(HAVE_MUELU_EPETRAEXT) 536 RCP<const Epetra_CrsMatrix> A = tmp_ECrsMtx->getEpetra_CrsMatrix();
547 #ifdef HAVE_MUELU_TPETRA 548 const RCP<const TpetraCrsMatrix>& tmp_TCrsMtx = rcp_dynamic_cast<
const TpetraCrsMatrix>(tmp_CrsMtx);
549 if (tmp_TCrsMtx != Teuchos::null) {
550 RCP<const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > A = tmp_TCrsMtx->getTpetra_CrsMatrix();
551 Tpetra::MatrixMarket::Writer<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >::writeSparseFile(fileName, A);
554 #endif // HAVE_MUELU_TPETRA 556 throw Exceptions::BadCast(
"Could not cast to EpetraCrsMatrix or TpetraCrsMatrix in matrix writing");
559 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
561 Xpetra::UnderlyingLib lib = map->lib();
563 if (lib == Xpetra::UseEpetra) {
564 TEUCHOS_TEST_FOR_EXCEPTION(
true, ::Xpetra::Exceptions::BadCast,
"Epetra can only be used with Scalar=double and Ordinal=int");
566 }
else if (lib == Xpetra::UseTpetra) {
567 #ifdef HAVE_MUELU_TPETRA 568 typedef Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> sparse_matrix_type;
569 typedef Tpetra::MatrixMarket::Reader<sparse_matrix_type> reader_type;
570 typedef Tpetra::Map<LocalOrdinal, GlobalOrdinal, Node> map_type;
571 typedef Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> multivector_type;
573 RCP<const map_type> temp = toTpetra(map);
574 RCP<multivector_type> TMV = reader_type::readDenseFile(fileName,map->getComm(),map->getNode(),temp);
575 RCP<MultiVector> rmv = Xpetra::toXpetra(TMV);
584 return Teuchos::null;
587 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
588 RCP<const Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> >
590 if (lib == Xpetra::UseEpetra) {
591 TEUCHOS_TEST_FOR_EXCEPTION(
true, ::Xpetra::Exceptions::BadCast,
"Epetra can only be used with Scalar=double and Ordinal=int");
592 }
else if (lib == Xpetra::UseTpetra) {
593 #ifdef HAVE_MUELU_TPETRA 594 typedef Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> sparse_matrix_type;
595 typedef Tpetra::MatrixMarket::Reader<sparse_matrix_type> reader_type;
597 RCP<Node> node = rcp(
new Node());
599 RCP<const Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> > tMap = reader_type::readMapFile(fileName, comm, node);
603 return Xpetra::toXpetra(tMap);
611 return Teuchos::null;
615 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
616 RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
618 if (binary ==
false) {
620 if (lib == Xpetra::UseEpetra) {
621 #if defined(HAVE_MUELU_EPETRA) && defined(HAVE_MUELU_EPETRAEXT) 622 Epetra_CrsMatrix *eA;
623 const RCP<const Epetra_Comm> epcomm = Xpetra::toEpetra(comm);
628 RCP<Epetra_CrsMatrix> tmpA = rcp(eA);
629 RCP<Matrix> A = Convert_Epetra_CrsMatrix_ToXpetra_CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>(tmpA);
635 }
else if (lib == Xpetra::UseTpetra) {
636 #ifdef HAVE_MUELU_TPETRA 637 typedef Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> sparse_matrix_type;
639 typedef Tpetra::MatrixMarket::Reader<sparse_matrix_type> reader_type;
642 Teuchos::ParameterList pl = Teuchos::ParameterList();
643 RCP<Node> node = rcp(
new Node(pl));
644 bool callFillComplete =
true;
646 RCP<sparse_matrix_type> tA = reader_type::readSparseFile(fileName, comm, node, callFillComplete);
651 RCP<TpetraCrsMatrix> tmpA1 = rcp(
new TpetraCrsMatrix(tA));
652 RCP<CrsMatrix> tmpA2 = rcp_implicit_cast<CrsMatrix>(tmpA1);
653 RCP<Matrix> A = rcp(
new CrsMatrixWrap(tmpA2));
664 std::ifstream ifs(fileName.c_str(), std::ios::binary);
667 ifs.read(reinterpret_cast<char*>(&m),
sizeof(m));
668 ifs.read(reinterpret_cast<char*>(&n),
sizeof(n));
669 ifs.read(reinterpret_cast<char*>(&nnz),
sizeof(nnz));
671 int myRank = comm->getRank();
674 RCP<Map> rowMap = MapFactory::Build(lib, m, (myRank == 0 ? m : 0), indexBase, comm), rangeMap = rowMap;
675 RCP<Map> colMap = MapFactory::Build(lib, n, (myRank == 0 ? n : 0), indexBase, comm), domainMap = colMap;
676 RCP<Matrix> A = MatrixFactory::Build(rowMap, colMap, 1);
681 Teuchos::Array<GO> inds;
682 Teuchos::Array<SC> vals;
683 for (
int i = 0; i < m; i++) {
685 ifs.read(reinterpret_cast<char*>(&row),
sizeof(row));
686 ifs.read(reinterpret_cast<char*>(&rownnz),
sizeof(rownnz));
689 for (
int j = 0; j < rownnz; j++) {
691 ifs.read(reinterpret_cast<char*>(&index),
sizeof(index));
692 inds[j] = Teuchos::as<GO>(index);
694 for (
int j = 0; j < rownnz; j++) {
696 ifs.read(reinterpret_cast<char*>(&value),
sizeof(value));
697 vals[j] = Teuchos::as<SC>(value);
699 A->insertGlobalValues(row, inds, vals);
703 A->fillComplete(domainMap, rangeMap);
708 return Teuchos::null;
712 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
713 RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
715 const RCP<const Map> rowMap,
716 RCP<const Map> colMap,
717 const RCP<const Map> domainMap,
718 const RCP<const Map> rangeMap,
719 const bool callFillComplete,
726 RCP<const Map> domain = (domainMap.is_null() ? rowMap : domainMap);
727 RCP<const Map> range = (rangeMap .is_null() ? rowMap : rangeMap);
729 const Xpetra::UnderlyingLib lib = rowMap->lib();
730 if (binary ==
false) {
731 if (lib == Xpetra::UseEpetra) {
732 #if defined(HAVE_MUELU_EPETRA) && defined(HAVE_MUELU_EPETRAEXT) 733 Epetra_CrsMatrix *eA;
734 const RCP<const Epetra_Comm> epcomm = Xpetra::toEpetra(rowMap->getComm());
735 const Epetra_Map& epetraRowMap = Map2EpetraMap(*rowMap);
736 const Epetra_Map& epetraDomainMap = (domainMap.is_null() ? epetraRowMap : Map2EpetraMap(*domainMap));
737 const Epetra_Map& epetraRangeMap = (rangeMap .is_null() ? epetraRowMap : Map2EpetraMap(*rangeMap));
739 if (colMap.is_null()) {
743 const Epetra_Map& epetraColMap = Map2EpetraMap(*colMap);
750 RCP<Epetra_CrsMatrix> tmpA = rcp(eA);
751 RCP<Matrix> A = Convert_Epetra_CrsMatrix_ToXpetra_CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>(tmpA);
757 }
else if (lib == Xpetra::UseTpetra) {
758 #ifdef HAVE_MUELU_TPETRA 759 typedef Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> sparse_matrix_type;
760 typedef Tpetra::MatrixMarket::Reader<sparse_matrix_type> reader_type;
761 typedef Tpetra::Map<LocalOrdinal, GlobalOrdinal, Node> map_type;
763 const RCP<const map_type> tpetraRowMap = Map2TpetraMap(*rowMap);
764 RCP<const map_type> tpetraColMap = (colMap.is_null() ? Teuchos::null : Map2TpetraMap(*colMap));
765 const RCP<const map_type> tpetraRangeMap = (rangeMap.is_null() ? tpetraRowMap : Map2TpetraMap(*rangeMap));
766 const RCP<const map_type> tpetraDomainMap = (domainMap.is_null() ? tpetraRowMap : Map2TpetraMap(*domainMap));
768 RCP<sparse_matrix_type> tA = reader_type::readSparseFile(fileName, tpetraRowMap, tpetraColMap, tpetraDomainMap, tpetraRangeMap,
769 callFillComplete, tolerant, debug);
773 RCP<TpetraCrsMatrix> tmpA1 = rcp(
new TpetraCrsMatrix(tA));
774 RCP<CrsMatrix> tmpA2 = rcp_implicit_cast<CrsMatrix>(tmpA1);
775 RCP<Matrix> A = rcp(
new CrsMatrixWrap(tmpA2));
786 std::ifstream ifs(fileName.c_str(), std::ios::binary);
789 ifs.read(reinterpret_cast<char*>(&m),
sizeof(m));
790 ifs.read(reinterpret_cast<char*>(&n),
sizeof(n));
791 ifs.read(reinterpret_cast<char*>(&nnz),
sizeof(nnz));
793 RCP<Matrix> A = MatrixFactory::Build(rowMap, colMap, 1);
797 Teuchos::ArrayView<const GO> rowElements = rowMap->getNodeElementList();
798 Teuchos::ArrayView<const GO> colElements = colMap->getNodeElementList();
800 Teuchos::Array<GO> inds;
801 Teuchos::Array<SC> vals;
802 for (
int i = 0; i < m; i++) {
804 ifs.read(reinterpret_cast<char*>(&row),
sizeof(row));
805 ifs.read(reinterpret_cast<char*>(&rownnz),
sizeof(rownnz));
808 for (
int j = 0; j < rownnz; j++) {
810 ifs.read(reinterpret_cast<char*>(&index),
sizeof(index));
811 inds[j] = colElements[Teuchos::as<LO>(index)];
813 for (
int j = 0; j < rownnz; j++) {
815 ifs.read(reinterpret_cast<char*>(&value),
sizeof(value));
816 vals[j] = Teuchos::as<SC>(value);
818 A->insertGlobalValues(rowElements[row], inds, vals);
820 A->fillComplete(domainMap, rangeMap);
824 return Teuchos::null;
827 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
830 std::string mapfile =
"map_" + fileName;
831 Write(mapfile, *(x.getMap()));
833 RCP<const MultiVector> tmp_Vec = rcpFromRef(x);
834 #ifdef HAVE_MUELU_EPETRA 835 const RCP<const EpetraMultiVector>& tmp_EVec = rcp_dynamic_cast<
const EpetraMultiVector>(tmp_Vec);
836 if (tmp_EVec != Teuchos::null) {
837 #ifdef HAVE_MUELU_EPETRAEXT 846 #endif // HAVE_MUELU_EPETRAEXT 848 #ifdef HAVE_MUELU_TPETRA 849 const RCP<const TpetraMultiVector> &tmp_TVec = rcp_dynamic_cast<
const TpetraMultiVector>(tmp_Vec);
850 if (tmp_TVec != Teuchos::null) {
851 RCP<const Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> > TVec = tmp_TVec->getTpetra_MultiVector();
852 Tpetra::MatrixMarket::Writer<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >::writeDenseFile(fileName, TVec);
855 #endif // HAVE_MUELU_TPETRA 857 throw Exceptions::BadCast(
"Could not cast to EpetraMultiVector or TpetraMultiVector in multivector writing");
861 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
863 RCP<const Map> tmp_Map = rcpFromRef(M);
864 #ifdef HAVE_MUELU_EPETRAEXT 865 const RCP<const Xpetra::EpetraMap>& tmp_EMap = rcp_dynamic_cast<
const Xpetra::EpetraMap>(tmp_Map);
866 if (tmp_EMap != Teuchos::null) {
867 #ifdef HAVE_MUELU_EPETRAEXT 876 #endif // HAVE_MUELU_EPETRAEXT 878 #ifdef HAVE_MUELU_TPETRA 879 const RCP<const TpetraMap> &tmp_TMap = rcp_dynamic_cast<
const TpetraMap>(tmp_Map);
880 if (tmp_TMap != Teuchos::null) {
881 RCP<const Tpetra::Map<LocalOrdinal, GlobalOrdinal, Node> > TMap = tmp_TMap->getTpetra_Map();
882 Tpetra::MatrixMarket::Writer<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >::writeMapFile(fileName, *TMap);
885 #endif // HAVE_MUELU_TPETRA 894 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
896 RCP<const Teuchos::Comm<int> > comm = Teuchos::DefaultComm<int>::getComm();
898 int myPID = comm->getRank();
902 for (
int i = 0; i <comm->getSize(); i++) {
904 gethostname(hostname,
sizeof(hostname));
905 std::cout <<
"Host: " << hostname <<
"\tMPI rank: " << myPID <<
",\tPID: " << pid <<
"\n\tattach " << pid << std::endl;
911 std::cout <<
"** Enter a character to continue > " << std::endl;
913 int r = scanf(
"%c", &go);
920 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
927 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
929 PowerMethod(
const Matrix& A,
bool scaleByDiag, LO niters,
Magnitude tolerance,
bool verbose,
unsigned int seed) {
931 "Utils::PowerMethod: operator must have domain and range maps that are equivalent.");
934 RCP<Vector> q = VectorFactory::Build(A.getDomainMap());
935 RCP<Vector> r = VectorFactory::Build(A.getRangeMap());
936 RCP<Vector> z = VectorFactory::Build(A.getRangeMap());
941 Teuchos::Array<Magnitude> norms(1);
943 typedef Teuchos::ScalarTraits<SC> STS;
945 const SC zero = STS::zero(), one = STS::one();
948 Magnitude residual = STS::magnitude(zero);
951 RCP<Vector> diagInvVec;
953 RCP<Vector> diagVec = VectorFactory::Build(A.getRowMap());
954 A.getLocalDiagCopy(*diagVec);
955 diagInvVec = VectorFactory::Build(A.getRowMap());
956 diagInvVec->reciprocal(*diagVec);
959 for (
int iter = 0; iter < niters; ++iter) {
961 q->update(one/norms[0], *z, zero);
964 z->elementWiseMultiply(one, *diagInvVec, *z, zero);
967 if (iter % 100 == 0 || iter + 1 == niters) {
968 r->update(1.0, *z, -lambda, *q, zero);
970 residual = STS::magnitude(norms[0] / lambda);
972 std::cout <<
"Iter = " << iter
973 <<
" Lambda = " << lambda
974 <<
" Residual of A*q - lambda*q = " << residual
978 if (residual < tolerance)
985 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
988 bool doOptimizeStorage)
990 SC one = Teuchos::ScalarTraits<SC>::one();
991 Teuchos::ArrayRCP<SC> sv(scalingVector.size());
993 for (
int i = 0; i < scalingVector.size(); ++i)
994 sv[i] = one / scalingVector[i];
996 for (
int i = 0; i < scalingVector.size(); ++i)
997 sv[i] = scalingVector[i];
1000 switch (Op.getRowMap()->lib()) {
1001 case Xpetra::UseTpetra:
1002 MyOldScaleMatrix_Tpetra(Op, sv, doFillComplete, doOptimizeStorage);
1005 case Xpetra::UseEpetra:
1015 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
1017 bool doFillComplete,
1018 bool doOptimizeStorage)
1020 #ifdef HAVE_MUELU_TPETRA 1022 Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& tpOp = Op2NonConstTpetraCrs(Op);
1024 const RCP<const Tpetra::Map<LO,GO,NO> > rowMap = tpOp.getRowMap();
1025 const RCP<const Tpetra::Map<LO,GO,NO> > domainMap = tpOp.getDomainMap();
1026 const RCP<const Tpetra::Map<LO,GO,NO> > rangeMap = tpOp.getRangeMap();
1028 size_t maxRowSize = tpOp.getNodeMaxNumRowEntries();
1029 if (maxRowSize == Teuchos::as<size_t>(-1))
1032 std::vector<SC> scaledVals(maxRowSize);
1033 if (tpOp.isFillComplete())
1036 if (Op.isLocallyIndexed() ==
true) {
1037 Teuchos::ArrayView<const LO> cols;
1038 Teuchos::ArrayView<const SC> vals;
1040 for (
size_t i = 0; i < rowMap->getNodeNumElements(); ++i) {
1041 tpOp.getLocalRowView(i, cols, vals);
1042 size_t nnz = tpOp.getNumEntriesInLocalRow(i);
1043 if (nnz > maxRowSize) {
1045 scaledVals.resize(maxRowSize);
1047 for (
size_t j = 0; j < nnz; ++j)
1048 scaledVals[j] = vals[j]*scalingVector[i];
1051 Teuchos::ArrayView<const SC> valview(&scaledVals[0], nnz);
1052 tpOp.replaceLocalValues(i, cols, valview);
1057 Teuchos::ArrayView<const GO> cols;
1058 Teuchos::ArrayView<const SC> vals;
1060 for (
size_t i = 0; i < rowMap->getNodeNumElements(); ++i) {
1061 GO gid = rowMap->getGlobalElement(i);
1062 tpOp.getGlobalRowView(gid, cols, vals);
1063 size_t nnz = tpOp.getNumEntriesInGlobalRow(gid);
1064 if (nnz > maxRowSize) {
1066 scaledVals.resize(maxRowSize);
1069 for (
size_t j = 0; j < nnz; ++j)
1070 scaledVals[j] = vals[j]*scalingVector[i];
1073 Teuchos::ArrayView<const SC> valview(&scaledVals[0], nnz);
1074 tpOp.replaceGlobalValues(gid, cols, valview);
1079 if (doFillComplete) {
1080 if (domainMap == Teuchos::null || rangeMap == Teuchos::null)
1081 throw Exceptions::RuntimeError(
"In Utils::Scaling: cannot fillComplete because the domain and/or range map hasn't been defined");
1083 RCP<Teuchos::ParameterList> params = rcp(
new Teuchos::ParameterList());
1084 params->set(
"Optimize Storage", doOptimizeStorage);
1085 params->set(
"No Nonlocal Changes",
true);
1086 Op.fillComplete(Op.getDomainMap(), Op.getRangeMap(), params);
1096 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
1098 RCP<Teuchos::FancyOStream> fancy = Teuchos::fancyOStream(Teuchos::rcpFromRef(os));
1102 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
1103 typename Teuchos::ScalarTraits<Scalar>::magnitudeType
1105 size_t numVectors = v.getNumVectors();
1107 Scalar d = Teuchos::ScalarTraits<Scalar>::zero();
1108 for (
size_t j = 0; j < numVectors; j++) {
1109 Teuchos::ArrayRCP<const Scalar> vv = v.getData(j);
1110 d += (vv[i0] - vv[i1])*(vv[i0] - vv[i1]);
1113 return Teuchos::ScalarTraits<SC>::magnitude(d);
1116 template <
class SC,
class LO,
class GO,
class NO>
1118 LO numRows = A.getNodeNumRows();
1120 typedef Teuchos::ScalarTraits<SC> STS;
1122 ArrayRCP<bool> boundaryNodes(numRows,
true);
1123 for (LO row = 0; row < numRows; row++) {
1124 ArrayView<const LO> indices;
1125 ArrayView<const SC> vals;
1126 A.getLocalRowView(row, indices, vals);
1128 size_t nnz = A.getNumEntriesInLocalRow(row);
1130 for (
size_t col = 0; col < nnz; col++)
1131 if ( (indices[col] != row) && STS::magnitude(vals[col]) > tol) {
1132 boundaryNodes[row] =
false;
1137 return boundaryNodes;
1141 template <
class SC,
class LO,
class GO,
class NO>
1149 int maxint = INT_MAX;
1150 int mySeed = Teuchos::as<int>((maxint-1) * (one -(comm.getRank()+1)/(comm.getSize()+one)) );
1151 if (mySeed < 1 || mySeed == maxint) {
1152 std::ostringstream errStr;
1153 errStr <<
"Error detected with random seed = " << mySeed <<
". It should be in the interval [1,2^31-2].";
1160 Teuchos::ScalarTraits<SC>::seedrandom(mySeed);
1168 template <
class SC,
class LO,
class GO,
class NO>
1170 std::vector<LO>& dirichletRows) {
1171 dirichletRows.resize(0);
1172 for(
size_t i=0; i<A->getNodeNumRows(); i++) {
1173 Teuchos::ArrayView<const LO> indices;
1174 Teuchos::ArrayView<const SC> values;
1175 A->getLocalRowView(i,indices,values);
1177 for (
int j=0; j<indices.size(); j++) {
1183 if (Teuchos::ScalarTraits<SC>::magnitude(values[j]) > 1.0e-16) {
1187 if (nnz == 1 || nnz == 2) {
1188 dirichletRows.push_back(i);
1193 template<
class SC,
class LO,
class GO,
class NO>
1195 std::vector<LO>& dirichletRows,
1196 std::vector<LO>& dirichletCols) {
1197 Teuchos::RCP<const Map> domMap = A->getDomainMap();
1198 Teuchos::RCP<const Map> colMap = A->getColMap();
1199 Teuchos::RCP< Xpetra::Export<LO,GO,NO> > exporter
1200 = Xpetra::ExportFactory<LO,GO,NO>::Build(colMap,domMap);
1201 Teuchos::RCP<MultiVector> myColsToZero = MultiVectorFactory::Build(colMap,1);
1202 Teuchos::RCP<MultiVector> globalColsToZero = MultiVectorFactory::Build(domMap,1);
1203 myColsToZero->putScalar((SC)0.0);
1204 globalColsToZero->putScalar((SC)0.0);
1205 for(
size_t i=0; i<dirichletRows.size(); i++) {
1206 Teuchos::ArrayView<const LO> indices;
1207 Teuchos::ArrayView<const SC> values;
1208 A->getLocalRowView(dirichletRows[i],indices,values);
1209 for(
int j=0; j<indices.size(); j++)
1210 myColsToZero->replaceLocalValue(indices[j],0,(SC)1.0);
1212 globalColsToZero->doExport(*myColsToZero,*exporter,Xpetra::ADD);
1213 myColsToZero->doImport(*globalColsToZero,*exporter,Xpetra::INSERT);
1214 Teuchos::ArrayRCP<const SC> myCols = myColsToZero->getData(0);
1215 dirichletCols.resize(colMap->getNodeNumElements());
1216 for(
size_t i=0; i<colMap->getNodeNumElements(); i++) {
1217 if(Teuchos::ScalarTraits<SC>::magnitude(myCols[i])>0.0)
1224 template<
class SC,
class LO,
class GO,
class NO>
1226 std::vector<LO>& dirichletRows) {
1227 for(
size_t i=0; i<dirichletRows.size(); i++) {
1228 Teuchos::ArrayView<const LO> indices;
1229 Teuchos::ArrayView<const SC> values;
1230 A->getLocalRowView(dirichletRows[i],indices,values);
1231 std::vector<SC> vec;
1232 vec.resize(indices.size());
1233 Teuchos::ArrayView<SC> zerovalues(vec);
1234 for(
int j=0; j<indices.size(); j++)
1235 zerovalues[j]=(SC)1.0e-32;
1236 A->replaceLocalValues(dirichletRows[i],indices,zerovalues);
1240 template<
class SC,
class LO,
class GO,
class NO>
1242 std::vector<LO>& dirichletCols) {
1243 for(
size_t i=0; i<A->getNodeNumRows(); i++) {
1244 Teuchos::ArrayView<const LO> indices;
1245 Teuchos::ArrayView<const SC> values;
1246 A->getLocalRowView(i,indices,values);
1247 std::vector<SC> vec;
1248 vec.resize(indices.size());
1249 Teuchos::ArrayView<SC> zerovalues(vec);
1250 for(
int j=0; j<indices.size(); j++) {
1251 if(dirichletCols[indices[j]]==1)
1252 zerovalues[j]=(SC)1.0e-32;
1254 zerovalues[j]=values[j];
1256 A->replaceLocalValues(i,indices,zerovalues);
1260 template<
class SC,
class LO,
class GO,
class NO>
1263 Teuchos::RCP<const Map> rowMap = A->getRowMap();
1264 RCP<Matrix> DiagMatrix = MatrixFactory::Build(rowMap,1);
1265 RCP<Matrix> NewMatrix = MatrixFactory::Build(rowMap,1);
1266 for(
size_t i=0; i<A->getNodeNumRows(); i++) {
1267 Teuchos::ArrayView<const LO> indices;
1268 Teuchos::ArrayView<const SC> values;
1269 A->getLocalRowView(i,indices,values);
1271 for (
int j=0; j<indices.size(); j++) {
1272 if (Teuchos::ScalarTraits<SC>::magnitude(values[j]) > tol) {
1278 GO row = rowMap->getGlobalElement(i);
1280 DiagMatrix->insertGlobalValues(row,
1281 Teuchos::ArrayView<GO>(&row,1),
1282 Teuchos::ArrayView<SC>(&one,1));
1285 DiagMatrix->insertGlobalValues(row,
1286 Teuchos::ArrayView<GO>(&row,1),
1287 Teuchos::ArrayView<SC>(&zero,1));
1290 DiagMatrix->fillComplete();
1293 RCP<Teuchos::FancyOStream> out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
1294 Xpetra::MatrixMatrix<SC,LO,GO,NO>::TwoMatrixAdd(*DiagMatrix,
false,(SC)1.0,*A,
false,(SC)1.0,NewMatrix,*out);
1295 NewMatrix->fillComplete();
1302 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
1303 RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
1305 Transpose (Matrix& Op,
bool optimizeTranspose,
const std::string & label) {
1306 #if defined(HAVE_MUELU_EPETRA) && defined(HAVE_MUELU_EPETRAEXT) 1307 std::string TorE =
"epetra";
1309 std::string TorE =
"tpetra";
1312 #if defined(HAVE_MUELU_EPETRA) && defined(HAVE_MUELU_EPETRAEXT) 1321 #ifdef HAVE_MUELU_TPETRA 1322 if (TorE ==
"tpetra") {
1326 RCP<Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> > A;
1327 Tpetra::RowMatrixTransposer<Scalar, LocalOrdinal, GlobalOrdinal, Node> transposer(rcpFromRef(tpetraOp),label);
1328 A = transposer.createTranspose();
1330 RCP<TpetraCrsMatrix> AA = rcp(
new TpetraCrsMatrix(A) );
1331 RCP<CrsMatrix> AAA = rcp_implicit_cast<CrsMatrix>(AA);
1332 RCP<Matrix> AAAA = rcp(
new CrsMatrixWrap(AAA) );
1333 if (!AAAA->isFillComplete())
1334 AAAA->fillComplete(Op.getRangeMap(),Op.getDomainMap());
1338 }
catch (std::exception& e) {
1339 std::cout <<
"threw exception '" << e.what() <<
"'" << std::endl;
1346 std::cout <<
"Utilities::Transpose() not implemented for Epetra" << std::endl;
1347 return Teuchos::null;
1351 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
1353 bool doFillComplete,
1354 bool doOptimizeStorage)
1356 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"MyOldScalematrix and Epetra cannot be used with Scalar != double, LocalOrdinal != int, GlobalOrdinal != int");
1360 #define MUELU_UTILITIES_SHORT 1361 #endif // MUELU_UTILITIES_DEF_HPP static void SetRandomSeed(const Teuchos::Comm< int > &comm)
Set seed for random number generator.
Exception indicating invalid cast attempted.
static void Remove_Zeroed_Rows(Teuchos::RCP< Matrix > &A, double tol=1.0e-14)
static RCP< Epetra_MultiVector > MV2NonConstEpetraMV(RCP< MultiVector > Vec)
static void Write(const std::string &fileName, const Map &M)
Read/Write methods.
std::string toString(const T &what)
Little helper function to convert non-string types to strings.
static RCP< Matrix > Transpose(Matrix &Op, bool optimizeTranspose=false, const std::string &label=std::string())
Transpose a Xpetra::Matrix.
static const Epetra_Map & Map2EpetraMap(const Map &map)
int BlockMapToMatrixMarketFile(const char *filename, const Epetra_BlockMap &blockMap, const char *mapName=0, const char *mapDescription=0, bool writeHeader=true)
static Teuchos::ArrayRCP< SC > GetLumpedMatrixDiagonal(const Matrix &A)
Extract Matrix Diagonal of lumped matrix.
static void findDirichletCols(Teuchos::RCP< Matrix > A, std::vector< LO > &dirichletRows, std::vector< LO > &dirichletCols)
static RCP< const Tpetra::MultiVector< SC, LO, GO, NO > > MV2TpetraMV(RCP< MultiVector > const Vec)
Helper utility to pull out the underlying Tpetra objects from an Xpetra object.
static Teuchos::Array< Magnitude > ResidualNorm(const Operator &Op, const MultiVector &X, const MultiVector &RHS)
Teuchos::ScalarTraits< SC >::magnitudeType Magnitude
static const RCP< const Tpetra::Map< LO, GO, NO > > Map2TpetraMap(const Map &map)
Namespace for MueLu classes and methods.
static RCP< Tpetra::MultiVector< SC, LO, GO, NO > > MV2NonConstTpetraMV(RCP< MultiVector > Vec)
Exception throws to report incompatible objects (like maps).
static RCP< Xpetra::Matrix< SC, LO, GO, NO > > Crs2Op(RCP< CrsMatrix > Op)
static void PauseForDebugger()
static RCP< Tpetra::MultiVector< SC, LO, GO, NO > > MV2NonConstTpetraMV2(MultiVector &Vec)
static RCP< Vector > GetMatrixOverlappedDiagonal(const Matrix &A)
Extract Overlapped Matrix Diagonal.
static RCP< const Epetra_MultiVector > MV2EpetraMV(RCP< MultiVector > const Vec)
Helper utility to pull out the underlying Epetra objects from an Xpetra object.
static RCP< const Tpetra::RowMatrix< SC, LO, GO, NO > > Op2TpetraRow(RCP< const Matrix > Op)
static Teuchos::RCP< Matrix > Read(const std::string &fileName, Xpetra::UnderlyingLib lib, const RCP< const Teuchos::Comm< int > > &comm, bool binary=false)
Read matrix from file in Matrix Market or binary format.
int MatrixMarketFileToCrsMatrix(const char *filename, const Epetra_Comm &comm, Epetra_CrsMatrix *&A)
static void Apply_BCsToMatrixRows(Teuchos::RCP< Matrix > &A, std::vector< LO > &dirichletRows)
static void MyOldScaleMatrix_Epetra(Matrix &Op, const Teuchos::ArrayRCP< SC > &scalingVector, bool doFillComplete, bool doOptimizeStorage)
Scale an Epetra matrix.
static RCP< const Epetra_CrsMatrix > Op2EpetraCrs(RCP< const Matrix > Op)
static RCP< const Tpetra::CrsMatrix< SC, LO, GO, NO > > Op2TpetraCrs(RCP< const Matrix > Op)
int MultiVectorToMatrixMarketFile(const char *filename, const Epetra_MultiVector &A, const char *matrixName=0, const char *matrixDescription=0, bool writeHeader=true)
static void ScaleMatrix(Matrix &Op, const Teuchos::ArrayRCP< SC > &scalingVector, bool doInverse=true)
Left scale matrix by an arbitrary vector.
static RCP< Teuchos::FancyOStream > MakeFancy(std::ostream &os)
static void MyOldScaleMatrix(Matrix &Op, const Teuchos::ArrayRCP< const SC > &scalingVector, bool doInverse=true, bool doFillComplete=true, bool doOptimizeStorage=true)
static void MyOldScaleMatrix_Tpetra(Matrix &Op, const Teuchos::ArrayRCP< SC > &scalingVector, bool doFillComplete, bool doOptimizeStorage)
RCP< Xpetra::CrsMatrixWrap< SC, LO, GO, NO > > Convert_Epetra_CrsMatrix_ToXpetra_CrsMatrixWrap(RCP< Epetra_CrsMatrix > &epAB)
static RCP< Tpetra::CrsMatrix< SC, LO, GO, NO > > Op2NonConstTpetraCrs(RCP< Matrix > Op)
int RowMatrixToMatrixMarketFile(const char *filename, const Epetra_RowMatrix &A, const char *matrixName=0, const char *matrixDescription=0, bool writeHeader=true)
static RCP< Tpetra::RowMatrix< SC, LO, GO, NO > > Op2NonConstTpetraRow(RCP< Matrix > Op)
static Teuchos::ScalarTraits< Scalar >::magnitudeType Distance2(const MultiVector &v, LocalOrdinal i0, LocalOrdinal i1)
Squared distance between two rows in a multivector.
static RCP< const Map > ReadMap(const std::string &fileName, Xpetra::UnderlyingLib lib, const RCP< const Teuchos::Comm< int > > &comm)
static RCP< MultiVector > ReadMultiVector(const std::string &fileName, const RCP< const Map > &map)
static Teuchos::ArrayRCP< SC > GetMatrixDiagonal(const Matrix &A)
Extract Matrix Diagonal.
static Teuchos::ArrayRCP< const bool > DetectDirichletRows(const Matrix &A, const Magnitude &tol=Teuchos::ScalarTraits< SC >::zero())
Detect Dirichlet rows.
static Scalar PowerMethod(const Matrix &A, bool scaleByDiag=true, LO niters=10, Magnitude tolerance=1e-2, bool verbose=false, unsigned int seed=123)
Simple transpose for Tpetra::CrsMatrix types.
Exception throws to report errors in the internal logical of the program.
static RCP< Epetra_CrsMatrix > Op2NonConstEpetraCrs(RCP< Matrix > Op)
static RCP< Vector > GetMatrixDiagonalInverse(const Matrix &A, Magnitude tol=Teuchos::ScalarTraits< SC >::eps()*100)
Extract Matrix Diagonal.
static RCP< MultiVector > Residual(const Operator &Op, const MultiVector &X, const MultiVector &RHS)
static void Apply_BCsToMatrixCols(Teuchos::RCP< Matrix > &A, std::vector< LO > &dirichletCols)
static void findDirichletRows(Teuchos::RCP< Matrix > A, std::vector< LO > &dirichletRows)