00001 #ifndef __RVL_MPI_SERLAP
00002 #define __RVL_MPI_SERLAP
00003
00004 #include "locallinalg.hh"
00005 #include "mpiserialfo.hh"
00006
00007 namespace RVL {
00008
00009 template<typename Scalar>
00010 class MPISerialLAP: public LinearAlgebraPackage<Scalar> {
00011
00012 private:
00013
00014 mutable RVLAssignConst<Scalar> this_zero;
00015 mutable RVLL2innerProd<Scalar> this_ser_inner;
00016 mutable RVLLinCombObject<Scalar> this_lco;
00017
00018 int root;
00019 #ifdef IWAVE_USE_MPI
00020 MPI_Comm comm;
00021 #endif
00022
00023 mutable MPISerialFunctionObjectRedn<Scalar,Scalar> this_mpi_inner;
00024
00025 public:
00026
00027 MPISerialLAP(Scalar ipscale = ScalarFieldTraits<Scalar>::One(),
00028 int _root = 0
00029 #ifdef IWAVE_USE_MPI
00030 , MPI_Comm _comm=MPI_COMM_WORLD
00031 #endif
00032 )
00033 : this_zero(ScalarFieldTraits<Scalar>::Zero()),
00034 this_ser_inner(abs(ipscale)), this_lco(),
00035 root(_root),
00036 #ifdef IWAVE_USE_MPI
00037 comm(_comm),
00038 #endif
00039 this_mpi_inner(this_ser_inner,root
00040 #ifdef IWAVE_USE_MPI
00041 , comm
00042 #endif
00043 ) {}
00044 MPISerialLAP(const MPISerialLAP<Scalar> & p)
00045 : this_zero(ScalarFieldTraits<Scalar>::Zero()),
00046 this_ser_inner(p.this_ser_inner.getScale()),this_lco(),
00047 root(p.root),
00048 #ifdef IWAVE_USE_MPI
00049 comm(p.comm),
00050 #endif
00051 this_mpi_inner(this_ser_inner,root
00052 #ifdef IWAVE_USE_MPI
00053 , comm
00054 #endif
00055 ) {}
00056 ~MPISerialLAP() {}
00057
00058 FunctionObjectScalarRedn<Scalar> & inner() const {
00059 return this_mpi_inner;
00060 }
00061 FunctionObject & zero() const {
00062 return this_zero;
00063 }
00064 LinCombObject<Scalar> & linComb() const {
00065 return this_lco;
00066 }
00067
00068 virtual bool compare(LinearAlgebraPackage<Scalar> const & lap) const {
00069 MPISerialLAP<Scalar> const * tmp = NULL;
00070 if ((tmp=dynamic_cast<MPISerialLAP<Scalar> const *>(&lap))) return true;
00071 return false;
00072 }
00073
00075 void setScale(Scalar newscale) { this_ser_inner.setScale(newscale); }
00076
00077 ostream & write(ostream & str) const {
00078 str<<"MPISerialLAP\n";
00079 return str;
00080 }
00081 };
00082
00083 }
00084
00085 #endif
00086
00087