BrookBrownianDynamics.h 9.63 KB
Newer Older
1
2
#ifndef OPENMM_BROOK_BROWNIAN_DYNAMCIS_H_
#define OPENMM_BROOK_BROWNIAN_DYNAMCIS_H_
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
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
35
36
37
38

/* -------------------------------------------------------------------------- *
 *                                   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, Mark Friedrichs                                    *
 * 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.                                     *
 * -------------------------------------------------------------------------- */

#include <vector>
#include <set>

#include "BrookFloatStreamInternal.h"
Mark Friedrichs's avatar
Mark Friedrichs committed
39
#include "BrookShakeAlgorithm.h"
Mark Friedrichs's avatar
Mark Friedrichs committed
40
#include "BrookRandomNumberGenerator.h"
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
41
42
43
44
45
46
47
48
49
50
51
#include "BrookPlatform.h"
#include "BrookCommon.h"

namespace OpenMM {

/**
 *
 * Encapsulates stochastic dynamics algorithm 
 *
 */

52
class BrookBrownianDynamics : public BrookCommon {
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
53
54
55
56
57
58
59
60

   public:
  
      /** 
       * Constructor
       * 
       */
      
61
      BrookBrownianDynamics(  );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
62
63
64
65
66
67
  
      /** 
       * Destructor
       * 
       */
      
68
      ~BrookBrownianDynamics();
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
69
  
Mark Friedrichs's avatar
Mark Friedrichs committed
70
71
72
73
74
75
76
77
      /**
       * Get tau
       *
       * @return tau
       */

      BrookOpenMMFloat getTau( void ) const; 

Mark Friedrichs's avatar
Mark Friedrichs committed
78
79
80
81
82
83
84
85
      /**
       * Get friction
       *
       * @return friction
       */

      BrookOpenMMFloat getFriction( void ) const; 

Mark Friedrichs's avatar
Mark Friedrichs committed
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
      /**
       * Get temperature
       *
       * @return temperature
       */

      BrookOpenMMFloat getTemperature( void ) const; 

      /**
       * Get step size
       *
       * @return step size
       */

      BrookOpenMMFloat getStepSize( void ) const; 

Mark Friedrichs's avatar
Mark Friedrichs committed
102
      /**
103
       * Get noise amplitude
Mark Friedrichs's avatar
Mark Friedrichs committed
104
       *
105
106
107
108
109
110
111
       * @return noise amplitude
       */

      BrookOpenMMFloat getNoiseAmplitude( void ) const; 

      /**
       * Get force scale
Mark Friedrichs's avatar
Mark Friedrichs committed
112
       *
113
       * @return force scale
Mark Friedrichs's avatar
Mark Friedrichs committed
114
       */
115
116
117

      BrookOpenMMFloat getForceScale( void ) const; 

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
118
      /**
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
119
       * Get BrownianDynamics particle stream width
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
120
       *
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
121
       * @return particle stream width
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
122
123
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
124
      int getBrownianDynamicsParticleStreamWidth( void ) const; 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
125
126

      /**
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
127
       * Get BrownianDynamics particle stream height
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
128
       *
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
129
       * @return particle stream height
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
130
131
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
132
      int getBrownianDynamicsParticleStreamHeight( void ) const;
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
133
134

      /**
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
135
       * Get BrownianDynamics particle stream size
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
136
       * 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
137
       * @return particle stream size
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
138
139
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
140
      int getBrownianDynamicsParticleStreamSize( void ) const; 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
141
142
143
144
145
146

      /** 
       * Update parameters
       * 
       * @param  temperature     temperature
       * @param  friction        friction
Mark Friedrichs's avatar
Mark Friedrichs committed
147
       * @param  step size       step size
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
148
       *
Mark Friedrichs's avatar
Mark Friedrichs committed
149
       * @return   DefaultReturnValue
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
150
151
152
       *
       */
      
Mark Friedrichs's avatar
Mark Friedrichs committed
153
154
155
156
157
      int updateParameters( double temperature, double friction, double stepSize );
      
      /** 
       * Update
       * 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
158
159
160
       * @param  positions                   particle positions
       * @param  velocities                  particle velocities
       * @param  forces                      particle forces
Mark Friedrichs's avatar
Mark Friedrichs committed
161
162
       * @param  brookShakeAlgorithm         BrookShakeAlgorithm reference
       * @param  brookRandomNumberGenerator  BrookRandomNumberGenerator reference
Mark Friedrichs's avatar
Mark Friedrichs committed
163
164
165
166
       *
       * @return  DefaultReturnValue
       *
       */
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
167
      
Mark Friedrichs's avatar
Mark Friedrichs committed
168
      int update( Stream& positions, Stream& velocities,
Mark Friedrichs's avatar
Mark Friedrichs committed
169
170
                  const Stream& forces, BrookShakeAlgorithm& brookShakeAlgorithm,
                  BrookRandomNumberGenerator& brookRandomNumberGenerator );
171

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
172
      /** 
173
       * Get array of BrownianDynamics streams 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
174
175
176
177
178
179
180
181
       *
       * @return  array ofstreams
       *
       */
      
      BrookFloatStreamInternal** getStreams( void );
      
      /* 
182
       * Setup of BrownianDynamics parameters
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
183
       *
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
184
       * @param masses                particle masses
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
185
186
       * @param platform              Brook platform
       *
Mark Friedrichs's avatar
Mark Friedrichs committed
187
       * @return ErrorReturnValue value if error, else DefaultReturnValue
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
188
189
190
       *
       * */
      
Mark Friedrichs's avatar
Mark Friedrichs committed
191
      int setup( const std::vector<double>& masses, const Platform& platform  );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
192
193
194
195
196
197
198
199
200
201
202
203
      
      /* 
       * Get contents of object
       *
       * @param level of dump
       *
       * @return string containing contents
       *
       * */
      
      std::string getContentsString( int level = 0 ) const;

Mark Friedrichs's avatar
Mark Friedrichs committed
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
      /** 
       * Get X-prime stream 
       *
       * @return  X-prime stream
       *
       */
      
      BrookFloatStreamInternal* getXPrimeStream( void ) const;

      /** 
       * Get inverse sqrt masses 
       * 
       * @return   inverse sqrt masses stream
       *
       */
      
      BrookFloatStreamInternal* getInverseMassStream( void ) const;

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
222
223
224
225
   private:
   
      // streams indices

226
      enum BrookBrownianDynamicsStreams { 
Mark Friedrichs's avatar
Mark Friedrichs committed
227
228
229
              VPrimeStream,
              XPrimeStream,
              InverseMassStream,
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
230
231
232
              LastStreamIndex
           };

Mark Friedrichs's avatar
Mark Friedrichs committed
233
234
      // randomNumberSeed

Mark Friedrichs's avatar
Mark Friedrichs committed
235
      unsigned int _randomNumberSeed;
Mark Friedrichs's avatar
Mark Friedrichs committed
236
237
238
239

      BrookOpenMMFloat _tau;
      BrookOpenMMFloat _temperature;
      BrookOpenMMFloat _stepSize;
240
241
      BrookOpenMMFloat _forceScale;
      BrookOpenMMFloat _noiseAmplitude;
Mark Friedrichs's avatar
Mark Friedrichs committed
242

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
243
      // Particle stream dimensions
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
244

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
245
246
247
      int _bdParticleStreamWidth;
      int _bdParticleStreamHeight;
      int _bdParticleStreamSize;
Mark Friedrichs's avatar
Mark Friedrichs committed
248
249
250
251
252
253
254
255

      /*
       * Update streams
       * 
       * @return  DefaultReturn
       *
       */
      
256
      int _updateStreams( void );
Mark Friedrichs's avatar
Mark Friedrichs committed
257
258
      
      // inverse sqrt masses
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
259

Mark Friedrichs's avatar
Mark Friedrichs committed
260
      BrookOpenMMFloat* _inverseSqrtMasses;
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
261
262
263

      // internal streams

264
      BrookFloatStreamInternal* _streams[LastStreamIndex];
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
265

Mark Friedrichs's avatar
Mark Friedrichs committed
266
267
268
269
270
271
272
273
274
275
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
307
308
309
      /** 
       * Set tau
       * 
       * @param tau   new tau value
       *
       * @return      DefaultReturn
       *
       */
      
      int _setTau( BrookOpenMMFloat tau );
      
      /** 
       * Set friction = 1/tau
       * 
       * @param friction   new friction value
       *
       * @return      DefaultReturn
       *
       */
      
      int _setFriction( BrookOpenMMFloat friction );
      
      /** 
       * Set temperature
       * 
       * @parameter   temperature
       *
       * @return      DefaultReturn
       *
       */
      
      int _setTemperature( BrookOpenMMFloat temperature );
      
      /** 
       * Set stepSize
       * 
       * @param   stepSize
       *
       * @return      DefaultReturn
       *
       */
      
      int _setStepSize( BrookOpenMMFloat stepSize );
      
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
      /** 
       * Set force scale
       * 
       * @return DefaultReturn
       *
       */
      
      int _setForceScale( void );
      
      /** 
       * Set noise amplitude
       * 
       * @return DefaultReturn
       *
       */
      
      int _setNoiseAmplitude( void );
      
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
328
329
330
      /* 
       * Setup of stream dimensions
       *
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
331
332
       * @param particleStreamSize        particle stream size
       * @param particleStreamWidth       particle stream width
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
333
334
335
336
337
       *
       * @return ErrorReturnValue if error, else DefaultReturnValue
       *
       * */
      
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
338
      int _initializeStreamSizes( int particleStreamSize, int particleStreamWidth );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
339
340
341
342

      /** 
       * Initialize stream dimensions
       * 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
343
       * @param numberOfParticles             number of particles
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
344
345
346
347
348
349
       * @param platform                  platform
       *
       * @return ErrorReturnValue if error, else DefaultReturnValue
       *
       */
      
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
350
      int _initializeStreamSizes( int numberOfParticles, const Platform& platform );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
351
352
353
354
355
356
357
358
359
360
      
      /** 
       * Initialize stream dimensions and streams
       * 
       * @param platform                  platform
       *
       * @return nonzero value if error
       *
       */
      
Mark Friedrichs's avatar
Mark Friedrichs committed
361
362
363
364
365
      int _initializeStreams( const Platform& platform );

      /** 
       * Set masses 
       * 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
366
       * @param masses             particleic masses
Mark Friedrichs's avatar
Mark Friedrichs committed
367
368
369
370
371
       *
       */
      
      int _setInverseSqrtMasses( const std::vector<double>& masses );
      
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
372
373
374
375
};

} // namespace OpenMM

376
#endif /* OPENMM_BROOK_BROWNIAN_DYNAMCIS_H_ */