Thyra Version of the Day
Loading...
Searching...
No Matches
Thyra_TpetraVector_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_VECTOR_HPP
11#define THYRA_TPETRA_VECTOR_HPP
12
13
14#include "Thyra_TpetraVector_decl.hpp"
15#include "Thyra_TpetraMultiVector.hpp"
16#include "Kokkos_Core.hpp"
17
18namespace Thyra {
19
20
21// Constructors/initializers/accessors
22
23
24template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
26
27
28template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
29TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>::~TpetraVector() = default;
30
31
32template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
35 const RCP<Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVector
36 )
37{
38 initializeImpl(tpetraVectorSpace, tpetraVector);
39}
40
41
42template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
45 const RCP<const Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVector
46 )
47{
48 initializeImpl(tpetraVectorSpace, tpetraVector);
49}
50
51
52template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
55{
56 return tpetraVector_.getNonconstObj();
57}
58
59
60template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
66
67
68// Overridden from VectorDefaultBase
69template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
72{
73 if (domainSpace_.is_null()) {
74 domainSpace_ = tpetraVectorSpace<Scalar>(
75 Tpetra::createLocalMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
76 1,
77 tpetraVector_.getConstObj()->getMap()->getComm()
78 )
79 );
80 }
81 return domainSpace_;
82}
83
84
85// Overridden from SpmdMultiVectorBase
86
87
88template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
91{
92 return tpetraVectorSpace_;
93}
94
95
96// Overridden from SpmdVectorBase
97
98
99template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
101 const Ptr<ArrayRCP<Scalar> > &localValues )
102{
103 *localValues = tpetraVector_.getNonconstObj()->get1dViewNonConst();
104}
105
106
107template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
109 const Ptr<ArrayRCP<const Scalar> > &localValues ) const
110{
111 *localValues = tpetraVector_->get1dView();
112}
113
114
115// Overridden from VectorBase
116
117
118template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
120 Scalar l,
121 Scalar u
122 )
123{
124 // Tpetra randomizes with different seed for each proc, so need a global
125 // reduction to get locally-replicated random vector same on each proc.
126 if (!tpetraVector_.getNonconstObj()->isDistributed()) {
127 auto comm = tpetraVector_.getNonconstObj()->getMap()->getComm();
128 if (tpetraVector_.getConstObj()->getMap()->getComm()->getRank() == 0)
129 tpetraVector_.getNonconstObj()->randomize(l, u);
130 else
131 tpetraVector_.getNonconstObj()->putScalar(Teuchos::ScalarTraits<Scalar>::zero());
132 tpetraVector_.getNonconstObj()->reduce();
133 } else {
134 tpetraVector_.getNonconstObj()->randomize(l, u);
135 }
136}
137
138
139template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
141 const VectorBase<Scalar>& x
142 )
143{
144 auto tx = this->getConstTpetraVector(Teuchos::rcpFromRef(x));
145
146 // If the cast succeeded, call Tpetra directly.
147 // Otherwise, fall back to the RTOp implementation.
148 if (nonnull(tx)) {
149 tpetraVector_.getNonconstObj()->abs(*tx);
150 } else {
152 }
153}
154
155
156template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
158 const VectorBase<Scalar>& x
159 )
160{
161 auto tx = this->getConstTpetraVector(Teuchos::rcpFromRef(x));
162
163 // If the cast succeeded, call Tpetra directly.
164 // Otherwise, fall back to the RTOp implementation.
165 if (nonnull(tx)) {
166 tpetraVector_.getNonconstObj()->reciprocal(*tx);
167 } else {
169 }
170}
171
172
173template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
175 const VectorBase<Scalar>& x
176 )
177{
178 auto tx = this->getConstTpetraVector(Teuchos::rcpFromRef(x));
179
180 // If the cast succeeded, call Tpetra directly.
181 // Otherwise, fall back to the RTOp implementation.
182 if (nonnull(tx)) {
184 tpetraVector_.getNonconstObj()->elementWiseMultiply(
185 ST::one(), *tx, *tpetraVector_.getConstObj(), ST::zero());
186 } else {
188 }
189}
190
191
192template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
195 const VectorBase<Scalar>& x
196 ) const
197{
198 auto tx = this->getConstTpetraVector(Teuchos::rcpFromRef(x));
199
200 // If the cast succeeded, call Tpetra directly.
201 // Otherwise, fall back to the RTOp implementation.
202 if (nonnull(tx)) {
203 // Weighted 2-norm function for Tpetra vector seems to be deprecated...
206 = Tpetra::createVector<Scalar>(tx->getMap());
207 temp->elementWiseMultiply(
208 ST::one(), *tx, *tpetraVector_.getConstObj(), ST::zero());
209 return ST::magnitude(ST::squareroot(tpetraVector_.getConstObj()->dot(*temp)));
210 } else {
212 }
213}
214
215
216template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
218 const RTOpPack::RTOpT<Scalar> &op,
219 const ArrayView<const Ptr<const VectorBase<Scalar> > > &vecs,
220 const ArrayView<const Ptr<VectorBase<Scalar> > > &targ_vecs,
221 const Ptr<RTOpPack::ReductTarget> &reduct_obj,
222 const Ordinal global_offset
223 ) const
224{
225 SpmdVectorDefaultBase<Scalar>::applyOpImpl(op, vecs, targ_vecs, reduct_obj, global_offset);
226}
227
228
229template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
238
239
240template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
250
251
252template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
260
261
262// Overridden protected functions from MultiVectorBase
263
264
265template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
267{
268 tpetraVector_.getNonconstObj()->putScalar(alpha);
269}
270
271
272template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
275{
276 auto tmv = this->getConstTpetraMultiVector(Teuchos::rcpFromRef(mv));
277
278 // If cast succeeded, call Tpetra directly.
279 // Otherwise, fall back to the RTOp implementation.
280 if (nonnull(tmv)) {
281 tpetraVector_.getNonconstObj()->assign(*tmv);
282 } else {
284 }
285}
286
287
288template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
290{
291 tpetraVector_.getNonconstObj()->scale(alpha);
292}
293
294
295template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
297 Scalar alpha,
299 )
300{
301 auto tmv = this->getConstTpetraMultiVector(Teuchos::rcpFromRef(mv));
302
303 // If cast succeeded, call Tpetra directly.
304 // Otherwise, fall back to the RTOp implementation.
306 if (nonnull(tmv)) {
307 tpetraVector_.getNonconstObj()->update(alpha, *tmv, ST::one());
308 } else {
310 }
311}
312
313
314template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
316 const ArrayView<const Scalar>& alpha,
317 const ArrayView<const Ptr<const MultiVectorBase<Scalar> > >& mv,
318 const Scalar& beta
319 )
320{
321#ifdef TEUCHOS_DEBUG
322 TEUCHOS_ASSERT_EQUALITY(alpha.size(), mv.size());
323#endif
324
325 // Try to cast mv to Tpetra objects
328 bool allCastsSuccessful = true;
329 {
330 auto mvIter = mv.begin();
331 auto tmvIter = tmvs.begin();
332 for (; mvIter != mv.end(); ++mvIter, ++tmvIter) {
333 tmv = this->getConstTpetraMultiVector(Teuchos::rcpFromPtr(*mvIter));
334 if (nonnull(tmv)) {
335 *tmvIter = tmv;
336 } else {
337 allCastsSuccessful = false;
338 break;
339 }
340 }
341 }
342
343 // If casts succeeded, or input arrays are size 0, call Tpetra directly.
344 // Otherwise, fall back to the RTOp implementation.
345 auto len = mv.size();
346 if (len == 0) {
347 tpetraVector_.getNonconstObj()->scale(beta);
348 } else if (len == 1 && allCastsSuccessful) {
349 tpetraVector_.getNonconstObj()->update(alpha[0], *tmvs[0], beta);
350 } else if (len == 2 && allCastsSuccessful) {
351 tpetraVector_.getNonconstObj()->update(alpha[0], *tmvs[0], alpha[1], *tmvs[1], beta);
352 } else if (allCastsSuccessful) {
354 auto tmvIter = tmvs.begin();
355 auto alphaIter = alpha.begin();
356
357 // Check if any entry of tmvs aliases this object's wrapped vector.
358 // If so, replace that entry in the array with a copy.
359 tmv = Teuchos::null;
360 for (; tmvIter != tmvs.end(); ++tmvIter) {
361 if (tmvIter->getRawPtr() == tpetraVector_.getConstObj().getRawPtr()) {
362 if (tmv.is_null()) {
363 tmv = Teuchos::rcp(new TpetraMultiVector_t(
364 *tpetraVector_.getConstObj(), Teuchos::Copy));
365 }
366 *tmvIter = tmv;
367 }
368 }
369 tmvIter = tmvs.begin();
370
371 // We add two MVs at a time, so only scale if even num MVs,
372 // and additionally do the first addition if odd num MVs.
373 if ((tmvs.size() % 2) == 0) {
374 tpetraVector_.getNonconstObj()->scale(beta);
375 } else {
376 tpetraVector_.getNonconstObj()->update(*alphaIter, *(*tmvIter), beta);
377 ++tmvIter;
378 ++alphaIter;
379 }
380 for (; tmvIter != tmvs.end(); tmvIter+=2, alphaIter+=2) {
381 tpetraVector_.getNonconstObj()->update(
382 *alphaIter, *(*tmvIter), *(alphaIter+1), *(*(tmvIter+1)), ST::one());
383 }
384 } else {
386 }
387}
388
389
390template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
392 const MultiVectorBase<Scalar>& mv,
393 const ArrayView<Scalar>& prods
394 ) const
395{
396 auto tmv = this->getConstTpetraMultiVector(Teuchos::rcpFromRef(mv));
397
398 // If the cast succeeded, call Tpetra directly.
399 // Otherwise, fall back to the RTOp implementation.
400 if (nonnull(tmv)) {
401 tpetraVector_.getConstObj()->dot(*tmv, prods);
402 } else {
404 }
405}
406
407
408template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
411 ) const
412{
413 tpetraVector_.getConstObj()->norm1(norms);
414}
415
416
417template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
420 ) const
421{
422 tpetraVector_.getConstObj()->norm2(norms);
423}
424
425
426template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
429 ) const
430{
431 tpetraVector_.getConstObj()->normInf(norms);
432}
433
434
435template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
437 const EOpTransp M_trans,
439 const Ptr<MultiVectorBase<Scalar> > &Y,
440 const Scalar alpha,
441 const Scalar beta
442 ) const
443{
444 // Try to extract Tpetra objects from X and Y
445 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TMV;
446 Teuchos::RCP<const TMV> X_tpetra = this->getConstTpetraMultiVector(Teuchos::rcpFromRef(X));
447 Teuchos::RCP<TMV> Y_tpetra = this->getTpetraMultiVector(Teuchos::rcpFromPtr(Y));
448
449 // If the cast succeeded, call Tpetra directly.
450 // Otherwise, fall back to the default implementation.
451 if (nonnull(X_tpetra) && nonnull(Y_tpetra)) {
453 TEUCHOS_TEST_FOR_EXCEPTION(ST::isComplex && (M_trans == CONJ),
454 std::logic_error,
455 "Error, conjugation without transposition is not allowed for complex scalar types!");
456
458 switch (M_trans) {
459 case NOTRANS:
460 trans = Teuchos::NO_TRANS;
461 break;
462 case CONJ:
463 trans = Teuchos::NO_TRANS;
464 break;
465 case TRANS:
466 trans = Teuchos::TRANS;
467 break;
468 case CONJTRANS:
469 trans = Teuchos::CONJ_TRANS;
470 break;
471 }
472
473 Y_tpetra->multiply(trans, Teuchos::NO_TRANS, alpha, *tpetraVector_.getConstObj(), *X_tpetra, beta);
474 Kokkos::fence();
475 } else {
476 VectorDefaultBase<Scalar>::applyImpl(M_trans, X, Y, alpha, beta);
477 }
478
479}
480
481
482// private
483
484
485template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
486template<class TpetraVector_t>
488 const RCP<const TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVectorSpace,
489 const RCP<TpetraVector_t> &tpetraVector
490 )
491{
492#ifdef TEUCHOS_DEBUG
493 TEUCHOS_ASSERT(nonnull(tpetraVectorSpace));
494 TEUCHOS_ASSERT(nonnull(tpetraVector));
495#endif
496 tpetraVectorSpace_ = tpetraVectorSpace;
497 tpetraVector_.initialize(tpetraVector);
498 this->updateSpmdSpace();
499}
500
501
502template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
503RCP<Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
504TpetraVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>::
505getTpetraMultiVector(const RCP<MultiVectorBase<Scalar> >& mv) const
506{
507 using Teuchos::rcp_dynamic_cast;
508 typedef TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TMV;
509 typedef TpetraVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TV;
510
511 RCP<TMV> tmv = rcp_dynamic_cast<TMV>(mv);
512 if (nonnull(tmv)) {
513 return tmv->getTpetraMultiVector();
514 }
515
516 RCP<TV> tv = rcp_dynamic_cast<TV>(mv);
517 if (nonnull(tv)) {
518 return tv->getTpetraVector();
519 }
520
521 return Teuchos::null;
522}
523
524
525template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
526RCP<const Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
527TpetraVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>::
528getConstTpetraMultiVector(const RCP<const MultiVectorBase<Scalar> >& mv) const
529{
530 using Teuchos::rcp_dynamic_cast;
531 typedef TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TMV;
532 typedef TpetraVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TV;
533
534 RCP<const TMV> tmv = rcp_dynamic_cast<const TMV>(mv);
535 if (nonnull(tmv)) {
536 return tmv->getConstTpetraMultiVector();
537 }
538
539 RCP<const TV> tv = rcp_dynamic_cast<const TV>(mv);
540 if (nonnull(tv)) {
541 return tv->getConstTpetraVector();
542 }
543
544 return Teuchos::null;
545}
546
547
548template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
549RCP<Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
551getTpetraVector(const RCP<VectorBase<Scalar> >& v) const
552{
553 typedef TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> TV;
554 RCP<TV> tv = Teuchos::rcp_dynamic_cast<TV>(v);
555 if (nonnull(tv)) {
556 return tv->getTpetraVector();
557 } else {
558 return Teuchos::null;
559 }
560}
561
562
563template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
564RCP<const Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
566getConstTpetraVector(const RCP<const VectorBase<Scalar> >& v) const
567{
568 typedef TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> TV;
569 RCP<const TV> tv = Teuchos::rcp_dynamic_cast<const TV>(v);
570 if (nonnull(tv)) {
571 return tv->getConstTpetraVector();
572 } else {
573 return Teuchos::null;
574 }
575}
576
577template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
578RCP<TpetraVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
579tpetraVector(
580 const RCP<const TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVectorSpace,
581 const RCP<Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVector
582 )
583{
586 v->initialize(tpetraVectorSpace, tpetraVector);
587 return v;
588}
589
590template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
592constTpetraVector(
593 const RCP<const TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVectorSpace,
594 const RCP<const Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVector
595 )
596{
599 v->constInitialize(tpetraVectorSpace, tpetraVector);
600 return v;
601}
602
603
604} // end namespace Thyra
605
606#define THYRATPETRAADAPTERS_TPETRAVECTOR_INSTANT(S, LO, GO, N) \
607 template class Thyra::TpetraVector<S, LO, GO, N>; \
608 \
609 template Teuchos::RCP<Thyra::TpetraVector<S, LO, GO, N>> \
610 Thyra::tpetraVector( \
611 const Teuchos::RCP<const Thyra::TpetraVectorSpace<S, LO, GO, N>> &, \
612 const Teuchos::RCP<Tpetra::Vector<S, LO, GO, N>> &); \
613 \
614 template Teuchos::RCP<const Thyra::TpetraVector<S, LO, GO, N>> \
615 Thyra::constTpetraVector( \
616 const Teuchos::RCP<const Thyra::TpetraVectorSpace<S, LO, GO, N>> &, \
617 const Teuchos::RCP<const Tpetra::Vector<S, LO, GO, N>> &);
618
619#endif // THYRA_TPETRA_VECTOR_HPP
iterator begin()
size_type size() const
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 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 applyOpImpl(const RTOpPack::RTOpT< Scalar > &op, const ArrayView< const Ptr< const VectorBase< Scalar > > > &vecs, const ArrayView< const Ptr< VectorBase< Scalar > > > &targ_vecs, const Ptr< RTOpPack::ReductTarget > &reduct_obj, const Ordinal global_offset) const
Calls applyOpImplWithComm(null,op,...).
void acquireNonconstDetachedVectorViewImpl(const Range1D &rng, RTOpPack::SubVectorView< Scalar > *sub_vec)
Implemented through this->getLocalData()
void acquireDetachedVectorViewImpl(const Range1D &rng, RTOpPack::ConstSubVectorView< Scalar > *sub_vec) const
Implemented through this->getLocalData()
void commitNonconstDetachedVectorViewImpl(RTOpPack::SubVectorView< Scalar > *sub_vec)
Implemented through this->commitLocalData()
Concrete Thyra::SpmdVectorBase using Tpetra::Vector.
void acquireNonconstDetachedVectorViewImpl(const Range1D &rng, RTOpPack::SubVectorView< Scalar > *sub_vec)
void getLocalVectorDataImpl(const Ptr< ArrayRCP< const Scalar > > &localValues) const
virtual void assignImpl(Scalar alpha)
virtual Teuchos::ScalarTraits< Scalar >::magnitudeType norm2WeightedImpl(const VectorBase< Scalar > &x) const
virtual void randomizeImpl(Scalar l, Scalar u)
virtual void eleWiseScaleImpl(const VectorBase< Scalar > &x)
RCP< Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getTpetraVector()
Get the embedded non-const Tpetra::Vector.
RCP< const VectorSpaceBase< Scalar > > domain() const
virtual void linearCombinationImpl(const ArrayView< const Scalar > &alpha, const ArrayView< const Ptr< const MultiVectorBase< Scalar > > > &mv, const Scalar &beta)
RCP< const SpmdVectorSpaceBase< Scalar > > spmdSpaceImpl() const
virtual void dotsImpl(const MultiVectorBase< Scalar > &mv, const ArrayView< Scalar > &prods) const
void getNonconstLocalVectorDataImpl(const Ptr< ArrayRCP< Scalar > > &localValues)
virtual void scaleImpl(Scalar alpha)
TpetraVector()
Construct to uninitialized.
virtual void absImpl(const VectorBase< Scalar > &x)
void constInitialize(const RCP< const TpetraVectorSpace< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVectorSpace, const RCP< const Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVector)
Initialize.
virtual void assignMultiVecImpl(const MultiVectorBase< Scalar > &mv)
virtual void updateImpl(Scalar alpha, const MultiVectorBase< Scalar > &mv)
virtual void normsInfImpl(const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms) const
void commitNonconstDetachedVectorViewImpl(RTOpPack::SubVectorView< Scalar > *sub_vec)
virtual void norms1Impl(const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms) const
virtual void reciprocalImpl(const VectorBase< Scalar > &x)
virtual void applyOpImpl(const RTOpPack::RTOpT< Scalar > &op, const ArrayView< const Ptr< const VectorBase< Scalar > > > &vecs, const ArrayView< const Ptr< VectorBase< Scalar > > > &targ_vecs, const Ptr< RTOpPack::ReductTarget > &reduct_obj, const Ordinal global_offset) const
void acquireDetachedVectorViewImpl(const Range1D &rng, RTOpPack::ConstSubVectorView< Scalar > *sub_vec) const
void applyImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const
virtual void norms2Impl(const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms) const
RCP< const Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getConstTpetraVector() const
Get the embedded non-const Tpetra::Vector.
void initialize(const RCP< const TpetraVectorSpace< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVectorSpace, const RCP< Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVector)
Initialize.
Concrete implementation of an SPMD vector space for Tpetra.
Abstract interface for finite-dimensional dense vectors.
void applyImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const
. Applies vector or its adjoint (transpose) as a linear operator.
virtual Teuchos::ScalarTraits< Scalar >::magnitudeType norm2WeightedImpl(const VectorBase< Scalar > &x) const
Default implementation of norm_2 (weighted) using RTOps.
virtual void reciprocalImpl(const VectorBase< Scalar > &x)
Default implementation of reciprocal using RTOps.
virtual void absImpl(const VectorBase< Scalar > &x)
Default implementation of abs using RTOps.
virtual void eleWiseScaleImpl(const VectorBase< Scalar > &x)
Default implementation of ele_wise_scale using RTOps.
#define TEUCHOS_ASSERT(assertion_test)
#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)