MOAB: Mesh Oriented datABase  (version 5.5.0)
seqperf.cpp File Reference
#include <ctime>
#include <cassert>
#include <iostream>
#include <sstream>
#include "moab/Core.hpp"
#include "moab/ReadUtilIface.hpp"
#include "EntitySequence.hpp"
#include "SequenceManager.hpp"
+ Include dependency graph for seqperf.cpp:

Go to the source code of this file.

Macros

#define PRINT_SEQUENCE_COUNT
 
#define IS_BUILDING_MB
 
#define ARRSIZE(A)   ( sizeof( A ) / sizeof( ( A )[0] ) )
 

Typedefs

typedef void(* naf_t) ()
 
typedef void(* iaf_t) (int)
 

Functions

long * permutation (long count)
 Generate random permutation of values in [0,count-1]. More...
 
void init ()
 Initialize global variables. More...
 
void create_vertices_single ()
 create vertices one at a time More...
 
void create_vertices_block ()
 create vertices in block using ReadUtilIface More...
 
void create_elements_single ()
 create elements one at a time More...
 
void create_elements_block ()
 create elements in block using ReadUtilIface More...
 
void forward_order_query_vertices (int percent)
 calculate mean of all vertex coordinates More...
 
void reverse_order_query_vertices (int percent)
 calculate mean of all vertex coordinates More...
 
void random_order_query_vertices (int percent)
 calculate mean of all vertex coordinates More...
 
void forward_order_query_elements (int percent)
 check all element connectivity for valid vertex handles More...
 
void reverse_order_query_elements (int percent)
 check all element connectivity for valid vertex handles More...
 
void random_order_query_elements (int percent)
 check all element connectivity for valid vertex handles More...
 
void forward_order_query_element_verts (int percent)
 calculate centroid More...
 
void reverse_order_query_element_verts (int percent)
 calculate centroid More...
 
void random_order_query_element_verts (int percent)
 calculate centroid More...
 
void forward_order_delete_vertices (int percent)
 delete x% of vertices More...
 
void reverse_order_delete_vertices (int percent)
 delete x% of vertices More...
 
void random_order_delete_vertices (int percent)
 delete x% of vertices More...
 
void forward_order_delete_elements (int percent)
 delete x% of elements More...
 
void reverse_order_delete_elements (int percent)
 delete x% of elements More...
 
void random_order_delete_elements (int percent)
 delete x% of elements More...
 
void create_missing_vertices (int percent)
 re-create deleted vertices More...
 
void create_missing_elements (int percent)
 re-create deleted elements More...
 
unsigned get_number_sequences (EntityType type)
 
void vertex_coords (long vert_index, double &x, double &y, double &z)
 Coordinates for ith vertex in structured hex mesh. More...
 
void element_conn (long elem_index, EntityHandle conn[8])
 Connectivity for ith hex in structured hex mesh. More...
 
bool deleted_vert (long index, int percent)
 True if passed index is one of the x% to be deleted. More...
 
bool deleted_elem (long index, int percent)
 True if passed index is one of the x% to be deleted. More...
 
void delete_vert (long index, int percent)
 if (deleted_vert(index,percent)) delete vertex More...
 
void delete_elem (long index, int percent)
 if (deleted_elem(index,percent)) delete element More...
 
void usage ()
 print usage and exit More...
 
std::string ts (clock_t t)
 convert CPU time to string More...
 
void TIME (const char *str, void(*func)())
 run function, printing time spent More...
 
void TIME_QRY (const char *str, void(*func)(int percent), int percent)
 run function query_repeat times, printing time spent More...
 
void TIME_DEL (const char *str, void(*func)(int), int percent)
 run function with integer argument, printing time spent More...
 
void delete_mesh ()
 call MB::delete_mesh(). function so can be passed to TIME More...
 
void do_test (int create_mode, int order, int percent)
 Run a single combination of test parameters. More...
 
void parse_order (const char *str, std::vector< int > &list)
 
void parse_percent (const char *str, std::vector< int > &list)
 
int parse_positive_int (const char *str)
 
void check_default (std::vector< int > &list, const int *array, size_t array_len)
 
int main (int argc, char *argv[])
 
long vert_index (long x, long y, long z)
 

Variables

const bool dump_mesh = false
 write mesh to vtk file More...
 
const int default_intervals = 25
 defaul interval count for cubic structured hex mesh More...
 
const int default_query_count = 100
 number of times to do each query set More...
 
const int default_order [] = { 0, 1, 2 }
 
const int default_create [] = { 0, 1 }
 
const int default_delete [] = { 0, 10, 30, 50, 70, 90 }
 
long numSideInt
 
long numVert
 
long numElem
 total counts; More...
 
int queryCount
 number of times to do each query set More...
 
Core mb_core
 moab instance More...
 
Interfacemb = mb_core
 moab instance More...
 
EntityHandle vertStart
 
EntityHandle elemStart
 first handle More...
 
ReadUtilIfacereadTool = 0
 
long * queryVertPermutation = 0
 pupulated by init(): "random" order for vertices More...
 
long * queryElemPermutation = 0
 pupulated by init(): "random" order for elements More...
 
iaf_t query_verts [3] = { &forward_order_query_vertices, &reverse_order_query_vertices, &random_order_query_vertices }
 
iaf_t query_elems [3] = { &forward_order_query_elements, &reverse_order_query_elements, &random_order_query_elements }
 
iaf_t query_elem_verts [3]
 
iaf_t delete_verts [3]
 
iaf_t delete_elems [3]
 
const char * order_strs [] = { "Forward", "Reverse", "Random" }
 

Macro Definition Documentation

◆ ARRSIZE

#define ARRSIZE (   A)    ( sizeof( A ) / sizeof( ( A )[0] ) )

Definition at line 31 of file seqperf.cpp.

◆ IS_BUILDING_MB

#define IS_BUILDING_MB

Definition at line 12 of file seqperf.cpp.

◆ PRINT_SEQUENCE_COUNT

#define PRINT_SEQUENCE_COUNT

Definition at line 8 of file seqperf.cpp.

Typedef Documentation

◆ iaf_t

typedef void( * iaf_t) (int)

Definition at line 120 of file seqperf.cpp.

◆ naf_t

typedef void( * naf_t) ()

Definition at line 119 of file seqperf.cpp.

Function Documentation

◆ check_default()

void check_default ( std::vector< int > &  list,
const int *  array,
size_t  array_len 
)

Definition at line 302 of file seqperf.cpp.

303 {
304  if( list.empty() ) std::copy( array, array + array_len, std::back_inserter( list ) );
305 }

Referenced by main().

◆ create_elements_block()

void create_elements_block ( )

create elements in block using ReadUtilIface

Definition at line 486 of file seqperf.cpp.

487 {
488  EntityHandle* conn = 0;
489  ErrorCode rval = readTool->get_element_connect( numElem, 8, MBHEX, 0, elemStart, conn );
490  if( rval && !conn )
491  {
492  assert( false );
493  abort();
494  }
495 
496  for( long i = 0; i < numElem; ++i )
497  element_conn( i, conn + 8 * i );
498 }

References element_conn(), elemStart, ErrorCode, moab::ReadUtilIface::get_element_connect(), MBHEX, numElem, and readTool.

Referenced by do_test().

◆ create_elements_single()

void create_elements_single ( )

create elements one at a time

Definition at line 465 of file seqperf.cpp.

466 {
467  EntityHandle conn[8];
468  element_conn( 0, conn );
469  ErrorCode rval = mb.create_element( MBHEX, conn, 8, elemStart );
470  if( rval )
471  {
472  assert( false );
473  abort();
474  }
475 
476  EntityHandle h;
477  for( long i = 1; i < numElem; ++i )
478  {
479  element_conn( i, conn );
480  rval = mb.create_element( MBHEX, conn, 8, h );
481  assert( !rval );
482  assert( h - elemStart == (EntityHandle)i );
483  }
484 }

References moab::Interface::create_element(), element_conn(), elemStart, ErrorCode, mb, MBHEX, and numElem.

Referenced by do_test().

◆ create_missing_elements()

void create_missing_elements ( int  percent)

re-create deleted elements

Definition at line 804 of file seqperf.cpp.

805 {
806  EntityHandle h;
807  ErrorCode rval;
808  EntityHandle conn[8];
809  for( long i = 0; i < numElem; ++i )
810  if( deleted_elem( i, percent ) )
811  {
812  element_conn( i, conn );
813  rval = mb.create_element( MBHEX, conn, 8, h );
814  if( rval )
815  {
816  assert( false );
817  abort();
818  }
819  }
820 }

References moab::Interface::create_element(), deleted_elem(), element_conn(), ErrorCode, mb, MBHEX, and numElem.

Referenced by do_test().

◆ create_missing_vertices()

void create_missing_vertices ( int  percent)

re-create deleted vertices

Definition at line 787 of file seqperf.cpp.

788 {
789  EntityHandle h;
790  ErrorCode rval = MB_SUCCESS;
791  if( rval )
792  {
793  } // empty line to remove compiler warning
794  double coords[3];
795  for( long i = 0; i < numVert; ++i )
796  if( deleted_vert( i, percent ) )
797  {
798  vertex_coords( i, coords[0], coords[1], coords[2] );
799  rval = mb.create_vertex( coords, h );
800  assert( !rval );
801  }
802 }

References moab::Interface::create_vertex(), deleted_vert(), ErrorCode, mb, MB_SUCCESS, numVert, and vertex_coords().

Referenced by do_test().

◆ create_vertices_block()

void create_vertices_block ( )

create vertices in block using ReadUtilIface

Definition at line 449 of file seqperf.cpp.

450 {
451  std::vector< double* > arrays;
452  ErrorCode rval = readTool->get_node_coords( 3, numVert, 0, vertStart, arrays );
453  if( rval || arrays.size() != 3 )
454  {
455  assert( false );
456  abort();
457  }
458  double *x = arrays[0], *y = arrays[1], *z = arrays[2];
459  assert( x && y && z );
460 
461  for( long i = 0; i < numVert; ++i )
462  vertex_coords( i, *x++, *y++, *z++ );
463 }

References ErrorCode, moab::ReadUtilIface::get_node_coords(), numVert, readTool, vertex_coords(), and vertStart.

Referenced by do_test().

◆ create_vertices_single()

void create_vertices_single ( )

create vertices one at a time

Definition at line 429 of file seqperf.cpp.

430 {
431  double coords[3];
432  vertex_coords( 0, coords[0], coords[1], coords[2] );
433  ErrorCode rval = mb.create_vertex( coords, vertStart );
434  assert( !rval );
435  if( rval )
436  {
437  } // empty line to remove compiler warning
438 
439  EntityHandle h;
440  for( long i = 1; i < numVert; ++i )
441  {
442  vertex_coords( i, coords[0], coords[1], coords[2] );
443  rval = mb.create_vertex( coords, h );
444  assert( !rval );
445  assert( h - vertStart == (EntityHandle)i );
446  }
447 }

References moab::Interface::create_vertex(), ErrorCode, mb, numVert, vertex_coords(), and vertStart.

Referenced by do_test().

◆ delete_elem()

void delete_elem ( long  index,
int  percent 
)
inline

if (deleted_elem(index,percent)) delete element

Definition at line 836 of file seqperf.cpp.

837 {
838  if( deleted_elem( index, percent ) )
839  {
840  EntityHandle h = index + elemStart;
841  ErrorCode rval = mb.delete_entities( &h, 1 );
842  if( rval )
843  {
844  assert( false );
845  abort();
846  }
847  }
848 }

References moab::Interface::delete_entities(), deleted_elem(), elemStart, ErrorCode, and mb.

Referenced by forward_order_delete_elements(), random_order_delete_elements(), and reverse_order_delete_elements().

◆ delete_mesh()

void delete_mesh ( )

call MB::delete_mesh(). function so can be passed to TIME

Definition at line 206 of file seqperf.cpp.

207 {
208  mb.delete_mesh();
209 }

References moab::Interface::delete_mesh(), and mb.

Referenced by do_test().

◆ delete_vert()

void delete_vert ( long  index,
int  percent 
)
inline

if (deleted_vert(index,percent)) delete vertex

Definition at line 822 of file seqperf.cpp.

823 {
824  if( deleted_vert( index, percent ) )
825  {
826  EntityHandle h = index + vertStart;
827  ErrorCode rval = mb.delete_entities( &h, 1 );
828  if( rval )
829  {
830  assert( false );
831  abort();
832  }
833  }
834 }

References moab::Interface::delete_entities(), deleted_vert(), ErrorCode, mb, and vertStart.

Referenced by forward_order_delete_vertices(), random_order_delete_vertices(), and reverse_order_delete_vertices().

◆ deleted_elem()

bool deleted_elem ( long  index,
int  percent 
)
inline

True if passed index is one of the x% to be deleted.

Definition at line 424 of file seqperf.cpp.

425 {
426  return index % numSideInt + 1 >= ( numSideInt + 1 ) * ( 100 - percent ) / 100;
427 }

References numSideInt.

Referenced by create_missing_elements(), delete_elem(), random_order_query_element_verts(), and random_order_query_elements().

◆ deleted_vert()

bool deleted_vert ( long  index,
int  percent 
)
inline

True if passed index is one of the x% to be deleted.

Definition at line 419 of file seqperf.cpp.

420 {
421  return index % ( numSideInt + 1 ) >= ( numSideInt + 1 ) * ( 100 - percent ) / 100;
422 }

References numSideInt.

Referenced by create_missing_vertices(), delete_vert(), and random_order_query_vertices().

◆ do_test()

void do_test ( int  create_mode,
int  order,
int  percent 
)

Run a single combination of test parameters.

Parameters
create_mode0 == single, 1 == block
order0 == forward, 1 == reverse, 2 == random
percentpercent of entities to delete

Definition at line 212 of file seqperf.cpp.

215 {
216  clock_t t = clock();
217  if( create_mode )
218  {
219  std::cout << "Block Entity Creation (all entities in single block of memory)" << std::endl;
220  TIME( " Creating initial vertices", create_vertices_block );
221  TIME( " Creating initial elements", create_elements_block );
222  if( dump_mesh && !percent && mb.write_file( "seqperf.vtk" ) == MB_SUCCESS )
223  std::cout << "Wrote mesh to file: seqperf.vtk" << std::endl;
224  }
225  else
226  {
227  std::cout << "Single Entity Creation (entities grouped in memory blocks of constant size)" << std::endl;
228  TIME( " Creating initial vertices", create_vertices_single );
229  TIME( " Creating initial elements", create_elements_single );
230  }
231 
232  std::cout << order_strs[order] << " order with deletion of " << percent << "% of vertices and elements"
233  << std::endl;
234 
235  TIME_DEL( " Deleting elements", delete_elems[order], percent );
236  TIME_DEL( " Deleting vertices", delete_verts[order], percent );
237 
238  int num_vert = 0;
239  int num_elem = 0;
240  mb.get_number_entities_by_type( 0, MBVERTEX, num_vert );
241  mb.get_number_entities_by_type( 0, MBHEX, num_elem );
242  std::cout << " " << num_vert << " vertices and " << num_elem << " elements remaining" << std::endl;
243 #ifdef PRINT_SEQUENCE_COUNT
244  std::cout << " " << get_number_sequences( MBVERTEX ) << " vertex sequences and " << get_number_sequences( MBHEX )
245  << " element sequences." << std::endl;
246 #endif
247 
248  TIME_QRY( " Querying vertex coordinates", query_verts[order], percent );
249  TIME_QRY( " Querying element connectivity", query_elems[order], percent );
250  TIME_QRY( " Querying element coordinates", query_elem_verts[order], percent );
251 
252  TIME_DEL( " Re-creating vertices", create_missing_vertices, percent );
253  TIME_DEL( " Re-creating elements", create_missing_elements, percent );
254 
255  TIME( " Clearing mesh instance", delete_mesh );
256 
257  std::cout << "Total time for test: " << ts( clock() - t ) << std::endl << std::endl;
258 }

References create_elements_block(), create_elements_single(), create_missing_elements(), create_missing_vertices(), create_vertices_block(), create_vertices_single(), delete_elems, delete_mesh(), delete_verts, dump_mesh, moab::Interface::get_number_entities_by_type(), get_number_sequences(), mb, MB_SUCCESS, MBHEX, MBVERTEX, order_strs, query_elem_verts, query_elems, query_verts, t, TIME(), TIME_DEL(), TIME_QRY(), ts(), and moab::Interface::write_file().

Referenced by main().

◆ element_conn()

void element_conn ( long  elem_index,
EntityHandle  conn[8] 
)
inline

Connectivity for ith hex in structured hex mesh.

Definition at line 404 of file seqperf.cpp.

405 {
406  const long x = elem_index % numSideInt;
407  const long y = ( elem_index / numSideInt ) % numSideInt;
408  const long z = ( elem_index / numSideInt / numSideInt );
409  conn[0] = vertStart + vert_index( x, y, z );
410  conn[1] = vertStart + vert_index( x + 1, y, z );
411  conn[2] = vertStart + vert_index( x + 1, y + 1, z );
412  conn[3] = vertStart + vert_index( x, y + 1, z );
413  conn[4] = vertStart + vert_index( x, y, z + 1 );
414  conn[5] = vertStart + vert_index( x + 1, y, z + 1 );
415  conn[6] = vertStart + vert_index( x + 1, y + 1, z + 1 );
416  conn[7] = vertStart + vert_index( x, y + 1, z + 1 );
417 }

References numSideInt, vert_index(), and vertStart.

Referenced by moab::HigherOrderFactory::add_center_node(), create_elements_block(), create_elements_single(), and create_missing_elements().

◆ forward_order_delete_elements()

void forward_order_delete_elements ( int  percent)

delete x% of elements

Definition at line 769 of file seqperf.cpp.

770 {
771  for( long i = 0; i < numElem; ++i )
772  delete_elem( i, percent );
773 }

References delete_elem(), and numElem.

◆ forward_order_delete_vertices()

void forward_order_delete_vertices ( int  percent)

delete x% of vertices

Definition at line 751 of file seqperf.cpp.

752 {
753  for( long i = 0; i < numVert; ++i )
754  delete_vert( i, percent );
755 }

References delete_vert(), and numVert.

◆ forward_order_query_element_verts()

void forward_order_query_element_verts ( int  percent)

calculate centroid

Definition at line 667 of file seqperf.cpp.

668 {
669  ErrorCode r = MB_SUCCESS;
670  if( r )
671  {
672  } // empty line to remove compiler warning
673  const EntityHandle* conn;
674  int len;
675  long x, y, z;
676  double coords[24];
677  const long elem_per_edge = numSideInt;
678  const long deleted_x = ( numSideInt + 1 ) * ( 100 - percent ) / 100 - 1;
680  for( z = 0; z < elem_per_edge; ++z )
681  {
682  for( y = 0; y < elem_per_edge; ++y )
683  {
684  for( x = 0; x < deleted_x; ++x, ++h )
685  {
686  r = mb.get_connectivity( h, conn, len );
687  assert( MB_SUCCESS == r );
688  assert( conn && 8 == len );
689  r = mb.get_coords( conn, len, coords );
690  assert( MB_SUCCESS == r );
691  }
692  h += ( elem_per_edge - deleted_x );
693  }
694  }
695 }

References elemStart, ErrorCode, moab::Interface::get_connectivity(), moab::Interface::get_coords(), mb, MB_SUCCESS, and numSideInt.

◆ forward_order_query_elements()

void forward_order_query_elements ( int  percent)

check all element connectivity for valid vertex handles

Definition at line 571 of file seqperf.cpp.

572 {
573  ErrorCode r;
574  const EntityHandle* conn;
575  int len;
576  long x, y, z;
577  const long elem_per_edge = numSideInt;
578  const long deleted_x = ( numSideInt + 1 ) * ( 100 - percent ) / 100 - 1;
580  for( z = 0; z < elem_per_edge; ++z )
581  {
582  for( y = 0; y < elem_per_edge; ++y )
583  {
584  for( x = 0; x < deleted_x; ++x, ++h )
585  {
586  r = mb.get_connectivity( h, conn, len );
587  assert( MB_SUCCESS == r );
588  if( r )
589  {
590  } // empty line to remove compiler warning
591  assert( conn && 8 == len );
592  }
593  h += ( elem_per_edge - deleted_x );
594  }
595  }
596 }

References elemStart, ErrorCode, moab::Interface::get_connectivity(), mb, MB_SUCCESS, and numSideInt.

◆ forward_order_query_vertices()

void forward_order_query_vertices ( int  percent)

calculate mean of all vertex coordinates

Definition at line 500 of file seqperf.cpp.

501 {
502  ErrorCode r;
503  double coords[3];
504  long x, y, z;
505  const long vert_per_edge = numSideInt + 1;
506  const long deleted_x = ( numSideInt + 1 ) * ( 100 - percent ) / 100;
508  for( z = 0; z < vert_per_edge; ++z )
509  {
510  for( y = 0; y < vert_per_edge; ++y )
511  {
512  for( x = 0; x < deleted_x; ++x, ++h )
513  {
514  r = mb.get_coords( &h, 1, coords );
515  if( MB_SUCCESS != r )
516  {
517  assert( false );
518  abort();
519  }
520  }
521  h += ( vert_per_edge - deleted_x );
522  }
523  }
524 }

References ErrorCode, moab::Interface::get_coords(), mb, MB_SUCCESS, numSideInt, and vertStart.

◆ get_number_sequences()

unsigned get_number_sequences ( EntityType  type)

Definition at line 851 of file seqperf.cpp.

852 {
853 #ifdef MB_ENTITY_SEQUENCE_HPP
854  return mb_core.sequence_manager()->entity_map( type )->size();
855 #else
857 #endif
858 }

References moab::SequenceManager::entity_map(), moab::TypeSequenceManager::get_sequence_count(), mb_core, and moab::Core::sequence_manager().

Referenced by do_test().

◆ init()

void init ( )

Initialize global variables.

Definition at line 72 of file seqperf.cpp.

73 {
75  if( rval || !readTool )
76  {
77  assert( false );
78  abort();
79  }
80 
83 }

References ErrorCode, mb, numElem, numVert, permutation(), moab::Interface::query_interface(), queryElemPermutation, queryVertPermutation, and readTool.

Referenced by main().

◆ main()

int main ( int  argc,
char *  argv[] 
)

Definition at line 307 of file seqperf.cpp.

308 {
309  // Parse arguments
310  std::vector< int > createList, orderList, deleteList;
313 
314  for( int i = 1; i < argc; ++i )
315  {
316  // check that arg is a '-' followed by a single character
317  if( argv[i][0] != '-' || argv[i][1] == '\0' || argv[i][2] != '\0' ) usage();
318 
319  const char flag = argv[i][1];
320  switch( flag )
321  {
322  case 'b':
323  createList.push_back( 1 );
324  break;
325  case 's':
326  createList.push_back( 0 );
327  break;
328  default:
329  if( ++i == argc ) usage();
330  switch( flag )
331  {
332  case 'i':
333  numSideInt = parse_positive_int( argv[i] );
334  break;
335  case 'o':
336  parse_order( argv[i], orderList );
337  break;
338  case 'd':
339  parse_percent( argv[i], deleteList );
340  break;
341  case 'q':
342  queryCount = parse_positive_int( argv[i] );
343  break;
344  default:
345  usage();
346  }
347  }
348  }
352 
353  // Do some initialization.
354 
355  int numSideVert = numSideInt + 1;
356  numVert = numSideVert * numSideVert * numSideVert;
358  if( numVert / numSideVert / numSideVert != numSideVert ) // overflow
359  usage();
360  init();
361 
362  // Echo input args
363 
364  std::cout << numSideInt << "x" << numSideInt << "x" << numSideInt << " hex grid: " << numElem << " elements and "
365  << numVert << " vertices" << std::endl;
366 
367  // Run tests
368 
369  std::vector< int >::const_iterator i, j, k;
370  clock_t t = clock();
371  for( i = createList.begin(); i != createList.end(); ++i )
372  {
373  for( j = deleteList.begin(); j != deleteList.end(); ++j )
374  {
375  for( k = orderList.begin(); k != orderList.end(); ++k )
376  {
377  do_test( *i, *k, *j );
378  }
379  }
380  }
381 
382  // Clean up
383 
384  std::cout << "TOTAL: " << ts( clock() - t ) << std::endl << std::endl;
385  delete[] queryVertPermutation;
386  delete[] queryElemPermutation;
387  return 0;
388 }

References ARRSIZE, check_default(), default_create, default_delete, default_intervals, default_order, default_query_count, do_test(), init(), numElem, numSideInt, numVert, parse_order(), parse_percent(), parse_positive_int(), queryCount, queryElemPermutation, queryVertPermutation, t, ts(), and usage().

◆ parse_order()

void parse_order ( const char *  str,
std::vector< int > &  list 
)

Definition at line 260 of file seqperf.cpp.

261 {
262  if( str[0] == 'f' )
263  {
264  if( strncmp( str, "forward", strlen( str ) ) != 0 ) usage();
265  list.push_back( 0 );
266  }
267  else if( str[0] != 'r' )
268  usage();
269  else if( str[1] == 'e' )
270  {
271  if( strncmp( str, "reverse", strlen( str ) ) != 0 ) usage();
272  list.push_back( 0 );
273  }
274  else
275  {
276  if( strncmp( str, "random", strlen( str ) ) != 0 ) usage();
277  list.push_back( 0 );
278  }
279 }

References usage().

Referenced by main().

◆ parse_percent()

void parse_percent ( const char *  str,
std::vector< int > &  list 
)

Definition at line 281 of file seqperf.cpp.

282 {
283  char* endptr;
284  long p = strtol( str, &endptr, 0 );
285  if( !endptr || *endptr || p < 0 || p > 100 ) usage();
286 
287  list.push_back( (int)p );
288 }

References usage().

Referenced by main().

◆ parse_positive_int()

int parse_positive_int ( const char *  str)

Definition at line 290 of file seqperf.cpp.

291 {
292  char* endptr;
293  long p = strtol( str, &endptr, 0 );
294  if( !endptr || *endptr || p < 1 ) usage();
295  int result = p;
296  if( p != (long)result ) // overflow
297  usage();
298 
299  return result;
300 }

References usage().

Referenced by main().

◆ permutation()

long* permutation ( long  count)

Generate random permutation of values in [0,count-1].

Definition at line 46 of file seqperf.cpp.

47 {
48  srand( count );
49  long* array = new long[count];
50  for( long i = 0; i < count; ++i )
51  array[i] = i;
52 
53  for( long i = 0; i < count; ++i )
54  {
55  long r = rand();
56  if( count > RAND_MAX )
57  {
58  r += RAND_MAX * rand();
59  if( count / RAND_MAX > RAND_MAX )
60  {
61  long t = (long)RAND_MAX * rand();
62  r += (long)RAND_MAX * t;
63  }
64  }
65  std::swap( array[i], array[r % count] );
66  }
67 
68  return array;
69 }

References swap(), and t.

Referenced by init().

◆ random_order_delete_elements()

void random_order_delete_elements ( int  percent)

delete x% of elements

Definition at line 781 of file seqperf.cpp.

782 {
783  for( long i = 0; i < numElem; ++i )
784  delete_elem( queryElemPermutation[i], percent );
785 }

References delete_elem(), numElem, and queryElemPermutation.

◆ random_order_delete_vertices()

void random_order_delete_vertices ( int  percent)

delete x% of vertices

Definition at line 763 of file seqperf.cpp.

764 {
765  for( long i = 0; i < numVert; ++i )
766  delete_vert( queryVertPermutation[i], percent );
767 }

References delete_vert(), numVert, and queryVertPermutation.

◆ random_order_query_element_verts()

void random_order_query_element_verts ( int  percent)

calculate centroid

Definition at line 729 of file seqperf.cpp.

730 {
731  ErrorCode r = MB_SUCCESS;
732  if( r )
733  {
734  } // empty line to remove compiler warning
735  const EntityHandle* conn;
736  int len;
737  double coords[24];
738  for( long i = 0; i < numElem; ++i )
739  {
740  if( !deleted_elem( queryElemPermutation[i], percent ) )
741  {
742  r = mb.get_connectivity( elemStart + queryElemPermutation[i], conn, len );
743  assert( MB_SUCCESS == r );
744  assert( conn && 8 == len );
745  r = mb.get_coords( conn, len, coords );
746  assert( MB_SUCCESS == r );
747  }
748  }
749 }

References deleted_elem(), elemStart, ErrorCode, moab::Interface::get_connectivity(), moab::Interface::get_coords(), mb, MB_SUCCESS, numElem, and queryElemPermutation.

◆ random_order_query_elements()

void random_order_query_elements ( int  percent)

check all element connectivity for valid vertex handles

Definition at line 626 of file seqperf.cpp.

627 {
628  ErrorCode r;
629  const EntityHandle* conn;
630  int len;
631  for( long i = 0; i < numElem; ++i )
632  {
633  if( !deleted_elem( queryElemPermutation[i], percent ) )
634  {
635  r = mb.get_connectivity( elemStart + queryElemPermutation[i], conn, len );
636  assert( MB_SUCCESS == r );
637  if( r )
638  {
639  } // empty line to remove compiler warning
640  assert( conn && 8 == len );
641  }
642  }
643 }

References deleted_elem(), elemStart, ErrorCode, moab::Interface::get_connectivity(), mb, MB_SUCCESS, numElem, and queryElemPermutation.

◆ random_order_query_vertices()

void random_order_query_vertices ( int  percent)

calculate mean of all vertex coordinates

Definition at line 552 of file seqperf.cpp.

553 {
554  ErrorCode r;
555  EntityHandle h;
556  double coords[3];
557  for( long i = 0; i < numVert; ++i )
558  {
559  if( !deleted_vert( queryVertPermutation[i], percent ) )
560  {
562  r = mb.get_coords( &h, 1, coords );
563  assert( MB_SUCCESS == r );
564  if( r )
565  {
566  } // empty line to remove compiler warning
567  }
568  }
569 }

References deleted_vert(), ErrorCode, moab::Interface::get_coords(), mb, MB_SUCCESS, numVert, queryVertPermutation, and vertStart.

◆ reverse_order_delete_elements()

void reverse_order_delete_elements ( int  percent)

delete x% of elements

Definition at line 775 of file seqperf.cpp.

776 {
777  for( long i = numElem - 1; i >= 0; --i )
778  delete_elem( i, percent );
779 }

References delete_elem(), and numElem.

◆ reverse_order_delete_vertices()

void reverse_order_delete_vertices ( int  percent)

delete x% of vertices

Definition at line 757 of file seqperf.cpp.

758 {
759  for( long i = numVert - 1; i >= 0; --i )
760  delete_vert( i, percent );
761 }

References delete_vert(), and numVert.

◆ reverse_order_query_element_verts()

void reverse_order_query_element_verts ( int  percent)

calculate centroid

Definition at line 697 of file seqperf.cpp.

698 {
699  ErrorCode r = MB_SUCCESS;
700  if( r )
701  {
702  } // empty statement to remove compiler warning
703 
704  const EntityHandle* conn;
705  int len;
706  long x, y, z;
707  double coords[24];
708  const long elem_per_edge = numSideInt;
709  const long deleted_x = ( numSideInt + 1 ) * ( 100 - percent ) / 100 - 1;
710  EntityHandle h = elemStart + numElem - 1;
711  ;
712  for( z = elem_per_edge - 1; z >= 0; --z )
713  {
714  for( y = elem_per_edge - 1; y >= 0; --y )
715  {
716  h -= ( elem_per_edge - deleted_x );
717  for( x = deleted_x - 1; x >= 0; --x, --h )
718  {
719  r = mb.get_connectivity( h, conn, len );
720  assert( MB_SUCCESS == r );
721  assert( conn && 8 == len );
722  r = mb.get_coords( conn, len, coords );
723  assert( MB_SUCCESS == r );
724  }
725  }
726  }
727 }

References elemStart, ErrorCode, moab::Interface::get_connectivity(), moab::Interface::get_coords(), mb, MB_SUCCESS, numElem, and numSideInt.

◆ reverse_order_query_elements()

void reverse_order_query_elements ( int  percent)

check all element connectivity for valid vertex handles

Definition at line 598 of file seqperf.cpp.

599 {
600  ErrorCode r;
601  const EntityHandle* conn;
602  int len;
603  long x, y, z;
604  const long elem_per_edge = numSideInt;
605  const long deleted_x = ( numSideInt + 1 ) * ( 100 - percent ) / 100 - 1;
606  EntityHandle h = elemStart + numElem - 1;
607  ;
608  for( z = elem_per_edge - 1; z >= 0; --z )
609  {
610  for( y = elem_per_edge - 1; y >= 0; --y )
611  {
612  h -= ( elem_per_edge - deleted_x );
613  for( x = deleted_x - 1; x >= 0; --x, --h )
614  {
615  r = mb.get_connectivity( h, conn, len );
616  assert( MB_SUCCESS == r );
617  if( r )
618  {
619  } // empty line to remove compiler warning
620  assert( conn && 8 == len );
621  }
622  }
623  }
624 }

References elemStart, ErrorCode, moab::Interface::get_connectivity(), mb, MB_SUCCESS, numElem, and numSideInt.

◆ reverse_order_query_vertices()

void reverse_order_query_vertices ( int  percent)

calculate mean of all vertex coordinates

Definition at line 526 of file seqperf.cpp.

527 {
528  ErrorCode r;
529  double coords[3];
530  long x, y, z;
531  const long vert_per_edge = numSideInt + 1;
532  const long deleted_x = ( numSideInt + 1 ) * ( 100 - percent ) / 100;
533  EntityHandle h = vertStart + numVert - 1;
534  ;
535  for( z = vert_per_edge - 1; z >= 0; --z )
536  {
537  for( y = vert_per_edge - 1; y >= 0; --y )
538  {
539  h -= ( vert_per_edge - deleted_x );
540  for( x = deleted_x - 1; x >= 0; --x, --h )
541  {
542  r = mb.get_coords( &h, 1, coords );
543  assert( MB_SUCCESS == r );
544  if( r )
545  {
546  } // empty line to remove compiler warning
547  }
548  }
549  }
550 }

References ErrorCode, moab::Interface::get_coords(), mb, MB_SUCCESS, numSideInt, numVert, and vertStart.

◆ TIME()

void TIME ( const char *  str,
void(*)()  func 
)

run function, printing time spent

Definition at line 178 of file seqperf.cpp.

179 {
180  std::cout << str << "... " << std::flush;
181  clock_t t = clock();
182  ( *func )();
183  std::cout << ts( clock() - t ) << std::endl;
184 }

References t, and ts().

Referenced by do_test().

◆ TIME_DEL()

void TIME_DEL ( const char *  str,
void(*)(int)  func,
int  percent 
)

run function with integer argument, printing time spent

Definition at line 197 of file seqperf.cpp.

198 {
199  std::cout << str << "... " << std::flush;
200  clock_t t = clock();
201  ( *func )( percent );
202  std::cout << ts( clock() - t ) << std::endl;
203 }

References t, and ts().

Referenced by do_test().

◆ TIME_QRY()

void TIME_QRY ( const char *  str,
void(*)(int percent)  func,
int  percent 
)

run function query_repeat times, printing time spent

Definition at line 187 of file seqperf.cpp.

188 {
189  std::cout << str << "... " << std::flush;
190  clock_t t = clock();
191  for( int i = 0; i < queryCount; ++i )
192  ( *func )( percent );
193  std::cout << ts( clock() - t ) << std::endl;
194 }

References queryCount, t, and ts().

Referenced by do_test().

◆ ts()

std::string ts ( clock_t  t)

convert CPU time to string

Examples
DirectAccessWithHoles.cpp.

Definition at line 170 of file seqperf.cpp.

171 {
172  std::ostringstream s;
173  s << ( (double)t ) / CLOCKS_PER_SEC << 's';
174  return s.str();
175 }

References t.

Referenced by do_test(), moab::HiReconstruction::eval_vander_bivar_cmf(), moab::HiReconstruction::eval_vander_univar_cmf(), main(), obbstat_write(), moab::DGMSolver::rescale_matrix(), TIME(), TIME_DEL(), and TIME_QRY().

◆ usage()

void usage ( )

print usage and exit

Definition at line 151 of file seqperf.cpp.

152 {
153  std::cerr << "Usage: seqperf [-i <intervals>] [-o <order>] [-d <percent>] [-b|-s] [-q <count>]" << std::endl;
154  std::cerr << " -i specify size of cubic structured hex mesh in intervals. Default: " << default_intervals
155  << std::endl;
156  std::cerr << " -o one of \"forward\", \"reverse\", or \"random\". May be specified multiple "
157  "times. Default is all."
158  << std::endl;
159  std::cerr << " -d percent of entities to delete. May be specified multiple times. Default is {";
160  for( unsigned i = 0; i < ARRSIZE( default_delete ) - 1; ++i )
161  std::cerr << default_delete[i] << ",";
162  std::cerr << default_delete[ARRSIZE( default_delete ) - 1] << "}" << std::endl;
163  std::cerr << " -b block creation of mesh" << std::endl;
164  std::cerr << " -s single entity mesh creation" << std::endl;
165  std::cerr << " -q number of times to repeat queries. Default: " << default_query_count << std::endl;
166  exit( 1 );
167 }

References ARRSIZE, default_delete, default_intervals, and default_query_count.

Referenced by main(), parse_order(), parse_percent(), and parse_positive_int().

◆ vert_index()

long vert_index ( long  x,
long  y,
long  z 
)
inline

Definition at line 398 of file seqperf.cpp.

399 {
400  const long vs = numSideInt + 1;
401  return x + vs * ( y + vs * z );
402 }

References numSideInt.

Referenced by element_conn(), moab::ReadNASTRAN::load_file(), and vertex_coords().

◆ vertex_coords()

void vertex_coords ( long  vert_index,
double &  x,
double &  y,
double &  z 
)
inline

Coordinates for ith vertex in structured hex mesh.

Definition at line 390 of file seqperf.cpp.

391 {
392  const long vs = numSideInt + 1;
393  x = vert_index % vs;
394  y = ( vert_index / vs ) % vs;
395  z = ( vert_index / vs / vs );
396 }

References numSideInt, and vert_index().

Referenced by create_missing_vertices(), create_vertices_block(), create_vertices_single(), main(), setup_mesh(), and test_build_from_pts().

Variable Documentation

◆ default_create

const int default_create[] = { 0, 1 }

Definition at line 29 of file seqperf.cpp.

Referenced by main().

◆ default_delete

const int default_delete[] = { 0, 10, 30, 50, 70, 90 }

Definition at line 30 of file seqperf.cpp.

Referenced by main(), and usage().

◆ default_intervals

const int default_intervals = 25

defaul interval count for cubic structured hex mesh

Definition at line 26 of file seqperf.cpp.

Referenced by main(), and usage().

◆ default_order

const int default_order[] = { 0, 1, 2 }

Definition at line 28 of file seqperf.cpp.

Referenced by main().

◆ default_query_count

const int default_query_count = 100

number of times to do each query set

Definition at line 27 of file seqperf.cpp.

Referenced by main(), and usage().

◆ delete_elems

iaf_t delete_elems[3]
Initial value:

Definition at line 132 of file seqperf.cpp.

Referenced by do_test().

◆ delete_verts

iaf_t delete_verts[3]
Initial value:

Definition at line 129 of file seqperf.cpp.

Referenced by do_test().

◆ dump_mesh

const bool dump_mesh = false

write mesh to vtk file

Definition at line 25 of file seqperf.cpp.

Referenced by do_test().

◆ elemStart

◆ mb

◆ mb_core

Core mb_core

moab instance

Definition at line 38 of file seqperf.cpp.

Referenced by get_number_sequences(), and main().

◆ numElem

◆ numSideInt

◆ numVert

◆ order_strs

const char* order_strs[] = { "Forward", "Reverse", "Random" }

Definition at line 135 of file seqperf.cpp.

Referenced by do_test().

◆ query_elem_verts

iaf_t query_elem_verts[3]

◆ query_elems

Definition at line 124 of file seqperf.cpp.

Referenced by do_test().

◆ query_verts

Definition at line 122 of file seqperf.cpp.

Referenced by do_test().

◆ queryCount

int queryCount

number of times to do each query set

Definition at line 35 of file seqperf.cpp.

Referenced by main(), and TIME_QRY().

◆ queryElemPermutation

long* queryElemPermutation = 0

pupulated by init(): "random" order for elements

Definition at line 43 of file seqperf.cpp.

Referenced by init(), main(), random_order_delete_elements(), random_order_query_element_verts(), and random_order_query_elements().

◆ queryVertPermutation

long* queryVertPermutation = 0

pupulated by init(): "random" order for vertices

Definition at line 42 of file seqperf.cpp.

Referenced by init(), main(), random_order_delete_vertices(), and random_order_query_vertices().

◆ readTool

ReadUtilIface* readTool = 0

Definition at line 41 of file seqperf.cpp.

Referenced by create_elements_block(), create_vertices_block(), and init().

◆ vertStart