PlayaVectorDecl.hpp

00001 /* @HEADER@ */
00002 //   
00003  /* @HEADER@ */
00004 
00005 #ifndef PLAYA_VECTORDECL_HPP
00006 #define PLAYA_VECTORDECL_HPP
00007 
00008 #include "PlayaDefs.hpp"
00009 #include "PlayaHandle.hpp"
00010 #include "PlayaVectorBaseDecl.hpp"
00011 #include "PlayaVectorSpaceDecl.hpp"
00012 #include "PlayaVectorFunctorsDecl.hpp"
00013 #include "Teuchos_TimeMonitor.hpp"
00014 
00015 namespace Playa
00016 {
00017 
00018 template <class Scalar, int> class LCN;
00019   
00062 template <class Scalar>
00063 class Vector : public Playa::Handle<VectorBase<Scalar> >
00064 {
00065 public:
00068   HANDLE_CTORS(Vector<Scalar>, VectorBase<Scalar>);
00069 
00071   template <int N>
00072   Vector<Scalar>(const LCN<Scalar, N>& x);
00073 
00074 
00076   Vector<Scalar>& operator=(const LCN<Scalar, 1>& x);
00077 
00079   Vector<Scalar>& operator=(const LCN<Scalar, 2>& x);
00080 
00082   Vector<Scalar>& operator=(const LCN<Scalar, 3>& x);
00083 
00085   template <int N>
00086   Vector<Scalar>& operator=(const LCN<Scalar, N>& x);
00087 
00089 
00093   Vector<Scalar>& operator+=(const Vector<Scalar>& other);
00094 
00096   Vector<Scalar>& operator+=(const LCN<Scalar, 1>& x);
00097 
00099   Vector<Scalar>& operator+=(const LCN<Scalar, 2>& x);
00100 
00102   template <int N>
00103   Vector<Scalar>& operator+=(const LCN<Scalar, N>& x);
00104 
00106   Vector<Scalar>& operator-=(const Vector<Scalar>& other);
00107 
00109   Vector<Scalar>& operator-=(const LCN<Scalar, 1>& x);
00110 
00112   Vector<Scalar>& operator-=(const LCN<Scalar, 2>& x);
00113 
00115   template <int N>
00116   Vector<Scalar>& operator-=(const LCN<Scalar, N>& x);
00117 
00119   Vector<Scalar>& operator*=(const Scalar& a);
00120 
00122   Vector<Scalar>& operator/=(const Scalar& a);
00124 
00128   VectorSpace<Scalar> space() const 
00129     {return this->ptr()->space();}
00130 
00132   const MPIComm& comm() const 
00133     {return this->space().comm();}
00134 
00136   int dim() const
00137     {
00138       return this->ptr()->space()->dim();
00139     }
00141       
00142 
00146   int numBlocks() const ;
00147 
00149   void setBlock(int i, const Vector<Scalar>& v);
00150       
00152   const Vector<Scalar>& getBlock(int i) const;
00153       
00155   Vector<Scalar> getNonConstBlock(int i) ;
00156       
00158   const Vector<Scalar>& getBlock(const BlockIterator<Scalar>& b) const;
00159       
00161   Vector<Scalar> getNonConstBlock(const BlockIterator<Scalar>& b);
00163 
00164 
00165 
00169   ConstDataChunk<Scalar> nextConstChunk() const ;
00170     
00172   NonConstDataChunk<Scalar> nextChunk() ;
00173 
00175   bool hasMoreChunks() const ;
00176 
00179   void rewind() const ;
00181 
00191   const Scalar& operator[](int localIndex) const ;
00192     
00200   Scalar& operator[](int localIndex);
00201 
00207   const Scalar& operator()(const BlockIterator<Scalar>& b,
00208     int localIndexWithinBlock) const ;
00209     
00215   Scalar& operator()(const BlockIterator<Scalar>& b,
00216     int localIndexWithinBlock) ;
00218 
00222   std::string description() const ;
00223 
00225   void print(std::ostream& os) const ;    
00227 
00228 
00236   Vector<Scalar>& scale(const Scalar& alpha);
00237 
00242   Vector<Scalar>& update(const Scalar& alpha, const Vector<Scalar>& x, 
00243     const Scalar& gamma=1.0);
00248   Vector<Scalar>& update(const Scalar& alpha, const Vector<Scalar>& x, 
00249     const Scalar& beta, const Vector<Scalar>& y, 
00250     const Scalar& gamma);
00255   Vector<Scalar>& update(const Scalar& alpha, const Vector<Scalar>& x, 
00256     const Scalar& beta, const Vector<Scalar>& y, 
00257     const Scalar& gamma, const Vector<Scalar>& z, 
00258     const Scalar& delta);
00259 
00266   Vector<Scalar>& acceptCopyOf(const Vector<Scalar>& x);
00267 
00271   Vector<Scalar> copy() const ;
00272 
00276   Vector<Scalar>& selfDotStar(const Vector<Scalar>& other) ;
00277 
00281   Vector<Scalar>& selfDotSlash(const Vector<Scalar>& other) ;
00282 
00286   Vector<Scalar> dotStar(const Vector<Scalar>& other) const ;
00287 
00291   Vector<Scalar> dotSlash(const Vector<Scalar>& other) const ;
00292 
00296   Vector<Scalar> reciprocal() const ;
00297 
00298 
00302   Vector<Scalar> abs() const ;
00303 
00307   Vector<Scalar>& selfReciprocal() ;
00308 
00312   Vector<Scalar>& selfAbs() ;
00313 
00317   Vector<Scalar>& randomize() ;
00318 
00322   void setToConstant(const Scalar& alpha) ;
00323 
00324       
00328   Scalar dot(const Vector<Scalar>& other) const ;
00329 
00333   Scalar operator*(const Vector<Scalar>& other) const ;
00334 
00338   Scalar norm1() const ;
00339 
00343   Scalar norm2() const ;
00344 
00348   Scalar norm2(const Vector<Scalar>& weights) const ;    
00349 
00350 
00354   Scalar normInf() const ;
00355 
00359   void zero();
00360 
00361 
00363   Scalar max() const;
00364 
00366   Scalar min()const;
00367 
00368 
00370 
00371 
00372 
00373 
00375   static RCP<Time>& opTimer()
00376     {
00377       static RCP<Time> rtn 
00378         = TimeMonitor::getNewTimer("Low-level vector operations");
00379       return rtn;
00380     }
00381 
00384 
00386   template <class UF> 
00387   Vector<Scalar>& applyUnaryFunctor(const UF& functor);
00388 
00391   template <class UF> 
00392   Vector<Scalar>& acceptUnaryFunctor(const UF& functor,
00393     const Vector<Scalar>& other);
00394 
00398   template <class VF> 
00399   Vector<Scalar>& applyBinaryFunctor(const VF& functor,
00400     const Vector<Scalar>& other);
00401 
00405   template <class VF> 
00406   Vector<Scalar>& applyTernaryFunctor(const VF& functor,
00407     const Vector<Scalar>& x, const Vector<Scalar>& y);
00408 
00410   template <class RF> 
00411   typename PlayaFunctors::VectorFunctorTraits<Scalar, RF>::ReturnType 
00412   applyUnaryReductionFunctor(
00413     const RF& functor)
00414     const ;
00415 
00417   template <class RF> 
00418   typename PlayaFunctors::VectorFunctorTraits<Scalar, RF>::ReturnType 
00419   applyBinaryReductionFunctor(const RF& functor, const Vector<Scalar>& other)
00420     const ;
00421     
00422 
00423     
00425     
00426 protected:
00427 
00429   const Vector<Scalar>& getBlock(const std::deque<int>& iter) const ;
00430 
00432   Vector<Scalar> getNonConstBlock(const std::deque<int>& iter) ;
00433   
00434 
00435 private:
00436 
00437 };
00438 
00439 
00440 template <class Scalar> class LoadableVector;
00443 template <class Scalar>
00444 LoadableVector<Scalar>* loadable(Vector<Scalar> vec) ;
00445 
00446 
00450 template <class Scalar>
00451 Scalar* dataPtr(Vector<Scalar> vec) ;
00452 
00456 template <class Scalar>
00457 const Scalar* dataPtr(const Vector<Scalar>& vec) ;
00458 
00459 
00460 }
00461 
00462 template <class Scalar> inline
00463 std::ostream& operator<<(std::ostream& os, const Playa::Vector<Scalar>& x) 
00464 {
00465   x.print(os);
00466   return os;
00467 }
00468 
00469 
00470 
00471 
00472 #endif

doxygen