50 #include "Kokkos_DynRankView.hpp"
57 #include "Teuchos_FancyOStream.hpp"
59 namespace panzer_stk {
66 class LocalIdCompare {
68 LocalIdCompare(
const RCP<const STK_Interface> & mesh) : mesh_(mesh) {}
71 bool operator() (stk::mesh::Entity a,stk::mesh::Entity b)
72 {
return mesh_->elementLocalId(a) < mesh_->elementLocalId(b);}
75 RCP<const STK_Interface> mesh_;
79 : stkMeshDB_(stkMeshDB), ownedElementCount_(0)
108 std::vector<std::string> blockIds;
111 std::size_t blockIndex=0;
112 for(std::vector<std::string>::const_iterator idItr=blockIds.begin();
113 idItr!=blockIds.end();++idItr,++blockIndex) {
114 std::string blockId = *idItr;
117 std::vector<stk::mesh::Entity> blockElmts;
118 stkMeshDB_->getMyElements(blockId,blockElmts);
125 for(std::size_t i=0;i<blockElmts.size();i++)
132 for(std::vector<std::string>::const_iterator idItr=blockIds.begin();
133 idItr!=blockIds.end();++idItr,++blockIndex) {
134 std::string blockId = *idItr;
137 std::vector<stk::mesh::Entity> blockElmts;
138 stkMeshDB_->getNeighborElements(blockId,blockElmts);
145 for(std::size_t i=0;i<blockElmts.size();i++)
193 edgeOffset = nodeOffset+(maxNodeId+1)*nodeIdCnt;
194 faceOffset = edgeOffset+(maxEdgeId+1)*edgeIdCnt;
195 cellOffset = faceOffset+(maxFaceId+1)*faceIdCnt;
199 && edgeOffset <= faceOffset
200 && faceOffset <= cellOffset);
205 unsigned subcellRank,
208 const unsigned maxIds)
215 stk::mesh::BulkData& bulkData = *
stkMeshDB_->getBulkData();
216 const stk::mesh::EntityRank rank =
static_cast<stk::mesh::EntityRank
>(subcellRank);
221 "ERROR: The maxIds (num vertices from basis cell topology) is greater than the num vertices in the stk mesh topology!");
224 const size_t num_rels = (maxIds > 0) ? maxIds : bulkData.num_connectivity(element, rank);
225 stk::mesh::Entity
const* relations = bulkData.begin(element, rank);
226 for(std::size_t sc=0; sc<num_rels; ++sc) {
227 stk::mesh::Entity subcell = relations[sc];
231 connectivity_.push_back(offset+idCnt*(bulkData.identifier(subcell)-1)+i);
246 const std::vector<int> & subCellIndices = fp.
getSubcellIndices(subcellRank,subcellId);
249 for(std::size_t i=0;i<subCellIndices.size();i++) {
250 conn[subCellIndices[i]] = offset+subCellIndices.size()*(newId-1)+i;
256 #ifdef HAVE_EXTRA_TIMERS
258 RCP<Teuchos::TimeMonitor> tM =
rcp(
new TimeMonitor(*TimeMonitor::getNewTimer(std::string(
"panzer_stk::STKConnManager::buildConnectivity"))));
261 stk::mesh::BulkData& bulkData = *
stkMeshDB_->getBulkData();
271 LocalOrdinal nodeIdCnt=0, edgeIdCnt=0, faceIdCnt=0, cellIdCnt=0;
272 GlobalOrdinal nodeOffset=0, edgeOffset=0, faceOffset=0, cellOffset=0;
274 nodeOffset, edgeOffset, faceOffset, cellOffset);
287 for(std::size_t elmtLid=0;elmtLid!=
elements_->size();++elmtLid) {
289 stk::mesh::Entity element = (*elements_)[elmtLid];
306 connectivity_.push_back(cellOffset+cellIdCnt*(bulkData.identifier(element)-1));
326 stk::mesh::Entity element = (*elements_)[localElmtId];
328 return stkMeshDB_->containingBlockId(element);
337 #ifdef HAVE_EXTRA_TIMERS
339 RCP<Teuchos::TimeMonitor> tM =
rcp(
new TimeMonitor(*TimeMonitor::getNewTimer(std::string(
"panzer_stk::STKConnManager::applyPeriodicBCs"))));
346 = matchedValues.first;
348 = matchedValues.second;
351 if(matchedNodes==Teuchos::null)
return;
353 for(std::size_t m=0;m<matchedNodes->size();m++) {
354 stk::mesh::EntityId oldNodeId = (*matchedNodes)[m].first;
355 std::size_t newNodeId = (*matchedNodes)[m].second;
357 std::vector<stk::mesh::Entity> elements;
358 std::vector<int> localIds;
362 if((*matchTypes)[m] == 0)
363 offset1 = nodeOffset-offset0;
364 else if((*matchTypes)[m] == 1){
366 offset1 = edgeOffset-offset0;
367 }
else if((*matchTypes)[m] == 2){
369 offset1 = faceOffset-offset0;
374 stkMeshDB_->getOwnedElementsSharingNode(stk::mesh::EntityId(oldNodeId-offset0),elements,localIds,(*matchTypes)[m]);
377 for(std::size_t e=0;e<elements.size();e++){
388 std::vector<std::size_t> & localCellIds,
389 Kokkos::DynRankView<double,PHX::Device> & points)
const
395 Kokkos::DynRankView<double,PHX::Device> nodes;
399 points = Kokkos::DynRankView<double,PHX::Device>(
"points",localCellIds.size(),numIds,dim);
416 stk::mesh::Entity
const e)
418 return static_cast<std::size_t
>(
419 std::distance(elements.begin(), std::find(elements.begin(), elements.end(), e)));
424 stk::mesh::BulkData& bulkData = *
stkMeshDB_->getBulkData();
427 std::vector<stk::mesh::Entity> sides;
430 for (std::vector<stk::mesh::Entity>::const_iterator si = sides.begin();
431 si != sides.end(); ++si) {
432 stk::mesh::Entity side = *si;
433 const size_t num_elements = bulkData.num_elements(side);
434 stk::mesh::Entity
const* elements = bulkData.begin_elements(side);
435 if (num_elements != 2) {
453 std::vector<std::string> sidesets;
463 const std::vector<STKConnManager::LocalOrdinal>&
void clearLocalElementMapping()
virtual int getDimension() const =0
std::map< std::string, Teuchos::RCP< std::vector< LocalOrdinal > > > elementBlocks_
virtual const std::vector< LocalOrdinal > & getAssociatedNeighbors(const LocalOrdinal &el) const
virtual int getDimension() const
virtual std::string getBlockId(LocalOrdinal localElmtId) const
panzer::ConnManager::GlobalOrdinal GlobalOrdinal
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
std::vector< bool > sidesetYieldedAssociations_
std::map< std::string, Teuchos::RCP< std::vector< LocalOrdinal > > > neighborElementBlocks_
Teuchos::RCP< const STK_Interface > stkMeshDB_
std::vector< GlobalOrdinal > connectivity_
std::size_t ownedElementCount_
void getIdsAndNodes(const panzer_stk::STK_Interface &mesh, std::string blockId, std::vector< std::size_t > &localIds, ArrayT &nodes)
virtual bool hasAssociatedNeighbors() const
std::vector< std::string > checkAssociateElementsInSidesets(const Teuchos::Comm< int > &comm) const
std::vector< std::vector< LocalOrdinal > > elmtToAssociatedElmts_
virtual int numberIds() const
virtual const panzer::GlobalOrdinal * getConnectivity(LocalOrdinal localElmtId) const
void buildOffsetsAndIdCounts(const panzer::FieldPattern &fp, LocalOrdinal &nodeIdCnt, LocalOrdinal &edgeIdCnt, LocalOrdinal &faceIdCnt, LocalOrdinal &cellIdCnt, GlobalOrdinal &nodeOffset, GlobalOrdinal &edgeOffset, GlobalOrdinal &faceOffset, GlobalOrdinal &cellOffset) const
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
virtual Teuchos::RCP< panzer::ConnManager > noConnectivityClone() const
void modifySubcellConnectivities(const panzer::FieldPattern &fp, stk::mesh::Entity element, unsigned subcellRank, unsigned subcellId, GlobalOrdinal newId, GlobalOrdinal offset)
void applyPeriodicBCs(const panzer::FieldPattern &fp, GlobalOrdinal nodeOffset, GlobalOrdinal edgeOffset, GlobalOrdinal faceOffset, GlobalOrdinal cellOffset)
panzer::ConnManager::LocalOrdinal LocalOrdinal
LocalOrdinal addSubcellConnectivities(stk::mesh::Entity element, unsigned subcellRank, LocalOrdinal idCnt, GlobalOrdinal offset, const unsigned maxIds=0)
Loops over relations of a given rank for a specified element and adds a unique ID to the connectivity...
virtual void getDofCoords(const std::string &blockId, const panzer::Intrepid2FieldPattern &coordProvider, std::vector< std::size_t > &localCellIds, Kokkos::DynRankView< double, PHX::Device > &points) const
void buildLocalElementMapping()
std::vector< LocalOrdinal > elmtLidToConn_
std::vector< std::string > sidesetsToAssociate_
virtual shards::CellTopology getCellTopology() const =0
void getInterpolatoryCoordinates(Kokkos::DynRankView< double, PHX::Device > &coords) const
virtual const std::vector< int > & getSubcellIndices(int dim, int cellIndex) const =0
void applyInterfaceConditions()
#define TEUCHOS_ASSERT(assertion_test)
Teuchos::RCP< std::vector< stk::mesh::Entity > > elements_
std::size_t getElementIdx(const std::vector< stk::mesh::Entity > &elements, stk::mesh::Entity const e)
virtual void buildConnectivity(const panzer::FieldPattern &fp)
STKConnManager(const Teuchos::RCP< const STK_Interface > &stkMeshDB)
void associateElementsInSideset(const std::string sideset_id)
std::vector< LocalOrdinal > connSize_