MOAB: Mesh Oriented datABase
(version 5.4.1)
|
#include <cmath>
#include <iostream>
#include <iomanip>
#include <ctime>
#include <cassert>
#include <list>
#include "moab/Core.hpp"
#include "moab/Skinner.hpp"
#include "moab/ReadUtilIface.hpp"
Go to the source code of this file.
Typedefs | |
typedef void(* | test_func_t )(int, int, int) |
Functions | |
void | create_regular_mesh (int interval, int dimension) |
void | skin_common (int interval, int dim, int blocks, bool use_adj) |
void | skin (int intervals, int dim, int num) |
void | skin_adj (int intervals, int dim, int num) |
void | tag_time (TagType storage, bool direct, int intervals, int dim, int blocks) |
void | dense_tag (int intervals, int dim, int blocks) |
void | sparse_tag (int intervals, int dim, int blocks) |
void | direct_tag (int intervals, int dim, int blocks) |
void | usage (const char *argv0, bool error=true) |
void | list_tests () |
int | main (int argc, char *argv[]) |
void | create_regular_mesh (Interface *gMB, int interval, int dim) |
Variables | |
double | LENGTH = 1.0 |
const int | DEFAULT_INTERVALS = 50 |
struct { | |
std::string testName | |
test_func_t testFunc | |
std::string testDesc | |
} | TestList [] |
const int | TestListSize = sizeof( TestList ) / sizeof( TestList[0] ) |
typedef void( * test_func_t)(int, int, int) |
Definition at line 65 of file perftool.cpp.
void create_regular_mesh | ( | int | interval, |
int | dimension | ||
) |
Referenced by skin_common(), and tag_time().
void create_regular_mesh | ( | Interface * | gMB, |
int | interval, | ||
int | dim | ||
) |
Definition at line 220 of file perftool.cpp.
References dim, ErrorCode, moab::ReadUtilIface::get_element_connect(), moab::ReadUtilIface::get_node_coords(), MB_SUCCESS, MBEDGE, MBHEX, MBQUAD, moab::Interface::query_interface(), and moab::ReadUtilIface::update_adjacencies().
{ if( dim < 1 || dim > 3 || interval < 1 ) { std::cerr << "Invalid arguments" << std::endl; exit( 1 ); } const int nvi = interval + 1; const int dims[3] = { nvi, dim > 1 ? nvi : 1, dim > 2 ? nvi : 1 }; int num_vert = dims[0] * dims[1] * dims[2]; ReadUtilIface* readMeshIface; gMB->query_interface( readMeshIface ); EntityHandle vstart; std::vector< double* > arrays; ErrorCode rval = readMeshIface->get_node_coords( 3, num_vert, 1, vstart, arrays ); if( MB_SUCCESS != rval || arrays.size() < 3 ) { std::cerr << "Vertex creation failed" << std::endl; exit( 2 ); } double *x = arrays[0], *y = arrays[1], *z = arrays[2]; // Calculate vertex coordinates for( int k = 0; k < dims[2]; ++k ) for( int j = 0; j < dims[1]; ++j ) for( int i = 0; i < dims[0]; ++i ) { *x = i; ++x; *y = j; ++y; *z = k; ++z; } const long vert_per_elem = 1 << dim; // 2^dim const long intervals[3] = { interval, dim > 1 ? interval : 1, dim > 2 ? interval : 1 }; const long num_elem = intervals[0] * intervals[1] * intervals[2]; const EntityType type = ( dim == 1 ) ? MBEDGE : ( dim == 2 ) ? MBQUAD : MBHEX; EntityHandle estart, *conn = 0; rval = readMeshIface->get_element_connect( num_elem, vert_per_elem, type, 0, estart, conn ); if( MB_SUCCESS != rval || !conn ) { std::cerr << "Element creation failed" << std::endl; exit( 2 ); } // Offsets of element vertices in grid relative to corner closest to origin long c = dims[0] * dims[1]; const long corners[8] = { 0, 1, 1 + dims[0], dims[0], c, c + 1, c + 1 + dims[0], c + dims[0] }; // Populate element list EntityHandle* iter = conn; for( long z1 = 0; z1 < intervals[2]; ++z1 ) for( long y1 = 0; y1 < intervals[1]; ++y1 ) for( long x1 = 0; x1 < intervals[0]; ++x1 ) { const long index = x1 + y1 * dims[0] + z1 * ( dims[0] * dims[1] ); for( long j = 0; j < vert_per_elem; ++j, ++iter ) *iter = index + corners[j] + vstart; } // notify MOAB of the new elements rval = readMeshIface->update_adjacencies( estart, num_elem, vert_per_elem, conn ); if( MB_SUCCESS != rval ) { std::cerr << "Element update failed" << std::endl; exit( 2 ); } }
void dense_tag | ( | int | intervals, |
int | dim, | ||
int | blocks | ||
) |
Definition at line 49 of file perftool.cpp.
References MB_TAG_DENSE, and tag_time().
{ std::cout << "Dense Tag Time:"; tag_time( MB_TAG_DENSE, false, intervals, dim, blocks ); }
void direct_tag | ( | int | intervals, |
int | dim, | ||
int | blocks | ||
) |
Definition at line 59 of file perftool.cpp.
References MB_TAG_DENSE, and tag_time().
{ std::cout << "Direct Tag Time:"; tag_time( MB_TAG_DENSE, true, intervals, dim, blocks ); }
void list_tests | ( | ) |
Definition at line 96 of file perftool.cpp.
References testDesc, TestList, TestListSize, and testName.
Referenced by main(), and runner_run_tests().
{ unsigned max_test_name = 0, max_test_desc = 0; for( int i = 0; i < TestListSize; ++i ) { if( TestList[i].testName.size() > max_test_name ) max_test_name = TestList[i].testName.size(); if( TestList[i].testDesc.size() > max_test_desc ) max_test_desc = TestList[i].testDesc.size(); } std::cout << std::setw( max_test_name ) << "NAME" << " " << std::setw( max_test_desc ) << std::left << "DESCRIPTION" << std::endl << std::setfill( '-' ) << std::setw( max_test_name ) << "" << " " << std::setfill( '-' ) << std::setw( max_test_desc ) << "" << std::setfill( ' ' ) << std::endl; for( int i = 0; i < TestListSize; ++i ) std::cout << std::setw( max_test_name ) << TestList[i].testName << " : " << std::setw( max_test_desc ) << std::left << TestList[i].testDesc << std::endl; }
int main | ( | int | argc, |
char * | argv[] | ||
) |
Definition at line 113 of file perftool.cpp.
References DEFAULT_INTERVALS, list_tests(), testFunc, TestList, TestListSize, testName, and usage.
{ int intervals = DEFAULT_INTERVALS; int dimension = 3; int number = 0; std::vector< test_func_t > test_list; std::list< int* > expected_list; bool did_help = false; for( int i = 1; i < argc; ++i ) { if( !expected_list.empty() ) { int* ptr = expected_list.front(); expected_list.pop_front(); char* endptr; *ptr = strtol( argv[i], &endptr, 0 ); if( !endptr ) { usage( argv[0] ); std::cerr << "Expected integer value, got \"" << argv[i] << '"' << std::endl; return 1; } } else if( *argv[i] == '-' ) { // flag for( int j = 1; argv[i][j]; ++j ) { switch( argv[i][j] ) { case 'i': expected_list.push_back( &intervals ); break; case 'd': expected_list.push_back( &dimension ); break; case 'n': expected_list.push_back( &number ); break; case 'h': did_help = true; usage( argv[0], false ); break; case 'l': did_help = true; list_tests(); break; default: usage( argv[0] ); std::cerr << "Invalid option: -" << argv[i][j] << std::endl; return 1; } } } else { int j = -1; do { ++j; if( j >= TestListSize ) { usage( argv[0] ); std::cerr << "Invalid test name: " << argv[i] << std::endl; return 1; } } while( TestList[j].testName != argv[i] ); test_list.push_back( TestList[j].testFunc ); } } if( !expected_list.empty() ) { usage( argv[0] ); std::cerr << "Missing final argument" << std::endl; return 1; } // error if no input if( test_list.empty() && !did_help ) { usage( argv[0] ); std::cerr << "No tests specified" << std::endl; return 1; } if( intervals < 1 ) { std::cerr << "Invalid interval count: " << intervals << std::endl; return 1; } if( dimension < 1 || dimension > 3 ) { std::cerr << "Invalid dimension: " << dimension << std::endl; return 1; } // now run the tests for( std::vector< test_func_t >::iterator i = test_list.begin(); i != test_list.end(); ++i ) { test_func_t fptr = *i; fptr( intervals, dimension, number ); } return 0; }
void skin | ( | int | intervals, |
int | dim, | ||
int | num | ||
) |
Definition at line 36 of file perftool.cpp.
References skin_common().
Referenced by DeformMeshRemap::execute(), get_expected_ghosts(), moab::LloydSmoother::initialize(), mb_skin_adjacent_surf_patches(), mb_skin_curve_test_common(), mb_skin_full_common(), mb_skin_higher_order_faces_common(), mb_skin_higher_order_regions_common(), mb_skin_poly_test(), mb_skin_subset_common(), mb_skin_surface_test_common(), mb_skin_volume_test_common(), print_output(), and skin_common().
{ std::cout << "Skinning w/out adjacencies:" << std::endl; skin_common( intervals, dim, num, false ); }
void skin_adj | ( | int | intervals, |
int | dim, | ||
int | num | ||
) |
Definition at line 41 of file perftool.cpp.
References skin_common().
{ std::cout << "Skinning with adjacencies:" << std::endl; skin_common( intervals, dim, num, true ); }
void skin_common | ( | int | interval, |
int | dim, | ||
int | blocks, | ||
bool | use_adj | ||
) |
Definition at line 295 of file perftool.cpp.
References moab::Range::begin(), moab::Range::clear(), create_regular_mesh(), moab::Range::empty(), ErrorCode, moab::Interface::get_adjacencies(), moab::Interface::get_entities_by_dimension(), gMB, MB_SUCCESS, moab::Range::merge(), moab::Range::size(), skin(), t, and moab::Interface::UNION.
Referenced by skin(), and skin_adj().
{ Core moab; Interface* gMB = &moab; ErrorCode rval; double d; clock_t t, tt; create_regular_mesh( gMB, interval, dim ); Range skin, verts, elems; rval = gMB->get_entities_by_dimension( 0, dim, elems ); assert( MB_SUCCESS == rval ); assert( !elems.empty() ); Skinner tool( gMB ); t = clock(); rval = tool.find_skin( 0, elems, true, verts, 0, use_adj, false ); t = clock() - t; if( MB_SUCCESS != rval ) { std::cerr << "Search for skin vertices failed" << std::endl; exit( 2 ); } d = ( (double)t ) / CLOCKS_PER_SEC; std::cout << "Got " << verts.size() << " skin vertices in " << d << " seconds." << std::endl; t = 0; if( num < 1 ) num = 1000; long blocksize = elems.size() / num; if( !blocksize ) blocksize = 1; long numblocks = elems.size() / blocksize; Range::iterator it = elems.begin(); for( long i = 0; i < numblocks; ++i ) { verts.clear(); Range::iterator end = it + blocksize; Range blockelems; blockelems.merge( it, end ); it = end; tt = clock(); rval = tool.find_skin( 0, blockelems, true, verts, 0, use_adj, false ); t += clock() - tt; if( MB_SUCCESS != rval ) { std::cerr << "Search for skin vertices failed" << std::endl; exit( 2 ); } } d = ( (double)t ) / CLOCKS_PER_SEC; std::cout << "Got skin vertices for " << numblocks << " blocks of " << blocksize << " elements in " << d << " seconds." << std::endl; for( int e = 0; e < 2; ++e ) { // do this twice if( e == 1 ) { // create all interior faces skin.clear(); t = clock(); gMB->get_adjacencies( elems, dim - 1, true, skin, Interface::UNION ); t = clock() - t; d = ( (double)t ) / CLOCKS_PER_SEC; std::cout << "Created " << skin.size() << " entities of dimension-1 in " << d << " seconds" << std::endl; } skin.clear(); t = clock(); rval = tool.find_skin( 0, elems, false, skin, 0, use_adj, true ); t = clock() - t; if( MB_SUCCESS != rval ) { std::cerr << "Search for skin vertices failed" << std::endl; exit( 2 ); } d = ( (double)t ) / CLOCKS_PER_SEC; std::cout << "Got " << skin.size() << " skin elements in " << d << " seconds." << std::endl; t = 0; it = elems.begin(); for( long i = 0; i < numblocks; ++i ) { skin.clear(); Range::iterator end = it + blocksize; Range blockelems; blockelems.merge( it, end ); it = end; tt = clock(); rval = tool.find_skin( 0, blockelems, false, skin, 0, use_adj, true ); t += clock() - tt; if( MB_SUCCESS != rval ) { std::cerr << "Search for skin elements failed" << std::endl; exit( 2 ); } } d = ( (double)t ) / CLOCKS_PER_SEC; std::cout << "Got skin elements for " << numblocks << " blocks of " << blocksize << " elements in " << d << " seconds." << std::endl; } }
void sparse_tag | ( | int | intervals, |
int | dim, | ||
int | blocks | ||
) |
Definition at line 54 of file perftool.cpp.
References MB_TAG_SPARSE, and tag_time().
{ std::cout << "Sparse Tag Time:"; tag_time( MB_TAG_SPARSE, false, intervals, dim, blocks ); }
Definition at line 398 of file perftool.cpp.
References moab::Range::begin(), moab::Range::clear(), create_regular_mesh(), moab::Range::end(), moab::Interface::get_entities_by_type(), mb, MB_TAG_CREAT, MB_TYPE_DOUBLE, MBVERTEX, moab::Range::merge(), moab::Range::size(), t, moab::Interface::tag_get_data(), moab::Interface::tag_get_handle(), moab::Interface::tag_iterate(), and moab::Interface::tag_set_data().
Referenced by dense_tag(), direct_tag(), main(), and sparse_tag().
{ Core moab; Interface& mb = moab; create_regular_mesh( &mb, intervals, dim ); // Create tag in which to store data Tag tag; mb.tag_get_handle( "data", 1, MB_TYPE_DOUBLE, tag, storage | MB_TAG_CREAT ); // Make up some arbitrary iterative calculation for timing purposes: // set each value v_n = (V + v_n)/2 until all values are within // epsilon of V. std::vector< double > data; Range verts; mb.get_entities_by_type( 0, MBVERTEX, verts ); clock_t t = clock(); // initialize if( direct ) { Range::iterator i, j = verts.begin(); void* ptr; int count; while( j != verts.end() ) { mb.tag_iterate( tag, i, verts.end(), count, ptr ); double* arr = reinterpret_cast< double* >( ptr ); for( j = i + count; i != j; ++i, ++arr ) *arr = ( 11.0 * *i + 7.0 ) / ( *i ); } } else { data.resize( verts.size() ); double* arr = &data[0]; for( Range::iterator i = verts.begin(); i != verts.end(); ++i, ++arr ) *arr = ( 11.0 * *i + 7.0 ) / ( *i ); mb.tag_set_data( tag, verts, &data[0] ); } // iterate const double v0 = acos( -1.0 ); // pi size_t iter_count = 0; double max_diff; const size_t num_verts = verts.size(); do { if( direct ) { max_diff = 0.0; Range::iterator i, j = verts.begin(); void* ptr; while( j != verts.end() ) { int count; mb.tag_iterate( tag, i, verts.end(), count, ptr ); double* arr = reinterpret_cast< double* >( ptr ); for( j = i + count; i != j; ++i, ++arr ) { *arr = 0.5 * ( *arr + v0 ); double diff = fabs( *arr - v0 ); if( diff > max_diff ) max_diff = diff; } } } else if( blocks < 1 ) { max_diff = 0.0; mb.tag_get_data( tag, verts, &data[0] ); for( size_t i = 0; i < data.size(); ++i ) { data[i] = 0.5 * ( v0 + data[i] ); double diff = fabs( data[i] - v0 ); if( diff > max_diff ) max_diff = diff; } mb.tag_set_data( tag, verts, &data[0] ); } else { max_diff = 0.0; Range r; Range::iterator it = verts.begin(); size_t step = num_verts / blocks; for( int j = 0; j < blocks - 1; ++j ) { Range::iterator nx = it; nx += step; r.clear(); r.merge( it, nx ); mb.tag_get_data( tag, r, &data[0] ); it = nx; for( size_t i = 0; i < step; ++i ) { data[i] = 0.5 * ( v0 + data[i] ); double diff = fabs( data[i] - v0 ); if( diff > max_diff ) max_diff = diff; } mb.tag_set_data( tag, r, &data[0] ); } r.clear(); r.merge( it, verts.end() ); mb.tag_get_data( tag, r, &data[0] ); for( size_t i = 0; i < ( num_verts - ( blocks - 1 ) * step ); ++i ) { data[i] = 0.5 * ( v0 + data[i] ); double diff = fabs( data[i] - v0 ); if( diff > max_diff ) max_diff = diff; } mb.tag_set_data( tag, r, &data[0] ); } ++iter_count; // std::cout << iter_count << " " << max_diff << std::endl; } while( max_diff > 1e-6 ); double secs = ( clock() - t ) / (double)CLOCKS_PER_SEC; std::cout << " " << iter_count << " iterations in " << secs << " seconds" << std::endl; }
void usage | ( | const char * | argv0, |
bool | error = true |
||
) |
Definition at line 80 of file perftool.cpp.
References DEFAULT_INTERVALS, and moab::error().
{ std::ostream& str = error ? std::cerr : std::cout; str << "Usage: " << argv0 << " [-i <ints_per_side>] [-d <dimension>] [-n <test_specifc_int>] <test_name> " "[<test_name2> ...]" << std::endl; str << " " << argv0 << " [-h|-l]" << std::endl; if( error ) return; str << " -i : specify interverals per side (num hex = ints^3, default: " << DEFAULT_INTERVALS << std::endl; str << " -d : specify element dimension, default: 3" << std::endl; str << " -n : specify an integer value that for which the meaning is test-specific" << std::endl; str << " -h : print this help text." << std::endl; str << " -l : list available tests" << std::endl; }
const int DEFAULT_INTERVALS = 50 |
Definition at line 32 of file perftool.cpp.
double LENGTH = 1.0 |
Definition at line 31 of file perftool.cpp.
std::string testDesc |
Definition at line 70 of file perftool.cpp.
Referenced by list_tests().
Definition at line 69 of file perftool.cpp.
Referenced by main(), runner_find_test_func(), and runner_run_tests().
struct { ... } TestList[] |
Referenced by list_tests(), and main().
const int TestListSize = sizeof( TestList ) / sizeof( TestList[0] ) |
Definition at line 78 of file perftool.cpp.
Referenced by list_tests(), and main().
std::string testName |
Definition at line 68 of file perftool.cpp.
Referenced by free_test_list(), list_tests(), main(), runner_find_test_name(), runner_list_tests(), and runner_run_tests().