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_NORMINF_HPP
00031 #define RTOPPACK_ROP_NORMINF_HPP
00032
00033 #include "RTOpPack_RTOpTHelpers.hpp"
00034
00035 namespace RTOpPack {
00036
00039 template<class Scalar>
00040 class ROpNormInf
00041 : public ROpScalarReductionBase<Scalar,typename Teuchos::ScalarTraits<Scalar>::magnitudeType>
00042 {
00043 public:
00045 typedef typename Teuchos::ScalarTraits<Scalar>::magnitudeType ScalarMag;
00047 ROpNormInf() : RTOpT<Scalar>("ROpNormInf") {}
00049 ScalarMag operator()(const ReductTarget& reduct_obj ) const
00050 { return this->getRawVal(reduct_obj); }
00054 void reduce_reduct_objs(
00055 const ReductTarget& _in_reduct_obj, ReductTarget* _inout_reduct_obj
00056 ) const
00057 {
00058 using Teuchos::dyn_cast;
00059 const ReductTargetScalar<ScalarMag>
00060 &in_reduct_obj = dyn_cast<const ReductTargetScalar<ScalarMag> >(_in_reduct_obj);
00061 ReductTargetScalar<ScalarMag>
00062 &inout_reduct_obj = dyn_cast<ReductTargetScalar<ScalarMag> >(*_inout_reduct_obj);
00063 if( in_reduct_obj.get() > inout_reduct_obj.get() ) inout_reduct_obj.set(in_reduct_obj.get());
00064 }
00066 void apply_op(
00067 const int num_vecs, const ConstSubVectorView<Scalar> sub_vecs[]
00068 ,const int num_targ_vecs, const SubVectorView<Scalar> targ_sub_vecs[]
00069 ,ReductTarget *_reduct_obj
00070 ) const
00071 {
00072 using Teuchos::dyn_cast;
00073 ReductTargetScalar<ScalarMag>
00074 &reduct_obj = dyn_cast<ReductTargetScalar<ScalarMag> >(*_reduct_obj);
00075 RTOP_APPLY_OP_1_0(num_vecs,sub_vecs,num_targ_vecs,targ_sub_vecs);
00076 ScalarMag norm_inf = reduct_obj.get();
00077 if( v0_s == 1 ) {
00078 for( Teuchos_Index i = 0; i < subDim; ++i ) {
00079 const ScalarMag
00080 mag = Teuchos::ScalarTraits<Scalar>::magnitude(*v0_val++);
00081 norm_inf = mag > norm_inf ? mag : norm_inf;
00082 }
00083 }
00084 else {
00085 for( Teuchos_Index i = 0; i < subDim; ++i, v0_val += v0_s ) {
00086 const ScalarMag
00087 mag = Teuchos::ScalarTraits<Scalar>::magnitude(*v0_val);
00088 norm_inf = mag > norm_inf ? mag : norm_inf;
00089 }
00090 }
00091 reduct_obj.set(norm_inf);
00092 }
00094 };
00095
00096 }
00097
00098 #endif // RTOPPACK_ROP_NORMINF_HPP