RTOp Package Browser (Single Doxygen Collection) Version of the Day
Loading...
Searching...
No Matches
RTOpPack_Types.hpp
Go to the documentation of this file.
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"
54#include "Teuchos_TypeNameTraits.hpp"
55#include "Teuchos_Assert.hpp"
56#include "Teuchos_implicit_cast.hpp"
57#include "Teuchos_FancyOStream.hpp"
58
59
60namespace RTOpPack {
61
62
63//
64// Basic types
65//
66
68typedef Teuchos_Ordinal Ordinal;
70using Teuchos::Ptr;
72using Teuchos::RCP;
74using Teuchos::ArrayRCP;
76using Teuchos::ArrayView;
78using Teuchos::Array;
80using Teuchos::Range1D;
82using Teuchos::ScalarTraits;
84using Teuchos::TypeNameTraits;
86using Teuchos::FancyOStream;
87
89typedef Teuchos_Ordinal index_type;
91typedef char char_type;
92
93
94//
95// Exceptions
96//
97
98
100class UnknownError : public std::logic_error
101{public: UnknownError(const std::string& what_arg) : std::logic_error(what_arg) {}};
103class InvalidUsage : public std::logic_error
104{public: InvalidUsage(const std::string& what_arg) : std::logic_error(what_arg) {}};
106class InvalidNumVecs : public std::logic_error
107{public: InvalidNumVecs(const std::string& what_arg) : std::logic_error(what_arg) {}};
109class InvalidNumTargVecs : public std::logic_error
110{public: InvalidNumTargVecs(const std::string& what_arg) : std::logic_error(what_arg) {}};
112class IncompatibleVecs : public std::logic_error
113{public: IncompatibleVecs(const std::string& what_arg) : std::logic_error(what_arg) {}};
115class 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
143template<class Scalar>
145public:
149 ConstSubVectorView(const ArrayRCP<const Scalar> &values_in)
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); }
158 ConstSubVectorView( const ConstSubVectorView<Scalar>& sv )
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);
171 TEUCHOS_ASSERT(
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 }
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
208 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(i, 0, subDim_);
209#endif
210 return valuesBegin()[stride_*i];
211 }
214 const Scalar& operator()(Ordinal i) const { return (*this)[i]; }
215private:
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 }
226public:
227};
228
229
246template<class Scalar>
247class SubVectorView : public ConstSubVectorView<Scalar> {
248public:
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 {}
262 :ConstSubVectorView<Scalar>(0, subDim_in, Teuchos::arcp<Scalar>(subDim_in), 1)
263 {}
265 SubVectorView(const SubVectorView<Scalar> & sv)
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]; }
282public:
283};
284
285
287template<class Scalar>
288void 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
304template<class Scalar>
305std::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
344template<class Scalar>
346public:
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 )
359 leadingDim_(0)
360 {
361 initialize(globalOffset_in, subDim_in, colOffset_in, numSubCols_in, values_in,
362 leadingDim_in);
363 }
365 ConstSubMultiVectorView( const ConstSubMultiVectorView<Scalar>& smv )
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 {
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 }
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
429 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(i, 0, subDim_);
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
442 return ConstSubVectorView<Scalar>(
443 globalOffset(), subDim(), values().persistingView(j*leadingDim(),subDim()), 1 );
444 }
445private:
450 ArrayRCP<const Scalar> values_;
452public:
453};
454
455
472template<class Scalar>
474public:
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 {}
494 SubMultiVectorView( const SubMultiVectorView<Scalar> & smv)
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
524 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(j, 0, this->numSubCols());
525#endif
526 return SubVectorView<Scalar>(this->globalOffset(), this->subDim(),
527 values().persistingView(j*this->leadingDim(),this->subDim()), 1);
528 }
529public:
530};
531
532
534template<class Scalar>
535void 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
565template <class Scalar, class ConcreteObj>
567public:
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(); }
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
606template <class Scalar>
607class PrimitiveTypeTraits<Scalar, Scalar> {
608public:
610 typedef Scalar primitiveType;
612 static int numPrimitiveObjs() { return 1; }
614 static int numIndexObjs() { return 0; }
616 static int numCharObjs() { return 0; }
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 }
639private:
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
659template <class Scalar>
661public:
663 typedef PrimitiveTypeTraits<Scalar,Scalar> ScalarPrimitiveTypeTraits;
667 static int numPrimitiveObjs() { return 0; }
669 static int numIndexObjs() { return 1; }
671 static int numCharObjs() { return 0; }
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 }
694private:
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
715template <class Scalar>
716class PrimitiveTypeTraits<std::complex<Scalar>, std::complex<Scalar> > {
717public:
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 }
768private:
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
776 TEUCHOS_TEST_FOR_EXCEPT(
777 primitiveObjs.size()!=2*ScalarPrimitiveTypeTraits::numPrimitiveObjs()
778 || indexObjs.size()!=0
779 || charObjs.size()!=0 );
780#endif
781 }
782};
783
784
788template <class Scalar>
789class PrimitiveTypeTraits<std::complex<Scalar>, Scalar> {
790public:
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 }
828private:
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
836 TEUCHOS_TEST_FOR_EXCEPT(
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
855template<class Scalar> class RTOpT;
856
857
858} // namespace RTOpPack
859
860
861#endif // RTOPPACK_TYPES_HPP
Class for a non-changeable sub-multi-vector (submatrix).
const ArrayRCP< const Scalar > values() const
ConstSubVectorView< Scalar > col(const Ordinal j) const
Return a ConstSubVectorView view of the jth sub-column (Preconditions: values()!=NULL && (0<=j<numSub...
void initialize(Ordinal globalOffset_in, Ordinal subDim_in, Ordinal colOffset_in, Ordinal numSubCols_in, const ArrayRCP< const Scalar > &values_in, Ordinal leadingDim_in)
ArrayRCP< const Scalar > values_
void setGlobalOffset(Ordinal globalOffset_in)
ConstSubMultiVectorView(Ordinal globalOffset_in, Ordinal subDim_in, Ordinal colOffset_in, Ordinal numSubCols_in, const ArrayRCP< const Scalar > &values_in, Ordinal leadingDim_in)
ConstSubMultiVectorView(const ConstSubMultiVectorView< Scalar > &smv)
const Scalar & operator()(Ordinal i, Ordinal j) const
Zero-based indexing (Preconditions: values()!=NULL && (0<=i<subDim()) && (0<=j< numSubCols()).
Class for a non-changeable sub-vector.
ConstSubVectorView(Ordinal globalOffset_in, Ordinal subDim_in, const ArrayRCP< const Scalar > &values_in, ptrdiff_t stride_in)
void setGlobalOffset(Ordinal globalOffset_in)
const Scalar & operator()(Ordinal i) const
Zero-based indexing (Preconditions: values()!=NULL && (0 <= i < subDim())).
const ArrayRCP< constScalar >::iterator valuesBegin() const
ArrayRCP< const Scalar > values_
const ArrayRCP< const Scalar > values() const
ConstSubVectorView(const ConstSubVectorView< Scalar > &sv)
ConstSubVectorView(const ArrayRCP< const Scalar > &values_in)
std::ostream & operator<<(std::ostream &out, const ConstSubVectorView< Scalar > &sv)
void initialize(Ordinal globalOffset_in, Ordinal subDim_in, const ArrayRCP< const Scalar > &values_in, ptrdiff_t stride_in)
const Scalar & operator[](Ordinal i) const
Zero-based indexing (Preconditions: values()!=NULL && (0 <= i < subDim())).
IncompatibleReductObj(const std::string &what_arg)
IncompatibleVecs(const std::string &what_arg)
InvalidNumTargVecs(const std::string &what_arg)
InvalidNumVecs(const std::string &what_arg)
InvalidUsage(const std::string &what_arg)
static void assertInput(const ArrayView< const primitiveType > &primitiveObjs, const ArrayView< const index_type > &indexObjs, const ArrayView< const char > &charObjs)
static void loadPrimitiveObjs(const ArrayView< const primitiveType > &primitiveObjs, const ArrayView< const index_type > &indexObjs, const ArrayView< const char > &charObjs, const Ptr< Scalar > &obj)
static void extractPrimitiveObjs(const Scalar &obj, const ArrayView< primitiveType > &primitiveObjs, const ArrayView< index_type > &indexObjs, const ArrayView< char > &charObjs)
PrimitiveTypeTraits< Scalar, Scalar > ScalarPrimitiveTypeTraits
ScalarPrimitiveTypeTraits::primitiveType primitiveType
static void extractPrimitiveObjs(const index_type &obj, const ArrayView< primitiveType > &primitiveObjs, const ArrayView< index_type > &indexObjs, const ArrayView< char > &charObjs)
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 assertInput(const ArrayView< const primitiveType > &primitiveObjs, const ArrayView< const index_type > &indexObjs, const ArrayView< const char > &charObjs)
A templated traits class for decomposing object into an array of primitive objects.
static void extractPrimitiveObjs(const Scalar &obj, const ArrayView< primitiveType > &primitiveObjs, const ArrayView< index_type > &indexObjs, const ArrayView< char > &charObjs)
static void loadPrimitiveObjs(const ArrayView< const primitiveType > &primitiveObjs, const ArrayView< const index_type > &indexObjs, const ArrayView< const char > &charObjs, const Ptr< Scalar > &obj)
Class for a changeable sub-vector.
SubMultiVectorView(const SubMultiVectorView< Scalar > &smv)
Scalar & operator()(Ordinal i, Ordinal j) const
Zero-based indexing (Preconditions: values()!=NULL && (0<=i< subDim()) && (0<=j<numSubCols()).
SubMultiVectorView(Ordinal numRows_in, Ordinal numCols_in)
SubVectorView< Scalar > col(const Ordinal j) const
Return a SubVectorView view of the jth sub-column (Preconditions: values()!=NULL && && (0<=j<numSubCo...
void initialize(Ordinal globalOffset_in, Ordinal subDim_in, Ordinal colOffset_in, Ordinal numSubCols_in, const ArrayRCP< Scalar > &values_in, Ordinal leadingDim_in)
const ArrayRCP< Scalar > values() 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 changeable sub-vector.
Scalar & operator[](Ordinal i) const
Zero-based indexing (Preconditions: values()!=NULL && (0 <= i < subDim())).
SubVectorView(Ordinal subDim_in)
void initialize(Ordinal globalOffset_in, Ordinal subDim_in, const ArrayRCP< Scalar > &values_in, ptrdiff_t stride_in)
Scalar & operator()(Ordinal i) const
Zero-based indexing (Preconditions: values()!=NULL && (0 <= i < subDim())).
SubVectorView(const SubVectorView< Scalar > &sv)
SubVectorView(const ArrayRCP< Scalar > &values_in)
const ArrayRCP< Scalar > values() const
SubVectorView(Ordinal globalOffset_in, Ordinal subDim_in, const ArrayRCP< Scalar > &values_in, ptrdiff_t stride_in)
UnknownError(const std::string &what_arg)
Teuchos_Ordinal index_type
Teuchos_Ordinal Ordinal
void assign_entries(const Ptr< const SubVectorView< Scalar > > &msv, const ConstSubVectorView< Scalar > &sv)