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>
 
   74                       "panzer::updateGhostedDataReducedVector: field name = \""+fieldName+
"\" is not in element block = \"" +blockId +
"\"!");
 
   79    const std::vector<panzer::LocalOrdinal> & elements = ugi.
getElementBlock(blockId);
 
   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]]); 
 
   95             dataVector.ReplaceMyValue(localIndex,0,data(e,f));
 
  100       std::size_t entries = data.extent(2);
 
  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++)
 
  113                dataVector.ReplaceMyValue(localIndex,v,data(e,f,v));
 
  119                       "panzer::updateGhostedDataReducedVector: data array rank must be 2 or 3");
 
  122 template <
typename ScalarT,
typename ArrayT>
 
  125                                                const std::map<std::string,ArrayT> & data)
 const 
  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);
 
  142                           "ArrayToFieldVectorEpetra::getGhostedDataVector: data array must have rank 2 or 3. This array has rank " << rank << 
".");
 
  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);
 
  168                         "ArrayToFieldVectorEpetra::getDataVector: can not find block \""+block+
"\".");
 
  170      const ArrayT & d = blockItr->second;
 
  171      updateGhostedDataReducedVectorEpetra<ScalarT,ArrayT>(fieldName,block,*
ugi_,d,*finalReducedVec);
 
  188    finalVec->Import(*finalReducedVec,importer,
Insert);
 
  193 template <
typename ScalarT,
typename ArrayT>
 
  196                                         const std::map<std::string,ArrayT> & data)
 const 
  203          = getGhostedDataVector<ScalarT,ArrayT>(fieldName,data);
 
  206    int fieldNum = 
ugi_->getFieldNum(fieldName);
 
  218    destVec->Import(*sourceVec,importer,
Insert);
 
std::map< int, Teuchos::RCP< const Map > > fieldMaps_
(unghosted) field vector (as needed) 
 
Teuchos::RCP< Epetra_MultiVector > getDataVector(const std::string &fieldName, const std::map< std::string, ArrayT > &data) const 
 
Teuchos::RCP< const IntVector > fieldVector_
Maps for each field (as needed) 
 
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
 
virtual const std::vector< panzer::LocalOrdinal > & getElementBlock(const std::string &blockId) const =0
 
void buildFieldVector(const Epetra_IntVector &source) const 
build unghosted field vector from ghosted field vector 
 
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 
 
virtual bool fieldInBlock(const std::string &field, const std::string &block) const =0
 
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
 
Teuchos::RCP< const IntVector > gh_reducedFieldVector_
 
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. 
 
Teuchos::RCP< Epetra_MultiVector > getGhostedDataVector(const std::string &fieldName, const std::map< std::string, ArrayT > &data) const 
 
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 
 
#define TEUCHOS_ASSERT(assertion_test)
 
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)