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_MAX_INDEX_HPP
00030 #define RTOPPACK_ROP_MAX_INDEX_HPP
00031
00032 #include "RTOpPack_RTOpTHelpers.hpp"
00033
00034 namespace RTOpPack {
00035
00041 template<class Scalar>
00042 class ROpMaxIndex : public ROpScalarIndexReductionBase<Scalar> {
00043 public:
00045 ROpMaxIndex()
00046 :RTOpT<Scalar>("ROpMaxIndex")
00047 ,ROpScalarIndexReductionBase<Scalar>(-Teuchos::ScalarTraits<Scalar>::rmax(),-1)
00048 {}
00050 ScalarIndex<Scalar> operator()(const ReductTarget& reduct_obj ) const { return this->getRawVal(reduct_obj); }
00053
00054 bool coord_invariant() const { return false; }
00056 void reduce_reduct_objs(
00057 const ReductTarget& in_reduct_obj, ReductTarget* inout_reduct_obj
00058 ) const
00059 {
00060 const ScalarIndex<Scalar> in = this->getRawVal(in_reduct_obj);
00061 const ScalarIndex<Scalar> inout = this->getRawVal(*inout_reduct_obj);
00062 if( in.scalar > inout.scalar || (in.scalar == inout.scalar && in.index < inout.index) )
00063 this->setRawVal(in,inout_reduct_obj);
00064 }
00066 void apply_op(
00067 const int num_vecs, const SubVectorT<Scalar> sub_vecs[]
00068 ,const int num_targ_vecs, const MutableSubVectorT<Scalar> targ_sub_vecs[]
00069 ,ReductTarget *reduct_obj
00070 ) const
00071 {
00072 RTOP_APPLY_OP_1_0(num_vecs,sub_vecs,num_targ_vecs,targ_sub_vecs);
00073 const Index globalOffset = sub_vecs[0].globalOffset();
00074 ScalarIndex<Scalar> maxEle = this->getRawVal(*reduct_obj);
00075 if( v0_s == 1 ) {
00076 for( RTOp_index_type i = 1; i <= subDim; ++i ) {
00077 const Scalar &v0_i = *v0_val++;
00078 if( v0_i > maxEle.scalar || ( v0_i == maxEle.scalar && globalOffset + i < maxEle.index ) )
00079 maxEle = ScalarIndex<Scalar>(v0_i,globalOffset+i);
00080 }
00081 }
00082 else {
00083 for( RTOp_index_type i = 1; i <= subDim; ++i, v0_val += v0_s ) {
00084 const Scalar &v0_i = *v0_val;
00085 if( v0_i > maxEle.scalar || ( v0_i == maxEle.scalar && globalOffset + i < maxEle.index ) )
00086 maxEle = ScalarIndex<Scalar>(v0_i,globalOffset+i);
00087 }
00088 }
00089 this->setRawVal(maxEle,reduct_obj);
00090 }
00092 };
00093
00094 }
00095
00096 #endif // RTOPPACK_ROP_MAX_INDEX_HPP