1 
2 #include <iostream>
3 #include "moab/Interface.hpp"
4 #ifndef IS_BUILDING_MB
5 #define IS_BUILDING_MB
6 #endif
7 #include "TestUtil.hpp"
8 #include "Internals.hpp"
9 #include "moab/Core.hpp"
10 #include "MBTagConventions.hpp"
11 #include "moab/GeomTopoTool.hpp"
12 #include "InitCGMA.hpp"
13 #include "GeometryQueryTool.hpp"
14 #include "CGMConfig.h"
15 
16 #define SENSE_FORWARD 1
17 #define SENSE_REVERSE -1
18 #define SENSE_UNKNOWN 0
19 using namespace moab;
20 
21 #define CHKERR(A) do { if (MB_SUCCESS != (A)) { \
22   std::cerr << "Failure (error code " << (A) << ") at " __FILE__ ":" \
23             << __LINE__ << std::endl; \
24   return A; } } while(false)
25 
26 
27 #ifdef HAVE_OCC_STEP
28 std::string input_cylcube = TestDir + "/io/cylcube.stp";
29 #else
30 std::string input_cylcube = TestDir + "/io/cylcube.sat";
31 #endif
32 
33 // Function used to load the test file
34 void read_file( Interface* moab, const char* input_file );
35 
36 // Functions containing known sense data
37 ErrorCode load_sat_curve_sense_data( Interface* moab, EntityHandle curve,  std::vector<int>& surf_ids_out, std::vector<int>& senses_out );
38 ErrorCode load_stp_curve_sense_data( Interface* moab, EntityHandle curve,  std::vector<int>& surf_ids_out, std::vector<int>& senses_out );
39 ErrorCode load_precgm14_stp_curve_sense_data( Interface* moab, EntityHandle curve,  std::vector<int>& surf_ids_out, std::vector<int>& senses_out );
40 ErrorCode load_sat_surf_sense_data( Interface* moab, EntityHandle surf, std::vector<int>& vol_ids_out, std::vector<int>& senses_out );
41 ErrorCode load_stp_surf_sense_data( Interface* moab, EntityHandle surf, std::vector<int>& vol_ids_out, std::vector<int>& senses_out );
42 ErrorCode load_precgm14_stp_surf_sense_data( Interface* moab, EntityHandle surf, std::vector<int>& vol_ids_out, std::vector<int>& senses_out );
43 
44 // Functions used to compare sense information found in
45 // the model to reference information
46 void check_sense_data( Interface* moab, std::vector<EntityHandle> wrt_ents, std::vector<int> senses,
47                              std::vector<int> known_wrt_ids, std::vector<int> known_senses );
48 
49 //Function used to get id's from entity handles
50 int geom_id_by_handle( Interface* moab, const EntityHandle set );
51 
52 // List of tests in this file
53 void read_cylcube_curve_senses_test();
54 void read_cylcube_surf_senses_test();
55 void delete_mesh_test();
56 
57 
main(int,char **)58 int main(int /* argc */, char** /* argv */)
59 {
60   int result = 0;
61 
62   result += RUN_TEST(read_cylcube_surf_senses_test);
63   result += RUN_TEST(read_cylcube_curve_senses_test);
64 
65   return result;
66 }
67 
68 
read_file(Interface * moab,const char * input_file)69 void read_file( Interface* moab, const char* input_file )
70 {
71   InitCGMA::initialize_cgma();
72   GeometryQueryTool::instance()->delete_geometry();
73 
74   ErrorCode rval = moab->load_file( input_file );
75   CHECK_ERR(rval);
76 }
77 
78 // Gets the sense data for each curve from a file
79 // containing a cube and a cylinder. It then checks
80 // that this sense data matches the reference
81 // sense data from prior file reads.
read_cylcube_curve_senses_test()82 void read_cylcube_curve_senses_test()
83 {
84   ErrorCode rval;
85   //Open the test file
86   Core moab;
87   Interface* mb = &moab;
88   read_file( mb, input_cylcube.c_str() );
89 
90   //Get all curve handles
91   Tag geom_tag;
92   rval = mb->tag_get_handle( GEOM_DIMENSION_TAG_NAME, 1,
93 			MB_TYPE_INTEGER, geom_tag, moab::MB_TAG_DENSE|moab::MB_TAG_CREAT );
94   CHECK_ERR(rval);
95 
96   // Check that the proper number of curves exist
97   int dim = 1;
98   void *val[] = {&dim};
99   int number_of_curves;
100   rval = mb->get_number_entities_by_type_and_tag( 0, MBENTITYSET, &geom_tag,
101     					          val, 1, number_of_curves );
102   CHECK_ERR(rval);
103   //Step format adds a surface on the barrel of the cylinder.
104   //This created 4 extra surfaces in comparison to the .sat format from Cubit.
105   //(New surface breaks the barrel of the cylinder into two half-pipes)
106 #ifdef HAVE_OCC_STEP
107   CHECK_EQUAL( 18, number_of_curves );
108 #else
109   CHECK_EQUAL( 14, number_of_curves );
110 #endif
111 
112   //Get curve handles
113   Range curves;
114   rval = mb->get_entities_by_type_and_tag( 0, MBENTITYSET, &geom_tag,
115 	  					    val, 1, curves );
116   CHECK_ERR(rval);
117 
118   // Establish GeomTopoTool instance needed to get curve data
119   moab::GeomTopoTool gt( mb, false );
120   // Initialize vectors for sense checking
121   std::vector<EntityHandle> surfs;
122   std::vector<int> senses;
123   std::vector<int> known_surf_ids;
124   std::vector<int> known_senses;
125 
126 for(unsigned int i = 0; i < curves.size() ; i++)
127   {
128 
129    //Clean data from previous curve
130    surfs.clear();
131    senses.clear();
132    //Get sense info for the current curve
133    rval = gt.get_senses( curves[i], surfs, senses );
134    CHECK_ERR(rval);
135 
136    //Clear reference data from previous curve
137    known_surf_ids.clear();
138    known_senses.clear();
139    //Load known curve-sense ID data
140 #ifdef HAVE_OCC_STEP
141    if (CGM_MAJOR_VERSION >= 14)
142    {
143      rval = load_stp_curve_sense_data( mb, curves[i], known_surf_ids, known_senses );
144    }
145    else
146    {
147      rval = load_precgm14_stp_curve_sense_data( mb, curves[i], known_surf_ids, known_senses );
148    }
149    CHECK_ERR(rval);
150 #else
151    rval = load_sat_curve_sense_data( mb, curves[i], known_surf_ids, known_senses );
152    CHECK_ERR(rval);
153 #endif
154 
155    //Check that each surf and sense has a match in the references
156    check_sense_data( mb, surfs, senses, known_surf_ids, known_senses);
157   }
158 }
159 
160 
geom_id_by_handle(Interface * moab,const EntityHandle set)161 int geom_id_by_handle( Interface* moab, const EntityHandle set )
162 {
163 
164     ErrorCode rval;
165     //Get the id_tag handle
166     Tag id_tag;
167     rval = moab->tag_get_handle( GLOBAL_ID_TAG_NAME, 1, MB_TYPE_INTEGER, id_tag, moab::MB_TAG_DENSE );
168     CHECK_ERR(rval);
169     //Load the ID for the EntHandle given to the function
170     int id;
171     rval = moab->tag_get_data( id_tag, &set, 1, &id );
172     CHECK_ERR(rval);
173     return id;
174  }
175 
check_sense_data(Interface * moab,std::vector<EntityHandle> wrt_ents,std::vector<int> senses,std::vector<int> known_wrt_ids,std::vector<int> known_senses)176 void check_sense_data( Interface* moab, std::vector<EntityHandle> wrt_ents, std::vector<int> senses,
177                              std::vector<int> known_wrt_ids, std::vector<int> known_senses )
178 {
179 
180   //Get ID's of the wrt entities
181   std::vector<int> wrt_ent_ids;
182   for(unsigned int i=0 ; i<wrt_ents.size() ; i++)
183   {
184       wrt_ent_ids.push_back( geom_id_by_handle( moab, wrt_ents[i] ) );
185   }
186 
187   for(unsigned int i=0; i< wrt_ent_ids.size() ; i++)
188   {
189      for(unsigned int j=0; j< known_wrt_ids.size(); j++)
190      {
191        if( wrt_ent_ids[i] == known_wrt_ids [j] )
192          {
193           // Make sure the senses of the matching wrt entities
194           // are correct
195           CHECK_EQUAL( senses[i], known_senses[j] );
196           //Once a wrt entity is matched with a known entity,
197           // remove it from the list
198           wrt_ent_ids.erase( wrt_ent_ids.begin()+i );
199           senses.erase( senses.begin()+i );
200           --i;
201           break;
202          }
203      }
204   }
205 
206   // After both loops are complete, known_wrt_ents should be empty
207   int leftovers = wrt_ent_ids.size();
208   CHECK_EQUAL( leftovers, 0 );
209 
210 }
211 
212 //Loads two vectors with reference curve and curve_sense data
load_sat_curve_sense_data(Interface * moab,EntityHandle curve,std::vector<int> & surf_ids_out,std::vector<int> & senses_out)213 ErrorCode load_sat_curve_sense_data( Interface* moab, EntityHandle curve, std::vector<int>& surf_ids_out, std::vector<int>& senses_out )
214 {
215 
216   int curve_id = geom_id_by_handle( moab, curve );
217   switch(curve_id)
218   {
219     case 1:
220           surf_ids_out.push_back(1); surf_ids_out.push_back(6);
221           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
222           break;
223 
224     case 2:
225           surf_ids_out.push_back(1); surf_ids_out.push_back(5);
226           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
227           break;
228 
229     case 3:
230           surf_ids_out.push_back(1); surf_ids_out.push_back(4);
231           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
232           break;
233 
234     case 4:
235           surf_ids_out.push_back(1); surf_ids_out.push_back(3);
236           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
237           break;
238 
239     case 5:
240           surf_ids_out.push_back(2); surf_ids_out.push_back(6);
241           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
242           break;
243 
244     case 6:
245           surf_ids_out.push_back(2); surf_ids_out.push_back(3);
246           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
247           break;
248 
249     case 7:
250           surf_ids_out.push_back(2); surf_ids_out.push_back(4);
251           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
252           break;
253 
254     case 8:
255           surf_ids_out.push_back(2); surf_ids_out.push_back(5);
256           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
257           break;
258 
259     case 9:
260           surf_ids_out.push_back(3); surf_ids_out.push_back(4);
261           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
262           break;
263 
264     case 10:
265           surf_ids_out.push_back(3); surf_ids_out.push_back(6);
266           senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
267           break;
268 
269     case 11:
270           surf_ids_out.push_back(4); surf_ids_out.push_back(5);
271           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
272           break;
273 
274     case 12:
275           surf_ids_out.push_back(5); surf_ids_out.push_back(6);
276           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
277           break;
278 
279     case 13:
280       surf_ids_out.push_back(7); surf_ids_out.push_back(8);
281       senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
282       break;
283 
284     case 14:
285       surf_ids_out.push_back(7); surf_ids_out.push_back(9);
286       senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
287       break;
288     default:
289           return MB_FAILURE;
290 
291   }
292   return MB_SUCCESS;
293 }
294 
295 //Loads two vectors with reference curve and curve_sense data
load_stp_curve_sense_data(Interface * moab,EntityHandle curve,std::vector<int> & surf_ids_out,std::vector<int> & senses_out)296 ErrorCode load_stp_curve_sense_data( Interface* moab, EntityHandle curve, std::vector<int>& surf_ids_out, std::vector<int>& senses_out )
297 {
298 
299   int curve_id = geom_id_by_handle( moab, curve );
300   switch(curve_id)
301   {
302     case 1:
303           surf_ids_out.push_back(1); surf_ids_out.push_back(6);
304           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_FORWARD);
305           break;
306 
307     case 2:
308           surf_ids_out.push_back(1); surf_ids_out.push_back(5);
309           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_FORWARD);
310           break;
311 
312     case 3:
313           surf_ids_out.push_back(1); surf_ids_out.push_back(4);
314           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_FORWARD);
315           break;
316 
317     case 4:
318           surf_ids_out.push_back(1); surf_ids_out.push_back(3);
319           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_FORWARD);
320           break;
321 
322     case 5:
323           surf_ids_out.push_back(2); surf_ids_out.push_back(6);
324           senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
325           break;
326 
327     case 6:
328           surf_ids_out.push_back(2); surf_ids_out.push_back(5);
329           senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
330           break;
331 
332     case 7:
333           surf_ids_out.push_back(2); surf_ids_out.push_back(4);
334           senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
335           break;
336 
337     case 8:
338           surf_ids_out.push_back(2); surf_ids_out.push_back(3);
339           senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
340           break;
341 
342     case 9:
343           surf_ids_out.push_back(3); surf_ids_out.push_back(4);
344           senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
345           break;
346 
347     case 10:
348           surf_ids_out.push_back(3); surf_ids_out.push_back(6);
349           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
350           break;
351 
352     case 11:
353           surf_ids_out.push_back(4); surf_ids_out.push_back(5);
354           senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
355           break;
356 
357     case 12:
358           surf_ids_out.push_back(5); surf_ids_out.push_back(6);
359           senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
360           break;
361 
362     case 13:
363       surf_ids_out.push_back(7); surf_ids_out.push_back(8);
364       senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
365       break;
366 
367     case 14:
368       surf_ids_out.push_back(7); surf_ids_out.push_back(9);
369       senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
370       break;
371     case 15:
372       surf_ids_out.push_back(7); surf_ids_out.push_back(8);
373       senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
374       break;
375     case 16:
376       surf_ids_out.push_back(7); surf_ids_out.push_back(10);
377       senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
378       break;
379     case 17:
380       surf_ids_out.push_back(8); surf_ids_out.push_back(10);
381       senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
382       break;
383     case 18:
384       surf_ids_out.push_back(8); surf_ids_out.push_back(9);
385       senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
386       break;
387     default:
388           return MB_FAILURE;
389 
390   }
391   return MB_SUCCESS;
392 }
393 
load_precgm14_stp_curve_sense_data(Interface * moab,EntityHandle curve,std::vector<int> & surf_ids_out,std::vector<int> & senses_out)394 ErrorCode load_precgm14_stp_curve_sense_data( Interface* moab, EntityHandle curve, std::vector<int>& surf_ids_out, std::vector<int>& senses_out )
395 {
396 
397   int curve_id = geom_id_by_handle( moab, curve );
398   switch(curve_id)
399   {
400     case 1:
401           surf_ids_out.push_back(1); surf_ids_out.push_back(6);
402           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
403           break;
404 
405     case 2:
406           surf_ids_out.push_back(1); surf_ids_out.push_back(5);
407           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
408           break;
409 
410     case 3:
411           surf_ids_out.push_back(1); surf_ids_out.push_back(4);
412           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
413           break;
414 
415     case 4:
416           surf_ids_out.push_back(1); surf_ids_out.push_back(3);
417           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
418           break;
419 
420     case 5:
421           surf_ids_out.push_back(2); surf_ids_out.push_back(6);
422           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
423           break;
424 
425     case 6:
426           surf_ids_out.push_back(2); surf_ids_out.push_back(3);
427           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
428           break;
429 
430     case 7:
431           surf_ids_out.push_back(2); surf_ids_out.push_back(4);
432           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
433           break;
434 
435     case 8:
436           surf_ids_out.push_back(2); surf_ids_out.push_back(5);
437           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
438           break;
439 
440     case 9:
441           surf_ids_out.push_back(3); surf_ids_out.push_back(4);
442           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
443           break;
444 
445     case 10:
446           surf_ids_out.push_back(3); surf_ids_out.push_back(6);
447           senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
448           break;
449 
450     case 11:
451           surf_ids_out.push_back(4); surf_ids_out.push_back(5);
452           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
453           break;
454 
455     case 12:
456           surf_ids_out.push_back(5); surf_ids_out.push_back(6);
457           senses_out.push_back(SENSE_FORWARD); senses_out.push_back(SENSE_REVERSE);
458           break;
459 
460     case 13:
461       surf_ids_out.push_back(7); surf_ids_out.push_back(8);
462       senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
463       break;
464 
465     case 14:
466       surf_ids_out.push_back(7); surf_ids_out.push_back(9);
467       senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
468       break;
469     case 15:
470       surf_ids_out.push_back(7); surf_ids_out.push_back(8);
471       senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
472       break;
473     case 16:
474       surf_ids_out.push_back(7); surf_ids_out.push_back(10);
475       senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
476       break;
477     case 17:
478       surf_ids_out.push_back(8); surf_ids_out.push_back(10);
479       senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
480       break;
481     case 18:
482       surf_ids_out.push_back(8); surf_ids_out.push_back(9);
483       senses_out.push_back(SENSE_REVERSE); senses_out.push_back(SENSE_FORWARD);
484       break;
485     default:
486           return MB_FAILURE;
487 
488   }
489   return MB_SUCCESS;
490 }
491 
492 // SURFACE SENSE CHECKING
493 // Gets the sense data for each surface from a file
494 // containing a cube and a cylinder. It then checks
495 // that this sense data matches the reference
496 // sense data from prior file reads.
read_cylcube_surf_senses_test()497 void read_cylcube_surf_senses_test()
498 {
499   ErrorCode rval;
500   //Open the test file
501   Core moab;
502   Interface* mb = &moab;
503   read_file( mb, input_cylcube.c_str() );
504 
505   //Get geometry tag for gathering surface information from the mesh
506   Tag geom_tag;
507   rval = mb->tag_get_handle( GEOM_DIMENSION_TAG_NAME, 1, MB_TYPE_INTEGER,
508                              geom_tag, moab::MB_TAG_DENSE|moab::MB_TAG_CREAT );
509   CHECK_ERR(rval);
510 
511   // Check that the proper number of surfaces exist
512   int dim = 2;
513   void *val[] = {&dim};
514   int number_of_surfs;
515   rval = mb->get_number_entities_by_type_and_tag( 0, MBENTITYSET, &geom_tag,
516 	  					    val, 1, number_of_surfs );
517   CHECK_ERR(rval);
518   //Step format adds a surface on barrel of the cylinder.
519   // (Breaks it into two half-pipes)
520 #ifdef HAVE_OCC_STEP
521   CHECK_EQUAL( 10, number_of_surfs );
522 #else
523   CHECK_EQUAL( 9, number_of_surfs );
524 #endif
525   // Get surface handles
526   Range surfs;
527   rval = mb->get_entities_by_type_and_tag( 0, MBENTITYSET, &geom_tag,
528 	  					    val, 1, surfs );
529   CHECK_ERR(rval);
530 
531   // Establish GeomTopoTool instance needed to get surf data
532   moab::GeomTopoTool gt( mb, false );
533   std::vector<EntityHandle> vols;
534   std::vector<int> senses;
535   std::vector<int> known_vol_ids;
536   std::vector<int> known_senses;
537 
538 for(unsigned int i = 0; i < surfs.size(); i++)
539   {
540    //Clean data from previous surface
541    vols.clear();
542    senses.clear();
543    // Get sense information for the current
544    // surface from the mesh
545    rval = gt.get_senses( surfs[i], vols, senses );
546    CHECK_ERR(rval);
547    //Clear previous reverence data
548    known_vol_ids.clear();
549    known_senses.clear();
550    // Load known surface-volume data
551    // for this surface and check that it's correct
552 #ifdef HAVE_OCC_STEP
553    if (CGM_MAJOR_VERSION >= 14)
554    {
555      rval = load_stp_surf_sense_data( mb, surfs[i], known_vol_ids, known_senses );
556    }
557    else
558    {
559      rval = load_precgm14_stp_surf_sense_data( mb, surfs[i], known_vol_ids, known_senses );
560    }
561    CHECK_ERR(rval);
562 #else
563    rval = load_sat_surf_sense_data( mb, surfs[i], known_vol_ids, known_senses );
564    CHECK_ERR(rval);
565 #endif
566    // Check sense information from the loaded mesh against
567    // reference sense information
568    check_sense_data( mb, vols, senses, known_vol_ids, known_senses );
569 
570   }
571 
572 }
573 
574 //Loads reference surface to volume sense data into the reference vectors
load_sat_surf_sense_data(Interface * moab,EntityHandle surf,std::vector<int> & vol_ids_out,std::vector<int> & senses_out)575 ErrorCode load_sat_surf_sense_data( Interface* moab, EntityHandle surf, std::vector<int>& vol_ids_out, std::vector<int>& senses_out ){
576 
577   int surf_id = geom_id_by_handle( moab, surf );
578   switch(surf_id)
579   {
580     case 1:
581           vol_ids_out.push_back(1);
582           senses_out.push_back(SENSE_FORWARD);
583           break;
584 
585     case 2:
586           vol_ids_out.push_back(1);
587           senses_out.push_back(SENSE_FORWARD);
588           break;
589 
590     case 3:
591           vol_ids_out.push_back(1);
592           senses_out.push_back(SENSE_FORWARD);
593           break;
594 
595     case 4:
596           vol_ids_out.push_back(1);
597           senses_out.push_back(SENSE_FORWARD);
598           break;
599 
600     case 5:
601           vol_ids_out.push_back(1);
602           senses_out.push_back(SENSE_FORWARD);
603           break;
604 
605     case 6:
606           vol_ids_out.push_back(1);
607           senses_out.push_back(SENSE_FORWARD);
608           break;
609 
610     case 7:
611           vol_ids_out.push_back(2);
612           senses_out.push_back(SENSE_FORWARD);
613           break;
614 
615     case 8:
616           vol_ids_out.push_back(2);
617           senses_out.push_back(SENSE_FORWARD);
618           break;
619 
620     case 9:
621           vol_ids_out.push_back(2);
622           senses_out.push_back(SENSE_FORWARD);
623           break;
624     default:
625           return MB_FAILURE;
626 
627    }
628   return MB_SUCCESS;
629 }
630 
631 //Loads reference surface to volume sense data into the reference vectors
load_stp_surf_sense_data(Interface * moab,EntityHandle surf,std::vector<int> & vol_ids_out,std::vector<int> & senses_out)632 ErrorCode load_stp_surf_sense_data( Interface* moab, EntityHandle surf, std::vector<int>& vol_ids_out, std::vector<int>& senses_out ){
633 
634   int surf_id = geom_id_by_handle( moab, surf );
635   switch(surf_id)
636   {
637     case 1:
638           vol_ids_out.push_back(1);
639           senses_out.push_back(SENSE_FORWARD);
640           break;
641 
642     case 2:
643           vol_ids_out.push_back(1);
644           senses_out.push_back(SENSE_REVERSE);
645           break;
646 
647     case 3:
648           vol_ids_out.push_back(1);
649           senses_out.push_back(SENSE_REVERSE);
650           break;
651 
652     case 4:
653           vol_ids_out.push_back(1);
654           senses_out.push_back(SENSE_REVERSE);
655           break;
656 
657     case 5:
658           vol_ids_out.push_back(1);
659           senses_out.push_back(SENSE_REVERSE);
660           break;
661 
662     case 6:
663           vol_ids_out.push_back(1);
664           senses_out.push_back(SENSE_REVERSE);
665           break;
666 
667     case 7:
668           vol_ids_out.push_back(2);
669           senses_out.push_back(SENSE_FORWARD);
670           break;
671 
672     case 8:
673           vol_ids_out.push_back(2);
674           senses_out.push_back(SENSE_FORWARD);
675           break;
676 
677     case 9:
678           vol_ids_out.push_back(2);
679           senses_out.push_back(SENSE_FORWARD);
680           break;
681 
682     case 10:
683           vol_ids_out.push_back(2);
684           senses_out.push_back(SENSE_FORWARD);
685           break;
686     default:
687       std::cout << "Failure to find surface sense reference data. Returning failure..." << std::endl;
688           return MB_FAILURE;
689    }
690   return MB_SUCCESS;
691 }
692 
693 //Loads reference surface to volume sense data into the reference vectors
load_precgm14_stp_surf_sense_data(Interface * moab,EntityHandle surf,std::vector<int> & vol_ids_out,std::vector<int> & senses_out)694 ErrorCode load_precgm14_stp_surf_sense_data( Interface* moab, EntityHandle surf, std::vector<int>& vol_ids_out, std::vector<int>& senses_out ){
695 
696   int surf_id = geom_id_by_handle( moab, surf );
697   switch(surf_id)
698   {
699     case 1:
700     case 2:
701     case 3:
702     case 4:
703     case 5:
704     case 6:
705           vol_ids_out.push_back(1);
706           senses_out.push_back(SENSE_FORWARD);
707           break;
708 
709     case 7:
710     case 8:
711     case 9:
712     case 10:
713           vol_ids_out.push_back(2);
714           senses_out.push_back(SENSE_FORWARD);
715           break;
716 
717     default:
718       std::cout << "Failure to find surface sense reference data. Returning failure..." << std::endl;
719           return MB_FAILURE;
720    }
721   return MB_SUCCESS;
722 }
723