BrookBonded.h 19.1 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
88
89
       * @param lj14Scale                 the factor by which van der Waals interactions should be reduced for bonded 1-4 pairs
       * @param coulomb14Scale            the factor by which Coulomb interactions should be reduced for bonded 1-4 pairs
       * @param log                       log reference
       *
       * @return nonzero value if error
       *
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
90
/*
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
91
      int setup( int numberOfParticles, 
Mark Friedrichs's avatar
Mark Friedrichs committed
92
93
94
95
96
                 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
Mark Friedrichs committed
97
                 double lj14Scale, double coulomb14Scale, const Platform& platform );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
98
99
100
101
102
103
104
105
*/

      int setup( int numberOfParticles,
                 BrookBondParameters* harmonicBondBrookBondParameters,
                 BrookBondParameters* harmonicAngleBrookBondParameters,
                 BrookBondParameters* periodicTorsionBrookBondParameters,
                 BrookBondParameters* rbTorsionBrookBondParameters,
                 BrookBondParameters* nonBonded14ForceParameters,  double lj14Scale, double coulombScale, int particleStreamWidth, int particleStreamSize );
Mark Friedrichs's avatar
Mark Friedrichs committed
106

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

      int getInverseMapStreamWidth( void ) const;
      
Mark Friedrichs's avatar
Mark Friedrichs committed
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
150
151
      /**
       * 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
152
153
154
155
156
157
158
159
160
161
162
      /**
       * 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
163
164
165
166
167
168
      /**
       * Return Brook stream handle
       * 
       * @return 
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
169
      BrookFloatStreamInternal* getBrookParticleIndices( void ) const; 
Mark Friedrichs's avatar
Mark Friedrichs committed
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189

      /**
       * Get LJ 14 scale factor
       *
       * @return  LJ 14 scaling (fudge) factor
       * 
       */

       BrookOpenMMFloat getLJ_14Scale( void ) const;

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

      /** 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
190
       * Get bonded particle indices stream
Mark Friedrichs's avatar
Mark Friedrichs committed
191
       * 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
192
       * @return  particle indices stream
Mark Friedrichs's avatar
Mark Friedrichs committed
193
194
195
       *
       */
      
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
196
      BrookFloatStreamInternal* getParticleIndicesStream( void ) const;
Mark Friedrichs's avatar
Mark Friedrichs committed
197
      
198
199
200
201
202
203
204
205
206
      /** 
       * Get bonded charge stream
       * 
       * @return  charge stream
       *
       */
      
      BrookFloatStreamInternal* getChargeStream( void ) const;
      
Mark Friedrichs's avatar
Mark Friedrichs committed
207
208
209
210
211
212
213
      /** 
       * Get array of bonded parameter streams
       * 
       * @return  array of bonded parameter streams
       *
       */
      
Mark Friedrichs's avatar
Mark Friedrichs committed
214
      BrookFloatStreamInternal** getBondedParameterStreams( void );
Mark Friedrichs's avatar
Mark Friedrichs committed
215
216
217
218
219
220
221
222
      
      /** 
       * Get array of force streams
       * 
       * @return  array
       *
       */
      
Mark Friedrichs's avatar
Mark Friedrichs committed
223
      BrookFloatStreamInternal** getBondedForceStreams( void );
Mark Friedrichs's avatar
Mark Friedrichs committed
224
225
226
227
228
229
230
231
232
233
      
      /** 
       * Get array of inverse map streams
       * 
       * @param index  array index 
       *
       * @return  array inverse map streams
       *
       */
      
Mark Friedrichs's avatar
Mark Friedrichs committed
234
      BrookFloatStreamInternal** getInverseStreamMapsStreams( int index );
Mark Friedrichs's avatar
Mark Friedrichs committed
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
267
268
269
270
271
272
273
274
275
276
277
      
      /** 
       * 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
278
      std::string getContentsString( int level = 0 ) const;
Mark Friedrichs's avatar
Mark Friedrichs committed
279

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
280
281
282
283
284
285
286
      /** 
       * Compute forces
       * 
       */
      
      void computeForces( BrookStreamImpl& positionStream, BrookStreamImpl& forceStream );
   
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
287
288
289
290
291
292
293
      /** 
       * Return SetupCompleted flag
       *
       * @return SetupCompleted flag
       */
      
      int isSetupCompleted( void ) const;
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
294
   
Mark Friedrichs's avatar
Mark Friedrichs committed
295
296
297
298
299
300
301
302
   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
303
304
      int _setupCompleted;

Mark Friedrichs's avatar
Mark Friedrichs committed
305
306
      // inverse map stream width

Mark Friedrichs's avatar
Mark Friedrichs committed
307
      int _inverseMapStreamWidth;
Mark Friedrichs's avatar
Mark Friedrichs committed
308
309
310
311
312
313
314
315
316
317
318
319

      // actual max number of inverse maps 

      int _maxNumberOfInverseMaps;

      // scale factors for 1-4 ixn

      BrookOpenMMFloat _ljScale;
      BrookOpenMMFloat _coulombFactor;

      // streams

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
320
      BrookFloatStreamInternal* _particleIndicesStream;
Mark Friedrichs's avatar
Mark Friedrichs committed
321
322
323
324
      BrookFloatStreamInternal* _bondedParameters[NumberOfParameterStreams];
      BrookFloatStreamInternal* _bondedForceStreams[NumberOfForceStreams];
      BrookFloatStreamInternal* _chargeStream;
      BrookFloatStreamInternal* _inverseStreamMaps[NumberOfForceStreams][MaxNumberOfInverseMaps];
Mark Friedrichs's avatar
Mark Friedrichs committed
325
326
327
328
329
330

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

      // helper methods in setup of parameters

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
331
332
333
334
335
      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
336
337

      /**
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
338
       * Setup Ryckaert-Bellemans parameters/particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
339
340
       * 
       * @param nbondeds                  number of bonded entries
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
341
       * @param particles                     array of particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
342
       * @param params                    arrays of bond parameters
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
343
       * @param rbTorsionIndices          the four particles connected by each Ryckaert-Bellemans torsion term
Mark Friedrichs's avatar
Mark Friedrichs committed
344
345
346
347
348
349
       * @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
350
      int addRBTorsions( int *nbondeds, int *particles, BrookOpenMMFloat* params[], const std::vector<std::vector<int> >& rbTorsionIndices,  
Mark Friedrichs's avatar
Mark Friedrichs committed
351
352
353
                          const std::vector<std::vector<double> >& rbTorsionParameters );

      /**
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
354
       * Setup periodic torsion parameters/particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
355
356
       * 
       * @param nbondeds                  number of bonded entries
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
357
       * @param particles                     array of particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
358
       * @param params                    arrays of bond parameters
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
359
       * @param periodicTorsionIndices    the four particles connected by each periodic torsion term
Mark Friedrichs's avatar
Mark Friedrichs committed
360
361
362
363
364
365
       * @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
366
      int addPTorsions( int *nbondeds, int *particles, BrookOpenMMFloat* params[], const std::vector<std::vector<int> >& periodicTorsionIndices,  
Mark Friedrichs's avatar
Mark Friedrichs committed
367
368
369
                          const std::vector<std::vector<double> >& periodicTorsionParameters );

      /**
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
370
       * Setup angle bond parameters/particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
371
372
       * 
       * @param nbondeds                  number of bonded entries
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
373
       * @param particles                     array of particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
374
       * @param params                    arrays of bond parameters
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
375
       * @param angleIndices              the angle bond particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
376
377
378
379
380
381
       * @param angleParameters           the angle parameters (angle in radians, force constant)
       *
       * @return nonzero value if error
       *
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
382
      int addAngles( int *nbondeds, int *particles, BrookOpenMMFloat* params[], const std::vector<std::vector<int> >& angleIndices,
Mark Friedrichs's avatar
Mark Friedrichs committed
383
384
385
                     const std::vector<std::vector<double> >& angleParameters );

      /**
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
386
       * Setup harmonic bond parameters/particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
387
388
       * 
       * @param nbondeds                  number of bonded entries
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
389
       * @param particles                     array of particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
390
       * @param params                    arrays of bond parameters
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
391
       * @param bondIndices               two harmonic bond particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
392
393
394
395
396
397
       * @param bondParameters            the force parameters (distance, k)
       *
       * @return nonzero value if error
       *
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
398
      int addBonds( int *nbondeds, int *particles, BrookOpenMMFloat* params[], const std::vector<std::vector<int> >& bondIndices,
Mark Friedrichs's avatar
Mark Friedrichs committed
399
400
401
                    const std::vector<std::vector<double> >& bondParameters );

      /**
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
402
       * Setup LJ/Coulomb 1-4 parameters/particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
403
404
       * 
       * @param nbondeds                  number of bonded entries
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
405
       * @param particles                     array of particle indices
Mark Friedrichs's avatar
Mark Friedrichs committed
406
407
       * @param params                    arrays of bond parameters
       * @param charges                   array of charges
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
408
       * @param bonded14Indices           each element contains the indices of two particles whose nonbonded interactions should be reduced since
Mark Friedrichs's avatar
Mark Friedrichs committed
409
       *                                  they form a bonded 1-4 pair
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
410
       * @param nonbondedParameters       the nonbonded force parameters (charge, sigma, epsilon) for each particle
Mark Friedrichs's avatar
Mark Friedrichs committed
411
412
413
414
415
416
       * @param lj14Scale                 the factor by which van der Waals interactions should be reduced for bonded 1-4 pairs
       *
       * @return nonzero value if error
       *
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
417
      int addPairs( int *nbondeds, int *particles, BrookOpenMMFloat* params[], BrookOpenMMFloat* charges,
Mark Friedrichs's avatar
Mark Friedrichs committed
418
419
420
421
422
423
424
                    const std::vector<std::vector<int> >& bonded14Indices, const std::vector<std::vector<double> >& nonbondedParameters,
                    double lj14Scale, double coulombScale );
      
      /**
       * Create and load inverse maps for bonded ixns
       * 
       * @param nbondeds                  number of bonded entries
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
425
426
       * @param nparticles                    number of particles
       * @param particles                     arrays of particle indices (particles[numberOfBonds][4])
Mark Friedrichs's avatar
Mark Friedrichs committed
427
428
429
430
431
432
433
       * @param platform                  BrookPlatform reference
       * @param log                       log file reference (optional)
       *
       * @return nonzero value if error
       *
       */

Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
434
435
      //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
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
      
      /**
       * 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
451
452
453
454
      /*
       * Helper functions for building inverse maps for 
       * torsions, impropers and angles.
       * 
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
455
       * For each particle, calculates the positions at which it's
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
456
457
458
       * forces are to be picked up from and stores the position
       * in the appropriate index.
       *
Mark Friedrichs's avatar
Mark Friedrichs committed
459
       * Input: number of torsions, the particle indices, and a flag indicating
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
460
       *        whether we're doing i(0), j(1), k(2) or l(3)
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
461
       * Output: an array of counts per particle
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
462
463
464
       *         arrays of inversemaps
       *         nimaps - the number of invmaps actually used.
       *
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
465
466
       * @param posflag       0-niparticles-1
       * @param niparticles       3 for angles, 4 for torsions, impropers
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
467
       * @param nints         number of interactions
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
468
469
       * @param nparticles        number of particles
       * @param *particles        gromacs interaction list
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
470
       * @param nmaps         maximum number of inverse maps
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
471
       * @param   counts[]    output counts of how many places each particle occurs
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
472
473
474
475
476
477
478
       * @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
479
480
      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
481
482
                          int *nimaps );
      
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
483
      void gpuPrintInvMaps( int nmaps, int nparticles, int counts[], float4 *invmap[], FILE* logFile );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
484
485
486
487
488
489
490
491
492
      
      /* 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
493
      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
494
495
496
497
      
      /* Repacks the invmap streams for more efficient access in the
       * merged inverse gather kernel
       *
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
498
       * buf should be nimaps * nparticles large.
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
499
       * */
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
500
      int gpuRepackInvMap_merged( int nparticles, int nmaps, int *counts, float4 *invmaps[], float4 *buf );
Mark Friedrichs's avatar
Mods  
Mark Friedrichs committed
501
      
Mark Friedrichs's avatar
Mark Friedrichs committed
502
503
504
505
};

} // namespace OpenMM

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