MOAB: Mesh Oriented datABase
(version 5.4.1)
|
00001 #include <iostream> 00002 #include "moab/Interface.hpp" 00003 #ifndef IS_BUILDING_MB 00004 #define IS_BUILDING_MB 00005 #endif 00006 #include "TestUtil.hpp" 00007 #include "Internals.hpp" 00008 #include "moab/Core.hpp" 00009 #include "moab/GeomQueryTool.hpp" 00010 00011 #include "moab/GeomTopoTool.hpp" 00012 #include "moab/GeomQueryTool.hpp" 00013 00014 using namespace moab; 00015 00016 Interface* MBI; 00017 GeomTopoTool* GTT; 00018 GeomQueryTool* GQT; 00019 00020 #define CHKERR( A ) \ 00021 do \ 00022 { \ 00023 if( MB_SUCCESS != ( A ) ) \ 00024 { \ 00025 std::cerr << "Failure (error code " << ( A ) << ") at " __FILE__ ":" << __LINE__ << std::endl; \ 00026 return A; \ 00027 } \ 00028 } while( false ) 00029 00030 const std::string input_file = TestDir + "unittest/test_geom.h5m"; 00031 00032 double eps = 1.0e-6; 00033 00034 void gqt_setup_test() 00035 { 00036 MBI = new Core(); 00037 ErrorCode rval = MBI->load_file( input_file.c_str() );CHECK_ERR( rval ); 00038 GTT = new GeomTopoTool( MBI ); 00039 GQT = new GeomQueryTool( GTT ); 00040 rval = GQT->initialize();CHECK_ERR( rval ); 00041 } 00042 00043 void gqt_origin_face_rayfire() 00044 { 00045 int vol_idx = 1; 00046 EntityHandle vol_h = GQT->gttool()->entity_by_id( 3, vol_idx ); 00047 double dir[3] = { -1.0, 0.0, 0.0 }; 00048 double origin[3] = { 0.0, 0.0, 0.0 }; 00049 double next_surf_dist; 00050 EntityHandle next_surf; 00051 GQT->ray_fire( vol_h, origin, dir, next_surf, next_surf_dist ); 00052 double expected_next_surf_dist = 5.0; 00053 CHECK_REAL_EQUAL( expected_next_surf_dist, next_surf_dist, eps ); 00054 } 00055 00056 void gqt_outside_face_rayfire() 00057 { 00058 int vol_idx = 1; 00059 EntityHandle vol_h = GQT->gttool()->entity_by_id( 3, vol_idx ); 00060 double dir[3] = { 1.0, 0.0, 0.0 }; // ray along x direction 00061 double origin[3] = { -10.0, 0.0, 0.0 }; // origin at -10 0 0 00062 double next_surf_dist; 00063 EntityHandle next_surf; 00064 GQT->ray_fire( vol_h, origin, dir, next_surf, next_surf_dist ); 00065 std::cout << next_surf_dist << std::endl; 00066 double expected_next_surf_dist = 15.0; 00067 CHECK_REAL_EQUAL( expected_next_surf_dist, next_surf_dist, eps ); 00068 } 00069 00070 void gqt_outside_face_rayfire_orient_exit() 00071 { 00072 GeomQueryTool::RayHistory history; 00073 int vol_idx = 1; 00074 EntityHandle vol_h = GQT->gttool()->entity_by_id( 3, vol_idx ); 00075 double dir[3] = { 1.0, 0.0, 0.0 }; // ray along x direction 00076 double origin[3] = { -10.0, 0.0, 0.0 }; // origin at -10 0 0 00077 double next_surf_dist; 00078 EntityHandle next_surf; 00079 GQT->ray_fire( vol_h, origin, dir, next_surf, next_surf_dist, &history, 0, 1 ); 00080 std::cout << next_surf_dist << std::endl; 00081 double expected_next_surf_dist = 15.0; 00082 CHECK_REAL_EQUAL( expected_next_surf_dist, next_surf_dist, eps ); 00083 } 00084 00085 void gqt_outside_face_rayfire_orient_entrance() 00086 { 00087 GeomQueryTool::RayHistory history; 00088 int vol_idx = 1; 00089 EntityHandle vol_h = GQT->gttool()->entity_by_id( 3, vol_idx ); 00090 double dir[3] = { 1.0, 0.0, 0.0 }; // ray along x direction 00091 double origin[3] = { -10.0, 0.0, 0.0 }; // origin at -10 0 0 00092 double next_surf_dist; 00093 EntityHandle next_surf; 00094 GQT->ray_fire( vol_h, origin, dir, next_surf, next_surf_dist, &history, 0.0, -1 ); 00095 std::cout << next_surf_dist << std::endl; 00096 double expected_next_surf_dist = 5.0; 00097 CHECK_REAL_EQUAL( expected_next_surf_dist, next_surf_dist, eps ); 00098 } 00099 00100 void gqt_outside_face_rayfire_history_fail() 00101 { 00102 GeomQueryTool::RayHistory history; 00103 int vol_idx = 1; 00104 EntityHandle vol_h = GQT->gttool()->entity_by_id( 3, vol_idx ); 00105 double dir[3] = { 1.0, 0.0, 0.0 }; // ray along x direction 00106 double origin[3] = { -10.0, 0.0, 0.0 }; // origin at -10 0 0 00107 double xyz[3]; 00108 double next_surf_dist; 00109 EntityHandle next_surf; 00110 00111 history.reset(); 00112 00113 // ray fired exactly along boundary shared by 2 facets on a single surface, 00114 // needs two ray_fires to cross, this is expected and ok 00115 00116 // first ray fire with history 00117 GQT->ray_fire( vol_h, origin, dir, next_surf, next_surf_dist, &history, 0, 1 ); 00118 // second ray fire with history 00119 GQT->ray_fire( vol_h, xyz, dir, next_surf, next_surf_dist, &history, 0, 1 ); 00120 // this fire should hit graveyard, i.e. next_surf = 0 00121 GQT->ray_fire( vol_h, xyz, dir, next_surf, next_surf_dist, &history, 0, 1 ); 00122 00123 // using history with this geom, there should be no next surface, i.e. 0 00124 EntityHandle ZERO = 0; 00125 CHECK_EQUAL( ZERO, next_surf ); 00126 } 00127 00128 void gqt_outside_face_rayfire_history() 00129 { 00130 GeomQueryTool::RayHistory history; 00131 int vol_idx = 1; 00132 EntityHandle vol_h = GQT->gttool()->entity_by_id( 3, vol_idx ); 00133 double dir[3] = { 1.0, 0.0, 0.0 }; // ray along x direction 00134 double origin[3] = { -10.0, 0.0, 0.0 }; // origin at -10 0 0 00135 double xyz[3]; 00136 double next_surf_dist; 00137 EntityHandle next_surf; 00138 00139 history.reset(); 00140 // first ray fire with history 00141 GQT->ray_fire( vol_h, origin, dir, next_surf, next_surf_dist, &history, 0, 1 ); 00142 std::cout << next_surf << " " << history.size() << std::endl; 00143 // second ray fire with history 00144 00145 xyz[0] = origin[0] + ( next_surf_dist * dir[0] ); 00146 xyz[1] = origin[1] + ( next_surf_dist * dir[1] ); 00147 xyz[2] = origin[2] + ( next_surf_dist * dir[2] ); 00148 00149 // ray fired execacyl 00150 00151 GQT->ray_fire( vol_h, xyz, dir, next_surf, next_surf_dist, &history, 0, 1 ); 00152 00153 GQT->ray_fire( vol_h, xyz, dir, next_surf, next_surf_dist, &history, 0, 1 ); 00154 00155 // using history with this geom, there should be no next surface, i.e. 0 00156 EntityHandle ZERO = 0; 00157 CHECK_EQUAL( ZERO, next_surf ); 00158 } 00159 00160 int main( int /* argc */, char** /* argv */ ) 00161 { 00162 int result = 0; 00163 00164 result += RUN_TEST( gqt_setup_test ); // setup problem 00165 // rays fired along cardinal directions 00166 result += RUN_TEST( gqt_origin_face_rayfire ); // point in centre 00167 result += RUN_TEST( gqt_outside_face_rayfire ); 00168 result += RUN_TEST( gqt_outside_face_rayfire_orient_exit ); // fire ray from point outside volume 00169 // looking for exit intersections 00170 result += RUN_TEST( gqt_outside_face_rayfire_orient_entrance ); // fire ray from point outside volume 00171 // looking for entrance intersection 00172 result += RUN_TEST( gqt_outside_face_rayfire_history_fail ); // fire ray from point outside 00173 // geometry using ray history 00174 result += RUN_TEST( gqt_outside_face_rayfire_history ); // fire ray from point outside geometry 00175 // using ray history 00176 00177 delete GQT; 00178 delete GTT; 00179 delete MBI; 00180 00181 return result; 00182 }