|
MOAB: Mesh Oriented datABase
(version 5.4.1)
|
#include "moab/Core.hpp"#include "moab/CartVect.hpp"#include "moab/OrientedBoxTreeTool.hpp"#include "moab/OrientedBox.hpp"#include "Internals.hpp"#include "moab/Range.hpp"#include <iostream>#include <iomanip>#include <cstdio>#include <limits>#include <cstdlib>#include <ctime>#include <unistd.h>#include <sys/stat.h>#include <fcntl.h>
Include dependency graph for obb_tree_tool.cpp:Go to the source code of this file.
Classes | |
| struct | SimpleStat< T > |
| class | TriTagger |
| class | VtxTagger |
| class | LeafHexer |
Defines | |
| #define | IS_BUILDING_MB |
Functions | |
| std::string | clock_to_string (clock_t t) |
| std::string | mem_to_string (unsigned long mem) |
| ErrorCode | get_root (Interface *moab, EntityHandle &root) |
| EntityHandle | build_tree (Interface *interface, OrientedBoxTreeTool::Settings settings) |
| void | delete_existing_tree (Interface *interface) |
| void | print_stats (Interface *interface) |
| void | tag_triangles (Interface *interface) |
| void | tag_vertices (Interface *interface) |
| void | write_tree_blocks (Interface *interface, const char *file) |
| static void | usage (bool err=true) |
| static void | memory_use (unsigned long long &vsize, unsigned long long &rss) |
| static int | parseint (int &i, int argc, char *argv[]) |
| static double | parsedouble (int &i, int argc, char *argv[]) |
| int | main (int argc, char *argv[]) |
| static int | hash_handle (EntityHandle handle) |
Variables | |
| const int | MAX_TAG_VALUE = 20 |
| const char *const | TAG_NAME = "OBB_ID" |
| const char *const | TREE_TAG = "OBB_ROOT" |
| const char * | root_tag = TREE_TAG |
| #define IS_BUILDING_MB |
Definition at line 1 of file obb_tree_tool.cpp.
| EntityHandle build_tree | ( | Interface * | interface, |
| OrientedBoxTreeTool::Settings | settings | ||
| ) |
Definition at line 299 of file obb_tree_tool.cpp.
References moab::OrientedBoxTreeTool::build(), moab::Range::empty(), ErrorCode, moab::Interface::get_entities_by_type(), MB_SUCCESS, MB_TAG_CREAT, MB_TAG_SPARSE, MB_TYPE_HANDLE, MBTRI, mesh, root_tag, moab::Interface::tag_get_handle(), and moab::Interface::tag_set_data().
{
ErrorCode rval;
EntityHandle root = 0;
Range triangles;
rval = interface->get_entities_by_type( 0, MBTRI, triangles );
if( MB_SUCCESS != rval || triangles.empty() )
{
std::cerr << "No triangles from which to build tree." << std::endl;
exit( 4 );
}
OrientedBoxTreeTool tool( interface );
rval = tool.build( triangles, root, &settings );
if( MB_SUCCESS != rval || !root )
{
std::cerr << "Tree construction failed." << std::endl;
exit( 4 );
}
// store tree root
Tag roottag;
rval = interface->tag_get_handle( root_tag, 1, MB_TYPE_HANDLE, roottag, MB_TAG_CREAT | MB_TAG_SPARSE );
if( MB_SUCCESS != rval )
{
std::cout << "Failed to create root tag: \"" << root_tag << '"' << std::endl;
exit( 2 );
}
const EntityHandle mesh = 0;
rval = interface->tag_set_data( roottag, &mesh, 1, &root );
if( MB_SUCCESS != rval )
{
std::cout << "Failed to set root tag: \"" << root_tag << '"' << std::endl;
exit( 2 );
}
return root;
}
| std::string clock_to_string | ( | clock_t | t | ) |
| void delete_existing_tree | ( | Interface * | interface | ) |
| ErrorCode get_root | ( | Interface * | moab, |
| EntityHandle & | root | ||
| ) |
Definition at line 271 of file obb_tree_tool.cpp.
References ErrorCode, MB_SUCCESS, MB_TYPE_HANDLE, mesh, root_tag, moab::Interface::tag_get_data(), and moab::Interface::tag_get_handle().
Referenced by print_stats(), and tag_triangles().
{
Tag tag;
ErrorCode rval;
rval = moab->tag_get_handle( root_tag, 1, MB_TYPE_HANDLE, tag );
if( MB_SUCCESS != rval ) return rval;
const EntityHandle mesh = 0;
return moab->tag_get_data( tag, &mesh, 1, &root );
}
| static int hash_handle | ( | EntityHandle | handle | ) | [static] |
Definition at line 458 of file obb_tree_tool.cpp.
References moab::ID_FROM_HANDLE(), and MAX_TAG_VALUE.
Referenced by TriTagger::leaf(), VtxTagger::leaf(), and LeafHexer::leaf().
{
EntityID h = ID_FROM_HANDLE( handle );
return (int)( ( h * 13 + 7 ) % MAX_TAG_VALUE ) + 1;
}
| int main | ( | int | argc, |
| char * | argv[] | ||
| ) |
Definition at line 135 of file obb_tree_tool.cpp.
References moab::OrientedBoxTreeTool::Settings::best_split_ratio, build_time, build_tree(), clock_to_string(), delete_existing_tree(), ErrorCode, input_file, load_time, moab::OrientedBoxTreeTool::Settings::max_depth, moab::OrientedBoxTreeTool::Settings::max_leaf_entities, MB_SUCCESS, MESHSET_SET, parsedouble(), parseint(), print_stats(), root_tag, moab::OrientedBoxTreeTool::Settings::set_options, settings, tag_time(), tag_triangles(), tag_vertices(), usage, moab::OrientedBoxTreeTool::Settings::worst_split_ratio, and write_tree_blocks().
{
const char* input_file = 0;
const char* output_file = 0;
const char* tree_file = 0;
OrientedBoxTreeTool::Settings settings;
bool tag_tris = false;
clock_t load_time, build_time, stat_time, tag_time, write_time, block_time;
for( int i = 1; i < argc; ++i )
{
if( argv[i][0] != '-' )
{
if( !input_file )
input_file = argv[i];
else if( !output_file )
output_file = argv[i];
else
usage();
continue;
}
if( !argv[i][1] || argv[i][2] ) usage();
switch( argv[i][1] )
{
case 's':
settings.set_options = MESHSET_SET;
break;
case 'S':
settings.set_options = MESHSET_ORDERED;
break;
case 'd':
settings.max_depth = parseint( i, argc, argv );
break;
case 'n':
settings.max_leaf_entities = parseint( i, argc, argv );
break;
case 'm':
settings.worst_split_ratio = parsedouble( i, argc, argv );
break;
case 'M':
settings.best_split_ratio = parsedouble( i, argc, argv );
break;
case 't':
tag_tris = true;
break;
case 'T':
if( ++i == argc ) usage();
tree_file = argv[i];
break;
case 'N':
if( ++i == argc ) usage();
root_tag = argv[i];
break;
case 'h':
usage( false );
break;
default:
usage();
}
}
if( !output_file ) usage();
ErrorCode rval;
Core moab_core;
Interface* interface = &moab_core;
load_time = clock();
rval = interface->load_mesh( input_file );
if( MB_SUCCESS != rval )
{
std::cerr << "Error reading file: " << input_file << std::endl;
exit( 2 );
}
load_time = clock() - load_time;
delete_existing_tree( interface );
std::cout << "Building tree..." << std::endl;
build_time = clock();
build_tree( interface, settings );
build_time = clock() - build_time;
std::cout << "Calculating stats..." << std::endl;
print_stats( interface );
stat_time = clock() - build_time;
if( tag_tris )
{
std::cout << "Tagging tree..." << std::endl;
tag_triangles( interface );
tag_vertices( interface );
}
tag_time = clock() - stat_time;
std::cout << "Writing file... ";
std::cout.flush();
rval = interface->write_mesh( output_file );
if( MB_SUCCESS != rval )
{
std::cerr << "Error writing file: " << output_file << std::endl;
exit( 3 );
}
write_time = clock() - tag_time;
std::cout << "Wrote " << output_file << std::endl;
if( tree_file )
{
std::cout << "Writing tree block rep...";
std::cout.flush();
write_tree_blocks( interface, tree_file );
std::cout << "Wrote " << tree_file << std::endl;
}
block_time = clock() - write_time;
std::cout << "Times: "
<< " Load"
<< " Build"
<< " Stats"
<< " Write";
if( tag_tris ) std::cout << "Tag Sets";
if( tree_file ) std::cout << "Block ";
std::cout << std::endl;
std::cout << " " << std::setw( 8 ) << clock_to_string( load_time ) << std::setw( 8 )
<< clock_to_string( build_time ) << std::setw( 8 ) << clock_to_string( stat_time ) << std::setw( 8 )
<< clock_to_string( write_time );
if( tag_tris ) std::cout << std::setw( 8 ) << clock_to_string( tag_time );
if( tree_file ) std::cout << std::setw( 8 ) << clock_to_string( block_time );
std::cout << std::endl;
return 0;
}
| std::string mem_to_string | ( | unsigned long | mem | ) |
Definition at line 360 of file obb_tree_tool.cpp.
References buffer, and moab::unit().
{
char unit[3] = "B";
if( mem > 9 * 1024 )
{
mem = ( mem + 512 ) / 1024;
strcpy( unit, "kB" );
}
if( mem > 9 * 1024 )
{
mem = ( mem + 512 ) / 1024;
strcpy( unit, "MB" );
}
if( mem > 9 * 1024 )
{
mem = ( mem + 512 ) / 1024;
strcpy( unit, "GB" );
}
char buffer[256];
sprintf( buffer, "%lu %s", mem, unit );
return buffer;
}
| static void memory_use | ( | unsigned long long & | vsize, |
| unsigned long long & | rss | ||
| ) | [static] |
Definition at line 68 of file obb_tree_tool.cpp.
References buffer.
Referenced by print_stats().
{
char buffer[512];
unsigned long lvsize;
long lrss;
int filp = open( "/proc/self/stat", O_RDONLY );
ssize_t r = read( filp, buffer, sizeof( buffer ) - 1 );
close( filp );
if( r < 0 ) r = 0;
lvsize = lrss = 0;
buffer[r] = '\0';
sscanf( buffer,
"%*d %*s %*c " // pid command state
"%*d %*d " // ppid pgrp
"%*d %*d %*d " // session tty_nr tpgid
"%*u " // flags
"%*u %*u %*u %*u " // minflt cminflt majflt cmajflt
"%*u %*u %*d %*d " // utime stime cutime cstime
"%*d %*d %*d " // priority nice (unused)
"%*d %*u " // itrealval starttime
"%lu %ld",
&lvsize, &lrss );
rss = lrss * getpagesize();
vsize = lvsize;
}
| static double parsedouble | ( | int & | i, |
| int | argc, | ||
| char * | argv[] | ||
| ) | [static] |
Definition at line 115 of file obb_tree_tool.cpp.
References usage.
Referenced by main().
{
char* end;
++i;
if( i == argc )
{
std::cerr << "Expected value following '" << argv[i - 1] << "'" << std::endl;
usage();
}
double result = strtod( argv[i], &end );
if( result < 0 || *end )
{
std::cerr << "Expected positive real number following '" << argv[i - 1] << "'" << std::endl;
usage();
}
return result;
}
| static int parseint | ( | int & | i, |
| int | argc, | ||
| char * | argv[] | ||
| ) | [static] |
Definition at line 95 of file obb_tree_tool.cpp.
References usage.
Referenced by main().
{
char* end;
++i;
if( i == argc )
{
std::cerr << "Expected value following '" << argv[i - 1] << "'" << std::endl;
usage();
}
int result = strtol( argv[i], &end, 0 );
if( result < 0 || *end )
{
std::cerr << "Expected positive integer following '" << argv[i - 1] << "'" << std::endl;
usage();
}
return result;
}
| void print_stats | ( | Interface * | interface | ) |
Definition at line 410 of file obb_tree_tool.cpp.
References moab::Range::begin(), moab::Range::end(), moab::Range::erase(), ErrorCode, moab::Interface::estimated_memory_use(), moab::Interface::get_entities_by_type(), moab::Interface::get_number_entities_by_type(), get_root(), moab::Range::insert(), MB_SUCCESS, MBENTITYSET, MBTRI, MBVERTEX, moab::mem_to_string(), memory_use(), moab::Range::merge(), and moab::OrientedBoxTreeTool::stats().
{
EntityHandle root;
Range range;
ErrorCode rval;
rval = get_root( interface, root );
if( MB_SUCCESS != rval )
{
std::cerr << "Internal error: Failed to retrieve root." << std::endl;
exit( 5 );
}
OrientedBoxTreeTool tool( interface );
Range tree_sets, triangles, verts;
// interface->get_child_meshsets( root, tree_sets, 0 );
interface->get_entities_by_type( 0, MBENTITYSET, tree_sets );
tree_sets.erase( tree_sets.begin(), Range::lower_bound( tree_sets.begin(), tree_sets.end(), root ) );
interface->get_entities_by_type( 0, MBTRI, triangles );
interface->get_entities_by_type( 0, MBVERTEX, verts );
triangles.merge( verts );
tree_sets.insert( root );
unsigned long long set_used, set_amortized, set_store_used, set_store_amortized, set_tag_used, set_tag_amortized,
tri_used, tri_amortized;
interface->estimated_memory_use( tree_sets, &set_used, &set_amortized, &set_store_used, &set_store_amortized, 0, 0,
0, 0, &set_tag_used, &set_tag_amortized );
interface->estimated_memory_use( triangles, &tri_used, &tri_amortized );
int num_tri = 0;
interface->get_number_entities_by_type( 0, MBTRI, num_tri );
tool.stats( root, std::cout );
unsigned long long real_rss, real_vsize;
memory_use( real_vsize, real_rss );
printf( "------------------------------------------------------------------\n" );
printf( "\nmemory: used amortized\n" );
printf( " ---------- ----------\n" );
printf( "triangles %10s %10s\n", mem_to_string( tri_used ).c_str(), mem_to_string( tri_amortized ).c_str() );
printf( "sets (total)%10s %10s\n", mem_to_string( set_used ).c_str(), mem_to_string( set_amortized ).c_str() );
printf( "sets %10s %10s\n", mem_to_string( set_store_used ).c_str(),
mem_to_string( set_store_amortized ).c_str() );
printf( "set tags %10s %10s\n", mem_to_string( set_tag_used ).c_str(),
mem_to_string( set_tag_amortized ).c_str() );
printf( "total real %10s %10s\n", mem_to_string( real_rss ).c_str(), mem_to_string( real_vsize ).c_str() );
printf( "------------------------------------------------------------------\n" );
}
| void tag_triangles | ( | Interface * | interface | ) |
Definition at line 492 of file obb_tree_tool.cpp.
References ErrorCode, get_root(), MB_SUCCESS, MB_TAG_CREAT, MB_TAG_DENSE, MB_TYPE_INTEGER, moab::OrientedBoxTreeTool::preorder_traverse(), moab::Interface::tag_get_handle(), and TAG_NAME.
Referenced by main().
{
EntityHandle root;
ErrorCode rval = get_root( moab, root );
if( MB_SUCCESS != rval )
{
std::cerr << "Internal error: Failed to retrieve tree." << std::endl;
exit( 5 );
}
Tag tag;
int zero = 0;
moab->tag_get_handle( TAG_NAME, 1, MB_TYPE_INTEGER, tag, MB_TAG_DENSE | MB_TAG_CREAT, &zero );
TriTagger op( tag, moab );
OrientedBoxTreeTool tool( moab );
rval = tool.preorder_traverse( root, op );
if( MB_SUCCESS != rval )
{
std::cerr << "Internal error tagging triangles" << std::endl;
exit( 5 );
}
}
| void tag_vertices | ( | Interface * | interface | ) |
| static void usage | ( | bool | err = true | ) | [static] |
Definition at line 39 of file obb_tree_tool.cpp.
References moab::OrientedBoxTreeTool::Settings::best_split_ratio, moab::OrientedBoxTreeTool::Settings::max_depth, moab::OrientedBoxTreeTool::Settings::max_leaf_entities, TREE_TAG, and moab::OrientedBoxTreeTool::Settings::worst_split_ratio.
{
std::ostream& s = err ? std::cerr : std::cout;
s << "obb_tree_tool [-s|-S] [-d <int>] [-n <int>] <input file> <output file>" << std::endl
<< "obb_tree_tool [-h]" << std::endl;
if( !err )
{
OrientedBoxTreeTool::Settings st;
s << "Tool to build adaptive kd-Tree from triangles" << std::endl;
s << " -s Use range-based sets for tree nodes" << std::endl
<< " -S Use vector-based sets for tree nodes" << std::endl
<< " -d <int> Specify maximum depth for tree. Default: " << st.max_depth << std::endl
<< " -n <int> Specify maximum entities per leaf. Default: " << st.max_leaf_entities << std::endl
<< " -m <real> Specify worst split ratio. Default: " << st.worst_split_ratio << std::endl
<< " -M <real> Specify best split ratio. Default: " << st.best_split_ratio << std::endl
<< " -t Tag triangles will tree cell number." << std::endl
<< " -T Write tree boxes to file." << std::endl
<< " -N Specify mesh tag containing tree root. Default: \"" << TREE_TAG << '"' << std::endl
<< std::endl;
}
exit( err );
}
| void write_tree_blocks | ( | Interface * | interface, |
| const char * | file | ||
| ) |
| const int MAX_TAG_VALUE = 20 |
Definition at line 26 of file obb_tree_tool.cpp.
Definition at line 29 of file obb_tree_tool.cpp.
Referenced by build_tree(), get_root(), and main().
| const char* const TAG_NAME = "OBB_ID" |
Definition at line 27 of file obb_tree_tool.cpp.
| const char* const TREE_TAG = "OBB_ROOT" |
Definition at line 28 of file obb_tree_tool.cpp.
Referenced by usage().