MOAB: Mesh Oriented datABase
(version 5.4.1)
|
00001 #include "TestUtil.hpp" 00002 #include "moab/Core.hpp" 00003 #include "moab/BoundBox.hpp" 00004 #include "moab/ScdInterface.hpp" 00005 00006 using namespace moab; 00007 00008 #include <iostream> 00009 00010 //! test add_entities, get_entities, num_entities 00011 void test_bound_box(); 00012 00013 int main() 00014 { 00015 int err = 0; 00016 00017 err += RUN_TEST( test_bound_box ); 00018 00019 if( !err ) 00020 printf( "ALL TESTS PASSED\n" ); 00021 else 00022 printf( "%d TESTS FAILED\n", err ); 00023 00024 return err; 00025 } 00026 00027 void test_bound_box() 00028 { 00029 BoundBox box; 00030 CartVect vec( 0.0 ); 00031 double tol = 0.0; 00032 std::vector< double > vals( 6, 0.0 ); 00033 BoundBox other_box( &vals[0] ); 00034 00035 // test for contains point failure 00036 bool result = box.contains_point( vec.array(), tol ); 00037 CHECK( !result ); 00038 result = box.intersects_box( other_box, tol ); 00039 CHECK( !result ); 00040 00041 box = other_box; 00042 tol = 1.0e-10; 00043 00044 // test for success 00045 result = box.contains_point( &vals[0], tol ); 00046 CHECK( result ); 00047 result = box.intersects_box( other_box, tol ); 00048 CHECK( result ); 00049 00050 // check update functions 00051 CartVect three( 3.0 ); 00052 box.update_max( three.array() ); 00053 result = box.contains_point( three.array(), tol ); 00054 CHECK( result ); 00055 result = box.contains_point( ( three * 1.1 ).array(), tol ); 00056 CHECK( !result ); 00057 result = box.intersects_box( BoundBox( three, three ), tol ); 00058 CHECK( result ); 00059 result = box.intersects_box( BoundBox( 1.1 * three, 3.0 * three ), tol ); 00060 CHECK( !result ); 00061 00062 CartVect negthree( -3.0 ); 00063 box.update_min( negthree.array() ); 00064 result = box.contains_point( negthree.array(), tol ); 00065 CHECK( result ); 00066 result = box.contains_point( ( negthree * 1.1 ).array(), tol ); 00067 CHECK( !result ); 00068 result = box.intersects_box( BoundBox( negthree, negthree ), tol ); 00069 CHECK( result ); 00070 result = box.intersects_box( BoundBox( 3.0 * negthree, 1.1 * negthree ), tol ); 00071 CHECK( !result ); 00072 00073 for( int i = 0; i < 3; i++ ) 00074 { 00075 vals[i] = -4.0; 00076 vals[3 + i] = 4.0; 00077 } 00078 box.update( &vals[0] ); 00079 result = box.contains_point( &vals[0], tol ); 00080 CHECK( result ); 00081 result = box.contains_point( ( CartVect( &vals[0] ) * 1.1 ).array(), tol ); 00082 CHECK( !result ); 00083 result = box.intersects_box( BoundBox( &vals[0] ), tol ); 00084 CHECK( result ); 00085 result = box.intersects_box( BoundBox( 1.2 * CartVect( &vals[0] ), 1.1 * CartVect( &vals[0] ) ), tol ); 00086 CHECK( !result ); 00087 00088 // check length functions 00089 tol = 1.0e-6; 00090 00091 // box should be 8 on a side, or 3*(2^3)^2 or 192 for diag length squared 00092 double diagsq = box.diagonal_squared(); 00093 CHECK_REAL_EQUAL( diagsq, 192.0, tol ); 00094 double diag = box.diagonal_length(); 00095 CHECK_REAL_EQUAL( diag, sqrt( 3.0 ) * 8.0, tol ); 00096 00097 // check distance function 00098 00099 // face-centered 00100 vals[0] = vals[1] = 0.0; 00101 vals[2] = 6.0; 00102 double dist = box.distance_squared( CartVect( &vals[0] ).array() ); 00103 CHECK_REAL_EQUAL( dist, 4.0, tol ); 00104 dist = box.distance( CartVect( &vals[0] ).array() ); 00105 CHECK_REAL_EQUAL( dist, 2.0, tol ); 00106 00107 // edge-centered 00108 vals[0] = 0.0; 00109 vals[1] = vals[2] = 6.0; 00110 dist = box.distance_squared( CartVect( &vals[0] ).array() ); 00111 CHECK_REAL_EQUAL( dist, 8.0, tol ); 00112 dist = box.distance( CartVect( &vals[0] ).array() ); 00113 CHECK_REAL_EQUAL( dist, sqrt( 8.0 ), tol ); 00114 00115 // vertex-centered 00116 vals[0] = vals[1] = vals[2] = 6.0; 00117 dist = box.distance_squared( CartVect( &vals[0] ).array() ); 00118 CHECK_REAL_EQUAL( dist, 12.0, tol ); 00119 dist = box.distance( CartVect( &vals[0] ).array() ); 00120 CHECK_REAL_EQUAL( dist, sqrt( 12.0 ), tol ); 00121 00122 // check entity-based functions 00123 Core mb; 00124 ScdInterface* scdi; 00125 ErrorCode rval = mb.query_interface( scdi );CHECK_ERR( rval ); 00126 ScdBox* scd_box; 00127 // create a 10x10x10 box 00128 rval = scdi->construct_box( HomCoord( 0, 0, 0 ), HomCoord( 10, 10, 10 ), NULL, 0, scd_box );CHECK_ERR( rval ); 00129 00130 EntityHandle vert = scd_box->start_vertex(), elem = scd_box->start_element(); 00131 rval = box.update( mb, vert );CHECK_ERR( rval ); 00132 rval = mb.get_coords( &vert, 1, &vals[0] );CHECK_ERR( rval ); 00133 tol = 1.0e-10; 00134 result = box.contains_point( &vals[0], tol ); 00135 CHECK( result ); 00136 rval = box.update( mb, elem );CHECK_ERR( rval ); 00137 rval = mb.get_coords( &elem, 1, &vals[0] );CHECK_ERR( rval ); 00138 result = box.contains_point( &vals[0], tol ); 00139 CHECK( result ); 00140 00141 Range all_elems( elem, elem + scd_box->num_elements() - 1 ); 00142 rval = box.update( mb, all_elems );CHECK_ERR( rval ); 00143 CartVect center; 00144 box.compute_center( center ); 00145 tol = 1.0e-6; 00146 CHECK_REAL_EQUAL( ( center - CartVect( 5.0, 5.0, 5.0 ) ).length(), 0.0, tol ); 00147 }