Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #include "PlayaEpetraVectorType.hpp"
00044 #include "PlayaEpetraVectorSpace.hpp"
00045 #include "PlayaEpetraGhostImporter.hpp"
00046 #include "PlayaEpetraMatrixFactory.hpp"
00047 #include "Epetra_Map.h"
00048 #include "Epetra_Import.h"
00049 #include "Epetra_Comm.h"
00050 #include "PlayaOut.hpp"
00051
00052 #ifdef HAVE_MPI
00053 #include "Epetra_MpiComm.h"
00054 #else
00055 #include "Epetra_SerialComm.h"
00056 #endif
00057
00058 #include "Teuchos_RefCountPtr.hpp"
00059 #include "PlayaEpetraMatrix.hpp"
00060
00061 using namespace Playa;
00062 using namespace Teuchos;
00063
00064 EpetraVectorType::EpetraVectorType()
00065 {;}
00066
00067
00068 RCP<const VectorSpaceBase<double> >
00069 EpetraVectorType::createSpace(int ,
00070 int nLocal,
00071 const int* localIndices,
00072 const MPIComm& comm) const
00073 {
00074 #ifdef HAVE_MPI
00075 Epetra_MpiComm epComm(comm.getComm());
00076 #else
00077 Epetra_SerialComm epComm;
00078 #endif
00079
00080 TEUCHOS_TEST_FOR_EXCEPTION(nLocal < 0, std::runtime_error, "negative vector size n=" << nLocal);
00081
00082 RCP<Epetra_Map> map = rcp(new Epetra_Map(-1, nLocal,
00083 (int*) localIndices,
00084 0, epComm));
00085
00086 return rcp(new EpetraVectorSpace(map));
00087 }
00088
00089 RCP<GhostImporter<double> >
00090 EpetraVectorType::createGhostImporter(const VectorSpace<double>& space,
00091 int nGhost,
00092 const int* ghostIndices) const
00093 {
00094 const EpetraVectorSpace* p
00095 = dynamic_cast<const EpetraVectorSpace*>(space.ptr().get());
00096
00097 TEUCHOS_TEST_FOR_EXCEPTION(p==0, std::runtime_error,
00098 "non-epetra vector space [" << space.description() << "] given as "
00099 "argument to EpetraVectorType::createGhostImporter()");
00100
00101 return rcp(new EpetraGhostImporter(p->epetraMap(), nGhost, ghostIndices));
00102
00103 }
00104
00105 RCP<MatrixFactory<double> >
00106 EpetraVectorType::createMatrixFactory(const VectorSpace<double>& domain,
00107 const VectorSpace<double>& range) const
00108 {
00109 RCP<const EpetraVectorSpace> pd
00110 = rcp_dynamic_cast<const EpetraVectorSpace>(domain.ptr());
00111
00112 RCP<const EpetraVectorSpace> pr
00113 = rcp_dynamic_cast<const EpetraVectorSpace>(range.ptr());
00114
00115
00116 TEUCHOS_TEST_FOR_EXCEPTION(pd.get()==0, std::runtime_error,
00117 "incompatible domain space given to "
00118 "EpetraVectorType::createMatrix()");
00119
00120 TEUCHOS_TEST_FOR_EXCEPTION(pr.get()==0, std::runtime_error,
00121 "incompatible range space given to "
00122 "EpetraVectorType::createMatrix()");
00123
00124
00125
00126 return rcp(new EpetraMatrixFactory(pd, pr));
00127 }
00128
00129
00130
00131
00132
00133