"wrappers/python/simtk/vscode:/vscode.git/clone" did not exist on "c7a1ae89a7bf12ccdcb041291df2f55a7ff7cacf"
ReferenceKernels.h 26.4 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
#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.               *
 *                                                                            *
12
 * Portions copyright (c) 2008-2009 Stanford University and the Authors.      *
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 * 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
 * This kernel is invoked at the beginning and end of force and energy computations.  It gives the
 * Platform a chance to clear buffers and do other initialization at the beginning, and to do any
 * necessary work at the end to determine the final results.
57
 */
58
class ReferenceCalcForcesAndEnergyKernel : public CalcForcesAndEnergyKernel {
59
public:
60
    ReferenceCalcForcesAndEnergyKernel(std::string name, const Platform& platform) : CalcForcesAndEnergyKernel(name, platform) {
61
62
63
64
65
66
67
68
    }
    /**
     * Initialize the kernel.
     * 
     * @param system     the System this kernel will be applied to
     */
    void initialize(const System& system);
    /**
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
     * This is called at the beginning of each force computation, before calcForces() has been called on
     * any ForceImpl.
     *
     * @param context    the context in which to execute this kernel
     */
    void beginForceComputation(ContextImpl& context);
    /**
     * This is called at the end of each force computation, after calcForces() has been called on
     * every ForceImpl.
     *
     * @param context    the context in which to execute this kernel
     */
    void finishForceComputation(ContextImpl& context);
    /**
     * This is called at the beginning of each energy computation, before calcEnergy() has been called on
     * any ForceImpl.
     *
     * @param context    the context in which to execute this kernel
     */
    void beginEnergyComputation(ContextImpl& context);
    /**
     * This is called at the end of each energy computation, after calcEnergy() has been called on
     * every ForceImpl.
     *
93
     * @param context    the context in which to execute this kernel
94
95
96
     * @return the potential energy of the system.  This value is added to all values returned by ForceImpls'
     * calcEnergy() methods.  That is, each force kernel may <i>either</i> return its contribution to the
     * energy directly, <i>or</i> add it to an internal buffer so that it will be included here.
97
     */
98
    double finishEnergyComputation(ContextImpl& context);
99
100
};

101
/**
102
103
 * This kernel provides methods for setting and retrieving various state data: time, positions,
 * velocities, and forces.
104
 */
105
class ReferenceUpdateStateDataKernel : public UpdateStateDataKernel {
106
public:
107
    ReferenceUpdateStateDataKernel(std::string name, const Platform& platform, ReferencePlatform::PlatformData& data) : UpdateStateDataKernel(name, platform), data(data) {
108
109
110
111
112
113
114
115
116
117
118
119
    }
    /**
     * 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
     */
120
    double getTime(const ContextImpl& context) const;
121
122
123
124
125
    /**
     * Set the current time (in picoseconds).
     *
     * @param context    the context in which to execute this kernel
     */
126
    void setTime(ContextImpl& context, double time);
127
128
129
130
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
    /**
     * Get the positions of all particles.
     *
     * @param positions  on exit, this contains the particle positions
     */
    void getPositions(ContextImpl& context, std::vector<Vec3>& positions);
    /**
     * Set the positions of all particles.
     *
     * @param positions  a vector containg the particle positions
     */
    void setPositions(ContextImpl& context, const std::vector<Vec3>& positions);
    /**
     * Get the velocities of all particles.
     *
     * @param velocities  on exit, this contains the particle velocities
     */
    void getVelocities(ContextImpl& context, std::vector<Vec3>& velocities);
    /**
     * Set the velocities of all particles.
     *
     * @param velocities  a vector containg the particle velocities
     */
    void setVelocities(ContextImpl& context, const std::vector<Vec3>& velocities);
    /**
     * Get the current forces on all particles.
     *
     * @param forces  on exit, this contains the forces
     */
    void getForces(ContextImpl& context, std::vector<Vec3>& forces);
157
158
159
160
private:
    ReferencePlatform::PlatformData& data;
};

161
/**
162
 * This kernel is invoked by HarmonicBondForce to calculate the forces acting on the system and the energy of the system.
163
 */
164
class ReferenceCalcHarmonicBondForceKernel : public CalcHarmonicBondForceKernel {
165
public:
166
    ReferenceCalcHarmonicBondForceKernel(std::string name, const Platform& platform) : CalcHarmonicBondForceKernel(name, platform) {
167
    }
168
    ~ReferenceCalcHarmonicBondForceKernel();
169
    /**
170
     * Initialize the kernel.
171
     * 
172
     * @param system     the System this kernel will be applied to
173
174
175
176
177
178
179
180
     * @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
     */
181
    void executeForces(ContextImpl& context);
182
183
184
185
186
187
    /**
     * 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
     */
188
    double executeEnergy(ContextImpl& context);
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
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
     */
215
    void executeForces(ContextImpl& context);
216
217
218
219
220
221
    /**
     * 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
     */
222
    double executeEnergy(ContextImpl& context);
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
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
     */
249
    void executeForces(ContextImpl& context);
250
251
252
253
254
255
    /**
     * 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
     */
256
    double executeEnergy(ContextImpl& context);
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
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
     */
283
    void executeForces(ContextImpl& context);
284
285
286
287
288
289
    /**
     * 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
     */
290
    double executeEnergy(ContextImpl& context);
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
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
310
     */
311
    void initialize(const System& system, const NonbondedForce& force);
312
    /**
313
     * Execute the kernel to calculate the forces.
314
     * 
315
     * @param context    the context in which to execute this kernel
316
     */
317
    void executeForces(ContextImpl& context);
318
    /**
319
     * Execute the kernel to calculate the energy.
320
     * 
321
     * @param context    the context in which to execute this kernel
322
     * @return the potential energy due to the NonbondedForce
323
     */
324
    double executeEnergy(ContextImpl& context);
325
private:
Peter Eastman's avatar
Peter Eastman committed
326
    int numParticles, num14;
327
    int **exclusionArray, **bonded14IndexArray;
Peter Eastman's avatar
Peter Eastman committed
328
    RealOpenMM **particleParamArray, **bonded14ParamArray;
329
    RealOpenMM nonbondedCutoff, periodicBoxSize[3], rfDielectric, ewaldAlpha;
330
    int kmax[3], gridSize[3];
331
332
333
    std::vector<std::set<int> > exclusions;
    NonbondedMethod nonbondedMethod;
    NeighborList* neighborList;
334
335
};

336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
/**
 * 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:
365
366
367
    int numParticles, numExceptions;
    int **exclusionArray, **exceptionIndexArray;
    RealOpenMM **particleParamArray, **exceptionParamArray;
368
369
370
    RealOpenMM nonbondedCutoff, periodicBoxSize[3];
    std::vector<std::set<int> > exclusions;
    Lepton::ExpressionProgram energyExpression, forceExpression;
371
    std::vector<std::string> parameterNames, globalParameterNames;
372
373
374
    std::vector<Lepton::ExpressionProgram> combiningRules;
    NonbondedMethod nonbondedMethod;
    NeighborList* neighborList;
375
    class TabulatedFunction;
376
377
};

378
/**
379
 * This kernel is invoked by GBSAOBCForce to calculate the forces acting on the system.
380
 */
381
class ReferenceCalcGBSAOBCForceKernel : public CalcGBSAOBCForceKernel {
382
public:
383
    ReferenceCalcGBSAOBCForceKernel(std::string name, const Platform& platform) : CalcGBSAOBCForceKernel(name, platform) {
384
    }
385
    ~ReferenceCalcGBSAOBCForceKernel();
386
    /**
387
     * Initialize the kernel.
388
     * 
389
     * @param system     the System this kernel will be applied to
390
     * @param force      the GBSAOBCForce this kernel will be used for
391
     */
392
    void initialize(const System& system, const GBSAOBCForce& force);
393
    /**
394
     * Execute the kernel to calculate the forces.
395
     * 
396
     * @param context    the context in which to execute this kernel
397
     */
398
    void executeForces(ContextImpl& context);
399
    /**
400
     * Execute the kernel to calculate the energy.
401
     * 
402
     * @param context    the context in which to execute this kernel
403
     * @return the potential energy due to the GBSAOBCForce
404
     */
405
    double executeEnergy(ContextImpl& context);
406
407
408
private:
    CpuObc* obc;
    std::vector<RealOpenMM> charges;
409
410
};

Mark Friedrichs's avatar
Mark Friedrichs committed
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
/**
 * 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
     */
432
    void executeForces(ContextImpl& context);
Mark Friedrichs's avatar
Mark Friedrichs committed
433
434
435
436
437
438
    /**
     * 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
     */
439
    double executeEnergy(ContextImpl& context);
Mark Friedrichs's avatar
Mark Friedrichs committed
440
441
442
443
444
private:
    CpuGBVI * gbvi;
    std::vector<RealOpenMM> charges;
};

445
446
447
448
449
/**
 * This kernel is invoked by VerletIntegrator to take one time step.
 */
class ReferenceIntegrateVerletStepKernel : public IntegrateVerletStepKernel {
public:
450
451
    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) {
452
    }
453
    ~ReferenceIntegrateVerletStepKernel();
454
    /**
455
     * Initialize the kernel.
456
     * 
457
458
     * @param system     the System this kernel will be applied to
     * @param integrator the VerletIntegrator this kernel will be used for
459
     */
460
    void initialize(const System& system, const VerletIntegrator& integrator);
461
462
463
    /**
     * Execute the kernel.
     * 
464
465
     * @param context    the context in which to execute this kernel
     * @param integrator the VerletIntegrator this kernel is being used for
466
     */
467
    void execute(ContextImpl& context, const VerletIntegrator& integrator);
468
private:
469
    ReferencePlatform::PlatformData& data;
470
    ReferenceVerletDynamics* dynamics;
471
    ReferenceConstraintAlgorithm* constraints;
472
    RealOpenMM* masses;
473
    RealOpenMM* constraintDistances;
474
475
476
    int** constraintIndices;
    int numConstraints;
    double prevStepSize;
477
478
479
480
481
482
483
};

/**
 * This kernel is invoked by LangevinIntegrator to take one time step.
 */
class ReferenceIntegrateLangevinStepKernel : public IntegrateLangevinStepKernel {
public:
484
485
    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) {
486
    }
487
    ~ReferenceIntegrateLangevinStepKernel();
488
    /**
Peter Eastman's avatar
Peter Eastman committed
489
     * Initialize the kernel, setting up the particle masses.
490
     * 
491
492
     * @param system     the System this kernel will be applied to
     * @param integrator the LangevinIntegrator this kernel will be used for
493
     */
494
    void initialize(const System& system, const LangevinIntegrator& integrator);
495
496
497
    /**
     * Execute the kernel.
     * 
498
499
     * @param context    the context in which to execute this kernel
     * @param integrator the LangevinIntegrator this kernel is being used for
500
     */
501
    void execute(ContextImpl& context, const LangevinIntegrator& integrator);
502
private:
503
    ReferencePlatform::PlatformData& data;
504
    ReferenceStochasticDynamics* dynamics;
505
    ReferenceConstraintAlgorithm* constraints;
506
    RealOpenMM* masses;
507
    RealOpenMM* constraintDistances;
508
509
510
    int** constraintIndices;
    int numConstraints;
    double prevTemp, prevFriction, prevStepSize;
511
512
513
514
515
516
517
};

/**
 * This kernel is invoked by BrownianIntegrator to take one time step.
 */
class ReferenceIntegrateBrownianStepKernel : public IntegrateBrownianStepKernel {
public:
518
519
    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) {
520
    }
521
    ~ReferenceIntegrateBrownianStepKernel();
522
    /**
523
     * Initialize the kernel.
524
     * 
525
526
     * @param system     the System this kernel will be applied to
     * @param integrator the BrownianIntegrator this kernel will be used for
527
     */
528
    void initialize(const System& system, const BrownianIntegrator& integrator);
529
530
531
    /**
     * Execute the kernel.
     * 
532
533
     * @param context    the context in which to execute this kernel
     * @param integrator the BrownianIntegrator this kernel is being used for
534
     */
535
    void execute(ContextImpl& context, const BrownianIntegrator& integrator);
536
private:
537
    ReferencePlatform::PlatformData& data;
538
    ReferenceBrownianDynamics* dynamics;
539
    ReferenceConstraintAlgorithm* constraints;
540
    RealOpenMM* masses;
541
    RealOpenMM* constraintDistances;
542
543
544
    int** constraintIndices;
    int numConstraints;
    double prevTemp, prevFriction, prevStepSize;
545
546
};

547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
/**
 * 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
     */
570
    void execute(ContextImpl& context, const VariableLangevinIntegrator& integrator, double maxTime);
571
572
573
574
575
576
577
578
579
580
581
private:
    ReferencePlatform::PlatformData& data;
    ReferenceVariableStochasticDynamics* dynamics;
    ReferenceConstraintAlgorithm* constraints;
    RealOpenMM* masses;
    RealOpenMM* constraintDistances;
    int** constraintIndices;
    int numConstraints;
    double prevTemp, prevFriction, prevErrorTol;
};

582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
/**
 * 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
603
     * @param maxTime    the maximum time beyond which the simulation should not be advanced
604
     */
605
    void execute(ContextImpl& context, const VariableVerletIntegrator& integrator, double maxTime);
606
607
608
609
610
611
612
613
private:
    ReferencePlatform::PlatformData& data;
    ReferenceVariableVerletDynamics* dynamics;
    ReferenceConstraintAlgorithm* constraints;
    RealOpenMM* masses;
    RealOpenMM* constraintDistances;
    int** constraintIndices;
    int numConstraints;
614
    double prevErrorTol;
615
616
};

617
/**
Peter Eastman's avatar
Peter Eastman committed
618
 * This kernel is invoked by AndersenThermostat at the start of each time step to adjust the particle velocities.
619
620
621
 */
class ReferenceApplyAndersenThermostatKernel : public ApplyAndersenThermostatKernel {
public:
622
    ReferenceApplyAndersenThermostatKernel(std::string name, const Platform& platform) : ApplyAndersenThermostatKernel(name, platform), thermostat(0) {
623
    }
624
    ~ReferenceApplyAndersenThermostatKernel();
625
    /**
626
     * Initialize the kernel.
627
     * 
628
629
     * @param system     the System this kernel will be applied to
     * @param thermostat the AndersenThermostat this kernel will be used for
630
     */
631
    void initialize(const System& system, const AndersenThermostat& thermostat);
632
633
634
    /**
     * Execute the kernel.
     * 
635
     * @param context    the context in which to execute this kernel
636
     */
637
    void execute(ContextImpl& context);
638
639
640
private:
    ReferenceAndersenThermostat* thermostat;
    RealOpenMM* masses;
641
642
643
644
645
646
647
};

/**
 * This kernel is invoked to calculate the kinetic energy of the system.
 */
class ReferenceCalcKineticEnergyKernel : public CalcKineticEnergyKernel {
public:
648
    ReferenceCalcKineticEnergyKernel(std::string name, const Platform& platform) : CalcKineticEnergyKernel(name, platform) {
649
650
    }
    /**
651
     * Initialize the kernel.
652
     * 
653
     * @param system     the System this kernel will be applied to
654
     */
655
    void initialize(const System& system);
656
657
658
    /**
     * Execute the kernel.
     * 
659
     * @param context    the context in which to execute this kernel
660
     */
661
    double execute(ContextImpl& context);
662
663
private:
    std::vector<double> masses;
664
665
};

666
667
668
669
670
/**
 * This kernel is invoked to remove center of mass motion from the system.
 */
class ReferenceRemoveCMMotionKernel : public RemoveCMMotionKernel {
public:
671
    ReferenceRemoveCMMotionKernel(std::string name, const Platform& platform, ReferencePlatform::PlatformData& data) : RemoveCMMotionKernel(name, platform), data(data) {
672
673
    }
    /**
Peter Eastman's avatar
Peter Eastman committed
674
     * Initialize the kernel, setting up the particle masses.
675
     * 
676
677
     * @param system     the System this kernel will be applied to
     * @param force      the CMMotionRemover this kernel will be used for
678
     */
679
    void initialize(const System& system, const CMMotionRemover& force);
680
681
682
    /**
     * Execute the kernel.
     * 
683
     * @param context    the context in which to execute this kernel
684
     */
685
    void execute(ContextImpl& context);
686
private:
687
    ReferencePlatform::PlatformData& data;
688
    std::vector<double> masses;
689
    int frequency;
690
691
};

692
693
694
} // namespace OpenMM

#endif /*OPENMM_REFERENCEKERNELS_H_*/