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
00030 #ifndef RTOPPACK_ROP_MAX_INDEX_HPP
00031 #define RTOPPACK_ROP_MAX_INDEX_HPP
00032
00033 #include "RTOpPack_RTOpTHelpers.hpp"
00034
00035 namespace RTOpPack {
00036
00042 template<class Scalar>
00043 class ROpMaxIndex : public ROpScalarIndexReductionBase<Scalar> {
00044 public:
00046 ROpMaxIndex()
00047 :RTOpT<Scalar>("ROpMaxIndex")
00048 ,ROpScalarIndexReductionBase<Scalar>(-Teuchos::ScalarTraits<Scalar>::rmax(),-1)
00049 {}
00051 ScalarIndex<Scalar> operator()(const ReductTarget& reduct_obj ) const { return this->getRawVal(reduct_obj); }
00054
00055 bool coord_invariant() const { return false; }
00057 void reduce_reduct_objs(
00058 const ReductTarget& in_reduct_obj, ReductTarget* inout_reduct_obj
00059 ) const
00060 {
00061 const ScalarIndex<Scalar> in = this->getRawVal(in_reduct_obj);
00062 const ScalarIndex<Scalar> inout = this->getRawVal(*inout_reduct_obj);
00063 if( in.scalar > inout.scalar || (in.scalar == inout.scalar && in.index < inout.index) )
00064 this->setRawVal(in,inout_reduct_obj);
00065 }
00067 void apply_op(
00068 const int num_vecs, const ConstSubVectorView<Scalar> sub_vecs[]
00069 ,const int num_targ_vecs, const SubVectorView<Scalar> targ_sub_vecs[]
00070 ,ReductTarget *reduct_obj
00071 ) const
00072 {
00073 RTOP_APPLY_OP_1_0(num_vecs,sub_vecs,num_targ_vecs,targ_sub_vecs);
00074 ScalarIndex<Scalar> maxEle = this->getRawVal(*reduct_obj);
00075 if( v0_s == 1 ) {
00076 for( Teuchos_Index i = 0; 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( Teuchos_Index i = 0; 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