42 #ifndef BELOS_PCE_TPETRA_ADAPTER_HPP 43 #define BELOS_PCE_TPETRA_ADAPTER_HPP 51 #include <Tpetra_MultiVector.hpp> 52 #include <Tpetra_Operator.hpp> 53 #include <Teuchos_Assert.hpp> 54 #include <Teuchos_ScalarTraits.hpp> 55 #include <Teuchos_TypeNameTraits.hpp> 56 #include <Teuchos_Array.hpp> 57 #include <Teuchos_DefaultSerialComm.hpp> 59 #include <BelosConfigDefs.hpp> 60 #include <BelosTypes.hpp> 61 #include <BelosMultiVecTraits.hpp> 62 #include <BelosOperatorTraits.hpp> 63 #include <Kokkos_NodeAPIConfigDefs.hpp> 65 #ifdef HAVE_BELOS_TSQR 66 # include <Tpetra_TsqrAdaptor.hpp> 67 #endif // HAVE_BELOS_TSQR 86 template<
class BaseScalar,
class Storage,
class LO,
class GO,
class Node>
87 class MultiVecTraits<BaseScalar,
Tpetra::MultiVector< Sacado::PCE::OrthogPoly<BaseScalar,Storage>,LO,GO,Node> >
90 #ifdef HAVE_BELOS_TPETRA_TIMERS 91 static Teuchos::RCP<Teuchos::Time> mvTimesMatAddMvTimer_, mvTransMvTimer_;
108 TEUCHOS_TEST_FOR_EXCEPTION(index.size() == 0,std::invalid_argument,
109 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::CloneCopy(mv,index): numvecs must be greater than zero.");
110 #ifdef HAVE_TPETRA_DEBUG 111 TEUCHOS_TEST_FOR_EXCEPTION( *std::min_element(index.begin(),index.end()) < 0, std::runtime_error,
112 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::CloneCopy(mv,index): indices must be >= zero.");
113 TEUCHOS_TEST_FOR_EXCEPTION( (
size_t)*std::max_element(index.begin(),index.end()) >= mv.getNumVectors(), std::runtime_error,
114 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::CloneCopy(mv,index): indices must be < mv.getNumVectors().");
116 for (
typename std::vector<int>::size_type
j=1;
j<index.size(); ++
j) {
117 if (index[
j] != index[
j-1]+1) {
119 Teuchos::Array<size_t> stinds(index.begin(), index.end());
120 return mv.subCopy(stinds);
124 return mv.subCopy(Teuchos::Range1D(index.front(),index.back()));
127 static Teuchos::RCP<Tpetra::MultiVector<Scalar,LO,GO,Node> >
129 const Teuchos::Range1D& index)
131 const bool validRange = index.size() > 0 &&
132 index.lbound() >= 0 &&
133 index.ubound() < GetNumberVecs(mv);
136 std::ostringstream os;
137 os <<
"Belos::MultiVecTraits<Scalar, Tpetra::MultiVector<...> >::" 138 "CloneCopy(mv,index=[" << index.lbound() <<
", " << index.ubound()
140 TEUCHOS_TEST_FOR_EXCEPTION(index.size() == 0, std::invalid_argument,
141 os.str() <<
"Empty index range is not allowed.");
142 TEUCHOS_TEST_FOR_EXCEPTION(index.lbound() < 0, std::invalid_argument,
143 os.str() <<
"Index range includes negative " 144 "index/ices, which is not allowed.");
146 TEUCHOS_TEST_FOR_EXCEPTION(index.ubound() >= GetNumberVecs(mv),
147 std::invalid_argument,
148 os.str() <<
"Index range exceeds number of vectors " 149 << mv.getNumVectors() <<
" in the input multivector.");
150 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
151 os.str() <<
"Should never get here!");
153 return mv.subCopy (index);
159 TEUCHOS_TEST_FOR_EXCEPTION(index.size() == 0,std::invalid_argument,
160 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::CloneView(mv,index): numvecs must be greater than zero.");
161 #ifdef HAVE_TPETRA_DEBUG 162 TEUCHOS_TEST_FOR_EXCEPTION( *std::min_element(index.begin(),index.end()) < 0, std::invalid_argument,
163 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::CloneView(mv,index): indices must be >= zero.");
164 TEUCHOS_TEST_FOR_EXCEPTION( (
size_t)*std::max_element(index.begin(),index.end()) >= mv.getNumVectors(), std::invalid_argument,
165 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::CloneView(mv,index): indices must be < mv.getNumVectors().");
167 for (
typename std::vector<int>::size_type
j=1;
j<index.size(); ++
j) {
168 if (index[
j] != index[
j-1]+1) {
170 Teuchos::Array<size_t> stinds(index.begin(), index.end());
171 return mv.subViewNonConst(stinds);
175 return mv.subViewNonConst(Teuchos::Range1D(index.front(),index.back()));
179 static Teuchos::RCP<Tpetra::MultiVector<Scalar,LO,GO,Node> >
181 const Teuchos::Range1D& index)
186 const int numCols =
static_cast<int> (mv.getNumVectors());
187 const bool validRange = index.size() > 0 &&
188 index.lbound() >= 0 && index.ubound() < numCols;
191 std::ostringstream os;
192 os <<
"Belos::MultiVecTraits<Scalar, Tpetra::MultiVector<...> >::" 193 "CloneViewNonConst(mv,index=[" << index.lbound() <<
", " 194 << index.ubound() <<
"]): ";
195 TEUCHOS_TEST_FOR_EXCEPTION(index.size() == 0, std::invalid_argument,
196 os.str() <<
"Empty index range is not allowed.");
197 TEUCHOS_TEST_FOR_EXCEPTION(index.lbound() < 0, std::invalid_argument,
198 os.str() <<
"Index range includes negative " 199 "index/ices, which is not allowed.");
200 TEUCHOS_TEST_FOR_EXCEPTION(index.ubound() >= numCols, std::invalid_argument,
201 os.str() <<
"Index range exceeds number of " 202 "vectors " << numCols <<
" in the input " 204 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
205 os.str() <<
"Should never get here!");
207 return mv.subViewNonConst (index);
213 TEUCHOS_TEST_FOR_EXCEPTION(index.size() == 0,std::invalid_argument,
214 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::CloneView(mv,index): numvecs must be greater than zero.");
215 #ifdef HAVE_TPETRA_DEBUG 216 TEUCHOS_TEST_FOR_EXCEPTION( *std::min_element(index.begin(),index.end()) < 0, std::invalid_argument,
217 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::CloneView(mv,index): indices must be >= zero.");
218 TEUCHOS_TEST_FOR_EXCEPTION( (
size_t)*std::max_element(index.begin(),index.end()) >= mv.getNumVectors(), std::invalid_argument,
219 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::CloneView(mv,index): indices must be < mv.getNumVectors().");
221 for (
typename std::vector<int>::size_type
j=1;
j<index.size(); ++
j) {
222 if (index[
j] != index[
j-1]+1) {
224 Teuchos::Array<size_t> stinds(index.begin(), index.end());
225 return mv.subView(stinds);
229 return mv.subView(Teuchos::Range1D(index.front(),index.back()));
232 static Teuchos::RCP<const Tpetra::MultiVector<Scalar,LO,GO,Node> >
234 const Teuchos::Range1D& index)
239 const int numCols =
static_cast<int> (mv.getNumVectors());
240 const bool validRange = index.size() > 0 &&
241 index.lbound() >= 0 && index.ubound() < numCols;
244 std::ostringstream os;
245 os <<
"Belos::MultiVecTraits<Scalar, Tpetra::MultiVector<...> >::" 246 "CloneView(mv, index=[" << index.lbound() <<
", " 247 << index.ubound() <<
"]): ";
248 TEUCHOS_TEST_FOR_EXCEPTION(index.size() == 0, std::invalid_argument,
249 os.str() <<
"Empty index range is not allowed.");
250 TEUCHOS_TEST_FOR_EXCEPTION(index.lbound() < 0, std::invalid_argument,
251 os.str() <<
"Index range includes negative " 252 "index/ices, which is not allowed.");
253 TEUCHOS_TEST_FOR_EXCEPTION(index.ubound() >= numCols, std::invalid_argument,
254 os.str() <<
"Index range exceeds number of " 255 "vectors " << numCols <<
" in the input " 257 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
258 os.str() <<
"Should never get here!");
260 return mv.subView (index);
264 {
return static_cast<ptrdiff_t
>(mv.getGlobalLength()); }
267 {
return mv.getNumVectors(); }
270 {
return mv.isConstantStride(); }
273 const Teuchos::SerialDenseMatrix<int,BaseScalar>& B,
276 Teuchos::SerialDenseMatrix<int,Scalar> B_pce(B.numRows(), B.numCols());
277 for (
int i=0; i<B.numRows(); i++)
278 for (
int j=0;
j<B.numCols();
j++)
280 MvTimesMatAddMv(alpha, A, B_pce, beta, mv);
283 const Teuchos::SerialDenseMatrix<int,Scalar>& B,
286 #ifdef HAVE_BELOS_TPETRA_TIMERS 287 Teuchos::TimeMonitor lcltimer(*mvTimesMatAddMvTimer_);
290 Teuchos::SerialComm<int> scomm;
291 Tpetra::Map<LO,GO,Node> LocalMap(B.numRows(), 0, Teuchos::rcpFromRef< const Teuchos::Comm<int> >(scomm), Tpetra::LocallyReplicated, A.getMap()->getNode());
293 Teuchos::ArrayView<const Scalar> Bvalues(B.values(),B.stride()*B.numCols());
297 mv.multiply(Teuchos::NO_TRANS, Teuchos::NO_TRANS, alpha, A, B_mv, beta);
300 static void MvAddMv(
Scalar alpha,
const Tpetra::MultiVector<Scalar,LO,GO,Node>& A,
Scalar beta,
const Tpetra::MultiVector<Scalar,LO,GO,Node>& B,
Tpetra::MultiVector<Scalar,LO,GO,Node>& mv )
302 mv.update(alpha,A,beta,B,Teuchos::ScalarTraits<Scalar>::zero());
310 std::vector<Scalar> alphas_pce(alphas.size());
311 for (
int i=0; i<alphas.size(); i++) alphas_pce[i] = alphas[i];
312 mv.scale(alphas_pce);
315 { mv.scale(alphas); }
317 static void MvTransMv(
Scalar alpha,
const Tpetra::MultiVector<Scalar,LO,GO,Node>& A,
const Tpetra::MultiVector<Scalar,LO,GO,Node>& B, Teuchos::SerialDenseMatrix<int,BaseScalar>& C)
319 Teuchos::SerialDenseMatrix<int,Scalar> C_pce(C.numRows(), C.numCols());
320 MvTransMv(alpha, A, B, C_pce);
321 for (
int i=0; i<C.numRows(); i++)
322 for (
int j=0;
j<C.numCols();
j++)
323 C(i,
j) = C_pce(i,
j).coeff(0);
325 static void MvTransMv(
Scalar alpha,
const Tpetra::MultiVector<Scalar,LO,GO,Node>& A,
const Tpetra::MultiVector<Scalar,LO,GO,Node>& B, Teuchos::SerialDenseMatrix<int,Scalar>& C)
327 #ifdef HAVE_BELOS_TPETRA_TIMERS 328 Teuchos::TimeMonitor lcltimer(*mvTransMvTimer_);
335 const int numRowsC = C.numRows(),
336 numColsC = C.numCols(),
337 strideC = C.stride();
338 Teuchos::SerialComm<int> scomm;
340 Tpetra::Map<LO,GO,Node> LocalMap(numRowsC, 0, Teuchos::rcpFromRef<
const Teuchos::Comm<int> >(scomm), Tpetra::LocallyReplicated, A.getMap()->getNode());
342 const bool INIT_TO_ZERO =
true;
345 C_mv.multiply(Teuchos::CONJ_TRANS,Teuchos::NO_TRANS,alpha,A,B,Teuchos::ScalarTraits<Scalar>::zero());
347 Teuchos::RCP< const Teuchos::Comm<int> > pcomm = A.getMap()->getComm();
349 Teuchos::ArrayView<Scalar> C_view(C.values(),strideC*numColsC);
350 if (pcomm->getSize() == 1) {
353 C_mv.get1dCopy(C_view,strideC);
357 Teuchos::ArrayRCP<const Scalar> C_mv_view = C_mv.get1dView();
358 if (strideC == numRowsC) {
360 Teuchos::reduceAll<int,Scalar>(*pcomm,Teuchos::REDUCE_SUM,numColsC*numRowsC,C_mv_view.getRawPtr(),C_view.getRawPtr());
364 Teuchos::Array<Scalar> destBuff(numColsC*numRowsC);
365 Teuchos::reduceAll<int,Scalar>(*pcomm,Teuchos::REDUCE_SUM,numColsC*numRowsC,C_mv_view.getRawPtr(),destBuff.getRawPtr());
366 for (
int j=0;
j < numColsC; ++
j) {
367 for (
int i=0; i < numRowsC; ++i) {
368 C_view[strideC*
j+i] = destBuff[numRowsC*
j+i];
377 TEUCHOS_TEST_FOR_EXCEPTION(A.getNumVectors() != B.getNumVectors(),std::invalid_argument,
378 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::MvDot(A,B,dots): A and B must have the same number of vectors.");
379 #ifdef HAVE_TPETRA_DEBUG 380 TEUCHOS_TEST_FOR_EXCEPTION(dots.size() < (
typename std::vector<int>::size_type)A.getNumVectors(),std::invalid_argument,
381 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::MvDot(A,B,dots): dots must have room for all dot products.");
385 Teuchos::Array<Scalar> pce_dots(A.getNumVectors());
387 for (
unsigned int i=0; i<A.getNumVectors(); i++)
388 dots[i] = pce_dots[i].coeff(0);
393 #ifdef HAVE_TPETRA_DEBUG 394 TEUCHOS_TEST_FOR_EXCEPTION(normvec.size() < (
typename std::vector<int>::size_type)mv.getNumVectors(),std::invalid_argument,
395 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::MvNorm(mv,normvec): normvec must have room for all norms.");
397 Teuchos::ArrayView<typename Teuchos::ScalarTraits<BaseScalar>::magnitudeType> av(normvec);
401 mv.norm1(av(0,mv.getNumVectors()));
407 mv.norm2(av(0,mv.getNumVectors()));
413 mv.normInf(av(0,mv.getNumVectors()));
424 #ifdef HAVE_TPETRA_DEBUG 425 TEUCHOS_TEST_FOR_EXCEPTION((
typename std::vector<int>::size_type)A.getNumVectors() < index.size(),std::invalid_argument,
426 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::SetBlock(A,index,mv): index must be the same size as A.");
428 Teuchos::RCP<Tpetra::MultiVector<Scalar,LO,GO,Node> > mvsub = CloneViewNonConst(mv,index);
429 if ((
typename std::vector<int>::size_type)A.getNumVectors() > index.size()) {
430 Teuchos::RCP<const Tpetra::MultiVector<Scalar,LO,GO,Node> > Asub = A.subView(Teuchos::Range1D(0,index.size()-1));
436 mvsub = Teuchos::null;
441 const Teuchos::Range1D& index,
452 const bool overflow = maxInt < A.getNumVectors() && maxInt < mv.getNumVectors();
455 std::ostringstream os;
456 os <<
"Belos::MultiVecTraits<Scalar, Tpetra::MultiVector<Scalar, ..." 457 "> >::SetBlock(A, index=[" << index.lbound() <<
", " 458 << index.ubound() <<
"], mv): ";
459 TEUCHOS_TEST_FOR_EXCEPTION(maxInt < A.getNumVectors(), std::range_error,
460 os.str() <<
"Number of columns in the input multi" 461 "vector 'A' (a size_t) overflows int.");
462 TEUCHOS_TEST_FOR_EXCEPTION(maxInt < mv.getNumVectors(), std::range_error,
463 os.str() <<
"Number of columns in the output multi" 464 "vector 'mv' (a size_t) overflows int.");
467 const int numColsA =
static_cast<int> (A.getNumVectors());
468 const int numColsMv =
static_cast<int> (mv.getNumVectors());
470 const bool validIndex = index.lbound() >= 0 && index.ubound() < numColsMv;
472 const bool validSource = index.size() <= numColsA;
474 if (! validIndex || ! validSource)
476 std::ostringstream os;
477 os <<
"Belos::MultiVecTraits<Scalar, Tpetra::MultiVector<Scalar, ..." 478 "> >::SetBlock(A, index=[" << index.lbound() <<
", " 479 << index.ubound() <<
"], mv): ";
480 TEUCHOS_TEST_FOR_EXCEPTION(index.lbound() < 0, std::invalid_argument,
481 os.str() <<
"Range lower bound must be nonnegative.");
482 TEUCHOS_TEST_FOR_EXCEPTION(index.ubound() >= numColsMv, std::invalid_argument,
483 os.str() <<
"Range upper bound must be less than " 484 "the number of columns " << numColsA <<
" in the " 485 "'mv' output argument.");
486 TEUCHOS_TEST_FOR_EXCEPTION(index.size() > numColsA, std::invalid_argument,
487 os.str() <<
"Range must have no more elements than" 488 " the number of columns " << numColsA <<
" in the " 489 "'A' input argument.");
490 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Should never get here!");
492 typedef Teuchos::RCP<Tpetra::MultiVector<Scalar,LO,GO,Node> > MV_ptr;
493 typedef Teuchos::RCP<const Tpetra::MultiVector<Scalar,LO,GO,Node> > const_MV_ptr;
499 if (index.lbound() == 0 && index.ubound()+1 == numColsMv)
500 mv_view = Teuchos::rcpFromRef (mv);
502 mv_view = CloneViewNonConst (mv, index);
508 if (index.size() == numColsA)
509 A_view = Teuchos::rcpFromRef (A);
511 A_view = CloneView (A, Teuchos::Range1D(0, index.size()-1));
533 const bool overflow = maxInt < A.getNumVectors() && maxInt < mv.getNumVectors();
536 std::ostringstream os;
537 os <<
"Belos::MultiVecTraits<Scalar, Tpetra::MultiVector<Scalar, ..." 538 "> >::Assign(A, mv): ";
539 TEUCHOS_TEST_FOR_EXCEPTION(maxInt < A.getNumVectors(), std::range_error,
540 os.str() <<
"Number of columns in the input multi" 541 "vector 'A' (a size_t) overflows int.");
542 TEUCHOS_TEST_FOR_EXCEPTION(maxInt < mv.getNumVectors(), std::range_error,
543 os.str() <<
"Number of columns in the output multi" 544 "vector 'mv' (a size_t) overflows int.");
545 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Should never get here!");
548 const int numColsA =
static_cast<int> (A.getNumVectors());
549 const int numColsMv =
static_cast<int> (mv.getNumVectors());
550 if (numColsA > numColsMv)
552 std::ostringstream os;
553 os <<
"Belos::MultiVecTraits<Scalar, Tpetra::MultiVector<Scalar, ..." 554 "> >::Assign(A, mv): ";
555 TEUCHOS_TEST_FOR_EXCEPTION(numColsA > numColsMv, std::invalid_argument,
556 os.str() <<
"Input multivector 'A' has " 557 << numColsA <<
" columns, but output multivector " 558 "'mv' has only " << numColsMv <<
" columns.");
559 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Should never get here!");
566 if (numColsA == numColsMv)
570 Teuchos::RCP<Tpetra::MultiVector<Scalar,LO,GO,Node> > mv_view =
571 CloneViewNonConst (mv, Teuchos::Range1D(0, numColsA-1));
583 { mv.putScalar(alpha); }
587 Teuchos::FancyOStream fos(Teuchos::rcp(&os,
false));
588 mv.describe(fos,Teuchos::VERB_EXTREME);
591 #ifdef HAVE_BELOS_TSQR 592 typedef Tpetra::TsqrAdaptor< Tpetra::MultiVector< Scalar, LO, GO, Node > > tsqr_adaptor_type;
596 #endif // HAVE_BELOS_TSQR 606 template <
class BaseScalar,
class Storage,
class LO,
class GO,
class Node>
607 class OperatorTraits <BaseScalar,
Tpetra::MultiVector<Sacado::PCE::OrthogPoly<BaseScalar,Storage>,LO,GO,Node>, Tpetra::Operator<Sacado::PCE::OrthogPoly<BaseScalar,Storage>,LO,GO,Node> >
612 Apply (
const Tpetra::Operator<Scalar,LO,GO,Node>& Op,
615 ETrans trans=NOTRANS)
619 Op.apply(X,Y,Teuchos::NO_TRANS);
622 Op.apply(X,Y,Teuchos::TRANS);
625 Op.apply(X,Y,Teuchos::CONJ_TRANS);
628 const std::string scalarName = Teuchos::TypeNameTraits<Scalar>::name();
629 const std::string loName = Teuchos::TypeNameTraits<LO>::name();
630 const std::string goName = Teuchos::TypeNameTraits<GO>::name();
631 const std::string nodeName = Teuchos::TypeNameTraits<Node>::name();
632 const std::string otName =
"Belos::OperatorTraits<" + scalarName
633 +
"," + loName +
"," + goName +
"," + nodeName +
">";
634 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error, otName <<
": Should never " 635 "get here; fell through a switch statement. " 636 "Please report this bug to the Belos developers.");
643 return Op.hasTransposeApply ();
static void MvPrint(const Tpetra::MultiVector< Scalar, LO, GO, Node > &mv, std::ostream &os)
Belos::OperatorTraits< BaseScalar, Tpetra::MultiVector< Sacado::PCE::OrthogPoly< BaseScalar, Storage >, LO, GO, Node >, Tpetra::Operator< Sacado::PCE::OrthogPoly< BaseScalar, Storage >, LO, GO, Node > >::HasApplyTranspose static bool HasApplyTranspose(const Tpetra::Operator< Scalar, LO, GO, Node > &Op)
static void MvInit(Tpetra::MultiVector< Scalar, LO, GO, Node > &mv, Scalar alpha=Teuchos::ScalarTraits< Scalar >::zero())
static Teuchos::RCP< Tpetra::MultiVector< Scalar, LO, GO, Node > > CloneCopy(const Tpetra::MultiVector< Scalar, LO, GO, Node > &mv, const std::vector< int > &index)
static void Assign(const Tpetra::MultiVector< Scalar, LO, GO, Node > &A, Tpetra::MultiVector< Scalar, LO, GO, Node > &mv)
static void MvTransMv(Scalar alpha, const Tpetra::MultiVector< Scalar, LO, GO, Node > &A, const Tpetra::MultiVector< Scalar, LO, GO, Node > &B, Teuchos::SerialDenseMatrix< int, BaseScalar > &C)
static void MvRandom(Tpetra::MultiVector< Scalar, LO, GO, Node > &mv)
Sacado::PCE::OrthogPoly< BaseScalar, Storage > Scalar
static void MvTimesMatAddMv(Scalar alpha, const Tpetra::MultiVector< Scalar, LO, GO, Node > &A, const Teuchos::SerialDenseMatrix< int, Scalar > &B, Scalar beta, Tpetra::MultiVector< Scalar, LO, GO, Node > &mv)
static void SetBlock(const Tpetra::MultiVector< Scalar, LO, GO, Node > &A, const std::vector< int > &index, Tpetra::MultiVector< Scalar, LO, GO, Node > &mv)
static void MvScale(Tpetra::MultiVector< Scalar, LO, GO, Node > &mv, Scalar alpha)
static ptrdiff_t GetGlobalLength(const Tpetra::MultiVector< Scalar, LO, GO, Node > &mv)
static Teuchos::RCP< const Tpetra::MultiVector< Scalar, LO, GO, Node > > CloneView(const Tpetra::MultiVector< Scalar, LO, GO, Node > &mv, const Teuchos::Range1D &index)
static Teuchos::RCP< Tpetra::MultiVector< Scalar, LO, GO, Node > > CloneCopy(const Tpetra::MultiVector< Scalar, LO, GO, Node > &mv)
static Teuchos::RCP< Tpetra::MultiVector< Scalar, LO, GO, Node > > Clone(const Tpetra::MultiVector< Scalar, LO, GO, Node > &mv, const int numvecs)
static void MvScale(Tpetra::MultiVector< Scalar, LO, GO, Node > &mv, const std::vector< BaseScalar > &alphas)
KOKKOS_INLINE_FUNCTION PCE< Storage > max(const typename PCE< Storage >::value_type &a, const PCE< Storage > &b)
static void MvTransMv(Scalar alpha, const Tpetra::MultiVector< Scalar, LO, GO, Node > &A, const Tpetra::MultiVector< Scalar, LO, GO, Node > &B, Teuchos::SerialDenseMatrix< int, Scalar > &C)
static void MvTimesMatAddMv(Scalar alpha, const Tpetra::MultiVector< Scalar, LO, GO, Node > &A, const Teuchos::SerialDenseMatrix< int, BaseScalar > &B, Scalar beta, Tpetra::MultiVector< Scalar, LO, GO, Node > &mv)
static void SetBlock(const Tpetra::MultiVector< Scalar, LO, GO, Node > &A, const Teuchos::Range1D &index, Tpetra::MultiVector< Scalar, LO, GO, Node > &mv)
Belos::OperatorTraits< BaseScalar, Tpetra::MultiVector< Sacado::PCE::OrthogPoly< BaseScalar, Storage >, LO, GO, Node >, Tpetra::Operator< Sacado::PCE::OrthogPoly< BaseScalar, Storage >, LO, GO, Node > >::Apply static void Apply(const Tpetra::Operator< Scalar, LO, GO, Node > &Op, const Tpetra::MultiVector< Scalar, LO, GO, Node > &X, Tpetra::MultiVector< Scalar, LO, GO, Node > &Y, ETrans trans=NOTRANS)
static void MvAddMv(Scalar alpha, const Tpetra::MultiVector< Scalar, LO, GO, Node > &A, Scalar beta, const Tpetra::MultiVector< Scalar, LO, GO, Node > &B, Tpetra::MultiVector< Scalar, LO, GO, Node > &mv)
static int GetNumberVecs(const Tpetra::MultiVector< Scalar, LO, GO, Node > &mv)
static Teuchos::RCP< Tpetra::MultiVector< Scalar, LO, GO, Node > > CloneViewNonConst(Tpetra::MultiVector< Scalar, LO, GO, Node > &mv, const std::vector< int > &index)
static Teuchos::RCP< Tpetra::MultiVector< Scalar, LO, GO, Node > > CloneCopy(const Tpetra::MultiVector< Scalar, LO, GO, Node > &mv, const Teuchos::Range1D &index)
static void MvNorm(const Tpetra::MultiVector< Scalar, LO, GO, Node > &mv, std::vector< typename Teuchos::ScalarTraits< BaseScalar >::magnitudeType > &normvec, NormType type=TwoNorm)
static bool HasConstantStride(const Tpetra::MultiVector< Scalar, LO, GO, Node > &mv)
static void MvDot(const Tpetra::MultiVector< Scalar, LO, GO, Node > &A, const Tpetra::MultiVector< Scalar, LO, GO, Node > &B, std::vector< BaseScalar > &dots)
static Teuchos::RCP< const Tpetra::MultiVector< Scalar, LO, GO, Node > > CloneView(const Tpetra::MultiVector< Scalar, LO, GO, Node > &mv, const std::vector< int > &index)
static Teuchos::RCP< Tpetra::MultiVector< Scalar, LO, GO, Node > > CloneViewNonConst(Tpetra::MultiVector< Scalar, LO, GO, Node > &mv, const Teuchos::Range1D &index)
Belos::OperatorTraits< BaseScalar, Tpetra::MultiVector< Sacado::PCE::OrthogPoly< BaseScalar, Storage >, LO, GO, Node >, Tpetra::Operator< Sacado::PCE::OrthogPoly< BaseScalar, Storage >, LO, GO, Node > >::Scalar Sacado::PCE::OrthogPoly< BaseScalar, Storage > Scalar
static void MvScale(Tpetra::MultiVector< Scalar, LO, GO, Node > &mv, const std::vector< Scalar > &alphas)