44 #include "Panzer_Workset_Builder.hpp" 45 #include "Teuchos_Assert.hpp" 47 #include <stk_mesh/base/Selector.hpp> 48 #include <stk_mesh/base/GetEntities.hpp> 51 Teuchos::RCP<std::vector<panzer::Workset> >
55 using namespace workset_utils;
57 std::vector<std::string> element_blocks;
59 std::vector<std::size_t> local_cell_ids;
60 Kokkos::DynRankView<double,PHX::Device> cell_vertex_coordinates;
71 Teuchos::RCP<std::vector<panzer::Workset> >
73 const std::string & eBlock,
76 using namespace workset_utils;
78 std::vector<std::string> element_blocks;
80 std::vector<std::size_t> local_cell_ids;
81 Kokkos::DynRankView<double,PHX::Device> cell_vertex_coordinates;
92 Teuchos::RCP<std::vector<panzer::Workset> >
95 const std::string & sideset,
98 using namespace workset_utils;
101 std::vector<stk::mesh::Entity> sideEntities;
112 std::stringstream ss;
113 std::vector<std::string> sideSets;
117 ss << e.what() <<
"\nChoose one of:\n";
118 for(std::size_t i=0;i<sideSets.size();i++)
119 ss <<
"\"" << sideSets[i] <<
"\"\n";
121 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
124 std::stringstream ss;
125 std::vector<std::string> elementBlocks;
129 ss << e.what() <<
"\nChoose one of:\n";
130 for(std::size_t i=0;i<elementBlocks.size();i++)
131 ss <<
"\"" << elementBlocks[i] <<
"\"\n";
133 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
135 catch(std::logic_error & e) {
136 std::stringstream ss;
137 ss << e.what() <<
"\nUnrecognized logic error.\n";
139 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
142 std::vector<stk::mesh::Entity> elements;
143 std::map<std::pair<unsigned,unsigned>,std::vector<std::size_t> > local_cell_ids;
146 std::vector<std::size_t> local_side_ids;
148 sideEntities,local_side_ids,elements);
151 for(std::size_t elm=0;elm<elements.size();++elm) {
152 stk::mesh::Entity element = elements[elm];
154 local_cell_ids[std::make_pair(subcell_dim,local_side_ids[elm])].push_back(mesh.
elementLocalId(element));
158 std::vector<std::size_t> local_subcell_ids, subcell_dim;
160 sideEntities,subcell_dim,local_subcell_ids,elements);
163 for(std::size_t elm=0;elm<elements.size();++elm) {
164 stk::mesh::Entity element = elements[elm];
166 local_cell_ids[std::make_pair(subcell_dim[elm],local_subcell_ids[elm])].push_back(mesh.
elementLocalId(element));
174 if(elements.size()!=0) {
178 Teuchos::RCP<std::vector<panzer::Workset> > worksets = Teuchos::rcp(
new std::vector<panzer::Workset>);
181 for(std::map<std::pair<unsigned,unsigned>,std::vector<std::size_t> >::const_iterator itr=local_cell_ids.begin();
182 itr!=local_cell_ids.end();++itr) {
184 if(itr->second.size()==0)
187 Kokkos::DynRankView<double,PHX::Device> vertices;
190 Teuchos::RCP<std::vector<panzer::Workset> > current
194 for(std::size_t w=0;w<current->size();w++) {
195 (*current)[w].subcell_dim = itr->first.first;
196 (*current)[w].subcell_index = itr->first.second;
200 worksets->insert(worksets->end(),current->begin(),current->end());
207 return Teuchos::rcp(
new std::vector<panzer::Workset>());
210 Teuchos::RCP<std::vector<panzer::Workset> >
213 const std::string & sideset,
214 const std::string & eBlock,
217 using namespace workset_utils;
220 std::vector<stk::mesh::Entity> sideEntities;
231 std::stringstream ss;
232 std::vector<std::string> sideSets;
236 ss << e.what() <<
"\nChoose one of:\n";
237 for(std::size_t i=0;i<sideSets.size();i++)
238 ss <<
"\"" << sideSets[i] <<
"\"\n";
240 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
243 std::stringstream ss;
244 std::vector<std::string> elementBlocks;
248 ss << e.what() <<
"\nChoose one of:\n";
249 for(std::size_t i=0;i<elementBlocks.size();i++)
250 ss <<
"\"" << elementBlocks[i] <<
"\"\n";
252 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
254 catch(std::logic_error & e) {
255 std::stringstream ss;
256 ss << e.what() <<
"\nUnrecognized logic error.\n";
258 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
261 std::vector<stk::mesh::Entity> elements;
262 std::map<std::pair<unsigned,unsigned>,std::vector<std::size_t> > local_cell_ids;
265 std::vector<std::size_t> local_side_ids;
267 sideEntities,local_side_ids,elements);
270 for(std::size_t elm=0;elm<elements.size();++elm) {
271 stk::mesh::Entity element = elements[elm];
273 local_cell_ids[std::make_pair(subcell_dim,local_side_ids[elm])].push_back(mesh.
elementLocalId(element));
277 std::vector<std::size_t> local_subcell_ids, subcell_dim;
279 sideEntities,subcell_dim,local_subcell_ids,elements);
282 for(std::size_t elm=0;elm<elements.size();++elm) {
283 stk::mesh::Entity element = elements[elm];
285 local_cell_ids[std::make_pair(subcell_dim[elm],local_subcell_ids[elm])].push_back(mesh.
elementLocalId(element));
293 if(elements.size()!=0) {
294 Teuchos::RCP<const shards::CellTopology> topo = mesh.
getCellTopology(eBlock);
297 Teuchos::RCP<std::vector<panzer::Workset> > worksets = Teuchos::rcp(
new std::vector<panzer::Workset>);
300 for(std::map<std::pair<unsigned,unsigned>,std::vector<std::size_t> >::const_iterator itr=local_cell_ids.begin();
301 itr!=local_cell_ids.end();++itr) {
303 if(itr->second.size()==0)
306 Kokkos::DynRankView<double,PHX::Device> vertices;
309 Teuchos::RCP<std::vector<panzer::Workset> > current
313 for(std::size_t w=0;w<current->size();w++) {
314 (*current)[w].subcell_dim = itr->first.first;
315 (*current)[w].subcell_index = itr->first.second;
319 worksets->insert(worksets->end(),current->begin(),current->end());
326 return Teuchos::rcp(
new std::vector<panzer::Workset>());
329 Teuchos::RCP<std::map<unsigned,panzer::Workset> >
333 const std::string & sideset)
335 using namespace workset_utils;
338 std::vector<stk::mesh::Entity> sideEntities;
348 stk::mesh::Part * sidePart = mesh.
getSideset(sideset);
349 TEUCHOS_TEST_FOR_EXCEPTION(sidePart==0,std::logic_error,
350 "Unknown side set \"" << sideset <<
"\"");
352 stk::mesh::Selector side = *sidePart;
359 std::stringstream ss;
360 std::vector<std::string> elementBlocks;
364 ss << e.what() <<
"\nChoose one of:\n";
365 for(std::size_t i=0;i<elementBlocks.size();i++)
366 ss <<
"\"" << elementBlocks[i] <<
"\"\n";
368 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
370 catch(std::logic_error & e) {
371 std::stringstream ss;
372 ss << e.what() <<
"\nUnrecognized logic error.\n";
374 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
377 std::vector<stk::mesh::Entity> elements_a, elements_b;
378 std::vector<std::size_t> local_cell_ids_a, local_cell_ids_b;
379 std::vector<std::size_t> local_side_ids_a, local_side_ids_b;
383 local_side_ids_a,elements_a,
384 local_side_ids_b,elements_b);
386 TEUCHOS_TEST_FOR_EXCEPTION(elements_a.size()!=elements_b.size(),std::logic_error,
387 "For a DG type boundary, the number of elements on the \"left\" and \"right\" is not the same.");
393 if(elements_a.size()==0)
394 return Teuchos::rcp(
new std::map<unsigned,panzer::Workset>);
399 for(std::size_t elm=0;elm<elements_a.size();++elm) {
400 stk::mesh::Entity element_a = elements_a[elm];
401 stk::mesh::Entity element_b = elements_b[elm];
407 Kokkos::DynRankView<double,PHX::Device> vertex_coordinates_a, vertex_coordinates_b;
412 return buildBCWorkset(pb_a, local_cell_ids_a, local_side_ids_a, vertex_coordinates_a,
413 pb_b, local_cell_ids_b, local_side_ids_b, vertex_coordinates_b);
416 Teuchos::RCP<std::map<unsigned,panzer::Workset> >
419 const std::string & sidesetID)
421 using namespace workset_utils;
424 std::vector<stk::mesh::Entity> sideEntities;
432 std::stringstream ss;
433 std::vector<std::string> sideSets;
437 ss << e.what() <<
"\nChoose one of:\n";
438 for(std::size_t i=0;i<sideSets.size();i++)
439 ss <<
"\"" << sideSets[i] <<
"\"\n";
441 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
444 std::stringstream ss;
445 std::vector<std::string> elementBlocks;
449 ss << e.what() <<
"\nChoose one of:\n";
450 for(std::size_t i=0;i<elementBlocks.size();i++)
451 ss <<
"\"" << elementBlocks[i] <<
"\"\n";
453 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
455 catch(std::logic_error & e) {
456 std::stringstream ss;
457 ss << e.what() <<
"\nUnrecognized logic error.\n";
459 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
462 std::vector<stk::mesh::Entity> elements;
463 std::vector<std::size_t> local_cell_ids;
464 std::vector<std::size_t> local_side_ids;
466 sideEntities,local_side_ids,elements);
469 for(std::size_t elm=0;elm<elements.size();++elm) {
470 stk::mesh::Entity element = elements[elm];
479 if(elements.size()!=0) {
480 Teuchos::RCP<const shards::CellTopology> topo
483 Kokkos::DynRankView<double,PHX::Device> vertices;
489 return Teuchos::null;
492 Teuchos::RCP<std::map<unsigned,panzer::Workset> >
495 const std::string & eblockID,
496 const std::string & sidesetID)
498 using namespace workset_utils;
501 std::vector<stk::mesh::Entity> sideEntities;
506 mesh.
getMySides(sidesetID,eblockID,sideEntities);
509 std::stringstream ss;
510 std::vector<std::string> sideSets;
514 ss << e.what() <<
"\nChoose one of:\n";
515 for(std::size_t i=0;i<sideSets.size();i++)
516 ss <<
"\"" << sideSets[i] <<
"\"\n";
518 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
521 std::stringstream ss;
522 std::vector<std::string> elementBlocks;
526 ss << e.what() <<
"\nChoose one of:\n";
527 for(std::size_t i=0;i<elementBlocks.size();i++)
528 ss <<
"\"" << elementBlocks[i] <<
"\"\n";
530 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
532 catch(std::logic_error & e) {
533 std::stringstream ss;
534 ss << e.what() <<
"\nUnrecognized logic error.\n";
536 TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(
true,std::logic_error,ss.str());
539 std::vector<stk::mesh::Entity> elements;
540 std::vector<std::size_t> local_cell_ids;
541 std::vector<std::size_t> local_side_ids;
543 sideEntities,local_side_ids,elements);
546 for(std::size_t elm=0;elm<elements.size();++elm) {
547 stk::mesh::Entity element = elements[elm];
556 if(elements.size()!=0) {
557 Teuchos::RCP<const shards::CellTopology> topo
560 Kokkos::DynRankView<double,PHX::Device> vertices;
566 return Teuchos::null;
569 namespace workset_utils {
572 const std::string & blockId,
573 const std::vector<stk::mesh::Entity> & entities,
574 std::vector<std::size_t> & localEntityIds,
575 std::vector<stk::mesh::Entity> & elements)
580 stk::mesh::BulkData& bulkData = *mesh.
getBulkData();
584 std::vector<stk::mesh::Entity>::const_iterator entityItr;
585 for(entityItr=entities.begin();entityItr!=entities.end();++entityItr) {
586 stk::mesh::Entity entity = *entityItr;
588 const size_t num_rels = bulkData.num_elements(entity);
589 stk::mesh::Entity
const* relations = bulkData.begin_elements(entity);
590 stk::mesh::ConnectivityOrdinal
const* ordinals = bulkData.begin_element_ordinals(entity);
591 for(std::size_t e=0; e<num_rels; ++e) {
592 stk::mesh::Entity element = relations[e];
593 std::size_t entityId = ordinals[e];
596 stk::mesh::Bucket
const& bucket = bulkData.bucket(element);
597 bool inBlock = bucket.member(*blockPart);
598 bool onProc = bucket.member(*ownedPart);
599 if(inBlock && onProc) {
601 elements.push_back(element);
602 localEntityIds.push_back(entityId);
609 const std::string & blockId,
610 const std::vector<stk::mesh::Entity> & entities,
611 std::vector<std::size_t> & localEntityIds,
612 std::vector<stk::mesh::Entity> & elements)
616 stk::mesh::Part * universalPart = &mesh.
getMetaData()->universal_part();
617 stk::mesh::BulkData& bulkData = *mesh.
getBulkData();
621 std::vector<stk::mesh::Entity>::const_iterator entityItr;
622 for(entityItr=entities.begin();entityItr!=entities.end();++entityItr) {
623 stk::mesh::Entity entity = *entityItr;
625 const size_t num_rels = bulkData.num_elements(entity);
626 stk::mesh::Entity
const* element_rels = bulkData.begin_elements(entity);
627 stk::mesh::ConnectivityOrdinal
const* ordinals = bulkData.begin_element_ordinals(entity);
628 for(std::size_t e=0; e<num_rels; ++e) {
629 stk::mesh::Entity element = element_rels[e];
630 std::size_t entityId = ordinals[e];
633 stk::mesh::Bucket
const& bucket = bulkData.bucket(element);
634 bool inBlock = bucket.member(*blockPart);
635 bool onProc = bucket.member(*universalPart);
636 if(inBlock && onProc) {
638 elements.push_back(element);
639 localEntityIds.push_back(entityId);
646 const std::string & blockId,
647 const std::vector<stk::mesh::Entity> & sides,
648 std::vector<std::size_t> & localSubcellDim,
649 std::vector<std::size_t> & localSubcellIds,
650 std::vector<stk::mesh::Entity> & elements)
657 std::vector<std::vector<stk::mesh::Entity> > subcells;
659 subcells.push_back(sides);
664 for(std::size_t d=0;d<subcells.size();d++) {
665 std::vector<std::size_t> subcellIds;
666 std::vector<stk::mesh::Entity> subcellElements;
672 TEUCHOS_ASSERT(subcellIds.size()==subcellElements.size());
675 localSubcellDim.insert(localSubcellDim.end(),subcellElements.size(),d);
676 localSubcellIds.insert(localSubcellIds.end(),subcellIds.begin(),subcellIds.end());
677 elements.insert(elements.end(),subcellElements.begin(),subcellElements.end());
682 const std::string & blockId,
683 const std::vector<stk::mesh::Entity> & sides,
684 std::vector<std::size_t> & localSideIds,
685 std::vector<stk::mesh::Entity> & elements)
691 const std::string & blockId_a,
692 const std::string & blockId_b,
693 const std::vector<stk::mesh::Entity> & sides,
694 std::vector<std::size_t> & localSideIds_a,
695 std::vector<stk::mesh::Entity> & elements_a,
696 std::vector<std::size_t> & localSideIds_b,
697 std::vector<stk::mesh::Entity> & elements_b)
703 stk::mesh::Part * universalPart = &mesh.
getMetaData()->universal_part();
704 stk::mesh::BulkData& bulkData = *mesh.
getBulkData();
708 std::vector<stk::mesh::Entity>::const_iterator sidesItr;
709 for(sidesItr=sides.begin();sidesItr!=sides.end();++sidesItr) {
710 stk::mesh::Entity side = *sidesItr;
713 stk::mesh::Entity element_a = stk::mesh::Entity(), element_b = stk::mesh::Entity();
714 std::size_t entityId_a=0, entityId_b=0;
716 const size_t num_rels = bulkData.num_elements(side);
717 stk::mesh::Entity
const* element_rels = bulkData.begin_elements(side);
718 stk::mesh::ConnectivityOrdinal
const* ordinals = bulkData.begin_element_ordinals(side);
719 for(std::size_t e=0; e<num_rels; ++e) {
720 stk::mesh::Entity element = element_rels[e];
721 std::size_t entityId = ordinals[e];
724 stk::mesh::Bucket
const& bucket = bulkData.bucket(element);
725 bool inBlock_a = bucket.member(*blockPart_a);
726 bool inBlock_b = bucket.member(*blockPart_b);
727 bool onProc = bucket.member(*ownedPart);
728 bool unProc = bucket.member(*universalPart);
730 if(inBlock_a && onProc) {
731 TEUCHOS_ASSERT(element_a==stk::mesh::Entity());
733 entityId_a = entityId;
735 if(inBlock_b && unProc) {
736 TEUCHOS_ASSERT(element_b==stk::mesh::Entity());
738 entityId_b = entityId;
742 if(element_a!=stk::mesh::Entity() && element_b!=stk::mesh::Entity()) {
743 elements_a.push_back(element_a);
744 localSideIds_a.push_back(entityId_a);
747 elements_b.push_back(element_b);
748 localSideIds_b.push_back(entityId_b);
754 const std::string & blockId,
755 const std::vector<stk::mesh::Entity> & nodes,
756 std::vector<std::size_t> & localNodeIds,
757 std::vector<stk::mesh::Entity> & elements)
763 const std::vector<stk::mesh::Entity> & entities,
764 std::vector<std::vector<stk::mesh::Entity> > & subcells)
767 if(entities.size()==0) {
772 stk::mesh::BulkData& bulkData = *mesh.
getBulkData();
773 stk::mesh::EntityRank master_rank = bulkData.entity_rank(entities[0]);
775 std::vector<std::set<stk::mesh::Entity> > subcells_set(master_rank);
779 std::vector<stk::mesh::Entity>::const_iterator entityItr;
780 for(entityItr=entities.begin();entityItr!=entities.end();++entityItr) {
781 stk::mesh::Entity entity = *entityItr;
784 TEUCHOS_ASSERT(bulkData.entity_rank(entity)==master_rank);
786 for(
int i=0; i<master_rank; i++) {
787 stk::mesh::EntityRank
const to_rank =
static_cast<stk::mesh::EntityRank
>(i);
788 if (bulkData.connectivity_map().valid(master_rank, to_rank)) {
789 const size_t num_rels = bulkData.num_connectivity(entity, to_rank);
790 stk::mesh::Entity
const* relations = bulkData.begin(entity, to_rank);
794 for(std::size_t e=0; e<num_rels; ++e) {
795 stk::mesh::Entity subcell = relations[e];
797 subcells_set[i].insert(subcell);
805 subcells.resize(subcells_set.size());
806 for(std::size_t i=0;i<subcells_set.size();i++)
807 subcells[i].assign(subcells_set[i].begin(),subcells_set[i].end());
Teuchos::RCP< std::map< unsigned, Workset > > buildBCWorkset(const PhysicsBlock &volume_pb, const std::vector< std::size_t > &local_cell_ids, const std::vector< std::size_t > &local_side_ids, const ArrayT &vertex_coordinates)
Teuchos::RCP< stk::mesh::MetaData > getMetaData() const
stk::mesh::Part * getElementBlockPart(const std::string &name) const
get the block count
void getElementVertices(const std::vector< std::size_t > &localIds, ArrayT &vertices) const
void getMySides(const std::string &sideName, std::vector< stk::mesh::Entity > &sides) const
void getIdsAndVertices(const panzer_stk::STK_Interface &mesh, std::string blockId, std::vector< std::size_t > &localIds, ArrayT &vertices)
Object that contains information on the physics and discretization of a block of elements with the SA...
std::size_t elementLocalId(stk::mesh::Entity elmt) const
void getSubcellEntities(const panzer_stk::STK_Interface &mesh, const std::vector< stk::mesh::Entity > &entities, std::vector< std::vector< stk::mesh::Entity > > &subcells)
std::string elementBlockID() const
Teuchos::RCP< stk::mesh::BulkData > getBulkData() const
Teuchos::RCP< std::vector< panzer::Workset > > buildWorksets(const panzer_stk::STK_Interface &mesh, const panzer::PhysicsBlock &pb)
void getSubcellElements(const panzer_stk::STK_Interface &mesh, const std::string &blockId, const std::vector< stk::mesh::Entity > &entities, std::vector< std::size_t > &localEntityIds, std::vector< stk::mesh::Entity > &elements)
stk::mesh::Part * getOwnedPart() const
Get a pointer to the locally owned part.
stk::mesh::EntityRank getSideRank() const
PHX::MDField< ScalarT > vector
void getElementBlockNames(std::vector< std::string > &names) const
stk::mesh::Part * getSideset(const std::string &name) const
int baseCellDimension() const
Dimension of the base cell. NOT the dimension of the local side, even if the side() method returns tr...
void getSideElements(const panzer_stk::STK_Interface &mesh, const std::string &blockId, const std::vector< stk::mesh::Entity > &sides, std::vector< std::size_t > &localSideIds, std::vector< stk::mesh::Entity > &elements)
void getUniversalSubcellElements(const panzer_stk::STK_Interface &mesh, const std::string &blockId, const std::vector< stk::mesh::Entity > &entities, std::vector< std::size_t > &localEntityIds, std::vector< stk::mesh::Entity > &elements)
Teuchos::RCP< std::vector< Workset > > buildWorksets(const PhysicsBlock &pb, const std::vector< std::size_t > &local_cell_ids, const ArrayT &vertex_coordinates)
const panzer::CellData & cellData() const
Teuchos::RCP< const shards::CellTopology > getCellTopology(const std::string &eBlock) const
void getAllSides(const std::string &sideName, std::vector< stk::mesh::Entity > &sides) const
void getSidesetNames(std::vector< std::string > &name) const
Teuchos::RCP< std::map< unsigned, panzer::Workset > > buildBCWorksets(const panzer_stk::STK_Interface &mesh, const panzer::PhysicsBlock &pb_a, const panzer::PhysicsBlock &pb_b, const std::string &sideset)
void getSideElementCascade(const panzer_stk::STK_Interface &mesh, const std::string &blockId, const std::vector< stk::mesh::Entity > &sides, std::vector< std::size_t > &localSubcellDim, std::vector< std::size_t > &localSubcellIds, std::vector< stk::mesh::Entity > &elements)
void getNodeElements(const panzer_stk::STK_Interface &mesh, const std::string &blockId, const std::vector< stk::mesh::Entity > &nodes, std::vector< std::size_t > &localNodeIds, std::vector< stk::mesh::Entity > &elements)