# | Line 125 | Line 125 | double Thermo::getTotalE(){ | |
---|---|---|
125 | return total; | |
126 | } | |
127 | ||
128 | < | int Thermo::getNDF(){ |
129 | < | int ndf_local, ndf; |
130 | < | |
131 | < | ndf_local = 3 * entry_plug->n_atoms + 3 * entry_plug->n_oriented |
132 | < | - entry_plug->n_constraints; |
128 | > | double Thermo::getTemperature(){ |
129 | ||
130 | < | #ifdef IS_MPI |
131 | < | MPI_Allreduce(&ndf_local,&ndf,1,MPI_INT,MPI_SUM, MPI_COMM_WORLD); |
132 | < | #else |
133 | < | ndf = ndf_local; |
134 | < | #endif |
139 | < | |
140 | < | ndf = ndf - 3; |
141 | < | |
142 | < | return ndf; |
130 | > | const double kb = 1.9872179E-3; // boltzman's constant in kcal/(mol K) |
131 | > | double temperature; |
132 | > | |
133 | > | temperature = ( 2.0 * this->getKinetic() ) / ((double)entry_plug->ndf * kb ); |
134 | > | return temperature; |
135 | } | |
136 | ||
137 | < | int Thermo::getNDFraw() { |
138 | < | int ndfRaw_local, ndfRaw; |
139 | < | |
148 | < | // Raw degrees of freedom that we have to set |
149 | < | ndfRaw_local = 3 * entry_plug->n_atoms + 3 * entry_plug->n_oriented; |
137 | > | double Thermo::getPressure() { |
138 | > | // returns the pressure in units of atm |
139 | > | // Relies on the calculation of the full molecular pressure tensor |
140 | ||
141 | < | #ifdef IS_MPI |
142 | < | MPI_Allreduce(&ndfRaw_local,&ndfRaw,1,MPI_INT,MPI_SUM, MPI_COMM_WORLD); |
143 | < | #else |
154 | < | ndfRaw = ndfRaw_local; |
155 | < | #endif |
141 | > | const double p_convert = 1.63882576e8; |
142 | > | double press[9]; |
143 | > | double pressure; |
144 | ||
145 | < | return ndfRaw; |
158 | < | } |
145 | > | this->getPressureTensor(press); |
146 | ||
147 | + | pressure = p_convert * (press[0] + press[4] + press[8]) / 3.0; |
148 | ||
149 | < | double Thermo::getTemperature(){ |
162 | < | |
163 | < | const double kb = 1.9872179E-3; // boltzman's constant in kcal/(mol K) |
164 | < | double temperature; |
165 | < | |
166 | < | temperature = ( 2.0 * this->getKinetic() ) / ( (double)this->getNDF() * kb ); |
167 | < | return temperature; |
149 | > | return pressure; |
150 | } | |
151 | ||
152 | < | double Thermo::getPressure(){ |
153 | < | // returns pressure in units amu*fs^-2*Ang^-1 |
152 | > | |
153 | > | void Thermo::getPressureTensor(double press[9]){ |
154 | > | // returns pressure tensor in units amu*fs^-2*Ang^-1 |
155 | // routine derived via viral theorem description in: | |
156 | // Paci, E. and Marchi, M. J.Phys.Chem. 1996, 100, 4314-4322 | |
157 | ||
158 | < | return 0.0; |
158 | > | const double e_convert = 4.184e-4; |
159 | > | |
160 | > | double molmass, volume; |
161 | > | double vcom[3]; |
162 | > | double p_local[9], p_global[9]; |
163 | > | double theBox[3]; |
164 | > | double* tau; |
165 | > | int i, nMols; |
166 | > | Molecule* molecules; |
167 | > | |
168 | > | nMols = entry_plug->n_mol; |
169 | > | molecules = entry_plug->molecules; |
170 | > | tau = entry_plug->tau; |
171 | > | |
172 | > | // use velocities of molecular centers of mass and molecular masses: |
173 | > | for (i=0; i < 9; i++) { |
174 | > | p_local[i] = 0.0; |
175 | > | p_global[i] = 0.0; |
176 | > | } |
177 | > | |
178 | > | for (i=0; i < nMols; i++) { |
179 | > | molmass = molecules[i].getCOMvel(vcom); |
180 | > | |
181 | > | p_local[0] += molmass * (vcom[0] * vcom[0]); |
182 | > | p_local[1] += molmass * (vcom[0] * vcom[1]); |
183 | > | p_local[2] += molmass * (vcom[0] * vcom[2]); |
184 | > | p_local[3] += molmass * (vcom[1] * vcom[0]); |
185 | > | p_local[4] += molmass * (vcom[1] * vcom[1]); |
186 | > | p_local[5] += molmass * (vcom[1] * vcom[2]); |
187 | > | p_local[6] += molmass * (vcom[2] * vcom[0]); |
188 | > | p_local[7] += molmass * (vcom[2] * vcom[1]); |
189 | > | p_local[8] += molmass * (vcom[2] * vcom[2]); |
190 | > | } |
191 | > | |
192 | > | // Get total for entire system from MPI. |
193 | > | |
194 | > | #ifdef IS_MPI |
195 | > | MPI_Allreduce(p_local,p_global,9,MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); |
196 | > | #else |
197 | > | for (i=0; i<9; i++) { |
198 | > | p_global[i] = p_local[i]; |
199 | > | } |
200 | > | #endif // is_mpi |
201 | > | |
202 | > | entry_plug->getBox(theBox); |
203 | > | |
204 | > | volume = theBox[0] * theBox[1] * theBox[2]; |
205 | > | |
206 | > | for(i=0; i<9; i++) { |
207 | > | press[i] = (p_global[i] - tau[i]*e_convert) / volume; |
208 | > | } |
209 | } | |
210 | ||
211 | void Thermo::velocitize() { | |
# | Line 186 | Line 219 | void Thermo::velocitize() { | |
219 | const double kb = 8.31451e-7; // kb in amu, angstroms, fs, etc. | |
220 | double av2; | |
221 | double kebar; | |
189 | – | int ndf, ndf_local; // number of degrees of freedom |
190 | – | int ndfRaw, ndfRaw_local; // the raw number of degrees of freedom |
222 | int n_atoms; | |
223 | Atom** atoms; | |
224 | DirectionalAtom* dAtom; | |
# | Line 201 | Line 232 | void Thermo::velocitize() { | |
232 | n_oriented = entry_plug->n_oriented; | |
233 | n_constraints = entry_plug->n_constraints; | |
234 | ||
235 | < | kebar = kb * temperature * (double)this->getNDF() / |
236 | < | ( 2.0 * (double)this->getNDFraw() ); |
235 | > | kebar = kb * temperature * (double)entry_plug->ndf / |
236 | > | ( 2.0 * (double)entry_plug->ndfRaw ); |
237 | ||
238 | for(vr = 0; vr < n_atoms; vr++){ | |
239 |
– | Removed lines |
+ | Added lines |
< | Changed lines |
> | Changed lines |