PlayaVectorDecl.hpp
00001
00002
00003
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