Fundamental Vector Reduction/Transformation Operator (RTOp) Interfaces  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
RTOpPack_Types.hpp
1 // @HEADER
2 // ***********************************************************************
3 //
4 // RTOp: Interfaces and Support Software for Vector Reduction Transformation
5 // Operations
6 // Copyright (2006) Sandia Corporation
7 //
8 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
9 // license for use of this work by or on behalf of the U.S. Government.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact Roscoe A. Bartlett (rabartl@sandia.gov)
39 //
40 // ***********************************************************************
41 // @HEADER
42 
43 
44 #ifndef RTOPPACK_TYPES_HPP
45 #define RTOPPACK_TYPES_HPP
46 
47 
48 #include "RTOp_ConfigDefs.hpp"
49 #include "Teuchos_Array.hpp"
50 #include "Teuchos_RCP.hpp"
51 #include "Teuchos_ArrayRCP.hpp"
52 #include "Teuchos_Range1D.hpp"
53 #include "Teuchos_ScalarTraits.hpp"
55 #include "Teuchos_Assert.hpp"
56 #include "Teuchos_implicit_cast.hpp"
57 #include "Teuchos_FancyOStream.hpp"
58 
59 
60 namespace RTOpPack {
61 
62 
63 //
64 // Basic types
65 //
66 
68 typedef Teuchos_Ordinal Ordinal;
70 using Teuchos::Ptr;
72 using Teuchos::RCP;
74 using Teuchos::ArrayRCP;
76 using Teuchos::ArrayView;
78 using Teuchos::Array;
80 using Teuchos::Range1D;
87 
89 typedef Teuchos_Ordinal index_type;
91 typedef char char_type;
92 
93 
94 //
95 // Exceptions
96 //
97 
98 
100 class UnknownError : public std::logic_error
101 {public: UnknownError(const std::string& what_arg) : std::logic_error(what_arg) {}};
103 class InvalidUsage : public std::logic_error
104 {public: InvalidUsage(const std::string& what_arg) : std::logic_error(what_arg) {}};
106 class InvalidNumVecs : public std::logic_error
107 {public: InvalidNumVecs(const std::string& what_arg) : std::logic_error(what_arg) {}};
109 class InvalidNumTargVecs : public std::logic_error
110 {public: InvalidNumTargVecs(const std::string& what_arg) : std::logic_error(what_arg) {}};
112 class IncompatibleVecs : public std::logic_error
113 {public: IncompatibleVecs(const std::string& what_arg) : std::logic_error(what_arg) {}};
115 class IncompatibleReductObj : public std::logic_error
116 {public: IncompatibleReductObj(const std::string& what_arg) : std::logic_error(what_arg) {}};
117 
118 
119 //
120 // VectorBase subviews
121 //
122 
123 
143 template<class Scalar>
145 public:
147  ConstSubVectorView() : globalOffset_(0), subDim_(0), stride_(0) {}
150  :globalOffset_(0), subDim_(0), stride_(0)
151  { initialize(0, values_in.size(), values_in, 1); }
153  ConstSubVectorView(Ordinal globalOffset_in, Ordinal subDim_in,
154  const ArrayRCP<const Scalar> &values_in, ptrdiff_t stride_in)
155  :globalOffset_(0), subDim_(0), stride_(0)
156  { initialize(globalOffset_in, subDim_in, values_in, stride_in); }
159  :globalOffset_(sv.globalOffset()), subDim_(sv.subDim()),
160  values_(sv.values()), stride_(sv.stride())
161  {}
163  void initialize(Ordinal globalOffset_in, Ordinal subDim_in,
164  const ArrayRCP<const Scalar> &values_in, ptrdiff_t stride_in)
165  {
166 #ifdef TEUCHOS_DEBUG
167  TEUCHOS_ASSERT(globalOffset_in >= 0);
168  if (!is_null(values_in)) {
169  TEUCHOS_ASSERT(subDim_in >= 0);
170  TEUCHOS_ASSERT(stride_in != 0);
172  subDim_in*std::abs(Teuchos::as<int>(stride_in)) - 1 <= values_in.upperOffset());
173  TEUCHOS_ASSERT(values_in.lowerOffset() <= 0);
174  }
175  else {
176  TEUCHOS_ASSERT(subDim_in==0);
177  }
178 #endif
179  globalOffset_=globalOffset_in;
180  subDim_=subDim_in;
181  values_=values_in;
182  stride_=stride_in;
183  }
186  { globalOffset_ = 0; subDim_=0; values_ = Teuchos::null; stride_ = 0; }
188  void setGlobalOffset(Ordinal globalOffset_in)
189  {
190 #ifdef TEUCHOS_DEBUG
191  TEUCHOS_ASSERT(globalOffset_in >= 0);
192 #endif
193  globalOffset_ = globalOffset_in;
194  }
196  Ordinal globalOffset() const { return globalOffset_; }
198  Ordinal subDim() const { return subDim_; }
200  const ArrayRCP<const Scalar> values() const { return values_; }
202  ptrdiff_t stride() const { return stride_; }
205  const Scalar& operator[](Ordinal i) const
206  {
207 #ifdef TEUCHOS_DEBUG
209 #endif
210  return valuesBegin()[stride_*i];
211  }
214  const Scalar& operator()(Ordinal i) const { return (*this)[i]; }
215 private:
216  Ordinal globalOffset_;
217  Ordinal subDim_;
218  ArrayRCP<const Scalar> values_;
219  ptrdiff_t stride_;
220  const typename ArrayRCP<const Scalar>::iterator valuesBegin() const
221  {
222  if (stride_ > 0)
223  return values_.begin();
224  return values_.begin() + (subDim_*std::abs(Teuchos::as<int>(stride_)) - 1);
225  }
226 public:
227 };
228 
229 
246 template<class Scalar>
247 class SubVectorView : public ConstSubVectorView<Scalar> {
248 public:
252  SubVectorView(const ArrayRCP<Scalar> &values_in)
253  :ConstSubVectorView<Scalar>(values_in)
254  {}
256  SubVectorView(Ordinal globalOffset_in, Ordinal subDim_in,
257  const ArrayRCP<Scalar> &values_in, ptrdiff_t stride_in)
258  :ConstSubVectorView<Scalar>(globalOffset_in, subDim_in, values_in, stride_in)
259  {}
261  SubVectorView(Ordinal subDim_in)
262  :ConstSubVectorView<Scalar>(0, subDim_in, Teuchos::arcp<Scalar>(subDim_in), 1)
263  {}
266  :ConstSubVectorView<Scalar>(sv)
267  {}
269  void initialize(Ordinal globalOffset_in, Ordinal subDim_in,
270  const ArrayRCP<Scalar> &values_in, ptrdiff_t stride_in)
271  { ConstSubVectorView<Scalar>::initialize(globalOffset_in, subDim_in, values_in, stride_in); }
273  const ArrayRCP<Scalar> values() const
274  { return Teuchos::arcp_const_cast<Scalar>(ConstSubVectorView<Scalar>::values()); }
277  Scalar& operator[](Ordinal i) const
278  { return const_cast<Scalar&>(ConstSubVectorView<Scalar>::operator[](i)); }
281  Scalar& operator()(Ordinal i) const { return (*this)[i]; }
282 public:
283 };
284 
285 
287 template<class Scalar>
288 void assign_entries( const Ptr<const SubVectorView<Scalar> > &msv,
289  const ConstSubVectorView<Scalar> &sv )
290 {
291 #ifdef TEUCHOS_DEBUG
292  TEUCHOS_ASSERT_EQUALITY(msv->subDim(), sv.subDim());
293 #endif
294  for( int i = 0; i < sv.subDim(); ++i ) {
295  (*msv)(i) = sv(i);
296  }
297 }
298 
299 
304 template<class Scalar>
305 std::ostream& operator<<(std::ostream &out, const ConstSubVectorView<Scalar> &sv)
306 {
307  out
308  << "{"
309  << "globalOffset="<<sv.globalOffset()
310  << ",subDim="<<sv.subDim()
311  << ",values="<<sv.values()
312  << ",stride="<<sv.stride()
313  << "}";
314  return out;
315 }
316 
317 
318 //
319 // MultiVectorBase subviews
320 //
321 
322 
344 template<class Scalar>
346 public:
349  :globalOffset_(0), subDim_(0), colOffset_(0), numSubCols_(0),
350  leadingDim_(0)
351  {}
354  Ordinal globalOffset_in, Ordinal subDim_in,
355  Ordinal colOffset_in, Ordinal numSubCols_in,
356  const ArrayRCP<const Scalar> &values_in, Ordinal leadingDim_in
357  )
358  :globalOffset_(0), subDim_(0), colOffset_(0), numSubCols_(0),
359  leadingDim_(0)
360  {
361  initialize(globalOffset_in, subDim_in, colOffset_in, numSubCols_in, values_in,
362  leadingDim_in);
363  }
366  :globalOffset_(smv.globalOffset()), subDim_(smv.subDim()),
367  colOffset_(smv.colOffset()), numSubCols_(smv.numSubCols()),
368  values_(smv.values()), leadingDim_(smv.leadingDim())
369  {}
372  Ordinal globalOffset_in, Ordinal subDim_in,
373  Ordinal colOffset_in, Ordinal numSubCols_in,
374  const ArrayRCP<const Scalar> &values_in, Ordinal leadingDim_in
375  )
376  {
377 #ifdef TEUCHOS_DEBUG
378  TEUCHOS_ASSERT(globalOffset_in >= 0);
379  TEUCHOS_ASSERT(colOffset_in >= 0);
380  if (!is_null(values_in)) {
381  TEUCHOS_ASSERT(subDim_in >= 0);
382  TEUCHOS_ASSERT(leadingDim_in >= subDim_in);
383  TEUCHOS_ASSERT(numSubCols_in*leadingDim_in - 1 <= values_in.upperOffset());
384  TEUCHOS_ASSERT(values_in.lowerOffset() <= 0);
385  }
386  else {
387  TEUCHOS_ASSERT(subDim_in == 0);
388  }
389 #endif
390  globalOffset_=globalOffset_in;
391  subDim_=subDim_in;
392  colOffset_=colOffset_in;
393  numSubCols_=numSubCols_in;
394  values_=values_in;
395  leadingDim_=leadingDim_in;
396  }
399  {
400  globalOffset_ = 0; subDim_=0; colOffset_=0, numSubCols_=0;
401  values_=Teuchos::null; leadingDim_=0;
402  }
404  void setGlobalOffset(Ordinal globalOffset_in)
405  {
406 #ifdef TEUCHOS_DEBUG
407  TEUCHOS_ASSERT(globalOffset_in >= 0);
408 #endif
409  globalOffset_ = globalOffset_in;
410  }
412  Ordinal globalOffset() const { return globalOffset_; }
414  Ordinal subDim() const { return subDim_; }
416  Ordinal colOffset() const { return colOffset_; }
418  Ordinal numSubCols() const { return numSubCols_; }
420  const ArrayRCP<const Scalar> values() const { return values_; }
422  Ordinal leadingDim() const { return leadingDim_; }
426  const Scalar& operator()(Ordinal i, Ordinal j) const
427  {
428 #ifdef TEUCHOS_DEBUG
430  TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(j, 0, numSubCols_ );
431 #endif
432  return values_[ i + leadingDim_*j ];
433  }
437  ConstSubVectorView<Scalar> col( const Ordinal j ) const
438  {
439 #ifdef TEUCHOS_DEBUG
440  TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(j, 0, numSubCols_ );
441 #endif
444  }
445 private:
446  Ordinal globalOffset_;
447  Ordinal subDim_;
448  Ordinal colOffset_;
449  Ordinal numSubCols_;
450  ArrayRCP<const Scalar> values_;
451  Ordinal leadingDim_;
452 public:
453 };
454 
455 
472 template<class Scalar>
474 public:
479  Ordinal numRows_in, Ordinal numCols_in
480  )
481  :ConstSubMultiVectorView<Scalar>(0, numRows_in, 0, numCols_in,
482  Teuchos::arcp<Scalar>(numRows_in*numCols_in), numRows_in)
483  {}
486  Ordinal globalOffset_in, Ordinal subDim_in,
487  Ordinal colOffset_in, Ordinal numSubCols_in,
488  const ArrayRCP<Scalar> &values_in, Ordinal leadingDim_in
489  )
490  :ConstSubMultiVectorView<Scalar>(globalOffset_in, subDim_in,
491  colOffset_in, numSubCols_in, values_in, leadingDim_in)
492  {}
495  :ConstSubMultiVectorView<Scalar>(smv)
496  {}
499  Ordinal globalOffset_in, Ordinal subDim_in,
500  Ordinal colOffset_in, Ordinal numSubCols_in,
501  const ArrayRCP<Scalar> &values_in, Ordinal leadingDim_in
502  )
503  {
505  subDim_in, colOffset_in, numSubCols_in, values_in, leadingDim_in);
506  }
508  const ArrayRCP<Scalar> values() const
509  {
510  return Teuchos::arcp_const_cast<Scalar>(
512  }
516  Scalar& operator()(Ordinal i, Ordinal j) const
517  { return const_cast<Scalar&>(ConstSubMultiVectorView<Scalar>::operator()(i,j)); }
521  SubVectorView<Scalar> col( const Ordinal j ) const
522  {
523 #ifdef TEUCHOS_DEBUG
525 #endif
526  return SubVectorView<Scalar>(this->globalOffset(), this->subDim(),
527  values().persistingView(j*this->leadingDim(),this->subDim()), 1);
528  }
529 public:
530 };
531 
532 
534 template<class Scalar>
535 void assign_entries( const Ptr<const SubMultiVectorView<Scalar> > &msmv,
536  const ConstSubMultiVectorView<Scalar> &smv )
537 {
538 #ifdef TEUCHOS_DEBUG
539  TEUCHOS_ASSERT_EQUALITY(msmv->subDim(), smv.subDim());
540  TEUCHOS_ASSERT_EQUALITY(msmv->numSubCols(), smv.numSubCols());
541 #endif
542  for( Ordinal j = 0; j < smv.numSubCols(); ++j ) {
543  for( Ordinal i = 0; i < smv.subDim(); ++i ) {
544  (*msmv)(i,j) = smv(i,j);
545  }
546  }
547 }
548 
549 
550 //
551 // Primitive Type Traits
552 //
553 
554 
565 template <class Scalar, class ConcreteObj>
567 public:
569  typedef Scalar primitiveType;
571  static int numPrimitiveObjs()
572  { return Scalar::this_type_is_missing_a_specialization(); }
574  static int numIndexObjs()
575  { return Scalar::this_type_is_missing_a_specialization(); }
577  static int numCharObjs()
578  { return Scalar::this_type_is_missing_a_specialization(); }
580  static void extractPrimitiveObjs(
581  const Scalar &obj,
582  const ArrayView<primitiveType> &primitiveObjs,
583  const ArrayView<index_type> &indexObjs,
584  const ArrayView<char> &charObjs
585  )
586  {
587  Scalar::this_type_is_missing_a_specialization(obj);
588  }
590  static void loadPrimitiveObjs(
591  const ArrayView<const primitiveType> &primitiveObjs,
592  const ArrayView<const index_type> &indexObjs,
593  const ArrayView<const char> &charObjs,
594  const Ptr<Scalar> &obj
595  )
596  {
597  *obj = Scalar::this_type_is_missing_a_specialization();
598  }
599 };
600 
601 
602 
606 template <class Scalar>
607 class PrimitiveTypeTraits<Scalar, Scalar> {
608 public:
610  typedef Scalar primitiveType;
612  static int numPrimitiveObjs() { return 1; }
614  static int numIndexObjs() { return 0; }
616  static int numCharObjs() { return 0; }
618  static void extractPrimitiveObjs(
619  const Scalar &obj,
620  const ArrayView<primitiveType> &primitiveObjs,
621  const ArrayView<index_type> &indexObjs,
622  const ArrayView<char> &charObjs
623  )
624  {
625  assertInput(primitiveObjs, indexObjs, charObjs);
626  primitiveObjs[0] = obj;
627  }
629  static void loadPrimitiveObjs(
630  const ArrayView<const primitiveType> &primitiveObjs,
631  const ArrayView<const index_type> &indexObjs,
632  const ArrayView<const char> &charObjs,
633  const Ptr<Scalar> &obj
634  )
635  {
636  assertInput(primitiveObjs, indexObjs, charObjs);
637  *obj = primitiveObjs[0];
638  }
639 private:
640  static void assertInput(
641  const ArrayView<const primitiveType> &primitiveObjs,
642  const ArrayView<const index_type> &indexObjs,
643  const ArrayView<const char> &charObjs
644  )
645  {
646 #ifdef TEUCHOS_DEBUG
647  TEUCHOS_TEST_FOR_EXCEPT( primitiveObjs.size()!=1 || indexObjs.size()!=0
648  || charObjs.size()!=0 );
649 #else
650  (void)primitiveObjs;
651  (void)indexObjs;
652  (void)charObjs;
653 #endif
654  }
655 };
656 
657 
659 template <class Scalar>
660 class PrimitiveTypeTraits<Scalar, index_type> {
661 public:
667  static int numPrimitiveObjs() { return 0; }
669  static int numIndexObjs() { return 1; }
671  static int numCharObjs() { return 0; }
673  static void extractPrimitiveObjs(
674  const index_type &obj,
675  const ArrayView<primitiveType> &primitiveObjs,
676  const ArrayView<index_type> &indexObjs,
677  const ArrayView<char> &charObjs
678  )
679  {
680  assertInput(primitiveObjs, indexObjs, charObjs);
681  indexObjs[0] = obj;
682  }
684  static void loadPrimitiveObjs(
685  const ArrayView<const primitiveType> &primitiveObjs,
686  const ArrayView<const index_type> &indexObjs,
687  const ArrayView<const char> &charObjs,
688  const Ptr<index_type> &obj
689  )
690  {
691  assertInput(primitiveObjs, indexObjs, charObjs);
692  *obj = indexObjs[0];
693  }
694 private:
695  static void assertInput(
696  const ArrayView<const primitiveType> &primitiveObjs,
697  const ArrayView<const index_type> &indexObjs,
698  const ArrayView<const char> &charObjs
699  )
700  {
701 #ifdef TEUCHOS_DEBUG
702  TEUCHOS_TEST_FOR_EXCEPT( primitiveObjs.size()!=0 || indexObjs.size()!=1
703  || charObjs.size()!=0 );
704 #endif
705  }
706 };
707 
708 
709 #if defined(HAVE_COMPLEX) && defined(HAVE_TEUCHOS_COMPLEX)
710 
711 
715 template <class Scalar>
716 class PrimitiveTypeTraits<std::complex<Scalar>, std::complex<Scalar> > {
717 public:
719  typedef PrimitiveTypeTraits<Scalar,Scalar> ScalarPrimitiveTypeTraits;
721  typedef typename ScalarPrimitiveTypeTraits::primitiveType primitiveType;
723  static int numPrimitiveObjs()
724  { return 2*ScalarPrimitiveTypeTraits::numPrimitiveObjs(); }
726  static int numIndexObjs() { return 0; }
728  static int numCharObjs() { return 0; }
730  static void extractPrimitiveObjs(
731  const std::complex<Scalar> &obj,
732  const ArrayView<primitiveType> &primitiveObjs,
733  const ArrayView<index_type> &indexObjs,
734  const ArrayView<char> &charObjs
735  )
736  {
737  using Teuchos::null;
738  const int numScalarPrimitiveObjs =
739  ScalarPrimitiveTypeTraits::numPrimitiveObjs();
740  assertInput(primitiveObjs, indexObjs, charObjs);
741  ScalarPrimitiveTypeTraits::extractPrimitiveObjs(
742  obj.real(), primitiveObjs(0,numScalarPrimitiveObjs), null, null );
743  ScalarPrimitiveTypeTraits::extractPrimitiveObjs(
744  obj.imag(), primitiveObjs(numScalarPrimitiveObjs,numScalarPrimitiveObjs), null, null );
745  }
747  static void loadPrimitiveObjs(
748  const ArrayView<const primitiveType> &primitiveObjs,
749  const ArrayView<const index_type> &indexObjs,
750  const ArrayView<const char> &charObjs,
751  const Ptr<std::complex<Scalar> > &obj
752  )
753  {
754  using Teuchos::null;
755  using Teuchos::outArg;
756  assertInput(primitiveObjs, indexObjs, charObjs);
757  const int numScalarPrimitiveObjs =
758  ScalarPrimitiveTypeTraits::numPrimitiveObjs();
759  Scalar real, imag;
760  ScalarPrimitiveTypeTraits::loadPrimitiveObjs(
761  primitiveObjs(0,numScalarPrimitiveObjs), null, null,
762  outArg(real) );
763  ScalarPrimitiveTypeTraits::loadPrimitiveObjs(
764  primitiveObjs(numScalarPrimitiveObjs,numScalarPrimitiveObjs), null, null,
765  outArg(imag) );
766  *obj = std::complex<Scalar>( real, imag );
767  }
768 private:
769  static void assertInput(
770  const ArrayView<const primitiveType> &primitiveObjs,
771  const ArrayView<const index_type> &indexObjs,
772  const ArrayView<const char> &charObjs
773  )
774  {
775 #ifdef TEUCHOS_DEBUG
777  primitiveObjs.size()!=2*ScalarPrimitiveTypeTraits::numPrimitiveObjs()
778  || indexObjs.size()!=0
779  || charObjs.size()!=0 );
780 #endif
781  }
782 };
783 
784 
788 template <class Scalar>
789 class PrimitiveTypeTraits<std::complex<Scalar>, Scalar> {
790 public:
792  typedef PrimitiveTypeTraits<Scalar,Scalar> ScalarPrimitiveTypeTraits;
794  typedef typename ScalarPrimitiveTypeTraits::primitiveType primitiveType;
796  static int numPrimitiveObjs()
797  { return ScalarPrimitiveTypeTraits::numPrimitiveObjs(); }
799  static int numIndexObjs() { return 0; }
801  static int numCharObjs() { return 0; }
803  static void extractPrimitiveObjs(
804  const Scalar &obj,
805  const ArrayView<primitiveType> &primitiveObjs,
806  const ArrayView<index_type> &indexObjs,
807  const ArrayView<char> &charObjs
808  )
809  {
810  using Teuchos::null;
811  assertInput(primitiveObjs, indexObjs, charObjs);
812  ScalarPrimitiveTypeTraits::extractPrimitiveObjs(
813  obj, primitiveObjs, null, null );
814  }
816  static void loadPrimitiveObjs(
817  const ArrayView<const primitiveType> &primitiveObjs,
818  const ArrayView<const index_type> &indexObjs,
819  const ArrayView<const char> &charObjs,
820  const Ptr<Scalar > &obj
821  )
822  {
823  using Teuchos::null;
824  assertInput(primitiveObjs, indexObjs, charObjs);
825  ScalarPrimitiveTypeTraits::loadPrimitiveObjs(
826  primitiveObjs, null, null, obj );
827  }
828 private:
829  static void assertInput(
830  const ArrayView<const primitiveType> &primitiveObjs,
831  const ArrayView<const index_type> &indexObjs,
832  const ArrayView<const char> &charObjs
833  )
834  {
835 #ifdef TEUCHOS_DEBUG
837  primitiveObjs.size()!=ScalarPrimitiveTypeTraits::numPrimitiveObjs()
838  || indexObjs.size()!=0
839  || charObjs.size()!=0 );
840 #endif
841  }
842 };
843 
844 
845 #endif // defined(HAVE_COMPLEX) && defined(HAVE_TEUCHOS_COMPLEX)
846 
847 
848 
849 //
850 // Forward declaration for templated types
851 //
852 
853 
855 template<class Scalar> class RTOpT;
856 
857 
858 } // namespace RTOpPack
859 
860 
861 #endif // RTOPPACK_TYPES_HPP
ConstSubMultiVectorView(Ordinal globalOffset_in, Ordinal subDim_in, Ordinal colOffset_in, Ordinal numSubCols_in, const ArrayRCP< const Scalar > &values_in, Ordinal leadingDim_in)
bool is_null(const boost::shared_ptr< T > &p)
ArrayRCP< T > persistingView(size_type lowerOffset, size_type size) const
static void extractPrimitiveObjs(const Scalar &obj, const ArrayView< primitiveType > &primitiveObjs, const ArrayView< index_type > &indexObjs, const ArrayView< char > &charObjs)
Class for a changeable sub-vector.
SubMultiVectorView(const SubMultiVectorView< Scalar > &smv)
basic_FancyOStream< char > FancyOStream
static void loadPrimitiveObjs(const ArrayView< const primitiveType > &primitiveObjs, const ArrayView< const index_type > &indexObjs, const ArrayView< const char > &charObjs, const Ptr< Scalar > &obj)
size_type size() const
size_type upperOffset() const
const ArrayRCP< Scalar > values() const
ConstSubVectorView(Ordinal globalOffset_in, Ordinal subDim_in, const ArrayRCP< const Scalar > &values_in, ptrdiff_t stride_in)
size_type size() const
SubMultiVectorView(Ordinal globalOffset_in, Ordinal subDim_in, Ordinal colOffset_in, Ordinal numSubCols_in, const ArrayRCP< Scalar > &values_in, Ordinal leadingDim_in)
Class for a non-changeable sub-vector.
SubVectorView(const ArrayRCP< Scalar > &values_in)
SubMultiVectorView(Ordinal numRows_in, Ordinal numCols_in)
#define TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(index, lower_inclusive, upper_exclusive)
Scalar & operator()(Ordinal i) const
Zero-based indexing (Preconditions: values()!=NULL &amp;&amp; (0 &lt;= i &lt; subDim())).
const ArrayRCP< Scalar > values() const
SubVectorView(Ordinal subDim_in)
Specialization where the scalar type is the same as the concrete object type.
A templated traits class for decomposing object into an array of primitive objects.
SubVectorView(const SubVectorView< Scalar > &sv)
Class for a changeable sub-vector.
SubVectorView< Scalar > col(const Ordinal j) const
Return a SubVectorView view of the jth sub-column (Preconditions: values()!=NULL &amp;&amp; &amp;&amp; (0&lt;=j&lt;numSubCo...
SubVectorView(Ordinal globalOffset_in, Ordinal subDim_in, const ArrayRCP< Scalar > &values_in, ptrdiff_t stride_in)
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)
size_type lowerOffset() const
const Scalar & operator[](Ordinal i) const
Zero-based indexing (Preconditions: values()!=NULL &amp;&amp; (0 &lt;= i &lt; subDim())).
static void extractPrimitiveObjs(const Scalar &obj, const ArrayView< primitiveType > &primitiveObjs, const ArrayView< index_type > &indexObjs, const ArrayView< char > &charObjs)
void setGlobalOffset(Ordinal globalOffset_in)
ConstSubVectorView(const ConstSubVectorView< Scalar > &sv)
void setGlobalOffset(Ordinal globalOffset_in)
ConstSubVectorView(const ArrayRCP< const Scalar > &values_in)
const ArrayRCP< const Scalar > values() const
Class for a non-changeable sub-multi-vector (submatrix).
ScalarPrimitiveTypeTraits::primitiveType primitiveType
void initialize(Ordinal globalOffset_in, Ordinal subDim_in, Ordinal colOffset_in, Ordinal numSubCols_in, const ArrayRCP< const Scalar > &values_in, Ordinal leadingDim_in)
static void loadPrimitiveObjs(const ArrayView< const primitiveType > &primitiveObjs, const ArrayView< const index_type > &indexObjs, const ArrayView< const char > &charObjs, const Ptr< index_type > &obj)
static void loadPrimitiveObjs(const ArrayView< const primitiveType > &primitiveObjs, const ArrayView< const index_type > &indexObjs, const ArrayView< const char > &charObjs, const Ptr< Scalar > &obj)
const Scalar & operator()(Ordinal i) const
Zero-based indexing (Preconditions: values()!=NULL &amp;&amp; (0 &lt;= i &lt; subDim())).
ConstSubVectorView< Scalar > col(const Ordinal j) const
Return a ConstSubVectorView view of the jth sub-column (Preconditions: values()!=NULL &amp;&amp; (0&lt;=j&lt;numSub...
PrimitiveTypeTraits< Scalar, Scalar > ScalarPrimitiveTypeTraits
#define TEUCHOS_ASSERT(assertion_test)
#define TEUCHOS_ASSERT_EQUALITY(val1, val2)
static void extractPrimitiveObjs(const index_type &obj, const ArrayView< primitiveType > &primitiveObjs, const ArrayView< index_type > &indexObjs, const ArrayView< char > &charObjs)
Scalar & operator[](Ordinal i) const
Zero-based indexing (Preconditions: values()!=NULL &amp;&amp; (0 &lt;= i &lt; subDim())).
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
iterator begin() const
ConstSubMultiVectorView(const ConstSubMultiVectorView< Scalar > &smv)
const ArrayRCP< const Scalar > values() const
Scalar & operator()(Ordinal i, Ordinal j) const
Zero-based indexing (Preconditions: values()!=NULL &amp;&amp; (0&lt;=i&lt; subDim()) &amp;&amp; (0&lt;=j&lt;numSubCols()).
const Scalar & operator()(Ordinal i, Ordinal j) const
Zero-based indexing (Preconditions: values()!=NULL &amp;&amp; (0&lt;=i&lt;subDim()) &amp;&amp; (0&lt;=j&lt; numSubCols()).
void initialize(Ordinal globalOffset_in, Ordinal subDim_in, const ArrayRCP< const Scalar > &values_in, ptrdiff_t stride_in)