43 #ifndef RTOPPACK_RTOP_T_HELPERS_DECL_HPP
44 #define RTOPPACK_RTOP_T_HELPERS_DECL_HPP
53 #include "RTOpPack_RTOpT.hpp"
60 #ifdef RTOPPACK_RTOPT_HELPER_DUMP_OUTPUT
62 namespace RTOpPack {
extern bool rtop_helpers_dump_all; }
63 #endif // RTOPPACK_RTOPT_HELPER_DUMP_OUTPUT
73 template<
class Scalar>
94 template<
class Scalar>
97 out <<
"{"<<scalarIndex.
scalar<<
","<<scalarIndex.
index<<
"}";
105 template <
class Scalar>
126 assertInput(primitiveObjs, indexObjs, charObjs);
127 ScalarPrimitiveTypeTraits::extractPrimitiveObjs(
128 obj.
scalar, primitiveObjs, Teuchos::null, Teuchos::null );
129 indexObjs[0] = obj.
index;
139 assertInput(primitiveObjs, indexObjs, charObjs);
140 ScalarPrimitiveTypeTraits::loadPrimitiveObjs(
141 primitiveObjs, Teuchos::null, Teuchos::null,
142 Teuchos::outArg(obj->scalar) );
143 obj->index = indexObjs[0];
154 primitiveObjs.
size()!=ScalarPrimitiveTypeTraits::numPrimitiveObjs()
155 || indexObjs.
size()!=1
156 || charObjs.
size()!=0 );
166 template<
class ConcreteReductObj>
174 void set(
const ConcreteReductObj &concreteReductObj )
177 const ConcreteReductObj&
get()
const
190 template<
class ConcreteReductObj>
221 template<
class Scalar>
224 const int allowed_num_sub_vecs,
225 const int allowed_num_targ_sub_vecs,
226 const bool expect_reduct_obj,
243 template<
class ConcreteReductObj,
int ReductionType>
247 inline void operator()(
const ConcreteReductObj& in_reduct, ConcreteReductObj& inout_reduct)
const
249 return in_reduct.this_reduction_type_needs_a_specialization();
255 template<
class ConcreteReductObj>
259 inline void operator()(
const ConcreteReductObj& in_reduct, ConcreteReductObj& inout_reduct)
const
261 inout_reduct += in_reduct;
267 template<
class ConcreteReductObj>
271 inline void operator()(
const ConcreteReductObj& in_reduct, ConcreteReductObj& inout_reduct)
const
273 inout_reduct = std::max(inout_reduct, in_reduct);
279 template<
class ConcreteReductObj>
283 inline void operator()(
const ConcreteReductObj& in_reduct, ConcreteReductObj& inout_reduct)
const
285 inout_reduct = std::min(inout_reduct, in_reduct);
291 template<
class Scalar>
295 inline void operator()(
const Scalar& in_reduct, Scalar& inout_reduct)
const
297 inout_reduct += in_reduct;
306 template<
class Scalar,
class ConcreteReductObj,
class ReductObjReduction>
320 ReductObjReduction reductObjReduction_in = ReductObjReduction()
322 : initReductObjValue_(initReductObjValue_in),
359 *num_values = PTT::numPrimitiveObjs();
360 *num_indexes = PTT::numIndexObjs();
361 *num_chars = PTT::numCharObjs();
376 const ConcreteReductObj scalar_in_reduct_obj = this->
getRawVal(in_reduct_obj);
377 ConcreteReductObj scalar_inout_reduct_obj = this->
getRawVal(*inout_reduct_obj);
379 this->
setRawVal( scalar_inout_reduct_obj, inout_reduct_obj );
385 setRawVal( initReductObjValue(), reduct_obj );
397 PTT::extractPrimitiveObjs(
getRawVal(reduct_obj),
398 value_data, index_data, char_data );
410 ConcreteReductObj concrete_reduct_obj;
411 PTT::loadPrimitiveObjs( value_data, index_data, char_data,
412 Teuchos::outArg(concrete_reduct_obj) );
413 this->
setRawVal( concrete_reduct_obj, reduct_obj );
436 template<
class Scalar,
class ConcreteReductObj,
class EleWiseReduction,
448 const ConcreteReductObj &initReductObjValue_in = ConcreteReductObj(),
449 EleWiseReduction eleWiseReduction_in = EleWiseReduction(),
450 ReductObjReduction reductObjReduction_in = ReductObjReduction()
452 :
base_t(initReductObjValue_in, reductObjReduction_in),
470 validate_apply_op<Scalar>(*
this, 1, 0,
true,
471 sub_vecs, targ_sub_vecs, reduct_obj_inout.
getConst());
476 ConcreteReductObj reduct = reduct_obj.
get();
480 const_iter_t v0_val = sub_vecs[0].values().begin();
481 const ptrdiff_t v0_s = sub_vecs[0].stride();
492 reduct_obj.set(reduct);
506 #define RTOP_ROP_1_REDUCT_SCALAR_CUSTOM_DEFAULT( ROP_CLASS_NAME, REDUCT_SCALAR, \
507 BASIC_REDUCT_TYPE_ENUM, CUSTOM_DEFAULT \
510 template<class Scalar, class ReductScalar> \
511 class ROP_CLASS_NAME ## EleWiseReduction \
514 inline void operator()( \
516 ReductScalar &reduct \
521 template<class Scalar> \
522 class ROP_CLASS_NAME \
523 : public RTOpPack::ROp_1_ScalarReduction< \
526 ROP_CLASS_NAME ## EleWiseReduction<Scalar, REDUCT_SCALAR >, \
527 RTOpPack::BasicReductObjReductionOp<REDUCT_SCALAR, BASIC_REDUCT_TYPE_ENUM> > \
529 typedef RTOpPack::ROp_1_ScalarReduction< \
532 ROP_CLASS_NAME ## EleWiseReduction<Scalar, REDUCT_SCALAR >, \
533 RTOpPack::BasicReductObjReductionOp<REDUCT_SCALAR, BASIC_REDUCT_TYPE_ENUM> > \
537 : base_t(CUSTOM_DEFAULT) \
539 this->setOpNameBase( #ROP_CLASS_NAME ); \
544 template<class Scalar, class ReductScalar> \
545 void ROP_CLASS_NAME ## EleWiseReduction<Scalar, ReductScalar>::operator()( \
546 const Scalar &v0, ReductScalar &reduct \
551 #define RTOP_ROP_1_REDUCT_SCALAR( ROP_CLASS_NAME, REDUCT_SCALAR, \
552 BASIC_REDUCT_TYPE_ENUM \
554 RTOP_ROP_1_REDUCT_SCALAR_CUSTOM_DEFAULT(ROP_CLASS_NAME, REDUCT_SCALAR, \
555 BASIC_REDUCT_TYPE_ENUM, Teuchos::ScalarTraits<REDUCT_SCALAR >::zero() )
568 class EleWiseReduction,
569 class ReductObjReduction = SumScalarReductObjReduction<ReductScalar>
584 const ReductScalar &initReductObjValue_in = ReductScalar(),
585 EleWiseReduction eleWiseReduction_in = EleWiseReduction(),
586 ReductObjReduction reductObjReduction_in = ReductObjReduction()
588 :
base_t(initReductObjValue_in, reductObjReduction_in),
619 validate_apply_op<Scalar>(*
this, 1, 0,
true,
620 sub_vecs, targ_sub_vecs, reduct_obj_inout);
625 ReductScalar reduct = reduct_obj.
get();
629 const_iter_t v0_val = sub_vecs[0].values().begin();
630 const ptrdiff_t v0_s = sub_vecs[0].stride();
639 for(
Teuchos_Ordinal i = 0; i < subDim; ++i, v0_val += v0_s, ++global_i )
643 reduct_obj.
set(reduct);
665 class EleWiseReduction,
679 const ReductScalar &initReductObjValue_in = ReductScalar(),
680 EleWiseReduction eleWiseReduction_in = EleWiseReduction(),
681 ReductObjReduction reductObjReduction_in = ReductObjReduction()
683 :
base_t(initReductObjValue_in, reductObjReduction_in),
701 validate_apply_op<Scalar>(*
this, 2, 0,
true,
702 sub_vecs, targ_sub_vecs, reduct_obj_inout.
getConst());
707 Scalar reduct = reduct_obj.
get();
711 const_iter_t v0_val = sub_vecs[0].values().begin();
712 const ptrdiff_t v0_s = sub_vecs[0].stride();
713 const_iter_t v1_val = sub_vecs[1].values().begin();
714 const ptrdiff_t v1_s = sub_vecs[1].stride();
716 if( v0_s == 1 && v1_s == 1 ) {
721 for(
Teuchos_Ordinal i = 0; i < subDim; ++i, v0_val += v0_s, v1_val += v1_s )
725 reduct_obj.set(reduct);
741 #define RTOP_ROP_2_REDUCT_SCALAR( ROP_CLASS_NAME, REDUCT_SCALAR, \
742 BASIC_REDUCT_TYPE_ENUM \
745 template<class Scalar, class ReductScalar> \
746 class ROP_CLASS_NAME ## EleWiseReduction \
749 inline void operator()(const Scalar &v0, \
751 ReductScalar &reduct \
756 template<class Scalar> \
757 class ROP_CLASS_NAME \
758 : public RTOpPack::ROp_2_ScalarReduction< \
761 ROP_CLASS_NAME ## EleWiseReduction<Scalar, REDUCT_SCALAR >, \
762 RTOpPack::BasicReductObjReductionOp<REDUCT_SCALAR, BASIC_REDUCT_TYPE_ENUM> > \
767 this->setOpNameBase( #ROP_CLASS_NAME ); \
768 this->initReductObjValue(ScalarTraits<REDUCT_SCALAR >::zero()); \
772 template<class Scalar, class ReductScalar> \
773 void ROP_CLASS_NAME ## EleWiseReduction<Scalar, ReductScalar>::operator()( \
774 const Scalar &v0, const Scalar &v1, ReductScalar &reduct) const
783 template<
class Scalar,
class EleWiseTransformation>
790 EleWiseTransformation eleWiseTransformation = EleWiseTransformation()
808 validate_apply_op<Scalar>(*
this, 0, 1,
false,
809 sub_vecs, targ_sub_vecs, reduct_obj_inout.
getConst());
814 iter_t z0_val = targ_sub_vecs[0].values().begin();
815 const ptrdiff_t z0_s = targ_sub_vecs[0].stride();
839 template<
class Scalar,
class EleWiseTransformation>
846 EleWiseTransformation eleWiseTransformation = EleWiseTransformation()
879 validate_apply_op<Scalar>(*
this, 0, 1,
false,
880 sub_vecs, targ_sub_vecs, reduct_obj_inout.
getConst());
885 iter_t z0_val = targ_sub_vecs[0].values().begin();
886 const ptrdiff_t z0_s = targ_sub_vecs[0].stride();
895 for(
Teuchos_Ordinal i = 0; i < subDim; ++i, z0_val += z0_s, ++global_i )
916 template<
class Scalar,
class EleWiseTransformation>
923 EleWiseTransformation eleWiseTransformation = EleWiseTransformation()
942 validate_apply_op<Scalar>(*
this, 1, 1,
false,
943 sub_vecs, targ_sub_vecs, reduct_obj_inout.
getConst());
948 const_iter_t v0_val = sub_vecs[0].values().begin();
949 const ptrdiff_t v0_s = sub_vecs[0].stride();
951 iter_t z0_val = targ_sub_vecs[0].values().begin();
952 const ptrdiff_t z0_s = targ_sub_vecs[0].stride();
954 if ( v0_s == 1 && z0_s == 1 ) {
959 for(
Teuchos_Ordinal i = 0; i < subDim; ++i, v0_val += v0_s, z0_val += z0_s )
975 #define RTOP_TOP_1_1( TOP_CLASS_NAME ) \
977 template<class Scalar> \
978 class TOP_CLASS_NAME ## EleWiseTransformation \
981 inline void operator()( const Scalar &v0, Scalar &z0 ) const; \
985 template<class Scalar> \
986 class TOP_CLASS_NAME \
987 : public RTOpPack::TOp_1_1_Base< Scalar, \
988 TOP_CLASS_NAME ## EleWiseTransformation<Scalar> > \
993 this->setOpNameBase( #TOP_CLASS_NAME ); \
998 template<class Scalar> \
999 void TOP_CLASS_NAME ## EleWiseTransformation<Scalar>::operator()( \
1000 const Scalar &v0, Scalar &z0 \
1010 template<
class Scalar,
class EleWiseTransformation>
1017 EleWiseTransformation eleWiseTransformation = EleWiseTransformation()
1035 #ifdef TEUCHOS_DEBUG
1036 validate_apply_op<Scalar>(*
this, 2, 1,
false,
1037 sub_vecs, targ_sub_vecs, reduct_obj_inout);
1042 const_iter_t v0_val = sub_vecs[0].values().begin();
1043 const ptrdiff_t v0_s = sub_vecs[0].stride();
1045 const_iter_t v1_val = sub_vecs[1].values().begin();
1046 const ptrdiff_t v1_s = sub_vecs[1].stride();
1048 iter_t z0_val = targ_sub_vecs[0].values().begin();
1049 const ptrdiff_t z0_s = targ_sub_vecs[0].stride();
1051 if ( v0_s == 1 && v1_s == 1 && z0_s == 1 ) {
1059 ++i, v0_val += v0_s, v1_val += v1_s, z0_val += z0_s
1078 template<
class Scalar,
class EleWiseTransformation>
1085 EleWiseTransformation eleWiseTransformation = EleWiseTransformation()
1103 #ifdef TEUCHOS_DEBUG
1104 validate_apply_op<Scalar>(*
this, 3, 1,
false,
1105 sub_vecs, targ_sub_vecs, reduct_obj_inout);
1110 const_iter_t v0_val = sub_vecs[0].values().begin();
1111 const ptrdiff_t v0_s = sub_vecs[0].stride();
1113 const_iter_t v1_val = sub_vecs[1].values().begin();
1114 const ptrdiff_t v1_s = sub_vecs[1].stride();
1116 const_iter_t v2_val = sub_vecs[2].values().begin();
1117 const ptrdiff_t v2_s = sub_vecs[2].stride();
1119 iter_t z0_val = targ_sub_vecs[0].values().begin();
1120 const ptrdiff_t z0_s = targ_sub_vecs[0].stride();
1122 if ( v0_s == 1 && v1_s == 1 && v2_s == 1 && z0_s == 1 ) {
1130 ++i, v0_val += v0_s, v1_val += v1_s, v2_val += v2_s, z0_val += z0_s
1151 #endif // RTOPPACK_RTOP_T_HELPERS_DECL_HPP