int main(int argc, char **argv) { // Load the mesh. Mesh mesh; Mesh3DReader mloader; mloader.load("lshape_hex.mesh3d", &mesh); // rough surface handler roughSurface r1 ; r1.setFilneName(std::string("1.surf")) ; r1.loadSurface() ; r1.findMinMax(); columnList myCols ; bool further =true ; for(int iter=0 ; iter < 16 && further == true ; iter++) { std::cout << "Performing Refinement Level: " << iter << std::endl ; further = false ; for ( Word_t idx = mesh.elements.first(), _max = mesh.elements.count(); idx <= _max && idx != INVALID_IDX; idx = mesh.elements.next(idx) ) if ( mesh.elements[idx]->used) if (mesh.elements[idx]->active) { std::vector<Word_t> vtcs(mesh.elements[idx]->get_num_vertices()) ; //Word_t vtcs[mesh.elements[idx]->get_num_vertices()] ; mesh.elements[idx]->get_vertices(&vtcs[0]) ; //mesh.vertices[vtcs[0]]->dump() ; double minX=+std::numeric_limits<double>::max() ; double maxX=-std::numeric_limits<double>::max() ; double minY=+std::numeric_limits<double>::max() ; double maxY=-std::numeric_limits<double>::max() ; double minZ=+std::numeric_limits<double>::max() ; double maxZ=-std::numeric_limits<double>::max() ; for( int i=0 ; i<vtcs.size() ; i++) { double x = mesh.vertices[vtcs[i]]->x ; double y = mesh.vertices[vtcs[i]]->y ; if(minX > x) minX = x ; if(maxX < x) maxX = x ; if(minY > y) minY = y ; if(maxY < y) maxY = y ; } double sX = 0.05e-6; double sY = 0.05e-6; double deltaX = (maxX-minX) ; double deltaY = (maxY-minY) ; int nX = (int)floor(deltaX/sX) ; int nY = (int)floor(deltaY/sY) ; for( int u=0 ; u<=nX ; u++) for( int u=0 ; u<nY ; u++) { double x = minX + u*sX ; double y = minY + u*sY ; double z = r1.interpolate(x, y) ; if(minZ > z) minZ = z ; if(maxZ < z) maxZ = z ; } myCols[corner(minX,minY)].elements.insert(idx) ; myCols[corner(minX,minY)].lo = minZ ; myCols[corner(minX,minY)].hi = maxZ ; double deltaZ = std::abs(maxZ - minZ) ; if( deltaZ > 2.e-6) { //std::cout << "\n Iter., element, A.R., deltaZ: " << iter << " " << idx << " " << 2.*3.e-6/deltaX << " " << deltaZ ; if(mesh.can_refine_element(idx, H3D_H3D_REFT_HEX_XY)) mesh.refine_element(idx, H3D_H3D_REFT_HEX_XY) ; further = true ; } //mesh.elements[idx]->dump() ; } } //for ( Word_t idx = mesh.vertices.first(), _max = mesh.vertices.count(); idx <= _max && idx != INVALID_IDX; idx = mesh.vertices.next(idx) ) //if( std::abs(mesh.vertices[idx]->z - 0.) < 1e-32 ) mesh.vertices[idx]->z = r1.interpolate(mesh.vertices[idx]->x,mesh.vertices[idx]->y) ; for ( Word_t idx = mesh.elements.first(), _max = mesh.elements.count(); idx <= _max && idx != INVALID_IDX; idx = mesh.elements.next(idx) ) if ( mesh.elements[idx]->used) if (mesh.elements[idx]->active) { std::vector<Word_t> vtcs(mesh.elements[idx]->get_num_vertices()) ; mesh.elements[idx]->get_vertices(&vtcs[0]) ; double minZ=+std::numeric_limits<double>::max() ; double maxZ=-std::numeric_limits<double>::max() ; double deltaZ=-std::numeric_limits<double>::max() ; for(std::vector<Word_t>::iterator i=vtcs.begin() ; i!=vtcs.end() ; i++) { double z = mesh.vertices[*i]->z ; if(minZ > z) minZ = z ; if(maxZ < z) maxZ = z ; deltaZ = std::abs(maxZ - minZ) ; } //std::cout << std::endl ; if(deltaZ > 6e-6) { if( mesh.can_refine_element(idx, H3D_REFT_HEX_Z) ) mesh.refine_element(idx, H3D_REFT_HEX_Z) ; //else if( mesh.can_refine_element(idx, H3D_H3D_H3D_REFT_HEX_XYZ) ) mesh.refine_element(idx, H3D_H3D_H3D_REFT_HEX_XYZ) ; } } //mesh.refine_element(172, H3D_REFT_HEX_Z); //mesh.refine_all_elements(H3D_H3D_H3D_REFT_HEX_XYZ); //mesh.refine_all_elements(H3D_REFT_HEX_Z); //mesh.refine_element(4,H3D_H3D_H3D_REFT_HEX_XYZ); out_mesh(&mesh, "mesh"); return 0; }
std::vector<VertexId> SortedVertices(const ShortestPathTree<T>& spt) { std::vector<VertexId> vtcs(spt.vertices_begin(), spt.vertices_end()); std::sort(vtcs.begin(), vtcs.end()); return vtcs; }