Loading [MathJax]/extensions/tex2jax.js
Mesh Oriented datABase  (version 5.5.1)
An array-based unstructured mesh library
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
FileRead.cpp
Go to the documentation of this file.
1 #include <iostream> 2 #include <fstream> 3 #include <vector> 4 #include <string> 5 #include <sstream> 6  7 #include "moab/Core.hpp" 8 #include "moab/ReadUtilIface.hpp" 9  10 using namespace std; 11 using namespace moab; 12  13 int comment( string& line ) 14 { 15  // if a line starts with '#' is a comment 16  // eat white space characters 17  size_t found = line.find_first_not_of( " \t" ); 18  if( found == string::npos ) return 1; // empty line 19  if( '#' == line[found] ) return 1; // a comment indeed 20  return 0; // a line with some data in it, then 21 } 22 ErrorCode ReadTriangleOutput( Interface* mb, string fileBase ) 23 { 24  25  // 26  // get the read interface from moab 27  ReadUtilIface* iface; 28  ErrorCode rval = mb->query_interface( iface ); 29  // 30  if( MB_SUCCESS != rval ) 31  { 32  cout << "Can't get interface.\n"; 33  return MB_FAILURE; 34  } 35  // Triangle default <name>.node 36  string nodeFileName = fileBase + ".node"; 37  ifstream nodeFile( nodeFileName.c_str() ); 38  if( !nodeFile.is_open() ) 39  { 40  cout << "can't open node file .\n"; 41  return MB_FILE_DOES_NOT_EXIST; 42  } 43  cout << "reading nodes from file " << nodeFileName.c_str() << endl; 44  45  string eleFileName = fileBase + ".ele"; 46  ifstream eleFile( eleFileName.c_str() ); 47  if( !eleFile.is_open() ) 48  { 49  cout << "can't open element file .\n"; 50  return MB_FILE_DOES_NOT_EXIST; 51  } 52  cout << "reading elements from file " << eleFileName.c_str() << endl; 53  54  string line; 55  56  // ignore comment lines that start with # 57  58  int num_nodes = 0, num_triangles = 0; 59  while( num_nodes == 0 ) 60  { 61  getline( nodeFile, line ); 62  if( comment( line ) ) continue; 63  stringstream tks( line ); 64  tks >> num_nodes; // ignore the rest of the first line 65  // maybe will read attributes some other time 66  cout << "num nodes:" << num_nodes << endl; 67  } 68  69  // allocate a block of vertex handles and read xyz’s into them 70  // we know the size of the node arrays, and this call will allocate 71  // needed arrays, coordinate arrays 72  // also, it will return a starting handle for the node sequence 73  vector< double* > arrays; 74  EntityHandle startv; 75  rval = iface->get_node_coords( 2, num_nodes, 0, startv, arrays ); 76  for( int i = 0; i < num_nodes; i++ ) 77  { 78  getline( nodeFile, line ); 79  if( comment( line ) ) 80  { 81  i--; // read one more line 82  continue; 83  } 84  stringstream tokens( line ); 85  int nodeId; 86  tokens >> nodeId >> arrays[0][i] >> arrays[1][i]; 87  } 88  89  // now read the element data from a different file 90  // first, find out how many elements are out there 91  // first line with data should have it 92  while( num_triangles == 0 ) 93  { 94  getline( eleFile, line ); 95  if( comment( line ) ) continue; 96  stringstream tks( line ); 97  tks >> num_triangles; // ignore the rest of the line 98  cout << "num triangles:" << num_triangles << endl; 99  } 100  101  EntityHandle starte; 102  EntityHandle* starth; // the connectivity array that will get populated 103  // with triangle data 104  // allocate block of triangle handles and read connectivity into them 105  rval = iface->get_element_connect( num_triangles, 3, MBTRI, 0, starte, starth ); 106  107  for( int j = 0; j < num_triangles; j++ ) 108  { 109  getline( eleFile, line ); 110  if( comment( line ) ) 111  { 112  j--; // read one more line 113  continue; 114  } 115  stringstream tokens( line ); 116  int eleId; 117  unsigned int node; 118  tokens >> eleId; 119  for( int k = 0; k < 3; k++ ) 120  { 121  tokens >> node; 122  // vertex handles start at startv 123  starth[3 * j + k] = startv + node - 1; 124  } 125  } 126  127  mb->release_interface( iface ); 128  // 129  return MB_SUCCESS; 130 } 131  132 // . 133 // Read Triangle output files 134 // Assume that the format is <filename>.node and <filename>.ele 135 // see http://www.cs.cmu.edu/~quake/triangle.html for details 136 // 137 int main( int argc, char** argv ) 138 { 139  if( 3 != argc ) 140  { 141  cout << "Usage: " << argv[0] << " <filename> <outFile> " << endl; 142  cout << " <filename> is the base file name; *.ele and *.node file are read; outFile " 143  "is a file with an extension recognized by MOAB " 144  << endl; 145  return 0; 146  } 147  148  string filename = argv[1]; 149  char* outfile = argv[2]; 150  151  // get MOAB instance and read the file 152  Core* mb = new Core(); 153  154  ErrorCode rval = ReadTriangleOutput( mb, filename ); 155  156  if( rval == MB_SUCCESS ) 157  { 158  cout << "Writing output file " << outfile << endl; 159  mb->write_file( outfile ); 160  } 161  162  delete mb; 163  164  return 0; 165 }