BrookBonded.h 18.4 KB
Newer Older
Mark Friedrichs's avatar
Mark Friedrichs committed
1
2
#ifndef OPENMM_BROOK_BONDED_H_
#define OPENMM_BROOK_BONDED_H_
Mark Friedrichs's avatar
Mark Friedrichs committed
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: Peter Eastman, 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 <vector>

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
37
#include "BrookStreamImpl.h"
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
38
//#include "BrookPlatform.h"
Mark Friedrichs's avatar
Mark Friedrichs committed
39
40
#include "BrookCommon.h"
#include "OpenMMContext.h"
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
41
#include "BrookBondParameters.h"
Mark Friedrichs's avatar
Mark Friedrichs committed
42
43
44
45

namespace OpenMM {

/**
46
 * This kernel is invoked by NonbondedForce to calculate the forces acting on the system.
Mark Friedrichs's avatar
Mark Friedrichs committed
47
48
49
50
51
 */
class BrookBonded : public BrookCommon {

   public:
  
Mark Friedrichs's avatar
Mark Friedrichs committed
52
53
54
55
56
57
      /** 
       *
       * BrookBonded constructor
       * 
       */
      
Mark Friedrichs's avatar
Mark Friedrichs committed
58
59
      BrookBonded( );
  
Mark Friedrichs's avatar
Mark Friedrichs committed
60
61
62
63
64
65
66
      /** 
       *
       * BrookBonded desstructor
       * 
       */
      
      ~BrookBonded( );
Mark Friedrichs's avatar
Mark Friedrichs committed
67
68
69
70
  
      /**
       * Initialize the kernel, setting up the values of all the force field parameters.
       * 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
71
       * @param bondIndices               the two particles connected by each bond term
Mark Friedrichs's avatar
Mark Friedrichs committed
72
       * @param bondParameters            the force parameters (length, k) for each bond term
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
73
       * @param angleIndices              the three particles connected by each angle term
Mark Friedrichs's avatar
Mark Friedrichs committed
74
       * @param angleParameters           the force parameters (angle, k) for each angle term
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
75
       * @param periodicTorsionIndices    the four particles connected by each periodic torsion term
Mark Friedrichs's avatar
Mark Friedrichs committed
76
       * @param periodicTorsionParameters the force parameters (k, phase, periodicity) for each periodic torsion term
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
77
       * @param rbTorsionIndices          the four particles connected by each Ryckaert-Bellemans torsion term
Mark Friedrichs's avatar
Mark Friedrichs committed
78
       * @param rbTorsionParameters       the coefficients (in order of increasing powers) for each Ryckaert-Bellemans torsion term
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
79
       * @param bonded14Indices           each element contains the indices of two particles whose nonbonded interactions should be reduced since
Mark Friedrichs's avatar
Mark Friedrichs committed
80
       *                                  they form a bonded 1-4 pair
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
81
       * @param nonbondedParameters       the nonbonded force parameters (charge, sigma, epsilon) for each particle
Mark Friedrichs's avatar
Mark Friedrichs committed
82
83
84
85
86
87
       * @param log                       log reference
       *
       * @return nonzero value if error
       *
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
88
/*
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
89
      int setup( int numberOfParticles, 
Mark Friedrichs's avatar
Mark Friedrichs committed
90
91
92
93
94
                 const std::vector<std::vector<int> >& bondIndices,            const std::vector<std::vector<double> >& bondParameters,
                 const std::vector<std::vector<int> >& angleIndices,           const std::vector<std::vector<double> >& angleParameters,
                 const std::vector<std::vector<int> >& periodicTorsionIndices, const std::vector<std::vector<double> >& periodicTorsionParameters,
                 const std::vector<std::vector<int> >& rbTorsionIndices,       const std::vector<std::vector<double> >& rbTorsionParameters,
                 const std::vector<std::vector<int> >& bonded14Indices,        const std::vector<std::vector<double> >& nonbondedParameters,
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
95
                 const Platform& platform );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
96
97
98
99
100
101
102
*/

      int setup( int numberOfParticles,
                 BrookBondParameters* harmonicBondBrookBondParameters,
                 BrookBondParameters* harmonicAngleBrookBondParameters,
                 BrookBondParameters* periodicTorsionBrookBondParameters,
                 BrookBondParameters* rbTorsionBrookBondParameters,
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
103
                 BrookBondParameters* nonBonded14ForceParameters,  int particleStreamWidth, int particleStreamSize );
Mark Friedrichs's avatar
Mark Friedrichs committed
104

Mark Friedrichs's avatar
Mark Friedrichs committed
105
106
107
108
109
110
111
112
113
      /**
       * Get inverse map stream width
       * 
       * @return stream width
       *
       */

      int getInverseMapStreamWidth( void ) const;
      
Mark Friedrichs's avatar
Mark Friedrichs committed
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
      /**
       * Return number of parameter streams
       * 
       * @return number of parameter streams
       *
       */

      int getNumberOfParameterStreams( void ) const; 

      /**
       * Return number of force streams
       * 
       * @return number of force streams
       *
       */

      int getNumberOfForceStreams( void ) const; 

      /**
       * Return stream count for specifed index (i, j, k, l)
       * 
       * @return stream count for specifed index
       *
       * @throw throws OpenMMException if index out of range
       */

      int getInverseMapStreamCount( int index ) const; 

      /**
       * Return max stream count
       * 
       * @return max stream count
       */

      int getMaxInverseMapStreamCount( void ) const; 

Mark Friedrichs's avatar
Mark Friedrichs committed
150
151
152
153
154
155
156
157
158
159
160
      /**
       * Return max stream count for specified index
       * 
       * @param index index of force stream
       *
       * @return max stream count
       *
       */

      int getMaxInverseMapStreamCount( int index ) const; 

Mark Friedrichs's avatar
Mark Friedrichs committed
161
162
163
164
165
166
      /**
       * Return Brook stream handle
       * 
       * @return 
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
167
      BrookFloatStreamInternal* getBrookParticleIndices( void ) const; 
Mark Friedrichs's avatar
Mark Friedrichs committed
168
169
170
171
172
173
174
175
176
177
178

      /** 
       * Get Coulomb factor
       * 
       * @return Coulomb factor
       *
       */
      
      BrookOpenMMFloat getCoulombFactor( void ) const;

      /** 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
179
       * Get bonded particle indices stream
Mark Friedrichs's avatar
Mark Friedrichs committed
180
       * 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
181
       * @return  particle indices stream
Mark Friedrichs's avatar
Mark Friedrichs committed
182
183
184
       *
       */
      
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
185
      BrookFloatStreamInternal* getParticleIndicesStream( void ) const;
Mark Friedrichs's avatar
Mark Friedrichs committed
186
      
187
188
189
190
191
192
193
194
195
      /** 
       * Get bonded charge stream
       * 
       * @return  charge stream
       *
       */
      
      BrookFloatStreamInternal* getChargeStream( void ) const;
      
Mark Friedrichs's avatar
Mark Friedrichs committed
196
197
198
199
200
201
202
      /** 
       * Get array of bonded parameter streams
       * 
       * @return  array of bonded parameter streams
       *
       */
      
Mark Friedrichs's avatar
Mark Friedrichs committed
203
      BrookFloatStreamInternal** getBondedParameterStreams( void );
Mark Friedrichs's avatar
Mark Friedrichs committed
204
205
206
207
208
209
210
211
      
      /** 
       * Get array of force streams
       * 
       * @return  array
       *
       */
      
Mark Friedrichs's avatar
Mark Friedrichs committed
212
      BrookFloatStreamInternal** getBondedForceStreams( void );
Mark Friedrichs's avatar
Mark Friedrichs committed
213
214
215
216
217
218
219
220
221
222
      
      /** 
       * Get array of inverse map streams
       * 
       * @param index  array index 
       *
       * @return  array inverse map streams
       *
       */
      
Mark Friedrichs's avatar
Mark Friedrichs committed
223
      BrookFloatStreamInternal** getInverseStreamMapsStreams( int index );
Mark Friedrichs's avatar
Mark Friedrichs committed
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
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
      
      /** 
       * Return true if force[index] stream is set
       *
       * @param    index into force stream
       * @return   true if index is valid && force[index] stream is set; else false
       *
       */
      
      int isForceStreamSet( int index ) const;
       
      /** 
       * Return true if paramsterSet[index] stream is set
       *
       * @param    index into parameter stream
       *
       * @return   true if index is valid && paramsterSet[index] stream is set; else false
       *
       */
      
      int isParameterStreamSet( int index ) const;
          
      /** 
       * Return string showing if all inverse map streams are set
       *
       * @param    index into inverse map stream array
       *
       * @return   informative string
       *
       */
      
      std::string checkInverseMapStream( int index ) const;

      /* 
       * Get contents of object
       *
       *
       * @param level   level of dump
       *
       * @return string containing contents
       *
       * */
      
Mark Friedrichs's avatar
Mark Friedrichs committed
267
      std::string getContentsString( int level = 0 ) const;
Mark Friedrichs's avatar
Mark Friedrichs committed
268

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
269
270
271
272
273
274
275
      /** 
       * Compute forces
       * 
       */
      
      void computeForces( BrookStreamImpl& positionStream, BrookStreamImpl& forceStream );
   
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
276
277
278
279
280
281
282
      /** 
       * Return SetupCompleted flag
       *
       * @return SetupCompleted flag
       */
      
      int isSetupCompleted( void ) const;
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
283
   
Mark Friedrichs's avatar
Mark Friedrichs committed
284
285
286
287
288
289
290
291
   private:
   
      static const int NumberOfParameterStreams = 5;
      static const int NumberOfForceStreams     = 4;
      static const int MaxNumberOfInverseMaps   = 9;

      enum { StreamI, StreamJ, StreamK, StreamL, StreamMax };

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
292
293
      int _setupCompleted;

Mark Friedrichs's avatar
Mark Friedrichs committed
294
295
      // inverse map stream width

Mark Friedrichs's avatar
Mark Friedrichs committed
296
      int _inverseMapStreamWidth;
Mark Friedrichs's avatar
Mark Friedrichs committed
297
298
299
300
301
302
303
304
305
306
307

      // actual max number of inverse maps 

      int _maxNumberOfInverseMaps;

      // scale factors for 1-4 ixn

      BrookOpenMMFloat _coulombFactor;

      // streams

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
308
      BrookFloatStreamInternal* _particleIndicesStream;
Mark Friedrichs's avatar
Mark Friedrichs committed
309
310
311
312
      BrookFloatStreamInternal* _bondedParameters[NumberOfParameterStreams];
      BrookFloatStreamInternal* _bondedForceStreams[NumberOfForceStreams];
      BrookFloatStreamInternal* _chargeStream;
      BrookFloatStreamInternal* _inverseStreamMaps[NumberOfForceStreams][MaxNumberOfInverseMaps];
Mark Friedrichs's avatar
Mark Friedrichs committed
313
314
315
316
317
318

      int _maxInverseMapStreamCount[NumberOfForceStreams];
      int _inverseMapStreamCount[NumberOfForceStreams];

      // helper methods in setup of parameters

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
319
320
321
322
323
      void flipQuartet( int ibonded, int *particles );
      int matchTorsion( int i, int j, int k, int l, int nbondeds, int *particles );
      int matchAngle( int i, int j, int k, int nbondeds, int *particles, int *flag );
      int matchBond( int i, int j, int nbondeds, int *particles, int *flag );
      int matchPair( int i, int j, int nbondeds, int *particles );
Mark Friedrichs's avatar
Mark Friedrichs committed
324
325

      /**
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
326
       * Setup Ryckaert-Bellemans parameters/particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
327
328
       * 
       * @param nbondeds                  number of bonded entries
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
329
       * @param particles                     array of particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
330
       * @param params                    arrays of bond parameters
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
331
       * @param rbTorsionIndices          the four particles connected by each Ryckaert-Bellemans torsion term
Mark Friedrichs's avatar
Mark Friedrichs committed
332
333
334
335
336
337
       * @param rbTorsionParameters       the coefficients (in order of increasing powers) for each Ryckaert-Bellemans torsion term
       *
       * @return nonzero value if error
       *
       */

Mark Friedrichs's avatar
Mark Friedrichs committed
338
      int addRBTorsions( int *nbondeds, int *particles, BrookOpenMMFloat* params[], const std::vector<std::vector<int> >& rbTorsionIndices,  
Mark Friedrichs's avatar
Mark Friedrichs committed
339
340
341
                          const std::vector<std::vector<double> >& rbTorsionParameters );

      /**
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
342
       * Setup periodic torsion parameters/particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
343
344
       * 
       * @param nbondeds                  number of bonded entries
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
345
       * @param particles                     array of particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
346
       * @param params                    arrays of bond parameters
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
347
       * @param periodicTorsionIndices    the four particles connected by each periodic torsion term
Mark Friedrichs's avatar
Mark Friedrichs committed
348
349
350
351
352
353
       * @param periodicTorsionParameters the force parameters (k, phase, periodicity) for each periodic torsion term
       *
       * @return nonzero value if error
       *
       */

Mark Friedrichs's avatar
Mark Friedrichs committed
354
      int addPTorsions( int *nbondeds, int *particles, BrookOpenMMFloat* params[], const std::vector<std::vector<int> >& periodicTorsionIndices,  
Mark Friedrichs's avatar
Mark Friedrichs committed
355
356
357
                          const std::vector<std::vector<double> >& periodicTorsionParameters );

      /**
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
358
       * Setup angle bond parameters/particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
359
360
       * 
       * @param nbondeds                  number of bonded entries
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
361
       * @param particles                     array of particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
362
       * @param params                    arrays of bond parameters
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
363
       * @param angleIndices              the angle bond particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
364
365
366
367
368
369
       * @param angleParameters           the angle parameters (angle in radians, force constant)
       *
       * @return nonzero value if error
       *
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
370
      int addAngles( int *nbondeds, int *particles, BrookOpenMMFloat* params[], const std::vector<std::vector<int> >& angleIndices,
Mark Friedrichs's avatar
Mark Friedrichs committed
371
372
373
                     const std::vector<std::vector<double> >& angleParameters );

      /**
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
374
       * Setup harmonic bond parameters/particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
375
376
       * 
       * @param nbondeds                  number of bonded entries
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
377
       * @param particles                     array of particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
378
       * @param params                    arrays of bond parameters
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
379
       * @param bondIndices               two harmonic bond particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
380
381
382
383
384
385
       * @param bondParameters            the force parameters (distance, k)
       *
       * @return nonzero value if error
       *
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
386
      int addBonds( int *nbondeds, int *particles, BrookOpenMMFloat* params[], const std::vector<std::vector<int> >& bondIndices,
Mark Friedrichs's avatar
Mark Friedrichs committed
387
388
389
                    const std::vector<std::vector<double> >& bondParameters );

      /**
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
390
       * Setup LJ/Coulomb 1-4 parameters/particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
391
392
       * 
       * @param nbondeds                  number of bonded entries
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
393
       * @param particles                     array of particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
394
395
       * @param params                    arrays of bond parameters
       * @param charges                   array of charges
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
396
       * @param bonded14Indices           each element contains the indices of two particles whose nonbonded interactions should be reduced since
Mark Friedrichs's avatar
Mark Friedrichs committed
397
       *                                  they form a bonded 1-4 pair
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
398
       * @param nonbondedParameters       the nonbonded force parameters (charge, sigma, epsilon) for each particle
Mark Friedrichs's avatar
Mark Friedrichs committed
399
400
401
402
403
       *
       * @return nonzero value if error
       *
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
404
      int addPairs( int *nbondeds, int *particles, BrookOpenMMFloat* params[], BrookOpenMMFloat* charges,
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
405
                    const std::vector<std::vector<int> >& bonded14Indices, const std::vector<std::vector<double> >& nonbondedParameters );
Mark Friedrichs's avatar
Mark Friedrichs committed
406
407
408
409
410
      
      /**
       * Create and load inverse maps for bonded ixns
       * 
       * @param nbondeds                  number of bonded entries
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
411
412
       * @param nparticles                    number of particles
       * @param particles                     arrays of particle indices (particles[numberOfBonds][4])
Mark Friedrichs's avatar
Mark Friedrichs committed
413
414
415
416
417
418
419
       * @param platform                  BrookPlatform reference
       * @param log                       log file reference (optional)
       *
       * @return nonzero value if error
       *
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
420
421
      //int loadInvMaps( int nbondeds, int nparticles, int *particles, const BrookPlatform& platform );
      int loadInvMaps( int nbondeds, int nparticles, int *particles, int particleStreamWidth, int particleStreamSize );
Mark Friedrichs's avatar
Mark Friedrichs committed
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
      
      /**
       * Validate inverse map count
       * 
       * @param index index to check (1-4) 
       * @param count count for index
       *
       * @return -1 if count invalid
       *
       * @tthrow OpenMMException exeception if count invalid
       *
       */

      int validateInverseMapStreamCount( int index, int count ) const;
      
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
437
438
439
440
      /*
       * Helper functions for building inverse maps for 
       * torsions, impropers and angles.
       * 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
441
       * For each particle, calculates the positions at which it's
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
442
443
444
       * forces are to be picked up from and stores the position
       * in the appropriate index.
       *
Mark Friedrichs's avatar
Mark Friedrichs committed
445
       * Input: number of torsions, the particle indices, and a flag indicating
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
446
       *        whether we're doing i(0), j(1), k(2) or l(3)
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
447
       * Output: an array of counts per particle
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
448
449
450
       *         arrays of inversemaps
       *         nimaps - the number of invmaps actually used.
       *
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
451
452
       * @param posflag       0-niparticles-1
       * @param niparticles       3 for angles, 4 for torsions, impropers
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
453
       * @param nints         number of interactions
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
454
455
       * @param nparticles        number of particles
       * @param *particles        gromacs interaction list
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
456
       * @param nmaps         maximum number of inverse maps
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
457
       * @param   counts[]    output counts of how many places each particle occurs
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
458
459
460
461
462
463
464
       * @param *invmaps[]    output array of nmaps inverse maps
       * @param *nimaps,      output max number of inverse maps actually used
       *
       * @return DefaultReturnValue, unless error in which case exits w/ OpenMM exception
       *
       **/
      
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
465
466
      int gpuCalcInvMap( int posflag, int niparticles, int nints, int nparticles,
                          int *particles, int nmaps, int counts[], float4 *invmaps[],
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
467
468
                          int *nimaps );
      
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
469
      void gpuPrintInvMaps( int nmaps, int nparticles, int counts[], float4 *invmap[], FILE* logFile );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
470
471
472
473
474
475
476
477
478
      
      /* We are still plagued by kernel call overheads. This is for a big fat
       * merged inverse gather kernel:
       * Since we have 32 bit floats, we have 23 bits of mantissa or the largest
       * integer we can represent is 2^23. So it should be quite safe to add 
       * 100000 * n to the index where n is the stream in which we should do the
       * lookup. This assumes that nints < 100000, preferably nints << 100000
       * which should always be true
       * */
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
479
      int gpuCalcInvMap_merged( int nints, int nparticles, int *particles, int nmaps, int counts[], float4 *invmaps[], int *nimaps );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
480
481
482
483
      
      /* Repacks the invmap streams for more efficient access in the
       * merged inverse gather kernel
       *
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
484
       * buf should be nimaps * nparticles large.
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
485
       * */
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
486
      int gpuRepackInvMap_merged( int nparticles, int nmaps, int *counts, float4 *invmaps[], float4 *buf );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
487
      
Mark Friedrichs's avatar
Mark Friedrichs committed
488
489
490
491
};

} // namespace OpenMM

Mark Friedrichs's avatar
Mark Friedrichs committed
492
#endif /* OPENMM_BROOK_BONDED_H_ */