00001
00002
00003
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
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 }