int GeomAssocPairSide::get_all_entities(int dimension, iBase_EntityHandle **entities, int *entities_alloc, int *entities_size) { int this_type = (dimension == -1 ? iBase_ALL_TYPES : dimension); int result; iGeom_getEntities(instance_, 0, this_type, entities, entities_alloc, entities_size, &result); PROCESS_ERROR; RETURNR(iBase_SUCCESS); }
void Discretize_Geometric_Model(GeomMesh &geomesh) { char *options = NULL; int optlen = 0; int err; iMesh_Instance mesh = geomesh.mesh; iGeom_Instance geom = geomesh.geom; iRel_Instance assoc = geomesh.assoc; iRel_RelationHandle relation00 = geomesh.relation00; iBase_EntitySetHandle geomRootSet = geomesh.geomRootSet; /////////////////////////////////////////////////////////////////////////////// // Step I: Collect all the feature nodes in Geometry: /////////////////////////////////////////////////////////////////////////////// SimpleArray<iBase_EntityHandle> geoNodes; iGeom_getEntities(geom, geomRootSet, iBase_VERTEX, ARRAY_INOUT(geoNodes), &err); double x, y, z; iBase_EntityHandle newHandle; for (int i = 0; i < geoNodes.size(); i++) { iGeom_getVtxCoord(geom, geoNodes[i], &x, &y, &z, &err); iMesh_createVtx(mesh, x, y, z, &newHandle, &err); iRel_setEntEntAssociation(assoc, relation00, geoNodes[i], newHandle, &err); } /////////////////////////////////////////////////////////////////////////////// // Step II: Collect all the geometric edges and discretize them. /////////////////////////////////////////////////////////////////////////////// SimpleArray<iBase_EntityHandle> geoEdges; iGeom_getEntities(geom, geomRootSet, iBase_EDGE, ARRAY_INOUT(geoEdges), &err); int numGeoEdges = geoEdges.size(); vector<double> elen(numGeoEdges); for (int i = 0; i < numGeoEdges; i++) { elen[i] = get_geom_edge_length(geom, geoEdges[i]); } vector<double> tmpelen; tmpelen = elen; sort( tmpelen.begin(), tmpelen.end() ); double mean_edge_length = tmpelen[numGeoEdges/2]; cout << " Minimum Edge Length : " << *min_element( elen.begin(), elen.end() ) << endl; cout << " Maximum Edge Length : " << *max_element( elen.begin(), elen.end() ) << endl; cout << " Mean Length : " << mean_edge_length << endl; double spacing = mean_edge_length /(double) 10.0; int numEdges; EdgeMesher *edgeMesher = geomesh.edgeMesher; for (int i = 0; i < numGeoEdges; i++) { if( elen[i] < 0.5*mean_edge_length) numEdges = 1; else numEdges = elen[i]/ spacing; edgeMesher->discretize(geomesh, geoEdges[i], numEdges); } //return; /////////////////////////////////////////////////////////////////////////////// //Step III: Collect all the geometric faces and discretize them. /////////////////////////////////////////////////////////////////////////////// SimpleArray<iBase_EntityHandle> geoFaces; iGeom_getEntities(geom, geomRootSet, iBase_FACE, ARRAY_INOUT(geoFaces), &err); int numGeomFaces = geoFaces.size(); SurfaceMesher *surfMesher = geomesh.surfMesher; for (int i = 2; i < numGeomFaces; i++) { surfMesher->discretize(geomesh, geoFaces[i]); //exit(0); } //return ; /////////////////////////////////////////////////////////////////////////////// //Step IV: Collect all the geometric regions and discretize them. /////////////////////////////////////////////////////////////////////////////// SimpleArray<iBase_EntityHandle> geoCells; iGeom_getEntities(geom, geomRootSet, iBase_REGION, ARRAY_INOUT(geoCells), &err); VolumeMesher *volMesher = geomesh.volMesher; for (int i = 0; i < geoCells.size(); i++) volMesher->discretize(geomesh, geoCells[i]); /////////////////////////////////////////////////////////////////////////////// //Step V: Generate Spectral (Higher order) elements: /////////////////////////////////////////////////////////////////////////////// //generate_spectral_elements(geomesh, 10); // 10 noded tetrahedra. }