61 #include "Phalanx_KokkosDeviceTypes.hpp" 
   63 #include "Teuchos_Assert.hpp" 
   66 #include "Tpetra_Import.hpp" 
   67 #include "Tpetra_CrsMatrix.hpp" 
   68 #include "Tpetra_RowMatrixTransposer.hpp" 
   73 #include <unordered_set> 
   87                    Kokkos::View<panzer::GlobalOrdinal*> & globals)
 
   90   std::vector<shards::CellTopology> elementBlockTopologies;
 
   92   const shards::CellTopology & topology = elementBlockTopologies[0];
 
   95   for(
const auto & other_topology : elementBlockTopologies){
 
  100   if(topology.getDimension() == 1){
 
  102   } 
else if(topology.getDimension() == 2){
 
  104   } 
else if(topology.getDimension() == 3){
 
  112   std::vector<std::string> block_ids;
 
  115   std::size_t totalSize = 0;
 
  116   for (std::size_t which_blk=0;which_blk<block_ids.size();which_blk++) {
 
  118     const std::vector<int> & localIDs = conn.
getElementBlock(block_ids[which_blk]);
 
  119     totalSize += localIDs.size();
 
  121   globals = Kokkos::View<panzer::GlobalOrdinal*>(
"global_cells",totalSize);
 
  123   for (std::size_t 
id=0;
id<totalSize; ++id) {
 
  129     globals(
id) = connectivity[0];
 
  139 buildCellToNodes(
panzer::ConnManager & conn, Kokkos::View<panzer::GlobalOrdinal**> & globals)
 
  142   std::vector<shards::CellTopology> elementBlockTopologies;
 
  144   const shards::CellTopology & topology = elementBlockTopologies[0];
 
  147   for(
const auto & other_topology : elementBlockTopologies){
 
  155   std::vector<std::string> block_ids;
 
  159   std::size_t totalCells=0, maxNodes=0;
 
  160   for (std::size_t which_blk=0;which_blk<block_ids.size();which_blk++) {
 
  162     const std::vector<int> & localIDs = conn.
getElementBlock(block_ids[which_blk]);
 
  163     if ( localIDs.size() == 0 )
 
  167     totalCells += localIDs.size();
 
  168     maxNodes = maxNodes<Teuchos::as<std::size_t>(thisSize) ? Teuchos::as<std::size_t>(thisSize) : maxNodes;
 
  170   globals = Kokkos::View<panzer::GlobalOrdinal**>(
"cell_to_node",totalCells,maxNodes);
 
  173   for (std::size_t 
id=0;
id<totalCells; ++id) {
 
  177     for(
int n=0;n<nodeCnt;n++)
 
  178       globals(
id,n) = connectivity[n];
 
  186                     Kokkos::View<const panzer::GlobalOrdinal**> cells_to_nodes)
 
  203   typedef Tpetra::Map<panzer::LocalOrdinal,panzer::GlobalOrdinal,panzer::TpetraNodeType> map_type;
 
  206   std::set<panzer::GlobalOrdinal> global_nodes;
 
  207   for(
unsigned int i=0;i<cells_to_nodes.extent(0);i++)
 
  208     for(
unsigned int j=0;j<cells_to_nodes.extent(1);j++)
 
  209       global_nodes.insert(cells_to_nodes(i,j));
 
  212   Kokkos::View<panzer::GlobalOrdinal*> node_ids(
"global_nodes",global_nodes.size());
 
  214   for(
auto itr=global_nodes.begin();itr!=global_nodes.end();++itr,++i)
 
  228                       Kokkos::View<const panzer::GlobalOrdinal*> owned_cells,
 
  229                       Kokkos::View<const panzer::GlobalOrdinal**> owned_cells_to_nodes)
 
  234   typedef Tpetra::Map<panzer::LocalOrdinal,panzer::GlobalOrdinal,panzer::TpetraNodeType> map_type;
 
  235   typedef Tpetra::CrsMatrix<panzer::LocalOrdinal,panzer::LocalOrdinal,panzer::GlobalOrdinal,panzer::TpetraNodeType> crs_type;
 
  236   typedef Tpetra::Import<panzer::LocalOrdinal,panzer::GlobalOrdinal,panzer::TpetraNodeType> import_type;
 
  239   PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer_stk::buildNodeToCellMatrix",BNTCM);
 
  241   TEUCHOS_ASSERT(owned_cells.extent(0)==owned_cells_to_nodes.extent(0));
 
  246   auto node_map = buildNodeMap(comm,owned_cells_to_nodes);
 
  249   auto unique_node_map  = Tpetra::createOneToOne(node_map);
 
  256   RCP<crs_type> cell_to_node;
 
  258     PANZER_FUNC_TIME_MONITOR_DIFF(
"Build matrix",BuildMatrix);
 
  260     cell_to_node = 
rcp(
new crs_type(cell_map,0));
 
  263     const unsigned int num_local_cells = owned_cells_to_nodes.extent(0);
 
  264     const unsigned int num_nodes_per_cell = owned_cells_to_nodes.extent(1);
 
  265     std::vector<panzer::LocalOrdinal> local_node_indexes(num_nodes_per_cell);
 
  266     std::vector<panzer::GlobalOrdinal> global_node_indexes(num_nodes_per_cell);
 
  267     for(
unsigned int i=0;i<num_local_cells;i++) {
 
  268       const panzer::GlobalOrdinal global_cell_index = owned_cells(i);
 
  271       for(
unsigned int j=0;j<num_nodes_per_cell;j++) {
 
  274         local_node_indexes[j] = Teuchos::as<panzer::LocalOrdinal>(j);
 
  275         global_node_indexes[j] = owned_cells_to_nodes(i,j);
 
  279       cell_to_node->insertGlobalValues(global_cell_index,global_node_indexes,local_node_indexes);
 
  281     cell_to_node->fillComplete(unique_node_map,cell_map);
 
  286   RCP<crs_type> node_to_cell;
 
  288     PANZER_FUNC_TIME_MONITOR_DIFF(
"Tranpose matrix",TransposeMatrix);
 
  291     Tpetra::RowMatrixTransposer<panzer::LocalOrdinal,panzer::LocalOrdinal,panzer::GlobalOrdinal,panzer::TpetraNodeType> transposer(cell_to_node);
 
  294     auto trans = transposer.createTranspose();
 
  298     RCP<import_type> 
import = 
rcp(
new import_type(unique_node_map,node_map));
 
  302     node_to_cell = 
rcp(
new crs_type(node_map,0));
 
  305     node_to_cell->doImport(*trans,*
import,Tpetra::INSERT);
 
  309     node_to_cell->fillComplete(cell_map,unique_node_map);
 
  318 Kokkos::View<const panzer::GlobalOrdinal*>
 
  320                         Kokkos::View<const panzer::GlobalOrdinal*> cells,
 
  321                         Kokkos::View<const panzer::GlobalOrdinal**> cells_to_nodes)
 
  324   PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer_stk::buildGhostedCellOneRing",BGCOR);
 
  325   typedef Tpetra::CrsMatrix<int,int,panzer::GlobalOrdinal,panzer::TpetraNodeType> crs_type;
 
  357   std::unordered_set<panzer::GlobalOrdinal> unique_cells;
 
  361   for(
size_t i=0;i<cells.extent(0);i++) {
 
  362     unique_cells.insert(cells(i));
 
  366   std::set<panzer::GlobalOrdinal> ghstd_cells_set;
 
  370   auto node_map = node_to_cell->getMap()->getMyGlobalIndices();
 
  373   for(
size_t i=0;i<node_map.extent(0);i++) {
 
  374     const panzer::GlobalOrdinal global_node_index = node_map(i);
 
  375     size_t numEntries = node_to_cell->getNumEntriesInGlobalRow(node_map(i));
 
  380     node_to_cell->getGlobalRowCopy(global_node_index,indices,values,numEntries);
 
  382     for(
auto index : indices) {
 
  385       if(unique_cells.find(index)==unique_cells.end()) {
 
  386         ghstd_cells_set.insert(index);
 
  387         unique_cells.insert(index); 
 
  394   Kokkos::View<panzer::GlobalOrdinal*> ghstd_cells(
"ghstd_cells",ghstd_cells_set.size());
 
  395   for(
auto global_cell_index : ghstd_cells_set) {
 
  396     ghstd_cells(indx) = global_cell_index;
 
  408 Kokkos::DynRankView<double,PHX::Device>
 
  409 buildGhostedVertices(
const Tpetra::Import<int,panzer::GlobalOrdinal,panzer::TpetraNodeType> & importer,
 
  410                      Kokkos::DynRankView<const double,PHX::Device> owned_vertices)
 
  415   typedef Tpetra::MultiVector<double,int,panzer::GlobalOrdinal,panzer::TpetraNodeType> mvec_type;
 
  416   typedef typename mvec_type::dual_view_type dual_view_type;
 
  418   size_t owned_cell_cnt = importer.getSourceMap()->getNodeNumElements();
 
  419   size_t ghstd_cell_cnt = importer.getTargetMap()->getNodeNumElements();
 
  420   int vertices_per_cell = owned_vertices.extent(1);
 
  421   int space_dim         = owned_vertices.extent(2);
 
  426   RCP<mvec_type> owned_vertices_mv   = 
rcp(
new mvec_type(importer.getSourceMap(),vertices_per_cell*space_dim));
 
  427   RCP<mvec_type> ghstd_vertices_mv = 
rcp(
new mvec_type(importer.getTargetMap(),vertices_per_cell*space_dim));
 
  430     auto owned_vertices_view = owned_vertices_mv->template getLocalView<dual_view_type>();
 
  431     for(
size_t i=0;i<owned_cell_cnt;i++) {
 
  433       for(
int j=0;j<vertices_per_cell;j++)
 
  434         for(
int k=0;k<space_dim;k++,l++)
 
  435           owned_vertices_view(i,l) = owned_vertices(i,j,k);
 
  440   ghstd_vertices_mv->doImport(*owned_vertices_mv,importer,Tpetra::INSERT);
 
  443   Kokkos::DynRankView<double,PHX::Device> ghstd_vertices(
"ghstd_vertices",ghstd_cell_cnt,vertices_per_cell,space_dim);
 
  445     auto ghstd_vertices_view = ghstd_vertices_mv->template getLocalView<dual_view_type>();
 
  446     for(
size_t i=0;i<ghstd_cell_cnt;i++) {
 
  448       for(
int j=0;j<vertices_per_cell;j++)
 
  449         for(
int k=0;k<space_dim;k++,l++)
 
  450           ghstd_vertices(i,j,k) = ghstd_vertices_view(i,l);
 
  454   return ghstd_vertices;
 
  461                         const std::string & element_block_name,
 
  472     const shards::CellTopology & topology = *(mesh.
getCellTopology(element_block_name));
 
  474     if(topology.getDimension() == 1){
 
  476     } 
else if(topology.getDimension() == 2){
 
  478     } 
else if(topology.getDimension() == 3){
 
  483       PANZER_FUNC_TIME_MONITOR(
"Build connectivity");
 
  488   std::vector<panzer::LocalOrdinal> owned_block_cells;
 
  489   for(
int parent_owned_cell=0;parent_owned_cell<num_parent_owned_cells;++parent_owned_cell){
 
  490     const panzer::LocalOrdinal local_cell = mesh_info.
local_cells(parent_owned_cell);
 
  491     const bool is_in_block = conn.
getBlockId(local_cell) == element_block_name;
 
  494       owned_block_cells.push_back(parent_owned_cell);
 
  499   if ( owned_block_cells.size() == 0 )
 
  505     PANZER_FUNC_TIME_MONITOR(
"panzer::partitioning_utilities::setupSubLocalMeshInfo");
 
  515                           const std::string & element_block_name,
 
  516                           const std::string & sideset_name,
 
  523   const size_t face_subcell_dimension = mesh.
getCellTopology(element_block_name)->getDimension()-1;
 
  525   Kokkos::DynRankView<double,PHX::Device> data_allocation;
 
  528   std::vector<stk::mesh::Entity> side_entities;
 
  534     mesh.
getMySides(sideset_name, element_block_name, side_entities);
 
  536   } 
catch(STK_Interface::SidesetException & e) {
 
  537      std::stringstream ss;
 
  538      std::vector<std::string> sideset_names;
 
  542      ss << e.what() << 
"\nChoose existing sideset:\n";
 
  543      for(
const auto & optional_sideset_name : sideset_names){
 
  544         ss << 
"\t\"" << optional_sideset_name << 
"\"\n";
 
  549   } 
catch(STK_Interface::ElementBlockException & e) {
 
  550      std::stringstream ss;
 
  551      std::vector<std::string> element_block_names;
 
  555      ss << e.what() << 
"\nChoose existing element block:\n";
 
  556      for(
const auto & optional_element_block_name : element_block_names){
 
  557         ss << 
"\t\"" << optional_element_block_name << 
"\"\n";
 
  562   } 
catch(std::logic_error & e) {
 
  563      std::stringstream ss;
 
  564      ss << e.what() << 
"\nUnrecognized logic error.\n";
 
  573   std::map<std::pair<size_t,size_t>, std::vector<size_t> > local_cell_indexes_by_subcell;
 
  582   std::vector<stk::mesh::Entity> elements;
 
  583   std::vector<size_t> subcell_indexes;
 
  584   std::vector<size_t> subcell_dimensions;
 
  586   const panzer::LocalOrdinal num_elements = subcell_dimensions.size();
 
  589   for(panzer::LocalOrdinal element_index=0; element_index<num_elements; ++element_index) {
 
  590     const size_t subcell_dimension = subcell_dimensions[element_index];
 
  591     const size_t subcell_index = subcell_indexes[element_index];
 
  592     const size_t element_local_index = mesh.
elementLocalId(elements[element_index]);
 
  595     local_cell_indexes_by_subcell[std::pair<size_t,size_t>(subcell_dimension, subcell_index)].push_back(element_local_index);
 
  603   std::unordered_set<panzer::LocalOrdinal> owned_parent_cells_set;
 
  604   std::map<panzer::LocalOrdinal,std::vector<panzer::LocalOrdinal> > owned_parent_cell_index_map;
 
  607     for(
const auto & cell_subcell_pair : local_cell_indexes_by_subcell){
 
  608       const std::pair<size_t,size_t> & subcell_definition = cell_subcell_pair.first;
 
  609       const panzer::LocalOrdinal subcell_index = panzer::LocalOrdinal(subcell_definition.second);
 
  610       if(subcell_definition.first == face_subcell_dimension){
 
  611         const std::vector<size_t> & local_cell_indexes_for_subcell = cell_subcell_pair.second;
 
  612         for(
const size_t & local_cell_index : local_cell_indexes_for_subcell){
 
  615           for(panzer::LocalOrdinal i=0;i<panzer::LocalOrdinal(mesh_info.
local_cells.extent(0)); ++i){
 
  616             if(mesh_info.
local_cells(i) == panzer::LocalOrdinal(local_cell_index)){
 
  617               owned_parent_cell_index_map[i].push_back(subcell_index);
 
  624     for(
const auto & pair : owned_parent_cell_index_map){
 
  625       owned_parent_cells_set.insert(pair.first);
 
  630   const panzer::LocalOrdinal num_owned_cells = owned_parent_cell_index_map.size();
 
  639     face_t(panzer::LocalOrdinal c0, panzer::LocalOrdinal c1, panzer::LocalOrdinal sc0, panzer::LocalOrdinal sc1)
 
  646     panzer::LocalOrdinal cell_0;
 
  647     panzer::LocalOrdinal cell_1;
 
  648     panzer::LocalOrdinal subcell_index_0;
 
  649     panzer::LocalOrdinal subcell_index_1;
 
  654   std::unordered_set<panzer::LocalOrdinal> ghstd_parent_cells_set, virtual_parent_cells_set;
 
  655   std::vector<face_t> faces;
 
  658     for(
const auto & local_cell_index_pair : owned_parent_cell_index_map){
 
  659       const panzer::LocalOrdinal local_cell = local_cell_index_pair.first;
 
  660       const std::vector<panzer::LocalOrdinal> & subcell_indexes_vec = local_cell_index_pair.second;
 
  662       for(
const panzer::LocalOrdinal & subcell_index : subcell_indexes_vec){
 
  664         const panzer::LocalOrdinal face = mesh_info.
cell_to_faces(local_cell, subcell_index);
 
  665         const panzer::LocalOrdinal face_other_side = (mesh_info.
face_to_cells(face,0) == local_cell) ? 1 : 0;
 
  669         const panzer::LocalOrdinal other_side_cell = mesh_info.
face_to_cells(face, face_other_side);
 
  670         const panzer::LocalOrdinal other_side_subcell_index = mesh_info.
face_to_lidx(face, face_other_side);
 
  672         faces.push_back(face_t(local_cell, other_side_cell, subcell_index, other_side_subcell_index));
 
  674         if(other_side_cell >= parent_virtual_cell_offset){
 
  675           virtual_parent_cells_set.insert(other_side_cell);
 
  677           ghstd_parent_cells_set.insert(other_side_cell);
 
  683   std::vector<panzer::LocalOrdinal> all_cells;
 
  684   all_cells.insert(all_cells.end(),owned_parent_cells_set.begin(),owned_parent_cells_set.end());
 
  685   all_cells.insert(all_cells.end(),ghstd_parent_cells_set.begin(),ghstd_parent_cells_set.end());
 
  686   all_cells.insert(all_cells.end(),virtual_parent_cells_set.begin(),virtual_parent_cells_set.end());
 
  692   const panzer::LocalOrdinal num_total_cells = num_real_cells + sideset_info.
num_virtual_cells;
 
  693   const panzer::LocalOrdinal num_vertices_per_cell = mesh_info.
cell_vertices.extent(1);
 
  694   const panzer::LocalOrdinal num_dims = mesh_info.
cell_vertices.extent(2);
 
  696   sideset_info.
global_cells = Kokkos::View<panzer::GlobalOrdinal*>(
"global_cells", num_total_cells);
 
  697   sideset_info.
local_cells = Kokkos::View<panzer::LocalOrdinal*>(
"local_cells", num_total_cells);
 
  698   sideset_info.
cell_vertices = Kokkos::View<double***,PHX::Device>(
"cell_vertices", num_total_cells, num_vertices_per_cell, num_dims);
 
  701   for(panzer::LocalOrdinal i=0; i<num_total_cells; ++i){
 
  702     const panzer::LocalOrdinal parent_cell = all_cells[i];
 
  705     for(panzer::LocalOrdinal j=0; j<num_vertices_per_cell; ++j){
 
  706       for(panzer::LocalOrdinal k=0; k<num_dims; ++k){
 
  714   const panzer::LocalOrdinal num_faces = faces.size();
 
  715   const panzer::LocalOrdinal num_faces_per_cell = mesh_info.
cell_to_faces.extent(1);
 
  717   sideset_info.
face_to_cells = Kokkos::View<panzer::LocalOrdinal*[2]>(
"face_to_cells", num_faces);
 
  718   sideset_info.
face_to_lidx = Kokkos::View<panzer::LocalOrdinal*[2]>(
"face_to_lidx", num_faces);
 
  719   sideset_info.
cell_to_faces = Kokkos::View<panzer::LocalOrdinal**>(
"cell_to_faces", num_total_cells, num_faces_per_cell);
 
  724   for(
int face_index=0;face_index<num_faces;++face_index){
 
  725     const face_t & face = faces[face_index];
 
  726     const panzer::LocalOrdinal & cell_0 = face.cell_0;
 
  727     const panzer::LocalOrdinal & cell_1 = face.cell_1;
 
  730     const panzer::LocalOrdinal sideset_cell_0 = std::distance(all_cells.begin(), std::find(all_cells.begin(), all_cells.end(), cell_0));
 
  731     const panzer::LocalOrdinal sideset_cell_1 = std::distance(all_cells.begin(), std::find(all_cells.begin()+num_owned_cells, all_cells.end(), cell_1));
 
  736     sideset_info.
face_to_lidx(face_index,0) = face.subcell_index_0;
 
  737     sideset_info.
face_to_lidx(face_index,1) = face.subcell_index_1;
 
  739     sideset_info.
cell_to_faces(sideset_cell_0,face.subcell_index_0) = face_index;
 
  740     sideset_info.
cell_to_faces(sideset_cell_1,face.subcell_index_1) = face_index;
 
  756   typedef Tpetra::Map<panzer::LocalOrdinal,panzer::GlobalOrdinal,panzer::TpetraNodeType> map_type;
 
  757   typedef Tpetra::Import<panzer::LocalOrdinal,panzer::GlobalOrdinal,panzer::TpetraNodeType> import_type;
 
  780   Kokkos::View<panzer::GlobalOrdinal**> owned_cell_to_nodes;
 
  781   buildCellToNodes(conn, owned_cell_to_nodes);
 
  785   Kokkos::View<panzer::GlobalOrdinal*> owned_cells;
 
  786   buildCellGlobalIDs(conn, owned_cells);
 
  790   Kokkos::View<const panzer::GlobalOrdinal*> ghstd_cells = buildGhostedCellOneRing(comm,owned_cells,owned_cell_to_nodes);
 
  799   RCP<import_type> cellimport_own2ghst = 
rcp(
new import_type(owned_cell_map,ghstd_cell_map));
 
  804   for(
size_t i=0;i<localCells.size();i++){
 
  809   std::vector<std::string> element_block_names;
 
  812   const shards::CellTopology & cell_topology = *(mesh.
getCellTopology(element_block_names[0]));
 
  814   const int space_dim = cell_topology.getDimension();
 
  815   const int vertices_per_cell = cell_topology.getVertexCount();
 
  816   const int faces_per_cell = cell_topology.getSubcellCount(space_dim-1);
 
  819   Kokkos::DynRankView<double,PHX::Device> owned_vertices(
"owned_vertices",localCells.size(),vertices_per_cell,space_dim);
 
  823   Kokkos::DynRankView<double,PHX::Device> ghstd_vertices = buildGhostedVertices(*cellimport_own2ghst,owned_vertices);
 
  828   std::unordered_map<panzer::GlobalOrdinal,int> global_to_local;
 
  829   global_to_local[-1] = -1; 
 
  830   for(
size_t i=0;i<owned_cells.extent(0);i++)
 
  831     global_to_local[owned_cells(i)] = i;
 
  832   for(
size_t i=0;i<ghstd_cells.extent(0);i++)
 
  833     global_to_local[ghstd_cells(i)] = i+Teuchos::as<int>(owned_cells.extent(0));
 
  837   faceToElement->initialize(conn);
 
  838   auto elems_by_face = faceToElement->getFaceToElementsMap();
 
  839   auto face_to_lidx  = faceToElement->getFaceToCellLocalIdxMap();
 
  841   const int num_owned_cells =owned_cells.extent(0);
 
  842   const int num_ghstd_cells =ghstd_cells.extent(0);
 
  855   std::vector<int> all_boundary_faces;
 
  856   const int num_faces = elems_by_face.extent(0);
 
  857   for(
int face=0;face<num_faces;++face){
 
  858     if(elems_by_face(face,0) < 0 or elems_by_face(face,1) < 0){
 
  859       all_boundary_faces.push_back(face);
 
  862   const panzer::LocalOrdinal num_virtual_cells = all_boundary_faces.size();
 
  865   const panzer::LocalOrdinal num_real_cells = num_owned_cells + num_ghstd_cells;
 
  866   const panzer::LocalOrdinal num_total_cells = num_real_cells + num_virtual_cells;
 
  867   const panzer::LocalOrdinal num_total_faces = elems_by_face.extent(0);
 
  871   Kokkos::View<panzer::GlobalOrdinal*> virtual_cells = Kokkos::View<panzer::GlobalOrdinal*>(
"virtual_cells",num_virtual_cells);
 
  873     PANZER_FUNC_TIME_MONITOR_DIFF(
"Initial global index creation",InitialGlobalIndexCreation);
 
  875     const int num_ranks = comm->getSize();
 
  876     const int rank = comm->getRank();
 
  878     std::vector<panzer::GlobalOrdinal> owned_cell_distribution(num_ranks,0);
 
  880       std::vector<panzer::GlobalOrdinal> my_owned_cell_distribution(num_ranks,0);
 
  881       my_owned_cell_distribution[rank] = num_owned_cells;
 
  886     std::vector<panzer::GlobalOrdinal> virtual_cell_distribution(num_ranks,0);
 
  888       std::vector<panzer::GlobalOrdinal> my_virtual_cell_distribution(num_ranks,0);
 
  889       my_virtual_cell_distribution[rank] = num_virtual_cells;
 
  894     panzer::GlobalOrdinal num_global_real_cells=0;
 
  895     for(
int i=0;i<num_ranks;++i){
 
  896       num_global_real_cells+=owned_cell_distribution[i];
 
  899     panzer::GlobalOrdinal global_virtual_start_idx = num_global_real_cells;
 
  900     for(
int i=0;i<rank;++i){
 
  901       global_virtual_start_idx += virtual_cell_distribution[i];
 
  904     for(
int i=0;i<num_virtual_cells;++i){
 
  905       virtual_cells(i) = global_virtual_start_idx + panzer::GlobalOrdinal(i);
 
  911   Kokkos::View<panzer::LocalOrdinal*[2]> face_to_cells = Kokkos::View<panzer::LocalOrdinal*[2]>(
"face_to_cells",num_total_faces);
 
  914   Kokkos::View<panzer::LocalOrdinal*[2]> face_to_localidx = Kokkos::View<panzer::LocalOrdinal*[2]>(
"face_to_localidx",num_total_faces);
 
  917   Kokkos::View<panzer::LocalOrdinal**> cell_to_face = Kokkos::View<panzer::LocalOrdinal**>(
"cell_to_face",num_total_cells,faces_per_cell);
 
  920   Kokkos::deep_copy(cell_to_face,-1);
 
  924     PANZER_FUNC_TIME_MONITOR_DIFF(
"Transer faceToElement to local",TransferFaceToElementLocal);
 
  926     int virtual_cell_index = num_real_cells;
 
  927     for(
size_t f=0;f<elems_by_face.extent(0);f++) {
 
  929       const panzer::GlobalOrdinal global_c0 = elems_by_face(f,0);
 
  930       const panzer::GlobalOrdinal global_c1 = elems_by_face(f,1);
 
  933       TEUCHOS_ASSERT(global_to_local.find(global_c0)!=global_to_local.end());
 
  934       TEUCHOS_ASSERT(global_to_local.find(global_c1)!=global_to_local.end());
 
  936       auto c0 = global_to_local[global_c0];
 
  937       auto lidx0 = face_to_lidx(f,0);
 
  938       auto c1 = global_to_local[global_c1];
 
  939       auto lidx1 = face_to_lidx(f,1);
 
  946         c0 = virtual_cell_index++;
 
  953       cell_to_face(c0,lidx0) = f;
 
  959         c1 = virtual_cell_index++;
 
  966       cell_to_face(c1,lidx1) = f;
 
  970         face_to_cells(f,0) = c0;
 
  971         face_to_localidx(f,0) = lidx0;
 
  972         face_to_cells(f,1) = c1;
 
  973         face_to_localidx(f,1) = lidx1;
 
  975         face_to_cells(f,0) = c1;
 
  976         face_to_localidx(f,0) = lidx1;
 
  977         face_to_cells(f,1) = c0;
 
  978         face_to_localidx(f,1) = lidx0;
 
  992     PANZER_FUNC_TIME_MONITOR_DIFF(
"Assign Indices",AssignIndices);
 
 1001     mesh_info.
global_cells = Kokkos::View<panzer::GlobalOrdinal*>(
"global_cell_indices",num_total_cells);
 
 1002     mesh_info.
local_cells = Kokkos::View<panzer::LocalOrdinal*>(
"local_cell_indices",num_total_cells);
 
 1004     for(
int i=0;i<num_owned_cells;++i){
 
 1009     for(
int i=0;i<num_ghstd_cells;++i){
 
 1010       mesh_info.
global_cells(i+num_owned_cells) = ghstd_cells(i);
 
 1011       mesh_info.
local_cells(i+num_owned_cells) = i+num_owned_cells;
 
 1014     for(
int i=0;i<num_virtual_cells;++i){
 
 1015       mesh_info.
global_cells(i+num_real_cells) = virtual_cells(i);
 
 1016       mesh_info.
local_cells(i+num_real_cells) = i+num_real_cells;
 
 1019     mesh_info.
cell_vertices = Kokkos::View<double***, PHX::Device>(
"cell_vertices",num_total_cells,vertices_per_cell,space_dim);
 
 1024     for(
int i=0;i<num_owned_cells;++i){
 
 1025       for(
int j=0;j<vertices_per_cell;++j){
 
 1026         for(
int k=0;k<space_dim;++k){
 
 1032     for(
int i=0;i<num_ghstd_cells;++i){
 
 1033       for(
int j=0;j<vertices_per_cell;++j){
 
 1034         for(
int k=0;k<space_dim;++k){
 
 1035           mesh_info.
cell_vertices(i+num_owned_cells,j,k) = ghstd_vertices(i,j,k);
 
 1043       PANZER_FUNC_TIME_MONITOR_DIFF(
"Assign geometry traits",AssignGeometryTraits);
 
 1044       for(
int i=0;i<num_virtual_cells;++i){
 
 1046         const panzer::LocalOrdinal virtual_cell = i+num_real_cells;
 
 1047         bool exists = 
false;
 
 1048         for(
int local_face=0; local_face<faces_per_cell; ++local_face){
 
 1049           const panzer::LocalOrdinal face = cell_to_face(virtual_cell, local_face);
 
 1052             const panzer::LocalOrdinal other_side = (face_to_cells(face, 0) == virtual_cell) ? 1 : 0;
 
 1053             const panzer::LocalOrdinal real_cell = face_to_cells(face,other_side);
 
 1055             for(
int j=0;j<vertices_per_cell;++j){
 
 1056               for(
int k=0;k<space_dim;++k){
 
 1069   std::vector<std::string> sideset_names;
 
 1072   for(
const std::string & element_block_name : element_block_names){
 
 1073     PANZER_FUNC_TIME_MONITOR_DIFF(
"Set up setupLocalMeshBlockInfo",SetupLocalMeshBlockInfo);
 
 1075     setupLocalMeshBlockInfo(mesh, conn, mesh_info, element_block_name, block_info);
 
 1078     for(
const std::string & sideset_name : sideset_names){
 
 1079       PANZER_FUNC_TIME_MONITOR_DIFF(
"Setup LocalMeshSidesetInfo",SetupLocalMeshSidesetInfo);
 
 1081       setupLocalMeshSidesetInfo(mesh, conn, mesh_info, element_block_name, sideset_name, sideset_info);
 
void getSidesetNames(std::vector< std::string > &name) const 
 
std::map< std::string, std::map< std::string, LocalMeshSidesetInfo > > sidesets
 
Kokkos::View< double ***, PHX::Device > cell_vertices
 
std::string element_block_name
 
void getElementVerticesNoResize(const std::vector< std::size_t > &localIds, ArrayT &vertices) const 
 
Kokkos::View< panzer::LocalOrdinal * > local_cells
 
void getElementBlockNames(std::vector< std::string > &names) const 
 
Teuchos::RCP< const shards::CellTopology > cell_topology
 
void generateLocalMeshInfo(const panzer_stk::STK_Interface &mesh, panzer::LocalMeshInfo &mesh_info)
 
virtual LocalOrdinal getConnectivitySize(LocalOrdinal localElmtId) const =0
 
Kokkos::View< panzer::GlobalOrdinal * > global_cells
 
panzer::LocalOrdinal num_owned_cells
 
Kokkos::View< panzer::LocalOrdinal *[2]> face_to_cells
 
void getMySides(const std::string &sideName, std::vector< stk::mesh::Entity > &sides) const 
 
std::size_t elementLocalId(stk::mesh::Entity elmt) const 
 
panzer::LocalOrdinal num_virtual_cells
 
Teuchos::RCP< const shards::CellTopology > cell_topology
 
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
 
#define TEUCHOS_TEST_FOR_EXCEPT_MSG(throw_exception_test, msg)
 
virtual const std::vector< LocalOrdinal > & getElementBlock(const std::string &blockID) const =0
 
virtual void getElementBlockIds(std::vector< std::string > &elementBlockIds) const =0
 
Pure virtual base class for supplying mesh connectivity information to the DOF Manager. 
 
TEUCHOS_DEPRECATED void reduceAll(const Comm< Ordinal > &comm, const EReductionType reductType, const Packet &send, Packet *globalReduct)
 
virtual void getElementBlockTopologies(std::vector< shards::CellTopology > &elementBlockTopologies) const =0
 
panzer::LocalOrdinal num_ghstd_cells
 
std::map< std::string, LocalMeshBlockInfo > element_blocks
 
bool isInitialized() const 
Has initialize been called on this mesh object? 
 
Kokkos::View< panzer::LocalOrdinal *[2]> face_to_lidx
 
Kokkos::View< panzer::LocalOrdinal ** > cell_to_faces
 
std::string element_block_name
 
Teuchos::RCP< const Teuchos::Comm< int > > getComm() const 
get the comm associated with this mesh 
 
#define TEUCHOS_ASSERT(assertion_test)
 
void getSideElementCascade(const panzer_stk::STK_Interface &mesh, const std::string &blockId, const std::vector< stk::mesh::Entity > &sides, std::vector< std::size_t > &localSubcellDim, std::vector< std::size_t > &localSubcellIds, std::vector< stk::mesh::Entity > &elements)
 
void setupSubLocalMeshInfo(const panzer::LocalMeshInfoBase &parent_info, const std::vector< panzer::LocalOrdinal > &owned_parent_cells, panzer::LocalMeshInfoBase &sub_info)
 
virtual void buildConnectivity(const FieldPattern &fp)=0
 
Teuchos::RCP< const shards::CellTopology > getCellTopology(const std::string &eBlock) const 
 
#define TEUCHOS_FUNC_TIME_MONITOR_DIFF(FUNCNAME, DIFF)
 
virtual std::string getBlockId(LocalOrdinal localElmtId) const =0
 
#define TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(throw_exception_test, Exception, msg)
 
virtual const GlobalOrdinal * getConnectivity(LocalOrdinal localElmtId) const =0