44#ifndef RTOPPACK_TYPES_HPP
45#define RTOPPACK_TYPES_HPP
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"
68typedef Teuchos_Ordinal Ordinal;
74using Teuchos::ArrayRCP;
76using Teuchos::ArrayView;
80using Teuchos::Range1D;
82using Teuchos::ScalarTraits;
84using Teuchos::TypeNameTraits;
86using Teuchos::FancyOStream;
89typedef Teuchos_Ordinal index_type;
91typedef char char_type;
101{
public:
UnknownError(
const std::string& what_arg) : std::logic_error(what_arg) {}};
104{
public:
InvalidUsage(
const std::string& what_arg) : std::logic_error(what_arg) {}};
107{
public:
InvalidNumVecs(
const std::string& what_arg) : std::logic_error(what_arg) {}};
110{
public:
InvalidNumTargVecs(
const std::string& what_arg) : std::logic_error(what_arg) {}};
113{
public:
IncompatibleVecs(
const std::string& what_arg) : std::logic_error(what_arg) {}};
143template<
class Scalar>
150 :globalOffset_(0), subDim_(0), stride_(0)
151 {
initialize(0, values_in.size(), values_in, 1); }
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); }
164 const ArrayRCP<const Scalar> &values_in, ptrdiff_t stride_in)
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);
176 TEUCHOS_ASSERT(subDim_in==0);
179 globalOffset_=globalOffset_in;
186 { globalOffset_ = 0; subDim_=0; values_ = Teuchos::null; stride_ = 0; }
191 TEUCHOS_ASSERT(globalOffset_in >= 0);
193 globalOffset_ = globalOffset_in;
198 Ordinal
subDim()
const {
return subDim_; }
200 const ArrayRCP<const Scalar>
values()
const {
return values_; }
202 ptrdiff_t
stride()
const {
return stride_; }
208 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(i, 0, subDim_);
210 return valuesBegin()[stride_*i];
214 const Scalar&
operator()(Ordinal i)
const {
return (*
this)[i]; }
216 Ordinal globalOffset_;
218 ArrayRCP<const Scalar> values_;
220 const typename ArrayRCP<const Scalar>::iterator valuesBegin()
const
223 return values_.begin();
224 return values_.begin() + (subDim_*std::abs(Teuchos::as<int>(stride_)) - 1);
246template<
class Scalar>
257 const ArrayRCP<Scalar> &values_in, ptrdiff_t stride_in)
270 const ArrayRCP<Scalar> &values_in, ptrdiff_t stride_in)
287template<
class Scalar>
288void assign_entries(
const Ptr<
const SubVectorView<Scalar> > &msv,
289 const ConstSubVectorView<Scalar> &sv )
292 TEUCHOS_ASSERT_EQUALITY(msv->subDim(), sv.subDim());
294 for(
int i = 0; i < sv.subDim(); ++i ) {
304template<
class Scalar>
310 <<
",subDim="<<sv.
subDim()
311 <<
",values="<<sv.
values()
312 <<
",stride="<<sv.
stride()
344template<
class Scalar>
349 :globalOffset_(0), subDim_(0), colOffset_(0), numSubCols_(0),
354 Ordinal globalOffset_in, Ordinal subDim_in,
355 Ordinal colOffset_in, Ordinal numSubCols_in,
356 const ArrayRCP<const Scalar> &values_in, Ordinal leadingDim_in
358 :globalOffset_(0), subDim_(0), colOffset_(0), numSubCols_(0),
361 initialize(globalOffset_in, subDim_in, colOffset_in, numSubCols_in, values_in,
372 Ordinal globalOffset_in, Ordinal subDim_in,
373 Ordinal colOffset_in, Ordinal numSubCols_in,
374 const ArrayRCP<const Scalar> &values_in, Ordinal leadingDim_in
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);
387 TEUCHOS_ASSERT(subDim_in == 0);
390 globalOffset_=globalOffset_in;
392 colOffset_=colOffset_in;
393 numSubCols_=numSubCols_in;
395 leadingDim_=leadingDim_in;
400 globalOffset_ = 0; subDim_=0; colOffset_=0, numSubCols_=0;
401 values_=Teuchos::null; leadingDim_=0;
407 TEUCHOS_ASSERT(globalOffset_in >= 0);
409 globalOffset_ = globalOffset_in;
414 Ordinal
subDim()
const {
return subDim_; }
420 const ArrayRCP<const Scalar>
values()
const {
return values_; }
429 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(i, 0, subDim_);
430 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(j, 0, numSubCols_ );
432 return values_[ i + leadingDim_*j ];
440 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(j, 0, numSubCols_ );
446 Ordinal globalOffset_;
450 ArrayRCP<const Scalar> values_;
472template<
class Scalar>
479 Ordinal numRows_in, Ordinal numCols_in
482 Teuchos::arcp<Scalar>(numRows_in*numCols_in), numRows_in)
486 Ordinal globalOffset_in, Ordinal subDim_in,
487 Ordinal colOffset_in, Ordinal numSubCols_in,
488 const ArrayRCP<Scalar> &values_in, Ordinal leadingDim_in
491 colOffset_in, numSubCols_in, values_in, leadingDim_in)
499 Ordinal globalOffset_in, Ordinal subDim_in,
500 Ordinal colOffset_in, Ordinal numSubCols_in,
501 const ArrayRCP<Scalar> &values_in, Ordinal leadingDim_in
505 subDim_in, colOffset_in, numSubCols_in, values_in, leadingDim_in);
510 return Teuchos::arcp_const_cast<Scalar>(
524 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(j, 0, this->
numSubCols());
534template<
class Scalar>
535void assign_entries(
const Ptr<
const SubMultiVectorView<Scalar> > &msmv,
536 const ConstSubMultiVectorView<Scalar> &smv )
539 TEUCHOS_ASSERT_EQUALITY(msmv->subDim(), smv.subDim());
540 TEUCHOS_ASSERT_EQUALITY(msmv->numSubCols(), smv.numSubCols());
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);
565template <
class Scalar,
class ConcreteObj>
572 {
return Scalar::this_type_is_missing_a_specialization(); }
575 {
return Scalar::this_type_is_missing_a_specialization(); }
578 {
return Scalar::this_type_is_missing_a_specialization(); }
582 const ArrayView<primitiveType> &primitiveObjs,
583 const ArrayView<index_type> &indexObjs,
584 const ArrayView<char> &charObjs
587 Scalar::this_type_is_missing_a_specialization(obj);
591 const ArrayView<const primitiveType> &primitiveObjs,
592 const ArrayView<const index_type> &indexObjs,
593 const ArrayView<const char> &charObjs,
594 const Ptr<Scalar> &obj
597 *obj = Scalar::this_type_is_missing_a_specialization();
606template <
class Scalar>
620 const ArrayView<primitiveType> &primitiveObjs,
621 const ArrayView<index_type> &indexObjs,
622 const ArrayView<char> &charObjs
625 assertInput(primitiveObjs, indexObjs, charObjs);
626 primitiveObjs[0] = obj;
630 const ArrayView<const primitiveType> &primitiveObjs,
631 const ArrayView<const index_type> &indexObjs,
632 const ArrayView<const char> &charObjs,
633 const Ptr<Scalar> &obj
636 assertInput(primitiveObjs, indexObjs, charObjs);
637 *obj = primitiveObjs[0];
640 static void assertInput(
641 const ArrayView<const primitiveType> &primitiveObjs,
642 const ArrayView<const index_type> &indexObjs,
643 const ArrayView<const char> &charObjs
647 TEUCHOS_TEST_FOR_EXCEPT( primitiveObjs.size()!=1 || indexObjs.size()!=0
648 || charObjs.size()!=0 );
659template <
class Scalar>
674 const index_type &obj,
675 const ArrayView<primitiveType> &primitiveObjs,
676 const ArrayView<index_type> &indexObjs,
677 const ArrayView<char> &charObjs
680 assertInput(primitiveObjs, indexObjs, charObjs);
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
691 assertInput(primitiveObjs, indexObjs, charObjs);
695 static void assertInput(
696 const ArrayView<const primitiveType> &primitiveObjs,
697 const ArrayView<const index_type> &indexObjs,
698 const ArrayView<const char> &charObjs
702 TEUCHOS_TEST_FOR_EXCEPT( primitiveObjs.size()!=0 || indexObjs.size()!=1
703 || charObjs.size()!=0 );
709#if defined(HAVE_COMPLEX) && defined(HAVE_TEUCHOS_COMPLEX)
715template <
class Scalar>
716class PrimitiveTypeTraits<std::complex<Scalar>, std::complex<Scalar> > {
719 typedef PrimitiveTypeTraits<Scalar,Scalar> ScalarPrimitiveTypeTraits;
721 typedef typename ScalarPrimitiveTypeTraits::primitiveType
primitiveType;
724 {
return 2*ScalarPrimitiveTypeTraits::numPrimitiveObjs(); }
731 const std::complex<Scalar> &obj,
732 const ArrayView<primitiveType> &primitiveObjs,
733 const ArrayView<index_type> &indexObjs,
734 const ArrayView<char> &charObjs
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 );
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
755 using Teuchos::outArg;
756 assertInput(primitiveObjs, indexObjs, charObjs);
757 const int numScalarPrimitiveObjs =
758 ScalarPrimitiveTypeTraits::numPrimitiveObjs();
760 ScalarPrimitiveTypeTraits::loadPrimitiveObjs(
761 primitiveObjs(0,numScalarPrimitiveObjs), null, null,
763 ScalarPrimitiveTypeTraits::loadPrimitiveObjs(
764 primitiveObjs(numScalarPrimitiveObjs,numScalarPrimitiveObjs), null, null,
766 *obj = std::complex<Scalar>( real, imag );
769 static void assertInput(
770 const ArrayView<const primitiveType> &primitiveObjs,
771 const ArrayView<const index_type> &indexObjs,
772 const ArrayView<const char> &charObjs
776 TEUCHOS_TEST_FOR_EXCEPT(
777 primitiveObjs.size()!=2*ScalarPrimitiveTypeTraits::numPrimitiveObjs()
778 || indexObjs.size()!=0
779 || charObjs.size()!=0 );
788template <
class Scalar>
789class PrimitiveTypeTraits<std::complex<Scalar>, Scalar> {
792 typedef PrimitiveTypeTraits<Scalar,Scalar> ScalarPrimitiveTypeTraits;
794 typedef typename ScalarPrimitiveTypeTraits::primitiveType
primitiveType;
797 {
return ScalarPrimitiveTypeTraits::numPrimitiveObjs(); }
805 const ArrayView<primitiveType> &primitiveObjs,
806 const ArrayView<index_type> &indexObjs,
807 const ArrayView<char> &charObjs
811 assertInput(primitiveObjs, indexObjs, charObjs);
812 ScalarPrimitiveTypeTraits::extractPrimitiveObjs(
813 obj, primitiveObjs, null, null );
817 const ArrayView<const primitiveType> &primitiveObjs,
818 const ArrayView<const index_type> &indexObjs,
819 const ArrayView<const char> &charObjs,
820 const Ptr<Scalar > &obj
824 assertInput(primitiveObjs, indexObjs, charObjs);
825 ScalarPrimitiveTypeTraits::loadPrimitiveObjs(
826 primitiveObjs, null, null, obj );
829 static void assertInput(
830 const ArrayView<const primitiveType> &primitiveObjs,
831 const ArrayView<const index_type> &indexObjs,
832 const ArrayView<const char> &charObjs
836 TEUCHOS_TEST_FOR_EXCEPT(
837 primitiveObjs.size()!=ScalarPrimitiveTypeTraits::numPrimitiveObjs()
838 || indexObjs.size()!=0
839 || charObjs.size()!=0 );
855template<
class Scalar>
class RTOpT;
Class for a non-changeable sub-multi-vector (submatrix).
ConstSubMultiVectorView()
const ArrayRCP< const Scalar > values() const
Ordinal colOffset() const
Ordinal leadingDim() 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)
Ordinal numSubCols() const
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)
Ordinal globalOffset() const
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.
Ordinal globalOffset() const
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< 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())).
static int numIndexObjs()
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)
static int numPrimitiveObjs()
PrimitiveTypeTraits< Scalar, Scalar > ScalarPrimitiveTypeTraits
static int numIndexObjs()
ScalarPrimitiveTypeTraits::primitiveType primitiveType
static int numPrimitiveObjs()
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)
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 int numPrimitiveObjs()
static int numIndexObjs()
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)