![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #include
00002 #include
00003 #include
00004 #include
00005 #include
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 .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 .node and .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] << " " << endl;
00142 cout << " 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 }