BrookStochasticDynamics.cpp 35.7 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
#include "kcommon.h"
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
40
41
42
43
44
45
46
47
48

// use random number generator

#include "SimTKOpenMMUtilities.h"

using namespace OpenMM;
using namespace std;

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

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

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

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

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

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

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

   // mark stream dimension variables as unset

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

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

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

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

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

   _inverseSqrtMasses = NULL;

   // set randomNumber seed 

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

Mark Friedrichs's avatar
Mark Friedrichs committed
94
95
   //_randomNumberSeed = randomNumberSeed ? randomNumberSeed : 1393;
   //SimTKOpenMMUtilities::setRandomNumberSeed( randomNumberSeed );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
}   
 
/** 
 * 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
115
   delete[] _inverseSqrtMasses;
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
116
117
118
119

}

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

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

Mark Friedrichs's avatar
Mark Friedrichs committed
130
131
132
133
134
135
136
137
138
139
140
141
142
/** 
 * 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
143
144
145
146
147
148
/** 
 * Get temperature
 * 
 * @return  temperature
 *
 */
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
149

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

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

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

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

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

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

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

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

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

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

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

/** 
Mark Friedrichs's avatar
Mark Friedrichs committed
222
 * Update derived parameters
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
223
 * 
Mark Friedrichs's avatar
Mark Friedrichs committed
224
 * @return  DefaultReturnValue
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
225
 *
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
226
227
 * @throw   if tau too small
 *
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
228
229
 */

Mark Friedrichs's avatar
Mark Friedrichs committed
230
int BrookStochasticDynamics::_updateDerivedParameters( void ){
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
231
232
233

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

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

   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
Mods  
Mark Friedrichs committed
243
244
   float epsilon                            = 1.0e-08f;

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
245
246
   // ---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
247
248
249
250
   BrookOpenMMFloat tau         = getTau();
   BrookOpenMMFloat temperature = getTemperature();
   BrookOpenMMFloat stepSize    = getStepSize();

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
251
252
253
254
255
256
257
   if(  fabsf( float( tau ) ) < epsilon ){
      std::stringstream message;
      message << methodName << " tau=" << tau << " too small.";
      throw OpenMMException( message.str() );
   }   


Mark Friedrichs's avatar
Mark Friedrichs committed
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
295
296
297
298
299
300
301
302
303
304
305
   _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
306
   return DefaultReturnValue;
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
307

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
308
}
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
309
310

/** 
Mark Friedrichs's avatar
Mark Friedrichs committed
311
 * Update parameters -- only way parameters can be set
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
312
313
314
 * 
 * @param  temperature     temperature
 * @param  friction        friction
Mark Friedrichs's avatar
Mark Friedrichs committed
315
 * @param  step size       step size
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
316
317
318
319
320
321
322
323
324
 *
 * @return   solute dielectric
 *
 */

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

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

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
325
326
327
   static int showUpdate         = 1;
   static int maxShowUpdate      = 3;
   static const char* methodName = "\nBrookStochasticDynamics::updateParameters";
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
328
329
330

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

Mark Friedrichs's avatar
Mark Friedrichs committed
331
332
   _setStepSize(    (BrookOpenMMFloat)  stepSize );
   _setFriction(    (BrookOpenMMFloat)  friction );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
333
   //_setTau(    (BrookOpenMMFloat)  friction );
Mark Friedrichs's avatar
Mark Friedrichs committed
334
   _setTemperature( (BrookOpenMMFloat)  temperature );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
335

Mark Friedrichs's avatar
Mark Friedrichs committed
336
   _updateDerivedParameters( );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
337
338
   _updateSdStreams( );

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
339
340
341
342
343
344
345
346
347
   // show update

   if( showUpdate && getLog() && (showUpdate++ < maxShowUpdate) ){
      std::string contents = getContentsString( );
      (void) fprintf( getLog(), "%s contents %s", methodName, contents.c_str() );
      (void) fflush( getLog() );

   }

Mark Friedrichs's avatar
Mark Friedrichs committed
348
   return DefaultReturnValue;
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
349
350
351

};

Mark Friedrichs's avatar
Mark Friedrichs committed
352
353
354
/** 
 * Update
 * 
Mark Friedrichs's avatar
Mark Friedrichs committed
355
356
357
358
359
 * @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
360
361
362
363
 *
 * @return  DefaultReturnValue
 *
 */
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
364

Mark Friedrichs's avatar
Mark Friedrichs committed
365
366
int BrookStochasticDynamics::update( Stream& positions, Stream& velocities,
                                     const Stream& forces,
Mark Friedrichs's avatar
Mark Friedrichs committed
367
368
                                     BrookShakeAlgorithm& brookShakeAlgorithm,
                                     BrookRandomNumberGenerator& brookRandomNumberGenerator ){
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
369

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
370
// ---------------------------------------------------------------------------------------
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
371

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
372
   // unused Shake parameter
Mark Friedrichs's avatar
Mark Friedrichs committed
373

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
374
   float omega                   = 1.0f;
Mark Friedrichs's avatar
Mark Friedrichs committed
375

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
376
   static const char* methodName = "\nBrookStochasticDynamics::update";
Mark Friedrichs's avatar
Mark Friedrichs committed
377

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
378
379
380
   static const int PrintOn      = 0;

// ---------------------------------------------------------------------------------------
Mark Friedrichs's avatar
Mark Friedrichs committed
381

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
   const BrookOpenMMFloat* derivedParameters           = getDerivedParameters();

   BrookStreamImpl& positionStream                     = dynamic_cast<BrookStreamImpl&>       (positions.getImpl());
   BrookStreamImpl& velocityStream                     = dynamic_cast<BrookStreamImpl&>       (velocities.getImpl());
   const BrookStreamImpl& forceStreamC                 = dynamic_cast<const BrookStreamImpl&> (forces.getImpl());
   BrookStreamImpl& forceStream                        = const_cast<BrookStreamImpl&> (forceStreamC);

   if( PrintOn && getLog() ){
      (void) fprintf( getLog(), "%s shake=%d\n", methodName, brookShakeAlgorithm.getNumberOfConstraints() );
      (void) fflush( getLog() );

   }

   // first integration step

   kupdate_sd1_fix1(
         (float) getStochasticDynamicsAtomStreamWidth(),
         (float) brookRandomNumberGenerator.getRandomNumberStreamWidth(),
         (float) brookRandomNumberGenerator.getRvStreamOffset(),
         derivedParameters[EM],
         derivedParameters[Sd1pc1],
         derivedParameters[Sd1pc2],
         derivedParameters[Sd1pc3],
         getSDPC1Stream()->getBrookStream(),
         brookRandomNumberGenerator.getRandomNumberStream( brookRandomNumberGenerator.getRvStreamIndex() )->getBrookStream(),
         getSD2XStream()->getBrookStream(),
         positionStream.getBrookStream(),
         forceStream.getBrookStream(),
         velocityStream.getBrookStream(),
         getInverseMassStream()->getBrookStream(),
         getSD1VStream()->getBrookStream(),
         getVPrimeStream()->getBrookStream(),
         getXPrimeStream()->getBrookStream() 
         );
Mark Friedrichs's avatar
Mark Friedrichs committed
416
 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
   // diagnostics

   if( PrintOn ){
      (void) fprintf( getLog(), "\nPost kupdate_sd1_fix1: atomStrW=%3d rngStrW=%3d rngOff=%3d"
                                "EM=%12.5e Sd1pc[]=[%12.5e %12.5e %12.5e]",
                                getStochasticDynamicsAtomStreamWidth(),
                                brookRandomNumberGenerator.getRandomNumberStreamWidth(),
                                brookRandomNumberGenerator.getRvStreamOffset(),
                                derivedParameters[EM], derivedParameters[Sd1pc1], derivedParameters[Sd1pc2], derivedParameters[Sd1pc3] );

      (void) fprintf( getLog(), "\nSDPC1Stream\n" );
      getSDPC1Stream()->printToFile( getLog() );

      (void) fprintf( getLog(), "\nSD2XStream\n" );
      getSD2XStream()->printToFile( getLog() );

      (void) fprintf( getLog(), "\nInverseMassStream\n" );
      getInverseMassStream()->printToFile( getLog() );

      //StreamImpl& positionStreamImpl               = positionStream.getImpl();
      //const BrookStreamImpl brookPositions         = dynamic_cast<BrookStreamImpl&> (positionStreamImpl);
      BrookStreamInternal* brookStreamInternalPos  = positionStream.getBrookStreamImpl();
      (void) fprintf( getLog(), "\nPositionStream\n" );
      brookStreamInternalPos->printToFile( getLog() );

      (void) fprintf( getLog(), "\nForceStream\n" );
      BrookStreamInternal* brookStreamInternalF   = forceStream.getBrookStreamImpl();
      brookStreamInternalF->printToFile( getLog() );

      BrookStreamInternal* brookStreamInternalV   = velocityStream.getBrookStreamImpl();
      (void) fprintf( getLog(), "\nVelocityStream\n" );
      brookStreamInternalV->printToFile( getLog() );

      (void) fprintf( getLog(), "\nSD1VStream\n" );
      getSD1VStream()->printToFile( getLog() );

      (void) fprintf( getLog(), "\nVPrimeStream\n" );
      getVPrimeStream()->printToFile( getLog() );
Mark Friedrichs's avatar
Mark Friedrichs committed
455

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
456
457
458
      (void) fprintf( getLog(), "\nXPrimeStream\n" );
      getXPrimeStream()->printToFile( getLog() ); 
   }   
Mark Friedrichs's avatar
Mark Friedrichs committed
459

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
460
   // advance random number cursor
Mark Friedrichs's avatar
Mark Friedrichs committed
461

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
462
463
464
465
466
   brookRandomNumberGenerator.advanceGVCursor( 2*getNumberOfAtoms() );

   // first Shake step

   if( brookShakeAlgorithm.getNumberOfConstraints() > 0 ){
Mark Friedrichs's avatar
Mark Friedrichs committed
467
468
469
      kshakeh_fix1( 
                    10.0f,
                    (float) getStochasticDynamicsAtomStreamWidth(),
Mark Friedrichs's avatar
Mark Friedrichs committed
470
                    brookShakeAlgorithm.getInverseHydrogenMass(),
Mark Friedrichs's avatar
Mark Friedrichs committed
471
                    omega, 
Mark Friedrichs's avatar
Mark Friedrichs committed
472
                    brookShakeAlgorithm.getShakeAtomIndicesStream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
473
474
                    positionStream.getBrookStream(),
                    getXPrimeStream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
475
476
477
478
479
                    brookShakeAlgorithm.getShakeAtomParameterStream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons0Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons1Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons2Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons3Stream()->getBrookStream() );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
480
   
Mark Friedrichs's avatar
Mark Friedrichs committed
481
      // first Shake gather
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
482
   
Mark Friedrichs's avatar
Mark Friedrichs committed
483
484
485
      kshakeh_update1_fix1(
                    (float) getStochasticDynamicsAtomStreamWidth(),
                    derivedParameters[Sd2pc1],
Mark Friedrichs's avatar
Mark Friedrichs committed
486
                    brookShakeAlgorithm.getShakeInverseMapStream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
487
488
489
                    positionStream.getBrookStream(),
                    getXPrimeStream()->getBrookStream(),
                    getVPrimeStream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
490
491
492
493
                    brookShakeAlgorithm.getShakeXCons0Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons1Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons2Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons3Stream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
494
                    getXPrimeStream()->getBrookStream() );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
495
   }
Mark Friedrichs's avatar
Mark Friedrichs committed
496

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
497
   // second integration step
Mark Friedrichs's avatar
Mark Friedrichs committed
498

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
   kupdate_sd2_fix1(
         (float) getStochasticDynamicsAtomStreamWidth(),
         (float) brookRandomNumberGenerator.getRandomNumberStreamWidth(),
         (float) brookRandomNumberGenerator.getRvStreamOffset(),
         derivedParameters[Sd2pc1],
         derivedParameters[Sd2pc2],
         getSDPC2Stream()->getBrookStream(),
         brookRandomNumberGenerator.getRandomNumberStream( brookRandomNumberGenerator.getRvStreamIndex() )->getBrookStream(),
         getSD1VStream()->getBrookStream(),
         positionStream.getBrookStream(),
         getXPrimeStream()->getBrookStream(), 
         getVPrimeStream()->getBrookStream(),
         getSD2XStream()->getBrookStream(),
         velocityStream.getBrookStream(),
         getXPrimeStream()->getBrookStream() 
         );
Mark Friedrichs's avatar
Mark Friedrichs committed
515

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
516
   // advance random number cursor
Mark Friedrichs's avatar
Mark Friedrichs committed
517

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
518
   brookRandomNumberGenerator.advanceGVCursor( 2*getNumberOfAtoms() );
Mark Friedrichs's avatar
Mark Friedrichs committed
519

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
520
   // second Shake step
Mark Friedrichs's avatar
Mark Friedrichs committed
521

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
522
   if( brookShakeAlgorithm.getNumberOfConstraints() > 0 ){
Mark Friedrichs's avatar
Mark Friedrichs committed
523
524
525
      kshakeh_fix1( 
                    10.0f,
                    (float) getStochasticDynamicsAtomStreamWidth(),
Mark Friedrichs's avatar
Mark Friedrichs committed
526
                    brookShakeAlgorithm.getInverseHydrogenMass(),
Mark Friedrichs's avatar
Mark Friedrichs committed
527
                    omega, 
Mark Friedrichs's avatar
Mark Friedrichs committed
528
                    brookShakeAlgorithm.getShakeAtomIndicesStream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
529
530
                    positionStream.getBrookStream(),
                    getXPrimeStream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
531
532
533
534
535
                    brookShakeAlgorithm.getShakeAtomParameterStream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons0Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons1Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons2Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons3Stream()->getBrookStream() );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
536
   
Mark Friedrichs's avatar
Mark Friedrichs committed
537
      // second Shake gather
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
538
   
Mark Friedrichs's avatar
Mark Friedrichs committed
539
540
      kshakeh_update2_fix1( 
                    (float) getStochasticDynamicsAtomStreamWidth(),
Mark Friedrichs's avatar
Mark Friedrichs committed
541
                    brookShakeAlgorithm.getShakeInverseMapStream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
542
543
                    positionStream.getBrookStream(),
                    getXPrimeStream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
544
545
546
547
                    brookShakeAlgorithm.getShakeXCons0Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons1Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons2Stream()->getBrookStream(),
                    brookShakeAlgorithm.getShakeXCons3Stream()->getBrookStream(),
Mark Friedrichs's avatar
Mark Friedrichs committed
548
                    positionStream.getBrookStream() );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
549
550
551
552
553
   
   } else {
      //kadd3( getXPrimeStream()->getBrookStream(), positionStream.getBrookStream() );
      ksetStr3( getXPrimeStream()->getBrookStream(), positionStream.getBrookStream() );
   }
Mark Friedrichs's avatar
Mark Friedrichs committed
554
555
556
557
558
559
560
561
562
563
564
565

   return DefaultReturnValue;

};

/**
 *
 * Get array of derived parameters indexed by 'DerivedParameters' enums
 *
 * @return array
 *
 */
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
566
   
Mark Friedrichs's avatar
Mark Friedrichs committed
567
const BrookOpenMMFloat* BrookStochasticDynamics::getDerivedParameters( void ) const {
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
568
569
570

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

Mark Friedrichs's avatar
Mark Friedrichs committed
571
   // static const char* methodName  = "\nBrookStochasticDynamics::getDerivedParameters";
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
572
573
574

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

Mark Friedrichs's avatar
Mark Friedrichs committed
575
   return _derivedParameters;
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
576
577
578
579
580
581
582
583
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 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
617
BrookFloatStreamInternal* BrookStochasticDynamics::getSDPC1Stream( void ) const {
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
618
619
620
621
622
623
624
625
626
627
   return _sdStreams[SDPC1Stream];
}

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

Mark Friedrichs's avatar
Mark Friedrichs committed
628
BrookFloatStreamInternal* BrookStochasticDynamics::getSDPC2Stream( void ) const {
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
629
630
631
632
633
634
635
636
637
638
   return _sdStreams[SDPC2Stream];
}

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

Mark Friedrichs's avatar
Mark Friedrichs committed
639
BrookFloatStreamInternal* BrookStochasticDynamics::getSD2XStream( void ) const {
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
640
641
642
643
644
645
646
647
648
649
   return _sdStreams[SD2XStream];
}

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

Mark Friedrichs's avatar
Mark Friedrichs committed
650
BrookFloatStreamInternal* BrookStochasticDynamics::getSD1VStream( void ) const {
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
651
652
653
   return _sdStreams[SD1VStream];
}

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
/** 
 * 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
687
688
689
690
691
/** 
 * Initialize stream dimensions
 * 
 * @param numberOfAtoms             number of atoms
 * @param platform                  platform
Mark Friedrichs's avatar
Mark Friedrichs committed
692
 *      
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
693
694
695
696
 * @return ErrorReturnValue if error, else DefaultReturnValue
 *
 */

Mark Friedrichs's avatar
Mark Friedrichs committed
697
int BrookStochasticDynamics::_initializeStreamSizes( int numberOfAtoms, const Platform& platform ){
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
698
699
700

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

Mark Friedrichs's avatar
Mark Friedrichs committed
701
   //static const std::string methodName      = "BrookStochasticDynamics::_initializeStreamSizes";
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
702
703
704
705
706
707
708
709
710
711

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

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

   return DefaultReturnValue;
}

Mark Friedrichs's avatar
Mark Friedrichs committed
712
713
714
715
716
717
718
719
720
721
/** 
 * Initialize stream dimensions
 * 
 * @param numberOfAtoms             number of atoms
 * @param platform                  platform
 *
 * @return ErrorReturnValue if error, else DefaultReturnValue
 *
 */

Mark Friedrichs's avatar
Mark Friedrichs committed
722
723
//std::string BrookStochasticDynamics::_getDerivedParametersString( BrookStochasticDynamics::DerivedParameters  derivedParametersIndex ) const {
std::string BrookStochasticDynamics::_getDerivedParametersString( int derivedParametersIndex ) const {
Mark Friedrichs's avatar
Mark Friedrichs committed
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810

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

   //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
811
812
813
814
815
816
817
818
819
/** 
 * Initialize streams
 * 
 * @param platform                  platform
 *
 * @return ErrorReturnValue if error, else DefaultReturnValue
 *
 */

Mark Friedrichs's avatar
Mark Friedrichs committed
820
int BrookStochasticDynamics::_initializeStreams( const Platform& platform ){
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
821
822
823

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

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

Mark Friedrichs's avatar
Mark Friedrichs committed
826
827
   BrookOpenMMFloat dangleValue            = (BrookOpenMMFloat) 0.0;

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
828
829
// ---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
830
831
   int sdAtomStreamSize             = getStochasticDynamicsAtomStreamSize();
   int sdAtomStreamWidth            = getStochasticDynamicsAtomStreamWidth();
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
832

Mark Friedrichs's avatar
Mark Friedrichs committed
833
834
835
    _sdStreams[SDPC1Stream]         = new BrookFloatStreamInternal( BrookCommon::SDPC1Stream,
                                                                    sdAtomStreamSize, sdAtomStreamWidth,
                                                                    BrookStreamInternal::Float2, dangleValue );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
836

Mark Friedrichs's avatar
Mark Friedrichs committed
837
838
839
    _sdStreams[SDPC2Stream]         = new BrookFloatStreamInternal( BrookCommon::SDPC2Stream,
                                                                    sdAtomStreamSize, sdAtomStreamWidth,
                                                                    BrookStreamInternal::Float2, dangleValue );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
840

Mark Friedrichs's avatar
Mark Friedrichs committed
841
842
843
    _sdStreams[SD2XStream]          = new BrookFloatStreamInternal( BrookCommon::SD2XStream,
                                                                    sdAtomStreamSize, sdAtomStreamWidth,
                                                                    BrookStreamInternal::Float3, dangleValue );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
844

Mark Friedrichs's avatar
Mark Friedrichs committed
845
846
847
    _sdStreams[SD1VStream]          = new BrookFloatStreamInternal( BrookCommon::SD1VStream,
                                                                    sdAtomStreamSize, sdAtomStreamWidth,
                                                                    BrookStreamInternal::Float3, dangleValue );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
848

Mark Friedrichs's avatar
Mark Friedrichs committed
849
850
851
852
853
854
855
856
857
858
859
860
    _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
861
862
863
864
865
866
867
868
869
870
871
872
873
874
   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
875
   static const std::string methodName       = "BrookStochasticDynamics::_updateSdStreams";
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
876
877
878

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

Mark Friedrichs's avatar
Mark Friedrichs committed
879
   int sdAtomStreamSize                      = getStochasticDynamicsAtomStreamSize();
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
880

Mark Friedrichs's avatar
Mark Friedrichs committed
881
   BrookOpenMMFloat* sdpc[2];
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
882
883
884
885
   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
Mods  
Mark Friedrichs committed
886
887
   BrookOpenMMFloat* inverseMass = new BrookOpenMMFloat[sdAtomStreamSize];
   memset( inverseMass, 0, sdAtomStreamSize*sizeof( BrookOpenMMFloat ) ); 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
888

Mark Friedrichs's avatar
Mark Friedrichs committed
889
   const BrookOpenMMFloat* derivedParameters = getDerivedParameters( );
Mark Friedrichs's avatar
Mark Friedrichs committed
890
891
892
   int numberOfAtoms                         = getNumberOfAtoms();
   int index                                 = 0;
   for( int ii = 0; ii < numberOfAtoms; ii++, index += 2 ){
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
893

Mark Friedrichs's avatar
Mark Friedrichs committed
894
895
      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
896

Mark Friedrichs's avatar
Mark Friedrichs committed
897
898
      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
899

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
900
901
      inverseMass[ii]     = _inverseSqrtMasses[ii]*_inverseSqrtMasses[ii];

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
902
903
904
905
   }

   _sdStreams[SDPC1Stream]->loadFromArray( sdpc[0] );
   _sdStreams[SDPC2Stream]->loadFromArray( sdpc[1] );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
906
   _sdStreams[InverseMassStream]->loadFromArray( inverseMass );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
907
908
909
910

   for( int ii = 0; ii < 2; ii++ ){
      delete[] sdpc[ii];
   }
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
911
   delete[] inverseMass;
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
912
913
914

   // initialize SD2X

Mark Friedrichs's avatar
Mark Friedrichs committed
915
916
   BrookOpenMMFloat* sd2x = new BrookOpenMMFloat[3*sdAtomStreamSize];
   //SimTKOpenMMUtilities::setRandomNumberSeed( (uint32_t) getRandomNumberSeed() );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
917
918
919

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

Mark Friedrichs's avatar
Mark Friedrichs committed
920
921
   index = 0;
   for( int ii = 0; ii < numberOfAtoms; ii++, index += 3 ){
Mark Friedrichs's avatar
Mark Friedrichs committed
922
923
924
      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
925
926
927
928
929
930
931
932
933
934
   }
   
   _sdStreams[SD2XStream]->loadFromArray( sd2x );

   delete[] sd2x;

   return DefaultReturnValue;

}

Mark Friedrichs's avatar
Mark Friedrichs committed
935
936
937
938
939
940
941
942
943
944
945
/** 
 * Set masses 
 * 
 * @param masses             atomic masses
 *
 */

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

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

Mark Friedrichs's avatar
Mark Friedrichs committed
946
947
948
949
   //static const std::string methodName      = "BrookStochasticDynamics::_setInverseSqrtMasses";

   BrookOpenMMFloat zero                    = (BrookOpenMMFloat)  0.0;
   BrookOpenMMFloat one                     = (BrookOpenMMFloat)  1.0;
Mark Friedrichs's avatar
Mark Friedrichs committed
950
951
952
953
954
955
956

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

   // setup inverse sqrt masses

   _inverseSqrtMasses = new BrookOpenMMFloat[masses.size()];
   int index          = 0;
Mark Friedrichs's avatar
Mark Friedrichs committed
957
   for( std::vector<double>::const_iterator ii = masses.begin(); ii != masses.end(); ii++, index++ ){
Mark Friedrichs's avatar
Mark Friedrichs committed
958
      if( *ii != 0.0 ){
Mark Friedrichs's avatar
Mark Friedrichs committed
959
960
         BrookOpenMMFloat value    = static_cast<BrookOpenMMFloat>(*ii);
         _inverseSqrtMasses[index] = ( SQRT( one/value ) );
Mark Friedrichs's avatar
Mark Friedrichs committed
961
962
963
964
965
966
967
968
      } else {
         _inverseSqrtMasses[index] = zero;
      }
   }

   return DefaultReturnValue;
}   
 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
969
970
971
/*  
 * Setup of StochasticDynamics parameters
 *
Mark Friedrichs's avatar
Mark Friedrichs committed
972
 * @param masses                masses
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
973
974
975
976
977
978
 * @param platform              Brook platform
 *
 * @return nonzero value if error
 *
 * */
    
Mark Friedrichs's avatar
Mark Friedrichs committed
979
int BrookStochasticDynamics::setup( const std::vector<double>& masses, const Platform& platform ){
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
980
981
982
983
984
985
986
    
// ---------------------------------------------------------------------------------------

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

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

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
987
988
989
   const BrookPlatform brookPlatform            = dynamic_cast<const BrookPlatform&> (platform);
   setLog( brookPlatform.getLog() );

Mark Friedrichs's avatar
Mark Friedrichs committed
990
   int numberOfAtoms  = (int) masses.size();
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
991
992
   setNumberOfAtoms( numberOfAtoms );

Mark Friedrichs's avatar
Mark Friedrichs committed
993
   // set stream sizes and then create streams
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
994

Mark Friedrichs's avatar
Mark Friedrichs committed
995
996
   _initializeStreamSizes( numberOfAtoms, platform );
   _initializeStreams( platform );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
997

Mark Friedrichs's avatar
Mark Friedrichs committed
998
   _setInverseSqrtMasses( masses );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045

   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
1046
1047
1048
1049
1050
   (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
1051

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

Mark Friedrichs's avatar
Mark Friedrichs committed
1055
1056
1057
1058
1059
1060
1061
1062
   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
1063
1064

   message << _getLine( tab, "Log:",                  (getLog()                ? Set : NotSet) ); 
Mark Friedrichs's avatar
Mark Friedrichs committed
1065
1066
1067
1068
1069

   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
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
 
   for( int ii = 0; ii < LastStreamIndex; ii++ ){
      message << std::endl;
      if( _sdStreams[ii] ){
         message << _sdStreams[ii]->getContentsString( );
      }
   }

#undef LOCAL_SPRINTF

   return message.str();
}