ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/NVT.cpp
Revision: 445
Committed: Thu Apr 3 19:58:24 2003 UTC (21 years, 3 months ago) by gezelter
File size: 4479 byte(s)
Log Message:
Added NVT file (very broken for now)

File Contents

# Content
1 #include <math.h>
2
3
4 void NVT::nose_hoover_nvt( double ke, double dt, double temp ){
5
6 // Basic thermostating via Hoover, Phys.Rev.A, 1985, Vol. 31 (5) 1695-1697
7
8 int i, j, degrees_freedom;
9 double ke, dt, temp, kB;
10 double keconverter, NkBT, zetaScale, ke_temp;
11 double vxi, vyi, vzi, jxi, jyi, jzi;
12
13 degrees_freedom = 6*nmol; // number of degrees of freedom for the system
14 kB = 8.31451e-7; // boltzmann constant in amu*Ang^2*fs^-2/K
15 keconverter = 4.184e-4; // to convert ke from kcal/mol to amu*Ang^2*fs^-2 / K
16
17 ke_temp = ke * keconverter;
18 NkBT = degrees_freedom*kB*temp;
19
20 // advance the zeta term to zeta(t + dt) - zeta is 0.0d0 on config. readin &
21 // qmass is set in the parameter file
22 zeta = zeta + dt*((ke_temp*2 - NkBT)/qmass);
23 zetaScale = zeta * dt;
24
25 // perform thermostat scaling on linear velocities and angular momentum
26 for(i = 0, i < nmol; i++ ) {
27 vxi = vx(i)*zetaScale;
28 vyi = vy(i)*zetaScale;
29 vzi = vz(i)*zetaScale;
30 jxi = jx(i)*zetaScale;
31 jyi = jy(i)*zetaScale;
32 jzi = jz(i)*zetaScale;
33
34 vx(i) = vx(i) - vxi;
35 vy(i) = vy(i) - vyi;
36 vz(i) = vz(i) - vzi;
37 jx(i) = jx(i) - jxi;
38 jy(i) = jy(i) - jyi;
39 jz(i) = jz(i) - jzi;
40 }
41 }
42
43
44 void NVT::nose_hoover_anderson_npt(double pressure, double ke, double dt,
45 double temp ) {
46
47 // Basic barostating via Hoover, Phys.Rev.A, 1985, Vol. 31 (5) 1695-1697
48 // Hoover, Phys.Rev.A, 1986, Vol.34 (3) 2499-2500
49
50 int i, j, degrees_freedom;
51 double pressure, dt, temp, pressure_units, epsilonScale;
52 double ke, kB, vxi, vyi, vzi, pressure_ext;
53 double boxx_old, boxy_old, boxz_old;
54 double keconverter, NkBT, zetaScale, ke_temp;
55 double jxi, jyi, jzi, scale;
56
57 kB = 8.31451e-7; // boltzmann constant in amu*Ang^2*fs^-2/K
58 pressure_units = 6.10192996e-9; // converts atm to amu*fs^-2*Ang^-1
59 degrees_freedom = 6*nmol; // number of degrees of freedom for the system
60 keconverter = 4.184e-4; // to convert ke from kcal/mol to amu*Ang^2*fs^-2/K
61
62 pressure_ext = pressure * pressure_units;
63 volume = boxx*boxy*boxz;
64 ke_temp = ke * keconverter;
65 NkBT = degrees_freedom*kB*temp;
66
67 // propogate the strain rate
68 epsilon_dot = epsilon_dot + dt*( (p_mol - pressure_ext)*volume
69 / (tau_relax*tau_relax * kB * temp) );
70
71 // determine the change in cell volume
72 scale = (1.0d0 + dt*3.0d0*epsilon_dot)**(1.0d0/3.0d0);
73
74 volume = volume * scale**3;
75
76 // save old lengths and update box size
77 boxx_old = boxx;
78 boxy_old = boxy;
79 boxz_old = boxz;
80 boxx = boxx_old*scale;
81 boxy = boxy_old*scale;
82 boxz = boxz_old*scale;
83
84 epsilonScale = epsilon_dot * dt;
85
86 // advance the zeta term to zeta(t + dt) - zeta is 0.0d0 on config. readin
87 // qmass is set in the parameter file
88 zeta = zeta + dt*((ke_temp*2 - NkBT)/qmass);
89 zetaScale = zeta * dt;
90
91 // apply barostating and thermostating to velocities and angular momenta
92
93 for (i=0; i < nmol; i++) {
94
95 vxi = vx(i)*epsilonScale;
96 vyi = vy(i)*epsilonScale;
97 vzi = vz(i)*epsilonScale;
98 vxi = vxi + vx(i)*zetaScale;
99 vyi = vyi + vy(i)*zetaScale;
100 vzi = vzi + vz(i)*zetaScale;
101 jxi = jx(i)*zetaScale;
102 jyi = jy(i)*zetaScale;
103 jzi = jz(i)*zetaScale;
104
105 vx(i) = vx(i) - vxi;
106 vy(i) = vy(i) - vyi;
107 vz(i) = vz(i) - vzi;
108 jx(i) = jx(i) - jxi;
109 jy(i) = jy(i) - jyi;
110 jz(i) = jz(i) - jzi;
111 }
112
113 // perform affine transform to update positions with volume fluctuations
114 affine_transform( boxx_old, boxy_old, boxz_old );
115 }
116
117 void NVT::affine_transform( double boxx_old, double boxy_old, double boxz_old ){
118
119 int i;
120 double boxx_old, boxy_old, boxz_old, percentScale;
121 double boxx_num, boxy_num, boxz_num, rxi, ryi, rzi;
122
123 // first determine the scaling factor from the box size change
124 percentScale = (boxx - boxx_old)/boxx_old;
125
126
127 for (i=0; i < nmol; i++) {
128
129 // find the minimum image coordinates
130 boxx_num = boxx_old*dsign(1.0d0,rx(i))*int(abs(rx(i)/boxx_old)+0.5d0);
131 boxy_num = boxy_old*dsign(1.0d0,ry(i))*int(abs(ry(i)/boxy_old)+0.5d0);
132 boxz_num = boxz_old*dsign(1.0d0,rz(i))*int(abs(rz(i)/boxz_old)+0.5d0);
133
134 rxi = rx(i) - boxx_num;
135 ryi = ry(i) - boxy_num;
136 rzi = rz(i) - boxz_num;
137
138 // update the minimum image coordinates using the scaling factor
139 rxi = rxi + rxi*percentScale;
140 ryi = ryi + ryi*percentScale;
141 rzi = rzi + rzi*percentScale;
142
143 rx(i) = rxi + boxx_num;
144 ry(i) = ryi + boxy_num;
145 rz(i) = rzi + boxz_num;
146 }
147 }