113 |
|
AtomCommIntColumn->gather(idents, identsCol); |
114 |
|
|
115 |
|
// allocate memory for the parallel objects |
116 |
< |
AtomRowToGlobal.resize(nAtomsInRow_); |
117 |
< |
AtomColToGlobal.resize(nAtomsInCol_); |
118 |
< |
cgRowToGlobal.resize(nGroupsInRow_); |
119 |
< |
cgColToGlobal.resize(nGroupsInCol_); |
120 |
< |
massFactorsRow.resize(nAtomsInRow_); |
121 |
< |
massFactorsCol.resize(nAtomsInCol_); |
116 |
> |
atypesRow.resize(nAtomsInRow_); |
117 |
> |
atypesCol.resize(nAtomsInCol_); |
118 |
> |
|
119 |
> |
for (int i = 0; i < nAtomsInRow_; i++) |
120 |
> |
atypesRow[i] = ff_->getAtomType(identsRow[i]); |
121 |
> |
for (int i = 0; i < nAtomsInCol_; i++) |
122 |
> |
atypesCol[i] = ff_->getAtomType(identsCol[i]); |
123 |
> |
|
124 |
|
pot_row.resize(nAtomsInRow_); |
125 |
|
pot_col.resize(nAtomsInCol_); |
126 |
|
|
127 |
+ |
AtomRowToGlobal.resize(nAtomsInRow_); |
128 |
+ |
AtomColToGlobal.resize(nAtomsInCol_); |
129 |
|
AtomCommIntRow->gather(AtomLocalToGlobal, AtomRowToGlobal); |
130 |
|
AtomCommIntColumn->gather(AtomLocalToGlobal, AtomColToGlobal); |
131 |
|
|
132 |
+ |
cgRowToGlobal.resize(nGroupsInRow_); |
133 |
+ |
cgColToGlobal.resize(nGroupsInCol_); |
134 |
|
cgCommIntRow->gather(cgLocalToGlobal, cgRowToGlobal); |
135 |
|
cgCommIntColumn->gather(cgLocalToGlobal, cgColToGlobal); |
136 |
|
|
137 |
+ |
massFactorsRow.resize(nAtomsInRow_); |
138 |
+ |
massFactorsCol.resize(nAtomsInCol_); |
139 |
|
AtomCommRealRow->gather(massFactors, massFactorsRow); |
140 |
|
AtomCommRealColumn->gather(massFactors, massFactorsCol); |
141 |
|
|
194 |
|
} |
195 |
|
|
196 |
|
#endif |
197 |
+ |
|
198 |
+ |
// allocate memory for the parallel objects |
199 |
+ |
atypesLocal.resize(nLocal_); |
200 |
+ |
|
201 |
+ |
for (int i = 0; i < nLocal_; i++) |
202 |
+ |
atypesLocal[i] = ff_->getAtomType(idents[i]); |
203 |
|
|
204 |
|
groupList_.clear(); |
205 |
|
groupList_.resize(nGroups_); |
355 |
|
|
356 |
|
// Now we find the maximum group cutoff value present in the simulation |
357 |
|
|
358 |
< |
RealType groupMax = *max_element(gTypeCutoffs.begin(), gTypeCutoffs.end()); |
358 |
> |
RealType groupMax = *max_element(gTypeCutoffs.begin(), |
359 |
> |
gTypeCutoffs.end()); |
360 |
|
|
361 |
|
#ifdef IS_MPI |
362 |
< |
MPI::COMM_WORLD.Allreduce(&groupMax, &groupMax, 1, MPI::REALTYPE, MPI::MAX); |
362 |
> |
MPI::COMM_WORLD.Allreduce(&groupMax, &groupMax, 1, MPI::REALTYPE, |
363 |
> |
MPI::MAX); |
364 |
|
#endif |
365 |
|
|
366 |
|
RealType tradRcut = groupMax; |
456 |
|
Vector<RealType, N_INTERACTION_FAMILIES> (0.0)); |
457 |
|
|
458 |
|
if (storageLayout_ & DataStorage::dslParticlePot) { |
459 |
< |
fill(atomRowData.particlePot.begin(), atomRowData.particlePot.end(), 0.0); |
460 |
< |
fill(atomColData.particlePot.begin(), atomColData.particlePot.end(), 0.0); |
459 |
> |
fill(atomRowData.particlePot.begin(), atomRowData.particlePot.end(), |
460 |
> |
0.0); |
461 |
> |
fill(atomColData.particlePot.begin(), atomColData.particlePot.end(), |
462 |
> |
0.0); |
463 |
|
} |
464 |
|
|
465 |
|
if (storageLayout_ & DataStorage::dslDensity) { |
468 |
|
} |
469 |
|
|
470 |
|
if (storageLayout_ & DataStorage::dslFunctional) { |
471 |
< |
fill(atomRowData.functional.begin(), atomRowData.functional.end(), 0.0); |
472 |
< |
fill(atomColData.functional.begin(), atomColData.functional.end(), 0.0); |
471 |
> |
fill(atomRowData.functional.begin(), atomRowData.functional.end(), |
472 |
> |
0.0); |
473 |
> |
fill(atomColData.functional.begin(), atomColData.functional.end(), |
474 |
> |
0.0); |
475 |
|
} |
476 |
|
|
477 |
|
if (storageLayout_ & DataStorage::dslFunctionalDerivative) { |
488 |
|
atomColData.skippedCharge.end(), 0.0); |
489 |
|
} |
490 |
|
|
491 |
< |
#else |
492 |
< |
|
491 |
> |
#endif |
492 |
> |
// even in parallel, we need to zero out the local arrays: |
493 |
> |
|
494 |
|
if (storageLayout_ & DataStorage::dslParticlePot) { |
495 |
|
fill(snap_->atomData.particlePot.begin(), |
496 |
|
snap_->atomData.particlePot.end(), 0.0); |
512 |
|
fill(snap_->atomData.skippedCharge.begin(), |
513 |
|
snap_->atomData.skippedCharge.end(), 0.0); |
514 |
|
} |
494 |
– |
#endif |
515 |
|
|
516 |
|
} |
517 |
|
|
548 |
|
AtomCommMatrixColumn->gather(snap_->atomData.electroFrame, |
549 |
|
atomColData.electroFrame); |
550 |
|
} |
551 |
+ |
|
552 |
|
#endif |
553 |
|
} |
554 |
|
|
615 |
|
AtomCommVectorColumn->scatter(atomColData.force, frc_tmp); |
616 |
|
for (int i = 0; i < n; i++) |
617 |
|
snap_->atomData.force[i] += frc_tmp[i]; |
618 |
< |
|
598 |
< |
|
618 |
> |
|
619 |
|
if (storageLayout_ & DataStorage::dslTorque) { |
620 |
|
|
621 |
|
int nt = snap_->atomData.torque.size(); |
639 |
|
|
640 |
|
AtomCommRealRow->scatter(atomRowData.skippedCharge, skch_tmp); |
641 |
|
for (int i = 0; i < ns; i++) { |
642 |
< |
snap_->atomData.skippedCharge[i] = skch_tmp[i]; |
642 |
> |
snap_->atomData.skippedCharge[i] += skch_tmp[i]; |
643 |
|
skch_tmp[i] = 0.0; |
644 |
|
} |
645 |
|
|
850 |
|
idat.excluded = excludeAtomPair(atom1, atom2); |
851 |
|
|
852 |
|
#ifdef IS_MPI |
853 |
< |
|
854 |
< |
idat.atypes = make_pair( ff_->getAtomType(identsRow[atom1]), |
855 |
< |
ff_->getAtomType(identsCol[atom2]) ); |
853 |
> |
idat.atypes = make_pair( atypesRow[atom1], atypesCol[atom2]); |
854 |
> |
//idat.atypes = make_pair( ff_->getAtomType(identsRow[atom1]), |
855 |
> |
// ff_->getAtomType(identsCol[atom2]) ); |
856 |
|
|
857 |
|
if (storageLayout_ & DataStorage::dslAmat) { |
858 |
|
idat.A1 = &(atomRowData.aMat[atom1]); |
896 |
|
|
897 |
|
#else |
898 |
|
|
899 |
< |
idat.atypes = make_pair( ff_->getAtomType(idents[atom1]), |
900 |
< |
ff_->getAtomType(idents[atom2]) ); |
899 |
> |
idat.atypes = make_pair( atypesLocal[atom1], atypesLocal[atom2]); |
900 |
> |
//idat.atypes = make_pair( ff_->getAtomType(idents[atom1]), |
901 |
> |
// ff_->getAtomType(idents[atom2]) ); |
902 |
|
|
903 |
|
if (storageLayout_ & DataStorage::dslAmat) { |
904 |
|
idat.A1 = &(snap_->atomData.aMat[atom1]); |