|
cgma
|
#include <CubitOctreeGeneratorVolumes.hpp>
Definition at line 27 of file CubitOctreeGeneratorVolumes.hpp.
| CubitOctreeGeneratorVolumes::CubitOctreeGeneratorVolumes | ( | DLIList< RefEntity * > & | entity_list | ) |
Definition at line 25 of file CubitOctreeGeneratorVolumes.cpp.
:CubitOctreeGenerator( ), entityList(entity_list){ entityList = entity_list; cubitOctree = new CubitOctree( this); }
Definition at line 36 of file CubitOctreeGeneratorVolumes.hpp.
{}
Definition at line 98 of file CubitOctreeGeneratorVolumes.cpp.
{
DLIList< RefFace *> vol_ref_faces;
DLIList<CubitFacet *> *facet_list;
DLIList<CubitPoint*> *point_list;
DLIList<CubitFacetEdge *> *ptr_facet_edge_list;
DLIList<OctreeFacetPointData *> facet_point_data_list; //, vfacet_point_data_list;
DLIList<CubitOctreeCell*> refine_cell_list;
// DLIList<CubitFacet*> global_facet_list;
int index;
int i, j, k, l;
CubitPoint *ptr_point;
CubitFacet *ptr_facet, *ptr_adj_facet0, *ptr_adj_facet1;
CubitFacetEdge *ptr_edge;
RefFace *ptr_ref_face;
OctreeFacetPointData *facet_point_data;
CubitVector normal0, normal1;
double internal_angle;
Body *volume;
TDOctreeRefFace *td_ref_face;
// PR-CubitOctree has the property that the cell size depends on the density of the facet points
// Higher the density the finer will be the facet cell size.
// Step 1: The CubitOctree is built only till MaxDepth based on facet information
// 1. Small features that have smaller curve length are detected using facet density
// 2. Surface/Curve curvature are detected based on di-hedral angle between the adj facets.
// Also the aspect ratio of facets are used because it is found that when the surface has curvature on only one directio
// the facet aspect ratio will be very high.
for( index = 0; index < entityList.size(); index++ ){
volume = CAST_TO( entityList.get_and_step(), Body );
vol_ref_faces.clean_out();
volume->ref_faces( vol_ref_faces );
vol_ref_faces.reset();
// get volume facets and insert points from those facets
for( i = 0; i < vol_ref_faces.size(); i++ ){
ptr_ref_face = vol_ref_faces.get_and_step();
td_ref_face = TDOctreeRefFace::get_td( ptr_ref_face );
if( td_ref_face->get_visit() == CUBIT_FALSE ){
td_ref_face->set_visit( CUBIT_TRUE );
// grab facets here if stitching
// add to global list for facet point insertion
/*int num_parents = CAST_TO(ptr_ref_face,RefFace)->num_parent_ref_entities();
if (num_parents == 1)
{
global_facet_list += *facet_list;
}
else
{*/
// Generated OctreeFacetPointData based on facet vertices
point_list = td_ref_face->get_ptr_cubit_point_list();
for( j = 0; j < point_list->size(); j++ ){
ptr_point = point_list->get_and_step();
facet_point_data = new OctreeFacetPointData( ptr_point->coordinates(), ptr_point );
facet_point_data_list.push( facet_point_data );
}
// point_list.clean_out();
//}
// Generate OctreeFacetPointData based on facet centroid
facet_list = td_ref_face->get_ptr_cubit_facet_list();
for( j = 0; j < facet_list->size(); j++ ){
ptr_facet = facet_list->get_and_step();
facet_point_data = new OctreeFacetPointData( ptr_facet->center(), ptr_facet );
facet_point_data_list.push( facet_point_data );
}
/* Generate OctreeFacetPointData based on aspect ratio of facet
for( j = 0; j < facet_list->size(); j++ ){
ptr_facet = facet_list->get_and_step();
OctreeFacetPointData::generate_facet_point_data_at_slender_facet( ptr_facet, facet_point_data_list );
}
*/
// Generate OctreeFacetPointData based on surface curvature
ptr_facet_edge_list = td_ref_face->get_ptr_cubit_facet_edge_list();
for( j = 0; j < ptr_facet_edge_list->size(); j++ ){
ptr_edge = ptr_facet_edge_list->get_and_step();
if( ptr_edge->num_adj_facets() == 2 ){
// mark adjacent facets
ptr_adj_facet0 = ptr_edge->adj_facet(0);
ptr_adj_facet1 = ptr_edge->adj_facet(1);
normal0 = ptr_adj_facet0->normal();
normal1 = ptr_adj_facet1->normal();
if (normal0.length_squared() > 0.0 && normal1.length_squared() > 0.0)
{
internal_angle = normal0.interior_angle(normal1);
}
else
{
internal_angle = 0.0;
}
//PRINT_INFO("%f ", internal_angle );
if( internal_angle > ANGLE_BETWEEN_FACETS_NORMAL_FOR_OCTREE_BASED_ON_SURF_CURVATURE_FACTOR * ANG_FACET_EXTRACT[OCTREE_TIME_ACCURACY_LEVEL] ){
OctreeFacetPointData::generate_facet_point_data_based_on_curvature( ptr_edge, /*internal_angle,*/ facet_point_data_list );
}
}
}
// now check for pairs of adjacents with dihedral angles along their shared edge
// the CubitOctree should be refined in these regions so we have enough grid nodes to generate 3dmat points
// disabling for now :( because there is a problem in FacetDataUtil's facet stitching code
if (0)
{
DLIList<DLIList<RefEdge*> > edge_loops;
ptr_ref_face->ref_edge_loops(edge_loops);
for (i=0; i < edge_loops.size(); ++i)
{
DLIList<RefEdge*>& edge_loop = edge_loops.get_and_step();
for (j=0; j < edge_loop.size(); ++j)
{
DLIList<RefEntity*> parents;
RefEdge *edge = edge_loop.get_and_step();
TDOctreeRefEdge *td_ref_edge = TDOctreeRefEdge::get_td(edge);
if( td_ref_edge->get_visit() == CUBIT_FALSE )
{
td_ref_edge->set_visit( CUBIT_TRUE );
edge->get_parent_ref_entities(parents);
// check Refface's for bad facets in case it hasn't been done
// already
for (k=0; k < parents.size(); ++k)
{
RefFace *parent = CAST_TO(parents.get_and_step(), RefFace);
if (parent == NULL) {continue;}
TDOctreeRefFace *td_parent = TDOctreeRefFace::get_td(parent);
if (td_parent == NULL) {continue;}
if (td_parent->get_create_2dmat())
{
td_parent->check_valid_facets(CUBIT_TRUE);
}
}
for (k=0; k < parents.size(); ++k)
{
for (l=k+1; l < parents.size(); ++l)
{
// SVDrawTool::clear_non_retained();
DLIList<CubitFacet*> crease_facets;
DLIList<CubitFacetEdge*> crease_edges;
cubitOctree->find_cells_based_on_surface_angle(refine_cell_list, crease_edges, crease_facets,
CAST_TO(parents[k],RefFace), CAST_TO(parents[l],RefFace),
CUBIT_FALSE, 2.0*CUBIT_PI/3.0);
// will need to store crease_edges and facets
// SVDrawTool::mouse_xforms();
}
}
}
}
}
}
}
}
}
/*
DLIList<DLIList<CubitFacet*>*> shells;
shells.append(&global_facet_list);
CubitBoolean dummy;
FacetDataUtil::stitch_facets(shells, OCTREE_EPSILON, dummy);
if (shells.size() == 1)
{
FacetDataUtil::get_points(global_facet_list, point_list);
for( j = 0; j < point_list.size(); j++ )
{
ptr_point = point_list.get_and_step();
facet_point_data = new OctreeFacetPointData( ptr_point->coordinates(), ptr_point );
facet_point_data_list.push( facet_point_data );
}
}
else
{
PRINT_INFO("Stitch resulted in multiple shells!!!!!!!!!!\n");
}
*/
// Reset the visit to CUBIT_FALSE
reset_td_octree_ref_face_visit( CUBIT_FALSE );
reset_td_octree_ref_edge_visit( CUBIT_FALSE );
facet_point_data_list.reset();
for( i = 0; i < facet_point_data_list.size(); i++ ){
facet_point_data = facet_point_data_list.get_and_step();
//SkeletonDebug::draw_point( facet_point_data->coordinates(), CUBIT_MAGENTA_INDEX );
cubitOctree->subdivide_octree_based_on_facet_point( facet_point_data, cubitOctree->get_max_depth() );
}
// refine the cells on edges with large enough dihedral angles
// disabling for now
//int target_depth = skeletonProxy->get_source_entity_max_depth();
//cubitOctree->refine_cells_to_target_depth(refine_cell_list, target_depth);
return CUBIT_TRUE;
}
Definition at line 986 of file CubitOctreeGeneratorVolumes.cpp.
{
DLIList< RefEdge *> vol_mref_edges;
RefEdge *ptr_mref_edge;
TDOctreeRefEdge *td_mref_edge;
int i;
int index;
Body *volume;
// Reset the marker of edges
for( index = 0; index < entityList.size(); index++ ){
volume = CAST_TO( entityList.get_and_step(), Body );
vol_mref_edges.clean_out();
volume->ref_edges( vol_mref_edges );
for( i = 0; i < vol_mref_edges.size(); i++ ){
ptr_mref_edge = vol_mref_edges.get_and_step();
if( ptr_mref_edge->marked() == CUBIT_FALSE ){
ptr_mref_edge->marked( CUBIT_TRUE );
// Add TD for MRefEdge
TDOctreeRefEdge::add_td(ptr_mref_edge);
td_mref_edge = TDOctreeRefEdge::get_td(ptr_mref_edge);
td_mref_edge->generate_gpoint_list(ANG_FACET_EXTRACT[OCTREE_TIME_ACCURACY_LEVEL] * OCTREE_TOLERANCE_FOR_CURVE_DECIMATION_FACTOR );
}
}
}
// Reset the marker of edges
for( index = 0; index < entityList.size(); index++ ){
volume = CAST_TO( entityList.get_and_step(), Body );
vol_mref_edges.clean_out();
volume->ref_edges( vol_mref_edges );
for( i = 0; i < vol_mref_edges.size();i++ ){
vol_mref_edges.get_and_step()->marked( CUBIT_FALSE );
}
}
return CUBIT_TRUE;
}
Definition at line 797 of file CubitOctreeGeneratorVolumes.cpp.
{
DLIList< RefFace *> vol_ref_faces;
RefFace *ptr_ref_face;
TDOctreeRefFace *td_mref_face;
DLIList<CubitFacet *> *facet_list;
DLIList<CubitFacetEdge *> *facet_edge_list;
DLIList<CubitPoint*> *point_list;
int i;
int index;
Body *volume;
CubitBoolean identified_engine = CUBIT_FALSE;
CubitBoolean is_facet_geom = CUBIT_FALSE;
for( index = 0; index < entityList.size(); index++ ){
volume = CAST_TO( entityList.get_and_step(), Body );
vol_ref_faces.clean_out();
volume->ref_faces( vol_ref_faces );
identified_engine = CUBIT_FALSE;
for( i = 0; i < vol_ref_faces.size(); i++ ){
ptr_ref_face = vol_ref_faces.get_and_step();
if( ptr_ref_face->marked() == CUBIT_FALSE ){
if (identified_engine == CUBIT_FALSE)
{
if (ptr_ref_face->get_geometry_query_engine()->get_engine_version_string().find("Facet") != CubitString::npos)
{
is_facet_geom = CUBIT_TRUE;
}
identified_engine = CUBIT_TRUE;
}
ptr_ref_face->marked( CUBIT_TRUE );
// Add TD for MRefFace
TDOctreeRefFace::add_td(ptr_ref_face);
facet_list = new DLIList<CubitFacet *>;
facet_edge_list = new DLIList<CubitFacetEdge *>;
point_list = new DLIList<CubitPoint*>;
//PRINT_DEBUG_157(" \n\nRef Face = %d \n ", ptr_ref_face->id());
//facet_list->clean_out();
//point_list->clean_out();
//facet_edge_list->clean_out();
if (is_facet_geom)
{
DLIList<CubitFacet*> facets;
DLIList<CubitPoint*> points;
FacetSurface *facet_surf_ptr = CAST_TO(ptr_ref_face->get_surface_ptr(),FacetSurface);
if (facet_surf_ptr != NULL)
{
facet_surf_ptr->get_my_facets(facets,points);
}
FacetDataUtil::copy_facets(facets,*facet_list,*point_list,*facet_edge_list);
/*PRINT_INFO("Grabbed %d facets from surface %d\n", facet_list->size(),ptr_ref_face);
PRINT_INFO("Grabbed %d facet edges from surface %d\n", facet_edge_list->size(),ptr_ref_face);
PRINT_INFO("Grabbed %d facet points from surface %d\n", point_list->size(),ptr_ref_face);*/
}
else
{
GMem gmem;
//Surface* surf_ptr = ptr_ref_face->get_surface_ptr();
//surf_ptr->get_geometry_query_engine()->get_graphics(surf_ptr, &gmem);
int angle = 15;
float distance = 0;
//SVDrawTool::get_facet_tolerance(angle, distance);
angle = static_cast<int>(ANG_FACET_EXTRACT[OCTREE_TIME_ACCURACY_LEVEL]);
//PRINT_INFO("\n Facets extracted with angle %d and distance %f \n", angle, distance );
ptr_ref_face->get_graphics( gmem, angle, distance, 0 );
ChollaEngine::get_facets(gmem, *facet_list, *point_list);
/*
// delete point_list;
// point_list = new DLIList<CubitPoint*>;
point_list->clean_out();
DLIList<DLIList<CubitFacet *> *> shell_list;
CubitBoolean dummy2;
double tol = SKL_EPSILON;
DLIList <CubitQuadFacet *> qfacet_list;
FacetDataUtil::split_into_shells(*facet_list, qfacet_list,shell_list, dummy2);
FacetDataUtil::stitch_facets(shell_list,tol,dummy2,false);
//int nv,ne;
//DLIList<CubitPoint*> un;
//FacetDataUtil::merge_coincident_vertices(shell_list,tol,nv,ne,un);
facet_list = shell_list.get();
PRINT_INFO("skl: number of shells = %d\n", shell_list.size());
FacetDataUtil::get_edges( *facet_list, *facet_edge_list );
FacetDataUtil::get_points(*facet_list,*point_list);
SVDrawTool::draw_facets(*facet_list,CUBIT_GREEN_INDEX);
*/
FacetDataUtil::get_edges( *facet_list, *facet_edge_list );
/*
// checks for problems with gfx facets
// debug use only
int v;
for (v=0; v < facet_edge_list->size(); ++v)
{
CubitFacetEdge *temp_edge = facet_edge_list->get_and_step();
if (temp_edge->num_adj_facets() != 2 && temp_edge->num_adj_facets() != 1)
{
PRINT_INFO("Skeleton sizing function, copying gfx facets: edge has %d adj facets!\n", temp_edge->num_adj_facets());
SVDrawTool::draw_vector(temp_edge->point(0)->coordinates(), temp_edge->point(1)->coordinates(), CUBIT_RED_INDEX);
SVDrawTool::mouse_xforms();
}
}
int w;
for (v=0; v < facet_list->size(); ++v)
{
CubitFacet *first = (*facet_list)[v];
for (w=v+1; w < facet_list->size(); ++w)
{
CubitFacet *second = (*facet_list)[w];
if (first == second)
{
PRINT_INFO("Skeleton Sizing Function: gfx facet list contains a duplicate, ids are %d,%d\n", first->id(), second->id());
}
}
}
*/
}
td_mref_face = TDOctreeRefFace::get_td(ptr_ref_face);
/*
td_mref_face->set_ptr_cubit_facet_list(facet_list);
td_mref_face->set_ptr_cubit_facet_edge_list(facet_edge_list);
td_mref_face->set_ptr_cubit_point_list(point_list);
*/
if( td_mref_face->get_ptr_cubit_facet_list() )
{
delete td_mref_face->get_ptr_cubit_facet_list();
td_mref_face->set_ptr_cubit_facet_list(facet_list);
}
else
{
td_mref_face->set_ptr_cubit_facet_list(facet_list);
}
if( td_mref_face->get_ptr_cubit_facet_edge_list() )
{
delete td_mref_face->get_ptr_cubit_facet_edge_list();
td_mref_face->set_ptr_cubit_facet_edge_list(facet_edge_list);
}
else
{
td_mref_face->set_ptr_cubit_facet_edge_list(facet_edge_list);
}
if( td_mref_face->get_ptr_cubit_point_list() )
{
delete td_mref_face->get_ptr_cubit_point_list();
td_mref_face->set_ptr_cubit_point_list(point_list);
}
else
{
td_mref_face->set_ptr_cubit_point_list(point_list);
}
// check for bad facets and disable 2dmat if necessary
td_mref_face->check_valid_facets(CUBIT_TRUE);
//if (!create_2dmat) {td_mref_face->set_create_2dmat(CUBIT_FALSE);}
}
}
}
// Reset the marker of faces
for( index = 0; index < entityList.size(); index++ ){
volume = CAST_TO( entityList.get_and_step(), Body );
vol_ref_faces.clean_out();
volume->ref_faces( vol_ref_faces );
for( i = 0; i < vol_ref_faces.size(); i++ ){
vol_ref_faces.get_and_step()->marked( CUBIT_FALSE );
}
}
return CUBIT_TRUE;
}
| void CubitOctreeGeneratorVolumes::color_octreenode_via_grassfire | ( | DLIList< CubitOctreeNode * > & | queue_for_mat_generation | ) |
Definition at line 1027 of file CubitOctreeGeneratorVolumes.cpp.
{
PriorityQueue<CubitOctreeNode *> heap( CubitOctreeNode::compare_function);
CubitOctreeNode *ptr_grid_node;
// ************************* For Testing Purpose ***************************
// int i;
//for( i = 0; i < queue_for_mat_generation.size(); i++ ){
//ptr_grid_node = queue_for_mat_generation.get_and_step();
//PRINT_DEBUG_157(" boundary node distance = %f \n",ptr_grid_node->get_distance() );
//PRINT_DEBUG_157(" boundary node visit = %d \n",ptr_grid_node->get_visit() );
//PRINT_DEBUG_157(" mat initial grid = %f %f %f %f \n", ptr_grid_node->get_distance(), ptr_grid_node->get_coord().x(), ptr_grid_node->get_coord().y(), ptr_grid_node->get_coord().z() );
//GfxDebug::draw_point( ptr_grid_node->get_coord().x(), ptr_grid_node->get_coord().y(), ptr_grid_node->get_coord().z(), CUBIT_YELLOW_INDEX );
//ptr_grid_node->display( this, DISTANCE );
//}
// ************************* For Testing Purpose ***************************
//PRINT_DEBUG_157(" Num of initial points for mat generation = %d \n", queue_for_mat_generation.size() );
// Initialize the heap
while( queue_for_mat_generation.size() > 0 ){
heap.push( queue_for_mat_generation.pop() );
}
// distance by default is CUBIT_DBL_MAX, and the white boundary nodes's distance is set to -1.
//PRINT_DEBUG_157(" heap size = %d", heap.size() );
//int draw_count = 1;
while( heap.size() > 0 ){
// PRINT_INFO( " manhattan in process before opo() = %d \n",queue.size() );
ptr_grid_node = heap.top();
heap.pop();
ptr_grid_node->find_distance_at_adj_node( &heap );
// PRINT_INFO( " manhattan in process after NumberAdjNode() = %d \n", queue.size() );
}
}
| CubitBoolean CubitOctreeGeneratorVolumes::find_intersection_between_octree_and_facets | ( | DLIList< CubitOctreeNode * > & | queue_for_mat_generation | ) |
Definition at line 319 of file CubitOctreeGeneratorVolumes.cpp.
{
DLIList< RefFace *> vol_ref_faces;
RefFace *ptr_ref_face;
TDOctreeRefFace *td_ref_face;
DLIList< CubitFacet *> *facet_list;
CubitFacet *ptr_facet;
DLIList<CubitOctreeCell *> CubitOctree_cell_list;
DLIList< CubitOctreeNode *> CubitOctree_grid_node_list;
DLIList<CubitOctreeNode*> all_grid_nodes;
//CubitVector facet_normal;
//DLIList< CubitPoint *> *point_list;
int i, j, k;
int index;
Body *volume;
// CpuTimer total_idata_time;
for( index = 0; index < entityList.size(); index++ ){
volume = CAST_TO( entityList.get_and_back(), Body );
vol_ref_faces.clean_out();
volume->ref_faces( vol_ref_faces );
//vol_ref_faces.reset();
//int cell_count = 0;
//CubitBox facet_bbox;
//PRINT_INFO(" \nRef Volume = %d ", volume->id());
for( i = 0; i < vol_ref_faces.size(); i++ ){
ptr_ref_face = vol_ref_faces.get_and_step();
td_ref_face = TDOctreeRefFace::get_td( ptr_ref_face );
if(td_ref_face->get_visit() == CUBIT_FALSE){
td_ref_face->set_visit( CUBIT_TRUE );
//PRINT_INFO(" \nRef Face = %d ", ptr_ref_face->id());
RefFace *current_ref_face = CAST_TO(ptr_ref_face, RefFace);
/*if (current_ref_face->sense(CAST_TO(volume,Body)) == CUBIT_REVERSED)
{
temp_facet_normal *= -1.0;
}*/
// PRINT_INFO("Number of parent ref Entities for face %d: %d\n", current_ref_face->id(), current_ref_face->num_parent_ref_entities());
// get the sense so we know which way to propagate the 3DMAT front inwards
CubitSense ref_face_sense = CUBIT_FORWARD; //current_ref_face->sense(volume);
// in the case of a merged face, figure out if two parent vols share the same
// sizing function. If so, propagate in both directions
if (current_ref_face->is_merged() /*&& current_ref_face->num_parent_ref_entities() == 2*/)
{
DLIList<RefEntity*> parent_ents;
current_ref_face->get_parent_ref_entities(parent_ents);
if (parent_ents.size() == 2)
{
Body *other_parent_vol = CAST_TO(parent_ents.get_and_step(),Body);
if (other_parent_vol == volume) {other_parent_vol = CAST_TO(parent_ents.get(),Body);}
if (other_parent_vol != NULL)
{
// if the other parent volume has the same sizing function,
// pass CUBIT_UNKNOWN to CubitOctreeCell::set_color_and_idatas
// It will then set up the front normals to propagate in both directions
ref_face_sense = CUBIT_UNKNOWN;
}
}
}
facet_list = td_ref_face->get_ptr_cubit_facet_list();
//PRINT_INFO("Surface %d: facets: %d\n", ptr_ref_face->id(), facet_list->size());
for( j = 0; j < facet_list->size(); j++ ){
ptr_facet = facet_list->get_and_step();
//CubitVector temp_facet_normal = ptr_facet->normal();
//SVDrawTool::draw_vector(ptr_facet->center(), ptr_facet->center()+temp_facet_normal, (i%8)+1);
//#ifndef NDEBUG
// SkeletonDebug::draw_facet( ptr_facet, CUBIT_BLUE_INDEX );
//#endif
//facet_bbox = ptr_facet->bounding_box();
//draw_box( facet_bbox );
//facet_normal = ptr_facet->normal();
//if( ptr_facet->is_backwards() ){
// facet_normal = facet_normal * -1;
//}
//GfxDebug::draw_line( ptr_facet->center().x(), ptr_facet->center().y(), ptr_facet->center().z(), ptr_facet->center().x()+facet_normal.x(), ptr_facet->center().y()+facet_normal.y(), ptr_facet->center().z()+facet_normal.z(), CUBIT_WHITE_INDEX );
CubitOctree_cell_list.clean_out();
CubitOctree_grid_node_list.clean_out();
//PRINT_INFO(" Before find_octree_cells_contatined \n");
cubitOctree->find_octree_cells_contained_inside_bbox( ptr_facet, CubitOctree_cell_list );
//PRINT_INFO(" Before mark_positive_and_negative_grid_nodes \n");
cubitOctree->mark_positive_and_negative_octree_grid_nodes( ptr_facet, CubitOctree_cell_list, CubitOctree_grid_node_list );
//PRINT_INFO(" Before find_intersection_between_grid_edge_facet \n");
if ( OCTREE_DEFAULT_INTERSECTION_METHOD[OCTREE_TIME_ACCURACY_LEVEL] == SAT_INTERSECT){
//PRINT_INFO("%d cells in bbox\n", CubitOctree_cell_list.size());
for (k=0; k < CubitOctree_cell_list.size(); ++k)
{
CubitOctreeCell *current_cell = CubitOctree_cell_list.get_and_step();
// if (current_cell->get_mark() == CUBIT_FALSE) {continue;}
//current_cell->set_mark(CUBIT_FALSE);
if (current_cell->does_facet_intersect_octreecell(ptr_facet))
{
/* double corners[3];
double half_edge_length = current_cell->get_dimension()/2.0;
CubitVector center = current_cell->get_center();
center.get_xyz(corners);
float box[6] = {corners[0]-half_edge_length, corners[1]-half_edge_length, corners[2]-half_edge_length,
corners[0]+half_edge_length, corners[1]+half_edge_length, corners[2]+half_edge_length};
SVDrawTool::draw_cube(box, CUBIT_GREEN_INDEX, SVDrawTool::WIRE);*/
current_cell->set_color_and_intersection_datas(ptr_facet, ptr_ref_face,
#ifdef USE_octree_BGMESH
cubitOctree->get_greycelllist(),
#endif
ref_face_sense);
//cubitOctree->get_greycelllist()->append(current_cell);
}
/*if (ref_face_sense) {
// SVDrawTool::mouse_xforms();
}*/
}
for( k = 0; k < CubitOctree_grid_node_list.size(); k++ )
{
CubitOctreeNode *ptr_grid_node = CubitOctree_grid_node_list.get_and_step();
if (ptr_grid_node->get_visit() == CUBIT_FALSE)
{
all_grid_nodes.append(ptr_grid_node);
ptr_grid_node->set_visit(CUBIT_TRUE);
}
ptr_grid_node->set_mark( CUBIT_FALSE );
if( ptr_grid_node->get_halfspace_direction() == OCTREE_POSITIVE )
{
ptr_grid_node->set_halfspace_direction( OCTREE_NEGATIVE );
}
}
}
if (OCTREE_DEFAULT_INTERSECTION_METHOD[OCTREE_TIME_ACCURACY_LEVEL] == GRID_EDGE_INT)
{
cubitOctree->find_intersection_between_grid_edges_and_facet( CUBIT_OCTREE_VOLUME, ptr_ref_face, ptr_facet, CubitOctree_grid_node_list );
}
}
}
}
}
// Reset the visit to CUBIT_FALSE
reset_td_octree_ref_face_visit( CUBIT_FALSE );
//SVDrawTool::mouse_xforms();
// PRINT_INFO("profiling: time for intersecting and making idatas: %f\n", total_idata_time.cpu_secs());
if (OCTREE_DEFAULT_INTERSECTION_METHOD[OCTREE_TIME_ACCURACY_LEVEL] == SAT_INTERSECT)
{
//CpuTimer front_color_time;
for (i=0; i < all_grid_nodes.size(); ++i)
{
CubitOctreeNode *grid_node = all_grid_nodes.get_and_step();
DLIList<OctreeIntersectionData*> *idata_list = grid_node->get_idata_list();
//idata_list->uniquify_unordered();
if (idata_list->size() > 0)
{
DLIList<OctreeIntersectionData*> closest_ones;
//OctreeIntersectionData *closest = NULL;
double min_list_dist = CUBIT_DBL_MAX;
for (k=0; k < idata_list->size(); ++k)
{
if (idata_list->get()->is_merged()) {idata_list->step();}
double temp_dist = idata_list->get()->get_length();
if (temp_dist < min_list_dist - OCTREE_EPSILON)
{
closest_ones.clean_out();
// closest = idata_list->get();
closest_ones.append(idata_list->get());
min_list_dist = temp_dist;
}
else if (fabs(temp_dist - min_list_dist) <= OCTREE_EPSILON)
{
closest_ones.append(idata_list->get());
}
idata_list->step();
}
bool white = false;
for (j=0; j < closest_ones.size(); ++j)
{
if (closest_ones.get_and_step()->get_halfspace())
{
white = true;
break;
}
}
//closest = closest_ones.get();
// if (!white) {SVDrawTool::draw_vector(grid_node->get_coord(), closest->get_int_point(), CUBIT_RED_INDEX);}
// this is the closest facet encountered by the current grid node so far
// update color of node based on this facet
if (white)
{
grid_node->set_color(CUBIT_WHITE_INDEX);
cubitOctree->get_whitenodelist()->append(grid_node);
}
else if (!white)
{
// if ( (grid_node->get_coord()-closest->get_facet_ptr()->center()) % (closest->get_normal()) < 0)
// {
// PRINT_INFO("Adding a white node to queue !!!!!!!!!!!!\n");
// }
// uncomment this
// for (j=0; j < grid_node->get_idata_list()->size(); ++j)
// {
// OctreeIntersectionData *idata = grid_node->get_idata_list()->get_and_step();
// double proj_length = fabs((grid_node->get_coord() - idata->get_int_point())%idata->get_facet_normal());
// idata->set_length(proj_length);
// }
// SVDrawTool::draw_vector(grid_node->get_coord(), closest->get_int_point(), CUBIT_RED_INDEX);
grid_node->set_color(CUBIT_BLACK_INDEX);
queue_for_mat_generation.append(grid_node);
}
else
{
//PRINT_INFO("Couldn't pick halfspace to color node!\n");
}
}
grid_node->set_visit(CUBIT_FALSE);
}
for (i=0; i < cubitOctree->get_whitenodelist()->size(); ++i)
{
CubitOctreeNode *ptr_grid_node = cubitOctree->get_whitenodelist()->get_and_step();
DLIList<OctreeIntersectionData*> *idata_list = ptr_grid_node->get_idata_list();
for (k=0; k < idata_list->size(); ++k)
{
OctreeIntersectionData *idata = idata_list->get_and_step();
if (idata != NULL) {delete idata;}
}
idata_list->clean_out();
CubitOctreeNode *adj_node = NULL;
for (k=0; k < 6; ++k)
{
adj_node = ptr_grid_node->get_adj_node(k);
if (adj_node != NULL)
{
if (adj_node->get_color() != CUBIT_BLACK_INDEX && adj_node->get_color() != CUBIT_WHITE_INDEX)
{
adj_node->set_color(CUBIT_YELLOW_INDEX);
}
//SVDrawTool::draw_point(adj_node->get_coord(), adj_node->get_color());
}
}
}
// PRINT_INFO("profiling: time to color front nodes: %f\n", front_color_time.cpu_secs());
}
// PRINT_INFO("Testing: Cell Count = %d", cell_count );
if (OCTREE_DEFAULT_INTERSECTION_METHOD[OCTREE_TIME_ACCURACY_LEVEL] == SAT_INTERSECT)
{
// CpuTimer front_init;
for( i = 0; i < queue_for_mat_generation.size(); i++ ){
queue_for_mat_generation.get_and_step()->SAT_find_face_distance_average_normal( /*skeletonSizingFunction, queue_for_mat_generation*/ );
}
//PRINT_INFO("profiling: time to init front: %f\n", front_init.cpu_secs());
}
return CUBIT_TRUE;
}
| void CubitOctreeGeneratorVolumes::find_optimal_min_and_max_depth | ( | RefEntity * | volume, |
| int & | local_min_depth, | ||
| int & | local_max_depth | ||
| ) | [static] |
Definition at line 621 of file CubitOctreeGeneratorVolumes.cpp.
{
Body *volume = dynamic_cast<Body *> (entity);
if( NULL == volume)
return;
CubitBox bbox = volume->bounding_box();
// calculate min_depth by comparing min_range with max_range in log scale
double max_range = std::max( std::max( bbox.x_range(), bbox.y_range()), bbox.z_range() );
double min_range = std::min( std::min( bbox.x_range(), bbox.y_range()), bbox.z_range() );
local_min_depth = (int)(log( max_range / min_range ) / log(2.0)) + 1; // add plus 1 just to give enough one extra level of depth
if( local_min_depth < MIN_DEPTH_OCTREE[OCTREE_TIME_ACCURACY_LEVEL] )
local_min_depth = MIN_DEPTH_OCTREE[OCTREE_TIME_ACCURACY_LEVEL];
if( local_min_depth > MAX_DEPTH_OCTREE[OCTREE_TIME_ACCURACY_LEVEL] )
local_min_depth = MAX_DEPTH_OCTREE[OCTREE_TIME_ACCURACY_LEVEL];
// calculate max_depth by comparing the min curve length with max_range in log scale
DLIList< RefEdge *> list_edges;
volume->ref_edges( list_edges );
int i;
RefEdge *ptr_edge;
double min_edge_len = DBL_MAX;
double len;
CubitVector start_pt, mid_pt, end_pt;
for( i = 0; i < list_edges.size(); i++ )
{
ptr_edge = list_edges.get_and_step();
//len = ptr_edge->length_from_u( ptr_edge->start_param(), ptr_edge->end_param() );
start_pt = ptr_edge->start_coordinates();
end_pt = ptr_edge->end_coordinates();
ptr_edge->mid_point(mid_pt);
len = (mid_pt - start_pt).length() + (end_pt - mid_pt).length();
if( len < min_edge_len )
{
min_edge_len = len;
}
}
local_max_depth = (int)(log( max_range / min_edge_len) / log(2.0) ) + 1;
/*
// calculate max_depth by comparing the min mesh size with max_range in log scale
double min_mesh_size = max_range;
double mesh_size;
for( i = 0; i < list_edges.size(); i++ )
{
ptr_edge = list_edges.get_and_step();
mesh_size = max_range;
MeshToolProxy* mesh_tool_ptr = MeshToolProxy::mesh_tool(ptr_edge);
SizeIntervalType hardness;
double tmp_size = mesh_tool_ptr->requested_interval_size(hardness);
if (hardness > CALCULATED)
{
mesh_size = tmp_size/ 2.0;
}
if( mesh_size < min_mesh_size )
{
min_mesh_size = mesh_size;
}
}
local_max_depth = std::max( local_max_depth, (int)(log( max_range / min_mesh_size) / log(2.0) ) + 1 );
*/
/*
// calculate max_depth by comparing the min mesh size with max_range in log scale
DLIList< RefFace *> list_faces;
volume->ref_faces( list_faces );
min_mesh_size = max_range;
RefFace *ptr_face;
for( i = 0; i < list_faces.size(); i++ )
{
ptr_face = list_faces.get_and_step();
mesh_size = max_range;
MeshToolProxy* mesh_tool_ptr = MeshToolProxy::mesh_tool(ptr_face);
SizeIntervalType hardness;
double tmp_size = mesh_tool_ptr->requested_interval_size(hardness);
if (hardness > CALCULATED)
{
mesh_size = tmp_size/2.0;
}
if( mesh_size < min_mesh_size )
{
min_mesh_size = mesh_size;
}
}
local_max_depth = std::max( local_max_depth, (int)(log( max_range / min_mesh_size) / log(2.0) ) + 1 );
*/
if( local_max_depth > MAX_DEPTH_OCTREE[OCTREE_TIME_ACCURACY_LEVEL] )
local_max_depth = MAX_DEPTH_OCTREE[OCTREE_TIME_ACCURACY_LEVEL];
// make sure local_max_depth is atleast one depth higher than local_min_depth
if( local_max_depth <= local_min_depth )
local_max_depth = local_min_depth + 1;
}
| void CubitOctreeGeneratorVolumes::find_optimal_min_and_max_octree_depths | ( | DLIList< RefEntity * > & | entity_list, |
| int & | min_depth, | ||
| int & | max_depth | ||
| ) | [static] |
Definition at line 724 of file CubitOctreeGeneratorVolumes.cpp.
{
DLIList< int > list_min_depth;
DLIList< int > list_max_depth;
// traverse through the list of volumes and find optimal depth
Body*volume;
int index;
int local_min_depth, local_max_depth;
for( index = 0; index < entity_list.size(); index++ )
{
volume = CAST_TO( entity_list.get_and_step(), Body );
if( volume )
{
CubitOctreeGeneratorVolumes::find_optimal_min_and_max_depth( volume, local_min_depth, local_max_depth );
list_min_depth.append( local_min_depth );
list_max_depth.append( local_max_depth );
}
}
// find resultant min_depth and max_depth
// for now let us take the floor of the average depth
int avg_min_depth = 0;
int avg_max_depth = 0;
for( index = 0; index < list_min_depth.size(); index++ )
{
avg_min_depth += list_min_depth[index];
avg_max_depth += list_max_depth[index];
}
avg_min_depth /= list_min_depth.size();
avg_max_depth /= list_max_depth.size();
// assign min of initial value and avg depths as final answer
min_depth = std::min( min_depth, avg_min_depth );
max_depth = std::min( max_depth, avg_max_depth );
}
Definition at line 1072 of file CubitOctreeGeneratorVolumes.cpp.
{
// all the functions of skeleton sizing function are called here
CpuTimer octgentime;
double time_octree_generation;
//ProgressTool *progressToolPtr = AppUtil::instance()->progress_tool();
//assert(progressToolPtr != NULL );
//char title[42]="Octree Generation in Progress ...";
//progressToolPtr->start(0, 100, title, NULL, CUBIT_TRUE, CUBIT_TRUE);
//PRINT_DEBUG_157("\nENTER: Octree Generation \n");
CpuTimer preproctime;
build_td_mref_faces();
build_td_mref_edges();
// this is used to store size and also used in 3D MAT generation
CpuTimer gen_latt;
int min_depth = MIN_DEPTH_OCTREE[OCTREE_TIME_ACCURACY_LEVEL];
int max_depth = MAX_DEPTH_OCTREE[OCTREE_TIME_ACCURACY_LEVEL];
CubitOctreeGeneratorVolumes::find_optimal_min_and_max_octree_depths( entityList, min_depth, max_depth );
get_octree_lattice()->set_max_depth(std::min( get_octree_lattice()->get_max_depth(), max_depth) );
get_octree_lattice()->set_min_depth(std::max( get_octree_lattice()->get_min_depth(), min_depth) );
//PRINT_INFO("\nOctree min_depth = %d, max_depth = %d\n", min_depth, max_depth);
generate_lattice();
//PRINT_INFO("profiling: time in generate_lattice: %f\n", gen_latt.cpu_secs());
// PRINT_DEBUG_157("AFTER: octree lattice generation\n");
//PRINT_DEBUG_157("BEFORE smooth transiton number of nodes = %d\n",gridNodeVector.size() );
CpuTimer time_to_balance;
get_octree_lattice()->establish_smooth_transition_of_cells( max_depth ); //OCTREE_MAX_DEPTH_OCTREE[OCTREE_TIME_ACCURACY_LEVEL] );
// PRINT_INFO("profiling: time to balance octree: %f\n", time_to_balance.cpu_secs());
// PRINT_DEBUG_157("AFTER smooth transiton \n" );
// Finds the intersection between the facets and the octree
CpuTimer intersection_time;
DLIList<CubitOctreeNode *> queue_for_3Dmat_generation;
find_intersection_between_octree_and_facets( queue_for_3Dmat_generation );
//PRINT_INFO("profiling: intersection time: %f\n", intersection_time.cpu_secs());
//PRINT_DEBUG_157("AFTER intersection between facets and octree \n" );
//PRINT_DEBUG_157("\nDONE: Octree Generation \n" );
//progressToolPtr->percent(1.0);
if( AppUtil::instance()->interrupt() ){
//CubitBoolean interruptStatus;
PRINT_WARNING("\n Killed octree generation...\n");
//interruptStatus = CUBIT_TRUE;
//progressToolPtr->end();
return CUBIT_FAILURE;
}
color_octreenode_via_grassfire( queue_for_3Dmat_generation );
color_lattice_cell();
time_octree_generation = octgentime.cpu_secs();
PRINT_INFO("Total time for octree generation: %f\n", time_octree_generation);
return CUBIT_SUCCESS;
}
| CubitBoolean CubitOctreeGeneratorVolumes::generate_lattice | ( | void | ) | [virtual] |
Implements CubitOctreeGenerator.
Definition at line 74 of file CubitOctreeGeneratorVolumes.cpp.
{
// initialize CubitOctree root
cubitOctree->initialize_octree_generation();
// Builds the tree fully till the level min_depthibcbtghs.lib
cubitOctree->build_octree_till_min_depth( cubitOctree->get_root() );
// Builds the tree based on facets' points, centroid, dimension ...
// Note that the points on the curves belong to more than one face
// Therefore the CubitOctree is subdivided till the maxDepth
build_octree_till_skl_max_depth_based_on_facets();
// Adjacents cells can be found by visiting the adjacent cells of every node
// Cells are split till the difference in the levels of adjacent cells is 1.
// At every node find the maximum and minimum cell. Split the maximum cell if
// it deffers by 2 or more in depth.
//PRINT_DEBUG_157(" Number of nodes = %d", gridNodeVector.size() );
return CUBIT_TRUE;
}
| void CubitOctreeGeneratorVolumes::get_bounding_box | ( | CubitVector & | min, |
| CubitVector & | max | ||
| ) | [virtual] |
Implements CubitOctreeGenerator.
Definition at line 32 of file CubitOctreeGeneratorVolumes.cpp.
{
RefEntity *volume;
int index;
CubitBox bound_box;
min.x( CUBIT_DBL_MAX );
min.y( CUBIT_DBL_MAX );
min.z( CUBIT_DBL_MAX );
max.x( -CUBIT_DBL_MAX );
max.y( -CUBIT_DBL_MAX );
max.z( -CUBIT_DBL_MAX );
for( index = 0; index < entityList.size(); index++ ){
volume = entityList.get_and_step();
bound_box = volume->bounding_box();
if( bound_box.minimum().x() < min.x() )
min.x( bound_box.minimum().x());
if( bound_box.minimum().y() < min.y() )
min.y( bound_box.minimum().y());
if( bound_box.minimum().z() < min.z() )
min.z( bound_box.minimum().z());
if( bound_box.maximum().x() > max.x() )
max.x( bound_box.maximum().x());
if( bound_box.maximum().y() > max.y() )
max.y( bound_box.maximum().y());
if( bound_box.maximum().z() > max.z() )
max.z( bound_box.maximum().z());
}
}
| void CubitOctreeGeneratorVolumes::reset_td_octree_ref_edge_visit | ( | const CubitBoolean | type | ) |
Definition at line 780 of file CubitOctreeGeneratorVolumes.cpp.
{
int index, i;
Body *volume;
DLIList<RefEdge *> vol_ref_edges;
for( index = 0; index < entityList.size(); index++ ){
volume = CAST_TO( entityList.get_and_step(), Body );
vol_ref_edges.clean_out();
volume->ref_edges( vol_ref_edges );
for( i = 0; i < vol_ref_edges.size(); i++ ){
TDOctreeRefEdge::get_td( vol_ref_edges.get_and_step() )->set_visit( type );
}
}
return;
}
| void CubitOctreeGeneratorVolumes::reset_td_octree_ref_face_visit | ( | const CubitBoolean | type | ) |
Definition at line 762 of file CubitOctreeGeneratorVolumes.cpp.
{
int index, i;
Body *volume;
DLIList<RefFace *> vol_ref_faces;
for( index = 0; index < entityList.size(); index++ ){
volume = CAST_TO( entityList.get_and_step(), Body );
vol_ref_faces.clean_out();
volume->ref_faces( vol_ref_faces );
for( i = 0; i < vol_ref_faces.size(); i++ ){
TDOctreeRefFace::get_td( vol_ref_faces.get_and_step() )->set_visit( type );
}
}
return;
}
| void CubitOctreeGeneratorVolumes::testing | ( | ) |
DLIList<RefEntity*>& CubitOctreeGeneratorVolumes::entityList [private] |
Definition at line 65 of file CubitOctreeGeneratorVolumes.hpp.