template class VVector; template class VFlatVector; /* ****************** T Vector ******************** */ /** The T_Vector specifies the type of the vector element */ template class T_Vector : public S_BaseVector::TSCAL> { public: typedef T TELEM; typedef typename mat_traits::TSCAL TSCAL; T_Vector (); virtual ~T_Vector(); virtual FlatVector FV () const = 0; virtual FlatVector FV () = 0; FlatVector FV (const BaseVector & v2) const { return dynamic_cast (v2).FV(); } FlatVector FV (BaseVector & v2) { return dynamic_cast (v2).FV(); } virtual int Size() const { return FV().Size(); } virtual TempVector Range (int begin, int end) { return TempVector (new VFlatVector (end-begin, &FV()[0]+begin)); } virtual TempVector Range (int begin, int end) const { return TempVector (new VFlatVector (end-begin, &FV()[0]+begin)); } T_Vector & operator= (const T_Vector & v) { FV() = v.FV(); return *this; } template T_Vector & operator= (const Expr & v) { FV() = v; return *this; } T_Vector & operator= (TSCAL s) { FV() = s; return *this; } T_Vector & operator= (const BaseVector & m) { FV() = FV(m); return *this; } template T_Vector & operator= (const VVecExpr & v) { v.AssignTo (1.0, *this); return *this; } T_Vector & operator+= (const T_Vector & v) { FV() += FV(v); return *this; } template T_Vector & operator+= (const VVecExpr & v) { v.AddTo (1.0, *this); return *this; } template T_Vector & operator+= (const Expr & v) { FV() += v; return *this; } T_Vector & operator+= (const BaseVector & v) { FV() += FV(v); return *this; } T_Vector & operator-= (const T_Vector & v) { FV() -= FV(v); return *this; } template T_Vector & operator-= (const VVecExpr & v) { v.AddTo (-1.0, *this); return *this; } template T_Vector & operator-= (const Expr & v) { FV() -= v; return *this; } T_Vector & operator-= (const BaseVector & v) { FV() -= FV(v); return *this; } T_Vector & operator*= (TSCAL scal) { FV() *= scal; return *this; } /* T_Vector & Assign (const BaseVector & v) { s = v.Size(); data = static_cast (const_cast (v.Data())); return *this; } virtual const void * Data() const { return data; } virtual void * Data() { return data; } virtual int Size() const { return s; } virtual int ElementSize() const { return sizeof(T); } */ virtual BaseVector & SetScalar (TSCAL s) { FV() = s; return *this; } virtual TSCAL InnerProduct (const BaseVector & v2) const { return ngbla::InnerProduct (FV(), FV(v2)); } virtual double L2Norm () const { return ngbla::L2Norm (FV()); } virtual BaseVector & Scale (TSCAL scal) { FV() *= scal; return *this; } virtual BaseVector & Set (TSCAL s, const BaseVector & v) { FV() = s * FV(v); return *this; } virtual BaseVector & Add (TSCAL s, const BaseVector & v) { FV() += s * FV(v); return *this; } virtual BaseVector * CreateVector () const { return new VVector (Size()); } void GetIndirect (const ARRAY & ind, FlatVector & v) const { for (int i = 0; i < ind.Size(); i++) if (ind[i] != -1) static_cast (v.Data())[i] = FV()(ind[i]); else static_cast (v.Data())[i] = 0; } virtual void SetIndirect (const ARRAY & ind, const FlatVector & v) { for (int i = 0; i < ind.Size(); i++) if (ind[i] != -1) FV()(ind[i]) = static_cast (v.Data())[i]; else FV()(ind[i]) = 0; } virtual void AddIndirect (const ARRAY & ind, const FlatVector & v) { for (int i = 0; i < ind.Size(); i++) if (ind[i] != -1) FV()(ind[i]) += static_cast (v.Data())[i]; } virtual void SetRandom () { FlatVector fv = FV(); for (int i = 0; i < Size(); i++) fv(i) = double (rand()) / RAND_MAX; } virtual ostream & Print (ostream & ost) const { // return (ost << RefMatExpr > (*this) << endl); return (ost << FV() << endl); } virtual void Save(ostream & ost) const; virtual void MemoryUsage (ARRAY & mu) const { mu.Append (new MemoryUsageStruct ("Vector: ", Size()*sizeof(T), 1)); } };