44 #ifndef RTOPPACK_TYPES_HPP
45 #define RTOPPACK_TYPES_HPP
48 #include "RTOp_ConfigDefs.hpp"
51 #include "Teuchos_ArrayRCP.hpp"
55 #include "Teuchos_Assert.hpp"
56 #include "Teuchos_implicit_cast.hpp"
57 #include "Teuchos_FancyOStream.hpp"
68 typedef Teuchos_Ordinal Ordinal;
89 typedef Teuchos_Ordinal index_type;
91 typedef 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) {}};
143 template<
class Scalar>
150 :globalOffset_(0), subDim_(0), stride_(0)
155 :globalOffset_(0), subDim_(0), stride_(0)
156 {
initialize(globalOffset_in, subDim_in, values_in, stride_in); }
172 subDim_in*std::abs(Teuchos::as<int>(stride_in)) - 1 <= values_in.
upperOffset());
179 globalOffset_=globalOffset_in;
186 { globalOffset_ = 0; subDim_=0; values_ = Teuchos::null; stride_ = 0; }
193 globalOffset_ = globalOffset_in;
198 Ordinal
subDim()
const {
return subDim_; }
202 ptrdiff_t
stride()
const {
return stride_; }
210 return valuesBegin()[stride_*i];
214 const Scalar&
operator()(Ordinal i)
const {
return (*
this)[i]; }
216 Ordinal globalOffset_;
223 return values_.
begin();
224 return values_.
begin() + (subDim_*std::abs(Teuchos::as<int>(stride_)) - 1);
246 template<
class Scalar>
287 template<
class Scalar>
288 void assign_entries(
const Ptr<
const SubVectorView<Scalar> > &msv,
289 const ConstSubVectorView<Scalar> &sv )
294 for(
int i = 0; i < sv.subDim(); ++i ) {
304 template<
class Scalar>
310 <<
",subDim="<<sv.
subDim()
311 <<
",values="<<sv.
values()
312 <<
",stride="<<sv.
stride()
344 template<
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,
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,
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;
409 globalOffset_ = globalOffset_in;
414 Ordinal
subDim()
const {
return subDim_; }
432 return values_[ i + leadingDim_*j ];
446 Ordinal globalOffset_;
472 template<
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,
491 colOffset_in, numSubCols_in, values_in, leadingDim_in)
499 Ordinal globalOffset_in, Ordinal subDim_in,
500 Ordinal colOffset_in, Ordinal numSubCols_in,
505 subDim_in, colOffset_in, numSubCols_in, values_in, leadingDim_in);
510 return Teuchos::arcp_const_cast<Scalar>(
534 template<
class Scalar>
535 void assign_entries(
const Ptr<
const SubMultiVectorView<Scalar> > &msmv,
536 const ConstSubMultiVectorView<Scalar> &smv )
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);
565 template <
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(); }
587 Scalar::this_type_is_missing_a_specialization(obj);
597 *obj = Scalar::this_type_is_missing_a_specialization();
606 template <
class Scalar>
625 assertInput(primitiveObjs, indexObjs, charObjs);
626 primitiveObjs[0] = obj;
636 assertInput(primitiveObjs, indexObjs, charObjs);
637 *obj = primitiveObjs[0];
640 static void assertInput(
648 || charObjs.
size()!=0 );
655 template <
class Scalar>
670 const index_type &obj,
676 assertInput(primitiveObjs, indexObjs, charObjs);
687 assertInput(primitiveObjs, indexObjs, charObjs);
691 static void assertInput(
699 || charObjs.
size()!=0 );
705 #if defined(HAVE_COMPLEX) && defined(HAVE_TEUCHOS_COMPLEX)
711 template <
class Scalar>
712 class PrimitiveTypeTraits<std::complex<Scalar>, std::complex<Scalar> > {
715 typedef PrimitiveTypeTraits<Scalar,Scalar> ScalarPrimitiveTypeTraits;
717 typedef typename ScalarPrimitiveTypeTraits::primitiveType
primitiveType;
720 {
return 2*ScalarPrimitiveTypeTraits::numPrimitiveObjs(); }
727 const std::complex<Scalar> &obj,
728 const ArrayView<primitiveType> &primitiveObjs,
729 const ArrayView<index_type> &indexObjs,
730 const ArrayView<char> &charObjs
734 const int numScalarPrimitiveObjs =
735 ScalarPrimitiveTypeTraits::numPrimitiveObjs();
736 assertInput(primitiveObjs, indexObjs, charObjs);
737 ScalarPrimitiveTypeTraits::extractPrimitiveObjs(
738 obj.real(), primitiveObjs(0,numScalarPrimitiveObjs),
null, null );
739 ScalarPrimitiveTypeTraits::extractPrimitiveObjs(
740 obj.imag(), primitiveObjs(numScalarPrimitiveObjs,numScalarPrimitiveObjs),
null, null );
744 const ArrayView<const primitiveType> &primitiveObjs,
745 const ArrayView<const index_type> &indexObjs,
746 const ArrayView<const char> &charObjs,
747 const Ptr<std::complex<Scalar> > &obj
751 using Teuchos::outArg;
752 assertInput(primitiveObjs, indexObjs, charObjs);
753 const int numScalarPrimitiveObjs =
754 ScalarPrimitiveTypeTraits::numPrimitiveObjs();
756 ScalarPrimitiveTypeTraits::loadPrimitiveObjs(
757 primitiveObjs(0,numScalarPrimitiveObjs),
null,
null,
759 ScalarPrimitiveTypeTraits::loadPrimitiveObjs(
760 primitiveObjs(numScalarPrimitiveObjs,numScalarPrimitiveObjs),
null,
null,
762 *obj = std::complex<Scalar>( real, imag );
765 static void assertInput(
766 const ArrayView<const primitiveType> &primitiveObjs,
767 const ArrayView<const index_type> &indexObjs,
768 const ArrayView<const char> &charObjs
773 primitiveObjs.size()!=2*ScalarPrimitiveTypeTraits::numPrimitiveObjs()
774 || indexObjs.size()!=0
775 || charObjs.size()!=0 );
784 template <
class Scalar>
785 class PrimitiveTypeTraits<std::complex<Scalar>, Scalar> {
788 typedef PrimitiveTypeTraits<Scalar,Scalar> ScalarPrimitiveTypeTraits;
790 typedef typename ScalarPrimitiveTypeTraits::primitiveType
primitiveType;
793 {
return ScalarPrimitiveTypeTraits::numPrimitiveObjs(); }
801 const ArrayView<primitiveType> &primitiveObjs,
802 const ArrayView<index_type> &indexObjs,
803 const ArrayView<char> &charObjs
807 assertInput(primitiveObjs, indexObjs, charObjs);
808 ScalarPrimitiveTypeTraits::extractPrimitiveObjs(
809 obj, primitiveObjs,
null,
null );
813 const ArrayView<const primitiveType> &primitiveObjs,
814 const ArrayView<const index_type> &indexObjs,
815 const ArrayView<const char> &charObjs,
816 const Ptr<Scalar > &obj
820 assertInput(primitiveObjs, indexObjs, charObjs);
821 ScalarPrimitiveTypeTraits::loadPrimitiveObjs(
822 primitiveObjs,
null,
null, obj );
825 static void assertInput(
826 const ArrayView<const primitiveType> &primitiveObjs,
827 const ArrayView<const index_type> &indexObjs,
828 const ArrayView<const char> &charObjs
833 primitiveObjs.size()!=ScalarPrimitiveTypeTraits::numPrimitiveObjs()
834 || indexObjs.size()!=0
835 || charObjs.size()!=0 );
841 #endif // defined(HAVE_COMPLEX) && defined(HAVE_TEUCHOS_COMPLEX)
851 template<
class Scalar>
class RTOpT;
857 #endif // RTOPPACK_TYPES_HPP