![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #ifndef GET_FILE_OPTIONS_H
00002 #define GET_FILE_OPTIONS_H
00003
00004 #include "moab/Core.hpp"
00005
00006 #include
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 " << 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 " << 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 " << 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 "
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 " << 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 " << 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 " << 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 " << 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