inline iMesh::Error iMesh::getNumOfTopo( EntitySetHandle set, EntityTopology topo, int& count_out ) const { int err; iMesh_getNumOfTopo( mInstance, set, topo, &count_out, &err ); return (Error)err; }
/*! * \brief Build a tree node. */ void Octree::buildTreeNode( RCP_Node node ) { int error = 0; // Create the children. for ( int i = 0; i < 8; ++i ) { node->children[i] = Teuchos::rcp( new OctreeNode ); iMesh_createEntSet( d_mesh, 1, &(node->children[i]->node_set), &error ); assert( iBase_SUCCESS == error ); } // Create the new bounding boxes and assign them to the children. sliceBox( node ); // Add the elements in the parent set to the child sets. std::vector<iBase_EntityHandle> root_list; int node_elements_allocated = 0; int node_elements_size = 0; iBase_EntityHandle *node_elements; iMesh_getEntities( d_mesh, node->node_set, d_entity_type, d_entity_topology, &node_elements, &node_elements_allocated, &node_elements_size, &error ); assert( iBase_SUCCESS == error ); bool element_found = false; for (int n = 0; n < node_elements_size; ++n ) { element_found = false; for ( int m = 0; m < 8; ++m ) { if ( !element_found ) { if ( isEntInBox( node->children[m]->bounding_box, node_elements[n] ) ) { iMesh_addEntToSet( d_mesh, node_elements[n], node->children[m]->node_set, &error ); assert( iBase_SUCCESS == error ); if ( node != d_root_node ) { iMesh_rmvEntFromSet( d_mesh, node_elements[n], node->node_set, &error ); assert( iBase_SUCCESS == error ); } element_found = true; } } } if ( !element_found ) { root_list.push_back( node_elements[n] ); } } free( node_elements ); // Special case for the root node. if ( node == d_root_node ) { iBase_EntitySetHandle new_root_set; iMesh_createEntSet( d_mesh, 1, &new_root_set, &error ); assert( iBase_SUCCESS == error ); iMesh_addEntArrToSet( d_mesh, &root_list[0], (int) root_list.size(), new_root_set, &error ); assert( iBase_SUCCESS == error ); node->node_set = new_root_set; } // See if we have any child entities. Teuchos::Tuple<int,8> num_child_ents; int total_child_ents = 0; for (int i = 0; i < 8; ++i ) { iMesh_getNumOfTopo( d_mesh, node->children[i]->node_set, d_entity_topology, &num_child_ents[i], &error ); assert( iBase_SUCCESS == error ); total_child_ents += num_child_ents[i]; } // Recurse. if ( total_child_ents == 0 ) { node->is_leaf = true; } else { for (int i = 0; i < 8; ++i) { if ( num_child_ents[i] == 0 ) { node->children[i]->is_leaf = true; } else { buildTreeNode( node->children[i] ); } } } }
/*! * \brief Get the bounding box of a set of entities. */ void Octree::getEntSetBox( iBase_EntitySetHandle entity_set, Box &bounding_box ) { int error = 0; int num_set_vertices = 0; iMesh_getNumOfTopo( d_mesh, entity_set, iMesh_POINT, &num_set_vertices, &error ); assert( iBase_SUCCESS == error ); iBase_EntityHandle *set_vertices = 0; int set_vertices_allocated = 0; int set_vertices_size = 0; iMesh_getEntities( d_mesh, entity_set, iBase_VERTEX, iMesh_POINT, &set_vertices, &set_vertices_allocated, &set_vertices_size, &error ); assert( iBase_SUCCESS == error ); int set_coords_allocated = 3*set_vertices_size; int set_coords_size = 0; double *coords = 0; iMesh_getVtxArrCoords( d_mesh, set_vertices, set_vertices_size, iBase_BLOCKED, &coords, &set_coords_allocated, &set_coords_size, &error ); assert( iBase_SUCCESS == error ); Teuchos::ArrayView<double> set_coords( coords, set_coords_size ); Teuchos::ArrayView<double>::const_iterator set_x_it_begin = set_coords.begin(); Teuchos::ArrayView<double>::const_iterator set_x_it_end = set_x_it_begin + set_vertices_size; Teuchos::ArrayView<double>::const_iterator set_y_it_begin = set_x_it_end; Teuchos::ArrayView<double>::const_iterator set_y_it_end = set_y_it_begin + set_vertices_size; Teuchos::ArrayView<double>::const_iterator set_z_it_begin = set_y_it_end; Teuchos::ArrayView<double>::const_iterator set_z_it_end = set_z_it_begin + set_vertices_size; bounding_box[0] = *(std::min_element( set_x_it_begin, set_x_it_end )); bounding_box[1] = *(std::max_element( set_x_it_begin, set_x_it_end )); bounding_box[2] = *(std::min_element( set_y_it_begin, set_y_it_end )); bounding_box[3] = *(std::max_element( set_y_it_begin, set_y_it_end )); bounding_box[4] = *(std::min_element( set_z_it_begin, set_z_it_end )); bounding_box[5] = *(std::max_element( set_z_it_begin, set_z_it_end )); free( set_vertices ); free( coords ); }