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

# User Rev Content
1 gezelter 445 #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     }