11#ifndef __Panzer_STK_Interface_hpp__
12#define __Panzer_STK_Interface_hpp__
14#include <Teuchos_RCP.hpp>
15#include <Teuchos_DefaultMpiComm.hpp>
17#include <stk_mesh/base/Types.hpp>
18#include <stk_mesh/base/MetaData.hpp>
19#include <stk_mesh/base/BulkData.hpp>
20#include <stk_mesh/base/Field.hpp>
21#include <stk_mesh/base/FieldBase.hpp>
23#include "Kokkos_Core.hpp"
25#include <Shards_CellTopology.hpp>
26#include <Shards_CellTopologyData.h>
28#include <PanzerAdaptersSTK_config.hpp>
29#include <Kokkos_ViewFactory.hpp>
31#include <unordered_map>
33#ifdef PANZER_HAVE_IOSS
34#include <stk_io/StkMeshIoBroker.hpp>
37#ifdef PANZER_HAVE_PERCEPT
40 class URP_Heterogeneous_3D;
46class PeriodicBC_MatcherBase;
54 ElementDescriptor(stk::mesh::EntityId gid,
const std::vector<stk::mesh::EntityId> & nodes);
63 std::vector<stk::mesh::EntityId>
nodes_;
70Teuchos::RCP<ElementDescriptor>
108 void addElementBlock(
const std::string & name,
const CellTopologyData * ctData);
114 const std::string & edgeBlockName,
115 const stk::topology & topology);
117 const std::string & edgeBlockName,
118 const CellTopologyData * ctData);
123 const std::string & faceBlockName,
124 const stk::topology & topology);
126 const std::string & faceBlockName,
127 const CellTopologyData * ctData);
131 void addSideset(
const std::string & name,
const CellTopologyData * ctData);
139 void addSolutionField(
const std::string & fieldName,
const std::string & blockId);
143 void addCellField(
const std::string & fieldName,
const std::string & blockId);
147 void addEdgeField(
const std::string & fieldName,
const std::string & blockId);
151 void addFaceField(
const std::string & fieldName,
const std::string & blockId);
162 const std::vector<std::string> & coordField,
163 const std::string & dispPrefix);
184 void initialize(stk::ParallelMachine parallelMach,
bool setupIO=
true,
185 const bool buildRefinementSupport =
false);
213 void endModification(
const bool find_and_set_shared_nodes_in_stk=
true);
220 void addNode(stk::mesh::EntityId gid,
const std::vector<double> & coord);
223 void addElement(
const Teuchos::RCP<ElementDescriptor> & ed,stk::mesh::Part * block);
285 std::vector<stk::mesh::EntityId> & subcellIds)
const;
289 void getMyElements(std::vector<stk::mesh::Entity> & elements)
const;
293 void getMyElements(
const std::string & blockID,std::vector<stk::mesh::Entity> & elements)
const;
302 void getNeighborElements(
const std::string & blockID,std::vector<stk::mesh::Entity> & elements)
const;
306 void getMyEdges(std::vector<stk::mesh::Entity> & edges)
const;
315 void getMyEdges(
const std::string & edgeBlockName,std::vector<stk::mesh::Entity> & edges)
const;
325 void getMyEdges(
const std::string & edgeBlockName,
const std::string & blockName,std::vector<stk::mesh::Entity> & edges)
const;
334 void getAllEdges(
const std::string & edgeBlockName,std::vector<stk::mesh::Entity> & edges)
const;
344 void getAllEdges(
const std::string & edgeBlockName,
const std::string & blockName,std::vector<stk::mesh::Entity> & edges)
const;
348 void getMyFaces(std::vector<stk::mesh::Entity> & faces)
const;
357 void getMyFaces(
const std::string & faceBlockName,std::vector<stk::mesh::Entity> & faces)
const;
367 void getMyFaces(
const std::string & faceBlockName,
const std::string & blockName,std::vector<stk::mesh::Entity> & faces)
const;
376 void getAllFaces(
const std::string & faceBlockName,std::vector<stk::mesh::Entity> & faces)
const;
386 void getAllFaces(
const std::string & faceBlockName,
const std::string & blockName,std::vector<stk::mesh::Entity> & faces)
const;
395 void getMySides(
const std::string & sideName,std::vector<stk::mesh::Entity> & sides)
const;
405 void getMySides(
const std::string & sideName,
const std::string & blockName,std::vector<stk::mesh::Entity> & sides)
const;
414 void getAllSides(
const std::string & sideName,std::vector<stk::mesh::Entity> & sides)
const;
424 void getAllSides(
const std::string & sideName,
const std::string & blockName,std::vector<stk::mesh::Entity> & sides)
const;
435 void getMyNodes(
const std::string & sideName,
const std::string & blockName,std::vector<stk::mesh::Entity> & nodes)
const;
445 stk::mesh::Entity
findConnectivityById(stk::mesh::Entity src, stk::mesh::EntityRank tgt_rank,
unsigned rel_id)
const;
460 const bool append =
false);
481 const bool append =
false,
482 const bool append_after_restart_time =
false,
483 const double restart_time = 0.0);
505 const std::vector<Ioss::Property>& ioss_properties,
506 const bool append =
false,
507 const bool append_after_restart_time =
false,
508 const double restart_time = 0.0);
547 const std::string& key,
571 const std::string& key,
572 const double& value);
595 const std::string& key,
596 const std::vector<int>& value);
619 const std::string& key,
620 const std::vector<double>& value);
626 Teuchos::RCP<const Teuchos::Comm<int> >
getComm()
const;
633#ifdef PANZER_HAVE_PERCEPT
635 Teuchos::RCP<percept::PerceptMesh> getRefinedMesh()
const
636 { TEUCHOS_ASSERT(Teuchos::nonnull(refinedMesh_));
return refinedMesh_; }
644 {
if(
bulkData_==Teuchos::null)
return false;
645 return bulkData_->in_modifiable_state(); }
707 std::map<std::string, stk::mesh::Part*>::const_iterator itr =
elementBlocks_.find(name);
715 std::map<std::string, stk::mesh::Part*>::const_iterator itr =
edgeBlocks_.find(name);
723 std::map<std::string, stk::mesh::Part*>::const_iterator itr =
faceBlocks_.find(name);
735 return (itr !=
sidesets_.end()) ? itr->second :
nullptr;
745 return (itr !=
nodesets_.end()) ? itr->second :
nullptr;
761 void getNodeIdsForElement(stk::mesh::Entity element,std::vector<stk::mesh::EntityId> & nodeIds)
const;
770 std::vector<int> & relIds)
const;
780 std::vector<int> & relIds,
unsigned int matchType)
const;
784 void getElementsSharingNodes(
const std::vector<stk::mesh::EntityId> nodeId,std::vector<stk::mesh::Entity> & elements)
const;
817 std::size_t
edgeLocalId(stk::mesh::Entity elmt)
const;
821 std::size_t
edgeLocalId(stk::mesh::EntityId gid)
const;
843 std::size_t
faceLocalId(stk::mesh::Entity elmt)
const;
847 std::size_t
faceLocalId(stk::mesh::EntityId gid)
const;
862 {
return bulkData_->parallel_owner_rank(entity); }
866 inline bool isValid(stk::mesh::Entity entity)
const
878 const std::string & blockId)
const;
884 stk::mesh::Field<double> *
getCellField(
const std::string & fieldName,
885 const std::string & blockId)
const;
891 stk::mesh::Field<double> *
getEdgeField(
const std::string & fieldName,
892 const std::string & blockId)
const;
898 stk::mesh::Field<double> *
getFaceField(
const std::string & fieldName,
899 const std::string & blockId)
const;
926 template <
typename ArrayT>
928 const std::vector<std::size_t> & localElementIds,
const ArrayT & solutionValues,
double scaleValue=1.0);
944 template <
typename ArrayT>
946 const std::vector<std::size_t> & localElementIds,ArrayT & solutionValues)
const;
962 template <
typename ArrayT>
963 void setCellFieldData(
const std::string & fieldName,
const std::string & blockId,
964 const std::vector<std::size_t> & localElementIds,
const ArrayT & solutionValues,
double scaleValue=1.0);
990 template <
typename ArrayT>
991 void setEdgeFieldData(
const std::string & fieldName,
const std::string & blockId,
992 const std::vector<std::size_t> & localEdgeIds,
const ArrayT & edgeValues,
double scaleValue=1.0);
1008 template <
typename ArrayT>
1009 void setFaceFieldData(
const std::string & fieldName,
const std::string & blockId,
1010 const std::vector<std::size_t> & localFaceIds,
const ArrayT & faceValues,
double scaleValue=1.0);
1022 template <
typename ArrayT>
1023 void getElementVertices(
const std::vector<std::size_t> & localIds, ArrayT & vertices)
const;
1033 template <
typename ArrayT>
1034 void getElementVertices(
const std::vector<stk::mesh::Entity> & elements, ArrayT & vertices)
const;
1045 template <
typename ArrayT>
1046 void getElementVertices(
const std::vector<std::size_t> & localIds,
const std::string & eBlock, ArrayT & vertices)
const;
1057 template <
typename ArrayT>
1058 void getElementVertices(
const std::vector<stk::mesh::Entity> & elements,
const std::string & eBlock, ArrayT & vertices)
const;
1068 template <
typename ArrayT>
1079 template <
typename ArrayT>
1091 template <
typename ArrayT>
1092 void getElementVerticesNoResize(
const std::vector<std::size_t> & localIds,
const std::string & eBlock, ArrayT & vertices)
const;
1103 template <
typename ArrayT>
1104 void getElementVerticesNoResize(
const std::vector<stk::mesh::Entity> & elements,
const std::string & eBlock, ArrayT & vertices)
const;
1117 template <
typename ArrayT>
1118 void getElementNodes(
const std::vector<std::size_t> & localIds, ArrayT & nodes)
const;
1128 template <
typename ArrayT>
1129 void getElementNodes(
const std::vector<stk::mesh::Entity> & elements, ArrayT & nodes)
const;
1140 template <
typename ArrayT>
1141 void getElementNodes(
const std::vector<std::size_t> & localIds,
const std::string & eBlock, ArrayT & nodes)
const;
1152 template <
typename ArrayT>
1153 void getElementNodes(
const std::vector<stk::mesh::Entity> & elements,
const std::string & eBlock, ArrayT & nodes)
const;
1163 template <
typename ArrayT>
1174 template <
typename ArrayT>
1186 template <
typename ArrayT>
1187 void getElementNodesNoResize(
const std::vector<std::size_t> & localIds,
const std::string & eBlock, ArrayT & nodes)
const;
1198 template <
typename ArrayT>
1199 void getElementNodesNoResize(
const std::vector<stk::mesh::Entity> & elements,
const std::string & eBlock, ArrayT & nodes)
const;
1209 stk::mesh::EntityRank
getFaceRank()
const {
return stk::topology::FACE_RANK; }
1211 stk::mesh::EntityRank
getEdgeRank()
const {
return stk::topology::EDGE_RANK; }
1213 stk::mesh::EntityRank
getNodeRank()
const {
return stk::topology::NODE_RANK; }
1233 const std::vector<Teuchos::RCP<const PeriodicBC_MatcherBase> > &
1239 std::vector<Teuchos::RCP<const PeriodicBC_MatcherBase> > &
1265 void addPeriodicBCs(
const std::vector<Teuchos::RCP<const PeriodicBC_MatcherBase> > & bc_vec)
1270 std::pair<Teuchos::RCP<std::vector<std::pair<std::size_t,std::size_t> > >, Teuchos::RCP<std::vector<unsigned int> > >
1279 void print(std::ostream & os)
const;
1287 Teuchos::RCP<const shards::CellTopology>
getCellTopology(
const std::string & eBlock)
const;
1310 void rebalance(
const Teuchos::ParameterList & params);
1351 template <
typename ArrayT>
1352 void getElementVertices_FromField(
const std::vector<stk::mesh::Entity> & elements,
const std::string & eBlock, ArrayT & vertices)
const;
1355 template <
typename ArrayT>
1357 const std::string & eBlock, ArrayT & vertices)
const;
1368 template <
typename ArrayT>
1372 template <
typename ArrayT>
1387 template <
typename ArrayT>
1388 void getElementNodes_FromField(
const std::vector<stk::mesh::Entity> & elements,
const std::string & eBlock, ArrayT & nodes)
const;
1391 template <
typename ArrayT>
1393 const std::string & eBlock, ArrayT & nodes)
const;
1404 template <
typename ArrayT>
1408 template <
typename ArrayT>
1416 void refineMesh(
const int numberOfLevels,
const bool deleteParentElements);
1449 Teuchos::RCP<Teuchos::MpiComm<int> >
getSafeCommunicator(stk::ParallelMachine parallelMach)
const;
1465 bool isMeshCoordField(
const std::string & eBlock,
const std::string & fieldName,
int & axis)
const;
1482 template <
typename ArrayT>
1483 void setDispFieldData(
const std::string & fieldName,
const std::string & blockId,
int axis,
1484 const std::vector<std::size_t> & localElementIds,
const ArrayT & solutionValues);
1491#ifdef PANZER_HAVE_PERCEPT
1492 Teuchos::RCP<percept::PerceptMesh> refinedMesh_;
1493 Teuchos::RCP<percept::URP_Heterogeneous_3D> breakPattern_;
1545#ifdef PANZER_HAVE_IOSS
1547 Teuchos::RCP<stk::io::StkMeshIoBroker> meshData_;
1554 enum class GlobalVariable
1578 const GlobalVariable& flag);
1583 Teuchos::ParameterList globalData_;
1627template <
typename ArrayT>
1629 const std::vector<std::size_t> & localElementIds,
const ArrayT & solutionValues,
double scaleValue)
1632 auto solutionValues_h = Kokkos::create_mirror_view(solutionValues);
1633 Kokkos::deep_copy(solutionValues_h, solutionValues);
1635 int field_axis = -1;
1637 setDispFieldData(fieldName,blockId,field_axis,localElementIds,solutionValues_h);
1643 for(std::size_t cell=0;cell<localElementIds.size();cell++) {
1644 std::size_t localId = localElementIds[cell];
1645 stk::mesh::Entity element = elements[localId];
1648 const size_t num_nodes =
bulkData_->num_nodes(element);
1649 stk::mesh::Entity
const* nodes =
bulkData_->begin_nodes(element);
1650 for(std::size_t i=0; i<num_nodes; ++i) {
1651 stk::mesh::Entity node = nodes[i];
1653 double * solnData = stk::mesh::field_data(*
field,node);
1655 solnData[0] = scaleValue*solutionValues_h(cell,i);
1660template <
typename ArrayT>
1662 const std::vector<std::size_t> & localElementIds,
const ArrayT & dispValues)
1664 TEUCHOS_ASSERT(axis>=0);
1671 for(std::size_t cell=0;cell<localElementIds.size();cell++) {
1672 std::size_t localId = localElementIds[cell];
1673 stk::mesh::Entity element = elements[localId];
1676 const size_t num_nodes =
bulkData_->num_nodes(element);
1677 stk::mesh::Entity
const* nodes =
bulkData_->begin_nodes(element);
1678 for(std::size_t i=0; i<num_nodes; ++i) {
1679 stk::mesh::Entity node = nodes[i];
1681 double * solnData = stk::mesh::field_data(*
field,node);
1682 double * coordData = stk::mesh::field_data(coord_field,node);
1684 solnData[0] = dispValues(cell,i)-coordData[axis];
1689template <
typename ArrayT>
1691 const std::vector<std::size_t> & localElementIds,ArrayT & solutionValues)
const
1695 solutionValues = Kokkos::createDynRankView(solutionValues,
1697 localElementIds.size(),
1698 bulkData_->num_nodes(elements[localElementIds[0]]));
1702 for(std::size_t cell=0;cell<localElementIds.size();cell++) {
1703 std::size_t localId = localElementIds[cell];
1704 stk::mesh::Entity element = elements[localId];
1707 const size_t num_nodes =
bulkData_->num_nodes(element);
1708 stk::mesh::Entity
const* nodes =
bulkData_->begin_nodes(element);
1709 for(std::size_t i=0; i<num_nodes; ++i) {
1710 stk::mesh::Entity node = nodes[i];
1712 double * solnData = stk::mesh::field_data(*
field,node);
1714 solutionValues(cell,i) = solnData[0];
1719template <
typename ArrayT>
1721 const std::vector<std::size_t> & localElementIds,
const ArrayT & solutionValues,
double scaleValue)
1727 auto solutionValues_h = Kokkos::create_mirror_view(solutionValues);
1728 Kokkos::deep_copy(solutionValues_h, solutionValues);
1730 for(std::size_t cell=0;cell<localElementIds.size();cell++) {
1731 std::size_t localId = localElementIds[cell];
1732 stk::mesh::Entity element = elements[localId];
1734 double * solnData = stk::mesh::field_data(*
field,element);
1735 TEUCHOS_ASSERT(solnData!=0);
1736 solnData[0] = scaleValue*solutionValues_h.access(cell,0);
1740template <
typename ArrayT>
1742 const std::vector<std::size_t> & localEdgeIds,
const ArrayT & edgeValues,
double scaleValue)
1748 auto edgeValues_h = Kokkos::create_mirror_view(edgeValues);
1749 Kokkos::deep_copy(edgeValues_h, edgeValues);
1751 for(std::size_t idx=0;idx<localEdgeIds.size();idx++) {
1752 std::size_t localId = localEdgeIds[idx];
1753 stk::mesh::Entity edge = edges[localId];
1755 double * solnData = stk::mesh::field_data(*
field,edge);
1756 TEUCHOS_ASSERT(solnData!=0);
1757 solnData[0] = scaleValue*edgeValues_h.access(idx,0);
1761template <
typename ArrayT>
1763 const std::vector<std::size_t> & localFaceIds,
const ArrayT & faceValues,
double scaleValue)
1769 auto faceValues_h = Kokkos::create_mirror_view(faceValues);
1770 Kokkos::deep_copy(faceValues_h, faceValues);
1772 for(std::size_t idx=0;idx<localFaceIds.size();idx++) {
1773 std::size_t localId = localFaceIds[idx];
1774 stk::mesh::Entity face = faces[localId];
1776 double * solnData = stk::mesh::field_data(*
field,face);
1777 TEUCHOS_ASSERT(solnData!=0);
1778 solnData[0] = scaleValue*faceValues_h.access(idx,0);
1784template <
typename ArrayT>
1795 std::vector<stk::mesh::Entity> selected_elements;
1796 for(std::size_t cell=0;cell<localElementIds.size();cell++)
1797 selected_elements.push_back(elements[localElementIds[cell]]);
1802 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::invalid_argument,
1803 "STK_Interface::getElementVertices: Cannot call this method when field coordinates are used "
1804 "without specifying an element block.");
1808template <
typename ArrayT>
1815 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::invalid_argument,
1816 "STK_Interface::getElementVertices: Cannot call this method when field coordinates are used "
1817 "without specifying an element block.");
1821template <
typename ArrayT>
1832template <
typename ArrayT>
1838 std::vector<stk::mesh::Entity> selected_elements;
1839 for(std::size_t cell=0;cell<localElementIds.size();cell++)
1840 selected_elements.push_back(elements[localElementIds[cell]]);
1850template <
typename ArrayT>
1861 std::vector<stk::mesh::Entity> selected_elements;
1862 for(std::size_t cell=0;cell<localElementIds.size();cell++)
1863 selected_elements.push_back(elements[localElementIds[cell]]);
1868 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::invalid_argument,
1869 "STK_Interface::getElementVerticesNoResize: Cannot call this method when field coordinates are used "
1870 "without specifying an element block.");
1874template <
typename ArrayT>
1881 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::invalid_argument,
1882 "STK_Interface::getElementVerticesNoResize: Cannot call this method when field coordinates are used "
1883 "without specifying an element block.");
1887template <
typename ArrayT>
1898template <
typename ArrayT>
1904 std::vector<stk::mesh::Entity> selected_elements;
1905 for(std::size_t cell=0;cell<localElementIds.size();cell++)
1906 selected_elements.push_back(elements[localElementIds[cell]]);
1916template <
typename ArrayT>
1920 if(elements.size() == 0) {
1921 vertices = Kokkos::createDynRankView(vertices,
"vertices", 0, 0, 0);
1930 const auto masterVertexCount
1931 = stk::mesh::get_cell_topology(
bulkData_->bucket(elements[0]).topology()).getCellTopologyData()->vertex_count;
1934 vertices = Kokkos::createDynRankView(vertices,
"vertices", elements.size(), masterVertexCount,
getDimension());
1935 auto vertices_h = Kokkos::create_mirror_view(vertices);
1936 Kokkos::deep_copy(vertices_h, vertices);
1940 for(std::size_t cell = 0; cell < elements.size(); cell++) {
1941 const auto element = elements[cell];
1942 TEUCHOS_ASSERT(element != 0);
1944 const auto vertexCount
1945 = stk::mesh::get_cell_topology(
bulkData_->bucket(element).topology()).getCellTopologyData()->vertex_count;
1946 TEUCHOS_TEST_FOR_EXCEPTION(vertexCount != masterVertexCount, std::runtime_error,
1947 "In call to STK_Interface::getElementVertices all elements "
1948 "must have the same vertex count!");
1951 const size_t num_nodes =
bulkData_->num_nodes(element);
1952 auto const* nodes =
bulkData_->begin_nodes(element);
1953 TEUCHOS_TEST_FOR_EXCEPTION(num_nodes!=masterVertexCount,std::runtime_error,
1954 "In call to STK_Interface::getElementVertices cardinality of "
1955 "element node relations must be the vertex count!");
1956 for(std::size_t node = 0; node < num_nodes; ++node) {
1960 for(
unsigned d=0;d<dim;d++)
1961 vertices_h(cell,node,d) = coord[d];
1964 Kokkos::deep_copy(vertices, vertices_h);
1967template <
typename ArrayT>
1971 if(elements.size()==0) {
1980 unsigned masterVertexCount
1981 = stk::mesh::get_cell_topology(
bulkData_->bucket(elements[0]).topology()).getCellTopologyData()->vertex_count;
1985 auto vertices_h = Kokkos::create_mirror_view(vertices);
1986 for(std::size_t cell=0;cell<elements.size();cell++) {
1987 stk::mesh::Entity element = elements[cell];
1988 TEUCHOS_ASSERT(element!=0);
1990 unsigned vertexCount
1991 = stk::mesh::get_cell_topology(
bulkData_->bucket(element).topology()).getCellTopologyData()->vertex_count;
1992 TEUCHOS_TEST_FOR_EXCEPTION(vertexCount!=masterVertexCount,std::runtime_error,
1993 "In call to STK_Interface::getElementVertices all elements "
1994 "must have the same vertex count!");
1997 const size_t num_nodes =
bulkData_->num_nodes(element);
1998 stk::mesh::Entity
const* nodes =
bulkData_->begin_nodes(element);
1999 TEUCHOS_TEST_FOR_EXCEPTION(num_nodes!=masterVertexCount,std::runtime_error,
2000 "In call to STK_Interface::getElementVertices cardinality of "
2001 "element node relations must be the vertex count!");
2002 for(std::size_t node=0; node<num_nodes; ++node) {
2006 for(
unsigned d=0;d<dim;d++)
2007 vertices_h(cell,node,d) = coord[d];
2010 Kokkos::deep_copy(vertices, vertices_h);
2013template <
typename ArrayT>
2019 if(elements.size()==0) {
2020 vertices = Kokkos::createDynRankView(vertices,
"vertices",0,0,0);
2025 unsigned masterVertexCount
2026 = stk::mesh::get_cell_topology(
bulkData_->bucket(elements[0]).topology()).getCellTopologyData()->vertex_count;
2029 vertices = Kokkos::createDynRankView(vertices,
"vertices",elements.size(),masterVertexCount,
getDimension());
2030 auto vertices_h = Kokkos::create_mirror_view(vertices);
2031 std::map<std::string,std::vector<std::string> >::const_iterator itr =
meshCoordFields_.find(eBlock);
2034 TEUCHOS_ASSERT(
false);
2037 const std::vector<std::string> & coordField = itr->second;
2038 std::vector<SolutionFieldType*> fields(
getDimension());
2039 for(std::size_t d=0;d<fields.size();d++) {
2043 for(std::size_t cell=0;cell<elements.size();cell++) {
2044 stk::mesh::Entity element = elements[cell];
2047 const size_t num_nodes =
bulkData_->num_nodes(element);
2048 stk::mesh::Entity
const* nodes =
bulkData_->begin_nodes(element);
2049 for(std::size_t i=0; i<num_nodes; ++i) {
2050 stk::mesh::Entity node = nodes[i];
2055 double * solnData = stk::mesh::field_data(*fields[d],node);
2059 vertices_h(cell,i,d) = solnData[0]+coord[d];
2063 Kokkos::deep_copy(vertices, vertices_h);
2066template <
typename ArrayT>
2068 const std::string & eBlock, ArrayT & vertices)
const
2073 if(elements.size()==0) {
2077 std::map<std::string,std::vector<std::string> >::const_iterator itr =
meshCoordFields_.find(eBlock);
2080 TEUCHOS_ASSERT(
false);
2083 const std::vector<std::string> & coordField = itr->second;
2084 std::vector<SolutionFieldType*> fields(
getDimension());
2085 for(std::size_t d=0;d<fields.size();d++) {
2089 for(std::size_t cell=0;cell<elements.size();cell++) {
2090 stk::mesh::Entity element = elements[cell];
2093 const size_t num_nodes =
bulkData_->num_nodes(element);
2094 stk::mesh::Entity
const* nodes =
bulkData_->begin_nodes(element);
2095 for(std::size_t i=0; i<num_nodes; ++i) {
2096 stk::mesh::Entity node = nodes[i];
2101 double * solnData = stk::mesh::field_data(*fields[d],node);
2105 vertices(cell,i,d) = solnData[0]+coord[d];
2113template <
typename ArrayT>
2124 std::vector<stk::mesh::Entity> selected_elements;
2125 for(std::size_t cell=0;cell<localElementIds.size();cell++)
2126 selected_elements.push_back(elements[localElementIds[cell]]);
2131 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::invalid_argument,
2132 "STK_Interface::getElementNodes: Cannot call this method when field coordinates are used "
2133 "without specifying an element block.");
2137template <
typename ArrayT>
2144 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::invalid_argument,
2145 "STK_Interface::getElementNodes: Cannot call this method when field coordinates are used "
2146 "without specifying an element block.");
2150template <
typename ArrayT>
2161template <
typename ArrayT>
2167 std::vector<stk::mesh::Entity> selected_elements;
2168 for(std::size_t cell=0;cell<localElementIds.size();cell++)
2169 selected_elements.push_back(elements[localElementIds[cell]]);
2179template <
typename ArrayT>
2190 std::vector<stk::mesh::Entity> selected_elements;
2191 for(std::size_t cell=0;cell<localElementIds.size();cell++)
2192 selected_elements.push_back(elements[localElementIds[cell]]);
2197 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::invalid_argument,
2198 "STK_Interface::getElementNodesNoResize: Cannot call this method when field coordinates are used "
2199 "without specifying an element block.");
2203template <
typename ArrayT>
2210 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::invalid_argument,
2211 "STK_Interface::getElementNodesNoResize: Cannot call this method when field coordinates are used "
2212 "without specifying an element block.");
2216template <
typename ArrayT>
2227template <
typename ArrayT>
2233 std::vector<stk::mesh::Entity> selected_elements;
2234 for(std::size_t cell=0;cell<localElementIds.size();cell++)
2235 selected_elements.push_back(elements[localElementIds[cell]]);
2245template <
typename ArrayT>
2249 if(elements.size() == 0) {
2250 nodes = Kokkos::createDynRankView(nodes,
"nodes", 0, 0, 0);
2259 const auto masterNodeCount
2260 = stk::mesh::get_cell_topology(
bulkData_->bucket(elements[0]).topology()).getCellTopologyData()->node_count;
2263 nodes = Kokkos::createDynRankView(nodes,
"nodes", elements.size(), masterNodeCount,
getDimension());
2264 auto nodes_h = Kokkos::create_mirror_view(nodes);
2265 Kokkos::deep_copy(nodes_h, nodes);
2269 for(std::size_t cell = 0; cell < elements.size(); cell++) {
2270 const auto element = elements[cell];
2271 TEUCHOS_ASSERT(element != 0);
2273 const auto nodeCount
2274 = stk::mesh::get_cell_topology(
bulkData_->bucket(element).topology()).getCellTopologyData()->node_count;
2275 TEUCHOS_TEST_FOR_EXCEPTION(nodeCount != masterNodeCount, std::runtime_error,
2276 "In call to STK_Interface::getElementNodes all elements "
2277 "must have the same node count!");
2280 const size_t num_nodes =
bulkData_->num_nodes(element);
2281 auto const* elem_nodes =
bulkData_->begin_nodes(element);
2282 TEUCHOS_TEST_FOR_EXCEPTION(num_nodes!=masterNodeCount,std::runtime_error,
2283 "In call to STK_Interface::getElementNodes cardinality of "
2284 "element node relations must be the node count!");
2285 for(std::size_t node = 0; node < num_nodes; ++node) {
2289 for(
unsigned d=0;d<dim;d++)
2290 nodes_h(cell,node,d) = coord[d];
2293 Kokkos::deep_copy(nodes, nodes_h);
2296template <
typename ArrayT>
2300 if(elements.size()==0) {
2309 unsigned masterNodeCount
2310 = stk::mesh::get_cell_topology(
bulkData_->bucket(elements[0]).topology()).getCellTopologyData()->node_count;
2314 auto nodes_h = Kokkos::create_mirror_view(nodes);
2315 for(std::size_t cell=0;cell<elements.size();cell++) {
2316 stk::mesh::Entity element = elements[cell];
2317 TEUCHOS_ASSERT(element!=0);
2320 = stk::mesh::get_cell_topology(
bulkData_->bucket(element).topology()).getCellTopologyData()->node_count;
2321 TEUCHOS_TEST_FOR_EXCEPTION(nodeCount!=masterNodeCount,std::runtime_error,
2322 "In call to STK_Interface::getElementNodes all elements "
2323 "must have the same node count!");
2326 const size_t num_nodes =
bulkData_->num_nodes(element);
2327 stk::mesh::Entity
const* elem_nodes =
bulkData_->begin_nodes(element);
2328 TEUCHOS_TEST_FOR_EXCEPTION(num_nodes!=masterNodeCount,std::runtime_error,
2329 "In call to STK_Interface::getElementNodes cardinality of "
2330 "element node relations must be the node count!");
2331 for(std::size_t node=0; node<num_nodes; ++node) {
2335 for(
unsigned d=0;d<dim;d++)
2336 nodes_h(cell,node,d) = coord[d];
2339 Kokkos::deep_copy(nodes, nodes_h);
2342template <
typename ArrayT>
2348 if(elements.size()==0) {
2349 nodes = Kokkos::createDynRankView(nodes,
"nodes",0,0,0);
2354 unsigned masterNodeCount
2355 = stk::mesh::get_cell_topology(
bulkData_->bucket(elements[0]).topology()).getCellTopologyData()->node_count;
2358 nodes = Kokkos::createDynRankView(nodes,
"nodes",elements.size(),masterNodeCount,
getDimension());
2359 auto nodes_h = Kokkos::create_mirror_view(nodes);
2360 std::map<std::string,std::vector<std::string> >::const_iterator itr =
meshCoordFields_.find(eBlock);
2363 TEUCHOS_ASSERT(
false);
2366 const std::vector<std::string> & coordField = itr->second;
2367 std::vector<SolutionFieldType*> fields(
getDimension());
2368 for(std::size_t d=0;d<fields.size();d++) {
2373 for(std::size_t cell=0;cell<elements.size();cell++) {
2374 stk::mesh::Entity element = elements[cell];
2377 const size_t num_nodes =
bulkData_->num_nodes(element);
2378 stk::mesh::Entity
const* elem_nodes =
bulkData_->begin_nodes(element);
2379 for(std::size_t i=0; i<num_nodes; ++i) {
2380 stk::mesh::Entity node = elem_nodes[i];
2385 double * solnData = stk::mesh::field_data(*fields[d],node);
2389 nodes_h(cell,i,d) = solnData[0]+coord[d];
2393 Kokkos::deep_copy(nodes, nodes_h);
2396template <
typename ArrayT>
2398 const std::string & eBlock, ArrayT & nodes)
const
2403 if(elements.size()==0) {
2407 std::map<std::string,std::vector<std::string> >::const_iterator itr =
meshCoordFields_.find(eBlock);
2410 TEUCHOS_ASSERT(
false);
2413 const std::vector<std::string> & coordField = itr->second;
2414 std::vector<SolutionFieldType*> fields(
getDimension());
2415 for(std::size_t d=0;d<fields.size();d++) {
2420 for(std::size_t cell=0;cell<elements.size();cell++) {
2421 stk::mesh::Entity element = elements[cell];
2424 const size_t num_nodes =
bulkData_->num_nodes(element);
2425 stk::mesh::Entity
const* elem_nodes =
bulkData_->begin_nodes(element);
2426 for(std::size_t i=0; i<num_nodes; ++i) {
2427 stk::mesh::Entity node = elem_nodes[i];
2432 double * solnData = stk::mesh::field_data(*fields[d],node);
2436 nodes(cell,i,d) = solnData[0]+coord[d];
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.
virtual ~ElementDescriptor()
const std::vector< stk::mesh::EntityId > & getNodes() const
Returns the global IDs of the element's nodes.
std::vector< stk::mesh::EntityId > nodes_
stk::mesh::EntityId getGID() const
Returns the element's global ID.
const STK_Interface * mesh_
bool operator()(stk::mesh::Entity a, stk::mesh::Entity b)
LocalIdCompare(const STK_Interface *mesh)
void rebalance(const Teuchos::ParameterList ¶ms)
void buildLocalElementIDs()
const VectorFieldType & getEdgesField() const
void addEdges()
Builds edge entities for the mesh from its existing elements.
stk::mesh::Entity findConnectivityById(stk::mesh::Entity src, stk::mesh::EntityRank tgt_rank, unsigned rel_id) const
void applyElementLoadBalanceWeights()
Teuchos::RCP< stk::mesh::MetaData > metaData_
VectorFieldType * facesField_
Teuchos::RCP< std::vector< stk::mesh::Entity > > orderedFaceVector_
std::pair< Teuchos::RCP< std::vector< std::pair< std::size_t, std::size_t > > >, Teuchos::RCP< std::vector< unsigned int > > > getPeriodicNodePairing() const
void setFaceFieldData(const std::string &fieldName, const std::string &blockId, const std::vector< std::size_t > &localFaceIds, const ArrayT &faceValues, double scaleValue=1.0)
bool isValid(stk::mesh::Entity entity) const
const std::vector< Teuchos::RCP< const PeriodicBC_MatcherBase > > & getPeriodicBCVector() const
void initialize(stk::ParallelMachine parallelMach, bool setupIO=true, const bool buildRefinementSupport=false)
stk::mesh::Field< double > SolutionFieldType
void getMyFaces(std::vector< stk::mesh::Entity > &faces) const
stk::mesh::Part * getElementBlockPart(const std::string &name) const
get the block part
static const std::string edgesString
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.
double getCurrentStateTime() const
static const std::string edgeBlockString
void getElementVertices(const std::vector< std::size_t > &localIds, ArrayT &vertices) const
void getElementVertices_FromCoords(const std::vector< stk::mesh::Entity > &elements, ArrayT &vertices) const
std::size_t getNumSidesets() const
get the side set count
Teuchos::RCP< std::vector< stk::mesh::Entity > > orderedElementVector_
std::map< std::string, stk::mesh::Part * > sidesets_
void addPeriodicBC(const Teuchos::RCP< const PeriodicBC_MatcherBase > &bc)
stk::mesh::EntityId elementGlobalId(std::size_t lid) const
stk::mesh::Part * getEdgeBlock(const std::string &name) const
get the block part
std::unordered_map< stk::mesh::EntityId, std::size_t > localFaceIDHash_
void getElementsSharingNodes(const std::vector< stk::mesh::EntityId > nodeId, std::vector< stk::mesh::Entity > &elements) const
get a set of elements sharing multiple nodes
std::size_t getEntityCounts(unsigned entityRank) const
get the global counts for the entity of specified rank
void getElementNodes(const std::vector< std::size_t > &localIds, ArrayT &nodes) const
void getFaceBlockNames(std::vector< std::string > &names) const
bool isFaceLocal(stk::mesh::Entity face) const
void initializeFromMetaData()
void addEntityToEdgeBlock(stk::mesh::Entity entity, stk::mesh::Part *edgeblock)
Teuchos::RCP< const std::vector< stk::mesh::Entity > > getElementsOrderedByLID() const
bool isInitialized() const
Returns true if initialize been called on this mesh object.
std::map< std::string, stk::mesh::Part * > faceBlocks_
void addEntitiesToFaceBlock(std::vector< stk::mesh::Entity > entities, stk::mesh::Part *faceblock)
stk::mesh::EntityRank getNodeRank() const
Get the STK entity rank corresponding to nodes.
void addInformationRecords(const std::vector< std::string > &info_records)
std::string containingBlockId(stk::mesh::Entity elmt) const
void getEdgeBlockNames(std::vector< std::string > &names) const
void addEdgeBlock(const std::string &elemBlockName, const std::string &edgeBlockName, const stk::topology &topology)
void getElementVertices_FromField(const std::vector< stk::mesh::Entity > &elements, const std::string &eBlock, ArrayT &vertices) const
const VectorFieldType & getFacesField() const
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 getElementNodes_FromCoords(const std::vector< stk::mesh::Entity > &elements, ArrayT &nodes) const
Teuchos::RCP< const std::vector< stk::mesh::Entity > > getEdgesOrderedByLID() const
void buildSubcells()
force the mesh to build subcells: edges and faces
void setCellFieldData(const std::string &fieldName, const std::string &blockId, const std::vector< std::size_t > &localElementIds, const ArrayT &solutionValues, double scaleValue=1.0)
stk::mesh::EntityId getMaxEntityId(unsigned entityRank) const
get max entity ID of type entityRank
std::vector< Teuchos::RCP< const PeriodicBC_MatcherBase > > & getPeriodicBCVector()
stk::mesh::EntityRank getElementRank() const
Get the STK entity rank corresponding to elements.
std::size_t currentLocalId_
void getOwnedElementsSharingNode(stk::mesh::Entity node, std::vector< stk::mesh::Entity > &elements, std::vector< int > &relIds) const
const double * getNodeCoordinates(stk::mesh::EntityId nodeId) 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 setBlockWeight(const std::string &blockId, double weight)
void addEdgeField(const std::string &fieldName, const std::string &blockId)
stk::mesh::EntityId faceGlobalId(stk::mesh::Entity face) const
std::unordered_map< stk::mesh::EntityId, std::size_t > localEdgeIDHash_
void addEntityToFaceBlock(stk::mesh::Entity entity, stk::mesh::Part *faceblock)
void getNeighborElements(std::vector< stk::mesh::Entity > &elements) const
void getMyNodes(const std::string &sideName, const std::string &blockName, std::vector< stk::mesh::Entity > &nodes) const
std::vector< stk::mesh::Part * > edgesPartVec_
bool isModifiable() const
Returns true if the bulk data manager is currently in modification mode (i.e. between beginModificati...
const bool & useBoundingBoxSearch() const
void setEdgeFieldData(const std::string &fieldName, const std::string &blockId, const std::vector< std::size_t > &localEdgeIds, const ArrayT &edgeValues, double scaleValue=1.0)
void addEntityToNodeset(stk::mesh::Entity entity, stk::mesh::Part *nodeset)
void getElementVerticesNoResize(const std::vector< std::size_t > &localIds, ArrayT &vertices) const
void addElement(const Teuchos::RCP< ElementDescriptor > &ed, stk::mesh::Part *block)
Adds an element (described by its global ID and node IDs) into the given element block part.
bool isEdgeLocal(stk::mesh::Entity edge) const
void addPeriodicBCs(const std::vector< Teuchos::RCP< const PeriodicBC_MatcherBase > > &bc_vec)
void refineMesh(const int numberOfLevels, const bool deleteParentElements)
stk::mesh::Part * nodesPart_
stk::mesh::Part * facesPart_
std::map< std::string, double > blockWeights_
std::map< std::pair< std::string, std::string >, SolutionFieldType * > fieldNameToEdgeField_
void addNode(stk::mesh::EntityId gid, const std::vector< double > &coord)
Teuchos::RCP< const Teuchos::Comm< int > > getComm() const
get the comm associated with this mesh
void getElementNodesNoResize(const std::vector< std::size_t > &localIds, ArrayT &nodes) const
std::map< std::pair< std::string, std::string >, SolutionFieldType * > fieldNameToFaceField_
void setSolutionFieldData(const std::string &fieldName, const std::string &blockId, const std::vector< std::size_t > &localElementIds, const ArrayT &solutionValues, double scaleValue=1.0)
std::size_t elementLocalId(stk::mesh::Entity elmt) const
stk::mesh::Field< double > VectorFieldType
void addCellField(const std::string &fieldName, const std::string &blockId)
void setInitialStateTime(double value)
stk::mesh::Field< double > * getSolutionField(const std::string &fieldName, const std::string &blockId) const
std::map< std::pair< std::string, std::string >, SolutionFieldType * > fieldNameToSolution_
void getAllSides(const std::string &sideName, std::vector< stk::mesh::Entity > &sides) const
VectorFieldType * coordinatesField_
stk::mesh::Part * edgesPart_
void getElementVertices_FromFieldNoResize(const std::vector< stk::mesh::Entity > &elements, const std::string &eBlock, ArrayT &vertices) const
but the vertex array will not be resized.
void getMySides(const std::string &sideName, std::vector< stk::mesh::Entity > &sides) const
double getInitialStateTime() const
void addMeshCoordFields(const std::string &blockId, const std::vector< std::string > &coordField, const std::string &dispPrefix)
stk::mesh::Field< double > * getEdgeField(const std::string &fieldName, const std::string &blockId) const
std::vector< stk::mesh::EntityId > maxEntityId_
void getElementNodes_FromField(const std::vector< stk::mesh::Entity > &elements, const std::string &eBlock, ArrayT &nodes) const
void getElementBlockNames(std::vector< std::string > &names) const
Teuchos::RCP< stk::mesh::BulkData > bulkData_
void addNodeset(const std::string &name)
void getSidesetNames(std::vector< std::string > &name) const
void addSideset(const std::string &name, const CellTopologyData *ctData)
stk::mesh::EntityRank getFaceRank() const
Get the STK entity rank corresponding to faces.
void getMyEdges(std::vector< stk::mesh::Entity > &edges) const
std::size_t getNumNodesets() const
get the side set count
bool getUseFieldCoordinates() const
std::set< std::string > informationRecords_
void getAllEdges(const std::string &edgeBlockName, std::vector< stk::mesh::Entity > &edges) const
std::vector< stk::mesh::Part * > nodesPartVec_
void getElementNodes_FromFieldNoResize(const std::vector< stk::mesh::Entity > &elements, const std::string &eBlock, ArrayT &nodes) const
but the node array will not be resized.
void initializeFieldsInSTK(const std::map< std::pair< std::string, std::string >, SolutionFieldType * > &nameToField, bool setupIO)
static const std::string nodesString
const VectorFieldType & getCoordinatesField() const
void setUseFieldCoordinates(bool useFieldCoordinates)
Teuchos::RCP< stk::mesh::MetaData > getMetaData() const
Returns the underlying STK meta data object.
stk::mesh::Field< double > * getFaceField(const std::string &fieldName, const std::string &blockId) const
static const std::string facesString
void writeToExodus(const std::string &filename, const bool append=false)
Write this mesh and associated fields to the given output file.
unsigned getDimension() const
get the dimension
bool isMeshCoordField(const std::string &eBlock, const std::string &fieldName, int &axis) const
std::map< std::string, stk::mesh::Part * > nodesets_
void getElementVertices_FromCoordsNoResize(const std::vector< stk::mesh::Entity > &elements, ArrayT &vertices) const
but the vertex array will not be resized.
SolutionFieldType * loadBalField_
std::map< std::string, std::vector< std::string > > meshCoordFields_
stk::mesh::Field< double > * getCellField(const std::string &fieldName, const std::string &blockId) const
std::size_t faceLocalId(stk::mesh::Entity elmt) const
void getAllFaces(const std::string &faceBlockName, std::vector< stk::mesh::Entity > &faces) const
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::RCP< std::vector< stk::mesh::Entity > > orderedEdgeVector_
stk::mesh::Part * getNodeset(const std::string &name) const
Teuchos::RCP< const shards::CellTopology > getCellTopology(const std::string &eBlock) const
void endModification(const bool find_and_set_shared_nodes_in_stk=true)
stk::mesh::EntityId edgeGlobalId(std::size_t lid) const
unsigned entityOwnerRank(stk::mesh::Entity entity) const
void getNodesetNames(std::vector< std::string > &name) const
void addEntitiesToEdgeBlock(std::vector< stk::mesh::Entity > entities, stk::mesh::Part *edgeblock)
stk::mesh::Field< ProcIdData > ProcIdFieldType
bool getUseLowerCaseForIO() const
std::unordered_map< stk::mesh::EntityId, std::size_t > localIDHash_
void addSolutionField(const std::string &fieldName, const std::string &blockId)
VectorFieldType * edgesField_
void getSubcellIndices(unsigned entityRank, stk::mesh::EntityId elementId, std::vector< stk::mesh::EntityId > &subcellIds) const
std::vector< Teuchos::RCP< const PeriodicBC_MatcherBase > > periodicBCs_
void addEntityToSideset(stk::mesh::Entity entity, stk::mesh::Part *sideset)
Teuchos::RCP< const std::vector< stk::mesh::Entity > > getFacesOrderedByLID() const
void setDispFieldData(const std::string &fieldName, const std::string &blockId, int axis, const std::vector< std::size_t > &localElementIds, const ArrayT &solutionValues)
stk::mesh::EntityId elementGlobalId(stk::mesh::Entity elmt) const
std::map< std::string, Teuchos::RCP< shards::CellTopology > > elementBlockCT_
stk::mesh::EntityRank getSideRank() const
Get the STK entity rank corresponding to sides (dimension one lower than element rank).
Teuchos::RCP< Teuchos::MpiComm< int > > mpiComm_
ProcIdFieldType * processorIdField_
bool validBlockId(const std::string &blockId) const
stk::mesh::EntityId edgeGlobalId(stk::mesh::Entity edge) const
void addFaceField(const std::string &fieldName, const std::string &blockId)
std::map< std::string, stk::mesh::Part * > edgeBlocks_
void print(std::ostream &os) const
STK_Interface()
Construct with no spatial dimension set. addElementBlock() and initialize() must be used to set it up...
void getMyElements(std::vector< stk::mesh::Entity > &elements) const
stk::mesh::Part * getOwnedPart() const
Get a pointer to the locally owned part.
void addElementBlock(const std::string &name, const CellTopologyData *ctData)
ProcIdFieldType * getProcessorIdField()
Get the field holding each entity's owning processor rank.
bool isWritable() const
Returns true if the mesh can be written out to Exodus (i.e. is IOSS/output set up)?
void addFaceBlock(const std::string &elemBlockName, const std::string &faceBlockName, const stk::topology &topology)
Teuchos::RCP< stk::mesh::BulkData > getBulkData() const
Returns the underlying STK bulk data object.
void addFaces()
Builds face entities for the mesh from its existing elements.
std::map< std::string, std::vector< std::string > > meshDispFields_
static const std::string faceBlockString
std::vector< stk::mesh::Part * > facesPartVec_
bool useFieldCoordinates_
void printMetaData(std::ostream &os) const
void instantiateBulkData(stk::ParallelMachine parallelMach)
void getElementNodes_FromCoordsNoResize(const std::vector< stk::mesh::Entity > &elements, ArrayT &nodes) const
but the node array will not be resized.
stk::mesh::EntityId faceGlobalId(std::size_t lid) const
std::map< std::pair< std::string, std::string >, SolutionFieldType * > fieldNameToCellField_
std::size_t edgeLocalId(stk::mesh::Entity elmt) const
std::map< std::string, stk::mesh::Part * > elementBlocks_
static const std::string coordsString
void getSolutionFieldData(const std::string &fieldName, const std::string &blockId, const std::vector< std::size_t > &localElementIds, ArrayT &solutionValues) const
void setUseLowerCaseForIO(bool useLowerCase)
Teuchos::RCP< Teuchos::MpiComm< int > > getSafeCommunicator(stk::ParallelMachine parallelMach) const
std::size_t getNumElementBlocks() const
get the block count
void setBoundingBoxSearchFlag(const bool &searchFlag)
stk::mesh::Part * getFaceBlock(const std::string &name) const
get the block part
stk::mesh::EntityRank getEdgeRank() const
Get the STK entity rank corresponding to edges.
stk::mesh::Part * getSideset(const std::string &name) const
Teuchos::RCP< ElementDescriptor > buildElementDescriptor(stk::mesh::EntityId elmtId, std::vector< stk::mesh::EntityId > &nodes)
EdgeBlockException(const std::string &what)
ElementBlockException(const std::string &what)
FaceBlockException(const std::string &what)
SidesetException(const std::string &what)