|
MOAB: Mesh Oriented datABase
(version 5.4.1)
|
#include "MBTagConventions.hpp"#include "moab/Interface.hpp"#include "moab/Core.hpp"#include "moab/Range.hpp"#include "moab/CartVect.hpp"#include "moab/GeomQueryTool.hpp"#include "moab/GeomTopoTool.hpp"#include <vector>#include <iostream>#include <cmath>#include <limits>#include <algorithm>#include <cstdio>
Include dependency graph for test_geom_gqt.cpp:Go to the source code of this file.
| #define CHKERR if( MB_SUCCESS != rval ) return rval |
Definition at line 21 of file test_geom_gqt.cpp.
Referenced by 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(), test_closest_to_location(), test_measure_area(), test_measure_volume(), test_point_in_volume(), test_ray_fire(), test_surface_sense(), and write_geometry().
| #define RUN_TEST | ( | A | ) |
do \ { \ std::cout << #A << "... " << std::endl; \ if( MB_SUCCESS != A( gqt ) ) \ { \ ++errors; \ } \ } while( false )
Definition at line 224 of file test_geom_gqt.cpp.
Referenced by run_overlap_tests(), and run_regular_tests().
| int main | ( | int | argc, |
| char * | argv[] | ||
| ) |
Definition at line 234 of file test_geom_gqt.cpp.
References moab::Interface::delete_mesh(), ErrorCode, moab::fail(), filename, moab::Interface::load_file(), MB_CHK_SET_ERR, MBI, overlap_write_geometry(), run_overlap_tests(), run_regular_tests(), and write_geometry().
{
ErrorCode rval;
const char* filename = "test_geom.h5m";
#ifdef MOAB_HAVE_MPI
int fail = MPI_Init( &argc, &argv );
if( fail ) return fail;
#endif
rval = write_geometry( filename );MB_CHK_SET_ERR( rval, "Failed to create input file: " << filename );
Interface* MBI = new Core();
int errors = 0;
rval = MBI->load_file( filename );
remove( filename );MB_CHK_SET_ERR( rval, "Failed to load file" );
GeomTopoTool* gtt = new GeomTopoTool( MBI );
GeomQueryTool* gqt = new GeomQueryTool( gtt );
errors += run_regular_tests( gqt );
// clear out moab instance
rval = MBI->delete_mesh();MB_CHK_SET_ERR( rval, "Failed to delete mesh" );
delete gtt;
delete gqt;
// Now load a different geometry: two cubes that slightly overlap
rval = overlap_write_geometry( filename );MB_CHK_SET_ERR( rval, "Failed to create input file: " << filename );
rval = MBI->load_file( filename );
remove( filename );MB_CHK_SET_ERR( rval, "Failed to load file with overlaps" );
gtt = new GeomTopoTool( MBI );
gqt = new GeomQueryTool( gtt );
errors += run_overlap_tests( gqt );
// clear moab instance
rval = MBI->delete_mesh();MB_CHK_SET_ERR( rval, "Failed to delete mesh" );
delete gtt;
delete gqt;
// Re-run all tests with the alternate constructor
std::cout << "-------------------------------------" << std::endl;
std::cout << "Re-running tests with MBI constructor" << std::endl;
std::cout << "-------------------------------------" << std::endl;
rval = write_geometry( filename );MB_CHK_SET_ERR( rval, "Failed to create input file" );
rval = MBI->load_file( filename );
remove( filename );MB_CHK_SET_ERR( rval, "Failed to load file" );
gqt = new GeomQueryTool( MBI );
errors += run_regular_tests( gqt );
// clear moab and dagmc instance
rval = MBI->delete_mesh();MB_CHK_SET_ERR( rval, "Failed to delete mesh" );
delete gqt;
// Now load a different geometry: two cubes that slightly overlap
rval = overlap_write_geometry( filename );MB_CHK_SET_ERR( rval, "Failed to create input file: " );
rval = MBI->load_file( filename );
remove( filename );MB_CHK_SET_ERR( rval, "Failed to load file with overlaps." );
gqt = new GeomQueryTool( MBI );
errors += run_overlap_tests( gqt );
// final cleanup
delete gqt;
delete MBI;
#ifdef MOAB_HAVE_MPI
fail = MPI_Finalize();
if( fail ) return fail;
#endif
return errors;
}
Definition at line 541 of file test_geom_gqt.cpp.
References moab::Range::begin(), CHKERR, dim_tag, ErrorCode, moab::Interface::get_entities_by_type_and_tag(), moab::GeomTopoTool::get_geom_tag(), moab::GeomTopoTool::get_gid_tag(), moab::GeomQueryTool::gttool(), MB_SUCCESS, MBENTITYSET, moab::GeomQueryTool::measure_area(), moab::GeomQueryTool::moab_instance(), moab::Range::size(), and moab::Interface::tag_get_data().
Referenced by run_overlap_tests().
{
ErrorCode rval;
Interface* moab = gqt->moab_instance();
Tag dim_tag = gqt->gttool()->get_geom_tag();
Range surfs;
const int two = 2;
const void* ptr = &two;
rval = moab->get_entities_by_type_and_tag( 0, MBENTITYSET, &dim_tag, &ptr, 1, surfs );CHKERR;
const unsigned num_surfs = 12;
if( surfs.size() != num_surfs )
{
std::cerr << "ERROR: Expected " << num_surfs << " surfaces in input, found " << surfs.size() << std::endl;
return MB_FAILURE;
}
int ids[num_surfs];
rval = moab->tag_get_data( gqt->gttool()->get_gid_tag(), surfs, ids );CHKERR;
const double x_area = 2 * 2;
const double yz_area0 = 2 * 1;
const double yz_area1 = 2 * 1.01;
Range::iterator iter = surfs.begin();
for( unsigned i = 0; i < num_surfs; ++i, ++iter )
{
double expected, result;
if( 0 == i || 2 == i || 4 == i || 5 == i )
expected = yz_area0;
else if( 1 == i || 3 == i || 7 == i || 9 == i )
expected = x_area;
else if( 6 == i || 8 == i || 10 == i || 11 == i )
expected = yz_area1;
rval = gqt->measure_area( *iter, result );CHKERR;
if( fabs( result - expected ) > std::numeric_limits< double >::epsilon() )
{
std::cerr << "ERROR: Expected area of surface " << ids[i] << " to be " << expected << ". Got " << result
<< std::endl;
return MB_FAILURE;
}
}
return MB_SUCCESS;
}
Definition at line 468 of file test_geom_gqt.cpp.
References CHKERR, dim_tag, ErrorCode, moab::Range::front(), moab::Interface::get_entities_by_type_and_tag(), moab::GeomTopoTool::get_geom_tag(), moab::GeomQueryTool::gttool(), MB_SUCCESS, MBENTITYSET, moab::GeomQueryTool::measure_volume(), moab::GeomQueryTool::moab_instance(), and moab::Range::size().
Referenced by run_overlap_tests().
{
ErrorCode rval;
Interface* moab = gqt->moab_instance();
Tag dim_tag = gqt->gttool()->get_geom_tag();
Range vols;
const int three = 3;
const void* ptr = &three;
rval = moab->get_entities_by_type_and_tag( 0, MBENTITYSET, &dim_tag, &ptr, 1, vols );CHKERR;
if( vols.size() != 2 )
{
std::cerr << "ERROR: Expected 2 volumes in input, found " << vols.size() << std::endl;
return MB_FAILURE;
}
// The volume has two regions that overlap.
double result;
const double vol = ( 1 + 1.01 ) * 2 * 2;
rval = gqt->measure_volume( vols.front(), result );CHKERR;
if( fabs( result - vol ) > 2 * std::numeric_limits< double >::epsilon() )
{
std::cerr << "ERROR: Expected " << vol << " as measure of volume, got " << result << std::endl;
return MB_FAILURE;
}
return MB_SUCCESS;
}
Definition at line 952 of file test_geom_gqt.cpp.
References CHKERR, PointInVol::coords, dim_tag, PointInVol::dir, ErrorCode, moab::Range::front(), moab::Interface::get_entities_by_type_and_tag(), moab::GeomTopoTool::get_geom_tag(), moab::GeomQueryTool::gttool(), MB_SUCCESS, MBENTITYSET, moab::GeomQueryTool::moab_instance(), moab::GeomQueryTool::point_in_volume(), moab::GeomQueryTool::point_in_volume_slow(), PointInVol::result, and moab::Range::size().
Referenced by run_overlap_tests().
{
const char* const NAME_ARR[] = { "Boundary", "Outside", "Inside" };
const char* const* names = NAME_ARR + 1;
const int INSIDE = 1, OUTSIDE = 0, BOUNDARY = -1;
const struct PointInVol tests[] = { { { 0.5, 0.0, 0.5 }, INSIDE, { 0.0, 0.0, 0.0 } },
{ { 0.5, 0.0, -0.5 }, INSIDE, { 0.0, 0.0, 0.0 } },
{ { 0.5, 0.0, 0.0 }, INSIDE, { 0.0, 0.0, 0.0 } },
{ { -0.5, 0.0, 0.0 }, INSIDE, { 0.0, 0.0, 0.0 } },
{ { 0.5, 0.5, 0.0 }, INSIDE, { 0.0, 0.0, 0.0 } },
{ { 0.5, -0.5, 0.0 }, INSIDE, { 0.0, 0.0, 0.0 } },
{ { 1.1, 1.1, 1.1 }, OUTSIDE, { 0.0, 0.0, 0.0 } },
{ { -1.1, 1.1, 1.1 }, OUTSIDE, { 0.0, 0.0, 0.0 } },
{ { -1.1, -1.1, 1.1 }, OUTSIDE, { 0.0, 0.0, 0.0 } },
{ { 1.1, -1.1, 1.1 }, OUTSIDE, { 0.0, 0.0, 0.0 } },
{ { 1.1, 1.1, -1.1 }, OUTSIDE, { 0.0, 0.0, 0.0 } },
{ { -1.1, 1.1, -1.1 }, OUTSIDE, { 0.0, 0.0, 0.0 } },
{ { -1.1, -1.1, -1.1 }, OUTSIDE, { 0.0, 0.0, 0.0 } },
{ { 1.1, -1.1, -1.1 }, OUTSIDE, { 0.0, 0.0, 0.0 } },
// Add some directions to test special cases of edge/node intersection
{ { 0.5, 0.0, 0.0 }, INSIDE, { -1.0, 0.0, 0.0 } },
{ { 0.5, 0.0, 0.0 }, INSIDE, { 1.0, 0.0, 0.0 } },
{ { 0.0, 0.0, 2.0 }, OUTSIDE, { 0.0, 0.0, -1.0 } },
{ { 0.5, 0.0, -0.5 }, INSIDE, { -1.0, 0.0, 0.0 } },
{ { 0.5, -0.5, -2.0 }, OUTSIDE, { 0.0, 0.0, 1.0 } },
// Test some points in the overlap
{ { 0.005, 0.0, 0.0 }, INSIDE, { -1.0, 0.0, 0.0 } },
{ { 0.005, 0.0, 0.0 }, INSIDE, { 1.0, 0.0, 0.0 } },
{ { 0.005, 0.0, 2.0 }, OUTSIDE, { 0.0, 0.0, -1.0 } },
{ { 0.005, 0.0, -0.5 }, INSIDE, { -1.0, 0.0, 0.0 } },
{ { 0.005, -0.5, -2.0 }, OUTSIDE, { 0.0, 0.0, 1.0 } } };
const int num_test = sizeof( tests ) / sizeof( tests[0] );
ErrorCode rval;
Interface* moab = gqt->moab_instance();
Tag dim_tag = gqt->gttool()->get_geom_tag();
Range vols;
const int three = 3;
const void* ptr = &three;
rval = moab->get_entities_by_type_and_tag( 0, MBENTITYSET, &dim_tag, &ptr, 1, vols );CHKERR;
if( vols.size() != 2 )
{
std::cerr << "ERROR: Expected 2 volumes in input, found " << vols.size() << std::endl;
return MB_FAILURE;
}
const EntityHandle vol = vols.front();
for( int i = 0; i < num_test; ++i )
{
int result;
rval = gqt->point_in_volume( vol, tests[i].coords, result, tests[i].dir );CHKERR;
if( result != tests[i].result )
{
std::cerr << "ERROR testing point_in_volume[" << i << "]:" << std::endl
<< "\tExpected " << names[tests[i].result] << " for (" << tests[i].coords[0] << ", "
<< tests[i].coords[1] << ", " << tests[i].coords[2] << "). Got " << names[result] << std::endl;
return MB_FAILURE;
}
// point_in_volume_slow doesn't to boundary.
if( tests[i].result == BOUNDARY ) continue;
rval = gqt->point_in_volume_slow( vol, tests[i].coords, result );CHKERR;
if( result != tests[i].result )
{
std::cerr << "ERROR testing point_in_volume_slow[" << i << "]:" << std::endl
<< "\tExpected " << names[tests[i].result] << " for (" << tests[i].coords[0] << ", "
<< tests[i].coords[1] << ", " << tests[i].coords[2] << "). Got " << names[result] << std::endl;
return MB_FAILURE;
}
}
return MB_SUCCESS;
}
| ErrorCode overlap_test_ray_fire | ( | GeomQueryTool * | gqt | ) |
Definition at line 723 of file test_geom_gqt.cpp.
References moab::Range::begin(), CHKERR, dim_tag, ray_fire::direction, ray_fire::distance, moab::Range::end(), ErrorCode, moab::Range::front(), moab::Interface::get_entities_by_type_and_tag(), moab::GeomTopoTool::get_geom_tag(), moab::GeomTopoTool::get_gid_tag(), moab::GeomQueryTool::gttool(), ray_fire::hit_surf, MB_SUCCESS, MBENTITYSET, moab::GeomQueryTool::moab_instance(), ray_fire::origin, ray_fire::prev_surf, moab::GeomQueryTool::ray_fire(), moab::Range::size(), and moab::Interface::tag_get_data().
Referenced by run_overlap_tests().
{
// Glancing ray-triangle intersections are not valid exit intersections.
// Piercing ray-triangle intersections are valid exit intersections.
// "0" destination surface implies that it is ambiguous.
const struct ray_fire tests[] = { /* ____________________
| |
-x <--- | region1 | overlap | region0 | ---> +x
| |
---------------------
-x <--- -1.0 0.0 0.01 1.0 ---> +x
surf_id: 10 4 8 2
The zero-distance advance would occur in the implicit volume between
these two regions---not in this volume.
src_srf origin direction dest dist */
// numerical location on surface 1 of region0
{ 4, { 1.0, 0.0, 0.0 }, { 1.0, 0.0, 0.0 }, 2, 0.0 },
{ 2, { 1.0, 0.0, 0.0 }, { -1.0, 0.0, 0.0 }, 4, 1.0 },
// numerical location inside region0
{ 4, { 0.5, 0.0, 0.0 }, { 1.0, 0.0, 0.0 }, 2, 0.5 },
{ 2, { 0.5, 0.0, 0.0 }, { -1.0, 0.0, 0.0 }, 4, 0.5 },
// numerical location on surface 7 of region1
{ 4, { 0.01, 0.0, 0.0 }, { 1.0, 0.0, 0.0 }, 8, 0.0 },
{ 2, { 0.01, 0.0, 0.0 }, { -1.0, 0.0, 0.0 }, 4, 0.01 },
// numerical location inside overlap
{ 10, { 0.005, 0.0, 0.0 }, { 1.0, 0.0, 0.0 }, 8, 0.005 },
{ 2, { 0.005, 0.0, 0.0 }, { -1.0, 0.0, 0.0 }, 4, 0.005 },
// numerical location on surface 3 of region0
{ 10, { 0.0, 0.0, 0.0 }, { 1.0, 0.0, 0.0 }, 8, 0.01 },
{ 8, { 0.0, 0.0, 0.0 }, { -1.0, 0.0, 0.0 }, 4, 0.0 },
// numerical location inside region1
{ 10, { -0.5, 0.0, 0.0 }, { 1.0, 0.0, 0.0 }, 8, 0.51 },
{ 8, { -0.5, 0.0, 0.0 }, { -1.0, 0.0, 0.0 }, 10, 0.5 },
// numerical location on surface 9 of region1
{ 10, { -1.0, 0.0, 0.0 }, { 1.0, 0.0, 0.0 }, 8, 1.01 },
{ 8, { -1.0, 0.0, 0.0 }, { -1.0, 0.0, 0.0 }, 10, 0.0 } };
ErrorCode rval;
Interface* moab = gqt->moab_instance();
Tag dim_tag = gqt->gttool()->get_geom_tag();
Range surfs, vols;
const int two = 2, three = 3;
const void* ptrs[] = { &two, &three };
rval = moab->get_entities_by_type_and_tag( 0, MBENTITYSET, &dim_tag, ptrs, 1, surfs );CHKERR;
rval = moab->get_entities_by_type_and_tag( 0, MBENTITYSET, &dim_tag, ptrs + 1, 1, vols );CHKERR;
if( vols.size() != 2 )
{
std::cerr << "ERROR: Expected 2 volumes in input, found " << vols.size() << std::endl;
return MB_FAILURE;
}
const unsigned num_surf = 12;
if( surfs.size() != num_surf )
{
std::cerr << "ERROR: Expected " << num_surf << " surfaces in input, found " << surfs.size() << std::endl;
return MB_FAILURE;
}
int ids[num_surf];
rval = moab->tag_get_data( gqt->gttool()->get_gid_tag(), surfs, ids );CHKERR;
EntityHandle surf[num_surf];
std::copy( surfs.begin(), surfs.end(), surf );
const int num_test = sizeof( tests ) / sizeof( tests[0] );
for( int i = 0; i < num_test; ++i )
{
int* ptr = std::find( ids, ids + num_surf, tests[i].prev_surf );
unsigned idx = ptr - ids;
if( idx >= num_surf )
{
std::cerr << "Surface " << tests[i].prev_surf << " not found." << std::endl;
return MB_FAILURE;
}
// const EntityHandle src_surf = surf[idx];
ptr = std::find( ids, ids + num_surf, tests[i].hit_surf );
idx = ptr - ids;
if( idx >= num_surf )
{
std::cerr << "Surface " << tests[i].hit_surf << " not found." << std::endl;
return MB_FAILURE;
}
const EntityHandle hit_surf = surf[idx];
double dist;
EntityHandle result;
rval = gqt->ray_fire( vols.front(), tests[i].origin, tests[i].direction, result, dist );
if( result != hit_surf || fabs( dist - tests[i].distance ) > 1e-6 )
{
EntityHandle* p = std::find( surf, surf + 6, result );
idx = p - surf;
int id = idx > num_surf - 1 ? 0 : ids[idx];
std::cerr << "Rayfire test failed for " << std::endl
<< "\t ray from (" << tests[i].origin[0] << ", " << tests[i].origin[1] << ", "
<< tests[i].origin[2] << ") going [" << tests[i].direction[0] << ", " << tests[i].direction[1]
<< ", " << tests[i].direction[2] << "]" << std::endl
<< "\t Beginning on surface " << tests[i].prev_surf << std::endl
<< "\t Expected to hit surface " << tests[i].hit_surf << " after " << tests[i].distance
<< " units." << std::endl
<< "\t Actually hit surface " << id << " after " << dist << " units." << std::endl;
return MB_FAILURE;
}
}
return MB_SUCCESS;
}
Definition at line 401 of file test_geom_gqt.cpp.
References moab::Range::begin(), CHKERR, dim_tag, moab::Range::end(), ErrorCode, moab::Range::front(), moab::Interface::get_entities_by_type_and_tag(), moab::GeomTopoTool::get_geom_tag(), moab::GeomTopoTool::get_sense(), moab::GeomQueryTool::gttool(), MB_SUCCESS, MBENTITYSET, moab::GeomQueryTool::moab_instance(), and moab::Range::size().
Referenced by run_overlap_tests().
{
ErrorCode rval;
Interface* moab = gqt->moab_instance();
Tag dim_tag = gqt->gttool()->get_geom_tag();
Range surfs, vols;
const int two = 2, three = 3;
const void* ptrs[] = { &two, &three };
rval = moab->get_entities_by_type_and_tag( 0, MBENTITYSET, &dim_tag, ptrs, 1, surfs );CHKERR;
rval = moab->get_entities_by_type_and_tag( 0, MBENTITYSET, &dim_tag, ptrs + 1, 1, vols );CHKERR;
if( vols.size() != 2 )
{
std::cerr << "ERROR: Expected 2 volumes in input, found " << vols.size() << std::endl;
return MB_FAILURE;
}
if( surfs.size() != 12 )
{
std::cerr << "ERROR: Expected 12 surfaces in input, found " << surfs.size() << std::endl;
return MB_FAILURE;
}
for( Range::iterator i = surfs.begin(); i != surfs.end(); ++i )
{
int sense = 0;
rval = gqt->gttool()->get_sense( *i, vols.front(), sense );
if( MB_SUCCESS != rval || sense != 1 )
{
std::cerr << "ERROR: Expected 1 for surface sense, got " << sense << std::endl;
return MB_FAILURE;
}
}
return MB_SUCCESS;
}
| ErrorCode overlap_test_tracking | ( | GeomQueryTool * | gqt | ) |
Definition at line 1029 of file test_geom_gqt.cpp.
References CHKERR, dim_tag, PointInVol::dir, ErrorCode, moab::Range::front(), moab::Interface::get_entities_by_type_and_tag(), moab::GeomTopoTool::get_geom_tag(), moab::GeomQueryTool::gttool(), MB_SUCCESS, MBENTITYSET, moab::GeomQueryTool::moab_instance(), moab::GeomTopoTool::next_vol(), moab::GeomQueryTool::point_in_volume(), moab::GeomQueryTool::ray_fire(), PointInVol::result, and moab::Range::size().
Referenced by run_overlap_tests().
{
/* Track a particle from left (-x) to right (+x) through an overlap.
____________________
| |
-x <--- | region1 | overlap | region0 | ---> +x
| |
---------------------
-x <--- -1.0 0.0 0.01 1.0 ---> +x
surf_id: 10 4 8 2 */
// get the surfaces and volumes
Tag dim_tag = gqt->gttool()->get_geom_tag();
Range surfs, explicit_vols;
const int two = 2, three = 3;
const void* ptrs[] = { &two, &three };
ErrorCode rval;
Interface* moab = gqt->moab_instance();
rval = moab->get_entities_by_type_and_tag( 0, MBENTITYSET, &dim_tag, ptrs, 1, surfs );CHKERR;
rval = moab->get_entities_by_type_and_tag( 0, MBENTITYSET, &dim_tag, ptrs + 1, 1, explicit_vols );CHKERR;
if( explicit_vols.size() != 2 )
{
std::cerr << "ERROR: Expected 2 explicit volumes in input, found " << explicit_vols.size() << std::endl;
return MB_FAILURE;
}
const unsigned num_surf = 12;
if( surfs.size() != num_surf )
{
std::cerr << "ERROR: Expected " << num_surf << " surfaces in input, found " << surfs.size() << std::endl;
return MB_FAILURE;
}
const EntityHandle explicit_vol = explicit_vols.front();
// start particle
double point[] = { -0.9, 0, 0 };
const double dir[] = { 1, 0, 0 };
EntityHandle vol = explicit_vol;
int result;
const int INSIDE = 1; // OUTSIDE = 0, BOUNDARY = -1;
rval = gqt->point_in_volume( explicit_vol, point, result, dir );CHKERR;
if( result != INSIDE )
{
std::cerr << "ERROR: particle not inside explicit volume" << std::endl;
return MB_FAILURE;
}
// get next surface
double dist;
EntityHandle next_surf;
GeomQueryTool::RayHistory history;
rval = gqt->ray_fire( vol, point, dir, next_surf, dist, &history );CHKERR;
if( next_surf != surfs[7] || fabs( dist - 0.91 ) > 1e-6 )
{
std::cerr << "ERROR: failed on advance 1" << std::endl;
return MB_FAILURE;
}
for( unsigned i = 0; i < 3; i++ )
point[i] += dist * dir[i];
// get the next volume (implicit complement)
EntityHandle next_vol;
rval = gqt->gttool()->next_vol( next_surf, vol, next_vol );CHKERR;
// get the next surface (behind numerical location)
vol = next_vol;
rval = gqt->ray_fire( vol, point, dir, next_surf, dist, &history );CHKERR;
if( next_surf != surfs[3] || fabs( dist - 0.0 ) > 1e-6 )
{
std::cerr << "ERROR: failed on advance 2" << std::endl;
return MB_FAILURE;
}
for( unsigned i = 0; i < 3; i++ )
point[i] += dist * dir[i];
// get the next volume (the explicit volume)
rval = gqt->gttool()->next_vol( next_surf, vol, next_vol );CHKERR;
// get the next surface
vol = next_vol;
rval = gqt->ray_fire( vol, point, dir, next_surf, dist, &history );CHKERR;
if( next_surf != surfs[1] || fabs( dist - 0.99 ) > 1e-6 )
{
std::cerr << "ERROR: failed on advance 3" << std::endl;
return MB_FAILURE;
}
for( unsigned i = 0; i < 3; i++ )
point[i] += dist * dir[i];
return MB_SUCCESS;
}
| ErrorCode overlap_write_geometry | ( | const char * | output_file_name | ) |
Definition at line 136 of file test_geom_gqt.cpp.
References moab::Interface::add_entities(), moab::Interface::add_parent_child(), CHKERR, moab::Interface::create_element(), moab::Interface::create_meshset(), moab::Interface::create_vertex(), dim_tag, ErrorCode, GEOM_DIMENSION_TAG_NAME, moab::Interface::globalId_tag(), id_tag, MB_SUCCESS, MB_TAG_CREAT, MB_TAG_SPARSE, MB_TYPE_HANDLE, MB_TYPE_INTEGER, MBTRI, MESHSET_SET, moab::Interface::tag_get_handle(), moab::Interface::tag_set_data(), and moab::Interface::write_mesh().
Referenced by main().
{
ErrorCode rval;
Interface* moab = new Core();
// Define two 1x2x2 cubes that overlap from 0 <= x <= 0.01
// cube 0 centered at (0.5,0,0)
const double coords[] = { 1, -1, -1, 1, 1, -1, 0, 1, -1, 0, -1, -1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 0, -1, 1,
// cube 1 centered near (-0.5,0,0)
0.01, -1, -1, 0.01, 1, -1, -1, 1, -1, -1, -1, -1, 0.01, -1, 1, 0.01, 1, 1, -1, 1, 1, -1,
-1, 1 };
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, 6, 6, 7, 4 }; // +Z
// Create the geometry
const unsigned tris_per_surf = 2;
const unsigned num_cubes = 2;
const unsigned num_verts = sizeof( coords ) / ( 3 * sizeof( double ) );
const unsigned num_tris = num_cubes * sizeof( connectivity ) / ( 3 * sizeof( int ) );
const unsigned num_surfs = num_tris / tris_per_surf;
EntityHandle verts[num_verts], tris[num_tris], surfs[num_surfs];
for( unsigned i = 0; i < num_verts; ++i )
{
rval = moab->create_vertex( coords + 3 * i, verts[i] );CHKERR;
}
// cube0
for( unsigned i = 0; i < num_tris / 2; ++i )
{
const EntityHandle conn[] = { verts[connectivity[3 * i]], verts[connectivity[3 * i + 1]],
verts[connectivity[3 * i + 2]] };
rval = moab->create_element( MBTRI, conn, 3, tris[i] );CHKERR;
}
// cube1
for( unsigned i = 0; i < num_tris / 2; ++i )
{
const EntityHandle conn[] = { verts[8 + connectivity[3 * i]], verts[8 + connectivity[3 * i + 1]],
verts[8 + connectivity[3 * i + 2]] };
rval = moab->create_element( MBTRI, conn, 3, tris[num_tris / 2 + i] );CHKERR;
}
// create CAD topology
EntityHandle* tri_iter = tris;
for( unsigned i = 0; i < num_surfs; ++i )
{
rval = moab->create_meshset( MESHSET_SET, surfs[i] );CHKERR;
rval = moab->add_entities( surfs[i], tri_iter, tris_per_surf );CHKERR;
tri_iter += tris_per_surf;
}
Tag dim_tag, id_tag, sense_tag;
rval = moab->tag_get_handle( GEOM_DIMENSION_TAG_NAME, 1, MB_TYPE_INTEGER, dim_tag, MB_TAG_SPARSE | MB_TAG_CREAT );CHKERR;
id_tag = moab->globalId_tag();
rval = moab->tag_get_handle( "GEOM_SENSE_2", 2, MB_TYPE_HANDLE, sense_tag, MB_TAG_SPARSE | MB_TAG_CREAT );CHKERR;
std::vector< int > dims( num_surfs, 2 );
rval = moab->tag_set_data( dim_tag, surfs, num_surfs, &dims[0] );CHKERR;
std::vector< int > ids( num_surfs );
for( size_t i = 0; i < ids.size(); ++i )
ids[i] = i + 1;
rval = moab->tag_set_data( id_tag, surfs, num_surfs, &ids[0] );CHKERR;
EntityHandle volume;
rval = moab->create_meshset( MESHSET_SET, volume );CHKERR;
for( unsigned i = 0; i < num_surfs; ++i )
{
rval = moab->add_parent_child( volume, surfs[i] );CHKERR;
}
std::vector< EntityHandle > senses( 2 * num_surfs, 0 );
for( size_t i = 0; i < senses.size(); i += 2 )
senses[i] = volume;
rval = moab->tag_set_data( sense_tag, surfs, num_surfs, &senses[0] );CHKERR;
const int three = 3;
const int one = 1;
rval = moab->tag_set_data( dim_tag, &volume, 1, &three );CHKERR;
rval = moab->tag_set_data( id_tag, &volume, 1, &one );CHKERR;
rval = moab->write_mesh( output_file_name );CHKERR;
delete moab;
return MB_SUCCESS;
}
| int run_overlap_tests | ( | GeomQueryTool * | gqt | ) |
Definition at line 344 of file test_geom_gqt.cpp.
References ErrorCode, moab::GeomQueryTool::initialize(), MB_CHK_SET_ERR_CONT, overlap_test_measure_area(), overlap_test_measure_volume(), overlap_test_point_in_volume(), overlap_test_ray_fire(), overlap_test_surface_sense(), overlap_test_tracking(), RUN_TEST, and moab::GeomQueryTool::set_overlap_thickness().
Referenced by main().
{
int errors = 0;
ErrorCode rval;
rval = gqt->initialize();MB_CHK_SET_ERR_CONT( rval, "Failed to initialize the GeomQueryTool" );
// change settings to use overlap-tolerant mode (with a large enough thickness)
double overlap_thickness = 3.0;
gqt->set_overlap_thickness( overlap_thickness );
RUN_TEST( overlap_test_ray_fire );
RUN_TEST( overlap_test_point_in_volume );
RUN_TEST( overlap_test_measure_volume );
RUN_TEST( overlap_test_measure_area );
RUN_TEST( overlap_test_surface_sense );
RUN_TEST( overlap_test_tracking );
return errors;
}
| int run_regular_tests | ( | GeomQueryTool * | gqt | ) |
Definition at line 321 of file test_geom_gqt.cpp.
References ErrorCode, moab::GeomQueryTool::initialize(), MB_CHK_SET_ERR_CONT, RUN_TEST, moab::GeomQueryTool::set_overlap_thickness(), test_closest_to_location(), test_measure_area(), test_measure_volume(), test_point_in_volume(), test_ray_fire(), and test_surface_sense().
Referenced by main().
{
int errors = 0;
ErrorCode rval;
rval = gqt->initialize();MB_CHK_SET_ERR_CONT( rval, "Failed to initialize the GeomQueryTool" );
RUN_TEST( test_ray_fire );
RUN_TEST( test_closest_to_location );
RUN_TEST( test_point_in_volume );
RUN_TEST( test_measure_volume );
RUN_TEST( test_measure_area );
RUN_TEST( test_surface_sense );
// change settings to use overlap-tolerant mode (arbitrary thickness)
double overlap_thickness = 0.1;
gqt->set_overlap_thickness( overlap_thickness );
RUN_TEST( test_ray_fire );
RUN_TEST( test_point_in_volume );
return errors;
}
Definition at line 921 of file test_geom_gqt.cpp.
References moab::CartVect::array(), CHKERR, moab::GeomQueryTool::closest_to_location(), dim_tag, ErrorCode, moab::Range::front(), moab::Interface::get_entities_by_type_and_tag(), moab::GeomTopoTool::get_geom_tag(), moab::GeomQueryTool::gttool(), MB_SUCCESS, MBENTITYSET, moab::GeomQueryTool::moab_instance(), PointInVol::result, and moab::Range::size().
Referenced by run_regular_tests().
{
ErrorCode rval;
Interface* moab = gqt->moab_instance();
Range vols;
const int three = 3;
const void* ptr = &three;
Tag dim_tag = gqt->gttool()->get_geom_tag();
rval = moab->get_entities_by_type_and_tag( 0, MBENTITYSET, &dim_tag, &ptr, 1, vols );CHKERR;
if( vols.size() != 2 )
{
std::cerr << "ERROR: Expected 2 volumes in input, found " << vols.size() << std::endl;
return MB_FAILURE;
}
const EntityHandle vol = vols.front();
CartVect position( 10, 0, 0 );
double result = 0.0;
rval = gqt->closest_to_location( vol, position.array(), result );
if( result != 9.0 ) return MB_FAILURE;
EntityHandle surface = 1;
rval = gqt->closest_to_location( vol, position.array(), result, &surface );
if( result != 9.0 ) return MB_FAILURE;
if( surface == 1 ) return MB_FAILURE;
return MB_SUCCESS;
}
| ErrorCode test_measure_area | ( | GeomQueryTool * | gqt | ) |
Definition at line 499 of file test_geom_gqt.cpp.
References moab::Range::begin(), CHKERR, dim_tag, ErrorCode, moab::Interface::get_entities_by_type_and_tag(), moab::GeomTopoTool::get_geom_tag(), moab::GeomTopoTool::get_gid_tag(), moab::GeomQueryTool::gttool(), MB_SUCCESS, MBENTITYSET, moab::GeomQueryTool::measure_area(), moab::GeomQueryTool::moab_instance(), ROOT2, moab::Range::size(), and moab::Interface::tag_get_data().
Referenced by run_regular_tests().
{
ErrorCode rval;
Interface* moab = gqt->moab_instance();
Tag dim_tag = gqt->gttool()->get_geom_tag();
Range surfs;
const int two = 2;
const void* ptr = &two;
rval = moab->get_entities_by_type_and_tag( 0, MBENTITYSET, &dim_tag, &ptr, 1, surfs );CHKERR;
if( surfs.size() != 6 )
{
std::cerr << "ERROR: Expected 6 surfaces in input, found " << surfs.size() << std::endl;
return MB_FAILURE;
}
int ids[6];
rval = moab->tag_get_data( gqt->gttool()->get_gid_tag(), surfs, ids );CHKERR;
// expect area of 4 for all faces except face 6.
// face 6 should have area == 4*sqrt(2)
Range::iterator iter = surfs.begin();
for( unsigned i = 0; i < 6; ++i, ++iter )
{
double expected = 4.0;
if( ids[i] == 6 ) expected *= ROOT2;
double result;
rval = gqt->measure_area( *iter, result );CHKERR;
if( fabs( result - expected ) > std::numeric_limits< double >::epsilon() )
{
std::cerr << "ERROR: Expected area of surface " << ids[i] << " to be " << expected << ". Got " << result
<< std::endl;
return MB_FAILURE;
}
}
return MB_SUCCESS;
}
| ErrorCode test_measure_volume | ( | GeomQueryTool * | gqt | ) |
Definition at line 437 of file test_geom_gqt.cpp.
References CHKERR, dim_tag, ErrorCode, moab::Range::front(), moab::Interface::get_entities_by_type_and_tag(), moab::GeomTopoTool::get_geom_tag(), moab::GeomQueryTool::gttool(), MB_SUCCESS, MBENTITYSET, moab::GeomQueryTool::measure_volume(), moab::GeomQueryTool::moab_instance(), and moab::Range::size().
Referenced by run_regular_tests().
{
ErrorCode rval;
Interface* moab = gqt->moab_instance();
Tag dim_tag = gqt->gttool()->get_geom_tag();
Range vols;
const int three = 3;
const void* ptr = &three;
rval = moab->get_entities_by_type_and_tag( 0, MBENTITYSET, &dim_tag, &ptr, 1, vols );CHKERR;
if( vols.size() != 2 )
{
std::cerr << "ERROR: Expected 2 volumes in input, found " << vols.size() << std::endl;
return MB_FAILURE;
}
// input file is 2x2x2 cube with convexity in +Z face that touches the origin.
// expected volume is 8 (2x2x2) less the volume of the pyrimid concavity
double result;
const double vol = 2 * 2 * 2 - 1 * 4. / 3;
rval = gqt->measure_volume( vols.front(), result );CHKERR;
if( fabs( result - vol ) > 10 * std::numeric_limits< double >::epsilon() )
{
std::cerr << "ERROR: Expected " << vol << " as measure of volume, got " << result << std::endl;
return MB_FAILURE;
}
return MB_SUCCESS;
}
| ErrorCode test_point_in_volume | ( | GeomQueryTool * | gqt | ) |
Definition at line 842 of file test_geom_gqt.cpp.
References CHKERR, PointInVol::coords, dim_tag, PointInVol::dir, ErrorCode, moab::Range::front(), moab::Interface::get_entities_by_type_and_tag(), moab::GeomTopoTool::get_geom_tag(), moab::GeomQueryTool::gttool(), MB_SUCCESS, MBENTITYSET, moab::GeomQueryTool::moab_instance(), moab::GeomQueryTool::point_in_volume(), moab::GeomQueryTool::point_in_volume_slow(), PointInVol::result, and moab::Range::size().
Referenced by run_regular_tests().
{
const char* const NAME_ARR[] = { "Boundary", "Outside", "Inside" };
const char* const* names = NAME_ARR + 1;
const int INSIDE = 1, OUTSIDE = 0, BOUNDARY = -1;
const struct PointInVol tests[] = { { { 0.0, 0.0, 0.5 }, OUTSIDE, { 0.0, 0.0, 0.0 } },
{ { 0.0, 0.0, -0.5 }, INSIDE, { 0.0, 0.0, 0.0 } },
{ { 0.7, 0.0, 0.0 }, INSIDE, { 0.0, 0.0, 0.0 } },
{ { -0.7, 0.0, 0.0 }, INSIDE, { 0.0, 0.0, 0.0 } },
{ { 0.0, -0.7, 0.0 }, INSIDE, { 0.0, 0.0, 0.0 } },
{ { 0.0, -0.7, 0.0 }, INSIDE, { 0.0, 0.0, 0.0 } },
{ { 1.1, 1.1, 1.1 }, OUTSIDE, { 0.0, 0.0, 0.0 } },
{ { -1.1, 1.1, 1.1 }, OUTSIDE, { 0.0, 0.0, 0.0 } },
{ { -1.1, -1.1, 1.1 }, OUTSIDE, { 0.0, 0.0, 0.0 } },
{ { 1.1, -1.1, 1.1 }, OUTSIDE, { 0.0, 0.0, 0.0 } },
{ { 1.1, 1.1, -1.1 }, OUTSIDE, { 0.0, 0.0, 0.0 } },
{ { -1.1, 1.1, -1.1 }, OUTSIDE, { 0.0, 0.0, 0.0 } },
{ { -1.1, -1.1, -1.1 }, OUTSIDE, { 0.0, 0.0, 0.0 } },
{ { 1.1, -1.1, -1.1 }, OUTSIDE, { 0.0, 0.0, 0.0 } },
// Add some directions to test special cases of edge/node intersection
{ { 0.5, 0.0, 0.0 }, INSIDE, { -1.0, 0.0, 0.0 } },
{ { 0.5, 0.0, 0.0 }, INSIDE, { 1.0, 0.0, 0.0 } },
{ { 0.0, 0.0, 2.0 }, OUTSIDE, { 0.0, 0.0, -1.0 } },
{ { 0.5, 0.0, -0.5 }, INSIDE, { -1.0, 0.0, 0.0 } },
{ { 0.5, -0.5, -2.0 }, OUTSIDE, { 0.0, 0.0, 1.0 } } };
// { { 1.0, 0.0, 0.0 }, BOUNDARY}, MCNP doesn't return on boundary
//{ {-1.0, 0.0, 0.0 }, BOUNDARY},
//{ { 0.0, 1.0, 0.0 }, BOUNDARY},
//{ { 0.0,-1.0, 0.0 }, BOUNDARY},
//{ { 0.0, 0.0, 0.0 }, BOUNDARY},
//{ { 0.0, 0.0,-1.0 }, BOUNDARY} };
const int num_test = sizeof( tests ) / sizeof( tests[0] );
ErrorCode rval;
Interface* moab = gqt->moab_instance();
Tag dim_tag = gqt->gttool()->get_geom_tag();
Range vols;
const int three = 3;
const void* ptr = &three;
rval = moab->get_entities_by_type_and_tag( 0, MBENTITYSET, &dim_tag, &ptr, 1, vols );CHKERR;
if( vols.size() != 2 )
{
std::cerr << "ERROR: Expected 2 volumes in input, found " << vols.size() << std::endl;
return MB_FAILURE;
}
const EntityHandle vol = vols.front();
for( int i = 0; i < num_test; ++i )
{
int result;
rval = gqt->point_in_volume( vol, tests[i].coords, result, tests[i].dir );CHKERR;
if( result != tests[i].result )
{
std::cerr << "ERROR testing point_in_volume[" << i << "]:" << std::endl
<< "\tExpected " << names[tests[i].result] << " for (" << tests[i].coords[0] << ", "
<< tests[i].coords[1] << ", " << tests[i].coords[2] << "). Got " << names[result] << std::endl;
return MB_FAILURE;
}
// point_in_volume_slow doesn't to boundary.
if( tests[i].result == BOUNDARY ) continue;
rval = gqt->point_in_volume_slow( vol, tests[i].coords, result );CHKERR;
if( result != tests[i].result )
{
std::cerr << "ERROR testing point_in_volume_slow[" << i << "]:" << std::endl
<< "\tExpected " << names[tests[i].result] << " for (" << tests[i].coords[0] << ", "
<< tests[i].coords[1] << ", " << tests[i].coords[2] << "). Got " << names[result] << std::endl;
return MB_FAILURE;
}
}
return MB_SUCCESS;
}
| ErrorCode test_ray_fire | ( | GeomQueryTool * | gqt | ) |
Definition at line 596 of file test_geom_gqt.cpp.
References moab::CartVect::array(), moab::Range::begin(), CHKERR, dim_tag, ray_fire::direction, ray_fire::distance, moab::Range::end(), ErrorCode, moab::Range::front(), moab::Interface::get_entities_by_type_and_tag(), moab::GeomTopoTool::get_geom_tag(), moab::GeomTopoTool::get_gid_tag(), moab::GeomQueryTool::gttool(), ray_fire::hit_surf, MB_SUCCESS, MBENTITYSET, moab::GeomQueryTool::moab_instance(), origin, ray_fire::origin, ray_fire::prev_surf, moab::GeomQueryTool::ray_fire(), ROOT2, moab::Range::size(), moab::Interface::tag_get_data(), and moab::GeomQueryTool::test_volume_boundary().
Referenced by run_regular_tests().
{
// Glancing ray-triangle intersections are not valid exit intersections.
// Piercing ray-triangle intersections are valid exit intersections.
// "0" destination surface implies that it is ambiguous.
const struct ray_fire tests[] = { /* src_srf origin direction dest dist */
// piercing edge
{ 1, { 0.0, 0.0, -1. }, { -1.0 / ROOT2, 0.0, 1.0 / ROOT2 }, 4, ROOT2 },
// piercing edge
{ 1, { 0.0, 0.0, -1. }, { 1.0 / ROOT2, 0.0, 1.0 / ROOT2 }, 2, ROOT2 },
// piercing edge
{ 1, { 0.0, 0.0, -1. }, { 0.0, 1.0 / ROOT2, 1.0 / ROOT2 }, 3, ROOT2 },
// piercing edge
{ 1, { 0.5, 0.5, -1. }, { 0.0, 0.0, 1.0 }, 6, 1.5 },
// interior
{ 2, { 1.0, 0.0, 0.5 }, { -1.0, 0.0, 0.0 }, 6, 0.5 },
// glancing node then piercing edge
{ 2, { 1.0, 0.0, 0.0 }, { -1.0, 0.0, 0.0 }, 4, 2.0 },
// piercing node
{ 1, { 0.0, 0.0, -1. }, { 0.0, 0.0, 1.0 }, 6, 1.0 },
// glancing edge then interior
{ 2, { 1.0, 0.0, 0.5 }, { -1.0 / ROOT2, 1.0 / ROOT2, 0.0 }, 3, ROOT2 } };
ErrorCode rval;
Interface* moab = gqt->moab_instance();
Tag dim_tag = gqt->gttool()->get_geom_tag();
Range surfs, vols;
const int two = 2, three = 3;
const void* ptrs[] = { &two, &three };
rval = moab->get_entities_by_type_and_tag( 0, MBENTITYSET, &dim_tag, ptrs, 1, surfs );CHKERR;
rval = moab->get_entities_by_type_and_tag( 0, MBENTITYSET, &dim_tag, ptrs + 1, 1, vols );CHKERR;
if( vols.size() != 2 )
{
std::cerr << "ERROR: Expected 2 volumes in input, found " << vols.size() << std::endl;
return MB_FAILURE;
}
if( surfs.size() != 6 )
{
std::cerr << "ERROR: Expected 6 surfaces in input, found " << surfs.size() << std::endl;
return MB_FAILURE;
}
int ids[6];
rval = moab->tag_get_data( gqt->gttool()->get_gid_tag(), surfs, ids );CHKERR;
EntityHandle surf[6];
std::copy( surfs.begin(), surfs.end(), surf );
const int num_test = sizeof( tests ) / sizeof( tests[0] );
for( int i = 0; i < num_test; ++i )
{
int* ptr = std::find( ids, ids + 6, tests[i].prev_surf );
int idx = ptr - ids;
if( idx >= 6 )
{
std::cerr << "Surface " << tests[i].prev_surf << " not found." << std::endl;
return MB_FAILURE;
}
// const EntityHandle src_surf = surf[idx];
ptr = std::find( ids, ids + 6, tests[i].hit_surf );
idx = ptr - ids;
if( idx >= 6 )
{
std::cerr << "Surface " << tests[i].hit_surf << " not found." << std::endl;
return MB_FAILURE;
}
const EntityHandle hit_surf = surf[idx];
double dist;
EntityHandle result;
GeomQueryTool::RayHistory history;
rval = gqt->ray_fire( vols.front(), tests[i].origin, tests[i].direction, result, dist, &history );
if( result != hit_surf || fabs( dist - tests[i].distance ) > 1e-6 )
{
EntityHandle* p = std::find( surf, surf + 6, result );
idx = p - surf;
int id = idx > 5 ? 0 : ids[idx];
std::cerr << "Rayfire test failed for " << std::endl
<< "\t ray from (" << tests[i].origin[0] << ", " << tests[i].origin[1] << ", "
<< tests[i].origin[2] << ") going [" << tests[i].direction[0] << ", " << tests[i].direction[1]
<< ", " << tests[i].direction[2] << "]" << std::endl
<< "\t Beginning on surface " << tests[i].prev_surf << std::endl
<< "\t Expected to hit surface " << tests[i].hit_surf << " after " << tests[i].distance
<< " units." << std::endl
<< "\t Actually hit surface " << id << " after " << dist << " units." << std::endl;
return MB_FAILURE;
}
CartVect loc = CartVect( tests[i].origin ) + ( dist * CartVect( tests[i].direction ) );
std::vector< std::pair< int, GeomQueryTool::RayHistory* > > boundary_tests;
boundary_tests.push_back( std::make_pair( 1, &history ) );
boundary_tests.push_back( std::make_pair( 0, &history ) );
boundary_tests.push_back( std::make_pair( 1, (GeomQueryTool::RayHistory*)NULL ) );
boundary_tests.push_back( std::make_pair( 0, (GeomQueryTool::RayHistory*)NULL ) );
for( unsigned int bt = 0; bt < boundary_tests.size(); ++bt )
{
int expected = boundary_tests[bt].first;
GeomQueryTool::RayHistory* h = boundary_tests[bt].second;
// pick the direction based on expected result of test. Either reuse the ray_fire
// vector, or reverse it to check for a vector that enters the cell
CartVect uvw( tests[i].direction );
if( expected == 1 ) uvw = -uvw;
int boundary_result = -1;
rval = gqt->test_volume_boundary( vols.front(), result, loc.array(), uvw.array(), boundary_result, h );
if( boundary_result != expected )
{
std::cerr << "DagMC::test_volume_boundary failed (" << ( ( expected == 0 ) ? "+" : "-" ) << " dir,"
<< ( ( h ) ? "+" : "-" ) << " history, i=" << i << ")" << std::endl;
return MB_FAILURE;
}
}
}
return MB_SUCCESS;
}
| ErrorCode test_surface_sense | ( | GeomQueryTool * | gqt | ) |
Definition at line 364 of file test_geom_gqt.cpp.
References moab::Range::begin(), CHKERR, dim_tag, moab::Range::end(), ErrorCode, moab::Range::front(), moab::Interface::get_entities_by_type_and_tag(), moab::GeomTopoTool::get_geom_tag(), moab::GeomTopoTool::get_sense(), moab::GeomQueryTool::gttool(), MB_SUCCESS, MBENTITYSET, moab::GeomQueryTool::moab_instance(), and moab::Range::size().
Referenced by run_regular_tests().
{
ErrorCode rval;
Interface* moab = gqt->moab_instance();
Tag dim_tag = gqt->gttool()->get_geom_tag();
Range surfs, vols;
const int two = 2, three = 3;
const void* ptrs[] = { &two, &three };
rval = moab->get_entities_by_type_and_tag( 0, MBENTITYSET, &dim_tag, ptrs, 1, surfs );CHKERR;
rval = moab->get_entities_by_type_and_tag( 0, MBENTITYSET, &dim_tag, ptrs + 1, 1, vols );CHKERR;
if( vols.size() != 2 )
{
std::cerr << "ERROR: Expected 2 volumes in input, found " << vols.size() << std::endl;
return MB_FAILURE;
}
if( surfs.size() != 6 )
{
std::cerr << "ERROR: Expected 6 surfaces in input, found " << surfs.size() << std::endl;
return MB_FAILURE;
}
for( Range::iterator i = surfs.begin(); i != surfs.end(); ++i )
{
int sense = 0;
rval = gqt->gttool()->get_sense( *i, vols.front(), sense );
if( MB_SUCCESS != rval || sense != 1 )
{
std::cerr << "ERROR: Expected 1 for surface sense, got " << sense << std::endl;
return MB_FAILURE;
}
}
return MB_SUCCESS;
}
| ErrorCode write_geometry | ( | const char * | output_file_name | ) |
Definition at line 56 of file test_geom_gqt.cpp.
References moab::Interface::add_entities(), moab::Interface::add_parent_child(), CHKERR, moab::Interface::create_element(), moab::Interface::create_meshset(), moab::Interface::create_vertex(), dim_tag, ErrorCode, GEOM_DIMENSION_TAG_NAME, moab::Interface::globalId_tag(), id_tag, MB_SUCCESS, MB_TAG_CREAT, MB_TAG_SPARSE, MB_TYPE_HANDLE, MB_TYPE_INTEGER, MBTRI, MESHSET_SET, moab::Interface::tag_get_handle(), moab::Interface::tag_set_data(), and moab::Interface::write_mesh().
Referenced by main().
{
ErrorCode rval;
Interface* moab = new Core();
// Define a 2x2x2 cube centered at orgin
// with concavity in +Z face.
const double coords[] = { 1, -1, -1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1,
1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 0, 0, 0 };
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, 8, 5, 6, 8, // +Z
6, 7, 8, 7, 4, 8 // +Z
};
const unsigned tris_per_surf[] = { 2, 2, 2, 2, 2, 4 };
// Create the geometry
const unsigned num_verts = sizeof( coords ) / ( 3 * sizeof( double ) );
const unsigned num_tris = sizeof( connectivity ) / ( 3 * sizeof( int ) );
const unsigned num_surfs = sizeof( tris_per_surf ) / sizeof( unsigned );
EntityHandle verts[num_verts], tris[num_tris], surfs[num_surfs];
for( unsigned i = 0; i < num_verts; ++i )
{
rval = moab->create_vertex( coords + 3 * i, verts[i] );CHKERR;
}
for( unsigned i = 0; i < num_tris; ++i )
{
const EntityHandle conn[] = { verts[connectivity[3 * i]], verts[connectivity[3 * i + 1]],
verts[connectivity[3 * i + 2]] };
rval = moab->create_element( MBTRI, conn, 3, tris[i] );CHKERR;
}
// create CAD topology
EntityHandle* tri_iter = tris;
for( unsigned i = 0; i < num_surfs; ++i )
{
rval = moab->create_meshset( MESHSET_SET, surfs[i] );CHKERR;
rval = moab->add_entities( surfs[i], tri_iter, tris_per_surf[i] );CHKERR;
tri_iter += tris_per_surf[i];
}
Tag dim_tag, id_tag, sense_tag;
rval = moab->tag_get_handle( GEOM_DIMENSION_TAG_NAME, 1, MB_TYPE_INTEGER, dim_tag, MB_TAG_SPARSE | MB_TAG_CREAT );CHKERR;
id_tag = moab->globalId_tag();
rval = moab->tag_get_handle( "GEOM_SENSE_2", 2, MB_TYPE_HANDLE, sense_tag, MB_TAG_SPARSE | MB_TAG_CREAT );CHKERR;
std::vector< int > dims( num_surfs, 2 );
rval = moab->tag_set_data( dim_tag, surfs, num_surfs, &dims[0] );CHKERR;
std::vector< int > ids( num_surfs );
for( size_t i = 0; i < ids.size(); ++i )
ids[i] = i + 1;
rval = moab->tag_set_data( id_tag, surfs, num_surfs, &ids[0] );CHKERR;
EntityHandle volume;
rval = moab->create_meshset( MESHSET_SET, volume );CHKERR;
for( unsigned i = 0; i < num_surfs; ++i )
{
rval = moab->add_parent_child( volume, surfs[i] );CHKERR;
}
std::vector< EntityHandle > senses( 2 * num_surfs, 0 );
for( size_t i = 0; i < senses.size(); i += 2 )
senses[i] = volume;
rval = moab->tag_set_data( sense_tag, surfs, num_surfs, &senses[0] );CHKERR;
const int three = 3;
const int one = 1;
rval = moab->tag_set_data( dim_tag, &volume, 1, &three );CHKERR;
rval = moab->tag_set_data( id_tag, &volume, 1, &one );CHKERR;
rval = moab->write_mesh( output_file_name );CHKERR;
delete moab;
return MB_SUCCESS;
}
| const double ROOT2 = 1.4142135623730951 |
Definition at line 24 of file test_geom_gqt.cpp.
Referenced by test_measure_area(), and test_ray_fire().