| 171 |
|
int i, j, k; |
| 172 |
|
int exI, exJ, exK, exL, slI, slJ; |
| 173 |
|
int tempI, tempJ, tempK, tempL; |
| 174 |
< |
int molI; |
| 175 |
< |
int stampID, atomOffset, rbOffset; |
| 174 |
> |
int molI, globalID; |
| 175 |
> |
int stampID, atomOffset, rbOffset, groupOffset; |
| 176 |
|
molInit molInfo; |
| 177 |
|
DirectionalAtom* dAtom; |
| 178 |
|
RigidBody* myRB; |
| 216 |
|
for (k = 0; k < nInfo; k++){ |
| 217 |
|
the_ff->setSimInfo(&(info[k])); |
| 218 |
|
|
| 219 |
+ |
#ifdef IS_MPI |
| 220 |
+ |
info[k].globalGroupMembership = new int[mpiSim->getNAtomsGlobal()]; |
| 221 |
+ |
for (i = 0; i < mpiSim->getNAtomsGlobal(); i++) |
| 222 |
+ |
info[k].globalGroupMembership[i] = 0; |
| 223 |
+ |
#else |
| 224 |
+ |
info[k].globalGroupMembership = new int[info[k].n_atoms]; |
| 225 |
+ |
for (i = 0; i < info[k].n_atoms; i++) |
| 226 |
+ |
info[k].globalGroupMembership[i] = 0; |
| 227 |
+ |
#endif |
| 228 |
+ |
|
| 229 |
|
atomOffset = 0; |
| 230 |
|
groupOffset = 0; |
| 231 |
|
|
| 292 |
|
|
| 293 |
|
molInfo.myAtoms[j]->setType(currentAtom->getType()); |
| 294 |
|
#ifdef IS_MPI |
| 285 |
– |
|
| 295 |
|
molInfo.myAtoms[j]->setGlobalIndex(globalAtomIndex[j + atomOffset]); |
| 287 |
– |
|
| 296 |
|
#endif // is_mpi |
| 297 |
|
} |
| 298 |
|
|
| 514 |
|
nMembers = currentCutoffGroup->getNMembers(); |
| 515 |
|
|
| 516 |
|
myCutoffGroup = new CutoffGroup(); |
| 517 |
+ |
|
| 518 |
+ |
#ifdef IS_MPI |
| 519 |
|
myCutoffGroup->setGlobalIndex(globalGroupIndex[j + groupOffset]); |
| 520 |
+ |
#else |
| 521 |
+ |
myCutoffGroup->setGlobalIndex(j + groupOffset); |
| 522 |
+ |
#endif |
| 523 |
|
|
| 524 |
|
for (int cg = 0; cg < nMembers; cg++) { |
| 525 |
|
|
| 530 |
|
tempI = molI + atomOffset; |
| 531 |
|
|
| 532 |
|
#ifdef IS_MPI |
| 533 |
< |
globalID = info[k].atoms[tempI]->getGlobalIndex() |
| 533 |
> |
globalID = info[k].atoms[tempI]->getGlobalIndex(); |
| 534 |
> |
info[k].globalGroupMembership[globalID] = globalGroupIndex[j+groupOffset]; |
| 535 |
|
#else |
| 536 |
|
globalID = info[k].atoms[tempI]->getIndex(); |
| 537 |
+ |
info[k].globalGroupMembership[globalID] = j + groupOffset; |
| 538 |
|
#endif |
| 539 |
+ |
|
| 540 |
|
|
| 541 |
< |
globalGroupMembership[globalID] = globalGroupIndex[j+groupOffset]; |
| 526 |
< |
|
| 541 |
> |
|
| 542 |
|
myCutoffGroup->addAtom(info[k].atoms[tempI]); |
| 543 |
< |
|
| 543 |
> |
|
| 544 |
|
cutoffAtomSet.insert(tempI); |
| 545 |
|
} |
| 546 |
< |
|
| 546 |
> |
|
| 547 |
|
molInfo.myCutoffGroups.push_back(myCutoffGroup); |
| 548 |
|
groupOffset++; |
| 549 |
|
|
| 550 |
|
}//end for (j = 0; j < molInfo.nCutoffGroups; j++) |
| 551 |
< |
|
| 551 |
> |
|
| 552 |
|
//creat a cutoff group for every atom in current molecule which does not belong to cutoffgroup defined at mdl file |
| 553 |
< |
|
| 553 |
> |
|
| 554 |
|
for(j = 0; j < molInfo.nAtoms; j++){ |
| 555 |
< |
|
| 555 |
> |
|
| 556 |
|
if(cutoffAtomSet.find(molInfo.myAtoms[j]->getIndex()) == cutoffAtomSet.end()){ |
| 557 |
|
myCutoffGroup = new CutoffGroup(); |
| 558 |
|
myCutoffGroup->addAtom(molInfo.myAtoms[j]); |
| 559 |
< |
myCutoffGroup->setGlobalIndex(globalGroupIndex[j + groupOffset]); |
| 560 |
< |
#ifdef IS_MPI |
| 561 |
< |
globalID = info[k].atoms[atomOffset + j]->getGlobalIndex() |
| 562 |
< |
#else |
| 559 |
> |
|
| 560 |
> |
#ifdef IS_MPI |
| 561 |
> |
myCutoffGroup->setGlobalIndex(globalGroupIndex[j + groupOffset]); |
| 562 |
> |
globalID = info[k].atoms[atomOffset + j]->getGlobalIndex(); |
| 563 |
> |
info[k].globalGroupMembership[globalID] = globalGroupIndex[j+groupOffset]; |
| 564 |
> |
#else |
| 565 |
> |
myCutoffGroup->setGlobalIndex(j + groupOffset); |
| 566 |
|
globalID = info[k].atoms[atomOffset + j]->getIndex(); |
| 567 |
+ |
info[k].globalGroupMembership[globalID] = j+groupOffset; |
| 568 |
|
#endif |
| 550 |
– |
globalGroupMembership[globalID] = globalGroupIndex[j+groupOffset]; |
| 569 |
|
molInfo.myCutoffGroups.push_back(myCutoffGroup); |
| 570 |
|
groupOffset++; |
| 571 |
|
} |
| 659 |
|
theTorsions); |
| 660 |
|
|
| 661 |
|
info[k].molecules[i].initialize(molInfo); |
| 662 |
< |
|
| 663 |
< |
|
| 662 |
> |
|
| 663 |
> |
|
| 664 |
|
atomOffset += molInfo.nAtoms; |
| 665 |
|
delete[] theBonds; |
| 666 |
|
delete[] theBends; |
| 667 |
|
delete[] theTorsions; |
| 668 |
< |
} |
| 668 |
> |
} |
| 669 |
> |
|
| 670 |
> |
|
| 671 |
> |
|
| 672 |
> |
#ifdef IS_MPI |
| 673 |
> |
// Since the globalGroupMembership has been zero filled and we've only |
| 674 |
> |
// poked values into the atoms we know, we can do an Allreduce |
| 675 |
> |
// to get the full globalGroupMembership array (We think). |
| 676 |
> |
// This would be prettier if we could use MPI_IN_PLACE like the MPI-2 |
| 677 |
> |
// docs said we could. |
| 678 |
> |
|
| 679 |
> |
int* ggMjunk = new int[mpiSim->getNAtomsGlobal()]; |
| 680 |
> |
|
| 681 |
> |
MPI_Allreduce(info[k].globalGroupMembership, |
| 682 |
> |
ggMjunk, |
| 683 |
> |
mpiSim->getNAtomsGlobal(), |
| 684 |
> |
MPI_INT, MPI_SUM, MPI_COMM_WORLD); |
| 685 |
> |
|
| 686 |
> |
for (i = 0; i < mpiSim->getNAtomsGlobal(); i++) |
| 687 |
> |
info[k].globalGroupMembership[i] = ggMjunk[i]; |
| 688 |
> |
|
| 689 |
> |
delete[] ggMjunk; |
| 690 |
> |
|
| 691 |
> |
#endif |
| 692 |
> |
|
| 693 |
> |
|
| 694 |
> |
|
| 695 |
|
} |
| 696 |
|
|
| 697 |
|
#ifdef IS_MPI |
| 1653 |
|
|
| 1654 |
|
mpiSim->divideLabor(); |
| 1655 |
|
globalAtomIndex = mpiSim->getGlobalAtomIndex(); |
| 1656 |
+ |
globalGroupIndex = mpiSim->getGlobalGroupIndex(); |
| 1657 |
|
//globalMolIndex = mpiSim->getGlobalMolIndex(); |
| 1658 |
|
|
| 1659 |
|
// set up the local variables |