"platforms/cpu/src/CpuKernelFactory.cpp" did not exist on "407c0b931431430a03683c2f6113845244526360"
BrookIntegrateLangevinStepKernel.cpp 9.5 KB
Newer Older
Mark Friedrichs's avatar
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
/* -------------------------------------------------------------------------- *
 *                                   OpenMM                                   *
 * -------------------------------------------------------------------------- *
 * This is part of the OpenMM molecular simulation toolkit originating from   *
 * Simbios, the NIH National Center for Physics-Based Simulation of           *
 * Biological Structures at Stanford, funded under the NIH Roadmap for        *
 * Medical Research, grant U54 GM072970. See https://simtk.org.               *
 *                                                                            *
 * Portions copyright (c) 2008 Stanford University and the Authors.           *
 * Authors: Peter Eastman                                                     *
 * 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.                                     *
 * -------------------------------------------------------------------------- */

Mark Friedrichs's avatar
Mark Friedrichs committed
32
#include "BrookIntegrateLangevinStepKernel.h"
Mark Friedrichs's avatar
Mark Friedrichs committed
33
34
35
36
37
#include "BrookStreamInternal.h"

using namespace OpenMM;
using namespace std;

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
38
39
40
41
42
43
44
45
46
/** 
 * 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
47

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
48
49
50
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
51
52
53

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

Mark Friedrichs's avatar
Mark Friedrichs committed
54
   // static const std::string methodName      = "BrookIntegrateLangevinStepKernel::BrookIntegrateLangevinStepKernel";
Mark Friedrichs's avatar
Mark Friedrichs committed
55
56

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

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
58
   _brookLangevinDynamics          = NULL;
Mark Friedrichs's avatar
Mark Friedrichs committed
59
   _brookShakeAlgorithm            = NULL;
Mark Friedrichs's avatar
Mark Friedrichs committed
60
   _brookRandomNumberGenerator     = NULL;
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
61
62
63
64
65
66
   _log                            = NULL;

   const BrookPlatform brookPlatform        = dynamic_cast<const BrookPlatform&> (platform);
   if( brookPlatform.getLog() != NULL ){
      setLog( brookPlatform.getLog() );
   }
Mark Friedrichs's avatar
Mark Friedrichs committed
67

Mark Friedrichs's avatar
Mark Friedrichs committed
68
69
}

Mark Friedrichs's avatar
Mark Friedrichs committed
70
71
72
73
74
/** 
 * BrookIntegrateVerletStepKernel destructor
 * 
 */
  
Mark Friedrichs's avatar
Mark Friedrichs committed
75
BrookIntegrateLangevinStepKernel::~BrookIntegrateLangevinStepKernel( ){
Mark Friedrichs's avatar
Mark Friedrichs committed
76
77
78

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

Mark Friedrichs's avatar
Mark Friedrichs committed
79
   // static const std::string methodName      = "BrookIntegrateLangevinStepKernel::~BrookIntegrateLangevinStepKernel";
Mark Friedrichs's avatar
Mark Friedrichs committed
80
81
82

// ---------------------------------------------------------------------------------------
   
83
   delete _brookLangevinDynamics;
Mark Friedrichs's avatar
Mark Friedrichs committed
84
   delete _brookShakeAlgorithm;
Mark Friedrichs's avatar
Mark Friedrichs committed
85
   delete _brookRandomNumberGenerator;
Mark Friedrichs's avatar
Mark Friedrichs committed
86

Mark Friedrichs's avatar
Mark Friedrichs committed
87
88
}

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/** 
 * 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
114
115
116
/** 
 * Initialize the kernel, setting up all parameters related to integrator.
 * 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
117
118
 * @param system                System reference  
 * @param integrator            LangevinIntegrator reference
Mark Friedrichs's avatar
Mark Friedrichs committed
119
120
121
 *
 */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
122
void BrookIntegrateLangevinStepKernel::initialize( const System& system, const LangevinIntegrator& integrator ){
Mark Friedrichs's avatar
Mark Friedrichs committed
123
124
125

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

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
126
   int printOn                               = 1;
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
127
   static const std::string methodName       = "BrookIntegrateLangevinStepKernel::initialize";
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
128
   FILE* log                                 = NULL;
Mark Friedrichs's avatar
Mark Friedrichs committed
129
130
131

// ---------------------------------------------------------------------------------------
   
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
132
133
134
135
136
setLog( stderr );
   printOn               = (printOn && getLog()) ? printOn : 0;

   if( printOn ){
      log = getLog();
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
137
138
139
140
      (void) fprintf( log, "%s\n", methodName.c_str() );
      (void) fflush( log );
   }

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
141
142
143
144
145
146
147
   int numberOfParticles = system.getNumParticles();

   // masses

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

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
148
   if( printOn ){
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
149
150
151
152
      (void) fprintf( log, "%s %d\n", methodName.c_str(), numberOfParticles );
      (void) fflush( log );
   }

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

   // constraints

   int numberOfConstraints = system.getNumConstraints();

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
161
   if( printOn ){
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
162
163
164
165
      (void) fprintf( log, "%s const=%d\n", methodName.c_str(), numberOfConstraints );
      (void) fflush( log );
   }

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
166
167
168
169
170
171
172
173
174
175
176
   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
177
      constraintIndicesVector[ii].push_back( particle1 );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
178
      constraintIndicesVector[ii].push_back( particle2 );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
179
      constraintLengths.push_back( distance );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
180
181
182

//(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
183
184
185
   }

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

Mark Friedrichs's avatar
Mark Friedrichs committed
188
   _brookShakeAlgorithm          = new BrookShakeAlgorithm( );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
189
   _brookShakeAlgorithm->setup( masses, constraintIndicesVector, constraintLengths, getPlatform() );
Mark Friedrichs's avatar
Mark Friedrichs committed
190

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
191
192
193
194
   // tolerance

   BrookOpenMMFloat tolerance = static_cast<BrookOpenMMFloat>( integrator.getConstraintTolerance() );
   _brookShakeAlgorithm->setShakeTolerance( tolerance );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
195
196
197
198
   _brookShakeAlgorithm->setMaxIterations( 40 );
   if( log ){
      _brookShakeAlgorithm->setLog( log );
   }
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
199

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
200
201
202
203
   // random number generator

   _brookRandomNumberGenerator   = new BrookRandomNumberGenerator( );
   _brookRandomNumberGenerator->setup( (int) masses.size(), getPlatform() );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
204

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
205
   if( printOn ){
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
206
207
208
      (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() );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
209
210
211
      (void) fflush( log );
   }

Mark Friedrichs's avatar
Mark Friedrichs committed
212
213
}

Mark Friedrichs's avatar
Mark Friedrichs committed
214
215
216
/** 
 * Execute kernel
 * 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
217
218
 * @param context            OpenMMContextImpl reference
 * @param integrator         LangevinIntegrator reference
Mark Friedrichs's avatar
Mark Friedrichs committed
219
220
221
 *
 */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
222
void BrookIntegrateLangevinStepKernel::execute( OpenMMContextImpl& context, const LangevinIntegrator& integrator ){
Mark Friedrichs's avatar
Mark Friedrichs committed
223

Mark Friedrichs's avatar
Mark Friedrichs committed
224
225
// ---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
226
   double epsilon                           = 1.0e-06;
227
   static const std::string methodName      = "BrookIntegrateLangevinStepKernel::execute";
Mark Friedrichs's avatar
Mark Friedrichs committed
228
229
230

// ---------------------------------------------------------------------------------------
   
231
   // first time through initialize _brookLangevinDynamics
Mark Friedrichs's avatar
Mark Friedrichs committed
232
233
234

   // 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
235

Mark Friedrichs's avatar
Mark Friedrichs committed
236
237
   // take step

Mark Friedrichs's avatar
Mark Friedrichs committed
238
   double differences[3];
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
239
240
241
   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
242
   if( fabs( differences[0] ) > epsilon || fabs( differences[1] ) > epsilon || fabs( differences[2] ) > epsilon ){
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
243
      _brookLangevinDynamics->updateParameters( integrator.getTemperature(), integrator.getFriction(), integrator.getStepSize() );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
244
   }
245

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
246
247
   _brookLangevinDynamics->update( *(_openMMBrookInterface.getParticlePositions()), *(_openMMBrookInterface.getParticleVelocities()), 
                                   *(_openMMBrookInterface.getParticleForces()), *_brookShakeAlgorithm, *_brookRandomNumberGenerator );
Mark Friedrichs's avatar
Mark Friedrichs committed
248
249

}