PlayaOperatorBuilder.hpp

00001 /* @HEADER@ */
00002 //   
00003  /* @HEADER@ */
00004 
00005 
00006 #ifndef PLAYA_OPERATORBUILDER_HPP
00007 #define PLAYA_OPERATORBUILDER_HPP
00008 
00009 #include "PlayaLinearOperatorDecl.hpp"
00010 #include "PlayaLinearCombinationDecl.hpp"
00011 #include "PlayaVectorType.hpp"
00012 #include "PlayaVectorSpaceDecl.hpp"
00013 #include "Teuchos_Array.hpp"
00014 #include "Teuchos_GlobalMPISession.hpp"
00015 
00016 
00017 using namespace Playa;
00018 using namespace Teuchos;
00019 
00020 
00021 namespace Playa
00022 {
00024   template <class Scalar>
00025   class OperatorBuilder
00026   {
00027   public:
00029     OperatorBuilder(int nLocal, const VectorType<Scalar>& vecType);
00031     OperatorBuilder(int nLocalDomain, int nLocalRange,
00032                     const VectorType<Scalar>& vecType);
00034     OperatorBuilder(const VectorSpace<Scalar>& domain,
00035                     const VectorSpace<Scalar>& range,
00036                     const VectorType<Scalar>& vecType);
00038     virtual ~OperatorBuilder(){;}
00039 
00041     const VectorType<Scalar>& vecType() const {return vecType_;}
00042 
00044     const VectorSpace<Scalar>& domain() const {return domain_;}
00045 
00047     const VectorSpace<Scalar>& range() const {return range_;}
00048 
00050     virtual LinearOperator<Scalar> getOp() const = 0 ; 
00051 
00052   protected:
00053 
00054   private:
00055     VectorType<Scalar> vecType_;
00056 
00057     VectorSpace<Scalar> domain_;
00058 
00059     VectorSpace<Scalar> range_;
00060   };
00061 
00062   template <class Scalar> 
00063   inline OperatorBuilder<Scalar>
00064   ::OperatorBuilder(int nLocalRows, const VectorType<Scalar>& vecType)
00065     : vecType_(vecType), domain_(), range_()
00066   {
00067     range_ = vecType_.createEvenlyPartitionedSpace(MPIComm::world(), nLocalRows);
00068     domain_ = range_;
00069   }
00070 
00071   template <class Scalar> 
00072   inline OperatorBuilder<Scalar>
00073   ::OperatorBuilder(int nLocalDomain, int nLocalRange,
00074                     const VectorType<Scalar>& vecType)
00075     : vecType_(vecType), domain_(), range_()
00076   {
00077     range_ = vecType_.createEvenlyPartitionedSpace(MPIComm::world(), nLocalRange);
00078     domain_ = vecType_.createEvenlyPartitionedSpace(MPIComm::world(), nLocalDomain);
00079   }
00080 
00081   
00082 
00083   template <class Scalar> 
00084   inline OperatorBuilder<Scalar>
00085   ::OperatorBuilder(const VectorSpace<Scalar>& domain,
00086                     const VectorSpace<Scalar>& range,
00087                     const VectorType<Scalar>& vecType)
00088     : vecType_(vecType), domain_(domain), range_(range)
00089   {}
00090 
00091 }
00092 
00093 #endif

doxygen