Thyra  Version of the Day
Thyra_TpetraMultiVector_def.hpp
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Thyra: Interfaces and Support for Abstract Numerical Algorithms
5 // Copyright (2004) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Roscoe A. Bartlett (bartlettra@ornl.gov)
38 //
39 // ***********************************************************************
40 // @HEADER
41 
42 #ifndef THYRA_TPETRA_MULTIVECTOR_HPP
43 #define THYRA_TPETRA_MULTIVECTOR_HPP
44 
45 #include "Thyra_TpetraMultiVector_decl.hpp"
46 #include "Thyra_TpetraVectorSpace.hpp"
47 #include "Thyra_TpetraVector.hpp"
48 #include "Teuchos_Assert.hpp"
49 
50 
51 namespace Thyra {
52 
53 
54 // Constructors/initializers/accessors
55 
56 
57 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
59 {}
60 
61 
62 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
64  const RCP<const TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVectorSpace,
65  const RCP<const ScalarProdVectorSpaceBase<Scalar> > &domainSpace,
66  const RCP<Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraMultiVector
67  )
68 {
69  initializeImpl(tpetraVectorSpace, domainSpace, tpetraMultiVector);
70 }
71 
72 
73 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
75  const RCP<const TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVectorSpace,
76  const RCP<const ScalarProdVectorSpaceBase<Scalar> > &domainSpace,
77  const RCP<const Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraMultiVector
78  )
79 {
80  initializeImpl(tpetraVectorSpace, domainSpace, tpetraMultiVector);
81 }
82 
83 
84 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
85 RCP<Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
87 {
88  return tpetraMultiVector_.getNonconstObj();
89 }
90 
91 
92 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
93 RCP<const Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
95 {
96  return tpetraMultiVector_;
97 }
98 
99 
100 // Overridden public functions form MultiVectorAdapterBase
101 
102 
103 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
104 RCP< const ScalarProdVectorSpaceBase<Scalar> >
106 {
107  return domainSpace_;
108 }
109 
110 
111 // Overridden protected functions from MultiVectorBase
112 
113 
114 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
115 void
117 {
118  tpetraMultiVector_.getNonconstObj()->putScalar(alpha);
119 }
120 
121 
122 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
123 RCP<const VectorBase<Scalar> >
125 {
126 #ifdef TEUCHOS_DEBUG
127  TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(j, 0, this->domain()->dim());
128 #endif
129  return constTpetraVector<Scalar>(
130  tpetraVectorSpace_,
131  tpetraMultiVector_->getVector(j)
132  );
133 }
134 
135 
136 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
137 RCP<VectorBase<Scalar> >
139 {
140 #ifdef TEUCHOS_DEBUG
141  TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(j, 0, this->domain()->dim());
142 #endif
143  return tpetraVector<Scalar>(
144  tpetraVectorSpace_,
145  tpetraMultiVector_.getNonconstObj()->getVectorNonConst(j)
146  );
147 }
148 
149 
150 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
151 RCP<const MultiVectorBase<Scalar> >
153  const Range1D& col_rng_in
154  ) const
155 {
156 #ifdef THYRA_DEFAULT_SPMD_MULTI_VECTOR_VERBOSE_TO_ERROR_OUT
157  std::cerr << "\nTpetraMultiVector::subView(Range1D) const called!\n";
158 #endif
159  const Range1D colRng = this->validateColRange(col_rng_in);
160 
161  const RCP<const Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetraView =
162  this->getConstTpetraMultiVector()->subView(colRng);
163 
164  const RCP<const ScalarProdVectorSpaceBase<Scalar> > viewDomainSpace =
165  tpetraVectorSpace<Scalar>(
166  Tpetra::createLocalMapWithNode<LocalOrdinal,GlobalOrdinal>(
167  tpetraView->getNumVectors(),
168  tpetraView->getMap()->getComm(),
169  tpetraView->getMap()->getNode()
170  )
171  );
172 
173  return constTpetraMultiVector(
174  tpetraVectorSpace_,
175  viewDomainSpace,
176  tpetraView
177  );
178 }
179 
180 
181 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
182 RCP<MultiVectorBase<Scalar> >
184  const Range1D& col_rng_in
185  )
186 {
187 #ifdef THYRA_DEFAULT_SPMD_MULTI_VECTOR_VERBOSE_TO_ERROR_OUT
188  std::cerr << "\nTpetraMultiVector::subView(Range1D) called!\n";
189 #endif
190  const Range1D colRng = this->validateColRange(col_rng_in);
191 
192  const RCP<Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tpetraView =
193  this->getTpetraMultiVector()->subViewNonConst(colRng);
194 
195  const RCP<const ScalarProdVectorSpaceBase<Scalar> > viewDomainSpace =
196  tpetraVectorSpace<Scalar>(
197  Tpetra::createLocalMapWithNode<LocalOrdinal,GlobalOrdinal>(
198  tpetraView->getNumVectors(),
199  tpetraView->getMap()->getComm(),
200  tpetraView->getMap()->getNode()
201  )
202  );
203 
204  return tpetraMultiVector(
205  tpetraVectorSpace_,
206  viewDomainSpace,
207  tpetraView
208  );
209 }
210 
211 
212 /* ToDo: Implement these?
213 
214 
215 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
216 RCP<const MultiVectorBase<Scalar> >
217 TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>::nonContigSubViewImpl(
218  const ArrayView<const int> &cols
219  ) const
220 {
221  THYRA_DEBUG_ASSERT_MV_COLS("nonContigSubViewImpl(cols)", cols);
222  const int numCols = cols.size();
223  const ArrayRCP<Scalar> localValuesView = createContiguousCopy(cols);
224  return defaultSpmdMultiVector<Scalar>(
225  spmdRangeSpace_,
226  createSmallScalarProdVectorSpaceBase<Scalar>(spmdRangeSpace_, numCols),
227  localValuesView
228  );
229 }
230 
231 
232 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
233 RCP<MultiVectorBase<Scalar> >
234 TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>::nonconstNonContigSubViewImpl(
235  const ArrayView<const int> &cols )
236 {
237  THYRA_DEBUG_ASSERT_MV_COLS("nonContigSubViewImpl(cols)", cols);
238  const int numCols = cols.size();
239  const ArrayRCP<Scalar> localValuesView = createContiguousCopy(cols);
240  const Ordinal localSubDim = spmdRangeSpace_->localSubDim();
241  RCP<CopyBackSpmdMultiVectorEntries<Scalar> > copyBackView =
242  copyBackSpmdMultiVectorEntries<Scalar>(cols, localValuesView.getConst(),
243  localSubDim, localValues_.create_weak(), leadingDim_);
244  return Teuchos::rcpWithEmbeddedObjPreDestroy(
245  new TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>(
246  spmdRangeSpace_,
247  createSmallScalarProdVectorSpaceBase<Scalar>(spmdRangeSpace_, numCols),
248  localValuesView),
249  copyBackView
250  );
251 }
252 
253 */
254 
255 
256 // Overridden protected members from SpmdMultiVectorBase
257 
258 
259 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
260 RCP<const SpmdVectorSpaceBase<Scalar> >
262 {
263  return tpetraVectorSpace_;
264 }
265 
266 
267 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
269  const Ptr<ArrayRCP<Scalar> > &localValues, const Ptr<Ordinal> &leadingDim
270  )
271 {
272  *localValues = tpetraMultiVector_.getNonconstObj()->get1dViewNonConst();
273  *leadingDim = tpetraMultiVector_->getStride();
274 }
275 
276 
277 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
279  const Ptr<ArrayRCP<const Scalar> > &localValues, const Ptr<Ordinal> &leadingDim
280  ) const
281 {
282  *localValues = tpetraMultiVector_->get1dView();
283  *leadingDim = tpetraMultiVector_->getStride();
284 }
285 
286 
287 // private
288 
289 
290 template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
291 template<class TpetraMultiVector_t>
293  const RCP<const TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVectorSpace,
294  const RCP<const ScalarProdVectorSpaceBase<Scalar> > &domainSpace,
295  const RCP<TpetraMultiVector_t> &tpetraMultiVector
296  )
297 {
298 #ifdef THYRA_DEBUG
299  TEUCHOS_ASSERT(nonnull(tpetraVectorSpace));
300  TEUCHOS_ASSERT(nonnull(domainSpace));
301  TEUCHOS_ASSERT(nonnull(tpetraMultiVector));
302  // ToDo: Check to make sure that tpetraMultiVector is compatible with
303  // tpetraVectorSpace.
304 #endif
305  tpetraVectorSpace_ = tpetraVectorSpace;
306  domainSpace_ = domainSpace;
307  tpetraMultiVector_.initialize(tpetraMultiVector);
308  this->updateSpmdSpace();
309 }
310 
311 
312 
313 } // end namespace Thyra
314 
315 
316 #endif // THYRA_TPETRA_MULTIVECTOR_HPP
Concrete implementation of Thyra::MultiVector in terms of Tpetra::MultiVector.
RCP< const ScalarProdVectorSpaceBase< Scalar > > domainScalarProdVecSpc() const
TpetraMultiVector()
Construct to uninitialized.
void getNonconstLocalMultiVectorDataImpl(const Ptr< ArrayRCP< Scalar > > &localValues, const Ptr< Ordinal > &leadingDim)
Concrete implementation of an SPMD vector space for Tpetra.
RCP< Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getTpetraMultiVector()
Extract the underlying non-const Tpetra::MultiVector object.
RCP< const SpmdVectorSpaceBase< Scalar > > spmdSpaceImpl() const
RCP< MultiVectorBase< Scalar > > nonconstContigSubViewImpl(const Range1D &colRng)
void getLocalMultiVectorDataImpl(const Ptr< ArrayRCP< const Scalar > > &localValues, const Ptr< Ordinal > &leadingDim) const
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 MultiVectorBase< Scalar > > contigSubViewImpl(const Range1D &colRng) const
Teuchos::Ordinal Ordinal
Type for the dimension of a vector space. `*.
RCP< const VectorBase< Scalar > > colImpl(Ordinal j) 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.
RCP< VectorBase< Scalar > > nonconstColImpl(Ordinal j)
RCP< const Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getConstTpetraMultiVector() const
Extract the underlying const Tpetra::MultiVector object.
Teuchos::Range1D Range1D