PlayaSerialVector.cpp

00001 /* @HEADER@ */
00002 //
00003  /* @HEADER@ */
00004 
00005 #include "PlayaVectorDecl.hpp"
00006 #include "PlayaSerialVector.hpp"
00007 #include "PlayaSerialVectorSpace.hpp"
00008 #include "Teuchos_Assert.hpp"
00009 
00010 #ifndef HAVE_TEUCHOS_EXPLICIT_INSTANTIATION
00011 #include "PlayaVectorImpl.hpp"
00012 #include "PlayaLinearOperatorImpl.hpp"
00013 #endif
00014 
00015 using namespace Teuchos;
00016 using namespace Playa;
00017 
00018 SerialVector::SerialVector(const VectorSpace<double>& vs)
00019   : SingleChunkVector<double>(),
00020     vecSpace_(vs),
00021     data_(vs.dim()),
00022     dim_(vs.dim())
00023 {
00024   const SerialVectorSpace* rvs 
00025     = dynamic_cast<const SerialVectorSpace*>(vs.ptr().get());
00026   TEUCHOS_TEST_FOR_EXCEPTION(rvs==0, std::runtime_error,
00027     "could not cast vector space to SerialVectorSpace in "
00028     "SerialVector ctor");
00029 }
00030 
00031 
00032 void SerialVector::setElement(int index, const double& value)
00033 {
00034   data_[index] = value;
00035 }
00036 
00037 void SerialVector::addToElement(int index, const double& value)
00038 {
00039   data_[index] += value;
00040 }
00041 
00042 void SerialVector::setElements(int numElems, const int* globalIndices,
00043   const double* values)
00044 {
00045   for (int i=0; i<numElems; i++)
00046   {
00047     data_[globalIndices[i]] = values[i];
00048   }
00049 }
00050 
00051 void SerialVector::addToElements(int numElems, const int* globalIndices,
00052   const double* values)
00053 {
00054   for (int i=0; i<numElems; i++)
00055   {
00056     data_[globalIndices[i]] += values[i];
00057   }
00058 }
00059 
00060 const SerialVector* SerialVector::getConcrete(const Vector<double>& x)
00061 {
00062   const SerialVector* rtn = dynamic_cast<const SerialVector*>(x.ptr().get());
00063   TEUCHOS_TEST_FOR_EXCEPT(rtn==0);
00064   return rtn;
00065 }
00066 
00067 SerialVector* SerialVector::getConcrete(Vector<double>& x)
00068 {
00069   SerialVector* rtn = dynamic_cast<SerialVector*>(x.ptr().get());
00070   TEUCHOS_TEST_FOR_EXCEPT(rtn==0);
00071   return rtn;
00072 }
00073 
00074 void SerialVector::finalizeAssembly()
00075 {
00076   // no-op
00077 }
00078 
00079 void SerialVector::getElements(const int* globalIndices, int numElems,
00080   Array<double>& elems) const
00081 {
00082   elems.resize(numElems);
00083   for (int i=0; i<numElems; i++)
00084   {
00085     elems[i] = (*this)[globalIndices[i]];
00086   }
00087 }
00088 
00089 std::string SerialVector::description() const 
00090 {
00091   std::ostringstream oss;
00092   oss << "SerialVector[dim=" << dim_ << "]" ;
00093   return oss.str();
00094 }
00095 

doxygen