46 const int numvecs,
const int stride)
47 : Epetra_MultiVector(Epetra_DataAccess::Copy, Map_in, array, stride, numvecs)
53 : Epetra_MultiVector(Map_in, numvecs)
59 const Epetra_MultiVector& P_vec,
60 const std::vector<int>& index )
61 : Epetra_MultiVector(CV, P_vec, &(const_cast<std::vector<int> &>(index))[0], index.size())
67 : Epetra_MultiVector(P_vec)
124 int numvecs = index.size();
126 std::vector<int> index2( numvecs );
127 for(
int i=0; i<numvecs; i++)
130 TEUCHOS_TEST_FOR_EXCEPTION( tmp_vec==NULL, std::invalid_argument,
"Anasazi::EpetraMultiVec::SetBlocks() cast of MultiVec<double> to EpetraMultiVec failed.");
132 temp_vec.
MvAddMv( 1.0, A_vec, 0.0, A_vec );
135 temp_vec.
MvAddMv( 1.0, A, 0.0, A );
146 const Teuchos::SerialDenseMatrix<int,double>& B,
double beta )
148 Epetra_LocalMap LocalMap(B.numRows(), 0, Map().Comm());
149 Epetra_MultiVector B_Pvec(Epetra_DataAccess::View, LocalMap, B.values(), B.stride(), B.numCols());
152 TEUCHOS_TEST_FOR_EXCEPTION( A_vec==NULL, std::invalid_argument,
"Anasazi::EpetraMultiVec::SetBlocks() cast of MultiVec<double> to EpetraMultiVec failed.");
154 TEUCHOS_TEST_FOR_EXCEPTION(
155 Multiply(
'N',
'N', alpha, *A_vec, B_Pvec, beta ) != 0,
156 EpetraMultiVecFailure,
"Anasazi::EpetraMultiVec::MvTimesMatAddMv() call to Epetra_MultiVec::Multiply() returned a nonzero value.");
169 TEUCHOS_TEST_FOR_EXCEPTION( A_vec==NULL, std::invalid_argument,
"Anasazi::EpetraMultiVec::MvAddMv() cast of MultiVec<double> to EpetraMultiVec failed.");
171 TEUCHOS_TEST_FOR_EXCEPTION( B_vec==NULL, std::invalid_argument,
"Anasazi::EpetraMultiVec::MvAddMv() cast of MultiVec<double> to EpetraMultiVec failed.");
173 TEUCHOS_TEST_FOR_EXCEPTION(
174 Update( alpha, *A_vec, beta, *B_vec, 0.0 ) != 0,
175 EpetraMultiVecFailure,
"Anasazi::EpetraMultiVec::MvAddMv() call to Epetra_MultiVec::Update() returned a nonzero value.");
185 Teuchos::SerialDenseMatrix<int,double>& B
186 #ifdef HAVE_ANASAZI_EXPERIMENTAL
194 Epetra_LocalMap LocalMap(B.numRows(), 0, Map().Comm());
195 Epetra_MultiVector B_Pvec(Epetra_DataAccess::View, LocalMap, B.values(), B.stride(), B.numCols());
197 TEUCHOS_TEST_FOR_EXCEPTION(
198 B_Pvec.Multiply(
'T',
'N', alpha, *A_vec, *
this, 0.0 ) != 0,
199 EpetraMultiVecFailure,
"Anasazi::EpetraMultiVec::MvTransMv() call to Epetra_MultiVec::Multiply() returned a nonzero value.");
210 #ifdef HAVE_ANASAZI_EXPERIMENTAL
216 TEUCHOS_TEST_FOR_EXCEPTION( A_vec==NULL, std::invalid_argument,
"Anasazi::EpetraMultiVec::MvDot() cast of MultiVec<double> to EpetraMultiVec failed.");
218 if (( (
int)b.size() >= A_vec->NumVectors() ) ) {
219 TEUCHOS_TEST_FOR_EXCEPTION(
220 this->Dot( *A_vec, &b[0] ) != 0,
221 EpetraMultiVecFailure,
"Anasazi::EpetraMultiVec::MvDot() call to Epetra_MultiVec::Dot() returned a nonzero value.");
233 int numvecs = this->NumVectors();
234 TEUCHOS_TEST_FOR_EXCEPTION( (
int)alpha.size() != numvecs, std::invalid_argument,
235 "Anasazi::EpetraMultiVec::MvScale() alpha argument size was inconsistent with number of vectors in mv.");
237 std::vector<int> tmp_index( 1, 0 );
238 for (
int i=0; i<numvecs; i++) {
239 Epetra_MultiVector temp_vec(Epetra_DataAccess::View, *
this, &tmp_index[0], 1);
240 TEUCHOS_TEST_FOR_EXCEPTION(
241 temp_vec.Scale( alpha[i] ) != 0,
242 EpetraMultiVecFailure,
"Anasazi::EpetraMultiVec::MvScale() call to Epetra_MultiVec::Scale() returned a nonzero value.");
277 TEUCHOS_TEST_FOR_EXCEPTION( vec_X==NULL, std::invalid_argument,
"Anasazi::EpetraOp::Apply() cast of MultiVec<double> to Epetra_MultiVector failed.");
278 TEUCHOS_TEST_FOR_EXCEPTION( vec_Y==NULL, std::invalid_argument,
"Anasazi::EpetraOp::Apply() cast of MultiVec<double> to Epetra_MultiVector failed.");
280 int info = Epetra_Op->Apply( *vec_X, *vec_Y );
282 "Anasazi::EpetraOp::Apply(): Error returned from Epetra_Operator::Apply()" );
296 const Teuchos::RCP<Epetra_Operator> &MOp,
298 : isAInverse( isAInverse_ ), Epetra_AOp(AOp), Epetra_MOp(MOp)
317 Epetra_MultiVector temp_Y(*vec_Y);
319 TEUCHOS_TEST_FOR_EXCEPTION( vec_X==NULL, std::invalid_argument,
"Anasazi::EpetraGenOp::Apply() cast of MultiVec<double> to Epetra_MultiVector failed.");
320 TEUCHOS_TEST_FOR_EXCEPTION( vec_Y==NULL, std::invalid_argument,
"Anasazi::EpetraGenOp::Apply() cast of MultiVec<double> to Epetra_MultiVector failed.");
326 info = Epetra_MOp->Apply( *vec_X, temp_Y );
328 "Anasazi::EpetraGenOp::Apply(): Error returned from Epetra_Operator::Apply()" );
331 info = Epetra_AOp->ApplyInverse( temp_Y, *vec_Y );
334 info = Epetra_AOp->Apply( temp_Y, *vec_Y );
337 "Anasazi::EpetraGenOp::Apply(): Error returned from Epetra_Operator::Apply()" );
349 info = Epetra_MOp->Apply( X, temp_Y );
350 if (info!=0)
return info;
354 info = Epetra_AOp->ApplyInverse( temp_Y, Y );
356 info = Epetra_AOp->Apply( temp_Y, Y );
371 info = Epetra_AOp->Apply( X, temp_Y );
373 info = Epetra_AOp->ApplyInverse( X, temp_Y );
374 if (info!=0)
return info;
377 info = Epetra_MOp->ApplyInverse( temp_Y, Y );
393 : Epetra_Op(Op), isTrans_(isTrans)
410 Epetra_MultiVector* temp_vec =
new Epetra_MultiVector(
411 (isTrans_) ? Epetra_Op->OperatorDomainMap()
412 : Epetra_Op->OperatorRangeMap(),
413 vec_X->NumVectors() );
415 TEUCHOS_TEST_FOR_EXCEPTION( vec_X==NULL , std::invalid_argument,
"Anasazi::EpetraSymOp::Apply() cast of MultiVec<double> to Epetra_MultiVector failed.");
416 TEUCHOS_TEST_FOR_EXCEPTION( vec_Y==NULL , std::invalid_argument,
"Anasazi::EpetraSymOp::Apply() cast of MultiVec<double> to Epetra_MultiVector failed.");
417 TEUCHOS_TEST_FOR_EXCEPTION( temp_vec==NULL, std::invalid_argument,
"Anasazi::EpetraSymOp::Apply() allocation Epetra_MultiVector failed.");
424 info = Epetra_Op->SetUseTranspose( isTrans_ );
428 "Anasazi::EpetraSymOp::Apply(): Error returned from Epetra_Operator::Apply()" );
434 info=Epetra_Op->Apply( *vec_X, *temp_vec );
438 "Anasazi::EpetraSymOp::Apply(): Error returned from Epetra_Operator::Apply()" );
442 info=Epetra_Op->SetUseTranspose( !isTrans_ );
446 "Anasazi::EpetraSymOp::Apply(): Error returned from Epetra_Operator::Apply()" );
450 info=Epetra_Op->Apply( *temp_vec, *vec_Y );
454 "Anasazi::EpetraSymOp::Apply(): Error returned from Epetra_Operator::Apply()" );
458 info=Epetra_Op->SetUseTranspose(
false );
461 "Anasazi::EpetraSymOp::Apply(): Error returned from Epetra_Operator::Apply()" );
473 info=Epetra_Op->SetUseTranspose( isTrans_ );
474 if (info!=0) {
return info; }
479 info=Epetra_Op->Apply( X, temp_vec );
480 if (info!=0) {
return info; }
483 info=Epetra_Op->SetUseTranspose( !isTrans_ );
484 if (info!=0) {
return info; }
487 info=Epetra_Op->Apply( temp_vec, Y );
488 if (info!=0) {
return info; }
491 info=Epetra_Op->SetUseTranspose(
false );
504 info=Epetra_Op->SetUseTranspose( !isTrans_ );
505 if (info!=0) {
return info; }
510 info=Epetra_Op->ApplyInverse( X, temp_vec );
511 if (info!=0) {
return info; }
514 info=Epetra_Op->SetUseTranspose( isTrans_ );
515 if (info!=0) {
return info; }
518 info=Epetra_Op->Apply( temp_vec, Y );
519 if (info!=0) {
return info; }
522 info=Epetra_Op->SetUseTranspose(
false );
537 : Epetra_MV(MV), isTrans_(isTrans)
540 MV_localmap = Teuchos::rcp(
new Epetra_LocalMap( Epetra_MV->NumVectors(), 0, Epetra_MV->Map().Comm() ) );
542 MV_blockmap = Teuchos::rcp( &Epetra_MV->Map(), false );
557 Epetra_MultiVector temp_vec( *MV_localmap, temp_X.
GetNumberVecs() );
560 info = temp_vec.Multiply(
'T',
'N', 1.0, *Epetra_MV, *vec_X, 0.0 );
562 "Anasazi::EpetraSymMVOp::Apply(): Error returned from Epetra_MultiVector::Multiply()" );
565 info = vec_Y->Multiply(
'N',
'N', 1.0, *Epetra_MV, temp_vec, 0.0 );
567 "Anasazi::EpetraSymMVOp::Apply(): Error returned from Epetra_MultiVector::Multiply()" );
571 Epetra_MultiVector temp_vec( *MV_blockmap, temp_X.
GetNumberVecs() );
574 info = temp_vec.Multiply(
'N',
'N', 1.0, *Epetra_MV, *vec_X, 0.0 );
576 "Anasazi::EpetraSymMVOp::Apply(): Error returned from Epetra_MultiVector::Multiply()" );
579 info = vec_Y->Multiply(
'T',
'N', 1.0, *Epetra_MV, temp_vec, 0.0 );
581 "Anasazi::EpetraSymMVOp::Apply(): Error returned from Epetra_MultiVector::Multiply()" );
595 const Teuchos::RCP<Epetra_Operator> &OP )
596 : Epetra_MV(MV), Epetra_OP(OP)
598 MV_blockmap = Teuchos::rcp( &Epetra_MV->Map(), false );
599 Epetra_WMV = Teuchos::rcp(
new Epetra_MultiVector( *MV_blockmap, Epetra_MV->NumVectors() ) );
600 Epetra_OP->Apply( *Epetra_MV, *Epetra_WMV );
613 Epetra_MultiVector temp_vec( *MV_blockmap, temp_X.
GetNumberVecs() );
616 info = temp_vec.Multiply(
'N',
'N', 1.0, *Epetra_WMV, *vec_X, 0.0 );
618 "Anasazi::EpetraWSymMVOp::Apply(): Error returned from Epetra_MultiVector::Multiply()" );
621 info = vec_Y->Multiply(
'T',
'N', 1.0, *Epetra_MV, temp_vec, 0.0 );
623 "Anasazi::EpetraWSymMVOp::Apply(): Error returned from Epetra_MultiVector::Multiply()" );
636 const Teuchos::RCP<Epetra_Operator> &OP )
637 : Epetra_MV(MV), Epetra_OP(OP)
639 MV_blockmap = Teuchos::rcp( &Epetra_MV->Map(), false );
640 Epetra_WMV = Teuchos::rcp(
new Epetra_MultiVector( *MV_blockmap, Epetra_MV->NumVectors() ) );
641 Epetra_OP->Apply( *Epetra_MV, *Epetra_WMV );
654 Epetra_MultiVector temp_vec( *MV_blockmap, temp_X.
GetNumberVecs() );
657 info = temp_vec.Multiply(
'N',
'N', 1.0, *Epetra_WMV, *vec_X, 0.0 );
659 "Anasazi::EpetraW2SymMVOp::Apply(): Error returned from Epetra_MultiVector::Multiply()" );
662 info = vec_Y->Multiply(
'T',
'N', 1.0, *Epetra_WMV, temp_vec, 0.0 );
664 "Anasazi::EpetraW2SymMVOp::Apply(): Error returned from Epetra_MultiVector::Multiply()" );
EpetraMultiVecAccessor is an interfaceto allow any Anasazi::MultiVec implementation that is based on ...
void Apply(const MultiVec< double > &X, MultiVec< double > &Y) const
Apply method [inherited from Anasazi::Operator class].
void Apply(const MultiVec< double > &X, MultiVec< double > &Y) const
Apply method.
void MvTransMv(double alpha, const MultiVec< double > &A, Teuchos::SerialDenseMatrix< int, double > &B) const
Compute a dense matrix B through the matrix-matrix multiply .
MultiVec< double > * CloneViewNonConst(const std::vector< int > &index)
Creates a new EpetraMultiVec that shares the selected contents of *this.
void SetBlock(const MultiVec< double > &A, const std::vector< int > &index)
Copy the vectors in A to a set of vectors in *this.
int ApplyInverse(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const
Apply inverse method [inherited from Epetra_Operator class].
void Apply(const MultiVec< double > &X, MultiVec< double > &Y) const
Apply method [inherited from Anasazi::Operator class].
~EpetraGenOp()
Destructor.
Namespace Anasazi contains the classes, structs, enums and utilities used by the Anasazi package...
EpetraSymMVOp(const Teuchos::RCP< const Epetra_MultiVector > &MV, bool isTrans=false)
Basic constructor for applying operator [default] or .
void MvDot(const MultiVec< double > &A, std::vector< double > &b) const
Compute a vector b where the components are the individual dot-products, i.e. where A[i] is the i-th...
void MvTimesMatAddMv(double alpha, const MultiVec< double > &A, const Teuchos::SerialDenseMatrix< int, double > &B, double beta)
Update *this with .
ConjType
Enumerated types used to specify conjugation arguments.
const MultiVec< double > * CloneView(const std::vector< int > &index) const
Creates a new EpetraMultiVec that shares the selected contents of *this.
virtual int GetNumberVecs() const =0
The number of vectors (i.e., columns) in the multivector.
MultiVec< double > * CloneCopy() const
Creates a new EpetraMultiVec and copies contents of *this into the new vector (deep copy)...
EpetraSymOp(const Teuchos::RCP< Epetra_Operator > &Op, bool isTrans=false)
Basic constructor for applying operator [default] or .
int ApplyInverse(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const
Apply inverse method [inherited from Epetra_Operator class].
MultiVec< double > * Clone(const int numvecs) const
Creates a new empty EpetraMultiVec containing numvecs columns.
const Epetra_Map & OperatorDomainMap() const
Returns the Epetra_Map object associated with the domain of this operator.
void MvAddMv(double alpha, const MultiVec< double > &A, double beta, const MultiVec< double > &B)
Replace *this with .
~EpetraSymOp()
Destructor.
void MvScale(double alpha)
Scale each element of the vectors in *this with alpha.
void Apply(const MultiVec< double > &X, MultiVec< double > &Y) const
Apply method.
EpetraW2SymMVOp(const Teuchos::RCP< const Epetra_MultiVector > &MV, const Teuchos::RCP< Epetra_Operator > &OP)
Basic constructor for applying operator .
EpetraWSymMVOp(const Teuchos::RCP< const Epetra_MultiVector > &MV, const Teuchos::RCP< Epetra_Operator > &OP)
Basic constructor for applying operator .
EpetraMultiVecFailure is thrown when a return value from an Epetra call on an Epetra_MultiVector is n...
EpetraGenOp(const Teuchos::RCP< Epetra_Operator > &AOp, const Teuchos::RCP< Epetra_Operator > &MOp, bool isAInverse=true)
Basic constructor for applying operator [default] or .
void Apply(const MultiVec< double > &X, MultiVec< double > &Y) const
This method takes the Anasazi::MultiVec X and applies the operator to it resulting in the Anasazi::Mu...
void Apply(const MultiVec< double > &X, MultiVec< double > &Y) const
Apply method.
EpetraMultiVec(const Epetra_BlockMap &Map_in, const int numvecs)
Basic EpetraMultiVec constructor.
EpetraOp(const Teuchos::RCP< Epetra_Operator > &Op)
Basic constructor. Accepts reference-counted pointer to an Epetra_Operator.
Declarations of Anasazi multi-vector and operator classes using Epetra_MultiVector and Epetra_Operato...
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.