Mesh Oriented datABase  (version 5.5.0)
An array-based unstructured mesh library
makeops.cpp
Go to the documentation of this file.
1 /*
2  * Program to make hex modification operation meshes
3  *
4  */
5 
6 #include "moab/Core.hpp"
7 #include "moab/Range.hpp"
8 #include <iostream>
9 
10 using namespace moab;
11 
12 Interface* gMB = NULL;
13 
17 static ErrorCode make_chord_push();
20 
22 {
29  UNDEFINED
30 };
31 
32 const char* OperationNames[] = { "atomic_pillow", "face_open_collapse", "face_shrink", "chord_push",
33  "triple_chord_push", "triple_hex_push", "undefined" };
34 
35 int main( int argc, char** argv )
36 {
37  gMB = new Core();
38  const char* extensions[] = { ".g", ".h5m", ".vtk" };
39  int file_exten = 1;
40 
41  std::vector< OperationType > op_types;
42 
43  if( argc < 2 )
44  {
45  std::cout << "Usage: " << argv[0] << " [-h5m] [-vtk] {-ap | -foc | -fs | -cp | -tcp | -thp}" << std::endl;
46  return 1;
47  }
48 
49  int current_arg = 1;
50  while( current_arg < argc )
51  {
52  if( !strcmp( "-g", argv[current_arg] ) )
53  file_exten = 0;
54  else if( !strcmp( "-h5m", argv[current_arg] ) )
55  file_exten = 1;
56  else if( !strcmp( "-vtk", argv[current_arg] ) )
57  file_exten = 2;
58  else if( !strcmp( "-ap", argv[current_arg] ) )
59  op_types.push_back( ATOMIC_PILLOW );
60  else if( !strcmp( "-foc", argv[current_arg] ) )
61  op_types.push_back( FACE_OPEN_COLLAPSE );
62  else if( !strcmp( "-fs", argv[current_arg] ) )
63  op_types.push_back( FACE_SHRINK );
64  else if( !strcmp( "-cp", argv[current_arg] ) )
65  op_types.push_back( CHORD_PUSH );
66  else if( !strcmp( "-tcp", argv[current_arg] ) )
67  op_types.push_back( MBTRIPLE_CHORD_PUSH );
68  else if( !strcmp( "-thp", argv[current_arg] ) )
69  op_types.push_back( MBTRIPLE_HEX_PUSH );
70  current_arg++;
71  }
72 
73  ErrorCode result = MB_SUCCESS, tmp_result = MB_FAILURE;
74 
75  for( std::vector< OperationType >::iterator vit = op_types.begin(); vit != op_types.end(); ++vit )
76  {
77  if( *vit == ATOMIC_PILLOW )
78  {
79  tmp_result = make_atomic_pillow();
80  }
81  else if( *vit == FACE_OPEN_COLLAPSE )
82  {
83  tmp_result = make_face_open_collapse();
84  }
85  else if( *vit == CHORD_PUSH )
86  {
87  tmp_result = make_chord_push();
88  }
89  else if( *vit == MBTRIPLE_CHORD_PUSH )
90  {
91  tmp_result = make_triple_chord_push();
92  }
93 
94  else if( *vit == MBTRIPLE_HEX_PUSH )
95  {
96  tmp_result = make_triple_hex_push();
97  }
98  else if( *vit == FACE_SHRINK )
99  {
100  tmp_result = make_face_shrink();
101  }
102  else
103  {
104  std::cout << "Operation undefined." << std::endl;
105  return 1;
106  }
107  if( MB_SUCCESS != tmp_result ) result = tmp_result;
108 
109  // now write to a file
110  std::string filename( OperationNames[*vit] );
111  filename.append( extensions[file_exten] );
112  tmp_result = gMB->write_mesh( filename.c_str() );
113  if( MB_SUCCESS != tmp_result ) result = tmp_result;
114  }
115 
116  return ( result == MB_SUCCESS ? 0 : 1 );
117 }
118 
120 {
121  // make atomic pillow configuration
122  // make all vertices
123  double vtx_coord[] = { 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0,
124  .75, .75, 1.0, .75, .25, 1.0, .25, .25, 1.0, .25, .75, 1.0 };
125 
126  int connect[] = { 0, 1, 2, 3, 4, 5, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3 };
127 
128  ErrorCode result;
129  EntityHandle vtx_handles[8];
130 
131  for( int i = 0; i < 8; i++ )
132  {
133  result = gMB->create_vertex( &vtx_coord[3 * i], vtx_handles[i] );MB_CHK_ERR( result );
134  }
135 
136  EntityHandle conn[8], elems[4];
137 
138  // make the two hexes
139  for( int i = 0; i < 8; i++ )
140  conn[i] = vtx_handles[connect[i]];
141  result = gMB->create_element( MBHEX, conn, 8, elems[0] );MB_CHK_ERR( result );
142 
143  for( int i = 0; i < 8; i++ )
144  conn[i] = vtx_handles[connect[8 + i]];
145  result = gMB->create_element( MBHEX, conn, 8, elems[1] );MB_CHK_ERR( result );
146 
147  // make one of the end quads explicitly and bind to the first hex
148  for( int i = 0; i < 4; i++ )
149  conn[i] = vtx_handles[connect[i]];
150  result = gMB->create_element( MBQUAD, conn, 4, elems[2] );MB_CHK_ERR( result );
151 
152  result = gMB->add_adjacencies( elems[2], elems, 1, false );MB_CHK_ERR( result );
153 
154  // now the other one
155  result = gMB->create_element( MBQUAD, conn, 4, elems[3] );MB_CHK_ERR( result );
156 
157  result = gMB->add_adjacencies( elems[3], &elems[1], 1, false );MB_CHK_ERR( result );
158 
159  return MB_SUCCESS;
160 }
161 
163 {
164  // make face shrink configuration
165  // make all vertices
166  double vtx_coord[] = { 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0,
167  0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 0.0, 2.0, 0.0, 0.0,
168  2.0, 0.0, 1.0, 2.0, .75, .75, 1.0, .75, .25, 1.0, .25, .25, 1.0, .25, .75, 1.0 };
169 
170  int connect[] = { 3, 7, 11, 15, 0, 4, 8, 12, 0, 4, 8, 12, 1, 5, 9, 13, 1, 5, 9, 13, 2, 6, 10, 14,
171  2, 6, 10, 14, 3, 7, 11, 15, 0, 3, 2, 1, 12, 15, 14, 13, 12, 15, 14, 13, 8, 11, 10, 9 };
172 
173  ErrorCode result;
174  EntityHandle vtx_handles[16];
175 
176  for( int i = 0; i < 16; i++ )
177  {
178  result = gMB->create_vertex( &vtx_coord[3 * i], vtx_handles[i] );MB_CHK_ERR( result );
179  }
180 
181  // make all elements at once
182  EntityHandle conn[8], elems[6];
183 
184  for( int j = 0; j < 6; j++ )
185  {
186  for( int i = 0; i < 8; i++ )
187  conn[i] = vtx_handles[connect[j * 8 + i]];
188 
189  result = gMB->create_element( MBHEX, conn, 8, elems[j] );MB_CHK_ERR( result );
190  }
191 
192  return MB_SUCCESS;
193 }
194 
196 {
197  return MB_FAILURE;
198 }
199 
201 {
202  // make chord push configuration
203  // make all vertices
204  double vtx_coord[] = { // first layer
205  0.0, 0.0, 0.5, 0.0, 1.0, 0.0, -1.0, 0.5, 0.0, -1.0, -0.5, 0.0, 0.0, -1.0, 0.0, 1.0, -0.5,
206  0.0, 1.0, 0.5, 0.0,
207  // second layer
208  0.0, 0.0, -1.5, 0.0, 1.0, -1.0, -1.0, 0.5, -1.0, -1.0, -0.5, -1.0, 0.0, -1.0, -1.0, 1.0,
209  -0.5, -1.0, 1.0, 0.5, -1.0,
210  // 2 extra vertices for chord push
211  0.0, -.333, 0.05, 0.0, -.667, 0.10 };
212 
213  int connect[] = { // 3 "normal" hexes first
214  // top hex
215  0, 2, 1, 6, 7, 9, 8, 13,
216  // bottom left
217  0, 4, 3, 2, 7, 11, 10, 9,
218  // bottom right
219  6, 5, 4, 0, 13, 12, 11, 7,
220  // front chord push hex
221  2, 0, 4, 3, 14, 6, 5, 15,
222  // back chord push hex
223  2, 14, 15, 3, 0, 6, 5, 4,
224  // front/rear quads a, b
225  2, 0, 4, 3, 6, 5, 4, 0,
226  // duplicate edges from chord push
227  0, 4,
228  // face between bottom 2 normal hexes (needed for explicit
229  // adjacency)
230  0, 4, 11, 7 };
231 
232  ErrorCode result;
233  EntityHandle vtx_handles[16];
234 
235  for( int i = 0; i < 16; i++ )
236  {
237  result = gMB->create_vertex( &vtx_coord[3 * i], vtx_handles[i] );MB_CHK_ERR( result );
238  }
239 
240  EntityHandle conn[8], elems[12];
241 
242  // make the five hexes
243  for( int i = 0; i < 5; i++ )
244  {
245  for( int j = 0; j < 8; j++ )
246  conn[j] = vtx_handles[connect[8 * i + j]];
247  result = gMB->create_element( MBHEX, conn, 8, elems[i] );MB_CHK_ERR( result );
248  }
249 
250  // make the frontmost pair of quads and bind to the front degen hex
251  for( int i = 0; i < 2; i++ )
252  {
253  for( int j = 0; j < 4; j++ )
254  conn[j] = vtx_handles[connect[40 + 4 * i + j]];
255  result = gMB->create_element( MBQUAD, conn, 4, elems[5 + i] );MB_CHK_ERR( result );
256  }
257 
258  // now the back pair
259  for( int i = 0; i < 2; i++ )
260  {
261  for( int j = 0; j < 4; j++ )
262  conn[j] = vtx_handles[connect[40 + 4 * i + j]];
263  result = gMB->create_element( MBQUAD, conn, 4, elems[7 + i] );MB_CHK_ERR( result );
264  }
265 
266  // make the duplicated edges explicitly too
267  for( int i = 0; i < 2; i++ )
268  {
269  for( int j = 0; j < 2; j++ )
270  conn[j] = vtx_handles[connect[48 + j]];
271  result = gMB->create_element( MBEDGE, conn, 2, elems[9 + i] );MB_CHK_ERR( result );
272  }
273 
274  // now the quad between the lower pair of hexes
275  for( int j = 0; j < 4; j++ )
276  conn[j] = vtx_handles[connect[50 + j]];
277  result = gMB->create_element( MBQUAD, conn, 4, elems[11] );MB_CHK_ERR( result );
278 
279  // now set adjacencies explicitly
280  // front/rear duplicated edge to front/rear pair of quads
281  result = gMB->add_adjacencies( elems[9], &elems[5], 2, false );MB_CHK_ERR( result );
282  result = gMB->add_adjacencies( elems[10], &elems[7], 2, false );MB_CHK_ERR( result );
283 
284  // rear duplicated edge to quad between lower pair of normal hexes
285  result = gMB->add_adjacencies( elems[10], &elems[11], 1, false );MB_CHK_ERR( result );
286 
287  // front/rear duplicated edge to front/rear degen hex
288  result = gMB->add_adjacencies( elems[9], &elems[3], 1, false );MB_CHK_ERR( result );
289  result = gMB->add_adjacencies( elems[10], &elems[4], 1, false );MB_CHK_ERR( result );
290 
291  // rear duplicated edge to normal hexes behind it
292  result = gMB->add_adjacencies( elems[10], &elems[1], 2, false );MB_CHK_ERR( result );
293 
294  // front pair of quads to front degen hex
295  result = gMB->add_adjacencies( elems[5], &elems[3], 1, false );MB_CHK_ERR( result );
296  result = gMB->add_adjacencies( elems[6], &elems[3], 1, false );MB_CHK_ERR( result );
297 
298  // rear pair of quads to rear degen hex
299  result = gMB->add_adjacencies( elems[7], &elems[4], 1, false );MB_CHK_ERR( result );
300  result = gMB->add_adjacencies( elems[8], &elems[4], 1, false );MB_CHK_ERR( result );
301 
302  // rear pair of quads to normal hexes behind them
303  result = gMB->add_adjacencies( elems[7], &elems[1], 1, false );MB_CHK_ERR( result );
304  result = gMB->add_adjacencies( elems[8], &elems[2], 1, false );MB_CHK_ERR( result );
305 
306  return MB_SUCCESS;
307 }
308 
310 {
311  // make chord push configuration
312  // make all vertices
313  double vtx_coord[] = { // first layer
314  0.0, 0.0, 0.5, 0.0, 1.0, 0.0, -1.0, 0.5, 0.0, -1.0, -0.5, 0.0, 0.0, -1.0, 0.0, 1.0, -0.5,
315  0.0, 1.0, 0.5, 0.0,
316  // second layer
317  0.0, 0.0, -1.5, 0.0, 1.0, -1.0, -1.0, 0.5, -1.0, -1.0, -0.5, -1.0, 0.0, -1.0, -1.0, 1.0,
318  -0.5, -1.0, 1.0, 0.5, -1.0,
319  // 2 extra vertices in middle
320  0.0, 0.0, -0.25, 0.0, 0.0, 0.0 };
321 
322  int connect[] = { // 3 "normal" hexes first
323  // top hex
324  14, 2, 1, 6, 7, 9, 8, 13,
325  // bottom left
326  14, 4, 3, 2, 7, 11, 10, 9,
327  // bottom right
328  6, 5, 4, 14, 13, 12, 11, 7,
329  // front triple chord push hex
330  0, 4, 3, 2, 6, 5, 15, 1,
331  // back triple chord push hex
332  2, 1, 15, 3, 14, 6, 5, 4 };
333 
334  ErrorCode result;
335  EntityHandle vtx_handles[16];
336 
337  for( int i = 0; i < 16; i++ )
338  {
339  result = gMB->create_vertex( &vtx_coord[3 * i], vtx_handles[i] );MB_CHK_ERR( result );
340  }
341 
342  EntityHandle conn[8], elems[12];
343 
344  // make the five hexes
345  for( int i = 0; i < 5; i++ )
346  {
347  for( int j = 0; j < 8; j++ )
348  conn[j] = vtx_handles[connect[8 * i + j]];
349  result = gMB->create_element( MBHEX, conn, 8, elems[i] );MB_CHK_ERR( result );
350  }
351 
352  return MB_SUCCESS;
353 }
354 
356 {
357  return MB_FAILURE;
358 }