|
MOAB: Mesh Oriented datABase
(version 5.4.1)
|
#include "moab/Interface.hpp"#include "TestUtil.hpp"#include "moab/Core.hpp"#include "moab/Types.hpp"#include "MBTagConventions.hpp"#include "moab/GeomTopoTool.hpp"#include <iostream>#include <map>#include <set>
Include dependency graph for restore_topo_geom_incl_test.cpp:Go to the source code of this file.
Functions | |
| bool | check_tree (Interface *mbi, GeomTopoTool *GTT, std::map< int, std::set< int > > &ref_map) |
| ErrorCode | get_all_handles (Interface *mbi) |
| Range | get_children_by_dimension (Interface *mbi, EntityHandle parent, int desired_dimension) |
| void | heappermute (Interface *mbi, int v[], int n, std::map< int, std::set< int > > ref_map, int len) |
| void | swap (int *x, int *y) |
| void | get_cube_info (int cube_id, std::vector< double > &scale, std::vector< double > &trans) |
| void | test_two_cubes () |
| void | test_three_cubes () |
| void | test_four_cubes () |
| ErrorCode | build_cube (Interface *mbi, std::vector< double > scale_vec, std::vector< double > trans_vec, int object_id, EntityHandle &volume) |
| int | main () |
Variables | |
| Tag | category_tag |
| Tag | geom_tag |
| Tag | name_tag |
| Tag | obj_name_tag |
| Tag | dim_tag |
| Tag | id_tag |
| ErrorCode build_cube | ( | Interface * | mbi, |
| std::vector< double > | scale_vec, | ||
| std::vector< double > | trans_vec, | ||
| int | object_id, | ||
| EntityHandle & | volume | ||
| ) |
Definition at line 29 of file restore_topo_geom_incl_test.cpp.
References moab::Interface::add_entities(), moab::Interface::add_parent_child(), category_tag, moab::Interface::create_element(), moab::Interface::create_meshset(), moab::Interface::create_vertex(), ErrorCode, geom_tag, GTT, id_tag, MB_CHK_ERR, MB_SUCCESS, MBTRI, MESHSET_SET, name_tag, obj_name_tag, SENSE_FORWARD, moab::GeomTopoTool::set_sense(), and moab::Interface::tag_set_data().
Referenced by heappermute().
{
GeomTopoTool* GTT = new GeomTopoTool( mbi );
ErrorCode rval;
// Define a 1x1x1 cube centered at orgin
// coordinates of each corner
const double coords[] = { 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5,
0.5, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5 };
// connectivity of 2 triangles per
// each face of the cube
const int connectivity[] = {
0, 3, 1, 3, 2, 1, // -Z
0, 1, 4, 5, 4, 1, // +X
1, 2, 6, 6, 5, 1, // +Y
6, 2, 3, 7, 6, 3, // -X
0, 4, 3, 7, 3, 4, // -Y
4, 5, 7, 5, 6, 7 // +Z
};
// Create the geometry
const int num_verts = 8;
const int num_tris = 12;
EntityHandle verts[num_verts], tris[num_tris], surf;
rval = mbi->create_meshset( MESHSET_SET, surf );MB_CHK_ERR( rval );
/*
// scale coords
int i;
double scaled_coords[24];
for ( i = 0; i < num_verts; i++ )
{
scaled_coords[3*i] = coords[3*i]*scale_vec[0];
scaled_coords[3*i+1] = coords[3*i+1]*scale_vec[1];
scaled_coords[3*i+2] = coords[3*i+2]*scale_vec[2];
}
// translate coords
double trans_coords[24];
for ( i = 0; i < num_verts; i++ )
{
trans_coords[3*i] = scaled_coords[3*i] + trans_vec[0];
trans_coords[3*i+1] = scaled_coords[3*i+1] + trans_vec[1];
trans_coords[3*i+2] = scaled_coords[3*i+2] + trans_vec[2];
}
*/
// transform coords-- scale and translate
double trans_coords[24];
for( int i = 0; i < num_verts; i++ )
{
trans_coords[3 * i] = coords[3 * i] * scale_vec[0] + trans_vec[0];
trans_coords[3 * i + 1] = coords[3 * i + 1] * scale_vec[1] + trans_vec[1];
trans_coords[3 * i + 2] = coords[3 * i + 2] * scale_vec[2] + trans_vec[2];
}
// create vertices and add to meshset
for( int i = 0; i < num_verts; ++i )
{
rval = mbi->create_vertex( trans_coords + 3 * i, verts[i] );MB_CHK_ERR( rval );
rval = mbi->add_entities( surf, &verts[i], 1 );MB_CHK_ERR( rval );
}
// create triangles and add to meshset
for( int i = 0; i < num_tris; ++i )
{
const EntityHandle conn[] = { verts[connectivity[3 * i]], verts[connectivity[3 * i + 1]],
verts[connectivity[3 * i + 2]] };
rval = mbi->create_element( MBTRI, conn, 3, tris[i] );MB_CHK_ERR( rval );
rval = mbi->add_entities( surf, &tris[i], 1 );MB_CHK_ERR( rval );
}
// set name, id, geom, and category tags for SURFACE
rval = mbi->tag_set_data( name_tag, &surf, 1, "Surface\0" );MB_CHK_ERR( rval );
std::string object_name;
rval = mbi->tag_set_data( obj_name_tag, &surf, 1, object_name.c_str() );MB_CHK_ERR( rval );
rval = mbi->tag_set_data( id_tag, &surf, 1, &object_id );MB_CHK_ERR( rval );
int two = 2;
rval = mbi->tag_set_data( geom_tag, &surf, 1, &( two ) );MB_CHK_ERR( rval );
rval = mbi->tag_set_data( category_tag, &surf, 1, "Surface\0" );MB_CHK_ERR( rval );
// create volume meshset associated with surface meshset
// EntityHandle volume;
rval = mbi->create_meshset( MESHSET_SET, volume );MB_CHK_ERR( rval );
// set name, id, geom, and category tags for VOLUME
rval = mbi->tag_set_data( name_tag, &volume, 1, "Volume\0" );MB_CHK_ERR( rval );
rval = mbi->tag_set_data( obj_name_tag, &surf, 1, object_name.c_str() );MB_CHK_ERR( rval );
rval = mbi->tag_set_data( id_tag, &volume, 1, &( object_id ) );MB_CHK_ERR( rval );
int three = 3;
rval = mbi->tag_set_data( geom_tag, &volume, 1, &( three ) );MB_CHK_ERR( rval );
rval = mbi->tag_set_data( category_tag, &volume, 1, "Volume\0" );MB_CHK_ERR( rval );
// set surface as child of volume
rval = mbi->add_parent_child( volume, surf );MB_CHK_ERR( rval );
// set sense tag
rval = GTT->set_sense( surf, volume, SENSE_FORWARD );MB_CHK_ERR( rval );
delete GTT;
return MB_SUCCESS;
}
| bool check_tree | ( | Interface * | mbi, |
| GeomTopoTool * | GTT, | ||
| std::map< int, std::set< int > > & | ref_map | ||
| ) |
Definition at line 176 of file restore_topo_geom_incl_test.cpp.
References moab::Range::begin(), moab::Range::clear(), moab::Range::end(), ErrorCode, get_children_by_dimension(), moab::GeomTopoTool::get_gsets_by_dimension(), id_tag, MB_CHK_ERR, moab::Range::size(), and moab::Interface::tag_get_data().
Referenced by heappermute().
{
ErrorCode rval;
int vol_id;
std::set< int > test_set;
Range vols;
rval = GTT->get_gsets_by_dimension( 3, vols );
if( ref_map.size() != vols.size() )
{
return false;
}
// go through volumes, create sets of children
for( Range::iterator it = vols.begin(); it != vols.end(); ++it )
{
// get vol id
rval = mbi->tag_get_data( id_tag, &( *it ), 1, &vol_id );MB_CHK_ERR( rval );
// check if test vol in ref map
if( ref_map.find( vol_id ) == ref_map.end() )
{
return false;
}
// put range of child surfaces into set
Range child_surfs;
test_set.clear();
child_surfs = get_children_by_dimension( mbi, *it, 2 );
for( Range::iterator j = child_surfs.begin(); j != child_surfs.end(); ++j )
{
int child_id;
rval = mbi->tag_get_data( id_tag, &( *j ), 1, &child_id );MB_CHK_ERR( rval );
test_set.insert( child_id );
}
// compare sets
if( test_set != ref_map[vol_id] )
{
return false;
}
}
return true;
}
| ErrorCode get_all_handles | ( | Interface * | mbi | ) |
Definition at line 152 of file restore_topo_geom_incl_test.cpp.
References category_tag, CATEGORY_TAG_NAME, CATEGORY_TAG_SIZE, ErrorCode, GEOM_DIMENSION_TAG_NAME, geom_tag, moab::Interface::globalId_tag(), id_tag, MB_CHK_ERR, MB_SUCCESS, MB_TAG_CREAT, MB_TAG_SPARSE, MB_TYPE_INTEGER, MB_TYPE_OPAQUE, name_tag, NAME_TAG_NAME, NAME_TAG_SIZE, obj_name_tag, and moab::Interface::tag_get_handle().
Referenced by test_four_cubes(), test_three_cubes(), and test_two_cubes().
{
ErrorCode rval;
rval = mbi->tag_get_handle( NAME_TAG_NAME, NAME_TAG_SIZE, MB_TYPE_OPAQUE, name_tag, MB_TAG_SPARSE | MB_TAG_CREAT );MB_CHK_ERR( rval );
rval = mbi->tag_get_handle( "OBJECT_NAME", 32, MB_TYPE_OPAQUE, obj_name_tag, MB_TAG_SPARSE | MB_TAG_CREAT );MB_CHK_ERR( rval );
int negone = -1;
rval = mbi->tag_get_handle( GEOM_DIMENSION_TAG_NAME, 1, MB_TYPE_INTEGER, geom_tag, MB_TAG_SPARSE | MB_TAG_CREAT,
&negone );MB_CHK_ERR( rval );
id_tag = mbi->globalId_tag();
rval = mbi->tag_get_handle( CATEGORY_TAG_NAME, CATEGORY_TAG_SIZE, MB_TYPE_OPAQUE, category_tag,
MB_TAG_SPARSE | MB_TAG_CREAT );
MB_CHK_ERR( rval );
return MB_SUCCESS;
}
| Range get_children_by_dimension | ( | Interface * | mbi, |
| EntityHandle | parent, | ||
| int | desired_dimension | ||
| ) |
Definition at line 224 of file restore_topo_geom_incl_test.cpp.
References moab::Range::begin(), moab::Range::clear(), moab::Range::end(), ErrorCode, geom_tag, moab::Interface::get_child_meshsets(), moab::Range::insert(), MB_CHK_SET_ERR_RET_VAL, and moab::Interface::tag_get_data().
Referenced by check_tree().
{
ErrorCode rval;
Range all_children, desired_children;
Range::iterator it;
int actual_dimension;
all_children.clear();
rval = mbi->get_child_meshsets( parent, all_children );MB_CHK_SET_ERR_RET_VAL( rval, "Failed to get child meshsets", all_children );
for( it = all_children.begin(); it != all_children.end(); ++it )
{
rval = mbi->tag_get_data( geom_tag, &( *it ), 1, &actual_dimension );MB_CHK_SET_ERR_RET_VAL( rval, "Failed to get geom tag from child meshset", all_children );
if( actual_dimension == desired_dimension )
{
desired_children.insert( *it );
}
}
return desired_children;
}
| void get_cube_info | ( | int | cube_id, |
| std::vector< double > & | scale, | ||
| std::vector< double > & | trans | ||
| ) |
Definition at line 249 of file restore_topo_geom_incl_test.cpp.
Referenced by heappermute().
{
scale.clear();
trans.clear();
if( cube_id == 1 )
{
scale.push_back( 1 );
scale.push_back( 1 );
scale.push_back( 1 );
trans.push_back( 0 );
trans.push_back( 0 );
trans.push_back( 0 );
}
if( cube_id == 2 )
{
scale.push_back( 4 );
scale.push_back( 4 );
scale.push_back( 4 );
trans.push_back( 0 );
trans.push_back( 0 );
trans.push_back( 0 );
}
if( cube_id == 3 )
{
scale.push_back( 8 );
scale.push_back( 8 );
scale.push_back( 8 );
trans.push_back( 0 );
trans.push_back( 0 );
trans.push_back( 0 );
}
if( cube_id == 4 )
{
scale.push_back( 40 );
scale.push_back( 40 );
scale.push_back( 40 );
trans.push_back( 0 );
trans.push_back( 0 );
trans.push_back( 0 );
}
}
| void heappermute | ( | Interface * | mbi, |
| int | v[], | ||
| int | n, | ||
| std::map< int, std::set< int > > | ref_map, | ||
| int | len | ||
| ) |
Definition at line 381 of file restore_topo_geom_incl_test.cpp.
References build_cube(), CHECK_EQUAL, check_tree(), moab::Range::clear(), moab::GeomTopoTool::construct_obb_trees(), moab::Interface::delete_mesh(), ErrorCode, get_cube_info(), GTT, moab::Range::insert(), MB_CHK_ERR_RET, moab::GeomTopoTool::restore_topology_from_geometric_inclusion(), and swap().
Referenced by test_four_cubes(), test_three_cubes(), and test_two_cubes().
{
ErrorCode rval;
std::vector< double > scale, trans;
EntityHandle vol;
Range flat_vols;
if( n == 1 )
{
// build cubes
flat_vols.clear();
for( int i = 0; i < len; i++ )
{
get_cube_info( v[i], scale, trans );
build_cube( mbi, scale, trans, v[i], vol );
flat_vols.insert( vol );
}
// construct the topology
GeomTopoTool* GTT = new GeomTopoTool( mbi );
// first build obbs-- necessary for topology construction
rval = GTT->construct_obb_trees();MB_CHK_ERR_RET( rval );
rval = GTT->restore_topology_from_geometric_inclusion( flat_vols );MB_CHK_ERR_RET( rval );
// test the topology
bool result = check_tree( mbi, GTT, ref_map );
CHECK_EQUAL( 1, result );
delete GTT;
// delete the geometry so new one can be built;
rval = mbi->delete_mesh();MB_CHK_ERR_RET( rval );
}
else
{
for( int i = 0; i < n; i++ )
{
heappermute( mbi, v, n - 1, ref_map, len );
if( n % 2 == 1 )
{
swap( &v[0], &v[n - 1] );
}
else
{
swap( &v[i], &v[n - 1] );
}
}
}
}
| int main | ( | ) |
Definition at line 141 of file restore_topo_geom_incl_test.cpp.
References RUN_TEST, test_four_cubes(), test_three_cubes(), and test_two_cubes().
{
int result = 0;
result += RUN_TEST( test_two_cubes );
result += RUN_TEST( test_three_cubes );
result += RUN_TEST( test_four_cubes );
return result;
}
| void swap | ( | int * | x, |
| int * | y | ||
| ) |
Definition at line 433 of file restore_topo_geom_incl_test.cpp.
Referenced by axis_dims(), moab::box_from_axes(), moab::GeomUtil::box_plane_overlap(), moab::GeomUtil::box_tet_overlap(), moab::SysUtil::byteswap(), moab::ParallelComm::check_clean_iface(), moab::OrientedBoxTreeTool::closest_to_location(), smoab::FacesAdjRegions::FacesAdjRegions(), heappermute(), iRel_inferArrRelations(), leaf_iterator_test(), mb_skin_curve_test_common(), mb_skin_surface_test_common(), moab::OrientedBox::order_axes_by_length(), ZoltanPartitioner::partition_owned_cells(), moab::ParallelMergeMesh::PerformRealSort(), permutation(), moab::HiReconstruction::polyfit3d_curve_get_coeff(), moab::HiReconstruction::polyfit3d_walf_curve_vertex(), moab::HiReconstruction::polyfit3d_walf_surf_vertex(), moab::ReadNASTRAN::read_element(), moab::ParallelComm::reduce(), smoab::detail::QuadratricOrdering< VTK_TRIQUADRATIC_HEXAHEDRON >::reorder(), replace_surface(), moab::AdjSides< CORNERS >::Side::Side(), test_box_plane_norm(), test_pack_elements(), test_pack_higher_order(), test_read_prisms(), test_read_quads(), test_read_tets(), and moab::ParallelComm::unpack_entities().
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
| void test_four_cubes | ( | ) |
Definition at line 350 of file restore_topo_geom_incl_test.cpp.
References ErrorCode, get_all_handles(), heappermute(), and MB_CHK_ERR_RET.
Referenced by main().
{
ErrorCode rval;
Interface* mbi = new Core();
// get all handles (dimension, id, sense)
rval = get_all_handles( mbi );MB_CHK_ERR_RET( rval );
int len = 4;
int num[4] = { 1, 2, 3, 4 };
// build reference map
std::map< int, std::set< int > > ref_map;
ref_map[1].insert( 1 );
ref_map[2].insert( 2 );
ref_map[2].insert( 1 );
ref_map[3].insert( 3 );
ref_map[3].insert( 2 );
ref_map[4].insert( 4 );
ref_map[4].insert( 3 );
heappermute( mbi, num, len, ref_map, len );
delete mbi;
}
| void test_three_cubes | ( | ) |
Definition at line 322 of file restore_topo_geom_incl_test.cpp.
References ErrorCode, get_all_handles(), heappermute(), and MB_CHK_ERR_RET.
Referenced by main().
{
ErrorCode rval;
Interface* mbi = new Core();
// get all handles (dimension, id, sense)
rval = get_all_handles( mbi );MB_CHK_ERR_RET( rval );
int len = 3;
int num[3] = { 1, 2, 3 };
// build reference map
std::map< int, std::set< int > > ref_map;
ref_map[1].insert( 1 );
ref_map[2].insert( 2 );
ref_map[2].insert( 1 );
ref_map[3].insert( 3 );
ref_map[3].insert( 2 );
heappermute( mbi, num, len, ref_map, len );
delete mbi;
}
| void test_two_cubes | ( | ) |
Definition at line 295 of file restore_topo_geom_incl_test.cpp.
References ErrorCode, get_all_handles(), heappermute(), and MB_CHK_ERR_RET.
Referenced by main().
{
ErrorCode rval;
Interface* mbi = new Core();
// get all handles (dimension, id, sense)
rval = get_all_handles( mbi );MB_CHK_ERR_RET( rval );
int len = 2;
int num[2] = { 1, 2 };
// build reference map
std::map< int, std::set< int > > ref_map;
ref_map[1].insert( 1 );
ref_map[2].insert( 2 );
ref_map[2].insert( 1 );
heappermute( mbi, num, len, ref_map, len );
delete mbi;
}
Definition at line 13 of file restore_topo_geom_incl_test.cpp.
Referenced by build_cube(), get_all_handles(), read_cylcube_groups_test(), and moab::GeomTopoTool::setup_implicit_complement().
Definition at line 17 of file restore_topo_geom_incl_test.cpp.
Referenced by check_geometric_set(), main(), overlap_test_measure_area(), overlap_test_measure_volume(), overlap_test_point_in_volume(), overlap_test_ray_fire(), overlap_test_surface_sense(), overlap_test_tracking(), overlap_write_geometry(), moab::ReadTetGen::read_elem_file(), test_bc_sets(), test_closest_to_location(), test_geometric_sets(), test_measure_area(), test_measure_volume(), test_meshset_tags_1(), test_meshset_tags_2(), test_point_in_volume(), test_ray_fire(), test_read_geom_set(), test_surface_sense(), and write_geometry().
Definition at line 14 of file restore_topo_geom_incl_test.cpp.
Definition at line 17 of file restore_topo_geom_incl_test.cpp.
Definition at line 15 of file restore_topo_geom_incl_test.cpp.
Definition at line 16 of file restore_topo_geom_incl_test.cpp.
Referenced by build_cube(), and get_all_handles().