inline iMesh::Error iMesh::createVtx( double x, double y, double z, EntityHandle& vertex_out ) { int err; iMesh_createVtx( mInstance, x, y, z, &vertex_out, &err ); return (Error)err; }
iMesh_Instance create_mesh() { static iMesh_Instance instance = 0; if (instance) return instance; int err; iMesh_Instance tmp; iMesh_newMesh( 0, &tmp, &err, 0 ); CHECK_EQUAL( iBase_SUCCESS, err ); for (int i = 0; i < INTERVALS+1; ++i) for (int j = 0; j < INTERVALS+1; ++j) for (int k = 0; k < INTERVALS+1; ++k) { iMesh_createVtx( tmp, i, j, k, &VERTS[i][j][k], &err ); CHECK_EQUAL( iBase_SUCCESS, err ); } int status; iBase_EntityHandle conn[8]; for (int i = 0; i < INTERVALS; ++i) for (int j = 0; j < INTERVALS; ++j) for (int k = 0; k < INTERVALS; ++k) { HEX_VERTS(i,j,k,conn); iMesh_createEnt( tmp, iMesh_HEXAHEDRON, conn, 8, &HEXES[i][j][k], &status, &err ); CHECK_EQUAL( iBase_SUCCESS, err ); CHECK_EQUAL( iBase_NEW, status ); } for (int f = 0; f < 6; ++f) for (int i = 0; i < INTERVALS; ++i) for (int j = 0; j < INTERVALS; ++j) { QUAD_VERTS(f,i,j,conn); iMesh_createEnt( tmp, iMesh_QUADRILATERAL, conn, 4, &FACES[f][i][j], &status, &err ); CHECK_EQUAL( iBase_SUCCESS, err ); } return (instance = tmp); }
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. }