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 TEUCHOS_MPI_REDUCTION_OP_SETTER_HPP
00030 #define TEUCHOS_MPI_REDUCTION_OP_SETTER_HPP
00031
00032 #include "Teuchos_RCP.hpp"
00033 #include "Teuchos_ReductionOp.hpp"
00034 #include "mpi.h"
00035
00036 namespace Teuchos {
00037
00046 class MpiReductionOpBase : virtual public Describable {
00047 public:
00049 virtual void reduce(
00050 void *invec
00051 ,void *inoutvec
00052 ,int *len
00053 ,MPI_Datatype *datatype
00054 ) const = 0;
00055 };
00056
00060 template<typename Ordinal>
00061 class MpiReductionOp : public MpiReductionOpBase {
00062 public:
00064 MpiReductionOp( const RCP<const ValueTypeReductionOp<Ordinal,char> > &reductOp );
00066 void reduce(
00067 void *invec
00068 ,void *inoutvec
00069 ,int *len
00070 ,MPI_Datatype *datatype
00071 ) const;
00072 private:
00073 RCP<const ValueTypeReductionOp<Ordinal,char> > reductOp_;
00074
00075 MpiReductionOp();
00076 MpiReductionOp(const MpiReductionOp&);
00077 MpiReductionOp& operator=(const MpiReductionOp&);
00078 };
00079
00083 template<typename Ordinal>
00084 RCP<const MpiReductionOp<Ordinal> >
00085 mpiReductionOp( const RCP<const ValueTypeReductionOp<Ordinal,char> > &reductOp );
00086
00109 class MpiReductionOpSetter {
00110 public:
00111
00124 MpiReductionOpSetter( const Teuchos::RCP<const MpiReductionOpBase>& reduct_op );
00125
00127 ~MpiReductionOpSetter();
00128
00136 MPI_Op mpi_op() const;
00137
00138 private:
00139
00140 MpiReductionOpSetter();
00141 MpiReductionOpSetter(const MpiReductionOpSetter&);
00142 MpiReductionOpSetter& operator=(const MpiReductionOpSetter&);
00143 };
00144
00145
00146
00147
00148 template<typename Ordinal>
00149 MpiReductionOp<Ordinal>::MpiReductionOp(
00150 const RCP<const ValueTypeReductionOp<Ordinal,char> > &reductOp
00151 )
00152 :reductOp_(reductOp)
00153 {}
00154
00155 template<typename Ordinal>
00156 void MpiReductionOp<Ordinal>::reduce(
00157 void *invec
00158 ,void *inoutvec
00159 ,int *len
00160 ,MPI_Datatype *datatype
00161 ) const
00162 {
00163 #ifdef TEUCHOS_DEBUG
00164 TEST_FOR_EXCEPT(!invec);
00165 TEST_FOR_EXCEPT(!inoutvec);
00166 TEST_FOR_EXCEPT(!len);
00167 TEST_FOR_EXCEPT(!(*len>0));
00168 TEST_FOR_EXCEPT(!datatype);
00169
00170
00171 #endif
00172 reductOp_->reduce(
00173 *len,reinterpret_cast<char*>(invec),reinterpret_cast<char*>(inoutvec)
00174 );
00175 }
00176
00177 template<typename Ordinal>
00178 RCP<const MpiReductionOp<Ordinal> >
00179 mpiReductionOp( const RCP<const ValueTypeReductionOp<Ordinal,char> > &reductOp )
00180 {
00181 return rcp(new MpiReductionOp<Ordinal>(reductOp));
00182 }
00183
00184 }
00185
00186 #endif // TEUCHOS_MPI_REDUCTION_OP_SETTER_HPP