35 void skin_common(
int interval,
int dim,
int blocks,
bool use_adj );
36 void skin(
int intervals,
int dim,
int num )
38 std::cout <<
"Skinning w/out adjacencies:" << std::endl;
43 std::cout <<
"Skinning with adjacencies:" << std::endl;
51 std::cout <<
"Dense Tag Time:";
56 std::cout <<
"Sparse Tag Time:";
61 std::cout <<
"Direct Tag Time:";
72 {
"skin", &
skin,
"Test time to get skin mesh w/out adjacencies" },
73 {
"skin_adj", &
skin_adj,
"Test time to get skin mesh with adjacencies" },
74 {
"sparse", &
sparse_tag,
"Sparse tag data manipulation" },
75 {
"dense", &
dense_tag,
"Dense tag data manipulation" },
76 {
"direct", &
direct_tag,
"Dense tag data manipulation using direct data access" },
82 std::ostream& str =
error ? std::cerr : std::cout;
83 str <<
"Usage: " <<
argv0
84 <<
" [-i <ints_per_side>] [-d <dimension>] [-n <test_specifc_int>] <test_name> "
87 str <<
" " <<
argv0 <<
" [-h|-l]" << std::endl;
89 str <<
" -i : specify interverals per side (num hex = ints^3, default: " <<
DEFAULT_INTERVALS << std::endl;
90 str <<
" -d : specify element dimension, default: 3" << std::endl;
91 str <<
" -n : specify an integer value that for which the meaning is test-specific" << std::endl;
92 str <<
" -h : print this help text." << std::endl;
93 str <<
" -l : list available tests" << std::endl;
98 unsigned max_test_name = 0, max_test_desc = 0;
104 std::cout << std::setw( max_test_name ) <<
"NAME"
105 <<
" " << std::setw( max_test_desc ) << std::left <<
"DESCRIPTION" << std::endl
106 << std::setfill(
'-' ) << std::setw( max_test_name ) <<
""
107 <<
" " << std::setfill(
'-' ) << std::setw( max_test_desc ) <<
"" << std::setfill(
' ' ) << std::endl;
109 std::cout << std::setw( max_test_name ) <<
TestList[i].testName <<
" : " << std::setw( max_test_desc )
110 << std::left <<
TestList[i].testDesc << std::endl;
113 int main(
int argc,
char* argv[] )
118 std::vector< test_func_t > test_list;
119 std::list< int* > expected_list;
120 bool did_help =
false;
121 for(
int i = 1; i < argc; ++i )
123 if( !expected_list.empty() )
125 int* ptr = expected_list.front();
126 expected_list.pop_front();
128 *ptr = strtol( argv[i], &endptr, 0 );
132 std::cerr <<
"Expected integer value, got \"" << argv[i] <<
'"' << std::endl;
136 else if( *argv[i] ==
'-' )
138 for(
int j = 1; argv[i][j]; ++j )
143 expected_list.push_back( &intervals );
146 expected_list.push_back( &dimension );
149 expected_list.push_back( &number );
153 usage( argv[0],
false );
161 std::cerr <<
"Invalid option: -" << argv[i][j] << std::endl;
175 std::cerr <<
"Invalid test name: " << argv[i] << std::endl;
183 if( !expected_list.empty() )
186 std::cerr <<
"Missing final argument" << std::endl;
191 if( test_list.empty() && !did_help )
194 std::cerr <<
"No tests specified" << std::endl;
200 std::cerr <<
"Invalid interval count: " << intervals << std::endl;
204 if( dimension < 1 || dimension > 3 )
206 std::cerr <<
"Invalid dimension: " << dimension << std::endl;
211 for( std::vector< test_func_t >::iterator i = test_list.begin(); i != test_list.end(); ++i )
214 fptr( intervals, dimension, number );
222 if( dim < 1 || dim > 3 || interval < 1 )
224 std::cerr <<
"Invalid arguments" << std::endl;
228 const int nvi = interval + 1;
229 const int dims[3] = { nvi,
dim > 1 ? nvi : 1,
dim > 2 ? nvi : 1 };
230 int num_vert = dims[0] * dims[1] * dims[2];
236 std::vector< double* > arrays;
240 std::cerr <<
"Vertex creation failed" << std::endl;
243 double *x = arrays[0], *y = arrays[1], *z = arrays[2];
246 for(
int k = 0; k < dims[2]; ++k )
247 for(
int j = 0; j < dims[1]; ++j )
248 for(
int i = 0; i < dims[0]; ++i )
258 const long vert_per_elem = 1 <<
dim;
259 const long intervals[3] = { interval,
dim > 1 ? interval : 1,
dim > 2 ? interval : 1 };
260 const long num_elem = intervals[0] * intervals[1] * intervals[2];
264 rval = readMeshIface->
get_element_connect( num_elem, vert_per_elem, type, 0, estart, conn );
267 std::cerr <<
"Element creation failed" << std::endl;
272 long c = dims[0] * dims[1];
273 const long corners[8] = { 0, 1, 1 + dims[0], dims[0], c, c + 1, c + 1 + dims[0], c + dims[0] };
277 for(
long z1 = 0; z1 < intervals[2]; ++z1 )
278 for(
long y1 = 0; y1 < intervals[1]; ++y1 )
279 for(
long x1 = 0; x1 < intervals[0]; ++x1 )
281 const long index = x1 + y1 * dims[0] + z1 * ( dims[0] * dims[1] );
282 for(
long j = 0; j < vert_per_elem; ++j, ++iter )
283 *iter = index + corners[j] + vstart;
290 std::cerr <<
"Element update failed" << std::endl;
308 assert( !elems.
empty() );
313 rval = tool.
find_skin( 0, elems,
true, verts, 0, use_adj,
false );
317 std::cerr <<
"Search for skin vertices failed" << std::endl;
320 d = ( (double)
t ) / CLOCKS_PER_SEC;
321 std::cout <<
"Got " << verts.
size() <<
" skin vertices in " << d <<
" seconds." << std::endl;
324 if( num < 1 ) num = 1000;
325 long blocksize = elems.
size() / num;
326 if( !blocksize ) blocksize = 1;
327 long numblocks = elems.
size() / blocksize;
329 for(
long i = 0; i < numblocks; ++i )
334 blockelems.
merge( it, end );
337 rval = tool.
find_skin( 0, blockelems,
true, verts, 0, use_adj,
false );
341 std::cerr <<
"Search for skin vertices failed" << std::endl;
345 d = ( (double)
t ) / CLOCKS_PER_SEC;
346 std::cout <<
"Got skin vertices for " << numblocks <<
" blocks of " << blocksize <<
" elements in " << d
347 <<
" seconds." << std::endl;
349 for(
int e = 0; e < 2; ++e )
358 d = ( (double)
t ) / CLOCKS_PER_SEC;
359 std::cout <<
"Created " <<
skin.size() <<
" entities of dimension-1 in " << d <<
" seconds" << std::endl;
364 rval = tool.
find_skin( 0, elems,
false,
skin, 0, use_adj,
true );
368 std::cerr <<
"Search for skin vertices failed" << std::endl;
371 d = ( (double)
t ) / CLOCKS_PER_SEC;
372 std::cout <<
"Got " <<
skin.size() <<
" skin elements in " << d <<
" seconds." << std::endl;
376 for(
long i = 0; i < numblocks; ++i )
381 blockelems.
merge( it, end );
384 rval = tool.
find_skin( 0, blockelems,
false,
skin, 0, use_adj,
true );
388 std::cerr <<
"Search for skin elements failed" << std::endl;
392 d = ( (double)
t ) / CLOCKS_PER_SEC;
393 std::cout <<
"Got skin elements for " << numblocks <<
" blocks of " << blocksize <<
" elements in " << d
394 <<
" seconds." << std::endl;
411 std::vector< double > data;
423 while( j != verts.
end() )
426 double* arr =
reinterpret_cast< double*
>( ptr );
427 for( j = i + count; i != j; ++i, ++arr )
428 *arr = ( 11.0 * *i + 7.0 ) / ( *i );
433 data.resize( verts.
size() );
434 double* arr = &data[0];
436 *arr = ( 11.0 * *i + 7.0 ) / ( *i );
441 const double v0 = acos( -1.0 );
442 size_t iter_count = 0;
444 const size_t num_verts = verts.
size();
452 while( j != verts.
end() )
456 double* arr =
reinterpret_cast< double*
>( ptr );
458 for( j = i + count; i != j; ++i, ++arr )
460 *arr = 0.5 * ( *arr + v0 );
461 double diff = fabs( *arr - v0 );
462 if( diff > max_diff ) max_diff = diff;
466 else if( blocks < 1 )
470 for(
size_t i = 0; i < data.size(); ++i )
472 data[i] = 0.5 * ( v0 + data[i] );
473 double diff = fabs( data[i] - v0 );
474 if( diff > max_diff ) max_diff = diff;
483 size_t step = num_verts / blocks;
484 for(
int j = 0; j < blocks - 1; ++j )
493 for(
size_t i = 0; i < step; ++i )
495 data[i] = 0.5 * ( v0 + data[i] );
496 double diff = fabs( data[i] - v0 );
497 if( diff > max_diff ) max_diff = diff;
505 for(
size_t i = 0; i < ( num_verts - ( blocks - 1 ) * step ); ++i )
507 data[i] = 0.5 * ( v0 + data[i] );
508 double diff = fabs( data[i] - v0 );
509 if( diff > max_diff ) max_diff = diff;
515 }
while( max_diff > 1e-6 );
517 double secs = ( clock() -
t ) / (
double)CLOCKS_PER_SEC;
518 std::cout <<
" " << iter_count <<
" iterations in " << secs <<
" seconds" << std::endl;