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_IO.hpp>
88#include <Xpetra_Import.hpp>
89#include <Xpetra_ImportFactory.hpp>
90#include <Xpetra_Map.hpp>
91#include <Xpetra_MapFactory.hpp>
92#include <Xpetra_Matrix.hpp>
93#include <Xpetra_MatrixFactory.hpp>
94#include <Xpetra_MultiVector.hpp>
95#include <Xpetra_MultiVectorFactory.hpp>
96#include <Xpetra_Operator.hpp>
97#include <Xpetra_Vector.hpp>
98#include <Xpetra_VectorFactory.hpp>
100#include <Xpetra_MatrixMatrix.hpp>
103#if defined(HAVE_MUELU_EPETRA) && defined(HAVE_MUELU_ML)
104#include <ml_operator.h>
105#include <ml_epetra_utils.h>
110#ifdef HAVE_MUELU_EPETRA
115#ifdef HAVE_MUELU_EPETRA
116 template<
typename SC,
typename LO,
typename GO,
typename NO>
118 return Xpetra::Convert_Epetra_CrsMatrix_ToXpetra_CrsMatrixWrap<SC,LO,GO,NO>(epAB);
122#ifdef HAVE_MUELU_EPETRA
123 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
126 if (
tmpVec == Teuchos::null)
127 throw Exceptions::BadCast(
"Cast from Xpetra::MultiVector to Xpetra::EpetraMultiVector failed");
128 return tmpVec->getEpetra_MultiVector();
131 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
134 if (
tmpVec == Teuchos::null)
135 throw Exceptions::BadCast(
"Cast from Xpetra::MultiVector to Xpetra::EpetraMultiVector failed");
136 return tmpVec->getEpetra_MultiVector();
139 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
141 const Xpetra::EpetraMultiVectorT<GlobalOrdinal,Node> &
tmpVec =
dynamic_cast<const Xpetra::EpetraMultiVectorT<GlobalOrdinal,Node> &
>(
vec);
142 return *(
tmpVec.getEpetra_MultiVector());
145 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
147 const Xpetra::EpetraMultiVectorT<GlobalOrdinal,Node> &
tmpVec =
dynamic_cast<const Xpetra::EpetraMultiVectorT<GlobalOrdinal,Node> &
>(
vec);
148 return *(
tmpVec.getEpetra_MultiVector());
151 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
154 if (
crsOp == Teuchos::null)
158 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::EpetraCrsMatrix failed");
162 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
165 if (
crsOp == Teuchos::null)
169 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::EpetraCrsMatrix failed");
173 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
176 const Xpetra::CrsMatrixWrap<Scalar,LocalOrdinal,GlobalOrdinal,Node>&
crsOp =
dynamic_cast<const Xpetra::CrsMatrixWrap<Scalar,LocalOrdinal,GlobalOrdinal,Node>&
>(Op);
178 const Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node>&
tmp_ECrsMtx =
dynamic_cast<const Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node>&
>(*
crsOp.getCrsMatrix());
180 }
catch (std::bad_cast&) {
181 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::EpetraCrsMatrix failed");
183 }
catch (std::bad_cast&) {
188 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
191 Xpetra::CrsMatrixWrap<Scalar,LocalOrdinal,GlobalOrdinal,Node>&
crsOp =
dynamic_cast<Xpetra::CrsMatrixWrap<Scalar,LocalOrdinal,GlobalOrdinal,Node>&
>(Op);
193 Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node>&
tmp_ECrsMtx =
dynamic_cast<Xpetra::EpetraCrsMatrixT<GlobalOrdinal,Node>&
>(*
crsOp.getCrsMatrix());
195 }
catch (std::bad_cast&) {
196 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::EpetraCrsMatrix failed");
198 }
catch (std::bad_cast&) {
203 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
206 if (
xeMap == Teuchos::null)
207 throw Exceptions::BadCast(
"Utilities::Map2EpetraMap : Cast from Xpetra::Map to Xpetra::EpetraMap failed");
208 return xeMap->getEpetra_Map();
212#ifdef HAVE_MUELU_TPETRA
213 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
214 RCP<const Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
217 if (
tmpVec == Teuchos::null)
218 throw Exceptions::BadCast(
"Cast from Xpetra::MultiVector to Xpetra::TpetraMultiVector failed");
219 return tmpVec->getTpetra_MultiVector();
222 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
225 if (
tmpVec == Teuchos::null)
226 throw Exceptions::BadCast(
"Cast from Xpetra::MultiVector to Xpetra::TpetraMultiVector failed");
227 return tmpVec->getTpetra_MultiVector();
230 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
232 const Xpetra::TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>&
tmpVec =
dynamic_cast<const Xpetra::TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>&
>(
vec);
233 return *(
tmpVec.getTpetra_MultiVector());
236 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
238 const Xpetra::TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>&
tmpVec =
dynamic_cast<const Xpetra::TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>&
>(
vec);
239 return tmpVec.getTpetra_MultiVector();
242 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
243 const Tpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>&
245 const Xpetra::TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>&
tmpVec =
dynamic_cast<const Xpetra::TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>&
>(
vec);
246 return *(
tmpVec.getTpetra_MultiVector());
249 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
253 if (
crsOp == Teuchos::null)
257 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::TpetraCrsMatrix failed");
261 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
264 if (
crsOp == Teuchos::null)
268 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::TpetraCrsMatrix failed");
272 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
275 const Xpetra::CrsMatrixWrap<Scalar,LocalOrdinal,GlobalOrdinal,Node>&
crsOp =
dynamic_cast<const Xpetra::CrsMatrixWrap<Scalar,LocalOrdinal,GlobalOrdinal,Node>&
>(Op);
277 const Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>&
tmp_ECrsMtx =
dynamic_cast<const Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>&
>(*
crsOp.getCrsMatrix());
279 }
catch (std::bad_cast&) {
280 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::TpetraCrsMatrix failed");
282 }
catch (std::bad_cast&) {
287 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
290 Xpetra::CrsMatrixWrap<Scalar,LocalOrdinal,GlobalOrdinal,Node>&
crsOp =
dynamic_cast<Xpetra::CrsMatrixWrap<Scalar,LocalOrdinal,GlobalOrdinal,Node>&
>(Op);
292 Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>&
tmp_ECrsMtx =
dynamic_cast<Xpetra::TpetraCrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>&
>(*
crsOp.getCrsMatrix());
294 }
catch (std::bad_cast&) {
295 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::TpetraCrsMatrix failed");
297 }
catch (std::bad_cast&) {
302 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
305 if (
crsOp == Teuchos::null)
312 return tmp_Crs->getTpetra_CrsMatrixNonConst();
317 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::TpetraCrsMatrix and Xpetra::TpetraBlockCrsMatrix failed");
318 return tmp_BlockCrs->getTpetra_BlockCrsMatrixNonConst();
322 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
325 if (
crsOp == Teuchos::null)
332 return tmp_Crs->getTpetra_CrsMatrixNonConst();
337 throw Exceptions::BadCast(
"Cast from Xpetra::CrsMatrix to Xpetra::TpetraCrsMatrix and Xpetra::TpetraBlockCrsMatrix failed");
338 return tmp_BlockCrs->getTpetra_BlockCrsMatrixNonConst();
343 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
347 throw Exceptions::BadCast(
"Utilities::Map2TpetraMap : Cast from Xpetra::Map to Xpetra::TpetraMap failed");
352 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
357 Scalar one = Teuchos::ScalarTraits<Scalar>::one();
367 switch (Op.getRowMap()->lib()) {
368 case Xpetra::UseTpetra:
372 case Xpetra::UseEpetra:
381 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
386 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
391#ifdef HAVE_MUELU_TPETRA
393 Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>&
tpOp = Op2NonConstTpetraCrs(Op);
404 if (
tpOp.isFillComplete())
407 if (Op.isLocallyIndexed() ==
true) {
408 typename Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::local_inds_host_view_type
cols;
409 typename Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::values_host_view_type
vals;
411 for (
size_t i = 0; i < rowMap->getNodeNumElements(); ++i) {
414 size_t nnz =
tpOp.getNumEntriesInLocalRow(i);
415 typename Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::nonconst_values_host_view_type
scaledVals(
"ScaledVals",
nnz);
417 for (
size_t j = 0; j <
nnz; ++j) {
427 typename Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::global_inds_host_view_type
cols;
428 typename Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::values_host_view_type
vals;
430 for (
size_t i = 0; i < rowMap->getNodeNumElements(); ++i) {
433 size_t nnz =
tpOp.getNumEntriesInGlobalRow(
gid);
434 typename Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::nonconst_values_host_view_type
scaledVals(
"ScaledVals",
nnz);
437 for (
size_t j = 0; j <
nnz; ++j)
447 if (domainMap == Teuchos::null ||
rangeMap == Teuchos::null)
448 throw Exceptions::RuntimeError(
"In Utilities::Scaling: cannot fillComplete because the domain and/or range map hasn't been defined");
452 params->set(
"No Nonlocal Changes",
true);
453 Op.fillComplete(Op.getDomainMap(), Op.getRangeMap(),
params);
463 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
464 RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
466 Transpose (Xpetra::Matrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>& Op,
bool ,
const std::string &
label,
const Teuchos::RCP<Teuchos::ParameterList> &
params) {
467#if defined(HAVE_MUELU_EPETRA) && defined(HAVE_MUELU_EPETRAEXT)
468 std::string
TorE =
"epetra";
470 std::string
TorE =
"tpetra";
473#if defined(HAVE_MUELU_EPETRA) && defined(HAVE_MUELU_EPETRAEXT)
482#ifdef HAVE_MUELU_TPETRA
483 if (
TorE ==
"tpetra") {
491 using Teuchos::ParameterList;
494 rcp (
new ParameterList) :
495 rcp (
new ParameterList (*
params));
503 if (!
AAAA->isFillComplete())
504 AAAA->fillComplete(Op.getRangeMap(), Op.getDomainMap());
506 if (Op.IsView(
"stridedMaps"))
507 AAAA->CreateView(
"stridedMaps", Teuchos::rcpFromRef(Op),
true);
511 }
catch (std::exception&
e) {
512 std::cout <<
"threw exception '" <<
e.what() <<
"'" << std::endl;
519 std::cout <<
"Utilities::Transpose() not implemented for Epetra" << std::endl;
520 return Teuchos::null;
525 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
526 RCP<Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
530#if defined(HAVE_XPETRA_TPETRA) && (defined(HAVE_TPETRA_INST_COMPLEX_DOUBLE) || defined(HAVE_TPETRA_INST_COMPLEX_FLOAT))
531 typedef typename Teuchos::ScalarTraits<Scalar>::magnitudeType real_type;
533 if ((
typeid(
Scalar).name() ==
typeid(std::complex<double>).name()) ||
534 (
typeid(
Scalar).name() ==
typeid(std::complex<float>).name())) {
535 Xscalar = Xpetra::MultiVectorFactory<Scalar,LocalOrdinal,GlobalOrdinal,Node>::Build(X->getMap(),X->getNumVectors());
536 size_t numVecs = X->getNumVectors();
537 for (
size_t j=0;j<
numVecs;j++) {
538 Teuchos::ArrayRCP<const real_type>
XVec = X->getData(j);
550 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
558 if(
paramList.isParameter (
"Coordinates") ==
false)
561#if defined(HAVE_MUELU_TPETRA)
567#if !defined(HAVE_TPETRA_EXPLICIT_INSTANTIATION) || defined(HAVE_TPETRA_INST_FLOAT)
568 typedef Tpetra::MultiVector<float, LocalOrdinal, GlobalOrdinal, Node>
tfMV;
575#if !defined(HAVE_TPETRA_EXPLICIT_INSTANTIATION) || defined(HAVE_TPETRA_INST_DOUBLE)
583#if !defined(HAVE_TPETRA_EXPLICIT_INSTANTIATION) || defined(HAVE_TPETRA_INST_FLOAT)
602 throw Exceptions::RuntimeError(
"ExtractCoordinatesFromParameterList: The coordinates vector in parameter list is expected to be a Tpetra multivector with SC=double or float.");
616#define MUELU_UTILITIES_SHORT
MueLu::DefaultLocalOrdinal LocalOrdinal
MueLu::DefaultScalar Scalar
MueLu::DefaultGlobalOrdinal GlobalOrdinal
Exception indicating invalid cast attempted.
Exception throws to report errors in the internal logical of the program.
Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > Map
static RCP< const Tpetra::RowMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Op2TpetraRow(RCP< const Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Op)
static RCP< Tpetra::RowMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Op2NonConstTpetraRow(RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Op)
static RCP< Tpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Op2NonConstTpetraCrs(RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Op)
static void MyOldScaleMatrix_Tpetra(Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Op, const Teuchos::ArrayRCP< Scalar > &scalingVector, bool doFillComplete, bool doOptimizeStorage)
static RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Transpose(Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Op, bool optimizeTranspose=false, const std::string &label=std::string(), const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
static RCP< const Epetra_CrsMatrix > Op2EpetraCrs(RCP< const Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Op)
static RCP< Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > MV2NonConstTpetraMV2(Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &vec)
static RCP< Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > RealValuedToScalarMultiVector(RCP< Xpetra::MultiVector< typename Teuchos::ScalarTraits< Scalar >::magnitudeType, LocalOrdinal, GlobalOrdinal, Node > > X)
static const Epetra_Map & Map2EpetraMap(const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > &map)
static const RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > Map2TpetraMap(const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > &map)
static RCP< const Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > MV2TpetraMV(RCP< Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > const vec)
Helper utility to pull out the underlying Tpetra objects from an Xpetra object.
static void MyOldScaleMatrix(Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Op, const Teuchos::ArrayRCP< const Scalar > &scalingVector, bool doInverse=true, bool doFillComplete=true, bool doOptimizeStorage=true)
static void MyOldScaleMatrix_Epetra(Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Op, const Teuchos::ArrayRCP< Scalar > &scalingVector, bool doFillComplete, bool doOptimizeStorage)
static RCP< Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > MV2NonConstTpetraMV(RCP< Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > vec)
static RCP< Epetra_MultiVector > MV2NonConstEpetraMV(RCP< Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > vec)
static RCP< Epetra_CrsMatrix > Op2NonConstEpetraCrs(RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Op)
static RCP< const Tpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Op2TpetraCrs(RCP< const Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Op)
static RCP< Xpetra::MultiVector< typename Teuchos::ScalarTraits< Scalar >::magnitudeType, LocalOrdinal, GlobalOrdinal, Node > > ExtractCoordinatesFromParameterList(ParameterList ¶mList)
static RCP< const Epetra_MultiVector > MV2EpetraMV(RCP< Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > const vec)
Helper utility to pull out the underlying Epetra objects from an Xpetra object.
Namespace for MueLu classes and methods.
RCP< Xpetra::CrsMatrixWrap< SC, LO, GO, NO > > Convert_Epetra_CrsMatrix_ToXpetra_CrsMatrixWrap(RCP< Epetra_CrsMatrix > &epAB)