Thyra  Version of the Day
Thyra_VectorDefaultBase_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_VECTOR_DEFAULT_BASE_DEF_HPP
43 #define THYRA_VECTOR_DEFAULT_BASE_DEF_HPP
44 
45 
46 // Define to make some verbose output
47 //#define THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
48 
49 
50 #include "Thyra_VectorDefaultBase_decl.hpp"
51 #include "Thyra_VectorSpaceFactoryBase.hpp"
52 #include "Thyra_VectorBase.hpp"
53 #include "Thyra_VectorStdOps.hpp"
54 #include "Thyra_MultiVectorDefaultBase.hpp"
55 #include "Thyra_AssertOp.hpp"
56 #include "Thyra_MultiVectorBase.hpp"
57 #include "Thyra_DetachedVectorView.hpp"
58 #include "RTOpPack_ROpGetSubVector.hpp"
59 #include "RTOpPack_TOpSetSubVector.hpp"
60 #include "Teuchos_Assert.hpp"
61 
62 
63 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
64 # include "Teuchos_VerboseObject.hpp"
65 # define THYRA_VECTOR_VERBOSE_OUT_STATEMENT \
66  RCP<Teuchos::FancyOStream> dbgout = Teuchos::VerboseObjectBase::getDefaultOStream()
67 #endif // THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
68 
69 
70 
71 namespace Thyra {
72 
73 
74 // Overridden from Teuchos::Describable
75 
76 
77 template<class Scalar>
79 {
80  std::ostringstream oss;
81  const RCP<const VectorSpaceBase<Scalar> > vs = this->space();
82  oss << Teuchos::Describable::description();
83  if(is_null(vs)) {
84  oss << "{space=NULL}";
85  }
86  else {
87  const Ordinal dim = vs->dim();
88  oss << "{dim=" << dim << "}";
89  }
90  return oss.str();
91 }
92 
93 
94 template<class Scalar>
96  Teuchos::FancyOStream &out_arg,
97  const Teuchos::EVerbosityLevel verbLevel
98  ) const
99 {
100  using Teuchos::FancyOStream;
101  using Teuchos::OSTab;
102  RCP<FancyOStream> out = Teuchos::rcpFromRef(out_arg);
103  OSTab tab(out);
104  *out << this->description() << "\n";
105  if (this->space()->dim()) {
106  tab.incrTab();
107  if (verbLevel >= Teuchos::VERB_HIGH) {
108  const ConstDetachedVectorView<Scalar> dvv(*this);
109  for( Ordinal i = 0; i < dvv.subDim(); ++i )
110  *out << i << ":" << dvv[i] << std::endl;
111  }
112  }
113 }
114 
115 
116 // Overridden from LinearOpBase
117 
118 
119 template<class Scalar>
120 RCP< const VectorSpaceBase<Scalar> >
122 {
123 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
124  THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
125  *dbgout << "\nThyra::VectorDefaultBase<"
126  <<Teuchos::ScalarTraits<Scalar>::name()
127  <<">::range() called!\n";
128 #endif
129  return this->space();
130 }
131 
132 
133 template<class Scalar>
134 RCP< const VectorSpaceBase<Scalar> >
136 {
137 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
138  THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
139  *dbgout << "\nThyra::VectorDefaultBase<"
140  <<Teuchos::ScalarTraits<Scalar>::name()
141  <<">::domain() called!\n";
142 #endif
143  if(!domain_.get()) {
144  domain_ = range()->smallVecSpcFcty()->createVecSpc(1);
145  }
146  return domain_;
147 }
148 
149 
150 // Overridden from MultiVectorBase
151 
152 
153 template<class Scalar>
154 RCP<MultiVectorBase<Scalar> >
156 {
157 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
158  THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
159  *dbgout << "\nThyra::VectorDefaultBase<"
160  <<Teuchos::ScalarTraits<Scalar>::name()
161  <<">::clone_mv() called!\n";
162 #endif
163  return this->clone_v();
164 }
165 
166 
167 // Overridden from VectorBase
168 
169 
170 template<class Scalar>
171 RCP<VectorBase<Scalar> >
173 {
174 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
175  THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
176  *dbgout << "\nThyra::VectorDefaultBase<"
177  <<Teuchos::ScalarTraits<Scalar>::name()
178  <<">::clone_v() called!\n";
179 #endif
180  const RCP<VectorBase<Scalar> > copy = createMember(this->space());
181  ::Thyra::assign<Scalar>(copy.ptr(), *this);
182  return copy;
183 }
184 
185 
186 // protected
187 
188 
189 // Overridden protected functions from MultiVectorVectorBase
190 
191 
192 template<class Scalar>
193 RCP<VectorBase<Scalar> >
195 {
196 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
197  THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
198  *dbgout << "\nThyra::VectorDefaultBase<"
199  <<Teuchos::ScalarTraits<Scalar>::name()<<">::nonconstColImpl(j) called!\n";
200 #endif
201 #ifdef TEUCHOS_DEBUG
202  TEUCHOS_TEST_FOR_EXCEPT( j != 0 );
203 #endif
204  return Teuchos::rcp(this,false);
205 }
206 
207 
208 template<class Scalar>
209 RCP<const MultiVectorBase<Scalar> >
211 {
212 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
213  THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
214  *dbgout << "\nThyra::VectorDefaultBase<"
215  <<Teuchos::ScalarTraits<Scalar>::name()
216  <<">::contigSubViewImpl(col_rng) const called!\n";
217 #endif
218  validateColRng(col_rng);
219  return Teuchos::rcp(this,false);
220 }
221 
222 
223 template<class Scalar>
224 RCP<MultiVectorBase<Scalar> >
226 {
227 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
228  THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
229  *dbgout << "\nThyra::VectorDefaultBase<"
230  <<Teuchos::ScalarTraits<Scalar>::name()
231  <<">::nonconstContigSubViewImpl(col_rng) called!\n";
232 #endif
233  validateColRng(col_rng);
234  return Teuchos::rcp(this,false);
235 }
236 
237 
238 template<class Scalar>
239 RCP<const MultiVectorBase<Scalar> >
241  const ArrayView<const int> &cols ) const
242 {
243 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
244  THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
245  *dbgout << "\nThyra::VectorDefaultBase<"
246  <<Teuchos::ScalarTraits<Scalar>::name()
247  <<">::nonContigSubViewImpl(cols) called!\n";
248 #endif
249  validateColIndexes(cols);
250  return Teuchos::rcp(this,false);
251 }
252 
253 
254 template<class Scalar>
255 RCP<MultiVectorBase<Scalar> >
257  const ArrayView<const int> &cols )
258 {
259 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
260  THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
261  *dbgout << "\nThyra::VectorDefaultBase<"
262  <<Teuchos::ScalarTraits<Scalar>::name()
263  <<">::nonconstNonContigSubViewImpl(cols) called!\n";
264 #endif
265  validateColIndexes(cols);
266  return Teuchos::rcp(this,false);
267 }
268 
269 
270 template<class Scalar>
272  const Range1D &rowRng,
273  const Range1D &colRng,
275  ) const
276 {
277 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
278  THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
279  *dbgout << "\nThyra::VectorDefaultBase<"
280  <<Teuchos::ScalarTraits<Scalar>::name()
281  <<">::acquireDetachedMultiVectorViewImpl() const called!\n";
282 #endif
283 #ifdef TEUCHOS_DEBUG
284  TEUCHOS_TEST_FOR_EXCEPT(sub_mv==NULL);
285 #endif
286  validateColRng(colRng);
288  this->acquireDetachedView(rowRng,&sv);
289 #ifdef TEUCHOS_DEBUG
290  TEUCHOS_TEST_FOR_EXCEPT( sv.stride() != 1 ); // Can't handle non-unit stride yet but we could
291 #endif
292  sub_mv->initialize( sv.globalOffset(), sv.subDim(), 0, 1, sv.values(), sv.subDim() );
293 }
294 
295 
296 template<class Scalar>
299  ) const
300 {
301  TEUCHOS_TEST_FOR_EXCEPT(sub_mv == 0);
302  sub_mv->uninitialize();
303 }
304 
305 
306 template<class Scalar>
308  const Range1D &rowRng,
309  const Range1D &colRng,
311  )
312 {
313 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
314  THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
315  *dbgout << "\nThyra::VectorDefaultBase<"
316  <<Teuchos::ScalarTraits<Scalar>::name()
317  <<">::acquireNonconstDetachedMultiVectorViewImpl() called!\n";
318 #endif
319 #ifdef TEUCHOS_DEBUG
320  TEUCHOS_TEST_FOR_EXCEPT(sub_mv==NULL);
321 #endif
322  validateColRng(colRng);
324  this->acquireDetachedView(rowRng,&sv);
325 #ifdef TEUCHOS_DEBUG
326  TEUCHOS_TEST_FOR_EXCEPT( sv.stride() != 1 ); // Can't handle non-unit stride yet but we could
327 #endif
328  sub_mv->initialize( sv.globalOffset(), sv.subDim(), 0, 1, sv.values(), sv.subDim() );
329 }
330 
331 
332 template<class Scalar>
335  )
336 {
337 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
338  THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
339  *dbgout << "\nThyra::VectorDefaultBase<"
340  <<Teuchos::ScalarTraits<Scalar>::name()
341  <<">::commitNonconstDetachedMultiVectorViewImpl() called!\n";
342 #endif
343 #ifdef TEUCHOS_DEBUG
344  TEUCHOS_TEST_FOR_EXCEPT(sub_mv==NULL);
345 #endif
347  sub_mv->globalOffset(),sub_mv->subDim(),sub_mv->values(),1);
348  this->commitDetachedView(&sv);
349  sub_mv->uninitialize();
350 }
351 
352 
353 // Overridden protected functions from VectorBase
354 
355 
356 template<class Scalar>
358  const Range1D& rng_in, RTOpPack::ConstSubVectorView<Scalar>* sub_vec_inout
359  ) const
360 {
361  using Teuchos::dyn_cast;
362  using Teuchos::tuple;
363  const Range1D rng = rng_in.full_range() ? Range1D(0,this->space()->dim()-1) : rng_in;
364 #ifdef TEUCHOS_DEBUG
365  TEUCHOS_TEST_FOR_EXCEPTION(
366  !(rng.ubound() < this->space()->dim()), std::out_of_range
367  ,"VectorDefaultBase<Scalar>::acquireDetachedVectorViewImpl(rng,...):"
368  " Error, rng = ["<<rng.lbound()<<","<<rng.ubound()
369  <<"] is not in range = [0,"<<(this->space()->dim()-1)<<"]" );
370 #endif
371  // Initialize the operator
372  RTOpPack::ROpGetSubVector<Scalar> get_sub_vector_op(rng.lbound(),rng.ubound());
373  // Create the reduction object (another sub_vec)
374  RCP<RTOpPack::ReductTarget>
375  reduct_obj = get_sub_vector_op.reduct_obj_create(); // This is really of type RTOpPack::ConstSubVectorView<Scalar>!
376  // Perform the reduction (get the sub-vector requested)
377  ::Thyra::applyOp<Scalar>(get_sub_vector_op, tuple(Teuchos::ptr<const VectorBase<Scalar> >(this))(),
378  Teuchos::null, reduct_obj.ptr());
379  // Get the sub-vector.
380  *sub_vec_inout = get_sub_vector_op(*reduct_obj);
381 }
382 
383 
384 template<class Scalar>
387  ) const
388 {
389  TEUCHOS_TEST_FOR_EXCEPT(sub_vec == 0);
390  sub_vec->uninitialize();
391 }
392 
393 
394 template<class Scalar>
396  const Range1D& rng, RTOpPack::SubVectorView<Scalar>* sub_vec_inout
397  )
398 {
399  //
400  // Here we get a copy of the data for the sub-vector that the
401  // client will modify. We must later commit these changes to the
402  // actual vector when the client calls commitDetachedView(...).
403  // Note, this implementation is very dependent on the behavior of
404  // the default implementation of constant version of
405  // VectorDefaultBase<Scalar>::acquireDetachedView(...) and the implementation of
406  // VectorDefaultBase<Scalar>::setSubVector(...)!
407  //
410  sub_vec_inout->initialize(
411  sub_vec.globalOffset(), sub_vec.subDim(),
412  Teuchos::arcp_const_cast<Scalar>(sub_vec.values()), sub_vec.stride()
413  );
414 }
415 
416 
417 template<class Scalar>
419  RTOpPack::SubVectorView<Scalar>* sub_vec_inout
420  )
421 {
422  TEUCHOS_TEST_FOR_EXCEPT(sub_vec_inout == 0);
424  sub_vec_inout->globalOffset(), sub_vec_inout->subDim()
425  ,sub_vec_inout->values(), sub_vec_inout->stride()
426  );
427  VectorDefaultBase<Scalar>::setSubVectorImpl(spc_sub_vec); // Commit the changes!
428  sub_vec_inout->uninitialize(); // Make null as promised!
429 }
430 
431 
432 template<class Scalar>
434 {
435  RTOpPack::TOpSetSubVector<Scalar> set_sub_vector_op(sub_vec);
436  ::Thyra::applyOp<Scalar>(set_sub_vector_op, Teuchos::null,
437  Teuchos::tuple(Teuchos::ptr<VectorBase<Scalar> >(this))(), Teuchos::null);
438 }
439 
440 
441 // Overridden protected functions from LinearOpBase
442 
443 
444 template<class Scalar>
446 {
447  typedef Teuchos::ScalarTraits<Scalar> ST;
448  return ( ST::isComplex ? ( M_trans==NOTRANS || M_trans==CONJTRANS ) : true );
449 }
450 
451 
452 template<class Scalar>
454  const EOpTransp M_trans,
455  const MultiVectorBase<Scalar> &X,
456  const Ptr<MultiVectorBase<Scalar> > &Y,
457  const Scalar alpha,
458  const Scalar beta
459  ) const
460 {
461 
462  typedef Teuchos::ScalarTraits<Scalar> ST;
463 
464  // Validate input
465 #ifdef TEUCHOS_DEBUG
467  "VectorDefaultBase<Scalar>::apply()", *this, M_trans, X, &*Y);
468 #endif
469 
470  const Ordinal numCols = X.domain()->dim();
471 
472  for (Ordinal col_j = 0; col_j < numCols; ++col_j) {
473 
474  // Get single column vectors
475  const RCP<const VectorBase<Scalar> > x = X.col(col_j);
476  const RCP<VectorBase<Scalar> > y = Y->col(col_j);
477 
478  // Here M = m (where m is a column vector)
479  if( M_trans == NOTRANS || (M_trans == CONJ && !ST::isComplex) ) {
480  // y = beta*y + alpha*m*x (x is a scalar!)
481 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
482  THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
483  *dbgout << "\nThyra::VectorDefaultBase<"
484  <<Teuchos::ScalarTraits<Scalar>::name()
485  <<">::apply(...) : y = beta*y + alpha*m*x (x is a scalar!)\n";
486 #endif
487  Vt_S( y.ptr(), beta );
488  Vp_StV( y.ptr(), Scalar(alpha*get_ele(*x,0)), *this );
489  }
490  else if( M_trans == CONJTRANS || (M_trans == TRANS && !ST::isComplex) ) {
491  // y = beta*y + alpha*m'*x (y is a scalar!)
492 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
493  THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
494  *dbgout << "\nThyra::VectorDefaultBase<"
495  <<Teuchos::ScalarTraits<Scalar>::name()
496  <<">::apply(...) : y = beta*y + alpha*m'*x (y is a scalar!)\n";
497 #endif
498  Scalar y_inout;
499  if( beta == ST::zero() ) {
500  y_inout = ST::zero();
501  }
502  else {
503  y_inout = beta*get_ele(*y,0);
504  }
505 #if defined(THYRA_VECTOR_VERBOSE_TO_ERROR_OUT) && defined(RTOPPACK_SPMD_APPLY_OP_DUMP)
506  RTOpPack::show_spmd_apply_op_dump = true;
507 #endif
508 #if defined(THYRA_VECTOR_VERBOSE_TO_ERROR_OUT) && defined(RTOPPACK_RTOPT_HELPER_DUMP_OUTPUT)
509  RTOpPack::rtop_helpers_dump_all = true;
510 #endif
511  y_inout += alpha * this->space()->scalarProd(*this, *x);
512 #if defined(THYRA_VECTOR_VERBOSE_TO_ERROR_OUT) && defined(RTOPPACK_SPMD_APPLY_OP_DUMP)
513  RTOpPack::show_spmd_apply_op_dump = false;
514 #endif
515 #if defined(THYRA_VECTOR_VERBOSE_TO_ERROR_OUT) && defined(RTOPPACK_RTOPT_HELPER_DUMP_OUTPUT)
516  RTOpPack::rtop_helpers_dump_all = false;
517 #endif
518  set_ele(0, y_inout, y.ptr());
519 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
520  *dbgout
521  << "\nThyra::VectorDefaultBase<"<<ST::name()<<">::apply(...) : y_inout = "
522  << y_inout << "\n";
523 #endif
524  }
525  else {
526  TEUCHOS_TEST_FOR_EXCEPTION(true, std::logic_error,
527  "VectorBase<"<<ST::name()<<">::apply(M_trans,...): Error, M_trans="
528  <<toString(M_trans)<<" not supported!" );
529  }
530 
531  }
532 
533 }
534 
535 
536 // private
537 
538 
539 template<class Scalar>
540 inline
541 void VectorDefaultBase<Scalar>::validateColRng( const Range1D &col_rng ) const
542 {
543 #ifdef TEUCHOS_DEBUG
544  TEUCHOS_TEST_FOR_EXCEPT(
545  !( col_rng.full_range() || ( col_rng.lbound() == 0 && col_rng.ubound() == 0) ) );
546 #endif
547 }
548 
549 
550 template<class Scalar>
551 inline
552 void VectorDefaultBase<Scalar>::validateColIndexes(
553  const ArrayView<const int>&cols ) const
554 {
555 #ifdef TEUCHOS_DEBUG
556  TEUCHOS_TEST_FOR_EXCEPT( cols.size() != 1 || cols[0] != 0 );
557 #endif
558 }
559 
560 
561 } // end namespace Thyra
562 
563 
564 #endif // THYRA_VECTOR_DEFAULT_BASE_DEF_HPP
virtual RCP< const MultiVectorBase< Scalar > > contigSubViewImpl(const Range1D &col_rng) const
Returns Teuchos::rcp(this,false).
RCP< MultiVectorBase< Scalar > > clone_mv() const
Returns this->clone_v().
virtual RCP< MultiVectorBase< Scalar > > nonconstContigSubViewImpl(const Range1D &col_rng)
Returns Teuchos::rcp(this,false).
EOpTransp
Enumeration for determining how a linear operator is applied. `*.
#define THYRA_ASSERT_LINEAR_OP_MULTIVEC_APPLY_SPACES(FUNC_NAME, M, M_T, X, Y)
This is a very useful macro that should be used to validate that the spaces for the multi-vector vers...
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.
Use the non-transposed operator.
Teuchos_Ordinal subDim() const
Returns the dimension of the explicit view.
ptrdiff_t stride() const
Create an explicit non-mutable (const) view of a VectorBase object.
Use the transposed operator with complex-conjugate clements (same as TRANS for real scalar types)...
Ordinal globalOffset() const
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Generates a default outputting for all vectors.
Use the non-transposed operator with complex-conjugate elements (same as NOTRANS for real scalar type...
virtual void releaseDetachedMultiVectorViewImpl(RTOpPack::ConstSubMultiVectorView< Scalar > *sub_mv) const
Implemented in terms of this->releaseDetachedView().
Use the transposed operator.
const ArrayRCP< const Scalar > values() const
virtual void acquireNonconstDetachedMultiVectorViewImpl(const Range1D &rowRng, const Range1D &colRng, RTOpPack::SubMultiVectorView< Scalar > *sub_mv)
Implemented in terms of this->acquireDetachedView().
virtual void releaseDetachedVectorViewImpl(RTOpPack::ConstSubVectorView< Scalar > *sub_vec) const
Convenient node subclass for concrete VectorBase subclasses that relies on a default MultiVectorBase ...
Teuchos::Ordinal Ordinal
Type for the dimension of a vector space. `*.
Interface for a collection of column vectors called a multi-vector.
RCP< const VectorBase< Scalar > > col(Ordinal j) const
Calls colImpl().
Teuchos::RCP< ReductTarget > reduct_obj_create() const
virtual RCP< VectorBase< Scalar > > nonconstColImpl(Ordinal j)
Returns Teuchos::rcp(this,false).
void initialize(Ordinal globalOffset_in, Ordinal subDim_in, Ordinal colOffset_in, Ordinal numSubCols_in, const ArrayRCP< Scalar > &values_in, Ordinal leadingDim_in)
void initialize(Ordinal globalOffset_in, Ordinal subDim_in, const ArrayRCP< Scalar > &values_in, ptrdiff_t stride_in)
Abstract interface for finite-dimensional dense vectors.
virtual void acquireDetachedVectorViewImpl(const Range1D &rng, RTOpPack::ConstSubVectorView< Scalar > *sub_vec) const
virtual std::string description() const
Default description that gives the label, type, and dimenstion .
virtual RCP< const VectorSpaceBase< Scalar > > domain() const =0
Return a smart pointer for the domain space for this operator.
virtual RCP< const VectorSpaceBase< Scalar > > range() const
Returns this->space().
const ArrayRCP< Scalar > values() const
RCP< VectorBase< Scalar > > clone_v() const
Simply creates a new vector and copies the contents from *this.
void initialize(Ordinal globalOffset_in, Ordinal subDim_in, Ordinal colOffset_in, Ordinal numSubCols_in, const ArrayRCP< const Scalar > &values_in, Ordinal leadingDim_in)
virtual void acquireDetachedMultiVectorViewImpl(const Range1D &rowRng, const Range1D &colRng, RTOpPack::ConstSubMultiVectorView< Scalar > *sub_mv) const
Implemented in terms of this->acquireDetachedView().
const ArrayRCP< Scalar > values() const
virtual void setSubVectorImpl(const RTOpPack::SparseSubVectorT< Scalar > &sub_vec)
virtual RCP< const MultiVectorBase< Scalar > > nonContigSubViewImpl(const ArrayView< const int > &cols) const
Returns Teuchos::rcp(this,false).
const char * toString(EConj conj)
Return a string name for a EOpTransp value. `*.
virtual void commitNonconstDetachedMultiVectorViewImpl(RTOpPack::SubMultiVectorView< Scalar > *sub_mv)
Implemented in terms of this->commitDetachedView().
virtual void acquireNonconstDetachedVectorViewImpl(const Range1D &rng, RTOpPack::SubVectorView< Scalar > *sub_vec)
bool opSupportedImpl(EOpTransp M_trans) const
For complex Scalar types returns true for NOTRANS and CONJTRANS and for real types returns true for a...
virtual RCP< MultiVectorBase< Scalar > > nonconstNonContigSubViewImpl(const ArrayView< const int > &cols)
Returns Teuchos::rcp(this,false).
virtual RCP< const VectorSpaceBase< Scalar > > domain() const
Returns a DefaultSerialVectorSpace object with dimension 1.
Teuchos::Range1D Range1D
virtual void commitNonconstDetachedVectorViewImpl(RTOpPack::SubVectorView< Scalar > *sub_vec)