MOAB: Mesh Oriented datABase
(version 5.4.1)
|
00001 #ifndef GET_FILE_OPTIONS_H 00002 #define GET_FILE_OPTIONS_H 00003 00004 #include "moab/Core.hpp" 00005 00006 #include <iostream> 00007 00008 namespace moab 00009 { 00010 namespace point_locator 00011 { 00012 namespace io 00013 { 00014 00015 template < typename String = std::string, 00016 typename String_vector = std::vector< std::string >, 00017 typename Char_vector = std::vector< const char* > > 00018 class File_options 00019 { 00020 public: 00021 File_options() 00022 : meshFiles(), interpTag(), gNormTag(), ssNormTag(), readOpts(), outFile(), writeOpts(), dbgFile(), 00023 ssTagNames(), ssTagValues(), help( true ) 00024 { 00025 } 00026 String_vector meshFiles; 00027 String interpTag; 00028 String gNormTag; 00029 String ssNormTag; 00030 String readOpts; 00031 String outFile; 00032 String writeOpts; 00033 String dbgFile; 00034 Char_vector ssTagNames; 00035 Char_vector ssTagValues; 00036 bool help; 00037 }; 00038 00039 // Check first character for a '-'. 00040 // Return true if one is found. False otherwise. 00041 bool check_for_flag( const char* str ) 00042 { 00043 if( str[0] == '-' ) 00044 return true; 00045 else 00046 return false; 00047 } 00048 00049 // New get_file_options() function with added possibilities for mbcoupler_test. 00050 ErrorCode get_file_options( int argc, 00051 char** argv, 00052 std::vector< std::string >& meshFiles, 00053 std::string& interpTag, 00054 std::string& gNormTag, 00055 std::string& ssNormTag, 00056 std::vector< const char* >& ssTagNames, 00057 std::vector< const char* >& ssTagValues, 00058 std::string& readOpts, 00059 std::string& outFile, 00060 std::string& writeOpts, 00061 std::string& dbgFile, 00062 bool& help ) 00063 { 00064 // Initialize some of the outputs to null values indicating not present 00065 // in the argument list. 00066 gNormTag = ""; 00067 ssNormTag = ""; 00068 readOpts = "PARALLEL=READ_PART;PARTITION=PARALLEL_PARTITION;PARTITION_DISTRIBUTE;" 00069 "PARALLEL_RESOLVE_SHARED_ENTS;PARALLEL_GHOSTS=3.0.1;CPUTIME"; 00070 outFile = ""; 00071 writeOpts = "PARALLEL=WRITE_PART;CPUTIME"; 00072 dbgFile = ""; 00073 std::string defaultDbgFile = argv[0]; // The executable name will be the default debug output file. 00074 00075 // These will indicate if we've gotten our required parameters at the end of parsing. 00076 bool haveMeshes = false; 00077 bool haveInterpTag = false; 00078 00079 // Loop over the values in argv pulling out an parsing each one 00080 int npos = 1; 00081 00082 if( argc > 1 && argv[1] == std::string( "-h" ) ) 00083 { 00084 help = true; 00085 return MB_SUCCESS; 00086 } 00087 00088 while( npos < argc ) 00089 { 00090 if( argv[npos] == std::string( "-meshes" ) ) 00091 { 00092 // Parse out the mesh filenames 00093 npos++; 00094 int numFiles = 2; 00095 meshFiles.resize( numFiles ); 00096 for( int i = 0; i < numFiles; i++ ) 00097 { 00098 if( ( npos < argc ) && ( !check_for_flag( argv[npos] ) ) ) 00099 meshFiles[i] = argv[npos++]; 00100 else 00101 { 00102 std::cerr << " ERROR - missing correct number of mesh filenames" << std::endl; 00103 return MB_FAILURE; 00104 } 00105 } 00106 00107 haveMeshes = true; 00108 } 00109 else if( argv[npos] == std::string( "-itag" ) ) 00110 { 00111 // Parse out the interpolation tag 00112 npos++; 00113 if( ( npos < argc ) && ( !check_for_flag( argv[npos] ) ) ) 00114 interpTag = argv[npos++]; 00115 else 00116 { 00117 std::cerr << " ERROR - missing <interp_tag>" << std::endl; 00118 return MB_FAILURE; 00119 } 00120 00121 haveInterpTag = true; 00122 } 00123 else if( argv[npos] == std::string( "-gnorm" ) ) 00124 { 00125 // Parse out the global normalization tag 00126 npos++; 00127 if( ( npos < argc ) && ( !check_for_flag( argv[npos] ) ) ) 00128 gNormTag = argv[npos++]; 00129 else 00130 { 00131 std::cerr << " ERROR - missing <gnorm_tag>" << std::endl; 00132 return MB_FAILURE; 00133 } 00134 } 00135 else if( argv[npos] == std::string( "-ssnorm" ) ) 00136 { 00137 // Parse out the subset normalization tag and selection criteria 00138 npos++; 00139 if( ( npos < argc ) && ( !check_for_flag( argv[npos] ) ) ) 00140 ssNormTag = argv[npos++]; 00141 else 00142 { 00143 std::cerr << " ERROR - missing <ssnorm_tag>" << std::endl; 00144 return MB_FAILURE; 00145 } 00146 00147 if( ( npos < argc ) && ( !check_for_flag( argv[npos] ) ) ) 00148 { 00149 char* opts = argv[npos++]; 00150 char sep1[1] = { ';' }; 00151 char sep2[1] = { '=' }; 00152 bool end_vals_seen = false; 00153 std::vector< char* > tmpTagOpts; 00154 00155 // first get the options 00156 for( char* i = strtok( opts, sep1 ); i; i = strtok( 0, sep1 ) ) 00157 { 00158 tmpTagOpts.push_back( i ); 00159 } 00160 00161 // parse out the name and val or just name. 00162 for( unsigned int j = 0; j < tmpTagOpts.size(); j++ ) 00163 { 00164 char* e = strtok( tmpTagOpts[j], sep2 ); 00165 ssTagNames.push_back( e ); 00166 e = strtok( 0, sep2 ); 00167 if( e != NULL ) 00168 { 00169 // We have a value 00170 if( end_vals_seen ) 00171 { 00172 // ERROR we should not have a value after none are seen 00173 std::cerr << " ERROR - new value seen after end of values " 00174 "in <ssnorm_selection>" 00175 << std::endl; 00176 return MB_FAILURE; 00177 } 00178 // Otherwise get the value string from e and convert it to an int 00179 int* valp = new int; 00180 *valp = atoi( e ); 00181 ssTagValues.push_back( (const char*)valp ); 00182 } 00183 else 00184 { 00185 // Otherwise there is no '=' so push a null on the list 00186 end_vals_seen = true; 00187 ssTagValues.push_back( (const char*)0 ); 00188 } 00189 } 00190 } 00191 else 00192 { 00193 std::cerr << " ERROR - missing <ssnorm_selection>" << std::endl; 00194 return MB_FAILURE; 00195 } 00196 } 00197 else if( argv[npos] == std::string( "-ropts" ) ) 00198 { 00199 // Parse out the mesh file read options 00200 npos++; 00201 if( ( npos < argc ) && ( !check_for_flag( argv[npos] ) ) ) 00202 readOpts = argv[npos++]; 00203 else 00204 { 00205 std::cerr << " ERROR - missing <roptions>" << std::endl; 00206 return MB_FAILURE; 00207 } 00208 } 00209 else if( argv[npos] == std::string( "-outfile" ) ) 00210 { 00211 // Parse out the output file name 00212 npos++; 00213 if( ( npos < argc ) && ( !check_for_flag( argv[npos] ) ) ) 00214 outFile = argv[npos++]; 00215 else 00216 { 00217 std::cerr << " ERROR - missing <out_file>" << std::endl; 00218 return MB_FAILURE; 00219 } 00220 } 00221 else if( argv[npos] == std::string( "-wopts" ) ) 00222 { 00223 // Parse out the output file write options 00224 npos++; 00225 if( ( npos < argc ) && ( !check_for_flag( argv[npos] ) ) ) 00226 writeOpts = argv[npos++]; 00227 else 00228 { 00229 std::cerr << " ERROR - missing <woptions>" << std::endl; 00230 return MB_FAILURE; 00231 } 00232 } 00233 else if( argv[npos] == std::string( "-dbgout" ) ) 00234 { 00235 // Parse out the debug output file name. 00236 // If no name then use the default. 00237 npos++; 00238 if( ( npos < argc ) && ( !check_for_flag( argv[npos] ) ) ) 00239 dbgFile = argv[npos++]; 00240 else 00241 dbgFile = defaultDbgFile; 00242 } 00243 else 00244 { 00245 // Unrecognized parameter. Skip it and move along. 00246 std::cerr << " ERROR - Unrecognized parameter:" << argv[npos] << std::endl; 00247 std::cerr << " Skipping..." << std::endl; 00248 npos++; 00249 } 00250 } 00251 00252 if( !haveMeshes ) 00253 { 00254 meshFiles.resize( 2 ); 00255 meshFiles[0] = std::string( TestDir + "/64bricks_1khex.h5m" ); 00256 meshFiles[1] = std::string( TestDir + "/64bricks_12ktet.h5m" ); 00257 std::cout << "Mesh files not entered; using default files " << meshFiles[0] << " and " << meshFiles[1] 00258 << std::endl; 00259 } 00260 00261 if( !haveInterpTag ) 00262 { 00263 interpTag = "vertex_field"; 00264 std::cout << "Interpolation field name not given, using default of " << interpTag << std::endl; 00265 } 00266 00267 #ifdef MOAB_HAVE_HDF5 00268 if( 1 == argc ) 00269 { 00270 std::cout << "No arguments given; using output file dum.h5m." << std::endl; 00271 outFile = "dum.h5m"; 00272 } 00273 #endif 00274 00275 return MB_SUCCESS; 00276 } 00277 00278 // "generic" get_file_options 00279 template < typename Options > 00280 ErrorCode get_file_options( int argc, char** argv, Options& o ) 00281 { 00282 return get_file_options( argc, argv, o.meshFiles, o.interpTag, o.gNormTag, o.ssNormTag, o.ssTagNames, 00283 o.ssTagValues, o.readOpts, o.outFile, o.writeOpts, o.dbgFile, o.help ); 00284 } 00285 00286 } // namespace io 00287 } // namespace point_locator 00288 } // namespace moab 00289 00290 #endif // GET_FILE_OPTIONS_H