00001 #ifndef OPENMM_CUSTOMINTEGRATOR_H_
00002 #define OPENMM_CUSTOMINTEGRATOR_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 "Integrator.h"
00036 #include "Vec3.h"
00037 #include "openmm/Kernel.h"
00038 #include "internal/windowsExport.h"
00039 #include <string>
00040 #include <vector>
00041
00042 namespace OpenMM {
00043
00182 class OPENMM_EXPORT CustomIntegrator : public Integrator {
00183 public:
00187 enum ComputationType {
00191 ComputeGlobal = 0,
00195 ComputePerDof = 1,
00199 ComputeSum = 2,
00203 ConstrainPositions = 3,
00207 ConstrainVelocities = 4,
00211 UpdateContextState = 5
00212 };
00218 CustomIntegrator(double stepSize);
00222 int getNumGlobalVariables() const {
00223 return globalNames.size();
00224 }
00228 int getNumPerDofVariables() const {
00229 return perDofNames.size();
00230 }
00234 int getNumComputations() const {
00235 return computations.size();
00236 }
00244 int addGlobalVariable(const std::string& name, double initialValue);
00251 const std::string& getGlobalVariableName(int index) const;
00260 int addPerDofVariable(const std::string& name, double initialValue);
00267 const std::string& getPerDofVariableName(int index) const;
00274 double getGlobalVariable(int index) const;
00281 void setGlobalVariable(int index, double value);
00288 void setGlobalVariableByName(const std::string& name, double value);
00296 void getPerDofVariable(int index, std::vector<Vec3>& values) const;
00303 void setPerDofVariable(int index, const std::vector<Vec3>& values);
00310 void setPerDofVariableByName(const std::string& name, const std::vector<Vec3>& values);
00320 int addComputeGlobal(const std::string& variable, const std::string& expression);
00331 int addComputePerDof(const std::string& variable, const std::string& expression);
00343 int addComputeSum(const std::string& variable, const std::string& expression);
00350 int addConstrainPositions();
00357 int addConstrainVelocities();
00364 int addUpdateContextState();
00376 void getComputationStep(int index, ComputationType& type, std::string& variable, std::string& expression) const;
00380 int getRandomNumberSeed() const {
00381 return randomNumberSeed;
00382 }
00391 void setRandomNumberSeed(int seed) {
00392 randomNumberSeed = seed;
00393 }
00399 void step(int steps);
00400 protected:
00406 void initialize(ContextImpl& context);
00410 void stateChanged(State::DataType changed);
00414 std::vector<std::string> getKernelNames();
00415 private:
00416 class ComputationInfo;
00417 std::vector<std::string> globalNames;
00418 std::vector<std::string> perDofNames;
00419 mutable std::vector<double> globalValues;
00420 std::vector<std::vector<Vec3> > perDofValues;
00421 std::vector<ComputationInfo> computations;
00422 mutable bool globalsAreCurrent;
00423 int randomNumberSeed;
00424 bool forcesAreValid;
00425 ContextImpl* context;
00426 Context* owner;
00427 Kernel kernel;
00428 };
00429
00434 class CustomIntegrator::ComputationInfo {
00435 public:
00436 ComputationType type;
00437 std::string variable, expression;
00438 ComputationInfo() {
00439 }
00440 ComputationInfo(ComputationType type, const std::string& variable, const std::string& expression) :
00441 type(type), variable(variable), expression(expression) {
00442 }
00443 };
00444
00445 }
00446
00447 #endif