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 |