ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/Verlet.cpp
Revision: 378
Committed: Fri Mar 21 17:42:12 2003 UTC (21 years, 3 months ago) by mmeineke
File size: 8709 byte(s)
Log Message:
This commit was generated by cvs2svn to compensate for changes in r377,
which included commits to RCS files with non-trunk default branches.

File Contents

# Content
1 #include <iostream>
2 #include <stdlib.h>
3
4 #include "Atom.hpp"
5 #include "SRI.hpp"
6 #include "Integrator.hpp"
7 #include "SimInfo.hpp"
8 #include "Thermo.hpp"
9 #include "ReadWrite.hpp"
10
11 extern "C"{
12
13 void v_constrain_a_( double &dt, int &n_atoms, double* mass,
14 double* Rx, double* Ry, double* Rz,
15 double* Vx, double* Vy, double* Vz,
16 double* Fx, double* Fy, double* Fz,
17 int &n_constrained, double *constr_sqr,
18 int* constr_i, int* constr_j,
19 double &box_x, double &box_y, double &box_z );
20
21 void v_constrain_b_( double &dt, int &n_atoms, double* mass,
22 double* Rx, double* Ry, double* Rz,
23 double* Vx, double* Vy, double* Vz,
24 double* Fx, double* Fy, double* Fz,
25 double &Kinetic,
26 int &n_constrained, double *constr_sqr,
27 int* constr_i, int* constr_j,
28 double &box_x, double &box_y, double &box_z );
29 }
30
31
32 Verlet::Verlet( SimInfo &info, ForceFields* the_ff ){
33
34 // get what information we need from the SimInfo object
35
36 entry_plug = &info;
37 myFF = the_ff;
38
39
40 c_natoms = info.n_atoms;
41 c_atoms = info.atoms;
42 c_sr_interactions = info.sr_interactions;
43 c_n_SRI = info.n_SRI;
44 c_is_constrained = 0;
45 c_box_x = info.box_x;
46 c_box_y = info.box_y;
47 c_box_z = info.box_z;
48
49 // give a little love back to the SimInfo object
50
51 if( info.the_integrator != NULL ) delete info.the_integrator;
52 info.the_integrator = this;
53
54 // the rest are initialization issues
55
56 is_first = 1; // let the integrate method know when the first call is
57
58 // mass array setup
59
60 c_mass = new double[c_natoms];
61
62 for(int i = 0; i < c_natoms; i++){
63 c_mass[i] = c_atoms[i]->getMass();
64 }
65
66 // check for constraints
67
68 Constraint *temp_con;
69 Constraint *dummy_plug;
70 temp_con = new Constraint[c_n_SRI];
71
72 c_n_constrained = 0;
73 int constrained = 0;
74
75 for(int i = 0; i < c_n_SRI; i++){
76
77 constrained = c_sr_interactions[i]->is_constrained();
78
79 if(constrained){
80
81 dummy_plug = c_sr_interactions[i]->get_constraint();
82 temp_con[c_n_constrained].set_a( dummy_plug->get_a() );
83 temp_con[c_n_constrained].set_b( dummy_plug->get_b() );
84 temp_con[c_n_constrained].set_dsqr( dummy_plug->get_dsqr() );
85
86 c_n_constrained++;
87 constrained = 0;
88 }
89 }
90
91 if(c_n_constrained > 0){
92
93 c_is_constrained = 1;
94 c_constrained_i = new int[c_n_constrained];
95 c_constrained_j = new int[c_n_constrained];
96 c_constrained_dsqr = new double[c_n_constrained];
97
98 for( int i = 0; i < c_n_constrained; i++){
99
100 /* add 1 to the index for the fortran arrays. */
101
102 c_constrained_i[i] = temp_con[i].get_a() + 1;
103 c_constrained_j[i] = temp_con[i].get_b() + 1;
104 c_constrained_dsqr[i] = temp_con[i].get_dsqr();
105 }
106 }
107
108 delete[] temp_con;
109 }
110
111
112 Verlet::~Verlet(){
113
114 if( c_is_constrained ){
115
116 delete[] c_constrained_i;
117 delete[] c_constrained_j;
118 delete[] c_constrained_dsqr;
119 }
120
121 delete[] c_mass;
122 c_mass = 0;
123 }
124
125
126 void Verlet::integrate( void ){
127
128 int i, j; /* loop counters */
129 int calcPot;
130
131 double kE;
132
133 double *Rx = new double[c_natoms];
134 double *Ry = new double[c_natoms];
135 double *Rz = new double[c_natoms];
136
137 double *Vx = new double[c_natoms];
138 double *Vy = new double[c_natoms];
139 double *Vz = new double[c_natoms];
140
141 double *Fx = new double[c_natoms];
142 double *Fy = new double[c_natoms];
143 double *Fz = new double[c_natoms];
144
145 int time;
146
147 double dt = entry_plug->dt;
148 double runTime = entry_plug->run_time;
149 double sampleTime = entry_plug->sampleTime;
150 double statusTime = entry_plug->statusTime;
151 double thermalTime = entry_plug->thermalTime;
152
153 int n_loops = (int)( runTime / dt );
154 int sample_n = (int)( sampleTime / dt );
155 int status_n = (int)( statusTime / dt );
156 int vel_n = (int)( thermalTime / dt );
157
158 Thermo *tStats = new Thermo( entry_plug );
159
160 StatWriter* e_out = new StatWriter( entry_plug );
161 DumpWriter* dump_out = new DumpWriter( entry_plug );
162
163 // the first time integrate is called, the forces need to be initialized
164
165
166 myFF->doForces(1,0);
167
168 if( entry_plug->setTemp ){
169 tStats->velocitize();
170 }
171
172 dump_out->writeDump( 0.0 );
173
174 e_out->writeStat( 0.0 );
175
176 calcPot = 0;
177
178 if( c_is_constrained ){
179 for(i = 0; i < n_loops; i++){
180
181 // fill R, V, and F arrays and RATTLE in fortran
182
183 for( j=0; j<c_natoms; j++ ){
184
185 Rx[j] = c_atoms[j]->getX();
186 Ry[j] = c_atoms[j]->getY();
187 Rz[j] = c_atoms[j]->getZ();
188
189 Vx[j] = c_atoms[j]->get_vx();
190 Vy[j] = c_atoms[j]->get_vy();
191 Vz[j] = c_atoms[j]->get_vz();
192
193 Fx[j] = c_atoms[j]->getFx();
194 Fy[j] = c_atoms[j]->getFy();
195 Fz[j] = c_atoms[j]->getFz();
196
197 }
198
199 v_constrain_a_( dt, c_natoms, c_mass, Rx, Ry, Rz, Vx, Vy, Vz,
200 Fx, Fy, Fz,
201 c_n_constrained, c_constrained_dsqr,
202 c_constrained_i, c_constrained_j,
203 c_box_x, c_box_y, c_box_z );
204
205 for( j=0; j<c_natoms; j++ ){
206
207 c_atoms[j]->setX(Rx[j]);
208 c_atoms[j]->setY(Ry[j]);
209 c_atoms[j]->setZ(Rz[j]);
210
211 c_atoms[j]->set_vx(Vx[j]);
212 c_atoms[j]->set_vy(Vy[j]);
213 c_atoms[j]->set_vz(Vz[j]);
214 }
215
216 // calculate the forces
217
218 myFF->doForces(calcPot,0);
219
220 // finish the constrain move ( same as above. )
221
222 for( j=0; j<c_natoms; j++ ){
223
224 Rx[j] = c_atoms[j]->getX();
225 Ry[j] = c_atoms[j]->getY();
226 Rz[j] = c_atoms[j]->getZ();
227
228 Vx[j] = c_atoms[j]->get_vx();
229 Vy[j] = c_atoms[j]->get_vy();
230 Vz[j] = c_atoms[j]->get_vz();
231
232 Fx[j] = c_atoms[j]->getFx();
233 Fy[j] = c_atoms[j]->getFy();
234 Fz[j] = c_atoms[j]->getFz();
235 }
236
237 v_constrain_b_( dt, c_natoms, c_mass, Rx, Ry, Rz, Vx, Vy, Vz,
238 Fx, Fy, Fz,
239 kE, c_n_constrained, c_constrained_dsqr,
240 c_constrained_i, c_constrained_j,
241 c_box_x, c_box_y, c_box_z );
242
243 for( j=0; j<c_natoms; j++ ){
244
245 c_atoms[j]->setX(Rx[j]);
246 c_atoms[j]->setY(Ry[j]);
247 c_atoms[j]->setZ(Rz[j]);
248
249 c_atoms[j]->set_vx(Vx[j]);
250 c_atoms[j]->set_vy(Vy[j]);
251 c_atoms[j]->set_vz(Vz[j]);
252 }
253
254 time = i + 1;
255
256 if( entry_plug->setTemp ){
257 if( !(time % vel_n) ) tStats->velocitize();
258 }
259 if( !(time % sample_n) ) dump_out->writeDump( time * dt );
260 if( !((time+1) % status_n) ) calcPot = 1;
261 if( !(time % status_n) ){ e_out->writeStat( time * dt ); calcPot = 0; }
262 }
263 }
264 else{
265 for(i = 0; i < n_loops; i++){
266
267 move_a( dt );
268
269 // calculate the forces
270
271 myFF->doForces(calcPot,0);
272
273 // complete the verlet move
274
275 move_b( dt );
276
277 time = i + 1;
278
279 if( entry_plug->setTemp ){
280 if( !(time % vel_n) ) tStats->velocitize();
281 }
282 if( !(time % sample_n) ) dump_out->writeDump( time * dt );
283 if( !((time+1) % status_n) ) calcPot = 1;
284 if( !(time % status_n) ){ e_out->writeStat( time * dt ); calcPot = 0; }
285 }
286 }
287
288 dump_out->writeFinal();
289
290 delete dump_out;
291 delete e_out;
292
293 }
294
295
296 void Verlet::move_a(double dt){
297
298 const double e_convert = 4.184e-4; // converts kcal/mol -> amu*A^2/fs^2
299
300 double qx, qy, qz;
301 double vx, vy, vz;
302 int ma;
303 double h_dt = 0.5 * dt;
304 double h_dt2 = h_dt * dt;
305
306 for( ma = 0; ma < c_natoms; ma++){
307
308 qx = c_atoms[ma]->getX() + dt * c_atoms[ma]->get_vx() +
309 h_dt2 * c_atoms[ma]->getFx() * e_convert / c_atoms[ma]->getMass();
310 qy = c_atoms[ma]->getY() + dt * c_atoms[ma]->get_vy() +
311 h_dt2 * c_atoms[ma]->getFy() * e_convert / c_atoms[ma]->getMass();
312 qz = c_atoms[ma]->getZ() + dt * c_atoms[ma]->get_vz() +
313 h_dt2 * c_atoms[ma]->getFz() * e_convert / c_atoms[ma]->getMass();
314
315 vx = c_atoms[ma]->get_vx() +
316 h_dt * c_atoms[ma]->getFx() * e_convert / c_atoms[ma]->getMass();
317 vy = c_atoms[ma]->get_vy() +
318 h_dt * c_atoms[ma]->getFy() * e_convert / c_atoms[ma]->getMass();
319 vz = c_atoms[ma]->get_vz() +
320 h_dt * c_atoms[ma]->getFz() * e_convert / c_atoms[ma]->getMass();
321
322 c_atoms[ma]->setX(qx);
323 c_atoms[ma]->setY(qy);
324 c_atoms[ma]->setZ(qz);
325
326 c_atoms[ma]->set_vx(vx);
327 c_atoms[ma]->set_vy(vy);
328 c_atoms[ma]->set_vz(vz);
329 }
330 }
331
332 void Verlet::move_b( double dt ){
333
334 const double e_convert = 4.184e-4; // converts kcal/mol -> amu*A^2/fs^2
335
336 double vx, vy, vz;
337 int mb;
338 double h_dt = 0.5 * dt;
339
340
341 for( mb = 0; mb < c_natoms; mb++){
342
343 vx = c_atoms[mb]->get_vx() +
344 h_dt * c_atoms[mb]->getFx() * e_convert / c_atoms[mb]->getMass();
345 vy = c_atoms[mb]->get_vy() +
346 h_dt * c_atoms[mb]->getFy() * e_convert / c_atoms[mb]->getMass();
347 vz = c_atoms[mb]->get_vz() +
348 h_dt * c_atoms[mb]->getFz() * e_convert / c_atoms[mb]->getMass();
349
350 c_atoms[mb]->set_vx(vx);
351 c_atoms[mb]->set_vy(vy);
352 c_atoms[mb]->set_vz(vz);
353 }
354 }