Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #include <iostream> 00002 #include <fstream> 00003 #include <vector> 00004 #include <string> 00005 #include <sstream> 00006 00007 #include "moab/Core.hpp" 00008 #include "moab/ReadUtilIface.hpp" 00009 00010 using namespace std; 00011 using namespace moab; 00012 00013 int comment( string& line ) 00014 { 00015 // if a line starts with '#' is a comment 00016 // eat white space characters 00017 size_t found = line.find_first_not_of( " \t" ); 00018 if( found == string::npos ) return 1; // empty line 00019 if( '#' == line[found] ) return 1; // a comment indeed 00020 return 0; // a line with some data in it, then 00021 } 00022 ErrorCode ReadTriangleOutput( Interface* mb, string fileBase ) 00023 { 00024 00025 // 00026 // get the read interface from moab 00027 ReadUtilIface* iface; 00028 ErrorCode rval = mb->query_interface( iface ); 00029 // 00030 if( MB_SUCCESS != rval ) 00031 { 00032 cout << "Can't get interface.\n"; 00033 return MB_FAILURE; 00034 } 00035 // Triangle default <name>.node 00036 string nodeFileName = fileBase + ".node"; 00037 ifstream nodeFile( nodeFileName.c_str() ); 00038 if( !nodeFile.is_open() ) 00039 { 00040 cout << "can't open node file .\n"; 00041 return MB_FILE_DOES_NOT_EXIST; 00042 } 00043 cout << "reading nodes from file " << nodeFileName.c_str() << endl; 00044 00045 string eleFileName = fileBase + ".ele"; 00046 ifstream eleFile( eleFileName.c_str() ); 00047 if( !eleFile.is_open() ) 00048 { 00049 cout << "can't open element file .\n"; 00050 return MB_FILE_DOES_NOT_EXIST; 00051 } 00052 cout << "reading elements from file " << eleFileName.c_str() << endl; 00053 00054 string line; 00055 00056 // ignore comment lines that start with # 00057 00058 int num_nodes = 0, num_triangles = 0; 00059 while( num_nodes == 0 ) 00060 { 00061 getline( nodeFile, line ); 00062 if( comment( line ) ) continue; 00063 stringstream tks( line ); 00064 tks >> num_nodes; // ignore the rest of the first line 00065 // maybe will read attributes some other time 00066 cout << "num nodes:" << num_nodes << endl; 00067 } 00068 00069 // allocate a block of vertex handles and read xyz’s into them 00070 // we know the size of the node arrays, and this call will allocate 00071 // needed arrays, coordinate arrays 00072 // also, it will return a starting handle for the node sequence 00073 vector< double* > arrays; 00074 EntityHandle startv; 00075 rval = iface->get_node_coords( 2, num_nodes, 0, startv, arrays ); 00076 for( int i = 0; i < num_nodes; i++ ) 00077 { 00078 getline( nodeFile, line ); 00079 if( comment( line ) ) 00080 { 00081 i--; // read one more line 00082 continue; 00083 } 00084 stringstream tokens( line ); 00085 int nodeId; 00086 tokens >> nodeId >> arrays[0][i] >> arrays[1][i]; 00087 } 00088 00089 // now read the element data from a different file 00090 // first, find out how many elements are out there 00091 // first line with data should have it 00092 while( num_triangles == 0 ) 00093 { 00094 getline( eleFile, line ); 00095 if( comment( line ) ) continue; 00096 stringstream tks( line ); 00097 tks >> num_triangles; // ignore the rest of the line 00098 cout << "num triangles:" << num_triangles << endl; 00099 } 00100 00101 EntityHandle starte; 00102 EntityHandle* starth; // the connectivity array that will get populated 00103 // with triangle data 00104 // allocate block of triangle handles and read connectivity into them 00105 rval = iface->get_element_connect( num_triangles, 3, MBTRI, 0, starte, starth ); 00106 00107 for( int j = 0; j < num_triangles; j++ ) 00108 { 00109 getline( eleFile, line ); 00110 if( comment( line ) ) 00111 { 00112 j--; // read one more line 00113 continue; 00114 } 00115 stringstream tokens( line ); 00116 int eleId; 00117 unsigned int node; 00118 tokens >> eleId; 00119 for( int k = 0; k < 3; k++ ) 00120 { 00121 tokens >> node; 00122 // vertex handles start at startv 00123 starth[3 * j + k] = startv + node - 1; 00124 } 00125 } 00126 00127 mb->release_interface( iface ); 00128 // 00129 return MB_SUCCESS; 00130 } 00131 00132 // . 00133 // Read Triangle output files 00134 // Assume that the format is <filename>.node and <filename>.ele 00135 // see http://www.cs.cmu.edu/~quake/triangle.html for details 00136 // 00137 int main( int argc, char** argv ) 00138 { 00139 if( 3 != argc ) 00140 { 00141 cout << "Usage: " << argv[0] << " <filename> <outFile> " << endl; 00142 cout << " <filename> is the base file name; *.ele and *.node file are read; outFile " 00143 "is a file with an extension recognized by MOAB " 00144 << endl; 00145 return 0; 00146 } 00147 00148 string filename = argv[1]; 00149 char* outfile = argv[2]; 00150 00151 // get MOAB instance and read the file 00152 Core* mb = new Core(); 00153 00154 ErrorCode rval = ReadTriangleOutput( mb, filename ); 00155 00156 if( rval == MB_SUCCESS ) 00157 { 00158 cout << "Writing output file " << outfile << endl; 00159 mb->write_file( outfile ); 00160 } 00161 00162 delete mb; 00163 00164 return 0; 00165 }