"platforms/cuda/vscode:/vscode.git/clone" did not exist on "377e324954e199cc5614b66cab5a09cd4d8209b0"
Commit a566a074 authored by Peter Eastman's avatar Peter Eastman
Browse files

Added index bounds checking to lots of methods

parent 12daada5
...@@ -97,9 +97,7 @@ public: ...@@ -97,9 +97,7 @@ public:
* *
* @param index the index of the particle for which to get the mass * @param index the index of the particle for which to get the mass
*/ */
double getParticleMass(int index) const { double getParticleMass(int index) const;
return masses[index];
}
/** /**
* Set the mass (in atomic mass units) of a particle. If the mass is 0, Integrators will ignore * Set the mass (in atomic mass units) of a particle. If the mass is 0, Integrators will ignore
* the particle and not modify its position or velocity. This is most often * the particle and not modify its position or velocity. This is most often
...@@ -109,9 +107,7 @@ public: ...@@ -109,9 +107,7 @@ public:
* @param index the index of the particle for which to set the mass * @param index the index of the particle for which to set the mass
* @param mass the mass of the particle * @param mass the mass of the particle
*/ */
void setParticleMass(int index, double mass) { void setParticleMass(int index, double mass);
masses[index] = mass;
}
/** /**
* Set a particle to be a virtual site. The VirtualSite object should have * Set a particle to be a virtual site. The VirtualSite object should have
* been created on the heap with the "new" operator. The System takes over * been created on the heap with the "new" operator. The System takes over
...@@ -195,17 +191,13 @@ public: ...@@ -195,17 +191,13 @@ public:
* *
* @param index the index of the Force to get * @param index the index of the Force to get
*/ */
const Force& getForce(int index) const { const Force& getForce(int index) const;
return *forces[index];
}
/** /**
* Get a writable reference to one of the Forces in this System. * Get a writable reference to one of the Forces in this System.
* *
* @param index the index of the Force to get * @param index the index of the Force to get
*/ */
Force& getForce(int index) { Force& getForce(int index);
return *forces[index];
}
/** /**
* Get the default values of the vectors defining the axes of the periodic box (measured in nm). Any newly * Get the default values of the vectors defining the axes of the periodic box (measured in nm). Any newly
* created Context will have its box vectors set to these. They will affect * created Context will have its box vectors set to these. They will affect
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* Biological Structures at Stanford, funded under the NIH Roadmap for * * Biological Structures at Stanford, funded under the NIH Roadmap for *
* Medical Research, grant U54 GM072970. See https://simtk.org. * * Medical Research, grant U54 GM072970. See https://simtk.org. *
* * * *
* Portions copyright (c) 2008 Stanford University and the Authors. * * Portions copyright (c) 2008-2012 Stanford University and the Authors. *
* Authors: Peter Eastman * * Authors: Peter Eastman *
* Contributors: * * Contributors: *
* * * *
...@@ -36,23 +36,15 @@ ...@@ -36,23 +36,15 @@
* This file provides a variety of macros useful in test cases. * This file provides a variety of macros useful in test cases.
*/ */
#include "openmm/OpenMMException.h"
#include <cmath> #include <cmath>
#include <string> #include <string>
#include <sstream> #include <sstream>
void throwException(const char* file, int line, const std::string& details) { namespace OpenMM {
std::string fn(file);
std::string::size_type pos = fn.find_last_of("/\\"); void throwException(const char* file, int line, const std::string& details);
if (pos+1>=fn.size())
pos=0; } // namespace OpenMM
std::string filename(fn,(int)(pos+1),(int)(fn.size()-(pos+1)));
std::stringstream message;
message << "Assertion failure at "<<filename<<":"<<line;
if (details.size() > 0)
message << ". "<<details;
throw OpenMM::OpenMMException(message.str());
}
#define ASSERT(cond) {if (!(cond)) throwException(__FILE__, __LINE__, "");}; #define ASSERT(cond) {if (!(cond)) throwException(__FILE__, __LINE__, "");};
...@@ -64,4 +56,6 @@ void throwException(const char* file, int line, const std::string& details) { ...@@ -64,4 +56,6 @@ void throwException(const char* file, int line, const std::string& details) {
#define ASSERT_USUALLY_EQUAL_TOL(expected, found, tol) {double _scale_ = std::abs(expected) > 1.0 ? std::abs(expected) : 1.0; if (!(std::abs((expected)-(found))/_scale_ <= (tol))) {std::stringstream details; details << "Expected "<<(expected)<<", found "<<(found)<<" (This test is stochastic and may occasionally fail)"; throwException(__FILE__, __LINE__, details.str());}}; #define ASSERT_USUALLY_EQUAL_TOL(expected, found, tol) {double _scale_ = std::abs(expected) > 1.0 ? std::abs(expected) : 1.0; if (!(std::abs((expected)-(found))/_scale_ <= (tol))) {std::stringstream details; details << "Expected "<<(expected)<<", found "<<(found)<<" (This test is stochastic and may occasionally fail)"; throwException(__FILE__, __LINE__, details.str());}};
#define ASSERT_VALID_INDEX(index, vector) {if (index < 0 || index >= vector.size()) throwException(__FILE__, __LINE__, "Index out of range");};
#endif /*OPENMM_ASSERTIONUTILITIES_H_*/ #endif /*OPENMM_ASSERTIONUTILITIES_H_*/
/* -------------------------------------------------------------------------- *
* OpenMM *
* -------------------------------------------------------------------------- *
* This is part of the OpenMM molecular simulation toolkit originating from *
* Simbios, the NIH National Center for Physics-Based Simulation of *
* Biological Structures at Stanford, funded under the NIH Roadmap for *
* Medical Research, grant U54 GM072970. See https://simtk.org. *
* *
* Portions copyright (c) 2008-2012 Stanford University and the Authors. *
* Authors: Peter Eastman *
* Contributors: *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the "Software"), *
* to deal in the Software without restriction, including without limitation *
* the rights to use, copy, modify, merge, publish, distribute, sublicense, *
* and/or sell copies of the Software, and to permit persons to whom the *
* Software is furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included in *
* all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
* THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *
* USE OR OTHER DEALINGS IN THE SOFTWARE. *
* -------------------------------------------------------------------------- */
/**
* This file provides a variety of macros useful in test cases.
*/
#include "openmm/internal/AssertionUtilities.h"
#include "openmm/OpenMMException.h"
#include <string>
#include <sstream>
namespace OpenMM {
void throwException(const char* file, int line, const std::string& details) {
std::string fn(file);
std::string::size_type pos = fn.find_last_of("/\\");
if (pos+1>=fn.size())
pos=0;
std::string filename(fn,(int)(pos+1),(int)(fn.size()-(pos+1)));
std::stringstream message;
message << "Assertion failure at "<<filename<<":"<<line;
if (details.size() > 0)
message << ". "<<details;
throw OpenMMException(message.str());
}
} // namespace OpenMM
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "openmm/Force.h" #include "openmm/Force.h"
#include "openmm/OpenMMException.h" #include "openmm/OpenMMException.h"
#include "openmm/CMAPTorsionForce.h" #include "openmm/CMAPTorsionForce.h"
#include "openmm/internal/AssertionUtilities.h"
#include "openmm/internal/CMAPTorsionForceImpl.h" #include "openmm/internal/CMAPTorsionForceImpl.h"
using namespace OpenMM; using namespace OpenMM;
...@@ -47,11 +48,13 @@ int CMAPTorsionForce::addMap(int size, const std::vector<double>& energy) { ...@@ -47,11 +48,13 @@ int CMAPTorsionForce::addMap(int size, const std::vector<double>& energy) {
} }
void CMAPTorsionForce::getMapParameters(int index, int& size, std::vector<double>& energy) const { void CMAPTorsionForce::getMapParameters(int index, int& size, std::vector<double>& energy) const {
ASSERT_VALID_INDEX(index, maps);
size = maps[index].size; size = maps[index].size;
energy = maps[index].energy; energy = maps[index].energy;
} }
void CMAPTorsionForce::setMapParameters(int index, int size, const std::vector<double>& energy) { void CMAPTorsionForce::setMapParameters(int index, int size, const std::vector<double>& energy) {
ASSERT_VALID_INDEX(index, maps);
if (energy.size() != size*size) if (energy.size() != size*size)
throw OpenMMException("CMAPTorsionForce: incorrect number of energy values"); throw OpenMMException("CMAPTorsionForce: incorrect number of energy values");
maps[index].size = size; maps[index].size = size;
...@@ -64,6 +67,7 @@ int CMAPTorsionForce::addTorsion(int map, int a1, int a2, int a3, int a4, int b1 ...@@ -64,6 +67,7 @@ int CMAPTorsionForce::addTorsion(int map, int a1, int a2, int a3, int a4, int b1
} }
void CMAPTorsionForce::getTorsionParameters(int index, int& map, int& a1, int& a2, int& a3, int& a4, int& b1, int& b2, int& b3, int& b4) const { void CMAPTorsionForce::getTorsionParameters(int index, int& map, int& a1, int& a2, int& a3, int& a4, int& b1, int& b2, int& b3, int& b4) const {
ASSERT_VALID_INDEX(index, torsions);
map = torsions[index].map; map = torsions[index].map;
a1 = torsions[index].a1; a1 = torsions[index].a1;
a2 = torsions[index].a2; a2 = torsions[index].a2;
...@@ -76,6 +80,7 @@ void CMAPTorsionForce::getTorsionParameters(int index, int& map, int& a1, int& a ...@@ -76,6 +80,7 @@ void CMAPTorsionForce::getTorsionParameters(int index, int& map, int& a1, int& a
} }
void CMAPTorsionForce::setTorsionParameters(int index, int map, int a1, int a2, int a3, int a4, int b1, int b2, int b3, int b4) { void CMAPTorsionForce::setTorsionParameters(int index, int map, int a1, int a2, int a3, int a4, int b1, int b2, int b3, int b4) {
ASSERT_VALID_INDEX(index, torsions);
torsions[index].map = map; torsions[index].map = map;
torsions[index].a1 = a1; torsions[index].a1 = a1;
torsions[index].a2 = a2; torsions[index].a2 = a2;
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "openmm/Force.h" #include "openmm/Force.h"
#include "openmm/OpenMMException.h" #include "openmm/OpenMMException.h"
#include "openmm/CustomAngleForce.h" #include "openmm/CustomAngleForce.h"
#include "openmm/internal/AssertionUtilities.h"
#include "openmm/internal/CustomAngleForceImpl.h" #include "openmm/internal/CustomAngleForceImpl.h"
#include <cmath> #include <cmath>
#include <map> #include <map>
...@@ -60,10 +61,12 @@ int CustomAngleForce::addPerAngleParameter(const string& name) { ...@@ -60,10 +61,12 @@ int CustomAngleForce::addPerAngleParameter(const string& name) {
} }
const string& CustomAngleForce::getPerAngleParameterName(int index) const { const string& CustomAngleForce::getPerAngleParameterName(int index) const {
ASSERT_VALID_INDEX(index, parameters);
return parameters[index].name; return parameters[index].name;
} }
void CustomAngleForce::setPerAngleParameterName(int index, const string& name) { void CustomAngleForce::setPerAngleParameterName(int index, const string& name) {
ASSERT_VALID_INDEX(index, parameters);
parameters[index].name = name; parameters[index].name = name;
} }
...@@ -73,18 +76,22 @@ int CustomAngleForce::addGlobalParameter(const string& name, double defaultValue ...@@ -73,18 +76,22 @@ int CustomAngleForce::addGlobalParameter(const string& name, double defaultValue
} }
const string& CustomAngleForce::getGlobalParameterName(int index) const { const string& CustomAngleForce::getGlobalParameterName(int index) const {
ASSERT_VALID_INDEX(index, globalParameters);
return globalParameters[index].name; return globalParameters[index].name;
} }
void CustomAngleForce::setGlobalParameterName(int index, const string& name) { void CustomAngleForce::setGlobalParameterName(int index, const string& name) {
ASSERT_VALID_INDEX(index, globalParameters);
globalParameters[index].name = name; globalParameters[index].name = name;
} }
double CustomAngleForce::getGlobalParameterDefaultValue(int index) const { double CustomAngleForce::getGlobalParameterDefaultValue(int index) const {
ASSERT_VALID_INDEX(index, globalParameters);
return globalParameters[index].defaultValue; return globalParameters[index].defaultValue;
} }
void CustomAngleForce::setGlobalParameterDefaultValue(int index, double defaultValue) { void CustomAngleForce::setGlobalParameterDefaultValue(int index, double defaultValue) {
ASSERT_VALID_INDEX(index, globalParameters);
globalParameters[index].defaultValue = defaultValue; globalParameters[index].defaultValue = defaultValue;
} }
...@@ -94,6 +101,7 @@ int CustomAngleForce::addAngle(int particle1, int particle2, int particle3, cons ...@@ -94,6 +101,7 @@ int CustomAngleForce::addAngle(int particle1, int particle2, int particle3, cons
} }
void CustomAngleForce::getAngleParameters(int index, int& particle1, int& particle2, int& particle3, std::vector<double>& parameters) const { void CustomAngleForce::getAngleParameters(int index, int& particle1, int& particle2, int& particle3, std::vector<double>& parameters) const {
ASSERT_VALID_INDEX(index, angles);
particle1 = angles[index].particle1; particle1 = angles[index].particle1;
particle2 = angles[index].particle2; particle2 = angles[index].particle2;
particle3 = angles[index].particle3; particle3 = angles[index].particle3;
...@@ -101,6 +109,7 @@ void CustomAngleForce::getAngleParameters(int index, int& particle1, int& partic ...@@ -101,6 +109,7 @@ void CustomAngleForce::getAngleParameters(int index, int& particle1, int& partic
} }
void CustomAngleForce::setAngleParameters(int index, int particle1, int particle2, int particle3, const vector<double>& parameters) { void CustomAngleForce::setAngleParameters(int index, int particle1, int particle2, int particle3, const vector<double>& parameters) {
ASSERT_VALID_INDEX(index, angles);
angles[index].parameters = parameters; angles[index].parameters = parameters;
angles[index].particle1 = particle1; angles[index].particle1 = particle1;
angles[index].particle2 = particle2; angles[index].particle2 = particle2;
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "openmm/Force.h" #include "openmm/Force.h"
#include "openmm/OpenMMException.h" #include "openmm/OpenMMException.h"
#include "openmm/CustomBondForce.h" #include "openmm/CustomBondForce.h"
#include "openmm/internal/AssertionUtilities.h"
#include "openmm/internal/CustomBondForceImpl.h" #include "openmm/internal/CustomBondForceImpl.h"
#include <cmath> #include <cmath>
#include <map> #include <map>
...@@ -60,10 +61,12 @@ int CustomBondForce::addPerBondParameter(const string& name) { ...@@ -60,10 +61,12 @@ int CustomBondForce::addPerBondParameter(const string& name) {
} }
const string& CustomBondForce::getPerBondParameterName(int index) const { const string& CustomBondForce::getPerBondParameterName(int index) const {
ASSERT_VALID_INDEX(index, parameters);
return parameters[index].name; return parameters[index].name;
} }
void CustomBondForce::setPerBondParameterName(int index, const string& name) { void CustomBondForce::setPerBondParameterName(int index, const string& name) {
ASSERT_VALID_INDEX(index, parameters);
parameters[index].name = name; parameters[index].name = name;
} }
...@@ -73,18 +76,22 @@ int CustomBondForce::addGlobalParameter(const string& name, double defaultValue) ...@@ -73,18 +76,22 @@ int CustomBondForce::addGlobalParameter(const string& name, double defaultValue)
} }
const string& CustomBondForce::getGlobalParameterName(int index) const { const string& CustomBondForce::getGlobalParameterName(int index) const {
ASSERT_VALID_INDEX(index, globalParameters);
return globalParameters[index].name; return globalParameters[index].name;
} }
void CustomBondForce::setGlobalParameterName(int index, const string& name) { void CustomBondForce::setGlobalParameterName(int index, const string& name) {
ASSERT_VALID_INDEX(index, globalParameters);
globalParameters[index].name = name; globalParameters[index].name = name;
} }
double CustomBondForce::getGlobalParameterDefaultValue(int index) const { double CustomBondForce::getGlobalParameterDefaultValue(int index) const {
ASSERT_VALID_INDEX(index, globalParameters);
return globalParameters[index].defaultValue; return globalParameters[index].defaultValue;
} }
void CustomBondForce::setGlobalParameterDefaultValue(int index, double defaultValue) { void CustomBondForce::setGlobalParameterDefaultValue(int index, double defaultValue) {
ASSERT_VALID_INDEX(index, globalParameters);
globalParameters[index].defaultValue = defaultValue; globalParameters[index].defaultValue = defaultValue;
} }
...@@ -94,12 +101,14 @@ int CustomBondForce::addBond(int particle1, int particle2, const vector<double>& ...@@ -94,12 +101,14 @@ int CustomBondForce::addBond(int particle1, int particle2, const vector<double>&
} }
void CustomBondForce::getBondParameters(int index, int& particle1, int& particle2, std::vector<double>& parameters) const { void CustomBondForce::getBondParameters(int index, int& particle1, int& particle2, std::vector<double>& parameters) const {
ASSERT_VALID_INDEX(index, bonds);
particle1 = bonds[index].particle1; particle1 = bonds[index].particle1;
particle2 = bonds[index].particle2; particle2 = bonds[index].particle2;
parameters = bonds[index].parameters; parameters = bonds[index].parameters;
} }
void CustomBondForce::setBondParameters(int index, int particle1, int particle2, const vector<double>& parameters) { void CustomBondForce::setBondParameters(int index, int particle1, int particle2, const vector<double>& parameters) {
ASSERT_VALID_INDEX(index, bonds);
bonds[index].parameters = parameters; bonds[index].parameters = parameters;
bonds[index].particle1 = particle1; bonds[index].particle1 = particle1;
bonds[index].particle2 = particle2; bonds[index].particle2 = particle2;
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "openmm/Force.h" #include "openmm/Force.h"
#include "openmm/OpenMMException.h" #include "openmm/OpenMMException.h"
#include "openmm/CustomExternalForce.h" #include "openmm/CustomExternalForce.h"
#include "openmm/internal/AssertionUtilities.h"
#include "openmm/internal/CustomExternalForceImpl.h" #include "openmm/internal/CustomExternalForceImpl.h"
#include <cmath> #include <cmath>
#include <map> #include <map>
...@@ -60,10 +61,12 @@ int CustomExternalForce::addPerParticleParameter(const string& name) { ...@@ -60,10 +61,12 @@ int CustomExternalForce::addPerParticleParameter(const string& name) {
} }
const string& CustomExternalForce::getPerParticleParameterName(int index) const { const string& CustomExternalForce::getPerParticleParameterName(int index) const {
ASSERT_VALID_INDEX(index, parameters);
return parameters[index].name; return parameters[index].name;
} }
void CustomExternalForce::setPerParticleParameterName(int index, const string& name) { void CustomExternalForce::setPerParticleParameterName(int index, const string& name) {
ASSERT_VALID_INDEX(index, parameters);
parameters[index].name = name; parameters[index].name = name;
} }
...@@ -73,18 +76,22 @@ int CustomExternalForce::addGlobalParameter(const string& name, double defaultVa ...@@ -73,18 +76,22 @@ int CustomExternalForce::addGlobalParameter(const string& name, double defaultVa
} }
const string& CustomExternalForce::getGlobalParameterName(int index) const { const string& CustomExternalForce::getGlobalParameterName(int index) const {
ASSERT_VALID_INDEX(index, globalParameters);
return globalParameters[index].name; return globalParameters[index].name;
} }
void CustomExternalForce::setGlobalParameterName(int index, const string& name) { void CustomExternalForce::setGlobalParameterName(int index, const string& name) {
ASSERT_VALID_INDEX(index, globalParameters);
globalParameters[index].name = name; globalParameters[index].name = name;
} }
double CustomExternalForce::getGlobalParameterDefaultValue(int index) const { double CustomExternalForce::getGlobalParameterDefaultValue(int index) const {
ASSERT_VALID_INDEX(index, globalParameters);
return globalParameters[index].defaultValue; return globalParameters[index].defaultValue;
} }
void CustomExternalForce::setGlobalParameterDefaultValue(int index, double defaultValue) { void CustomExternalForce::setGlobalParameterDefaultValue(int index, double defaultValue) {
ASSERT_VALID_INDEX(index, globalParameters);
globalParameters[index].defaultValue = defaultValue; globalParameters[index].defaultValue = defaultValue;
} }
...@@ -94,11 +101,13 @@ int CustomExternalForce::addParticle(int particle, const vector<double>& paramet ...@@ -94,11 +101,13 @@ int CustomExternalForce::addParticle(int particle, const vector<double>& paramet
} }
void CustomExternalForce::getParticleParameters(int index, int& particle, std::vector<double>& parameters) const { void CustomExternalForce::getParticleParameters(int index, int& particle, std::vector<double>& parameters) const {
ASSERT_VALID_INDEX(index, particles);
particle = particles[index].particle; particle = particles[index].particle;
parameters = particles[index].parameters; parameters = particles[index].parameters;
} }
void CustomExternalForce::setParticleParameters(int index, int particle, const vector<double>& parameters) { void CustomExternalForce::setParticleParameters(int index, int particle, const vector<double>& parameters) {
ASSERT_VALID_INDEX(index, particles);
particles[index].parameters = parameters; particles[index].parameters = parameters;
particles[index].particle = particle; particles[index].particle = particle;
} }
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "openmm/Force.h" #include "openmm/Force.h"
#include "openmm/OpenMMException.h" #include "openmm/OpenMMException.h"
#include "openmm/CustomGBForce.h" #include "openmm/CustomGBForce.h"
#include "openmm/internal/AssertionUtilities.h"
#include "openmm/internal/CustomGBForceImpl.h" #include "openmm/internal/CustomGBForceImpl.h"
#include <cmath> #include <cmath>
#include <map> #include <map>
...@@ -71,10 +72,12 @@ int CustomGBForce::addPerParticleParameter(const string& name) { ...@@ -71,10 +72,12 @@ int CustomGBForce::addPerParticleParameter(const string& name) {
} }
const string& CustomGBForce::getPerParticleParameterName(int index) const { const string& CustomGBForce::getPerParticleParameterName(int index) const {
ASSERT_VALID_INDEX(index, parameters);
return parameters[index].name; return parameters[index].name;
} }
void CustomGBForce::setPerParticleParameterName(int index, const string& name) { void CustomGBForce::setPerParticleParameterName(int index, const string& name) {
ASSERT_VALID_INDEX(index, parameters);
parameters[index].name = name; parameters[index].name = name;
} }
...@@ -84,18 +87,22 @@ int CustomGBForce::addGlobalParameter(const string& name, double defaultValue) { ...@@ -84,18 +87,22 @@ int CustomGBForce::addGlobalParameter(const string& name, double defaultValue) {
} }
const string& CustomGBForce::getGlobalParameterName(int index) const { const string& CustomGBForce::getGlobalParameterName(int index) const {
ASSERT_VALID_INDEX(index, globalParameters);
return globalParameters[index].name; return globalParameters[index].name;
} }
void CustomGBForce::setGlobalParameterName(int index, const string& name) { void CustomGBForce::setGlobalParameterName(int index, const string& name) {
ASSERT_VALID_INDEX(index, globalParameters);
globalParameters[index].name = name; globalParameters[index].name = name;
} }
double CustomGBForce::getGlobalParameterDefaultValue(int index) const { double CustomGBForce::getGlobalParameterDefaultValue(int index) const {
ASSERT_VALID_INDEX(index, globalParameters);
return globalParameters[index].defaultValue; return globalParameters[index].defaultValue;
} }
void CustomGBForce::setGlobalParameterDefaultValue(int index, double defaultValue) { void CustomGBForce::setGlobalParameterDefaultValue(int index, double defaultValue) {
ASSERT_VALID_INDEX(index, globalParameters);
globalParameters[index].defaultValue = defaultValue; globalParameters[index].defaultValue = defaultValue;
} }
...@@ -105,10 +112,12 @@ int CustomGBForce::addParticle(const vector<double>& parameters) { ...@@ -105,10 +112,12 @@ int CustomGBForce::addParticle(const vector<double>& parameters) {
} }
void CustomGBForce::getParticleParameters(int index, std::vector<double>& parameters) const { void CustomGBForce::getParticleParameters(int index, std::vector<double>& parameters) const {
ASSERT_VALID_INDEX(index, particles);
parameters = particles[index].parameters; parameters = particles[index].parameters;
} }
void CustomGBForce::setParticleParameters(int index, const vector<double>& parameters) { void CustomGBForce::setParticleParameters(int index, const vector<double>& parameters) {
ASSERT_VALID_INDEX(index, particles);
particles[index].parameters = parameters; particles[index].parameters = parameters;
} }
...@@ -118,12 +127,14 @@ int CustomGBForce::addComputedValue(const std::string& name, const std::string& ...@@ -118,12 +127,14 @@ int CustomGBForce::addComputedValue(const std::string& name, const std::string&
} }
void CustomGBForce::getComputedValueParameters(int index, std::string& name, std::string& expression, ComputationType& type) const { void CustomGBForce::getComputedValueParameters(int index, std::string& name, std::string& expression, ComputationType& type) const {
ASSERT_VALID_INDEX(index, computedValues);
name = computedValues[index].name; name = computedValues[index].name;
expression = computedValues[index].expression; expression = computedValues[index].expression;
type = computedValues[index].type; type = computedValues[index].type;
} }
void CustomGBForce::setComputedValueParameters(int index, const std::string& name, const std::string& expression, ComputationType type) { void CustomGBForce::setComputedValueParameters(int index, const std::string& name, const std::string& expression, ComputationType type) {
ASSERT_VALID_INDEX(index, computedValues);
computedValues[index].name = name; computedValues[index].name = name;
computedValues[index].expression = expression; computedValues[index].expression = expression;
computedValues[index].type = type; computedValues[index].type = type;
...@@ -135,11 +146,13 @@ int CustomGBForce::addEnergyTerm(const std::string& expression, ComputationType ...@@ -135,11 +146,13 @@ int CustomGBForce::addEnergyTerm(const std::string& expression, ComputationType
} }
void CustomGBForce::getEnergyTermParameters(int index, std::string& expression, ComputationType& type) const { void CustomGBForce::getEnergyTermParameters(int index, std::string& expression, ComputationType& type) const {
ASSERT_VALID_INDEX(index, energyTerms);
expression = energyTerms[index].expression; expression = energyTerms[index].expression;
type = energyTerms[index].type; type = energyTerms[index].type;
} }
void CustomGBForce::setEnergyTermParameters(int index, const std::string& expression, ComputationType type) { void CustomGBForce::setEnergyTermParameters(int index, const std::string& expression, ComputationType type) {
ASSERT_VALID_INDEX(index, energyTerms);
energyTerms[index].expression = expression; energyTerms[index].expression = expression;
energyTerms[index].type = type; energyTerms[index].type = type;
} }
...@@ -149,11 +162,13 @@ int CustomGBForce::addExclusion(int particle1, int particle2) { ...@@ -149,11 +162,13 @@ int CustomGBForce::addExclusion(int particle1, int particle2) {
return exclusions.size()-1; return exclusions.size()-1;
} }
void CustomGBForce::getExclusionParticles(int index, int& particle1, int& particle2) const { void CustomGBForce::getExclusionParticles(int index, int& particle1, int& particle2) const {
ASSERT_VALID_INDEX(index, exclusions);
particle1 = exclusions[index].particle1; particle1 = exclusions[index].particle1;
particle2 = exclusions[index].particle2; particle2 = exclusions[index].particle2;
} }
void CustomGBForce::setExclusionParticles(int index, int particle1, int particle2) { void CustomGBForce::setExclusionParticles(int index, int particle1, int particle2) {
ASSERT_VALID_INDEX(index, exclusions);
exclusions[index].particle1 = particle1; exclusions[index].particle1 = particle1;
exclusions[index].particle2 = particle2; exclusions[index].particle2 = particle2;
} }
...@@ -168,6 +183,7 @@ int CustomGBForce::addFunction(const std::string& name, const std::vector<double ...@@ -168,6 +183,7 @@ int CustomGBForce::addFunction(const std::string& name, const std::vector<double
} }
void CustomGBForce::getFunctionParameters(int index, std::string& name, std::vector<double>& values, double& min, double& max) const { void CustomGBForce::getFunctionParameters(int index, std::string& name, std::vector<double>& values, double& min, double& max) const {
ASSERT_VALID_INDEX(index, functions);
name = functions[index].name; name = functions[index].name;
values = functions[index].values; values = functions[index].values;
min = functions[index].min; min = functions[index].min;
...@@ -179,6 +195,7 @@ void CustomGBForce::setFunctionParameters(int index, const std::string& name, co ...@@ -179,6 +195,7 @@ void CustomGBForce::setFunctionParameters(int index, const std::string& name, co
throw OpenMMException("CustomGBForce: max <= min for a tabulated function."); throw OpenMMException("CustomGBForce: max <= min for a tabulated function.");
if (values.size() < 2) if (values.size() < 2)
throw OpenMMException("CustomGBForce: a tabulated function must have at least two points"); throw OpenMMException("CustomGBForce: a tabulated function must have at least two points");
ASSERT_VALID_INDEX(index, functions);
functions[index].name = name; functions[index].name = name;
functions[index].values = values; functions[index].values = values;
functions[index].min = min; functions[index].min = min;
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "openmm/Force.h" #include "openmm/Force.h"
#include "openmm/OpenMMException.h" #include "openmm/OpenMMException.h"
#include "openmm/CustomHbondForce.h" #include "openmm/CustomHbondForce.h"
#include "openmm/internal/AssertionUtilities.h"
#include "openmm/internal/CustomHbondForceImpl.h" #include "openmm/internal/CustomHbondForceImpl.h"
#include <cmath> #include <cmath>
#include <map> #include <map>
...@@ -79,10 +80,12 @@ int CustomHbondForce::addPerDonorParameter(const string& name) { ...@@ -79,10 +80,12 @@ int CustomHbondForce::addPerDonorParameter(const string& name) {
} }
const string& CustomHbondForce::getPerDonorParameterName(int index) const { const string& CustomHbondForce::getPerDonorParameterName(int index) const {
ASSERT_VALID_INDEX(index, donorParameters);
return donorParameters[index].name; return donorParameters[index].name;
} }
void CustomHbondForce::setPerDonorParameterName(int index, const string& name) { void CustomHbondForce::setPerDonorParameterName(int index, const string& name) {
ASSERT_VALID_INDEX(index, donorParameters);
donorParameters[index].name = name; donorParameters[index].name = name;
} }
...@@ -92,10 +95,12 @@ int CustomHbondForce::addPerAcceptorParameter(const string& name) { ...@@ -92,10 +95,12 @@ int CustomHbondForce::addPerAcceptorParameter(const string& name) {
} }
const string& CustomHbondForce::getPerAcceptorParameterName(int index) const { const string& CustomHbondForce::getPerAcceptorParameterName(int index) const {
ASSERT_VALID_INDEX(index, acceptorParameters);
return acceptorParameters[index].name; return acceptorParameters[index].name;
} }
void CustomHbondForce::setPerAcceptorParameterName(int index, const string& name) { void CustomHbondForce::setPerAcceptorParameterName(int index, const string& name) {
ASSERT_VALID_INDEX(index, acceptorParameters);
acceptorParameters[index].name = name; acceptorParameters[index].name = name;
} }
...@@ -105,18 +110,22 @@ int CustomHbondForce::addGlobalParameter(const string& name, double defaultValue ...@@ -105,18 +110,22 @@ int CustomHbondForce::addGlobalParameter(const string& name, double defaultValue
} }
const string& CustomHbondForce::getGlobalParameterName(int index) const { const string& CustomHbondForce::getGlobalParameterName(int index) const {
ASSERT_VALID_INDEX(index, globalParameters);
return globalParameters[index].name; return globalParameters[index].name;
} }
void CustomHbondForce::setGlobalParameterName(int index, const string& name) { void CustomHbondForce::setGlobalParameterName(int index, const string& name) {
ASSERT_VALID_INDEX(index, globalParameters);
globalParameters[index].name = name; globalParameters[index].name = name;
} }
double CustomHbondForce::getGlobalParameterDefaultValue(int index) const { double CustomHbondForce::getGlobalParameterDefaultValue(int index) const {
ASSERT_VALID_INDEX(index, globalParameters);
return globalParameters[index].defaultValue; return globalParameters[index].defaultValue;
} }
void CustomHbondForce::setGlobalParameterDefaultValue(int index, double defaultValue) { void CustomHbondForce::setGlobalParameterDefaultValue(int index, double defaultValue) {
ASSERT_VALID_INDEX(index, globalParameters);
globalParameters[index].defaultValue = defaultValue; globalParameters[index].defaultValue = defaultValue;
} }
...@@ -126,6 +135,7 @@ int CustomHbondForce::addDonor(int d1, int d2, int d3, const vector<double>& par ...@@ -126,6 +135,7 @@ int CustomHbondForce::addDonor(int d1, int d2, int d3, const vector<double>& par
} }
void CustomHbondForce::getDonorParameters(int index, int& d1, int& d2, int& d3, std::vector<double>& parameters) const { void CustomHbondForce::getDonorParameters(int index, int& d1, int& d2, int& d3, std::vector<double>& parameters) const {
ASSERT_VALID_INDEX(index, donors);
d1 = donors[index].p1; d1 = donors[index].p1;
d2 = donors[index].p2; d2 = donors[index].p2;
d3 = donors[index].p3; d3 = donors[index].p3;
...@@ -133,6 +143,7 @@ void CustomHbondForce::getDonorParameters(int index, int& d1, int& d2, int& d3, ...@@ -133,6 +143,7 @@ void CustomHbondForce::getDonorParameters(int index, int& d1, int& d2, int& d3,
} }
void CustomHbondForce::setDonorParameters(int index, int d1, int d2, int d3, const vector<double>& parameters) { void CustomHbondForce::setDonorParameters(int index, int d1, int d2, int d3, const vector<double>& parameters) {
ASSERT_VALID_INDEX(index, donors);
donors[index].p1 = d1; donors[index].p1 = d1;
donors[index].p2 = d2; donors[index].p2 = d2;
donors[index].p3 = d3; donors[index].p3 = d3;
...@@ -145,6 +156,7 @@ int CustomHbondForce::addAcceptor(int a1, int a2, int a3, const vector<double>& ...@@ -145,6 +156,7 @@ int CustomHbondForce::addAcceptor(int a1, int a2, int a3, const vector<double>&
} }
void CustomHbondForce::getAcceptorParameters(int index, int& a1, int& a2, int& a3, std::vector<double>& parameters) const { void CustomHbondForce::getAcceptorParameters(int index, int& a1, int& a2, int& a3, std::vector<double>& parameters) const {
ASSERT_VALID_INDEX(index, acceptors);
a1 = acceptors[index].p1; a1 = acceptors[index].p1;
a2 = acceptors[index].p2; a2 = acceptors[index].p2;
a3 = acceptors[index].p3; a3 = acceptors[index].p3;
...@@ -152,6 +164,7 @@ void CustomHbondForce::getAcceptorParameters(int index, int& a1, int& a2, int& a ...@@ -152,6 +164,7 @@ void CustomHbondForce::getAcceptorParameters(int index, int& a1, int& a2, int& a
} }
void CustomHbondForce::setAcceptorParameters(int index, int a1, int a2, int a3, const vector<double>& parameters) { void CustomHbondForce::setAcceptorParameters(int index, int a1, int a2, int a3, const vector<double>& parameters) {
ASSERT_VALID_INDEX(index, acceptors);
acceptors[index].p1 = a1; acceptors[index].p1 = a1;
acceptors[index].p2 = a2; acceptors[index].p2 = a2;
acceptors[index].p3 = a3; acceptors[index].p3 = a3;
...@@ -163,11 +176,13 @@ int CustomHbondForce::addExclusion(int donor, int acceptor) { ...@@ -163,11 +176,13 @@ int CustomHbondForce::addExclusion(int donor, int acceptor) {
return exclusions.size()-1; return exclusions.size()-1;
} }
void CustomHbondForce::getExclusionParticles(int index, int& donor, int& acceptor) const { void CustomHbondForce::getExclusionParticles(int index, int& donor, int& acceptor) const {
ASSERT_VALID_INDEX(index, exclusions);
donor = exclusions[index].donor; donor = exclusions[index].donor;
acceptor = exclusions[index].acceptor; acceptor = exclusions[index].acceptor;
} }
void CustomHbondForce::setExclusionParticles(int index, int donor, int acceptor) { void CustomHbondForce::setExclusionParticles(int index, int donor, int acceptor) {
ASSERT_VALID_INDEX(index, exclusions);
exclusions[index].donor = donor; exclusions[index].donor = donor;
exclusions[index].acceptor = acceptor; exclusions[index].acceptor = acceptor;
} }
...@@ -182,6 +197,7 @@ int CustomHbondForce::addFunction(const std::string& name, const std::vector<dou ...@@ -182,6 +197,7 @@ int CustomHbondForce::addFunction(const std::string& name, const std::vector<dou
} }
void CustomHbondForce::getFunctionParameters(int index, std::string& name, std::vector<double>& values, double& min, double& max) const { void CustomHbondForce::getFunctionParameters(int index, std::string& name, std::vector<double>& values, double& min, double& max) const {
ASSERT_VALID_INDEX(index, functions);
name = functions[index].name; name = functions[index].name;
values = functions[index].values; values = functions[index].values;
min = functions[index].min; min = functions[index].min;
...@@ -193,6 +209,7 @@ void CustomHbondForce::setFunctionParameters(int index, const std::string& name, ...@@ -193,6 +209,7 @@ void CustomHbondForce::setFunctionParameters(int index, const std::string& name,
throw OpenMMException("CustomHbondForce: max <= min for a tabulated function."); throw OpenMMException("CustomHbondForce: max <= min for a tabulated function.");
if (values.size() < 2) if (values.size() < 2)
throw OpenMMException("CustomHbondForce: a tabulated function must have at least two points"); throw OpenMMException("CustomHbondForce: a tabulated function must have at least two points");
ASSERT_VALID_INDEX(index, functions);
functions[index].name = name; functions[index].name = name;
functions[index].values = values; functions[index].values = values;
functions[index].min = min; functions[index].min = min;
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "openmm/CustomIntegrator.h" #include "openmm/CustomIntegrator.h"
#include "openmm/Context.h" #include "openmm/Context.h"
#include "openmm/OpenMMException.h" #include "openmm/OpenMMException.h"
#include "openmm/internal/AssertionUtilities.h"
#include "openmm/internal/ContextImpl.h" #include "openmm/internal/ContextImpl.h"
#include "openmm/kernels.h" #include "openmm/kernels.h"
#include <ctime> #include <ctime>
...@@ -88,8 +89,7 @@ int CustomIntegrator::addGlobalVariable(const string& name, double initialValue) ...@@ -88,8 +89,7 @@ int CustomIntegrator::addGlobalVariable(const string& name, double initialValue)
} }
const string& CustomIntegrator::getGlobalVariableName(int index) const { const string& CustomIntegrator::getGlobalVariableName(int index) const {
if (index < 0 || index >= globalNames.size()) ASSERT_VALID_INDEX(index, globalNames);
throw OpenMMException("Index out of range");
return globalNames[index]; return globalNames[index];
} }
...@@ -102,14 +102,12 @@ int CustomIntegrator::addPerDofVariable(const string& name, double initialValue) ...@@ -102,14 +102,12 @@ int CustomIntegrator::addPerDofVariable(const string& name, double initialValue)
} }
const string& CustomIntegrator::getPerDofVariableName(int index) const { const string& CustomIntegrator::getPerDofVariableName(int index) const {
if (index < 0 || index >= perDofNames.size()) ASSERT_VALID_INDEX(index, perDofNames);
throw OpenMMException("Index out of range");
return perDofNames[index]; return perDofNames[index];
} }
double CustomIntegrator::getGlobalVariable(int index) const { double CustomIntegrator::getGlobalVariable(int index) const {
if (index < 0 || index >= globalNames.size()) ASSERT_VALID_INDEX(index, globalValues);
throw OpenMMException("Index out of range");
if (owner != NULL && !globalsAreCurrent) { if (owner != NULL && !globalsAreCurrent) {
dynamic_cast<const IntegrateCustomStepKernel&>(kernel.getImpl()).getGlobalVariables(*context, globalValues); dynamic_cast<const IntegrateCustomStepKernel&>(kernel.getImpl()).getGlobalVariables(*context, globalValues);
globalsAreCurrent = true; globalsAreCurrent = true;
...@@ -118,8 +116,7 @@ double CustomIntegrator::getGlobalVariable(int index) const { ...@@ -118,8 +116,7 @@ double CustomIntegrator::getGlobalVariable(int index) const {
} }
void CustomIntegrator::setGlobalVariable(int index, double value) { void CustomIntegrator::setGlobalVariable(int index, double value) {
if (index < 0 || index >= globalNames.size()) ASSERT_VALID_INDEX(index, globalValues);
throw OpenMMException("Index out of range");
if (owner != NULL && !globalsAreCurrent) { if (owner != NULL && !globalsAreCurrent) {
dynamic_cast<IntegrateCustomStepKernel&>(kernel.getImpl()).getGlobalVariables(*context, globalValues); dynamic_cast<IntegrateCustomStepKernel&>(kernel.getImpl()).getGlobalVariables(*context, globalValues);
globalsAreCurrent = true; globalsAreCurrent = true;
...@@ -138,8 +135,7 @@ void CustomIntegrator::setGlobalVariableByName(const string& name, double value) ...@@ -138,8 +135,7 @@ void CustomIntegrator::setGlobalVariableByName(const string& name, double value)
} }
void CustomIntegrator::getPerDofVariable(int index, vector<Vec3>& values) const { void CustomIntegrator::getPerDofVariable(int index, vector<Vec3>& values) const {
if (index < 0 || index >= perDofNames.size()) ASSERT_VALID_INDEX(index, perDofValues);
throw OpenMMException("Index out of range");
if (owner == NULL) if (owner == NULL)
values = perDofValues[index]; values = perDofValues[index];
else else
...@@ -147,8 +143,7 @@ void CustomIntegrator::getPerDofVariable(int index, vector<Vec3>& values) const ...@@ -147,8 +143,7 @@ void CustomIntegrator::getPerDofVariable(int index, vector<Vec3>& values) const
} }
void CustomIntegrator::setPerDofVariable(int index, const vector<Vec3>& values) { void CustomIntegrator::setPerDofVariable(int index, const vector<Vec3>& values) {
if (index < 0 || index >= perDofNames.size()) ASSERT_VALID_INDEX(index, perDofValues);
throw OpenMMException("Index out of range");
if (values.size() != context->getSystem().getNumParticles()) if (values.size() != context->getSystem().getNumParticles())
throw OpenMMException("setPerDofVariable() called with wrong number of values"); throw OpenMMException("setPerDofVariable() called with wrong number of values");
if (owner == NULL) if (owner == NULL)
...@@ -209,8 +204,7 @@ int CustomIntegrator::addUpdateContextState() { ...@@ -209,8 +204,7 @@ int CustomIntegrator::addUpdateContextState() {
} }
void CustomIntegrator::getComputationStep(int index, ComputationType& type, string& variable, string& expression) const { void CustomIntegrator::getComputationStep(int index, ComputationType& type, string& variable, string& expression) const {
if (index < 0 || index >= computations.size()) ASSERT_VALID_INDEX(index, computations);
throw OpenMMException("Index out of range");
type = computations[index].type; type = computations[index].type;
variable = computations[index].variable; variable = computations[index].variable;
expression = computations[index].expression; expression = computations[index].expression;
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "openmm/Force.h" #include "openmm/Force.h"
#include "openmm/OpenMMException.h" #include "openmm/OpenMMException.h"
#include "openmm/CustomNonbondedForce.h" #include "openmm/CustomNonbondedForce.h"
#include "openmm/internal/AssertionUtilities.h"
#include "openmm/internal/CustomNonbondedForceImpl.h" #include "openmm/internal/CustomNonbondedForceImpl.h"
#include <cmath> #include <cmath>
#include <map> #include <map>
...@@ -79,10 +80,12 @@ int CustomNonbondedForce::addPerParticleParameter(const string& name) { ...@@ -79,10 +80,12 @@ int CustomNonbondedForce::addPerParticleParameter(const string& name) {
} }
const string& CustomNonbondedForce::getPerParticleParameterName(int index) const { const string& CustomNonbondedForce::getPerParticleParameterName(int index) const {
ASSERT_VALID_INDEX(index, parameters);
return parameters[index].name; return parameters[index].name;
} }
void CustomNonbondedForce::setPerParticleParameterName(int index, const string& name) { void CustomNonbondedForce::setPerParticleParameterName(int index, const string& name) {
ASSERT_VALID_INDEX(index, parameters);
parameters[index].name = name; parameters[index].name = name;
} }
...@@ -92,18 +95,22 @@ int CustomNonbondedForce::addGlobalParameter(const string& name, double defaultV ...@@ -92,18 +95,22 @@ int CustomNonbondedForce::addGlobalParameter(const string& name, double defaultV
} }
const string& CustomNonbondedForce::getGlobalParameterName(int index) const { const string& CustomNonbondedForce::getGlobalParameterName(int index) const {
ASSERT_VALID_INDEX(index, globalParameters);
return globalParameters[index].name; return globalParameters[index].name;
} }
void CustomNonbondedForce::setGlobalParameterName(int index, const string& name) { void CustomNonbondedForce::setGlobalParameterName(int index, const string& name) {
ASSERT_VALID_INDEX(index, globalParameters);
globalParameters[index].name = name; globalParameters[index].name = name;
} }
double CustomNonbondedForce::getGlobalParameterDefaultValue(int index) const { double CustomNonbondedForce::getGlobalParameterDefaultValue(int index) const {
ASSERT_VALID_INDEX(index, globalParameters);
return globalParameters[index].defaultValue; return globalParameters[index].defaultValue;
} }
void CustomNonbondedForce::setGlobalParameterDefaultValue(int index, double defaultValue) { void CustomNonbondedForce::setGlobalParameterDefaultValue(int index, double defaultValue) {
ASSERT_VALID_INDEX(index, globalParameters);
globalParameters[index].defaultValue = defaultValue; globalParameters[index].defaultValue = defaultValue;
} }
...@@ -113,10 +120,12 @@ int CustomNonbondedForce::addParticle(const vector<double>& parameters) { ...@@ -113,10 +120,12 @@ int CustomNonbondedForce::addParticle(const vector<double>& parameters) {
} }
void CustomNonbondedForce::getParticleParameters(int index, std::vector<double>& parameters) const { void CustomNonbondedForce::getParticleParameters(int index, std::vector<double>& parameters) const {
ASSERT_VALID_INDEX(index, particles);
parameters = particles[index].parameters; parameters = particles[index].parameters;
} }
void CustomNonbondedForce::setParticleParameters(int index, const vector<double>& parameters) { void CustomNonbondedForce::setParticleParameters(int index, const vector<double>& parameters) {
ASSERT_VALID_INDEX(index, particles);
particles[index].parameters = parameters; particles[index].parameters = parameters;
} }
...@@ -125,11 +134,13 @@ int CustomNonbondedForce::addExclusion(int particle1, int particle2) { ...@@ -125,11 +134,13 @@ int CustomNonbondedForce::addExclusion(int particle1, int particle2) {
return exclusions.size()-1; return exclusions.size()-1;
} }
void CustomNonbondedForce::getExclusionParticles(int index, int& particle1, int& particle2) const { void CustomNonbondedForce::getExclusionParticles(int index, int& particle1, int& particle2) const {
ASSERT_VALID_INDEX(index, exclusions);
particle1 = exclusions[index].particle1; particle1 = exclusions[index].particle1;
particle2 = exclusions[index].particle2; particle2 = exclusions[index].particle2;
} }
void CustomNonbondedForce::setExclusionParticles(int index, int particle1, int particle2) { void CustomNonbondedForce::setExclusionParticles(int index, int particle1, int particle2) {
ASSERT_VALID_INDEX(index, exclusions);
exclusions[index].particle1 = particle1; exclusions[index].particle1 = particle1;
exclusions[index].particle2 = particle2; exclusions[index].particle2 = particle2;
} }
...@@ -144,6 +155,7 @@ int CustomNonbondedForce::addFunction(const std::string& name, const std::vector ...@@ -144,6 +155,7 @@ int CustomNonbondedForce::addFunction(const std::string& name, const std::vector
} }
void CustomNonbondedForce::getFunctionParameters(int index, std::string& name, std::vector<double>& values, double& min, double& max) const { void CustomNonbondedForce::getFunctionParameters(int index, std::string& name, std::vector<double>& values, double& min, double& max) const {
ASSERT_VALID_INDEX(index, functions);
name = functions[index].name; name = functions[index].name;
values = functions[index].values; values = functions[index].values;
min = functions[index].min; min = functions[index].min;
...@@ -155,6 +167,7 @@ void CustomNonbondedForce::setFunctionParameters(int index, const std::string& n ...@@ -155,6 +167,7 @@ void CustomNonbondedForce::setFunctionParameters(int index, const std::string& n
throw OpenMMException("CustomNonbondedForce: max <= min for a tabulated function."); throw OpenMMException("CustomNonbondedForce: max <= min for a tabulated function.");
if (values.size() < 2) if (values.size() < 2)
throw OpenMMException("CustomNonbondedForce: a tabulated function must have at least two points"); throw OpenMMException("CustomNonbondedForce: a tabulated function must have at least two points");
ASSERT_VALID_INDEX(index, functions);
functions[index].name = name; functions[index].name = name;
functions[index].values = values; functions[index].values = values;
functions[index].min = min; functions[index].min = min;
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "openmm/Force.h" #include "openmm/Force.h"
#include "openmm/OpenMMException.h" #include "openmm/OpenMMException.h"
#include "openmm/CustomTorsionForce.h" #include "openmm/CustomTorsionForce.h"
#include "openmm/internal/AssertionUtilities.h"
#include "openmm/internal/CustomTorsionForceImpl.h" #include "openmm/internal/CustomTorsionForceImpl.h"
#include <cmath> #include <cmath>
#include <map> #include <map>
...@@ -60,10 +61,12 @@ int CustomTorsionForce::addPerTorsionParameter(const string& name) { ...@@ -60,10 +61,12 @@ int CustomTorsionForce::addPerTorsionParameter(const string& name) {
} }
const string& CustomTorsionForce::getPerTorsionParameterName(int index) const { const string& CustomTorsionForce::getPerTorsionParameterName(int index) const {
ASSERT_VALID_INDEX(index, parameters);
return parameters[index].name; return parameters[index].name;
} }
void CustomTorsionForce::setPerTorsionParameterName(int index, const string& name) { void CustomTorsionForce::setPerTorsionParameterName(int index, const string& name) {
ASSERT_VALID_INDEX(index, parameters);
parameters[index].name = name; parameters[index].name = name;
} }
...@@ -73,18 +76,22 @@ int CustomTorsionForce::addGlobalParameter(const string& name, double defaultVal ...@@ -73,18 +76,22 @@ int CustomTorsionForce::addGlobalParameter(const string& name, double defaultVal
} }
const string& CustomTorsionForce::getGlobalParameterName(int index) const { const string& CustomTorsionForce::getGlobalParameterName(int index) const {
ASSERT_VALID_INDEX(index, globalParameters);
return globalParameters[index].name; return globalParameters[index].name;
} }
void CustomTorsionForce::setGlobalParameterName(int index, const string& name) { void CustomTorsionForce::setGlobalParameterName(int index, const string& name) {
ASSERT_VALID_INDEX(index, globalParameters);
globalParameters[index].name = name; globalParameters[index].name = name;
} }
double CustomTorsionForce::getGlobalParameterDefaultValue(int index) const { double CustomTorsionForce::getGlobalParameterDefaultValue(int index) const {
ASSERT_VALID_INDEX(index, globalParameters);
return globalParameters[index].defaultValue; return globalParameters[index].defaultValue;
} }
void CustomTorsionForce::setGlobalParameterDefaultValue(int index, double defaultValue) { void CustomTorsionForce::setGlobalParameterDefaultValue(int index, double defaultValue) {
ASSERT_VALID_INDEX(index, globalParameters);
globalParameters[index].defaultValue = defaultValue; globalParameters[index].defaultValue = defaultValue;
} }
...@@ -94,6 +101,7 @@ int CustomTorsionForce::addTorsion(int particle1, int particle2, int particle3, ...@@ -94,6 +101,7 @@ int CustomTorsionForce::addTorsion(int particle1, int particle2, int particle3,
} }
void CustomTorsionForce::getTorsionParameters(int index, int& particle1, int& particle2, int& particle3, int& particle4, std::vector<double>& parameters) const { void CustomTorsionForce::getTorsionParameters(int index, int& particle1, int& particle2, int& particle3, int& particle4, std::vector<double>& parameters) const {
ASSERT_VALID_INDEX(index, torsions);
particle1 = torsions[index].particle1; particle1 = torsions[index].particle1;
particle2 = torsions[index].particle2; particle2 = torsions[index].particle2;
particle3 = torsions[index].particle3; particle3 = torsions[index].particle3;
...@@ -102,6 +110,7 @@ void CustomTorsionForce::getTorsionParameters(int index, int& particle1, int& pa ...@@ -102,6 +110,7 @@ void CustomTorsionForce::getTorsionParameters(int index, int& particle1, int& pa
} }
void CustomTorsionForce::setTorsionParameters(int index, int particle1, int particle2, int particle3, int particle4, const vector<double>& parameters) { void CustomTorsionForce::setTorsionParameters(int index, int particle1, int particle2, int particle3, int particle4, const vector<double>& parameters) {
ASSERT_VALID_INDEX(index, torsions);
torsions[index].parameters = parameters; torsions[index].parameters = parameters;
torsions[index].particle1 = particle1; torsions[index].particle1 = particle1;
torsions[index].particle2 = particle2; torsions[index].particle2 = particle2;
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "openmm/Force.h" #include "openmm/Force.h"
#include "openmm/OpenMMException.h" #include "openmm/OpenMMException.h"
#include "openmm/GBSAOBCForce.h" #include "openmm/GBSAOBCForce.h"
#include "openmm/internal/AssertionUtilities.h"
#include "openmm/internal/GBSAOBCForceImpl.h" #include "openmm/internal/GBSAOBCForceImpl.h"
using namespace OpenMM; using namespace OpenMM;
...@@ -45,12 +46,14 @@ int GBSAOBCForce::addParticle(double charge, double radius, double scalingFactor ...@@ -45,12 +46,14 @@ int GBSAOBCForce::addParticle(double charge, double radius, double scalingFactor
} }
void GBSAOBCForce::getParticleParameters(int index, double& charge, double& radius, double& scalingFactor) const { void GBSAOBCForce::getParticleParameters(int index, double& charge, double& radius, double& scalingFactor) const {
ASSERT_VALID_INDEX(index, particles);
charge = particles[index].charge; charge = particles[index].charge;
radius = particles[index].radius; radius = particles[index].radius;
scalingFactor = particles[index].scalingFactor; scalingFactor = particles[index].scalingFactor;
} }
void GBSAOBCForce::setParticleParameters(int index, double charge, double radius, double scalingFactor) { void GBSAOBCForce::setParticleParameters(int index, double charge, double radius, double scalingFactor) {
ASSERT_VALID_INDEX(index, particles);
particles[index].charge = charge; particles[index].charge = charge;
particles[index].radius = radius; particles[index].radius = radius;
particles[index].scalingFactor = scalingFactor; particles[index].scalingFactor = scalingFactor;
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "openmm/Force.h" #include "openmm/Force.h"
#include "openmm/OpenMMException.h" #include "openmm/OpenMMException.h"
#include "openmm/GBVIForce.h" #include "openmm/GBVIForce.h"
#include "openmm/internal/AssertionUtilities.h"
#include "openmm/internal/GBVIForceImpl.h" #include "openmm/internal/GBVIForceImpl.h"
#include <sstream> #include <sstream>
...@@ -47,12 +48,14 @@ int GBVIForce::addParticle(double charge, double radius, double gamma) { ...@@ -47,12 +48,14 @@ int GBVIForce::addParticle(double charge, double radius, double gamma) {
} }
void GBVIForce::getParticleParameters(int index, double& charge, double& radius, double& gamma) const { void GBVIForce::getParticleParameters(int index, double& charge, double& radius, double& gamma) const {
ASSERT_VALID_INDEX(index, particles);
charge = particles[index].charge; charge = particles[index].charge;
radius = particles[index].radius; radius = particles[index].radius;
gamma = particles[index].gamma; gamma = particles[index].gamma;
} }
void GBVIForce::setParticleParameters(int index, double charge, double radius, double gamma) { void GBVIForce::setParticleParameters(int index, double charge, double radius, double gamma) {
ASSERT_VALID_INDEX(index, particles);
particles[index].charge = charge; particles[index].charge = charge;
particles[index].radius = radius; particles[index].radius = radius;
particles[index].gamma = gamma; particles[index].gamma = gamma;
...@@ -104,6 +107,7 @@ int GBVIForce::addBond(int particle1, int particle2, double bondLength) { ...@@ -104,6 +107,7 @@ int GBVIForce::addBond(int particle1, int particle2, double bondLength) {
} }
void GBVIForce::setBondParameters( int index, int particle1, int particle2, double bondLength) { void GBVIForce::setBondParameters( int index, int particle1, int particle2, double bondLength) {
ASSERT_VALID_INDEX(index, bonds);
bonds[index].particle1 = particle1; bonds[index].particle1 = particle1;
bonds[index].particle2 = particle2; bonds[index].particle2 = particle2;
bonds[index].bondLength = bondLength; bonds[index].bondLength = bondLength;
...@@ -114,6 +118,7 @@ int GBVIForce::getNumBonds( void ) const { ...@@ -114,6 +118,7 @@ int GBVIForce::getNumBonds( void ) const {
} }
void GBVIForce::getBondParameters(int index, int& bondIndex1, int& bondIndex2, double& bondLength) const { void GBVIForce::getBondParameters(int index, int& bondIndex1, int& bondIndex2, double& bondLength) const {
ASSERT_VALID_INDEX(index, bonds);
bondIndex1 = bonds[index].particle1; bondIndex1 = bonds[index].particle1;
bondIndex2 = bonds[index].particle2; bondIndex2 = bonds[index].particle2;
bondLength = bonds[index].bondLength; bondLength = bonds[index].bondLength;
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "openmm/Force.h" #include "openmm/Force.h"
#include "openmm/OpenMMException.h" #include "openmm/OpenMMException.h"
#include "openmm/HarmonicAngleForce.h" #include "openmm/HarmonicAngleForce.h"
#include "openmm/internal/AssertionUtilities.h"
#include "openmm/internal/HarmonicAngleForceImpl.h" #include "openmm/internal/HarmonicAngleForceImpl.h"
using namespace OpenMM; using namespace OpenMM;
...@@ -45,6 +46,7 @@ int HarmonicAngleForce::addAngle(int particle1, int particle2, int particle3, do ...@@ -45,6 +46,7 @@ int HarmonicAngleForce::addAngle(int particle1, int particle2, int particle3, do
} }
void HarmonicAngleForce::getAngleParameters(int index, int& particle1, int& particle2, int& particle3, double& angle, double& k) const { void HarmonicAngleForce::getAngleParameters(int index, int& particle1, int& particle2, int& particle3, double& angle, double& k) const {
ASSERT_VALID_INDEX(index, angles);
particle1 = angles[index].particle1; particle1 = angles[index].particle1;
particle2 = angles[index].particle2; particle2 = angles[index].particle2;
particle3 = angles[index].particle3; particle3 = angles[index].particle3;
...@@ -53,6 +55,7 @@ void HarmonicAngleForce::getAngleParameters(int index, int& particle1, int& part ...@@ -53,6 +55,7 @@ void HarmonicAngleForce::getAngleParameters(int index, int& particle1, int& part
} }
void HarmonicAngleForce::setAngleParameters(int index, int particle1, int particle2, int particle3, double angle, double k) { void HarmonicAngleForce::setAngleParameters(int index, int particle1, int particle2, int particle3, double angle, double k) {
ASSERT_VALID_INDEX(index, angles);
angles[index].particle1 = particle1; angles[index].particle1 = particle1;
angles[index].particle2 = particle2; angles[index].particle2 = particle2;
angles[index].particle3 = particle3; angles[index].particle3 = particle3;
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "openmm/Force.h" #include "openmm/Force.h"
#include "openmm/OpenMMException.h" #include "openmm/OpenMMException.h"
#include "openmm/HarmonicBondForce.h" #include "openmm/HarmonicBondForce.h"
#include "openmm/internal/AssertionUtilities.h"
#include "openmm/internal/HarmonicBondForceImpl.h" #include "openmm/internal/HarmonicBondForceImpl.h"
using namespace OpenMM; using namespace OpenMM;
...@@ -45,6 +46,7 @@ int HarmonicBondForce::addBond(int particle1, int particle2, double length, doub ...@@ -45,6 +46,7 @@ int HarmonicBondForce::addBond(int particle1, int particle2, double length, doub
} }
void HarmonicBondForce::getBondParameters(int index, int& particle1, int& particle2, double& length, double& k) const { void HarmonicBondForce::getBondParameters(int index, int& particle1, int& particle2, double& length, double& k) const {
ASSERT_VALID_INDEX(index, bonds);
particle1 = bonds[index].particle1; particle1 = bonds[index].particle1;
particle2 = bonds[index].particle2; particle2 = bonds[index].particle2;
length = bonds[index].length; length = bonds[index].length;
...@@ -52,6 +54,7 @@ void HarmonicBondForce::getBondParameters(int index, int& particle1, int& partic ...@@ -52,6 +54,7 @@ void HarmonicBondForce::getBondParameters(int index, int& particle1, int& partic
} }
void HarmonicBondForce::setBondParameters(int index, int particle1, int particle2, double length, double k) { void HarmonicBondForce::setBondParameters(int index, int particle1, int particle2, double length, double k) {
ASSERT_VALID_INDEX(index, bonds);
bonds[index].particle1 = particle1; bonds[index].particle1 = particle1;
bonds[index].particle2 = particle2; bonds[index].particle2 = particle2;
bonds[index].length = length; bonds[index].length = length;
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "openmm/Force.h" #include "openmm/Force.h"
#include "openmm/OpenMMException.h" #include "openmm/OpenMMException.h"
#include "openmm/NonbondedForce.h" #include "openmm/NonbondedForce.h"
#include "openmm/internal/AssertionUtilities.h"
#include "openmm/internal/NonbondedForceImpl.h" #include "openmm/internal/NonbondedForceImpl.h"
#include <cmath> #include <cmath>
#include <map> #include <map>
...@@ -88,12 +89,14 @@ int NonbondedForce::addParticle(double charge, double sigma, double epsilon) { ...@@ -88,12 +89,14 @@ int NonbondedForce::addParticle(double charge, double sigma, double epsilon) {
} }
void NonbondedForce::getParticleParameters(int index, double& charge, double& sigma, double& epsilon) const { void NonbondedForce::getParticleParameters(int index, double& charge, double& sigma, double& epsilon) const {
ASSERT_VALID_INDEX(index, particles);
charge = particles[index].charge; charge = particles[index].charge;
sigma = particles[index].sigma; sigma = particles[index].sigma;
epsilon = particles[index].epsilon; epsilon = particles[index].epsilon;
} }
void NonbondedForce::setParticleParameters(int index, double charge, double sigma, double epsilon) { void NonbondedForce::setParticleParameters(int index, double charge, double sigma, double epsilon) {
ASSERT_VALID_INDEX(index, particles);
particles[index].charge = charge; particles[index].charge = charge;
particles[index].sigma = sigma; particles[index].sigma = sigma;
particles[index].epsilon = epsilon; particles[index].epsilon = epsilon;
...@@ -125,6 +128,7 @@ int NonbondedForce::addException(int particle1, int particle2, double chargeProd ...@@ -125,6 +128,7 @@ int NonbondedForce::addException(int particle1, int particle2, double chargeProd
return newIndex; return newIndex;
} }
void NonbondedForce::getExceptionParameters(int index, int& particle1, int& particle2, double& chargeProd, double& sigma, double& epsilon) const { void NonbondedForce::getExceptionParameters(int index, int& particle1, int& particle2, double& chargeProd, double& sigma, double& epsilon) const {
ASSERT_VALID_INDEX(index, exceptions);
particle1 = exceptions[index].particle1; particle1 = exceptions[index].particle1;
particle2 = exceptions[index].particle2; particle2 = exceptions[index].particle2;
chargeProd = exceptions[index].chargeProd; chargeProd = exceptions[index].chargeProd;
...@@ -133,6 +137,7 @@ void NonbondedForce::getExceptionParameters(int index, int& particle1, int& part ...@@ -133,6 +137,7 @@ void NonbondedForce::getExceptionParameters(int index, int& particle1, int& part
} }
void NonbondedForce::setExceptionParameters(int index, int particle1, int particle2, double chargeProd, double sigma, double epsilon) { void NonbondedForce::setExceptionParameters(int index, int particle1, int particle2, double chargeProd, double sigma, double epsilon) {
ASSERT_VALID_INDEX(index, exceptions);
exceptions[index].particle1 = particle1; exceptions[index].particle1 = particle1;
exceptions[index].particle2 = particle2; exceptions[index].particle2 = particle2;
exceptions[index].chargeProd = chargeProd; exceptions[index].chargeProd = chargeProd;
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "openmm/Force.h" #include "openmm/Force.h"
#include "openmm/OpenMMException.h" #include "openmm/OpenMMException.h"
#include "openmm/PeriodicTorsionForce.h" #include "openmm/PeriodicTorsionForce.h"
#include "openmm/internal/AssertionUtilities.h"
#include "openmm/internal/PeriodicTorsionForceImpl.h" #include "openmm/internal/PeriodicTorsionForceImpl.h"
using namespace OpenMM; using namespace OpenMM;
...@@ -45,6 +46,7 @@ int PeriodicTorsionForce::addTorsion(int particle1, int particle2, int particle3 ...@@ -45,6 +46,7 @@ int PeriodicTorsionForce::addTorsion(int particle1, int particle2, int particle3
} }
void PeriodicTorsionForce::getTorsionParameters(int index, int& particle1, int& particle2, int& particle3, int& particle4, int& periodicity, double& phase, double& k) const { void PeriodicTorsionForce::getTorsionParameters(int index, int& particle1, int& particle2, int& particle3, int& particle4, int& periodicity, double& phase, double& k) const {
ASSERT_VALID_INDEX(index, periodicTorsions);
particle1 = periodicTorsions[index].particle1; particle1 = periodicTorsions[index].particle1;
particle2 = periodicTorsions[index].particle2; particle2 = periodicTorsions[index].particle2;
particle3 = periodicTorsions[index].particle3; particle3 = periodicTorsions[index].particle3;
...@@ -55,6 +57,7 @@ void PeriodicTorsionForce::getTorsionParameters(int index, int& particle1, int& ...@@ -55,6 +57,7 @@ void PeriodicTorsionForce::getTorsionParameters(int index, int& particle1, int&
} }
void PeriodicTorsionForce::setTorsionParameters(int index, int particle1, int particle2, int particle3, int particle4, int periodicity, double phase, double k) { void PeriodicTorsionForce::setTorsionParameters(int index, int particle1, int particle2, int particle3, int particle4, int periodicity, double phase, double k) {
ASSERT_VALID_INDEX(index, periodicTorsions);
periodicTorsions[index].particle1 = particle1; periodicTorsions[index].particle1 = particle1;
periodicTorsions[index].particle2 = particle2; periodicTorsions[index].particle2 = particle2;
periodicTorsions[index].particle3 = particle3; periodicTorsions[index].particle3 = particle3;
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "openmm/Force.h" #include "openmm/Force.h"
#include "openmm/OpenMMException.h" #include "openmm/OpenMMException.h"
#include "openmm/RBTorsionForce.h" #include "openmm/RBTorsionForce.h"
#include "openmm/internal/AssertionUtilities.h"
#include "openmm/internal/RBTorsionForceImpl.h" #include "openmm/internal/RBTorsionForceImpl.h"
using namespace OpenMM; using namespace OpenMM;
...@@ -45,6 +46,7 @@ int RBTorsionForce::addTorsion(int particle1, int particle2, int particle3, int ...@@ -45,6 +46,7 @@ int RBTorsionForce::addTorsion(int particle1, int particle2, int particle3, int
} }
void RBTorsionForce::getTorsionParameters(int index, int& particle1, int& particle2, int& particle3, int& particle4, double& c0, double& c1, double& c2, double& c3, double& c4, double& c5) const { void RBTorsionForce::getTorsionParameters(int index, int& particle1, int& particle2, int& particle3, int& particle4, double& c0, double& c1, double& c2, double& c3, double& c4, double& c5) const {
ASSERT_VALID_INDEX(index, rbTorsions);
particle1 = rbTorsions[index].particle1; particle1 = rbTorsions[index].particle1;
particle2 = rbTorsions[index].particle2; particle2 = rbTorsions[index].particle2;
particle3 = rbTorsions[index].particle3; particle3 = rbTorsions[index].particle3;
...@@ -58,6 +60,7 @@ void RBTorsionForce::getTorsionParameters(int index, int& particle1, int& partic ...@@ -58,6 +60,7 @@ void RBTorsionForce::getTorsionParameters(int index, int& particle1, int& partic
} }
void RBTorsionForce::setTorsionParameters(int index, int particle1, int particle2, int particle3, int particle4, double c0, double c1, double c2, double c3, double c4, double c5) { void RBTorsionForce::setTorsionParameters(int index, int particle1, int particle2, int particle3, int particle4, double c0, double c1, double c2, double c3, double c4, double c5) {
ASSERT_VALID_INDEX(index, rbTorsions);
rbTorsions[index].particle1 = particle1; rbTorsions[index].particle1 = particle1;
rbTorsions[index].particle2 = particle2; rbTorsions[index].particle2 = particle2;
rbTorsions[index].particle3 = particle3; rbTorsions[index].particle3 = particle3;
......
...@@ -32,6 +32,8 @@ ...@@ -32,6 +32,8 @@
#include "openmm/Force.h" #include "openmm/Force.h"
#include "openmm/OpenMMException.h" #include "openmm/OpenMMException.h"
#include "openmm/System.h" #include "openmm/System.h"
#include "openmm/VirtualSite.h"
#include "openmm/internal/AssertionUtilities.h"
using namespace OpenMM; using namespace OpenMM;
...@@ -48,6 +50,17 @@ System::~System() { ...@@ -48,6 +50,17 @@ System::~System() {
delete virtualSites[i]; delete virtualSites[i];
} }
double System::getParticleMass(int index) const {
ASSERT_VALID_INDEX(index, masses);
return masses[index];
}
void System::setParticleMass(int index, double mass) {
ASSERT_VALID_INDEX(index, masses);
masses[index] = mass;
}
void System::setVirtualSite(int index, VirtualSite* virtualSite) { void System::setVirtualSite(int index, VirtualSite* virtualSite) {
if (index >= virtualSites.size()) if (index >= virtualSites.size())
virtualSites.resize(getNumParticles(), NULL); virtualSites.resize(getNumParticles(), NULL);
...@@ -66,17 +79,29 @@ int System::addConstraint(int particle1, int particle2, double distance) { ...@@ -66,17 +79,29 @@ int System::addConstraint(int particle1, int particle2, double distance) {
} }
void System::getConstraintParameters(int index, int& particle1, int& particle2, double& distance) const { void System::getConstraintParameters(int index, int& particle1, int& particle2, double& distance) const {
ASSERT_VALID_INDEX(index, constraints);
particle1 = constraints[index].particle1; particle1 = constraints[index].particle1;
particle2 = constraints[index].particle2; particle2 = constraints[index].particle2;
distance = constraints[index].distance; distance = constraints[index].distance;
} }
void System::setConstraintParameters(int index, int particle1, int particle2, double distance) { void System::setConstraintParameters(int index, int particle1, int particle2, double distance) {
ASSERT_VALID_INDEX(index, constraints);
constraints[index].particle1 = particle1; constraints[index].particle1 = particle1;
constraints[index].particle2 = particle2; constraints[index].particle2 = particle2;
constraints[index].distance = distance; constraints[index].distance = distance;
} }
const Force& System::getForce(int index) const {
ASSERT_VALID_INDEX(index, forces);
return *forces[index];
}
Force& System::getForce(int index) {
ASSERT_VALID_INDEX(index, forces);
return *forces[index];
}
void System::getDefaultPeriodicBoxVectors(Vec3& a, Vec3& b, Vec3& c) const { void System::getDefaultPeriodicBoxVectors(Vec3& a, Vec3& b, Vec3& c) const {
a = periodicBoxVectors[0]; a = periodicBoxVectors[0];
b = periodicBoxVectors[1]; b = periodicBoxVectors[1];
......
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