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)
742 const int inNumVecs = GetNumberVecs (mv);
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 (Copy, mv, &tmpind[0], index.size()));
801 static Teuchos::RCP<Epetra_MultiVector>
802 CloneCopy (
const Epetra_MultiVector& mv,
const Teuchos::Range1D& index)
804 const int inNumVecs = GetNumberVecs (mv);
805 const int outNumVecs = index.size();
806 const bool validRange = outNumVecs > 0 && index.lbound() >= 0 &&
807 index.ubound() < inNumVecs;
810 std::ostringstream os;
811 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::Clone(mv," 812 "index=[" << index.lbound() <<
", " << index.ubound() <<
"]): ";
813 TEUCHOS_TEST_FOR_EXCEPTION(outNumVecs == 0, std::invalid_argument,
814 os.str() <<
"Column index range must be nonempty.");
815 TEUCHOS_TEST_FOR_EXCEPTION(index.lbound() < 0, std::invalid_argument,
816 os.str() <<
"Column index range must be nonnegative.");
817 TEUCHOS_TEST_FOR_EXCEPTION(index.ubound() >= inNumVecs, std::invalid_argument,
818 os.str() <<
"Column index range must not exceed " 819 "number of vectors " << inNumVecs <<
" in the " 820 "input multivector.");
822 return Teuchos::rcp (
new Epetra_MultiVector (Copy, mv, index.lbound(), index.size()));
830 static Teuchos::RCP<Epetra_MultiVector>
833 const int inNumVecs = GetNumberVecs (mv);
834 const int outNumVecs = index.size();
837 TEUCHOS_TEST_FOR_EXCEPTION(outNumVecs == 0, std::invalid_argument,
838 "Anasazi::MultiVecTraits<double,Epetra_MultiVector>::" 839 "CloneViewNonConst(mv, index = {}): The output view " 840 "must have at least one column.");
841 if (outNumVecs > inNumVecs)
843 std::ostringstream os;
844 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::" 845 "CloneViewNonConst(mv, index = {";
846 for (
int k = 0; k < outNumVecs - 1; ++k)
847 os << index[k] <<
", ";
848 os << index[outNumVecs-1] <<
"}): There are " << outNumVecs
849 <<
" indices to view, but only " << inNumVecs <<
" columns of mv.";
850 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
857 const int minIndex = *std::min_element (index.begin(), index.end());
858 const int maxIndex = *std::max_element (index.begin(), index.end());
862 std::ostringstream os;
863 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::" 864 "CloneViewNonConst(mv, index = {";
865 for (
int k = 0; k < outNumVecs - 1; ++k)
866 os << index[k] <<
", ";
867 os << index[outNumVecs-1] <<
"}): Indices must be nonnegative, but " 868 "the smallest index " << minIndex <<
" is negative.";
869 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
871 if (maxIndex >= inNumVecs)
873 std::ostringstream os;
874 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::" 875 "CloneViewNonConst(mv, index = {";
876 for (
int k = 0; k < outNumVecs - 1; ++k)
877 os << index[k] <<
", ";
878 os << index[outNumVecs-1] <<
"}): Indices must be strictly less than " 879 "the number of vectors " << inNumVecs <<
" in mv; the largest index " 880 << maxIndex <<
" is out of bounds.";
881 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
883 #endif // TEUCHOS_DEBUG 887 std::vector<int>& tmpind =
const_cast< std::vector<int>&
> (index);
888 return Teuchos::rcp (
new Epetra_MultiVector (View, mv, &tmpind[0], index.size()));
891 static Teuchos::RCP<Epetra_MultiVector>
892 CloneViewNonConst (Epetra_MultiVector& mv,
const Teuchos::Range1D& index)
894 const bool validRange = index.size() > 0 &&
895 index.lbound() >= 0 &&
896 index.ubound() < mv.NumVectors();
899 std::ostringstream os;
900 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::CloneView" 901 "NonConst(mv,index=[" << index.lbound() <<
", " << index.ubound()
903 TEUCHOS_TEST_FOR_EXCEPTION(index.size() == 0, std::invalid_argument,
904 os.str() <<
"Column index range must be nonempty.");
905 TEUCHOS_TEST_FOR_EXCEPTION(index.lbound() < 0, std::invalid_argument,
906 os.str() <<
"Column index range must be nonnegative.");
907 TEUCHOS_TEST_FOR_EXCEPTION(index.ubound() >= mv.NumVectors(),
908 std::invalid_argument,
909 os.str() <<
"Column index range must not exceed " 910 "number of vectors " << mv.NumVectors() <<
" in " 911 "the input multivector.");
913 return Teuchos::rcp (
new Epetra_MultiVector (View, mv, index.lbound(), index.size()));
921 static Teuchos::RCP<const Epetra_MultiVector>
922 CloneView (
const Epetra_MultiVector& mv,
const std::vector<int>& index)
924 const int inNumVecs = GetNumberVecs (mv);
925 const int outNumVecs = index.size();
928 TEUCHOS_TEST_FOR_EXCEPTION(outNumVecs == 0, std::invalid_argument,
929 "Belos::MultiVecTraits<double,Epetra_MultiVector>::" 930 "CloneView(mv, index = {}): The output view " 931 "must have at least one column.");
932 if (outNumVecs > inNumVecs)
934 std::ostringstream os;
935 os <<
"Belos::MultiVecTraits<double,Epetra_MultiVector>::" 936 "CloneView(mv, index = {";
937 for (
int k = 0; k < outNumVecs - 1; ++k)
938 os << index[k] <<
", ";
939 os << index[outNumVecs-1] <<
"}): There are " << outNumVecs
940 <<
" indices to view, but only " << inNumVecs <<
" columns of mv.";
941 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
948 const int minIndex = *std::min_element (index.begin(), index.end());
949 const int maxIndex = *std::max_element (index.begin(), index.end());
953 std::ostringstream os;
954 os <<
"Belos::MultiVecTraits<double,Epetra_MultiVector>::" 955 "CloneView(mv, index = {";
956 for (
int k = 0; k < outNumVecs - 1; ++k)
957 os << index[k] <<
", ";
958 os << index[outNumVecs-1] <<
"}): Indices must be nonnegative, but " 959 "the smallest index " << minIndex <<
" is negative.";
960 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
962 if (maxIndex >= inNumVecs)
964 std::ostringstream os;
965 os <<
"Belos::MultiVecTraits<double,Epetra_MultiVector>::" 966 "CloneView(mv, index = {";
967 for (
int k = 0; k < outNumVecs - 1; ++k)
968 os << index[k] <<
", ";
969 os << index[outNumVecs-1] <<
"}): Indices must be strictly less than " 970 "the number of vectors " << inNumVecs <<
" in mv; the largest index " 971 << maxIndex <<
" is out of bounds.";
972 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
974 #endif // TEUCHOS_DEBUG 978 std::vector<int>& tmpind =
const_cast< std::vector<int>&
> (index);
979 return Teuchos::rcp (
new Epetra_MultiVector (View, mv, &tmpind[0], index.size()));
982 static Teuchos::RCP<Epetra_MultiVector>
983 CloneView (
const Epetra_MultiVector& mv,
const Teuchos::Range1D& index)
985 const bool validRange = index.size() > 0 &&
986 index.lbound() >= 0 &&
987 index.ubound() < mv.NumVectors();
990 std::ostringstream os;
991 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::CloneView" 992 "(mv,index=[" << index.lbound() <<
", " << index.ubound()
994 TEUCHOS_TEST_FOR_EXCEPTION(index.size() == 0, std::invalid_argument,
995 os.str() <<
"Column index range must be nonempty.");
996 TEUCHOS_TEST_FOR_EXCEPTION(index.lbound() < 0, std::invalid_argument,
997 os.str() <<
"Column index range must be nonnegative.");
998 TEUCHOS_TEST_FOR_EXCEPTION(index.ubound() >= mv.NumVectors(),
999 std::invalid_argument,
1000 os.str() <<
"Column index range must not exceed " 1001 "number of vectors " << mv.NumVectors() <<
" in " 1002 "the input multivector.");
1004 return Teuchos::rcp (
new Epetra_MultiVector(View, mv, index.lbound(), index.size()));
1015 if (mv.Map().GlobalIndicesLongLong())
1016 return static_cast<ptrdiff_t>( mv.GlobalLength64() );
1018 return static_cast<ptrdiff_t
>( mv.GlobalLength() );
1023 {
return mv.NumVectors(); }
1025 static bool HasConstantStride(
const Epetra_MultiVector& mv )
1026 {
return mv.ConstantStride(); }
1035 const Teuchos::SerialDenseMatrix<int,double>& B,
1036 double beta, Epetra_MultiVector& mv )
1038 Epetra_LocalMap LocalMap(B.numRows(), 0, mv.Map().Comm());
1039 Epetra_MultiVector B_Pvec(::View, LocalMap, B.values(), B.stride(), B.numCols());
1041 TEUCHOS_TEST_FOR_EXCEPTION( mv.Multiply(
'N',
'N', alpha, A, B_Pvec, beta )!=0,
EpetraMultiVecFailure,
1042 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvTimesMatAddMv call to Epetra_MultiVector::Multiply() returned a nonzero value.");
1047 static void MvAddMv(
double alpha,
const Epetra_MultiVector& A,
double beta,
const Epetra_MultiVector& B, Epetra_MultiVector& mv )
1081 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvAddMv call to Epetra_MultiVector::Update(alpha,A,0.0) returned a nonzero value.");
1084 else if (alpha == 0.0) {
1092 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvAddMv call to Epetra_MultiVector::Update(beta,B,0.0) returned a nonzero value.");
1098 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvAddMv call to Epetra_MultiVector::Update(alpha,A,beta,B,0.0) returned a nonzero value.");
1104 static void MvTransMv(
double alpha,
const Epetra_MultiVector& A,
const Epetra_MultiVector& mv, Teuchos::SerialDenseMatrix<int,double>& B
1105 #ifdef HAVE_ANASAZI_EXPERIMENTAL
1110 Epetra_LocalMap LocalMap(B.numRows(), 0, mv.Map().Comm());
1111 Epetra_MultiVector B_Pvec(::View, LocalMap, B.values(), B.stride(), B.numCols());
1113 TEUCHOS_TEST_FOR_EXCEPTION( B_Pvec.Multiply(
'T',
'N', alpha, A, mv, 0.0 )!=0,
EpetraMultiVecFailure,
1114 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvTransMv call to Epetra_MultiVector::Multiply() returned a nonzero value.");
1119 static void MvDot(
const Epetra_MultiVector& A,
const Epetra_MultiVector& B, std::vector<double> &b
1120 #ifdef HAVE_ANASAZI_EXPERIMENTAL
1125 #ifdef TEUCHOS_DEBUG 1126 TEUCHOS_TEST_FOR_EXCEPTION(A.NumVectors() != B.NumVectors(),std::invalid_argument,
1127 "Anasazi::MultiVecTraits<double,Epetra_MultiVector>::MvDot(A,B,b): A and B must have the same number of vectors.");
1128 TEUCHOS_TEST_FOR_EXCEPTION(b.size() != (
unsigned int)A.NumVectors(),std::invalid_argument,
1129 "Anasazi::MultiVecTraits<double,Epetra_MultiVector>::MvDot(A,B,b): b must have room for all dot products.");
1132 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvDot(A,B,b) call to Epetra_MultiVector::Dot() returned a nonzero value.");
1142 static void MvNorm(
const Epetra_MultiVector& mv, std::vector<double> &normvec )
1144 #ifdef TEUCHOS_DEBUG 1145 TEUCHOS_TEST_FOR_EXCEPTION((
unsigned int)mv.NumVectors() != normvec.size(),std::invalid_argument,
1146 "Anasazi::MultiVecTraits<double,Epetra_MultiVector>::MvNorm(mv,normvec): normvec must be the same size of mv.");
1149 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvNorm call to Epetra_MultiVector::Norm2() returned a nonzero value.");
1160 const std::vector<int>& index,
1161 Epetra_MultiVector& mv)
1163 const int inNumVecs = GetNumberVecs (A);
1164 const int outNumVecs = index.size();
1172 if (inNumVecs != outNumVecs)
1174 std::ostringstream os;
1175 os <<
"Belos::MultiVecTraits<double,Epetra_MultiVector>::" 1176 "SetBlock(A, mv, index = {";
1179 for (
int k = 0; k < outNumVecs - 1; ++k)
1180 os << index[k] <<
", ";
1181 os << index[outNumVecs-1];
1183 os <<
"}): A has only " << inNumVecs <<
" columns, but there are " 1184 << outNumVecs <<
" indices in the index vector.";
1185 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
1188 Teuchos::RCP<Epetra_MultiVector> mv_view = CloneViewNonConst (mv, index);
1193 Teuchos::RCP<const Epetra_MultiVector> A_view;
1194 if (outNumVecs == inNumVecs)
1195 A_view = Teuchos::rcpFromRef (A);
1197 A_view = CloneView (A, Teuchos::Range1D(0, outNumVecs - 1));
1210 SetBlock (
const Epetra_MultiVector& A,
1211 const Teuchos::Range1D& index,
1212 Epetra_MultiVector& mv)
1214 const int numColsA = A.NumVectors();
1215 const int numColsMv = mv.NumVectors();
1217 const bool validIndex = index.lbound() >= 0 && index.ubound() < numColsMv;
1219 const bool validSource = index.size() <= numColsA;
1221 if (! validIndex || ! validSource)
1223 std::ostringstream os;
1224 os <<
"Anasazi::MultiVecTraits<double, Epetra_MultiVector>::SetBlock" 1225 "(A, index=[" << index.lbound() <<
", " << index.ubound() <<
"], " 1227 TEUCHOS_TEST_FOR_EXCEPTION(index.lbound() < 0, std::invalid_argument,
1228 os.str() <<
"Range lower bound must be nonnegative.");
1229 TEUCHOS_TEST_FOR_EXCEPTION(index.ubound() >= numColsMv, std::invalid_argument,
1230 os.str() <<
"Range upper bound must be less than " 1231 "the number of columns " << numColsA <<
" in the " 1232 "'mv' output argument.");
1233 TEUCHOS_TEST_FOR_EXCEPTION(index.size() > numColsA, std::invalid_argument,
1234 os.str() <<
"Range must have no more elements than" 1235 " the number of columns " << numColsA <<
" in the " 1236 "'A' input argument.");
1237 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Should never get here!");
1244 Teuchos::RCP<Epetra_MultiVector> mv_view;
1245 if (index.lbound() == 0 && index.ubound()+1 == numColsMv)
1246 mv_view = Teuchos::rcpFromRef (mv);
1248 mv_view = CloneViewNonConst (mv, index);
1253 Teuchos::RCP<const Epetra_MultiVector> A_view;
1254 if (index.size() == numColsA)
1255 A_view = Teuchos::rcpFromRef (A);
1257 A_view = CloneView (A, Teuchos::Range1D(0, index.size()-1));
1270 Assign (
const Epetra_MultiVector& A,
1271 Epetra_MultiVector& mv)
1273 const int numColsA = GetNumberVecs (A);
1274 const int numColsMv = GetNumberVecs (mv);
1275 if (numColsA > numColsMv)
1277 std::ostringstream os;
1278 os <<
"Anasazi::MultiVecTraits<double, Epetra_MultiVector>::Assign" 1280 TEUCHOS_TEST_FOR_EXCEPTION(numColsA > numColsMv, std::invalid_argument,
1281 os.str() <<
"Input multivector 'A' has " 1282 << numColsA <<
" columns, but output multivector " 1283 "'mv' has only " << numColsMv <<
" columns.");
1284 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Should never get here!");
1287 Teuchos::RCP<Epetra_MultiVector> mv_view;
1288 if (numColsMv == numColsA)
1289 mv_view = Teuchos::rcpFromRef (mv);
1291 mv_view = CloneView (mv, Teuchos::Range1D(0, numColsA - 1));
1305 static void MvScale ( Epetra_MultiVector& mv,
double alpha )
1308 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvScale call to Epetra_MultiVector::Scale(mv,double alpha) returned a nonzero value.");
1313 static void MvScale ( Epetra_MultiVector& mv,
const std::vector<double>& alpha )
1316 int numvecs = mv.NumVectors();
1317 #ifdef TEUCHOS_DEBUG 1318 TEUCHOS_TEST_FOR_EXCEPTION( alpha.size() != (
unsigned int)numvecs, std::invalid_argument,
1319 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvScale(mv,vector alpha): size of alpha inconsistent with number of vectors in mv.")
1321 for (
int i=0; i<numvecs; i++) {
1323 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvScale call to Epetra_MultiVector::Scale() returned a nonzero value.");
1332 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvRandom call to Epetra_MultiVector::Random() returned a nonzero value.");
1337 static void MvInit( Epetra_MultiVector& mv,
double alpha = Teuchos::ScalarTraits<double>::zero() )
1340 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvInit call to Epetra_MultiVector::PutScalar() returned a nonzero value.");
1350 static void MvPrint(
const Epetra_MultiVector& mv, std::ostream& os )
1351 { os << mv << std::endl; }
1355 #if defined(HAVE_ANASAZI_TPETRA) && defined(HAVE_ANASAZI_TSQR) 1356 # if defined(HAVE_TPETRA_EPETRA) 1357 typedef Epetra::TsqrAdaptor tsqr_adaptor_type;
1363 # endif // defined(HAVE_TPETRA_EPETRA) 1364 #endif // defined(HAVE_ANASAZI_TPETRA) && defined(HAVE_ANASAZI_TSQR) 1392 static void Apply (
const Epetra_Operator& Op,
1393 const Epetra_MultiVector& x,
1394 Epetra_MultiVector& y )
1396 #ifdef TEUCHOS_DEBUG 1397 TEUCHOS_TEST_FOR_EXCEPTION(x.NumVectors() != y.NumVectors(),std::invalid_argument,
1398 "Anasazi::OperatorTraits<double,Epetra_MultiVector,Epetra_Operator>::Apply(Op,x,y): x and y must have the same number of columns.");
1400 int ret = Op.Apply(x,y);
1402 "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_Map & OperatorDomainMap() const
Returns the Epetra_Map object associated with the domain of 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...
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.
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 th...
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 .
An exception class parent to all Anasazi exceptions.
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 ...
const char * Label() const
Returns a character string describing the operator.
bool HasNormInf() const
Returns true if this object can provide an approximate inf-norm [always false for this operator]...
ptrdiff_t GetGlobalLength() const
The number of rows in the multivector.
ConjType
Enumerated types used to specify conjugation arguments.
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.
bool HasNormInf() const
Returns true if this object can provide an approximate inf-norm [always false for this operator]...
int GetNumberVecs() const
The number of vectors (i.e., columns) in the multivector.
static void MvScale(Epetra_MultiVector &mv, const std::vector< double > &alpha)
Scale each element of the i-th vector in mv with alpha[i].
const Epetra_Comm & Comm() const
Returns the Epetra_Comm communicator associated with this operator.
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< 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.
const Epetra_Map & OperatorDomainMap() const
Returns the Epetra_Map object associated with the domain of this operator.
bool UseTranspose() const
Returns the current UseTranspose setting [always false for this operator].
const Epetra_Map & OperatorRangeMap() const
Returns the Epetra_Map object associated with the range of this operator.
const Epetra_MultiVector * GetEpetraMultiVec() const
Return the pointer to the Epetra_MultiVector object.
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...
double NormInf() const
Returns the infinity norm of the global matrix [not functional for this operator].
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]...
const Epetra_Map & OperatorRangeMap() const
Returns the Epetra_Map object associated with the range of this operator.
Adapter class for creating a symmetric operator from an Epetra_Operator.
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 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.
const Epetra_Comm & Comm() const
Returns the Epetra_Comm communicator associated with this operator.
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)...
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.
bool UseTranspose() const
Returns the current UseTranspose setting [always false for this operator].
virtual const Epetra_MultiVector * GetEpetraMultiVec() const
Return the pointer to the Epetra_MultiVector object.
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]...
double NormInf() const
Returns the infinity norm of the global matrix [not functional for this operator].
EpetraOpFailure is thrown when a return value from an Epetra call on an Epetra_Operator is non-zero...
void MvPrint(std::ostream &os) const
Print *this EpetraMultiVec.
Exceptions thrown to signal error in operator application.
Basic adapter class for Anasazi::MultiVec that uses Epetra_MultiVector.