MOAB: Mesh Oriented datABase  (version 5.5.0)
test_entsetFB.cpp
Go to the documentation of this file.
1 #include "moab/MOABConfig.h"
2 #include "FBiGeom.h"
3 #include "iMesh.h"
4 #include "iRel.h"
5 
6 #include <cstdio>
7 #include <cstdlib>
8 #include <cstring>
9 
10 #define DEFAULT_TEST_FILE shell.h5m
11 #define DEFAULT_TEST_FILE1 shellQuad.h5m
12 
13 // clang-format off
14 
15 #define STRINGIFY_( X ) #X
16 #define STRINGIFY( X ) STRINGIFY_( X )
17 #if defined( MESHDIR ) && defined( MOAB_HAVE_HDF5 )
18 #define DEFAULT_INPUT_FILE STRINGIFY( MESHDIR/fbigeom/DEFAULT_TEST_FILE )
19 #define DEFAULT_INPUT_FILE1 STRINGIFY( MESHDIR/fbigeom/DEFAULT_TEST_FILE1 )
20 #else
21 #error Specify MESHDIR to compile test
22 #endif
23 
24 #define CHECK_SIZE_C( type, array, allocated_size, size ) \
25  if( NULL == *(array) || *(allocated_size) == 0 ) \
26  { \
27  *(array) = (type*)malloc( sizeof( type ) * (size) ); \
28  *(allocated_size) = size; \
29  } \
30  else if( *(allocated_size) < (size) ) \
31  { \
32  printf( " Array passed in is non-zero but too short.\n" ); \
33  }
34 
35 // clang-format on
36 
37 typedef void* iRel_EntityHandle;
38 
39 /*!
40  prints out a result string based on the value of error_code
41 */
42 void handle_error_code( const int result, int* number_failed, int* number_not_implemented, int* number_successful )
43 {
44  if( result )
45  {
46  printf( "Success" );
47  ( *number_successful )++;
48  }
49  else
50  {
51  printf( "Failure" );
52  ( *number_failed )++;
53  }
54 }
55 
57 {
58  /* print information about this entity */
59  int ent_type;
60  int result;
61  const char* type_names[] = { "Vertex", "Edge", "Face", "Region" };
62 
63  FBiGeom_getEntType( geom, gent, &ent_type, &result );
64 
65  if( iBase_SUCCESS != result )
66  {
67  printf( "Trouble getting entity adjacencies or types." );
68  return 0;
69  }
70 
71  printf( "%s 0x%lx\n", type_names[ent_type], (unsigned long)gent );
72 
73  return 1;
74 }
75 
77 {
78  /* print information about this entity */
79 
80  /* get adjacencies first; assume not more than 50 */
81  iBase_EntityHandle adj_ents[50], *adj_ents_ptr = adj_ents;
82  int ent_types[50], *ent_types_ptr = ent_types;
83  int adj_ents_alloc = 50, adj_ents_size, ent_types_size, ent_types_allocated = 50;
84  int result;
85  iBase_TagHandle* ment_tags = NULL;
86  int ment_tags_size, ment_tags_alloc;
87  char** tag_names;
88  int i;
89  const char* type_names[] = { "Vertex", "Edge", "Face", "Region" };
90  int tag_type;
91 
92  char* dum_handle = NULL;
93  int dum_handle_alloc = 0, dum_handle_size = 0;
94  int int_data;
95  double dbl_data;
96  iBase_EntityHandle eh_data;
97 
98  iMesh_getEntAdj( mesh, ment, iBase_ALL_TYPES, &adj_ents_ptr, &adj_ents_alloc, &adj_ents_size, &result );
99 
100  if( iBase_SUCCESS != result ) return 0;
101 
102  /* put this ent on the end, then get types */
103  adj_ents[adj_ents_size] = ment;
104  iMesh_getEntArrType( mesh, adj_ents, adj_ents_size + 1, &ent_types_ptr, &ent_types_allocated, &ent_types_size,
105  &result );
106  if( iBase_SUCCESS != result )
107  {
108  printf( "Trouble getting entity adjacencies or types." );
109  return 0;
110  }
111 
112  /* get tags on ment */
113  iMesh_getAllTags( mesh, ment, &ment_tags, &ment_tags_alloc, &ment_tags_size, &result );
114 
115  printf( "Trouble getting tags on an entity or their names." );
116 
117  /* while we're at it, get all the tag names */
118 
119  tag_names = (char**)malloc( ment_tags_size * sizeof( char* ) );
120 
121  for( i = 0; i < ment_tags_size; i++ )
122  {
123  tag_names[i] = (char*)malloc( 120 * sizeof( char ) );
124  iMesh_getTagName( mesh, ment_tags[i], tag_names[i], &result, 120 );
125  }
126 
127  /* now print the information */
128  printf( "%s %ld:\n", type_names[ent_types[ent_types_size - 1]], (long)ment );
129  printf( "Adjacencies:" );
130  for( i = 0; i < adj_ents_size; i++ )
131  {
132  if( i > 0 ) printf( ", " );
133  printf( "%s %ld", type_names[ent_types[i]], (long)adj_ents[i] );
134  }
135  printf( "\nTags: \n" );
136  for( i = 0; i < ment_tags_size; i++ )
137  {
138  printf( "%s ", tag_names[i] );
139  iMesh_getTagType( mesh, ment_tags[i], &tag_type, &result );
140  if( iBase_SUCCESS != result )
141  printf( "(trouble getting type...)\n" );
142  else
143  {
144  dum_handle = NULL;
145  dum_handle_alloc = 0, dum_handle_size = 0;
146 
147  switch( tag_type )
148  {
149  case iBase_INTEGER:
150  iMesh_getIntData( mesh, ment, ment_tags[i], &int_data, &result );
151  printf( "(Int value=%d)", int_data );
152  break;
153  case iBase_DOUBLE:
154  iMesh_getDblData( mesh, ment, ment_tags[i], &dbl_data, &result );
155  printf( "(Dbl value=%f)", dbl_data );
156  break;
157  case iBase_ENTITY_HANDLE:
158  iMesh_getEHData( mesh, ment, ment_tags[i], &eh_data, &result );
159  printf( "(EH value=%ld)", (long)eh_data );
160  break;
161  case iBase_BYTES:
162  iMesh_getData( mesh, ment, ment_tags[i], (void**)&dum_handle, &dum_handle_alloc, &dum_handle_size,
163  &result );
164  if( NULL != dum_handle && dum_handle_size > 0 ) printf( "(Opaque value=%c)", dum_handle[0] );
165  break;
166  }
167  }
168 
169  printf( "\n" );
170  }
171  printf( "(end tags)\n\n" );
172  free( ment_tags );
173  return 1;
174 }
175 
176 /*!
177  @test
178  Load Mesh
179  @li Load a geom and a mesh file
180 */
181 int load_geom_mesh_test( const char* geom_filename,
182  const char* mesh_filename,
185 {
186  /* load a geom */
187  int result;
188  FBiGeom_load( geom, geom_filename, 0, &result, strlen( geom_filename ), 0 );
189  if( iBase_SUCCESS != result )
190  {
191  printf( "ERROR : can not load a geometry\n" );
192  return 0;
193  }
194 
195  /* load a mesh */
196  iMesh_load( mesh, 0, mesh_filename, 0, &result, strlen( mesh_filename ), 0 );
197  if( iBase_SUCCESS != result )
198  {
199  printf( "ERROR : can not load a mesh\n" );
200  return 0;
201  }
202 
203  return 1;
204 }
205 
206 /*!
207  @test
208  TSTTLasso create relation Test
209  @li Create relation between geom and mesh
210 */
212 {
213  int result;
214 
215  iBase_Instance iface1, iface2;
216  int type1, type2;
217  int ent_or_set1, ent_or_set2;
218  int status1, status2;
219 
220  iRel_PairHandle tmp_pair;
221  iRel_PairHandle* pair_ptr = &tmp_pair;
222  int pairs_alloc = 1, pairs_size;
223 
224  /* create an relation, entity to set */
226  iRel_ACTIVE, pair, &result );
227  if( iBase_SUCCESS != result )
228  {
229  printf( "Couldn't create a new relation.\n" );
230  return 0;
231  }
232 
233  iRel_getPairInfo( assoc, *pair, &iface1, &ent_or_set1, &type1, &status1, &iface2, &ent_or_set2, &type2, &status2,
234  &result );
235  if( iBase_SUCCESS != result )
236  {
237  printf( "Couldn't retrieve relation info.\n" );
238  return 0;
239  }
240  if( iface1 != geom || ent_or_set1 != iRel_ENTITY || type1 != iRel_FBIGEOM_IFACE || iface2 != mesh ||
241  ent_or_set2 != iRel_SET || type2 != iRel_IMESH_IFACE )
242  {
243  printf( "Unexpected relation info returned.\n" );
244  return 0;
245  }
246 
247  iRel_findPairs( assoc, geom, &pair_ptr, &pairs_alloc, &pairs_size, &result );
248  if( iBase_SUCCESS != result )
249  {
250  printf( "Couldn't find relation pair when querying geom.\n" );
251  return 0;
252  }
253  if( pairs_size != 1 || tmp_pair != *pair )
254  {
255  printf( "Unexpected relation pairs returned when querying geom.\n" );
256  return 0;
257  }
258 
259  iRel_findPairs( assoc, mesh, &pair_ptr, &pairs_alloc, &pairs_size, &result );
260  if( iBase_SUCCESS != result )
261  {
262  printf( "Couldn't find relation pair when querying mesh.\n" );
263  return 0;
264  }
265  if( pairs_size != 1 || tmp_pair != *pair )
266  {
267  printf( "Unexpected relation pairs returned when querying mesh.\n" );
268  return 0;
269  }
270 
271  return 1;
272 }
273 
274 /*!
275  @test
276  TSTTLasso relate geom and mesh Test
277  @li Check relation between geom and mesh
278 */
280 {
281  /* relate geometry entities with coresponding mesh entity sets */
282  iBase_EntityHandle* gentities = NULL;
283  int gentities_size = 0, gentities_alloc = 0;
284  int result;
285 
286  iBase_EntitySetHandle* mentity_handles = NULL;
287  int mentity_handles_size = 0, mentity_handles_alloc = 0;
288 
289  const char* dim_tag_name = "GEOM_DIMENSION";
290  iBase_TagHandle dim_tag_mesh;
291 
292  iBase_EntitySetHandle* mentities_vec;
293  int mentities_vec_size;
294  int i;
295 
296  iBase_EntitySetHandle* out_mentities = NULL;
297  int out_mentities_size = 0, out_mentities_alloc = 0;
298 
299  iBase_EntitySetHandle* out_mentities2 = NULL;
300  int out_mentities2_size = 0, out_mentities2_alloc = 0;
301 
302  iBase_EntityHandle* out_gentities = NULL;
303  int out_gentities_size = 0, out_gentities_alloc = 0;
304 
305  FBiGeom_getEntities( geom, NULL, iBase_VERTEX, &gentities, &gentities_alloc, &gentities_size, &result );
306  if( iBase_SUCCESS != result )
307  {
308  printf( "Failed to get gentities by type in relate_geom_mesh_test.\n" );
309  return 0;
310  }
311 
312  iRel_inferEntArrRelations( assoc, pair, gentities, gentities_size, 0, &result );
313  if( iBase_SUCCESS != result )
314  {
315  printf( "Failed to relate geom entities in relate_geom_mesh_test.\n" );
316  return 0;
317  }
318 
319  /* relate coresponding mesh entity sets for geometry entities */
320  /* get 1-dimensional mesh entitysets */
321 
322  iMesh_getEntSets( mesh, NULL, 1, &mentity_handles, &mentity_handles_alloc, &mentity_handles_size, &result );
323  if( iBase_SUCCESS != result )
324  {
325  printf( "Problem to get all entity sets.\n" );
326  return 0;
327  }
328 
329  /* get geom dimension tags for mesh entitysets */
330  iMesh_createTag( mesh, dim_tag_name, 1, iBase_INTEGER, &dim_tag_mesh, &result, 15 );
331  if( iBase_SUCCESS != result && result != iBase_TAG_ALREADY_EXISTS )
332  {
333  printf( "Couldn't create geom dim tag for mesh entities.\n" );
334  return 0;
335  }
336 
337  /* get 1-dimensional mesh entitysets */
338  mentities_vec = (iBase_EntitySetHandle*)malloc( mentity_handles_size * sizeof( iBase_EntitySetHandle ) );
339  mentities_vec_size = 0;
340 
341  for( i = 0; i < mentity_handles_size; i++ )
342  {
343  int dim;
344  iMesh_getEntSetIntData( mesh, mentity_handles[i], dim_tag_mesh, &dim, &result );
345  if( iBase_SUCCESS != result ) continue;
346 
347  if( dim == 1 ) mentities_vec[mentities_vec_size++] = mentity_handles[i];
348  }
349 
350  iRel_inferSetArrRelations( assoc, pair, mentities_vec, mentities_vec_size, 1, &result );
351  if( iBase_SUCCESS != result )
352  {
353  printf( "Failed to relate mesh entities in relate_geom_mesh_test.\n" );
354  return 0;
355  }
356 
357  /* relate all geometry and mesh entities */
358  iRel_inferAllRelations( assoc, pair, &result );
359  if( iBase_SUCCESS != result )
360  {
361  printf( "Failed to relate all geom and mesh entities in relate_geom_mesh_test.\n" );
362  return 0;
363  }
364 
365  /* reset geom entities list and get all geom entities (prev
366  only vertices) */
367  free( gentities );
368  gentities = NULL;
369  gentities_alloc = 0;
370  FBiGeom_getEntities( geom, NULL, iBase_ALL_TYPES, &gentities, &gentities_alloc, &gentities_size, &result );
371  if( iBase_SUCCESS != result )
372  {
373  printf( "Failed to get gentities by type in relate_geom_mesh_test.\n" );
374  return 0;
375  }
376 
377  /* get related mesh entity sets for geometry entities */
378  iRel_getEntArrSetArrRelation( assoc, pair, gentities, gentities_size, 0, &out_mentities, &out_mentities_alloc,
379  &out_mentities_size, &result );
380  if( iBase_SUCCESS != result )
381  {
382  printf( "Failed to get geom entities in relate_geom_mesh_test.\n" );
383  return 0;
384  }
385 
386  if( out_mentities_size != gentities_size )
387  {
388  printf( "Number of input geom entities and output mesh entity sets should be same\n" );
389  return 0;
390  }
391 
392  /* now try deleting this relation */
393  iRel_rmvEntArrRelation( assoc, pair, gentities, gentities_size, 0, &result );
394  if( iBase_SUCCESS != result )
395  {
396  printf( "Failed to remove relation in relate_geom_mesh_test.\n" );
397  return 0;
398  }
399  iRel_getEntArrSetArrRelation( assoc, pair, gentities, gentities_size, 0, &out_mentities2, &out_mentities2_alloc,
400  &out_mentities2_size, &result );
401  if( iBase_SUCCESS == result )
402  {
403  printf( "Shouldn't have gotten mesh sets in relate_geom_mesh_test.\n" );
404  return 0;
405  }
406 
407  /* restore the relation, since we need it later */
408  iRel_setEntArrSetArrRelation( assoc, pair, gentities, gentities_size, out_mentities, out_mentities_size, &result );
409  if( iBase_SUCCESS != result )
410  {
411  printf( "Failed to restore relation in relate_geom_mesh_test.\n" );
412  return 0;
413  }
414 
415  /* get related geometry entities for mesh entity sets */
416  iRel_getSetArrEntArrRelation( assoc, pair, out_mentities, out_mentities_size, 1, &out_gentities,
417  &out_gentities_alloc, &out_gentities_size, &result );
418  if( iBase_SUCCESS != result )
419  {
420  printf( "Failed to get mesh entities in relate_geom_mesh_test.\n" );
421  return 0;
422  }
423 
424  if( out_mentities_size != out_gentities_size )
425  {
426  printf( "Number of input mesh entity sets and output geom entities should be same\n" );
427  return 0;
428  }
429  free( mentity_handles );
430  mentity_handles = NULL;
431  free( gentities );
432  gentities = NULL;
433  free( mentity_handles );
434  mentity_handles = NULL;
435  free( out_mentities );
436  out_mentities = NULL;
437  free( mentities_vec );
438  mentities_vec = NULL;
439  free( out_gentities );
440  out_gentities = NULL;
441  return 1;
442 }
443 
444 /*!
445  @test
446  TSTTAssoc move to test
447  @li Move meshes onto the given geometry
448 */
450 {
451  /* get all the geom entities, and find relation to some mesh entity */
452  iBase_EntityHandle* gentities = NULL;
453  int gentities_size = 0, gentities_alloc = 0;
454  int result;
455 
456  iBase_EntitySetHandle* out_mentities = NULL;
457  int out_mentities_size, out_mentities_alloc = 0;
458 
459  char descr[120];
460  int i;
461  int is_list;
462 
463  iBase_EntityHandle* out_gentities = NULL;
464  int out_gentities_size, out_gentities_alloc = 0;
465 
466  FBiGeom_getEntities( geom, NULL, iBase_ALL_TYPES, &gentities, &gentities_alloc, &gentities_size, &result );
467  if( iBase_SUCCESS != result )
468  {
469  printf( "Problem getting all geom entities.\n" );
470  return 0;
471  }
472 
473  iRel_getEntArrSetArrRelation( assoc, pair, gentities, gentities_size, 0, &out_mentities, &out_mentities_alloc,
474  &out_mentities_size, &result );
475  /* might not all be */
476  if( iBase_SUCCESS != result )
477  {
478  printf( "Failed to get mesh entities related to geom entities in query_relations_test.\n" );
479 
480  iRel_getDescription( assoc, descr, sizeof( descr ) - 1 );
481  printf( "Entities missing relations: %s\n", descr );
482 
483  for( i = 0; i < gentities_size; i++ )
484  {
485  print_geom_info( geom, gentities[i] );
486  }
487 
488  return 0;
489  }
490 
491  /* check that they're all non-null */
492  if( out_mentities_size != gentities_size )
493  {
494  printf( "Number of mesh & related geom entities don't match.\n" );
495  return 0;
496  }
497 
498  /* check to make sure they're mesh sets; how to do that? */
499  for( i = 0; i < out_mentities_size; i++ )
500  {
501  iMesh_isList( mesh, (iBase_EntitySetHandle)out_mentities[i], &is_list, &result );
502  if( iBase_SUCCESS != result )
503  {
504  printf( "Entity set returned from classification wasn't valid.\n" );
505  return 0;
506  }
507  }
508 
509  /* now turn around and check classification of those mesh entities */
510  iRel_getSetArrEntArrRelation( assoc, pair, out_mentities, out_mentities_size, 1, &out_gentities,
511  &out_gentities_alloc, &out_gentities_size, &result );
512  if( iBase_SUCCESS != result )
513  {
514  printf( "Failed to get geom entities related to mesh entities in query_relations_test.\n" );
515  return 0;
516  }
517 
518  /* check that they're all non-null */
519  if( out_mentities_size != out_gentities_size )
520  {
521  printf( "Number of geom & related mesh entities don't match.\n" );
522  return 0;
523  }
524 
525  free( gentities );
526  gentities = NULL;
527  free( out_mentities );
528  out_mentities = NULL;
529  free( out_gentities );
530  out_gentities = NULL;
531  /* ok, we're done */
532  return 1;
533 }
534 
535 int main( int argc, char* argv[] )
536 {
537  /* Check command line arg */
538  const char* geom_filename = DEFAULT_INPUT_FILE;
539  const char* mesh_filename = DEFAULT_INPUT_FILE1;
540 
541  int result;
542  int number_tests = 0;
543  int number_tests_successful = 0;
544  int number_tests_not_implemented = 0;
545  int number_tests_failed = 0;
546 
549  iRel_Instance assoc;
550  iRel_PairHandle pair;
551 
552  if( argc == 2 && !strcmp( argv[1], "-h" ) )
553  {
554  printf( "Usage: %s <geom_filename> <mesh_filename>\n", argv[0] );
555  return 1;
556  }
557  else if( argc == 2 )
558  {
559  geom_filename = argv[1];
560  mesh_filename = argv[1];
561  }
562  else if( argc == 3 )
563  {
564  geom_filename = argv[1];
565  mesh_filename = argv[2];
566  }
567 
568  /* initialize the Geometry */
569  FBiGeom_newGeom( 0, &geom, &result, 0 );
570 
571  /* initialize the Mesh */
572  iMesh_newMesh( 0, &mesh, &result, 0 );
573 
574  /* initialize the Associate */
575  iRel_create( 0, &assoc, &result, 0 );
576 
577  /* Print out Header information */
578  printf( "\n\niRel TEST PROGRAM:\n\n" );
579 
580  /* load_geom_mesh test */
581  printf( " load_geom_mesh: " );
582  result = load_geom_mesh_test( geom_filename, mesh_filename, geom, mesh );
583  handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful );
584  number_tests++;
585  printf( "\n" );
586 
587  /* create_relation test */
588  printf( " create_relation: " );
589  result = create_relation_test( assoc, geom, mesh, &pair );
590  handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful );
591  number_tests++;
592  printf( "\n" );
593 
594  /* relate_geom_mesh test */
595  printf( " relate_geom_mesh: " );
596  result = relate_geom_mesh_test( assoc, geom, mesh, pair );
597  handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful );
598  number_tests++;
599  printf( "\n" );
600 
601  /* query_relations test */
602  printf( " query_relations: " );
603  result = query_relations_test( assoc, geom, mesh, pair );
604  handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful );
605  number_tests++;
606  printf( "\n" );
607 
608  /* summary */
609 
610  printf( "\niRel TEST SUMMARY: \n" );
611  printf( " Number Tests: %d\n", number_tests );
612  printf( " Number Successful: %d\n", number_tests_successful );
613  printf( " Number Not Implemented: %d\n", number_tests_not_implemented );
614  printf( " Number Failed: %d\n", number_tests_failed );
615  printf( "\n\n" );
616 
617  iRel_destroy( assoc, &result );
618  iMesh_dtor( mesh, &result );
619  FBiGeom_dtor( geom, &result );
620 
621  return number_tests_failed != 0;
622 }