43#include "PanzerDofMgr_config.hpp"
45#ifdef PANZER_HAVE_EPETRA
51Teuchos::RCP<Epetra_IntVector>
57 std::vector<panzer::GlobalOrdinal> indices;
58 std::vector<std::string> blocks;
60 ugi.getOwnedAndGhostedIndices(indices);
61 ugi.getElementBlockIds(blocks);
63 std::vector<int> fieldNumbers(indices.size(),-1);
65 const Teuchos::RCP<const Teuchos::MpiComm<int> > mpiComm = Teuchos::rcp_dynamic_cast<const Teuchos::MpiComm<int> >(ugi.getComm());
66 Teuchos::RCP<Epetra_MpiComm> comm;
67 if (mpiComm != Teuchos::null)
68 comm = Teuchos::rcp(
new Epetra_MpiComm(*mpiComm->getRawMpiComm()));
70 Teuchos::RCP<Map> ghostedMap
71 = Teuchos::rcp(
new Map(-1,
static_cast<int>(indices.size()), Teuchos::arrayViewFromVector(indices).getRawPtr(),
72 1, Teuchos::OrdinalTraits<int>::zero(), *comm));
75 for(std::size_t blk=0;blk<blocks.size();blk++) {
76 std::string blockId = blocks[blk];
78 const std::vector<panzer::LocalOrdinal> & elements = ugi.getElementBlock(blockId);
79 const std::vector<int> & fields = ugi.getBlockFieldNumbers(blockId);
82 std::vector<panzer::GlobalOrdinal> gids(fields.size());
83 for(std::size_t e=0;e<elements.size();e++) {
84 ugi.getElementGIDs(elements[e],gids);
86 for(std::size_t f=0;f<fields.size();f++) {
87 int fieldNum = fields[f];
88 panzer::GlobalOrdinal gid = gids[f];
89 std::size_t lid = ghostedMap->LID(gid);
91 fieldNumbers[lid] = fieldNum;
97 std::vector<panzer::GlobalOrdinal> reducedIndices;
98 std::vector<int> reducedFieldNumbers;
99 for(std::size_t i=0;i<fieldNumbers.size();i++) {
100 if(fieldNumbers[i]>-1) {
101 reducedIndices.push_back(indices[i]);
102 reducedFieldNumbers.push_back(fieldNumbers[i]);
106 Teuchos::RCP<Map> reducedMap
107 = Teuchos::rcp(
new Map(-1,
static_cast<int>(reducedIndices.size()), Teuchos::arrayViewFromVector(reducedIndices).getRawPtr(),
108 1, Teuchos::OrdinalTraits<int>::zero(), *comm));
109 return Teuchos::rcp(
new IntVector(Copy,*reducedMap,Teuchos::arrayViewFromVector(reducedFieldNumbers).getRawPtr()));
113 std::vector<int> & fieldNumbers,
114 const Teuchos::RCP<const Epetra_IntVector> & reducedVec)
120 fieldNumbers.resize(dest->MyLength());
121 Teuchos::ArrayView<int> av = Teuchos::arrayViewFromVector(fieldNumbers);
122 dest->ExtractCopy(av.getRawPtr());
125Teuchos::RCP<const Epetra_IntVector>
127 const Teuchos::RCP<const Epetra_IntVector> & reducedVec)
137 Teuchos::RCP<Map> destMap;
139 std::vector<panzer::GlobalOrdinal> indices;
140 ugi.getOwnedAndGhostedIndices(indices);
142 const Teuchos::RCP<const Teuchos::MpiComm<int> > mpiComm = Teuchos::rcp_dynamic_cast<const Teuchos::MpiComm<int> >(ugi.getComm());
143 Teuchos::RCP<Epetra_MpiComm> comm;
144 if (mpiComm != Teuchos::null)
145 comm = Teuchos::rcp(
new Epetra_MpiComm(*mpiComm->getRawMpiComm()));
147 destMap = Teuchos::rcp(
new Map(-1,
static_cast<int>(indices.size()), Teuchos::arrayViewFromVector(indices).getRawPtr(),
148 1, Teuchos::OrdinalTraits<int>::zero(), *comm));
151 Teuchos::RCP<const IntVector> source = reducedVec;
152 if(source==Teuchos::null)
154 Teuchos::RCP<const Map> sourceMap = Teuchos::rcpFromRef(source->Map());
160 Teuchos::RCP<IntVector> dest = Teuchos::rcp(
new IntVector(*destMap));
161 Importer importer(*destMap,*sourceMap);
163 dest->Import(*source,importer,Insert);
176void ArrayToFieldVectorEpetra::buildFieldVector(
const Epetra_IntVector & source)
const
179 std::vector<panzer::GlobalOrdinal> indices;
180 ugi_->getOwnedIndices(indices);
182 const Teuchos::RCP<const Teuchos::MpiComm<int> > mpiComm = Teuchos::rcp_dynamic_cast<const Teuchos::MpiComm<int> >(ugi_->getComm(),
true);
183 Teuchos::RCP<Epetra_MpiComm> comm;
184 if (mpiComm != Teuchos::null)
185 comm = Teuchos::rcp(
new Epetra_MpiComm(*mpiComm->getRawMpiComm()));
187 Teuchos::RCP<Map> destMap
188 = Teuchos::rcp(
new Map(-1,
static_cast<int>(indices.size()),
189 Teuchos::arrayViewFromVector(indices).getRawPtr(),
191 1, Teuchos::OrdinalTraits<int>::zero(), *comm));
193 Teuchos::RCP<IntVector> localFieldVector = Teuchos::rcp(
new IntVector(*destMap));
196 localFieldVector->Import(source,importer,Insert);
198 fieldVector_ = localFieldVector;
201Teuchos::RCP<const Epetra_Map>
202ArrayToFieldVectorEpetra::getFieldMap(
const std::string & fieldName)
const
207Teuchos::RCP<const Epetra_Map>
208ArrayToFieldVectorEpetra::getFieldMap(
int fieldNum)
const
210 if(fieldMaps_[fieldNum]==Teuchos::null) {
212 if(fieldVector_==Teuchos::null)
213 buildFieldVector(*gh_fieldVector_);
218 return Teuchos::rcp_dynamic_cast<const Epetra_Map>(fieldMaps_[fieldNum]);
221Teuchos::RCP<const Epetra_BlockMap>
224 Teuchos::RCP<const Epetra_BlockMap> origMap = Teuchos::rcpFromRef(fieldTVector.
Map());
225 std::vector<int> fieldVector(fieldTVector.
MyLength());
226 Teuchos::ArrayView<int> av = Teuchos::arrayViewFromVector(fieldVector);
229 std::vector<int> mapVector;
230 for(std::size_t i=0;i<fieldVector.size();i++) {
231 if(fieldVector[i]==fieldNum)
232 mapVector.push_back(origMap->GID(i));
235 Teuchos::RCP<Epetra_BlockMap> finalMap
236 = Teuchos::rcp(
new Epetra_BlockMap(-1,
static_cast<int>(mapVector.size()), Teuchos::arrayViewFromVector(mapVector).getRawPtr(), 1, Teuchos::OrdinalTraits<int>::zero(), origMap->Comm()));
const Epetra_BlockMap & Map() const
int ExtractCopy(int *V) const
ArrayToFieldVectorEpetra()
Maps for each field (as needed)
Teuchos::RCP< const Tpetra::Map< int, panzer::GlobalOrdinal, panzer::TpetraNodeType > > getFieldMap(int fieldNum, const Tpetra::Vector< int, int, panzer::GlobalOrdinal, panzer::TpetraNodeType > &fieldTVector)
Teuchos::RCP< const Epetra_IntVector > buildGhostedFieldVectorEpetra(const GlobalIndexer &ugi, const Teuchos::RCP< const Epetra_IntVector > &reducedVec=Teuchos::null)
Teuchos::RCP< const Epetra_BlockMap > getFieldMapEpetra(int fieldNum, const Epetra_IntVector &fieldVector)
Teuchos::RCP< Epetra_IntVector > buildGhostedFieldReducedVectorEpetra(const GlobalIndexer &ugi)