33 #ifndef ANASAZI_EPETRA_ADAPTER_HPP 34 #define ANASAZI_EPETRA_ADAPTER_HPP 37 #include "Anasaziepetra_DLLExportMacro.h" 42 #include "Teuchos_Assert.hpp" 43 #include "Teuchos_SerialDenseMatrix.hpp" 44 #include "Epetra_MultiVector.h" 45 #include "Epetra_Vector.h" 46 #include "Epetra_Operator.h" 47 #include "Epetra_Map.h" 48 #include "Epetra_LocalMap.h" 50 #if defined(HAVE_ANASAZI_TPETRA) && defined(HAVE_ANASAZI_TSQR) 51 # include <Tpetra_ConfigDefs.hpp> 52 # if defined(HAVE_TPETRA_EPETRA) 53 # include <Epetra_TsqrAdaptor.hpp> 54 # endif // defined(HAVE_TPETRA_EPETRA) 55 #endif // defined(HAVE_ANASAZI_TPETRA) && defined(HAVE_ANASAZI_TSQR) 136 EpetraMultiVec(
const Epetra_BlockMap& Map_in,
double * array,
const int numvecs,
const int stride=0);
145 EpetraMultiVec(Epetra_DataAccess CV,
const Epetra_MultiVector& P_vec,
const std::vector<int>& index);
200 if ( Map().GlobalIndicesLongLong() )
201 return static_cast<ptrdiff_t
>( GlobalLength64() );
203 return static_cast<ptrdiff_t
>( GlobalLength() );
217 const Teuchos::SerialDenseMatrix<int,double>& B,
227 void MvTransMv (
double alpha,
const MultiVec<double>& A, Teuchos::SerialDenseMatrix<int,double>& B
228 #ifdef HAVE_ANASAZI_EXPERIMENTAL
236 #ifdef HAVE_ANASAZI_EXPERIMENTAL
245 "Anasazi::EpetraMultiVec::MvScale call to Epetra_MultiVector::Scale() returned a nonzero value.");
250 void MvScale (
const std::vector<double>& alpha );
259 void MvNorm ( std::vector<double> & normvec )
const {
260 if (((
int)normvec.size() >= GetNumberVecs()) ) {
262 "Anasazi::EpetraMultiVec::MvNorm call to Epetra_MultiVector::Norm2() returned a nonzero value.");
280 "Anasazi::EpetraMultiVec::MvRandom call to Epetra_MultiVector::Random() returned a nonzero value.");
287 "Anasazi::EpetraMultiVec::MvInit call to Epetra_MultiVector::PutScalar() returned a nonzero value.");
306 void MvPrint( std::ostream& os )
const { os << *
this << std::endl; };
331 EpetraOp(
const Teuchos::RCP<Epetra_Operator> &Op );
350 #pragma warning(push) 351 #pragma warning(disable:4251) 353 Teuchos::RCP<Epetra_Operator> Epetra_Op;
379 class ANASAZIEPETRA_LIB_DLL_EXPORT
EpetraGenOp :
public virtual Operator<double>,
public virtual Epetra_Operator {
385 EpetraGenOp(
const Teuchos::RCP<Epetra_Operator> &AOp,
386 const Teuchos::RCP<Epetra_Operator> &MOp,
387 bool isAInverse =
true );
400 int Apply(
const Epetra_MultiVector &X, Epetra_MultiVector &Y)
const;
405 int ApplyInverse(
const Epetra_MultiVector &X, Epetra_MultiVector &Y)
const;
408 const char*
Label()
const {
return "Epetra_Operator applying A^{-1}M"; };
423 const Epetra_Comm&
Comm()
const {
return Epetra_AOp->Comm(); };
437 #pragma warning(push) 438 #pragma warning(disable:4251) 440 Teuchos::RCP<Epetra_Operator> Epetra_AOp;
441 Teuchos::RCP<Epetra_Operator> Epetra_MOp;
465 class ANASAZIEPETRA_LIB_DLL_EXPORT
EpetraSymOp :
public virtual Operator<double>,
public virtual Epetra_Operator {
470 EpetraSymOp(
const Teuchos::RCP<Epetra_Operator> &Op,
bool isTrans =
false );
483 int Apply(
const Epetra_MultiVector &X, Epetra_MultiVector &Y)
const;
489 int ApplyInverse(
const Epetra_MultiVector &X, Epetra_MultiVector &Y)
const;
492 const char*
Label()
const {
return "Epetra_Operator applying A^TA or AA^T"; };
507 const Epetra_Comm&
Comm()
const {
return Epetra_Op->Comm(); };
519 #pragma warning(push) 520 #pragma warning(disable:4251) 522 Teuchos::RCP<Epetra_Operator> Epetra_Op;
554 EpetraSymMVOp(
const Teuchos::RCP<const Epetra_MultiVector> &MV,
555 bool isTrans =
false );
570 #pragma warning(push) 571 #pragma warning(disable:4251) 573 Teuchos::RCP<const Epetra_MultiVector> Epetra_MV;
574 Teuchos::RCP<const Epetra_Map> MV_localmap;
575 Teuchos::RCP<const Epetra_BlockMap> MV_blockmap;
605 const Teuchos::RCP<Epetra_Operator> &OP );
619 #pragma warning(push) 620 #pragma warning(disable:4251) 622 Teuchos::RCP<const Epetra_MultiVector> Epetra_MV;
623 Teuchos::RCP<Epetra_Operator> Epetra_OP;
624 Teuchos::RCP<Epetra_MultiVector> Epetra_WMV;
625 Teuchos::RCP<const Epetra_Map> MV_localmap;
626 Teuchos::RCP<const Epetra_BlockMap> MV_blockmap;
654 const Teuchos::RCP<Epetra_Operator> &OP );
668 #pragma warning(push) 669 #pragma warning(disable:4251) 671 Teuchos::RCP<const Epetra_MultiVector> Epetra_MV;
672 Teuchos::RCP<Epetra_Operator> Epetra_OP;
673 Teuchos::RCP<Epetra_MultiVector> Epetra_WMV;
674 Teuchos::RCP<const Epetra_Map> MV_localmap;
675 Teuchos::RCP<const Epetra_BlockMap> MV_blockmap;
710 static Teuchos::RCP<Epetra_MultiVector>
711 Clone (
const Epetra_MultiVector& mv,
const int outNumVecs)
713 TEUCHOS_TEST_FOR_EXCEPTION(outNumVecs <= 0, std::invalid_argument,
714 "Belos::MultiVecTraits<double, Epetra_MultiVector>::" 715 "Clone(mv, outNumVecs = " << outNumVecs <<
"): " 716 "outNumVecs must be positive.");
721 return Teuchos::rcp (
new Epetra_MultiVector (mv.Map(), outNumVecs));
728 static Teuchos::RCP<Epetra_MultiVector>
731 return Teuchos::rcp (
new Epetra_MultiVector (mv));
739 static Teuchos::RCP<Epetra_MultiVector>
740 CloneCopy (
const Epetra_MultiVector& mv,
const std::vector<int>& index)
743 const int outNumVecs = index.size();
746 TEUCHOS_TEST_FOR_EXCEPTION(outNumVecs == 0, std::invalid_argument,
747 "Anasazi::MultiVecTraits<double,Epetra_MultiVector>::" 748 "CloneCopy(mv, index = {}): At least one vector must be" 750 if (outNumVecs > inNumVecs)
752 std::ostringstream os;
753 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::" 754 "CloneCopy(mv, index = {";
755 for (
int k = 0; k < outNumVecs - 1; ++k)
756 os << index[k] <<
", ";
757 os << index[outNumVecs-1] <<
"}): There are " << outNumVecs
758 <<
" indices to copy, but only " << inNumVecs <<
" columns of mv.";
759 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
766 const int minIndex = *std::min_element (index.begin(), index.end());
767 const int maxIndex = *std::max_element (index.begin(), index.end());
771 std::ostringstream os;
772 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::" 773 "CloneCopy(mv, index = {";
774 for (
int k = 0; k < outNumVecs - 1; ++k)
775 os << index[k] <<
", ";
776 os << index[outNumVecs-1] <<
"}): Indices must be nonnegative, but " 777 "the smallest index " << minIndex <<
" is negative.";
778 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
780 if (maxIndex >= inNumVecs)
782 std::ostringstream os;
783 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::" 784 "CloneCopy(mv, index = {";
785 for (
int k = 0; k < outNumVecs - 1; ++k)
786 os << index[k] <<
", ";
787 os << index[outNumVecs-1] <<
"}): Indices must be strictly less than " 788 "the number of vectors " << inNumVecs <<
" in mv; the largest index " 789 << maxIndex <<
" is out of bounds.";
790 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
792 #endif // TEUCHOS_DEBUG 796 std::vector<int>& tmpind =
const_cast< std::vector<int>&
> (index);
797 return Teuchos::rcp (
new Epetra_MultiVector (Epetra_DataAccess::Copy, mv, &tmpind[0], index.size()));
800 static Teuchos::RCP<Epetra_MultiVector>
801 CloneCopy (
const Epetra_MultiVector& mv,
const Teuchos::Range1D& index)
804 const int outNumVecs = index.size();
805 const bool validRange = outNumVecs > 0 && index.lbound() >= 0 &&
806 index.ubound() < inNumVecs;
809 std::ostringstream os;
810 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::Clone(mv," 811 "index=[" << index.lbound() <<
", " << index.ubound() <<
"]): ";
812 TEUCHOS_TEST_FOR_EXCEPTION(outNumVecs == 0, std::invalid_argument,
813 os.str() <<
"Column index range must be nonempty.");
814 TEUCHOS_TEST_FOR_EXCEPTION(index.lbound() < 0, std::invalid_argument,
815 os.str() <<
"Column index range must be nonnegative.");
816 TEUCHOS_TEST_FOR_EXCEPTION(index.ubound() >= inNumVecs, std::invalid_argument,
817 os.str() <<
"Column index range must not exceed " 818 "number of vectors " << inNumVecs <<
" in the " 819 "input multivector.");
821 return Teuchos::rcp (
new Epetra_MultiVector (Epetra_DataAccess::Copy, mv, index.lbound(), index.size()));
829 static Teuchos::RCP<Epetra_MultiVector>
833 const int outNumVecs = index.size();
836 TEUCHOS_TEST_FOR_EXCEPTION(outNumVecs == 0, std::invalid_argument,
837 "Anasazi::MultiVecTraits<double,Epetra_MultiVector>::" 838 "CloneViewNonConst(mv, index = {}): The output view " 839 "must have at least one column.");
840 if (outNumVecs > inNumVecs)
842 std::ostringstream os;
843 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::" 844 "CloneViewNonConst(mv, index = {";
845 for (
int k = 0; k < outNumVecs - 1; ++k)
846 os << index[k] <<
", ";
847 os << index[outNumVecs-1] <<
"}): There are " << outNumVecs
848 <<
" indices to view, but only " << inNumVecs <<
" columns of mv.";
849 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
856 const int minIndex = *std::min_element (index.begin(), index.end());
857 const int maxIndex = *std::max_element (index.begin(), index.end());
861 std::ostringstream os;
862 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::" 863 "CloneViewNonConst(mv, index = {";
864 for (
int k = 0; k < outNumVecs - 1; ++k)
865 os << index[k] <<
", ";
866 os << index[outNumVecs-1] <<
"}): Indices must be nonnegative, but " 867 "the smallest index " << minIndex <<
" is negative.";
868 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
870 if (maxIndex >= inNumVecs)
872 std::ostringstream os;
873 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::" 874 "CloneViewNonConst(mv, index = {";
875 for (
int k = 0; k < outNumVecs - 1; ++k)
876 os << index[k] <<
", ";
877 os << index[outNumVecs-1] <<
"}): Indices must be strictly less than " 878 "the number of vectors " << inNumVecs <<
" in mv; the largest index " 879 << maxIndex <<
" is out of bounds.";
880 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
882 #endif // TEUCHOS_DEBUG 886 std::vector<int>& tmpind =
const_cast< std::vector<int>&
> (index);
887 return Teuchos::rcp (
new Epetra_MultiVector (Epetra_DataAccess::View, mv, &tmpind[0], index.size()));
890 static Teuchos::RCP<Epetra_MultiVector>
893 const bool validRange = index.size() > 0 &&
894 index.lbound() >= 0 &&
895 index.ubound() < mv.NumVectors();
898 std::ostringstream os;
899 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::CloneView" 900 "NonConst(mv,index=[" << index.lbound() <<
", " << index.ubound()
902 TEUCHOS_TEST_FOR_EXCEPTION(index.size() == 0, std::invalid_argument,
903 os.str() <<
"Column index range must be nonempty.");
904 TEUCHOS_TEST_FOR_EXCEPTION(index.lbound() < 0, std::invalid_argument,
905 os.str() <<
"Column index range must be nonnegative.");
906 TEUCHOS_TEST_FOR_EXCEPTION(index.ubound() >= mv.NumVectors(),
907 std::invalid_argument,
908 os.str() <<
"Column index range must not exceed " 909 "number of vectors " << mv.NumVectors() <<
" in " 910 "the input multivector.");
912 return Teuchos::rcp (
new Epetra_MultiVector (Epetra_DataAccess::View, mv, index.lbound(), index.size()));
920 static Teuchos::RCP<const Epetra_MultiVector>
921 CloneView (
const Epetra_MultiVector& mv,
const std::vector<int>& index)
924 const int outNumVecs = index.size();
927 TEUCHOS_TEST_FOR_EXCEPTION(outNumVecs == 0, std::invalid_argument,
928 "Belos::MultiVecTraits<double,Epetra_MultiVector>::" 929 "CloneView(mv, index = {}): The output view " 930 "must have at least one column.");
931 if (outNumVecs > inNumVecs)
933 std::ostringstream os;
934 os <<
"Belos::MultiVecTraits<double,Epetra_MultiVector>::" 935 "CloneView(mv, index = {";
936 for (
int k = 0; k < outNumVecs - 1; ++k)
937 os << index[k] <<
", ";
938 os << index[outNumVecs-1] <<
"}): There are " << outNumVecs
939 <<
" indices to view, but only " << inNumVecs <<
" columns of mv.";
940 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
947 const int minIndex = *std::min_element (index.begin(), index.end());
948 const int maxIndex = *std::max_element (index.begin(), index.end());
952 std::ostringstream os;
953 os <<
"Belos::MultiVecTraits<double,Epetra_MultiVector>::" 954 "CloneView(mv, index = {";
955 for (
int k = 0; k < outNumVecs - 1; ++k)
956 os << index[k] <<
", ";
957 os << index[outNumVecs-1] <<
"}): Indices must be nonnegative, but " 958 "the smallest index " << minIndex <<
" is negative.";
959 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
961 if (maxIndex >= inNumVecs)
963 std::ostringstream os;
964 os <<
"Belos::MultiVecTraits<double,Epetra_MultiVector>::" 965 "CloneView(mv, index = {";
966 for (
int k = 0; k < outNumVecs - 1; ++k)
967 os << index[k] <<
", ";
968 os << index[outNumVecs-1] <<
"}): Indices must be strictly less than " 969 "the number of vectors " << inNumVecs <<
" in mv; the largest index " 970 << maxIndex <<
" is out of bounds.";
971 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
973 #endif // TEUCHOS_DEBUG 977 std::vector<int>& tmpind =
const_cast< std::vector<int>&
> (index);
978 return Teuchos::rcp (
new Epetra_MultiVector (Epetra_DataAccess::View, mv, &tmpind[0], index.size()));
981 static Teuchos::RCP<Epetra_MultiVector>
982 CloneView (
const Epetra_MultiVector& mv,
const Teuchos::Range1D& index)
984 const bool validRange = index.size() > 0 &&
985 index.lbound() >= 0 &&
986 index.ubound() < mv.NumVectors();
989 std::ostringstream os;
990 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::CloneView" 991 "(mv,index=[" << index.lbound() <<
", " << index.ubound()
993 TEUCHOS_TEST_FOR_EXCEPTION(index.size() == 0, std::invalid_argument,
994 os.str() <<
"Column index range must be nonempty.");
995 TEUCHOS_TEST_FOR_EXCEPTION(index.lbound() < 0, std::invalid_argument,
996 os.str() <<
"Column index range must be nonnegative.");
997 TEUCHOS_TEST_FOR_EXCEPTION(index.ubound() >= mv.NumVectors(),
998 std::invalid_argument,
999 os.str() <<
"Column index range must not exceed " 1000 "number of vectors " << mv.NumVectors() <<
" in " 1001 "the input multivector.");
1003 return Teuchos::rcp (
new Epetra_MultiVector(Epetra_DataAccess::View, mv, index.lbound(), index.size()));
1014 if (mv.Map().GlobalIndicesLongLong())
1015 return static_cast<ptrdiff_t>( mv.GlobalLength64() );
1017 return static_cast<ptrdiff_t
>( mv.GlobalLength() );
1022 {
return mv.NumVectors(); }
1024 static bool HasConstantStride(
const Epetra_MultiVector& mv )
1025 {
return mv.ConstantStride(); }
1034 const Teuchos::SerialDenseMatrix<int,double>& B,
1035 double beta, Epetra_MultiVector& mv )
1037 Epetra_LocalMap LocalMap(B.numRows(), 0, mv.Map().Comm());
1038 Epetra_MultiVector B_Pvec(Epetra_DataAccess::View, LocalMap, B.values(), B.stride(), B.numCols());
1040 TEUCHOS_TEST_FOR_EXCEPTION( mv.Multiply(
'N',
'N', alpha, A, B_Pvec, beta )!=0,
EpetraMultiVecFailure,
1041 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvTimesMatAddMv call to Epetra_MultiVector::Multiply() returned a nonzero value.");
1046 static void MvAddMv(
double alpha,
const Epetra_MultiVector& A,
double beta,
const Epetra_MultiVector& B, Epetra_MultiVector& mv )
1080 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvAddMv call to Epetra_MultiVector::Update(alpha,A,0.0) returned a nonzero value.");
1083 else if (alpha == 0.0) {
1091 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvAddMv call to Epetra_MultiVector::Update(beta,B,0.0) returned a nonzero value.");
1097 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvAddMv call to Epetra_MultiVector::Update(alpha,A,beta,B,0.0) returned a nonzero value.");
1103 static void MvTransMv(
double alpha,
const Epetra_MultiVector& A,
const Epetra_MultiVector& mv, Teuchos::SerialDenseMatrix<int,double>& B
1104 #ifdef HAVE_ANASAZI_EXPERIMENTAL
1109 Epetra_LocalMap LocalMap(B.numRows(), 0, mv.Map().Comm());
1110 Epetra_MultiVector B_Pvec(Epetra_DataAccess::View, LocalMap, B.values(), B.stride(), B.numCols());
1112 TEUCHOS_TEST_FOR_EXCEPTION( B_Pvec.Multiply(
'T',
'N', alpha, A, mv, 0.0 )!=0,
EpetraMultiVecFailure,
1113 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvTransMv call to Epetra_MultiVector::Multiply() returned a nonzero value.");
1118 static void MvDot(
const Epetra_MultiVector& A,
const Epetra_MultiVector& B, std::vector<double> &b
1119 #ifdef HAVE_ANASAZI_EXPERIMENTAL
1124 #ifdef TEUCHOS_DEBUG 1125 TEUCHOS_TEST_FOR_EXCEPTION(A.NumVectors() != B.NumVectors(),std::invalid_argument,
1126 "Anasazi::MultiVecTraits<double,Epetra_MultiVector>::MvDot(A,B,b): A and B must have the same number of vectors.");
1127 TEUCHOS_TEST_FOR_EXCEPTION(b.size() != (
unsigned int)A.NumVectors(),std::invalid_argument,
1128 "Anasazi::MultiVecTraits<double,Epetra_MultiVector>::MvDot(A,B,b): b must have room for all dot products.");
1131 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvDot(A,B,b) call to Epetra_MultiVector::Dot() returned a nonzero value.");
1141 static void MvNorm(
const Epetra_MultiVector& mv, std::vector<double> &normvec )
1143 #ifdef TEUCHOS_DEBUG 1144 TEUCHOS_TEST_FOR_EXCEPTION((
unsigned int)mv.NumVectors() != normvec.size(),std::invalid_argument,
1145 "Anasazi::MultiVecTraits<double,Epetra_MultiVector>::MvNorm(mv,normvec): normvec must be the same size of mv.");
1148 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvNorm call to Epetra_MultiVector::Norm2() returned a nonzero value.");
1159 const std::vector<int>& index,
1160 Epetra_MultiVector& mv)
1163 const int outNumVecs = index.size();
1171 if (inNumVecs != outNumVecs)
1173 std::ostringstream os;
1174 os <<
"Belos::MultiVecTraits<double,Epetra_MultiVector>::" 1175 "SetBlock(A, mv, index = {";
1178 for (
int k = 0; k < outNumVecs - 1; ++k)
1179 os << index[k] <<
", ";
1180 os << index[outNumVecs-1];
1182 os <<
"}): A has only " << inNumVecs <<
" columns, but there are " 1183 << outNumVecs <<
" indices in the index vector.";
1184 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
1192 Teuchos::RCP<const Epetra_MultiVector> A_view;
1193 if (outNumVecs == inNumVecs)
1194 A_view = Teuchos::rcpFromRef (A);
1196 A_view =
CloneView (A, Teuchos::Range1D(0, outNumVecs - 1));
1209 SetBlock (
const Epetra_MultiVector& A,
1210 const Teuchos::Range1D& index,
1211 Epetra_MultiVector& mv)
1213 const int numColsA = A.NumVectors();
1214 const int numColsMv = mv.NumVectors();
1216 const bool validIndex = index.lbound() >= 0 && index.ubound() < numColsMv;
1218 const bool validSource = index.size() <= numColsA;
1220 if (! validIndex || ! validSource)
1222 std::ostringstream os;
1223 os <<
"Anasazi::MultiVecTraits<double, Epetra_MultiVector>::SetBlock" 1224 "(A, index=[" << index.lbound() <<
", " << index.ubound() <<
"], " 1226 TEUCHOS_TEST_FOR_EXCEPTION(index.lbound() < 0, std::invalid_argument,
1227 os.str() <<
"Range lower bound must be nonnegative.");
1228 TEUCHOS_TEST_FOR_EXCEPTION(index.ubound() >= numColsMv, std::invalid_argument,
1229 os.str() <<
"Range upper bound must be less than " 1230 "the number of columns " << numColsA <<
" in the " 1231 "'mv' output argument.");
1232 TEUCHOS_TEST_FOR_EXCEPTION(index.size() > numColsA, std::invalid_argument,
1233 os.str() <<
"Range must have no more elements than" 1234 " the number of columns " << numColsA <<
" in the " 1235 "'A' input argument.");
1236 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Should never get here!");
1243 Teuchos::RCP<Epetra_MultiVector> mv_view;
1244 if (index.lbound() == 0 && index.ubound()+1 == numColsMv)
1245 mv_view = Teuchos::rcpFromRef (mv);
1252 Teuchos::RCP<const Epetra_MultiVector> A_view;
1253 if (index.size() == numColsA)
1254 A_view = Teuchos::rcpFromRef (A);
1256 A_view =
CloneView (A, Teuchos::Range1D(0, index.size()-1));
1269 Assign (
const Epetra_MultiVector& A,
1270 Epetra_MultiVector& mv)
1274 if (numColsA > numColsMv)
1276 std::ostringstream os;
1277 os <<
"Anasazi::MultiVecTraits<double, Epetra_MultiVector>::Assign" 1279 TEUCHOS_TEST_FOR_EXCEPTION(numColsA > numColsMv, std::invalid_argument,
1280 os.str() <<
"Input multivector 'A' has " 1281 << numColsA <<
" columns, but output multivector " 1282 "'mv' has only " << numColsMv <<
" columns.");
1283 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Should never get here!");
1286 Teuchos::RCP<Epetra_MultiVector> mv_view;
1287 if (numColsMv == numColsA)
1288 mv_view = Teuchos::rcpFromRef (mv);
1290 mv_view =
CloneView (mv, Teuchos::Range1D(0, numColsA - 1));
1304 static void MvScale ( Epetra_MultiVector& mv,
double alpha )
1307 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvScale call to Epetra_MultiVector::Scale(mv,double alpha) returned a nonzero value.");
1312 static void MvScale ( Epetra_MultiVector& mv,
const std::vector<double>& alpha )
1315 int numvecs = mv.NumVectors();
1316 #ifdef TEUCHOS_DEBUG 1317 TEUCHOS_TEST_FOR_EXCEPTION( alpha.size() != (
unsigned int)numvecs, std::invalid_argument,
1318 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvScale(mv,vector alpha): size of alpha inconsistent with number of vectors in mv.")
1320 for (
int i=0; i<numvecs; i++) {
1322 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvScale call to Epetra_MultiVector::Scale() returned a nonzero value.");
1331 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvRandom call to Epetra_MultiVector::Random() returned a nonzero value.");
1336 static void MvInit( Epetra_MultiVector& mv,
double alpha = Teuchos::ScalarTraits<double>::zero() )
1339 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvInit call to Epetra_MultiVector::PutScalar() returned a nonzero value.");
1349 static void MvPrint(
const Epetra_MultiVector& mv, std::ostream& os )
1350 { os << mv << std::endl; }
1354 #if defined(HAVE_ANASAZI_TPETRA) && defined(HAVE_ANASAZI_TSQR) 1355 # if defined(HAVE_TPETRA_EPETRA) 1356 typedef Epetra::TsqrAdaptor tsqr_adaptor_type;
1362 # endif // defined(HAVE_TPETRA_EPETRA) 1363 #endif // defined(HAVE_ANASAZI_TPETRA) && defined(HAVE_ANASAZI_TSQR) 1391 static void Apply (
const Epetra_Operator& Op,
1392 const Epetra_MultiVector& x,
1393 Epetra_MultiVector& y )
1395 #ifdef TEUCHOS_DEBUG 1396 TEUCHOS_TEST_FOR_EXCEPTION(x.NumVectors() != y.NumVectors(),std::invalid_argument,
1397 "Anasazi::OperatorTraits<double,Epetra_MultiVector,Epetra_Operator>::Apply(Op,x,y): x and y must have the same number of columns.");
1399 int ret = Op.Apply(x,y);
1401 "Anasazi::OperatorTraits<double,Epetra_Multivector,Epetra_Operator>::Apply(): Error in Epetra_Operator::Apply(). Code " << ret);
void MvRandom()
Fill the vectors in *this with random numbers.
Adapter class for creating an operators often used in solving generalized eigenproblems.
EpetraMultiVecAccessor is an interfaceto allow any Anasazi::MultiVec implementation that is based on ...
const Epetra_Comm & Comm() const
Returns the Epetra_Comm communicator associated with this operator.
static void MvAddMv(double alpha, const Epetra_MultiVector &A, double beta, const Epetra_MultiVector &B, Epetra_MultiVector &mv)
Replace mv with .
void MvInit(double alpha)
Replace each element of the vectors in *this with alpha.
static void SetBlock(const Epetra_MultiVector &A, const std::vector< int > &index, Epetra_MultiVector &mv)
Copy the vectors in A to a set of vectors in mv indicated by the indices given in index...
virtual ~EpetraMultiVecAccessor()
Destructor.
~EpetraSymMVOp()
Destructor.
Adapter class for creating a weighted symmetric operator from an Epetra_MultiVector and Epetra_Operat...
ptrdiff_t GetGlobalLength() const
The number of rows in the multivector.
static void MvInit(Epetra_MultiVector &mv, double alpha=Teuchos::ScalarTraits< double >::zero())
Replace each element of the vectors in mv with alpha.
~EpetraWSymMVOp()
Destructor.
Virtual base class which defines basic traits for the operator type.
const char * Label() const
Returns a character string describing the operator.
virtual Epetra_MultiVector * GetEpetraMultiVec()
Return the pointer to the Epetra_MultiVector object.
static void MvPrint(const Epetra_MultiVector &mv, std::ostream &os)
Print the mv multi-vector to the os output stream.
static void MvRandom(Epetra_MultiVector &mv)
Replace the vectors in mv with random vectors.
static void MvTransMv(double alpha, const Epetra_MultiVector &A, const Epetra_MultiVector &mv, Teuchos::SerialDenseMatrix< int, double > &B)
Compute a dense matrix B through the matrix-matrix multiply .
static void Assign(const MV &A, MV &mv)
mv := A
bool UseTranspose() const
Returns the current UseTranspose setting [always false for this operator].
An exception class parent to all Anasazi exceptions.
double NormInf() const
Returns the infinity norm of the global matrix [not functional for this operator].
Interface for multivectors used by Anasazi' linear solvers.
Namespace Anasazi contains the classes, structs, enums and utilities used by the Anasazi package...
Basic adapter class for Anasazi::Operator that uses Epetra_Operator.
static void MvDot(const Epetra_MultiVector &A, const Epetra_MultiVector &B, std::vector< double > &b)
Compute a vector b where the components are the individual dot-products of the i-th columns of A and ...
bool HasNormInf() const
Returns true if this object can provide an approximate inf-norm [always false for this operator]...
const Epetra_Map & OperatorRangeMap() const
Returns the Epetra_Map object associated with the range of this operator.
double NormInf() const
Returns the infinity norm of the global matrix [not functional for this operator].
const Epetra_Comm & Comm() const
Returns the Epetra_Comm communicator associated with this operator.
ConjType
Enumerated types used to specify conjugation arguments.
bool UseTranspose() const
Returns the current UseTranspose setting [always false for this operator].
static Teuchos::RCP< Epetra_MultiVector > CloneCopy(const Epetra_MultiVector &mv, const std::vector< int > &index)
Creates a new Epetra_MultiVector and copies the selected contents of mv into the new vector (deep cop...
Epetra_MultiVector * GetEpetraMultiVec()
Return the pointer to the Epetra_MultiVector object.
int GetNumberVecs() const
The number of vectors (i.e., columns) in the multivector.
const char * Label() const
Returns a character string describing the operator.
const Epetra_Map & OperatorRangeMap() const
Returns the Epetra_Map object associated with the range of this operator.
static void MvScale(Epetra_MultiVector &mv, const std::vector< double > &alpha)
Scale each element of the i-th vector in mv with alpha[i].
static void MvTimesMatAddMv(double alpha, const Epetra_MultiVector &A, const Teuchos::SerialDenseMatrix< int, double > &B, double beta, Epetra_MultiVector &mv)
Update mv with .
Traits class which defines basic operations on multivectors.
static Teuchos::RCP< MV > CloneCopy(const MV &mv)
Creates a new MV and copies contents of mv into the new vector (deep copy).
static Teuchos::RCP< const Epetra_MultiVector > CloneView(const Epetra_MultiVector &mv, const std::vector< int > &index)
Creates a new const Epetra_MultiVector that shares the selected contents of mv (shallow copy)...
Adapter class for creating a weighted operator from an Epetra_MultiVector and Epetra_Operator.
virtual const Epetra_MultiVector * GetEpetraMultiVec() const
Return the pointer to the Epetra_MultiVector object.
const Epetra_Map & OperatorDomainMap() const
Returns the Epetra_Map object associated with the domain of this operator.
static Teuchos::RCP< Epetra_MultiVector > Clone(const Epetra_MultiVector &mv, const int outNumVecs)
Creates a new empty Epetra_MultiVector containing numVecs columns.
Anasazi header file which uses auto-configuration information to include necessary C++ headers...
void MvPrint(std::ostream &os) const
Print *this EpetraMultiVec.
static Teuchos::RCP< MV > CloneViewNonConst(MV &mv, const std::vector< int > &index)
Creates a new MV that shares the selected contents of mv (shallow copy).
static ptrdiff_t GetGlobalLength(const Epetra_MultiVector &mv)
Obtain the vector length of mv.
int SetUseTranspose(bool)
If set true, the transpose of this operator will be applied [not functional for this operator]...
Adapter class for creating a symmetric operator from an Epetra_Operator.
static Teuchos::RCP< const MV > CloneView(const MV &mv, const std::vector< int > &index)
Creates a new const MV that shares the selected contents of mv (shallow copy).
const Epetra_MultiVector * GetEpetraMultiVec() const
Return the pointer to the Epetra_MultiVector object.
void MvScale(double alpha)
Scale each element of the vectors in *this with alpha.
static void MvScale(Epetra_MultiVector &mv, double alpha)
Scale each element of the vectors in mv with alpha.
static void SetBlock(const MV &A, const std::vector< int > &index, MV &mv)
Copy the vectors in A to a set of vectors in mv indicated by the indices given in index...
static void Apply(const Epetra_Operator &Op, const Epetra_MultiVector &x, Epetra_MultiVector &y)
This method takes the Epetra_MultiVector x and applies the Epetra_Operator Op to it resulting in the ...
~EpetraW2SymMVOp()
Destructor.
static int GetNumberVecs(const MV &mv)
Obtain the number of vectors in mv.
Templated virtual class for creating operators that can interface with the Anasazi::OperatorTraits cl...
static Teuchos::RCP< Epetra_MultiVector > CloneViewNonConst(Epetra_MultiVector &mv, const std::vector< int > &index)
Creates a new Epetra_MultiVector that shares the selected contents of mv (shallow copy)...
void MvNorm(std::vector< double > &normvec) const
Compute the 2-norm of each individual vector of *this. Upon return, normvec[i] holds the 2-norm of t...
EpetraMultiVecFailure is thrown when a return value from an Epetra call on an Epetra_MultiVector is n...
Types and exceptions used within Anasazi solvers and interfaces.
Interface for multivectors used by Anasazi's linear solvers.
Adapter class for creating a symmetric operator from an Epetra_MultiVector.
static void MvNorm(const Epetra_MultiVector &mv, std::vector< double > &normvec)
Compute the 2-norm of each individual vector of mv. Upon return, normvec[i] holds the value of ...
static int GetNumberVecs(const Epetra_MultiVector &mv)
Obtain the number of vectors in mv.
static Teuchos::RCP< Epetra_MultiVector > CloneCopy(const Epetra_MultiVector &mv)
Creates a new Epetra_MultiVector and copies contents of mv into the new vector (deep copy)...
Anasazi's templated virtual class for constructing an operator that can interface with the OperatorTr...
virtual ~EpetraMultiVec()
Destructor.
int SetUseTranspose(bool)
If set true, the transpose of this operator will be applied [not functional for this operator]...
EpetraOpFailure is thrown when a return value from an Epetra call on an Epetra_Operator is non-zero...
Exceptions thrown to signal error in operator application.
const Epetra_Map & OperatorDomainMap() const
Returns the Epetra_Map object associated with the domain of this operator.
Basic adapter class for Anasazi::MultiVec that uses Epetra_MultiVector.
bool HasNormInf() const
Returns true if this object can provide an approximate inf-norm [always false for this operator]...