| 66 |  |  | 
| 67 |  | MakeStamps *the_stamps; | 
| 68 |  | Globals* the_globals; | 
| 69 | < | int i, j; | 
| 69 | > | ExtendedSystem* the_extendedsystem; | 
| 70 | > | int i, j, k, globalAtomIndex; | 
| 71 |  |  | 
| 72 |  | // get the stamps and globals; | 
| 73 |  | the_stamps = stamps; | 
| 81 |  | // get the ones we know are there, yet still may need some work. | 
| 82 |  | n_components = the_globals->getNComponents(); | 
| 83 |  | strcpy( force_field, the_globals->getForceField() ); | 
| 84 | + |  | 
| 85 | + | // get the ensemble and set up an extended system if we need it: | 
| 86 |  | strcpy( ensemble, the_globals->getEnsemble() ); | 
| 87 | + | if( !strcasecmp( ensemble, "NPT" ) ) { | 
| 88 | + | the_extendedsystem = new ExtendedSystem( simnfo ); | 
| 89 | + | the_extendedsystem->setTargetTemp(the_globals->getTargetTemp()); | 
| 90 | + | if (the_globals->haveTargetPressure()) | 
| 91 | + | the_extendedsystem->setTargetPressure(the_globals->getTargetPressure()); | 
| 92 | + | else { | 
| 93 | + | sprintf( painCave.errMsg, | 
| 94 | + | "SimSetup error: If you use the constant pressure\n" | 
| 95 | + | "    ensemble, you must set targetPressure.\n" | 
| 96 | + | "    This was found in the BASS file.\n"); | 
| 97 | + | painCave.isFatal = 1; | 
| 98 | + | simError(); | 
| 99 | + | } | 
| 100 | + |  | 
| 101 | + | if (the_globals->haveTauThermostat()) | 
| 102 | + | the_extendedsystem->setTauThermostat(the_globals->getTauThermostat()); | 
| 103 | + | else if (the_globals->haveQmass()) | 
| 104 | + | the_extendedsystem->setQmass(the_globals->getQmass()); | 
| 105 | + | else { | 
| 106 | + | sprintf( painCave.errMsg, | 
| 107 | + | "SimSetup error: If you use one of the constant temperature\n" | 
| 108 | + | "    ensembles, you must set either tauThermostat or qMass.\n" | 
| 109 | + | "    Neither of these was found in the BASS file.\n"); | 
| 110 | + | painCave.isFatal = 1; | 
| 111 | + | simError(); | 
| 112 | + | } | 
| 113 | + |  | 
| 114 | + | if (the_globals->haveTauBarostat()) | 
| 115 | + | the_extendedsystem->setTauBarostat(the_globals->getTauBarostat()); | 
| 116 | + | else { | 
| 117 | + | sprintf( painCave.errMsg, | 
| 118 | + | "SimSetup error: If you use the constant pressure\n" | 
| 119 | + | "    ensemble, you must set tauBarostat.\n" | 
| 120 | + | "    This was found in the BASS file.\n"); | 
| 121 | + | painCave.isFatal = 1; | 
| 122 | + | simError(); | 
| 123 | + | } | 
| 124 | + |  | 
| 125 | + | } else if ( !strcasecmp( ensemble, "NVT") ) { | 
| 126 | + | the_extendedsystem = new ExtendedSystem( simnfo ); | 
| 127 | + | the_extendedsystem->setTargetTemp(the_globals->getTargetTemp()); | 
| 128 | + |  | 
| 129 | + | if (the_globals->haveTauThermostat()) | 
| 130 | + | the_extendedsystem->setTauThermostat(the_globals->getTauThermostat()); | 
| 131 | + | else if (the_globals->haveQmass()) | 
| 132 | + | the_extendedsystem->setQmass(the_globals->getQmass()); | 
| 133 | + | else { | 
| 134 | + | sprintf( painCave.errMsg, | 
| 135 | + | "SimSetup error: If you use one of the constant temperature\n" | 
| 136 | + | "    ensembles, you must set either tauThermostat or qMass.\n" | 
| 137 | + | "    Neither of these was found in the BASS file.\n"); | 
| 138 | + | painCave.isFatal = 1; | 
| 139 | + | simError(); | 
| 140 | + | } | 
| 141 | + |  | 
| 142 | + | } else if ( !strcasecmp( ensemble, "NVE") ) { | 
| 143 | + | } else { | 
| 144 | + | sprintf( painCave.errMsg, | 
| 145 | + | "SimSetup Warning. Unrecognized Ensemble -> %s, " | 
| 146 | + | "reverting to NVE for this simulation.\n", | 
| 147 | + | ensemble ); | 
| 148 | + | painCave.isFatal = 0; | 
| 149 | + | simError(); | 
| 150 | + | strcpy( ensemble, "NVE" ); | 
| 151 | + | } | 
| 152 |  | strcpy( simnfo->ensemble, ensemble ); | 
| 153 |  |  | 
| 154 |  | strcpy( simnfo->mixingRule, the_globals->getMixingRule() ); | 
| 155 |  | simnfo->usePBC = the_globals->getPBC(); | 
| 156 |  |  | 
| 157 | < |  | 
| 158 | < |  | 
| 159 | < | if( !strcmp( force_field, "TraPPE_Ex" ) ) the_ff = new TraPPE_ExFF(); | 
| 160 | < | else if( !strcmp( force_field, "LJ" ) ) the_ff = new LJ_FF(); | 
| 157 | > | int usesDipoles = 0; | 
| 158 | > | if( !strcmp( force_field, "TraPPE_Ex" ) ){ | 
| 159 | > | the_ff = new TraPPE_ExFF(); | 
| 160 | > | usesDipoles = 1; | 
| 161 | > | } | 
| 162 | > | else if( !strcasecmp( force_field, "LJ" ) ) the_ff = new LJ_FF(); | 
| 163 |  | else{ | 
| 164 |  | sprintf( painCave.errMsg, | 
| 165 |  | "SimSetup Error. Unrecognized force field -> %s\n", | 
| 298 |  | simnfo->n_torsions = tot_torsions; | 
| 299 |  | simnfo->n_SRI = tot_SRI; | 
| 300 |  | simnfo->n_mol = tot_nmol; | 
| 231 | – |  | 
| 301 |  |  | 
| 302 | + | simnfo->molMembershipArray = new int[tot_atoms]; | 
| 303 | + |  | 
| 304 |  | #ifdef IS_MPI | 
| 305 |  |  | 
| 306 |  | // divide the molecules among processors here. | 
| 307 |  |  | 
| 308 |  | mpiSim = new mpiSimulation( simnfo ); | 
| 309 |  |  | 
| 239 | – |  | 
| 240 | – |  | 
| 310 |  | globalIndex = mpiSim->divideLabor(); | 
| 311 |  |  | 
| 312 |  | // set up the local variables | 
| 323 |  | local_bonds = 0; | 
| 324 |  | local_bends = 0; | 
| 325 |  | local_torsions = 0; | 
| 326 | + | globalAtomIndex = 0; | 
| 327 | + |  | 
| 328 | + |  | 
| 329 |  | for( i=0; i<n_components; i++ ){ | 
| 330 |  |  | 
| 331 |  | for( j=0; j<components_nmol[i]; j++ ){ | 
| 332 |  |  | 
| 333 | < | if( mol2proc[j] == worldRank ){ | 
| 333 | > | if( mol2proc[allMol] == worldRank ){ | 
| 334 |  |  | 
| 335 |  | local_atoms +=    comp_stamps[i]->getNAtoms(); | 
| 336 |  | local_bonds +=    comp_stamps[i]->getNBonds(); | 
| 338 |  | local_torsions += comp_stamps[i]->getNTorsions(); | 
| 339 |  | localMol++; | 
| 340 |  | } | 
| 341 | < | allMol++; | 
| 341 | > | for (k = 0; k < comp_stamps[i]->getNAtoms(); k++) { | 
| 342 | > | simnfo->molMembershipArray[globalAtomIndex] = allMol; | 
| 343 | > | globalAtomIndex++; | 
| 344 | > | } | 
| 345 | > |  | 
| 346 | > | allMol++; | 
| 347 |  | } | 
| 348 |  | } | 
| 349 |  | local_SRI = local_bonds + local_bends + local_torsions; | 
| 350 |  |  | 
| 274 | – |  | 
| 351 |  | simnfo->n_atoms = mpiSim->getMyNlocal(); | 
| 352 |  |  | 
| 353 |  | if( local_atoms != simnfo->n_atoms ){ | 
| 390 |  |  | 
| 391 |  | if(mol2proc[i] == worldRank ){ | 
| 392 |  | the_molecules[molIndex].setStampID( molCompType[i] ); | 
| 393 | + | the_molecules[molIndex].setMyIndex( molIndex ); | 
| 394 | + | the_molecules[molIndex].setGlobalIndex( i ); | 
| 395 |  | molIndex++; | 
| 396 |  | } | 
| 397 |  | } | 
| 399 |  | #else // is_mpi | 
| 400 |  |  | 
| 401 |  | molIndex = 0; | 
| 402 | + | globalAtomIndex = 0; | 
| 403 |  | for(i=0; i<n_components; i++){ | 
| 404 |  | for(j=0; j<components_nmol[i]; j++ ){ | 
| 405 |  | the_molecules[molIndex].setStampID( i ); | 
| 406 | + | the_molecules[molIndex].setMyIndex( molIndex ); | 
| 407 | + | the_molecules[molIndex].setGlobalIndex( molIndex ); | 
| 408 | + | for (k = 0; k < comp_stamps[i]->getNAtoms(); k++) { | 
| 409 | + | simnfo->molMembershipArray[globalAtomIndex] = molIndex; | 
| 410 | + | globalAtomIndex++; | 
| 411 | + | } | 
| 412 |  | molIndex++; | 
| 413 |  | } | 
| 414 |  | } | 
| 419 |  |  | 
| 420 |  | if( simnfo->n_SRI ){ | 
| 421 |  |  | 
| 337 | – | std::cerr << "n_SRI = " << simnfo->n_SRI << "\n"; | 
| 338 | – |  | 
| 422 |  | Exclude::createArray(simnfo->n_SRI); | 
| 423 |  | the_excludes = new Exclude*[simnfo->n_SRI]; | 
| 424 |  | for( int ex=0; ex<simnfo->n_SRI; ex++) the_excludes[ex] = new Exclude(ex); | 
| 425 |  | simnfo->globalExcludes = new int; | 
| 426 | < | simnfo->n_exclude = tot_SRI; | 
| 426 | > | simnfo->n_exclude = simnfo->n_SRI; | 
| 427 |  | } | 
| 428 |  | else{ | 
| 429 |  |  | 
| 543 |  | } | 
| 544 |  | simnfo->dielectric = the_globals->getDielectric(); | 
| 545 |  | } else { | 
| 546 | < | if (simnfo->n_dipoles) { | 
| 546 | > | if (usesDipoles) { | 
| 547 |  |  | 
| 548 |  | if( !the_globals->haveECR() ){ | 
| 549 |  | sprintf( painCave.errMsg, | 
| 550 | < | "SimSetup Warning: using default value of 1/2 the smallest" | 
| 550 | > | "SimSetup Warning: using default value of 1/2 the smallest " | 
| 551 |  | "box length for the electrostaticCutoffRadius.\n" | 
| 552 |  | "I hope you have a very fast processor!\n"); | 
| 553 |  | painCave.isFatal = 0; | 
| 563 |  |  | 
| 564 |  | if( !the_globals->haveEST() ){ | 
| 565 |  | sprintf( painCave.errMsg, | 
| 566 | < | "SimSetup Warning: using default value of 5% of the" | 
| 566 | > | "SimSetup Warning: using default value of 5%% of the " | 
| 567 |  | "electrostaticCutoffRadius for the " | 
| 568 |  | "electrostaticSkinThickness\n" | 
| 569 |  | ); | 
| 738 |  |  | 
| 739 |  | //   new AllLong( simnfo ); | 
| 740 |  |  | 
| 658 | – | if( !strcmp( force_field, "TraPPE_Ex" ) ) new Symplectic( simnfo, the_ff ); | 
| 659 | – | if( !strcmp( force_field, "LJ" ) ) new Verlet( *simnfo, the_ff ); | 
| 741 |  |  | 
| 742 | + | if( !strcmp( force_field, "TraPPE_Ex" ) ){ | 
| 743 | + | new Symplectic(simnfo, the_ff, the_extendedsystem); | 
| 744 | + | } | 
| 745 | + | else if( !strcmp( force_field, "LJ" ) ){ | 
| 746 | + | new Verlet( *simnfo, the_ff, the_extendedsystem ); | 
| 747 | + | } | 
| 748 | + | else { | 
| 749 | + | std::cerr << "I'm a bug.\n"; | 
| 750 | + | fprintf( stderr, "Ima bug. stderr %s\n", force_field); | 
| 751 | + | } | 
| 752 |  | #ifdef IS_MPI | 
| 753 |  | mpiSim->mpiRefresh(); | 
| 754 |  | #endif | 
| 874 |  | theBonds[j].a = currentBond->getA() + atomOffset; | 
| 875 |  | theBonds[j].b = currentBond->getB() + atomOffset; | 
| 876 |  |  | 
| 877 | < | exI = theBonds[i].a; | 
| 878 | < | exJ = theBonds[i].b; | 
| 877 | > | exI = theBonds[j].a; | 
| 878 | > | exJ = theBonds[j].b; | 
| 879 |  |  | 
| 880 |  | // exclude_I must always be the smaller of the pair | 
| 881 |  | if( exI > exJ ){ | 
| 891 |  |  | 
| 892 |  | the_excludes[j+excludeOffset]->setPair( exI, exJ ); | 
| 893 |  | #else  // isn't MPI | 
| 894 | + |  | 
| 895 |  | the_excludes[j+excludeOffset]->setPair( (exI+1), (exJ+1) ); | 
| 896 |  | #endif  //is_mpi | 
| 897 |  | } | 
| 1023 |  |  | 
| 1024 |  |  | 
| 1025 |  | the_molecules[i].initialize( info ); | 
| 1026 | + |  | 
| 1027 | + |  | 
| 1028 |  | atomOffset += info.nAtoms; | 
| 1029 |  | delete[] theBonds; | 
| 1030 |  | delete[] theBends; |