ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/ShakeMin.cpp
Revision: 1248
Committed: Fri Jun 4 19:30:05 2004 UTC (20 years, 1 month ago) by tim
File size: 5484 byte(s)
Log Message:
constraint algorithm for minimization is working

File Contents

# User Rev Content
1 tim 1248 #include <cmath>
2     #include "ConstraintElement.hpp"
3 tim 1232 #include "ShakeMin.hpp"
4 tim 1248 #include "SimInfo.hpp"
5 tim 1232 ////////////////////////////////////////////////////////////////////////////////
6     //Implementation of DCShakeMinRFunctor
7     ////////////////////////////////////////////////////////////////////////////////
8     int DCShakeRMinFunctor::operator()(ConstraintAtom* consAtom1, ConstraintAtom* consAtom2){
9 tim 1248 double posA[3];
10     double posB[3];
11     double oldPosA[3];
12     double oldPosB[3];
13     double velA[3];
14     double velB[3];
15     double pab[3];
16     double rab[3];
17     double rma, rmb;
18     double dx, dy, dz;
19     double rpab;
20     double rabsq, pabsq, rpabsq;
21     double diffsq;
22     double gab;
23     double dt;
24    
25     dt = info->dt;
26    
27     consAtom1->getPos(posA);
28     consAtom2->getPos(posB);
29    
30    
31     pab[0] = posA[0] - posB[0];
32     pab[1] = posA[1] - posB[1];
33     pab[2] = posA[2] - posB[2];
34    
35     //periodic boundary condition
36    
37     info->wrapVector(pab);
38    
39     pabsq = pab[0] * pab[0] + pab[1] * pab[1] + pab[2] * pab[2];
40    
41     rabsq = curPair->getBondLength2();
42     diffsq = rabsq - pabsq;
43    
44     // the original rattle code from alan tidesley
45     if (fabs(diffsq) > (consTolerance * rabsq * 2)){
46    
47     consAtom1->getOldPos(oldPosA);
48     consAtom2->getOldPos(oldPosB);
49    
50     rab[0] = oldPosA[0] - oldPosB[0];
51     rab[1] = oldPosA[1] - oldPosB[1];
52     rab[2] = oldPosA[2] - oldPosB[2];
53    
54     info->wrapVector(rab);
55    
56     rpab = rab[0] * pab[0] + rab[1] * pab[1] + rab[2] * pab[2];
57    
58     rpabsq = rpab * rpab;
59    
60    
61     if (rpabsq < (rabsq * -diffsq)){
62     return consFail;
63     }
64    
65     //rma = 1.0 / consAtom1->getMass();
66     //rmb = 1.0 / consAtom2->getMass();
67    
68     rma = 1.0;
69     rmb= 1.0;
70    
71     gab = diffsq / (2.0 * (rma + rmb) * rpab);
72    
73     dx = rab[0] * gab;
74     dy = rab[1] * gab;
75     dz = rab[2] * gab;
76    
77     posA[0] += rma * dx;
78     posA[1] += rma * dy;
79     posA[2] += rma * dz;
80    
81     consAtom1->setPos(posA);
82    
83     posB[0] -= rmb * dx;
84     posB[1] -= rmb * dy;
85     posB[2] -= rmb * dz;
86    
87     consAtom2->setPos(posB);
88    
89     dx = dx / dt;
90     dy = dy / dt;
91     dz = dz / dt;
92    
93     consAtom1->getVel(velA);
94    
95     velA[0] += rma * dx;
96     velA[1] += rma * dy;
97     velA[2] += rma * dz;
98    
99     consAtom1->setVel(velA);
100    
101     consAtom2->getVel(velB);
102    
103     velB[0] -= rmb * dx;
104     velB[1] -= rmb * dy;
105     velB[2] -= rmb * dz;
106    
107     consAtom2->setVel(velB);
108    
109     return consSuccess;
110     }
111     else
112     return consAlready;
113 tim 1232 }
114    
115    
116    
117     int DCShakeRMinFunctor::operator()(ConstraintAtom* consAtom,ConstraintRigidBody* consRB){
118     return consElemHandlerFail;
119    
120     }
121    
122     int DCShakeRMinFunctor::operator()(ConstraintRigidBody* consRB1, ConstraintRigidBody* consRB2){
123     return consElemHandlerFail;
124     }
125    
126     ////////////////////////////////////////////////////////////////////////////////
127     //Implementation of JCShakeMinRFunctor
128     ////////////////////////////////////////////////////////////////////////////////
129     int JCShakeRMInFunctor::operator()(ConstraintAtom* consAtom1, ConstraintAtom* consAtom2){
130     return consElemHandlerFail;
131     }
132    
133    
134    
135     int JCShakeRMInFunctor::operator()(ConstraintAtom* consAtom,ConstraintRigidBody* consRB){
136     return consElemHandlerFail;
137     }
138    
139     int JCShakeRMInFunctor::operator()(ConstraintRigidBody* consRB1, ConstraintRigidBody* consRB2){
140     return consElemHandlerFail;
141     }
142    
143    
144     ////////////////////////////////////////////////////////////////////////////////
145     //Implementation of DCShakeMinFFunctor
146     ////////////////////////////////////////////////////////////////////////////////
147     int DCShakeMinFFunctor::operator()(ConstraintAtom* consAtom1, ConstraintAtom* consAtom2){
148    
149 tim 1248 double posA[3];
150     double posB[3];
151     double frcA[3];
152     double frcB[3];
153     double rab[3];
154     double fpab[3];
155     double rma;
156     double rmb;
157     double gab;
158     double rabsq;
159     double rfab;
160 tim 1232
161    
162 tim 1248
163     consAtom1->getPos(posA);
164     consAtom2->getPos(posB);
165    
166    
167     rab[0] = posA[0] - posB[0];
168     rab[1] = posA[1] - posB[1];
169     rab[2] = posA[2] - posB[2];
170    
171     info->wrapVector(rab);
172    
173     consAtom1->getFrc(frcA);
174     consAtom2->getFrc(frcB);
175    
176     rma = 1.0;
177     rmb = 1.0;
178    
179    
180     fpab[0] = frcA[0] * rma - frcB[0] * rmb;
181     fpab[1] = frcA[1] * rma - frcB[1] * rmb;
182     fpab[2] = frcA[2] * rma - frcB[2] * rmb;
183    
184    
185     gab=fpab[0] * fpab[0] + fpab[1] * fpab[1] + fpab[2] * fpab[2];
186    
187     if (gab < 1.0)
188     gab = 1.0;
189    
190     rabsq = rab[0] * rab[0] + rab[1] * rab[1] + rab[2] * rab[2];
191     rfab = rab[0] * fpab[0] + rab[1] * fpab[1] + rab[2] * fpab[2];
192    
193     if (fabs(rfab) > sqrt(rabsq*gab) * consTolerance){
194    
195     gab = -rfab /(rabsq*(rma + rmb));
196    
197     frcA[0] = rab[0] * gab;
198     frcA[1] = rab[1] * gab;
199     frcA[2] = rab[2] * gab;
200    
201     consAtom1->addFrc(frcA);
202    
203     frcB[0] = -rab[0] * gab;
204     frcB[1] = -rab[1] * gab;
205     frcB[2] = -rab[2] * gab;
206    
207     consAtom2->addFrc(frcB);
208    
209     }
210    
211     return consSuccess;
212    
213     }
214    
215    
216    
217 tim 1232 int DCShakeMinFFunctor::operator()(ConstraintAtom* consAtom,ConstraintRigidBody* consRB){
218     return consElemHandlerFail;
219     }
220    
221     int DCShakeMinFFunctor::operator()(ConstraintRigidBody* consRB1, ConstraintRigidBody* consRB2){
222     return consElemHandlerFail;
223     }
224    
225     ////////////////////////////////////////////////////////////////////////////////
226     //Implementation of JCShakeMinFFunctor
227     ////////////////////////////////////////////////////////////////////////////////
228     int JCShakeMinFFunctor::operator()(ConstraintAtom* consAtom1, ConstraintAtom* consAtom2){
229     return consElemHandlerFail;
230     }
231    
232    
233    
234     int JCShakeMinFFunctor::operator()(ConstraintAtom* consAtom,ConstraintRigidBody* consRB){
235     return consElemHandlerFail;
236     }
237    
238     int JCShakeMinFFunctor::operator()(ConstraintRigidBody* consRB1, ConstraintRigidBody* consRB2){
239     return consElemHandlerFail;
240 tim 1248 }

Properties

Name Value
svn:executable *