/* Portions copyright (c) 2011 Stanford University and Simbios. * Contributors: Peter Eastman * * 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. */ #ifndef __ReferenceCustomDynamics_H__ #define __ReferenceCustomDynamics_H__ #include "ReferenceDynamics.h" #include "openmm/CustomIntegrator.h" #include "openmm/internal/ContextImpl.h" #include "lepton/ExpressionProgram.h" #include #include #include // --------------------------------------------------------------------------------------- class ReferenceCustomDynamics : public ReferenceDynamics { private: const OpenMM::CustomIntegrator& integrator; std::vector inverseMasses; std::vector sumBuffer, oldPos; std::vector stepType; std::vector stepVariable, forceName, energyName; std::vector stepExpression; std::vector invalidatesForces, needsForces, needsEnergy; std::vector forceGroup; RealOpenMM energy; Lepton::ExpressionProgram kineticEnergyExpression; bool kineticEnergyNeedsForce; void computePerDof(int numberOfAtoms, std::vector& results, const std::vector& atomCoordinates, const std::vector& velocities, const std::vector& forces, const std::vector& masses, const std::map& globals, const std::vector >& perDof, const Lepton::ExpressionProgram& expression, const std::string& forceName); void recordChangedParameters(OpenMM::ContextImpl& context, std::map& globals); public: /**--------------------------------------------------------------------------------------- Constructor @param numberOfAtoms number of atoms @param integrator the integrator definition to use --------------------------------------------------------------------------------------- */ ReferenceCustomDynamics(int numberOfAtoms, const OpenMM::CustomIntegrator& integrator); /**--------------------------------------------------------------------------------------- Destructor --------------------------------------------------------------------------------------- */ ~ReferenceCustomDynamics(); /**--------------------------------------------------------------------------------------- Update @param context the context this integrator is updating @param numberOfAtoms number of atoms @param atomCoordinates atom coordinates @param velocities velocities @param forces forces @param masses atom masses @param globals a map containing values of global variables @param perDof the values of per-DOF variables @param forcesAreValid whether the current forces are valid or need to be recomputed --------------------------------------------------------------------------------------- */ void update(OpenMM::ContextImpl& context, int numberOfAtoms, std::vector& atomCoordinates, std::vector& velocities, std::vector& forces, std::vector& masses, std::map& globals, std::vector >& perDof, bool& forcesAreValid); /**--------------------------------------------------------------------------------------- Compute the kinetic energy of the system. @param context the context this integrator is updating @param numberOfAtoms number of atoms @param atomCoordinates atom coordinates @param velocities velocities @param forces forces @param masses atom masses @param globals a map containing values of global variables @param perDof the values of per-DOF variables @param forcesAreValid whether the current forces are valid or need to be recomputed --------------------------------------------------------------------------------------- */ double computeKineticEnergy(OpenMM::ContextImpl& context, int numberOfAtoms, std::vector& atomCoordinates, std::vector& velocities, std::vector& forces, std::vector& masses, std::map& globals, std::vector >& perDof, bool& forcesAreValid); }; // --------------------------------------------------------------------------------------- #endif // __ReferenceCustomDynamics_H__