MOAB: Mesh Oriented datABase
(version 5.4.1)
|
00001 #include "moab/Range.hpp" 00002 #include "moab/Core.hpp" 00003 #include "moab/Skinner.hpp" 00004 #include <iostream> 00005 #include <cstdlib> 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 <tag name] <input_file> <output_file>" << 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 }