Exemple #1
0
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;
}
Exemple #2
0
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);
}
Exemple #3
0
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.
}