43 #include <PanzerAdaptersSTK_config.hpp> 46 #include <Teuchos_as.hpp> 50 #include <stk_mesh/base/FieldBase.hpp> 51 #include <stk_mesh/base/Comm.hpp> 52 #include <stk_mesh/base/Selector.hpp> 53 #include <stk_mesh/base/GetEntities.hpp> 54 #include <stk_mesh/base/GetBuckets.hpp> 55 #include <stk_mesh/base/CreateAdjacentEntities.hpp> 62 #include <stk_util/parallel/ParallelReduce.hpp> 63 #include <stk_util/parallel/CommSparse.hpp> 65 #ifdef PANZER_HAVE_IOSS 66 #include <Ionit_Initializer.h> 67 #include <stk_io/IossBridge.hpp> 68 #include <stk_io/WriteMesh.hpp> 71 #ifdef PANZER_HAVE_PERCEPT 72 #include <percept/PerceptMesh.hpp> 73 #include <adapt/UniformRefinerPattern.hpp> 74 #include <adapt/UniformRefiner.hpp> 88 : gid_(gid), nodes_(nodes) {}
93 Teuchos::RCP<ElementDescriptor>
107 : dimension_(0), initialized_(false), currentLocalId_(0), initialStateTime_(0.0), currentStateTime_(0.0), useFieldCoordinates_(false)
109 metaData_ = rcp(
new stk::mesh::MetaData());
113 : dimension_(0), initialized_(false), currentLocalId_(0), initialStateTime_(0.0), currentStateTime_(0.0), useFieldCoordinates_(false)
119 : dimension_(dim), initialized_(false), currentLocalId_(0), useFieldCoordinates_(false)
121 std::vector<std::string> entity_rank_names = stk::mesh::entity_rank_names();
122 entity_rank_names.push_back(
"FAMILY_TREE");
134 stk::mesh::Part * sideset =
metaData_->get_part(name);
136 sideset = &
metaData_->declare_part_with_topology(name,
137 stk::mesh::get_topology(shards::CellTopology(ctData),
dimension_));
138 sidesets_.insert(std::make_pair(name,sideset));
146 stk::mesh::Part * nodeset =
metaData_->get_part(name);
147 if(nodeset==
nullptr) {
148 const CellTopologyData * ctData = shards::getCellTopologyData<shards::Node>();
149 nodeset = &
metaData_->declare_part_with_topology(name,
150 stk::mesh::get_topology(shards::CellTopology(ctData),
dimension_));
152 nodesets_.insert(std::make_pair(name,nodeset));
158 "Unknown element block \"" << blockId <<
"\"");
159 std::pair<std::string,std::string> key = std::make_pair(fieldName,blockId);
168 stk::mesh::FieldTraits<SolutionFieldType>::data_type* init_sol =
nullptr;
169 stk::mesh::put_field_on_mesh(*
field,
metaData_->universal_part(),init_sol );
178 "Unknown element block \"" << blockId <<
"\"");
179 std::pair<std::string,std::string> key = std::make_pair(fieldName,blockId);
189 stk::mesh::FieldTraits<SolutionFieldType>::data_type* init_sol =
nullptr;
190 stk::mesh::put_field_on_mesh(*
field,
metaData_->universal_part(),init_sol );
199 "Unknown element block \"" << blockId <<
"\"");
200 std::pair<std::string,std::string> key = std::make_pair(fieldName,blockId);
211 stk::mesh::FieldTraits<SolutionFieldType>::data_type* init_sol =
nullptr;
212 stk::mesh::put_field_on_mesh(*
field,
metaData_->universal_part(),init_sol );
221 "Unknown element block \"" << blockId <<
"\"");
222 std::pair<std::string,std::string> key = std::make_pair(fieldName,blockId);
233 stk::mesh::FieldTraits<SolutionFieldType>::data_type* init_sol =
nullptr;
234 stk::mesh::put_field_on_mesh(*
field,
metaData_->universal_part(),init_sol );
241 const std::vector<std::string> & coordNames,
242 const std::string & dispPrefix)
245 TEUCHOS_ASSERT(
dimension_==coordNames.size());
248 "Unknown element block \"" << blockId <<
"\"");
252 "STK_Interface::addMeshCoordFields: Can't set more than one set of coordinate " 253 "fields for element block \""+blockId+
"\".");
266 std::pair<std::string,std::string> key = std::make_pair(coordNames[i],blockId);
267 std::string dispName = dispPrefix+coordNames[i];
269 dispFields[i] = dispName;
290 const bool buildRefinementSupport)
301 stk::mesh::FieldTraits<VectorFieldType>::data_type* init_vf =
nullptr;
302 stk::mesh::FieldTraits<ProcIdFieldType>::data_type* init_pid =
nullptr;
303 stk::mesh::FieldTraits<SolutionFieldType>::data_type* init_sol =
nullptr;
316 #ifdef PANZER_HAVE_IOSS 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);
331 std::map<std::string, stk::mesh::Part*>::iterator itr;
333 if(!stk::io::is_part_edge_block_io_part(*itr->second)) {
334 stk::io::put_edge_block_io_part_attribute(*itr->second);
340 std::map<std::string, stk::mesh::Part*>::iterator itr;
342 if(!stk::io::is_part_face_block_io_part(*itr->second)) {
343 stk::io::put_face_block_io_part_attribute(*itr->second);
349 std::map<std::string, stk::mesh::Part*>::iterator itr;
351 if(!stk::io::is_part_io_part(*itr->second))
352 stk::io::put_io_part_attribute(*itr->second);
357 std::map<std::string, stk::mesh::Part*>::iterator itr;
359 if(!stk::io::is_part_io_part(*itr->second))
360 stk::io::put_io_part_attribute(*itr->second);
368 stk::io::set_field_role(*
edgesField_, Ioss::Field::MESH);
370 stk::io::set_field_role(*
facesField_, Ioss::Field::MESH);
376 if (buildRefinementSupport) {
377 #ifdef PANZER_HAVE_PERCEPT 378 refinedMesh_ = Teuchos::rcp(
new percept::PerceptMesh(this->
getMetaData().
get(),
382 breakPattern_ = Teuchos::rcp(
new percept::URP_Heterogeneous_3D(*refinedMesh_));
384 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
385 "ERROR: Uniform refinement requested. This requires the Percept package to be enabled in Trilinos!");
400 std::set<SolutionFieldType*> uniqueFields;
401 std::map<std::pair<std::string,std::string>,
SolutionFieldType*>::const_iterator fieldIter;
402 for(fieldIter=nameToField.begin();fieldIter!=nameToField.end();++fieldIter)
403 uniqueFields.insert(fieldIter->second);
406 std::set<SolutionFieldType*>::const_iterator uniqueFieldIter;
407 stk::mesh::FieldTraits<SolutionFieldType>::data_type* init_sol =
nullptr;
408 for(uniqueFieldIter=uniqueFields.begin();uniqueFieldIter!=uniqueFields.end();++uniqueFieldIter)
409 stk::mesh::put_field_on_mesh(*(*uniqueFieldIter),
metaData_->universal_part(),init_sol);
412 #ifdef PANZER_HAVE_IOSS 415 std::set<SolutionFieldType*>::const_iterator uniqueFieldIter;
416 for(uniqueFieldIter=uniqueFields.begin();uniqueFieldIter!=uniqueFields.end();++uniqueFieldIter)
417 stk::io::set_field_role(*(*uniqueFieldIter), Ioss::Field::TRANSIENT);
424 TEUCHOS_ASSERT(
bulkData_==Teuchos::null);
433 TEUCHOS_TEST_FOR_EXCEPTION(
bulkData_==Teuchos::null,std::logic_error,
434 "STK_Interface: Must call \"initialized\" or \"instantiateBulkData\" before \"beginModification\"");
441 TEUCHOS_TEST_FOR_EXCEPTION(
bulkData_==Teuchos::null,std::logic_error,
442 "STK_Interface: Must call \"initialized\" or \"instantiateBulkData\" before \"endModification\"");
449 stk::CommSparse comm(
bulkData_->parallel());
451 for (
int phase=0;phase<2;++phase) {
452 for (
int i=0;i<
bulkData_->parallel_size();++i) {
454 const stk::mesh::BucketVector& buckets =
bulkData_->buckets(stk::topology::NODE_RANK);
455 for (
size_t j=0;j<buckets.size();++j) {
456 const stk::mesh::Bucket& bucket = *buckets[j];
457 if ( bucket.owned() ) {
458 for (
size_t k=0;k<bucket.size();++k) {
459 stk::mesh::EntityKey key =
bulkData_->entity_key(bucket[k]);
460 comm.send_buffer(i).pack<stk::mesh::EntityKey>(key);
468 comm.allocate_buffers();
475 for (
int i=0;i<
bulkData_->parallel_size();++i) {
477 while(comm.recv_buffer(i).remaining()) {
478 stk::mesh::EntityKey key;
479 comm.recv_buffer(i).unpack<stk::mesh::EntityKey>(key);
480 stk::mesh::Entity node =
bulkData_->get_entity(key);
497 TEUCHOS_TEST_FOR_EXCEPTION(not
isModifiable(),std::logic_error,
498 "STK_Interface::addNode: STK_Interface must be modifiable to add a node");
499 TEUCHOS_TEST_FOR_EXCEPTION(coord.size()!=
getDimension(),std::logic_error,
500 "STK_Interface::addNode: number of coordinates in vector must mation dimension");
501 TEUCHOS_TEST_FOR_EXCEPTION(gid==0,std::logic_error,
502 "STK_Interface::addNode: STK has STUPID restriction of no zero GIDs, pick something else");
509 for(std::size_t i=0;i<coord.size();++i)
510 fieldCoords[i] = coord[i];
515 std::vector<stk::mesh::Part*> sidesetV;
516 sidesetV.push_back(sideset);
518 bulkData_->change_entity_parts(entity,sidesetV);
523 std::vector<stk::mesh::Part*> nodesetV;
524 nodesetV.push_back(nodeset);
526 bulkData_->change_entity_parts(entity,nodesetV);
531 std::vector<stk::mesh::Part*> edgeblockV;
532 edgeblockV.push_back(edgeblock);
534 bulkData_->change_entity_parts(entity,edgeblockV);
538 std::vector<stk::mesh::Part*> edgeblockV;
539 edgeblockV.push_back(edgeblock);
541 bulkData_->change_entity_parts(entities,edgeblockV);
546 std::vector<stk::mesh::Part*> faceblockV;
547 faceblockV.push_back(faceblock);
549 bulkData_->change_entity_parts(entity,faceblockV);
553 std::vector<stk::mesh::Part*> faceblockV;
554 faceblockV.push_back(faceblock);
556 bulkData_->change_entity_parts(entities,faceblockV);
561 std::vector<stk::mesh::Part*> blockVec;
562 blockVec.push_back(block);
566 stk::mesh::Entity element =
bulkData_->declare_entity(elementRank,ed->getGID(),blockVec);
569 const std::vector<stk::mesh::EntityId> & nodes = ed->getNodes();
570 for(std::size_t i=0;i<nodes.size();++i) {
572 stk::mesh::Entity node =
bulkData_->get_entity(nodeRank,nodes[i]);
573 TEUCHOS_ASSERT(
bulkData_->is_valid(node));
574 bulkData_->declare_relation(element,node,i);
578 procId[0] = Teuchos::as<ProcIdData>(
procRank_);
586 std::vector<stk::mesh::Entity> localElmts;
588 std::vector<stk::mesh::Entity>::const_iterator itr;
589 for(itr=localElmts.begin();itr!=localElmts.end();++itr) {
590 stk::mesh::Entity element = (*itr);
591 stk::mesh::EntityId gid =
bulkData_->identifier(element);
592 std::vector<stk::mesh::EntityId> subcellIds;
595 for(std::size_t i=0;i<subcellIds.size();++i) {
596 stk::mesh::Entity edge =
bulkData_->get_entity(edgeRank,subcellIds[i]);
597 stk::mesh::Entity
const* relations =
bulkData_->begin_nodes(edge);
603 double * edgeCoords = stk::mesh::field_data(*
edgesField_,edge);
605 edgeCoords[j] = (node_coord_1[j]+node_coord_2[j])/2.0;
614 std::vector<stk::mesh::Entity> localElmts;
616 std::vector<stk::mesh::Entity>::const_iterator itr;
617 for(itr=localElmts.begin();itr!=localElmts.end();++itr) {
618 stk::mesh::Entity element = (*itr);
620 std::vector<stk::mesh::EntityId> subcellIds;
623 for(std::size_t i=0;i<subcellIds.size();++i) {
624 stk::mesh::Entity face =
bulkData_->get_entity(faceRank,subcellIds[i]);
625 stk::mesh::Entity
const* relations =
bulkData_->begin_nodes(face);
626 const size_t num_relations =
bulkData_->num_nodes(face);
629 double * faceCoords = stk::mesh::field_data(*
facesField_,face);
632 for(std::size_t k=0;k<num_relations;++k)
634 faceCoords[j] /= double(num_relations);
642 const size_t num_rels =
bulkData_->num_connectivity(src, tgt_rank);
643 stk::mesh::Entity
const* relations =
bulkData_->begin(src, tgt_rank);
644 stk::mesh::ConnectivityOrdinal
const* ordinals =
bulkData_->begin_ordinals(src, tgt_rank);
645 for (
size_t i = 0; i < num_rels; ++i) {
646 if (ordinals[i] == static_cast<stk::mesh::ConnectivityOrdinal>(rel_id)) {
651 return stk::mesh::Entity();
677 const bool append_after_restart_time,
678 const double restart_time)
680 using std::runtime_error;
681 using stk::io::StkMeshIoBroker;
682 using stk::mesh::FieldVector;
683 using stk::ParallelMachine;
685 PANZER_FUNC_TIME_MONITOR(
"STK_Interface::setupExodusFile(filename)");
686 #ifdef PANZER_HAVE_IOSS 687 TEUCHOS_ASSERT(not
mpiComm_.is_null())
689 ParallelMachine comm = *
mpiComm_->getRawMpiComm();
690 meshData_ = rcp(
new StkMeshIoBroker(comm));
692 Ioss::PropertyManager props;
693 props.add(Ioss::Property(
"LOWER_CASE_VARIABLE_NAMES",
"FALSE"));
695 if (append_after_restart_time) {
696 meshIndex_ = meshData_->create_output_mesh(filename, stk::io::APPEND_RESULTS,
697 props, restart_time);
700 meshIndex_ = meshData_->create_output_mesh(filename, stk::io::APPEND_RESULTS, props);
703 meshIndex_ = meshData_->create_output_mesh(filename, stk::io::WRITE_RESULTS, props);
704 const FieldVector& fields =
metaData_->get_fields();
705 for (
size_t i(0); i < fields.size(); ++i) {
711 auto role = stk::io::get_field_role(*fields[i]);
712 if (role !=
nullptr) {
713 if (*role != Ioss::Field::MESH)
714 meshData_->add_field(meshIndex_, *fields[i]);
716 meshData_->add_field(meshIndex_, *fields[i]);
722 meshData_->add_info_records(meshIndex_, deduped_info_records);
724 TEUCHOS_ASSERT(
false)
740 using Teuchos::FancyOStream;
741 using Teuchos::rcpFromRef;
742 PANZER_FUNC_TIME_MONITOR(
"STK_Interface::writeToExodus(timestep)");
743 #ifdef PANZER_HAVE_IOSS 744 if (not meshData_.is_null())
747 globalToExodus(GlobalVariable::ADD);
749 meshData_->write_defined_output_fields(meshIndex_);
750 globalToExodus(GlobalVariable::WRITE);
751 meshData_->end_output_step(meshIndex_);
755 FancyOStream out(rcpFromRef(cout));
756 out.setOutputToRootOnly(0);
757 out <<
"WARNING: Exodus I/O has been disabled or not setup properly; " 758 <<
"not writing to Exodus." << endl;
761 TEUCHOS_ASSERT(
false);
773 const GlobalVariable& flag)
775 using std::invalid_argument;
777 using Teuchos::Array;
782 for (
auto i = globalData_.begin(); i != globalData_.end(); ++i)
784 const string& name = globalData_.name(i);
787 if (globalData_.isType<
int>(name))
789 const auto& value = globalData_.get<
int>(name);
790 if (flag == GlobalVariable::ADD)
794 meshData_->add_global(meshIndex_, name, value,
795 stk::util::ParameterType::INTEGER);
803 meshData_->write_global(meshIndex_, name, value,
804 stk::util::ParameterType::INTEGER);
808 else if (globalData_.isType<
double>(name))
810 const auto& value = globalData_.get<
double>(name);
811 if (flag == GlobalVariable::ADD)
815 meshData_->add_global(meshIndex_, name, value,
816 stk::util::ParameterType::DOUBLE);
824 meshData_->write_global(meshIndex_, name, value,
825 stk::util::ParameterType::DOUBLE);
829 else if (globalData_.isType<Array<int>>(name))
831 const auto& value = globalData_.get<Array<int>>(name).toVector();
832 if (flag == GlobalVariable::ADD)
836 meshData_->add_global(meshIndex_, name, value,
837 stk::util::ParameterType::INTEGERVECTOR);
845 meshData_->write_global(meshIndex_, name, value,
846 stk::util::ParameterType::INTEGERVECTOR);
850 else if (globalData_.isType<Array<double>>(name))
852 const auto& value = globalData_.get<Array<double>>(name).toVector();
853 if (flag == GlobalVariable::ADD)
857 meshData_->add_global(meshIndex_, name, value,
858 stk::util::ParameterType::DOUBLEVECTOR);
866 meshData_->write_global(meshIndex_, name, value,
867 stk::util::ParameterType::DOUBLEVECTOR);
872 TEUCHOS_TEST_FOR_EXCEPTION(
true, invalid_argument,
873 "STK_Interface::globalToExodus(): The global variable to be added " \
874 "to the Exodus output file is of an invalid type. Valid types are " \
875 "int and double, along with std::vectors of those types.")
887 const std::string& key,
890 globalData_.set(key, value);
901 const std::string& key,
904 globalData_.set(key, value);
915 const std::string& key,
916 const std::vector<int>& value)
918 using Teuchos::Array;
919 globalData_.set(key, Array<int>(value));
930 const std::string& key,
931 const std::vector<double>& value)
933 using Teuchos::Array;
934 globalData_.set(key, Array<double>(value));
939 #ifdef PANZER_HAVE_IOSS 951 stk::mesh::Entity node =
bulkData_->get_entity(nodeRank,nodeId);
952 const size_t numElements =
bulkData_->num_elements(node);
953 stk::mesh::Entity
const* relations =
bulkData_->begin_elements(node);
956 elements.insert(elements.end(), relations, relations + numElements);
960 std::vector<int> & relIds)
const 963 const size_t numElements =
bulkData_->num_elements(node);
964 stk::mesh::Entity
const* relations =
bulkData_->begin_elements(node);
965 stk::mesh::ConnectivityOrdinal
const* rel_ids =
bulkData_->begin_element_ordinals(node);
968 for (
size_t i = 0; i < numElements; ++i) {
969 stk::mesh::Entity element = relations[i];
973 elements.push_back(element);
974 relIds.push_back(rel_ids[i]);
980 std::vector<int> & relIds,
unsigned int matchType)
const 982 stk::mesh::EntityRank rank;
985 else if(matchType == 1)
987 else if(matchType == 2)
990 TEUCHOS_ASSERT(
false);
992 stk::mesh::Entity node =
bulkData_->get_entity(rank,nodeId);
999 std::vector<stk::mesh::Entity> current;
1002 std::sort(current.begin(),current.end());
1005 for(std::size_t n=1;n<nodeIds.size();++n) {
1007 std::vector<stk::mesh::Entity> nextNode;
1009 std::sort(nextNode.begin(),nextNode.end());
1012 std::vector<stk::mesh::Entity> intersection(std::min(nextNode.size(),current.size()));
1013 std::vector<stk::mesh::Entity>::const_iterator endItr
1014 = std::set_intersection(current.begin(),current.end(),
1015 nextNode.begin(),nextNode.end(),
1016 intersection.begin());
1017 std::size_t newLength = endItr-intersection.begin();
1018 intersection.resize(newLength);
1022 current = intersection;
1031 stk::mesh::Entity
const* nodeRel =
getBulkData()->begin_nodes(element);
1032 const size_t numNodes =
getBulkData()->num_nodes(element);
1034 nodeIds.reserve(numNodes);
1035 for(
size_t i = 0; i < numNodes; ++i) {
1050 const auto entityRankCount =
metaData_->entity_rank_count();
1051 const size_t commCount = 10;
1053 TEUCHOS_ASSERT(entityRankCount<10);
1056 stk::ParallelMachine mach = *
mpiComm_->getRawMpiComm();
1058 std::vector<stk::mesh::EntityId> local(commCount,0);
1061 stk::mesh::Selector ownedPart =
metaData_->locally_owned_part();
1062 for(stk::mesh::EntityRank i=stk::topology::NODE_RANK;
1063 i < static_cast<stk::mesh::EntityRank>(entityRankCount); ++i) {
1064 std::vector<stk::mesh::Entity> entities;
1066 stk::mesh::get_selected_entities(ownedPart,
bulkData_->buckets(i),entities);
1069 std::vector<stk::mesh::Entity>::const_iterator itr;
1070 for(itr=entities.begin();itr!=entities.end();++itr) {
1071 stk::mesh::EntityId
id =
bulkData_->identifier(*itr);
1078 stk::all_reduce(mach,stk::ReduceMax<10>(&local[0]));
1079 maxEntityId_.assign(local.begin(),local.begin()+entityRankCount+1);
1084 TEUCHOS_TEST_FOR_EXCEPTION(entityRank>=
entityCounts_.size(),std::logic_error,
1085 "STK_Interface::getEntityCounts: Entity counts do not include rank: " << entityRank);
1092 TEUCHOS_TEST_FOR_EXCEPTION(entityRank>=
maxEntityId_.size(),std::logic_error,
1093 "STK_Interface::getMaxEntityId: Max entity ids do not include rank: " << entityRank);
1100 stk::mesh::PartVector emptyPartVector;
1101 stk::mesh::create_adjacent_entities(*
bulkData_,emptyPartVector);
1123 std::vector<stk::mesh::EntityId> & subcellIds)
const 1126 stk::mesh::Entity cell =
bulkData_->get_entity(elementRank,elementId);
1128 TEUCHOS_TEST_FOR_EXCEPTION(!
bulkData_->is_valid(cell),std::logic_error,
1129 "STK_Interface::getSubcellIndices: could not find element requested (GID = " << elementId <<
")");
1131 const size_t numSubcells =
bulkData_->num_connectivity(cell, static_cast<stk::mesh::EntityRank>(entityRank));
1132 stk::mesh::Entity
const* subcells =
bulkData_->begin(cell, static_cast<stk::mesh::EntityRank>(entityRank));
1134 subcellIds.resize(numSubcells,0);
1137 for(
size_t i = 0; i < numSubcells; ++i) {
1138 stk::mesh::Entity subcell = subcells[i];
1139 subcellIds[i] =
bulkData_->identifier(subcell);
1146 stk::mesh::Selector ownedPart =
metaData_->locally_owned_part();
1150 stk::mesh::get_selected_entities(ownedPart,
bulkData_->buckets(elementRank),elements);
1157 TEUCHOS_TEST_FOR_EXCEPTION(elementBlock==0,std::logic_error,
"Could not find element block \"" << blockID <<
"\"");
1161 stk::mesh::Selector ownedBlock =
metaData_->locally_owned_part() & (*elementBlock);
1165 stk::mesh::get_selected_entities(ownedBlock,
bulkData_->buckets(elementRank),elements);
1171 stk::mesh::Selector neighborBlock = (!
metaData_->locally_owned_part());
1175 stk::mesh::get_selected_entities(neighborBlock,
bulkData_->buckets(elementRank),elements);
1182 TEUCHOS_TEST_FOR_EXCEPTION(elementBlock==0,std::logic_error,
"Could not find element block \"" << blockID <<
"\"");
1185 stk::mesh::Selector neighborBlock = (!
metaData_->locally_owned_part()) & (*elementBlock);
1189 stk::mesh::get_selected_entities(neighborBlock,
bulkData_->buckets(elementRank),elements);
1195 stk::mesh::Selector ownedPart =
metaData_->locally_owned_part();
1199 stk::mesh::get_selected_entities(ownedPart,
bulkData_->buckets(edgeRank),edges);
1204 stk::mesh::Part * edgeBlockPart =
getEdgeBlock(edgeBlockName);
1205 TEUCHOS_TEST_FOR_EXCEPTION(edgeBlockPart==0,std::logic_error,
1206 "Unknown edge block \"" << edgeBlockName <<
"\"");
1208 stk::mesh::Selector edge_block = *edgeBlockPart;
1209 stk::mesh::Selector owned_block =
metaData_->locally_owned_part() & edge_block;
1215 void STK_Interface::getMyEdges(
const std::string & edgeBlockName,
const std::string & blockName,std::vector<stk::mesh::Entity> & edges)
const 1217 stk::mesh::Part * edgeBlockPart =
getEdgeBlock(edgeBlockName);
1220 "Unknown edge block \"" << edgeBlockName <<
"\"");
1222 "Unknown element block \"" << blockName <<
"\"");
1224 stk::mesh::Selector edge_block = *edgeBlockPart;
1225 stk::mesh::Selector element_block = *elmtPart;
1226 stk::mesh::Selector owned_block =
metaData_->locally_owned_part() & element_block & edge_block;
1234 stk::mesh::Part * edgeBlockPart =
getEdgeBlock(edgeBlockName);
1235 TEUCHOS_TEST_FOR_EXCEPTION(edgeBlockPart==0,std::logic_error,
1236 "Unknown edge block \"" << edgeBlockName <<
"\"");
1238 stk::mesh::Selector edge_block = *edgeBlockPart;
1246 stk::mesh::Part * edgeBlockPart =
getEdgeBlock(edgeBlockName);
1249 "Unknown edge block \"" << edgeBlockName <<
"\"");
1251 "Unknown element block \"" << blockName <<
"\"");
1253 stk::mesh::Selector edge_block = *edgeBlockPart;
1254 stk::mesh::Selector element_block = *elmtPart;
1255 stk::mesh::Selector element_edge_block = element_block & edge_block;
1264 stk::mesh::Selector ownedPart =
metaData_->locally_owned_part();
1268 stk::mesh::get_selected_entities(ownedPart,
bulkData_->buckets(faceRank),faces);
1273 stk::mesh::Part * faceBlockPart =
getFaceBlock(faceBlockName);
1274 TEUCHOS_TEST_FOR_EXCEPTION(faceBlockPart==0,std::logic_error,
1275 "Unknown face block \"" << faceBlockName <<
"\"");
1277 stk::mesh::Selector face_block = *faceBlockPart;
1278 stk::mesh::Selector owned_block =
metaData_->locally_owned_part() & face_block;
1284 void STK_Interface::getMyFaces(
const std::string & faceBlockName,
const std::string & blockName,std::vector<stk::mesh::Entity> & faces)
const 1286 stk::mesh::Part * faceBlockPart =
getFaceBlock(faceBlockName);
1289 "Unknown face block \"" << faceBlockName <<
"\"");
1291 "Unknown element block \"" << blockName <<
"\"");
1293 stk::mesh::Selector face_block = *faceBlockPart;
1294 stk::mesh::Selector element_block = *elmtPart;
1295 stk::mesh::Selector owned_block =
metaData_->locally_owned_part() & element_block & face_block;
1303 stk::mesh::Part * faceBlockPart =
getFaceBlock(faceBlockName);
1304 TEUCHOS_TEST_FOR_EXCEPTION(faceBlockPart==0,std::logic_error,
1305 "Unknown face block \"" << faceBlockName <<
"\"");
1307 stk::mesh::Selector face_block = *faceBlockPart;
1315 stk::mesh::Part * faceBlockPart =
getFaceBlock(faceBlockName);
1318 "Unknown face block \"" << faceBlockName <<
"\"");
1320 "Unknown element block \"" << blockName <<
"\"");
1322 stk::mesh::Selector face_block = *faceBlockPart;
1323 stk::mesh::Selector element_block = *elmtPart;
1324 stk::mesh::Selector element_face_block = element_block & face_block;
1332 stk::mesh::Part * sidePart =
getSideset(sideName);
1333 TEUCHOS_TEST_FOR_EXCEPTION(sidePart==0,std::logic_error,
1334 "Unknown side set \"" << sideName <<
"\"");
1336 stk::mesh::Selector side = *sidePart;
1337 stk::mesh::Selector ownedBlock =
metaData_->locally_owned_part() & side;
1345 stk::mesh::Part * sidePart =
getSideset(sideName);
1348 "Unknown side set \"" << sideName <<
"\"");
1350 "Unknown element block \"" << blockName <<
"\"");
1352 stk::mesh::Selector side = *sidePart;
1353 stk::mesh::Selector block = *elmtPart;
1354 stk::mesh::Selector ownedBlock =
metaData_->locally_owned_part() & block & side;
1362 stk::mesh::Part * sidePart =
getSideset(sideName);
1363 TEUCHOS_TEST_FOR_EXCEPTION(sidePart==0,std::logic_error,
1364 "Unknown side set \"" << sideName <<
"\"");
1366 stk::mesh::Selector side = *sidePart;
1374 stk::mesh::Part * sidePart =
getSideset(sideName);
1377 "Unknown side set \"" << sideName <<
"\"");
1379 "Unknown element block \"" << blockName <<
"\"");
1381 stk::mesh::Selector side = *sidePart;
1382 stk::mesh::Selector block = *elmtPart;
1383 stk::mesh::Selector sideBlock = block & side;
1391 stk::mesh::Part * nodePart =
getNodeset(nodesetName);
1394 "Unknown node set \"" << nodesetName <<
"\"");
1396 "Unknown element block \"" << blockName <<
"\"");
1398 stk::mesh::Selector nodeset = *nodePart;
1399 stk::mesh::Selector block = *elmtPart;
1400 stk::mesh::Selector ownedBlock =
metaData_->locally_owned_part() & block & nodeset;
1413 std::map<std::string, stk::mesh::Part*>::const_iterator blkItr;
1415 names.push_back(blkItr->first);
1425 std::map<std::string, stk::mesh::Part*>::const_iterator sideItr;
1427 names.push_back(sideItr->first);
1435 std::map<std::string, stk::mesh::Part*>::const_iterator nodeItr;
1437 names.push_back(nodeItr->first);
1445 std::map<std::string, stk::mesh::Part*>::const_iterator edgeBlockItr;
1447 names.push_back(edgeBlockItr->first);
1455 std::map<std::string, stk::mesh::Part*>::const_iterator faceBlockItr;
1457 names.push_back(faceBlockItr->first);
1473 std::unordered_map<stk::mesh::EntityId,std::size_t>::const_iterator itr =
localIDHash_.find(gid);
1485 std::unordered_map<stk::mesh::EntityId,std::size_t>::const_iterator itr =
localEdgeIDHash_.find(gid);
1499 std::unordered_map<stk::mesh::EntityId,std::size_t>::const_iterator itr =
localEdgeIDHash_.find(gid);
1511 std::unordered_map<stk::mesh::EntityId,std::size_t>::const_iterator itr =
localFaceIDHash_.find(gid);
1525 std::unordered_map<stk::mesh::EntityId,std::size_t>::const_iterator itr =
localFaceIDHash_.find(gid);
1534 if(
bulkData_->bucket(elmt).member(*(eb_pair.second)))
1535 return eb_pair.first;
1540 const std::string & blockId)
const 1543 std::map<std::pair<std::string,std::string>,
SolutionFieldType*>::const_iterator
1548 "Solution field name \"" << fieldName <<
"\" in block ID \"" << blockId <<
"\" was not found");
1550 return iter->second;
1554 const std::string & blockId)
const 1557 std::map<std::pair<std::string,std::string>,
SolutionFieldType*>::const_iterator
1562 "Cell field named \"" << fieldName <<
"\" in block ID \"" << blockId <<
"\" was not found");
1564 return iter->second;
1568 const std::string & blockId)
const 1571 std::map<std::pair<std::string,std::string>,
SolutionFieldType*>::const_iterator
1576 "Edge field named \"" << fieldName <<
"\" in block ID \"" << blockId <<
"\" was not found");
1578 return iter->second;
1582 const std::string & blockId)
const 1585 std::map<std::pair<std::string,std::string>,
SolutionFieldType*>::const_iterator
1590 "Face field named \"" << fieldName <<
"\" in block ID \"" << blockId <<
"\" was not found");
1592 return iter->second;
1612 stk::mesh::Part * block =
metaData_->get_part(name);
1614 block = &
metaData_->declare_part_with_topology(name, stk::mesh::get_topology(shards::CellTopology(ctData),
dimension_));
1618 Teuchos::RCP<shards::CellTopology> ct
1619 = Teuchos::rcp(
new shards::CellTopology(ctData));
1643 stk::mesh::Part * block =
metaData_->get_part(name);
1645 block = &
metaData_->declare_part_with_topology(name, stk::mesh::get_topology(shards::CellTopology(ctData),
dimension_));
1649 Teuchos::RCP<shards::CellTopology> ct
1650 = Teuchos::rcp(
new shards::CellTopology(ctData));
1674 stk::mesh::Part * block =
metaData_->get_part(name);
1676 block = &
metaData_->declare_part_with_topology(name, stk::mesh::get_topology(shards::CellTopology(ctData),
dimension_));
1680 Teuchos::RCP<shards::CellTopology> ct
1681 = Teuchos::rcp(
new shards::CellTopology(ctData));
1719 std::vector<stk::mesh::Entity> elements;
1722 for(std::size_t index=0;index<elements.size();++index) {
1723 stk::mesh::Entity element = elements[index];
1727 procId[0] = Teuchos::as<ProcIdData>(
procRank_);
1740 for(std::size_t index=0;index<elements.size();++index) {
1741 stk::mesh::Entity element = elements[index];
1745 procId[0] = Teuchos::as<ProcIdData>(
procRank_);
1757 std::vector<std::string> names;
1760 for(std::size_t b=0;b<names.size();b++) {
1762 std::map<std::string,double>::const_iterator bw_itr =
blockWeights_.find(names[b]);
1763 double blockWeight = (bw_itr!=
blockWeights_.end()) ? bw_itr->second : 1.0;
1765 std::vector<stk::mesh::Entity> elements;
1768 for(std::size_t index=0;index<elements.size();++index) {
1770 double * loadBal = stk::mesh::field_data(*
loadBalField_,elements[index]);
1771 loadBal[0] = blockWeight;
1783 std::vector<stk::mesh::Entity> edges;
1786 for(std::size_t index=0;index<edges.size();++index) {
1787 stk::mesh::Entity edge = edges[index];
1803 std::vector<stk::mesh::Entity> faces;
1806 for(std::size_t index=0;index<faces.size();++index) {
1807 stk::mesh::Entity face = faces[index];
1818 const std::string & fieldName,
1821 std::map<std::string,std::vector<std::string> >::const_iterator blkItr =
meshCoordFields_.find(eBlock);
1827 for(axis=0;axis<Teuchos::as<int>(blkItr->second.size());axis++) {
1828 if(blkItr->second[axis]==fieldName)
1832 if(axis>=Teuchos::as<int>(blkItr->second.size()))
1838 std::pair<Teuchos::RCP<std::vector<std::pair<std::size_t,std::size_t> > >, Teuchos::RCP<std::vector<unsigned int> > >
1841 Teuchos::RCP<std::vector<std::pair<std::size_t,std::size_t> > > vec;
1842 Teuchos::RCP<std::vector<unsigned int > > type_vec = rcp(
new std::vector<unsigned int>);
1843 const std::vector<Teuchos::RCP<const PeriodicBC_MatcherBase> > & matchers =
getPeriodicBCVector();
1846 for(std::size_t m=0;m<matchers.size();m++){
1847 vec = matchers[m]->getMatchedPair(*
this,vec);
1849 if(matchers[m]->getType() ==
"coord")
1851 else if(matchers[m]->getType() ==
"edge")
1853 else if(matchers[m]->getType() ==
"face")
1856 TEUCHOS_ASSERT(
false);
1857 type_vec->insert(type_vec->begin(),vec->size()-type_vec->size(),type);
1860 return std::make_pair(vec,type_vec);
1865 std::map<std::string, stk::mesh::Part*>::const_iterator blkItr =
elementBlocks_.find(blockId);
1872 std::vector<std::string> blockNames, sidesetNames, nodesetNames;
1878 os <<
"STK Mesh data:\n";
1881 os <<
" Entity counts (Nodes, Edges, Cells) = ( " 1886 os <<
" Entity counts (Nodes, Edges, Faces, Cells) = ( " 1892 os <<
" Entity counts (Nodes, Cells) = ( " 1896 os <<
" Element blocks = ";
1897 for(std::size_t i=0;i<blockNames.size();i++)
1898 os <<
"\"" << blockNames[i] <<
"\" ";
1900 os <<
" Sidesets = ";
1901 for(std::size_t i=0;i<sidesetNames.size();i++)
1902 os <<
"\"" << sidesetNames[i] <<
"\" ";
1904 os <<
" Nodesets = ";
1905 for(std::size_t i=0;i<nodesetNames.size();i++)
1906 os <<
"\"" << nodesetNames[i] <<
"\" ";
1910 const std::vector<Teuchos::RCP<const PeriodicBC_MatcherBase> > & bcVector
1912 if(bcVector.size()!=0) {
1913 os <<
" Periodic BCs:\n";
1914 for(std::size_t i=0;i<bcVector.size();i++)
1915 os <<
" " << bcVector[i]->getString() <<
"\n";
1922 std::vector<std::string> blockNames, sidesetNames, nodesetNames;
1928 os <<
"STK Meta data:\n";
1929 os <<
" Element blocks = ";
1930 for(std::size_t i=0;i<blockNames.size();i++)
1931 os <<
"\"" << blockNames[i] <<
"\" ";
1933 os <<
" Sidesets = ";
1934 for(std::size_t i=0;i<sidesetNames.size();i++)
1935 os <<
"\"" << sidesetNames[i] <<
"\" ";
1937 os <<
" Nodesets = ";
1938 for(std::size_t i=0;i<nodesetNames.size();i++)
1939 os <<
"\"" << nodesetNames[i] <<
"\" ";
1943 const std::vector<Teuchos::RCP<const PeriodicBC_MatcherBase> > & bcVector
1945 if(bcVector.size()!=0) {
1946 os <<
" Periodic BCs:\n";
1947 for(std::size_t i=0;i<bcVector.size();i++)
1948 os <<
" " << bcVector[i]->getString() <<
"\n";
1954 const stk::mesh::FieldVector & fv =
metaData_->get_fields();
1955 for(std::size_t i=0;i<fv.size();i++)
1956 os <<
"\"" << fv[i]->name() <<
"\" ";
1962 std::map<std::string, Teuchos::RCP<shards::CellTopology> >::const_iterator itr;
1966 std::stringstream ss;
1968 TEUCHOS_TEST_FOR_EXCEPTION(itr==
elementBlockCT_.end(),std::logic_error,
1969 "STK_Interface::getCellTopology: No such element block \"" +eBlock +
"\" available.\n\n" 1970 <<
"STK Meta Data follows: \n" << ss.str());
1979 const int err = MPI_Comm_dup (parallelMach, &newComm);
1980 TEUCHOS_TEST_FOR_EXCEPTION(err != MPI_SUCCESS, std::runtime_error,
1981 "panzer::STK_Interface: MPI_Comm_dup failed with error \"" 1982 << Teuchos::mpiErrorCodeToString (err) <<
"\".");
1989 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::runtime_error,
"Rebalance not currently supported");
1994 stk::mesh::Selector selector(
getMetaData()->universal_part());
1995 stk::mesh::Selector owned_selector(
getMetaData()->locally_owned_part());
1997 Teuchos::FancyOStream out(Teuchos::rcpFromRef(std::cout));
1998 out.setOutputToRootOnly(0);
2002 Teuchos::ParameterList graph;
2003 if(params.begin()!=params.end())
2004 graph.sublist(stk::rebalance::Zoltan::default_parameters_name()) = params;
2015 Teuchos::RCP<const Teuchos::Comm<int> >
2023 #ifdef PANZER_HAVE_PERCEPT 2024 TEUCHOS_TEST_FOR_EXCEPTION(numberOfLevels < 1,std::runtime_error,
2025 "ERROR: Number of levels for uniform refinement must be greater than 0");
2026 TEUCHOS_ASSERT(nonnull(refinedMesh_));
2027 TEUCHOS_ASSERT(nonnull(breakPattern_));
2029 refinedMesh_->setCoordinatesField();
2031 percept::UniformRefiner breaker(*refinedMesh_,*breakPattern_);
2032 breaker.setRemoveOldElements(deleteParentElements);
2034 for (
int i=0; i < numberOfLevels; ++i)
2038 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
2039 "ERROR: Uniform refinement requested. This requires the Percept package to be enabled in Trilinos!");
std::size_t edgeLocalId(stk::mesh::Entity elmt) const
void initializeFromMetaData()
Teuchos::RCP< ElementDescriptor > buildElementDescriptor(stk::mesh::EntityId elmtId, std::vector< stk::mesh::EntityId > &nodes)
Teuchos::RCP< stk::mesh::MetaData > getMetaData() const
stk::mesh::Part * getElementBlockPart(const std::string &name) const
get the block part
Teuchos::RCP< std::vector< stk::mesh::Entity > > orderedEdgeVector_
bool isMeshCoordField(const std::string &eBlock, const std::string &fieldName, int &axis) const
void addNodeset(const std::string &name)
Teuchos::RCP< stk::mesh::BulkData > bulkData_
void getMySides(const std::string &sideName, std::vector< stk::mesh::Entity > &sides) const
std::vector< stk::mesh::Part * > facesPartVec_
std::map< std::pair< std::string, std::string >, SolutionFieldType * > fieldNameToSolution_
std::string containingBlockId(stk::mesh::Entity elmt) const
void addEntityToNodeset(stk::mesh::Entity entity, stk::mesh::Part *nodeset)
bool isFaceLocal(stk::mesh::Entity face) const
stk::mesh::EntityRank getFaceRank() const
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.
std::size_t elementLocalId(stk::mesh::Entity elmt) const
stk::mesh::Field< double > SolutionFieldType
std::vector< stk::mesh::Part * > edgesPartVec_
std::map< std::string, Teuchos::RCP< shards::CellTopology > > faceBlockCT_
std::map< std::string, double > blockWeights_
VectorFieldType * coordinatesField_
bool isModifiable() const
void getMyElements(std::vector< stk::mesh::Entity > &elements) const
void addEntityToSideset(stk::mesh::Entity entity, stk::mesh::Part *sideset)
std::map< std::string, stk::mesh::Part * > faceBlocks_
stk::mesh::Part * nodesPart_
stk::mesh::EntityRank getNodeRank() const
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::Field< double > * getEdgeField(const std::string &fieldName, const std::string &blockId) const
Teuchos::RCP< stk::mesh::BulkData > getBulkData() const
void getFaceBlockNames(std::vector< std::string > &names) const
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_
void getElementsSharingNode(stk::mesh::EntityId nodeId, std::vector< stk::mesh::Entity > &elements) const
get a set of elements sharing a single node
void getSubcellIndices(unsigned entityRank, stk::mesh::EntityId elementId, std::vector< stk::mesh::EntityId > &subcellIds) const
void addInformationRecords(const std::vector< std::string > &info_records)
void getMyFaces(std::vector< stk::mesh::Entity > &faces) const
stk::mesh::EntityRank getSideRank() const
SolutionFieldType * loadBalField_
stk::mesh::Entity findConnectivityById(stk::mesh::Entity src, stk::mesh::EntityRank tgt_rank, unsigned rel_id) const
static const std::string nodesString
const double * getNodeCoordinates(stk::mesh::EntityId nodeId) const
void instantiateBulkData(stk::ParallelMachine parallelMach)
stk::mesh::Part * getEdgeBlock(const std::string &name) const
get the block part
void getElementBlockNames(std::vector< std::string > &names) const
std::set< std::string > informationRecords_
stk::mesh::EntityRank getEdgeRank() const
stk::mesh::Part * getSideset(const std::string &name) 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.
VectorFieldType * edgesField_
stk::mesh::EntityId elementGlobalId(std::size_t lid) const
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
void initialize(stk::ParallelMachine parallelMach, bool setupIO=true, const bool buildRefinementSupport=false)
static const std::string coordsString
stk::mesh::Field< double, stk::mesh::Cartesian > VectorFieldType
stk::mesh::Field< double > * getCellField(const std::string &fieldName, const std::string &blockId) const
std::size_t getEntityCounts(unsigned entityRank) const
get the global counts for the entity of specified rank
std::map< std::string, stk::mesh::Part * > edgeBlocks_
stk::mesh::Part * getFaceBlock(const std::string &name) const
get the block part
Teuchos::RCP< const std::vector< stk::mesh::Entity > > getFacesOrderedByLID() const
std::map< std::string, stk::mesh::Part * > elementBlocks_
bool isInitialized() const
Has initialize been called on this mesh object?
std::vector< stk::mesh::Part * > nodesPartVec_
static const std::string edgeBlockString
static const std::string edgesString
void printMetaData(std::ostream &os) const
void initializeFieldsInSTK(const std::map< std::pair< std::string, std::string >, SolutionFieldType *> &nameToField, bool setupIO)
void addFaceBlock(const std::string &name, const CellTopologyData *ctData)
Teuchos::RCP< const std::vector< stk::mesh::Entity > > getElementsOrderedByLID() const
void addNode(stk::mesh::EntityId gid, const std::vector< double > &coord)
void getAllFaces(const std::string &faceBlockName, std::vector< stk::mesh::Entity > &faces) const
void addEntitiesToEdgeBlock(std::vector< stk::mesh::Entity > entities, stk::mesh::Part *edgeblock)
const std::vector< Teuchos::RCP< const PeriodicBC_MatcherBase > > & getPeriodicBCVector() const
void buildSubcells()
force the mesh to build subcells: edges and faces
Teuchos::RCP< Teuchos::MpiComm< int > > mpiComm_
void getAllEdges(const std::string &edgeBlockName, std::vector< stk::mesh::Entity > &edges) const
Teuchos::RCP< stk::mesh::MetaData > metaData_
virtual ~ElementDescriptor()
Teuchos::RCP< std::vector< stk::mesh::Entity > > orderedElementVector_
void getEdgeBlockNames(std::vector< std::string > &names) const
Teuchos::RCP< const Teuchos::Comm< int > > getComm() const
get the comm associated with this mesh
std::map< std::string, Teuchos::RCP< shards::CellTopology > > edgeBlockCT_
void writeToExodus(const std::string &filename, const bool append=false)
Write this mesh and associated fields to the given output file.
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()
bool validBlockId(const std::string &blockId) 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)
void addEdgeBlock(const std::string &name, const CellTopologyData *ctData)
std::map< std::pair< std::string, std::string >, SolutionFieldType * > fieldNameToEdgeField_
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)
Teuchos::RCP< const shards::CellTopology > getCellTopology(const std::string &eBlock) const
void getAllSides(const std::string &sideName, std::vector< stk::mesh::Entity > &sides) const
Teuchos::RCP< const std::vector< stk::mesh::Entity > > getEdgesOrderedByLID() const
void getSidesetNames(std::vector< std::string > &name) const
std::map< std::string, std::vector< std::string > > meshCoordFields_
static const std::string facesString
Teuchos::RCP< Teuchos::MpiComm< int > > getSafeCommunicator(stk::ParallelMachine parallelMach) const
void addEntitiesToFaceBlock(std::vector< stk::mesh::Entity > entities, stk::mesh::Part *faceblock)
std::pair< Teuchos::RCP< std::vector< std::pair< std::size_t, std::size_t > > >, Teuchos::RCP< std::vector< unsigned int > > > getPeriodicNodePairing() const
bool isEdgeLocal(stk::mesh::Entity edge) const
void refineMesh(const int numberOfLevels, const bool deleteParentElements)
void getNodesetNames(std::vector< std::string > &name) const
void buildLocalElementIDs()
Teuchos::RCP< std::vector< stk::mesh::Entity > > orderedFaceVector_
std::unordered_map< stk::mesh::EntityId, std::size_t > localIDHash_
std::vector< stk::mesh::EntityId > maxEntityId_
const VectorFieldType & getCoordinatesField() const
void print(std::ostream &os) const
stk::mesh::EntityRank getElementRank() const
void getMyEdges(std::vector< stk::mesh::Entity > &edges) const
stk::mesh::Field< ProcIdData > ProcIdFieldType
stk::mesh::EntityId getMaxEntityId(unsigned entityRank) const
get max entity ID of type entityRank
void addFaceField(const std::string &fieldName, const std::string &blockId)
void addCellField(const std::string &fieldName, const std::string &blockId)
stk::mesh::Part * edgesPart_
void getMyNodes(const std::string &sideName, const std::string &blockName, std::vector< stk::mesh::Entity > &nodes) 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::Part * facesPart_
ProcIdFieldType * processorIdField_
void addElementBlock(const std::string &name, const CellTopologyData *ctData)
void getOwnedElementsSharingNode(stk::mesh::Entity node, std::vector< stk::mesh::Entity > &elements, std::vector< int > &relIds) const
std::size_t faceLocalId(stk::mesh::Entity elmt) const
stk::mesh::Part * getNodeset(const std::string &name) const
stk::mesh::Field< double > * getFaceField(const std::string &fieldName, const std::string &blockId) const
stk::mesh::Field< double > * getSolutionField(const std::string &fieldName, const std::string &blockId) const
std::map< std::pair< std::string, std::string >, SolutionFieldType * > fieldNameToCellField_
std::map< std::string, stk::mesh::Part * > nodesets_
VectorFieldType * facesField_
void getNeighborElements(std::vector< stk::mesh::Entity > &elements) const