![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #include "moab/Range.hpp"
00002 #include "moab/Core.hpp"
00003 #include "moab/Skinner.hpp"
00004 #include
00005 #include
00006
00007 using namespace moab;
00008
00009 enum
00010 {
00011 NO_ERROR = 0,
00012 SYNTAX_ERROR = 1,
00013 FILE_IO_ERROR = 2,
00014 INTERNAL_ERROR = 3
00015 };
00016
00017 const char* DEFAULT_TAG_NAME = "depth";
00018
00019 static void usage( const char* argv0 )
00020 {
00021 std::cerr << "Usage: " << argv0 << "[-t " << std::endl
00022 << argv0 << "-h" << std::endl;
00023 exit( SYNTAX_ERROR );
00024 }
00025
00026 static void check( ErrorCode rval )
00027 {
00028 if( MB_SUCCESS != rval )
00029 {
00030 std::cerr << "Internal error. Aborting." << std::endl;
00031 exit( INTERNAL_ERROR );
00032 }
00033 }
00034
00035 static void tag_depth( Interface& moab, Tag tag );
00036
00037 int main( int argc, char* argv[] )
00038 {
00039 const char *input = 0, *output = 0, *tagname = DEFAULT_TAG_NAME;
00040 bool expect_tag_name = false;
00041 for( int i = 1; i < argc; ++i )
00042 {
00043 if( expect_tag_name )
00044 {
00045 tagname = argv[i];
00046 expect_tag_name = false;
00047 }
00048 else if( !strcmp( "-t", argv[i] ) )
00049 expect_tag_name = true;
00050 else if( input == 0 )
00051 input = argv[i];
00052 else if( output == 0 )
00053 output = argv[i];
00054 else
00055 {
00056 std::cerr << "Unexpected argument: '" << argv[i] << "'" << std::endl;
00057 usage( argv[0] );
00058 }
00059 }
00060
00061 if( expect_tag_name )
00062 {
00063 std::cerr << "Expected argument following '-t'" << std::endl;
00064 usage( argv[0] );
00065 }
00066 if( !input )
00067 {
00068 std::cerr << "No input file" << std::endl;
00069 usage( argv[0] );
00070 }
00071 if( !output )
00072 {
00073 std::cerr << "No output file" << std::endl;
00074 usage( argv[0] );
00075 }
00076
00077 Core moab;
00078 Interface& mb = moab;
00079
00080 EntityHandle file;
00081 ErrorCode rval;
00082 rval = mb.create_meshset( MESHSET_SET, file );
00083 check( rval );
00084 rval = mb.load_file( input, &file );
00085 if( MB_SUCCESS != rval )
00086 {
00087 std::cerr << "Failed to load file: " << input << std::endl;
00088 return FILE_IO_ERROR;
00089 }
00090
00091 int init_val = -1;
00092 Tag tag;
00093 bool created;
00094 rval = mb.tag_get_handle( tagname, 1, MB_TYPE_INTEGER, tag, MB_TAG_DENSE | MB_TAG_CREAT, &init_val, &created );
00095 if( !created )
00096 {
00097 rval = mb.tag_delete( tag );
00098 check( rval );
00099 rval = mb.tag_get_handle( tagname, 1, MB_TYPE_INTEGER, tag, MB_TAG_DENSE | MB_TAG_CREAT, &init_val, &created );
00100 check( rval );
00101 }
00102
00103 tag_depth( mb, tag );
00104
00105 rval = mb.write_file( output, 0, 0, &file, 1 );
00106 if( rval == MB_SUCCESS )
00107 std::cout << "Wrote file: " << output << std::endl;
00108 else
00109 {
00110 std::cerr << "Failed to write file: " << output << std::endl;
00111 return FILE_IO_ERROR;
00112 }
00113
00114 return NO_ERROR;
00115 }
00116
00117 static ErrorCode get_adjacent_elems( Interface& mb, const Range& verts, Range& elems )
00118 {
00119 elems.clear();
00120 ErrorCode rval;
00121 for( int dim = 3; dim > 0; --dim )
00122 {
00123 rval = mb.get_adjacencies( verts, dim, false, elems, Interface::UNION );
00124 if( MB_SUCCESS != rval ) break;
00125 }
00126 return rval;
00127 }
00128
00129 void tag_depth( Interface& mb, Tag tag )
00130 {
00131 ErrorCode rval;
00132 int dim;
00133
00134 Skinner tool( &mb );
00135 Range verts, elems;
00136 dim = 3;
00137 while( elems.empty() )
00138 {
00139 rval = mb.get_entities_by_dimension( 0, dim, elems );
00140 check( rval );
00141 if( --dim == 0 ) return; // no elements
00142 }
00143 rval = tool.find_skin( 0, elems, 0, verts );
00144 check( rval );
00145 rval = get_adjacent_elems( mb, verts, elems );
00146 check( rval );
00147
00148 std::vector< int > data;
00149 int val, depth = 0;
00150 while( !elems.empty() )
00151 {
00152 data.clear();
00153 data.resize( elems.size(), depth++ );
00154 rval = mb.tag_set_data( tag, elems, &data[0] );
00155 check( rval );
00156
00157 verts.clear();
00158 rval = mb.get_adjacencies( elems, 0, false, verts, Interface::UNION );
00159 check( rval );
00160
00161 Range tmp;
00162 rval = get_adjacent_elems( mb, verts, tmp );
00163 check( rval );
00164 elems.clear();
00165 for( Range::reverse_iterator i = tmp.rbegin(); i != tmp.rend(); ++i )
00166 {
00167 rval = mb.tag_get_data( tag, &*i, 1, &val );
00168 check( rval );
00169 if( val == -1 ) elems.insert( *i );
00170 }
00171 }
00172
00173 std::cout << "Maximum depth: " << depth << std::endl;
00174 }