42 #ifndef PANZER_UNIQUEGLOBALINDEXER_EPETRAUTILITIES_IMPL_HPP 43 #define PANZER_UNIQUEGLOBALINDEXER_EPETRAUTILITIES_IMPL_HPP 48 #include "Teuchos_FancyOStream.hpp" 49 #include "Teuchos_ArrayView.hpp" 50 #include "Teuchos_CommHelpers.hpp" 52 #include "Epetra_Map.h" 53 #include "Epetra_IntVector.h" 54 #include "Epetra_MultiVector.h" 55 #include "Epetra_Import.h" 56 #include "Epetra_MpiComm.h" 66 template <
typename ScalarT,
typename ArrayT>
73 TEUCHOS_TEST_FOR_EXCEPTION(!ugi.
fieldInBlock(fieldName,blockId),std::runtime_error,
74 "panzer::updateGhostedDataReducedVector: field name = \""+fieldName+
"\" is not in element block = \"" +blockId +
"\"!");
76 Teuchos::RCP<const Map> dataMap = Teuchos::rcpFromRef(dataVector.
Map());
79 const std::vector<panzer::LocalOrdinal> & elements = ugi.
getElementBlock(blockId);
82 TEUCHOS_TEST_FOR_EXCEPTION(data.extent(0)!=elements.size(),std::runtime_error,
83 "panzer::updateGhostedDataReducedVector: data cell dimension does not match up with block cell count");
85 int rank = data.rank();
89 std::vector<panzer::GlobalOrdinal> gids;
90 for(std::size_t e=0;e<elements.size();e++) {
93 for(std::size_t f=0;f<fieldOffsets.size();f++) {
94 std::size_t localIndex = dataMap->LID(gids[fieldOffsets[f]]);
100 std::size_t entries = data.extent(2);
102 TEUCHOS_TEST_FOR_EXCEPTION(dataVector.
NumVectors()!=
static_cast<int>(entries),std::runtime_error,
103 "panzer::updateGhostedDataReducedVector: number of columns in data vector inconsistent with data array");
106 std::vector<panzer::GlobalOrdinal> gids;
107 for(std::size_t e=0;e<elements.size();e++) {
110 for(std::size_t f=0;f<fieldOffsets.size();f++) {
111 std::size_t localIndex = dataMap->LID(gids[fieldOffsets[f]]);
112 for(std::size_t v=0;v<entries;v++)
118 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::runtime_error,
119 "panzer::updateGhostedDataReducedVector: data array rank must be 2 or 3");
122 template <
typename ScalarT,
typename ArrayT>
123 Teuchos::RCP<Epetra_MultiVector>
125 const std::map<std::string,ArrayT> & data)
const 127 TEUCHOS_ASSERT(data.size()>0);
129 int fieldNum =
ugi_->getFieldNum(fieldName);
130 std::vector<std::string> blockIds;
131 ugi_->getElementBlockIds(blockIds);
134 int rank = data.begin()->second.rank();
139 numCols = data.begin()->second.extent(2);
141 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::runtime_error,
142 "ArrayToFieldVectorEpetra::getGhostedDataVector: data array must have rank 2 or 3. This array has rank " << rank <<
".");
156 Teuchos::RCP<MultiVector> finalReducedVec
157 = Teuchos::rcp(
new MultiVector(*reducedMap,numCols));
158 for(std::size_t b=0;b<blockIds.size();b++) {
159 std::string block = blockIds[b];
162 if(!
ugi_->fieldInBlock(fieldName,block))
166 typename std::map<std::string,ArrayT>::const_iterator blockItr = data.find(block);
167 TEUCHOS_TEST_FOR_EXCEPTION(blockItr==data.end(),std::runtime_error,
168 "ArrayToFieldVectorEpetra::getDataVector: can not find block \""+block+
"\".");
170 const ArrayT & d = blockItr->second;
171 updateGhostedDataReducedVectorEpetra<ScalarT,ArrayT>(fieldName,block,*
ugi_,d,*finalReducedVec);
183 Teuchos::RCP<MultiVector> finalVec
188 finalVec->Import(*finalReducedVec,importer,
Insert);
193 template <
typename ScalarT,
typename ArrayT>
194 Teuchos::RCP<Epetra_MultiVector>
196 const std::map<std::string,ArrayT> & data)
const 202 Teuchos::RCP<const MultiVector> sourceVec
203 = getGhostedDataVector<ScalarT,ArrayT>(fieldName,data);
206 int fieldNum =
ugi_->getFieldNum(fieldName);
207 Teuchos::RCP<const Map> destMap =
fieldMaps_[fieldNum];
213 Teuchos::RCP<MultiVector> destVec
214 = Teuchos::rcp(
new MultiVector(*destMap,sourceVec->NumVectors()));
218 destVec->Import(*sourceVec,importer,
Insert);
std::map< int, Teuchos::RCP< const Map > > fieldMaps_
(unghosted) field vector (as needed)
const Epetra_BlockMap & Map() const
int ReplaceMyValue(int MyRow, int VectorIndex, double ScalarValue)
Teuchos::RCP< Epetra_MultiVector > getGhostedDataVector(const std::string &fieldName, const std::map< std::string, ArrayT > &data) const
Teuchos::RCP< const IntVector > fieldVector_
Maps for each field (as needed)
virtual const std::vector< panzer::LocalOrdinal > & getElementBlock(const std::string &blockId) const =0
Epetra_MultiVector MultiVector
std::map< int, Teuchos::RCP< const Map > > gh_fieldMaps_
Maps for each field (as needed)
Teuchos::RCP< const IntVector > gh_fieldVector_
ghosted reduced field vector
void buildFieldVector(const Epetra_IntVector &source) const
build unghosted field vector from ghosted field vector
virtual bool fieldInBlock(const std::string &field, const std::string &block) const =0
Teuchos::RCP< const IntVector > gh_reducedFieldVector_
Teuchos::RCP< Epetra_MultiVector > getDataVector(const std::string &fieldName, const std::map< std::string, ArrayT > &data) const
virtual int getFieldNum(const std::string &str) const =0
Get the number used for access to this field.
Teuchos::RCP< const GlobalIndexer > ugi_
DOF mapping.
virtual const std::vector< int > & getGIDFieldOffsets(const std::string &blockId, int fieldNum) const =0
Use the field pattern so that you can find a particular field in the GIDs array.
virtual void getElementGIDs(panzer::LocalOrdinal localElmtId, std::vector< panzer::GlobalOrdinal > &gids, const std::string &blockIdHint="") const =0
Get the global IDs for a particular element. This function overwrites the gids variable.
std::map< int, Teuchos::RCP< const Map > > gh_reducedFieldMaps_
ghosted field vector
Teuchos::RCP< const Epetra_BlockMap > getFieldMapEpetra(int fieldNum, const Epetra_IntVector &fieldVector)
void updateGhostedDataReducedVectorEpetra(const std::string &fieldName, const std::string blockId, const GlobalIndexer &ugi, const ArrayT &data, Epetra_MultiVector &dataVector)