72 numOp < 1, std::invalid_argument
73 ,
"ProductOperator::initialize(...): Error!"
80 std::copy( op, op + numOp,
Op_.begin() );
81 std::copy( opTrans, opTrans + numOp,
Op_trans_.begin() );
82 std::copy( opInverse, opInverse + numOp,
Op_inverse_.begin() );
98 (op != NULL || opTrans != NULL || opInverse!=NULL) && numOp==NULL
99 ,std::invalid_argument
100 ,
"ProductOperator::uninitialize(...): Error!"
105 if(op) std::copy(
Op_.begin(),
Op_.end(), op );
129 const int err = ! applyInverse_k ?
Op_[k]->Apply(X_k,*Y_k) :
Op_[k]->ApplyInverse(X_k,*Y_k);
132 err!=0, std::runtime_error,
"ProductOperator::applyConstituent(...): Error,"
133 " Op["<<k<<
"]." << (!applyInverse_k?
"Apply":
"ApplyInverse") <<
"(...) "
134 "returned err = " << err <<
" with Op["<<k<<
"].UseTranspose() = "<<
150 const int numOp = this->
num_Op();
158 for(
int k = numOp-1; k >= 0; --k ) {
168 for(
int k = 0; k <= numOp-1; ++k ) {
180 const int numOp = this->
num_Op();
188 for(
int k = 0; k <= numOp-1; ++k ) {
198 for(
int k = numOp-1; k >= 0; --k ) {
235 return Op_.front()->OperatorRangeMap().Comm();
243 ?
Op_.back()->OperatorDomainMap()
244 :
Op_.back()->OperatorRangeMap()
253 ?
Op_.front()->OperatorRangeMap()
254 :
Op_.front()->OperatorDomainMap()
262 const int numOp = this->
num_Op ();
283 for (
int k = numOp-1; k >= 1; --k) {
308 for (
int k = 0; k <= numOp - 2; ++k) {
virtual int SetUseTranspose(bool UseTranspose)=0
const Epetra_Map & OperatorDomainMap() const
bool UseTranspose() const
int SetUseTranspose(bool UseTranspose)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
void initialize(const int num_Op, const Teuchos::RCP< const Epetra_Operator > Op[], const Teuchos::ETransp Op_trans[], const EApplyMode Op_inverse[])
Setup with constituent operators.
const char * Label() const
int ApplyInverse(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const
void initializeTempVecs(bool applyInverse) const
ProductOperator()
Construct to uninitialized.
const Epetra_Comm & Comm() const
int num_Op() const
Return the number of aggregate opeators.
const Epetra_Map & OperatorRangeMap() const
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
virtual bool UseTranspose() const =0
int Apply(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const
void assertInitialized() const
void uninitialize(int *num_Op, Teuchos::RCP< const Epetra_Operator > Op[], Teuchos::ETransp Op_trans[], EApplyMode p_inverse[])
Set to an uninitialized state and wipe out memory.
void applyConstituent(const int k, Teuchos::ETransp Op_trans, EApplyMode Op_inverse, const Epetra_MultiVector &X_k, Epetra_MultiVector *Y_k) const
Apply the kth aggregate operator M[k] correctly.