46 #ifndef MUELU_UTILITIES_DECL_HPP 47 #define MUELU_UTILITIES_DECL_HPP 54 #include <Teuchos_ScalarTraits.hpp> 55 #include <Teuchos_ParameterList.hpp> 57 #include <Xpetra_BlockedCrsMatrix_fwd.hpp> 58 #include <Xpetra_CrsMatrix_fwd.hpp> 59 #include <Xpetra_CrsMatrixWrap_fwd.hpp> 60 #include <Xpetra_ImportFactory_fwd.hpp> 61 #include <Xpetra_Map_fwd.hpp> 62 #include <Xpetra_MapFactory_fwd.hpp> 63 #include <Xpetra_Matrix_fwd.hpp> 64 #include <Xpetra_MatrixFactory_fwd.hpp> 65 #include <Xpetra_MultiVector_fwd.hpp> 66 #include <Xpetra_MultiVectorFactory_fwd.hpp> 67 #include <Xpetra_Operator_fwd.hpp> 68 #include <Xpetra_Vector_fwd.hpp> 69 #include <Xpetra_VectorFactory_fwd.hpp> 70 #include <Xpetra_ExportFactory.hpp> 72 #ifdef HAVE_MUELU_EPETRA 73 #include <Xpetra_EpetraCrsMatrix_fwd.hpp> 77 #include <Xpetra_EpetraCrsMatrix.hpp> 78 #include <Xpetra_CrsMatrixWrap.hpp> 84 #ifdef HAVE_MUELU_EPETRAEXT 85 class Epetra_CrsMatrix;
86 class Epetra_MultiVector;
90 #ifdef HAVE_MUELU_TPETRA 91 #include <Tpetra_CrsMatrix.hpp> 92 #include <Tpetra_Map.hpp> 93 #include <Tpetra_MultiVector.hpp> 94 #include <Xpetra_TpetraCrsMatrix_fwd.hpp> 95 #include <Xpetra_TpetraMultiVector_fwd.hpp> 101 #define MueLu_sumAll(rcpComm, in, out) \ 102 Teuchos::reduceAll(*rcpComm, Teuchos::REDUCE_SUM, in, Teuchos::outArg(out)) 103 #define MueLu_minAll(rcpComm, in, out) \ 104 Teuchos::reduceAll(*rcpComm, Teuchos::REDUCE_MIN, in, Teuchos::outArg(out)) 105 #define MueLu_maxAll(rcpComm, in, out) \ 106 Teuchos::reduceAll(*rcpComm, Teuchos::REDUCE_MAX, in, Teuchos::outArg(out)) 108 #ifdef HAVE_MUELU_EPETRA 110 template<
typename SC,
typename LO,
typename GO,
typename NO>
111 RCP<Xpetra::CrsMatrixWrap<SC,LO,GO,NO> >
114 template<
typename SC,
typename LO,
typename GO,
typename NO>
115 RCP<Xpetra::Matrix<SC, LO, GO, NO> >
118 template<
typename SC,
typename LO,
typename GO,
typename NO>
119 RCP<Xpetra::MultiVector<SC, LO, GO, NO> >
123 #ifdef HAVE_MUELU_TPETRA 124 template<
typename SC,
typename LO,
typename GO,
typename NO>
125 RCP<Xpetra::Matrix<SC, LO, GO, NO> >
129 template<
typename SC,
typename LO,
typename GO,
typename NO>
130 RCP<Xpetra::MultiVector<SC, LO, GO, NO> >
141 template <
class Scalar,
142 class LocalOrdinal = int,
143 class GlobalOrdinal = LocalOrdinal,
144 class Node = KokkosClassic::DefaultNode::DefaultNodeType>
146 #undef MUELU_UTILITIES_SHORT 150 typedef typename Teuchos::ScalarTraits<SC>::magnitudeType
Magnitude;
152 #ifdef HAVE_MUELU_EPETRA 155 static RCP<const Epetra_MultiVector>
MV2EpetraMV(RCP<MultiVector>
const Vec);
158 static const Epetra_MultiVector&
MV2EpetraMV(
const MultiVector& Vec);
161 static RCP<const Epetra_CrsMatrix>
Op2EpetraCrs(RCP<const Matrix> Op);
164 static const Epetra_CrsMatrix&
Op2EpetraCrs(
const Matrix& Op);
171 #ifdef HAVE_MUELU_TPETRA 174 static RCP<const Tpetra::MultiVector<SC,LO,GO,NO> >
MV2TpetraMV(RCP<MultiVector>
const Vec);
178 static const Tpetra::MultiVector<SC,LO,GO,NO>&
MV2TpetraMV(
const MultiVector& Vec);
181 static RCP<const Tpetra::CrsMatrix<SC,LO,GO,NO> >
Op2TpetraCrs(RCP<const Matrix> Op);
184 static const Tpetra::CrsMatrix<SC,LO,GO,NO>&
Op2TpetraCrs(
const Matrix& Op);
187 static RCP<const Tpetra::RowMatrix<SC,LO,GO,NO> >
Op2TpetraRow(RCP<const Matrix> Op);
191 static const RCP<const Tpetra::Map<LO, GO, NO> >
Map2TpetraMap(
const Map& map);
194 static RCP<Xpetra::Matrix<SC,LO,GO,NO> >
Crs2Op(RCP<CrsMatrix> Op);
243 static void ScaleMatrix(Matrix& Op,
const Teuchos::ArrayRCP<SC>& scalingVector,
bool doInverse =
true);
250 static Teuchos::Array<Magnitude>
ResidualNorm(
const Operator& Op,
const MultiVector& X,
const MultiVector& RHS);
252 static RCP<MultiVector>
Residual(
const Operator& Op,
const MultiVector& X,
const MultiVector& RHS);
260 static void Write(
const std::string& fileName,
const Map& M);
263 static void Write(
const std::string& fileName,
const MultiVector& Vec);
266 static void Write(
const std::string& fileName,
const Matrix& Op);
269 static Teuchos::RCP<Matrix>
Read(
const std::string& fileName, Xpetra::UnderlyingLib lib,
const RCP<
const Teuchos::Comm<int> >& comm,
bool binary =
false);
275 static Teuchos::RCP<Matrix>
Read(
const std::string& filename,
276 const RCP<const Map> rowMap,
277 RCP<const Map> colMap = Teuchos::null,
278 const RCP<const Map> domainMap = Teuchos::null,
279 const RCP<const Map> rangeMap = Teuchos::null,
280 const bool callFillComplete =
true,
281 const bool binary =
false,
282 const bool tolerant =
false,
283 const bool debug =
false);
303 static Scalar
PowerMethod(
const Matrix& A,
bool scaleByDiag =
true,
304 LO niters = 10, Magnitude tolerance = 1e-2,
bool verbose =
false,
unsigned int seed = 123);
306 static void MyOldScaleMatrix(Matrix& Op,
const Teuchos::ArrayRCP<const SC>& scalingVector,
bool doInverse =
true,
307 bool doFillComplete =
true,
bool doOptimizeStorage =
true);
310 bool doFillComplete,
bool doOptimizeStorage);
312 static RCP<Teuchos::FancyOStream>
MakeFancy(std::ostream& os);
318 static typename Teuchos::ScalarTraits<Scalar>::magnitudeType
Distance2(
const MultiVector& v, LocalOrdinal i0, LocalOrdinal i1);
327 static Teuchos::ArrayRCP<const bool>
DetectDirichletRows(
const Matrix& A,
const Magnitude& tol = Teuchos::ScalarTraits<SC>::zero());
341 std::vector<LO>& dirichletRows);
343 std::vector<LO>& dirichletRows,
344 std::vector<LO>& dirichletCols);
346 std::vector<LO>& dirichletRows);
348 std::vector<LO>& dirichletCols);
357 long ExtractNonSerializableData(
const Teuchos::ParameterList& inList, Teuchos::ParameterList& serialList, Teuchos::ParameterList& nonSerialList);
369 #ifdef HAVE_MUELU_EPETRA 371 template<
class SC,
class LO,
class GO,
class NO>
372 RCP<Xpetra::CrsMatrixWrap<SC,LO,GO,NO> >
375 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"Convert_Epetra_CrsMatrix_ToXpetra_CrsMatrixWrap cannot be used with Scalar != double, LocalOrdinal != int, GlobalOrdinal != int");
376 return Teuchos::null;
379 typedef KokkosClassic::DefaultNode::DefaultNodeType
KDNT;
384 RCP<Xpetra::EpetraCrsMatrix> tmpC1 = rcp(
new Xpetra::EpetraCrsMatrix(epAB));
385 RCP<Xpetra::CrsMatrix<double,int,int,KDNT> > tmpC2 = rcp_implicit_cast<Xpetra::CrsMatrix<double,int,int,KDNT> >(tmpC1);
386 RCP<Xpetra::CrsMatrixWrap<double,int,int,KDNT> > tmpC3 = rcp(
new Xpetra::CrsMatrixWrap<double,int,int,KDNT>(tmpC2));
394 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
395 RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
397 typedef Xpetra::EpetraCrsMatrix XECrsMatrix;
398 typedef Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> XCrsMatrix;
399 typedef Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node> XCrsMatrixWrap;
401 RCP<XCrsMatrix> Atmp = rcp(
new XECrsMatrix(A));
402 return rcp(
new XCrsMatrixWrap(Atmp));
409 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
410 RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
412 return rcp(
new Xpetra::EpetraMultiVector(V));
416 #ifdef HAVE_MUELU_TPETRA 421 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
422 RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
424 typedef Xpetra::TpetraCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> XTCrsMatrix;
425 typedef Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> XCrsMatrix;
426 typedef Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node> XCrsMatrixWrap;
428 RCP<XCrsMatrix> Atmp = rcp(
new XTCrsMatrix(Atpetra));
429 return rcp(
new XCrsMatrixWrap(Atmp));
436 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
437 RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
439 return rcp(
new Xpetra::TpetraMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>(Vtpetra));
446 std::ostringstream buf;
457 template <
class Scalar,
458 class LocalOrdinal = int,
459 class GlobalOrdinal = LocalOrdinal,
460 class Node = KokkosClassic::DefaultNode::DefaultNodeType>
472 static RCP<Matrix> Transpose(Matrix& Op,
bool optimizeTranspose =
false,
const std::string & label = std::string());
475 static void MyOldScaleMatrix_Epetra(Matrix& Op,
const Teuchos::ArrayRCP<SC>& scalingVector,
bool doFillComplete,
bool doOptimizeStorage);
477 static RCP<MultiVector> ReadMultiVector (
const std::string& fileName,
const RCP<const Map>& map);
478 static RCP<const Map> ReadMap (
const std::string& fileName, Xpetra::UnderlyingLib lib,
const RCP<
const Teuchos::Comm<int> >& comm);
487 typedef KokkosClassic::DefaultNode::DefaultNodeType
NO;
488 typedef Xpetra::Map<int,int,NO>
Map;
489 typedef Xpetra::Matrix<double,int,int,NO>
Matrix;
494 static RCP<Matrix> Transpose (Matrix& Op,
bool optimizeTranspose =
false,
const std::string & label = std::string());
495 static void MyOldScaleMatrix_Epetra (Matrix& Op,
const Teuchos::ArrayRCP<SC>& scalingVector,
bool doFillComplete,
bool doOptimizeStorage);
496 static RCP<MultiVector> ReadMultiVector (
const std::string& fileName,
const RCP<const Map>& map);
497 static RCP<const Map> ReadMap (
const std::string& fileName, Xpetra::UnderlyingLib lib,
const RCP<
const Teuchos::Comm<int> >& comm);
502 #ifdef HAVE_MUELU_EPETRA 507 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
508 RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
515 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
516 RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
520 #ifdef HAVE_MUELU_TPETRA 525 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
526 RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
533 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
534 RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
540 #define MUELU_UTILITIES_SHORT 541 #endif // MUELU_UTILITIES_DECL_HPP static void SetRandomSeed(const Teuchos::Comm< int > &comm)
Set seed for random number generator.
static void Remove_Zeroed_Rows(Teuchos::RCP< Matrix > &A, double tol=1.0e-14)
Xpetra::Map< int, int, NO > Map
static RCP< Epetra_MultiVector > MV2NonConstEpetraMV(RCP< MultiVector > Vec)
static void Write(const std::string &fileName, const Map &M)
Read/Write methods.
RCP< Xpetra::Matrix< SC, LO, GO, NO > > EpetraCrs_To_XpetraMatrix(const Teuchos::RCP< Epetra_CrsMatrix > &A)
std::string toString(const T &what)
Little helper function to convert non-string types to strings.
RCP< Xpetra::MultiVector< SC, LO, GO, NO > > TpetraCrs_To_XpetraMultiVector(const Teuchos::RCP< Tpetra::MultiVector< SC, LO, GO, NO > > &Vtpetra)
static const Epetra_Map & Map2EpetraMap(const Map &map)
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
KokkosClassic::DefaultNode::DefaultNodeType NO
static const RCP< const Tpetra::Map< LO, GO, NO > > Map2TpetraMap(const Map &map)
Namespace for MueLu classes and methods.
bool IsParamMuemexVariable(const std::string &name)
static RCP< Tpetra::MultiVector< SC, LO, GO, NO > > MV2NonConstTpetraMV(RCP< MultiVector > Vec)
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.
static void Apply_BCsToMatrixRows(Teuchos::RCP< Matrix > &A, std::vector< LO > &dirichletRows)
static RCP< const Epetra_CrsMatrix > Op2EpetraCrs(RCP< const Matrix > Op)
RCP< Xpetra::CrsMatrixWrap< double, int, int, KDNT > > Convert_Epetra_CrsMatrix_ToXpetra_CrsMatrixWrap< double, int, int, KDNT >(RCP< Epetra_CrsMatrix > &epAB)
static RCP< const Tpetra::CrsMatrix< SC, LO, GO, NO > > Op2TpetraCrs(RCP< const Matrix > Op)
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)
Xpetra::MultiVector< double, int, int, NO > MultiVector
Xpetra::Matrix< double, int, int, NO > Matrix
RCP< Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > TpetraMultiVector_To_XpetraMultiVector(const Teuchos::RCP< Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &Vtpetra)
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 Teuchos::ArrayRCP< SC > GetMatrixDiagonal(const Matrix &A)
Extract Matrix Diagonal.
RCP< Xpetra::Matrix< SC, LO, GO, NO > > TpetraCrs_To_XpetraMatrix(const Teuchos::RCP< Tpetra::CrsMatrix< SC, LO, GO, NO > > &Atpetra)
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)
void TokenizeStringAndStripWhiteSpace(const std::string &stream, std::vector< std::string > &tokenList, const char *delimChars)
RCP< Xpetra::MultiVector< SC, LO, GO, NO > > EpetraMultiVector_To_XpetraMultiVector(const Teuchos::RCP< Epetra_MultiVector > &V)
KokkosClassic::DefaultNode::DefaultNodeType KDNT
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)
long ExtractNonSerializableData(const Teuchos::ParameterList &inList, Teuchos::ParameterList &serialList, Teuchos::ParameterList &nonSerialList)
static void findDirichletRows(Teuchos::RCP< Matrix > A, std::vector< LO > &dirichletRows)