46 #ifndef BELOS_XPETRA_ADAPTER_MULTIVECTOR_HPP 47 #define BELOS_XPETRA_ADAPTER_MULTIVECTOR_HPP 53 #ifdef HAVE_XPETRA_EPETRA 57 #ifdef HAVE_XPETRA_TPETRA 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 95 typedef MultiVecTraits<Scalar,Tpetra::MultiVector<Scalar,LO,GO,Node> > MultiVecTraitsTpetra;
100 #ifdef HAVE_BELOS_XPETRA_TIMERS 107 #ifdef HAVE_XPETRA_TPETRA 109 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::Clone(
toTpetra(mv), numvecs)));
119 #ifdef HAVE_XPETRA_TPETRA 121 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::CloneCopy(
toTpetra(mv))));
131 #ifdef HAVE_XPETRA_TPETRA 133 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::CloneCopy(
toTpetra(mv), index)));
145 #ifdef HAVE_XPETRA_TPETRA 147 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::CloneCopy(
toTpetra(mv), index)));
157 #ifdef HAVE_XPETRA_TPETRA 159 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::CloneViewNonConst(
toTpetra(mv), index)));
171 #ifdef HAVE_XPETRA_TPETRA 173 return rcp(
new TpetraMultiVector(MultiVecTraitsTpetra::CloneViewNonConst(
toTpetra(mv), index)));
183 #ifdef HAVE_XPETRA_TPETRA 187 return rcp(
new TpetraMultiVector(Teuchos::rcp_const_cast<Tpetra::MultiVector<Scalar,LO,GO,Node> >(r)));
200 #ifdef HAVE_XPETRA_TPETRA 204 return rcp(
new TpetraMultiVector(Teuchos::rcp_const_cast<Tpetra::MultiVector<Scalar,LO,GO,Node> >(r)));
215 #ifdef HAVE_XPETRA_TPETRA 217 return MultiVecTraitsTpetra::GetGlobalLength(
toTpetra(mv));
227 #ifdef HAVE_XPETRA_TPETRA 229 return MultiVecTraitsTpetra::GetNumberVecs(
toTpetra(mv));
239 #ifdef HAVE_XPETRA_TPETRA 241 return MultiVecTraitsTpetra::HasConstantStride(
toTpetra(mv));
253 #ifdef HAVE_BELOS_XPETRA_TIMERS 258 #ifdef HAVE_XPETRA_TPETRA 260 MultiVecTraitsTpetra::MvTimesMatAddMv(alpha,
toTpetra(A), B, beta,
toTpetra(mv));
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 287 #ifdef HAVE_XPETRA_TPETRA 289 MultiVecTraitsTpetra::MvScale(
toTpetra(mv), alpha);
301 #ifdef HAVE_XPETRA_TPETRA 303 MultiVecTraitsTpetra::MvScale(
toTpetra(mv), alphas);
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 333 #ifdef HAVE_XPETRA_TPETRA 347 #ifdef HAVE_XPETRA_TPETRA 349 MultiVecTraitsTpetra::MvNorm(
toTpetra(mv), normvec, type);
361 #ifdef HAVE_XPETRA_TPETRA 378 #ifdef HAVE_XPETRA_TPETRA 394 #ifdef HAVE_XPETRA_TPETRA 408 #ifdef HAVE_XPETRA_TPETRA 410 MultiVecTraitsTpetra::MvRandom(
toTpetra(mv));
422 #ifdef HAVE_XPETRA_TPETRA 424 MultiVecTraitsTpetra::MvInit(
toTpetra(mv), alpha);
436 #ifdef HAVE_XPETRA_TPETRA 438 MultiVecTraitsTpetra::MvPrint(
toTpetra(mv), os);
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)))) 463 typedef MultiVecTraits<Scalar, Tpetra::MultiVector<Scalar,LO,GO,Node> > MultiVecTraitsTpetra;
467 #ifdef HAVE_XPETRA_EPETRA 469 typedef MultiVecTraits <Scalar, Epetra_MultiVector> MultiVecTraitsEpetra;
474 #ifdef HAVE_BELOS_XPETRA_TIMERS 475 static RCP<Teuchos::Time> mvTimesMatAddMvTimer_, mvTransMvTimer_;
481 #ifdef HAVE_XPETRA_TPETRA 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 501 #ifdef HAVE_XPETRA_TPETRA 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 521 #ifdef HAVE_XPETRA_TPETRA 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 538 static RCP<Xpetra::MultiVector<Scalar,LO,GO,Node> >
543 #ifdef HAVE_XPETRA_TPETRA 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 563 #ifdef HAVE_XPETRA_TPETRA 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 580 static RCP<Xpetra::MultiVector<Scalar,LO,GO,Node> >
585 #ifdef HAVE_MUELUA_TPETRA 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 605 #ifdef HAVE_XPETRA_TPETRA 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 619 RCP<const Epetra_MultiVector > r = MultiVecTraitsEpetra::CloneView(
toEpetra(mv), index);
627 static RCP<const Xpetra::MultiVector<Scalar,LO,GO,Node> >
632 #ifdef HAVE_XPETRA_TPETRA 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 646 RCP<const Epetra_MultiVector > r = MultiVecTraitsEpetra::CloneView(
toEpetra(mv), index);
657 #ifdef HAVE_XPETRA_TPETRA 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 668 return MultiVecTraitsEpetra::GetGlobalLength(
toEpetra(mv));
677 #ifdef HAVE_XPETRA_TPETRA 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 688 return MultiVecTraitsEpetra::GetNumberVecs(
toEpetra(mv));
697 #ifdef HAVE_XPETRA_TPETRA 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 708 return MultiVecTraitsEpetra::HasConstantStride(
toEpetra(mv));
719 #ifdef HAVE_BELOS_XPETRA_TIMERS 723 #ifdef HAVE_XPETRA_TPETRA 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 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 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)))) 756 #ifdef HAVE_XPETRA_EPETRA 769 #ifdef HAVE_XPETRA_TPETRA 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 781 MultiVecTraitsEpetra::MvScale(
toEpetra(mv), alpha);
792 #ifdef HAVE_XPETRA_TPETRA 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 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 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)))) 829 #ifdef HAVE_XPETRA_EPETRA 842 #ifdef HAVE_XPETRA_TPETRA 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)))) 852 #ifdef HAVE_XPETRA_EPETRA 865 #ifdef HAVE_XPETRA_TPETRA 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 877 MultiVecTraitsEpetra::MvNorm(
toEpetra(mv), normvec, type);
888 #ifdef HAVE_XPETRA_TPETRA 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)))) 898 #ifdef HAVE_XPETRA_EPETRA 914 #ifdef HAVE_XPETRA_TPETRA 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)))) 924 #ifdef HAVE_XPETRA_EPETRA 939 #ifdef HAVE_XPETRA_TPETRA 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)))) 949 #ifdef HAVE_XPETRA_EPETRA 962 #ifdef HAVE_XPETRA_TPETRA 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 974 MultiVecTraitsEpetra::MvRandom(
toEpetra(mv));
985 #ifdef HAVE_XPETRA_TPETRA 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 997 MultiVecTraitsEpetra::MvInit(
toEpetra(mv), alpha);
1008 #ifdef HAVE_XPETRA_TPETRA 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 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)))) 1046 typedef MultiVecTraits<Scalar, Tpetra::MultiVector<Scalar,LO,GO,Node> > MultiVecTraitsTpetra;
1050 #ifdef HAVE_XPETRA_EPETRA 1052 typedef MultiVecTraits <Scalar, Epetra_MultiVector> MultiVecTraitsEpetra;
1057 #ifdef HAVE_BELOS_XPETRA_TIMERS 1058 static RCP<Teuchos::Time> mvTimesMatAddMvTimer_, mvTransMvTimer_;
1064 #ifdef HAVE_XPETRA_TPETRA 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 1084 #ifdef HAVE_XPETRA_TPETRA 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 1104 #ifdef HAVE_XPETRA_TPETRA 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 1121 static RCP<Xpetra::MultiVector<Scalar,LO,GO,Node> >
1126 #ifdef HAVE_XPETRA_TPETRA 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 1146 #ifdef HAVE_XPETRA_TPETRA 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 1163 static RCP<Xpetra::MultiVector<Scalar,LO,GO,Node> >
1168 #ifdef HAVE_MUELUA_TPETRA 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 1188 #ifdef HAVE_XPETRA_TPETRA 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 1202 RCP<const Epetra_MultiVector > r = MultiVecTraitsEpetra::CloneView(
toEpetra(mv), index);
1210 static RCP<const Xpetra::MultiVector<Scalar,LO,GO,Node> >
1215 #ifdef HAVE_XPETRA_TPETRA 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 1229 RCP<const Epetra_MultiVector > r = MultiVecTraitsEpetra::CloneView(
toEpetra(mv), index);
1240 #ifdef HAVE_XPETRA_TPETRA 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 1251 return MultiVecTraitsEpetra::GetGlobalLength(
toEpetra(mv));
1260 #ifdef HAVE_XPETRA_TPETRA 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 1271 return MultiVecTraitsEpetra::GetNumberVecs(
toEpetra(mv));
1280 #ifdef HAVE_XPETRA_TPETRA 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 1291 return MultiVecTraitsEpetra::HasConstantStride(
toEpetra(mv));
1302 #ifdef HAVE_BELOS_XPETRA_TIMERS 1306 #ifdef HAVE_XPETRA_TPETRA 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 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 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)))) 1339 #ifdef HAVE_XPETRA_EPETRA 1352 #ifdef HAVE_XPETRA_TPETRA 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 1364 MultiVecTraitsEpetra::MvScale(
toEpetra(mv), alpha);
1375 #ifdef HAVE_XPETRA_TPETRA 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 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 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)))) 1412 #ifdef HAVE_XPETRA_EPETRA 1425 #ifdef HAVE_XPETRA_TPETRA 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)))) 1435 #ifdef HAVE_XPETRA_EPETRA 1448 #ifdef HAVE_XPETRA_TPETRA 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 1460 MultiVecTraitsEpetra::MvNorm(
toEpetra(mv), normvec, type);
1471 #ifdef HAVE_XPETRA_TPETRA 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)))) 1481 #ifdef HAVE_XPETRA_EPETRA 1497 #ifdef HAVE_XPETRA_TPETRA 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)))) 1507 #ifdef HAVE_XPETRA_EPETRA 1522 #ifdef HAVE_XPETRA_TPETRA 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)))) 1532 #ifdef HAVE_XPETRA_EPETRA 1545 #ifdef HAVE_XPETRA_TPETRA 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 1557 MultiVecTraitsEpetra::MvRandom(
toEpetra(mv));
1568 #ifdef HAVE_XPETRA_TPETRA 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 1580 MultiVecTraitsEpetra::MvInit(
toEpetra(mv), alpha);
1591 #ifdef HAVE_XPETRA_TPETRA 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 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)
EpetraMultiVectorT< int, typename Xpetra::Map< int, int >::node_type > EpetraMultiVector
const Epetra_CrsGraph & toEpetra(const RCP< const CrsGraph< int, GlobalOrdinal, Node > > &graph)
#define XPETRA_FACTORY_ERROR_IF_EPETRA(lib)
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)
virtual Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getMap() const =0
static int GetNumberVecs(const Xpetra::MultiVector< Scalar, LO, GO, Node > &mv)
#define XPETRA_FACTORY_END
static void SetBlock(const Xpetra::MultiVector< Scalar, LO, GO, Node > &A, const Teuchos::Range1D &index, Xpetra::MultiVector< Scalar, LO, GO, Node > &mv)
RCP< const Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > toTpetra(const RCP< const CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > &graph)
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)
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)