BrookIntegrateLangevinStepKernel.cpp 9.6 KB
Newer Older
Mark Friedrichs's avatar
Mark Friedrichs committed
1
2
3
4
5
6
7
8
/* -------------------------------------------------------------------------- *
 *                                   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.               *
 *                                                                            *
9
10
 * Portions copyright (c) 2009 Stanford University and the Authors.           *
 * Authors: Mark Friedrichs, Mike Houston                                     *
Mark Friedrichs's avatar
Mark Friedrichs committed
11
12
 * Contributors:                                                              *
 *                                                                            *
13
14
15
16
 * This program is free software: you can redistribute it and/or modify       *
 * it under the terms of the GNU Lesser General Public License as published   *
 * by the Free Software Foundation, either version 3 of the License, or       *
 * (at your option) any later version.                                        *
Mark Friedrichs's avatar
Mark Friedrichs committed
17
 *                                                                            *
18
19
20
21
 * This program is distributed in the hope that it will be useful,            *
 * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
 * GNU Lesser General Public License for more details.                        *
Mark Friedrichs's avatar
Mark Friedrichs committed
22
 *                                                                            *
23
24
 * You should have received a copy of the GNU Lesser General Public License   *
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.      *
Mark Friedrichs's avatar
Mark Friedrichs committed
25
26
 * -------------------------------------------------------------------------- */

Mark Friedrichs's avatar
Mark Friedrichs committed
27
#include "BrookIntegrateLangevinStepKernel.h"
Mark Friedrichs's avatar
Mark Friedrichs committed
28
#include "BrookStreamInternal.h"
29
#include <ctime>
Mark Friedrichs's avatar
Mark Friedrichs committed
30
31
32
33

using namespace OpenMM;
using namespace std;

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
34
35
36
37
38
39
40
41
42
/** 
 * BrookIntegrateLangevinStepKernel constructor
 * 
 * @param name                  name of the stream to create
 * @param platform              platform
 * @param openMMBrookInterface  OpenMMBrookInterface reference
 * @param system                System reference  
 *
 */
Mark Friedrichs's avatar
Mark Friedrichs committed
43

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
44
45
46
BrookIntegrateLangevinStepKernel::BrookIntegrateLangevinStepKernel( std::string name, const Platform& platform,
                                  OpenMMBrookInterface& openMMBrookInterface, System& system ) :
                                  IntegrateLangevinStepKernel( name, platform ), _openMMBrookInterface( openMMBrookInterface ), _system( system ){
Mark Friedrichs's avatar
Mark Friedrichs committed
47
48
49

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

Mark Friedrichs's avatar
Mark Friedrichs committed
50
   // static const std::string methodName      = "BrookIntegrateLangevinStepKernel::BrookIntegrateLangevinStepKernel";
Mark Friedrichs's avatar
Mark Friedrichs committed
51
52

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

54
55
56
57
   _brookLangevinDynamics                = NULL;
   _brookShakeAlgorithm                  = NULL;
   _brookRandomNumberGenerator           = NULL;
   _log                                  = NULL;
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
58

59
   const BrookPlatform& brookPlatform    = dynamic_cast<const BrookPlatform&> (platform);
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
60
61
62
   if( brookPlatform.getLog() != NULL ){
      setLog( brookPlatform.getLog() );
   }
Mark Friedrichs's avatar
Mark Friedrichs committed
63

Mark Friedrichs's avatar
Mark Friedrichs committed
64
65
}

Mark Friedrichs's avatar
Mark Friedrichs committed
66
67
68
69
70
/** 
 * BrookIntegrateVerletStepKernel destructor
 * 
 */
  
Mark Friedrichs's avatar
Mark Friedrichs committed
71
BrookIntegrateLangevinStepKernel::~BrookIntegrateLangevinStepKernel( ){
Mark Friedrichs's avatar
Mark Friedrichs committed
72
73
74

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

Mark Friedrichs's avatar
Mark Friedrichs committed
75
   // static const std::string methodName      = "BrookIntegrateLangevinStepKernel::~BrookIntegrateLangevinStepKernel";
Mark Friedrichs's avatar
Mark Friedrichs committed
76
77
78

// ---------------------------------------------------------------------------------------
   
79
   delete _brookLangevinDynamics;
Mark Friedrichs's avatar
Mark Friedrichs committed
80
   delete _brookShakeAlgorithm;
Mark Friedrichs's avatar
Mark Friedrichs committed
81
   delete _brookRandomNumberGenerator;
Mark Friedrichs's avatar
Mark Friedrichs committed
82

Mark Friedrichs's avatar
Mark Friedrichs committed
83
84
}

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/** 
 * Get log file reference
 * 
 * @return  log file reference
 *
 */

FILE* BrookIntegrateLangevinStepKernel::getLog( void ) const {
   return _log;
}

/** 
 * Set log file reference
 * 
 * @param  log file reference
 *
 * @return  DefaultReturnValue
 *
 */

int BrookIntegrateLangevinStepKernel::setLog( FILE* log ){
   _log = log;
   return DefaultReturnValue;
}

Mark Friedrichs's avatar
Mark Friedrichs committed
110
111
112
/** 
 * Initialize the kernel, setting up all parameters related to integrator.
 * 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
113
114
 * @param system                System reference  
 * @param integrator            LangevinIntegrator reference
Mark Friedrichs's avatar
Mark Friedrichs committed
115
116
117
 *
 */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
118
void BrookIntegrateLangevinStepKernel::initialize( const System& system, const LangevinIntegrator& integrator ){
Mark Friedrichs's avatar
Mark Friedrichs committed
119
120
121

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

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
122
   int printOn                               = 0;
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
123
   static const std::string methodName       = "BrookIntegrateLangevinStepKernel::initialize";
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
124
   FILE* log                                 = NULL;
Mark Friedrichs's avatar
Mark Friedrichs committed
125
126
127

// ---------------------------------------------------------------------------------------
   
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
128
//setLog( stderr );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
129
130
131
132
   printOn               = (printOn && getLog()) ? printOn : 0;

   if( printOn ){
      log = getLog();
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
133
134
135
136
      (void) fprintf( log, "%s\n", methodName.c_str() );
      (void) fflush( log );
   }

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
137
138
139
140
141
142
143
   int numberOfParticles = system.getNumParticles();

   // masses

   std::vector<double> masses;
   masses.resize( numberOfParticles );

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
144
   if( printOn ){
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
145
146
147
148
      (void) fprintf( log, "%s %d\n", methodName.c_str(), numberOfParticles );
      (void) fflush( log );
   }

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
149
   for( int ii = 0; ii < numberOfParticles; ii++ ){
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
150
      masses[ii] = static_cast<double>(system.getParticleMass(ii));
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
151
152
153
154
155
156
   }

   // constraints

   int numberOfConstraints = system.getNumConstraints();

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
157
   if( printOn ){
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
158
159
160
161
      (void) fprintf( log, "%s const=%d\n", methodName.c_str(), numberOfConstraints );
      (void) fflush( log );
   }

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
162
163
164
165
166
167
168
169
170
171
172
   std::vector<std::vector<int> > constraintIndicesVector;
   constraintIndicesVector.resize( numberOfConstraints );
   std::vector<double> constraintLengths;

   for( int ii = 0; ii < numberOfConstraints; ii++ ){

      int particle1, particle2;
      double distance;

      system.getConstraintParameters( ii, particle1, particle2, distance );

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
173
      constraintIndicesVector[ii].push_back( particle1 );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
174
      constraintIndicesVector[ii].push_back( particle2 );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
175
      constraintLengths.push_back( distance );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
176
177
178

//(void) fprintf( log, "%s shake setup const=%d ", methodName.c_str(), ii ); fflush( log );
//(void) fprintf( log, "[ %d %d %f]\n", particle1, particle2, distance ); fflush( log );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
179
180
181
   }

   _brookLangevinDynamics        = new BrookLangevinDynamics( );
182
   _brookLangevinDynamics->setup( masses, getPlatform() );
Mark Friedrichs's avatar
Mark Friedrichs committed
183

Mark Friedrichs's avatar
Mark Friedrichs committed
184
   _brookShakeAlgorithm          = new BrookShakeAlgorithm( );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
185
   _brookShakeAlgorithm->setup( masses, constraintIndicesVector, constraintLengths, getPlatform() );
Mark Friedrichs's avatar
Mark Friedrichs committed
186

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
187
188
189
190
   // tolerance

   BrookOpenMMFloat tolerance = static_cast<BrookOpenMMFloat>( integrator.getConstraintTolerance() );
   _brookShakeAlgorithm->setShakeTolerance( tolerance );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
191
192
193
194
   _brookShakeAlgorithm->setMaxIterations( 40 );
   if( log ){
      _brookShakeAlgorithm->setLog( log );
   }
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
195

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
196
197
198
199
   // random number generator

   _brookRandomNumberGenerator   = new BrookRandomNumberGenerator( );
   _brookRandomNumberGenerator->setup( (int) masses.size(), getPlatform() );
200
201
202
203
204
205
206

   unsigned long int seed;
   if( integrator.getRandomNumberSeed() <= 1 ){
      seed        = static_cast<unsigned long int>(time(NULL) & 0x000fffff);
   } else {
      seed        = static_cast<unsigned long int>( integrator.getRandomNumberSeed() );
   }
207
   _brookRandomNumberGenerator->setRandomNumberSeed( seed );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
208

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
209
   if( printOn ){
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
210
211
212
      (void) fprintf( log, "%s done setup:\nBrookShakeAlgorithm:\n%s\nBrookRandomNumberGenerator:\n%s\n\n", methodName.c_str(),
                      _brookShakeAlgorithm->getContentsString().c_str(), 
                      _brookRandomNumberGenerator->getContentsString().c_str() );
213
      (void) fprintf( log, "LangevinIntegrator seed=%d\n", integrator.getRandomNumberSeed() );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
214
215
216
      (void) fflush( log );
   }

Mark Friedrichs's avatar
Mark Friedrichs committed
217
218
}

Mark Friedrichs's avatar
Mark Friedrichs committed
219
220
221
/** 
 * Execute kernel
 * 
222
 * @param context            ContextImpl reference
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
223
 * @param integrator         LangevinIntegrator reference
Mark Friedrichs's avatar
Mark Friedrichs committed
224
225
226
 *
 */

227
void BrookIntegrateLangevinStepKernel::execute( ContextImpl& context, const LangevinIntegrator& integrator ){
Mark Friedrichs's avatar
Mark Friedrichs committed
228

Mark Friedrichs's avatar
Mark Friedrichs committed
229
230
// ---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
231
   double epsilon                           = 1.0e-06;
232
   static const std::string methodName      = "BrookIntegrateLangevinStepKernel::execute";
Mark Friedrichs's avatar
Mark Friedrichs committed
233
234
235

// ---------------------------------------------------------------------------------------
   
236
   // first time through initialize _brookLangevinDynamics
Mark Friedrichs's avatar
Mark Friedrichs committed
237
238
239

   // for each subsequent call, check if parameters need to be updated due to a change
   // in T, gamma, or the step size
Mark Friedrichs's avatar
Mark Friedrichs committed
240

Mark Friedrichs's avatar
Mark Friedrichs committed
241
242
   // take step

Mark Friedrichs's avatar
Mark Friedrichs committed
243
   double differences[3];
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
244
245
246
   differences[0] = integrator.getTemperature() - (double) _brookLangevinDynamics->getTemperature();
   differences[1] = integrator.getFriction()    - (double) _brookLangevinDynamics->getFriction();
   differences[2] = integrator.getStepSize()    - (double) _brookLangevinDynamics->getStepSize();
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
247
   if( fabs( differences[0] ) > epsilon || fabs( differences[1] ) > epsilon || fabs( differences[2] ) > epsilon ){
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
248
      _brookLangevinDynamics->updateParameters( integrator.getTemperature(), integrator.getFriction(), integrator.getStepSize() );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
249
   }
250

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
251
252
   _brookLangevinDynamics->update( *(_openMMBrookInterface.getParticlePositions()), *(_openMMBrookInterface.getParticleVelocities()), 
                                   *(_openMMBrookInterface.getParticleForces()), *_brookShakeAlgorithm, *_brookRandomNumberGenerator );
253
   _openMMBrookInterface.setTime(_openMMBrookInterface.getTime());
Mark Friedrichs's avatar
Mark Friedrichs committed
254
}