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
using namespace OpenMM;
35
36
37

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

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

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

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

Mark Friedrichs's avatar
Mark Friedrichs committed
45
46
47
48
49
50
51
52
53
54
55
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) {
56

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

}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Mark Friedrichs's avatar
Mark Friedrichs committed
250
251
252
   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) 
253

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Mark Friedrichs's avatar
Mark Friedrichs committed
288
289
290
291
292
293
294
295
296
297
298
    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());
    }   
299

Mark Friedrichs's avatar
Mark Friedrichs committed
300
}
301

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

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

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

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

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

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

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

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

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

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

Mark Friedrichs's avatar
Mark Friedrichs committed
324
325
326
327
328
329
330
331
332
333
334
    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());
    }   
335
336
337

}

338
339
/**---------------------------------------------------------------------------------------

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Mark Friedrichs's avatar
Mark Friedrichs committed
374
375
376
377
      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.

378
      @param vectors    the vectors defining the periodic box
Mark Friedrichs's avatar
Mark Friedrichs committed
379
380

      --------------------------------------------------------------------------------------- */
381

382
void ObcParameters::setPeriodic(OpenMM::RealVec* vectors) {
383

384
    assert(_cutoff);
385

386
387
388
    assert(boxSize[0][0] >= 2.0*_cutoffDistance);
    assert(boxSize[1][1] >= 2.0*_cutoffDistance);
    assert(boxSize[2][2] >= 2.0*_cutoffDistance);
389

390
391
392
393
    _periodic           = true;
    _periodicBoxVectors[0] = vectors[0];
    _periodicBoxVectors[1] = vectors[1];
    _periodicBoxVectors[2] = vectors[2];
394
395
396
397
}

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

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

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

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

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

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

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

412
413
const OpenMM::RealVec* ObcParameters::getPeriodicBox() {
     return _periodicBoxVectors;
414
}