Unverified Commit 78c15368 authored by Peter Eastman's avatar Peter Eastman Committed by GitHub
Browse files

Reduced memory use while identifying molecule groups (#4713)

* Reduced memory use while identifying molecule groups

* Further reduce memory use
parent 53770948
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <cmath> #include <cmath>
#include <set> #include <set>
#include <sstream> #include <sstream>
#include <unordered_set>
#include <utility> #include <utility>
using namespace OpenMM; using namespace OpenMM;
...@@ -201,25 +202,27 @@ void ComputeContext::findMoleculeGroups() { ...@@ -201,25 +202,27 @@ void ComputeContext::findMoleculeGroups() {
// First make a list of every other atom to which each atom is connect by a constraint or force group. // First make a list of every other atom to which each atom is connect by a constraint or force group.
vector<vector<int> > atomBonds(system.getNumParticles()); vector<unordered_set<int> > atomBondSets(system.getNumParticles());
for (int i = 0; i < system.getNumConstraints(); i++) { for (int i = 0; i < system.getNumConstraints(); i++) {
int particle1, particle2; int particle1, particle2;
double distance; double distance;
system.getConstraintParameters(i, particle1, particle2, distance); system.getConstraintParameters(i, particle1, particle2, distance);
atomBonds[particle1].push_back(particle2); atomBondSets[particle1].insert(particle2);
atomBonds[particle2].push_back(particle1); atomBondSets[particle2].insert(particle1);
} }
for (auto force : forces) { for (auto force : forces) {
vector<int> particles; vector<int> particles;
for (int j = 0; j < force->getNumParticleGroups(); j++) { for (int j = 0; j < force->getNumParticleGroups(); j++) {
force->getParticlesInGroup(j, particles); force->getParticlesInGroup(j, particles);
for (int k = 1; k < (int) particles.size(); k++) for (int k = 1; k < (int) particles.size(); k++) {
for (int m = 0; m < k; m++) { atomBondSets[particles[k]].insert(particles[k-1]);
atomBonds[particles[k]].push_back(particles[m]); atomBondSets[particles[k-1]].insert(particles[k]);
atomBonds[particles[m]].push_back(particles[k]); }
}
} }
} }
vector<vector<int> > atomBonds(system.getNumParticles());
for (int i = 0; i < system.getNumParticles(); i++)
atomBonds[i].insert(atomBonds[i].begin(), atomBondSets[i].begin(),atomBondSets[i].end());
// Now identify atoms by which molecule they belong to. // Now identify atoms by which molecule they belong to.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment