00001 #ifndef OPENMM_GBVIFORCEFIELD_H_
00002 #define OPENMM_GBVIFORCEFIELD_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 <vector>
00037 #include "internal/windowsExport.h"
00038
00039 namespace OpenMM {
00040
00051 class OPENMM_EXPORT GBVIForce : public Force {
00052 public:
00056 enum NonbondedMethod {
00061 NoCutoff = 0,
00065 CutoffNonPeriodic = 1,
00070 CutoffPeriodic = 2,
00071 };
00072
00076 enum BornRadiusScalingMethod {
00080 NoScaling = 0,
00084 QuinticSpline = 1
00085 };
00086
00087
00088
00089
00090 GBVIForce();
00094 int getNumParticles() const {
00095 return particles.size();
00096 }
00106 int addParticle(double charge, double radius, double gamma);
00115 void getParticleParameters(int index, double& charge, double& radius, double& gamma) const;
00124 void setParticleParameters(int index, double charge, double radius, double gamma);
00133 int addBond(int particle1, int particle2, double distance);
00134
00143 void getBondParameters(int index, int& particle1, int& particle2, double& distance) const;
00152 void setBondParameters( int index, int particle1, int particle2, double bondLength);
00158 int getNumBonds( void ) const;
00159
00163 double getSolventDielectric() const {
00164 return solventDielectric;
00165 }
00169 void setSolventDielectric(double dielectric) {
00170 solventDielectric = dielectric;
00171 }
00175 double getSoluteDielectric() const {
00176 return soluteDielectric;
00177 }
00181 void setSoluteDielectric(double dielectric) {
00182 soluteDielectric = dielectric;
00183 }
00187 NonbondedMethod getNonbondedMethod() const;
00191 void setNonbondedMethod(NonbondedMethod method);
00198 double getCutoffDistance() const;
00205 void setCutoffDistance(double distance);
00209 BornRadiusScalingMethod getBornRadiusScalingMethod( void ) const;
00213 void setBornRadiusScalingMethod( BornRadiusScalingMethod method);
00217 double getQuinticLowerLimitFactor( void ) const;
00221 void setQuinticLowerLimitFactor(double quinticLowerLimitFactor );
00225 double getQuinticUpperBornRadiusLimit( void ) const;
00229 void setQuinticUpperBornRadiusLimit(double quinticUpperBornRadiusLimit);
00230 protected:
00231 ForceImpl* createImpl();
00232 private:
00233 class ParticleInfo;
00234 NonbondedMethod nonbondedMethod;
00235 double cutoffDistance, solventDielectric, soluteDielectric;
00236
00237 BornRadiusScalingMethod scalingMethod;
00238 double quinticLowerLimitFactor, quinticUpperBornRadiusLimit;
00239
00240 class BondInfo;
00241 std::vector<ParticleInfo> particles;
00242 std::vector<BondInfo> bonds;
00243 };
00244
00249 class GBVIForce::ParticleInfo {
00250 public:
00251 double charge, radius, gamma;
00252 ParticleInfo() {
00253 charge = radius = gamma = 0.0;
00254 }
00255 ParticleInfo(double charge, double radius, double gamma) :
00256 charge(charge), radius(radius), gamma(gamma) {
00257 }
00258 };
00259
00264 class GBVIForce::BondInfo {
00265 public:
00266 int particle1, particle2;
00267 double bondLength;
00268 BondInfo() {
00269 bondLength = 0.0;
00270 particle1 = -1;
00271 particle2 = -1;
00272 }
00273 BondInfo(int atomIndex1, int atomIndex2, double bondLength) :
00274 particle1(atomIndex1), particle2(atomIndex2), bondLength(bondLength) {
00275 }
00276 };
00277
00278 }
00279
00280 #endif