BrookStochasticDynamics.cpp 33 KB
Newer Older
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
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
35
36
/* -------------------------------------------------------------------------- *
 *                                   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: 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 <sstream>
#include "BrookStochasticDynamics.h"
#include "BrookPlatform.h"
#include "OpenMMException.h"
#include "BrookStreamImpl.h"
Mark Friedrichs's avatar
Mark Friedrichs committed
37
38
#include "kshakeh.h"
#include "kupdatesd.h"
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
39
40
41
42
43
44
45
46
47

// use random number generator

#include "SimTKOpenMMUtilities.h"

using namespace OpenMM;
using namespace std;

/** 
Mark Friedrichs's avatar
Mark Friedrichs committed
48
 *
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
49
50
51
52
 * Constructor
 * 
 */

Mark Friedrichs's avatar
Mark Friedrichs committed
53
BrookStochasticDynamics::BrookStochasticDynamics( ){
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
54
55
56

// ---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
57
   //static const std::string methodName      = "BrookStochasticDynamics::BrookStochasticDynamics";
Mark Friedrichs's avatar
Mark Friedrichs committed
58
59
60
61

   BrookOpenMMFloat zero                    = (BrookOpenMMFloat)  0.0;
   BrookOpenMMFloat one                     = (BrookOpenMMFloat)  1.0;
   BrookOpenMMFloat oneMinus                = (BrookOpenMMFloat) -1.0;
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
62
63
64

// ---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
65
66
67
68
   _numberOfAtoms             = -1;

   // mark stream dimension variables as unset

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
69
70
71
72
73
74
75
76
   _sdAtomStreamWidth         = -1;
   _sdAtomStreamHeight        = -1;
   _sdAtomStreamSize          = -1;

   for( int ii = 0; ii < LastStreamIndex; ii++ ){
      _sdStreams[ii]   = NULL;
   }

Mark Friedrichs's avatar
Mark Friedrichs committed
77
78
   for( int ii = 0; ii < MaxDerivedParameters; ii++ ){
      _derivedParameters[ii]   = oneMinus;
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
79
80
   }

Mark Friedrichs's avatar
Mark Friedrichs committed
81
82
83
   _temperature = oneMinus;
   _stepSize    = oneMinus;
   _tau         = oneMinus;
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
84

Mark Friedrichs's avatar
Mark Friedrichs committed
85
86
87
88
89
90
   // setup inverse sqrt masses

   _inverseSqrtMasses = NULL;

   // set randomNumber seed 

Mark Friedrichs's avatar
Mark Friedrichs committed
91
92
   _randomNumberSeed  = 1393;

Mark Friedrichs's avatar
Mark Friedrichs committed
93
94
   //_randomNumberSeed = randomNumberSeed ? randomNumberSeed : 1393;
   //SimTKOpenMMUtilities::setRandomNumberSeed( randomNumberSeed );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
}   
 
/** 
 * Destructor
 * 
 */

BrookStochasticDynamics::~BrookStochasticDynamics( ){

// ---------------------------------------------------------------------------------------

   //static const std::string methodName      = "BrookStochasticDynamics::~BrookStochasticDynamics";

// ---------------------------------------------------------------------------------------

   for( int ii = 0; ii < LastStreamIndex; ii++ ){
      delete _sdStreams[ii];
   }

Mark Friedrichs's avatar
Mark Friedrichs committed
114
   delete[] _inverseSqrtMasses;
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
115
116
117
118

}

/** 
Mark Friedrichs's avatar
Mark Friedrichs committed
119
 * Get tau
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
120
 * 
Mark Friedrichs's avatar
Mark Friedrichs committed
121
 * @return  tau
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
122
123
124
 *
 */

Mark Friedrichs's avatar
Mark Friedrichs committed
125
126
127
BrookOpenMMFloat BrookStochasticDynamics::getTau( void ) const {
   return _tau;
}
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
128

Mark Friedrichs's avatar
Mark Friedrichs committed
129
130
131
132
133
134
135
136
137
138
139
140
141
/** 
 * Get friction
 * 
 * @return  friction
 *
 */

BrookOpenMMFloat BrookStochasticDynamics::getFriction( void ) const {
   static const BrookOpenMMFloat zero = (BrookOpenMMFloat) 0.0; 
   static const BrookOpenMMFloat one  = (BrookOpenMMFloat) 1.0; 
   return ( (_tau == zero) ? zero : (one/_tau) );
}

Mark Friedrichs's avatar
Mark Friedrichs committed
142
143
144
145
146
147
/** 
 * Get temperature
 * 
 * @return  temperature
 *
 */
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
148

Mark Friedrichs's avatar
Mark Friedrichs committed
149
150
151
BrookOpenMMFloat BrookStochasticDynamics::getTemperature( void ) const {
   return _temperature;
}
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
152

Mark Friedrichs's avatar
Mark Friedrichs committed
153
154
155
156
157
158
/** 
 * Get stepSize
 * 
 * @return  stepSize
 *
 */
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
159

Mark Friedrichs's avatar
Mark Friedrichs committed
160
161
162
BrookOpenMMFloat BrookStochasticDynamics::getStepSize( void ) const {
   return _stepSize;
}
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
163

Mark Friedrichs's avatar
Mark Friedrichs committed
164
165
166
167
168
/** 
 * Set tau
 * 
 * @param tau   new tau value
 *
Mark Friedrichs's avatar
Mark Friedrichs committed
169
 * @return      DefaultReturnValue
Mark Friedrichs's avatar
Mark Friedrichs committed
170
171
 *
 */
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
172

Mark Friedrichs's avatar
Mark Friedrichs committed
173
174
int BrookStochasticDynamics::_setTau( BrookOpenMMFloat tau ){
   _tau = tau;
Mark Friedrichs's avatar
Mark Friedrichs committed
175
   return DefaultReturnValue;
Mark Friedrichs's avatar
Mark Friedrichs committed
176
}
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
177

Mark Friedrichs's avatar
Mark Friedrichs committed
178
179
180
181
182
/** 
 * Set friction = 1/tau
 * 
 * @param friction   new friction value
 *
Mark Friedrichs's avatar
Mark Friedrichs committed
183
 * @return      DefaultReturnValue
Mark Friedrichs's avatar
Mark Friedrichs committed
184
185
 *
 */
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
186

Mark Friedrichs's avatar
Mark Friedrichs committed
187
188
int BrookStochasticDynamics::_setFriction( BrookOpenMMFloat friction ){
   _tau   = (BrookOpenMMFloat) ( (friction != 0.0) ? 1.0/friction : 0.0);
Mark Friedrichs's avatar
Mark Friedrichs committed
189
   return DefaultReturnValue;
Mark Friedrichs's avatar
Mark Friedrichs committed
190
}
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
191

Mark Friedrichs's avatar
Mark Friedrichs committed
192
193
194
195
196
/** 
 * Set temperature
 * 
 * @parameter   temperature
 *
Mark Friedrichs's avatar
Mark Friedrichs committed
197
 * @return      DefaultReturnValue
Mark Friedrichs's avatar
Mark Friedrichs committed
198
199
 *
 */
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
200

Mark Friedrichs's avatar
Mark Friedrichs committed
201
202
int BrookStochasticDynamics::_setTemperature( BrookOpenMMFloat temperature ){
   _temperature = temperature;
Mark Friedrichs's avatar
Mark Friedrichs committed
203
   return DefaultReturnValue;
Mark Friedrichs's avatar
Mark Friedrichs committed
204
}
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
205

Mark Friedrichs's avatar
Mark Friedrichs committed
206
207
208
209
210
/** 
 * Set stepSize
 * 
 * @param   stepSize
 *
Mark Friedrichs's avatar
Mark Friedrichs committed
211
 * @return      DefaultReturnValue
Mark Friedrichs's avatar
Mark Friedrichs committed
212
213
 *
 */
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
214

Mark Friedrichs's avatar
Mark Friedrichs committed
215
216
int BrookStochasticDynamics::_setStepSize( BrookOpenMMFloat stepSize ){
   _stepSize = stepSize;
Mark Friedrichs's avatar
Mark Friedrichs committed
217
   return DefaultReturnValue;
Mark Friedrichs's avatar
Mark Friedrichs committed
218
}
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
219
220

/** 
Mark Friedrichs's avatar
Mark Friedrichs committed
221
 * Update derived parameters
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
222
 * 
Mark Friedrichs's avatar
Mark Friedrichs committed
223
 * @return  DefaultReturnValue
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
224
225
226
 *
 */

Mark Friedrichs's avatar
Mark Friedrichs committed
227
int BrookStochasticDynamics::_updateDerivedParameters( void ){
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
228
229
230

   // ---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
231
   // static const char* methodName = "\nBrookStochasticDynamics::_updateDerivedParameters";
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
232
233
234
235
236
237
238
239
240
241

   static const BrookOpenMMFloat zero       =  0.0;
   static const BrookOpenMMFloat one        =  1.0;
   static const BrookOpenMMFloat two        =  2.0;
   static const BrookOpenMMFloat three      =  3.0;
   static const BrookOpenMMFloat four       =  4.0;
   static const BrookOpenMMFloat half       =  0.5;

   // ---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
242
243
244
245
246
247
248
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
   BrookOpenMMFloat tau         = getTau();
   BrookOpenMMFloat temperature = getTemperature();
   BrookOpenMMFloat stepSize    = getStepSize();

   _derivedParameters[GDT]      = stepSize/tau;

   _derivedParameters[EPH]      = EXP(  half*_derivedParameters[GDT] );
   _derivedParameters[EMH]      = EXP( -half*_derivedParameters[GDT] );
   _derivedParameters[EM]       = EXP(      -_derivedParameters[GDT] );
   _derivedParameters[EP]       = EXP(       _derivedParameters[GDT] );

   if( _derivedParameters[GDT] >= (BrookOpenMMFloat) 0.1 ){

      BrookOpenMMFloat term1    = _derivedParameters[EPH] - one;
                 term1         *= term1;
      _derivedParameters[B]     = _derivedParameters[GDT]*(_derivedParameters[EP] - one) - four*term1;

      _derivedParameters[C]     = _derivedParameters[GDT] - three + four*_derivedParameters[EMH] - _derivedParameters[EM];
      _derivedParameters[D]     = two - _derivedParameters[EPH] - _derivedParameters[EMH];

    } else {

      BrookOpenMMFloat term1        = half*_derivedParameters[GDT];
      BrookOpenMMFloat term2        = term1*term1;
      BrookOpenMMFloat term4        = term2*term2;

      BrookOpenMMFloat third        = (BrookOpenMMFloat) ( 1.0/3.0 );
      BrookOpenMMFloat o7_9         = (BrookOpenMMFloat) ( 7.0/9.0 );
      BrookOpenMMFloat o1_12        = (BrookOpenMMFloat) ( 1.0/12.0 );
      BrookOpenMMFloat o17_90       = (BrookOpenMMFloat) ( 17.0/90.0 );
      BrookOpenMMFloat o7_30        = (BrookOpenMMFloat) ( 7.0/30.0 );
      BrookOpenMMFloat o31_1260     = (BrookOpenMMFloat) ( 31.0/1260.0 );
      BrookOpenMMFloat o_360        = (BrookOpenMMFloat) ( 1.0/360.0 );

      _derivedParameters[B]         = term4*( third  + term1*( third + term1*( o17_90 + term1*o7_9 )));
      _derivedParameters[C]         = term2*term1*( two*third + term1*( -half + term1*( o7_30 + term1*(-o1_12 + term1*o31_1260 ))));
      _derivedParameters[D]         = term2*( -one + term2*(-o1_12 - term2*o_360));
   }    

   BrookOpenMMFloat kT        = ((BrookOpenMMFloat) BOLTZ)*temperature;

   _derivedParameters[V]      = SQRT( kT*( one - _derivedParameters[EM]) );
   _derivedParameters[X]      = tau*SQRT( kT*_derivedParameters[C] );
   _derivedParameters[Yv]     = SQRT( kT*_derivedParameters[B]/_derivedParameters[C] );
   _derivedParameters[Yx]     = tau*SQRT( kT*_derivedParameters[B]/(one - _derivedParameters[EM]) );

   _derivedParameters[Sd1pc1] = tau*( one - _derivedParameters[EM] );
   _derivedParameters[Sd1pc2] = tau*( _derivedParameters[EPH] - _derivedParameters[EMH] );
   _derivedParameters[Sd1pc3] = _derivedParameters[D]/(tau*_derivedParameters[C] );
   _derivedParameters[Sd2pc1] = one/_derivedParameters[Sd1pc2];
   _derivedParameters[Sd2pc2] = tau*_derivedParameters[D]/( _derivedParameters[EM] - one );
       
Mark Friedrichs's avatar
Mark Friedrichs committed
294
   return DefaultReturnValue;
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
295
296
297
298

};

/** 
Mark Friedrichs's avatar
Mark Friedrichs committed
299
 * Update parameters -- only way parameters can be set
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
300
301
302
 * 
 * @param  temperature     temperature
 * @param  friction        friction
Mark Friedrichs's avatar
Mark Friedrichs committed
303
 * @param  step size       step size
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
304
305
306
307
308
309
310
311
312
313
314
315
316
 *
 * @return   solute dielectric
 *
 */

int BrookStochasticDynamics::updateParameters( double temperature, double friction, double stepSize ){

   // ---------------------------------------------------------------------------------------

   // static const char* methodName = "\nBrookStochasticDynamics::updateParameters";

   // ---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
317
318
319
   _setStepSize(    (BrookOpenMMFloat)  stepSize );
   _setFriction(    (BrookOpenMMFloat)  friction );
   _setTemperature( (BrookOpenMMFloat)  temperature );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
320

Mark Friedrichs's avatar
Mark Friedrichs committed
321
   _updateDerivedParameters( );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
322
323
   _updateSdStreams( );

Mark Friedrichs's avatar
Mark Friedrichs committed
324
   return DefaultReturnValue;
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
325
326
327

};

Mark Friedrichs's avatar
Mark Friedrichs committed
328
329
330
/** 
 * Update
 * 
Mark Friedrichs's avatar
Mark Friedrichs committed
331
332
333
334
335
 * @param  positions                   atom positions
 * @param  velocities                  atom velocities
 * @param  forces                      atom forces
 * @param  brookShakeAlgorithm         BrookShakeAlgorithm reference
 * @param  brookRandomNumberGenerator  BrookRandomNumberGenerator reference
Mark Friedrichs's avatar
Mark Friedrichs committed
336
337
338
339
 *
 * @return  DefaultReturnValue
 *
 */
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
340

Mark Friedrichs's avatar
Mark Friedrichs committed
341
342
int BrookStochasticDynamics::update( Stream& positions, Stream& velocities,
                                     const Stream& forces,
Mark Friedrichs's avatar
Mark Friedrichs committed
343
344
                                     BrookShakeAlgorithm& brookShakeAlgorithm,
                                     BrookRandomNumberGenerator& brookRandomNumberGenerator ){
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
345

Mark Friedrichs's avatar
Mark Friedrichs committed
346
   // ---------------------------------------------------------------------------------------
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
347

Mark Friedrichs's avatar
Mark Friedrichs committed
348
349
350
351
      // unused Shake parameter

      float omega                   = 1.0f;

Mark Friedrichs's avatar
Mark Friedrichs committed
352
353
354
355
   // static const char* methodName = "\nBrookStochasticDynamics::update";

   // ---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
356
      const BrookOpenMMFloat* derivedParameters           = getDerivedParameters();
Mark Friedrichs's avatar
Mark Friedrichs committed
357
358
359

      BrookStreamImpl& positionStream                     = dynamic_cast<BrookStreamImpl&>       (positions.getImpl());
      BrookStreamImpl& velocityStream                     = dynamic_cast<BrookStreamImpl&>       (velocities.getImpl());
Mark Friedrichs's avatar
Mark Friedrichs committed
360
361
      const BrookStreamImpl& forceStreamC                 = dynamic_cast<const BrookStreamImpl&> (forces.getImpl());
      BrookStreamImpl& forceStream                        = const_cast<BrookStreamImpl&> (forceStreamC);
Mark Friedrichs's avatar
Mark Friedrichs committed
362
363
364
365
366

      // first integration step

      kupdate_sd1_fix1(
            (float) getStochasticDynamicsAtomStreamWidth(),
Mark Friedrichs's avatar
Mark Friedrichs committed
367
368
            (float) brookRandomNumberGenerator.getRandomNumberStreamWidth(),
            (float) brookRandomNumberGenerator.getRvStreamOffset(),
Mark Friedrichs's avatar
Mark Friedrichs committed
369
370
371
372
373
            derivedParameters[EM],
            derivedParameters[Sd1pc1],
            derivedParameters[Sd1pc2],
            derivedParameters[Sd1pc3],
            getSDPC1Stream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
374
            brookRandomNumberGenerator.getRandomNumberStream( brookRandomNumberGenerator.getRvStreamIndex() )->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
375
376
377
378
379
380
381
382
383
384
            getSD2XStream()->getBrookStream(),
            positionStream.getBrookStream(),
            forceStream.getBrookStream(),
            velocityStream.getBrookStream(),
            getInverseMassStream()->getBrookStream(),
            getSD1VStream()->getBrookStream(),
            getVPrimeStream()->getBrookStream(),
            getXPrimeStream()->getBrookStream() 
            );
 
Mark Friedrichs's avatar
Mark Friedrichs committed
385
386
387
      // advance random number cursor

      brookRandomNumberGenerator.advanceGVCursor( 2*getNumberOfAtoms() );
Mark Friedrichs's avatar
Mark Friedrichs committed
388
389
390
391
392
393

      // first Shake step

      kshakeh_fix1( 
                    10.0f,
                    (float) getStochasticDynamicsAtomStreamWidth(),
Mark Friedrichs's avatar
Mark Friedrichs committed
394
                    brookShakeAlgorithm.getInverseHydrogenMass(),
Mark Friedrichs's avatar
Mark Friedrichs committed
395
                    omega, 
Mark Friedrichs's avatar
Mark Friedrichs committed
396
                    brookShakeAlgorithm.getShakeAtomIndicesStream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
397
398
                    positionStream.getBrookStream(),
                    getXPrimeStream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
399
400
401
402
403
                    brookShakeAlgorithm.getShakeAtomParameterStream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons0Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons1Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons2Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons3Stream()->getBrookStream() );
Mark Friedrichs's avatar
Mark Friedrichs committed
404
405
406
407
408
409

      // first Shake gather

      kshakeh_update1_fix1(
                    (float) getStochasticDynamicsAtomStreamWidth(),
                    derivedParameters[Sd2pc1],
Mark Friedrichs's avatar
Mark Friedrichs committed
410
                    brookShakeAlgorithm.getShakeInverseMapStream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
411
412
413
                    positionStream.getBrookStream(),
                    getXPrimeStream()->getBrookStream(),
                    getVPrimeStream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
414
415
416
417
                    brookShakeAlgorithm.getShakeXCons0Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons1Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons2Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons3Stream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
418
419
420
421
422
423
                    getXPrimeStream()->getBrookStream() );

      // second integration step

      kupdate_sd2_fix1(
            (float) getStochasticDynamicsAtomStreamWidth(),
Mark Friedrichs's avatar
Mark Friedrichs committed
424
425
            (float) brookRandomNumberGenerator.getRandomNumberStreamWidth(),
            (float) brookRandomNumberGenerator.getRvStreamOffset(),
Mark Friedrichs's avatar
Mark Friedrichs committed
426
427
428
            derivedParameters[Sd2pc1],
            derivedParameters[Sd2pc2],
            getSDPC2Stream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
429
            brookRandomNumberGenerator.getRandomNumberStream( brookRandomNumberGenerator.getRvStreamIndex() )->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
430
431
432
433
            getSD1VStream()->getBrookStream(),
            positionStream.getBrookStream(),
            getXPrimeStream()->getBrookStream(), 
            getVPrimeStream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
434
            getSD2XStream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
435
436
437
438
            velocityStream.getBrookStream(),
            getXPrimeStream()->getBrookStream() 
            );

Mark Friedrichs's avatar
Mark Friedrichs committed
439
440
441
      // advance random number cursor

      brookRandomNumberGenerator.advanceGVCursor( 2*getNumberOfAtoms() );
Mark Friedrichs's avatar
Mark Friedrichs committed
442
443
444
445
446
447

      // second Shake step

      kshakeh_fix1( 
                    10.0f,
                    (float) getStochasticDynamicsAtomStreamWidth(),
Mark Friedrichs's avatar
Mark Friedrichs committed
448
                    brookShakeAlgorithm.getInverseHydrogenMass(),
Mark Friedrichs's avatar
Mark Friedrichs committed
449
                    omega, 
Mark Friedrichs's avatar
Mark Friedrichs committed
450
                    brookShakeAlgorithm.getShakeAtomIndicesStream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
451
452
                    positionStream.getBrookStream(),
                    getXPrimeStream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
453
454
455
456
457
                    brookShakeAlgorithm.getShakeAtomParameterStream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons0Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons1Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons2Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons3Stream()->getBrookStream() );
Mark Friedrichs's avatar
Mark Friedrichs committed
458
459
460
461
462
463

      // second Shake gather

      kshakeh_update1_fix1(
                    (float) getStochasticDynamicsAtomStreamWidth(),
                    derivedParameters[Sd2pc1],
Mark Friedrichs's avatar
Mark Friedrichs committed
464
                    brookShakeAlgorithm.getShakeInverseMapStream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
465
466
467
                    positionStream.getBrookStream(),
                    getXPrimeStream()->getBrookStream(),
                    getVPrimeStream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
468
469
470
471
                    brookShakeAlgorithm.getShakeXCons0Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons1Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons2Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons3Stream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
472
473
474
475
                    getXPrimeStream()->getBrookStream() );

      kshakeh_update2_fix1( 
                    (float) getStochasticDynamicsAtomStreamWidth(),
Mark Friedrichs's avatar
Mark Friedrichs committed
476
                    brookShakeAlgorithm.getShakeInverseMapStream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
477
478
                    positionStream.getBrookStream(),
                    getXPrimeStream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
479
480
481
482
                    brookShakeAlgorithm.getShakeXCons0Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons1Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons2Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons3Stream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
483
                    positionStream.getBrookStream() );
Mark Friedrichs's avatar
Mark Friedrichs committed
484
485
486
487
488
489
490
491
492
493
494
495

   return DefaultReturnValue;

};

/**
 *
 * Get array of derived parameters indexed by 'DerivedParameters' enums
 *
 * @return array
 *
 */
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
496
   
Mark Friedrichs's avatar
Mark Friedrichs committed
497
const BrookOpenMMFloat* BrookStochasticDynamics::getDerivedParameters( void ) const {
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
498
499
500

   // ---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
501
   // static const char* methodName  = "\nBrookStochasticDynamics::getDerivedParameters";
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
502
503
504

   // ---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
505
   return _derivedParameters;
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
}

/** 
 * Get Atom stream size
 *
 * @return  Atom stream size
 *
 */

int BrookStochasticDynamics::getStochasticDynamicsAtomStreamSize( void ) const {
   return _sdAtomStreamSize;
}

/** 
 * Get atom stream width
 *
 * @return  atom stream width
 *
 */

int BrookStochasticDynamics::getStochasticDynamicsAtomStreamWidth( void ) const {
   return _sdAtomStreamWidth;
}

/** 
 * Get atom stream height
 *
 * @return atom stream height
 */

int BrookStochasticDynamics::getStochasticDynamicsAtomStreamHeight( void ) const {
   return _sdAtomStreamHeight;
}

/** 
 * Get SDPC1 stream 
 *
 * @return  SDPC1 stream
 *
 */

Mark Friedrichs's avatar
Mark Friedrichs committed
547
BrookFloatStreamInternal* BrookStochasticDynamics::getSDPC1Stream( void ) const {
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
548
549
550
551
552
553
554
555
556
557
   return _sdStreams[SDPC1Stream];
}

/** 
 * Get SDPC2 stream 
 *
 * @return  SDPC2 stream
 *
 */

Mark Friedrichs's avatar
Mark Friedrichs committed
558
BrookFloatStreamInternal* BrookStochasticDynamics::getSDPC2Stream( void ) const {
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
559
560
561
562
563
564
565
566
567
568
   return _sdStreams[SDPC2Stream];
}

/** 
 * Get SD2X stream 
 *
 * @return  SD2X stream
 *
 */

Mark Friedrichs's avatar
Mark Friedrichs committed
569
BrookFloatStreamInternal* BrookStochasticDynamics::getSD2XStream( void ) const {
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
570
571
572
573
574
575
576
577
578
579
   return _sdStreams[SD2XStream];
}

/** 
 * Get SD1V stream 
 *
 * @return  SD1V stream
 *
 */

Mark Friedrichs's avatar
Mark Friedrichs committed
580
BrookFloatStreamInternal* BrookStochasticDynamics::getSD1VStream( void ) const {
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
581
582
583
   return _sdStreams[SD1VStream];
}

Mark Friedrichs's avatar
Mark Friedrichs committed
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
/** 
 * Get VPrime stream 
 *
 * @return  Vprime stream
 *
 */

BrookFloatStreamInternal* BrookStochasticDynamics::getVPrimeStream( void ) const {
   return _sdStreams[VPrimeStream];
}

/** 
 * Get XPrime stream 
 *
 * @return  Xprime stream
 *
 */

BrookFloatStreamInternal* BrookStochasticDynamics::getXPrimeStream( void ) const {
   return _sdStreams[XPrimeStream];
}

/** 
 * Get InverseMass stream 
 *
 * @return  inverse mass stream
 *
 */

BrookFloatStreamInternal* BrookStochasticDynamics::getInverseMassStream( void ) const {
   return _sdStreams[InverseMassStream];
}

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
617
618
619
620
621
/** 
 * Initialize stream dimensions
 * 
 * @param numberOfAtoms             number of atoms
 * @param platform                  platform
Mark Friedrichs's avatar
Mark Friedrichs committed
622
 *      
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
623
624
625
626
 * @return ErrorReturnValue if error, else DefaultReturnValue
 *
 */

Mark Friedrichs's avatar
Mark Friedrichs committed
627
int BrookStochasticDynamics::_initializeStreamSizes( int numberOfAtoms, const Platform& platform ){
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
628
629
630

// ---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
631
   //static const std::string methodName      = "BrookStochasticDynamics::_initializeStreamSizes";
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
632
633
634
635
636
637
638
639
640
641

// ---------------------------------------------------------------------------------------

   _sdAtomStreamSize     = getAtomStreamSize( platform );
   _sdAtomStreamWidth    = getAtomStreamWidth( platform );
   _sdAtomStreamHeight   = getAtomStreamHeight( platform );

   return DefaultReturnValue;
}

Mark Friedrichs's avatar
Mark Friedrichs committed
642
643
644
645
646
647
648
649
650
651
/** 
 * Initialize stream dimensions
 * 
 * @param numberOfAtoms             number of atoms
 * @param platform                  platform
 *
 * @return ErrorReturnValue if error, else DefaultReturnValue
 *
 */

Mark Friedrichs's avatar
Mark Friedrichs committed
652
653
//std::string BrookStochasticDynamics::_getDerivedParametersString( BrookStochasticDynamics::DerivedParameters  derivedParametersIndex ) const {
std::string BrookStochasticDynamics::_getDerivedParametersString( int derivedParametersIndex ) const {
Mark Friedrichs's avatar
Mark Friedrichs committed
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740

// ---------------------------------------------------------------------------------------

   //static const std::string methodName      = "BrookStochasticDynamics::_getDerivedParametersString";

// ---------------------------------------------------------------------------------------

   std::string returnString;
 
   switch( derivedParametersIndex ){
 
      case GDT:
         returnString = "GDT";
         break;
 
      case EPH:
         returnString = "EPH";
         break;
 
      case EMH:
         returnString = "EMH";
         break;
 
      case EP:
         returnString = "EP";
         break;
 
      case EM:
         returnString = "EM";
         break;
 
      case B:
         returnString = "B";
         break;
 
      case C:
         returnString = "C";
         break;
 
      case D:
         returnString = "D";
         break;
 
      case V:
         returnString = "V";
         break;
 
      case X:
         returnString = "X";
         break;
 
      case Yv:
         returnString = "Yv";
         break;
 
      case Yx:
         returnString = "Yx";
         break;
 
      case Sd1pc1:
         returnString = "Sd1pc1";
         break;
 
      case Sd1pc2:
         returnString = "Sd1pc2";
         break;
 
      case Sd1pc3:
         returnString = "Sd1pc3";
         break;
 
      case Sd2pc1:
         returnString = "Sd2pc1";
         break;
 
      case Sd2pc2:
         returnString = "Sd2pc2";
         break;
 
      default:
         returnString = "Unknown";
         break;
    }
 
    return returnString;
}

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
741
742
743
744
745
746
747
748
749
/** 
 * Initialize streams
 * 
 * @param platform                  platform
 *
 * @return ErrorReturnValue if error, else DefaultReturnValue
 *
 */

Mark Friedrichs's avatar
Mark Friedrichs committed
750
int BrookStochasticDynamics::_initializeStreams( const Platform& platform ){
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
751
752
753

// ---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
754
   //static const std::string methodName      = "BrookStochasticDynamics::_initializeStreams";
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
755

Mark Friedrichs's avatar
Mark Friedrichs committed
756
757
   BrookOpenMMFloat dangleValue            = (BrookOpenMMFloat) 0.0;

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
758
759
// ---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
760
761
   int sdAtomStreamSize             = getStochasticDynamicsAtomStreamSize();
   int sdAtomStreamWidth            = getStochasticDynamicsAtomStreamWidth();
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
762

Mark Friedrichs's avatar
Mark Friedrichs committed
763
764
765
    _sdStreams[SDPC1Stream]         = new BrookFloatStreamInternal( BrookCommon::SDPC1Stream,
                                                                    sdAtomStreamSize, sdAtomStreamWidth,
                                                                    BrookStreamInternal::Float2, dangleValue );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
766

Mark Friedrichs's avatar
Mark Friedrichs committed
767
768
769
    _sdStreams[SDPC2Stream]         = new BrookFloatStreamInternal( BrookCommon::SDPC2Stream,
                                                                    sdAtomStreamSize, sdAtomStreamWidth,
                                                                    BrookStreamInternal::Float2, dangleValue );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
770

Mark Friedrichs's avatar
Mark Friedrichs committed
771
772
773
    _sdStreams[SD2XStream]          = new BrookFloatStreamInternal( BrookCommon::SD2XStream,
                                                                    sdAtomStreamSize, sdAtomStreamWidth,
                                                                    BrookStreamInternal::Float3, dangleValue );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
774

Mark Friedrichs's avatar
Mark Friedrichs committed
775
776
777
    _sdStreams[SD1VStream]          = new BrookFloatStreamInternal( BrookCommon::SD1VStream,
                                                                    sdAtomStreamSize, sdAtomStreamWidth,
                                                                    BrookStreamInternal::Float3, dangleValue );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
778

Mark Friedrichs's avatar
Mark Friedrichs committed
779
780
781
782
783
784
785
786
787
788
789
790
    _sdStreams[VPrimeStream]        = new BrookFloatStreamInternal( BrookCommon::VPrimeStream,
                                                                    sdAtomStreamSize, sdAtomStreamWidth,
                                                                    BrookStreamInternal::Float3, dangleValue );

    _sdStreams[XPrimeStream]        = new BrookFloatStreamInternal( BrookCommon::XPrimeStream,
                                                                    sdAtomStreamSize, sdAtomStreamWidth,
                                                                    BrookStreamInternal::Float3, dangleValue );

    _sdStreams[InverseMassStream]   = new BrookFloatStreamInternal( BrookCommon::InverseMassStream,
                                                                    sdAtomStreamSize, sdAtomStreamWidth,
                                                                    BrookStreamInternal::Float, dangleValue );

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
791
792
793
794
795
796
797
798
799
800
801
802
803
804
   return DefaultReturnValue;
}

/** 
 * Update sd streams -- called after parameters change
 * 
 * @return ErrorReturnValue if error, else DefaultReturnValue
 *
 */

int BrookStochasticDynamics::_updateSdStreams( void ){

// ---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
805
   static const std::string methodName       = "BrookStochasticDynamics::_updateSdStreams";
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
806
807
808

// ---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
809
   int sdAtomStreamSize                      = getStochasticDynamicsAtomStreamSize();
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
810

Mark Friedrichs's avatar
Mark Friedrichs committed
811
   BrookOpenMMFloat* sdpc[2];
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
812
813
814
815
816
   for( int ii = 0; ii < 2; ii++ ){
      sdpc[ii] = new BrookOpenMMFloat[2*sdAtomStreamSize];
      memset( sdpc[ii], 0, 2*sdAtomStreamSize*sizeof( BrookOpenMMFloat ) ); 
   }

Mark Friedrichs's avatar
Mark Friedrichs committed
817
   const BrookOpenMMFloat* derivedParameters = getDerivedParameters( );
Mark Friedrichs's avatar
Mark Friedrichs committed
818
819
820
   int numberOfAtoms                         = getNumberOfAtoms();
   int index                                 = 0;
   for( int ii = 0; ii < numberOfAtoms; ii++, index += 2 ){
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
821

Mark Friedrichs's avatar
Mark Friedrichs committed
822
823
      sdpc[0][index]      = _inverseSqrtMasses[ii]*( static_cast<BrookOpenMMFloat> (derivedParameters[Yv]) );
      sdpc[0][index+1]    = _inverseSqrtMasses[ii]*( static_cast<BrookOpenMMFloat> (derivedParameters[V])  );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
824

Mark Friedrichs's avatar
Mark Friedrichs committed
825
826
      sdpc[1][index]      = _inverseSqrtMasses[ii]*( static_cast<BrookOpenMMFloat> (derivedParameters[Yx]) );
      sdpc[1][index+1]    = _inverseSqrtMasses[ii]*( static_cast<BrookOpenMMFloat> (derivedParameters[X])  );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
827
828
829
830
831
832
833
834
835
836
837
838

   }

   _sdStreams[SDPC1Stream]->loadFromArray( sdpc[0] );
   _sdStreams[SDPC2Stream]->loadFromArray( sdpc[1] );

   for( int ii = 0; ii < 2; ii++ ){
      delete[] sdpc[ii];
   }

   // initialize SD2X

Mark Friedrichs's avatar
Mark Friedrichs committed
839
840
   BrookOpenMMFloat* sd2x = new BrookOpenMMFloat[3*sdAtomStreamSize];
   //SimTKOpenMMUtilities::setRandomNumberSeed( (uint32_t) getRandomNumberSeed() );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
841
842
843

   memset( sd2x, 0, 3*sdAtomStreamSize*sizeof( BrookOpenMMFloat ) ); 

Mark Friedrichs's avatar
Mark Friedrichs committed
844
845
   index = 0;
   for( int ii = 0; ii < numberOfAtoms; ii++, index += 3 ){
Mark Friedrichs's avatar
Mark Friedrichs committed
846
847
848
      sd2x[index]        = _inverseSqrtMasses[ii]*derivedParameters[X]*( static_cast<BrookOpenMMFloat> (SimTKOpenMMUtilities::getNormallyDistributedRandomNumber()) );
      sd2x[index+1]      = _inverseSqrtMasses[ii]*derivedParameters[X]*( static_cast<BrookOpenMMFloat> (SimTKOpenMMUtilities::getNormallyDistributedRandomNumber()) );
      sd2x[index+2]      = _inverseSqrtMasses[ii]*derivedParameters[X]*( static_cast<BrookOpenMMFloat> (SimTKOpenMMUtilities::getNormallyDistributedRandomNumber()) );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
849
850
851
852
853
854
855
856
857
858
   }
   
   _sdStreams[SD2XStream]->loadFromArray( sd2x );

   delete[] sd2x;

   return DefaultReturnValue;

}

Mark Friedrichs's avatar
Mark Friedrichs committed
859
860
861
862
863
864
865
866
867
868
869
/** 
 * Set masses 
 * 
 * @param masses             atomic masses
 *
 */

int BrookStochasticDynamics::_setInverseSqrtMasses( const std::vector<double>& masses ){

// ---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
870
871
872
873
   //static const std::string methodName      = "BrookStochasticDynamics::_setInverseSqrtMasses";

   BrookOpenMMFloat zero                    = (BrookOpenMMFloat)  0.0;
   BrookOpenMMFloat one                     = (BrookOpenMMFloat)  1.0;
Mark Friedrichs's avatar
Mark Friedrichs committed
874
875
876
877
878
879
880

// ---------------------------------------------------------------------------------------

   // setup inverse sqrt masses

   _inverseSqrtMasses = new BrookOpenMMFloat[masses.size()];
   int index          = 0;
Mark Friedrichs's avatar
Mark Friedrichs committed
881
   for( std::vector<double>::const_iterator ii = masses.begin(); ii != masses.end(); ii++, index++ ){
Mark Friedrichs's avatar
Mark Friedrichs committed
882
      if( *ii != 0.0 ){
Mark Friedrichs's avatar
Mark Friedrichs committed
883
884
         BrookOpenMMFloat value    = static_cast<BrookOpenMMFloat>(*ii);
         _inverseSqrtMasses[index] = ( SQRT( one/value ) );
Mark Friedrichs's avatar
Mark Friedrichs committed
885
886
887
888
889
890
891
892
      } else {
         _inverseSqrtMasses[index] = zero;
      }
   }

   return DefaultReturnValue;
}   
 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
893
894
895
/*  
 * Setup of StochasticDynamics parameters
 *
Mark Friedrichs's avatar
Mark Friedrichs committed
896
 * @param masses                masses
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
897
898
899
900
901
902
 * @param platform              Brook platform
 *
 * @return nonzero value if error
 *
 * */
    
Mark Friedrichs's avatar
Mark Friedrichs committed
903
int BrookStochasticDynamics::setup( const std::vector<double>& masses, const Platform& platform ){
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
904
905
906
907
908
909
910
    
// ---------------------------------------------------------------------------------------

   static const std::string methodName      = "BrookStochasticDynamics::setup";

// ---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
911
   int numberOfAtoms  = (int) masses.size();
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
912
913
   setNumberOfAtoms( numberOfAtoms );

Mark Friedrichs's avatar
Mark Friedrichs committed
914
   // set stream sizes and then create streams
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
915

Mark Friedrichs's avatar
Mark Friedrichs committed
916
917
   _initializeStreamSizes( numberOfAtoms, platform );
   _initializeStreams( platform );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
918

Mark Friedrichs's avatar
Mark Friedrichs committed
919
   _setInverseSqrtMasses( masses );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966

   return DefaultReturnValue;
}

/* 
 * Get contents of object
 *
 * @param level   level of dump
 *
 * @return string containing contents
 *
 * */

std::string BrookStochasticDynamics::getContentsString( int level ) const {

// ---------------------------------------------------------------------------------------

   static const std::string methodName      = "BrookStochasticDynamics::getContentsString";

   static const unsigned int MAX_LINE_CHARS = 256;
   char value[MAX_LINE_CHARS];
   static const char* Set                   = "Set";
   static const char* NotSet                = "Not set";

// ---------------------------------------------------------------------------------------

   std::stringstream message;
   std::string tab   = "   ";

#ifdef WIN32
#define LOCAL_SPRINTF(a,b,c) sprintf_s( (a), MAX_LINE_CHARS, (b), (c) );   
#else
#define LOCAL_SPRINTF(a,b,c) sprintf( (a), (b), (c) );   
#endif

   (void) LOCAL_SPRINTF( value, "%d", getNumberOfAtoms() );
   message << _getLine( tab, "Number of atoms:", value ); 

   (void) LOCAL_SPRINTF( value, "%d", getAtomStreamWidth() );
   message << _getLine( tab, "Atom stream width:", value ); 

   (void) LOCAL_SPRINTF( value, "%d", getAtomStreamHeight() );
   message << _getLine( tab, "Atom stream height:", value ); 

   (void) LOCAL_SPRINTF( value, "%d", getAtomStreamSize() );
   message << _getLine( tab, "Atom stream size:", value ); 

Mark Friedrichs's avatar
Mark Friedrichs committed
967
968
969
970
971
   (void) LOCAL_SPRINTF( value, "%.5f", getTau() );
   message << _getLine( tab, "Tau:", value ); 

   (void) LOCAL_SPRINTF( value, "%.5f", getTemperature() );
   message << _getLine( tab, "Temperature:", value ); 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
972

Mark Friedrichs's avatar
Mark Friedrichs committed
973
974
   (void) LOCAL_SPRINTF( value, "%.5f", getStepSize() );
   message << _getLine( tab, "Step size:", value ); 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
975

Mark Friedrichs's avatar
Mark Friedrichs committed
976
977
978
979
980
981
982
983
   const BrookOpenMMFloat* derivedParameters = getDerivedParameters();
   for( int ii = 0; ii < MaxDerivedParameters; ii++ ){
      (void) LOCAL_SPRINTF( value, "%.5e", derivedParameters[ii] );
      message << _getLine( tab, _getDerivedParametersString( ii ), value ); 
   }

   (void) LOCAL_SPRINTF( value, "%.5f", getTemperature() );
   message << _getLine( tab, "Temperature:", value ); 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
984
985

   message << _getLine( tab, "Log:",                  (getLog()                ? Set : NotSet) ); 
Mark Friedrichs's avatar
Mark Friedrichs committed
986
987
988
989
990

   message << _getLine( tab, "SDPC1:",                (getSDPC1Stream()        ? Set : NotSet) ); 
   message << _getLine( tab, "SDPC2:",                (getSDPC2Stream()        ? Set : NotSet) ); 
   message << _getLine( tab, "SD2X:",                 (getSD2XStream()         ? Set : NotSet) ); 
   message << _getLine( tab, "SD1V:",                 (getSD1VStream()         ? Set : NotSet) ); 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
991
992
993
994
995
996
997
998
999
1000
1001
1002
 
   for( int ii = 0; ii < LastStreamIndex; ii++ ){
      message << std::endl;
      if( _sdStreams[ii] ){
         message << _sdStreams[ii]->getContentsString( );
      }
   }

#undef LOCAL_SPRINTF

   return message.str();
}