OpenCLIntegrationUtilities.h 6.72 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
35
36
37
38

namespace OpenMM {

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

42
class OPENMM_EXPORT_OPENCL OpenCLIntegrationUtilities {
43
44
45
46
47
public:
    OpenCLIntegrationUtilities(OpenCLContext& context, const System& system);
    /**
     * Get the array which contains position deltas.
     */
48
    OpenCLArray& getPosDelta() {
peastman's avatar
peastman committed
49
        return posDelta;
50
    }
51
    /**
52
53
     * 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.
54
     */
55
    OpenCLArray& getRandom() {
peastman's avatar
peastman committed
56
        return random;
57
    }
58
59
60
    /**
     * Get the array which contains the current step size.
     */
61
    OpenCLArray& getStepSize() {
peastman's avatar
peastman committed
62
        return stepSize;
63
    }
64
65
66
67
68
69
70
71
    /**
     * 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();
72
73
74
75
76
    /**
     * Apply constraints to the atom positions.
     *
     * @param tol             the constraint tolerance
     */
77
    void applyConstraints(double tol);
78
79
80
81
82
83
    /**
     * Apply constraints to the atom velocities.
     *
     * @param tol             the constraint tolerance
     */
    void applyVelocityConstraints(double tol);
84
85
86
87
88
89
90
91
92
93
94
    /**
     * 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);
95
96
97
98
99
100
101
102
    /**
     * 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
103
104
105
106
107
108
109
110
111
112
113
114
    /**
     * 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);
115
116
117
118
119
120
121
    /**
     * 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);
122
private:
123
    void applyConstraints(bool constrainVelocities, double tol);
124
    OpenCLContext& context;
125
126
    cl::Kernel settlePosKernel, settleVelKernel;
    cl::Kernel shakePosKernel, shakeVelKernel;
127
    cl::Kernel ccmaDirectionsKernel;
128
    cl::Kernel ccmaPosForceKernel, ccmaVelForceKernel;
129
    cl::Kernel ccmaMultiplyKernel;
130
    cl::Kernel ccmaPosUpdateKernel, ccmaVelUpdateKernel;
131
    cl::Kernel vsitePositionKernel, vsiteForceKernel, vsiteAddForcesKernel;
132
    cl::Kernel randomKernel, timeShiftKernel;
peastman's avatar
peastman committed
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
    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;
163
    int randomPos;
164
    int lastSeed, numVsites;
165
    bool hasInitializedPosConstraintKernels, hasInitializedVelConstraintKernels, ccmaUseDirectBuffer, hasOverlappingVsites;
166
    mm_double2 lastStepSize;
167
    struct ShakeCluster;
168
    struct ConstraintOrderer;
169
170
171
172
173
};

} // namespace OpenMM

#endif /*OPENMM_OPENCLINTEGRATIONUTILITIES_H_*/