OpenCLIntegrationUtilities.h 6.98 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
#ifndef OPENMM_OPENCLINTEGRATIONUTILITIES_H_
#define OPENMM_OPENCLINTEGRATIONUTILITIES_H_

/* -------------------------------------------------------------------------- *
 *                                   OpenMM                                   *
 * -------------------------------------------------------------------------- *
 * This is part of the OpenMM molecular simulation toolkit originating from   *
 * Simbios, the NIH National Center for Physics-Based Simulation of           *
 * Biological Structures at Stanford, funded under the NIH Roadmap for        *
 * Medical Research, grant U54 GM072970. See https://simtk.org.               *
 *                                                                            *
peastman's avatar
peastman committed
12
 * Portions copyright (c) 2009-2018 Stanford University and the Authors.      *
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 * Authors: Peter Eastman                                                     *
 * Contributors:                                                              *
 *                                                                            *
 * This program is free software: you can redistribute it and/or modify       *
 * it under the terms of the GNU Lesser General Public License as published   *
 * by the Free Software Foundation, either version 3 of the License, or       *
 * (at your option) any later version.                                        *
 *                                                                            *
 * This program is distributed in the hope that it will be useful,            *
 * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
 * GNU Lesser General Public License for more details.                        *
 *                                                                            *
 * You should have received a copy of the GNU Lesser General Public License   *
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.      *
 * -------------------------------------------------------------------------- */

Peter Eastman's avatar
Bug fix  
Peter Eastman committed
30
#include "openmm/System.h"
31
#include "OpenCLContext.h"
32
#include "windowsExportOpenCL.h"
Peter Eastman's avatar
Peter Eastman committed
33
#include <iosfwd>
34
#include <map>
35
36
37
38
39

namespace OpenMM {

/**
 * This class implements features that are used by many different integrators, including
40
 * common workspace arrays, random number generation, and enforcing constraints.
41
42
 */

43
class OPENMM_EXPORT_OPENCL OpenCLIntegrationUtilities {
44
45
46
47
48
public:
    OpenCLIntegrationUtilities(OpenCLContext& context, const System& system);
    /**
     * Get the array which contains position deltas.
     */
49
    OpenCLArray& getPosDelta() {
peastman's avatar
peastman committed
50
        return posDelta;
51
    }
52
    /**
53
54
     * Get the array which contains random values.  Each element is a float4, whose components
     * are independent, normally distributed random numbers with mean 0 and variance 1.
55
     */
56
    OpenCLArray& getRandom() {
peastman's avatar
peastman committed
57
        return random;
58
    }
59
60
61
    /**
     * Get the array which contains the current step size.
     */
62
    OpenCLArray& getStepSize() {
peastman's avatar
peastman committed
63
        return stepSize;
64
    }
65
66
67
68
69
70
71
72
    /**
     * Set the size to use for the next step.
     */
    void setNextStepSize(double size);
    /**
     * Get the size that was used for the last step.
     */
    double getLastStepSize();
73
74
75
76
77
    /**
     * Apply constraints to the atom positions.
     *
     * @param tol             the constraint tolerance
     */
78
    void applyConstraints(double tol);
79
80
81
82
83
84
    /**
     * Apply constraints to the atom velocities.
     *
     * @param tol             the constraint tolerance
     */
    void applyVelocityConstraints(double tol);
85
86
87
88
89
90
91
92
93
94
95
    /**
     * Initialize the random number generator.
     */
    void initRandomNumberGenerator(unsigned int randomNumberSeed);
    /**
     * Ensure that sufficient random numbers are available in the array, and generate new ones if not.
     *
     * @param numValues     the number of random float4's that will be required
     * @return the index in the array at which to start reading
     */
    int prepareRandomNumbers(int numValues);
96
97
98
99
100
101
102
103
    /**
     * Compute the positions of virtual sites.
     */
    void computeVirtualSites();
    /**
     * Distribute forces from virtual sites to the atoms they are based on.
     */
    void distributeForcesFromVirtualSites();
Peter Eastman's avatar
Peter Eastman committed
104
105
106
107
108
109
110
111
112
113
114
115
    /**
     * Create a checkpoint recording the current state of the random number generator.
     * 
     * @param stream    an output stream the checkpoint data should be written to
     */
    void createCheckpoint(std::ostream& stream);
    /**
     * Load a checkpoint that was written by createCheckpoint().
     * 
     * @param stream    an input stream the checkpoint data should be read from
     */
    void loadCheckpoint(std::istream& stream);
116
117
118
119
120
121
122
    /**
     * Compute the kinetic energy of the system, possibly shifting the velocities in time to account
     * for a leapfrog integrator.
     * 
     * @param timeShift   the amount by which to shift the velocities in time
     */
    double computeKineticEnergy(double timeShift);
123
124
125
126
127
128
    /**
     * Get the data structure that holds the state of all Nose-Hoover chains
     * 
     * @return  vector of chain states
     */
    std::map<int, OpenCLArray>& getNoseHooverChainState();
129
private:
130
    void applyConstraints(bool constrainVelocities, double tol);
131
    OpenCLContext& context;
132
133
    cl::Kernel settlePosKernel, settleVelKernel;
    cl::Kernel shakePosKernel, shakeVelKernel;
134
    cl::Kernel ccmaDirectionsKernel;
135
    cl::Kernel ccmaPosForceKernel, ccmaVelForceKernel;
136
    cl::Kernel ccmaMultiplyKernel;
137
    cl::Kernel ccmaPosUpdateKernel, ccmaVelUpdateKernel;
138
    cl::Kernel vsitePositionKernel, vsiteForceKernel, vsiteAddForcesKernel;
139
    cl::Kernel randomKernel, timeShiftKernel;
peastman's avatar
peastman committed
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
    OpenCLArray posDelta;
    OpenCLArray settleAtoms;
    OpenCLArray settleParams;
    OpenCLArray shakeAtoms;
    OpenCLArray shakeParams;
    OpenCLArray random;
    OpenCLArray randomSeed;
    OpenCLArray stepSize;
    OpenCLArray ccmaAtoms;
    OpenCLArray ccmaDistance;
    OpenCLArray ccmaReducedMass;
    OpenCLArray ccmaAtomConstraints;
    OpenCLArray ccmaNumAtomConstraints;
    OpenCLArray ccmaConstraintMatrixColumn;
    OpenCLArray ccmaConstraintMatrixValue;
    OpenCLArray ccmaDelta1;
    OpenCLArray ccmaDelta2;
    OpenCLArray ccmaConverged;
    OpenCLArray ccmaConvergedHostBuffer;
    OpenCLArray vsite2AvgAtoms;
    OpenCLArray vsite2AvgWeights;
    OpenCLArray vsite3AvgAtoms;
    OpenCLArray vsite3AvgWeights;
    OpenCLArray vsiteOutOfPlaneAtoms;
    OpenCLArray vsiteOutOfPlaneWeights;
    OpenCLArray vsiteLocalCoordsIndex;
    OpenCLArray vsiteLocalCoordsAtoms;
    OpenCLArray vsiteLocalCoordsWeights;
    OpenCLArray vsiteLocalCoordsPos;
    OpenCLArray vsiteLocalCoordsStartIndex;
170
    int randomPos;
171
    int lastSeed, numVsites;
172
    bool hasInitializedPosConstraintKernels, hasInitializedVelConstraintKernels, ccmaUseDirectBuffer, hasOverlappingVsites;
173
    mm_double2 lastStepSize;
174
    struct ShakeCluster;
175
    struct ConstraintOrderer;
176
    std::map<int, OpenCLArray> noseHooverChainState;
177
178
179
180
181
};

} // namespace OpenMM

#endif /*OPENMM_OPENCLINTEGRATIONUTILITIES_H_*/