BrookShakeAlgorithm.h 11.5 KB
Newer Older
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
1
2
#ifndef OPENMM_BROOK_SHAKE_ALGORITHM_H_
#define OPENMM_BROOK_SHAKE_ALGORITHM_H_
Mark Friedrichs's avatar
Mark Friedrichs committed
3
4
5
6
7
8
9
10
11

/* -------------------------------------------------------------------------- *
 *                                   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
13
 * Portions copyright (c) 2009 Stanford University and the Authors.           *
 * Authors: Mark Friedrichs, Mike Houston                                     *
Mark Friedrichs's avatar
Mark Friedrichs committed
14
15
 * Contributors:                                                              *
 *                                                                            *
16
17
18
19
 * 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.                                        *
Mark Friedrichs's avatar
Mark Friedrichs committed
20
 *                                                                            *
21
22
23
24
 * 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.                        *
Mark Friedrichs's avatar
Mark Friedrichs committed
25
 *                                                                            *
26
27
 * 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/>.      *
Mark Friedrichs's avatar
Mark Friedrichs committed
28
29
30
31
 * -------------------------------------------------------------------------- */

#include <vector>
#include <set>
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
32
#include <sstream>
Mark Friedrichs's avatar
Mark Friedrichs committed
33
34
35
36

#include "BrookFloatStreamInternal.h"
#include "BrookPlatform.h"
#include "BrookCommon.h"
37
#include "openmm/OpenMMException.h"
Mark Friedrichs's avatar
Mark Friedrichs committed
38
39
40

namespace OpenMM {

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
struct ShakeCluster {

   int _centralID;
   int _peripheralID[3];
   int _size;
   float _distance;
   float _centralInvMass, _peripheralInvMass;

   ShakeCluster(){};
   ShakeCluster( int centralID, float invMass) : _centralID(centralID), _centralInvMass(invMass), _size(0) {
      _peripheralID[0] = _peripheralID[1] = _peripheralID[2] = -1;
   }; 

   void addAtom( int id, float dist, float invMass){
      if( _size == 3 ){
          std::stringstream message;
          message << "ShakeCluster::addAtom: " << "atom " << id << " has more than 3 constraints!." << std::endl; 
          throw OpenMMException( message.str() );
      }   
      if( _size > 0 && dist != _distance ){
          std::stringstream message;
          message << "ShakeCluster::addAtom: " << "atom " << id << " has different constraint distances: " <<  dist << " and " << _distance << std::endl; 
          throw OpenMMException( message.str() );
      }   
      if( _size > 0 && invMass != _peripheralInvMass ){
          std::stringstream message;
          message << "ShakeCluster::addAtom: " << " constrainted atoms associated w/ atom " << id << " have different masses: " <<  invMass << " and " << _peripheralInvMass << std::endl; 
          throw OpenMMException( message.str() );
      }   
      _peripheralID[_size++]  = id; 
      _distance              = dist;
      _peripheralInvMass     = invMass;
   }   
};

Mark Friedrichs's avatar
Mark Friedrichs committed
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/**
 *
 * Encapsulates stochastic dynamics algorithm 
 *
 */

class BrookShakeAlgorithm : public BrookCommon {

   public:
  
      /** 
       * Constructor
       * 
       */
      
      BrookShakeAlgorithm( );
  
      /** 
       * Destructor
       * 
       */
      
      ~BrookShakeAlgorithm();
  
      /** 
       * Get number of constraints
       * 
       * @return   number of constraints
       *
       */
      
      int getNumberOfConstraints( void ) const;
      
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
      /** 
       * Get max iterations
       * 
       * @return   max iterations
       *
       */
      
      int getMaxIterations( void ) const;
      
      /** 
       * Set  max iterations
       * 
       * @param   max iterations
       *
       * @return DefaultReturnValue
       *
       */
      
      int setMaxIterations( int maxIterations );
      
      /** 
       * Get SHAKE tolerance
       * 
       * @return  SHAKE tolerance  
       *
       */
      
      BrookOpenMMFloat getShakeTolerance( void ) const;
      
      /** 
       * Set SHAKE tolerance
       * 
       * @param  SHAKE tolerance  
       *
       * @return DefaultReturnValue
       *
       */
      
      int setShakeTolerance( BrookOpenMMFloat tolerance );
      
Mark Friedrichs's avatar
Mark Friedrichs committed
149
      /**
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
150
       * Get Shake particle stream width
Mark Friedrichs's avatar
Mark Friedrichs committed
151
       *
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
152
       * @return particle stream width
Mark Friedrichs's avatar
Mark Friedrichs committed
153
154
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
155
      int getShakeParticleStreamWidth( void ) const; 
Mark Friedrichs's avatar
Mark Friedrichs committed
156
157

      /**
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
158
       * Get Shake particle stream height
Mark Friedrichs's avatar
Mark Friedrichs committed
159
       *
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
160
       * @return particle stream height
Mark Friedrichs's avatar
Mark Friedrichs committed
161
162
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
163
      int getShakeParticleStreamHeight( void ) const;
Mark Friedrichs's avatar
Mark Friedrichs committed
164
165

      /**
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
166
       * Get Shake particle stream size
Mark Friedrichs's avatar
Mark Friedrichs committed
167
       * 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
168
       * @return particle stream size
Mark Friedrichs's avatar
Mark Friedrichs committed
169
170
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
171
      int getShakeParticleStreamSize( void ) const; 
Mark Friedrichs's avatar
Mark Friedrichs committed
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209

      /**
       * Get Shake constraint stream width
       *
       * @return constraint stream width
       */

      int getShakeConstraintStreamWidth( void ) const; 

      /**
       * Get Shake constraint stream height
       *
       * @return constraint stream height
       */

      int getShakeConstraintStreamHeight( void ) const;

      /**
       * Get Shake constraint stream size
       * 
       * @return constraint stream size
       */

      int getShakeConstraintStreamSize( void ) const; 

      /** 
       * Get array of Shake streams 
       *
       * @return  array ofstreams
       *
       */
      
      BrookFloatStreamInternal** getStreams( void );
      
      /*  
       * Setup of Shake parameters
       *
       * @param masses                masses
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
210
       * @param constraintIndices     constraint particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
       * @param constraintLengths     constraint lengths
       * @param platform              Brook platform
       *
       * @return ErrorReturnValue if error
       *
       */
              
      int setup( const std::vector<double>& masses, const std::vector< std::vector<int> >& constraintIndices,
                 const std::vector<double>& constraintLengths, const Platform& platform );
          
      /* 
       * Get contents of object
       *
       * @param level of dump
       *
       * @return string containing contents
       *
       * */
      
      std::string getContentsString( int level = 0 ) const;

      /** 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
233
       * Get Shake particle indices stream
Mark Friedrichs's avatar
Mark Friedrichs committed
234
       *
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
235
       * @return  Shake particle indices stream
Mark Friedrichs's avatar
Mark Friedrichs committed
236
237
238
       *
       */
      
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
239
      BrookFloatStreamInternal* getShakeParticleIndicesStream( void ) const;
Mark Friedrichs's avatar
Mark Friedrichs committed
240
241
      
      /** 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
242
       * Get  Shake particle parameter stream
Mark Friedrichs's avatar
Mark Friedrichs committed
243
       *
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
244
       * @return   Shake particle parameter stream
Mark Friedrichs's avatar
Mark Friedrichs committed
245
246
247
       *
       */
      
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
248
      BrookFloatStreamInternal* getShakeParticleParameterStream( void ) const;
Mark Friedrichs's avatar
Mark Friedrichs committed
249
250
251
252
253
254
255
256
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
283
284
285
286
287
288
289
290
291
292
293
294
      
      /** 
       * Get XCons0 stream
       *
       * @return  XCons0 stream
       *
       */
      
      BrookFloatStreamInternal* getShakeXCons0Stream( void ) const;
      
      /** 
       * Get XCons1 stream
       *
       * @return  XCons1 stream
       *
       */
      
      BrookFloatStreamInternal* getShakeXCons1Stream( void ) const;
      
      /** 
       * Get XCons2 stream
       *
       * @return  XCons2 stream
       *
       */
      
      BrookFloatStreamInternal* getShakeXCons2Stream( void ) const;
      
      /** 
       * Get XCons3 stream
       *
       * @return  XCons3 stream
       *
       */
      
      BrookFloatStreamInternal* getShakeXCons3Stream( void ) const;
      
      /** 
       * Get Shake inverse map stream
       *
       * @return  Shake inverse map stream
       *
       */
      
      BrookFloatStreamInternal* getShakeInverseMapStream( void ) const;

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
295
296
297
298
      /*  
       * Check constraints
       *
       * @param positions             atom positions
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
299
       * @param outputString          output message
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
300
301
302
303
304
305
       * @param tolerance             tolerance to compare (if < 0, then use algorithm tolerance
       *
       * @return number of errors
       *
       */
              
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
306
      int checkConstraints( BrookStreamInternal* positions, std::string& outputString, float tolerance ) const;
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
307
              
Mark Friedrichs's avatar
Mark Friedrichs committed
308
309
310
311
312
   private:
   
      // streams indices

      enum BrookShakeAlgorithmStreams { 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
313
314
              ShakeParticleIndicesStream,
              ShakeParticleParameterStream,
Mark Friedrichs's avatar
Mark Friedrichs committed
315
316
317
318
319
320
321
322
323
324
325
326
              ShakeXCons0Stream,
              ShakeXCons1Stream,
              ShakeXCons2Stream,
              ShakeXCons3Stream,
              ShakeInverseMapStream,
              LastStreamIndex
           };

      // number of constraints

      int _numberOfConstraints;

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
327
328
329
330
      // max iterations

      int _maxIterations;

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
331
      // particle stream dimensions
Mark Friedrichs's avatar
Mark Friedrichs committed
332

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
333
334
335
      int _shakeParticleStreamWidth;
      int _shakeParticleStreamHeight;
      int _shakeParticleStreamSize;
Mark Friedrichs's avatar
Mark Friedrichs committed
336
337
338
339
340
341
342

      // constraint stream dimensions

      int _shakeConstraintStreamSize;
      int _shakeConstraintStreamWidth;
      int _shakeConstraintStreamHeight;

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
343
344
345
346
      // SHAKE tolerance

      BrookOpenMMFloat _shakeTolerance;

Mark Friedrichs's avatar
Mark Friedrichs committed
347
348
349
350
351
352
353
354
      // inverse sqrt masses

      BrookOpenMMFloat* _inverseSqrtMasses;

      // internal streams

      BrookFloatStreamInternal* _shakeStreams[LastStreamIndex];

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
355
356
357
358
      // Shake cluster (used for debugging)

      std::map<int, ShakeCluster> _clusters;

Mark Friedrichs's avatar
Mark Friedrichs committed
359
360
361
      /* 
       * Setup of stream dimensions
       *
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
362
363
       * @param particleStreamSize        particle stream size
       * @param particleStreamWidth       particle stream width
Mark Friedrichs's avatar
Mark Friedrichs committed
364
365
366
367
368
       *
       * @return ErrorReturnValue if error, else DefaultReturnValueValue
       *
       * */
      
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
369
      int _initializeStreamSizes( int particleStreamSize, int particleStreamWidth );
Mark Friedrichs's avatar
Mark Friedrichs committed
370
371
372
373

      /** 
       * Initialize stream dimensions
       * 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
374
       * @param numberOfParticles         number of particles
Mark Friedrichs's avatar
Mark Friedrichs committed
375
376
377
378
379
380
381
       * @param numberOfConstraints       number of constraints
       * @param platform                  platform
       *
       * @return ErrorReturnValue if error, else DefaultReturnValueValue
       *
       */
      
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
382
      int _initializeStreamSizes( int numberOfParticles, int numberOfConstraints, const Platform& platform );
Mark Friedrichs's avatar
Mark Friedrichs committed
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
      
      /** 
       * Initialize stream dimensions and streams
       * 
       * @param platform                  platform
       *
       * @return nonzero value if error
       *
       */
      
      int _initializeStreams( const Platform& platform );

      /*  
       * Set Shake streams
       *
       * @param masses                masses
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
399
       * @param constraintIndices     constraint particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
400
       * @param constraintLengths     constraint lengths
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
401
       * @param platform              platform reference
Mark Friedrichs's avatar
Mark Friedrichs committed
402
403
404
405
406
407
408
409
       *
       * @return ErrorReturnValue if error
       *
       * @throw OpenMMException if constraintIndices.size() != constraintLengths.size()
       *
       */
           
      int _setShakeStreams( const std::vector<double>& masses, const std::vector< std::vector<int> >& constraintIndices,
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
410
                            const std::vector<double>& constraintLengths, const Platform& platform );
Mark Friedrichs's avatar
Mark Friedrichs committed
411
412
413
414
415
          
};

} // namespace OpenMM

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
416
#endif /* OPENMM_BROOK_SHAKE_ALGORITHM_H_ */