unsigned Albany::STKDiscretization::determine_local_side_id( const stk::mesh::Entity & elem , stk::mesh::Entity & side ) { using namespace stk; const CellTopologyData * const elem_top = mesh::fem::get_cell_topology( elem ).getCellTopologyData(); const mesh::PairIterRelation elem_nodes = elem.relations( mesh::fem::FEMMetaData::NODE_RANK ); const mesh::PairIterRelation side_nodes = side.relations( mesh::fem::FEMMetaData::NODE_RANK ); int side_id = -1 ; if(elem_nodes.size() == 0 || side_nodes.size() == 0){ // Node relations are not present, look at elem->face int elem_rank = elem.entity_rank(); const mesh::PairIterRelation elem_sides = elem.relations( elem_rank - 1); for ( unsigned i = 0 ; i < elem_sides.size() ; ++i ) { const stk::mesh::Entity & elem_side = *elem_sides[i].entity(); if(elem_side.identifier() == side.identifier()){ // Found the local side in the element side_id = static_cast<int>(i); return side_id; } } if ( side_id < 0 ) { std::ostringstream msg ; msg << "determine_local_side_id( " ; msg << elem_top->name ; msg << " , Element[ " ; msg << elem.identifier(); msg << " ]{" ; for ( unsigned i = 0 ; i < elem_sides.size() ; ++i ) { msg << " " << elem_sides[i].entity()->identifier(); } msg << " } , Side[ " ; msg << side.identifier(); msg << " ] ) FAILED" ; throw std::runtime_error( msg.str() ); } } else { // Conventional elem->node - side->node connectivity present for ( unsigned i = 0 ; side_id == -1 && i < elem_top->side_count ; ++i ) { const CellTopologyData & side_top = * elem_top->side[i].topology ; const unsigned * side_map = elem_top->side[i].node ; if ( side_nodes.size() == side_top.node_count ) { side_id = i ; for ( unsigned j = 0 ; side_id == static_cast<int>(i) && j < side_top.node_count ; ++j ) { mesh::Entity * const elem_node = elem_nodes[ side_map[j] ].entity(); bool found = false ; for ( unsigned k = 0 ; ! found && k < side_top.node_count ; ++k ) { found = elem_node == side_nodes[k].entity(); } if ( ! found ) { side_id = -1 ; } } } } if ( side_id < 0 ) { std::ostringstream msg ; msg << "determine_local_side_id( " ; msg << elem_top->name ; msg << " , Element[ " ; msg << elem.identifier(); msg << " ]{" ; for ( unsigned i = 0 ; i < elem_nodes.size() ; ++i ) { msg << " " << elem_nodes[i].entity()->identifier(); } msg << " } , Side[ " ; msg << side.identifier(); msg << " ]{" ; for ( unsigned i = 0 ; i < side_nodes.size() ; ++i ) { msg << " " << side_nodes[i].entity()->identifier(); } msg << " } ) FAILED" ; throw std::runtime_error( msg.str() ); } } return static_cast<unsigned>(side_id) ; }
inline int Albany::STKDiscretization::gid(const stk::mesh::Entity& node) const { return node.identifier()-1; }
void TestLocalRefinerTet_N_2_1:: refineMethodApply(NodeRegistry::ElementFunctionPrototype function, const stk::mesh::Entity& element, vector<NeededEntityType>& needed_entity_ranks) { //static int n_seq = 400; const CellTopologyData * const cell_topo_data = stk::percept::PerceptMesh::get_cell_topology(element); CellTopology cell_topo(cell_topo_data); const mesh::PairIterRelation elem_nodes = element.relations(stk::mesh::fem::FEMMetaData::NODE_RANK); //VectorFieldType* coordField = m_eMesh.get_coordinates_field(); for (unsigned ineed_ent=0; ineed_ent < needed_entity_ranks.size(); ineed_ent++) { unsigned numSubDimNeededEntities = 0; stk::mesh::EntityRank needed_entity_rank = needed_entity_ranks[ineed_ent].first; if (needed_entity_rank == m_eMesh.edge_rank()) { numSubDimNeededEntities = cell_topo_data->edge_count; } else if (needed_entity_rank == m_eMesh.face_rank()) { numSubDimNeededEntities = cell_topo_data->side_count; } else if (needed_entity_rank == m_eMesh.element_rank()) { numSubDimNeededEntities = 1; } // see how many edges are already marked int num_marked=0; if (needed_entity_rank == m_eMesh.edge_rank()) { for (unsigned iSubDimOrd = 0; iSubDimOrd < numSubDimNeededEntities; iSubDimOrd++) { bool is_empty = m_nodeRegistry->is_empty( element, needed_entity_rank, iSubDimOrd); if (!is_empty) ++num_marked; } } for (unsigned iSubDimOrd = 0; iSubDimOrd < numSubDimNeededEntities; iSubDimOrd++) { /// note: at this level of granularity we can do single edge refinement, hanging nodes, etc. //SubDimCell_SDSEntityType subDimEntity; //getSubDimEntity(subDimEntity, element, needed_entity_rank, iSubDimOrd); //bool is_empty = m_nodeRegistry->is_empty( element, needed_entity_rank, iSubDimOrd); //if(1||!is_empty) if (needed_entity_rank == m_eMesh.edge_rank()) { #if 0 stk::mesh::Entity & node0 = *elem_nodes[cell_topo_data->edge[iSubDimOrd].node[0]].entity(); stk::mesh::Entity & node1 = *elem_nodes[cell_topo_data->edge[iSubDimOrd].node[1]].entity(); double * const coord0 = stk::mesh::field_data( *coordField , node0 ); double * const coord1 = stk::mesh::field_data( *coordField , node1 ); // vertical line position const double vx = 0.21; // horizontal line position const double vy = 1.21; // choose to refine or not if ( ( std::fabs(coord0[0]-coord1[0]) > 1.e-3 && ( (coord0[0] < vx && vx < coord1[0]) || (coord1[0] < vx && vx < coord0[0]) ) ) || ( std::fabs(coord0[1]-coord1[1]) > 1.e-3 && ( (coord0[1] < vy && vy < coord1[1]) || (coord1[1] < vy && vy < coord0[1]) ) ) ) { (m_nodeRegistry ->* function)(element, needed_entity_ranks[ineed_ent], iSubDimOrd, true); } #endif // mark first m_edge_mark_bitcode edges std::cout << "tmp TestLocalRefinerTet_N_2_1 element.identifier() = " << element.identifier() << " m_edge_mark_bitcode= " << m_edge_mark_bitcode << std::endl; if ( ((1 << iSubDimOrd) & m_edge_mark_bitcode) && element.identifier() == 1) (m_nodeRegistry ->* function)(element, needed_entity_ranks[ineed_ent], iSubDimOrd, true); } } // iSubDimOrd } // ineed_ent }