"platforms/vscode:/vscode.git/clone" did not exist on "b66af9aa0d8c614f6fe0d3d2244cc5906bf21c1d"
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
31
#include "ObcParameters.h"

32
using std::vector;
33
using namespace OpenMM;
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

44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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) {

    _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

79
int ObcParameters::getNumberOfAtoms() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
80
    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() 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
104
void ObcParameters::setObcTypeParameters(ObcParameters::ObcType obcType) {
    if (obcType == ObcTypeI) {
Mark Friedrichs's avatar
Mark Friedrichs committed
105
106
107
108
109
110
111
112
113
        _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() 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() 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() 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() 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

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

172
RealOpenMM ObcParameters::getSolventDielectric() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
173
    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

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

184
void ObcParameters::setSolventDielectric(RealOpenMM solventDielectric) {
Mark Friedrichs's avatar
Mark Friedrichs committed
185
    _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

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

195
RealOpenMM ObcParameters::getSoluteDielectric() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
196
    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

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

207
void ObcParameters::setSoluteDielectric(RealOpenMM soluteDielectric) {
Mark Friedrichs's avatar
Mark Friedrichs committed
208
    _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

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

219
RealOpenMM ObcParameters::getElectricConstant() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
220
    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

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

231
RealOpenMM ObcParameters::getProbeRadius() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
232
    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

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

243
void ObcParameters::setProbeRadius(RealOpenMM probeRadius) {
Mark Friedrichs's avatar
Mark Friedrichs committed
244
    _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

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

257
RealOpenMM ObcParameters::getPi4Asolv() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
258
259
    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

273
const vector<RealOpenMM>& ObcParameters::getAtomicRadii() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
274
275
    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

285
void ObcParameters::setAtomicRadii(const vector<RealOpenMM>& atomicRadii) {
286

287
288
    if (atomicRadii.size() == _atomicRadii.size()) {
        for (unsigned int ii = 0; ii < atomicRadii.size(); ii++) {
Mark Friedrichs's avatar
Mark Friedrichs committed
289
290
291
292
293
294
295
296
297
            _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

309
const vector<RealOpenMM>& ObcParameters::getScaledRadiusFactors() const {
Mark Friedrichs's avatar
Mark Friedrichs committed
310
    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

321
void ObcParameters::setScaledRadiusFactors(const vector<RealOpenMM>& scaledRadiusFactors) {
322

323
324
    if (scaledRadiusFactors.size() == _scaledRadiusFactors.size()) {
        for (unsigned int ii = 0; ii < scaledRadiusFactors.size(); ii++) {
Mark Friedrichs's avatar
Mark Friedrichs committed
325
326
327
328
329
330
331
332
333
            _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
      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.

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

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

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

383
    assert(_cutoff);
384

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

389
390
391
392
    _periodic           = true;
    _periodicBoxVectors[0] = vectors[0];
    _periodicBoxVectors[1] = vectors[1];
    _periodicBoxVectors[2] = vectors[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
412
const OpenMM::RealVec* ObcParameters::getPeriodicBox() {
     return _periodicBoxVectors;
413
}