| 461 |
|
} |
| 462 |
|
} |
| 463 |
|
|
| 464 |
– |
|
| 464 |
|
groupCutoffs ForceMatrixDecomposition::getGroupCutoffs(int cg1, int cg2) { |
| 465 |
|
int i, j; |
| 466 |
|
#ifdef IS_MPI |
| 851 |
|
pairwisePot[ii] = ploc2; |
| 852 |
|
} |
| 853 |
|
|
| 855 |
– |
for (int ii = 0; ii < N_INTERACTION_FAMILIES; ii++) { |
| 856 |
– |
RealType ploc1 = embeddingPot[ii]; |
| 857 |
– |
RealType ploc2 = 0.0; |
| 858 |
– |
MPI::COMM_WORLD.Allreduce(&ploc1, &ploc2, 1, MPI::REALTYPE, MPI::SUM); |
| 859 |
– |
embeddingPot[ii] = ploc2; |
| 860 |
– |
} |
| 861 |
– |
|
| 854 |
|
// Here be dragons. |
| 855 |
|
MPI::Intracomm col = colComm.getComm(); |
| 856 |
|
|
| 860 |
|
|
| 861 |
|
|
| 862 |
|
#endif |
| 863 |
+ |
|
| 864 |
+ |
} |
| 865 |
+ |
|
| 866 |
+ |
/** |
| 867 |
+ |
* Collects information obtained during the post-pair (and embedding |
| 868 |
+ |
* functional) loops onto local data structures. |
| 869 |
+ |
*/ |
| 870 |
+ |
void ForceMatrixDecomposition::collectSelfData() { |
| 871 |
+ |
snap_ = sman_->getCurrentSnapshot(); |
| 872 |
+ |
storageLayout_ = sman_->getStorageLayout(); |
| 873 |
|
|
| 874 |
+ |
#ifdef IS_MPI |
| 875 |
+ |
for (int ii = 0; ii < N_INTERACTION_FAMILIES; ii++) { |
| 876 |
+ |
RealType ploc1 = embeddingPot[ii]; |
| 877 |
+ |
RealType ploc2 = 0.0; |
| 878 |
+ |
MPI::COMM_WORLD.Allreduce(&ploc1, &ploc2, 1, MPI::REALTYPE, MPI::SUM); |
| 879 |
+ |
embeddingPot[ii] = ploc2; |
| 880 |
+ |
} |
| 881 |
+ |
#endif |
| 882 |
+ |
|
| 883 |
|
} |
| 884 |
+ |
|
| 885 |
+ |
|
| 886 |
|
|
| 887 |
|
int ForceMatrixDecomposition::getNAtomsInRow() { |
| 888 |
|
#ifdef IS_MPI |
| 1006 |
|
* We need to exclude some overcounted interactions that result from |
| 1007 |
|
* the parallel decomposition. |
| 1008 |
|
*/ |
| 1009 |
< |
bool ForceMatrixDecomposition::skipAtomPair(int atom1, int atom2) { |
| 1010 |
< |
int unique_id_1, unique_id_2; |
| 1009 |
> |
bool ForceMatrixDecomposition::skipAtomPair(int atom1, int atom2, int cg1, int cg2) { |
| 1010 |
> |
int unique_id_1, unique_id_2, group1, group2; |
| 1011 |
|
|
| 1012 |
|
#ifdef IS_MPI |
| 1013 |
|
// in MPI, we have to look up the unique IDs for each atom |
| 1014 |
|
unique_id_1 = AtomRowToGlobal[atom1]; |
| 1015 |
|
unique_id_2 = AtomColToGlobal[atom2]; |
| 1016 |
+ |
group1 = cgRowToGlobal[cg1]; |
| 1017 |
+ |
group2 = cgColToGlobal[cg2]; |
| 1018 |
|
#else |
| 1019 |
|
unique_id_1 = AtomLocalToGlobal[atom1]; |
| 1020 |
|
unique_id_2 = AtomLocalToGlobal[atom2]; |
| 1021 |
+ |
group1 = cgLocalToGlobal[cg1]; |
| 1022 |
+ |
group2 = cgLocalToGlobal[cg2]; |
| 1023 |
|
#endif |
| 1024 |
|
|
| 1025 |
|
if (unique_id_1 == unique_id_2) return true; |
| 1031 |
|
} else { |
| 1032 |
|
if ((unique_id_1 + unique_id_2) % 2 == 1) return true; |
| 1033 |
|
} |
| 1034 |
+ |
#endif |
| 1035 |
+ |
|
| 1036 |
+ |
#ifndef IS_MPI |
| 1037 |
+ |
if (group1 == group2) { |
| 1038 |
+ |
if (unique_id_1 < unique_id_2) return true; |
| 1039 |
+ |
} |
| 1040 |
|
#endif |
| 1041 |
|
|
| 1042 |
|
return false; |
| 1139 |
|
|
| 1140 |
|
#else |
| 1141 |
|
|
| 1119 |
– |
|
| 1120 |
– |
// cerr << "atoms = " << atom1 << " " << atom2 << "\n"; |
| 1121 |
– |
// cerr << "pos1 = " << snap_->atomData.position[atom1] << "\n"; |
| 1122 |
– |
// cerr << "pos2 = " << snap_->atomData.position[atom2] << "\n"; |
| 1123 |
– |
|
| 1142 |
|
idat.atypes = make_pair( atypesLocal[atom1], atypesLocal[atom2]); |
| 1125 |
– |
//idat.atypes = make_pair( ff_->getAtomType(idents[atom1]), |
| 1126 |
– |
// ff_->getAtomType(idents[atom2]) ); |
| 1143 |
|
|
| 1144 |
|
if (storageLayout_ & DataStorage::dslAmat) { |
| 1145 |
|
idat.A1 = &(snap_->atomData.aMat[atom1]); |
| 1199 |
|
atomColData.force[atom2] -= *(idat.f1); |
| 1200 |
|
|
| 1201 |
|
if (storageLayout_ & DataStorage::dslFlucQForce) { |
| 1202 |
< |
atomRowData.flucQFrc[atom1] += *(idat.dVdFQ1); |
| 1203 |
< |
atomColData.flucQFrc[atom2] += *(idat.dVdFQ2); |
| 1202 |
> |
atomRowData.flucQFrc[atom1] -= *(idat.dVdFQ1); |
| 1203 |
> |
atomColData.flucQFrc[atom2] -= *(idat.dVdFQ2); |
| 1204 |
|
} |
| 1205 |
|
|
| 1206 |
|
if (storageLayout_ & DataStorage::dslElectricField) { |
| 1224 |
|
} |
| 1225 |
|
|
| 1226 |
|
if (storageLayout_ & DataStorage::dslFlucQForce) { |
| 1227 |
< |
snap_->atomData.flucQFrc[atom1] += *(idat.dVdFQ1); |
| 1227 |
> |
snap_->atomData.flucQFrc[atom1] -= *(idat.dVdFQ1); |
| 1228 |
|
snap_->atomData.flucQFrc[atom2] -= *(idat.dVdFQ2); |
| 1229 |
|
} |
| 1230 |
|
|