PlayaEpetraVector.cpp

00001 /* @HEADER@ */
00002 //
00003  /* @HEADER@ */
00004 
00005 #include "PlayaEpetraVector.hpp"
00006 #include "PlayaEpetraVectorSpace.hpp"
00007 #include "Teuchos_Assert.hpp"
00008 
00009 #ifndef HAVE_TEUCHOS_EXPLICIT_INSTANTIATION
00010 #include "PlayaVectorImpl.hpp"
00011 #include "PlayaLinearOperatorImpl.hpp"
00012 #endif
00013 
00014 using Teuchos::RCP;
00015 using namespace Playa;
00016 
00017 EpetraVector::EpetraVector(const VectorSpace<double>& vs)
00018   : SingleChunkVector<double>(), 
00019     vecSpace_(vs),
00020     epetraVec_(), 
00021     numLocalElements_(vs.numLocalElements())
00022 {
00023   const EpetraVectorSpace* epvs 
00024     = dynamic_cast<const EpetraVectorSpace*>(vs.ptr().get());
00025   TEUCHOS_TEST_FOR_EXCEPTION(epvs==0, std::runtime_error,
00026     "could not cast vector space to EpetraVectorSpace in "
00027     "EpetraVector ctor");
00028 
00029   epetraVec_ = rcp(new Epetra_Vector(*(epvs->epetraMap())));
00030 }
00031 
00032 
00033 
00034 EpetraVector
00035 ::EpetraVector(const VectorSpace<double>& vs,
00036   const RCP<Epetra_Vector>& vec)
00037   : SingleChunkVector<double>(), 
00038     vecSpace_(vs), 
00039     epetraVec_(vec), 
00040     numLocalElements_(vs.numLocalElements())
00041 {
00042   const EpetraVectorSpace* epvs 
00043     = dynamic_cast<const EpetraVectorSpace*>(vs.ptr().get());
00044   TEUCHOS_TEST_FOR_EXCEPTION(epvs==0, std::runtime_error,
00045     "could not cast vector space to EpetraVectorSpace in "
00046     "EpetraVector ctor");
00047 }
00048 
00049 
00050 
00051 
00052 
00053 double& EpetraVector::operator[](int globalIndex) 
00054 {
00055   const Epetra_BlockMap& myMap = epetraVec()->Map();
00056   return (*epetraVec())[myMap.LID(globalIndex)];
00057 }
00058 
00059 void EpetraVector::setElement(int index, const double& value)
00060 {
00061   int loc_index[1] = { index };
00062   epetraVec()->ReplaceGlobalValues(1, const_cast<double*>(&value), 
00063     loc_index);
00064 }
00065 
00066 void EpetraVector::addToElement(int index, const double& value)
00067 {
00068 //  cout << "adding (" << index << ", " << value << ")" << std::endl;
00069   int loc_index[1] = { index };
00070   epetraVec()->SumIntoGlobalValues(1, const_cast<double*>(&value), 
00071     loc_index);
00072 }
00073 
00074 const double& EpetraVector::getElement(int index) const 
00075 {
00076   const Epetra_BlockMap& myMap = epetraVec()->Map();
00077   return (*epetraVec())[myMap.LID(index)];
00078 }
00079 
00080 void EpetraVector::getElements(const int* globalIndices, int numElems,
00081   Teuchos::Array<double>& elems) const
00082 {
00083   elems.resize(numElems);
00084   const Epetra_BlockMap& myMap = epetraVec()->Map();
00085   RCP<const Epetra_Vector> epv = epetraVec();
00086 
00087   for (int i=0; i<numElems; i++)
00088   {
00089     elems[i] = (*epv)[myMap.LID(globalIndices[i])];
00090   }
00091 }
00092 
00093 void EpetraVector::setElements(int numElems, const int* globalIndices,
00094   const double* values)
00095 {
00096   Epetra_FEVector* vec = dynamic_cast<Epetra_FEVector*>(epetraVec().get());
00097   int ierr = vec->ReplaceGlobalValues(numElems, globalIndices, values);
00098   TEUCHOS_TEST_FOR_EXCEPTION(ierr < 0, std::runtime_error, "ReplaceGlobalValues returned "
00099     "ierr=" << ierr << " in EpetraVector::setElements()");
00100 }
00101 
00102 void EpetraVector::addToElements(int numElems, const int* globalIndices,
00103   const double* values)
00104 {
00105   Epetra_FEVector* vec = dynamic_cast<Epetra_FEVector*>(epetraVec().get());
00106   int ierr = vec->SumIntoGlobalValues(numElems, globalIndices, values);
00107   TEUCHOS_TEST_FOR_EXCEPTION(ierr < 0, std::runtime_error, "SumIntoGlobalValues returned "
00108     "ierr=" << ierr << " in EpetraVector::addToElements()");
00109 }
00110 
00111 void EpetraVector::finalizeAssembly()
00112 {
00113   Epetra_FEVector* vec = dynamic_cast<Epetra_FEVector*>(epetraVec().get());
00114   vec->GlobalAssemble();
00115 }
00116 
00117 
00118 void EpetraVector::print(std::ostream& os) const 
00119 {
00120   epetraVec()->Print(os);
00121 }
00122 
00123 
00124 const Epetra_Vector& EpetraVector::getConcrete(const Playa::Vector<double>& tsfVec)
00125 {
00126   const EpetraVector* epv 
00127     = dynamic_cast<const EpetraVector*>(tsfVec.ptr().get());
00128   TEUCHOS_TEST_FOR_EXCEPTION(epv==0, std::runtime_error,
00129     "EpetraVector::getConcrete called on a vector that "
00130     "could not be cast to an EpetraVector");
00131   return *(epv->epetraVec());
00132 }
00133 
00134 Epetra_Vector& EpetraVector::getConcrete(Playa::Vector<double>& tsfVec)
00135 {
00136   EpetraVector* epv 
00137     = dynamic_cast<EpetraVector*>(tsfVec.ptr().get());
00138   TEUCHOS_TEST_FOR_EXCEPTION(epv==0, std::runtime_error,
00139     "EpetraVector::getConcrete called on a vector that "
00140     "could not be cast to an EpetraVector");
00141   return *(epv->epetraVec());
00142 }
00143 
00144 
00145 Epetra_Vector* EpetraVector::getConcretePtr(Playa::Vector<double>& tsfVec)
00146 {
00147   EpetraVector* epv 
00148     = dynamic_cast<EpetraVector*>(tsfVec.ptr().get());
00149   TEUCHOS_TEST_FOR_EXCEPTION(epv==0, std::runtime_error,
00150     "EpetraVector::getConcrete called on a vector that "
00151     "could not be cast to an EpetraVector");
00152   return epv->epetraVec().get();
00153 }
00154 
00155 
00156 void EpetraVector::update(const double& alpha, 
00157   const VectorBase<double>* other, const double& gamma)
00158 {
00159   const EpetraVector* epv 
00160     = dynamic_cast<const EpetraVector*>(other);
00161   epetraVec_->Update(alpha, *(epv->epetraVec_), gamma);
00162 }
00163 
00164 
00165 
00166 void EpetraVector::update(
00167   const double& alpha, const VectorBase<double>* x,
00168   const double& beta, const VectorBase<double>* y,
00169   const double& gamma)
00170 {
00171   const EpetraVector* epx 
00172     = dynamic_cast<const EpetraVector*>(x);
00173   const EpetraVector* epy
00174     = dynamic_cast<const EpetraVector*>(y);
00175 
00176   epetraVec_->Update(alpha, *(epx->epetraVec_), 
00177     beta, *(epy->epetraVec_), gamma);
00178 }
00179 
00180 
00181 double EpetraVector::dot(const VectorBase<double>* other) const 
00182 {
00183   double rtn = 0.0;
00184   const EpetraVector* epv 
00185     = dynamic_cast<const EpetraVector*>(other);
00186   epetraVec_->Dot(*(epv->epetraVec_), &rtn);
00187 
00188   return rtn;
00189 }
00190 
00191 double EpetraVector::norm2() const 
00192 {
00193   double rtn = 0.0;
00194   epetraVec_->Norm2(&rtn);
00195 
00196   return rtn;
00197 }

doxygen