/*********************************************************************/ /* File: basevector.cpp */ /* Author: Joachim Schoeberl */ /* Date: 7. Feb. 2003 */ /*********************************************************************/ /* base class in vector hierarchy */ #include namespace ngla { using namespace ngla; /* BaseVector :: BaseVector () throw() { ; } BaseVector :: ~BaseVector () throw() { ; } */ BaseVector & BaseVector :: operator= (const BaseVector & v) { Set (1.0, v); return *this; } BaseVector & BaseVector :: operator= (double s) { SetScalar (s); return *this; } BaseVector & BaseVector :: operator= (Complex s) { SetScalar (s); return *this; } BaseVector & BaseVector :: Scale (double scal) { FVDouble() *= scal; return *this; } BaseVector & BaseVector :: Scale (Complex scal) { FVComplex() *= scal; return *this; } BaseVector & BaseVector :: SetScalar (double scal) { FVDouble() = scal; return *this; } BaseVector & BaseVector :: SetScalar (Complex scal) { FVComplex() = scal; return *this; } BaseVector & BaseVector :: Set (double scal, const BaseVector & v) { FVDouble() = scal * v.FVDouble(); return *this; } BaseVector & BaseVector :: Set (Complex scal, const BaseVector & v) { FVComplex() = scal * v.FVComplex(); return *this; } BaseVector & BaseVector :: Add (double scal, const BaseVector & v) { FVDouble() += scal * v.FVDouble(); return *this; } BaseVector & BaseVector :: Add (Complex scal, const BaseVector & v) { FVComplex() += scal * v.FVComplex(); return *this; } TempVector BaseVector :: Range (int begin, int end) { throw Exception ("BaseVector::Range called"); } TempVector BaseVector ::Range (int begin, int end) const { throw Exception ("BaseVector::Range const called"); } ostream & BaseVector :: Print (ostream & ost) const { throw Exception ("BaseVector::Print called"); } void BaseVector :: Save(ostream & ost) const { FlatVector fv = FVDouble(); for (int i = 0; i < fv.Size(); i++) SaveBin (ost, fv(i)); } void BaseVector :: Load(istream & ist) { FlatVector fv = FVDouble(); for (int i = 0; i < fv.Size(); i++) LoadBin (ist, fv(i)); } void BaseVector :: MemoryUsage (ARRAY & mu) const { ; } BaseVector * BaseVector :: CreateVector () const { cout << "Create vec called for base class" << endl; return 0; } void BaseVector :: SetRandom () { FlatVector fv = FVDouble(); for (int i = 0; i < fv.Size(); i++) fv(i) = double (rand()) / RAND_MAX; } void BaseVector :: GetIndirect (const ARRAY & ind, FlatVector & v) const { FlatVector fv = FVDouble(); int es = EntrySize(); int ii = 0; for (int i = 0; i < ind.Size(); i++) if (ind[i] != -1) { int base = es * ind[i]; for (int j = 0; j < es; j++) v[ii++] = fv[base++]; } else { for (int j = 0; j < es; j++) v[ii++] = 0; } } void BaseVector :: GetIndirect (const ARRAY & ind, FlatVector & v) const { FlatVector fv = FVComplex(); int es = EntrySize() / 2; int ii = 0; for (int i = 0; i < ind.Size(); i++) if (ind[i] != -1) { int base = es * ind[i]; for (int j = 0; j < es; j++) v[ii++] = fv[base++]; } else { for (int j = 0; j < es; j++) v[ii++] = 0; } } void BaseVector :: SetIndirect (const ARRAY & ind, const FlatVector & v) { FlatVector fv = FVDouble(); int es = EntrySize(); int ii = 0; for (int i = 0; i < ind.Size(); i++) if (ind[i] != -1) { int base = es * ind[i]; for (int j = 0; j < es; j++) fv[base++] = v[ii++]; } else ii += es; } void BaseVector :: SetIndirect (const ARRAY & ind, const FlatVector & v) { FlatVector fv = FVComplex(); int es = EntrySize() / 2; int ii = 0; for (int i = 0; i < ind.Size(); i++) if (ind[i] != -1) { int base = es * ind[i]; for (int j = 0; j < es; j++) fv[base++] = v[ii++]; } else ii += es; } void BaseVector :: AddIndirect (const ARRAY & ind, const FlatVector & v) { FlatVector fv = FVDouble(); int es = EntrySize(); int ii = 0; for (int i = 0; i < ind.Size(); i++) if (ind[i] != -1) { int base = es * ind[i]; for (int j = 0; j < es; j++) fv[base++] += v[ii++]; } else ii += es; } void BaseVector :: AddIndirect (const ARRAY & ind, const FlatVector & v) { FlatVector fv = FVComplex(); int es = EntrySize() / 2; int ii = 0; for (int i = 0; i < ind.Size(); i++) if (ind[i] != -1) { int base = es * ind[i]; for (int j = 0; j < es; j++) fv[base++] += v[ii++]; } else ii += es; } /** Decision between double or Complex */ /* template S_BaseVector :: S_BaseVector () throw() { ; } template S_BaseVector :: ~S_BaseVector () throw() { ; } */ template S_BaseVector & S_BaseVector :: operator= (double s) { SetScalar (s); return *this; } /* template SCAL S_BaseVector :: InnerProduct (const BaseVector & v2) const { throw Exception ("Inner Product called for S_BaseVector"); } */ template FlatVector S_BaseVector :: FVDouble () const throw() { return FlatVector (size * entrysize, Memory()); /* FlatVector fv = FVScal(); return FlatVector (fv.Size() * sizeof(SCAL)/sizeof(double), reinterpret_cast (&fv(0))); */ } template FlatVector S_BaseVector :: FVComplex () const throw() { throw Exception ("FVComplex called for real vector"); } /* S_BaseVector :: S_BaseVector () throw() { ; } S_BaseVector :: ~S_BaseVector () throw() { ; } */ /* Complex S_BaseVector :: InnerProduct (const BaseVector & v2) const { throw Exception ("Inner Product called for S_BaseVector"); } */ FlatVector S_BaseVector :: FVDouble () const throw() { FlatVector fv = FVScal(); return FlatVector (fv.Size() * sizeof(Complex)/sizeof(double), reinterpret_cast (&fv(0))); } FlatVector S_BaseVector :: FVComplex () const throw() { FlatVector fv = FVScal(); return FlatVector (fv.Size() * sizeof(Complex)/sizeof(Complex), reinterpret_cast (&fv(0))); } template class S_BaseVector; //SZ template class S_BaseVector; }