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
io.hpp
Go to the documentation of this file.
1 #ifndef GET_FILE_OPTIONS_H 2 #define GET_FILE_OPTIONS_H 3  4 #include "moab/Core.hpp" 5  6 #include <iostream> 7  8 namespace moab 9 { 10 namespace point_locator 11 { 12  namespace io 13  { 14  15  template < typename String = std::string, 16  typename String_vector = std::vector< std::string >, 17  typename Char_vector = std::vector< const char* > > 18  class File_options 19  { 20  public: 21  File_options() 22  : meshFiles(), interpTag(), gNormTag(), ssNormTag(), readOpts(), outFile(), writeOpts(), dbgFile(), 23  ssTagNames(), ssTagValues(), help( true ) 24  { 25  } 26  String_vector meshFiles; 27  String interpTag; 28  String gNormTag; 29  String ssNormTag; 30  String readOpts; 31  String outFile; 32  String writeOpts; 33  String dbgFile; 34  Char_vector ssTagNames; 35  Char_vector ssTagValues; 36  bool help; 37  }; 38  39  // Check first character for a '-'. 40  // Return true if one is found. False otherwise. 41  bool check_for_flag( const char* str ) 42  { 43  if( str[0] == '-' ) 44  return true; 45  else 46  return false; 47  } 48  49  // New get_file_options() function with added possibilities for mbcoupler_test. 50  ErrorCode get_file_options( int argc, 51  char** argv, 52  std::vector< std::string >& meshFiles, 53  std::string& interpTag, 54  std::string& gNormTag, 55  std::string& ssNormTag, 56  std::vector< const char* >& ssTagNames, 57  std::vector< const char* >& ssTagValues, 58  std::string& readOpts, 59  std::string& outFile, 60  std::string& writeOpts, 61  std::string& dbgFile, 62  bool& help ) 63  { 64  // Initialize some of the outputs to null values indicating not present 65  // in the argument list. 66  gNormTag = ""; 67  ssNormTag = ""; 68  readOpts = "PARALLEL=READ_PART;PARTITION=PARALLEL_PARTITION;PARTITION_DISTRIBUTE;" 69  "PARALLEL_RESOLVE_SHARED_ENTS;PARALLEL_GHOSTS=3.0.1;CPUTIME"; 70  outFile = ""; 71  writeOpts = "PARALLEL=WRITE_PART;CPUTIME"; 72  dbgFile = ""; 73  std::string defaultDbgFile = argv[0]; // The executable name will be the default debug output file. 74  75  // These will indicate if we've gotten our required parameters at the end of parsing. 76  bool haveMeshes = false; 77  bool haveInterpTag = false; 78  79  // Loop over the values in argv pulling out an parsing each one 80  int npos = 1; 81  82  if( argc > 1 && argv[1] == std::string( "-h" ) ) 83  { 84  help = true; 85  return MB_SUCCESS; 86  } 87  88  while( npos < argc ) 89  { 90  if( argv[npos] == std::string( "-meshes" ) ) 91  { 92  // Parse out the mesh filenames 93  npos++; 94  int numFiles = 2; 95  meshFiles.resize( numFiles ); 96  for( int i = 0; i < numFiles; i++ ) 97  { 98  if( ( npos < argc ) && ( !check_for_flag( argv[npos] ) ) ) 99  meshFiles[i] = argv[npos++]; 100  else 101  { 102  std::cerr << " ERROR - missing correct number of mesh filenames" << std::endl; 103  return MB_FAILURE; 104  } 105  } 106  107  haveMeshes = true; 108  } 109  else if( argv[npos] == std::string( "-itag" ) ) 110  { 111  // Parse out the interpolation tag 112  npos++; 113  if( ( npos < argc ) && ( !check_for_flag( argv[npos] ) ) ) 114  interpTag = argv[npos++]; 115  else 116  { 117  std::cerr << " ERROR - missing <interp_tag>" << std::endl; 118  return MB_FAILURE; 119  } 120  121  haveInterpTag = true; 122  } 123  else if( argv[npos] == std::string( "-gnorm" ) ) 124  { 125  // Parse out the global normalization tag 126  npos++; 127  if( ( npos < argc ) && ( !check_for_flag( argv[npos] ) ) ) 128  gNormTag = argv[npos++]; 129  else 130  { 131  std::cerr << " ERROR - missing <gnorm_tag>" << std::endl; 132  return MB_FAILURE; 133  } 134  } 135  else if( argv[npos] == std::string( "-ssnorm" ) ) 136  { 137  // Parse out the subset normalization tag and selection criteria 138  npos++; 139  if( ( npos < argc ) && ( !check_for_flag( argv[npos] ) ) ) 140  ssNormTag = argv[npos++]; 141  else 142  { 143  std::cerr << " ERROR - missing <ssnorm_tag>" << std::endl; 144  return MB_FAILURE; 145  } 146  147  if( ( npos < argc ) && ( !check_for_flag( argv[npos] ) ) ) 148  { 149  char* opts = argv[npos++]; 150  char sep1[1] = { ';' }; 151  char sep2[1] = { '=' }; 152  bool end_vals_seen = false; 153  std::vector< char* > tmpTagOpts; 154  155  // first get the options 156  for( char* i = strtok( opts, sep1 ); i; i = strtok( 0, sep1 ) ) 157  { 158  tmpTagOpts.push_back( i ); 159  } 160  161  // parse out the name and val or just name. 162  for( unsigned int j = 0; j < tmpTagOpts.size(); j++ ) 163  { 164  char* e = strtok( tmpTagOpts[j], sep2 ); 165  ssTagNames.push_back( e ); 166  e = strtok( 0, sep2 ); 167  if( e != NULL ) 168  { 169  // We have a value 170  if( end_vals_seen ) 171  { 172  // ERROR we should not have a value after none are seen 173  std::cerr << " ERROR - new value seen after end of values " 174  "in <ssnorm_selection>" 175  << std::endl; 176  return MB_FAILURE; 177  } 178  // Otherwise get the value string from e and convert it to an int 179  int* valp = new int; 180  *valp = atoi( e ); 181  ssTagValues.push_back( (const char*)valp ); 182  } 183  else 184  { 185  // Otherwise there is no '=' so push a null on the list 186  end_vals_seen = true; 187  ssTagValues.push_back( (const char*)0 ); 188  } 189  } 190  } 191  else 192  { 193  std::cerr << " ERROR - missing <ssnorm_selection>" << std::endl; 194  return MB_FAILURE; 195  } 196  } 197  else if( argv[npos] == std::string( "-ropts" ) ) 198  { 199  // Parse out the mesh file read options 200  npos++; 201  if( ( npos < argc ) && ( !check_for_flag( argv[npos] ) ) ) 202  readOpts = argv[npos++]; 203  else 204  { 205  std::cerr << " ERROR - missing <roptions>" << std::endl; 206  return MB_FAILURE; 207  } 208  } 209  else if( argv[npos] == std::string( "-outfile" ) ) 210  { 211  // Parse out the output file name 212  npos++; 213  if( ( npos < argc ) && ( !check_for_flag( argv[npos] ) ) ) 214  outFile = argv[npos++]; 215  else 216  { 217  std::cerr << " ERROR - missing <out_file>" << std::endl; 218  return MB_FAILURE; 219  } 220  } 221  else if( argv[npos] == std::string( "-wopts" ) ) 222  { 223  // Parse out the output file write options 224  npos++; 225  if( ( npos < argc ) && ( !check_for_flag( argv[npos] ) ) ) 226  writeOpts = argv[npos++]; 227  else 228  { 229  std::cerr << " ERROR - missing <woptions>" << std::endl; 230  return MB_FAILURE; 231  } 232  } 233  else if( argv[npos] == std::string( "-dbgout" ) ) 234  { 235  // Parse out the debug output file name. 236  // If no name then use the default. 237  npos++; 238  if( ( npos < argc ) && ( !check_for_flag( argv[npos] ) ) ) 239  dbgFile = argv[npos++]; 240  else 241  dbgFile = defaultDbgFile; 242  } 243  else 244  { 245  // Unrecognized parameter. Skip it and move along. 246  std::cerr << " ERROR - Unrecognized parameter:" << argv[npos] << std::endl; 247  std::cerr << " Skipping..." << std::endl; 248  npos++; 249  } 250  } 251  252  if( !haveMeshes ) 253  { 254  meshFiles.resize( 2 ); 255  meshFiles[0] = std::string( TestDir + "/64bricks_1khex.h5m" ); 256  meshFiles[1] = std::string( TestDir + "/64bricks_12ktet.h5m" ); 257  std::cout << "Mesh files not entered; using default files " << meshFiles[0] << " and " << meshFiles[1] 258  << std::endl; 259  } 260  261  if( !haveInterpTag ) 262  { 263  interpTag = "vertex_field"; 264  std::cout << "Interpolation field name not given, using default of " << interpTag << std::endl; 265  } 266  267 #ifdef MOAB_HAVE_HDF5 268  if( 1 == argc ) 269  { 270  std::cout << "No arguments given; using output file dum.h5m." << std::endl; 271  outFile = "dum.h5m"; 272  } 273 #endif 274  275  return MB_SUCCESS; 276  } 277  278  // "generic" get_file_options 279  template < typename Options > 280  ErrorCode get_file_options( int argc, char** argv, Options& o ) 281  { 282  return get_file_options( argc, argv, o.meshFiles, o.interpTag, o.gNormTag, o.ssNormTag, o.ssTagNames, 283  o.ssTagValues, o.readOpts, o.outFile, o.writeOpts, o.dbgFile, o.help ); 284  } 285  286  } // namespace io 287 } // namespace point_locator 288 } // namespace moab 289  290 #endif // GET_FILE_OPTIONS_H