Thyra Version of the Day
Loading...
Searching...
No Matches
Thyra_TpetraMultiVector_def.hpp
1// @HEADER
2// *****************************************************************************
3// Thyra: Interfaces and Support for Abstract Numerical Algorithms
4//
5// Copyright 2004 NTESS and the Thyra contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef THYRA_TPETRA_MULTIVECTOR_HPP
11#define THYRA_TPETRA_MULTIVECTOR_HPP
12
13#include "Thyra_TpetraMultiVector_decl.hpp"
14#include "Thyra_TpetraVectorSpace.hpp"
15#include "Thyra_TpetraVector.hpp"
16#include "Teuchos_Assert.hpp"
17#include "Kokkos_Core.hpp"
18
19
20namespace Thyra {
21
22
23// Constructors/initializers/accessors
24
25
26template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
28
29
30template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
31TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>::~TpetraMultiVector() = default;
32
33
34template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
37 const RCP<const ScalarProdVectorSpaceBase<Scalar> > &domainSpace,
38 const RCP<Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraMultiVector
39 )
40{
41 initializeImpl(tpetraVectorSpace, domainSpace, tpetraMultiVector);
42}
43
44
45template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
48 const RCP<const ScalarProdVectorSpaceBase<Scalar> > &domainSpace,
49 const RCP<const Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraMultiVector
50 )
51{
52 initializeImpl(tpetraVectorSpace, domainSpace, tpetraMultiVector);
53}
54
55
56template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
59{
60 return tpetraMultiVector_.getNonconstObj();
61}
62
63
64template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
70
71
72// Overridden public functions form MultiVectorAdapterBase
73
74
75template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
81
82
83// Overridden protected functions from MultiVectorBase
84
85
86template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
87void
89{
90 tpetraMultiVector_.getNonconstObj()->putScalar(alpha);
91}
92
93
94template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
97{
98 auto tmv = this->getConstTpetraMultiVector(Teuchos::rcpFromRef(mv));
99
100 // If the cast succeeded, call Tpetra directly.
101 // Otherwise, fall back to the RTOp implementation.
102 if (nonnull(tmv)) {
103 tpetraMultiVector_.getNonconstObj()->assign(*tmv);
104 } else {
106 }
107}
108
109
110template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
111void
113{
114 tpetraMultiVector_.getNonconstObj()->scale(alpha);
115}
116
117
118template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
120 Scalar alpha,
122 )
123{
124 auto tmv = this->getConstTpetraMultiVector(Teuchos::rcpFromRef(mv));
125
126 // If the cast succeeded, call Tpetra directly.
127 // Otherwise, fall back to the RTOp implementation.
128 if (nonnull(tmv)) {
130 tpetraMultiVector_.getNonconstObj()->update(alpha, *tmv, ST::one());
131 } else {
133 }
134}
135
136
137template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
139 const ArrayView<const Scalar>& alpha,
140 const ArrayView<const Ptr<const MultiVectorBase<Scalar> > >& mv,
141 const Scalar& beta
142 )
143{
144#ifdef TEUCHOS_DEBUG
145 TEUCHOS_ASSERT_EQUALITY(alpha.size(), mv.size());
146#endif
147
148 // Try to cast mv to an array of this type
149 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TMV;
150 Teuchos::Array<RCP<const TMV> > tmvs(mv.size());
151 RCP<const TMV> tmv;
152 bool allCastsSuccessful = true;
153 {
154 auto mvIter = mv.begin();
155 auto tmvIter = tmvs.begin();
156 for (; mvIter != mv.end(); ++mvIter, ++tmvIter) {
157 tmv = this->getConstTpetraMultiVector(Teuchos::rcpFromPtr(*mvIter));
158 if (nonnull(tmv)) {
159 *tmvIter = tmv;
160 } else {
161 allCastsSuccessful = false;
162 break;
163 }
164 }
165 }
166
167 // If casts succeeded, or input arrays are size 0, call Tpetra directly.
168 // Otherwise, fall back to the RTOp implementation.
169 auto len = tmvs.size();
170 if (len == 0) {
171 tpetraMultiVector_.getNonconstObj()->scale(beta);
172 } else if (len == 1 && allCastsSuccessful) {
173 tpetraMultiVector_.getNonconstObj()->update(alpha[0], *tmvs[0], beta);
174 } else if (len == 2 && allCastsSuccessful) {
175 tpetraMultiVector_.getNonconstObj()->update(alpha[0], *tmvs[0], alpha[1], *tmvs[1], beta);
176 } else if (allCastsSuccessful) {
178 auto tmvIter = tmvs.begin();
179 auto alphaIter = alpha.begin();
180
181 // Check if any entry of tmvs aliases this object's wrapped vector.
182 // If so, replace that entry in the array with a copy.
183 tmv = Teuchos::null;
184 for (; tmvIter != tmvs.end(); ++tmvIter) {
185 if (tmvIter->getRawPtr() == tpetraMultiVector_.getConstObj().getRawPtr()) {
186 if (tmv.is_null()) {
187 tmv = Teuchos::rcp(new TMV(*tpetraMultiVector_.getConstObj(), Teuchos::Copy));
188 }
189 *tmvIter = tmv;
190 }
191 }
192 tmvIter = tmvs.begin();
193
194 // We add two MVs at a time, so only scale if even num MVs,
195 // and additionally do the first addition if odd num MVs.
196 if ((tmvs.size() % 2) == 0) {
197 tpetraMultiVector_.getNonconstObj()->scale(beta);
198 } else {
199 tpetraMultiVector_.getNonconstObj()->update(*alphaIter, *(*tmvIter), beta);
200 ++tmvIter;
201 ++alphaIter;
202 }
203 for (; tmvIter != tmvs.end(); tmvIter+=2, alphaIter+=2) {
204 tpetraMultiVector_.getNonconstObj()->update(
205 *alphaIter, *(*tmvIter), *(alphaIter+1), *(*(tmvIter+1)), ST::one());
206 }
207 } else {
209 }
210}
211
212
213template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
215 const MultiVectorBase<Scalar>& mv,
216 const ArrayView<Scalar>& prods
217 ) const
218{
219 auto tmv = this->getConstTpetraMultiVector(Teuchos::rcpFromRef(mv));
220
221 // If the cast succeeded, call Tpetra directly.
222 // Otherwise, fall back to the RTOp implementation.
223 if (nonnull(tmv)) {
224 tpetraMultiVector_.getConstObj()->dot(*tmv, prods);
225 } else {
227 }
228}
229
230
231template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
234 ) const
235{
236 tpetraMultiVector_.getConstObj()->norm1(norms);
237}
238
239
240template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
243 ) const
244{
245 tpetraMultiVector_.getConstObj()->norm2(norms);
246}
247
248
249template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
252 ) const
253{
254 tpetraMultiVector_.getConstObj()->normInf(norms);
255}
256
257
258template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
261{
262#ifdef TEUCHOS_DEBUG
263 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(j, 0, this->domain()->dim());
264#endif
265 return constTpetraVector<Scalar>(
266 tpetraVectorSpace_,
267 tpetraMultiVector_->getVector(j)
268 );
269}
270
271
272template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
275{
276#ifdef TEUCHOS_DEBUG
277 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(j, 0, this->domain()->dim());
278#endif
279 return tpetraVector<Scalar>(
280 tpetraVectorSpace_,
281 tpetraMultiVector_.getNonconstObj()->getVectorNonConst(j)
282 );
283}
284
285
286template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
289 const Range1D& col_rng_in
290 ) const
291{
292#ifdef THYRA_DEFAULT_SPMD_MULTI_VECTOR_VERBOSE_TO_ERROR_OUT
293 std::cerr << "\nTpetraMultiVector::subView(Range1D) const called!\n";
294#endif
295 const Range1D colRng = this->validateColRange(col_rng_in);
296
298 this->getConstTpetraMultiVector()->subView(colRng);
299
300 const RCP<const ScalarProdVectorSpaceBase<Scalar> > viewDomainSpace =
301 tpetraVectorSpace<Scalar>(
302 Tpetra::createLocalMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
303 tpetraView->getNumVectors(),
304 tpetraView->getMap()->getComm()
305 )
306 );
307
308 return constTpetraMultiVector(
309 tpetraVectorSpace_,
310 viewDomainSpace,
311 tpetraView
312 );
313}
314
315
316template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
319 const Range1D& col_rng_in
320 )
321{
322#ifdef THYRA_DEFAULT_SPMD_MULTI_VECTOR_VERBOSE_TO_ERROR_OUT
323 std::cerr << "\nTpetraMultiVector::subView(Range1D) called!\n";
324#endif
325 const Range1D colRng = this->validateColRange(col_rng_in);
326
328 this->getTpetraMultiVector()->subViewNonConst(colRng);
329
330 const RCP<const ScalarProdVectorSpaceBase<Scalar> > viewDomainSpace =
331 tpetraVectorSpace<Scalar>(
332 Tpetra::createLocalMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
333 tpetraView->getNumVectors(),
334 tpetraView->getMap()->getComm()
335 )
336 );
337
338 return tpetraMultiVector(
339 tpetraVectorSpace_,
340 viewDomainSpace,
341 tpetraView
342 );
343}
344
345
346template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
349 const ArrayView<const int>& cols_in
350 ) const
351{
352#ifdef THYRA_DEFAULT_SPMD_MULTI_VECTOR_VERBOSE_TO_ERROR_OUT
353 std::cerr << "\nTpetraMultiVector::subView(ArrayView) const called!\n";
354#endif
355 // Tpetra wants col indices as size_t
356 Array<std::size_t> cols(cols_in.size());
357 for (Array<std::size_t>::size_type i = 0; i < cols.size(); ++i)
358 cols[i] = static_cast<std::size_t>(cols_in[i]);
359
361 this->getConstTpetraMultiVector()->subView(cols());
362
363 const RCP<const ScalarProdVectorSpaceBase<Scalar> > viewDomainSpace =
364 tpetraVectorSpace<Scalar>(
365 Tpetra::createLocalMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
366 tpetraView->getNumVectors(),
367 tpetraView->getMap()->getComm()
368 )
369 );
370
371 return constTpetraMultiVector(
372 tpetraVectorSpace_,
373 viewDomainSpace,
374 tpetraView
375 );
376}
377
378
379template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
382 const ArrayView<const int>& cols_in
383 )
384{
385#ifdef THYRA_DEFAULT_SPMD_MULTI_VECTOR_VERBOSE_TO_ERROR_OUT
386 std::cerr << "\nTpetraMultiVector::subView(ArrayView) called!\n";
387#endif
388 // Tpetra wants col indices as size_t
389 Array<std::size_t> cols(cols_in.size());
390 for (Array<std::size_t>::size_type i = 0; i < cols.size(); ++i)
391 cols[i] = static_cast<std::size_t>(cols_in[i]);
392
394 this->getTpetraMultiVector()->subViewNonConst(cols());
395
396 const RCP<const ScalarProdVectorSpaceBase<Scalar> > viewDomainSpace =
397 tpetraVectorSpace<Scalar>(
398 Tpetra::createLocalMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
399 tpetraView->getNumVectors(),
400 tpetraView->getMap()->getComm()
401 )
402 );
403
404 return tpetraMultiVector(
405 tpetraVectorSpace_,
406 viewDomainSpace,
407 tpetraView
408 );
409}
410
411
412template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
415 const RTOpPack::RTOpT<Scalar> &primary_op,
416 const ArrayView<const Ptr<const MultiVectorBase<Scalar> > > &multi_vecs,
417 const ArrayView<const Ptr<MultiVectorBase<Scalar> > > &targ_multi_vecs,
418 const ArrayView<const Ptr<RTOpPack::ReductTarget> > &reduct_objs,
419 const Ordinal primary_global_offset
420 ) const
421{
422
424 primary_op, multi_vecs, targ_multi_vecs, reduct_objs, primary_global_offset);
425}
426
427
428template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
439
440
441template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
452
453
454template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
464
465
466/* ToDo: Implement these?
467
468
469template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
470RCP<const MultiVectorBase<Scalar> >
471TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>::nonContigSubViewImpl(
472 const ArrayView<const int> &cols
473 ) const
474{
475 THYRA_DEBUG_ASSERT_MV_COLS("nonContigSubViewImpl(cols)", cols);
476 const int numCols = cols.size();
477 const ArrayRCP<Scalar> localValuesView = createContiguousCopy(cols);
478 return defaultSpmdMultiVector<Scalar>(
479 spmdRangeSpace_,
480 createSmallScalarProdVectorSpaceBase<Scalar>(spmdRangeSpace_, numCols),
481 localValuesView
482 );
483}
484
485
486template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
487RCP<MultiVectorBase<Scalar> >
488TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>::nonconstNonContigSubViewImpl(
489 const ArrayView<const int> &cols )
490{
491 THYRA_DEBUG_ASSERT_MV_COLS("nonContigSubViewImpl(cols)", cols);
492 const int numCols = cols.size();
493 const ArrayRCP<Scalar> localValuesView = createContiguousCopy(cols);
494 const Ordinal localSubDim = spmdRangeSpace_->localSubDim();
495 RCP<CopyBackSpmdMultiVectorEntries<Scalar> > copyBackView =
496 copyBackSpmdMultiVectorEntries<Scalar>(cols, localValuesView.getConst(),
497 localSubDim, localValues_.create_weak(), leadingDim_);
498 return Teuchos::rcpWithEmbeddedObjPreDestroy(
499 new TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>(
500 spmdRangeSpace_,
501 createSmallScalarProdVectorSpaceBase<Scalar>(spmdRangeSpace_, numCols),
502 localValuesView),
503 copyBackView
504 );
505}
506
507*/
508
509
510// Overridden protected members from SpmdMultiVectorBase
511
512
513template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
519
520
521template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
523 const Ptr<ArrayRCP<Scalar> > &localValues, const Ptr<Ordinal> &leadingDim
524 )
525{
526 *localValues = tpetraMultiVector_.getNonconstObj()->get1dViewNonConst();
527 *leadingDim = tpetraMultiVector_->getStride();
528}
529
530
531template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
533 const Ptr<ArrayRCP<const Scalar> > &localValues, const Ptr<Ordinal> &leadingDim
534 ) const
535{
536 *localValues = tpetraMultiVector_->get1dView();
537 *leadingDim = tpetraMultiVector_->getStride();
538}
539
540
541template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
543 const EOpTransp M_trans,
545 const Ptr<MultiVectorBase<Scalar> > &Y,
546 const Scalar alpha,
547 const Scalar beta
548 ) const
549{
550 // Try to extract Tpetra objects from X and Y
551 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TMV;
552 Teuchos::RCP<const TMV> X_tpetra = this->getConstTpetraMultiVector(Teuchos::rcpFromRef(X));
553 Teuchos::RCP<TMV> Y_tpetra = this->getTpetraMultiVector(Teuchos::rcpFromPtr(Y));
554
555 // If the cast succeeded, call Tpetra directly.
556 // Otherwise, fall back to the default implementation.
557 if (nonnull(X_tpetra) && nonnull(Y_tpetra)) {
559 TEUCHOS_TEST_FOR_EXCEPTION(ST::isComplex && (M_trans == CONJ),
560 std::logic_error,
561 "Error, conjugation without transposition is not allowed for complex scalar types!");
562
564 switch (M_trans) {
565 case NOTRANS:
566 trans = Teuchos::NO_TRANS;
567 break;
568 case CONJ:
569 trans = Teuchos::NO_TRANS;
570 break;
571 case TRANS:
572 trans = Teuchos::TRANS;
573 break;
574 case CONJTRANS:
575 trans = Teuchos::CONJ_TRANS;
576 break;
577 }
578
579 Y_tpetra->multiply(trans, Teuchos::NO_TRANS, alpha, *tpetraMultiVector_.getConstObj(), *X_tpetra, beta);
580 Kokkos::fence();
581 } else {
582 SpmdMultiVectorDefaultBase<Scalar>::euclideanApply(M_trans, X, Y, alpha, beta);
583 }
584
585}
586
587// private
588
589
590template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
591template<class TpetraMultiVector_t>
593 const RCP<const TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVectorSpace,
594 const RCP<const ScalarProdVectorSpaceBase<Scalar> > &domainSpace,
595 const RCP<TpetraMultiVector_t> &tpetraMultiVector
596 )
597{
598#ifdef THYRA_DEBUG
599 TEUCHOS_ASSERT(nonnull(tpetraVectorSpace));
600 TEUCHOS_ASSERT(nonnull(domainSpace));
601 TEUCHOS_ASSERT(nonnull(tpetraMultiVector));
602 // ToDo: Check to make sure that tpetraMultiVector is compatible with
603 // tpetraVectorSpace.
604#endif
605 tpetraVectorSpace_ = tpetraVectorSpace;
606 domainSpace_ = domainSpace;
607 tpetraMultiVector_.initialize(tpetraMultiVector);
608 this->updateSpmdSpace();
609}
610
611
612template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
613RCP<Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
615getTpetraMultiVector(const RCP<MultiVectorBase<Scalar> >& mv) const
616{
617 using Teuchos::rcp_dynamic_cast;
620
621 RCP<TMV> tmv = rcp_dynamic_cast<TMV>(mv);
622 if (nonnull(tmv)) {
623 return tmv->getTpetraMultiVector();
624 }
625
626 RCP<TV> tv = rcp_dynamic_cast<TV>(mv);
627 if (nonnull(tv)) {
628 return tv->getTpetraVector();
629 }
630
631 return Teuchos::null;
632}
633
634template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
635RCP<const Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
637getConstTpetraMultiVector(const RCP<const MultiVectorBase<Scalar> >& mv) const
638{
639 using Teuchos::rcp_dynamic_cast;
642
643 RCP<const TMV> tmv = rcp_dynamic_cast<const TMV>(mv);
644 if (nonnull(tmv)) {
645 return tmv->getConstTpetraMultiVector();
646 }
647
648 RCP<const TV> tv = rcp_dynamic_cast<const TV>(mv);
649 if (nonnull(tv)) {
650 return tv->getConstTpetraVector();
651 }
652
653 return Teuchos::null;
654}
655
656
657template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
658RCP<TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
659tpetraMultiVector(
660 const RCP<const TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVectorSpace,
661 const RCP<const ScalarProdVectorSpaceBase<Scalar> > &domainSpace,
662 const RCP<Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraMultiVector
663 )
664{
667 tmv->initialize(tpetraVectorSpace, domainSpace, tpetraMultiVector);
668 return tmv;
669}
670
671
672template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
674constTpetraMultiVector(
675 const RCP<const TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVectorSpace,
676 const RCP<const ScalarProdVectorSpaceBase<Scalar> > &domainSpace,
677 const RCP<const Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraMultiVector
678 )
679{
682 tmv->constInitialize(tpetraVectorSpace, domainSpace, tpetraMultiVector);
683 return tmv;
684}
685
686} // end namespace Thyra
687
688#define THYRATPETRAADAPTERS_TPETRAMULTIVECTOR_INSTANT(S, LO, GO, N) \
689 template class Thyra::TpetraMultiVector<S, LO, GO, N>; \
690 \
691 template Teuchos::RCP<Thyra::TpetraMultiVector<S, LO, GO, N>> \
692 Thyra::tpetraMultiVector( \
693 const Teuchos::RCP<const Thyra::TpetraVectorSpace<S, LO, GO, N>> &, \
694 const Teuchos::RCP<const Thyra::ScalarProdVectorSpaceBase<S>> &, \
695 const Teuchos::RCP<Tpetra::MultiVector<S, LO, GO, N>> &); \
696 \
697 template Teuchos::RCP<const Thyra::TpetraMultiVector<S, LO, GO, N>> \
698 Thyra::constTpetraMultiVector( \
699 const Teuchos::RCP<const Thyra::TpetraVectorSpace<S, LO, GO, N>> &, \
700 const Teuchos::RCP<const Thyra::ScalarProdVectorSpaceBase<S>> &, \
701 const Teuchos::RCP<const Tpetra::MultiVector<S, LO, GO, N>> &r);
702
703#endif // THYRA_TPETRA_MULTIVECTOR_HPP
iterator begin()
size_type size() const
Ordinal size_type
iterator end()
iterator begin() const
size_type size() const
bool is_null() const
Interface for a collection of column vectors called a multi-vector.
virtual void mvMultiReductApplyOpImpl(const RTOpPack::RTOpT< Scalar > &primary_op, const ArrayView< const Ptr< const MultiVectorBase< Scalar > > > &multi_vecs, const ArrayView< const Ptr< MultiVectorBase< Scalar > > > &targ_multi_vecs, const ArrayView< const Ptr< RTOpPack::ReductTarget > > &reduct_objs, const Ordinal primary_global_offset) const =0
Apply a reduction/transformation operator column by column and return an array of the reduction objec...
virtual void dotsImpl(const MultiVectorBase< Scalar > &mv, const ArrayView< Scalar > &prods) const
Default implementation of dots using RTOps.
virtual void linearCombinationImpl(const ArrayView< const Scalar > &alpha, const ArrayView< const Ptr< const MultiVectorBase< Scalar > > > &mv, const Scalar &beta)
Default implementation of linear_combination using RTOps.
virtual void assignMultiVecImpl(const MultiVectorBase< Scalar > &mv)
Default implementation of assign(MV) using RTOps.
virtual void updateImpl(Scalar alpha, const MultiVectorBase< Scalar > &mv)
Default implementation of update using RTOps.
void acquireDetachedMultiVectorViewImpl(const Range1D &rowRng, const Range1D &colRng, RTOpPack::ConstSubMultiVectorView< Scalar > *sub_mv) const
void euclideanApply(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const
Uses GEMM() and Teuchos::reduceAll() to implement.
void acquireNonconstDetachedMultiVectorViewImpl(const Range1D &rowRng, const Range1D &colRng, RTOpPack::SubMultiVectorView< Scalar > *sub_mv)
void commitNonconstDetachedMultiVectorViewImpl(RTOpPack::SubMultiVectorView< Scalar > *sub_mv)
Concrete implementation of Thyra::MultiVector in terms of Tpetra::MultiVector.
RCP< Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getTpetraMultiVector()
Extract the underlying non-const Tpetra::MultiVector object.
void initialize(const RCP< const TpetraVectorSpace< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVectorSpace, const RCP< const ScalarProdVectorSpaceBase< Scalar > > &domainSpace, const RCP< Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraMultiVector)
Initialize.
RCP< const SpmdVectorSpaceBase< Scalar > > spmdSpaceImpl() const
RCP< const ScalarProdVectorSpaceBase< Scalar > > domainScalarProdVecSpc() const
RCP< const Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getConstTpetraMultiVector() const
Extract the underlying const Tpetra::MultiVector object.
virtual void norms2Impl(const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms) const
void commitNonconstDetachedMultiVectorViewImpl(RTOpPack::SubMultiVectorView< Scalar > *sub_mv)
virtual void updateImpl(Scalar alpha, const MultiVectorBase< Scalar > &mv)
void acquireNonconstDetachedMultiVectorViewImpl(const Range1D &rowRng, const Range1D &colRng, RTOpPack::SubMultiVectorView< Scalar > *sub_mv)
RCP< const VectorBase< Scalar > > colImpl(Ordinal j) const
void acquireDetachedMultiVectorViewImpl(const Range1D &rowRng, const Range1D &colRng, RTOpPack::ConstSubMultiVectorView< Scalar > *sub_mv) const
void getLocalMultiVectorDataImpl(const Ptr< ArrayRCP< const Scalar > > &localValues, const Ptr< Ordinal > &leadingDim) const
RCP< MultiVectorBase< Scalar > > nonconstNonContigSubViewImpl(const ArrayView< const int > &cols_in)
RCP< const MultiVectorBase< Scalar > > nonContigSubViewImpl(const ArrayView< const int > &cols_in) const
RCP< MultiVectorBase< Scalar > > nonconstContigSubViewImpl(const Range1D &colRng)
RCP< const MultiVectorBase< Scalar > > contigSubViewImpl(const Range1D &colRng) const
void constInitialize(const RCP< const TpetraVectorSpace< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVectorSpace, const RCP< const ScalarProdVectorSpaceBase< Scalar > > &domainSpace, const RCP< const Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraMultiVector)
Initialize.
virtual void norms1Impl(const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms) const
TpetraMultiVector()
Construct to uninitialized.
RCP< VectorBase< Scalar > > nonconstColImpl(Ordinal j)
virtual void dotsImpl(const MultiVectorBase< Scalar > &mv, const ArrayView< Scalar > &prods) const
virtual void euclideanApply(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const
virtual void assignMultiVecImpl(const MultiVectorBase< Scalar > &mv)
virtual void scaleImpl(Scalar alpha)
void getNonconstLocalMultiVectorDataImpl(const Ptr< ArrayRCP< Scalar > > &localValues, const Ptr< Ordinal > &leadingDim)
virtual void mvMultiReductApplyOpImpl(const RTOpPack::RTOpT< Scalar > &primary_op, const ArrayView< const Ptr< const MultiVectorBase< Scalar > > > &multi_vecs, const ArrayView< const Ptr< MultiVectorBase< Scalar > > > &targ_multi_vecs, const ArrayView< const Ptr< RTOpPack::ReductTarget > > &reduct_objs, const Ordinal primary_global_offset) const
virtual void assignImpl(Scalar alpha)
virtual void linearCombinationImpl(const ArrayView< const Scalar > &alpha, const ArrayView< const Ptr< const MultiVectorBase< Scalar > > > &mv, const Scalar &beta)
virtual void normsInfImpl(const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms) const
Concrete Thyra::SpmdVectorBase using Tpetra::Vector.
Concrete implementation of an SPMD vector space for Tpetra.
#define TEUCHOS_ASSERT(assertion_test)
#define TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(index, lower_inclusive, upper_exclusive)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
#define TEUCHOS_ASSERT_EQUALITY(val1, val2)
bool nonnull(const std::shared_ptr< T > &p)
EOpTransp
Enumeration for determining how a linear operator is applied. `*.
Teuchos::Ordinal Ordinal
Type for the dimension of a vector space. `*.
@ TRANS
Use the transposed operator.
@ NOTRANS
Use the non-transposed operator.
@ CONJTRANS
Use the transposed operator with complex-conjugate clements (same as TRANS for real scalar types).
@ CONJ
Use the non-transposed operator with complex-conjugate elements (same as NOTRANS for real scalar type...
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)