RCP<const Epetra_Comm> EpetraOperatorWrapper::getEpetraComm(const LinearOpBase<double>& thyraOp) { using Teuchos::rcp; using Teuchos::rcp_dynamic_cast; using Teuchos::SerialComm; #ifdef HAVE_MPI using Teuchos::MpiComm; #endif RCP<const VectorSpaceBase<double> > vs = thyraOp.range(); const RCP<const ProductVectorSpaceBase<double> > prod_vs = rcp_dynamic_cast<const ProductVectorSpaceBase<double> >(vs); if (nonnull(prod_vs)) vs = prod_vs->getBlock(0); const RCP<const SpmdVectorSpaceBase<double> > spmd_vs = rcp_dynamic_cast<const SpmdVectorSpaceBase<double> >(vs, true); return get_Epetra_Comm(*spmd_vs->getComm()); }
void assertLinearOpTimesLinearOpNames( const std::string &funcName, const LinearOpBase<Scalar> &M1, const EOpTransp M1_trans_in, const std::string &M1_name, const LinearOpBase<Scalar> &M2, const EOpTransp M2_trans_in, const std::string &M2_name ) { const EOpTransp M1_trans = real_trans(M1_trans_in); const EOpTransp M2_trans = real_trans(M2_trans_in); std::ostringstream headeross; headeross << funcName << ":\n\n" << "Spaces check failed for " << "(" << M1_name << ")" << ( M1_trans == NOTRANS ? "" : "^T" ) << " * " << "(" << M2_name << ")" << ( M2_trans == NOTRANS ? "" : "^T" ) << " where:\n\n" << " " << M1_name << ": " << M1.description() << "\n\n" << " " << M2_name << ": " << M2.description(); const std::string &header = headeross.str(); if ( M1_trans == NOTRANS && M2_trans == NOTRANS ) { THYRA_ASSERT_VEC_SPACES_NAMES( header, *M1.domain(), M1_name + ".domain()", *M2.range(), M2_name + ".range()" ); } else if ( M1_trans == NOTRANS && M2_trans == TRANS ) { THYRA_ASSERT_VEC_SPACES_NAMES( header, *M1.domain(), M1_name + ".domain()", *M2.domain(), M2_name + ".domain()" ); } else if ( M1_trans == TRANS && M2_trans == NOTRANS ) { THYRA_ASSERT_VEC_SPACES_NAMES( header, *M1.domain(), M1_name + ".range()", *M2.range(), M2_name + ".range()" ); } else if ( M1_trans == TRANS && M2_trans == TRANS ) { THYRA_ASSERT_VEC_SPACES_NAMES( header, *M1.domain(), M1_name + ".range()", *M2.range(), M2_name + ".domain()" ); } else { TEUCHOS_TEST_FOR_EXCEPTION( true, std::logic_error, header << "\n\n" << "Error, invalid value for trasponse enums!" ); } }
void setDefaultObjectLabel( const LinearOpBase<Scalar> &fwdOp, const Ptr<LinearOpWithSolveBase<Scalar> > &Op ) { const std::string OpLabel = Op->getObjectLabel(); const std::string fwdOpLabel = fwdOp.getObjectLabel(); if ( !OpLabel.length() && fwdOpLabel.length() ) Op->setObjectLabel(fwdOpLabel); }
void Thyra::apply( const LinearOpBase<Scalar> &M, const EOpTransp M_trans, const MultiVectorBase<Scalar> &X, const Ptr<MultiVectorBase<Scalar> > &Y, const Scalar alpha, const Scalar beta ) { M.apply(M_trans, X, Y, alpha, beta); }
void assertLinearOpPlusLinearOpNames( const std::string &funcName, const LinearOpBase<Scalar> &M1, const EOpTransp M1_trans_in, const std::string &M1_name, const LinearOpBase<Scalar> &M2, const EOpTransp M2_trans_in, const std::string &M2_name ) { const EOpTransp M1_trans = real_trans(M1_trans_in); const EOpTransp M2_trans = real_trans(M2_trans_in); std::ostringstream headeross; headeross << funcName << ":\n\n" << "Spaces check failed for " << "(" << M1_name << ")" << ( M1_trans == NOTRANS ? "" : "^T" ) << " + " << "(" << M2_name << ")" << ( M2_trans == NOTRANS ? "" : "^T" ) << " where:\n\n" << " " << M1_name << ": " << M1.description() << "\n\n" << " " << M2_name << ": " << M2.description(); const std::string &header = headeross.str(); if ( M1_trans == M2_trans ) { THYRA_ASSERT_VEC_SPACES_NAMES( header, *M1.range(), M1_name + ".range()", *M2.range(), M2_name + ".range()" ); THYRA_ASSERT_VEC_SPACES_NAMES( header, *M1.domain(), M1_name + ".domain()", *M2.domain(), M2_name + ".domain()" ); } else { // M1_trans != M2_trans THYRA_ASSERT_VEC_SPACES_NAMES( header, *M1.domain(), M1_name + ".domain()", *M2.range(), M2_name + ".range()" ); THYRA_ASSERT_VEC_SPACES_NAMES( header, *M1.range(), M1_name + ".range()", *M2.domain(), M2_name + ".domain()" ); } }
void DefaultBlockedLinearOp<Scalar>::setBlockSpaces( const int i, const int j, const LinearOpBase<Scalar> &block ) { using Teuchos::toString; assertBlockFillIsActive(true); assertBlockRowCol(i,j); // Validate that if the vector space block is already set that it is // compatible with the block that is being set. if( i < numRowBlocks_ && j < numColBlocks_ ) { #ifdef TEUCHOS_DEBUG RCP<const VectorSpaceBase<Scalar> > rangeBlock = ( productRange_.get() ? productRange_->getBlock(i) : rangeBlocks_[i] ), domainBlock = ( productDomain_.get() ? productDomain_->getBlock(j) : domainBlocks_[j] ); if(rangeBlock.get()) { THYRA_ASSERT_VEC_SPACES_NAMES( "DefaultBlockedLinearOp<Scalar>::setBlockSpaces(i,j,block):\n\n" "Adding block: " + block.description(), *rangeBlock,("(*productRange->getBlock("+toString(i)+"))"), *block.range(),("(*block["+toString(i)+","+toString(j)+"].range())") ); } if(domainBlock.get()) { THYRA_ASSERT_VEC_SPACES_NAMES( "DefaultBlockedLinearOp<Scalar>::setBlockSpaces(i,j,block):\n\n" "Adding block: " + block.description(), *domainBlock,("(*productDomain->getBlock("+toString(j)+"))"), *block.domain(),("(*block["+toString(i)+","+toString(j)+"].domain())") ); } #endif // TEUCHOS_DEBUG } // Add spaces missing range and domain space blocks if we are doing a // flexible fill (otherwise these loops will not be executed) for( int k = numRowBlocks_; k <= i; ++k ) rangeBlocks_.push_back(Teuchos::null); for( int k = numColBlocks_; k <= j; ++k ) domainBlocks_.push_back(Teuchos::null); // Set the incoming range and domain blocks if not already set if(!productRange_.get()) { if(!rangeBlocks_[i].get()) rangeBlocks_[i] = block.range().assert_not_null(); if(!domainBlocks_[j].get()) { domainBlocks_[j] = block.domain().assert_not_null(); } } // Update the current number of row and columns blocks if doing a flexible // fill. if(!Ops_.size()) { numRowBlocks_ = rangeBlocks_.size(); numColBlocks_ = domainBlocks_.size(); } }