ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/SHAPES/GridBuilder.cpp
Revision: 1285
Committed: Tue Jun 22 18:04:58 2004 UTC (20 years ago) by chrisfen
File size: 6238 byte(s)
Log Message:
Fixes to gridbuilder.  Now gives proper sigma, s, and epsilon values

File Contents

# User Rev Content
1 chrisfen 1277 #include "GridBuilder.hpp"
2     #include "MatVec3.h"
3     #define PI 3.14159265359
4    
5    
6 chrisfen 1285 GridBuilder::GridBuilder(RigidBody* rb, int gridWidth) {
7 chrisfen 1280 rbMol = rb;
8 chrisfen 1285 gridwidth = gridWidth;
9     thetaStep = PI / gridwidth;
10 chrisfen 1280 thetaMin = thetaStep / 2.0;
11     phiStep = thetaStep * 2.0;
12 chrisfen 1277 }
13    
14     GridBuilder::~GridBuilder() {
15     }
16    
17 gezelter 1283 void GridBuilder::launchProbe(int forceField, vector<double> sigmaGrid,
18     vector<double> sGrid, vector<double> epsGrid){
19 chrisfen 1281 ofstream sigmaOut("sigma.grid");
20     ofstream sOut("s.grid");
21     ofstream epsOut("eps.grid");
22 chrisfen 1280 double startDist;
23 chrisfen 1282 double phiVal;
24     double thetaVal;
25 chrisfen 1285 double sigTemp, sTemp, epsTemp, sigProbe;
26 chrisfen 1280 double minDist = 10.0; //minimum start distance
27 chrisfen 1277
28 chrisfen 1281 sList = sGrid;
29     sigList = sigmaGrid;
30     epsList = epsGrid;
31 chrisfen 1280 forcefield = forceField;
32 chrisfen 1285
33     //load the probe atom parameters
34     switch(forcefield){
35     case 1:{
36     rparHe = 1.4800;
37     epsHe = -0.021270;
38     }; break;
39     case 2:{
40     rparHe = 1.14;
41     epsHe = 0.0203;
42     }; break;
43     case 3:{
44     rparHe = 2.28;
45     epsHe = 0.020269601874;
46     }; break;
47     case 4:{
48     rparHe = 2.5560;
49     epsHe = 0.0200;
50     }; break;
51     case 5:{
52     rparHe = 1.14;
53     epsHe = 0.0203;
54     }; break;
55     }
56 chrisfen 1280
57 chrisfen 1285 if (rparHe < 2.2)
58     sigProbe = 2*rparHe/1.12246204831;
59     else
60     sigProbe = rparHe;
61    
62     //determine the start distance - we always start at least minDist away
63 chrisfen 1280 startDist = rbMol->findMaxExtent() + minDist;
64     if (startDist < minDist)
65     startDist = minDist;
66 chrisfen 1281
67 chrisfen 1282 //set the initial orientation of the body and loop over theta values
68 gezelter 1283
69 chrisfen 1285 for (k =0; k < gridwidth; k++) {
70 gezelter 1283 thetaVal = thetaMin + k*thetaStep;
71 chrisfen 1285 printf("Theta step %i\n", k);
72     for (j=0; j < gridwidth; j++) {
73 gezelter 1283 phiVal = j*phiStep;
74    
75     rbMol->setEuler(0.0, thetaVal, phiVal);
76    
77 chrisfen 1280 releaseProbe(startDist);
78 chrisfen 1279
79 chrisfen 1285 //translate the values to sigma, s, and epsilon of the rigid body
80     sigTemp = 2*sigDist - sigProbe;
81     sTemp = (2*(sDist - sigDist))/(0.122462048309) - sigProbe;
82     epsTemp = pow(epsVal, 2)/fabs(epsHe);
83    
84     sigList.push_back(sigTemp);
85     sList.push_back(sTemp);
86     epsList.push_back(epsTemp);
87 chrisfen 1280 }
88     }
89 chrisfen 1277 }
90    
91     void GridBuilder::releaseProbe(double farPos){
92 chrisfen 1280 int tooClose;
93     double tempPotEnergy;
94     double interpRange;
95     double interpFrac;
96 chrisfen 1277
97 chrisfen 1280 probeCoor = farPos;
98     potProgress.clear();
99     distProgress.clear();
100     tooClose = 0;
101     epsVal = 0;
102     rhoStep = 0.1; //the distance the probe atom moves between steps
103 gezelter 1283
104 chrisfen 1280 while (!tooClose){
105     calcEnergy();
106     potProgress.push_back(potEnergy);
107     distProgress.push_back(probeCoor);
108 chrisfen 1277
109 chrisfen 1280 //if we've reached a new minimum, save the value and position
110     if (potEnergy < epsVal){
111     epsVal = potEnergy;
112     sDist = probeCoor;
113     }
114 chrisfen 1277
115 chrisfen 1280 //test if the probe reached the origin - if so, stop stepping closer
116     if (probeCoor < 0){
117     sigDist = 0.0;
118     tooClose = 1;
119     }
120 chrisfen 1277
121 chrisfen 1280 //test if the probe beyond the contact point - if not, take a step closer
122     if (potEnergy < 0){
123     sigDist = probeCoor;
124     tempPotEnergy = potEnergy;
125     probeCoor -= rhoStep;
126     }
127     else {
128     //do a linear interpolation to obtain the sigDist
129     interpRange = potEnergy - tempPotEnergy;
130     interpFrac = potEnergy / interpRange;
131     interpFrac = interpFrac * rhoStep;
132     sigDist = probeCoor + interpFrac;
133 chrisfen 1277
134 chrisfen 1280 //end the loop
135     tooClose = 1;
136     }
137     }
138 chrisfen 1277 }
139    
140     void GridBuilder::calcEnergy(){
141 chrisfen 1281 double rXij, rYij, rZij;
142     double rijSquared;
143     double rValSquared, rValPowerSix;
144     double atomRpar, atomEps;
145     double rbAtomPos[3];
146 chrisfen 1285
147 chrisfen 1281 potEnergy = 0.0;
148 gezelter 1283
149 chrisfen 1281 for(i=0; i<rbMol->getNumAtoms(); i++){
150     rbMol->getAtomPos(rbAtomPos, i);
151    
152     rXij = rbAtomPos[0];
153     rYij = rbAtomPos[1];
154     rZij = rbAtomPos[2] - probeCoor;
155    
156     rijSquared = rXij * rXij + rYij * rYij + rZij * rZij;
157    
158 chrisfen 1285 //in the interest of keeping the code more compact, we are being less
159     //efficient by placing a switch statement in the calculation loop
160 chrisfen 1281 switch(forcefield){
161     case 1:{
162     //we are using the CHARMm force field
163     atomRpar = rbMol->getAtomRpar(i);
164     atomEps = rbMol->getAtomEps(i);
165    
166     rValSquared = ((rparHe+atomRpar)*(rparHe+atomRpar)) / (rijSquared);
167     rValPowerSix = rValSquared * rValSquared * rValSquared;
168     potEnergy += sqrt(epsHe*atomEps)*(rValPowerSix * (rValPowerSix - 2.0));
169     }; break;
170    
171     case 2:{
172     //we are using the AMBER force field
173     atomRpar = rbMol->getAtomRpar(i);
174     atomEps = rbMol->getAtomEps(i);
175    
176     rValSquared = ((rparHe+atomRpar)*(rparHe+atomRpar)) / (rijSquared);
177     rValPowerSix = rValSquared * rValSquared * rValSquared;
178     potEnergy += sqrt(epsHe*atomEps)*(rValPowerSix * (rValPowerSix - 2.0));
179     }; break;
180    
181     case 3:{
182     //we are using Allen-Tildesley LJ parameters
183     atomRpar = rbMol->getAtomRpar(i);
184     atomEps = rbMol->getAtomEps(i);
185    
186     rValSquared = ((rparHe+atomRpar)*(rparHe+atomRpar)) / (4*rijSquared);
187     rValPowerSix = rValSquared * rValSquared * rValSquared;
188     potEnergy += 4*sqrt(epsHe*atomEps)*(rValPowerSix * (rValPowerSix - 1.0));
189    
190     }; break;
191    
192     case 4:{
193     //we are using the OPLS force field
194     atomRpar = rbMol->getAtomRpar(i);
195     atomEps = rbMol->getAtomEps(i);
196    
197     rValSquared = (pow(sqrt(rparHe+atomRpar),2)) / (rijSquared);
198     rValPowerSix = rValSquared * rValSquared * rValSquared;
199     potEnergy += 4*sqrt(epsHe*atomEps)*(rValPowerSix * (rValPowerSix - 1.0));
200     }; break;
201    
202     case 5:{
203     //we are using the GAFF force field
204     atomRpar = rbMol->getAtomRpar(i);
205     atomEps = rbMol->getAtomEps(i);
206    
207     rValSquared = ((rparHe+atomRpar)*(rparHe+atomRpar)) / (rijSquared);
208     rValPowerSix = rValSquared * rValSquared * rValSquared;
209     potEnergy += sqrt(epsHe*atomEps)*(rValPowerSix * (rValPowerSix - 2.0));
210     }; break;
211     }
212     }
213     }
214 chrisfen 1277
215 chrisfen 1281 void GridBuilder::printGridFiles(){
216     ofstream sigmaOut("sigma.grid");
217     ofstream sOut("s.grid");
218     ofstream epsOut("eps.grid");
219    
220     for (k=0; k<sigList.size(); k++){
221     sigmaOut << sigList[k] << "\n0\n";
222     sOut << sList[k] << "\n0\n";
223     epsOut << epsList[k] << "\n0\n";
224     }
225 gezelter 1283 }