00001
00002
00003
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 {
00023
00024 template <class Scalar>
00025 class OperatorBuilder
00026 {
00027 public:
00028
00029 OperatorBuilder(int nLocal, const VectorType<Scalar>& vecType);
00030
00031 OperatorBuilder(int nLocalDomain, int nLocalRange,
00032 const VectorType<Scalar>& vecType);
00033
00034 OperatorBuilder(const VectorSpace<Scalar>& domain,
00035 const VectorSpace<Scalar>& range,
00036 const VectorType<Scalar>& vecType);
00037
00038 virtual ~OperatorBuilder(){;}
00039
00040
00041 const VectorType<Scalar>& vecType() const {return vecType_;}
00042
00043
00044 const VectorSpace<Scalar>& domain() const {return domain_;}
00045
00046
00047 const VectorSpace<Scalar>& range() const {return range_;}
00048
00049
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