00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef RTOPPACK_ROP_MIN_INDEX_GREATER_THAN_BOUND_HPP
00030 #define RTOPPACK_ROP_MIN_INDEX_GREATER_THAN_BOUND_HPP
00031
00032 #include "RTOpPack_RTOpTHelpers.hpp"
00033 #include "Teuchos_StandardMemberCompositionMacros.hpp"
00034
00035 namespace RTOpPack {
00036
00050 template<class Scalar>
00051 class ROpMinIndexGreaterThanBound : public ROpScalarIndexReductionBase<Scalar> {
00052 public:
00054 STANDARD_MEMBER_COMPOSITION_MEMBERS( Scalar, bound )
00056 ROpMinIndexGreaterThanBound( const Scalar &bound = Teuchos::ScalarTraits<Scalar>::zero() )
00057 :RTOpT<Scalar>("ROpMinIndexGreaterThanBound")
00058 ,ROpScalarIndexReductionBase<Scalar>(+Teuchos::ScalarTraits<Scalar>::rmax(),-1)
00059 ,bound_(bound)
00060 {}
00062 ScalarIndex<Scalar> operator()(const ReductTarget& reduct_obj ) const { return this->getRawVal(reduct_obj); }
00065
00066 bool coord_invariant() const { return false; }
00068 void reduce_reduct_objs(
00069 const ReductTarget& in_reduct_obj, ReductTarget* inout_reduct_obj
00070 ) const
00071 {
00072 const ScalarIndex<Scalar> in = this->getRawVal(in_reduct_obj);
00073 const ScalarIndex<Scalar> inout = this->getRawVal(*inout_reduct_obj);
00074 if( in.scalar < inout.scalar || (in.scalar == inout.scalar && in.index < inout.index) )
00075 this->setRawVal(in,inout_reduct_obj);
00076 }
00078 void apply_op(
00079 const int num_vecs, const SubVectorT<Scalar> sub_vecs[]
00080 ,const int num_targ_vecs, const MutableSubVectorT<Scalar> targ_sub_vecs[]
00081 ,ReductTarget *reduct_obj
00082 ) const
00083 {
00084 RTOP_APPLY_OP_1_0(num_vecs,sub_vecs,num_targ_vecs,targ_sub_vecs);
00085 const Index globalOffset = sub_vecs[0].globalOffset();
00086 ScalarIndex<Scalar> minEle = this->getRawVal(*reduct_obj);
00087 if( v0_s == 1 ) {
00088 for( RTOp_index_type i = 1; i <= subDim; ++i ) {
00089 const Scalar &v0_i = *v0_val++;
00090 if( v0_i > bound() && (v0_i < minEle.scalar || ( v0_i == minEle.scalar && globalOffset + i < minEle.index ) ) )
00091 minEle = ScalarIndex<Scalar>(v0_i,globalOffset+i);
00092 }
00093 }
00094 else {
00095 for( RTOp_index_type i = 1; i <= subDim; ++i, v0_val += v0_s ) {
00096 const Scalar &v0_i = *v0_val;
00097 if( v0_i > bound() && (v0_i < minEle.scalar || ( v0_i == minEle.scalar && globalOffset + i < minEle.index ) ) )
00098 minEle = ScalarIndex<Scalar>(v0_i,globalOffset+i);
00099 }
00100 }
00101 this->setRawVal(minEle,reduct_obj);
00102 }
00104 };
00105
00106 }
00107
00108 #endif // RTOPPACK_ROP_MIN_INDEX_GREATER_THAN_BOUND_HPP