| 33 |  | the_integrator = NULL; | 
| 34 |  | setTemp = 0; | 
| 35 |  | thermalTime = 0.0; | 
| 36 | + | currentTime = 0.0; | 
| 37 |  | rCut = 0.0; | 
| 38 | + | ecr = 0.0; | 
| 39 | + | est = 0.0; | 
| 40 | + | oldEcr = 0.0; | 
| 41 | + | oldRcut = 0.0; | 
| 42 |  |  | 
| 43 | + | haveOrigRcut = 0; | 
| 44 | + | haveOrigEcr = 0; | 
| 45 | + | boxIsInit = 0; | 
| 46 | + |  | 
| 47 | + |  | 
| 48 | + |  | 
| 49 |  | usePBC = 0; | 
| 50 |  | useLJ = 0; | 
| 51 |  | useSticky = 0; | 
| 57 |  | wrapMeSimInfo( this ); | 
| 58 |  | } | 
| 59 |  |  | 
| 60 | + | SimInfo::~SimInfo(){ | 
| 61 | + |  | 
| 62 | + | map<string, GenericData*>::iterator i; | 
| 63 | + |  | 
| 64 | + | for(i = properties.begin(); i != properties.end(); i++) | 
| 65 | + | delete (*i).second; | 
| 66 | + |  | 
| 67 | + |  | 
| 68 | + | } | 
| 69 | + |  | 
| 70 |  | void SimInfo::setBox(double newBox[3]) { | 
| 71 |  |  | 
| 72 |  | int i, j; | 
| 94 |  | // [ 2 5 8 ] | 
| 95 |  | double FortranHmatInv[9]; // the inverted Hmat (for Fortran); | 
| 96 |  |  | 
| 97 | + |  | 
| 98 | + | if( !boxIsInit ) boxIsInit = 1; | 
| 99 |  |  | 
| 100 |  | for(i=0; i < 3; i++) | 
| 101 |  | for (j=0; j < 3; j++) Hmat[i][j] = theBox[i][j]; | 
| 102 |  |  | 
| 80 | – | cerr | 
| 81 | – | << "setting Hmat ->\n" | 
| 82 | – | << "[ " << Hmat[0][0] << ", " << Hmat[0][1] << ", " << Hmat[0][2] << " ]\n" | 
| 83 | – | << "[ " << Hmat[1][0] << ", " << Hmat[1][1] << ", " << Hmat[1][2] << " ]\n" | 
| 84 | – | << "[ " << Hmat[2][0] << ", " << Hmat[2][1] << ", " << Hmat[2][2] << " ]\n"; | 
| 85 | – |  | 
| 103 |  | calcBoxL(); | 
| 104 |  | calcHmatInv(); | 
| 105 |  |  | 
| 110 |  | } | 
| 111 |  | } | 
| 112 |  |  | 
| 113 | < | setFortranBoxSize(FortranHmat, FortranHmatI, &orthoRhombic); | 
| 113 | > | setFortranBoxSize(FortranHmat, FortranHmatInv, &orthoRhombic); | 
| 114 |  |  | 
| 98 | – | smallestBoxL = boxLx; | 
| 99 | – | if (boxLy < smallestBoxL) smallestBoxL = boxLy; | 
| 100 | – | if (boxLz < smallestBoxL) smallestBoxL = boxLz; | 
| 101 | – |  | 
| 102 | – | maxCutoff = smallestBoxL / 2.0; | 
| 103 | – |  | 
| 104 | – | if (rList > maxCutoff) { | 
| 105 | – | sprintf( painCave.errMsg, | 
| 106 | – | "New Box size is forcing neighborlist radius down to %lf\n", | 
| 107 | – | maxCutoff ); | 
| 108 | – | painCave.isFatal = 0; | 
| 109 | – | simError(); | 
| 110 | – |  | 
| 111 | – | rList = maxCutoff; | 
| 112 | – |  | 
| 113 | – | sprintf( painCave.errMsg, | 
| 114 | – | "New Box size is forcing cutoff radius down to %lf\n", | 
| 115 | – | maxCutoff - 1.0 ); | 
| 116 | – | painCave.isFatal = 0; | 
| 117 | – | simError(); | 
| 118 | – |  | 
| 119 | – | rCut = rList - 1.0; | 
| 120 | – |  | 
| 121 | – | // list radius changed so we have to refresh the simulation structure. | 
| 122 | – | refreshSim(); | 
| 123 | – | } | 
| 124 | – |  | 
| 125 | – | if (rCut > maxCutoff) { | 
| 126 | – | sprintf( painCave.errMsg, | 
| 127 | – | "New Box size is forcing cutoff radius down to %lf\n", | 
| 128 | – | maxCutoff ); | 
| 129 | – | painCave.isFatal = 0; | 
| 130 | – | simError(); | 
| 131 | – |  | 
| 132 | – | status = 0; | 
| 133 | – | LJ_new_rcut(&rCut, &status); | 
| 134 | – | if (status != 0) { | 
| 135 | – | sprintf( painCave.errMsg, | 
| 136 | – | "Error in recomputing LJ shifts based on new rcut\n"); | 
| 137 | – | painCave.isFatal = 1; | 
| 138 | – | simError(); | 
| 139 | – | } | 
| 140 | – | } | 
| 115 |  | } | 
| 116 |  |  | 
| 117 |  |  | 
| 127 |  | double theBox[3][3]; | 
| 128 |  | int i, j; | 
| 129 |  |  | 
| 130 | < | cerr << "Scaling box by " << scale << "\n"; | 
| 130 | > | // cerr << "Scaling box by " << scale << "\n"; | 
| 131 |  |  | 
| 132 |  | for(i=0; i<3; i++) | 
| 133 |  | for (j=0; j<3; j++) theBox[i][j] = Hmat[i][j]*scale; | 
| 137 |  | } | 
| 138 |  |  | 
| 139 |  | void SimInfo::calcHmatInv( void ) { | 
| 140 | < |  | 
| 140 | > |  | 
| 141 | > | int i,j; | 
| 142 |  | double smallDiag; | 
| 143 |  | double tol; | 
| 144 |  | double sanity[3][3]; | 
| 148 |  | // Check the inverse to make sure it is sane: | 
| 149 |  |  | 
| 150 |  | matMul3( Hmat, HmatInv, sanity ); | 
| 176 | – |  | 
| 177 | – | cerr << "sanity => \n" | 
| 178 | – | << sanity[0][0] << "\t" << sanity[0][1] << "\t" << sanity [0][2] << "\n" | 
| 179 | – | << sanity[1][0] << "\t" << sanity[1][1] << "\t" << sanity [1][2] << "\n" | 
| 180 | – | << sanity[2][0] << "\t" << sanity[2][1] << "\t" << sanity [2][2] | 
| 181 | – | << "\n"; | 
| 151 |  |  | 
| 152 |  | // check to see if Hmat is orthorhombic | 
| 153 |  |  | 
| 240 |  | outVec[1] = m[1][0]*a0 + m[1][1]*a1 + m[1][2]*a2; | 
| 241 |  | outVec[2] = m[2][0]*a0 + m[2][1]*a1 + m[2][2]*a2; | 
| 242 |  | } | 
| 243 | + |  | 
| 244 | + | void SimInfo::transposeMat3(double in[3][3], double out[3][3]) { | 
| 245 | + | double temp[3][3]; | 
| 246 | + | int i, j; | 
| 247 | + |  | 
| 248 | + | for (i = 0; i < 3; i++) { | 
| 249 | + | for (j = 0; j < 3; j++) { | 
| 250 | + | temp[j][i] = in[i][j]; | 
| 251 | + | } | 
| 252 | + | } | 
| 253 | + | for (i = 0; i < 3; i++) { | 
| 254 | + | for (j = 0; j < 3; j++) { | 
| 255 | + | out[i][j] = temp[i][j]; | 
| 256 | + | } | 
| 257 | + | } | 
| 258 | + | } | 
| 259 |  |  | 
| 260 | + | void SimInfo::printMat3(double A[3][3] ){ | 
| 261 | + |  | 
| 262 | + | std::cerr | 
| 263 | + | << "[ " << A[0][0] << ", " << A[0][1] << ", " << A[0][2] << " ]\n" | 
| 264 | + | << "[ " << A[1][0] << ", " << A[1][1] << ", " << A[1][2] << " ]\n" | 
| 265 | + | << "[ " << A[2][0] << ", " << A[2][1] << ", " << A[2][2] << " ]\n"; | 
| 266 | + | } | 
| 267 | + |  | 
| 268 | + | void SimInfo::printMat9(double A[9] ){ | 
| 269 | + |  | 
| 270 | + | std::cerr | 
| 271 | + | << "[ " << A[0] << ", " << A[1] << ", " << A[2] << " ]\n" | 
| 272 | + | << "[ " << A[3] << ", " << A[4] << ", " << A[5] << " ]\n" | 
| 273 | + | << "[ " << A[6] << ", " << A[7] << ", " << A[8] << " ]\n"; | 
| 274 | + | } | 
| 275 | + |  | 
| 276 |  | void SimInfo::calcBoxL( void ){ | 
| 277 |  |  | 
| 278 |  | double dx, dy, dz, dsq; | 
| 286 |  |  | 
| 287 |  | dx = Hmat[0][0]; dy = Hmat[1][0]; dz = Hmat[2][0]; | 
| 288 |  | dsq = dx*dx + dy*dy + dz*dz; | 
| 289 | < | boxLx = sqrt( dsq ); | 
| 289 | > | boxL[0] = sqrt( dsq ); | 
| 290 | > | maxCutoff = 0.5 * boxL[0]; | 
| 291 |  |  | 
| 292 |  | // boxLy | 
| 293 |  |  | 
| 294 |  | dx = Hmat[0][1]; dy = Hmat[1][1]; dz = Hmat[2][1]; | 
| 295 |  | dsq = dx*dx + dy*dy + dz*dz; | 
| 296 | < | boxLy = sqrt( dsq ); | 
| 296 | > | boxL[1] = sqrt( dsq ); | 
| 297 | > | if( (0.5 * boxL[1]) < maxCutoff ) maxCutoff = 0.5 * boxL[1]; | 
| 298 |  |  | 
| 299 |  | // boxLz | 
| 300 |  |  | 
| 301 |  | dx = Hmat[0][2]; dy = Hmat[1][2]; dz = Hmat[2][2]; | 
| 302 |  | dsq = dx*dx + dy*dy + dz*dz; | 
| 303 | < | boxLz = sqrt( dsq ); | 
| 303 | > | boxL[2] = sqrt( dsq ); | 
| 304 | > | if( (0.5 * boxL[2]) < maxCutoff ) maxCutoff = 0.5 * boxL[2]; | 
| 305 |  |  | 
| 306 | + | checkCutOffs(); | 
| 307 | + |  | 
| 308 |  | } | 
| 309 |  |  | 
| 310 |  |  | 
| 384 |  | int isError; | 
| 385 |  | int n_global; | 
| 386 |  | int* excl; | 
| 387 | < |  | 
| 382 | < | fInfo.rrf = 0.0; | 
| 383 | < | fInfo.rt = 0.0; | 
| 387 | > |  | 
| 388 |  | fInfo.dielect = 0.0; | 
| 389 |  |  | 
| 386 | – | fInfo.rlist = rList; | 
| 387 | – | fInfo.rcut = rCut; | 
| 388 | – |  | 
| 390 |  | if( useDipole ){ | 
| 390 | – | fInfo.rrf = ecr; | 
| 391 | – | fInfo.rt = ecr - est; | 
| 391 |  | if( useReactionField )fInfo.dielect = dielectric; | 
| 392 |  | } | 
| 393 |  |  | 
| 436 |  |  | 
| 437 |  | } | 
| 438 |  |  | 
| 439 | + |  | 
| 440 | + | void SimInfo::setRcut( double theRcut ){ | 
| 441 | + |  | 
| 442 | + | if( !haveOrigRcut ){ | 
| 443 | + | haveOrigRcut = 1; | 
| 444 | + | origRcut = theRcut; | 
| 445 | + | } | 
| 446 | + |  | 
| 447 | + | rCut = theRcut; | 
| 448 | + | checkCutOffs(); | 
| 449 | + | } | 
| 450 | + |  | 
| 451 | + | void SimInfo::setEcr( double theEcr ){ | 
| 452 | + |  | 
| 453 | + | if( !haveOrigEcr ){ | 
| 454 | + | haveOrigEcr = 1; | 
| 455 | + | origEcr = theEcr; | 
| 456 | + | } | 
| 457 | + |  | 
| 458 | + | ecr = theEcr; | 
| 459 | + | checkCutOffs(); | 
| 460 | + | } | 
| 461 | + |  | 
| 462 | + | void SimInfo::setEcr( double theEcr, double theEst ){ | 
| 463 | + |  | 
| 464 | + | est = theEst; | 
| 465 | + | setEcr( theEcr ); | 
| 466 | + | } | 
| 467 | + |  | 
| 468 | + |  | 
| 469 | + | void SimInfo::checkCutOffs( void ){ | 
| 470 | + |  | 
| 471 | + | int cutChanged = 0; | 
| 472 | + |  | 
| 473 | + |  | 
| 474 | + |  | 
| 475 | + | if( boxIsInit ){ | 
| 476 | + |  | 
| 477 | + | //we need to check cutOffs against the box | 
| 478 | + |  | 
| 479 | + | if(( maxCutoff > rCut )&&(usePBC)){ | 
| 480 | + | if( rCut < origRcut ){ | 
| 481 | + | rCut = origRcut; | 
| 482 | + | if (rCut > maxCutoff) rCut = maxCutoff; | 
| 483 | + |  | 
| 484 | + | sprintf( painCave.errMsg, | 
| 485 | + | "New Box size is setting the long range cutoff radius " | 
| 486 | + | "to %lf\n", | 
| 487 | + | rCut ); | 
| 488 | + | painCave.isFatal = 0; | 
| 489 | + | simError(); | 
| 490 | + | } | 
| 491 | + | } | 
| 492 | + |  | 
| 493 | + | if( maxCutoff > ecr ){ | 
| 494 | + | if( ecr < origEcr ){ | 
| 495 | + | rCut = origEcr; | 
| 496 | + | if (ecr > maxCutoff) ecr = maxCutoff; | 
| 497 | + |  | 
| 498 | + | sprintf( painCave.errMsg, | 
| 499 | + | "New Box size is setting the electrostaticCutoffRadius " | 
| 500 | + | "to %lf\n", | 
| 501 | + | ecr ); | 
| 502 | + | painCave.isFatal = 0; | 
| 503 | + | simError(); | 
| 504 | + | } | 
| 505 | + | } | 
| 506 | + |  | 
| 507 | + |  | 
| 508 | + | if ((rCut > maxCutoff)&&(usePBC)) { | 
| 509 | + | sprintf( painCave.errMsg, | 
| 510 | + | "New Box size is setting the long range cutoff radius " | 
| 511 | + | "to %lf\n", | 
| 512 | + | maxCutoff ); | 
| 513 | + | painCave.isFatal = 0; | 
| 514 | + | simError(); | 
| 515 | + | rCut = maxCutoff; | 
| 516 | + | } | 
| 517 | + |  | 
| 518 | + | if( ecr > maxCutoff){ | 
| 519 | + | sprintf( painCave.errMsg, | 
| 520 | + | "New Box size is setting the electrostaticCutoffRadius " | 
| 521 | + | "to %lf\n", | 
| 522 | + | maxCutoff  ); | 
| 523 | + | painCave.isFatal = 0; | 
| 524 | + | simError(); | 
| 525 | + | ecr = maxCutoff; | 
| 526 | + | } | 
| 527 | + |  | 
| 528 | + |  | 
| 529 | + | } | 
| 530 | + |  | 
| 531 | + |  | 
| 532 | + | if( (oldEcr != ecr) || ( oldRcut != rCut ) ) cutChanged = 1; | 
| 533 | + |  | 
| 534 | + | // rlist is the 1.0 plus max( rcut, ecr ) | 
| 535 | + |  | 
| 536 | + | ( rCut > ecr )? rList = rCut + 1.0: rList = ecr + 1.0; | 
| 537 | + |  | 
| 538 | + | if( cutChanged ){ | 
| 539 | + |  | 
| 540 | + | notifyFortranCutOffs( &rCut, &rList, &ecr, &est ); | 
| 541 | + | } | 
| 542 | + |  | 
| 543 | + | oldEcr = ecr; | 
| 544 | + | oldRcut = rCut; | 
| 545 | + | } | 
| 546 | + |  | 
| 547 | + | void SimInfo::addProperty(GenericData* prop){ | 
| 548 | + |  | 
| 549 | + | map<string, GenericData*>::iterator result; | 
| 550 | + | result = properties.find(prop->getID()); | 
| 551 | + |  | 
| 552 | + | //we can't simply use  properties[prop->getID()] = prop, | 
| 553 | + | //it will cause memory leak if we already contain a propery which has the same name of prop | 
| 554 | + |  | 
| 555 | + | if(result != properties.end()){ | 
| 556 | + |  | 
| 557 | + | delete (*result).second; | 
| 558 | + | (*result).second = prop; | 
| 559 | + |  | 
| 560 | + | } | 
| 561 | + | else{ | 
| 562 | + |  | 
| 563 | + | properties[prop->getID()] = prop; | 
| 564 | + |  | 
| 565 | + | } | 
| 566 | + |  | 
| 567 | + | } | 
| 568 | + |  | 
| 569 | + | GenericData* SimInfo::getProperty(const string& propName){ | 
| 570 | + |  | 
| 571 | + | map<string, GenericData*>::iterator result; | 
| 572 | + |  | 
| 573 | + | //string lowerCaseName = (); | 
| 574 | + |  | 
| 575 | + | result = properties.find(propName); | 
| 576 | + |  | 
| 577 | + | if(result != properties.end()) | 
| 578 | + | return (*result).second; | 
| 579 | + | else | 
| 580 | + | return NULL; | 
| 581 | + | } | 
| 582 | + |  | 
| 583 | + | vector<GenericData*> SimInfo::getProperties(){ | 
| 584 | + |  | 
| 585 | + | vector<GenericData*> result; | 
| 586 | + | map<string, GenericData*>::iterator i; | 
| 587 | + |  | 
| 588 | + | for(i = properties.begin(); i != properties.end(); i++) | 
| 589 | + | result.push_back((*i).second); | 
| 590 | + |  | 
| 591 | + | return result; | 
| 592 | + | } | 
| 593 | + |  | 
| 594 | + |  |