46 #ifndef BELOS_XPETRA_ADAPTER_MULTIVECTOR_HPP 47 #define BELOS_XPETRA_ADAPTER_MULTIVECTOR_HPP 49 #include <Xpetra_ConfigDefs.hpp> 50 #include <Xpetra_Exceptions.hpp> 51 #include <Xpetra_MultiVector.hpp> 53 #ifdef HAVE_XPETRA_EPETRA 54 #include <Xpetra_EpetraMultiVector.hpp> 57 #ifdef HAVE_XPETRA_TPETRA 58 #include <Xpetra_TpetraMultiVector.hpp> 61 #include <BelosConfigDefs.hpp> 62 #include <BelosTypes.hpp> 63 #include <BelosMultiVecTraits.hpp> 64 #include <BelosOperatorTraits.hpp> 66 #ifdef HAVE_XPETRA_EPETRA 67 #include <BelosEpetraAdapter.hpp> 70 #ifdef HAVE_XPETRA_TPETRA 71 #include <BelosTpetraAdapter.hpp> 72 #include <TpetraCore_config.h> 90 template<
class Scalar,
class LO,
class GO,
class Node>
91 class MultiVecTraits<Scalar, Xpetra::MultiVector<Scalar,LO,GO,Node> > {
93 #ifdef HAVE_XPETRA_TPETRA 94 typedef Xpetra::TpetraMultiVector<Scalar,LO,GO,Node> TpetraMultiVector;
95 typedef MultiVecTraits<Scalar,Tpetra::MultiVector<Scalar,LO,GO,Node> > MultiVecTraitsTpetra;
100 #ifdef HAVE_BELOS_XPETRA_TIMERS 107 #ifdef HAVE_XPETRA_TPETRA 108 if (mv.getMap()->lib() == Xpetra::UseTpetra)
109 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::Clone(toTpetra(mv), numvecs)));
112 XPETRA_FACTORY_ERROR_IF_EPETRA(mv.getMap()->lib());
119 #ifdef HAVE_XPETRA_TPETRA 120 if (mv.getMap()->lib() == Xpetra::UseTpetra)
121 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::CloneCopy(toTpetra(mv))));
124 XPETRA_FACTORY_ERROR_IF_EPETRA(mv.getMap()->lib());
131 #ifdef HAVE_XPETRA_TPETRA 132 if (mv.getMap()->lib() == Xpetra::UseTpetra)
133 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::CloneCopy(toTpetra(mv), index)));
136 XPETRA_FACTORY_ERROR_IF_EPETRA(mv.getMap()->lib());
141 CloneCopy (
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv,
145 #ifdef HAVE_XPETRA_TPETRA 146 if (mv.getMap()->lib() == Xpetra::UseTpetra)
147 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::CloneCopy(toTpetra(mv), index)));
150 XPETRA_FACTORY_ERROR_IF_EPETRA(mv.getMap()->lib());
157 #ifdef HAVE_XPETRA_TPETRA 158 if (mv.getMap()->lib() == Xpetra::UseTpetra)
159 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::CloneViewNonConst(toTpetra(mv), index)));
162 XPETRA_FACTORY_ERROR_IF_EPETRA(mv.getMap()->lib());
171 #ifdef HAVE_XPETRA_TPETRA 172 if (mv.getMap()->lib() == Xpetra::UseTpetra)
173 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::CloneViewNonConst(toTpetra(mv), index)));
176 XPETRA_FACTORY_ERROR_IF_EPETRA(mv.getMap()->lib());
183 #ifdef HAVE_XPETRA_TPETRA 184 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
187 return rcp(
new TpetraMultiVector(Teuchos::rcp_const_cast<Tpetra::MultiVector<Scalar,LO,GO,Node> >(r)));
191 XPETRA_FACTORY_ERROR_IF_EPETRA(mv.getMap()->lib());
196 CloneView (
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv,
200 #ifdef HAVE_XPETRA_TPETRA 201 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
204 return rcp(
new TpetraMultiVector(Teuchos::rcp_const_cast<Tpetra::MultiVector<Scalar,LO,GO,Node> >(r)));
208 XPETRA_FACTORY_ERROR_IF_EPETRA(mv.getMap()->lib());
215 #ifdef HAVE_XPETRA_TPETRA 216 if (mv.getMap()->lib() == Xpetra::UseTpetra)
217 return MultiVecTraitsTpetra::GetGlobalLength(toTpetra(mv));
220 XPETRA_FACTORY_ERROR_IF_EPETRA(mv.getMap()->lib());
224 static int GetNumberVecs(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv )
227 #ifdef HAVE_XPETRA_TPETRA 228 if (mv.getMap()->lib() == Xpetra::UseTpetra)
229 return MultiVecTraitsTpetra::GetNumberVecs(toTpetra(mv));
232 XPETRA_FACTORY_ERROR_IF_EPETRA(mv.getMap()->lib());
239 #ifdef HAVE_XPETRA_TPETRA 240 if (mv.getMap()->lib() == Xpetra::UseTpetra)
241 return MultiVecTraitsTpetra::HasConstantStride(toTpetra(mv));
244 XPETRA_FACTORY_ERROR_IF_EPETRA(mv.getMap()->lib());
248 static void MvTimesMatAddMv( Scalar alpha,
const Xpetra::MultiVector<Scalar,LO,GO,Node>& A,
250 Scalar beta, Xpetra::MultiVector<Scalar,LO,GO,Node>& mv )
253 #ifdef HAVE_BELOS_XPETRA_TIMERS 258 #ifdef HAVE_XPETRA_TPETRA 259 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
260 MultiVecTraitsTpetra::MvTimesMatAddMv(alpha, toTpetra(A), B, beta, toTpetra(mv));
265 XPETRA_FACTORY_ERROR_IF_EPETRA(mv.getMap()->lib());
269 static void MvAddMv( Scalar alpha,
const Xpetra::MultiVector<Scalar,LO,GO,Node>& A, Scalar beta,
const Xpetra::MultiVector<Scalar,LO,GO,Node>& B, Xpetra::MultiVector<Scalar,LO,GO,Node>& mv )
272 #ifdef HAVE_XPETRA_TPETRA 273 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
274 MultiVecTraitsTpetra::MvAddMv(alpha, toTpetra(A), beta, toTpetra(B), toTpetra(mv));
280 XPETRA_FACTORY_ERROR_IF_EPETRA(mv.getMap()->lib());
284 static void MvScale ( Xpetra::MultiVector<Scalar,LO,GO,Node>& mv, Scalar alpha )
287 #ifdef HAVE_XPETRA_TPETRA 288 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
289 MultiVecTraitsTpetra::MvScale(toTpetra(mv), alpha);
294 XPETRA_FACTORY_ERROR_IF_EPETRA(mv.getMap()->lib());
298 static void MvScale ( Xpetra::MultiVector<Scalar,LO,GO,Node>& mv,
const std::vector<Scalar>& alphas )
301 #ifdef HAVE_XPETRA_TPETRA 302 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
303 MultiVecTraitsTpetra::MvScale(toTpetra(mv), alphas);
308 XPETRA_FACTORY_ERROR_IF_EPETRA(mv.getMap()->lib());
312 static void MvTransMv( Scalar alpha,
const Xpetra::MultiVector<Scalar,LO,GO,Node>& A,
const Xpetra::MultiVector<Scalar,LO,GO,Node>& B,
Teuchos::SerialDenseMatrix<int,Scalar>& C)
315 #ifdef HAVE_BELOS_XPETRA_TIMERS 319 #ifdef HAVE_XPETRA_TPETRA 320 if (A.getMap()->lib() == Xpetra::UseTpetra) {
321 MultiVecTraitsTpetra::MvTransMv(alpha, toTpetra(A), toTpetra(B), C);
326 XPETRA_FACTORY_ERROR_IF_EPETRA(A.getMap()->lib());
330 static void MvDot(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& A,
const Xpetra::MultiVector<Scalar,LO,GO,Node>& B, std::vector<Scalar> &dots)
333 #ifdef HAVE_XPETRA_TPETRA 334 if (A.getMap()->lib() == Xpetra::UseTpetra) {
335 MultiVecTraitsTpetra::MvDot(toTpetra(A), toTpetra(B), dots);
340 XPETRA_FACTORY_ERROR_IF_EPETRA(A.getMap()->lib());
347 #ifdef HAVE_XPETRA_TPETRA 348 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
349 MultiVecTraitsTpetra::MvNorm(toTpetra(mv), normvec, type);
354 XPETRA_FACTORY_ERROR_IF_EPETRA(mv.getMap()->lib());
358 static void SetBlock(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& A,
const std::vector<int>& index, Xpetra::MultiVector<Scalar,LO,GO,Node>& mv )
361 #ifdef HAVE_XPETRA_TPETRA 362 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
363 MultiVecTraitsTpetra::SetBlock(toTpetra(A), index, toTpetra(mv));
368 XPETRA_FACTORY_ERROR_IF_EPETRA(mv.getMap()->lib());
373 SetBlock (
const Xpetra::MultiVector<Scalar,LO,GO,Node>& A,
375 Xpetra::MultiVector<Scalar,LO,GO,Node>& mv)
378 #ifdef HAVE_XPETRA_TPETRA 379 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
380 MultiVecTraitsTpetra::SetBlock(toTpetra(A), index, toTpetra(mv));
385 XPETRA_FACTORY_ERROR_IF_EPETRA(mv.getMap()->lib());
390 Assign (
const Xpetra::MultiVector<Scalar,LO,GO,Node>& A,
391 Xpetra::MultiVector<Scalar,LO,GO,Node>& mv)
394 #ifdef HAVE_XPETRA_TPETRA 395 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
396 MultiVecTraitsTpetra::Assign(toTpetra(A), toTpetra(mv));
401 XPETRA_FACTORY_ERROR_IF_EPETRA(mv.getMap()->lib());
405 static void MvRandom( Xpetra::MultiVector<Scalar,LO,GO,Node>& mv )
408 #ifdef HAVE_XPETRA_TPETRA 409 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
410 MultiVecTraitsTpetra::MvRandom(toTpetra(mv));
415 XPETRA_FACTORY_ERROR_IF_EPETRA(mv.getMap()->lib());
422 #ifdef HAVE_XPETRA_TPETRA 423 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
424 MultiVecTraitsTpetra::MvInit(toTpetra(mv), alpha);
429 XPETRA_FACTORY_ERROR_IF_EPETRA(mv.getMap()->lib());
433 static void MvPrint(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv, std::ostream& os )
436 #ifdef HAVE_XPETRA_TPETRA 437 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
438 MultiVecTraitsTpetra::MvPrint(toTpetra(mv), os);
443 XPETRA_FACTORY_ERROR_IF_EPETRA(mv.getMap()->lib());
449 #ifdef HAVE_XPETRA_EPETRA 450 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES 452 class MultiVecTraits<double, Xpetra::MultiVector<double,int,int,Xpetra::EpetraNode> > {
454 typedef double Scalar;
459 #ifdef HAVE_XPETRA_TPETRA // TODO check whether Tpetra is instantiated on all template parameters! 460 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 461 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 462 typedef Xpetra::TpetraMultiVector<Scalar,LO,GO,Node> TpetraMultiVector;
463 typedef MultiVecTraits<Scalar, Tpetra::MultiVector<Scalar,LO,GO,Node> > MultiVecTraitsTpetra;
467 #ifdef HAVE_XPETRA_EPETRA 468 typedef Xpetra::EpetraMultiVectorT<GO,Node> EpetraMultiVector;
469 typedef MultiVecTraits <Scalar, Epetra_MultiVector> MultiVecTraitsEpetra;
474 #ifdef HAVE_BELOS_XPETRA_TIMERS 475 static RCP<Teuchos::Time> mvTimesMatAddMvTimer_, mvTransMvTimer_;
478 static RCP<Xpetra::MultiVector<Scalar,LO,GO,Node> > Clone(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv,
const int numvecs )
481 #ifdef HAVE_XPETRA_TPETRA 482 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
483 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 484 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 485 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::Clone(toTpetra(mv), numvecs)));
490 #ifdef HAVE_XPETRA_EPETRA 491 if (mv.getMap()->lib() == Xpetra::UseEpetra)
492 return rcp(
new EpetraMultiVector(MultiVecTraitsEpetra::Clone(toEpetra(mv), numvecs)));
498 static RCP<Xpetra::MultiVector<Scalar,LO,GO,Node> > CloneCopy(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv )
501 #ifdef HAVE_XPETRA_TPETRA 502 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
503 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 504 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 505 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::CloneCopy(toTpetra(mv))));
510 #ifdef HAVE_XPETRA_EPETRA 511 if (mv.getMap()->lib() == Xpetra::UseEpetra)
512 return rcp(
new EpetraMultiVector(MultiVecTraitsEpetra::CloneCopy(toEpetra(mv))));
518 static RCP<Xpetra::MultiVector<Scalar,LO,GO,Node> > CloneCopy(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv,
const std::vector<int>& index )
521 #ifdef HAVE_XPETRA_TPETRA 522 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
523 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 524 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 525 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::CloneCopy(toTpetra(mv), index)));
530 #ifdef HAVE_XPETRA_EPETRA 531 if (mv.getMap()->lib() == Xpetra::UseEpetra)
532 return rcp(
new EpetraMultiVector(MultiVecTraitsEpetra::CloneCopy(toEpetra(mv), index)));
538 static RCP<Xpetra::MultiVector<Scalar,LO,GO,Node> >
539 CloneCopy (
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv,
543 #ifdef HAVE_XPETRA_TPETRA 544 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
545 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 546 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 547 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::CloneCopy(toTpetra(mv), index)));
552 #ifdef HAVE_XPETRA_EPETRA 553 if (mv.getMap()->lib() == Xpetra::UseEpetra)
554 return rcp(
new EpetraMultiVector(MultiVecTraitsEpetra::CloneCopy(toEpetra(mv), index)));
560 static RCP<Xpetra::MultiVector<Scalar,LO,GO,Node> > CloneViewNonConst( Xpetra::MultiVector<Scalar,LO,GO,Node>& mv,
const std::vector<int>& index )
563 #ifdef HAVE_XPETRA_TPETRA 564 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
565 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 566 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 567 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::CloneViewNonConst(toTpetra(mv), index)));
572 #ifdef HAVE_XPETRA_EPETRA 573 if (mv.getMap()->lib() == Xpetra::UseEpetra)
574 return rcp(
new EpetraMultiVector(MultiVecTraitsEpetra::CloneViewNonConst(toEpetra(mv), index)));
580 static RCP<Xpetra::MultiVector<Scalar,LO,GO,Node> >
581 CloneViewNonConst(Xpetra::MultiVector<Scalar,LO,GO,Node>& mv,
585 #ifdef HAVE_MUELUA_TPETRA 586 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
587 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 588 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 589 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::CloneViewNonConst(toTpetra(mv), index)));
594 #ifdef HAVE_XPETRA_EPETRA 595 if (mv.getMap()->lib() == Xpetra::UseEpetra)
596 return rcp(
new EpetraMultiVector(MultiVecTraitsEpetra::CloneViewNonConst(toEpetra(mv), index)));
602 static RCP<const Xpetra::MultiVector<Scalar,LO,GO,Node> > CloneView(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv,
const std::vector<int>& index )
605 #ifdef HAVE_XPETRA_TPETRA 606 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
607 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 608 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 610 RCP<const Tpetra::MultiVector<Scalar,LO,GO,Node> > r = MultiVecTraitsTpetra::CloneView(toTpetra(mv), index);
611 return rcp(
new TpetraMultiVector(Teuchos::rcp_const_cast<Tpetra::MultiVector<Scalar,LO,GO,Node> >(r)));
616 #ifdef HAVE_XPETRA_EPETRA 617 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
619 RCP<const Epetra_MultiVector > r = MultiVecTraitsEpetra::CloneView(toEpetra(mv), index);
620 return rcp(
new EpetraMultiVector(Teuchos::rcp_const_cast<Epetra_MultiVector>(r)));
627 static RCP<const Xpetra::MultiVector<Scalar,LO,GO,Node> >
628 CloneView (
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv,
632 #ifdef HAVE_XPETRA_TPETRA 633 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
634 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 635 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 637 RCP<const Tpetra::MultiVector<Scalar,LO,GO,Node> > r = MultiVecTraitsTpetra::CloneView(toTpetra(mv), index);
638 return rcp(
new TpetraMultiVector(Teuchos::rcp_const_cast<Tpetra::MultiVector<Scalar,LO,GO,Node> >(r)));
643 #ifdef HAVE_XPETRA_EPETRA 644 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
646 RCP<const Epetra_MultiVector > r = MultiVecTraitsEpetra::CloneView(toEpetra(mv), index);
647 return rcp(
new EpetraMultiVector(Teuchos::rcp_const_cast<Epetra_MultiVector>(r)));
654 static ptrdiff_t GetGlobalLength(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv )
657 #ifdef HAVE_XPETRA_TPETRA 658 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
659 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 660 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 661 return MultiVecTraitsTpetra::GetGlobalLength(toTpetra(mv));
666 #ifdef HAVE_XPETRA_EPETRA 667 if (mv.getMap()->lib() == Xpetra::UseEpetra)
668 return MultiVecTraitsEpetra::GetGlobalLength(toEpetra(mv));
674 static int GetNumberVecs(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv )
677 #ifdef HAVE_XPETRA_TPETRA 678 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
679 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 680 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 681 return MultiVecTraitsTpetra::GetNumberVecs(toTpetra(mv));
686 #ifdef HAVE_XPETRA_EPETRA 687 if (mv.getMap()->lib() == Xpetra::UseEpetra)
688 return MultiVecTraitsEpetra::GetNumberVecs(toEpetra(mv));
694 static bool HasConstantStride(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv )
697 #ifdef HAVE_XPETRA_TPETRA 698 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
699 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 700 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 701 return MultiVecTraitsTpetra::HasConstantStride(toTpetra(mv));
706 #ifdef HAVE_XPETRA_EPETRA 707 if (mv.getMap()->lib() == Xpetra::UseEpetra)
708 return MultiVecTraitsEpetra::HasConstantStride(toEpetra(mv));
714 static void MvTimesMatAddMv( Scalar alpha,
const Xpetra::MultiVector<Scalar,LO,GO,Node>& A,
716 Scalar beta, Xpetra::MultiVector<Scalar,LO,GO,Node>& mv )
719 #ifdef HAVE_BELOS_XPETRA_TIMERS 723 #ifdef HAVE_XPETRA_TPETRA 724 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
725 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 726 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 727 MultiVecTraitsTpetra::MvTimesMatAddMv(alpha, toTpetra(A), B, beta, toTpetra(mv));
733 #ifdef HAVE_XPETRA_EPETRA 734 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
735 MultiVecTraitsEpetra::MvTimesMatAddMv(alpha, toEpetra(A), B, beta, toEpetra(mv));
743 static void MvAddMv( Scalar alpha,
const Xpetra::MultiVector<Scalar,LO,GO,Node>& A, Scalar beta,
const Xpetra::MultiVector<Scalar,LO,GO,Node>& B, Xpetra::MultiVector<Scalar,LO,GO,Node>& mv )
746 #ifdef HAVE_XPETRA_TPETRA 747 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
748 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 749 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 750 MultiVecTraitsTpetra::MvAddMv(alpha, toTpetra(A), beta, toTpetra(B), toTpetra(mv));
756 #ifdef HAVE_XPETRA_EPETRA 757 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
758 MultiVecTraitsEpetra::MvAddMv(alpha, toEpetra(A), beta, toEpetra(B), toEpetra(mv));
766 static void MvScale ( Xpetra::MultiVector<Scalar,LO,GO,Node>& mv, Scalar alpha )
769 #ifdef HAVE_XPETRA_TPETRA 770 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
771 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 772 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 773 MultiVecTraitsTpetra::MvScale(toTpetra(mv), alpha);
779 #ifdef HAVE_XPETRA_EPETRA 780 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
781 MultiVecTraitsEpetra::MvScale(toEpetra(mv), alpha);
789 static void MvScale ( Xpetra::MultiVector<Scalar,LO,GO,Node>& mv,
const std::vector<Scalar>& alphas )
792 #ifdef HAVE_XPETRA_TPETRA 793 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
794 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 795 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 796 MultiVecTraitsTpetra::MvScale(toTpetra(mv), alphas);
802 #ifdef HAVE_XPETRA_EPETRA 803 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
804 MultiVecTraitsEpetra::MvScale(toEpetra(mv), alphas);
812 static void MvTransMv( Scalar alpha,
const Xpetra::MultiVector<Scalar,LO,GO,Node>& A,
const Xpetra::MultiVector<Scalar,LO,GO,Node>& B,
Teuchos::SerialDenseMatrix<int,Scalar>& C)
815 #ifdef HAVE_BELOS_XPETRA_TIMERS 819 #ifdef HAVE_XPETRA_TPETRA 820 if (A.getMap()->lib() == Xpetra::UseTpetra) {
821 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 822 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 823 MultiVecTraitsTpetra::MvTransMv(alpha, toTpetra(A), toTpetra(B), C);
829 #ifdef HAVE_XPETRA_EPETRA 830 if (A.getMap()->lib() == Xpetra::UseEpetra) {
831 MultiVecTraitsEpetra::MvTransMv(alpha, toEpetra(A), toEpetra(B), C);
839 static void MvDot(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& A,
const Xpetra::MultiVector<Scalar,LO,GO,Node>& B, std::vector<Scalar> &dots)
842 #ifdef HAVE_XPETRA_TPETRA 843 if (A.getMap()->lib() == Xpetra::UseTpetra) {
844 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 845 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 846 MultiVecTraitsTpetra::MvDot(toTpetra(A), toTpetra(B), dots);
852 #ifdef HAVE_XPETRA_EPETRA 853 if (A.getMap()->lib() == Xpetra::UseEpetra) {
854 MultiVecTraitsEpetra::MvDot(toEpetra(A), toEpetra(B), dots);
865 #ifdef HAVE_XPETRA_TPETRA 866 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
867 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 868 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 869 MultiVecTraitsTpetra::MvNorm(toTpetra(mv), normvec, type);
875 #ifdef HAVE_XPETRA_EPETRA 876 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
877 MultiVecTraitsEpetra::MvNorm(toEpetra(mv), normvec, type);
885 static void SetBlock(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& A,
const std::vector<int>& index, Xpetra::MultiVector<Scalar,LO,GO,Node>& mv )
888 #ifdef HAVE_XPETRA_TPETRA 889 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
890 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 891 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 892 MultiVecTraitsTpetra::SetBlock(toTpetra(A), index, toTpetra(mv));
898 #ifdef HAVE_XPETRA_EPETRA 899 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
900 MultiVecTraitsEpetra::SetBlock(toEpetra(A), index, toEpetra(mv));
909 SetBlock (
const Xpetra::MultiVector<Scalar,LO,GO,Node>& A,
911 Xpetra::MultiVector<Scalar,LO,GO,Node>& mv)
914 #ifdef HAVE_XPETRA_TPETRA 915 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
916 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 917 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 918 MultiVecTraitsTpetra::SetBlock(toTpetra(A), index, toTpetra(mv));
924 #ifdef HAVE_XPETRA_EPETRA 925 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
926 MultiVecTraitsEpetra::SetBlock(toEpetra(A), index, toEpetra(mv));
935 Assign (
const Xpetra::MultiVector<Scalar,LO,GO,Node>& A,
936 Xpetra::MultiVector<Scalar,LO,GO,Node>& mv)
939 #ifdef HAVE_XPETRA_TPETRA 940 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
941 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 942 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 943 MultiVecTraitsTpetra::Assign(toTpetra(A), toTpetra(mv));
949 #ifdef HAVE_XPETRA_EPETRA 950 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
951 MultiVecTraitsEpetra::Assign(toEpetra(A), toEpetra(mv));
959 static void MvRandom( Xpetra::MultiVector<Scalar,LO,GO,Node>& mv )
962 #ifdef HAVE_XPETRA_TPETRA 963 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
964 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 965 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 966 MultiVecTraitsTpetra::MvRandom(toTpetra(mv));
972 #ifdef HAVE_XPETRA_EPETRA 973 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
974 MultiVecTraitsEpetra::MvRandom(toEpetra(mv));
985 #ifdef HAVE_XPETRA_TPETRA 986 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
987 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 988 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 989 MultiVecTraitsTpetra::MvInit(toTpetra(mv), alpha);
995 #ifdef HAVE_XPETRA_EPETRA 996 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
997 MultiVecTraitsEpetra::MvInit(toEpetra(mv), alpha);
1005 static void MvPrint(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv, std::ostream& os )
1008 #ifdef HAVE_XPETRA_TPETRA 1009 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1010 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \ 1011 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT)))) 1012 MultiVecTraitsTpetra::MvPrint(toTpetra(mv), os);
1018 #ifdef HAVE_XPETRA_EPETRA 1019 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
1020 MultiVecTraitsEpetra::MvPrint(toEpetra(mv), os);
1028 #endif // #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES 1029 #endif // HAVE_XPETRA_EPETRA 1032 #ifdef HAVE_XPETRA_EPETRA 1033 #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES 1035 class MultiVecTraits<double, Xpetra::MultiVector<double,int,long long,Xpetra::EpetraNode> > {
1037 typedef double Scalar;
1039 typedef long long GO;
1042 #ifdef HAVE_XPETRA_TPETRA // TODO check whether Tpetra is instantiated on all template parameters! 1043 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1044 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1045 typedef Xpetra::TpetraMultiVector<Scalar,LO,GO,Node> TpetraMultiVector;
1046 typedef MultiVecTraits<Scalar, Tpetra::MultiVector<Scalar,LO,GO,Node> > MultiVecTraitsTpetra;
1050 #ifdef HAVE_XPETRA_EPETRA 1051 typedef Xpetra::EpetraMultiVectorT<GO,Node> EpetraMultiVector;
1052 typedef MultiVecTraits <Scalar, Epetra_MultiVector> MultiVecTraitsEpetra;
1057 #ifdef HAVE_BELOS_XPETRA_TIMERS 1058 static RCP<Teuchos::Time> mvTimesMatAddMvTimer_, mvTransMvTimer_;
1061 static RCP<Xpetra::MultiVector<Scalar,LO,GO,Node> > Clone(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv,
const int numvecs )
1064 #ifdef HAVE_XPETRA_TPETRA 1065 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1066 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1067 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1068 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::Clone(toTpetra(mv), numvecs)));
1073 #ifdef HAVE_XPETRA_EPETRA 1074 if (mv.getMap()->lib() == Xpetra::UseEpetra)
1075 return rcp(
new EpetraMultiVector(MultiVecTraitsEpetra::Clone(toEpetra(mv), numvecs)));
1081 static RCP<Xpetra::MultiVector<Scalar,LO,GO,Node> > CloneCopy(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv )
1084 #ifdef HAVE_XPETRA_TPETRA 1085 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1086 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1087 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1088 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::CloneCopy(toTpetra(mv))));
1093 #ifdef HAVE_XPETRA_EPETRA 1094 if (mv.getMap()->lib() == Xpetra::UseEpetra)
1095 return rcp(
new EpetraMultiVector(MultiVecTraitsEpetra::CloneCopy(toEpetra(mv))));
1101 static RCP<Xpetra::MultiVector<Scalar,LO,GO,Node> > CloneCopy(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv,
const std::vector<int>& index )
1104 #ifdef HAVE_XPETRA_TPETRA 1105 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1106 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1107 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1108 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::CloneCopy(toTpetra(mv), index)));
1113 #ifdef HAVE_XPETRA_EPETRA 1114 if (mv.getMap()->lib() == Xpetra::UseEpetra)
1115 return rcp(
new EpetraMultiVector(MultiVecTraitsEpetra::CloneCopy(toEpetra(mv), index)));
1121 static RCP<Xpetra::MultiVector<Scalar,LO,GO,Node> >
1122 CloneCopy (
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv,
1126 #ifdef HAVE_XPETRA_TPETRA 1127 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1128 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1129 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1130 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::CloneCopy(toTpetra(mv), index)));
1135 #ifdef HAVE_XPETRA_EPETRA 1136 if (mv.getMap()->lib() == Xpetra::UseEpetra)
1137 return rcp(
new EpetraMultiVector(MultiVecTraitsEpetra::CloneCopy(toEpetra(mv), index)));
1143 static RCP<Xpetra::MultiVector<Scalar,LO,GO,Node> > CloneViewNonConst( Xpetra::MultiVector<Scalar,LO,GO,Node>& mv,
const std::vector<int>& index )
1146 #ifdef HAVE_XPETRA_TPETRA 1147 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1148 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1149 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1150 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::CloneViewNonConst(toTpetra(mv), index)));
1155 #ifdef HAVE_XPETRA_EPETRA 1156 if (mv.getMap()->lib() == Xpetra::UseEpetra)
1157 return rcp(
new EpetraMultiVector(MultiVecTraitsEpetra::CloneViewNonConst(toEpetra(mv), index)));
1163 static RCP<Xpetra::MultiVector<Scalar,LO,GO,Node> >
1164 CloneViewNonConst(Xpetra::MultiVector<Scalar,LO,GO,Node>& mv,
1168 #ifdef HAVE_MUELUA_TPETRA 1169 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1170 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1171 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1172 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::CloneViewNonConst(toTpetra(mv), index)));
1177 #ifdef HAVE_XPETRA_EPETRA 1178 if (mv.getMap()->lib() == Xpetra::UseEpetra)
1179 return rcp(
new EpetraMultiVector(MultiVecTraitsEpetra::CloneViewNonConst(toEpetra(mv), index)));
1185 static RCP<const Xpetra::MultiVector<Scalar,LO,GO,Node> > CloneView(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv,
const std::vector<int>& index )
1188 #ifdef HAVE_XPETRA_TPETRA 1189 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1190 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1191 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1193 RCP<const Tpetra::MultiVector<Scalar,LO,GO,Node> > r = MultiVecTraitsTpetra::CloneView(toTpetra(mv), index);
1194 return rcp(
new TpetraMultiVector(Teuchos::rcp_const_cast<Tpetra::MultiVector<Scalar,LO,GO,Node> >(r)));
1199 #ifdef HAVE_XPETRA_EPETRA 1200 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
1202 RCP<const Epetra_MultiVector > r = MultiVecTraitsEpetra::CloneView(toEpetra(mv), index);
1203 return rcp(
new EpetraMultiVector(Teuchos::rcp_const_cast<Epetra_MultiVector>(r)));
1210 static RCP<const Xpetra::MultiVector<Scalar,LO,GO,Node> >
1211 CloneView (
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv,
1215 #ifdef HAVE_XPETRA_TPETRA 1216 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1217 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1218 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1220 RCP<const Tpetra::MultiVector<Scalar,LO,GO,Node> > r = MultiVecTraitsTpetra::CloneView(toTpetra(mv), index);
1221 return rcp(
new TpetraMultiVector(Teuchos::rcp_const_cast<Tpetra::MultiVector<Scalar,LO,GO,Node> >(r)));
1226 #ifdef HAVE_XPETRA_EPETRA 1227 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
1229 RCP<const Epetra_MultiVector > r = MultiVecTraitsEpetra::CloneView(toEpetra(mv), index);
1230 return rcp(
new EpetraMultiVector(Teuchos::rcp_const_cast<Epetra_MultiVector>(r)));
1237 static ptrdiff_t GetGlobalLength(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv )
1240 #ifdef HAVE_XPETRA_TPETRA 1241 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1242 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1243 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1244 return MultiVecTraitsTpetra::GetGlobalLength(toTpetra(mv));
1249 #ifdef HAVE_XPETRA_EPETRA 1250 if (mv.getMap()->lib() == Xpetra::UseEpetra)
1251 return MultiVecTraitsEpetra::GetGlobalLength(toEpetra(mv));
1257 static int GetNumberVecs(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv )
1260 #ifdef HAVE_XPETRA_TPETRA 1261 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1262 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1263 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1264 return MultiVecTraitsTpetra::GetNumberVecs(toTpetra(mv));
1269 #ifdef HAVE_XPETRA_EPETRA 1270 if (mv.getMap()->lib() == Xpetra::UseEpetra)
1271 return MultiVecTraitsEpetra::GetNumberVecs(toEpetra(mv));
1277 static bool HasConstantStride(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv )
1280 #ifdef HAVE_XPETRA_TPETRA 1281 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1282 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1283 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1284 return MultiVecTraitsTpetra::HasConstantStride(toTpetra(mv));
1289 #ifdef HAVE_XPETRA_EPETRA 1290 if (mv.getMap()->lib() == Xpetra::UseEpetra)
1291 return MultiVecTraitsEpetra::HasConstantStride(toEpetra(mv));
1297 static void MvTimesMatAddMv( Scalar alpha,
const Xpetra::MultiVector<Scalar,LO,GO,Node>& A,
1299 Scalar beta, Xpetra::MultiVector<Scalar,LO,GO,Node>& mv )
1302 #ifdef HAVE_BELOS_XPETRA_TIMERS 1306 #ifdef HAVE_XPETRA_TPETRA 1307 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1308 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1309 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1310 MultiVecTraitsTpetra::MvTimesMatAddMv(alpha, toTpetra(A), B, beta, toTpetra(mv));
1316 #ifdef HAVE_XPETRA_EPETRA 1317 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
1318 MultiVecTraitsEpetra::MvTimesMatAddMv(alpha, toEpetra(A), B, beta, toEpetra(mv));
1326 static void MvAddMv( Scalar alpha,
const Xpetra::MultiVector<Scalar,LO,GO,Node>& A, Scalar beta,
const Xpetra::MultiVector<Scalar,LO,GO,Node>& B, Xpetra::MultiVector<Scalar,LO,GO,Node>& mv )
1329 #ifdef HAVE_XPETRA_TPETRA 1330 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1331 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1332 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1333 MultiVecTraitsTpetra::MvAddMv(alpha, toTpetra(A), beta, toTpetra(B), toTpetra(mv));
1339 #ifdef HAVE_XPETRA_EPETRA 1340 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
1341 MultiVecTraitsEpetra::MvAddMv(alpha, toEpetra(A), beta, toEpetra(B), toEpetra(mv));
1349 static void MvScale ( Xpetra::MultiVector<Scalar,LO,GO,Node>& mv, Scalar alpha )
1352 #ifdef HAVE_XPETRA_TPETRA 1353 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1354 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1355 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1356 MultiVecTraitsTpetra::MvScale(toTpetra(mv), alpha);
1362 #ifdef HAVE_XPETRA_EPETRA 1363 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
1364 MultiVecTraitsEpetra::MvScale(toEpetra(mv), alpha);
1372 static void MvScale ( Xpetra::MultiVector<Scalar,LO,GO,Node>& mv,
const std::vector<Scalar>& alphas )
1375 #ifdef HAVE_XPETRA_TPETRA 1376 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1377 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1378 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1379 MultiVecTraitsTpetra::MvScale(toTpetra(mv), alphas);
1385 #ifdef HAVE_XPETRA_EPETRA 1386 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
1387 MultiVecTraitsEpetra::MvScale(toEpetra(mv), alphas);
1395 static void MvTransMv( Scalar alpha,
const Xpetra::MultiVector<Scalar,LO,GO,Node>& A,
const Xpetra::MultiVector<Scalar,LO,GO,Node>& B,
Teuchos::SerialDenseMatrix<int,Scalar>& C)
1398 #ifdef HAVE_BELOS_XPETRA_TIMERS 1402 #ifdef HAVE_XPETRA_TPETRA 1403 if (A.getMap()->lib() == Xpetra::UseTpetra) {
1404 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1405 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1406 MultiVecTraitsTpetra::MvTransMv(alpha, toTpetra(A), toTpetra(B), C);
1412 #ifdef HAVE_XPETRA_EPETRA 1413 if (A.getMap()->lib() == Xpetra::UseEpetra) {
1414 MultiVecTraitsEpetra::MvTransMv(alpha, toEpetra(A), toEpetra(B), C);
1422 static void MvDot(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& A,
const Xpetra::MultiVector<Scalar,LO,GO,Node>& B, std::vector<Scalar> &dots)
1425 #ifdef HAVE_XPETRA_TPETRA 1426 if (A.getMap()->lib() == Xpetra::UseTpetra) {
1427 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1428 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1429 MultiVecTraitsTpetra::MvDot(toTpetra(A), toTpetra(B), dots);
1435 #ifdef HAVE_XPETRA_EPETRA 1436 if (A.getMap()->lib() == Xpetra::UseEpetra) {
1437 MultiVecTraitsEpetra::MvDot(toEpetra(A), toEpetra(B), dots);
1448 #ifdef HAVE_XPETRA_TPETRA 1449 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1450 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1451 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1452 MultiVecTraitsTpetra::MvNorm(toTpetra(mv), normvec, type);
1458 #ifdef HAVE_XPETRA_EPETRA 1459 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
1460 MultiVecTraitsEpetra::MvNorm(toEpetra(mv), normvec, type);
1468 static void SetBlock(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& A,
const std::vector<int>& index, Xpetra::MultiVector<Scalar,LO,GO,Node>& mv )
1471 #ifdef HAVE_XPETRA_TPETRA 1472 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1473 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1474 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1475 MultiVecTraitsTpetra::SetBlock(toTpetra(A), index, toTpetra(mv));
1481 #ifdef HAVE_XPETRA_EPETRA 1482 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
1483 MultiVecTraitsEpetra::SetBlock(toEpetra(A), index, toEpetra(mv));
1492 SetBlock (
const Xpetra::MultiVector<Scalar,LO,GO,Node>& A,
1494 Xpetra::MultiVector<Scalar,LO,GO,Node>& mv)
1497 #ifdef HAVE_XPETRA_TPETRA 1498 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1499 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1500 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1501 MultiVecTraitsTpetra::SetBlock(toTpetra(A), index, toTpetra(mv));
1507 #ifdef HAVE_XPETRA_EPETRA 1508 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
1509 MultiVecTraitsEpetra::SetBlock(toEpetra(A), index, toEpetra(mv));
1518 Assign (
const Xpetra::MultiVector<Scalar,LO,GO,Node>& A,
1519 Xpetra::MultiVector<Scalar,LO,GO,Node>& mv)
1522 #ifdef HAVE_XPETRA_TPETRA 1523 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1524 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1525 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1526 MultiVecTraitsTpetra::Assign(toTpetra(A), toTpetra(mv));
1532 #ifdef HAVE_XPETRA_EPETRA 1533 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
1534 MultiVecTraitsEpetra::Assign(toEpetra(A), toEpetra(mv));
1542 static void MvRandom( Xpetra::MultiVector<Scalar,LO,GO,Node>& mv )
1545 #ifdef HAVE_XPETRA_TPETRA 1546 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1547 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1548 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1549 MultiVecTraitsTpetra::MvRandom(toTpetra(mv));
1555 #ifdef HAVE_XPETRA_EPETRA 1556 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
1557 MultiVecTraitsEpetra::MvRandom(toEpetra(mv));
1568 #ifdef HAVE_XPETRA_TPETRA 1569 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1570 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1571 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1572 MultiVecTraitsTpetra::MvInit(toTpetra(mv), alpha);
1578 #ifdef HAVE_XPETRA_EPETRA 1579 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
1580 MultiVecTraitsEpetra::MvInit(toEpetra(mv), alpha);
1588 static void MvPrint(
const Xpetra::MultiVector<Scalar,LO,GO,Node>& mv, std::ostream& os )
1591 #ifdef HAVE_XPETRA_TPETRA 1592 if (mv.getMap()->lib() == Xpetra::UseTpetra) {
1593 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \ 1594 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG)))) 1595 MultiVecTraitsTpetra::MvPrint(toTpetra(mv), os);
1601 #ifdef HAVE_XPETRA_EPETRA 1602 if (mv.getMap()->lib() == Xpetra::UseEpetra) {
1603 MultiVecTraitsEpetra::MvPrint(toEpetra(mv), os);
1611 #endif // #ifndef EPETRA_NO_64BIT_GLOBAL_INDICES 1612 #endif // HAVE_XPETRA_EPETRA static bool HasConstantStride(const Xpetra::MultiVector< Scalar, LO, GO, Node > &mv)
static RCP< Xpetra::MultiVector< Scalar, LO, GO, Node > > CloneCopy(const Xpetra::MultiVector< Scalar, LO, GO, Node > &mv)
static RCP< Xpetra::MultiVector< Scalar, LO, GO, Node > > CloneViewNonConst(Xpetra::MultiVector< Scalar, LO, GO, Node > &mv, const std::vector< int > &index)
static void MvInit(Xpetra::MultiVector< Scalar, LO, GO, Node > &mv, Scalar alpha=Teuchos::ScalarTraits< Scalar >::zero())
static void MvTransMv(Scalar alpha, const Xpetra::MultiVector< Scalar, LO, GO, Node > &A, const Xpetra::MultiVector< Scalar, LO, GO, Node > &B, Teuchos::SerialDenseMatrix< int, Scalar > &C)
static RCP< const Xpetra::MultiVector< Scalar, LO, GO, Node > > CloneView(const Xpetra::MultiVector< Scalar, LO, GO, Node > &mv, const Teuchos::Range1D &index)
static void MvPrint(const Xpetra::MultiVector< Scalar, LO, GO, Node > &mv, std::ostream &os)
static RCP< Xpetra::MultiVector< Scalar, LO, GO, Node > > CloneCopy(const Xpetra::MultiVector< Scalar, LO, GO, Node > &mv, const std::vector< int > &index)
static void SetBlock(const Xpetra::MultiVector< Scalar, LO, GO, Node > &A, const std::vector< int > &index, Xpetra::MultiVector< Scalar, LO, GO, Node > &mv)
static void MvRandom(Xpetra::MultiVector< Scalar, LO, GO, Node > &mv)
static RCP< Xpetra::MultiVector< Scalar, LO, GO, Node > > CloneViewNonConst(Xpetra::MultiVector< Scalar, LO, GO, Node > &mv, const Teuchos::Range1D &index)
static void MvScale(Xpetra::MultiVector< Scalar, LO, GO, Node > &mv, Scalar alpha)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
static void MvDot(const Xpetra::MultiVector< Scalar, LO, GO, Node > &A, const Xpetra::MultiVector< Scalar, LO, GO, Node > &B, std::vector< Scalar > &dots)
static int GetNumberVecs(const Xpetra::MultiVector< Scalar, LO, GO, Node > &mv)
static void SetBlock(const Xpetra::MultiVector< Scalar, LO, GO, Node > &A, const Teuchos::Range1D &index, Xpetra::MultiVector< Scalar, LO, GO, Node > &mv)
static void MvScale(Xpetra::MultiVector< Scalar, LO, GO, Node > &mv, const std::vector< Scalar > &alphas)
static ptrdiff_t GetGlobalLength(const Xpetra::MultiVector< Scalar, LO, GO, Node > &mv)
static RCP< const Xpetra::MultiVector< Scalar, LO, GO, Node > > CloneView(const Xpetra::MultiVector< Scalar, LO, GO, Node > &mv, const std::vector< int > &index)
static RCP< Xpetra::MultiVector< Scalar, LO, GO, Node > > Clone(const Xpetra::MultiVector< Scalar, LO, GO, Node > &mv, const int numvecs)
static void MvAddMv(Scalar alpha, const Xpetra::MultiVector< Scalar, LO, GO, Node > &A, Scalar beta, const Xpetra::MultiVector< Scalar, LO, GO, Node > &B, Xpetra::MultiVector< Scalar, LO, GO, Node > &mv)
Kokkos::Compat::KokkosSerialWrapperNode EpetraNode
static void MvTimesMatAddMv(Scalar alpha, const Xpetra::MultiVector< Scalar, LO, GO, Node > &A, const Teuchos::SerialDenseMatrix< int, Scalar > &B, Scalar beta, Xpetra::MultiVector< Scalar, LO, GO, Node > &mv)
static void MvNorm(const Xpetra::MultiVector< Scalar, LO, GO, Node > &mv, std::vector< typename Teuchos::ScalarTraits< Scalar >::magnitudeType > &normvec, NormType type=TwoNorm)
static RCP< Xpetra::MultiVector< Scalar, LO, GO, Node > > CloneCopy(const Xpetra::MultiVector< Scalar, LO, GO, Node > &mv, const Teuchos::Range1D &index)
static void Assign(const Xpetra::MultiVector< Scalar, LO, GO, Node > &A, Xpetra::MultiVector< Scalar, LO, GO, Node > &mv)