00001 #ifndef OPENMM_CONTEXTIMPL_H_
00002 #define OPENMM_CONTEXTIMPL_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 "openmm/Kernel.h"
00036 #include "openmm/Platform.h"
00037 #include "openmm/Vec3.h"
00038 #include <map>
00039 #include <vector>
00040
00041 namespace OpenMM {
00042
00043 class ForceImpl;
00044 class Integrator;
00045 class Context;
00046 class System;
00047
00052 class OPENMM_EXPORT ContextImpl {
00053 public:
00057 ContextImpl(Context& owner, System& system, Integrator& integrator, Platform* platform, const std::map<std::string, std::string>& properties);
00058 ~ContextImpl();
00062 Context& getOwner() {
00063 return owner;
00064 }
00068 System& getSystem() {
00069 return system;
00070 }
00074 Integrator& getIntegrator() {
00075 return integrator;
00076 }
00080 Platform& getPlatform() {
00081 return *platform;
00082 }
00086 double getTime() const;
00090 void setTime(double t);
00096 void getPositions(std::vector<Vec3>& positions);
00102 void setPositions(const std::vector<Vec3>& positions);
00108 void getVelocities(std::vector<Vec3>& velocities);
00114 void setVelocities(const std::vector<Vec3>& velocities);
00120 void getForces(std::vector<Vec3>& forces);
00124 const std::map<std::string, double>& getParameters() const;
00131 double getParameter(std::string name);
00139 void setParameter(std::string name, double value);
00151 void getPeriodicBoxVectors(Vec3& a, Vec3& b, Vec3& c);
00163 void setPeriodicBoxVectors(const Vec3& a, const Vec3& b, const Vec3& c);
00170 void applyConstraints(double tol);
00177 void computeVirtualSites();
00188 double calcForcesAndEnergy(bool includeForces, bool includeEnergy, int groups=0xFFFFFFFF);
00192 int getLastForceGroups() const;
00196 double calcKineticEnergy();
00201 void updateContextState();
00205 const std::vector<ForceImpl*>& getForceImpls() const;
00209 void* getPlatformData();
00213 const void* getPlatformData() const;
00217 void setPlatformData(void* data);
00222 const std::vector<std::vector<int> >& getMolecules() const;
00223 private:
00224 friend class Context;
00225 static void tagParticlesInMolecule(int particle, int molecule, std::vector<int>& particleMolecule, std::vector<std::vector<int> >& particleBonds);
00226 Context& owner;
00227 System& system;
00228 Integrator& integrator;
00229 std::vector<ForceImpl*> forceImpls;
00230 std::map<std::string, double> parameters;
00231 mutable std::vector<std::vector<int> > molecules;
00232 bool hasInitializedForces;
00233 int lastForceGroups;
00234 Platform* platform;
00235 Kernel initializeForcesKernel, kineticEnergyKernel, updateStateDataKernel, applyConstraintsKernel, virtualSitesKernel;
00236 void* platformData;
00237 };
00238
00239 }
00240
00241 #endif