Commit d314e695 authored by peastman's avatar peastman
Browse files

Use C++11 style loops

parent 28b79b2f
......@@ -94,7 +94,7 @@ void AndersenThermostatImpl::tagParticlesInGroup(int particle, int group, vector
// Recursively tag particles as belonging to a particular group.
particleGroup[particle] = group;
for (int i = 0; i < (int) particleConstraints[particle].size(); i++)
if (particleGroup[particleConstraints[particle][i]] == -1)
tagParticlesInGroup(particleConstraints[particle][i], group, particleGroup, particleConstraints);
for (int constrained : particleConstraints[particle])
if (particleGroup[constrained] == -1)
tagParticlesInGroup(constrained, group, particleGroup, particleConstraints);
}
......@@ -44,15 +44,15 @@ int CompiledExpressionSet::getVariableIndex(const std::string& name) {
int index = variables.size();
variables.push_back(name);
variableReferences.push_back(vector<double*>());
for (int i = 0; i < (int) expressions.size(); i++)
if (expressions[i]->getVariables().find(name) != expressions[i]->getVariables().end())
variableReferences[index].push_back(&expressions[i]->getVariableReference(name));
for (auto expression : expressions)
if (expression->getVariables().find(name) != expression->getVariables().end())
variableReferences[index].push_back(&expression->getVariableReference(name));
return index;
}
void CompiledExpressionSet::setVariable(int index, double value) {
for (int i = 0; i < (int) variableReferences[index].size(); i++)
*variableReferences[index][i] = value;
for (auto ref : variableReferences[index])
*ref = value;
}
int CompiledExpressionSet::getNumVariables() const {
......
......@@ -97,8 +97,8 @@ State Context::getState(int types, bool enforcePeriodicBox, int groups) const {
}
if (types&State::Parameters) {
map<string, double> params;
for (map<string, double>::const_iterator iter = impl->parameters.begin(); iter != impl->parameters.end(); iter++)
params[iter->first] = iter->second;
for (auto& param : impl->parameters)
params[param.first] = param.second;
builder.setParameters(params);
}
if (types&State::ParameterDerivatives) {
......@@ -111,13 +111,13 @@ State Context::getState(int types, bool enforcePeriodicBox, int groups) const {
impl->getPositions(positions);
if (enforcePeriodicBox) {
const vector<vector<int> >& molecules = impl->getMolecules();
for (int i = 0; i < (int) molecules.size(); i++) {
for (auto& mol : molecules) {
// Find the molecule center.
Vec3 center;
for (int j = 0; j < (int) molecules[i].size(); j++)
center += positions[molecules[i][j]];
center *= 1.0/molecules[i].size();
for (int j : mol)
center += positions[j];
center *= 1.0/mol.size();
// Find the displacement to move it into the first periodic box.
Vec3 diff;
......@@ -126,10 +126,8 @@ State Context::getState(int types, bool enforcePeriodicBox, int groups) const {
diff += periodicBoxSize[0]*floor((center[0]-diff[0])/periodicBoxSize[0][0]);
// Translate all the particles in the molecule.
for (int j = 0; j < (int) molecules[i].size(); j++) {
Vec3& pos = positions[molecules[i][j]];
pos -= diff;
}
for (int j : mol)
positions[j] -= diff;
}
}
builder.setPositions(positions);
......@@ -152,8 +150,8 @@ void Context::setState(const State& state) {
if ((state.getDataTypes()&State::Velocities) != 0)
setVelocities(state.getVelocities());
if ((state.getDataTypes()&State::Parameters) != 0)
for (map<string, double>::const_iterator iter = state.getParameters().begin(); iter != state.getParameters().end(); ++iter)
setParameter(iter->first, iter->second);
for (auto& param : state.getParameters())
setParameter(param.first, param.second);
}
void Context::setTime(double time) {
......
......@@ -95,19 +95,19 @@ ContextImpl::ContextImpl(Context& owner, const System& system, Integrator& integ
const vector<string>& platformProperties = platform->getPropertyNames();
map<string, string> validatedProperties;
for (map<string, string>::const_iterator iter = properties.begin(); iter != properties.end(); ++iter) {
string property = iter->first;
for (auto& prop : properties) {
string property = prop.first;
if (platform->deprecatedPropertyReplacements.find(property) != platform->deprecatedPropertyReplacements.end())
property = platform->deprecatedPropertyReplacements[property];
bool valid = false;
for (int i = 0; i < (int) platformProperties.size(); i++)
if (platformProperties[i] == property) {
for (auto& p : platformProperties)
if (p == property) {
valid = true;
break;
}
if (!valid)
throw OpenMMException("Illegal property name: "+iter->first);
validatedProperties[property] = iter->second;
throw OpenMMException("Illegal property name: "+prop.first);
validatedProperties[property] = prop.second;
}
// Find the list of kernels required.
......@@ -184,8 +184,8 @@ ContextImpl::ContextImpl(Context& owner, const System& system, Integrator& integ
}
ContextImpl::~ContextImpl() {
for (int i = 0; i < (int) forceImpls.size(); ++i)
delete forceImpls[i];
for (auto force : forceImpls)
delete force;
// Make sure all kernels get properly deleted before contextDestroyed() is called.
......@@ -292,8 +292,8 @@ double ContextImpl::calcForcesAndEnergy(bool includeForces, bool includeEnergy,
while (true) {
double energy = 0.0;
kernel.beginComputation(*this, includeForces, includeEnergy, groups);
for (int i = 0; i < (int) forceImpls.size(); ++i)
energy += forceImpls[i]->calcForcesAndEnergy(*this, includeForces, includeEnergy, groups);
for (auto force : forceImpls)
energy += force->calcForcesAndEnergy(*this, includeForces, includeEnergy, groups);
bool valid = true;
energy += kernel.finishComputation(*this, includeForces, includeEnergy, groups, valid);
if (valid)
......@@ -310,8 +310,8 @@ double ContextImpl::calcKineticEnergy() {
}
void ContextImpl::updateContextState() {
for (int i = 0; i < (int) forceImpls.size(); ++i)
forceImpls[i]->updateContextState(*this);
for (auto force : forceImpls)
force->updateContextState(*this);
}
const vector<ForceImpl*>& ContextImpl::getForceImpls() const {
......@@ -349,8 +349,8 @@ const vector<vector<int> >& ContextImpl::getMolecules() const {
system.getConstraintParameters(i, particle1, particle2, distance);
bonds.push_back(std::make_pair(particle1, particle2));
}
for (int i = 0; i < (int) forceImpls.size(); i++) {
vector<pair<int, int> > forceBonds = forceImpls[i]->getBondedParticles();
for (auto force : forceImpls) {
vector<pair<int, int> > forceBonds = force->getBondedParticles();
bonds.insert(bonds.end(), forceBonds.begin(), forceBonds.end());
}
for (int i = 0; i < system.getNumParticles(); i++) {
......@@ -365,9 +365,9 @@ const vector<vector<int> >& ContextImpl::getMolecules() const {
int numParticles = system.getNumParticles();
vector<vector<int> > particleBonds(numParticles);
for (int i = 0; i < (int) bonds.size(); i++) {
particleBonds[bonds[i].first].push_back(bonds[i].second);
particleBonds[bonds[i].second].push_back(bonds[i].first);
for (auto& bond : bonds) {
particleBonds[bond.first].push_back(bond.second);
particleBonds[bond.second].push_back(bond.first);
}
// Now identify particles by which molecule they belong to.
......@@ -441,9 +441,9 @@ void ContextImpl::createCheckpoint(ostream& stream) {
stream.write((char*) &numParticles, sizeof(int));
int numParameters = parameters.size();
stream.write((char*) &numParameters, sizeof(int));
for (map<string, double>::const_iterator iter = parameters.begin(); iter != parameters.end(); ++iter) {
writeString(stream, iter->first);
stream.write((char*) &iter->second, sizeof(double));
for (auto& param : parameters) {
writeString(stream, param.first);
stream.write((char*) &param.second, sizeof(double));
}
updateStateDataKernel.getAs<UpdateStateDataKernel>().createCheckpoint(*this, stream);
stream.flush();
......
......@@ -52,8 +52,8 @@ CustomCentroidBondForce::CustomCentroidBondForce(int numGroups, const string& en
}
CustomCentroidBondForce::~CustomCentroidBondForce() {
for (int i = 0; i < (int) functions.size(); i++)
delete functions[i].function;
for (auto function : functions)
delete function.function;
}
const string& CustomCentroidBondForce::getEnergyFunction() const {
......
......@@ -83,11 +83,11 @@ void CustomCentroidBondForceImpl::initialize(ContextImpl& context) {
vector<double> weights;
for (int i = 0; i < owner.getNumGroups(); i++) {
owner.getGroupParameters(i, particles, weights);
for (int j = 0; j < (int) particles.size(); j++)
if (particles[j] < 0 || particles[j] >= system.getNumParticles()) {
for (int particle : particles)
if (particle < 0 || particle >= system.getNumParticles()) {
stringstream msg;
msg << "CustomCentroidBondForce: Illegal particle index for a group: ";
msg << particles[j];
msg << particle;
throw OpenMMException(msg.str());
}
if (weights.size() != particles.size() && weights.size() > 0) {
......@@ -102,11 +102,11 @@ void CustomCentroidBondForceImpl::initialize(ContextImpl& context) {
int numBondParameters = owner.getNumPerBondParameters();
for (int i = 0; i < owner.getNumBonds(); i++) {
owner.getBondParameters(i, groups, parameters);
for (int j = 0; j < (int) groups.size(); j++)
if (groups[j] < 0 || groups[j] >= owner.getNumGroups()) {
for (int group : groups)
if (group < 0 || group >= owner.getNumGroups()) {
stringstream msg;
msg << "CustomCentroidBondForce: Illegal group index for a bond: ";
msg << groups[j];
msg << group;
throw OpenMMException(msg.str());
}
if (parameters.size() != numBondParameters) {
......@@ -179,8 +179,8 @@ ExpressionTreeNode CustomCentroidBondForceImpl::replaceFunctions(const Expressio
// This is not an angle or dihedral, so process its children.
vector<ExpressionTreeNode> children;
for (int i = 0; i < (int) node.getChildren().size(); i++)
children.push_back(replaceFunctions(node.getChildren()[i], groups, distances, angles, dihedrals, variables));
for (auto& child : node.getChildren())
children.push_back(replaceFunctions(child, groups, distances, angles, dihedrals, variables));
return ExpressionTreeNode(op.clone(), children);
}
const Operation::Custom& custom = static_cast<const Operation::Custom&>(op);
......
......@@ -53,8 +53,8 @@ CustomCompoundBondForce::CustomCompoundBondForce(int numParticles, const string&
CustomCompoundBondForce::~CustomCompoundBondForce() {
for (int i = 0; i < (int) functions.size(); i++)
delete functions[i].function;
for (auto function : functions)
delete function.function;
}
const string& CustomCompoundBondForce::getEnergyFunction() const {
......
......@@ -88,11 +88,11 @@ void CustomCompoundBondForceImpl::initialize(ContextImpl& context) {
int numBondParameters = owner.getNumPerBondParameters();
for (int i = 0; i < owner.getNumBonds(); i++) {
owner.getBondParameters(i, particles, parameters);
for (int j = 0; j < (int) particles.size(); j++)
if (particles[j] < 0 || particles[j] >= system.getNumParticles()) {
for (int particle : particles)
if (particle < 0 || particle >= system.getNumParticles()) {
stringstream msg;
msg << "CustomCompoundBondForce: Illegal particle index for a bond: ";
msg << particles[j];
msg << particle;
throw OpenMMException(msg.str());
}
if (parameters.size() != numBondParameters) {
......@@ -165,8 +165,8 @@ ExpressionTreeNode CustomCompoundBondForceImpl::replaceFunctions(const Expressio
// This is not an angle or dihedral, so process its children.
vector<ExpressionTreeNode> children;
for (int i = 0; i < (int) node.getChildren().size(); i++)
children.push_back(replaceFunctions(node.getChildren()[i], atoms, distances, angles, dihedrals, variables));
for (auto& child : node.getChildren())
children.push_back(replaceFunctions(child, atoms, distances, angles, dihedrals, variables));
return ExpressionTreeNode(op.clone(), children);
}
const Operation::Custom& custom = static_cast<const Operation::Custom&>(op);
......
......@@ -51,8 +51,8 @@ CustomGBForce::CustomGBForce() : nonbondedMethod(NoCutoff), cutoffDistance(1.0)
}
CustomGBForce::~CustomGBForce() {
for (int i = 0; i < (int) functions.size(); i++)
delete functions[i].function;
for (auto function : functions)
delete function.function;
}
CustomGBForce::NonbondedMethod CustomGBForce::getNonbondedMethod() const {
......
......@@ -52,8 +52,8 @@ CustomHbondForce::CustomHbondForce(const string& energy) : energyExpression(ener
CustomHbondForce::~CustomHbondForce() {
for (int i = 0; i < (int) functions.size(); i++)
delete functions[i].function;
for (auto function : functions)
delete function.function;
}
const string& CustomHbondForce::getEnergyFunction() const {
......
......@@ -235,8 +235,8 @@ ExpressionTreeNode CustomHbondForceImpl::replaceFunctions(const ExpressionTreeNo
// This is not an angle or dihedral, so process its children.
vector<ExpressionTreeNode> children;
for (int i = 0; i < (int) node.getChildren().size(); i++)
children.push_back(replaceFunctions(node.getChildren()[i], atoms, distances, angles, dihedrals, variables));
for (auto& child : node.getChildren())
children.push_back(replaceFunctions(child, atoms, distances, angles, dihedrals, variables));
return ExpressionTreeNode(op.clone(), children);
}
const Operation::Custom& custom = static_cast<const Operation::Custom&>(op);
......
......@@ -55,8 +55,7 @@ void CustomIntegrator::initialize(ContextImpl& contextRef) {
set<std::string> variableSet;
variableList.insert(variableList.end(), globalNames.begin(), globalNames.end());
variableList.insert(variableList.end(), perDofNames.begin(), perDofNames.end());
for (int i = 0; i < (int) variableList.size(); i++) {
string& name = variableList[i];
for (auto& name : variableList) {
if (variableSet.find(name) != variableSet.end())
throw OpenMMException("The Integrator defines two variables with the same name: "+name);
variableSet.insert(name);
......@@ -66,8 +65,8 @@ void CustomIntegrator::initialize(ContextImpl& contextRef) {
set<std::string> globalTargets;
globalTargets.insert(globalNames.begin(), globalNames.end());
globalTargets.insert("dt");
for (map<string, double>::const_iterator iter = contextRef.getParameters().begin(); iter != contextRef.getParameters().end(); ++iter)
globalTargets.insert(iter->first);
for (auto& param : contextRef.getParameters())
globalTargets.insert(param.first);
for (int i = 0; i < computations.size(); i++) {
if (computations[i].type == ComputeGlobal && globalTargets.find(computations[i].variable) == globalTargets.end())
throw OpenMMException("Unknown global variable: "+computations[i].variable);
......
......@@ -59,8 +59,8 @@ bool CustomIntegratorUtilities::usesVariable(const Lepton::ExpressionTreeNode& n
const Lepton::Operation& op = node.getOperation();
if (op.getId() == Lepton::Operation::VARIABLE && op.getName() == variable)
return true;
for (int i = 0; i < (int) node.getChildren().size(); i++)
if (usesVariable(node.getChildren()[i], variable))
for (auto& child : node.getChildren())
if (usesVariable(child, variable))
return true;
return false;
}
......@@ -107,11 +107,9 @@ void CustomIntegratorUtilities::analyzeComputations(const ContextImpl& context,
set<string> affectsForce;
affectsForce.insert("x");
for (vector<ForceImpl*>::const_iterator iter = context.getForceImpls().begin(); iter != context.getForceImpls().end(); ++iter) {
const map<string, double> params = (*iter)->getDefaultParameters();
for (map<string, double>::const_iterator param = params.begin(); param != params.end(); ++param)
affectsForce.insert(param->first);
}
for (auto force : context.getForceImpls())
for (auto& param : force->getDefaultParameters())
affectsForce.insert(param.first);
for (int i = 0; i < numSteps; i++)
invalidatesForces[i] = (stepType[i] == CustomIntegrator::ConstrainPositions || affectsForce.find(stepVariable[i]) != affectsForce.end());
......@@ -253,8 +251,7 @@ void CustomIntegratorUtilities::analyzeForceComputationsForPath(vector<int>& ste
const vector<bool>& invalidatesForces, const vector<int>& forceGroup, vector<bool>& computeBoth) {
vector<int> candidatePoints;
int currentGroup = -1;
for (int i = 0; i < (int) steps.size(); i++) {
int step = steps[i];
for (int step : steps) {
if (invalidatesForces[step] || ((needsForces[step] || needsEnergy[step]) && forceGroup[step] != currentGroup)) {
// Forces and energies are invalidated at this step, or it changes to a different force group,
// so anything from this point on won't affect what we do at earlier steps.
......@@ -264,11 +261,9 @@ void CustomIntegratorUtilities::analyzeForceComputationsForPath(vector<int>& ste
if (needsForces[step] || needsEnergy[step]) {
// See if this step affects what we do at earlier points.
for (int j = 0; j < (int) candidatePoints.size(); j++) {
int candidate = candidatePoints[j];
for (int candidate : candidatePoints)
if ((needsForces[candidate] && needsEnergy[step]) || (needsEnergy[candidate] && needsForces[step]))
computeBoth[candidate] = true;
}
// Add this to the list of candidates that might be affected by later steps.
......
......@@ -48,8 +48,8 @@ CustomManyParticleForce::CustomManyParticleForce(int particlesPerSet, const stri
}
CustomManyParticleForce::~CustomManyParticleForce() {
for (int i = 0; i < (int) functions.size(); i++)
delete functions[i].function;
for (auto function : functions)
delete function.function;
}
const string& CustomManyParticleForce::getEnergyFunction() const {
......@@ -162,9 +162,9 @@ void CustomManyParticleForce::createExclusionsFromBonds(const vector<pair<int, i
return;
vector<set<int> > exclusions(particles.size());
vector<set<int> > bonded12(exclusions.size());
for (int i = 0; i < (int) bonds.size(); ++i) {
int p1 = bonds[i].first;
int p2 = bonds[i].second;
for (auto& bond : bonds) {
int p1 = bond.first;
int p2 = bond.second;
exclusions[p1].insert(p2);
exclusions[p2].insert(p1);
bonded12[p1].insert(p2);
......@@ -172,15 +172,14 @@ void CustomManyParticleForce::createExclusionsFromBonds(const vector<pair<int, i
}
for (int level = 0; level < bondCutoff-1; level++) {
vector<set<int> > currentExclusions = exclusions;
for (int i = 0; i < (int) particles.size(); i++) {
for (set<int>::const_iterator iter = currentExclusions[i].begin(); iter != currentExclusions[i].end(); ++iter)
exclusions[*iter].insert(bonded12[i].begin(), bonded12[i].end());
}
for (int i = 0; i < (int) particles.size(); i++)
for (int j : currentExclusions[i])
exclusions[j].insert(bonded12[i].begin(), bonded12[i].end());
}
for (int i = 0; i < (int) exclusions.size(); ++i)
for (set<int>::const_iterator iter = exclusions[i].begin(); iter != exclusions[i].end(); ++iter)
if (*iter < i)
addExclusion(*iter, i);
for (int j : exclusions[i])
if (j < i)
addExclusion(j, i);
}
void CustomManyParticleForce::getTypeFilter(int index, set<int>& types) const {
......
......@@ -197,8 +197,8 @@ ExpressionTreeNode CustomManyParticleForceImpl::replaceFunctions(const Expressio
// This is not an angle or dihedral, so process its children.
vector<ExpressionTreeNode> children;
for (int i = 0; i < (int) node.getChildren().size(); i++)
children.push_back(replaceFunctions(node.getChildren()[i], atoms, distances, angles, dihedrals, variables));
for (auto& child : node.getChildren())
children.push_back(replaceFunctions(child, atoms, distances, angles, dihedrals, variables));
return ExpressionTreeNode(op.clone(), children);
}
const Operation::Custom& custom = static_cast<const Operation::Custom&>(op);
......@@ -280,9 +280,9 @@ void CustomManyParticleForceImpl::buildFilterArrays(const CustomManyParticleForc
for (int j = 0; j < numTypes; j++)
allowedTypes[i].insert(j);
else {
for (set<int>::const_iterator iter = types.begin(); iter != types.end(); ++iter)
if (typeMap.find(*iter) != typeMap.end())
allowedTypes[i].insert(typeMap[*iter]);
for (int type : types)
if (typeMap.find(type) != typeMap.end())
allowedTypes[i].insert(typeMap[type]);
if (allowedTypes[i].size() < numTypes)
anyFilters = true;
}
......
......@@ -70,8 +70,8 @@ CustomNonbondedForce::CustomNonbondedForce(const CustomNonbondedForce& rhs) {
}
CustomNonbondedForce::~CustomNonbondedForce() {
for (int i = 0; i < (int) functions.size(); i++)
delete functions[i].function;
for (auto function : functions)
delete function.function;
}
const string& CustomNonbondedForce::getEnergyFunction() const {
......@@ -210,14 +210,14 @@ void CustomNonbondedForce::setExclusionParticles(int index, int particle1, int p
void CustomNonbondedForce::createExclusionsFromBonds(const vector<pair<int, int> >& bonds, int bondCutoff) {
if (bondCutoff < 1)
return;
for (int i = 0; i < (int) bonds.size(); ++i)
if (bonds[i].first < 0 || bonds[i].second < 0 || bonds[i].first >= particles.size() || bonds[i].second >= particles.size())
for (auto& bond : bonds)
if (bond.first < 0 || bond.second < 0 || bond.first >= particles.size() || bond.second >= particles.size())
throw OpenMMException("createExclusionsFromBonds: Illegal particle index in list of bonds");
vector<set<int> > exclusions(particles.size());
vector<set<int> > bonded12(exclusions.size());
for (int i = 0; i < (int) bonds.size(); ++i) {
int p1 = bonds[i].first;
int p2 = bonds[i].second;
for (auto& bond : bonds) {
int p1 = bond.first;
int p2 = bond.second;
exclusions[p1].insert(p2);
exclusions[p2].insert(p1);
bonded12[p1].insert(p2);
......@@ -225,15 +225,14 @@ void CustomNonbondedForce::createExclusionsFromBonds(const vector<pair<int, int>
}
for (int level = 0; level < bondCutoff-1; level++) {
vector<set<int> > currentExclusions = exclusions;
for (int i = 0; i < (int) particles.size(); i++) {
for (set<int>::const_iterator iter = currentExclusions[i].begin(); iter != currentExclusions[i].end(); ++iter)
exclusions[*iter].insert(bonded12[i].begin(), bonded12[i].end());
}
for (int i = 0; i < (int) particles.size(); i++)
for (int j : currentExclusions[i])
exclusions[j].insert(bonded12[i].begin(), bonded12[i].end());
}
for (int i = 0; i < (int) exclusions.size(); ++i)
for (set<int>::const_iterator iter = exclusions[i].begin(); iter != exclusions[i].end(); ++iter)
if (*iter < i)
addExclusion(*iter, i);
for (int j : exclusions[i])
if (j < i)
addExclusion(j, i);
}
int CustomNonbondedForce::addTabulatedFunction(const std::string& name, TabulatedFunction* function) {
......
......@@ -54,18 +54,16 @@ bool Force::usesPeriodicBoundaryConditions() const {
}
ForceImpl& Force::getImplInContext(Context& context) {
const vector<ForceImpl*>& impls = context.getImpl().getForceImpls();
for (int i = 0; i < (int) impls.size(); i++)
if (&impls[i]->getOwner() == this)
return *impls[i];
for (auto impl : context.getImpl().getForceImpls())
if (&impl->getOwner() == this)
return *impl;
throw OpenMMException("getImplInContext: This Force is not present in the Context");
}
const ForceImpl& Force::getImplInContext(const Context& context) const {
const vector<ForceImpl*>& impls = context.getImpl().getForceImpls();
for (int i = 0; i < (int) impls.size(); i++)
if (&impls[i]->getOwner() == this)
return *impls[i];
for (auto impl : context.getImpl().getForceImpls())
if (&impl->getOwner() == this)
return *impl;
throw OpenMMException("getImplInContext: This Force is not present in the Context");
}
......
......@@ -203,17 +203,17 @@ ForceImpl* NonbondedForce::createImpl() const {
}
void NonbondedForce::createExceptionsFromBonds(const vector<pair<int, int> >& bonds, double coulomb14Scale, double lj14Scale) {
for (int i = 0; i < (int) bonds.size(); ++i)
if (bonds[i].first < 0 || bonds[i].second < 0 || bonds[i].first >= particles.size() || bonds[i].second >= particles.size())
for (auto& bond : bonds)
if (bond.first < 0 || bond.second < 0 || bond.first >= particles.size() || bond.second >= particles.size())
throw OpenMMException("createExceptionsFromBonds: Illegal particle index in list of bonds");
// Find particles separated by 1, 2, or 3 bonds.
vector<set<int> > exclusions(particles.size());
vector<set<int> > bonded12(exclusions.size());
for (int i = 0; i < (int) bonds.size(); ++i) {
bonded12[bonds[i].first].insert(bonds[i].second);
bonded12[bonds[i].second].insert(bonds[i].first);
for (auto& bond : bonds) {
bonded12[bond.first].insert(bond.second);
bonded12[bond.second].insert(bond.first);
}
for (int i = 0; i < (int) exclusions.size(); ++i)
addExclusionsToSet(bonded12, exclusions[i], i, i, 2);
......@@ -223,33 +223,34 @@ void NonbondedForce::createExceptionsFromBonds(const vector<pair<int, int> >& bo
for (int i = 0; i < (int) exclusions.size(); ++i) {
set<int> bonded13;
addExclusionsToSet(bonded12, bonded13, i, i, 1);
for (set<int>::const_iterator iter = exclusions[i].begin(); iter != exclusions[i].end(); ++iter)
if (*iter < i) {
if (bonded13.find(*iter) == bonded13.end()) {
for (int j : exclusions[i]) {
if (j < i) {
if (bonded13.find(j) == bonded13.end()) {
// This is a 1-4 interaction.
const ParticleInfo& particle1 = particles[*iter];
const ParticleInfo& particle1 = particles[j];
const ParticleInfo& particle2 = particles[i];
const double chargeProd = coulomb14Scale*particle1.charge*particle2.charge;
const double sigma = 0.5*(particle1.sigma+particle2.sigma);
const double epsilon = lj14Scale*std::sqrt(particle1.epsilon*particle2.epsilon);
addException(*iter, i, chargeProd, sigma, epsilon);
addException(j, i, chargeProd, sigma, epsilon);
}
else {
// This interaction should be completely excluded.
addException(*iter, i, 0.0, 1.0, 0.0);
addException(j, i, 0.0, 1.0, 0.0);
}
}
}
}
}
void NonbondedForce::addExclusionsToSet(const vector<set<int> >& bonded12, set<int>& exclusions, int baseParticle, int fromParticle, int currentLevel) const {
for (set<int>::const_iterator iter = bonded12[fromParticle].begin(); iter != bonded12[fromParticle].end(); ++iter) {
if (*iter != baseParticle)
exclusions.insert(*iter);
for (int i : bonded12[fromParticle]) {
if (i != baseParticle)
exclusions.insert(i);
if (currentLevel > 0)
addExclusionsToSet(bonded12, exclusions, baseParticle, *iter, currentLevel-1);
addExclusionsToSet(bonded12, exclusions, baseParticle, i, currentLevel-1);
}
}
......
......@@ -45,10 +45,10 @@ System::System() {
}
System::~System() {
for (int i = 0; i < (int) forces.size(); ++i)
delete forces[i];
for (int i = 0; i < (int) virtualSites.size(); ++i)
delete virtualSites[i];
for (auto force : forces)
delete force;
for (auto site : virtualSites)
delete site;
}
double System::getParticleMass(int index) const {
......
......@@ -89,13 +89,13 @@ ThreadPool::ThreadPool(int numThreads) : currentTask(NULL) {
}
ThreadPool::~ThreadPool() {
for (int i = 0; i < (int) threadData.size(); i++)
threadData[i]->isDeleted = true;
for (auto data : threadData)
data->isDeleted = true;
pthread_mutex_lock(&lock);
pthread_cond_broadcast(&startCondition);
pthread_mutex_unlock(&lock);
for (int i = 0; i < (int) thread.size(); i++)
pthread_join(thread[i], NULL);
for (auto t : thread)
pthread_join(t, NULL);
pthread_mutex_destroy(&lock);
pthread_cond_destroy(&startCondition);
pthread_cond_destroy(&endCondition);
......
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