MOAB: Mesh Oriented datABase  (version 5.5.0)
dagmc_simple_test.cpp
Go to the documentation of this file.
1 #include <iostream>
2 #include "moab/Interface.hpp"
3 #ifndef IS_BUILDING_MB
4 #define IS_BUILDING_MB
5 #endif
6 #include "TestUtil.hpp"
7 #include "Internals.hpp"
8 #include "moab/Core.hpp"
9 
10 #include "DagMC.hpp"
11 
12 using namespace moab;
13 
14 using moab::DagMC;
15 
16 DagMC* DAG;
17 
18 #define CHKERR( A ) \
19  do \
20  { \
21  if( MB_SUCCESS != ( A ) ) \
22  { \
23  std::cerr << "Failure (error code " << ( A ) << ") at " __FILE__ ":" << __LINE__ << std::endl; \
24  return A; \
25  } \
26  } while( false )
27 
28 const std::string input_file = TestDir + "unittest/test_geom.h5m";
29 
31 {
32  ErrorCode rval = DAG->load_file( input_file.c_str() ); // open the Dag file
33  CHECK_ERR( rval );
34 }
35 
37 {
38  /* 1 - Test with external moab, load file in DAGMC*/
39  // make new moab core
40  Core* mbi = new moab::Core();
41  // make new dagmc into that moab
42  DagMC* dagmc = new moab::DagMC( mbi );
43 
44  ErrorCode rval;
45  // load a file
46  rval = dagmc->load_file( input_file.c_str() );CHECK_ERR( rval );
47 
48  // delete dagmc
49  delete dagmc;
50  delete mbi;
51 }
52 
54 {
55  /* 2 - Test with external moab, load file in MOAB*/
56  // load the file into moab rather than dagmc
57  ErrorCode rval;
58 
59  moab::Core* mbi = new moab::Core();
60  rval = mbi->load_file( input_file.c_str() );CHECK_ERR( rval );
61  moab::DagMC* dagmc = new moab::DagMC( mbi );
62  rval = dagmc->load_existing_contents();CHECK_ERR( rval );
63 
64  // delete dagmc;
65  delete dagmc;
66  delete mbi;
67 }
68 
70 {
71  /* 3 - Test with internal moab, load file in DAG*/
72  // make new dagmc into that moab
73  ErrorCode rval;
74 
75  moab::DagMC* dagmc = new moab::DagMC();
76  // load a file
77  rval = dagmc->load_file( input_file.c_str() );CHECK_ERR( rval );
78  delete dagmc;
79 }
80 
82 {
83  /* 1 - Test with external moab, load file in DAGMC*/
84  // make new moab core
85  ErrorCode rval;
86 
87  moab::Core* mbi = new moab::Core();
88  // make new dagmc into that moab
89  DagMC* dagmc = new moab::DagMC( mbi );
90 
91  // load a file
92  rval = dagmc->load_file( input_file.c_str() );CHECK_ERR( rval );
93  rval = dagmc->init_OBBTree();CHECK_ERR( rval );
94  // delete dagmc
95  delete dagmc;
96  delete mbi;
97 }
98 
100 {
101  /* 2 - Test with external moab, load file in MOAB*/
102  // load the file into moab rather than dagmc
103  ErrorCode rval;
104 
105  moab::Core* mbi = new moab::Core();
106  rval = mbi->load_file( input_file.c_str() );CHECK_ERR( rval );
107  moab::DagMC* dagmc = new moab::DagMC( mbi );
108  rval = dagmc->load_existing_contents();CHECK_ERR( rval );
109  rval = dagmc->init_OBBTree();CHECK_ERR( rval );
110 
111  // delete dagmc;
112  delete dagmc;
113  delete mbi;
114 }
115 
117 {
118  /* 3 - Test with internal moab, load file in DAG*/
119  // make new dagmc into that moab
120  ErrorCode rval;
121 
122  moab::DagMC* dagmc = new moab::DagMC();
123  // load a file
124  rval = dagmc->load_file( input_file.c_str() );CHECK_ERR( rval );
125  rval = dagmc->init_OBBTree();CHECK_ERR( rval );
126  delete dagmc;
127 }
128 
130 {
131  // make new dagmc
132  std::cout << "test_obb_retreval" << std::endl;
133 
134  DagMC* dagmc = new moab::DagMC();
135 
136  ErrorCode rval;
137  // load a file
138  rval = dagmc->load_file( input_file.c_str() );CHECK_ERR( rval );
139  rval = dagmc->init_OBBTree();CHECK_ERR( rval );
140 
141  // write the file
142  rval = dagmc->write_mesh( "fcad", 4 );
143 
144  // now remove the dagmc instance a
145  delete dagmc;
146 
147  dagmc = new moab::DagMC();
148  rval = dagmc->load_file( "fcad" );CHECK_ERR( rval );
149  rval = dagmc->init_OBBTree();CHECK_ERR( rval );
150 
151  // delete the fcad file
152  remove( "fcad" );
153  delete dagmc;
154 }
155 
157 {
158  ErrorCode rval = DAG->init_OBBTree();CHECK_ERR( rval );
159 }
160 
162 {
163  int expect_num_vols = 2;
164  int num_vols = DAG->num_entities( 3 );
165  CHECK_EQUAL( expect_num_vols, num_vols );
166 }
167 
169 {
170  /*
171  int num_vols = DAG->num_entities(3);
172  EntityHandle vol_h;
173  for (int i = 0; i < num_vols; i++)
174  vol_h = DAG->entity_by_index(3, i);
175  */
176  // EntityHandle expect_vol_h = 12682136550675316765;
177  // CHECK_EQUAL(expect_vol_h, vol_h);
178 }
179 
181 {
182  int result = 0;
183  int expect_result = 1;
184  int vol_idx = 1;
185  double xyz[3] = { 0.0, 0.0, 0.0 };
186  EntityHandle vol_h = DAG->entity_by_index( 3, vol_idx );
187  ErrorCode rval = DAG->point_in_volume( vol_h, xyz, result );CHECK_ERR( rval );
188  CHECK_EQUAL( expect_result, result );
189 }
190 
192 {
193  // make new dagmc
194  std::cout << "test_obb_retreval and ray_fire" << std::endl;
195 
196  DagMC* dagmc = new moab::DagMC();
197 
198  ErrorCode rval;
199  // load a file
200  rval = dagmc->load_file( input_file.c_str() );CHECK_ERR( rval );
201  rval = dagmc->init_OBBTree();CHECK_ERR( rval );
202 
203  // write the file
204  rval = dagmc->write_mesh( "fcad", 4 );
205 
206  // now remove the dagmc instance a
207  delete dagmc;
208 
209  // now create new DAGMC
210  dagmc = new moab::DagMC();
211  rval = dagmc->load_file( "fcad" );CHECK_ERR( rval );
212  rval = dagmc->init_OBBTree();CHECK_ERR( rval );
213 
214  // delete the fcad file
215  remove( "fcad" );
216 
217  // now perform full ray fire
218  double eps = 1.e-6;
219  int vol_idx = 1;
220  // note model is cube of side 10, centred at 0,0,0, so ray fire along
221  // any unit direction should be exactly 5.0
222  double xyz[3] = { 0.0, 0.0, 0.0 };
223  double dir[3] = { 0.0, 0.0, 1.0 };
224  EntityHandle next_surf;
225  double next_surf_dist;
226  double expect_next_surf_dist = 5.0;
227  EntityHandle vol_h = DAG->entity_by_index( 3, vol_idx );
228 
229  rval = DAG->ray_fire( vol_h, xyz, dir, next_surf, next_surf_dist );CHECK_ERR( rval );
230  CHECK_REAL_EQUAL( expect_next_surf_dist, next_surf_dist, eps );
231  delete dagmc;
232 }
233 
235 {
236  const double eps = 1e-6; // epsilon for test, faceting tol?
237 
238  int vol_idx = 1;
239  // note model is cube of side 10, centred at 0,0,0, so ray fire along
240  // any unit direction should be exactly 5.0
241  double xyz[3] = { 0.0, 0.0, 0.0 };
242  double dir[3] = { 0.0, 0.0, 1.0 };
243  EntityHandle next_surf;
244  double next_surf_dist;
245  double expect_next_surf_dist = 5.0;
246  EntityHandle vol_h = DAG->entity_by_index( 3, vol_idx );
247 
248  ErrorCode rval = DAG->ray_fire( vol_h, xyz, dir, next_surf, next_surf_dist );CHECK_ERR( rval );
249  CHECK_REAL_EQUAL( expect_next_surf_dist, next_surf_dist, eps );
250 }
251 
253 {
254  const double eps = 1e-6; // epsilon for test, faceting tol?
255 
256  int vol_idx = 1;
257  // note model is cube of side 10, centred at 0,0,0, so ray fire along
258  // any unit direction should be exactly 5.0
259  double xyz[3] = { -6.0, 0.0, 0.0 };
260  double distance; // distance from point to nearest surface
261  double expect_distance = 1.0;
262  EntityHandle vol_h = DAG->entity_by_index( 3, vol_idx );
263 
264  ErrorCode rval = DAG->closest_to_location( vol_h, xyz, distance );CHECK_ERR( rval );
265  // distance should be 1.0 cm
266  CHECK_REAL_EQUAL( expect_distance, distance, eps );
267 }
268 
270 {
271  int vol_idx = 1;
272  EntityHandle vol_h = DAG->entity_by_index( 3, vol_idx );
273  int surf_idx = 1;
274  EntityHandle surf_h = DAG->entity_by_index( 2, surf_idx );
275 
276  double xyz[3] = { 0.0, 0.0, 5.0 };
277  double dir[3] = { 0.0, 0.0, 1.0 };
278  int result;
279  int expect_result = 0;
280 
281  ErrorCode rval = DAG->test_volume_boundary( vol_h, surf_h, xyz, dir, result );CHECK_ERR( rval );
282  // check ray leaving volume
283  CHECK_EQUAL( expect_result, result );
284 }
285 
286 int main( int /* argc */, char** /* argv */ )
287 {
288  int result = 0;
289 
290  DAG = new moab::DagMC();
291 
292  result += RUN_TEST( dagmc_load_file ); // test ray fire
293  result += RUN_TEST( dagmc_build_obb ); // build the obb
294  result += RUN_TEST( dagmc_num_vols ); // make sure the num of vols correct
295  result += RUN_TEST( dagmc_load_file_dagmc ); //
301  result += RUN_TEST( dagmc_test_obb_retreval ); // check that we are retreving loaded obbs
302  result += RUN_TEST( dagmc_test_obb_retreval_rayfire ); // check that we can ray fire on loaded obbs
303  result += RUN_TEST( dagmc_point_in ); // check entity by point
304  result += RUN_TEST( dagmc_rayfire ); // ensure ray fire distance is correct
305  result += RUN_TEST( dagmc_closest_to ); // check the distance to surface nearest point
306  result += RUN_TEST( dagmc_test_boundary ); // check particle entering leaving
307 
308  delete DAG;
309 
310  return result;
311 }