46 #ifndef ANASAZI_EPETRA_ADAPTER_HPP 47 #define ANASAZI_EPETRA_ADAPTER_HPP 50 #include "Anasaziepetra_DLLExportMacro.h" 55 #include "Teuchos_Assert.hpp" 56 #include "Teuchos_SerialDenseMatrix.hpp" 57 #include "Epetra_MultiVector.h" 58 #include "Epetra_Vector.h" 59 #include "Epetra_Operator.h" 60 #include "Epetra_Map.h" 61 #include "Epetra_LocalMap.h" 63 #if defined(HAVE_ANASAZI_TPETRA) && defined(HAVE_ANASAZI_TSQR) 64 # include <Tpetra_ConfigDefs.hpp> 65 # if defined(HAVE_TPETRA_EPETRA) 66 # include <Epetra_TsqrAdaptor.hpp> 67 # endif // defined(HAVE_TPETRA_EPETRA) 68 #endif // defined(HAVE_ANASAZI_TPETRA) && defined(HAVE_ANASAZI_TSQR) 149 EpetraMultiVec(
const Epetra_BlockMap& Map_in,
double * array,
const int numvecs,
const int stride=0);
158 EpetraMultiVec(Epetra_DataAccess CV,
const Epetra_MultiVector& P_vec,
const std::vector<int>& index);
213 if ( Map().GlobalIndicesLongLong() )
214 return static_cast<ptrdiff_t
>( GlobalLength64() );
216 return static_cast<ptrdiff_t
>( GlobalLength() );
230 const Teuchos::SerialDenseMatrix<int,double>& B,
240 void MvTransMv (
double alpha,
const MultiVec<double>& A, Teuchos::SerialDenseMatrix<int,double>& B
241 #ifdef HAVE_ANASAZI_EXPERIMENTAL
249 #ifdef HAVE_ANASAZI_EXPERIMENTAL
258 "Anasazi::EpetraMultiVec::MvScale call to Epetra_MultiVector::Scale() returned a nonzero value.");
263 void MvScale (
const std::vector<double>& alpha );
272 void MvNorm ( std::vector<double> & normvec )
const {
273 if (((
int)normvec.size() >= GetNumberVecs()) ) {
275 "Anasazi::EpetraMultiVec::MvNorm call to Epetra_MultiVector::Norm2() returned a nonzero value.");
293 "Anasazi::EpetraMultiVec::MvRandom call to Epetra_MultiVector::Random() returned a nonzero value.");
300 "Anasazi::EpetraMultiVec::MvInit call to Epetra_MultiVector::PutScalar() returned a nonzero value.");
319 void MvPrint( std::ostream& os )
const { os << *
this << std::endl; };
344 EpetraOp(
const Teuchos::RCP<Epetra_Operator> &Op );
363 #pragma warning(push) 364 #pragma warning(disable:4251) 366 Teuchos::RCP<Epetra_Operator> Epetra_Op;
392 class ANASAZIEPETRA_LIB_DLL_EXPORT
EpetraGenOp :
public virtual Operator<double>,
public virtual Epetra_Operator {
398 EpetraGenOp(
const Teuchos::RCP<Epetra_Operator> &AOp,
399 const Teuchos::RCP<Epetra_Operator> &MOp,
400 bool isAInverse =
true );
413 int Apply(
const Epetra_MultiVector &X, Epetra_MultiVector &Y)
const;
418 int ApplyInverse(
const Epetra_MultiVector &X, Epetra_MultiVector &Y)
const;
421 const char*
Label()
const {
return "Epetra_Operator applying A^{-1}M"; };
436 const Epetra_Comm&
Comm()
const {
return Epetra_AOp->Comm(); };
450 #pragma warning(push) 451 #pragma warning(disable:4251) 453 Teuchos::RCP<Epetra_Operator> Epetra_AOp;
454 Teuchos::RCP<Epetra_Operator> Epetra_MOp;
478 class ANASAZIEPETRA_LIB_DLL_EXPORT
EpetraSymOp :
public virtual Operator<double>,
public virtual Epetra_Operator {
483 EpetraSymOp(
const Teuchos::RCP<Epetra_Operator> &Op,
bool isTrans =
false );
496 int Apply(
const Epetra_MultiVector &X, Epetra_MultiVector &Y)
const;
502 int ApplyInverse(
const Epetra_MultiVector &X, Epetra_MultiVector &Y)
const;
505 const char*
Label()
const {
return "Epetra_Operator applying A^TA or AA^T"; };
520 const Epetra_Comm&
Comm()
const {
return Epetra_Op->Comm(); };
532 #pragma warning(push) 533 #pragma warning(disable:4251) 535 Teuchos::RCP<Epetra_Operator> Epetra_Op;
567 EpetraSymMVOp(
const Teuchos::RCP<const Epetra_MultiVector> &MV,
568 bool isTrans =
false );
583 #pragma warning(push) 584 #pragma warning(disable:4251) 586 Teuchos::RCP<const Epetra_MultiVector> Epetra_MV;
587 Teuchos::RCP<const Epetra_Map> MV_localmap;
588 Teuchos::RCP<const Epetra_BlockMap> MV_blockmap;
618 const Teuchos::RCP<Epetra_Operator> &OP );
632 #pragma warning(push) 633 #pragma warning(disable:4251) 635 Teuchos::RCP<const Epetra_MultiVector> Epetra_MV;
636 Teuchos::RCP<Epetra_Operator> Epetra_OP;
637 Teuchos::RCP<Epetra_MultiVector> Epetra_WMV;
638 Teuchos::RCP<const Epetra_Map> MV_localmap;
639 Teuchos::RCP<const Epetra_BlockMap> MV_blockmap;
667 const Teuchos::RCP<Epetra_Operator> &OP );
681 #pragma warning(push) 682 #pragma warning(disable:4251) 684 Teuchos::RCP<const Epetra_MultiVector> Epetra_MV;
685 Teuchos::RCP<Epetra_Operator> Epetra_OP;
686 Teuchos::RCP<Epetra_MultiVector> Epetra_WMV;
687 Teuchos::RCP<const Epetra_Map> MV_localmap;
688 Teuchos::RCP<const Epetra_BlockMap> MV_blockmap;
723 static Teuchos::RCP<Epetra_MultiVector>
724 Clone (
const Epetra_MultiVector& mv,
const int outNumVecs)
726 TEUCHOS_TEST_FOR_EXCEPTION(outNumVecs <= 0, std::invalid_argument,
727 "Belos::MultiVecTraits<double, Epetra_MultiVector>::" 728 "Clone(mv, outNumVecs = " << outNumVecs <<
"): " 729 "outNumVecs must be positive.");
734 return Teuchos::rcp (
new Epetra_MultiVector (mv.Map(), outNumVecs));
741 static Teuchos::RCP<Epetra_MultiVector>
744 return Teuchos::rcp (
new Epetra_MultiVector (mv));
752 static Teuchos::RCP<Epetra_MultiVector>
753 CloneCopy (
const Epetra_MultiVector& mv,
const std::vector<int>& index)
755 const int inNumVecs = GetNumberVecs (mv);
756 const int outNumVecs = index.size();
759 TEUCHOS_TEST_FOR_EXCEPTION(outNumVecs == 0, std::invalid_argument,
760 "Anasazi::MultiVecTraits<double,Epetra_MultiVector>::" 761 "CloneCopy(mv, index = {}): At least one vector must be" 763 if (outNumVecs > inNumVecs)
765 std::ostringstream os;
766 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::" 767 "CloneCopy(mv, index = {";
768 for (
int k = 0; k < outNumVecs - 1; ++k)
769 os << index[k] <<
", ";
770 os << index[outNumVecs-1] <<
"}): There are " << outNumVecs
771 <<
" indices to copy, but only " << inNumVecs <<
" columns of mv.";
772 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
779 const int minIndex = *std::min_element (index.begin(), index.end());
780 const int maxIndex = *std::max_element (index.begin(), index.end());
784 std::ostringstream os;
785 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::" 786 "CloneCopy(mv, index = {";
787 for (
int k = 0; k < outNumVecs - 1; ++k)
788 os << index[k] <<
", ";
789 os << index[outNumVecs-1] <<
"}): Indices must be nonnegative, but " 790 "the smallest index " << minIndex <<
" is negative.";
791 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
793 if (maxIndex >= inNumVecs)
795 std::ostringstream os;
796 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::" 797 "CloneCopy(mv, index = {";
798 for (
int k = 0; k < outNumVecs - 1; ++k)
799 os << index[k] <<
", ";
800 os << index[outNumVecs-1] <<
"}): Indices must be strictly less than " 801 "the number of vectors " << inNumVecs <<
" in mv; the largest index " 802 << maxIndex <<
" is out of bounds.";
803 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
805 #endif // TEUCHOS_DEBUG 809 std::vector<int>& tmpind =
const_cast< std::vector<int>&
> (index);
810 return Teuchos::rcp (
new Epetra_MultiVector (Epetra_DataAccess::Copy, mv, &tmpind[0], index.size()));
813 static Teuchos::RCP<Epetra_MultiVector>
814 CloneCopy (
const Epetra_MultiVector& mv,
const Teuchos::Range1D& index)
816 const int inNumVecs = GetNumberVecs (mv);
817 const int outNumVecs = index.size();
818 const bool validRange = outNumVecs > 0 && index.lbound() >= 0 &&
819 index.ubound() < inNumVecs;
822 std::ostringstream os;
823 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::Clone(mv," 824 "index=[" << index.lbound() <<
", " << index.ubound() <<
"]): ";
825 TEUCHOS_TEST_FOR_EXCEPTION(outNumVecs == 0, std::invalid_argument,
826 os.str() <<
"Column index range must be nonempty.");
827 TEUCHOS_TEST_FOR_EXCEPTION(index.lbound() < 0, std::invalid_argument,
828 os.str() <<
"Column index range must be nonnegative.");
829 TEUCHOS_TEST_FOR_EXCEPTION(index.ubound() >= inNumVecs, std::invalid_argument,
830 os.str() <<
"Column index range must not exceed " 831 "number of vectors " << inNumVecs <<
" in the " 832 "input multivector.");
834 return Teuchos::rcp (
new Epetra_MultiVector (Epetra_DataAccess::Copy, mv, index.lbound(), index.size()));
842 static Teuchos::RCP<Epetra_MultiVector>
845 const int inNumVecs = GetNumberVecs (mv);
846 const int outNumVecs = index.size();
849 TEUCHOS_TEST_FOR_EXCEPTION(outNumVecs == 0, std::invalid_argument,
850 "Anasazi::MultiVecTraits<double,Epetra_MultiVector>::" 851 "CloneViewNonConst(mv, index = {}): The output view " 852 "must have at least one column.");
853 if (outNumVecs > inNumVecs)
855 std::ostringstream os;
856 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::" 857 "CloneViewNonConst(mv, index = {";
858 for (
int k = 0; k < outNumVecs - 1; ++k)
859 os << index[k] <<
", ";
860 os << index[outNumVecs-1] <<
"}): There are " << outNumVecs
861 <<
" indices to view, but only " << inNumVecs <<
" columns of mv.";
862 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
869 const int minIndex = *std::min_element (index.begin(), index.end());
870 const int maxIndex = *std::max_element (index.begin(), index.end());
874 std::ostringstream os;
875 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::" 876 "CloneViewNonConst(mv, index = {";
877 for (
int k = 0; k < outNumVecs - 1; ++k)
878 os << index[k] <<
", ";
879 os << index[outNumVecs-1] <<
"}): Indices must be nonnegative, but " 880 "the smallest index " << minIndex <<
" is negative.";
881 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
883 if (maxIndex >= inNumVecs)
885 std::ostringstream os;
886 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::" 887 "CloneViewNonConst(mv, index = {";
888 for (
int k = 0; k < outNumVecs - 1; ++k)
889 os << index[k] <<
", ";
890 os << index[outNumVecs-1] <<
"}): Indices must be strictly less than " 891 "the number of vectors " << inNumVecs <<
" in mv; the largest index " 892 << maxIndex <<
" is out of bounds.";
893 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
895 #endif // TEUCHOS_DEBUG 899 std::vector<int>& tmpind =
const_cast< std::vector<int>&
> (index);
900 return Teuchos::rcp (
new Epetra_MultiVector (Epetra_DataAccess::View, mv, &tmpind[0], index.size()));
903 static Teuchos::RCP<Epetra_MultiVector>
904 CloneViewNonConst (Epetra_MultiVector& mv,
const Teuchos::Range1D& index)
906 const bool validRange = index.size() > 0 &&
907 index.lbound() >= 0 &&
908 index.ubound() < mv.NumVectors();
911 std::ostringstream os;
912 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::CloneView" 913 "NonConst(mv,index=[" << index.lbound() <<
", " << index.ubound()
915 TEUCHOS_TEST_FOR_EXCEPTION(index.size() == 0, std::invalid_argument,
916 os.str() <<
"Column index range must be nonempty.");
917 TEUCHOS_TEST_FOR_EXCEPTION(index.lbound() < 0, std::invalid_argument,
918 os.str() <<
"Column index range must be nonnegative.");
919 TEUCHOS_TEST_FOR_EXCEPTION(index.ubound() >= mv.NumVectors(),
920 std::invalid_argument,
921 os.str() <<
"Column index range must not exceed " 922 "number of vectors " << mv.NumVectors() <<
" in " 923 "the input multivector.");
925 return Teuchos::rcp (
new Epetra_MultiVector (Epetra_DataAccess::View, mv, index.lbound(), index.size()));
933 static Teuchos::RCP<const Epetra_MultiVector>
934 CloneView (
const Epetra_MultiVector& mv,
const std::vector<int>& index)
936 const int inNumVecs = GetNumberVecs (mv);
937 const int outNumVecs = index.size();
940 TEUCHOS_TEST_FOR_EXCEPTION(outNumVecs == 0, std::invalid_argument,
941 "Belos::MultiVecTraits<double,Epetra_MultiVector>::" 942 "CloneView(mv, index = {}): The output view " 943 "must have at least one column.");
944 if (outNumVecs > inNumVecs)
946 std::ostringstream os;
947 os <<
"Belos::MultiVecTraits<double,Epetra_MultiVector>::" 948 "CloneView(mv, index = {";
949 for (
int k = 0; k < outNumVecs - 1; ++k)
950 os << index[k] <<
", ";
951 os << index[outNumVecs-1] <<
"}): There are " << outNumVecs
952 <<
" indices to view, but only " << inNumVecs <<
" columns of mv.";
953 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
960 const int minIndex = *std::min_element (index.begin(), index.end());
961 const int maxIndex = *std::max_element (index.begin(), index.end());
965 std::ostringstream os;
966 os <<
"Belos::MultiVecTraits<double,Epetra_MultiVector>::" 967 "CloneView(mv, index = {";
968 for (
int k = 0; k < outNumVecs - 1; ++k)
969 os << index[k] <<
", ";
970 os << index[outNumVecs-1] <<
"}): Indices must be nonnegative, but " 971 "the smallest index " << minIndex <<
" is negative.";
972 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
974 if (maxIndex >= inNumVecs)
976 std::ostringstream os;
977 os <<
"Belos::MultiVecTraits<double,Epetra_MultiVector>::" 978 "CloneView(mv, index = {";
979 for (
int k = 0; k < outNumVecs - 1; ++k)
980 os << index[k] <<
", ";
981 os << index[outNumVecs-1] <<
"}): Indices must be strictly less than " 982 "the number of vectors " << inNumVecs <<
" in mv; the largest index " 983 << maxIndex <<
" is out of bounds.";
984 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
986 #endif // TEUCHOS_DEBUG 990 std::vector<int>& tmpind =
const_cast< std::vector<int>&
> (index);
991 return Teuchos::rcp (
new Epetra_MultiVector (Epetra_DataAccess::View, mv, &tmpind[0], index.size()));
994 static Teuchos::RCP<Epetra_MultiVector>
995 CloneView (
const Epetra_MultiVector& mv,
const Teuchos::Range1D& index)
997 const bool validRange = index.size() > 0 &&
998 index.lbound() >= 0 &&
999 index.ubound() < mv.NumVectors();
1002 std::ostringstream os;
1003 os <<
"Anasazi::MultiVecTraits<double,Epetra_MultiVector>::CloneView" 1004 "(mv,index=[" << index.lbound() <<
", " << index.ubound()
1006 TEUCHOS_TEST_FOR_EXCEPTION(index.size() == 0, std::invalid_argument,
1007 os.str() <<
"Column index range must be nonempty.");
1008 TEUCHOS_TEST_FOR_EXCEPTION(index.lbound() < 0, std::invalid_argument,
1009 os.str() <<
"Column index range must be nonnegative.");
1010 TEUCHOS_TEST_FOR_EXCEPTION(index.ubound() >= mv.NumVectors(),
1011 std::invalid_argument,
1012 os.str() <<
"Column index range must not exceed " 1013 "number of vectors " << mv.NumVectors() <<
" in " 1014 "the input multivector.");
1016 return Teuchos::rcp (
new Epetra_MultiVector(Epetra_DataAccess::View, mv, index.lbound(), index.size()));
1027 if (mv.Map().GlobalIndicesLongLong())
1028 return static_cast<ptrdiff_t>( mv.GlobalLength64() );
1030 return static_cast<ptrdiff_t
>( mv.GlobalLength() );
1035 {
return mv.NumVectors(); }
1037 static bool HasConstantStride(
const Epetra_MultiVector& mv )
1038 {
return mv.ConstantStride(); }
1047 const Teuchos::SerialDenseMatrix<int,double>& B,
1048 double beta, Epetra_MultiVector& mv )
1050 Epetra_LocalMap LocalMap(B.numRows(), 0, mv.Map().Comm());
1051 Epetra_MultiVector B_Pvec(Epetra_DataAccess::View, LocalMap, B.values(), B.stride(), B.numCols());
1053 TEUCHOS_TEST_FOR_EXCEPTION( mv.Multiply(
'N',
'N', alpha, A, B_Pvec, beta )!=0,
EpetraMultiVecFailure,
1054 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvTimesMatAddMv call to Epetra_MultiVector::Multiply() returned a nonzero value.");
1059 static void MvAddMv(
double alpha,
const Epetra_MultiVector& A,
double beta,
const Epetra_MultiVector& B, Epetra_MultiVector& mv )
1093 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvAddMv call to Epetra_MultiVector::Update(alpha,A,0.0) returned a nonzero value.");
1096 else if (alpha == 0.0) {
1104 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvAddMv call to Epetra_MultiVector::Update(beta,B,0.0) returned a nonzero value.");
1110 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvAddMv call to Epetra_MultiVector::Update(alpha,A,beta,B,0.0) returned a nonzero value.");
1116 static void MvTransMv(
double alpha,
const Epetra_MultiVector& A,
const Epetra_MultiVector& mv, Teuchos::SerialDenseMatrix<int,double>& B
1117 #ifdef HAVE_ANASAZI_EXPERIMENTAL
1122 Epetra_LocalMap LocalMap(B.numRows(), 0, mv.Map().Comm());
1123 Epetra_MultiVector B_Pvec(Epetra_DataAccess::View, LocalMap, B.values(), B.stride(), B.numCols());
1125 TEUCHOS_TEST_FOR_EXCEPTION( B_Pvec.Multiply(
'T',
'N', alpha, A, mv, 0.0 )!=0,
EpetraMultiVecFailure,
1126 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvTransMv call to Epetra_MultiVector::Multiply() returned a nonzero value.");
1131 static void MvDot(
const Epetra_MultiVector& A,
const Epetra_MultiVector& B, std::vector<double> &b
1132 #ifdef HAVE_ANASAZI_EXPERIMENTAL
1137 #ifdef TEUCHOS_DEBUG 1138 TEUCHOS_TEST_FOR_EXCEPTION(A.NumVectors() != B.NumVectors(),std::invalid_argument,
1139 "Anasazi::MultiVecTraits<double,Epetra_MultiVector>::MvDot(A,B,b): A and B must have the same number of vectors.");
1140 TEUCHOS_TEST_FOR_EXCEPTION(b.size() != (
unsigned int)A.NumVectors(),std::invalid_argument,
1141 "Anasazi::MultiVecTraits<double,Epetra_MultiVector>::MvDot(A,B,b): b must have room for all dot products.");
1144 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvDot(A,B,b) call to Epetra_MultiVector::Dot() returned a nonzero value.");
1154 static void MvNorm(
const Epetra_MultiVector& mv, std::vector<double> &normvec )
1156 #ifdef TEUCHOS_DEBUG 1157 TEUCHOS_TEST_FOR_EXCEPTION((
unsigned int)mv.NumVectors() != normvec.size(),std::invalid_argument,
1158 "Anasazi::MultiVecTraits<double,Epetra_MultiVector>::MvNorm(mv,normvec): normvec must be the same size of mv.");
1161 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvNorm call to Epetra_MultiVector::Norm2() returned a nonzero value.");
1172 const std::vector<int>& index,
1173 Epetra_MultiVector& mv)
1175 const int inNumVecs = GetNumberVecs (A);
1176 const int outNumVecs = index.size();
1184 if (inNumVecs != outNumVecs)
1186 std::ostringstream os;
1187 os <<
"Belos::MultiVecTraits<double,Epetra_MultiVector>::" 1188 "SetBlock(A, mv, index = {";
1191 for (
int k = 0; k < outNumVecs - 1; ++k)
1192 os << index[k] <<
", ";
1193 os << index[outNumVecs-1];
1195 os <<
"}): A has only " << inNumVecs <<
" columns, but there are " 1196 << outNumVecs <<
" indices in the index vector.";
1197 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument, os.str());
1200 Teuchos::RCP<Epetra_MultiVector> mv_view = CloneViewNonConst (mv, index);
1205 Teuchos::RCP<const Epetra_MultiVector> A_view;
1206 if (outNumVecs == inNumVecs)
1207 A_view = Teuchos::rcpFromRef (A);
1209 A_view = CloneView (A, Teuchos::Range1D(0, outNumVecs - 1));
1222 SetBlock (
const Epetra_MultiVector& A,
1223 const Teuchos::Range1D& index,
1224 Epetra_MultiVector& mv)
1226 const int numColsA = A.NumVectors();
1227 const int numColsMv = mv.NumVectors();
1229 const bool validIndex = index.lbound() >= 0 && index.ubound() < numColsMv;
1231 const bool validSource = index.size() <= numColsA;
1233 if (! validIndex || ! validSource)
1235 std::ostringstream os;
1236 os <<
"Anasazi::MultiVecTraits<double, Epetra_MultiVector>::SetBlock" 1237 "(A, index=[" << index.lbound() <<
", " << index.ubound() <<
"], " 1239 TEUCHOS_TEST_FOR_EXCEPTION(index.lbound() < 0, std::invalid_argument,
1240 os.str() <<
"Range lower bound must be nonnegative.");
1241 TEUCHOS_TEST_FOR_EXCEPTION(index.ubound() >= numColsMv, std::invalid_argument,
1242 os.str() <<
"Range upper bound must be less than " 1243 "the number of columns " << numColsA <<
" in the " 1244 "'mv' output argument.");
1245 TEUCHOS_TEST_FOR_EXCEPTION(index.size() > numColsA, std::invalid_argument,
1246 os.str() <<
"Range must have no more elements than" 1247 " the number of columns " << numColsA <<
" in the " 1248 "'A' input argument.");
1249 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Should never get here!");
1256 Teuchos::RCP<Epetra_MultiVector> mv_view;
1257 if (index.lbound() == 0 && index.ubound()+1 == numColsMv)
1258 mv_view = Teuchos::rcpFromRef (mv);
1260 mv_view = CloneViewNonConst (mv, index);
1265 Teuchos::RCP<const Epetra_MultiVector> A_view;
1266 if (index.size() == numColsA)
1267 A_view = Teuchos::rcpFromRef (A);
1269 A_view = CloneView (A, Teuchos::Range1D(0, index.size()-1));
1282 Assign (
const Epetra_MultiVector& A,
1283 Epetra_MultiVector& mv)
1285 const int numColsA = GetNumberVecs (A);
1286 const int numColsMv = GetNumberVecs (mv);
1287 if (numColsA > numColsMv)
1289 std::ostringstream os;
1290 os <<
"Anasazi::MultiVecTraits<double, Epetra_MultiVector>::Assign" 1292 TEUCHOS_TEST_FOR_EXCEPTION(numColsA > numColsMv, std::invalid_argument,
1293 os.str() <<
"Input multivector 'A' has " 1294 << numColsA <<
" columns, but output multivector " 1295 "'mv' has only " << numColsMv <<
" columns.");
1296 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Should never get here!");
1299 Teuchos::RCP<Epetra_MultiVector> mv_view;
1300 if (numColsMv == numColsA)
1301 mv_view = Teuchos::rcpFromRef (mv);
1303 mv_view = CloneView (mv, Teuchos::Range1D(0, numColsA - 1));
1317 static void MvScale ( Epetra_MultiVector& mv,
double alpha )
1320 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvScale call to Epetra_MultiVector::Scale(mv,double alpha) returned a nonzero value.");
1325 static void MvScale ( Epetra_MultiVector& mv,
const std::vector<double>& alpha )
1328 int numvecs = mv.NumVectors();
1329 #ifdef TEUCHOS_DEBUG 1330 TEUCHOS_TEST_FOR_EXCEPTION( alpha.size() != (
unsigned int)numvecs, std::invalid_argument,
1331 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvScale(mv,vector alpha): size of alpha inconsistent with number of vectors in mv.")
1333 for (
int i=0; i<numvecs; i++) {
1335 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvScale call to Epetra_MultiVector::Scale() returned a nonzero value.");
1344 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvRandom call to Epetra_MultiVector::Random() returned a nonzero value.");
1349 static void MvInit( Epetra_MultiVector& mv,
double alpha = Teuchos::ScalarTraits<double>::zero() )
1352 "Anasazi::MultiVecTraits<double, Epetra_MultiVector>::MvInit call to Epetra_MultiVector::PutScalar() returned a nonzero value.");
1362 static void MvPrint(
const Epetra_MultiVector& mv, std::ostream& os )
1363 { os << mv << std::endl; }
1367 #if defined(HAVE_ANASAZI_TPETRA) && defined(HAVE_ANASAZI_TSQR) 1368 # if defined(HAVE_TPETRA_EPETRA) 1369 typedef Epetra::TsqrAdaptor tsqr_adaptor_type;
1375 # endif // defined(HAVE_TPETRA_EPETRA) 1376 #endif // defined(HAVE_ANASAZI_TPETRA) && defined(HAVE_ANASAZI_TSQR) 1404 static void Apply (
const Epetra_Operator& Op,
1405 const Epetra_MultiVector& x,
1406 Epetra_MultiVector& y )
1408 #ifdef TEUCHOS_DEBUG 1409 TEUCHOS_TEST_FOR_EXCEPTION(x.NumVectors() != y.NumVectors(),std::invalid_argument,
1410 "Anasazi::OperatorTraits<double,Epetra_MultiVector,Epetra_Operator>::Apply(Op,x,y): x and y must have the same number of columns.");
1412 int ret = Op.Apply(x,y);
1414 "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 .
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< 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 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.
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 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.
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 th...
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]...