00001 /* @HEADER@ */ 00002 // 00003 /* @HEADER@ */ 00004 00005 #include "PlayaEpetraVectorSpace.hpp" 00006 #include "PlayaEpetraVector.hpp" 00007 #include "Teuchos_Utils.hpp" 00008 #include "Teuchos_DefaultSerialComm.hpp" 00009 #include "PlayaOut.hpp" 00010 #include "Epetra_SerialComm.h" 00011 #include "Epetra_Comm.h" 00012 #ifdef HAVE_MPI 00013 #include "Epetra_MpiComm.h" 00014 #include "Teuchos_DefaultMpiComm.hpp" 00015 #endif 00016 00017 00018 #ifndef HAVE_TEUCHOS_EXPLICIT_INSTANTIATION 00019 #include "PlayaVectorSpaceImpl.hpp" 00020 #endif 00021 00022 00023 00024 00025 using Teuchos::RCP; 00026 00027 namespace Playa 00028 { 00029 00030 EpetraVectorSpace::EpetraVectorSpace(const RCP<const Epetra_Map>& m) 00031 : epetraMap_(m), 00032 comm_(epetraCommToTeuchosMPIComm(m->Comm())), 00033 globalDim_(m->NumGlobalElements()), 00034 baseGlobalNaturalIndex_(m->MinMyGID()), 00035 numLocalElements_(m->NumMyElements()) 00036 {} 00037 00038 MPIComm EpetraVectorSpace::epetraCommToTeuchosMPIComm( 00039 const Epetra_Comm& epComm) 00040 { 00041 #ifdef HAVE_MPI 00042 const Epetra_MpiComm* c1 = dynamic_cast<const Epetra_MpiComm*>(&epComm); 00043 if (c1) return MPIComm(c1->Comm()); 00044 #endif 00045 return MPIComm::self(); 00046 } 00047 00048 bool EpetraVectorSpace::isCompatible(const VectorSpaceBase<double>* other) const 00049 { 00050 const EpetraVectorSpace* evs = dynamic_cast<const EpetraVectorSpace*>(other); 00051 if (evs == 0) return false; 00052 return epetraMap_->SameAs(*(evs->epetraMap_)); 00053 } 00054 00055 // Overridden from VectorSpace 00056 00057 Teuchos::RCP<VectorBase<double> > 00058 EpetraVectorSpace::createMember(const VectorSpace<double>& self) const 00059 { 00060 TEUCHOS_TEST_FOR_EXCEPTION(self.ptr().get() != this, 00061 InternalError, 00062 "inconsistency between space and self-reference in EpetraVectorSpace::createMember()"); 00063 return rcp(new EpetraVector(self)); 00064 } 00065 00066 string EpetraVectorSpace::description() const 00067 { 00068 std::string rtn = "EpetraVS[d=" + Teuchos::toString(dim()); 00069 if (numLocalElements() != dim()) rtn += ", local=" 00070 + Teuchos::toString(numLocalElements()); 00071 rtn += "]"; 00072 return rtn; 00073 } 00074 00075 } 00076 00077 00078