BrookBonded.h 17 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

/* -------------------------------------------------------------------------- *
 *                                   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.               *
 *                                                                            *
12
13
 * Portions copyright (c) 2009 Stanford University and the Authors.           *
 * Authors: Mark Friedrichs, Mike Houston                                     *
Mark Friedrichs's avatar
Mark Friedrichs committed
14
15
 * Contributors:                                                              *
 *                                                                            *
16
17
18
19
 * 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
20
 *                                                                            *
21
22
23
24
 * 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
25
 *                                                                            *
26
27
 * 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
28
29
30
31
 * -------------------------------------------------------------------------- */

#include <vector>

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
32
#include "BrookStreamImpl.h"
Mark Friedrichs's avatar
Mark Friedrichs committed
33
#include "BrookCommon.h"
34
#include "openmm/Context.h"
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
35
#include "BrookBondParameters.h"
Mark Friedrichs's avatar
Mark Friedrichs committed
36
37
38
39

namespace OpenMM {

/**
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
40
 * Calculate Brook bonded forces
Mark Friedrichs's avatar
Mark Friedrichs committed
41
42
43
44
45
 */
class BrookBonded : public BrookCommon {

   public:
  
Mark Friedrichs's avatar
Mark Friedrichs committed
46
47
48
49
50
51
      /** 
       *
       * BrookBonded constructor
       * 
       */
      
Mark Friedrichs's avatar
Mark Friedrichs committed
52
53
      BrookBonded( );
  
Mark Friedrichs's avatar
Mark Friedrichs committed
54
55
56
57
58
59
60
      /** 
       *
       * BrookBonded desstructor
       * 
       */
      
      ~BrookBonded( );
Mark Friedrichs's avatar
Mark Friedrichs committed
61
62
63
64
  
      /**
       * Initialize the kernel, setting up the values of all the force field parameters.
       * 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
65
66
67
68
69
70
71
72
       * @param numberOfParticles                   numberOfParticles
       * @param harmonicBondBrookBondParameters     force parameters (length, k) for each bond term
       * @param harmonicAngleBrookBondParameters    force parameters (angle, k) for each angle term
       * @param periodicTorsionBrookBondParameters  force parameters (k, phase, periodicity) for each periodic torsion term
       * @param rbTorsionBrookBondParameters        coefficients (in order of increasing powers) for each Ryckaert-Bellemans torsion term
       * @param nonBonded14ForceParameters          nonbonded 14 force parameters (charge, sigma, epsilon) for each particle
       * @param particleStreamWidth                 stream width
       * @param particleStreamSize                  stream size
Mark Friedrichs's avatar
Mark Friedrichs committed
73
74
75
76
77
       *
       * @return nonzero value if error
       *
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
78
79
80
81
82
      int setup( int numberOfParticles,
                 BrookBondParameters* harmonicBondBrookBondParameters,
                 BrookBondParameters* harmonicAngleBrookBondParameters,
                 BrookBondParameters* periodicTorsionBrookBondParameters,
                 BrookBondParameters* rbTorsionBrookBondParameters,
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
83
                 BrookBondParameters* nonBonded14ForceParameters,  int particleStreamWidth, int particleStreamSize );
Mark Friedrichs's avatar
Mark Friedrichs committed
84

Mark Friedrichs's avatar
Mark Friedrichs committed
85
86
87
88
89
90
91
92
93
      /**
       * Get inverse map stream width
       * 
       * @return stream width
       *
       */

      int getInverseMapStreamWidth( void ) const;
      
Mark Friedrichs's avatar
Mark Friedrichs committed
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
      /**
       * 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
130
131
132
133
134
135
136
137
138
139
140
      /**
       * 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
141
142
143
144
145
146
      /**
       * Return Brook stream handle
       * 
       * @return 
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
147
      BrookFloatStreamInternal* getBrookParticleIndices( void ) const; 
Mark Friedrichs's avatar
Mark Friedrichs committed
148
149
150
151
152
153
154
155
156
157
158

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

      /** 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
159
       * Get bonded particle indices stream
Mark Friedrichs's avatar
Mark Friedrichs committed
160
       * 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
161
       * @return  particle indices stream
Mark Friedrichs's avatar
Mark Friedrichs committed
162
163
164
       *
       */
      
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
165
      BrookFloatStreamInternal* getParticleIndicesStream( void ) const;
Mark Friedrichs's avatar
Mark Friedrichs committed
166
      
167
168
169
170
171
172
173
174
175
      /** 
       * Get bonded charge stream
       * 
       * @return  charge stream
       *
       */
      
      BrookFloatStreamInternal* getChargeStream( void ) const;
      
Mark Friedrichs's avatar
Mark Friedrichs committed
176
177
178
179
180
181
182
      /** 
       * Get array of bonded parameter streams
       * 
       * @return  array of bonded parameter streams
       *
       */
      
Mark Friedrichs's avatar
Mark Friedrichs committed
183
      BrookFloatStreamInternal** getBondedParameterStreams( void );
Mark Friedrichs's avatar
Mark Friedrichs committed
184
185
186
187
188
189
190
191
      
      /** 
       * Get array of force streams
       * 
       * @return  array
       *
       */
      
Mark Friedrichs's avatar
Mark Friedrichs committed
192
      BrookFloatStreamInternal** getBondedForceStreams( void );
Mark Friedrichs's avatar
Mark Friedrichs committed
193
194
195
196
197
198
199
200
201
202
      
      /** 
       * Get array of inverse map streams
       * 
       * @param index  array index 
       *
       * @return  array inverse map streams
       *
       */
      
Mark Friedrichs's avatar
Mark Friedrichs committed
203
      BrookFloatStreamInternal** getInverseStreamMapsStreams( int index );
Mark Friedrichs's avatar
Mark Friedrichs committed
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
      
      /** 
       * 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
247
      std::string getContentsString( int level = 0 ) const;
Mark Friedrichs's avatar
Mark Friedrichs committed
248

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
249
250
251
252
253
254
255
      /** 
       * Compute forces
       * 
       */
      
      void computeForces( BrookStreamImpl& positionStream, BrookStreamImpl& forceStream );
   
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
256
257
258
259
260
261
262
      /** 
       * Return SetupCompleted flag
       *
       * @return SetupCompleted flag
       */
      
      int isSetupCompleted( void ) const;
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
263
   
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
264
265
266
267
268
269
270
271
272
273
      /** 
       * Set SetupCompleted flag
       *
       * @param SetupCompleted flag
       *
       * @return SetupCompleted flag
       */
      
      int setupCompleted( int isSetupCompleted );
   
Mark Friedrichs's avatar
Mark Friedrichs committed
274
275
276
277
278
279
280
281
   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
282
283
      int _setupCompleted;

Mark Friedrichs's avatar
Mark Friedrichs committed
284
285
      // inverse map stream width

Mark Friedrichs's avatar
Mark Friedrichs committed
286
      int _inverseMapStreamWidth;
Mark Friedrichs's avatar
Mark Friedrichs committed
287
288
289
290
291
292
293
294
295
296
297

      // 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
298
      BrookFloatStreamInternal* _particleIndicesStream;
Mark Friedrichs's avatar
Mark Friedrichs committed
299
300
301
302
      BrookFloatStreamInternal* _bondedParameters[NumberOfParameterStreams];
      BrookFloatStreamInternal* _bondedForceStreams[NumberOfForceStreams];
      BrookFloatStreamInternal* _chargeStream;
      BrookFloatStreamInternal* _inverseStreamMaps[NumberOfForceStreams][MaxNumberOfInverseMaps];
Mark Friedrichs's avatar
Mark Friedrichs committed
303
304
305
306
307
308

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

      // helper methods in setup of parameters

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
309
310
311
312
313
314
      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
315
316

      /**
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
317
       * Setup Ryckaert-Bellemans parameters/particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
318
319
       * 
       * @param nbondeds                  number of bonded entries
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
320
       * @param particles                     array of particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
321
       * @param params                    arrays of bond parameters
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
322
       * @param rbTorsionIndices          the four particles connected by each Ryckaert-Bellemans torsion term
Mark Friedrichs's avatar
Mark Friedrichs committed
323
324
325
326
327
328
       * @param rbTorsionParameters       the coefficients (in order of increasing powers) for each Ryckaert-Bellemans torsion term
       *
       * @return nonzero value if error
       *
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
329
      int _addRBTorsions( int *nbondeds, int *particles, BrookOpenMMFloat* params[], const std::vector<std::vector<int> >& rbTorsionIndices,  
Mark Friedrichs's avatar
Mark Friedrichs committed
330
331
332
                          const std::vector<std::vector<double> >& rbTorsionParameters );

      /**
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
333
       * Setup periodic torsion parameters/particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
334
335
       * 
       * @param nbondeds                  number of bonded entries
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
336
       * @param particles                     array of particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
337
       * @param params                    arrays of bond parameters
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
338
       * @param periodicTorsionIndices    the four particles connected by each periodic torsion term
Mark Friedrichs's avatar
Mark Friedrichs committed
339
340
341
342
343
344
       * @param periodicTorsionParameters the force parameters (k, phase, periodicity) for each periodic torsion term
       *
       * @return nonzero value if error
       *
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
345
      int _addPTorsions( int *nbondeds, int *particles, BrookOpenMMFloat* params[], const std::vector<std::vector<int> >& periodicTorsionIndices,  
Mark Friedrichs's avatar
Mark Friedrichs committed
346
347
348
                          const std::vector<std::vector<double> >& periodicTorsionParameters );

      /**
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
349
       * Setup angle bond parameters/particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
350
351
       * 
       * @param nbondeds                  number of bonded entries
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
352
       * @param particles                     array of particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
353
       * @param params                    arrays of bond parameters
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
354
       * @param angleIndices              the angle bond particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
355
356
357
358
359
360
       * @param angleParameters           the angle parameters (angle in radians, force constant)
       *
       * @return nonzero value if error
       *
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
361
362
      int _addAngles( int *nbondeds, int *particles, BrookOpenMMFloat* params[], const std::vector<std::vector<int> >& angleIndices,
                      const std::vector<std::vector<double> >& angleParameters );
Mark Friedrichs's avatar
Mark Friedrichs committed
363
364

      /**
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
365
       * Setup harmonic bond parameters/particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
366
367
       * 
       * @param nbondeds                  number of bonded entries
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
368
       * @param particles                     array of particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
369
       * @param params                    arrays of bond parameters
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
370
       * @param bondIndices               two harmonic bond particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
371
372
373
374
375
376
       * @param bondParameters            the force parameters (distance, k)
       *
       * @return nonzero value if error
       *
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
377
378
      int  _addBonds( int *nbondeds, int *particles, BrookOpenMMFloat* params[], const std::vector<std::vector<int> >& bondIndices,
                     const std::vector<std::vector<double> >& bondParameters );
Mark Friedrichs's avatar
Mark Friedrichs committed
379
380

      /**
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
381
       * Setup LJ/Coulomb 1-4 parameters/particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
382
383
       * 
       * @param nbondeds                  number of bonded entries
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
384
       * @param particles                     array of particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
385
386
       * @param params                    arrays of bond parameters
       * @param charges                   array of charges
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
387
       * @param bonded14Indices           each element contains the indices of two particles whose nonbonded interactions should be reduced since
Mark Friedrichs's avatar
Mark Friedrichs committed
388
       *                                  they form a bonded 1-4 pair
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
389
       * @param nonbondedParameters       the nonbonded force parameters (charge, sigma, epsilon) for each particle
Mark Friedrichs's avatar
Mark Friedrichs committed
390
391
392
393
394
       *
       * @return nonzero value if error
       *
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
395
396
      int _addPairs( int *nbondeds, int *particles, BrookOpenMMFloat* params[], BrookOpenMMFloat* charges,
                     const std::vector<std::vector<int> >& bonded14Indices, const std::vector<std::vector<double> >& nonbondedParameters );
Mark Friedrichs's avatar
Mark Friedrichs committed
397
398
399
400
401
      
      /**
       * Create and load inverse maps for bonded ixns
       * 
       * @param nbondeds                  number of bonded entries
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
402
403
       * @param nparticles                    number of particles
       * @param particles                     arrays of particle indices (particles[numberOfBonds][4])
Mark Friedrichs's avatar
Mark Friedrichs committed
404
405
406
407
408
409
410
       * @param platform                  BrookPlatform reference
       * @param log                       log file reference (optional)
       *
       * @return nonzero value if error
       *
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
411
      //int loadInvMaps( int nbondeds, int nparticles, int *particles, const BrookPlatform& platform );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
412
      int _loadInvMaps( int nbondeds, int nparticles, int *particles, int particleStreamWidth, int particleStreamSize );
Mark Friedrichs's avatar
Mark Friedrichs committed
413
414
415
416
417
418
419
420
421
422
423
424
425
      
      /**
       * 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
       *
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
426
      int _validateInverseMapStreamCount( int index, int count ) const;
Mark Friedrichs's avatar
Mark Friedrichs committed
427
      
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
428
429
430
431
      /*
       * Helper functions for building inverse maps for 
       * torsions, impropers and angles.
       * 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
432
       * For each particle, calculates the positions at which it's
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
433
434
435
       * forces are to be picked up from and stores the position
       * in the appropriate index.
       *
Mark Friedrichs's avatar
Mark Friedrichs committed
436
       * Input: number of torsions, the particle indices, and a flag indicating
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
437
       *        whether we're doing i(0), j(1), k(2) or l(3)
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
438
       * Output: an array of counts per particle
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
439
440
441
       *         arrays of inversemaps
       *         nimaps - the number of invmaps actually used.
       *
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
442
443
       * @param posflag       0-niparticles-1
       * @param niparticles       3 for angles, 4 for torsions, impropers
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
444
       * @param nints         number of interactions
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
445
446
       * @param nparticles        number of particles
       * @param *particles        gromacs interaction list
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
447
       * @param nmaps         maximum number of inverse maps
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
448
       * @param   counts[]    output counts of how many places each particle occurs
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
449
450
451
452
453
454
455
       * @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
456
457
      int _gpuCalcInvMap( int posflag, int niparticles, int nints, int nparticles,
                          int *particles, int nmaps, int counts[], float4 *invmaps[], int *nimaps );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
458
      
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
459
      void _gpuPrintInvMaps( int nmaps, int nparticles, int counts[], float4 *invmap[], FILE* logFile );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
460
      
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
461
462
      /* 
       * We are still plagued by kernel call overheads. This is for a big fat
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
463
464
465
466
467
468
       * 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
469
470
471
       *
       **/
      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
472
      
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
473
474
      /* 
       * Repacks the invmap streams for more efficient access in the
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
475
476
       * merged inverse gather kernel
       *
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
477
       * buf should be nimaps * nparticles large.
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
478
479
480
       *
       **/
      int _gpuRepackInvMap_merged( int nparticles, int nmaps, int *counts, float4 *invmaps[], float4 *buf );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
481
      
Mark Friedrichs's avatar
Mark Friedrichs committed
482
483
484
485
};

} // namespace OpenMM

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