ObcParameters.cpp 12.9 KB
Newer Older
1

2
/* Portions copyright (c) 2006-2009 Stanford University and Simbios.
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 * Contributors: Pande Group
 *
 * 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 <math.h>
#include <sstream>
27
#include <string.h>
28

Mark Friedrichs's avatar
Mark Friedrichs committed
29
#include "openmm/OpenMMException.h"
30
#include "ObcParameters.h"
31
#include "SimTKOpenMMCommon.h"
32

33
using std::vector;
34
35
36

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
37
    ObcParameters constructor 
38

Mark Friedrichs's avatar
Mark Friedrichs committed
39
40
    @param numberOfAtoms       number of atoms
    @param obcType             OBC type (Eq. 7 or 8 in paper)
41

Mark Friedrichs's avatar
Mark Friedrichs committed
42
    --------------------------------------------------------------------------------------- */
43

Mark Friedrichs's avatar
Mark Friedrichs committed
44
45
46
47
48
49
50
51
52
53
54
ObcParameters::ObcParameters( int numberOfAtoms, ObcParameters::ObcType obcType ) :
                               _numberOfAtoms(numberOfAtoms),
                               _solventDielectric( 78.3 ),
                               _soluteDielectric( 1.0 ),
                               _electricConstant(-0.5*ONE_4PI_EPS0),
                               _probeRadius(0.14),
                               _pi4Asolv( 28.3919551),
                               _dielectricOffset( 0.009 ),
                               _obcType( obcType ),
                               _cutoff(false),
                               _periodic(false) {
55

Mark Friedrichs's avatar
Mark Friedrichs committed
56
57
58
    _atomicRadii.resize( numberOfAtoms );
    _scaledRadiusFactors.resize( numberOfAtoms );
    setObcTypeParameters( obcType );
59
60
61
62
63

}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
64
    ObcParameters destructor 
65

Mark Friedrichs's avatar
Mark Friedrichs committed
66
    --------------------------------------------------------------------------------------- */
67
68

ObcParameters::~ObcParameters( ){
Mark Friedrichs's avatar
Mark Friedrichs committed
69
}
70

Mark Friedrichs's avatar
Mark Friedrichs committed
71
/**---------------------------------------------------------------------------------------
72

Mark Friedrichs's avatar
Mark Friedrichs committed
73
   Get number of atoms
74

Mark Friedrichs's avatar
Mark Friedrichs committed
75
   @return number of atoms
76

Mark Friedrichs's avatar
Mark Friedrichs committed
77
   --------------------------------------------------------------------------------------- */
78

Mark Friedrichs's avatar
Mark Friedrichs committed
79
80
int ObcParameters::getNumberOfAtoms( void ) const {
    return _numberOfAtoms;
81
82
83
84
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
85
    Get OBC type
86

Mark Friedrichs's avatar
Mark Friedrichs committed
87
    @return OBC type
88

Mark Friedrichs's avatar
Mark Friedrichs committed
89
    --------------------------------------------------------------------------------------- */
90
91

ObcParameters::ObcType ObcParameters::getObcType( void ) const {
Mark Friedrichs's avatar
Mark Friedrichs committed
92
    return _obcType;
93
94
95
96
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
97
    Set OBC type specific parameters
98

Mark Friedrichs's avatar
Mark Friedrichs committed
99
    @param obcType OBC type (ObcTypeI or ObcTypeII -- Eq. 7 or 8)
100

Mark Friedrichs's avatar
Mark Friedrichs committed
101
    --------------------------------------------------------------------------------------- */
102

103
void ObcParameters::setObcTypeParameters( ObcParameters::ObcType obcType ){
Mark Friedrichs's avatar
Mark Friedrichs committed
104
105
106
107
108
109
110
111
112
113
    if( obcType == ObcTypeI ){
        _alphaObc   = 0.8f;
        _betaObc    = 0.0f;
        _gammaObc   = 2.91f;
    } else {
        _alphaObc   = 1.0f;
        _betaObc    = 0.8f;
        _gammaObc   = 4.85f;
    }
    _obcType = obcType;
114
115
116
117
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
118
    Get dielectricOffset
119

Mark Friedrichs's avatar
Mark Friedrichs committed
120
    @return _dielectricOffset
121

Mark Friedrichs's avatar
Mark Friedrichs committed
122
    --------------------------------------------------------------------------------------- */
123
124

RealOpenMM ObcParameters::getDielectricOffset( void ) const {
Mark Friedrichs's avatar
Mark Friedrichs committed
125
    return _dielectricOffset;
126
127
128
129
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
130
    Get alpha OBC (Eqs. 6 & 7) in Proteins paper
131

Mark Friedrichs's avatar
Mark Friedrichs committed
132
    @return alphaObc
133

Mark Friedrichs's avatar
Mark Friedrichs committed
134
    --------------------------------------------------------------------------------------- */
135
136

RealOpenMM ObcParameters::getAlphaObc( void ) const {
Mark Friedrichs's avatar
Mark Friedrichs committed
137
    return _alphaObc;
138
139
140
141
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
142
    Get beta OBC (Eqs. 6 & 7) in Proteins paper
143

Mark Friedrichs's avatar
Mark Friedrichs committed
144
    @return betaObc
145

Mark Friedrichs's avatar
Mark Friedrichs committed
146
    --------------------------------------------------------------------------------------- */
147
148

RealOpenMM ObcParameters::getBetaObc( void ) const {
Mark Friedrichs's avatar
Mark Friedrichs committed
149
    return _betaObc;
150
151
152
153
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
154
    Get gamma OBC (Eqs. 6 & 7) in Proteins paper
155

Mark Friedrichs's avatar
Mark Friedrichs committed
156
    @return gammaObc
157

Mark Friedrichs's avatar
Mark Friedrichs committed
158
    --------------------------------------------------------------------------------------- */
159
160

RealOpenMM ObcParameters::getGammaObc( void ) const {
Mark Friedrichs's avatar
Mark Friedrichs committed
161
    return _gammaObc;
162
163
164
165
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
166
   Get solvent dielectric
167

Mark Friedrichs's avatar
Mark Friedrichs committed
168
   @return solvent dielectric
169
170
171

   --------------------------------------------------------------------------------------- */

Mark Friedrichs's avatar
Mark Friedrichs committed
172
173
RealOpenMM ObcParameters::getSolventDielectric( void ) const {
    return _solventDielectric;
174
175
176
177
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
178
   Set solvent dielectric
179

Mark Friedrichs's avatar
Mark Friedrichs committed
180
   @param solventDielectric solvent dielectric
181
182
183

   --------------------------------------------------------------------------------------- */

Mark Friedrichs's avatar
Mark Friedrichs committed
184
185
void ObcParameters::setSolventDielectric( RealOpenMM solventDielectric ){
    _solventDielectric = solventDielectric;
186
187
188
}
/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
189
   Get solute dielectric
190

Mark Friedrichs's avatar
Mark Friedrichs committed
191
   @return soluteDielectric
192
193
194

   --------------------------------------------------------------------------------------- */

Mark Friedrichs's avatar
Mark Friedrichs committed
195
196
RealOpenMM ObcParameters::getSoluteDielectric( void ) const {
    return _soluteDielectric;
197
198
199
200
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
201
   Set solute dielectric
202

Mark Friedrichs's avatar
Mark Friedrichs committed
203
   @param soluteDielectric solute dielectric
204
205
206

   --------------------------------------------------------------------------------------- */

Mark Friedrichs's avatar
Mark Friedrichs committed
207
208
void ObcParameters::setSoluteDielectric( RealOpenMM soluteDielectric ){
    _soluteDielectric = soluteDielectric;
209
210
211
212
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
213
   Get electric constant 
214

Mark Friedrichs's avatar
Mark Friedrichs committed
215
   @return electricConstant
216
217
218

   --------------------------------------------------------------------------------------- */

Mark Friedrichs's avatar
Mark Friedrichs committed
219
220
RealOpenMM ObcParameters::getElectricConstant( void ) const {
    return _electricConstant;
221
222
223
224
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
225
   Get probe radius 
226

Mark Friedrichs's avatar
Mark Friedrichs committed
227
   @return probeRadius
228
229
230

   --------------------------------------------------------------------------------------- */

Mark Friedrichs's avatar
Mark Friedrichs committed
231
232
RealOpenMM ObcParameters::getProbeRadius( void ) const {
    return _probeRadius;
233
234
235
236
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
237
   Set probe radius  
238

Mark Friedrichs's avatar
Mark Friedrichs committed
239
   @param probeRadius   probe radius
240
241
242

   --------------------------------------------------------------------------------------- */

Mark Friedrichs's avatar
Mark Friedrichs committed
243
244
void ObcParameters::setProbeRadius( RealOpenMM probeRadius ){
    _probeRadius = probeRadius;
245
246
247
248
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
249
250
251
   Get pi*4*Asolv:  used in ACE approximation for nonpolar term  
         ((RealOpenMM) M_PI)*4.0f*0.0049*1000.0; (Still) 
         ((RealOpenMM) M_PI)*4.0f*0.0054*1000.0; (OBC) 
252

Mark Friedrichs's avatar
Mark Friedrichs committed
253
   @return pi4Asolv
254
255
256

   --------------------------------------------------------------------------------------- */

Mark Friedrichs's avatar
Mark Friedrichs committed
257
258
259
RealOpenMM ObcParameters::getPi4Asolv( void ) const {
    return _pi4Asolv;
}
260

261
262
263
void ObcParameters::setPi4Asolv(RealOpenMM pi4Asolv) {
    _pi4Asolv = pi4Asolv;
}
264

Mark Friedrichs's avatar
Mark Friedrichs committed
265
/**---------------------------------------------------------------------------------------
266

Mark Friedrichs's avatar
Mark Friedrichs committed
267
    Get AtomicRadii array
268

Mark Friedrichs's avatar
Mark Friedrichs committed
269
    @return array of atomic radii
270

Mark Friedrichs's avatar
Mark Friedrichs committed
271
    --------------------------------------------------------------------------------------- */
272

Mark Friedrichs's avatar
Mark Friedrichs committed
273
274
275
const RealOpenMMVector& ObcParameters::getAtomicRadii( void ) const {
    return _atomicRadii;
}
276

Mark Friedrichs's avatar
Mark Friedrichs committed
277
/**---------------------------------------------------------------------------------------
278

Mark Friedrichs's avatar
Mark Friedrichs committed
279
    Set AtomicRadii array
280

Mark Friedrichs's avatar
Mark Friedrichs committed
281
    @param atomicRadii vector of atomic radii
282

Mark Friedrichs's avatar
Mark Friedrichs committed
283
    --------------------------------------------------------------------------------------- */
284

Mark Friedrichs's avatar
Mark Friedrichs committed
285
void ObcParameters::setAtomicRadii( const RealOpenMMVector& atomicRadii ){
286

Mark Friedrichs's avatar
Mark Friedrichs committed
287
288
289
290
291
292
293
294
295
296
297
    if( atomicRadii.size() == _atomicRadii.size() ){
        for( unsigned int ii = 0; ii < atomicRadii.size(); ii++ ){
            _atomicRadii[ii] = atomicRadii[ii];
        }   
    } else {
        std::stringstream msg;
        msg << "ObcParameters: input size for atomic radii does not agree w/ current size: input=";
        msg << atomicRadii.size();
        msg << " current size=" << _atomicRadii.size();
        throw OpenMM::OpenMMException(msg.str());
    }   
298

Mark Friedrichs's avatar
Mark Friedrichs committed
299
}
300

Mark Friedrichs's avatar
Mark Friedrichs committed
301
/**---------------------------------------------------------------------------------------
302

Mark Friedrichs's avatar
Mark Friedrichs committed
303
    Return OBC scale factors
304

Mark Friedrichs's avatar
Mark Friedrichs committed
305
    @return array 
306

Mark Friedrichs's avatar
Mark Friedrichs committed
307
    --------------------------------------------------------------------------------------- */
308

Mark Friedrichs's avatar
Mark Friedrichs committed
309
310
const RealOpenMMVector& ObcParameters::getScaledRadiusFactors( void ) const {
    return _scaledRadiusFactors;
311
312
313
314
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
315
    Set OBC scale factors
316

Mark Friedrichs's avatar
Mark Friedrichs committed
317
    @param scaledRadiusFactors  scaledRadiusFactors
318

Mark Friedrichs's avatar
Mark Friedrichs committed
319
    --------------------------------------------------------------------------------------- */
320

Mark Friedrichs's avatar
Mark Friedrichs committed
321
void ObcParameters::setScaledRadiusFactors( const RealOpenMMVector& scaledRadiusFactors ){
322

Mark Friedrichs's avatar
Mark Friedrichs committed
323
324
325
326
327
328
329
330
331
332
333
    if( scaledRadiusFactors.size() == _scaledRadiusFactors.size() ){
        for( unsigned int ii = 0; ii < scaledRadiusFactors.size(); ii++ ){
            _scaledRadiusFactors[ii] = scaledRadiusFactors[ii];
        }   
    } else {
        std::stringstream msg;
        msg << "ObcParameters: input size for scaled radius factors does not agree w/ current size: input=";
        msg << scaledRadiusFactors.size();
        msg << " current size=" << _scaledRadiusFactors.size();
        throw OpenMM::OpenMMException(msg.str());
    }   
334
335
336

}

337
338
/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
339
      Set the force to use a cutoff.
340

Mark Friedrichs's avatar
Mark Friedrichs committed
341
      @param distance            the cutoff distance
342

Mark Friedrichs's avatar
Mark Friedrichs committed
343
      --------------------------------------------------------------------------------------- */
344

345
void ObcParameters::setUseCutoff( RealOpenMM distance ) {
346

Mark Friedrichs's avatar
Mark Friedrichs committed
347
348
     _cutoff         = true;
     _cutoffDistance = distance;
349
350
351
352
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
353
      Get whether to use a cutoff.
354

Mark Friedrichs's avatar
Mark Friedrichs committed
355
      --------------------------------------------------------------------------------------- */
356

357
bool ObcParameters::getUseCutoff() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
358
     return _cutoff;
359
360
361
362
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
363
      Get the cutoff distance.
364

Mark Friedrichs's avatar
Mark Friedrichs committed
365
      --------------------------------------------------------------------------------------- */
366

367
RealOpenMM ObcParameters::getCutoffDistance() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
368
     return _cutoffDistance;
369
370
371
372
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
373
374
375
376
377
378
379
      Set the force to use periodic boundary conditions.  This requires that a cutoff has
      also been set, and the smallest side of the periodic box is at least twice the cutoff
      distance.

      @param boxSize             the X, Y, and Z widths of the periodic box

      --------------------------------------------------------------------------------------- */
380

Mark Friedrichs's avatar
Mark Friedrichs committed
381
void ObcParameters::setPeriodic( const OpenMM::RealVec& boxSize ) {
382

Mark Friedrichs's avatar
Mark Friedrichs committed
383
     assert(_cutoff);
384

Mark Friedrichs's avatar
Mark Friedrichs committed
385
386
387
     assert(boxSize[0] >= 2.0*_cutoffDistance);
     assert(boxSize[1] >= 2.0*_cutoffDistance);
     assert(boxSize[2] >= 2.0*_cutoffDistance);
388

Mark Friedrichs's avatar
Mark Friedrichs committed
389
390
391
392
     _periodic           = true;
     _periodicBoxSize[0] = boxSize[0];
     _periodicBoxSize[1] = boxSize[1];
     _periodicBoxSize[2] = boxSize[2];
393
394
395
396
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
397
      Get whether to use periodic boundary conditions.
398

Mark Friedrichs's avatar
Mark Friedrichs committed
399
      --------------------------------------------------------------------------------------- */
400
401

bool ObcParameters::getPeriodic() {
Mark Friedrichs's avatar
Mark Friedrichs committed
402
     return _periodic;
403
404
405
406
}

/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
407
      Get the periodic box dimension
408

Mark Friedrichs's avatar
Mark Friedrichs committed
409
      --------------------------------------------------------------------------------------- */
410
411

const RealOpenMM* ObcParameters::getPeriodicBox() {
Mark Friedrichs's avatar
Mark Friedrichs committed
412
     return _periodicBoxSize;
413
}