ObcParameters.cpp 12.8 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


Mark Friedrichs's avatar
Mark Friedrichs committed
262
/**---------------------------------------------------------------------------------------
263

Mark Friedrichs's avatar
Mark Friedrichs committed
264
    Get AtomicRadii array
265

Mark Friedrichs's avatar
Mark Friedrichs committed
266
    @return array of atomic radii
267

Mark Friedrichs's avatar
Mark Friedrichs committed
268
    --------------------------------------------------------------------------------------- */
269

Mark Friedrichs's avatar
Mark Friedrichs committed
270
271
272
const RealOpenMMVector& ObcParameters::getAtomicRadii( void ) const {
    return _atomicRadii;
}
273

Mark Friedrichs's avatar
Mark Friedrichs committed
274
/**---------------------------------------------------------------------------------------
275

Mark Friedrichs's avatar
Mark Friedrichs committed
276
    Set AtomicRadii array
277

Mark Friedrichs's avatar
Mark Friedrichs committed
278
    @param atomicRadii vector of atomic radii
279

Mark Friedrichs's avatar
Mark Friedrichs committed
280
    --------------------------------------------------------------------------------------- */
281

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

Mark Friedrichs's avatar
Mark Friedrichs committed
284
285
286
287
288
289
290
291
292
293
294
    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());
    }   
295

Mark Friedrichs's avatar
Mark Friedrichs committed
296
}
297

Mark Friedrichs's avatar
Mark Friedrichs committed
298
/**---------------------------------------------------------------------------------------
299

Mark Friedrichs's avatar
Mark Friedrichs committed
300
    Return OBC scale factors
301

Mark Friedrichs's avatar
Mark Friedrichs committed
302
    @return array 
303

Mark Friedrichs's avatar
Mark Friedrichs committed
304
    --------------------------------------------------------------------------------------- */
305

Mark Friedrichs's avatar
Mark Friedrichs committed
306
307
const RealOpenMMVector& ObcParameters::getScaledRadiusFactors( void ) const {
    return _scaledRadiusFactors;
308
309
310
311
}

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

Mark Friedrichs's avatar
Mark Friedrichs committed
312
    Set OBC scale factors
313

Mark Friedrichs's avatar
Mark Friedrichs committed
314
    @param scaledRadiusFactors  scaledRadiusFactors
315

Mark Friedrichs's avatar
Mark Friedrichs committed
316
    --------------------------------------------------------------------------------------- */
317

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

Mark Friedrichs's avatar
Mark Friedrichs committed
320
321
322
323
324
325
326
327
328
329
330
    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());
    }   
331
332
333

}

334
335
/**---------------------------------------------------------------------------------------

Mark Friedrichs's avatar
Mark Friedrichs committed
336
      Set the force to use a cutoff.
337

Mark Friedrichs's avatar
Mark Friedrichs committed
338
      @param distance            the cutoff distance
339

Mark Friedrichs's avatar
Mark Friedrichs committed
340
      --------------------------------------------------------------------------------------- */
341

342
void ObcParameters::setUseCutoff( RealOpenMM distance ) {
343

Mark Friedrichs's avatar
Mark Friedrichs committed
344
345
     _cutoff         = true;
     _cutoffDistance = distance;
346
347
348
349
}

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

Mark Friedrichs's avatar
Mark Friedrichs committed
350
      Get whether to use a cutoff.
351

Mark Friedrichs's avatar
Mark Friedrichs committed
352
      --------------------------------------------------------------------------------------- */
353

354
bool ObcParameters::getUseCutoff() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
355
     return _cutoff;
356
357
358
359
}

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

Mark Friedrichs's avatar
Mark Friedrichs committed
360
      Get the cutoff distance.
361

Mark Friedrichs's avatar
Mark Friedrichs committed
362
      --------------------------------------------------------------------------------------- */
363

364
RealOpenMM ObcParameters::getCutoffDistance() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
365
     return _cutoffDistance;
366
367
368
369
}

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

Mark Friedrichs's avatar
Mark Friedrichs committed
370
371
372
373
374
375
376
      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

      --------------------------------------------------------------------------------------- */
377

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

Mark Friedrichs's avatar
Mark Friedrichs committed
380
     assert(_cutoff);
381

Mark Friedrichs's avatar
Mark Friedrichs committed
382
383
384
     assert(boxSize[0] >= 2.0*_cutoffDistance);
     assert(boxSize[1] >= 2.0*_cutoffDistance);
     assert(boxSize[2] >= 2.0*_cutoffDistance);
385

Mark Friedrichs's avatar
Mark Friedrichs committed
386
387
388
389
     _periodic           = true;
     _periodicBoxSize[0] = boxSize[0];
     _periodicBoxSize[1] = boxSize[1];
     _periodicBoxSize[2] = boxSize[2];
390
391
392
393
}

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

Mark Friedrichs's avatar
Mark Friedrichs committed
394
      Get whether to use periodic boundary conditions.
395

Mark Friedrichs's avatar
Mark Friedrichs committed
396
      --------------------------------------------------------------------------------------- */
397
398

bool ObcParameters::getPeriodic() {
Mark Friedrichs's avatar
Mark Friedrichs committed
399
     return _periodic;
400
401
402
403
}

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

Mark Friedrichs's avatar
Mark Friedrichs committed
404
      Get the periodic box dimension
405

Mark Friedrichs's avatar
Mark Friedrichs committed
406
      --------------------------------------------------------------------------------------- */
407
408

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