|
cgma
|
#include <CubitOctree.hpp>
Definition at line 49 of file CubitOctree.hpp.
| CubitOctree::CubitOctree | ( | CubitOctreeGenerator * | lattice_gen | ) |
Definition at line 23 of file CubitOctree.cpp.
{
CubitOctreeNode::reset_counter();
cubitOctreeGenerator = lattice_gen;
maxSizeGridNode = -CUBIT_DBL_MAX;
minSizeGridNode = CUBIT_DBL_MAX;
CubitVector min_corner;
CubitVector max_corner;
lattice_gen->get_bounding_box( min_corner, max_corner );
// note (vvyas 7/2005): perturbing bbox unsymmetrically to help avoid degenerate cases
// in SAT intersection code
CubitVector min_perturbation(-.0001,-.0002,-.0003);
CubitVector max_perturbation(.0005,.00012,.00028);
min_corner += min_perturbation;
max_corner += max_perturbation;
CubitBox bbox(min_corner, max_corner );
double x_range = bbox.x_range();
double y_range = bbox.y_range();
double z_range = bbox.z_range();
double max_range;
max_range = ( x_range > y_range ) ? x_range : y_range;
max_range = ( z_range > max_range ) ? z_range : max_range;
bboxCenter.x(( min_corner.x() + max_corner.x() ) / 2.0);
bboxCenter.y(( min_corner.y() + max_corner.y() ) / 2.0);
bboxCenter.z(( min_corner.z() + max_corner.z() ) / 2.0);
epsilonBBox = max_range / pow(2.0, OCTREE_MAX_DEPTH_OCTREE[OCTREE_TIME_ACCURACY_LEVEL] ) * 0.15;
bboxDimension = max_range + 2 * epsilonBBox;
bboxMaxX = bboxCenter.x() + bboxDimension / 2.0;
bboxMinX = bboxCenter.x() - bboxDimension / 2.0;
bboxMaxY = bboxCenter.y() + bboxDimension / 2.0;
bboxMinY = bboxCenter.y() - bboxDimension / 2.0;
bboxMaxZ = bboxCenter.z() + bboxDimension / 2.0;
bboxMinZ = bboxCenter.z() - bboxDimension / 2.0;
// Data structure flags are used to know if a perticualr data structure is already established or not.
statusCubitOctreeColoring = CUBIT_FALSE;
minDepth = OCTREE_MIN_DEPTH_OCTREE[OCTREE_TIME_ACCURACY_LEVEL];
maxDepth = OCTREE_MAX_DEPTH_OCTREE[OCTREE_TIME_ACCURACY_LEVEL];
root = NULL;
}
| CubitOctree::~CubitOctree | ( | ) | [virtual] |
Definition at line 81 of file CubitOctree.cpp.
{
greyCellList.clean_out();
boundaryWhiteGridNodeList.clean_out();
int i;
int num_elm;
//PRINT_INFO("BEFORE: Deleted grid nodes \n");
//system("pause");
num_elm = gridNodeVector.size();
CubitOctreeNode *ognode;
for( i = 0; i < num_elm; i++ ){
ognode = gridNodeVector.pop();
if (ognode) {delete ognode;}
}
for (i=0; i < greyGridNodeVector.size(); ++i)
{
delete (greyGridNodeVector.get_and_step());
}
//PRINT_INFO("AFTER: Deleted grid nodes \n");
//system("pause");
delete root;
//PRINT_INFO("AFTER: Deleted CubitOctree cells \n");
// system("pause");
}
| CubitBoolean CubitOctree::apd_vector_item | ( | CubitOctreeNode * | ptr_grid_node | ) | [inline, private] |
Definition at line 1531 of file CubitOctree.cpp.
{
gridNodeVector.push( ptr_node);
return CUBIT_TRUE;
}
Definition at line 234 of file CubitOctree.cpp.
{
int i, j, k;
if( ptr_cell->get_depth() < minDepth ){
subdivide_octree_cell( ptr_cell, NULL, minDepth );
// PRINT_INFO(" establish connection between new nodes and pointed old nodes \n");
// Recursively call all the childen
for( i = 0; i < 2; i++ ){
for( j = 0; j < 2; j++ ){
for( k = 0; k < 2; k++ ){
// PRINT_INFO("Child : %d %d %d \n",i,j,k );
build_octree_till_min_depth( ptr_cell->get_child(i, j, k) );
}
}
}
// PRINT_INFO(" finished calling all recursively all children \n");
}
return CUBIT_TRUE;
}
| double CubitOctree::calculate_depth_based_on_size | ( | double | size | ) | [private] |
Definition at line 112 of file CubitOctree.cpp.
{
return ceil( log((double)get_bbox_dimension() / (double)size ) / log(2.0) );
}
| double CubitOctree::capsule_distance_to_facet | ( | const CubitVector & | point, |
| CubitFacet * | lp_facet, | ||
| CubitVector & | int_point, | ||
| CubitBoolean | use_projection_only = CUBIT_FALSE |
||
| ) | [static] |
Definition at line 1773 of file CubitOctree.cpp.
{
CubitVector c = lp_facet->center();
CubitVector n = lp_facet->normal();
double d = (point - c)%n;
CubitVector proj = point - d*n;
CubitVector points[3] = {lp_facet->point(0)->coordinates(), lp_facet->point(1)->coordinates(), lp_facet->point(2)->coordinates()};
if (use_projection_only || CubitOctreeNode::is_intersection_point_contained_inside_facet(proj, points[0], points[1], points[2]))
{
int_point = proj;
return fabs(d);
}
double dn[3] = {0,0,0};
CubitVector pn[3];
double t = 0;
int i;
for (i=0; i < 3; ++i)
{
CubitVector dir = points[(i+1)%3] - points[i];
double length = dir.length();
dir.normalize();
t = ((point - points[i])%dir)/length;
if (t >= 0 && t <= 1)
{
pn[i] = (length*t*dir + points[i]);
dn[i] = (point - (t*length*dir + points[i])).length();
}
else
{
if (t < 0)
{
pn[i] = points[i];
dn[i] = (point - points[i]).length();
}
else if (t > 1)
{
pn[i] = points[(i+1)%3];
dn[i] = (point - points[(i+1)%3]).length();
}
//else {PRINT_INFO("Hmmm.... t is not within bounds: %f!!!!!!!!!!!!!!!!11\n", t);}
}
}
if (dn[0] <= dn[1] && dn[0] <= dn[2]) {int_point = pn[0]; return dn[0];}
if (dn[1] <= dn[0] && dn[1] <= dn[2]) {int_point = pn[1]; return dn[1];}
if (dn[2] <= dn[1] && dn[2] <= dn[0]) {int_point = pn[2]; return dn[2];}
else
{
//PRINT_INFO("capsule dist not found!!!!!!!!!!!!!1\n");
return -1;
}
}
| CubitStatus CubitOctree::circumcenter | ( | CubitVector & | a, |
| CubitVector & | b, | ||
| CubitVector & | c, | ||
| CubitVector & | center, | ||
| double & | radius | ||
| ) | [static, private] |
Definition at line 1740 of file CubitOctree.cpp.
{
// Use coordinates relative to point `a' of the triangle.
CubitVector vec_ba(a, b);
CubitVector vec_ca(a, c);
// Squares of lengths of the edges incident to `a'.
double ba_length = vec_ba.length_squared();
double ca_length = vec_ca.length_squared();
// Cross product of these edges.
// (Take your chances with floating-point roundoff.)
CubitVector cross_bc = vec_ba * vec_ca;
// Calculate the denominator of the formulae.
double denominator = (cross_bc % cross_bc);
if (denominator == 0.0) {return CUBIT_FAILURE;}
assert(denominator != 0.0); // don't think we need this..
// Calculate offset (from `a') of circumcenter.
center = (ba_length * vec_ca - ca_length * vec_ba) * cross_bc * 0.5;
center /= denominator;
// radius is length from point `a' to center
radius = center.length();
// Add point `a' to get global coordinate of center
center += a;
return CUBIT_SUCCESS;
}
| void CubitOctree::color_octreecell | ( | void | ) |
Definition at line 1331 of file CubitOctree.cpp.
{
root->coloring(/*greyCellList,*/ blackCellList);
/* TESTING: Duplicates in grey cell list
CubitOctreeCell *ptr_cell;
int i;
for( i = 0; i < greyCellList.size(); i++ ){
ptr_cell = greyCellList.get_and_step();
PRINT_INFO("Grey cell ID: %d \n", ptr_cell->id() );
}
*/
}
| void CubitOctree::display | ( | const int | mode, |
| int | opt = 0 |
||
| ) |
| CubitBoolean CubitOctree::establish_smooth_transition_of_cells | ( | int | max_depth | ) |
Definition at line 724 of file CubitOctree.cpp.
{
CubitOctreeNode *ptr_grid_node;
int depth_difference;
DLIList<CubitOctreeNode *> queue;
gather_initial_grid_nodes_for_smooth_transition( queue );
while( queue.size() > 0 ){
ptr_grid_node = queue.remove();
ptr_grid_node->set_mark( CUBIT_FALSE );
// WARNING: Why Cubit Black only
// if( ptr_grid_node->get_color() == CUBIT_BLACK_INDEX ){
depth_difference = ptr_grid_node->get_cell_depth_difference();
if( depth_difference >= 2 ){
subdivide_octree_cell( ptr_grid_node->get_min_depth_cell(), &queue, max_depth );
}
//}
}
return CUBIT_TRUE;
}
| void CubitOctree::find_cell_list_intersecting_line_segment | ( | const CubitVector & | p0, |
| const CubitVector & | p1, | ||
| DLIList< CubitOctreeCell * > & | cell_list | ||
| ) |
Definition at line 1347 of file CubitOctree.cpp.
{
// plane order is like in enum OctreePosition
CubitOctreeCell *start = find_octreecell(p0), *end = find_octreecell(p1);
CubitOctreeCell *current = start, *previous = NULL;
CubitVector curr_pt = p0;
CubitVector dir = p1-p0, center;
//CubitVector ii(1,0,0);
//CubitVector jj(0,1,0);
//CubitVector kk(0,0,1);
int i;
dir.normalize();
double tx=0, ty=0, tz=0, h=0, a = dir.x(), b = dir.y(), c = dir.z();
static unsigned int face_corners[6][4] =
{
{0,5,6,2},
{4,3,1,7},
{5,3,7,2},
{0,4,1,6},
{1,7,2,6},
{4,3,5,0}
};
static unsigned int inwward_cells[6][4][3] =
{
{{0,0,0},{0,0,1},{1,0,0},{1,0,1}},
{{0,1,0},{0,1,1},{1,1,0},{1,1,1}},
{{0,1,0},{0,0,0},{1,0,0},{1,1,0}},
{{0,1,1},{0,0,1},{1,0,1},{1,1,1}},
{{0,0,0},{0,0,1},{0,1,1},{0,1,0}},
{{1,0,0},{1,0,1},{1,1,1},{1,1,0}}
};
while (current != end)
{
if (current != previous)
{
cell_list.append(current);
previous = current;
}
// do tn, pick face, march stuff here
h = current->get_dimension();
center = current->get_center();
if (fabs(a) > CUBIT_DBL_MIN) {tx = h/(2*fabs(a)) - (curr_pt.x() - center.x())/a;}
else {tx = CUBIT_DBL_MAX;}
if (fabs(b) > CUBIT_DBL_MIN) {ty = h/(2*fabs(b)) - (curr_pt.y() - center.y())/b;}
else {ty = CUBIT_DBL_MAX;}
if (fabs(c) > CUBIT_DBL_MIN) {tz = h/(2*fabs(c)) - (curr_pt.z() - center.z())/c;}
else {tz = CUBIT_DBL_MAX;}
tx = fabs(tx);
ty = fabs(ty);
tz = fabs(tz);
double t = 0.0;
OctreePosition int_plane = O_UNSET;
if (tx <= ty && tx <= tz)
{
if (a > 0) {t = ((center.x() + h/2) - curr_pt.x())/a; int_plane = O_FRONT;}
else {t = ((center.x() - h/2) - curr_pt.x())/a; int_plane = O_BACK;}
}
else if (ty <= tx && ty <= tz)
{
if (b > 0) {t = ((center.y() + h/2) - curr_pt.y())/b; int_plane = O_RIGHT;}
else {t = ((center.y() - h/2) - curr_pt.y())/b; int_plane = O_LEFT;}
}
else if (tz <= ty && tz <= tx)
{
if (c > 0) {t = ((center.z() + h/2) - curr_pt.z())/c; int_plane = O_TOP;}
else {t = ((center.z() - h/2) - curr_pt.z())/c; int_plane = O_BOTTOM;}
}
// now we have determined the point of intersection on a face of the cell
// based on the face, we should now check the grid nodes' adjacent cells and march if necessary to find the next cell to march in
CubitOctreeNode* corners[] =
{
current->get_octree_grid_node(1,0,1),
current->get_octree_grid_node(0,1,1),
current->get_octree_grid_node(0,0,0),
current->get_octree_grid_node(1,1,0),
current->get_octree_grid_node(1,1,1),
current->get_octree_grid_node(1,0,0),
current->get_octree_grid_node(0,0,1),
current->get_octree_grid_node(0,1,0),
};
/*
CubitOctreeNode *cADF = current->get_octree_grid_node(1,0,1); //0
CubitOctreeNode *cBCF = current->get_octree_grid_node(0,1,1); //1
CubitOctreeNode *cCDE = current->get_octree_grid_node(0,0,0); //2
CubitOctreeNode *cABE = current->get_octree_grid_node(1,1,0); //3
CubitOctreeNode *cABF = current->get_octree_grid_node(1,1,1); //4
CubitOctreeNode *cADE = current->get_octree_grid_node(1,0,0); //5
CubitOctreeNode *cCDF = current->get_octree_grid_node(0,0,1); //6
CubitOctreeNode *cBCE = current->get_octree_grid_node(0,1,0); //7
*/
// each digit is an i,j,k index for the inward cell from a grid node
CubitOctreeNode* int_face[4] = {corners[face_corners[int_plane][0]], corners[face_corners[int_plane][1]], corners[face_corners[int_plane][2]], corners[face_corners[int_plane][3]]};
unsigned int* cells[4] = {inwward_cells[int_plane][0], inwward_cells[int_plane][1], inwward_cells[int_plane][2], inwward_cells[int_plane][3]};
CubitOctreeCell* four_cells[4];
//CubitOctreeCell *curr_cell = int_face[0]->get_adj_cell(cells[0][0],cells[0][1],cells[0][2]);
bool one_face_neighbor = true;
//bool same_depth = true;
CubitOctreeCell *compare_to = NULL;
for (i=0; i < 4; ++i)
{
four_cells[i] = int_face[i]->get_adj_cell(cells[i][0],cells[i][1],cells[i][2]);
if (compare_to == NULL && four_cells[i] != NULL) {compare_to = four_cells[i];}
}
for (i=0; i < 4; ++i)
{
if (four_cells[i] == NULL)
{
one_face_neighbor = false;
//same_depth = false;
break;
}
if (four_cells[i] != NULL)
{
if (four_cells[i] != compare_to) {one_face_neighbor = false;}
//if (four_cells[i]->get_depth() != compare_to->get_depth()) {same_depth = false;}
}
}
curr_pt += t*dir;
if (one_face_neighbor == true)
{
current = compare_to;//four_cells[0];//curr_cell;.
// PRINT_INFO("Found one face neighbor for CubitOctree ray traversal\n");
}
else
{
//curr_pt += (t+.0001)*dir;
int axes[6] = {1,1,2,2,0,0};
int dirs[6] = {-1,1,-1,1,-1,1};
double xyz[3];
curr_pt.get_xyz(xyz);
xyz[axes[int_plane]] += dirs[int_plane] * (get_bbox_dimension()/(2*pow((double)2.0,maxDepth)));
CubitVector temp_pt;
temp_pt.set(xyz);
// SVDrawTool::draw_point(temp_pt, CUBIT_WHITE_INDEX);
current = find_octreecell(temp_pt);
/* if (current == previous) {
PRINT_INFO("Samet method failed!\n");
}*/
//PRINT_INFO("Did not find one face neighbor for CubitOctree ray traversal, following Samet method\n");
}
//SVDrawTool::mouse_xforms();
if (current == end) {break;}
}
cell_list.append(end);
}
| CubitBoolean CubitOctree::find_cells_based_on_surface_angle | ( | DLIList< CubitOctreeCell * > & | refine_cell_list, |
| DLIList< CubitFacetEdge * > & | crease_edges, | ||
| DLIList< CubitFacet * > & | crease_facets, | ||
| RefFace * | one, | ||
| RefFace * | two, | ||
| const CubitBoolean | draw_facets = CUBIT_FALSE, |
||
| double | dihedral_angle_thresh = CUBIT_PI/2.0 |
||
| ) |
Definition at line 280 of file CubitOctree.cpp.
{
int i, j, k;
CubitFacetEdge *edge;
CubitBoolean water_tight = CUBIT_FALSE;
DLIList<DLIList<CubitFacet*>*> shell_list;
DLIList<CubitQuadFacet*> dummy;
DLIList<CubitFacet*> mark1, mark2, facets, facet1, facet2, draw_facet_list;
DLIList<CubitFacetEdge*> new_edge1, new_edge2;
DLIList<CubitPoint*> new_points;
CubitFacet *temp_facet = NULL;
if (one == NULL || two == NULL)
{
return CUBIT_FALSE;
}
dihedral_angle_thresh = cos(dihedral_angle_thresh);
TDOctreeRefFace *td_skl_one = TDOctreeRefFace::get_td(one),
*td_skl_two = TDOctreeRefFace::get_td(two);
if (td_skl_one == NULL || td_skl_two == NULL ||
td_skl_one->get_ptr_cubit_facet_list() == NULL || td_skl_two->get_ptr_cubit_facet_list() == NULL)
{
PRINT_DEBUG_157("CubitOctree::find_cells_based_on_surface_angle: null TDs or null facet list ptr\n");
PRINT_DEBUG_157("RefFace one->id()=%d, td_skl=%p\ntwo->id()=%d, td_skl=%p\n", one->id(), (void*)td_skl_one,
two->id(), (void*)td_skl_two);
PRINT_DEBUG_157("This may happen when one volume sizing function \'steals\'\na surface from an existing sizing function.");
return CUBIT_FALSE;
}
if (!td_skl_one->get_create_2dmat() || !td_skl_two->get_create_2dmat()) {return CUBIT_FALSE;}
FacetDataUtil::copy_facets(*TDOctreeRefFace::get_td(one)->get_ptr_cubit_facet_list(), facet1, new_points, new_edge1);
FacetDataUtil::copy_facets(*TDOctreeRefFace::get_td(two)->get_ptr_cubit_facet_list(), facet2, new_points, new_edge2);
for (i=0; i < new_edge1.size(); ++i)
{
edge = new_edge1.get_and_step();
if (edge->number_tris() == 1)
{
temp_facet = edge->adj_facet(0);
if (!temp_facet->marked())
{
mark1.append(edge->adj_facet(0));
temp_facet->marked(CUBIT_TRUE);
}
//facets.append(edge->adj_facet(0));
}
}
for (i=0; i < new_edge2.size(); ++i)
{
edge = new_edge2.get_and_step();
if (edge->number_tris() == 1)
{
temp_facet = edge->adj_facet(0);
if (!temp_facet->marked())
{
mark2.append(edge->adj_facet(0));
temp_facet->marked(CUBIT_TRUE);
}
//facets.append(edge->adj_facet(0));
}
}
for (i=0; i < mark1.size(); ++i)
{
mark1.get_and_step()->marked(CUBIT_FALSE);
}
for (i=0; i < mark2.size(); ++i)
{
mark2.get_and_step()->marked(CUBIT_FALSE);
}
facets += facet1;
facets += facet2;
facet1.clean_out(); //delete facet1;
facet2.clean_out(); //delete facet2;
new_edge1.clean_out(); //delete new_edge1;
new_edge2.clean_out(); //delete new_edge2;
new_points.clean_out(); //delete new_points;
CubitStatus rv = FacetDataUtil::split_into_shells(/*facet1*/facets, dummy, shell_list, water_tight);
if (!rv || shell_list.size() == 0)
{
PRINT_DEBUG_157("CubitOctree::find_cells_based_on_surface_angle: could not form shells from facet list!\n");
PRINT_DEBUG_157("return value was %d, number of shells is %d\n", rv, shell_list.size());
//SVDrawTool::clear_non_retained();
//SVDrawTool::draw_facets(facets, CUBIT_RED_INDEX);
//SVDrawTool::mouse_xforms();
return CUBIT_FALSE;
}
/*
int num_null_shells = 0;
for (i=0; i < shell_list.size(); ++i)
{
if (shell_list.get_and_step() == NULL)
{
++num_null_shells;
}
}
if (num_null_shells)
{
PRINT_INFO("CubitOctree::find_cells_based_on_surface_angle: %d of %d shells formed from facets are NULL!\n", num_null_shells, shell_list.size());
}
*/
rv = FacetDataUtil::stitch_facets(shell_list, 1e-4, water_tight, CUBIT_FALSE);
if (!rv)
{
PRINT_DEBUG_157("CubitOctree::find_cells_based_on_surface_angle: could not stitch facets!\n");
//SVDrawTool::clear_non_retained();
//SVDrawTool::draw_facets(facets, CUBIT_RED_INDEX);
//SVDrawTool::mouse_xforms();
return CUBIT_FALSE;
}
//TDSkeletonCubitFacet::stitch_facets(facet1,facet2);
for (i=0; i < mark1.size(); ++i)
{
CubitFacet *facet = mark1.get_and_step();
if (facet->marked()) {continue;}
facet->marked(CUBIT_TRUE);
for (j=0; j < mark2.size(); ++j)
{
for (k=0; k < 3; ++k)
{
CubitFacet *other = facet->shared_facet(facet->point(k), facet->point((k+1)%3));
if (other != NULL && other == mark2[j] && !mark2[j]->marked() && (facet->normal() % other->normal() < dihedral_angle_thresh))
{
//crease_edges.append(facet->point(k)->shared_edge(facet->point((k+1)%3)));
find_cell_list_intersecting_line_segment(facet->point(k)->coordinates(), facet->point((k+1)%3)->coordinates(), refine_cell_list);
mark2[j]->marked(CUBIT_TRUE);
if (draw_facets)
{
draw_facet_list.append(facet);
draw_facet_list.append(other);
}
}
}
}
}
if (draw_facets) {
//SVDrawTool::draw_facets(draw_facet_list, CUBIT_MAGENTA_INDEX);
}
if (refine_cell_list.size() > 0)
{
//crease_facets += facets;
FacetDataUtil::delete_facets(facets);
return CUBIT_TRUE;
}
FacetDataUtil::delete_facets(facets);
return CUBIT_FALSE;
}
| CubitBoolean CubitOctree::find_intersection_between_grid_edges_and_facet | ( | CubitOctreeType | type, |
| RefFace * | ptr_face, | ||
| CubitFacet * | ptr_facet, | ||
| DLIList< CubitOctreeNode * > & | CubitOctree_grid_node_list | ||
| ) |
Definition at line 678 of file CubitOctree.cpp.
{
int i;
CubitOctreeNode *ptr_grid_node;
for( i = 0; i < CubitOctree_grid_node_list.size(); i++ ){
ptr_grid_node = CubitOctree_grid_node_list.get_and_step();
if( ptr_grid_node->get_halfspace_direction() == OCTREE_POSITIVE ){
ptr_grid_node->find_intersection_with_facet( type, ptr_face, ptr_facet, boundaryWhiteGridNodeList );
}
}
// reset all +ve grid nodes to -ve
for( i = 0; i < CubitOctree_grid_node_list.size(); i++ ){
ptr_grid_node = CubitOctree_grid_node_list.get_and_step();
ptr_grid_node->set_mark( CUBIT_FALSE );
if( ptr_grid_node->get_halfspace_direction() == OCTREE_POSITIVE ){
ptr_grid_node->set_halfspace_direction( OCTREE_NEGATIVE );
}
}
return CUBIT_TRUE;
}
| void CubitOctree::find_max_min_size_grid_node_for_scaling | ( | void | ) | [private] |
Definition at line 1538 of file CubitOctree.cpp.
{
CubitOctreeNode *ptr_grid_node;
int i;
double size;
for( i = 0; i < gridNodeVector.size(); i++ ){
ptr_grid_node = gridNodeVector.get_and_step();
if (ptr_grid_node)
{
size = ptr_grid_node->get_size( OCTREE_SIZE_DEFAULT );
if( size > 0.0 ){
// TESTING
//PRINT_DEBUG_157("size = %f\n", size);
if( size < minSizeGridNode )
minSizeGridNode = size;
if( size > maxSizeGridNode )
maxSizeGridNode = size;
}
}
}
PRINT_DEBUG_167("Max Size Grid Node = %f\n", maxSizeGridNode );
PRINT_DEBUG_167("Min Size Grid Node = %f\n", minSizeGridNode );
double average_size = (minSizeGridNode + maxSizeGridNode) / 2.0;
minSizeGridNode -= .05*average_size;
maxSizeGridNode += .05*average_size;
PRINT_DEBUG_167("For drawing:\n");
PRINT_DEBUG_167("Adjusted Max Size Grid Node = %f\n", maxSizeGridNode );
PRINT_DEBUG_167("Adjusted Min Size Grid Node = %f\n", minSizeGridNode );
//system("pause");
}
| CubitBoolean CubitOctree::find_octree_cells_contained_inside_bbox | ( | CubitFacet * | ptr_facet, |
| DLIList< CubitOctreeCell * > & | CubitOctree_cell_list | ||
| ) |
Definition at line 587 of file CubitOctree.cpp.
{
CubitPoint *p0, *p1, *p2;
CubitBox facet_bbox;
DLIList<CubitOctreeCell*> queue;
DLIList<CubitOctreeCell*> marked_list;
CubitOctreeCell *CubitOctree_cell1, *CubitOctree_cell2, *CubitOctree_cell3;
CubitOctreeCell *ptr_cell;
CubitBoolean result;
int i;
queue.clean_out();
facet_bbox = ptr_facet->bounding_box();
//PRINT_DEBUG_157(" BBox min : %f %f %f max : %f %f %f ", facet_bbox.minimum().x(), facet_bbox.minimum().y(), facet_bbox.minimum().z(), facet_bbox.maximum().x(), facet_bbox.maximum().y(), facet_bbox.maximum().z() );
ptr_facet->points( p0, p1, p2 );
CubitOctree_cell1 = find_octreecell( p0->coordinates() );
//CubitOctree_cell_list.push( CubitOctree_cell1 );
queue.push( CubitOctree_cell1 );
CubitOctree_cell1->set_mark( CUBIT_TRUE );
CubitOctree_cell2 = find_octreecell( p1->coordinates() );
//CubitOctree_cell_list.push( CubitOctree_cell2 );
if( CubitOctree_cell2->get_mark() == CUBIT_FALSE ){
queue.push( CubitOctree_cell2 );
CubitOctree_cell2->set_mark( CUBIT_TRUE );
}
CubitOctree_cell3 = find_octreecell( p2->coordinates() );
//CubitOctree_cell_list.push( CubitOctree_cell3 );
if( CubitOctree_cell3->get_mark() == CUBIT_FALSE ){
queue.push( CubitOctree_cell3 );
CubitOctree_cell3->set_mark( CUBIT_TRUE );
}
while( queue.size() > 0 ){
ptr_cell = queue.pop();
marked_list.push( ptr_cell );
result = ptr_cell->is_intersects_box( facet_bbox );
if( result == CUBIT_TRUE ){
CubitOctree_cell_list.push( ptr_cell );
// add adjacent unmarked CubitOctree cells to queue
ptr_cell->add_adjacent_unmarked_cells( queue );
}
}
for( i = 0; i < marked_list.size(); i++ ){
ptr_cell = marked_list.get_and_step();
ptr_cell->set_mark( CUBIT_FALSE );
//ptr_cell->display(this);
}
return CUBIT_TRUE;
}
| CubitOctreeCell * CubitOctree::find_octreecell | ( | const CubitVector & | pnt | ) |
Definition at line 1525 of file CubitOctree.cpp.
{
return( root->find_leaf_octree_cell( pnt ) );
}
| void CubitOctree::find_radius_at_boundary_node | ( | void | ) | [private] |
| void CubitOctree::gather_initial_grid_nodes_for_smooth_transition | ( | DLIList< CubitOctreeNode * > & | queue | ) | [private] |
Definition at line 703 of file CubitOctree.cpp.
{
int i;
CubitOctreeNode *ptr_grid_node;
int depth_difference;
for( i = 0; i < gridNodeVector.size(); i++ ){
ptr_grid_node = gridNodeVector.get_and_step();
depth_difference = ptr_grid_node->find_min_depth_cell_and_depth_difference();
// By default mark is maintained CUBIT_FALSE
if( depth_difference >= 2 ){
queue.push( ptr_grid_node );
ptr_grid_node->set_mark( CUBIT_TRUE );
}
}
}
| double CubitOctree::get_bbox_dimension | ( | void | ) | [inline, private] |
Definition at line 154 of file CubitOctree.hpp.
{ return bboxDimension; }
| DLIList<CubitOctreeCell*>* CubitOctree::get_blackcelllist | ( | ) | [inline] |
Definition at line 72 of file CubitOctree.hpp.
{return &blackCellList;}
| DLIList<CubitOctreeCell*>* CubitOctree::get_greycelllist | ( | void | ) | [inline] |
Definition at line 70 of file CubitOctree.hpp.
{ return &greyCellList; }
| DLIList<CubitOctreeNode*>* CubitOctree::get_gridnodevector | ( | void | ) | [inline] |
Definition at line 74 of file CubitOctree.hpp.
{ return &gridNodeVector; }
| int CubitOctree::get_max_depth | ( | void | ) | [inline] |
Definition at line 63 of file CubitOctree.hpp.
{ return maxDepth;}
| double CubitOctree::get_max_size_grid_node | ( | void | ) | [inline] |
Definition at line 107 of file CubitOctree.hpp.
{ return maxSizeGridNode; }
| int CubitOctree::get_min_depth | ( | void | ) | [inline] |
Definition at line 64 of file CubitOctree.hpp.
{ return minDepth;}
| double CubitOctree::get_min_size_grid_node | ( | void | ) | const [inline] |
Definition at line 110 of file CubitOctree.hpp.
{ return minSizeGridNode; }
| CubitOctreeCell* CubitOctree::get_root | ( | void | ) | [inline] |
Definition at line 79 of file CubitOctree.hpp.
{ return root; }
| double CubitOctree::get_scaled_from_wrld_size_grid_node | ( | double | wrld_size | ) |
Definition at line 1721 of file CubitOctree.cpp.
{
double scaled_size;
scaled_size = 1.0 + ( ( wrld_size - minSizeGridNode ) / ( maxSizeGridNode - minSizeGridNode ) ) * 9.0;
//PRINT_DEBUG_157("Scaled Size = %2.10f\n",scaled_size);
//PRINT_INFO(" world = %f, scaled = %f\n", wrld_size, scaled_size );
if( scaled_size > 10 ){
PRINT_INFO("Testing ");
}
return scaled_size;
}
| DLIList<CubitOctreeNode*>* CubitOctree::get_whitenodelist | ( | void | ) | [inline] |
Definition at line 68 of file CubitOctree.hpp.
{ return &boundaryWhiteGridNodeList; }
Definition at line 119 of file CubitOctree.cpp.
{
// Normalize the center and size of the CubitOctree cell
// bbox dimension is 1.0 with center at 1/2, 1/2, 1/2
CubitVector norm_center;
int level = 0;
int i,j, k, l, m, n;
double norm_dim;
//norm_center.x(100.0 / 2);
//norm_center.y(100.0 / 2);
//norm_center.z(100.0 / 2);
//norm_dim = 100.0;
norm_center = bboxCenter;
norm_dim = bboxDimension;
//VERBOSE PRINT_INFO(" BBOX Center = [ %f %f %f ] Dim = %f \n",norm_center.x(), norm_center.y(), norm_center.z(), norm_dim );
root = new CubitOctreeCell( norm_center, norm_dim, level, NULL );
CubitVector shift;
CubitOctreeNode *ptr_oct_node[2][2][2];
for( i = 0; i < 2; i++ ){
for( j = 0; j < 2; j++ ){
for( k = 0; k < 2; k++ ){
if( i == 0 )
shift.x( -norm_dim / 2.0 );
else
shift.x( norm_dim / 2.0 );
if( j == 0 )
shift.y( -norm_dim / 2.0 );
else
shift.y( norm_dim / 2.0 );
if( k == 0 )
shift.z( -norm_dim / 2.0 );
else
shift.z( norm_dim / 2.0 );
l = ( i == 1 )?0:1; // fliped 0 -> 1; 1 -> 0
m = ( j == 1 )?0:1;
n = ( k == 1 )?0:1;
ptr_oct_node[i][j][k] = new CubitOctreeNode( norm_center + shift, root, l, m, n );
apd_vector_item( ptr_oct_node[i][j][k] );
}
}
}
// Connecting CubitOctree Grid Nodes
//- adj_node[0] = O_FRONT Node
// adj_node[1] = O_BACK Node
// adj_node[2] = O_RIGHT Node
// adj_node[3] = O_LEFT Node
// adj_node[4] = O_TOP Node
// adj_node[5] = O_BOTTOM Node
for( i = 0; i < 2; i++ ){
for( j = 0; j < 2; j++ ){
for( k = 0; k < 2; k++ ){
if( i == 0 ){
ptr_oct_node[i][j][k]->set_adj_node( O_FRONT, ptr_oct_node[1][j][k] );
ptr_oct_node[i][j][k]->set_adj_node_distance( O_FRONT, 0 );
}
else{
ptr_oct_node[i][j][k]->set_adj_node( O_BACK, ptr_oct_node[0][j][k] );
ptr_oct_node[i][j][k]->set_adj_node_distance( O_BACK, 0 );
}
if( j == 0 ){
ptr_oct_node[i][j][k]->set_adj_node( O_RIGHT, ptr_oct_node[i][1][k] );
ptr_oct_node[i][j][k]->set_adj_node_distance( O_RIGHT, 0 );
}
else{
ptr_oct_node[i][j][k]->set_adj_node( O_LEFT, ptr_oct_node[i][0][k] );
ptr_oct_node[i][j][k]->set_adj_node_distance( O_LEFT, 0 );
}
if( k == 0 ){
ptr_oct_node[i][j][k]->set_adj_node( O_TOP, ptr_oct_node[i][j][1] );
ptr_oct_node[i][j][k]->set_adj_node_distance( O_TOP, 0 );
}
else{
ptr_oct_node[i][j][k]->set_adj_node( O_BOTTOM, ptr_oct_node[i][j][0] );
ptr_oct_node[i][j][k]->set_adj_node_distance( O_BOTTOM, 0 );
}
}
}
}
// Update the nodes of the root
for( i = 0; i < 2; i++ ){
for( j = 0; j < 2; j++ ){
for( k = 0; k < 2; k++ ){
root->set_oct_grid_node( i, j, k, ptr_oct_node[i][j][k] );
}
}
}
//root->display( this );
return CUBIT_TRUE;
}
| CubitBoolean CubitOctree::mark_cells_that_intersect_facet_plane | ( | DLIList< CubitOctreeCell * > & | CubitOctree_cell_list | ) | [private] |
Definition at line 502 of file CubitOctree.cpp.
{
int i;
CubitOctreeCell *ptr_cell;
for( i = 0; i < CubitOctree_cell_list.size(); i++ ){
ptr_cell = CubitOctree_cell_list.get_and_step();
if( ptr_cell->does_contain_positive_and_negative_nodes() == CUBIT_TRUE ){
ptr_cell->set_mark( CUBIT_TRUE );
}
}
return CUBIT_TRUE;
}
| CubitBoolean CubitOctree::mark_positive_and_negative_octree_grid_nodes | ( | CubitFacet * | ptr_facet, |
| DLIList< CubitOctreeCell * > & | CubitOctree_cell_list, | ||
| DLIList< CubitOctreeNode * > & | CubitOctree_grid_node_list | ||
| ) |
Definition at line 650 of file CubitOctree.cpp.
{
CubitOctreeCell *ptr_cell;
int i, l, m, n;
CubitOctreeNode *ptr_grid_node;
for( i = 0; i < CubitOctree_cell_list.size(); i++ ){
ptr_cell = CubitOctree_cell_list.get_and_step();
for( l = 0; l < 2; l++ ){
for( m = 0; m < 2; m++ ){
for( n = 0; n < 2; n++ ){
ptr_grid_node = ptr_cell->get_octree_grid_node( l, m, n );
if( ptr_grid_node->get_mark() == CUBIT_FALSE ){
ptr_grid_node->find_half_space( ptr_facet );
ptr_grid_node->set_mark( CUBIT_TRUE );
CubitOctree_grid_node_list.push( ptr_grid_node );
}
}
}
}
}
return CUBIT_TRUE;
}
| CubitPointContainment CubitOctree::point_containment | ( | CubitVector | tmp_vec, |
| double | tolerance | ||
| ) |
Definition at line 1689 of file CubitOctree.cpp.
{
CubitOctreeCell *ptr_cell = find_octreecell( point );
if( ptr_cell == NULL )
{
// not known and needs full acis/mbg point containment
return CUBIT_PNT_BOUNDARY;
}
else
{
switch( ptr_cell->get_color() )
{
case CUBIT_BLACK_INDEX:
return CUBIT_PNT_INSIDE;
case CUBIT_WHITE_INDEX:
return CUBIT_PNT_OUTSIDE;
case CUBIT_GREY_INDEX:
return CUBIT_PNT_BOUNDARY;
default:
return CUBIT_PNT_BOUNDARY;
}
}
return CUBIT_PNT_BOUNDARY;
}
| void CubitOctree::prepare_for_background_mesh | ( | ) | [private] |
| void CubitOctree::refine_cells_to_target_depth | ( | DLIList< CubitOctreeCell * > & | refine_cell_list, |
| const int | target_depth | ||
| ) | [private] |
Definition at line 456 of file CubitOctree.cpp.
{
int i, j, k;
CubitOctreeCell *current_cell = NULL;
while (refine_cell_list.size() > 0)
{
current_cell = refine_cell_list.get();
if (subdivide_octree_cell(current_cell, NULL, target_depth))
{
for (i=0; i < 2; ++i)
{
for (j=0; j < 2; ++j)
{
for (k=0; k < 2; ++k)
{
if (current_cell->get_child(i,j,k) != NULL)
{
refine_cell_list.append(current_cell->get_child(i,j,k));
}
}
}
}
}
refine_cell_list.extract();
}
}
| void CubitOctree::release_memory | ( | void | ) |
| void CubitOctree::reset_internal_node_size | ( | float | value, |
| int | type | ||
| ) | [private] |
| void CubitOctree::set_max_depth | ( | int | max_depth | ) | [inline] |
Definition at line 65 of file CubitOctree.hpp.
{ maxDepth = max_depth; }
| void CubitOctree::set_min_depth | ( | int | min_depth | ) | [inline] |
Definition at line 66 of file CubitOctree.hpp.
{ minDepth = min_depth; }
| void CubitOctree::set_status_octree_coloring | ( | CubitBoolean | type | ) | [inline] |
Definition at line 76 of file CubitOctree.hpp.
{ statusCubitOctreeColoring = type; }
| double CubitOctree::size_at_a_point | ( | const CubitVector & | point, |
| int | size_type | ||
| ) |
Definition at line 1580 of file CubitOctree.cpp.
{
//PRINT_DEBUG_116("Entered the SizeAtPoint of SkeletonSizingFunction");
static int mode = 1;
double size = 0.0;
// SVDrawTool::draw_point(point, CUBIT_RED_INDEX);
CubitOctreeCell *ptr_cell = find_octreecell( point );
if( ptr_cell == NULL )
{
PRINT_INFO("WARNING: Point is outside the solid\n");
//exit(1);
if( mode == 0 )
return size;
/*
mode = 0;
// Search the adjacent cells and find the nearest sizing data
CubitVector xyz[6];
CubitVector mod_point;
int i;
for( i = 0; i < 5; i ++ ){
xyz[i].x(0.0);
xyz[i].y(0.0);
xyz[i].z(0.0);
}
xyz[0].x( grid_size );
xyz[1].x( -1 * grid_size );
xyz[2].y( grid_size );
xyz[3].y( -1 * grid_size );
xyz[4].z( grid_size );
xyz[5].z( -1 * grid_size );
double total_size = 0;
int count = 0;
double size1;
for( i = 0; i < 5; i ++ ){
mod_point = point + xyz[i];
size1 = size_at_point( mod_point, 0.0 );
if( size1 != 0 ){
total_size += size1;
count++;
}
}
size = total_size / count;
if( size == 0.0 ){
PRINT_INFO("WARNING: Point is outside the solid can't handle ( size set to average size )\n");
size = 0.5;
size = 2 * ( min_rad + ( size - 1 ) / (10 - 1) * ( max_rad - min_rad ) ) * grid_size * over_all_reduction_scale;
}
mode = 1;
*/
}
else
{
switch( DEFAULT_INTERPOLATION_INSIDE_CELL )
{
case TRILINEAR_INTERPOLATION_INSIDE_CELL:
size = ptr_cell->trilinear_interpolation( point );
break;
case INVERSE_DISTANCE_INTERPOLATION_INSIDE_CELL:
size = ptr_cell->inverse_distance_interpolation( point );
break;
case MIN_DISTANCE_INTERPOLATION_INSIDE_CELL:
size = ptr_cell->min_distance_interpolation( point );
break;
case MIN_SIZE_INTERPOLATION_INSIDE_CELL:
size = ptr_cell->min_size_interpolation( point );
break;
default:
#ifndef NDEBUG
//PRINT_INFO(" WARNING: Interpolation method inside a cell is not set in SkeletonConstants.hpp\n");
#endif
size = ptr_cell->trilinear_interpolation( point );
break;
}
if( size_type == SCALED_SIZE )
{
size = get_scaled_from_wrld_size_grid_node( size );
}
// if( size_type == MESH_SIZE ){
// Do nothing send size for meshing
//}
}
// PRINT_INFO("Size at point <%f,%f,%f> = %f\n", point.x(), point.y(), point.z(), size);
return size;
}
| CubitBoolean CubitOctree::subdivide_octree_based_on_facet_point | ( | OctreeFacetPointData * | ptr_facet_point_data, |
| int | max_depth | ||
| ) |
Definition at line 263 of file CubitOctree.cpp.
{
CubitOctreeCell *ptr_leaf_cell;
ptr_leaf_cell = root->find_leaf_octree_cell( ptr_facet_point_data->coordinates() );
CubitBoolean result = subdivide_octree_from_leaf_cell( ptr_leaf_cell, ptr_facet_point_data, max_depth );
if( result == CUBIT_FALSE ){
// Simillar point exist; delete this facet_point_data
delete ptr_facet_point_data;
return CUBIT_FALSE;
}
return CUBIT_TRUE;
}
| CubitBoolean CubitOctree::subdivide_octree_cell | ( | CubitOctreeCell * | ptr_cell, |
| DLIList< CubitOctreeNode * > * | ptr_queue, | ||
| int | max_depth | ||
| ) |
Definition at line 747 of file CubitOctree.cpp.
{
CubitVector cell_center, shift;
int new_depth, i, j, k, l, m, n, p, q, r;
double norm_dim, total_dist, new_half_point;
CubitOctreeCell *ptr_child_cell;
CubitOctreeNode *local_node_matrix[3][3][3], *ptr_node, *ptr_new_oct_grid_node;
CubitBoolean new_node_matrix[3][3][3];
CubitOctreeCell *ptr_new_cell;
if( ptr_cell->get_depth() < max_depth && ptr_cell->is_leaf() )
{
ptr_cell->set_leaf( CUBIT_FALSE );
norm_dim = ptr_cell->get_dimension();
new_depth = ptr_cell->get_depth() + 1;
cell_center = ptr_cell->get_center();
// PRINT_INFO("Num = %d Depth = %d Coord = %2.12e %2.12e %2.12e\n", ptr_cell->get_num(), depth, cell_center.x(), cell_center.y(), cell_center.z() );
for( i = 0; i < 2; i++ ){
for( j = 0; j < 2; j++ ){
for( k = 0; k < 2; k++ ){
if( i == 0 )
shift.x( -norm_dim / 4.0 );
else
shift.x( norm_dim / 4.0 );
if( j == 0 )
shift.y( -norm_dim / 4.0 );
else
shift.y( norm_dim / 4.0 );
if( k == 0 )
shift.z( -norm_dim / 4.0 );
else
shift.z( norm_dim / 4.0 );
ptr_child_cell = new CubitOctreeCell( cell_center + shift, norm_dim / 2.0, new_depth, ptr_cell );
ptr_cell->set_child( i, j, k, ptr_child_cell );
}
}
}
// PRINT_INFO(" 8 children created \n");
// Update the wire frame model
for( i = 0; i < 3; i++ ){
for( j = 0; j < 3; j++ ){
for( k = 0; k < 3; k++ ){
new_node_matrix[i][j][k] = CUBIT_FALSE;
}
}
}
// find the eight corner nodes of the local matrix
for( i = 0; i < 2; i++ ){
for( j = 0; j < 2; j++ ){
for( k = 0; k < 2; k++ ){
if( i == 1 )
l = 2;
else
l = 0;
if( j == 1 )
m = 2;
else
m = 0;
if( k == 1 )
n = 2;
else
n = 0;
local_node_matrix[l][m][n] = ptr_cell->get_octree_grid_node( i, j, k );
}
}
}
// PRINT_INFO(" find 8 corner nodes of local 3 x 3 matrix \n");
new_half_point = 1.0 / pow(2.0, new_depth);
// To find 8
ptr_node = local_node_matrix[2][0][2];
total_dist = 0.0;
while( total_dist < new_half_point ){
total_dist += 1.0 / pow( 2.0, ptr_node->get_adj_node_distance( O_BOTTOM ) );
ptr_node = ptr_node->get_adj_node( O_BOTTOM );
}
if( total_dist == new_half_point ){
local_node_matrix[2][0][1] = ptr_node;
}
else{
ptr_new_oct_grid_node = new CubitOctreeNode( (local_node_matrix[2][0][2])->x(), (local_node_matrix[2][0][2])->y(), (local_node_matrix[2][0][2])->z() - norm_dim /2 );
apd_vector_item( ptr_new_oct_grid_node );
local_node_matrix[2][0][1] = ptr_new_oct_grid_node;
new_node_matrix[2][0][1] = CUBIT_TRUE;
}
// To find 9
ptr_node = local_node_matrix[2][2][2];
total_dist = 0.0;
while( total_dist < new_half_point ){
total_dist += 1.0 / pow( 2.0, ptr_node->get_adj_node_distance( O_BOTTOM ) );
ptr_node = ptr_node->get_adj_node( O_BOTTOM );
}
if( total_dist == new_half_point ){
local_node_matrix[2][2][1] = ptr_node;
}
else{
ptr_new_oct_grid_node = new CubitOctreeNode( (local_node_matrix[2][2][2])->x(), (local_node_matrix[2][2][2])->y(), (local_node_matrix[2][2][2])->z() - norm_dim /2 );
apd_vector_item( ptr_new_oct_grid_node );
local_node_matrix[2][2][1] = ptr_new_oct_grid_node;
new_node_matrix[2][2][1] = CUBIT_TRUE;
}
// To find 10
ptr_node = local_node_matrix[0][2][2];
total_dist = 0.0;
while( total_dist < new_half_point ){
total_dist += 1.0 / pow( 2.0, ptr_node->get_adj_node_distance( O_BOTTOM ) );
ptr_node = ptr_node->get_adj_node( O_BOTTOM );
}
if( total_dist == new_half_point ){
local_node_matrix[0][2][1] = ptr_node;
}
else{
ptr_new_oct_grid_node = new CubitOctreeNode( (local_node_matrix[0][2][2])->x(), (local_node_matrix[0][2][2])->y(), (local_node_matrix[0][2][2])->z() - norm_dim /2 );
apd_vector_item( ptr_new_oct_grid_node );
local_node_matrix[0][2][1] = ptr_new_oct_grid_node;
new_node_matrix[0][2][1] = CUBIT_TRUE;
}
// To find 11
ptr_node = local_node_matrix[0][0][2];
total_dist = 0.0;
while( total_dist < new_half_point ){
total_dist += 1.0 / pow( 2.0, ptr_node->get_adj_node_distance( O_BOTTOM ) );
ptr_node = ptr_node->get_adj_node( O_BOTTOM );
}
if( total_dist == new_half_point ){
local_node_matrix[0][0][1] = ptr_node;
}
else{
ptr_new_oct_grid_node = new CubitOctreeNode( (local_node_matrix[0][0][2])->x(), (local_node_matrix[0][0][2])->y(), (local_node_matrix[0][0][2])->z() - norm_dim /2 );
apd_vector_item( ptr_new_oct_grid_node );
local_node_matrix[0][0][1] = ptr_new_oct_grid_node;
new_node_matrix[0][0][1] = CUBIT_TRUE;
}
// To find 12
ptr_node = local_node_matrix[2][0][2];
total_dist = 0.0;
while( total_dist < new_half_point ){
total_dist += 1.0 / pow( 2.0, ptr_node->get_adj_node_distance( O_RIGHT ) );
ptr_node = ptr_node->get_adj_node( O_RIGHT );
}
if( total_dist == new_half_point ){
local_node_matrix[2][1][2] = ptr_node;
}
else{
ptr_new_oct_grid_node = new CubitOctreeNode( (local_node_matrix[2][0][2])->x(), (local_node_matrix[2][0][2])->y() + norm_dim / 2.0, (local_node_matrix[2][0][2])->z() );
apd_vector_item( ptr_new_oct_grid_node );
local_node_matrix[2][1][2] = ptr_new_oct_grid_node;
new_node_matrix[2][1][2] = CUBIT_TRUE;
}
// To find 13
ptr_node = local_node_matrix[2][0][0];
total_dist = 0.0;
while( total_dist < new_half_point ){
total_dist += 1.0 / pow( 2.0, ptr_node->get_adj_node_distance( O_RIGHT ) );
ptr_node = ptr_node->get_adj_node( O_RIGHT );
}
if( total_dist == new_half_point ){
local_node_matrix[2][1][0] = ptr_node;
}
else{
ptr_new_oct_grid_node = new CubitOctreeNode( (local_node_matrix[2][0][0])->x(), (local_node_matrix[2][0][0])->y() + norm_dim / 2.0, (local_node_matrix[2][0][0])->z() );
apd_vector_item( ptr_new_oct_grid_node );
local_node_matrix[2][1][0] = ptr_new_oct_grid_node;
new_node_matrix[2][1][0] = CUBIT_TRUE;
}
// To find 14
ptr_node = local_node_matrix[0][0][0];
total_dist = 0.0;
while( total_dist < new_half_point ){
total_dist += 1.0 / pow( 2.0, ptr_node->get_adj_node_distance( O_RIGHT ) );
ptr_node = ptr_node->get_adj_node( O_RIGHT );
}
if( total_dist == new_half_point ){
local_node_matrix[0][1][0] = ptr_node;
}
else{
ptr_new_oct_grid_node = new CubitOctreeNode( (local_node_matrix[0][0][0])->x(), (local_node_matrix[0][0][0])->y() + norm_dim / 2.0, (local_node_matrix[0][0][0])->z() );
apd_vector_item( ptr_new_oct_grid_node );
local_node_matrix[0][1][0] = ptr_new_oct_grid_node;
new_node_matrix[0][1][0] = CUBIT_TRUE;
}
// To find 15
ptr_node = local_node_matrix[0][0][2];
total_dist = 0.0;
while( total_dist < new_half_point ){
total_dist += 1.0 / pow( 2.0, ptr_node->get_adj_node_distance( O_RIGHT ) );
ptr_node = ptr_node->get_adj_node( O_RIGHT );
}
if( total_dist == new_half_point ){
local_node_matrix[0][1][2] = ptr_node;
}
else{
ptr_new_oct_grid_node = new CubitOctreeNode( (local_node_matrix[0][0][2])->x(), (local_node_matrix[0][0][2])->y() + norm_dim / 2.0, (local_node_matrix[0][0][2])->z() );
apd_vector_item( ptr_new_oct_grid_node );
local_node_matrix[0][1][2] = ptr_new_oct_grid_node;
new_node_matrix[0][1][2] = CUBIT_TRUE;
}
// To find 16
ptr_node = local_node_matrix[2][0][2];
total_dist = 0.0;
while( total_dist < new_half_point ){
total_dist += 1.0 / pow( 2.0, ptr_node->get_adj_node_distance( O_BACK ) );
ptr_node = ptr_node->get_adj_node( O_BACK );
}
if( total_dist == new_half_point ){
local_node_matrix[1][0][2] = ptr_node;
}
else{
ptr_new_oct_grid_node = new CubitOctreeNode( (local_node_matrix[2][0][2])->x() - norm_dim / 2.0, (local_node_matrix[2][0][2])->y(), (local_node_matrix[2][0][2])->z());
apd_vector_item( ptr_new_oct_grid_node );
local_node_matrix[1][0][2] = ptr_new_oct_grid_node;
new_node_matrix[1][0][2] = CUBIT_TRUE;
}
// To find 17
ptr_node = local_node_matrix[2][0][0];
total_dist = 0.0;
while( total_dist < new_half_point ){
total_dist += 1.0 / pow( 2.0, ptr_node->get_adj_node_distance( O_BACK ) );
ptr_node = ptr_node->get_adj_node( O_BACK );
}
if( total_dist == new_half_point ){
local_node_matrix[1][0][0] = ptr_node;
}
else{
ptr_new_oct_grid_node = new CubitOctreeNode( (local_node_matrix[2][0][0])->x() - norm_dim / 2.0, (local_node_matrix[2][0][0])->y(), (local_node_matrix[2][0][0])->z());
apd_vector_item( ptr_new_oct_grid_node );
local_node_matrix[1][0][0] = ptr_new_oct_grid_node;
new_node_matrix[1][0][0] = CUBIT_TRUE;
}
// To find 18
ptr_node = local_node_matrix[2][2][0];
total_dist = 0.0;
while( total_dist < new_half_point ){
total_dist += 1.0 / pow( 2.0, ptr_node->get_adj_node_distance( O_BACK ) );
ptr_node = ptr_node->get_adj_node( O_BACK );
}
if( total_dist == new_half_point ){
local_node_matrix[1][2][0] = ptr_node;
}
else{
ptr_new_oct_grid_node = new CubitOctreeNode( (local_node_matrix[2][2][0])->x() - norm_dim / 2.0, (local_node_matrix[2][2][0])->y(), (local_node_matrix[2][2][0])->z());
apd_vector_item( ptr_new_oct_grid_node );
local_node_matrix[1][2][0] = ptr_new_oct_grid_node;
new_node_matrix[1][2][0] = CUBIT_TRUE;
}
// To find 19
ptr_node = local_node_matrix[2][2][2];
total_dist = 0.0;
while( total_dist < new_half_point ){
total_dist += 1.0 / pow( 2.0, ptr_node->get_adj_node_distance( O_BACK ) );
ptr_node = ptr_node->get_adj_node( O_BACK );
}
if( total_dist == new_half_point ){
local_node_matrix[1][2][2] = ptr_node;
}
else{
ptr_new_oct_grid_node = new CubitOctreeNode( (local_node_matrix[2][2][2])->x() - norm_dim / 2.0, (local_node_matrix[2][2][2])->y(), (local_node_matrix[2][2][2])->z());
apd_vector_item( ptr_new_oct_grid_node );
local_node_matrix[1][2][2] = ptr_new_oct_grid_node;
new_node_matrix[1][2][2] = CUBIT_TRUE;
}
// PRINT_INFO(" found nodes on edges of local 3 x 3 matrix \n");
// To find 20
ptr_node = local_node_matrix[2][0][1];
if( new_node_matrix[2][0][1] == CUBIT_FALSE && ptr_node->get_adj_node( O_RIGHT ) != NULL ){
total_dist = 0.0;
while( total_dist < new_half_point ){
total_dist += 1.0 / pow( 2.0, ptr_node->get_adj_node_distance( O_RIGHT ) );
ptr_node = ptr_node->get_adj_node( O_RIGHT );
}
if( total_dist == new_half_point ){
local_node_matrix[2][1][1] = ptr_node;
// PRINT_INFO(" old node 20 found \n");
}
else{
PRINT_INFO("WARNING: Node not found \n");
}
}
else{
ptr_new_oct_grid_node = new CubitOctreeNode( (local_node_matrix[2][0][1])->x(), (local_node_matrix[2][0][1])->y() + norm_dim / 2.0, (local_node_matrix[2][0][1])->z());
apd_vector_item( ptr_new_oct_grid_node );
local_node_matrix[2][1][1] = ptr_new_oct_grid_node;
new_node_matrix[2][1][1] = CUBIT_TRUE;
// PRINT_INFO(" new node 20 created \n");
}
// To find 21
ptr_node = local_node_matrix[0][0][1];
if( new_node_matrix[0][0][1] == CUBIT_FALSE && ptr_node->get_adj_node( O_RIGHT ) != NULL ){
total_dist = 0.0;
while( total_dist < new_half_point ){
total_dist += 1.0 / pow( 2.0, ptr_node->get_adj_node_distance( O_RIGHT ) );
ptr_node = ptr_node->get_adj_node( O_RIGHT );
}
if( total_dist == new_half_point ){
local_node_matrix[0][1][1] = ptr_node;
// PRINT_INFO(" old node 21 found \n");
}
else{
PRINT_INFO("WARNING: Node not found \n");
}
}
else{
ptr_new_oct_grid_node = new CubitOctreeNode( (local_node_matrix[0][0][1])->x(), (local_node_matrix[0][0][1])->y() + norm_dim / 2.0, (local_node_matrix[0][0][1])->z());
apd_vector_item( ptr_new_oct_grid_node );
local_node_matrix[0][1][1] = ptr_new_oct_grid_node;
new_node_matrix[0][1][1] = CUBIT_TRUE;
// PRINT_INFO(" new node 21 created \n");
}
// To find 22
ptr_node = local_node_matrix[2][0][1];
if( new_node_matrix[2][0][1] == CUBIT_FALSE && ptr_node->get_adj_node( O_BACK ) != NULL ){
total_dist = 0.0;
while( total_dist < new_half_point ){
total_dist += 1.0 / pow( 2.0, ptr_node->get_adj_node_distance( O_BACK ) );
ptr_node = ptr_node->get_adj_node( O_BACK );
}
if( total_dist == new_half_point ){
local_node_matrix[1][0][1] = ptr_node;
// PRINT_INFO(" old node 22 found \n");
}
else{
PRINT_INFO("WARNING: Node not found \n");
}
}
else{
ptr_new_oct_grid_node = new CubitOctreeNode( (local_node_matrix[2][0][1])->x() - norm_dim / 2.0, (local_node_matrix[2][0][1])->y(), (local_node_matrix[2][0][1])->z());
apd_vector_item( ptr_new_oct_grid_node );
local_node_matrix[1][0][1] = ptr_new_oct_grid_node;
new_node_matrix[1][0][1] = CUBIT_TRUE;
// PRINT_INFO(" new node 22 created \n");
}
// To find 23
ptr_node = local_node_matrix[2][2][1];
if( new_node_matrix[2][2][1] == CUBIT_FALSE && ptr_node->get_adj_node( O_BACK ) != NULL ){
total_dist = 0.0;
while( total_dist < new_half_point ){
total_dist += 1.0 / pow( 2.0, ptr_node->get_adj_node_distance( O_BACK ) );
ptr_node = ptr_node->get_adj_node( O_BACK );
}
if( total_dist == new_half_point ){
local_node_matrix[1][2][1] = ptr_node;
// PRINT_INFO(" old node 23 found \n");
}
else{
PRINT_INFO("WARNING: Node not found \n");
}
}
else{
ptr_new_oct_grid_node = new CubitOctreeNode( (local_node_matrix[2][2][1])->x() - norm_dim / 2.0, (local_node_matrix[2][2][1])->y(), (local_node_matrix[2][2][1])->z());
apd_vector_item( ptr_new_oct_grid_node );
local_node_matrix[1][2][1] = ptr_new_oct_grid_node;
new_node_matrix[1][2][1] = CUBIT_TRUE;
// PRINT_INFO(" new node 23 created \n");
}
// To find 24
ptr_node = local_node_matrix[1][0][0];
if( new_node_matrix[1][0][0] == CUBIT_FALSE && ptr_node->get_adj_node( O_RIGHT ) != NULL ){
total_dist = 0.0;
while( total_dist < new_half_point ){
total_dist += 1.0 / pow( 2.0, ptr_node->get_adj_node_distance( O_RIGHT ) );
ptr_node = ptr_node->get_adj_node( O_RIGHT );
}
if( total_dist == new_half_point ){
local_node_matrix[1][1][0] = ptr_node;
// PRINT_INFO(" old node 24 found \n");
}
else{
PRINT_INFO("WARNING: Node not found \n");
}
}
else{
ptr_new_oct_grid_node = new CubitOctreeNode( (local_node_matrix[1][0][0])->x(), (local_node_matrix[1][0][0])->y() + norm_dim / 2.0, (local_node_matrix[1][0][0])->z());
apd_vector_item( ptr_new_oct_grid_node );
local_node_matrix[1][1][0] = ptr_new_oct_grid_node;
new_node_matrix[1][1][0] = CUBIT_TRUE;
// PRINT_INFO(" new node 24 created \n");
}
// To find 25
ptr_node = local_node_matrix[1][0][2];
if( new_node_matrix[1][0][2] == CUBIT_FALSE && ptr_node->get_adj_node( O_RIGHT ) != NULL ){
total_dist = 0.0;
while( total_dist < new_half_point ){
total_dist += 1.0 / pow( 2.0, ptr_node->get_adj_node_distance( O_RIGHT ) );
ptr_node = ptr_node->get_adj_node( O_RIGHT );
}
if( total_dist == new_half_point ){
local_node_matrix[1][1][2] = ptr_node;
// PRINT_INFO(" old node 25 found \n");
}
else{
PRINT_INFO("WARNING: Node not found \n");
}
}
else{
ptr_new_oct_grid_node = new CubitOctreeNode( (local_node_matrix[1][0][2])->x(), (local_node_matrix[1][0][2])->y() + norm_dim / 2.0, (local_node_matrix[1][0][2])->z());
apd_vector_item( ptr_new_oct_grid_node );
local_node_matrix[1][1][2] = ptr_new_oct_grid_node;
new_node_matrix[1][1][2] = CUBIT_TRUE;
// PRINT_INFO(" new node 25 created \n");
}
// PRINT_INFO(" found nodes on faces of local 3 x 3 matrix \n");
// To find 26
ptr_new_oct_grid_node = new CubitOctreeNode( (local_node_matrix[1][1][2])->x(), (local_node_matrix[1][1][2])->y(), (local_node_matrix[1][1][2])->z() - norm_dim / 2.0);
apd_vector_item( ptr_new_oct_grid_node );
local_node_matrix[1][1][1] = ptr_new_oct_grid_node;
new_node_matrix[1][1][1] = CUBIT_TRUE;
// PRINT_INFO(" found nodes at center of local 3 x 3 matrix \n");
// update the eight nodes of new eight cells
for( i = 0; i < 2; i++ ){
for( j = 0; j < 2; j++ ){
for( k = 0; k < 2; k++ ){
ptr_new_cell = ptr_cell->get_child( i, j, k );
for( l = 0; l < 2; l++ ){
for( m = 0; m < 2; m++ ){
for( n = 0; n < 2; n++ ){
ptr_new_cell->set_oct_grid_node( l, m, n, local_node_matrix[i+l][j+m][k+n] );
p = ( l == 1 )?0:1; // fliped 0 -> 1; 1 -> 0
q = ( m == 1 )?0:1;
r = ( n == 1 )?0:1;
// update the eight cells of all 27 nodes
local_node_matrix[i+l][j+m][k+n]->update_adj_cell( ptr_new_cell, p, q, r );
}
}
}
}
}
}
// PRINT_INFO(" updates nodes of the 8 children and visa versa \n");
// connnect the new nodes with the old nodes to update the wire frame
for( i = 0; i < 3; i++ ){
for( j = 0; j < 3; j++ ){
for( k = 0; k < 3; k++ ){
if( new_node_matrix[i][j][k] == CUBIT_TRUE ){
if( i - 1 >= 0 ){
local_node_matrix[i][j][k]->set_adj_node( O_BACK, local_node_matrix[i-1][j][k] );
local_node_matrix[i][j][k]->set_adj_node_distance( O_BACK, new_depth );
local_node_matrix[i-1][j][k]->set_adj_node( O_FRONT, local_node_matrix[i][j][k] );
local_node_matrix[i-1][j][k]->set_adj_node_distance( O_FRONT, new_depth );
}
if( i + 1 <= 2 ){
local_node_matrix[i][j][k]->set_adj_node( O_FRONT, local_node_matrix[i+1][j][k] );
local_node_matrix[i][j][k]->set_adj_node_distance( O_FRONT, new_depth );
local_node_matrix[i+1][j][k]->set_adj_node( O_BACK, local_node_matrix[i][j][k] );
local_node_matrix[i+1][j][k]->set_adj_node_distance( O_BACK, new_depth );
}
if( j - 1 >= 0 ){
local_node_matrix[i][j][k]->set_adj_node( O_LEFT, local_node_matrix[i][j-1][k] );
local_node_matrix[i][j][k]->set_adj_node_distance( O_LEFT, new_depth );
local_node_matrix[i][j-1][k]->set_adj_node( O_RIGHT, local_node_matrix[i][j][k] );
local_node_matrix[i][j-1][k]->set_adj_node_distance( O_RIGHT, new_depth );
}
if( j + 1 <= 2 ){
local_node_matrix[i][j][k]->set_adj_node( O_RIGHT, local_node_matrix[i][j+1][k] );
local_node_matrix[i][j][k]->set_adj_node_distance( O_RIGHT, new_depth );
local_node_matrix[i][j+1][k]->set_adj_node( O_LEFT, local_node_matrix[i][j][k] );
local_node_matrix[i][j+1][k]->set_adj_node_distance( O_LEFT, new_depth );
}
if( k - 1 >= 0 ){
local_node_matrix[i][j][k]->set_adj_node( O_BOTTOM, local_node_matrix[i][j][k-1] );
local_node_matrix[i][j][k]->set_adj_node_distance( O_BOTTOM, new_depth );
local_node_matrix[i][j][k-1]->set_adj_node( O_TOP, local_node_matrix[i][j][k] );
local_node_matrix[i][j][k-1]->set_adj_node_distance( O_TOP, new_depth );
}
if( k + 1 <= 2 ){
local_node_matrix[i][j][k]->set_adj_node( O_TOP, local_node_matrix[i][j][k+1] );
local_node_matrix[i][j][k]->set_adj_node_distance( O_TOP, new_depth );
local_node_matrix[i][j][k+1]->set_adj_node( O_BOTTOM, local_node_matrix[i][j][k] );
local_node_matrix[i][j][k+1]->set_adj_node_distance( O_BOTTOM, new_depth );
}
}
}
}
}
// distribute the facet_points and Ref_face among the children
ptr_cell->distribute_facet_points_among_children();
int depth_difference;
// update the depthMaxDepthCell, depthMinDepthCell, cellDepthDifference, and minDepthCell
if( ptr_queue != NULL ){
for( i = 0; i < 3; i++ ){
for( j = 0; j < 3; j++ ){
for( k = 0; k < 3; k++ ){
depth_difference = local_node_matrix[i][j][k]->find_min_depth_cell_and_depth_difference( );
/* RISKY TO OPTIMIZE ANY THING HERE
NEEDS CAREFULL STUDY
if( new_node_matrix[i][j][k] == CUBIT_TRUE ){
// initialize the variables depthMaxDepthCell, depthMinDepthCell, cellDepthDifference, and minDepthCell
local_node_matrix[i][j][k]->find_min_depth_cell_and_depth_difference( );
}
else{
// update the variables depthMaxDepthCell, depthMinDepthCell, cellDepthDifference, and minDepthCell
max_depth = local_node_matrix[i][j][k]->get_depth_max_depth_cell();
min_depth = local_node_matrix[i][j][k]->get_depth_min_depth_cell();
if( new_depth < min_depth || new_depth > max_depth )
}
*/
if( local_node_matrix[i][j][k]->get_mark() == CUBIT_FALSE && depth_difference >= 2 ){
ptr_queue->push( local_node_matrix[i][j][k] );
local_node_matrix[i][j][k]->set_mark( CUBIT_TRUE );
}
}
}
}
}
// ptr_cell->delete_local_node_matrix();
return CUBIT_TRUE;
}
else{
return CUBIT_FALSE;
}
}
| CubitBoolean CubitOctree::subdivide_octree_from_leaf_cell | ( | CubitOctreeCell * | ptr_cell, |
| OctreeFacetPointData * | ptr_facet_point_data, | ||
| int | max_depth | ||
| ) | [private] |
Definition at line 518 of file CubitOctree.cpp.
{
CubitVector cell_center = ptr_cell->get_center();
int i, j, k;
CubitVector coord;
// Check if any other coord already present in the cell is close to new facet_point_data
// At the common curves the facet points of adjacent surfaces can come very close to one another
// Therefore id will not work
if( ptr_cell->num_of_facet_point_data() != 0 ){
if( ptr_cell->is_facet_point_data_present( facet_point_data ) ){
return CUBIT_FALSE;
}
}
// If CubitOctree cell contains on fact points just insert the point don't subdivide (Ref. PR-CubitOctree property)
//
if( ptr_cell->num_of_facet_point_data() == 0 || ptr_cell->get_depth() >= max_depth ){
ptr_cell->append_list_item( facet_point_data );
return CUBIT_TRUE;
}
coord = facet_point_data->coordinates();
bool outside_tolerance = CUBIT_TRUE;
DLIList<OctreeFacetPointData*> *fpdata = ptr_cell->get_facet_point_data_list();
for (i=0; i < fpdata->size(); ++i)
{
if ((fpdata->get_and_step()->coordinates()-coord).length_squared() <= OCTREE_EPSILON * OCTREE_EPSILON)
{
outside_tolerance = CUBIT_FALSE;
}
}
if (!outside_tolerance)
{
ptr_cell->append_list_item(facet_point_data);
return CUBIT_TRUE;
}
else{
subdivide_octree_cell( ptr_cell, NULL, max_depth );
// find the leaf cell containing the point
// call the subdivision recursively from leaf cell containing the point.
i = j = k = 1;
if( coord.x() < cell_center.x() )
i = 0;
if( coord.y() < cell_center.y() )
j = 0;
if( coord.z() < cell_center.z() )
k = 0;
subdivide_octree_from_leaf_cell( ptr_cell->get_child(i, j, k), facet_point_data, max_depth );
}
return CUBIT_TRUE;
}
| CubitBoolean CubitOctree::unmark_octree_cells_not_intersecting_with_facet | ( | CubitFacet * | ptr_facet, |
| DLIList< CubitOctreeCell * > & | CubitOctree_cell_list | ||
| ) | [private] |
Definition at line 485 of file CubitOctree.cpp.
{
int i;
CubitOctreeCell *ptr_cell;
for( i = 0; i < CubitOctree_cell_list.size(); i++ ){
ptr_cell = CubitOctree_cell_list.get_and_step();
if( ptr_cell->get_mark() == CUBIT_TRUE ){
if( ptr_cell->does_facet_intersect_octreecell( ptr_facet ) == CUBIT_FALSE ){
ptr_cell->set_mark( CUBIT_FALSE );
}
}
}
return CUBIT_TRUE;
}
| void CubitOctree::write_matlab_sizing_info_file | ( | const char * | file_name | ) | [private] |
Definition at line 1879 of file CubitOctree.cpp.
{
int i,j,k;
double size;
CubitOctreeNode *grid_node;
for (i=0; i < gridNodeVector.size(); ++i)
{
grid_node = gridNodeVector.get_and_step();
if (grid_node->get_color() == CUBIT_GREY_INDEX)
{
grid_node->set_size(0.0, OCTREE_SIZE_DEFAULT);
}
}
FILE *pof = fopen( file_name, "w" );
if( pof == NULL ){
PRINT_INFO("ERROR: Opening Sizing Output File ");
exit(0);
}
int num_of_cells = 50;//(int)pow(2.0, MATLAB_OUTPUT_MAX_DEPTH );
//fprintf( pof, "%f %f %f %f %f %f\n", bboxMinX, bboxMinY, bboxMinZ, bboxMaxX, bboxMaxY, bboxMaxZ );
int l = num_of_cells + 1;
int m = num_of_cells + 1;
int n = num_of_cells + 1;
CubitVector point;
double grid_size = fabs( bboxMinY - bboxMaxY ) / num_of_cells;
for( k = 0; k < n; k++ ){
for( j = 0; j < m; j++ ){
for ( i = 0; i < l; i++ ){
point.x( bboxMinX + grid_size * i );
point.y( bboxMinY + grid_size * j );
point.z( bboxMinZ + grid_size * k );
size = size_at_a_point( point, OCTREE_SIZE_DEFAULT);
fprintf( pof, "%f %f %f %f\n",
point.x(), point.y(), point.z(), size );
}
}
}
fclose( pof );
}
| void CubitOctree::write_octree_sizing_info_file | ( | const char * | file_name | ) | [private] |
Definition at line 1931 of file CubitOctree.cpp.
{
int i;
double size;
CubitOctreeNode *ptr_onode;
double FACTOR_FOR_BUBBLEMESH = 1 / 1.8; // Based on 20% overlap of bubbles
FILE *pof = fopen( file_name, "w" );
if( pof == NULL ){
PRINT_INFO("ERROR: Opening Sizing Output File ");
exit(0);
}
DLIList<CubitOctreeCell*> stack;
CubitOctreeCell *ptr_cell;
fprintf( pof, "OCT 1\n" );
// int num_of_cells = (int)pow(2.0, skeletonProxy->get_max_depth()-1 );
fprintf( pof, "B %f %f %f %f %f %f\n",
bboxMinX, bboxMinY, bboxMinZ, bboxMaxX, bboxMaxY, bboxMaxZ );
gridNodeVector.reset();
for( i = 0; i < gridNodeVector.size(); i++ ){
ptr_onode = gridNodeVector.get_and_step();
size = ptr_onode->get_size(OCTREE_SIZE_DEFAULT);
fprintf( pof, "V %d %f %f %f %f \n",
ptr_onode->get_num(), ptr_onode->x(), ptr_onode->y(),
ptr_onode->z(), size * FACTOR_FOR_BUBBLEMESH );
}
stack.append( root );
while( stack.size() > 0 ){
ptr_cell = stack.remove();
ptr_cell->write_octreecell_sizing_info_file( pof, stack );
}
fprintf( pof, "X\n");
fclose( pof );
}
| void CubitOctree::write_sizing_info_file | ( | const char * | file_name | ) | [private] |
Definition at line 1833 of file CubitOctree.cpp.
{
int i,j,k;
double size;
FILE *pof = fopen( file_name, "w" );
if( pof == NULL ){
PRINT_INFO("ERROR: Opening Sizing Output File ");
exit(0);
}
fprintf( pof, "TFD1\n" );
int num_of_cells = (int)pow(2.0, maxDepth-1 );
fprintf( pof, "%d %d %d\n", num_of_cells, num_of_cells, num_of_cells );
//fprintf( pof, "%f %f %f %f %f %f\n", bboxMaxY, bboxMinZ, bboxMinX, bboxMinY, bboxMaxZ, bboxMaxX );
fprintf( pof, "%f %f %f %f %f %f\n", bboxMinX, bboxMinY, bboxMinZ, bboxMaxX, bboxMaxY, bboxMaxZ );
int l = num_of_cells + 1;
int m = num_of_cells + 1;
int n = num_of_cells + 1;
CubitVector point;
double grid_size = fabs( bboxMinY - bboxMaxY ) / num_of_cells;
for( k = 0; k < n; k++ )
{
for( j = 0; j < m; j++ )
{
for ( i = 0; i < l; i++ )
{
point.x( bboxMinX + grid_size * i );
point.y( bboxMinY + grid_size * j );
point.z( bboxMinZ + grid_size * k );
size = size_at_a_point( point, OCTREE_SIZE_DEFAULT);
fprintf( pof, "%f %f %f %f %f %f %f %f %f %f %f %f\n",
1.0, 0.0, 0.0, size,
0.0, 1.0, 0.0, size,
0.0, 0.0, 1.0, size );
}
}
}
fclose( pof );
}
CubitVector CubitOctree::bboxCenter [private] |
Definition at line 238 of file CubitOctree.hpp.
double CubitOctree::bboxDimension [private] |
Definition at line 241 of file CubitOctree.hpp.
double CubitOctree::bboxMaxX [private] |
Definition at line 231 of file CubitOctree.hpp.
double CubitOctree::bboxMaxY [private] |
Definition at line 228 of file CubitOctree.hpp.
double CubitOctree::bboxMaxZ [private] |
Definition at line 229 of file CubitOctree.hpp.
double CubitOctree::bboxMinX [private] |
Definition at line 232 of file CubitOctree.hpp.
double CubitOctree::bboxMinY [private] |
Definition at line 227 of file CubitOctree.hpp.
double CubitOctree::bboxMinZ [private] |
Definition at line 230 of file CubitOctree.hpp.
DLIList<CubitOctreeCell*> CubitOctree::blackCellList [private] |
Definition at line 250 of file CubitOctree.hpp.
DLIList<CubitOctreeNode *> CubitOctree::boundaryWhiteGridNodeList [private] |
Definition at line 253 of file CubitOctree.hpp.
Definition at line 262 of file CubitOctree.hpp.
double CubitOctree::epsilonBBox [private] |
Definition at line 244 of file CubitOctree.hpp.
DLIList<CubitOctreeCell *> CubitOctree::greyCellList [private] |
Definition at line 247 of file CubitOctree.hpp.
DLIList<CubitOctreeNode*> CubitOctree::greyGridNodeVector [private] |
Definition at line 259 of file CubitOctree.hpp.
DLIList<CubitOctreeNode *> CubitOctree::gridNodeVector [private] |
Definition at line 256 of file CubitOctree.hpp.
int CubitOctree::maxDepth [private] |
Definition at line 269 of file CubitOctree.hpp.
double CubitOctree::maxSizeGridNode [private] |
Definition at line 265 of file CubitOctree.hpp.
int CubitOctree::minDepth [private] |
Definition at line 268 of file CubitOctree.hpp.
double CubitOctree::minSizeGridNode [private] |
Definition at line 266 of file CubitOctree.hpp.
CubitOctreeCell* CubitOctree::root [private] |
Definition at line 235 of file CubitOctree.hpp.
Definition at line 221 of file CubitOctree.hpp.