ReferenceKernels.h 23.9 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#ifndef OPENMM_REFERENCEKERNELS_H_
#define OPENMM_REFERENCEKERNELS_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.               *
 *                                                                            *
 * Portions copyright (c) 2008 Stanford University and the Authors.           *
 * Authors: Peter Eastman                                                     *
 * Contributors:                                                              *
 *                                                                            *
 * 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.                                     *
 * -------------------------------------------------------------------------- */

35
#include "ReferencePlatform.h"
36
#include "openmm/kernels.h"
37
#include "SimTKUtilities/SimTKOpenMMRealType.h"
38
#include "SimTKReference/ReferenceNeighborList.h"
39
#include "lepton/ExpressionProgram.h"
40

41
class CpuObc;
Mark Friedrichs's avatar
Mark Friedrichs committed
42
class CpuGBVI;
43
class ReferenceAndersenThermostat;
44
class ReferenceBrownianDynamics;
45
class ReferenceStochasticDynamics;
46
class ReferenceConstraintAlgorithm;
47
class ReferenceVariableStochasticDynamics;
48
class ReferenceVariableVerletDynamics;
49
class ReferenceVerletDynamics;
50

51
52
namespace OpenMM {

53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/**
 * This kernel is invoked at the start of each force evaluation to clear the forces.
 */
class ReferenceInitializeForcesKernel : public InitializeForcesKernel {
public:
    ReferenceInitializeForcesKernel(std::string name, const Platform& platform) : InitializeForcesKernel(name, platform) {
    }
    /**
     * Initialize the kernel.
     * 
     * @param system     the System this kernel will be applied to
     */
    void initialize(const System& system);
    /**
     * Execute the kernel.
     * 
     * @param context    the context in which to execute this kernel
     */
71
    void execute(ContextImpl& context);
72
73
};

74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/**
 * This kernel is invoked to get or set the current time.
 */
class ReferenceUpdateTimeKernel : public UpdateTimeKernel {
public:
    ReferenceUpdateTimeKernel(std::string name, const Platform& platform, ReferencePlatform::PlatformData& data) : UpdateTimeKernel(name, platform), data(data) {
    }
    /**
     * Initialize the kernel.
     *
     * @param system     the System this kernel will be applied to
     */
    void initialize(const System& system);
    /**
     * Get the current time (in picoseconds).
     *
     * @param context    the context in which to execute this kernel
     */
92
    double getTime(const ContextImpl& context) const;
93
94
95
96
97
    /**
     * Set the current time (in picoseconds).
     *
     * @param context    the context in which to execute this kernel
     */
98
    void setTime(ContextImpl& context, double time);
99
100
101
102
private:
    ReferencePlatform::PlatformData& data;
};

103
/**
104
 * This kernel is invoked by HarmonicBondForce to calculate the forces acting on the system and the energy of the system.
105
 */
106
class ReferenceCalcHarmonicBondForceKernel : public CalcHarmonicBondForceKernel {
107
public:
108
    ReferenceCalcHarmonicBondForceKernel(std::string name, const Platform& platform) : CalcHarmonicBondForceKernel(name, platform) {
109
    }
110
    ~ReferenceCalcHarmonicBondForceKernel();
111
    /**
112
     * Initialize the kernel.
113
     * 
114
     * @param system     the System this kernel will be applied to
115
116
117
118
119
120
121
122
     * @param force      the HarmonicBondForce this kernel will be used for
     */
    void initialize(const System& system, const HarmonicBondForce& force);
    /**
     * Execute the kernel to calculate the forces.
     * 
     * @param context    the context in which to execute this kernel
     */
123
    void executeForces(ContextImpl& context);
124
125
126
127
128
129
    /**
     * Execute the kernel to calculate the energy.
     * 
     * @param context    the context in which to execute this kernel
     * @return the potential energy due to the HarmonicBondForce
     */
130
    double executeEnergy(ContextImpl& context);
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
private:
    int numBonds;
    int **bondIndexArray;
    RealOpenMM **bondParamArray;
};

/**
 * This kernel is invoked by HarmonicAngleForce to calculate the forces acting on the system and the energy of the system.
 */
class ReferenceCalcHarmonicAngleForceKernel : public CalcHarmonicAngleForceKernel {
public:
    ReferenceCalcHarmonicAngleForceKernel(std::string name, const Platform& platform) : CalcHarmonicAngleForceKernel(name, platform) {
    }
    ~ReferenceCalcHarmonicAngleForceKernel();
    /**
     * Initialize the kernel.
     * 
     * @param system     the System this kernel will be applied to
     * @param force      the HarmonicAngleForce this kernel will be used for
     */
    void initialize(const System& system, const HarmonicAngleForce& force);
    /**
     * Execute the kernel to calculate the forces.
     * 
     * @param context    the context in which to execute this kernel
     */
157
    void executeForces(ContextImpl& context);
158
159
160
161
162
163
    /**
     * Execute the kernel to calculate the energy.
     * 
     * @param context    the context in which to execute this kernel
     * @return the potential energy due to the HarmonicAngleForce
     */
164
    double executeEnergy(ContextImpl& context);
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
private:
    int numAngles;
    int **angleIndexArray;
    RealOpenMM **angleParamArray;
};

/**
 * This kernel is invoked by PeriodicTorsionForce to calculate the forces acting on the system and the energy of the system.
 */
class ReferenceCalcPeriodicTorsionForceKernel : public CalcPeriodicTorsionForceKernel {
public:
    ReferenceCalcPeriodicTorsionForceKernel(std::string name, const Platform& platform) : CalcPeriodicTorsionForceKernel(name, platform) {
    }
    ~ReferenceCalcPeriodicTorsionForceKernel();
    /**
     * Initialize the kernel.
     * 
     * @param system     the System this kernel will be applied to
     * @param force      the PeriodicTorsionForce this kernel will be used for
     */
    void initialize(const System& system, const PeriodicTorsionForce& force);
    /**
     * Execute the kernel to calculate the forces.
     * 
     * @param context    the context in which to execute this kernel
     */
191
    void executeForces(ContextImpl& context);
192
193
194
195
196
197
    /**
     * Execute the kernel to calculate the energy.
     * 
     * @param context    the context in which to execute this kernel
     * @return the potential energy due to the PeriodicTorsionForce
     */
198
    double executeEnergy(ContextImpl& context);
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
private:
    int numTorsions;
    int **torsionIndexArray;
    RealOpenMM **torsionParamArray;
};

/**
 * This kernel is invoked by RBTorsionForce to calculate the forces acting on the system and the energy of the system.
 */
class ReferenceCalcRBTorsionForceKernel : public CalcRBTorsionForceKernel {
public:
    ReferenceCalcRBTorsionForceKernel(std::string name, const Platform& platform) : CalcRBTorsionForceKernel(name, platform) {
    }
    ~ReferenceCalcRBTorsionForceKernel();
    /**
     * Initialize the kernel.
     * 
     * @param system     the System this kernel will be applied to
     * @param force      the RBTorsionForce this kernel will be used for
     */
    void initialize(const System& system, const RBTorsionForce& force);
    /**
     * Execute the kernel to calculate the forces.
     * 
     * @param context    the context in which to execute this kernel
     */
225
    void executeForces(ContextImpl& context);
226
227
228
229
230
231
    /**
     * Execute the kernel to calculate the energy.
     * 
     * @param context    the context in which to execute this kernel
     * @return the potential energy due to the RBTorsionForce
     */
232
    double executeEnergy(ContextImpl& context);
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
private:
    int numTorsions;
    int **torsionIndexArray;
    RealOpenMM **torsionParamArray;
};

/**
 * This kernel is invoked by NonbondedForce to calculate the forces acting on the system.
 */
class ReferenceCalcNonbondedForceKernel : public CalcNonbondedForceKernel {
public:
    ReferenceCalcNonbondedForceKernel(std::string name, const Platform& platform) : CalcNonbondedForceKernel(name, platform) {
    }
    ~ReferenceCalcNonbondedForceKernel();
    /**
     * Initialize the kernel.
     * 
     * @param system     the System this kernel will be applied to
     * @param force      the NonbondedForce this kernel will be used for
252
     */
253
    void initialize(const System& system, const NonbondedForce& force);
254
    /**
255
     * Execute the kernel to calculate the forces.
256
     * 
257
     * @param context    the context in which to execute this kernel
258
     */
259
    void executeForces(ContextImpl& context);
260
    /**
261
     * Execute the kernel to calculate the energy.
262
     * 
263
     * @param context    the context in which to execute this kernel
264
     * @return the potential energy due to the NonbondedForce
265
     */
266
    double executeEnergy(ContextImpl& context);
267
private:
Peter Eastman's avatar
Peter Eastman committed
268
    int numParticles, num14;
269
    int **exclusionArray, **bonded14IndexArray;
Peter Eastman's avatar
Peter Eastman committed
270
    RealOpenMM **particleParamArray, **bonded14ParamArray;
271
    RealOpenMM nonbondedCutoff, periodicBoxSize[3], rfDielectric, ewaldAlpha;
272
    int kmax[3], gridSize[3];
273
274
275
    std::vector<std::set<int> > exclusions;
    NonbondedMethod nonbondedMethod;
    NeighborList* neighborList;
276
277
};

278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
/**
 * This kernel is invoked by CustomNonbondedForce to calculate the forces acting on the system.
 */
class ReferenceCalcCustomNonbondedForceKernel : public CalcCustomNonbondedForceKernel {
public:
    ReferenceCalcCustomNonbondedForceKernel(std::string name, const Platform& platform) : CalcCustomNonbondedForceKernel(name, platform) {
    }
    ~ReferenceCalcCustomNonbondedForceKernel();
    /**
     * Initialize the kernel.
     *
     * @param system     the System this kernel will be applied to
     * @param force      the CustomNonbondedForce this kernel will be used for
     */
    void initialize(const System& system, const CustomNonbondedForce& force);
    /**
     * Execute the kernel to calculate the forces.
     *
     * @param context    the context in which to execute this kernel
     */
    void executeForces(ContextImpl& context);
    /**
     * Execute the kernel to calculate the energy.
     *
     * @param context    the context in which to execute this kernel
     * @return the potential energy due to the CustomNonbondedForce
     */
    double executeEnergy(ContextImpl& context);
private:
307
308
309
    int numParticles, numExceptions;
    int **exclusionArray, **exceptionIndexArray;
    RealOpenMM **particleParamArray, **exceptionParamArray;
310
311
312
    RealOpenMM nonbondedCutoff, periodicBoxSize[3];
    std::vector<std::set<int> > exclusions;
    Lepton::ExpressionProgram energyExpression, forceExpression;
313
    std::vector<std::string> parameterNames, globalParameterNames;
314
315
316
    std::vector<Lepton::ExpressionProgram> combiningRules;
    NonbondedMethod nonbondedMethod;
    NeighborList* neighborList;
317
    class TabulatedFunction;
318
319
};

320
/**
321
 * This kernel is invoked by GBSAOBCForce to calculate the forces acting on the system.
322
 */
323
class ReferenceCalcGBSAOBCForceKernel : public CalcGBSAOBCForceKernel {
324
public:
325
    ReferenceCalcGBSAOBCForceKernel(std::string name, const Platform& platform) : CalcGBSAOBCForceKernel(name, platform) {
326
    }
327
    ~ReferenceCalcGBSAOBCForceKernel();
328
    /**
329
     * Initialize the kernel.
330
     * 
331
     * @param system     the System this kernel will be applied to
332
     * @param force      the GBSAOBCForce this kernel will be used for
333
     */
334
    void initialize(const System& system, const GBSAOBCForce& force);
335
    /**
336
     * Execute the kernel to calculate the forces.
337
     * 
338
     * @param context    the context in which to execute this kernel
339
     */
340
    void executeForces(ContextImpl& context);
341
    /**
342
     * Execute the kernel to calculate the energy.
343
     * 
344
     * @param context    the context in which to execute this kernel
345
     * @return the potential energy due to the GBSAOBCForce
346
     */
347
    double executeEnergy(ContextImpl& context);
348
349
350
private:
    CpuObc* obc;
    std::vector<RealOpenMM> charges;
351
352
};

Mark Friedrichs's avatar
Mark Friedrichs committed
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
/**
 * This kernel is invoked by GBVIForce to calculate the forces acting on the system.
 */
class ReferenceCalcGBVIForceKernel : public CalcGBVIForceKernel {
public:
    ReferenceCalcGBVIForceKernel(std::string name, const Platform& platform) : CalcGBVIForceKernel(name, platform) {
    }
    ~ReferenceCalcGBVIForceKernel();
    /**
     * Initialize the kernel.
     * 
     * @param system       the System this kernel will be applied to
     * @param force        the GBVIForce this kernel will be used for
     * @param scaled radii the scaled radii (Eq. 5 of Labute paper)
     */
    void initialize(const System& system, const GBVIForce& force, const std::vector<double> & scaledRadii);
    /**
     * Execute the kernel to calculate the forces.
     * 
     * @param context    the context in which to execute this kernel
     */
374
    void executeForces(ContextImpl& context);
Mark Friedrichs's avatar
Mark Friedrichs committed
375
376
377
378
379
380
    /**
     * Execute the kernel to calculate the energy.
     * 
     * @param context    the context in which to execute this kernel
     * @return the potential energy due to the GBVIForce
     */
381
    double executeEnergy(ContextImpl& context);
Mark Friedrichs's avatar
Mark Friedrichs committed
382
383
384
385
386
private:
    CpuGBVI * gbvi;
    std::vector<RealOpenMM> charges;
};

387
388
389
390
391
/**
 * This kernel is invoked by VerletIntegrator to take one time step.
 */
class ReferenceIntegrateVerletStepKernel : public IntegrateVerletStepKernel {
public:
392
393
    ReferenceIntegrateVerletStepKernel(std::string name, const Platform& platform, ReferencePlatform::PlatformData& data) : IntegrateVerletStepKernel(name, platform),
        data(data), dynamics(0), constraints(0), masses(0), constraintDistances(0), constraintIndices(0) {
394
    }
395
    ~ReferenceIntegrateVerletStepKernel();
396
    /**
397
     * Initialize the kernel.
398
     * 
399
400
     * @param system     the System this kernel will be applied to
     * @param integrator the VerletIntegrator this kernel will be used for
401
     */
402
    void initialize(const System& system, const VerletIntegrator& integrator);
403
404
405
    /**
     * Execute the kernel.
     * 
406
407
     * @param context    the context in which to execute this kernel
     * @param integrator the VerletIntegrator this kernel is being used for
408
     */
409
    void execute(ContextImpl& context, const VerletIntegrator& integrator);
410
private:
411
    ReferencePlatform::PlatformData& data;
412
    ReferenceVerletDynamics* dynamics;
413
    ReferenceConstraintAlgorithm* constraints;
414
    RealOpenMM* masses;
415
    RealOpenMM* constraintDistances;
416
417
418
    int** constraintIndices;
    int numConstraints;
    double prevStepSize;
419
420
421
422
423
424
425
};

/**
 * This kernel is invoked by LangevinIntegrator to take one time step.
 */
class ReferenceIntegrateLangevinStepKernel : public IntegrateLangevinStepKernel {
public:
426
427
    ReferenceIntegrateLangevinStepKernel(std::string name, const Platform& platform, ReferencePlatform::PlatformData& data) : IntegrateLangevinStepKernel(name, platform),
        data(data), dynamics(0), constraints(0), masses(0), constraintDistances(0), constraintIndices(0) {
428
    }
429
    ~ReferenceIntegrateLangevinStepKernel();
430
    /**
Peter Eastman's avatar
Peter Eastman committed
431
     * Initialize the kernel, setting up the particle masses.
432
     * 
433
434
     * @param system     the System this kernel will be applied to
     * @param integrator the LangevinIntegrator this kernel will be used for
435
     */
436
    void initialize(const System& system, const LangevinIntegrator& integrator);
437
438
439
    /**
     * Execute the kernel.
     * 
440
441
     * @param context    the context in which to execute this kernel
     * @param integrator the LangevinIntegrator this kernel is being used for
442
     */
443
    void execute(ContextImpl& context, const LangevinIntegrator& integrator);
444
private:
445
    ReferencePlatform::PlatformData& data;
446
    ReferenceStochasticDynamics* dynamics;
447
    ReferenceConstraintAlgorithm* constraints;
448
    RealOpenMM* masses;
449
    RealOpenMM* constraintDistances;
450
451
452
    int** constraintIndices;
    int numConstraints;
    double prevTemp, prevFriction, prevStepSize;
453
454
455
456
457
458
459
};

/**
 * This kernel is invoked by BrownianIntegrator to take one time step.
 */
class ReferenceIntegrateBrownianStepKernel : public IntegrateBrownianStepKernel {
public:
460
461
    ReferenceIntegrateBrownianStepKernel(std::string name, const Platform& platform, ReferencePlatform::PlatformData& data) : IntegrateBrownianStepKernel(name, platform),
        data(data), dynamics(0), constraints(0), masses(0), constraintDistances(0), constraintIndices(0) {
462
    }
463
    ~ReferenceIntegrateBrownianStepKernel();
464
    /**
465
     * Initialize the kernel.
466
     * 
467
468
     * @param system     the System this kernel will be applied to
     * @param integrator the BrownianIntegrator this kernel will be used for
469
     */
470
    void initialize(const System& system, const BrownianIntegrator& integrator);
471
472
473
    /**
     * Execute the kernel.
     * 
474
475
     * @param context    the context in which to execute this kernel
     * @param integrator the BrownianIntegrator this kernel is being used for
476
     */
477
    void execute(ContextImpl& context, const BrownianIntegrator& integrator);
478
private:
479
    ReferencePlatform::PlatformData& data;
480
    ReferenceBrownianDynamics* dynamics;
481
    ReferenceConstraintAlgorithm* constraints;
482
    RealOpenMM* masses;
483
    RealOpenMM* constraintDistances;
484
485
486
    int** constraintIndices;
    int numConstraints;
    double prevTemp, prevFriction, prevStepSize;
487
488
};

489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
/**
 * This kernel is invoked by VariableLangevinIntegrator to take one time step.
 */
class ReferenceIntegrateVariableLangevinStepKernel : public IntegrateVariableLangevinStepKernel {
public:
    ReferenceIntegrateVariableLangevinStepKernel(std::string name, const Platform& platform, ReferencePlatform::PlatformData& data) : IntegrateVariableLangevinStepKernel(name, platform),
        data(data), dynamics(0), constraints(0), masses(0), constraintDistances(0), constraintIndices(0) {
    }
    ~ReferenceIntegrateVariableLangevinStepKernel();
    /**
     * Initialize the kernel.
     *
     * @param system     the System this kernel will be applied to
     * @param integrator the LangevinIntegrator this kernel will be used for
     */
    void initialize(const System& system, const VariableLangevinIntegrator& integrator);
    /**
     * Execute the kernel.
     *
     * @param context    the context in which to execute this kernel
     * @param integrator the LangevinIntegrator this kernel is being used for
     * @param maxTime    the maximum time beyond which the simulation should not be advanced
     */
512
    void execute(ContextImpl& context, const VariableLangevinIntegrator& integrator, double maxTime);
513
514
515
516
517
518
519
520
521
522
523
private:
    ReferencePlatform::PlatformData& data;
    ReferenceVariableStochasticDynamics* dynamics;
    ReferenceConstraintAlgorithm* constraints;
    RealOpenMM* masses;
    RealOpenMM* constraintDistances;
    int** constraintIndices;
    int numConstraints;
    double prevTemp, prevFriction, prevErrorTol;
};

524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
/**
 * This kernel is invoked by VariableVerletIntegrator to take one time step.
 */
class ReferenceIntegrateVariableVerletStepKernel : public IntegrateVariableVerletStepKernel {
public:
    ReferenceIntegrateVariableVerletStepKernel(std::string name, const Platform& platform, ReferencePlatform::PlatformData& data) : IntegrateVariableVerletStepKernel(name, platform),
        data(data), dynamics(0), constraints(0), masses(0), constraintDistances(0), constraintIndices(0) {
    }
    ~ReferenceIntegrateVariableVerletStepKernel();
    /**
     * Initialize the kernel.
     *
     * @param system     the System this kernel will be applied to
     * @param integrator the VerletIntegrator this kernel will be used for
     */
    void initialize(const System& system, const VariableVerletIntegrator& integrator);
    /**
     * Execute the kernel.
     *
     * @param context    the context in which to execute this kernel
     * @param integrator the VerletIntegrator this kernel is being used for
545
     * @param maxTime    the maximum time beyond which the simulation should not be advanced
546
     */
547
    void execute(ContextImpl& context, const VariableVerletIntegrator& integrator, double maxTime);
548
549
550
551
552
553
554
555
private:
    ReferencePlatform::PlatformData& data;
    ReferenceVariableVerletDynamics* dynamics;
    ReferenceConstraintAlgorithm* constraints;
    RealOpenMM* masses;
    RealOpenMM* constraintDistances;
    int** constraintIndices;
    int numConstraints;
556
    double prevErrorTol;
557
558
};

559
/**
Peter Eastman's avatar
Peter Eastman committed
560
 * This kernel is invoked by AndersenThermostat at the start of each time step to adjust the particle velocities.
561
562
563
 */
class ReferenceApplyAndersenThermostatKernel : public ApplyAndersenThermostatKernel {
public:
564
    ReferenceApplyAndersenThermostatKernel(std::string name, const Platform& platform) : ApplyAndersenThermostatKernel(name, platform), thermostat(0) {
565
    }
566
    ~ReferenceApplyAndersenThermostatKernel();
567
    /**
568
     * Initialize the kernel.
569
     * 
570
571
     * @param system     the System this kernel will be applied to
     * @param thermostat the AndersenThermostat this kernel will be used for
572
     */
573
    void initialize(const System& system, const AndersenThermostat& thermostat);
574
575
576
    /**
     * Execute the kernel.
     * 
577
     * @param context    the context in which to execute this kernel
578
     */
579
    void execute(ContextImpl& context);
580
581
582
private:
    ReferenceAndersenThermostat* thermostat;
    RealOpenMM* masses;
583
584
585
586
587
588
589
};

/**
 * This kernel is invoked to calculate the kinetic energy of the system.
 */
class ReferenceCalcKineticEnergyKernel : public CalcKineticEnergyKernel {
public:
590
    ReferenceCalcKineticEnergyKernel(std::string name, const Platform& platform) : CalcKineticEnergyKernel(name, platform) {
591
592
    }
    /**
593
     * Initialize the kernel.
594
     * 
595
     * @param system     the System this kernel will be applied to
596
     */
597
    void initialize(const System& system);
598
599
600
    /**
     * Execute the kernel.
     * 
601
     * @param context    the context in which to execute this kernel
602
     */
603
    double execute(ContextImpl& context);
604
605
private:
    std::vector<double> masses;
606
607
};

608
609
610
611
612
/**
 * This kernel is invoked to remove center of mass motion from the system.
 */
class ReferenceRemoveCMMotionKernel : public RemoveCMMotionKernel {
public:
613
    ReferenceRemoveCMMotionKernel(std::string name, const Platform& platform, ReferencePlatform::PlatformData& data) : RemoveCMMotionKernel(name, platform), data(data) {
614
615
    }
    /**
Peter Eastman's avatar
Peter Eastman committed
616
     * Initialize the kernel, setting up the particle masses.
617
     * 
618
619
     * @param system     the System this kernel will be applied to
     * @param force      the CMMotionRemover this kernel will be used for
620
     */
621
    void initialize(const System& system, const CMMotionRemover& force);
622
623
624
    /**
     * Execute the kernel.
     * 
625
     * @param context    the context in which to execute this kernel
626
     */
627
    void execute(ContextImpl& context);
628
private:
629
    ReferencePlatform::PlatformData& data;
630
    std::vector<double> masses;
631
    int frequency;
632
633
};

634
635
636
} // namespace OpenMM

#endif /*OPENMM_REFERENCEKERNELS_H_*/