42 #ifndef BELOS_PCE_TPETRA_ADAPTER_HPP 43 #define BELOS_PCE_TPETRA_ADAPTER_HPP 51 #include <Tpetra_MultiVector.hpp> 52 #include <Tpetra_Operator.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 109 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::CloneCopy(mv,index): numvecs must be greater than zero.");
110 #ifdef HAVE_TPETRA_DEBUG 112 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::CloneCopy(mv,index): indices must be >= zero.");
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) {
120 return mv.subCopy(stinds);
131 const bool validRange = index.
size() > 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()
141 os.str() <<
"Empty index range is not allowed.");
143 os.str() <<
"Index range includes negative " 144 "index/ices, which is not allowed.");
147 std::invalid_argument,
148 os.str() <<
"Index range exceeds number of vectors " 149 << mv.getNumVectors() <<
" in the input multivector.");
151 os.str() <<
"Should never get here!");
153 return mv.subCopy (index);
160 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::CloneView(mv,index): numvecs must be greater than zero.");
161 #ifdef HAVE_TPETRA_DEBUG 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) {
171 return mv.subViewNonConst(stinds);
186 const int numCols =
static_cast<int> (mv.getNumVectors());
187 const bool validRange = index.
size() > 0 &&
191 std::ostringstream os;
192 os <<
"Belos::MultiVecTraits<Scalar, Tpetra::MultiVector<...> >::" 193 "CloneViewNonConst(mv,index=[" << index.
lbound() <<
", " 194 << index.
ubound() <<
"]): ";
196 os.str() <<
"Empty index range is not allowed.");
198 os.str() <<
"Index range includes negative " 199 "index/ices, which is not allowed.");
201 os.str() <<
"Index range exceeds number of " 202 "vectors " << numCols <<
" in the input " 205 os.str() <<
"Should never get here!");
207 return mv.subViewNonConst (index);
214 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::CloneView(mv,index): numvecs must be greater than zero.");
215 #ifdef HAVE_TPETRA_DEBUG 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) {
225 return mv.subView(stinds);
239 const int numCols =
static_cast<int> (mv.getNumVectors());
240 const bool validRange = index.
size() > 0 &&
244 std::ostringstream os;
245 os <<
"Belos::MultiVecTraits<Scalar, Tpetra::MultiVector<...> >::" 246 "CloneView(mv, index=[" << index.
lbound() <<
", " 247 << index.
ubound() <<
"]): ";
249 os.str() <<
"Empty index range is not allowed.");
251 os.str() <<
"Index range includes negative " 252 "index/ices, which is not allowed.");
254 os.str() <<
"Index range exceeds number of " 255 "vectors " << numCols <<
" in the input " 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(); }
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);
286 #ifdef HAVE_BELOS_TPETRA_TIMERS 291 Tpetra::Map<LO,GO,Node> LocalMap(
B.numRows(), 0, Teuchos::rcpFromRef< const Teuchos::Comm<int> >(scomm), Tpetra::LocallyReplicated,
A.getMap()->getNode());
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 )
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)
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 335 const int numRowsC =
C.numRows(),
336 numColsC =
C.numCols(),
337 strideC =
C.stride();
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;
350 if (pcomm->getSize() == 1) {
353 C_mv.get1dCopy(C_view,strideC);
358 if (strideC == numRowsC) {
360 Teuchos::reduceAll<int,Scalar>(*pcomm,Teuchos::REDUCE_SUM,numColsC*numRowsC,C_mv_view.
getRawPtr(),C_view.getRawPtr());
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];
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 381 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::MvDot(A,B,dots): dots must have room for all dot products.");
387 for (
unsigned int i=0; i<
A.getNumVectors(); i++)
388 dots[i] = pce_dots[i].coeff(0);
393 #ifdef HAVE_TPETRA_DEBUG 395 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::MvNorm(mv,normvec): normvec must have room for all norms.");
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 426 "Belos::MultiVecTraits<Scalar,Tpetra::MultiVector>::SetBlock(A,index,mv): index must be the same size as A.");
429 if ((
typename std::vector<int>::size_type)
A.getNumVectors() > index.size()) {
436 mvsub = Teuchos::null;
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): ";
460 os.str() <<
"Number of columns in the input multi" 461 "vector 'A' (a size_t) overflows int.");
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): ";
481 os.str() <<
"Range lower bound must be nonnegative.");
483 os.str() <<
"Range upper bound must be less than " 484 "the number of columns " << numColsA <<
" in the " 485 "'mv' output argument.");
487 os.str() <<
"Range must have no more elements than" 488 " the number of columns " << numColsA <<
" in the " 489 "'A' input argument.");
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);
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): ";
540 os.str() <<
"Number of columns in the input multi" 541 "vector 'A' (a size_t) overflows int.");
543 os.str() <<
"Number of columns in the output multi" 544 "vector 'mv' (a size_t) overflows int.");
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): ";
556 os.str() <<
"Input multivector 'A' has " 557 << numColsA <<
" columns, but output multivector " 558 "'mv' has only " << numColsMv <<
" columns.");
566 if (numColsA == numColsMv)
583 { mv.putScalar(alpha); }
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)
632 const std::string otName =
"Belos::OperatorTraits<" + scalarName
633 +
"," + loName +
"," + goName +
"," + nodeName +
">";
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)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
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)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
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)
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)
static std::string name()