11 #include <PanzerAdaptersSTK_config.hpp>
15 #include <Teuchos_RCPStdSharedPtrConversions.hpp>
19 #include <stk_mesh/base/FieldBase.hpp>
20 #include <stk_mesh/base/Comm.hpp>
21 #include <stk_mesh/base/Selector.hpp>
22 #include <stk_mesh/base/GetEntities.hpp>
23 #include <stk_mesh/base/GetBuckets.hpp>
24 #include <stk_mesh/base/MeshBuilder.hpp>
25 #include <stk_mesh/base/CreateAdjacentEntities.hpp>
32 #include <stk_util/parallel/ParallelReduce.hpp>
33 #include <stk_util/parallel/CommSparse.hpp>
35 #include <stk_tools/mesh_tools/FixNodeSharingViaSearch.hpp>
37 #ifdef PANZER_HAVE_IOSS
38 #include <Ionit_Initializer.h>
39 #include <stk_io/IossBridge.hpp>
40 #include <stk_io/WriteMesh.hpp>
43 #ifdef PANZER_HAVE_PERCEPT
44 #include <percept/PerceptMesh.hpp>
45 #include <adapt/UniformRefinerPattern.hpp>
46 #include <adapt/UniformRefiner.hpp>
56 namespace panzer_stk {
60 : gid_(gid), nodes_(nodes) {}
79 : dimension_(0), initialized_(false), currentLocalId_(0), initialStateTime_(0.0), currentStateTime_(0.0), useFieldCoordinates_(false)
86 : dimension_(0), initialized_(false), currentLocalId_(0), initialStateTime_(0.0), currentStateTime_(0.0), useFieldCoordinates_(false)
93 : dimension_(dim), initialized_(false), currentLocalId_(0), useFieldCoordinates_(false)
95 std::vector<std::string> entity_rank_names = stk::mesh::entity_rank_names();
96 entity_rank_names.push_back(
"FAMILY_TREE");
109 stk::mesh::Part * sideset =
metaData_->get_part(name);
111 sideset = &
metaData_->declare_part_with_topology(name,
112 stk::mesh::get_topology(shards::CellTopology(ctData),
dimension_));
113 sidesets_.insert(std::make_pair(name,sideset));
121 stk::mesh::Part * nodeset =
metaData_->get_part(name);
122 if(nodeset==
nullptr) {
123 const CellTopologyData * ctData = shards::getCellTopologyData<shards::Node>();
124 nodeset = &
metaData_->declare_part_with_topology(name,
125 stk::mesh::get_topology(shards::CellTopology(ctData),
dimension_));
127 nodesets_.insert(std::make_pair(name,nodeset));
133 "Unknown element block \"" << blockId <<
"\"");
134 std::pair<std::string,std::string> key = std::make_pair(fieldName,blockId);
140 field = &
metaData_->declare_field<
double>(stk::topology::NODE_RANK, fieldName);
143 stk::mesh::put_field_on_mesh(*field,
metaData_->universal_part(),
nullptr);
152 "Unknown element block \"" << blockId <<
"\"");
153 std::pair<std::string,std::string> key = std::make_pair(fieldName,blockId);
159 field = &
metaData_->declare_field<
double>(stk::topology::ELEMENT_RANK, fieldName);
163 stk::mesh::put_field_on_mesh(*field,
metaData_->universal_part(),
nullptr);
172 "Unknown element block \"" << blockId <<
"\"");
173 std::pair<std::string,std::string> key = std::make_pair(fieldName,blockId);
179 field = &
metaData_->declare_field<
double>(stk::topology::EDGE_RANK, fieldName);
184 stk::mesh::put_field_on_mesh(*field,
metaData_->universal_part(),
nullptr);
193 "Unknown element block \"" << blockId <<
"\"");
194 std::pair<std::string,std::string> key = std::make_pair(fieldName,blockId);
200 field = &
metaData_->declare_field<
double>(stk::topology::FACE_RANK, fieldName);
205 stk::mesh::put_field_on_mesh(*field,
metaData_->universal_part(),
nullptr);
212 const std::vector<std::string> & coordNames,
213 const std::string & dispPrefix)
219 "Unknown element block \"" << blockId <<
"\"");
223 "STK_Interface::addMeshCoordFields: Can't set more than one set of coordinate "
224 "fields for element block \""+blockId+
"\".");
237 std::pair<std::string,std::string> key = std::make_pair(coordNames[i],blockId);
238 std::string dispName = dispPrefix+coordNames[i];
240 dispFields[i] = dispName;
248 field = &
metaData_->declare_field<
double>(stk::topology::NODE_RANK, dispName);
261 const bool buildRefinementSupport)
284 #ifdef PANZER_HAVE_IOSS
291 std::map<std::string, stk::mesh::Part*>::iterator itr;
293 if(!stk::io::is_part_io_part(*itr->second))
294 stk::io::put_io_part_attribute(*itr->second);
299 std::map<std::string, stk::mesh::Part*>::iterator itr;
301 if(!stk::io::is_part_edge_block_io_part(*itr->second))
302 stk::io::put_edge_block_io_part_attribute(*itr->second);
307 std::map<std::string, stk::mesh::Part*>::iterator itr;
309 if(!stk::io::is_part_face_block_io_part(*itr->second))
310 stk::io::put_face_block_io_part_attribute(*itr->second);
315 std::map<std::string, stk::mesh::Part*>::iterator itr;
317 if(!stk::io::is_part_io_part(*itr->second))
318 stk::io::put_io_part_attribute(*itr->second);
323 std::map<std::string, stk::mesh::Part*>::iterator itr;
325 if(!stk::io::is_part_io_part(*itr->second))
326 stk::io::put_io_part_attribute(*itr->second);
334 stk::io::set_field_output_type(*
coordinatesField_, stk::io::FieldOutputType::VECTOR_3D);
335 stk::io::set_field_role(*
edgesField_, Ioss::Field::MESH);
336 stk::io::set_field_output_type(*
edgesField_, stk::io::FieldOutputType::VECTOR_3D);
338 stk::io::set_field_role(*
facesField_, Ioss::Field::MESH);
339 stk::io::set_field_output_type(*
facesField_, stk::io::FieldOutputType::VECTOR_3D);
347 if (buildRefinementSupport) {
348 #ifdef PANZER_HAVE_PERCEPT
353 breakPattern_ =
Teuchos::rcp(
new percept::URP_Heterogeneous_3D(*refinedMesh_));
356 "ERROR: Uniform refinement requested. This requires the Percept package to be enabled in Trilinos!");
371 std::set<SolutionFieldType*> uniqueFields;
372 std::map<std::pair<std::string,std::string>,
SolutionFieldType*>::const_iterator fieldIter;
373 for(fieldIter=nameToField.begin();fieldIter!=nameToField.end();++fieldIter)
374 uniqueFields.insert(fieldIter->second);
377 std::set<SolutionFieldType*>::const_iterator uniqueFieldIter;
378 for(uniqueFieldIter=uniqueFields.begin();uniqueFieldIter!=uniqueFields.end();++uniqueFieldIter)
379 stk::mesh::put_field_on_mesh(*(*uniqueFieldIter),
metaData_->universal_part(),
nullptr);
382 #ifdef PANZER_HAVE_IOSS
385 std::set<SolutionFieldType*>::const_iterator uniqueFieldIter;
386 for(uniqueFieldIter=uniqueFields.begin();uniqueFieldIter!=uniqueFields.end();++uniqueFieldIter)
387 stk::io::set_field_role(*(*uniqueFieldIter), Ioss::Field::TRANSIENT);
398 std::unique_ptr<stk::mesh::BulkData> bulkUPtr = stk::mesh::MeshBuilder(*
mpiComm_->getRawMpiComm()).create(Teuchos::get_shared_ptr(
metaData_));
405 "STK_Interface: Must call \"initialized\" or \"instantiateBulkData\" before \"beginModification\"");
413 "STK_Interface: Must call \"initialized\" or \"instantiateBulkData\" before \"endModification\"");
422 if (find_and_set_shared_nodes_in_stk) {
423 const double radius = 10.0 * std::numeric_limits<double>::epsilon();
424 stk::tools::fix_node_sharing_via_search(*
bulkData_,radius);
436 "STK_Interface::addNode: STK_Interface must be modifiable to add a node");
438 "STK_Interface::addNode: number of coordinates in vector must mation dimension");
440 "STK_Interface::addNode: STK has STUPID restriction of no zero GIDs, pick something else");
447 for(std::size_t i=0;i<coord.size();++i)
448 fieldCoords[i] = coord[i];
453 std::vector<stk::mesh::Part*> sidesetV;
454 sidesetV.push_back(sideset);
456 bulkData_->change_entity_parts(entity,sidesetV);
461 std::vector<stk::mesh::Part*> nodesetV;
462 nodesetV.push_back(nodeset);
464 bulkData_->change_entity_parts(entity,nodesetV);
469 std::vector<stk::mesh::Part*> edgeblockV;
470 edgeblockV.push_back(edgeblock);
472 bulkData_->change_entity_parts(entity,edgeblockV);
476 if (entities.size() > 0) {
477 std::vector<stk::mesh::Part*> edgeblockV;
478 edgeblockV.push_back(edgeblock);
480 bulkData_->change_entity_parts(entities,edgeblockV);
486 std::vector<stk::mesh::Part*> faceblockV;
487 faceblockV.push_back(faceblock);
489 bulkData_->change_entity_parts(entity,faceblockV);
493 if (entities.size() > 0) {
494 std::vector<stk::mesh::Part*> faceblockV;
495 faceblockV.push_back(faceblock);
497 bulkData_->change_entity_parts(entities,faceblockV);
503 std::vector<stk::mesh::Part*> blockVec;
504 blockVec.push_back(block);
508 stk::mesh::Entity element =
bulkData_->declare_entity(elementRank,ed->getGID(),blockVec);
511 const std::vector<stk::mesh::EntityId> & nodes = ed->getNodes();
512 for(std::size_t i=0;i<nodes.size();++i) {
514 stk::mesh::Entity node =
bulkData_->get_entity(nodeRank,nodes[i]);
516 bulkData_->declare_relation(element,node,i);
520 procId[0] = Teuchos::as<ProcIdData>(
procRank_);
528 std::vector<stk::mesh::Entity> localElmts;
530 std::vector<stk::mesh::Entity>::const_iterator itr;
531 for(itr=localElmts.begin();itr!=localElmts.end();++itr) {
532 stk::mesh::Entity element = (*itr);
533 stk::mesh::EntityId gid =
bulkData_->identifier(element);
534 std::vector<stk::mesh::EntityId> subcellIds;
537 for(std::size_t i=0;i<subcellIds.size();++i) {
538 stk::mesh::Entity edge =
bulkData_->get_entity(edgeRank,subcellIds[i]);
539 stk::mesh::Entity
const* relations =
bulkData_->begin_nodes(edge);
545 double * edgeCoords = stk::mesh::field_data(*
edgesField_,edge);
547 edgeCoords[j] = (node_coord_1[j]+node_coord_2[j])/2.0;
556 std::vector<stk::mesh::Entity> localElmts;
558 std::vector<stk::mesh::Entity>::const_iterator itr;
559 for(itr=localElmts.begin();itr!=localElmts.end();++itr) {
560 stk::mesh::Entity element = (*itr);
562 std::vector<stk::mesh::EntityId> subcellIds;
565 for(std::size_t i=0;i<subcellIds.size();++i) {
566 stk::mesh::Entity face =
bulkData_->get_entity(faceRank,subcellIds[i]);
567 stk::mesh::Entity
const* relations =
bulkData_->begin_nodes(face);
568 const size_t num_relations =
bulkData_->num_nodes(face);
571 double * faceCoords = stk::mesh::field_data(*
facesField_,face);
574 for(std::size_t k=0;k<num_relations;++k)
576 faceCoords[j] /= double(num_relations);
584 const size_t num_rels =
bulkData_->num_connectivity(src, tgt_rank);
585 stk::mesh::Entity
const* relations =
bulkData_->begin(src, tgt_rank);
586 stk::mesh::ConnectivityOrdinal
const* ordinals =
bulkData_->begin_ordinals(src, tgt_rank);
587 for (
size_t i = 0; i < num_rels; ++i) {
588 if (ordinals[i] == static_cast<stk::mesh::ConnectivityOrdinal>(rel_id)) {
593 return stk::mesh::Entity();
619 const bool append_after_restart_time,
620 const double restart_time)
622 std::vector<Ioss::Property> ioss_properties;
626 append_after_restart_time,
633 const std::vector<Ioss::Property>& ioss_properties,
635 const bool append_after_restart_time,
636 const double restart_time)
638 using std::runtime_error;
639 using stk::io::StkMeshIoBroker;
640 using stk::mesh::FieldVector;
641 using stk::ParallelMachine;
643 PANZER_FUNC_TIME_MONITOR(
"STK_Interface::setupExodusFile(filename)");
644 #ifdef PANZER_HAVE_IOSS
647 ParallelMachine comm = *
mpiComm_->getRawMpiComm();
648 meshData_ =
rcp(
new StkMeshIoBroker(comm));
649 meshData_->set_bulk_data(Teuchos::get_shared_ptr(
bulkData_));
650 Ioss::PropertyManager props;
651 props.add(Ioss::Property(
"LOWER_CASE_VARIABLE_NAMES",
"FALSE"));
652 for (
const auto& p : ioss_properties ) {
656 if (append_after_restart_time) {
657 meshIndex_ = meshData_->create_output_mesh(filename, stk::io::APPEND_RESULTS,
658 props, restart_time);
661 meshIndex_ = meshData_->create_output_mesh(filename, stk::io::APPEND_RESULTS, props);
664 meshIndex_ = meshData_->create_output_mesh(filename, stk::io::WRITE_RESULTS, props);
665 const FieldVector& fields =
metaData_->get_fields();
666 for (
size_t i(0); i < fields.size(); ++i) {
672 auto role = stk::io::get_field_role(*fields[i]);
673 if (role !=
nullptr) {
674 if (*role != Ioss::Field::MESH)
675 meshData_->add_field(meshIndex_, *fields[i]);
677 meshData_->add_field(meshIndex_, *fields[i]);
683 meshData_->add_info_records(meshIndex_, deduped_info_records);
702 using Teuchos::rcpFromRef;
703 PANZER_FUNC_TIME_MONITOR(
"STK_Interface::writeToExodus(timestep)");
704 #ifdef PANZER_HAVE_IOSS
705 if (not meshData_.is_null())
708 globalToExodus(GlobalVariable::ADD);
710 meshData_->write_defined_output_fields(meshIndex_);
711 globalToExodus(GlobalVariable::WRITE);
712 meshData_->end_output_step(meshIndex_);
717 out.setOutputToRootOnly(0);
718 out <<
"WARNING: Exodus I/O has been disabled or not setup properly; "
719 <<
"not writing to Exodus." << endl;
734 const GlobalVariable& flag)
736 using std::invalid_argument;
743 for (
auto i = globalData_.begin(); i != globalData_.end(); ++i)
745 const string& name = globalData_.name(i);
748 if (globalData_.isType<
int>(name))
750 const auto& value = globalData_.get<
int>(name);
751 if (flag == GlobalVariable::ADD)
755 meshData_->add_global(meshIndex_, name, value,
756 stk::util::ParameterType::INTEGER);
764 meshData_->write_global(meshIndex_, name, value,
765 stk::util::ParameterType::INTEGER);
769 else if (globalData_.isType<
double>(name))
771 const auto& value = globalData_.get<
double>(name);
772 if (flag == GlobalVariable::ADD)
776 meshData_->add_global(meshIndex_, name, value,
777 stk::util::ParameterType::DOUBLE);
785 meshData_->write_global(meshIndex_, name, value,
786 stk::util::ParameterType::DOUBLE);
790 else if (globalData_.isType<Array<int>>(name))
792 const auto& value = globalData_.get<Array<int>>(name).toVector();
793 if (flag == GlobalVariable::ADD)
797 meshData_->add_global(meshIndex_, name, value,
798 stk::util::ParameterType::INTEGERVECTOR);
806 meshData_->write_global(meshIndex_, name, value,
807 stk::util::ParameterType::INTEGERVECTOR);
811 else if (globalData_.isType<Array<double>>(name))
813 const auto& value = globalData_.get<Array<double>>(name).toVector();
814 if (flag == GlobalVariable::ADD)
818 meshData_->add_global(meshIndex_, name, value,
819 stk::util::ParameterType::DOUBLEVECTOR);
827 meshData_->write_global(meshIndex_, name, value,
828 stk::util::ParameterType::DOUBLEVECTOR);
834 "STK_Interface::globalToExodus(): The global variable to be added " \
835 "to the Exodus output file is of an invalid type. Valid types are " \
836 "int and double, along with std::vectors of those types.")
848 const std::string& key,
851 globalData_.set(key, value);
862 const std::string& key,
865 globalData_.set(key, value);
876 const std::string& key,
877 const std::vector<int>& value)
880 globalData_.set(key, Array<int>(value));
891 const std::string& key,
892 const std::vector<double>& value)
895 globalData_.set(key, Array<double>(value));
900 #ifdef PANZER_HAVE_IOSS
912 stk::mesh::Entity node =
bulkData_->get_entity(nodeRank,nodeId);
913 const size_t numElements =
bulkData_->num_elements(node);
914 stk::mesh::Entity
const* relations =
bulkData_->begin_elements(node);
917 elements.insert(elements.end(), relations, relations + numElements);
921 std::vector<int> & relIds)
const
924 const size_t numElements =
bulkData_->num_elements(node);
925 stk::mesh::Entity
const* relations =
bulkData_->begin_elements(node);
926 stk::mesh::ConnectivityOrdinal
const* rel_ids =
bulkData_->begin_element_ordinals(node);
929 for (
size_t i = 0; i < numElements; ++i) {
930 stk::mesh::Entity element = relations[i];
934 elements.push_back(element);
935 relIds.push_back(rel_ids[i]);
941 std::vector<int> & relIds,
unsigned int matchType)
const
943 stk::mesh::EntityRank rank;
946 else if(matchType == 1)
948 else if(matchType == 2)
953 stk::mesh::Entity node =
bulkData_->get_entity(rank,nodeId);
960 std::vector<stk::mesh::Entity> current;
963 std::sort(current.begin(),current.end());
966 for(std::size_t n=1;n<nodeIds.size();++n) {
968 std::vector<stk::mesh::Entity> nextNode;
970 std::sort(nextNode.begin(),nextNode.end());
973 std::vector<stk::mesh::Entity> intersection(std::min(nextNode.size(),current.size()));
974 std::vector<stk::mesh::Entity>::const_iterator endItr
975 = std::set_intersection(current.begin(),current.end(),
976 nextNode.begin(),nextNode.end(),
977 intersection.begin());
978 std::size_t newLength = endItr-intersection.begin();
979 intersection.resize(newLength);
983 current = intersection;
992 stk::mesh::Entity
const* nodeRel =
getBulkData()->begin_nodes(element);
993 const size_t numNodes =
getBulkData()->num_nodes(element);
995 nodeIds.reserve(numNodes);
996 for(
size_t i = 0; i < numNodes; ++i) {
1011 const auto entityRankCount =
metaData_->entity_rank_count();
1012 const size_t commCount = 10;
1017 stk::ParallelMachine mach = *
mpiComm_->getRawMpiComm();
1019 std::vector<stk::mesh::EntityId> local(commCount,0);
1022 stk::mesh::Selector ownedPart =
metaData_->locally_owned_part();
1023 for(stk::mesh::EntityRank i=stk::topology::NODE_RANK;
1024 i < static_cast<stk::mesh::EntityRank>(entityRankCount); ++i) {
1025 std::vector<stk::mesh::Entity> entities;
1027 stk::mesh::get_selected_entities(ownedPart,
bulkData_->buckets(i),entities);
1030 std::vector<stk::mesh::Entity>::const_iterator itr;
1031 for(itr=entities.begin();itr!=entities.end();++itr) {
1032 stk::mesh::EntityId
id =
bulkData_->identifier(*itr);
1039 stk::all_reduce(mach,stk::ReduceMax<10>(&local[0]));
1040 maxEntityId_.assign(local.begin(),local.begin()+entityRankCount+1);
1046 "STK_Interface::getEntityCounts: Entity counts do not include rank: " << entityRank);
1054 "STK_Interface::getMaxEntityId: Max entity ids do not include rank: " << entityRank);
1061 stk::mesh::PartVector emptyPartVector;
1062 stk::mesh::create_adjacent_entities(*
bulkData_,emptyPartVector);
1084 std::vector<stk::mesh::EntityId> & subcellIds)
const
1087 stk::mesh::Entity cell =
bulkData_->get_entity(elementRank,elementId);
1090 "STK_Interface::getSubcellIndices: could not find element requested (GID = " << elementId <<
")");
1092 const size_t numSubcells =
bulkData_->num_connectivity(cell, static_cast<stk::mesh::EntityRank>(entityRank));
1093 stk::mesh::Entity
const* subcells =
bulkData_->begin(cell, static_cast<stk::mesh::EntityRank>(entityRank));
1095 subcellIds.resize(numSubcells,0);
1098 for(
size_t i = 0; i < numSubcells; ++i) {
1099 stk::mesh::Entity subcell = subcells[i];
1100 subcellIds[i] =
bulkData_->identifier(subcell);
1107 stk::mesh::Selector ownedPart =
metaData_->locally_owned_part();
1111 stk::mesh::get_selected_entities(ownedPart,
bulkData_->buckets(elementRank),elements);
1122 stk::mesh::Selector ownedBlock =
metaData_->locally_owned_part() & (*elementBlock);
1126 stk::mesh::get_selected_entities(ownedBlock,
bulkData_->buckets(elementRank),elements);
1132 stk::mesh::Selector neighborBlock = (!
metaData_->locally_owned_part());
1136 stk::mesh::get_selected_entities(neighborBlock,
bulkData_->buckets(elementRank),elements);
1146 stk::mesh::Selector neighborBlock = (!
metaData_->locally_owned_part()) & (*elementBlock);
1150 stk::mesh::get_selected_entities(neighborBlock,
bulkData_->buckets(elementRank),elements);
1156 stk::mesh::Selector ownedPart =
metaData_->locally_owned_part();
1164 stk::mesh::Part * edgeBlockPart =
getEdgeBlock(edgeBlockName);
1166 "Unknown edge block \"" << edgeBlockName <<
"\"");
1168 stk::mesh::Selector edge_block = *edgeBlockPart;
1169 stk::mesh::Selector owned_block =
metaData_->locally_owned_part() & edge_block;
1175 void STK_Interface::getMyEdges(
const std::string & edgeBlockName,
const std::string & blockName,std::vector<stk::mesh::Entity> & edges)
const
1177 stk::mesh::Part * edgeBlockPart =
getEdgeBlock(edgeBlockName);
1180 "Unknown edge block \"" << edgeBlockName <<
"\"");
1182 "Unknown element block \"" << blockName <<
"\"");
1184 stk::mesh::Selector edge_block = *edgeBlockPart;
1185 stk::mesh::Selector element_block = *elmtPart;
1186 stk::mesh::Selector owned_block =
metaData_->locally_owned_part() & element_block & edge_block;
1194 stk::mesh::Part * edgeBlockPart =
getEdgeBlock(edgeBlockName);
1196 "Unknown edge block \"" << edgeBlockName <<
"\"");
1198 stk::mesh::Selector edge_block = *edgeBlockPart;
1206 stk::mesh::Part * edgeBlockPart =
getEdgeBlock(edgeBlockName);
1209 "Unknown edge block \"" << edgeBlockName <<
"\"");
1211 "Unknown element block \"" << blockName <<
"\"");
1213 stk::mesh::Selector edge_block = *edgeBlockPart;
1214 stk::mesh::Selector element_block = *elmtPart;
1215 stk::mesh::Selector element_edge_block = element_block & edge_block;
1224 stk::mesh::Selector ownedPart =
metaData_->locally_owned_part();
1228 stk::mesh::get_selected_entities(ownedPart,
bulkData_->buckets(faceRank),faces);
1233 stk::mesh::Part * faceBlockPart =
getFaceBlock(faceBlockName);
1235 "Unknown face block \"" << faceBlockName <<
"\"");
1237 stk::mesh::Selector face_block = *faceBlockPart;
1238 stk::mesh::Selector owned_block =
metaData_->locally_owned_part() & face_block;
1244 void STK_Interface::getMyFaces(
const std::string & faceBlockName,
const std::string & blockName,std::vector<stk::mesh::Entity> & faces)
const
1246 stk::mesh::Part * faceBlockPart =
getFaceBlock(faceBlockName);
1249 "Unknown face block \"" << faceBlockName <<
"\"");
1251 "Unknown element block \"" << blockName <<
"\"");
1253 stk::mesh::Selector face_block = *faceBlockPart;
1254 stk::mesh::Selector element_block = *elmtPart;
1255 stk::mesh::Selector owned_block =
metaData_->locally_owned_part() & element_block & face_block;
1263 stk::mesh::Part * faceBlockPart =
getFaceBlock(faceBlockName);
1265 "Unknown face block \"" << faceBlockName <<
"\"");
1267 stk::mesh::Selector face_block = *faceBlockPart;
1275 stk::mesh::Part * faceBlockPart =
getFaceBlock(faceBlockName);
1278 "Unknown face block \"" << faceBlockName <<
"\"");
1280 "Unknown element block \"" << blockName <<
"\"");
1282 stk::mesh::Selector face_block = *faceBlockPart;
1283 stk::mesh::Selector element_block = *elmtPart;
1284 stk::mesh::Selector element_face_block = element_block & face_block;
1292 stk::mesh::Part * sidePart =
getSideset(sideName);
1294 "Unknown side set \"" << sideName <<
"\"");
1296 stk::mesh::Selector side = *sidePart;
1297 stk::mesh::Selector ownedBlock =
metaData_->locally_owned_part() & side;
1305 stk::mesh::Part * sidePart =
getSideset(sideName);
1308 "Unknown side set \"" << sideName <<
"\"");
1310 "Unknown element block \"" << blockName <<
"\"");
1312 stk::mesh::Selector side = *sidePart;
1313 stk::mesh::Selector block = *elmtPart;
1314 stk::mesh::Selector ownedBlock =
metaData_->locally_owned_part() & block & side;
1322 stk::mesh::Part * sidePart =
getSideset(sideName);
1324 "Unknown side set \"" << sideName <<
"\"");
1326 stk::mesh::Selector side = *sidePart;
1334 stk::mesh::Part * sidePart =
getSideset(sideName);
1337 "Unknown side set \"" << sideName <<
"\"");
1339 "Unknown element block \"" << blockName <<
"\"");
1341 stk::mesh::Selector side = *sidePart;
1342 stk::mesh::Selector block = *elmtPart;
1343 stk::mesh::Selector sideBlock = block & side;
1351 stk::mesh::Part * nodePart =
getNodeset(nodesetName);
1354 "Unknown node set \"" << nodesetName <<
"\"");
1356 "Unknown element block \"" << blockName <<
"\"");
1358 stk::mesh::Selector nodeset = *nodePart;
1359 stk::mesh::Selector block = *elmtPart;
1360 stk::mesh::Selector ownedBlock =
metaData_->locally_owned_part() & block & nodeset;
1373 std::map<std::string, stk::mesh::Part*>::const_iterator blkItr;
1375 names.push_back(blkItr->first);
1385 std::map<std::string, stk::mesh::Part*>::const_iterator sideItr;
1387 names.push_back(sideItr->first);
1395 std::map<std::string, stk::mesh::Part*>::const_iterator nodeItr;
1397 names.push_back(nodeItr->first);
1405 std::map<std::string, stk::mesh::Part*>::const_iterator edgeBlockItr;
1407 names.push_back(edgeBlockItr->first);
1415 std::map<std::string, stk::mesh::Part*>::const_iterator faceBlockItr;
1417 names.push_back(faceBlockItr->first);
1433 std::unordered_map<stk::mesh::EntityId,std::size_t>::const_iterator itr =
localIDHash_.find(gid);
1445 std::unordered_map<stk::mesh::EntityId,std::size_t>::const_iterator itr =
localEdgeIDHash_.find(gid);
1459 std::unordered_map<stk::mesh::EntityId,std::size_t>::const_iterator itr =
localEdgeIDHash_.find(gid);
1471 std::unordered_map<stk::mesh::EntityId,std::size_t>::const_iterator itr =
localFaceIDHash_.find(gid);
1485 std::unordered_map<stk::mesh::EntityId,std::size_t>::const_iterator itr =
localFaceIDHash_.find(gid);
1494 if(
bulkData_->bucket(elmt).member(*(eb_pair.second)))
1495 return eb_pair.first;
1500 const std::string & blockId)
const
1503 std::map<std::pair<std::string,std::string>,
SolutionFieldType*>::const_iterator
1508 "Solution field name \"" << fieldName <<
"\" in block ID \"" << blockId <<
"\" was not found");
1510 return iter->second;
1514 const std::string & blockId)
const
1517 std::map<std::pair<std::string,std::string>,
SolutionFieldType*>::const_iterator
1522 "Cell field named \"" << fieldName <<
"\" in block ID \"" << blockId <<
"\" was not found");
1524 return iter->second;
1528 const std::string & blockId)
const
1531 std::map<std::pair<std::string,std::string>,
SolutionFieldType*>::const_iterator
1536 "Edge field named \"" << fieldName <<
"\" in block ID \"" << blockId <<
"\" was not found");
1538 return iter->second;
1542 const std::string & blockId)
const
1545 std::map<std::pair<std::string,std::string>,
SolutionFieldType*>::const_iterator
1550 "Face field named \"" << fieldName <<
"\" in block ID \"" << blockId <<
"\" was not found");
1552 return iter->second;
1572 stk::mesh::Part * block =
metaData_->get_part(name);
1574 block = &
metaData_->declare_part_with_topology(name, stk::mesh::get_topology(shards::CellTopology(ctData),
dimension_));
1600 const std::string & edgeBlockName,
1601 const stk::topology & topology)
1605 stk::mesh::Part * edge_block =
metaData_->get_part(edgeBlockName);
1607 edge_block = &
metaData_->declare_part_with_topology(edgeBlockName, topology);
1613 stk::mesh::Part * elem_block =
metaData_->get_part(elemBlockName);
1614 metaData_->declare_part_subset(*elem_block, *edge_block);
1617 edgeBlocks_.insert(std::make_pair(edgeBlockName,edge_block));
1621 const std::string & edgeBlockName,
1622 const CellTopologyData * ctData)
1628 stk::mesh::get_topology(shards::CellTopology(ctData),
dimension_));
1645 const std::string & faceBlockName,
1646 const stk::topology & topology)
1650 stk::mesh::Part * face_block =
metaData_->get_part(faceBlockName);
1652 face_block = &
metaData_->declare_part_with_topology(faceBlockName, topology);
1658 stk::mesh::Part * elem_block =
metaData_->get_part(elemBlockName);
1659 metaData_->declare_part_subset(*elem_block, *face_block);
1662 faceBlocks_.insert(std::make_pair(faceBlockName,face_block));
1666 const std::string & faceBlockName,
1667 const CellTopologyData * ctData)
1673 stk::mesh::get_topology(shards::CellTopology(ctData),
dimension_));
1707 std::vector<stk::mesh::Entity> elements;
1710 for(std::size_t index=0;index<elements.size();++index) {
1711 stk::mesh::Entity element = elements[index];
1715 procId[0] = Teuchos::as<ProcIdData>(
procRank_);
1728 for(std::size_t index=0;index<elements.size();++index) {
1729 stk::mesh::Entity element = elements[index];
1733 procId[0] = Teuchos::as<ProcIdData>(
procRank_);
1745 std::vector<std::string> names;
1748 for(std::size_t b=0;b<names.size();b++) {
1750 std::map<std::string,double>::const_iterator bw_itr =
blockWeights_.find(names[b]);
1751 double blockWeight = (bw_itr!=
blockWeights_.end()) ? bw_itr->second : 1.0;
1753 std::vector<stk::mesh::Entity> elements;
1756 for(std::size_t index=0;index<elements.size();++index) {
1758 double * loadBal = stk::mesh::field_data(*
loadBalField_,elements[index]);
1759 loadBal[0] = blockWeight;
1771 std::vector<stk::mesh::Entity> edges;
1774 for(std::size_t index=0;index<edges.size();++index) {
1775 stk::mesh::Entity edge = edges[index];
1791 std::vector<stk::mesh::Entity> faces;
1794 for(std::size_t index=0;index<faces.size();++index) {
1795 stk::mesh::Entity face = faces[index];
1806 const std::string & fieldName,
1809 std::map<std::string,std::vector<std::string> >::const_iterator blkItr =
meshCoordFields_.find(eBlock);
1815 for(axis=0;axis<Teuchos::as<int>(blkItr->second.size());axis++) {
1816 if(blkItr->second[axis]==fieldName)
1820 if(axis>=Teuchos::as<int>(blkItr->second.size()))
1831 const std::vector<Teuchos::RCP<const PeriodicBC_MatcherBase> > & matchers =
getPeriodicBCVector();
1833 std::vector<std::vector<std::string> > matchedSides(3);
1836 for(std::size_t m=0;m<matchers.size();m++){
1838 if(matchers[m]->getType() ==
"coord")
1840 else if(matchers[m]->getType() ==
"edge")
1842 else if(matchers[m]->getType() ==
"face")
1846 #ifdef PANZER_HAVE_STKSEARCH
1848 if (useBBoxSearch) {
1849 vec = matchers[m]->getMatchedPair(*
this,matchedSides[type],vec);
1851 vec = matchers[m]->getMatchedPair(*
this,vec);
1855 "panzer::STK_Interface::getPeriodicNodePairing(): Requested bounding box search, but "
1856 "did not compile with STK_SEARCH enabled.");
1857 vec = matchers[m]->getMatchedPair(*
this,vec);
1859 type_vec->insert(type_vec->begin(),vec->size()-type_vec->size(),type);
1860 matchedSides[type].push_back(matchers[m]->getLeftSidesetName());
1863 return std::make_pair(vec,type_vec);
1868 std::map<std::string, stk::mesh::Part*>::const_iterator blkItr =
elementBlocks_.find(blockId);
1875 std::vector<std::string> blockNames, sidesetNames, nodesetNames;
1881 os <<
"STK Mesh data:\n";
1884 os <<
" Entity counts (Nodes, Edges, Cells) = ( "
1889 os <<
" Entity counts (Nodes, Edges, Faces, Cells) = ( "
1895 os <<
" Entity counts (Nodes, Cells) = ( "
1899 os <<
" Element blocks = ";
1900 for(std::size_t i=0;i<blockNames.size();i++)
1901 os <<
"\"" << blockNames[i] <<
"\" ";
1903 os <<
" Sidesets = ";
1904 for(std::size_t i=0;i<sidesetNames.size();i++)
1905 os <<
"\"" << sidesetNames[i] <<
"\" ";
1907 os <<
" Nodesets = ";
1908 for(std::size_t i=0;i<nodesetNames.size();i++)
1909 os <<
"\"" << nodesetNames[i] <<
"\" ";
1913 const std::vector<Teuchos::RCP<const PeriodicBC_MatcherBase> > & bcVector
1915 if(bcVector.size()!=0) {
1916 os <<
" Periodic BCs:\n";
1917 for(std::size_t i=0;i<bcVector.size();i++)
1918 os <<
" " << bcVector[i]->getString() <<
"\n";
1925 std::vector<std::string> blockNames, sidesetNames, nodesetNames;
1931 os <<
"STK Meta data:\n";
1932 os <<
" Element blocks = ";
1933 for(std::size_t i=0;i<blockNames.size();i++)
1934 os <<
"\"" << blockNames[i] <<
"\" ";
1936 os <<
" Sidesets = ";
1937 for(std::size_t i=0;i<sidesetNames.size();i++)
1938 os <<
"\"" << sidesetNames[i] <<
"\" ";
1940 os <<
" Nodesets = ";
1941 for(std::size_t i=0;i<nodesetNames.size();i++)
1942 os <<
"\"" << nodesetNames[i] <<
"\" ";
1946 const std::vector<Teuchos::RCP<const PeriodicBC_MatcherBase> > & bcVector
1948 if(bcVector.size()!=0) {
1949 os <<
" Periodic BCs:\n";
1950 for(std::size_t i=0;i<bcVector.size();i++)
1951 os <<
" " << bcVector[i]->getString() <<
"\n";
1957 const stk::mesh::FieldVector & fv =
metaData_->get_fields();
1958 for(std::size_t i=0;i<fv.size();i++)
1959 os <<
"\"" << fv[i]->name() <<
"\" ";
1965 std::map<std::string, Teuchos::RCP<shards::CellTopology> >::const_iterator itr;
1969 std::stringstream ss;
1972 "STK_Interface::getCellTopology: No such element block \"" +eBlock +
"\" available.\n\n"
1973 <<
"STK Meta Data follows: \n" << ss.str());
1982 const int err = MPI_Comm_dup (parallelMach, &newComm);
1984 "panzer::STK_Interface: MPI_Comm_dup failed with error \""
1985 << Teuchos::mpiErrorCodeToString (err) <<
"\".");
1997 stk::mesh::Selector selector(
getMetaData()->universal_part());
1998 stk::mesh::Selector owned_selector(
getMetaData()->locally_owned_part());
2006 if(params.begin()!=params.end())
2007 graph.
sublist(stk::rebalance::Zoltan::default_parameters_name()) = params;
2026 #ifdef PANZER_HAVE_PERCEPT
2028 "ERROR: Number of levels for uniform refinement must be greater than 0");
2032 refinedMesh_->setCoordinatesField();
2034 percept::UniformRefiner breaker(*refinedMesh_,*breakPattern_);
2035 breaker.setRemoveOldElements(deleteParentElements);
2037 for (
int i=0; i < numberOfLevels; ++i)
2042 "ERROR: Uniform refinement requested. This requires the Percept package to be enabled in Trilinos!");
void initializeFromMetaData()
Teuchos::RCP< ElementDescriptor > buildElementDescriptor(stk::mesh::EntityId elmtId, std::vector< stk::mesh::EntityId > &nodes)
Teuchos::RCP< Teuchos::MpiComm< int > > getSafeCommunicator(stk::ParallelMachine parallelMach) const
void getSidesetNames(std::vector< std::string > &name) const
RCP< const T > getConst() const
std::pair< Teuchos::RCP< std::vector< std::pair< std::size_t, std::size_t > > >, Teuchos::RCP< std::vector< unsigned int > > > getPeriodicNodePairing() const
const bool & useBoundingBoxSearch() const
Teuchos::RCP< std::vector< stk::mesh::Entity > > orderedEdgeVector_
void addNodeset(const std::string &name)
Teuchos::RCP< stk::mesh::BulkData > bulkData_
void getFaceBlockNames(std::vector< std::string > &names) const
void print(std::ostream &os) const
void getMyEdges(std::vector< stk::mesh::Entity > &edges) const
Teuchos::RCP< const std::vector< stk::mesh::Entity > > getElementsOrderedByLID() const
std::vector< stk::mesh::Part * > facesPartVec_
std::map< std::pair< std::string, std::string >, SolutionFieldType * > fieldNameToSolution_
void addEntityToNodeset(stk::mesh::Entity entity, stk::mesh::Part *nodeset)
void addGlobalToExodus(const std::string &key, const int &value)
Add an int global variable to the information to be written to the Exodus output file.
void getElementBlockNames(std::vector< std::string > &names) const
void getSubcellIndices(unsigned entityRank, stk::mesh::EntityId elementId, std::vector< stk::mesh::EntityId > &subcellIds) const
void getElementsSharingNodes(const std::vector< stk::mesh::EntityId > nodeId, std::vector< stk::mesh::Entity > &elements) const
get a set of elements sharing multiple nodes
stk::mesh::Field< double > SolutionFieldType
stk::mesh::Part * getElementBlockPart(const std::string &name) const
get the block part
std::vector< stk::mesh::Part * > edgesPartVec_
bool isFaceLocal(stk::mesh::Entity face) const
std::map< std::string, double > blockWeights_
Teuchos::RCP< const std::vector< stk::mesh::Entity > > getEdgesOrderedByLID() const
VectorFieldType * coordinatesField_
basic_FancyOStream< char > FancyOStream
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
std::size_t getEntityCounts(unsigned entityRank) const
get the global counts for the entity of specified rank
void printMetaData(std::ostream &os) const
void addEntityToSideset(stk::mesh::Entity entity, stk::mesh::Part *sideset)
std::map< std::string, stk::mesh::Part * > faceBlocks_
stk::mesh::Part * nodesPart_
void addSolutionField(const std::string &fieldName, const std::string &blockId)
std::map< std::string, Teuchos::RCP< shards::CellTopology > > elementBlockCT_
void addEntityToFaceBlock(stk::mesh::Entity entity, stk::mesh::Part *faceblock)
stk::mesh::EntityId getMaxEntityId(unsigned entityRank) const
get max entity ID of type entityRank
std::size_t currentLocalId_
std::map< std::pair< std::string, std::string >, SolutionFieldType * > fieldNameToFaceField_
std::map< std::string, stk::mesh::Part * > sidesets_
std::vector< std::size_t > entityCounts_
bool validBlockId(const std::string &blockId) const
stk::mesh::Part * getNodeset(const std::string &name) const
void getEdgeBlockNames(std::vector< std::string > &names) const
stk::mesh::Part * getFaceBlock(const std::string &name) const
get the block part
void addInformationRecords(const std::vector< std::string > &info_records)
void endModification(const bool find_and_set_shared_nodes_in_stk=true)
void getAllFaces(const std::string &faceBlockName, std::vector< stk::mesh::Entity > &faces) const
stk::mesh::Field< double > * getSolutionField(const std::string &fieldName, const std::string &blockId) const
SolutionFieldType * loadBalField_
void addEdgeBlock(const std::string &elemBlockName, const std::string &edgeBlockName, const stk::topology &topology)
const double * getNodeCoordinates(stk::mesh::EntityId nodeId) const
stk::mesh::Part * getSideset(const std::string &name) const
static const std::string nodesString
void instantiateBulkData(stk::ParallelMachine parallelMach)
std::set< std::string > informationRecords_
void getMySides(const std::string &sideName, std::vector< stk::mesh::Entity > &sides) const
stk::mesh::Field< double > * getEdgeField(const std::string &fieldName, const std::string &blockId) const
std::size_t elementLocalId(stk::mesh::Entity elmt) const
unsigned getDimension() const
get the dimension
void addElement(const Teuchos::RCP< ElementDescriptor > &ed, stk::mesh::Part *block)
std::map< std::string, std::vector< std::string > > meshDispFields_
void setupExodusFile(const std::string &filename, const bool append=false, const bool append_after_restart_time=false, const double restart_time=0.0)
Set up an output Exodus file for writing results.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
VectorFieldType * edgesField_
stk::mesh::EntityRank getSideRank() const
void getAllEdges(const std::string &edgeBlockName, std::vector< stk::mesh::Entity > &edges) const
void initialize(stk::ParallelMachine parallelMach, bool setupIO=true, const bool buildRefinementSupport=false)
static const std::string coordsString
Teuchos::RCP< stk::mesh::BulkData > getBulkData() const
std::map< std::string, stk::mesh::Part * > edgeBlocks_
stk::mesh::EntityId elementGlobalId(std::size_t lid) const
std::map< std::string, stk::mesh::Part * > elementBlocks_
std::vector< stk::mesh::Part * > nodesPartVec_
static const std::string edgeBlockString
static const std::string edgesString
basic_FancyOStream & setOutputToRootOnly(const int rootRank)
std::string containingBlockId(stk::mesh::Entity elmt) const
stk::mesh::EntityRank getFaceRank() const
std::size_t edgeLocalId(stk::mesh::Entity elmt) const
void getOwnedElementsSharingNode(stk::mesh::Entity node, std::vector< stk::mesh::Entity > &elements, std::vector< int > &relIds) const
void addNode(stk::mesh::EntityId gid, const std::vector< double > &coord)
void addEntitiesToEdgeBlock(std::vector< stk::mesh::Entity > entities, stk::mesh::Part *edgeblock)
void buildSubcells()
force the mesh to build subcells: edges and faces
Teuchos::RCP< Teuchos::MpiComm< int > > mpiComm_
Teuchos::RCP< stk::mesh::MetaData > metaData_
Teuchos::RCP< stk::mesh::MetaData > getMetaData() const
virtual ~ElementDescriptor()
Teuchos::RCP< std::vector< stk::mesh::Entity > > orderedElementVector_
bool isInitialized() const
Has initialize been called on this mesh object?
void writeToExodus(const std::string &filename, const bool append=false)
Write this mesh and associated fields to the given output file.
void getMyNodes(const std::string &sideName, const std::string &blockName, std::vector< stk::mesh::Entity > &nodes) const
bool nonnull(const boost::shared_ptr< T > &p)
void addEdgeField(const std::string &fieldName, const std::string &blockId)
void addMeshCoordFields(const std::string &blockId, const std::vector< std::string > &coordField, const std::string &dispPrefix)
void applyElementLoadBalanceWeights()
stk::mesh::Entity findConnectivityById(stk::mesh::Entity src, stk::mesh::EntityRank tgt_rank, unsigned rel_id) const
bool isMeshCoordField(const std::string &eBlock, const std::string &fieldName, int &axis) const
void getAllSides(const std::string &sideName, std::vector< stk::mesh::Entity > &sides) const
void addSideset(const std::string &name, const CellTopologyData *ctData)
static const std::string faceBlockString
std::unordered_map< stk::mesh::EntityId, std::size_t > localFaceIDHash_
void addEntityToEdgeBlock(stk::mesh::Entity entity, stk::mesh::Part *edgeblock)
std::map< std::pair< std::string, std::string >, SolutionFieldType * > fieldNameToEdgeField_
stk::mesh::Part * getEdgeBlock(const std::string &name) const
get the block part
std::unordered_map< stk::mesh::EntityId, std::size_t > localEdgeIDHash_
PHX::MDField< ScalarT, panzer::Cell, panzer::BASIS > field
A field to which we'll contribute, or in which we'll store, the result of computing this integral...
void rebalance(const Teuchos::ParameterList ¶ms)
std::map< std::string, std::vector< std::string > > meshCoordFields_
stk::mesh::EntityRank getEdgeRank() const
static const std::string facesString
void addEntitiesToFaceBlock(std::vector< stk::mesh::Entity > entities, stk::mesh::Part *faceblock)
Teuchos::RCP< const Teuchos::Comm< int > > getComm() const
get the comm associated with this mesh
void initializeFieldsInSTK(const std::map< std::pair< std::string, std::string >, SolutionFieldType * > &nameToField, bool setupIO)
const std::vector< Teuchos::RCP< const PeriodicBC_MatcherBase > > & getPeriodicBCVector() const
void refineMesh(const int numberOfLevels, const bool deleteParentElements)
stk::mesh::Field< double > * getFaceField(const std::string &fieldName, const std::string &blockId) const
void buildLocalElementIDs()
std::size_t faceLocalId(stk::mesh::Entity elmt) const
bool isModifiable() const
void addFaceBlock(const std::string &elemBlockName, const std::string &faceBlockName, const stk::topology &topology)
Teuchos::RCP< std::vector< stk::mesh::Entity > > orderedFaceVector_
std::unordered_map< stk::mesh::EntityId, std::size_t > localIDHash_
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
std::vector< stk::mesh::EntityId > maxEntityId_
void getElementsSharingNode(stk::mesh::EntityId nodeId, std::vector< stk::mesh::Entity > &elements) const
get a set of elements sharing a single node
void addFaceField(const std::string &fieldName, const std::string &blockId)
void getMyElements(std::vector< stk::mesh::Entity > &elements) const
#define TEUCHOS_ASSERT(assertion_test)
stk::mesh::EntityRank getNodeRank() const
void getMyFaces(std::vector< stk::mesh::Entity > &faces) const
void addCellField(const std::string &fieldName, const std::string &blockId)
void getNodeIdsForElement(stk::mesh::Entity element, std::vector< stk::mesh::EntityId > &nodeIds) const
get a list of node ids for nodes connected to an element
Teuchos::RCP< const std::vector< stk::mesh::Entity > > getFacesOrderedByLID() const
stk::mesh::Part * edgesPart_
stk::mesh::EntityRank getElementRank() const
stk::mesh::Part * facesPart_
ProcIdFieldType * processorIdField_
void addElementBlock(const std::string &name, const CellTopologyData *ctData)
stk::mesh::Field< double > * getCellField(const std::string &fieldName, const std::string &blockId) const
const VectorFieldType & getCoordinatesField() const
bool isEdgeLocal(stk::mesh::Entity edge) const
void getNeighborElements(std::vector< stk::mesh::Entity > &elements) const
void getNodesetNames(std::vector< std::string > &name) const
Teuchos::RCP< const shards::CellTopology > getCellTopology(const std::string &eBlock) const
std::map< std::pair< std::string, std::string >, SolutionFieldType * > fieldNameToCellField_
std::map< std::string, stk::mesh::Part * > nodesets_
VectorFieldType * facesField_