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> 64 #ifdef HAVE_BELOS_TSQR 65 # include <Tpetra_TsqrAdaptor.hpp> 66 #endif // HAVE_BELOS_TSQR 85 template<
class BaseScalar,
class Storage,
class LO,
class GO,
class Node>
86 class MultiVecTraits<BaseScalar,
Tpetra::MultiVector< Sacado::PCE::OrthogPoly<BaseScalar,Storage>,LO,GO,Node> >
89 #ifdef HAVE_BELOS_TPETRA_TIMERS 90 static Teuchos::RCP<Teuchos::Time> mvTimesMatAddMvTimer_, mvTransMvTimer_;
95 static Teuchos::RCP<Tpetra::MultiVector<Scalar,LO,GO,Node> >
Clone(
const Tpetra::MultiVector<Scalar,LO,GO,Node>& mv,
const int numvecs )
97 return Teuchos::rcp(
new Tpetra::MultiVector<Scalar,LO,GO,Node>(mv.getMap(),numvecs));
100 static Teuchos::RCP<Tpetra::MultiVector<Scalar,LO,GO,Node> >
CloneCopy(
const Tpetra::MultiVector<Scalar,LO,GO,Node>& mv )
102 return Teuchos::rcp(
new Tpetra::MultiVector<Scalar,LO,GO,Node>( mv ) );
105 static Teuchos::RCP<Tpetra::MultiVector<Scalar,LO,GO,Node> >
CloneCopy(
const Tpetra::MultiVector<Scalar,LO,GO,Node>& mv,
const std::vector<int>& index )
107 TEUCHOS_TEST_FOR_EXCEPTION(index.size() == 0,std::invalid_argument,
108 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::CloneCopy(mv,index): numvecs must be greater than zero.");
109 #ifdef HAVE_TPETRA_DEBUG 110 TEUCHOS_TEST_FOR_EXCEPTION( *std::min_element(index.begin(),index.end()) < 0, std::runtime_error,
111 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::CloneCopy(mv,index): indices must be >= zero.");
112 TEUCHOS_TEST_FOR_EXCEPTION( (
size_t)*std::max_element(index.begin(),index.end()) >= mv.getNumVectors(), std::runtime_error,
113 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::CloneCopy(mv,index): indices must be < mv.getNumVectors().");
115 for (
typename std::vector<int>::size_type
j=1;
j<index.size(); ++
j) {
116 if (index[
j] != index[
j-1]+1) {
118 Teuchos::Array<size_t> stinds(index.begin(), index.end());
119 return mv.subCopy(stinds);
123 return mv.subCopy(Teuchos::Range1D(index.front(),index.back()));
126 static Teuchos::RCP<Tpetra::MultiVector<Scalar,LO,GO,Node> >
127 CloneCopy (
const Tpetra::MultiVector<Scalar,LO,GO,Node>& mv,
128 const Teuchos::Range1D& index)
130 const bool validRange = index.size() > 0 &&
131 index.lbound() >= 0 &&
132 index.ubound() < GetNumberVecs(mv);
135 std::ostringstream os;
136 os <<
"Belos::MultiVecTraits<Scalar, Tpetra::MultiVector<...> >::" 137 "CloneCopy(mv,index=[" << index.lbound() <<
", " << index.ubound()
139 TEUCHOS_TEST_FOR_EXCEPTION(index.size() == 0, std::invalid_argument,
140 os.str() <<
"Empty index range is not allowed.");
141 TEUCHOS_TEST_FOR_EXCEPTION(index.lbound() < 0, std::invalid_argument,
142 os.str() <<
"Index range includes negative " 143 "index/ices, which is not allowed.");
145 TEUCHOS_TEST_FOR_EXCEPTION(index.ubound() >= GetNumberVecs(mv),
146 std::invalid_argument,
147 os.str() <<
"Index range exceeds number of vectors " 148 << mv.getNumVectors() <<
" in the input multivector.");
149 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
150 os.str() <<
"Should never get here!");
152 return mv.subCopy (index);
156 static Teuchos::RCP<Tpetra::MultiVector<Scalar,LO,GO,Node> >
CloneViewNonConst( Tpetra::MultiVector<Scalar,LO,GO,Node>& mv,
const std::vector<int>& index )
158 TEUCHOS_TEST_FOR_EXCEPTION(index.size() == 0,std::invalid_argument,
159 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::CloneView(mv,index): numvecs must be greater than zero.");
160 #ifdef HAVE_TPETRA_DEBUG 161 TEUCHOS_TEST_FOR_EXCEPTION( *std::min_element(index.begin(),index.end()) < 0, std::invalid_argument,
162 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::CloneView(mv,index): indices must be >= zero.");
163 TEUCHOS_TEST_FOR_EXCEPTION( (
size_t)*std::max_element(index.begin(),index.end()) >= mv.getNumVectors(), std::invalid_argument,
164 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::CloneView(mv,index): indices must be < mv.getNumVectors().");
166 for (
typename std::vector<int>::size_type
j=1;
j<index.size(); ++
j) {
167 if (index[
j] != index[
j-1]+1) {
169 Teuchos::Array<size_t> stinds(index.begin(), index.end());
170 return mv.subViewNonConst(stinds);
174 return mv.subViewNonConst(Teuchos::Range1D(index.front(),index.back()));
178 static Teuchos::RCP<Tpetra::MultiVector<Scalar,LO,GO,Node> >
180 const Teuchos::Range1D& index)
185 const int numCols =
static_cast<int> (mv.getNumVectors());
186 const bool validRange = index.size() > 0 &&
187 index.lbound() >= 0 && index.ubound() < numCols;
190 std::ostringstream os;
191 os <<
"Belos::MultiVecTraits<Scalar, Tpetra::MultiVector<...> >::" 192 "CloneViewNonConst(mv,index=[" << index.lbound() <<
", " 193 << index.ubound() <<
"]): ";
194 TEUCHOS_TEST_FOR_EXCEPTION(index.size() == 0, std::invalid_argument,
195 os.str() <<
"Empty index range is not allowed.");
196 TEUCHOS_TEST_FOR_EXCEPTION(index.lbound() < 0, std::invalid_argument,
197 os.str() <<
"Index range includes negative " 198 "index/ices, which is not allowed.");
199 TEUCHOS_TEST_FOR_EXCEPTION(index.ubound() >= numCols, std::invalid_argument,
200 os.str() <<
"Index range exceeds number of " 201 "vectors " << numCols <<
" in the input " 203 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
204 os.str() <<
"Should never get here!");
206 return mv.subViewNonConst (index);
210 static Teuchos::RCP<const Tpetra::MultiVector<Scalar,LO,GO,Node> >
CloneView(
const Tpetra::MultiVector<Scalar,LO,GO,Node>& mv,
const std::vector<int>& index )
212 TEUCHOS_TEST_FOR_EXCEPTION(index.size() == 0,std::invalid_argument,
213 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::CloneView(mv,index): numvecs must be greater than zero.");
214 #ifdef HAVE_TPETRA_DEBUG 215 TEUCHOS_TEST_FOR_EXCEPTION( *std::min_element(index.begin(),index.end()) < 0, std::invalid_argument,
216 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::CloneView(mv,index): indices must be >= zero.");
217 TEUCHOS_TEST_FOR_EXCEPTION( (
size_t)*std::max_element(index.begin(),index.end()) >= mv.getNumVectors(), std::invalid_argument,
218 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::CloneView(mv,index): indices must be < mv.getNumVectors().");
220 for (
typename std::vector<int>::size_type
j=1;
j<index.size(); ++
j) {
221 if (index[
j] != index[
j-1]+1) {
223 Teuchos::Array<size_t> stinds(index.begin(), index.end());
224 return mv.subView(stinds);
228 return mv.subView(Teuchos::Range1D(index.front(),index.back()));
231 static Teuchos::RCP<const Tpetra::MultiVector<Scalar,LO,GO,Node> >
232 CloneView (
const Tpetra::MultiVector<Scalar,LO,GO,Node>& mv,
233 const Teuchos::Range1D& index)
238 const int numCols =
static_cast<int> (mv.getNumVectors());
239 const bool validRange = index.size() > 0 &&
240 index.lbound() >= 0 && index.ubound() < numCols;
243 std::ostringstream os;
244 os <<
"Belos::MultiVecTraits<Scalar, Tpetra::MultiVector<...> >::" 245 "CloneView(mv, index=[" << index.lbound() <<
", " 246 << index.ubound() <<
"]): ";
247 TEUCHOS_TEST_FOR_EXCEPTION(index.size() == 0, std::invalid_argument,
248 os.str() <<
"Empty index range is not allowed.");
249 TEUCHOS_TEST_FOR_EXCEPTION(index.lbound() < 0, std::invalid_argument,
250 os.str() <<
"Index range includes negative " 251 "index/ices, which is not allowed.");
252 TEUCHOS_TEST_FOR_EXCEPTION(index.ubound() >= numCols, std::invalid_argument,
253 os.str() <<
"Index range exceeds number of " 254 "vectors " << numCols <<
" in the input " 256 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
257 os.str() <<
"Should never get here!");
259 return mv.subView (index);
263 {
return static_cast<ptrdiff_t
>(mv.getGlobalLength()); }
265 static int GetNumberVecs(
const Tpetra::MultiVector<Scalar,LO,GO,Node>& mv )
266 {
return mv.getNumVectors(); }
269 {
return mv.isConstantStride(); }
272 const Teuchos::SerialDenseMatrix<int,BaseScalar>& B,
273 Scalar beta, Tpetra::MultiVector<Scalar,LO,GO,Node>& mv )
275 Teuchos::SerialDenseMatrix<int,Scalar> B_pce(B.numRows(), B.numCols());
276 for (
int i=0; i<B.numRows(); i++)
277 for (
int j=0;
j<B.numCols();
j++)
279 MvTimesMatAddMv(alpha, A, B_pce, beta, mv);
282 const Teuchos::SerialDenseMatrix<int,Scalar>& B,
283 Scalar beta, Tpetra::MultiVector<Scalar,LO,GO,Node>& mv )
285 #ifdef HAVE_BELOS_TPETRA_TIMERS 286 Teuchos::TimeMonitor lcltimer(*mvTimesMatAddMvTimer_);
289 Teuchos::SerialComm<int> scomm;
290 Tpetra::Map<LO,GO,Node> LocalMap(B.numRows(), 0, Teuchos::rcpFromRef< const Teuchos::Comm<int> >(scomm), Tpetra::LocallyReplicated);
292 Teuchos::ArrayView<const Scalar> Bvalues(B.values(),B.stride()*B.numCols());
294 Tpetra::MultiVector<Scalar,LO,GO,Node> B_mv(Teuchos::rcpFromRef(LocalMap),Bvalues,B.stride(),B.numCols());
296 mv.multiply(Teuchos::NO_TRANS, Teuchos::NO_TRANS, alpha, A, B_mv, beta);
299 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 )
301 mv.update(alpha,A,beta,B,Teuchos::ScalarTraits<Scalar>::zero());
304 static void MvScale ( Tpetra::MultiVector<Scalar,LO,GO,Node>& mv,
Scalar alpha )
307 static void MvScale ( Tpetra::MultiVector<Scalar,LO,GO,Node>& mv,
const std::vector<BaseScalar>& alphas )
309 std::vector<Scalar> alphas_pce(alphas.size());
310 for (
int i=0; i<alphas.size(); i++) alphas_pce[i] = alphas[i];
311 mv.scale(alphas_pce);
313 static void MvScale ( Tpetra::MultiVector<Scalar,LO,GO,Node>& mv,
const std::vector<Scalar>& alphas )
314 { mv.scale(alphas); }
316 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)
318 Teuchos::SerialDenseMatrix<int,Scalar> C_pce(C.numRows(), C.numCols());
319 MvTransMv(alpha, A, B, C_pce);
320 for (
int i=0; i<C.numRows(); i++)
321 for (
int j=0;
j<C.numCols();
j++)
322 C(i,
j) = C_pce(i,
j).coeff(0);
324 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)
326 #ifdef HAVE_BELOS_TPETRA_TIMERS 327 Teuchos::TimeMonitor lcltimer(*mvTransMvTimer_);
334 const int numRowsC = C.numRows(),
335 numColsC = C.numCols(),
336 strideC = C.stride();
337 Teuchos::SerialComm<int> scomm;
339 Tpetra::Map<LO,GO,Node> LocalMap(numRowsC, 0, Teuchos::rcpFromRef<
const Teuchos::Comm<int> >(scomm), Tpetra::LocallyReplicated);
341 const bool INIT_TO_ZERO =
true;
342 Tpetra::MultiVector<Scalar,LO,GO,Node> C_mv(Teuchos::rcpFromRef(LocalMap),numColsC, INIT_TO_ZERO);
344 C_mv.multiply(Teuchos::CONJ_TRANS,Teuchos::NO_TRANS,alpha,A,B,Teuchos::ScalarTraits<Scalar>::zero());
346 Teuchos::RCP< const Teuchos::Comm<int> > pcomm = A.getMap()->getComm();
348 Teuchos::ArrayView<Scalar> C_view(C.values(),strideC*numColsC);
349 if (pcomm->getSize() == 1) {
352 C_mv.get1dCopy(C_view,strideC);
356 Teuchos::ArrayRCP<const Scalar> C_mv_view = C_mv.get1dView();
357 if (strideC == numRowsC) {
359 Teuchos::reduceAll<int,Scalar>(*pcomm,Teuchos::REDUCE_SUM,numColsC*numRowsC,C_mv_view.getRawPtr(),C_view.getRawPtr());
363 Teuchos::Array<Scalar> destBuff(numColsC*numRowsC);
364 Teuchos::reduceAll<int,Scalar>(*pcomm,Teuchos::REDUCE_SUM,numColsC*numRowsC,C_mv_view.getRawPtr(),destBuff.getRawPtr());
365 for (
int j=0;
j < numColsC; ++
j) {
366 for (
int i=0; i < numRowsC; ++i) {
367 C_view[strideC*
j+i] = destBuff[numRowsC*
j+i];
374 static void MvDot(
const Tpetra::MultiVector<Scalar,LO,GO,Node>& A,
const Tpetra::MultiVector<Scalar,LO,GO,Node>& B, std::vector<BaseScalar> &dots)
376 TEUCHOS_TEST_FOR_EXCEPTION(A.getNumVectors() != B.getNumVectors(),std::invalid_argument,
377 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::MvDot(A,B,dots): A and B must have the same number of vectors.");
378 #ifdef HAVE_TPETRA_DEBUG 379 TEUCHOS_TEST_FOR_EXCEPTION(dots.size() < (
typename std::vector<int>::size_type)A.getNumVectors(),std::invalid_argument,
380 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::MvDot(A,B,dots): dots must have room for all dot products.");
384 Teuchos::Array<Scalar> pce_dots(A.getNumVectors());
386 for (
unsigned int i=0; i<A.getNumVectors(); i++)
387 dots[i] = pce_dots[i].coeff(0);
390 static void MvNorm(
const Tpetra::MultiVector<Scalar,LO,GO,Node>& mv, std::vector<
typename Teuchos::ScalarTraits<BaseScalar>::magnitudeType> &normvec, NormType type=TwoNorm)
392 #ifdef HAVE_TPETRA_DEBUG 393 TEUCHOS_TEST_FOR_EXCEPTION(normvec.size() < (
typename std::vector<int>::size_type)mv.getNumVectors(),std::invalid_argument,
394 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::MvNorm(mv,normvec): normvec must have room for all norms.");
396 Teuchos::ArrayView<typename Teuchos::ScalarTraits<BaseScalar>::magnitudeType> av(normvec);
400 mv.norm1(av(0,mv.getNumVectors()));
406 mv.norm2(av(0,mv.getNumVectors()));
412 mv.normInf(av(0,mv.getNumVectors()));
421 static void SetBlock(
const Tpetra::MultiVector<Scalar,LO,GO,Node>& A,
const std::vector<int>& index, Tpetra::MultiVector<Scalar,LO,GO,Node>& mv )
423 #ifdef HAVE_TPETRA_DEBUG 424 TEUCHOS_TEST_FOR_EXCEPTION((
typename std::vector<int>::size_type)A.getNumVectors() < index.size(),std::invalid_argument,
425 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::SetBlock(A,index,mv): index must be the same size as A.");
427 Teuchos::RCP<Tpetra::MultiVector<Scalar,LO,GO,Node> > mvsub = CloneViewNonConst(mv,index);
428 if ((
typename std::vector<int>::size_type)A.getNumVectors() > index.size()) {
429 Teuchos::RCP<const Tpetra::MultiVector<Scalar,LO,GO,Node> > Asub = A.subView(Teuchos::Range1D(0,index.size()-1));
435 mvsub = Teuchos::null;
439 SetBlock (
const Tpetra::MultiVector<Scalar,LO,GO,Node>& A,
440 const Teuchos::Range1D& index,
441 Tpetra::MultiVector<Scalar,LO,GO,Node>& mv)
451 const bool overflow = maxInt < A.getNumVectors() && maxInt < mv.getNumVectors();
454 std::ostringstream os;
455 os <<
"Belos::MultiVecTraits<Scalar, Tpetra::MultiVector<Scalar, ..." 456 "> >::SetBlock(A, index=[" << index.lbound() <<
", " 457 << index.ubound() <<
"], mv): ";
458 TEUCHOS_TEST_FOR_EXCEPTION(maxInt < A.getNumVectors(), std::range_error,
459 os.str() <<
"Number of columns in the input multi" 460 "vector 'A' (a size_t) overflows int.");
461 TEUCHOS_TEST_FOR_EXCEPTION(maxInt < mv.getNumVectors(), std::range_error,
462 os.str() <<
"Number of columns in the output multi" 463 "vector 'mv' (a size_t) overflows int.");
466 const int numColsA =
static_cast<int> (A.getNumVectors());
467 const int numColsMv =
static_cast<int> (mv.getNumVectors());
469 const bool validIndex = index.lbound() >= 0 && index.ubound() < numColsMv;
471 const bool validSource = index.size() <= numColsA;
473 if (! validIndex || ! validSource)
475 std::ostringstream os;
476 os <<
"Belos::MultiVecTraits<Scalar, Tpetra::MultiVector<Scalar, ..." 477 "> >::SetBlock(A, index=[" << index.lbound() <<
", " 478 << index.ubound() <<
"], mv): ";
479 TEUCHOS_TEST_FOR_EXCEPTION(index.lbound() < 0, std::invalid_argument,
480 os.str() <<
"Range lower bound must be nonnegative.");
481 TEUCHOS_TEST_FOR_EXCEPTION(index.ubound() >= numColsMv, std::invalid_argument,
482 os.str() <<
"Range upper bound must be less than " 483 "the number of columns " << numColsA <<
" in the " 484 "'mv' output argument.");
485 TEUCHOS_TEST_FOR_EXCEPTION(index.size() > numColsA, std::invalid_argument,
486 os.str() <<
"Range must have no more elements than" 487 " the number of columns " << numColsA <<
" in the " 488 "'A' input argument.");
489 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Should never get here!");
491 typedef Teuchos::RCP<Tpetra::MultiVector<Scalar,LO,GO,Node> > MV_ptr;
492 typedef Teuchos::RCP<const Tpetra::MultiVector<Scalar,LO,GO,Node> > const_MV_ptr;
498 if (index.lbound() == 0 && index.ubound()+1 == numColsMv)
499 mv_view = Teuchos::rcpFromRef (mv);
501 mv_view = CloneViewNonConst (mv, index);
507 if (index.size() == numColsA)
508 A_view = Teuchos::rcpFromRef (A);
510 A_view = CloneView (A, Teuchos::Range1D(0, index.size()-1));
521 Assign (
const Tpetra::MultiVector<Scalar,LO,GO,Node>& A,
522 Tpetra::MultiVector<Scalar,LO,GO,Node>& mv)
532 const bool overflow = maxInt < A.getNumVectors() && maxInt < mv.getNumVectors();
535 std::ostringstream os;
536 os <<
"Belos::MultiVecTraits<Scalar, Tpetra::MultiVector<Scalar, ..." 537 "> >::Assign(A, mv): ";
538 TEUCHOS_TEST_FOR_EXCEPTION(maxInt < A.getNumVectors(), std::range_error,
539 os.str() <<
"Number of columns in the input multi" 540 "vector 'A' (a size_t) overflows int.");
541 TEUCHOS_TEST_FOR_EXCEPTION(maxInt < mv.getNumVectors(), std::range_error,
542 os.str() <<
"Number of columns in the output multi" 543 "vector 'mv' (a size_t) overflows int.");
544 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Should never get here!");
547 const int numColsA =
static_cast<int> (A.getNumVectors());
548 const int numColsMv =
static_cast<int> (mv.getNumVectors());
549 if (numColsA > numColsMv)
551 std::ostringstream os;
552 os <<
"Belos::MultiVecTraits<Scalar, Tpetra::MultiVector<Scalar, ..." 553 "> >::Assign(A, mv): ";
554 TEUCHOS_TEST_FOR_EXCEPTION(numColsA > numColsMv, std::invalid_argument,
555 os.str() <<
"Input multivector 'A' has " 556 << numColsA <<
" columns, but output multivector " 557 "'mv' has only " << numColsMv <<
" columns.");
558 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Should never get here!");
565 if (numColsA == numColsMv)
569 Teuchos::RCP<Tpetra::MultiVector<Scalar,LO,GO,Node> > mv_view =
570 CloneViewNonConst (mv, Teuchos::Range1D(0, numColsA-1));
576 static void MvRandom( Tpetra::MultiVector<Scalar,LO,GO,Node>& mv )
581 static void MvInit( Tpetra::MultiVector<Scalar,LO,GO,Node>& mv,
Scalar alpha = Teuchos::ScalarTraits<Scalar>::zero() )
582 { mv.putScalar(alpha); }
584 static void MvPrint(
const Tpetra::MultiVector<Scalar,LO,GO,Node>& mv, std::ostream& os )
586 Teuchos::FancyOStream fos(Teuchos::rcp(&os,
false));
587 mv.describe(fos,Teuchos::VERB_EXTREME);
590 #ifdef HAVE_BELOS_TSQR 591 typedef Tpetra::TsqrAdaptor< Tpetra::MultiVector< Scalar, LO, GO, Node > > tsqr_adaptor_type;
595 #endif // HAVE_BELOS_TSQR 605 template <
class BaseScalar,
class Storage,
class LO,
class GO,
class Node>
606 class OperatorTraits <BaseScalar,
Tpetra::MultiVector<Sacado::PCE::OrthogPoly<BaseScalar,Storage>,LO,GO,Node>, Tpetra::Operator<Sacado::PCE::OrthogPoly<BaseScalar,Storage>,LO,GO,Node> >
611 Apply (
const Tpetra::Operator<Scalar,LO,GO,Node>& Op,
612 const Tpetra::MultiVector<Scalar,LO,GO,Node>& X,
613 Tpetra::MultiVector<Scalar,LO,GO,Node>& Y,
614 ETrans trans=NOTRANS)
618 Op.apply(X,Y,Teuchos::NO_TRANS);
621 Op.apply(X,Y,Teuchos::TRANS);
624 Op.apply(X,Y,Teuchos::CONJ_TRANS);
627 const std::string scalarName = Teuchos::TypeNameTraits<Scalar>::name();
628 const std::string loName = Teuchos::TypeNameTraits<LO>::name();
629 const std::string goName = Teuchos::TypeNameTraits<GO>::name();
630 const std::string nodeName = Teuchos::TypeNameTraits<Node>::name();
631 const std::string otName =
"Belos::OperatorTraits<" + scalarName
632 +
"," + loName +
"," + goName +
"," + nodeName +
">";
633 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error, otName <<
": Should never " 634 "get here; fell through a switch statement. " 635 "Please report this bug to the Belos developers.");
642 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)