# | Line 33 | Line 33 | double Thermo::getKinetic(){ | |
---|---|---|
33 | double Thermo::getKinetic(){ | |
34 | ||
35 | const double e_convert = 4.184E-4; // convert kcal/mol -> (amu A^2)/fs^2 | |
36 | < | double vx2, vy2, vz2; |
37 | < | double kinetic, v_sqr; |
38 | < | int kl; |
39 | < | double jx2, jy2, jz2; // the square of the angular momentums |
36 | > | double kinetic; |
37 | > | double amass; |
38 | > | double aVel[3], aJ[3], I[3][3]; |
39 | > | int j, kl; |
40 | ||
41 | DirectionalAtom *dAtom; | |
42 | ||
# | Line 51 | Line 51 | double Thermo::getKinetic(){ | |
51 | kinetic = 0.0; | |
52 | kinetic_global = 0.0; | |
53 | for( kl=0; kl < n_atoms; kl++ ){ | |
54 | + | |
55 | + | atoms[kl]->getVel(aVel); |
56 | + | amass = atoms[kl]->getMass(); |
57 | + | |
58 | + | for (j=0; j < 3; j++) |
59 | + | kinetic += amass * aVel[j] * aVel[j]; |
60 | ||
55 | – | vx2 = atoms[kl]->get_vx() * atoms[kl]->get_vx(); |
56 | – | vy2 = atoms[kl]->get_vy() * atoms[kl]->get_vy(); |
57 | – | vz2 = atoms[kl]->get_vz() * atoms[kl]->get_vz(); |
58 | – | |
59 | – | v_sqr = vx2 + vy2 + vz2; |
60 | – | kinetic += atoms[kl]->getMass() * v_sqr; |
61 | – | |
61 | if( atoms[kl]->isDirectional() ){ | |
62 | ||
63 | dAtom = (DirectionalAtom *)atoms[kl]; | |
64 | + | |
65 | + | dAtom->getJ( aJ ); |
66 | + | dAtom->getI( I ); |
67 | ||
68 | < | jx2 = dAtom->getJx() * dAtom->getJx(); |
69 | < | jy2 = dAtom->getJy() * dAtom->getJy(); |
68 | < | jz2 = dAtom->getJz() * dAtom->getJz(); |
68 | > | for (j=0; j<3; j++) |
69 | > | kinetic += aJ[j]*aJ[j] / I[j][j]; |
70 | ||
70 | – | kinetic += (jx2 / dAtom->getIxx()) + (jy2 / dAtom->getIyy()) |
71 | – | + (jz2 / dAtom->getIzz()); |
71 | } | |
72 | } | |
73 | #ifdef IS_MPI | |
# | Line 138 | Line 137 | double Thermo::getEnthalpy() { | |
137 | ||
138 | const double e_convert = 4.184E-4; // convert kcal/mol -> (amu A^2)/fs^2 | |
139 | double u, p, v; | |
140 | < | double press[9]; |
140 | > | double press[3][3]; |
141 | ||
142 | u = this->getTotalE(); | |
143 | ||
144 | this->getPressureTensor(press); | |
145 | < | p = (press[0] + press[4] + press[8]) / 3.0; |
145 | > | p = (press[0][0] + press[1][1] + press[2][2]) / 3.0; |
146 | ||
147 | v = this->getVolume(); | |
148 | ||
# | Line 160 | Line 159 | double Thermo::getPressure() { | |
159 | // Relies on the calculation of the full molecular pressure tensor | |
160 | ||
161 | const double p_convert = 1.63882576e8; | |
162 | < | double press[9]; |
162 | > | double press[3][3]; |
163 | double pressure; | |
164 | ||
165 | this->getPressureTensor(press); | |
166 | ||
167 | < | pressure = p_convert * (press[0] + press[4] + press[8]) / 3.0; |
167 | > | pressure = p_convert * (press[0][0] + press[1][1] + press[2][2]) / 3.0; |
168 | ||
169 | return pressure; | |
170 | } | |
171 | ||
172 | ||
173 | < | void Thermo::getPressureTensor(double press[9]){ |
173 | > | void Thermo::getPressureTensor(double press[3][3]){ |
174 | // returns pressure tensor in units amu*fs^-2*Ang^-1 | |
175 | // routine derived via viral theorem description in: | |
176 | // Paci, E. and Marchi, M. J.Phys.Chem. 1996, 100, 4314-4322 | |
# | Line 181 | Line 180 | void Thermo::getPressureTensor(double press[9]){ | |
180 | double molmass, volume; | |
181 | double vcom[3]; | |
182 | double p_local[9], p_global[9]; | |
183 | < | double theBox[3]; |
185 | < | //double* tau; |
186 | < | int i, nMols; |
183 | > | int i, j, k, l, nMols; |
184 | Molecule* molecules; | |
185 | ||
186 | nMols = entry_plug->n_mol; | |
# | Line 222 | Line 219 | void Thermo::getPressureTensor(double press[9]){ | |
219 | ||
220 | volume = entry_plug->boxVol; | |
221 | ||
222 | < | for(i=0; i<9; i++) { |
223 | < | press[i] = (p_global[i] - entry_plug->tau[i]*e_convert) / volume; |
222 | > | for(i = 0; i < 3; i++) { |
223 | > | for (j = 0; j < 3; j++) { |
224 | > | k = 3*i + j; |
225 | > | l = 3*j + i; |
226 | > | press[i][j] = (p_global[k] - entry_plug->tau[l]*e_convert) / volume; |
227 | > | } |
228 | } | |
229 | } | |
230 | ||
231 | void Thermo::velocitize() { | |
232 | ||
233 | double x,y; | |
234 | < | double vx, vy, vz; |
235 | < | double jx, jy, jz; |
235 | < | int i, vr, vd; // velocity randomizer loop counters |
234 | > | double aVel[3], aJ[3], I[3][3]; |
235 | > | int i, j, vr, vd; // velocity randomizer loop counters |
236 | double vdrift[3]; | |
237 | double vbar; | |
238 | const double kb = 8.31451e-7; // kb in amu, angstroms, fs, etc. | |
# | Line 266 | Line 266 | void Thermo::velocitize() { | |
266 | // picks random velocities from a gaussian distribution | |
267 | // centered on vbar | |
268 | ||
269 | < | vx = vbar * gaussStream->getGaussian(); |
270 | < | vy = vbar * gaussStream->getGaussian(); |
271 | < | vz = vbar * gaussStream->getGaussian(); |
269 | > | for (j=0; j<3; j++) |
270 | > | aVel[j] = vbar * gaussStream->getGaussian(); |
271 | > | |
272 | > | atoms[vr]->setVel( aVel ); |
273 | ||
273 | – | atoms[vr]->set_vx( vx ); |
274 | – | atoms[vr]->set_vy( vy ); |
275 | – | atoms[vr]->set_vz( vz ); |
274 | } | |
275 | ||
276 | // Get the Center of Mass drift velocity. | |
# | Line 284 | Line 282 | void Thermo::velocitize() { | |
282 | ||
283 | for(vd = 0; vd < n_atoms; vd++){ | |
284 | ||
285 | < | vx = atoms[vd]->get_vx(); |
288 | < | vy = atoms[vd]->get_vy(); |
289 | < | vz = atoms[vd]->get_vz(); |
290 | < | |
291 | < | vx -= vdrift[0]; |
292 | < | vy -= vdrift[1]; |
293 | < | vz -= vdrift[2]; |
285 | > | atoms[vd]->getVel(aVel); |
286 | ||
287 | < | atoms[vd]->set_vx(vx); |
288 | < | atoms[vd]->set_vy(vy); |
289 | < | atoms[vd]->set_vz(vz); |
287 | > | for (j=0; j < 3; j++) |
288 | > | aVel[j] -= vdrift[j]; |
289 | > | |
290 | > | atoms[vd]->setVel( aVel ); |
291 | } | |
292 | if( n_oriented ){ | |
293 | ||
# | Line 303 | Line 296 | void Thermo::velocitize() { | |
296 | if( atoms[i]->isDirectional() ){ | |
297 | ||
298 | dAtom = (DirectionalAtom *)atoms[i]; | |
299 | + | dAtom->getI( I ); |
300 | + | |
301 | + | for (j = 0 ; j < 3; j++) { |
302 | ||
303 | < | vbar = sqrt( 2.0 * kebar * dAtom->getIxx() ); |
304 | < | jx = vbar * gaussStream->getGaussian(); |
303 | > | vbar = sqrt( 2.0 * kebar * I[j][j] ); |
304 | > | aJ[j] = vbar * gaussStream->getGaussian(); |
305 | ||
306 | < | vbar = sqrt( 2.0 * kebar * dAtom->getIyy() ); |
307 | < | jy = vbar * gaussStream->getGaussian(); |
308 | < | |
309 | < | vbar = sqrt( 2.0 * kebar * dAtom->getIzz() ); |
314 | < | jz = vbar * gaussStream->getGaussian(); |
315 | < | |
316 | < | dAtom->setJx( jx ); |
317 | < | dAtom->setJy( jy ); |
318 | < | dAtom->setJz( jz ); |
306 | > | } |
307 | > | |
308 | > | dAtom->setJ( aJ ); |
309 | > | |
310 | } | |
311 | } | |
312 | } | |
# | Line 324 | Line 315 | void Thermo::getCOMVel(double vdrift[3]){ | |
315 | void Thermo::getCOMVel(double vdrift[3]){ | |
316 | ||
317 | double mtot, mtot_local; | |
318 | + | double aVel[3], amass; |
319 | double vdrift_local[3]; | |
320 | < | int vd, n_atoms; |
320 | > | int vd, n_atoms, j; |
321 | Atom** atoms; | |
322 | ||
323 | // We are very careless here with the distinction between n_atoms and n_local | |
# | Line 341 | Line 333 | void Thermo::getCOMVel(double vdrift[3]){ | |
333 | ||
334 | for(vd = 0; vd < n_atoms; vd++){ | |
335 | ||
336 | < | vdrift_local[0] += atoms[vd]->get_vx() * atoms[vd]->getMass(); |
337 | < | vdrift_local[1] += atoms[vd]->get_vy() * atoms[vd]->getMass(); |
338 | < | vdrift_local[2] += atoms[vd]->get_vz() * atoms[vd]->getMass(); |
336 | > | amass = atoms[vd]->getMass(); |
337 | > | atoms[vd]->getVel( aVel ); |
338 | > | |
339 | > | for(j = 0; j < 3; j++) |
340 | > | vdrift_local[j] += aVel[j] * amass; |
341 | ||
342 | < | mtot_local += atoms[vd]->getMass(); |
342 | > | mtot_local += amass; |
343 | } | |
344 | ||
345 | #ifdef IS_MPI |
– | Removed lines |
+ | Added lines |
< | Changed lines |
> | Changed lines |