00001 #ifndef OPENMM_CUSTOMEXTERNALFORCE_H_
00002 #define OPENMM_CUSTOMEXTERNALFORCE_H_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include "Force.h"
00036 #include "Vec3.h"
00037 #include <vector>
00038 #include "internal/windowsExport.h"
00039
00040 namespace OpenMM {
00041
00074 class OPENMM_EXPORT CustomExternalForce : public Force {
00075 public:
00082 explicit CustomExternalForce(const std::string& energy);
00086 int getNumParticles() const {
00087 return particles.size();
00088 }
00092 int getNumPerParticleParameters() const {
00093 return parameters.size();
00094 }
00098 int getNumGlobalParameters() const {
00099 return globalParameters.size();
00100 }
00104 const std::string& getEnergyFunction() const;
00108 void setEnergyFunction(const std::string& energy);
00115 int addPerParticleParameter(const std::string& name);
00122 const std::string& getPerParticleParameterName(int index) const;
00129 void setPerParticleParameterName(int index, const std::string& name);
00137 int addGlobalParameter(const std::string& name, double defaultValue);
00144 const std::string& getGlobalParameterName(int index) const;
00151 void setGlobalParameterName(int index, const std::string& name);
00158 double getGlobalParameterDefaultValue(int index) const;
00165 void setGlobalParameterDefaultValue(int index, double defaultValue);
00173 int addParticle(int particle, const std::vector<double>& parameters);
00181 void getParticleParameters(int index, int& particle, std::vector<double>& parameters) const;
00189 void setParticleParameters(int index, int particle, const std::vector<double>& parameters);
00190 protected:
00191 ForceImpl* createImpl();
00192 private:
00193 class ParticleInfo;
00194 class ParticleParameterInfo;
00195 class GlobalParameterInfo;
00196 std::string energyExpression;
00197 std::vector<ParticleParameterInfo> parameters;
00198 std::vector<GlobalParameterInfo> globalParameters;
00199 std::vector<ParticleInfo> particles;
00200 };
00201
00206 class CustomExternalForce::ParticleInfo {
00207 public:
00208 int particle;
00209 std::vector<double> parameters;
00210 ParticleInfo() : particle(-1) {
00211 }
00212 ParticleInfo(int particle, const std::vector<double>& parameters) : particle(particle), parameters(parameters) {
00213 }
00214 };
00215
00220 class CustomExternalForce::ParticleParameterInfo {
00221 public:
00222 std::string name;
00223 ParticleParameterInfo() {
00224 }
00225 ParticleParameterInfo(const std::string& name) : name(name) {
00226 }
00227 };
00228
00233 class CustomExternalForce::GlobalParameterInfo {
00234 public:
00235 std::string name;
00236 double defaultValue;
00237 GlobalParameterInfo() {
00238 }
00239 GlobalParameterInfo(const std::string& name, double defaultValue) : name(name), defaultValue(defaultValue) {
00240 }
00241 };
00242
00243 }
00244
00245 #endif