# | Line 134 | Line 134 | double Thermo::getTemperature(){ | |
---|---|---|
134 | return temperature; | |
135 | } | |
136 | ||
137 | < | double Thermo::getPressure(){ |
138 | < | // returns pressure in units amu*fs^-2*Ang^-1 |
137 | > | double Thermo::getEnthalpy() { |
138 | > | |
139 | > | const double e_convert = 4.184E-4; // convert kcal/mol -> (amu A^2)/fs^2 |
140 | > | double u, p, v; |
141 | > | double press[9]; |
142 | > | |
143 | > | u = this->getTotalE(); |
144 | > | |
145 | > | this->getPressureTensor(press); |
146 | > | p = (press[0] + press[4] + press[8]) / 3.0; |
147 | > | |
148 | > | v = this->getVolume(); |
149 | > | |
150 | > | return (u + (p*v)/e_convert); |
151 | > | } |
152 | > | |
153 | > | double Thermo::getVolume() { |
154 | > | |
155 | > | return entry_plug->boxVol; |
156 | > | } |
157 | > | |
158 | > | double Thermo::getPressure() { |
159 | > | |
160 | > | // Relies on the calculation of the full molecular pressure tensor |
161 | > | |
162 | > | const double p_convert = 1.63882576e8; |
163 | > | double press[9]; |
164 | > | double pressure; |
165 | > | |
166 | > | this->getPressureTensor(press); |
167 | > | |
168 | > | pressure = p_convert * (press[0] + press[4] + press[8]) / 3.0; |
169 | > | |
170 | > | return pressure; |
171 | > | } |
172 | > | |
173 | > | |
174 | > | void Thermo::getPressureTensor(double press[9]){ |
175 | > | // returns pressure tensor in units amu*fs^-2*Ang^-1 |
176 | // routine derived via viral theorem description in: | |
177 | // Paci, E. and Marchi, M. J.Phys.Chem. 1996, 100, 4314-4322 | |
178 | ||
179 | < | const double convert = 4.184e-4; |
180 | < | double molmass; |
181 | < | double vcom[3]; |
182 | < | double p_local, p_sum, p_mol, virial; |
179 | > | const double e_convert = 4.184e-4; |
180 | > | |
181 | > | double molmass, volume; |
182 | > | double vcom[3]; |
183 | > | double p_local[9], p_global[9]; |
184 | double theBox[3]; | |
185 | < | double* tau; |
185 | > | //double* tau; |
186 | int i, nMols; | |
187 | Molecule* molecules; | |
188 | ||
189 | nMols = entry_plug->n_mol; | |
190 | molecules = entry_plug->molecules; | |
191 | < | tau = entry_plug->tau; |
191 | > | //tau = entry_plug->tau; |
192 | ||
193 | // use velocities of molecular centers of mass and molecular masses: | |
194 | < | p_local = 0.0; |
194 | > | for (i=0; i < 9; i++) { |
195 | > | p_local[i] = 0.0; |
196 | > | p_global[i] = 0.0; |
197 | > | } |
198 | ||
199 | for (i=0; i < nMols; i++) { | |
200 | molmass = molecules[i].getCOMvel(vcom); | |
201 | < | p_local += (vcom[0]*vcom[0] + vcom[1]*vcom[1] + vcom[2]*vcom[2]) * molmass; |
201 | > | |
202 | > | p_local[0] += molmass * (vcom[0] * vcom[0]); |
203 | > | p_local[1] += molmass * (vcom[0] * vcom[1]); |
204 | > | p_local[2] += molmass * (vcom[0] * vcom[2]); |
205 | > | p_local[3] += molmass * (vcom[1] * vcom[0]); |
206 | > | p_local[4] += molmass * (vcom[1] * vcom[1]); |
207 | > | p_local[5] += molmass * (vcom[1] * vcom[2]); |
208 | > | p_local[6] += molmass * (vcom[2] * vcom[0]); |
209 | > | p_local[7] += molmass * (vcom[2] * vcom[1]); |
210 | > | p_local[8] += molmass * (vcom[2] * vcom[2]); |
211 | } | |
212 | ||
213 | // Get total for entire system from MPI. | |
214 | + | |
215 | #ifdef IS_MPI | |
216 | < | MPI_Allreduce(&p_local,&p_sum,1,MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); |
216 | > | MPI_Allreduce(p_local,p_global,9,MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); |
217 | #else | |
218 | < | p_sum = p_local; |
218 | > | for (i=0; i<9; i++) { |
219 | > | p_global[i] = p_local[i]; |
220 | > | } |
221 | #endif // is_mpi | |
222 | ||
223 | < | virial = tau[0] + tau[4] + tau[8]; |
171 | < | entry_plug->getBox(theBox); |
223 | > | volume = entry_plug->boxVol; |
224 | ||
225 | < | p_mol = (p_sum - virial*convert) / (3.0 * theBox[0] * theBox[1]* theBox[2]); |
226 | < | |
227 | < | return p_mol; |
225 | > | for(i=0; i<9; i++) { |
226 | > | press[i] = (p_global[i] - entry_plug->tau[i]*e_convert) / volume; |
227 | > | } |
228 | } | |
229 | ||
230 | void Thermo::velocitize() { |
– | Removed lines |
+ | Added lines |
< | Changed lines |
> | Changed lines |