MOAB: Mesh Oriented datABase  (version 5.5.0)
MeshAssocPairSide.cpp
Go to the documentation of this file.
1 #include "MeshAssocPairSide.hpp"
2 
3 #include <cstring>
4 #include <sstream>
5 #include <string>
6 
7 #include <iMesh_extensions.h>
8 
9 #include "Lasso.hpp"
10 #include "iRel_Lasso.hpp"
11 
12 #define PROCESS_ERROR \
13  do \
14  { \
15  if( iBase_SUCCESS != result ) \
16  { \
17  char this_descr[120]; \
18  iMesh_getDescription( instance_, this_descr, 120 ); \
19  ERRORR( result, this_descr ); \
20  } \
21  } while( false )
22 
23 // Redefine LASSOI
24 #undef LASSOI
25 #define LASSOI lasso_instance( relation )
26 
27 static const char* GLOBAL_ID_TAG_NAME = "GLOBAL_ID";
28 static const char* MESH_DIMENSION_TAG_NAME = "GEOM_DIMENSION";
29 static const char* RELATION_TAG_NAME = "__MESH_ASSOCIATION";
30 
32  : relation( p_relation ), instance_( reinterpret_cast< iMesh_Instance >( p_instance ) ), id( p_id )
33 {
34  int result;
35 
37 
39  if( result == iBase_TAG_NOT_FOUND )
40  {
42  strlen( GLOBAL_ID_TAG_NAME ) );
43  }
44 
46  if( result == iBase_TAG_NOT_FOUND ) dim_tag = NULL;
47 }
48 
50 {
52 }
53 
55 {
56  return instance_;
57 }
58 
60 {
61  return iRel_IMESH_IFACE;
62 }
63 
65 {
66  int result;
67  std::stringstream ss;
68  ss << RELATION_TAG_NAME << id;
69  std::string rel_tag_name( ss.str() );
70 
71  iMesh_getTagHandle( instance_, rel_tag_name.c_str(), &relation_tag, &result, rel_tag_name.size() );
72  if( result == iBase_TAG_NOT_FOUND )
73  {
74  iMesh_createTag( instance_, rel_tag_name.c_str(), 1, iBase_ENTITY_HANDLE, &relation_tag, &result,
75  rel_tag_name.size() );
76  }
77 
80 }
81 
83 {
84  if( relation_tag )
85  {
86  int result;
87 
88  iMesh_destroyTag( instance_, relation_tag, true, &result );
89  relation_tag = NULL;
90 
92  }
94 }
95 
98  int* entities_alloc,
99  int* entities_size )
100 {
101  int this_type = ( dimension == -1 ? iBase_ALL_TYPES : dimension );
102  int result;
103 
104  iMesh_getEntities( instance_, 0, this_type, iMesh_ALL_TOPOLOGIES, entities, entities_alloc, entities_size,
105  &result );
108 }
109 
110 int MeshAssocPairSide::get_all_sets( iBase_EntitySetHandle** sets, int* sets_alloc, int* sets_size )
111 {
112  int result;
113 
114  iMesh_getEntSets( instance_, 0, 0, sets, sets_alloc, sets_size, &result );
117 }
118 
120  iBase_EntitySetHandle set_handle,
122  int* entities_alloc,
123  int* entities_size )
124 {
125  int this_type = ( dimension == -1 ? iBase_ALL_TYPES : dimension );
126  int result;
127 
128  iMesh_getEntities( instance_, set_handle, this_type, iMesh_ALL_TOPOLOGIES, entities, entities_alloc, entities_size,
129  &result );
132 }
133 
135  int entities_size,
136  int** ent_types,
137  int* ent_types_alloc,
138  int* ent_types_size )
139 {
140  int result;
141 
142  iMesh_getEntArrType( instance_, entities, entities_size, ent_types, ent_types_alloc, ent_types_size, &result );
145 }
146 
147 int MeshAssocPairSide::get_related_ents( iBase_EntityHandle** entities, int* entities_alloc, int* entities_size )
148 {
149  int result;
151  entities, entities_alloc, entities_size, &result );
154 }
155 
156 int MeshAssocPairSide::get_related_sets( iBase_EntitySetHandle** sets, int* sets_alloc, int* sets_size )
157 {
158  int result;
159  iMesh_getEntSetsByTagsRec( instance_, 0, &relation_tag, NULL, 1, false, sets, sets_alloc, sets_size, &result );
162 }
163 
164 int MeshAssocPairSide::get_relation_side( iBase_EntityHandle* entities, int num_entities, void* values )
165 {
166  int values_alloc = num_entities * sizeof( iBase_EntityHandle );
167  int values_size;
168  int result;
169 
170  iMesh_getArrData( instance_, entities, num_entities, relation_tag, &values, &values_alloc, &values_size, &result );
173 }
174 
175 int MeshAssocPairSide::get_relation_side( iBase_EntitySetHandle* sets, int num_sets, void* values )
176 {
177  char* data = static_cast< char* >( values );
178  int values_alloc = sizeof( iBase_EntityHandle );
179  int values_size;
180  int result;
181 
182  for( int i = 0; i < num_sets; i++ )
183  {
184  iMesh_getEntSetData( instance_, sets[i], relation_tag, reinterpret_cast< void** >( &data ), &values_alloc,
185  &values_size, &result );
186  data += values_size;
188  }
190 }
191 
192 int MeshAssocPairSide::set_relation_side( iBase_EntityHandle* entities, int num_entities, const void* values )
193 {
194  int result;
195 
196  iMesh_setArrData( instance_, entities, num_entities, relation_tag, static_cast< const char* >( values ),
197  num_entities * sizeof( iBase_EntityHandle ), &result );
200 }
201 
202 int MeshAssocPairSide::set_relation_side( iBase_EntitySetHandle* sets, int num_sets, const void* values )
203 {
204  const char* data = static_cast< const char* >( values );
205  int size = sizeof( iBase_EntityHandle );
206  int result;
207 
208  for( int i = 0; i < num_sets; i++ )
209  {
210  iMesh_setEntSetData( instance_, sets[i], relation_tag, data, size, &result );
211  data += size;
213  }
215 }
216 
218 {
219  int result;
220 
221  iMesh_rmvArrTag( instance_, entities, num_entities, relation_tag, &result );
224 }
225 
227 {
228  int result;
229 
230  for( int i = 0; i < num_sets; i++ )
231  {
232  iMesh_rmvEntSetTag( instance_, sets[i], relation_tag, &result );
234  }
235 
237 }
238 
240 {
241  int result;
242  int resilient = 0;
243  iMesh_initEntIter( instance_, set, iBase_ALL_TYPES, iMesh_ALL_TOPOLOGIES, resilient, iter, &result );
245 }
246 
247 int MeshAssocPairSide::get_gids( iBase_EntityHandle* entities, int num_entities, int* values )
248 {
249  int values_alloc = num_entities * sizeof( int );
250  int values_size;
251  int result;
252 
253  iMesh_getArrData( instance_, entities, num_entities, gid_tag, &values, &values_alloc, &values_size, &result );
256 }
257 
258 int MeshAssocPairSide::get_gids( iBase_EntitySetHandle* sets, int num_sets, int* values )
259 {
260  char* data = reinterpret_cast< char* >( values );
261  int values_alloc = sizeof( int );
262  int values_size;
263  int result;
264 
265  for( int i = 0; i < num_sets; i++ )
266  {
267  iMesh_getEntSetData( instance_, sets[i], gid_tag, reinterpret_cast< void** >( &data ), &values_alloc,
268  &values_size, &result );
269  data += values_size;
271  }
273 }
274 
275 int MeshAssocPairSide::get_dims( iBase_EntityHandle* entities, int num_entities, int* values )
276 {
277  int values_alloc = num_entities * sizeof( int );
278  int values_size;
279  int result;
280 
281  iMesh_getArrData( instance_, entities, num_entities, dim_tag, &values, &values_alloc, &values_size, &result );
284 }
285 
286 int MeshAssocPairSide::get_dims( iBase_EntitySetHandle* sets, int num_sets, int* values )
287 {
288  char* data = reinterpret_cast< char* >( values );
289  int values_alloc = sizeof( int );
290  int values_size;
291  int result;
292 
293  for( int i = 0; i < num_sets; i++ )
294  {
295  iMesh_getEntSetData( instance_, sets[i], dim_tag, reinterpret_cast< void** >( &data ), &values_alloc,
296  &values_size, &result );
297  data += values_size;
299  }
301 }