43 #ifndef __Panzer_DOFManagerFEI_decl_hpp__
44 #define __Panzer_DOFManagerFEI_decl_hpp__
46 #include "PanzerDofMgr_config.hpp"
48 #ifdef PANZER_HAVE_FEI
53 #include "fei_base.hpp"
54 #include "fei_Factory.hpp"
69 #include <unordered_set>
73 template <
typename LocalOrdinalT,
typename GlobalOrdinalT>
74 class DOFManagerFEI :
public UniqueGlobalIndexer<LocalOrdinalT,GlobalOrdinalT> {
76 typedef GlobalOrdinalT GlobalOrdinal;
77 typedef LocalOrdinalT LocalOrdinal;
78 typedef std::map<int,std::string>::const_iterator const_field_iterator;
80 virtual ~DOFManagerFEI() {}
88 DOFManagerFEI(
const Teuchos::RCP<ConnManager<LocalOrdinalT,GlobalOrdinalT> > & connMngr,MPI_Comm mpiComm);
101 void setConnManager(
const Teuchos::RCP<ConnManager<LocalOrdinalT,GlobalOrdinalT> > & connMngr,MPI_Comm mpiComm);
106 {
return communicator_; }
112 {
return geomPattern_; }
149 void setFieldOrder(
const std::vector<int> & fieldOrder);
159 void setFieldOrder(
const std::vector<std::string> & fieldOrder);
163 void getFieldOrder(std::vector<int> & fieldOrder)
const;
167 void getFieldOrder(std::vector<std::string> & fieldOrder)
const;
213 int getFieldNum(
const std::string & str)
const;
224 const std::string & getFieldString(
int num)
const
225 {
return intToFieldStr_.find(num)->second; }
234 int getNumFields()
const;
239 {
return connMngr_; }
242 {
return getConnManager(); }
250 virtual void buildGlobalUnknowns();
274 virtual void buildUnknownsOrientation();
279 void printFieldInformation(std::ostream & os)
const;
286 virtual void getElementBlockIds(std::vector<std::string> & elementBlockIds)
const
287 { getConnManager()->getElementBlockIds(elementBlockIds); }
291 virtual const std::vector<int> & getBlockFieldNumbers(
const std::string & block)
const
292 {
return fieldAggPattern_.find(block)->second->fieldIds(); }
296 virtual bool fieldInBlock(
const std::string &
field,
const std::string & block)
const
297 {
return fieldStringToPattern_.find(std::make_pair(block,field))->second != Teuchos::null; }
306 virtual const std::vector<LocalOrdinal> & getElementBlock(
const std::string & blockId)
const
307 {
return getConnManager()->getElementBlock(blockId); }
312 void getElementGIDs(LocalOrdinalT localElmtId,std::vector<GlobalOrdinalT> & gids,
const std::string & blockIdHint=
"")
const;
316 virtual void getElementOrientation(LocalOrdinalT localElmtId,std::vector<double> & gidsOrientation)
const;
321 const std::vector<int> & getGIDFieldOffsets(
const std::string & blockId,
int fieldNum)
const
322 {
return fieldAggPattern_.find(blockId)->second->localOffsets(fieldNum); }
338 const std::pair<std::vector<int>,std::vector<int> > &
339 getGIDFieldOffsets_closure(
const std::string & blockId,
int fieldNum,
int subcellDim,
int subcellId)
const
340 {
return fieldAggPattern_.find(blockId)->second->localOffsets_closure(fieldNum,subcellDim,subcellId); }
348 const_field_iterator beginFieldIter()
const
349 {
return intToFieldStr_.begin(); }
355 const_field_iterator endFieldIter()
const
356 {
return intToFieldStr_.end(); }
360 virtual void getOwnedIndices(std::vector<GlobalOrdinalT> & indices)
const;
365 virtual void getOwnedAndSharedIndices(std::vector<GlobalOrdinalT> & indices)
const;
369 virtual void ownedIndices(
const std::vector<GlobalOrdinalT> & indices,std::vector<bool> & isOwned)
const;
373 const std::set<int> & getFields(
const std::string & blockId)
const
374 {
return blockToField_.find(blockId)->second; }
384 bool validFieldOrder(
const std::vector<std::string> & fieldOrder_ut,
const std::set<std::string> & fields)
const;
389 void registerFields();
393 virtual int getElementBlockGIDCount(
const std::string & blockId)
const
394 {
return getElementBlockGIDCount(blockIdToIndex(blockId)); }
398 virtual int getElementBlockGIDCount(
const std::size_t & blockIndex)
const
399 {
int cnt = matrixGraph_->getConnectivityNumIndices(blockIndex);
407 bool getOrientationsRequired()
const
408 {
return requireOrientations_; }
412 void setOrientationsRequired(
bool ro)
413 { requireOrientations_ = ro; }
420 void getOrderedBlock(
const std::vector<std::string> & fieldOrder,
421 const std::string & blockId,
422 std::vector<int> & orderedBlock)
const;
427 std::size_t blockIdToIndex(
const std::string & blockId)
const;
431 const std::map<std::string,std::size_t> & blockIdToIndexMap()
const;
434 bool buildPattern(
const std::vector<std::string> & fieldOrder,
435 const std::string & blockId);
442 std::map<std::string,int> fieldStrToInt_;
444 std::map<int,std::string> intToFieldStr_;
453 std::map<std::string,Teuchos::RCP<FieldAggPattern> > fieldAggPattern_;
456 std::map<std::string,std::set<int> > blockToField_;
461 fei::SharedPtr<fei::VectorSpace> vectorSpace_;
462 fei::SharedPtr<fei::MatrixGraph> matrixGraph_;
465 std::map<int,std::vector<int> > field2ElmtIDs_;
468 std::unordered_set<GlobalOrdinal> ownedGIDHashTable_;
473 std::vector<std::string> fieldOrder_;
479 std::vector<int> patternNum_;
481 bool fieldsRegistered_;
486 bool requireOrientations_;
488 std::vector<std::vector<char> > orientation_;
PHX::MDField< const ScalarT, Cell, IP > field