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_TOP_RANDOMIZE_HPP
00031 #define RTOPPACK_TOP_RANDOMIZE_HPP
00032
00033 #include "RTOpPack_RTOpTHelpers.hpp"
00034
00035 namespace RTOpPack {
00036
00048 template<class Scalar>
00049 class TOpRandomize : public ROpScalarScalarTransformationBase<Scalar> {
00050 public:
00052 static void set_static_seed( const unsigned int static_seed ) { static_seed_ = static_seed; }
00054 static unsigned int get_static_seed() { return static_seed_; }
00056 TOpRandomize(
00057 const Scalar& l = -Teuchos::ScalarTraits<Scalar>::one()
00058 ,const Scalar& u = +Teuchos::ScalarTraits<Scalar>::one()
00059 )
00060 :RTOpT<Scalar>("TOpRandomize"), ROpScalarScalarTransformationBase<Scalar>(l,u)
00061 {
00062 seed_ = static_seed_;
00063 ++static_seed_;
00064 }
00066 void set_bounds( const Scalar& l, const Scalar& u ) { this->scalarData1(l); this->scalarData2(u); }
00068 void set_seed( const unsigned int seed ) { seed_ = seed; }
00070 unsigned int get_seed() const { return seed_; }
00074 void apply_op(
00075 const int num_vecs, const ConstSubVectorView<Scalar> sub_vecs[]
00076 ,const int num_targ_vecs, const SubVectorView<Scalar> targ_sub_vecs[]
00077 ,ReductTarget *reduct_obj
00078 ) const
00079 {
00080 const Scalar l = this->scalarData1(), u = this->scalarData2();
00081 const Scalar a = Scalar(0.5)*(u-l), b = Scalar(0.5)*(u+l) ;
00082 RTOP_APPLY_OP_0_1(num_vecs,sub_vecs,num_targ_vecs,targ_sub_vecs);
00083 for( Teuchos_Index i = 0; i < subDim; ++i, z0_val += z0_s ) {
00084 Teuchos::ScalarTraits<Scalar>::seedrandom(seed_+globalOffset+i);
00085 *z0_val = a * Teuchos::ScalarTraits<Scalar>::random() + b;
00086 }
00087 }
00089 private:
00090 static unsigned int static_seed_;
00091 unsigned int seed_;
00092 };
00093
00094 template<class Scalar>
00095 unsigned int TOpRandomize<Scalar>::static_seed_ = 0;
00096
00097 }
00098
00099 #endif // RTOPPACK_TOP_RANDOMIZE_HPP