| 1 | #include <iostream> | 
| 2 | #include <stdio.h> | 
| 3 | #include <stdlib.h> | 
| 4 | #include <string.h> | 
| 5 | #include <vector> | 
| 6 |  | 
| 7 | #include "simError.h" | 
| 8 | #include "SimSetup.hpp" | 
| 9 | #include "SimInfo.hpp" | 
| 10 | #include "Atom.hpp" | 
| 11 | #include "Integrator.hpp" | 
| 12 | #include "Thermo.hpp" | 
| 13 | #include "ReadWrite.hpp" | 
| 14 |  | 
| 15 | #include "PairCorrList.hpp" | 
| 16 | #include "AllCorr.hpp" | 
| 17 |  | 
| 18 | #define VERSION_MAJOR 0 | 
| 19 | #define VERSION_MINOR 1 | 
| 20 |  | 
| 21 | char *programName; /*the name of the program */ | 
| 22 | void usage(void); | 
| 23 | using namespace std; | 
| 24 |  | 
| 25 | int main(int argC,char* argV[]){ | 
| 26 |  | 
| 27 | int i,j; // loop counters | 
| 28 |  | 
| 29 | char* outPrefix; // the output prefix | 
| 30 |  | 
| 31 | char* conversionCheck; | 
| 32 | bool conversionError; | 
| 33 | bool optionError; | 
| 34 |  | 
| 35 | char currentFlag; // used in parsing the flags | 
| 36 | bool done = false; // multipurpose boolean | 
| 37 | bool havePrefix; // boolean for the output prefix | 
| 38 |  | 
| 39 | bool haveMaxLength; | 
| 40 | double maxLength; | 
| 41 |  | 
| 42 | int nBins; | 
| 43 |  | 
| 44 | vector<PairCorrList> theList; | 
| 45 | pairCorrEnum pairType; | 
| 46 |  | 
| 47 | char* pair1; | 
| 48 | char* pair2; | 
| 49 |  | 
| 50 | char dumpName[2000]; | 
| 51 | char* endTest; | 
| 52 | int nameLength; | 
| 53 | int nFrames; | 
| 54 | char* inName; | 
| 55 | SimSetup* startMe; | 
| 56 | SimInfo* infoArray; | 
| 57 | DumpReader* reader; | 
| 58 | AllCorr theCorrs; | 
| 59 |  | 
| 60 | // first things first, all of the initializations | 
| 61 |  | 
| 62 | printf("Initializing stuff ....\n"); | 
| 63 | fflush(sdtout); | 
| 64 | srand48( 1337 );          // the random number generator. | 
| 65 | initSimError();           // the error handler | 
| 66 |  | 
| 67 | outPrefix = NULL; | 
| 68 | inName = NULL; | 
| 69 |  | 
| 70 | conversionError = false; | 
| 71 | optionError = false; | 
| 72 |  | 
| 73 | havePrefix = false; | 
| 74 | haveMaxLength = false; | 
| 75 |  | 
| 76 | maxLength = 1.0; | 
| 77 | nBins = 100; | 
| 78 |  | 
| 79 | programName = argv[0]; /*save the program name in case we need it*/ | 
| 80 |  | 
| 81 | for( i = 1; i < argC; i++){ | 
| 82 |  | 
| 83 | if(argV[i][0] =='-'){ | 
| 84 |  | 
| 85 | // parse the option | 
| 86 |  | 
| 87 | if(argV[i][1] == '-' ){ | 
| 88 |  | 
| 89 | // parse long word options | 
| 90 |  | 
| 91 | if( !strcmp( argV[i], "--gofr" ) ){ | 
| 92 |  | 
| 93 | i++; | 
| 94 | if( i>=argC ){ | 
| 95 | sprintf( painCave.errMsg, | 
| 96 | "\n" | 
| 97 | "not enough arguments for --gofr\n"); | 
| 98 | usage(); | 
| 99 | painCave.isFatal = 1; | 
| 100 | simError(); | 
| 101 | } | 
| 102 | pair1 = argV[i]; | 
| 103 |  | 
| 104 | i++; | 
| 105 | if( i>=argC ){ | 
| 106 | sprintf( painCave.errMsg, | 
| 107 | "\n" | 
| 108 | "not enough arguments for --gofr\n"); | 
| 109 | usage(); | 
| 110 | painCave.isFatal = 1; | 
| 111 | simError(); | 
| 112 | } | 
| 113 | pair2 = argV[i]; | 
| 114 |  | 
| 115 | pairType = gofr; | 
| 116 | theList.push_back(PairCorrList( pairType, pair1, pair2 )); | 
| 117 | } | 
| 118 |  | 
| 119 | else if( !strcmp( argV[i], "--version") ){ | 
| 120 |  | 
| 121 | printf("\n" | 
| 122 | "staticProps version %d.%d\n" | 
| 123 | "\n", | 
| 124 | VERSION_MAJOR, VERSION_MINOR ); | 
| 125 | exit(0); | 
| 126 |  | 
| 127 | } | 
| 128 |  | 
| 129 | else if( !strcmp( argV[i], "--help") ){ | 
| 130 |  | 
| 131 | usage(); | 
| 132 | exit(0); | 
| 133 | } | 
| 134 |  | 
| 135 | // anything else is an error | 
| 136 |  | 
| 137 | else{ | 
| 138 | fprintf( stderr, | 
| 139 | "Invalid option \"%s\"\n", argV[i] ); | 
| 140 | usage(); | 
| 141 | exit(0); | 
| 142 | } | 
| 143 | } | 
| 144 |  | 
| 145 | else{ | 
| 146 |  | 
| 147 | // parse single character options | 
| 148 |  | 
| 149 | done =0; | 
| 150 | j = 1; | 
| 151 | currentFlag = argV[i][j]; | 
| 152 | while( (currentFlag != '\0') && (!done) ){ | 
| 153 |  | 
| 154 | switch(currentFlag){ | 
| 155 |  | 
| 156 | case 'o': | 
| 157 | // -o <prefix> => the output prefix. | 
| 158 |  | 
| 159 | j++; | 
| 160 | currentFlag = argV[i][j]; | 
| 161 |  | 
| 162 | if( currentFlag != '\0' ) optionError = true; | 
| 163 |  | 
| 164 | if( optionError ){ | 
| 165 | sprintf( painCave.errMsg, | 
| 166 | "\n" | 
| 167 | "The -o flag should end an option sequence.\n" | 
| 168 | "   example: -r <outname> *NOT* -or <outname>\n" ); | 
| 169 | usage(); | 
| 170 | painCave.isFatal = 1; | 
| 171 | simError(); | 
| 172 | } | 
| 173 |  | 
| 174 | i++; | 
| 175 | if( i>=argC ){ | 
| 176 | sprintf( painCave.errMsg, | 
| 177 | "\n" | 
| 178 | "not enough arguments for -o\n"); | 
| 179 | usage(); | 
| 180 | painCave.isFatal = 1; | 
| 181 | simError(); | 
| 182 | } | 
| 183 |  | 
| 184 | outPrefix = argV[i]; | 
| 185 | if( outPrefix[0] == '-' ) optionError = true; | 
| 186 |  | 
| 187 | if( optionError ){ | 
| 188 | sprintf( painCave.errMsg, | 
| 189 | "\n" | 
| 190 | "\"%s\" is not a valid out prefix/name.\n" | 
| 191 | "Out prefix/name should not begin with a dash.\n", | 
| 192 | outPrefix ); | 
| 193 | usage(); | 
| 194 | painCave.isFatal = 1; | 
| 195 | simError(); | 
| 196 | } | 
| 197 |  | 
| 198 | havePrefix = true; | 
| 199 | done = true; | 
| 200 | break; | 
| 201 |  | 
| 202 | case 'l': | 
| 203 | // -l <double>    set <double> to the maxLength | 
| 204 |  | 
| 205 | haveMaxLength = true; | 
| 206 | j++; | 
| 207 | currentFlag = argV[i][j]; | 
| 208 |  | 
| 209 | if( currentFlag != '\0' ) optionError = true; | 
| 210 |  | 
| 211 | if( optionError ){ | 
| 212 | sprintf( painCave.errMsg, | 
| 213 | "\n" | 
| 214 | "The -l flag should end an option sequence.\n" | 
| 215 | "   example: -sl <double> *NOT* -ls <double>\n" ); | 
| 216 | usage(); | 
| 217 | painCave.isFatal = 1; | 
| 218 | simError(); | 
| 219 | } | 
| 220 |  | 
| 221 | i++; | 
| 222 | if( i>=argC ){ | 
| 223 | sprintf( painCave.errMsg, | 
| 224 | "\n" | 
| 225 | "not enough arguments for -l\n"); | 
| 226 | usage(); | 
| 227 | painCave.isFatal = 1; | 
| 228 | simError(); | 
| 229 | } | 
| 230 |  | 
| 231 | maxLength = strtod( argV[i], &conversionCheck); | 
| 232 | if( conversionCheck == argV[i] ) conversionError = true; | 
| 233 | if( *conversionCheck != '\0' ) conversionError = true; | 
| 234 |  | 
| 235 | if( conversionError ){ | 
| 236 | sprintf( painCave.errMsg, | 
| 237 | "Error converting \"%s\" to a double for maxLength.\n", | 
| 238 | argV[i] ); | 
| 239 | usage(); | 
| 240 | painCave.isFatal = 1; | 
| 241 | simError(); | 
| 242 | } | 
| 243 |  | 
| 244 | done = true; | 
| 245 |  | 
| 246 | break; | 
| 247 |  | 
| 248 | case 'n': | 
| 249 | // -n <int>    set <int> to the nBins | 
| 250 |  | 
| 251 | j++; | 
| 252 | currentFlag = argV[i][j]; | 
| 253 |  | 
| 254 | if( currentFlag != '\0' ) optionError = true; | 
| 255 |  | 
| 256 | if( optionError ){ | 
| 257 | sprintf( painCave.errMsg, | 
| 258 | "\n" | 
| 259 | "The -n flag should end an option sequence.\n" | 
| 260 | "   example: -sn <int> *NOT* -ns <int>\n" ); | 
| 261 | usage(); | 
| 262 | painCave.isFatal = 1; | 
| 263 | simError(); | 
| 264 | } | 
| 265 |  | 
| 266 | i++; | 
| 267 | if( i>=argC ){ | 
| 268 | sprintf( painCave.errMsg, | 
| 269 | "\n" | 
| 270 | "not enough arguments for -n\n"); | 
| 271 | usage(); | 
| 272 | painCave.isFatal = 1; | 
| 273 | simError(); | 
| 274 | } | 
| 275 |  | 
| 276 | nBins = strtol( argV[i], &conversionCheck, 10 ); | 
| 277 | if( conversionCheck == argV[i] ) conversionError = true; | 
| 278 | if( *conversionCheck != '\0' ) conversionError = true; | 
| 279 |  | 
| 280 | if( conversionError ){ | 
| 281 | sprintf( painCave.errMsg, | 
| 282 | "Error converting \"%s\" to an int for nBins.\n", | 
| 283 | argV[i] ); | 
| 284 | usage(); | 
| 285 | painCave.isFatal = 1; | 
| 286 | simError(); | 
| 287 | } | 
| 288 |  | 
| 289 | if( nBins < 1 ){ | 
| 290 | sprintf( painCave.errMsg, | 
| 291 | "nBins error: nBins = %d is less than 1.\n", | 
| 292 | nBins ); | 
| 293 | usage(); | 
| 294 | painCave.isFatal = 1; | 
| 295 | simError(); | 
| 296 | } | 
| 297 |  | 
| 298 | done = true; | 
| 299 |  | 
| 300 | break; | 
| 301 |  | 
| 302 | default: | 
| 303 |  | 
| 304 | sprintf(painCave.errMsg, | 
| 305 | "\n" | 
| 306 | "Bad option \"-%c\"\n", currentFlag); | 
| 307 | usage(); | 
| 308 | painCave.isFatal = 1; | 
| 309 | simError(); | 
| 310 | } | 
| 311 | j++; | 
| 312 | currentFlag = argV[i][j]; | 
| 313 | } | 
| 314 | } | 
| 315 | } | 
| 316 |  | 
| 317 | else{ | 
| 318 |  | 
| 319 | if( inName != NULL ){ | 
| 320 | sprintf( painCave.errMsg, | 
| 321 | "Error at \"%s\", program does not currently support\n" | 
| 322 | "more than one input bass file.\n" | 
| 323 | "\n", | 
| 324 | argV[i]); | 
| 325 | usage(); | 
| 326 | painCave.isFatal = 1; | 
| 327 | simError(); | 
| 328 | } | 
| 329 |  | 
| 330 | inName = argV[i]; | 
| 331 |  | 
| 332 | } | 
| 333 | } | 
| 334 |  | 
| 335 | if( inName == NULL ){ | 
| 336 | sprintf( painCave.errMsg, | 
| 337 | "Error, bass file is needed to run.\n" ); | 
| 338 | usage(); | 
| 339 | painCave.isFatal = 1; | 
| 340 | simError(); | 
| 341 | } | 
| 342 |  | 
| 343 | // make the dump name | 
| 344 |  | 
| 345 | strcpy( dumpName, inName ); | 
| 346 | nameLength = strlen( dumpName ); | 
| 347 | endTest = &(dumpName[nameLength - 5]); | 
| 348 | if( !strcmp( endTest, ".bass" ) ){ | 
| 349 | strcpy( endTest, ".dump" ); | 
| 350 | } | 
| 351 | else if( !strcmp( endTest, ".BASS" ) ){ | 
| 352 | strcpy( endTest, ".dump" ); | 
| 353 | } | 
| 354 | else{ | 
| 355 | strcat( dumpName, ".dump" ); | 
| 356 | } | 
| 357 |  | 
| 358 | // count the number of frames in the dump file. | 
| 359 |  | 
| 360 | printf("Counting the number of frames in \"%s\"... ", dumpName ); | 
| 361 | fflush(stdout); | 
| 362 |  | 
| 363 | reader = new DumpReader( dumpName ); | 
| 364 | nFrames = reader->getNframes(); | 
| 365 |  | 
| 366 | printf("done.\n" | 
| 367 | "\tFound %d frames.\n" | 
| 368 | "\n", | 
| 369 | nFrames ); | 
| 370 | fflush(stdout); | 
| 371 |  | 
| 372 | infoArray = new SimInfo[nFrames]; | 
| 373 |  | 
| 374 | printf("Parsing the bass file, and initializing the " | 
| 375 | "Simulation Frames..." ); | 
| 376 | fflush(stdout); | 
| 377 |  | 
| 378 | startMe = new SimSetup(); | 
| 379 | startMe->setSimInfo( infoArray, nFrames ); | 
| 380 | startMe->parseFile( inName ); | 
| 381 | startMe->createSim(); | 
| 382 |  | 
| 383 | delete startMe; | 
| 384 |  | 
| 385 | printf("done.\n"); | 
| 386 | fflush(stdout); | 
| 387 |  | 
| 388 | printf("Initializing the pair correlations..." ); | 
| 389 | fflush(stdout); | 
| 390 |  | 
| 391 | if(haveMaxLength) | 
| 392 | theCorrs.setMaxLength( maxLength ); | 
| 393 |  | 
| 394 | theCorrs.setNbins( nBins ); | 
| 395 | theCorrs.setFrames( infoArray, nFrames, reader ); | 
| 396 | theCorrs.setPairCorrList( theList ); | 
| 397 | theCorrs.initCorrelations( outPrefix ); | 
| 398 |  | 
| 399 | printf("done\n"); | 
| 400 | fflush(stdout); | 
| 401 |  | 
| 402 | theCorrs.calcCorrelations(); | 
| 403 |  | 
| 404 | return 0 ; | 
| 405 | } | 
| 406 |  | 
| 407 |  | 
| 408 | /*************************************************************************** | 
| 409 | * prints out the usage for the command line arguments, then exits. | 
| 410 | ***************************************************************************/ | 
| 411 |  | 
| 412 | void usage(){ | 
| 413 | (void)fprintf(stdout, | 
| 414 | "\n" | 
| 415 | "The proper usage is: %s [options] <input_file>\n" | 
| 416 | "\n" | 
| 417 | "Options:\n" | 
| 418 | "\n" | 
| 419 | "   short:\n" | 
| 420 | "   ------\n" | 
| 421 | "   -o <name>       The output prefix\n" | 
| 422 | "   -n <nBins>      Set the number of bins in the Histogram.\n" | 
| 423 | "                     *Defaults to 100\n" | 
| 424 | "   -l <maxLength>  set the maximum value of r\n" | 
| 425 | "                     *Defaults to 1/2 smallest length of first frame.\n" | 
| 426 | "   -s              Turn on separate output files\n" | 
| 427 | "                     *Defaults to single output file.\n" | 
| 428 | "\n" | 
| 429 | "   long:\n" | 
| 430 | "   -----\n" | 
| 431 | "   --gofr <atom1> <atom2>    g(r) for atom1 and atom2\n" | 
| 432 | "                                *note: \"_ALL_\" matches all atoms/n" | 
| 433 | "   --version                 displays the version number\n" | 
| 434 | "   --help                    displays this help message.\n" | 
| 435 |  | 
| 436 | "\n" | 
| 437 | "\n", | 
| 438 | programName); | 
| 439 | } |