20 #ifndef BELOS_THYRA_ADAPTER_HPP 
   21 #define BELOS_THYRA_ADAPTER_HPP 
   23 #include "Stratimikos_Config.h" 
   24 #include "BelosConfigDefs.hpp" 
   25 #include "BelosMultiVecTraits.hpp" 
   26 #include "BelosOperatorTraits.hpp" 
   28 #include <Thyra_DetachedMultiVectorView.hpp> 
   29 #include <Thyra_MultiVectorBase.hpp> 
   30 #include <Thyra_MultiVectorStdOps.hpp> 
   31 #ifdef HAVE_BELOS_TSQR 
   33 #endif // HAVE_BELOS_TSQR 
   35 #ifdef HAVE_STRATIMIKOS_BELOS_TIMERS 
   38 # define STRATIMIKOS_TIME_MONITOR(NAME) \ 
   39   Teuchos::TimeMonitor tM(*Teuchos::TimeMonitor::getNewTimer(std::string(NAME))) 
   43 # define STRATIMIKOS_TIME_MONITOR(NAME) 
   61   template<
class ScalarType>
 
   62   class MultiVecTraits< ScalarType, Thyra::MultiVectorBase<ScalarType> >
 
   65     typedef Thyra::MultiVectorBase<ScalarType> 
TMVB;
 
   90       int numvecs = mv.domain()->dim();
 
   94       Thyra::assign(cc.
ptr(), mv);
 
  105       int numvecs = index.size();
 
  111       Thyra::assign(cc.
ptr(), *view);
 
  118       const int numVecs = index.
size();
 
  124       Thyra::assign (cc.
ptr(), *view);
 
  135       int numvecs = index.size();
 
  151       for (
int i=0; i<numvecs; i++) {
 
  152         if (lb+i != index[i]) contig = 
false;
 
  157         const Thyra::Range1D rng(lb,lb+numvecs-1);
 
  159         cc = mv.subView(rng);
 
  163         cc = mv.subView(index);
 
  176       return mv.subView (index);
 
  187       int numvecs = index.size();
 
  203       for (
int i=0; i<numvecs; i++) {
 
  204         if (lb+i != index[i]) contig = 
false;
 
  209         const Thyra::Range1D rng(lb,lb+numvecs-1);
 
  211         cc = mv.subView(rng);
 
  215         cc = mv.subView(index);
 
  228       return mv.subView (index);
 
  238       return Teuchos::as<ptrdiff_t>(mv.range()->dim());
 
  243     { 
return mv.domain()->dim(); }
 
  254          const ScalarType beta, 
TMVB& mv )
 
  256       using Teuchos::arrayView; 
using Teuchos::arcpFromArrayView;
 
  262       if ((m == 1) && (n == 1)) {
 
  263         using Teuchos::tuple; 
using Teuchos::ptrInArg; 
using Teuchos::inoutArg;
 
  264         const ScalarType alphaNew = alpha * B(0, 0);
 
  265         Thyra::linear_combination<ScalarType>(tuple(alphaNew)(), tuple(ptrInArg(A))(), beta, inoutArg(mv));
 
  268         auto vs = A.domain();
 
  271           B_thyra = vs->createCachedMembersView(
 
  277         Thyra::apply<ScalarType>(A, Thyra::NOTRANS, *B_thyra, Teuchos::outArg(mv), alpha, beta);
 
  284                          const ScalarType beta,  
const TMVB& 
B, 
TMVB& mv )
 
  286       using Teuchos::tuple; 
using Teuchos::ptrInArg; 
using Teuchos::inoutArg;
 
  289       Thyra::linear_combination<ScalarType>(
 
  299         Thyra::scale(alpha, Teuchos::inoutArg(mv));
 
  304     static void MvScale (
TMVB& mv, 
const std::vector<ScalarType>& alpha)
 
  308       for (
unsigned int i=0; i<alpha.size(); i++) {
 
  309         Thyra::scale<ScalarType> (alpha[i], mv.col(i).ptr());
 
  318       using Teuchos::arrayView; 
using Teuchos::arcpFromArrayView;
 
  322       int m = A.domain()->dim();
 
  323       int n = mv.domain()->dim();
 
  324       auto vs = A.domain();
 
  327         B_thyra = vs->createCachedMembersView(
 
  334       Thyra::apply<ScalarType>(A, Thyra::CONJTRANS, mv, B_thyra.
ptr(), alpha);
 
  344         Thyra::dots(mv, A, Teuchos::arrayViewFromVector(b));
 
  355     static void MvNorm( 
const TMVB& mv, std::vector<magType>& normvec,
 
  356       NormType type = TwoNorm ) {
 
  360         Thyra::norms_2(mv, Teuchos::arrayViewFromVector(normvec));
 
  361       else if(type == OneNorm)
 
  362         Thyra::norms_1(mv, Teuchos::arrayViewFromVector(normvec));
 
  363       else if(type == InfNorm)
 
  364         Thyra::norms_inf(mv, Teuchos::arrayViewFromVector(normvec));
 
  367                            "Belos::MultiVecTraits::MvNorm (Thyra specialization): " 
  368                            "invalid norm type. Must be either TwoNorm, OneNorm or InfNorm");
 
  381       int numvecs = index.size();
 
  382       std::vector<int> indexA(numvecs);
 
  383       int numAcols = A.domain()->dim();
 
  384       for (
int i=0; i<numvecs; i++) {
 
  389       if ( numAcols < numvecs ) {
 
  394       else if ( numAcols > numvecs ) {
 
  396         indexA.resize( numAcols );
 
  403       Thyra::assign(reldest.
ptr(), *relsource);
 
  409       const int numColsA = A.domain()->dim();
 
  410       const int numColsMv = mv.domain()->dim();
 
  412       const bool validIndex = index.
lbound() >= 0 && index.
ubound() < numColsMv;
 
  414       const bool validSource = index.
size() <= numColsA;
 
  416       if (! validIndex || ! validSource)
 
  418           std::ostringstream os;
 
  419           os << 
"Belos::MultiVecTraits<Scalar, Thyra::MultiVectorBase<Scalar> " 
  420             ">::SetBlock(A, [" << index.
lbound() << 
", " << index.
ubound()
 
  423                              os.str() << 
"Range lower bound must be nonnegative.");
 
  425                              os.str() << 
"Range upper bound must be less than " 
  426                              "the number of columns " << numColsA << 
" in the " 
  427                              "'mv' output argument.");
 
  429                              os.str() << 
"Range must have no more elements than" 
  430                              " the number of columns " << numColsA << 
" in the " 
  431                              "'A' input argument.");
 
  439       if (index.
lbound() == 0 && index.
ubound()+1 == numColsMv)
 
  440         mv_view = Teuchos::rcpFromRef (mv); 
 
  442         mv_view = mv.subView (index);
 
  448       if (index.
size() == numColsA)
 
  449         A_view = Teuchos::rcpFromRef (A); 
 
  454       Thyra::assign(mv_view.
ptr(), *A_view);
 
  462       const int numColsA = A.domain()->dim();
 
  463       const int numColsMv = mv.domain()->dim();
 
  464       if (numColsA > numColsMv)
 
  466           std::ostringstream os;
 
  467           os << 
"Belos::MultiVecTraits<Scalar, Thyra::MultiVectorBase<Scalar>" 
  468             " >::Assign(A, mv): ";
 
  470                              os.str() << 
"Input multivector 'A' has " 
  471                              << numColsA << 
" columns, but output multivector " 
  472                              "'mv' has only " << numColsMv << 
" columns.");
 
  476       if (numColsA == numColsMv) {
 
  477         Thyra::assign (Teuchos::outArg (mv), A);
 
  481         Thyra::assign (mv_view.
ptr(), A);
 
  491       Thyra::randomize<ScalarType>(
 
  494         Teuchos::outArg(mv));
 
  501       Thyra::assign (Teuchos::outArg (mv), alpha);
 
  516 #ifdef HAVE_BELOS_TSQR 
  523 #endif // HAVE_BELOS_TSQR 
  539   template<
class ScalarType>
 
  540   class OperatorTraits <ScalarType,
 
  541                         Thyra::MultiVectorBase<ScalarType>,
 
  542                         Thyra::LinearOpBase<ScalarType> >
 
  545     typedef Thyra::MultiVectorBase<ScalarType> 
TMVB;
 
  546     typedef Thyra::LinearOpBase<ScalarType>    
TLOB;
 
  568            ETrans trans = NOTRANS)
 
  570       Thyra::EOpTransp whichOp;
 
  578         whichOp = Thyra::NOTRANS;
 
  579       else if (trans == 
TRANS)
 
  580         whichOp = Thyra::TRANS;
 
  582         whichOp = Thyra::CONJTRANS;
 
  585                            "Belos::OperatorTraits::Apply (Thyra specialization): " 
  586                            "'trans' argument must be neither NOTRANS=" << 
NOTRANS 
  588                            << 
", but instead has an invalid value of " << trans << 
".");
 
  589       Thyra::apply<ScalarType>(Op, whichOp, x, Teuchos::outArg(y));
 
  604       return Op.opSupported (Thyra::TRANS) &&
 
  605         (! STS::isComplex || Op.opSupported (Thyra::CONJTRANS));
 
Thyra::LinearOpBase< ScalarType > TLOB
 
static int GetNumberVecs(const TMVB &mv)
Obtain the number of vectors in mv. 
 
Thyra::MultiVectorBase< ScalarType > TMVB
 
static ptrdiff_t GetGlobalLength(const TMVB &mv)
Obtain the std::vector length of mv. 
 
static void MvPrint(const TMVB &mv, std::ostream &os)
Print the mv multi-std::vector to the os output stream. 
 
Thyra::MultiVectorBase< ScalarType > TMVB
 
Stub adaptor from Thyra::MultiVectorBase to TSQR. 
 
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
 
Teuchos::ScalarTraits< ScalarType > ST
 
static Teuchos::RCP< TMVB > CloneCopy(const TMVB &mv, const std::vector< int > &index)
Creates a new MultiVectorBase and copies the selected contents of mv into the new std::vector (deep c...
 
static void Assign(const TMVB &A, TMVB &mv)
 
static void MvTransMv(const ScalarType alpha, const TMVB &A, const TMVB &mv, Teuchos::SerialDenseMatrix< int, ScalarType > &B)
Compute a dense matrix B through the matrix-matrix multiply . 
 
static void MvScale(TMVB &mv, const std::vector< ScalarType > &alpha)
Scale each element of the i-th vector in *this with alpha[i]. 
 
static void MvDot(const TMVB &mv, const TMVB &A, std::vector< ScalarType > &b)
Compute a std::vector b where the components are the individual dot-products of the i-th columns of A...
 
ST::magnitudeType magType
 
static Teuchos::RCP< TMVB > CloneCopy(const TMVB &mv)
Creates a new MultiVectorBase and copies contents of mv into the new std::vector (deep copy)...
 
static void MvScale(TMVB &mv, const ScalarType alpha)
Scale each element of the vectors in *this with alpha. 
 
static void MvTimesMatAddMv(const ScalarType alpha, const TMVB &A, const Teuchos::SerialDenseMatrix< int, ScalarType > &B, const ScalarType beta, TMVB &mv)
Update mv with . 
 
static Teuchos::RCP< const TMVB > CloneView(const TMVB &mv, const std::vector< int > &index)
Creates a new const MultiVectorBase that shares the selected contents of mv (shallow copy)...
 
static Teuchos::RCP< TMVB > CloneCopy(const TMVB &mv, const Teuchos::Range1D &index)
 
static void Apply(const TLOB &Op, const TMVB &x, TMVB &y, ETrans trans=NOTRANS)
Apply Op to x, storing the result in y. 
 
static void MvRandom(TMVB &mv)
Replace the vectors in mv with random vectors. 
 
static Teuchos::RCP< TMVB > CloneViewNonConst(TMVB &mv, const Teuchos::Range1D &index)
 
OrdinalType numCols() const 
 
static void SetBlock(const TMVB &A, const std::vector< int > &index, TMVB &mv)
Copy the vectors in A to a set of vectors in mv indicated by the indices given in index...
 
static void SetBlock(const TMVB &A, const Teuchos::Range1D &index, TMVB &mv)
 
static void MvNorm(const TMVB &mv, std::vector< magType > &normvec, NormType type=TwoNorm)
Compute the 2-norm of each individual std::vector of mv. Upon return, normvec[i] holds the value of ...
 
static bool HasApplyTranspose(const TLOB &Op)
Whether the operator implements applying the transpose. 
 
static Teuchos::RCP< TMVB > CloneViewNonConst(TMVB &mv, const std::vector< int > &index)
Creates a new MultiVectorBase that shares the selected contents of mv (shallow copy). 
 
static Teuchos::RCP< const TMVB > CloneView(const TMVB &mv, const Teuchos::Range1D &index)
 
OrdinalType stride() const 
 
static Teuchos::RCP< TMVB > Clone(const TMVB &mv, const int numvecs)
Creates a new empty MultiVectorBase containing numvecs columns. 
 
static void MvAddMv(const ScalarType alpha, const TMVB &A, const ScalarType beta, const TMVB &B, TMVB &mv)
Replace mv with . 
 
OrdinalType numRows() const 
 
#define STRATIMIKOS_TIME_MONITOR(NAME)