1 |
+ |
#include <math.h> |
2 |
+ |
|
3 |
|
#include "Atom.hpp" |
4 |
|
#include "SRI.hpp" |
5 |
|
#include "AbstractClasses.hpp" |
29 |
|
have_chi_tolerance = 0; |
30 |
|
integralOfChidt = 0.0; |
31 |
|
|
30 |
– |
// retrieve chi and integralOfChidt from simInfo |
31 |
– |
data = info->getProperty(CHIVALUE_ID); |
32 |
– |
if(data){ |
33 |
– |
chiValue = dynamic_cast<DoubleData*>(data); |
34 |
– |
} |
32 |
|
|
33 |
< |
data = info->getProperty(INTEGRALOFCHIDT_ID); |
37 |
< |
if(data){ |
38 |
< |
integralOfChidtValue = dynamic_cast<DoubleData*>(data); |
39 |
< |
} |
33 |
> |
if( theInfo->useInitXSstate ){ |
34 |
|
|
35 |
< |
// chi and integralOfChidt should appear by pair |
36 |
< |
if(chiValue && integralOfChidtValue){ |
37 |
< |
chi = chiValue->getData(); |
38 |
< |
integralOfChidt = integralOfChidtValue->getData(); |
35 |
> |
// retrieve chi and integralOfChidt from simInfo |
36 |
> |
data = info->getProperty(CHIVALUE_ID); |
37 |
> |
if(data){ |
38 |
> |
chiValue = dynamic_cast<DoubleData*>(data); |
39 |
> |
} |
40 |
> |
|
41 |
> |
data = info->getProperty(INTEGRALOFCHIDT_ID); |
42 |
> |
if(data){ |
43 |
> |
integralOfChidtValue = dynamic_cast<DoubleData*>(data); |
44 |
> |
} |
45 |
> |
|
46 |
> |
// chi and integralOfChidt should appear by pair |
47 |
> |
if(chiValue && integralOfChidtValue){ |
48 |
> |
chi = chiValue->getData(); |
49 |
> |
integralOfChidt = integralOfChidtValue->getData(); |
50 |
> |
} |
51 |
|
} |
52 |
|
|
53 |
< |
oldVel = new double[3*nAtoms]; |
54 |
< |
oldJi = new double[3*nAtoms]; |
53 |
> |
|
54 |
> |
std::cerr << "building oldVel with \t" << integrableObjects.size() << "\n"; |
55 |
> |
oldVel = new double[3*integrableObjects.size()]; |
56 |
> |
oldJi = new double[3*integrableObjects.size()]; |
57 |
|
} |
58 |
|
|
59 |
|
template<typename T> NVT<T>::~NVT() { |
75 |
|
|
76 |
|
instTemp = tStats->getTemperature(); |
77 |
|
|
78 |
< |
for( i=0; i<nAtoms; i++ ){ |
78 |
> |
for( i=0; i < integrableObjects.size(); i++ ){ |
79 |
|
|
80 |
< |
atoms[i]->getVel( vel ); |
81 |
< |
atoms[i]->getPos( pos ); |
82 |
< |
atoms[i]->getFrc( frc ); |
80 |
> |
integrableObjects[i]->getVel( vel ); |
81 |
> |
integrableObjects[i]->getPos( pos ); |
82 |
> |
integrableObjects[i]->getFrc( frc ); |
83 |
|
|
84 |
< |
mass = atoms[i]->getMass(); |
84 |
> |
mass = integrableObjects[i]->getMass(); |
85 |
|
|
86 |
|
for (j=0; j < 3; j++) { |
87 |
|
// velocity half step (use chi from previous step here): |
90 |
|
pos[j] += dt * vel[j]; |
91 |
|
} |
92 |
|
|
93 |
< |
atoms[i]->setVel( vel ); |
94 |
< |
atoms[i]->setPos( pos ); |
93 |
> |
integrableObjects[i]->setVel( vel ); |
94 |
> |
integrableObjects[i]->setPos( pos ); |
95 |
|
|
96 |
< |
if( atoms[i]->isDirectional() ){ |
96 |
> |
if( integrableObjects[i]->isDirectional() ){ |
97 |
|
|
90 |
– |
dAtom = (DirectionalAtom *)atoms[i]; |
91 |
– |
|
98 |
|
// get and convert the torque to body frame |
99 |
|
|
100 |
< |
dAtom->getTrq( Tb ); |
101 |
< |
dAtom->lab2Body( Tb ); |
100 |
> |
integrableObjects[i]->getTrq( Tb ); |
101 |
> |
integrableObjects[i]->lab2Body( Tb ); |
102 |
|
|
103 |
|
// get the angular momentum, and propagate a half step |
104 |
|
|
105 |
< |
dAtom->getJ( ji ); |
105 |
> |
integrableObjects[i]->getJ( ji ); |
106 |
|
|
107 |
|
for (j=0; j < 3; j++) |
108 |
|
ji[j] += dt2 * (Tb[j] * eConvert - ji[j]*chi); |
109 |
|
|
110 |
< |
this->rotationPropagation( dAtom, ji ); |
110 |
> |
this->rotationPropagation( integrableObjects[i], ji ); |
111 |
|
|
112 |
< |
dAtom->setJ( ji ); |
112 |
> |
integrableObjects[i]->setJ( ji ); |
113 |
|
} |
114 |
|
} |
115 |
|
|
120 |
|
// Finally, evolve chi a half step (just like a velocity) using |
121 |
|
// temperature at time t, not time t+dt/2 |
122 |
|
|
123 |
+ |
std::cerr << "targetTemp = " << targetTemp << " instTemp = " << instTemp << " tauThermostat = " << tauThermostat << " integral of Chi = " << integralOfChidt << "\n"; |
124 |
+ |
|
125 |
|
chi += dt2 * ( instTemp / targetTemp - 1.0) / (tauThermostat*tauThermostat); |
126 |
|
integralOfChidt += chi*dt2; |
127 |
|
|
129 |
|
|
130 |
|
template<typename T> void NVT<T>::moveB( void ){ |
131 |
|
int i, j, k; |
124 |
– |
DirectionalAtom* dAtom; |
132 |
|
double Tb[3], ji[3]; |
133 |
|
double vel[3], frc[3]; |
134 |
|
double mass; |
139 |
|
|
140 |
|
oldChi = chi; |
141 |
|
|
142 |
< |
for( i=0; i<nAtoms; i++ ){ |
142 |
> |
for( i=0; i < integrableObjects.size(); i++ ){ |
143 |
|
|
144 |
< |
atoms[i]->getVel( vel ); |
144 |
> |
integrableObjects[i]->getVel( vel ); |
145 |
|
|
146 |
|
for (j=0; j < 3; j++) |
147 |
|
oldVel[3*i + j] = vel[j]; |
148 |
|
|
149 |
< |
if( atoms[i]->isDirectional() ){ |
149 |
> |
if( integrableObjects[i]->isDirectional() ){ |
150 |
|
|
151 |
< |
dAtom = (DirectionalAtom *)atoms[i]; |
151 |
> |
integrableObjects[i]->getJ( ji ); |
152 |
|
|
146 |
– |
dAtom->getJ( ji ); |
147 |
– |
|
153 |
|
for (j=0; j < 3; j++) |
154 |
|
oldJi[3*i + j] = ji[j]; |
155 |
|
|
168 |
|
chi = oldChi + dt2 * ( instTemp / targetTemp - 1.0) / |
169 |
|
(tauThermostat*tauThermostat); |
170 |
|
|
171 |
< |
for( i=0; i<nAtoms; i++ ){ |
171 |
> |
for( i=0; i < integrableObjects.size(); i++ ){ |
172 |
|
|
173 |
< |
atoms[i]->getFrc( frc ); |
174 |
< |
atoms[i]->getVel(vel); |
173 |
> |
integrableObjects[i]->getFrc( frc ); |
174 |
> |
integrableObjects[i]->getVel(vel); |
175 |
|
|
176 |
< |
mass = atoms[i]->getMass(); |
176 |
> |
mass = integrableObjects[i]->getMass(); |
177 |
|
|
178 |
|
// velocity half step |
179 |
|
for (j=0; j < 3; j++) |
180 |
|
vel[j] = oldVel[3*i+j] + dt2 * ((frc[j] / mass ) * eConvert - oldVel[3*i + j]*chi); |
181 |
|
|
182 |
< |
atoms[i]->setVel( vel ); |
182 |
> |
integrableObjects[i]->setVel( vel ); |
183 |
|
|
184 |
< |
if( atoms[i]->isDirectional() ){ |
184 |
> |
if( integrableObjects[i]->isDirectional() ){ |
185 |
|
|
181 |
– |
dAtom = (DirectionalAtom *)atoms[i]; |
182 |
– |
|
186 |
|
// get and convert the torque to body frame |
187 |
|
|
188 |
< |
dAtom->getTrq( Tb ); |
189 |
< |
dAtom->lab2Body( Tb ); |
188 |
> |
integrableObjects[i]->getTrq( Tb ); |
189 |
> |
integrableObjects[i]->lab2Body( Tb ); |
190 |
|
|
191 |
|
for (j=0; j < 3; j++) |
192 |
|
ji[j] = oldJi[3*i + j] + dt2 * (Tb[j] * eConvert - oldJi[3*i+j]*chi); |
193 |
|
|
194 |
< |
dAtom->setJ( ji ); |
194 |
> |
integrableObjects[i]->setJ( ji ); |
195 |
|
} |
196 |
|
} |
197 |
|
|
272 |
|
|
273 |
|
conservedQuantity = Energy + thermostat_kinetic + thermostat_potential; |
274 |
|
|
272 |
– |
cerr << info->getTime() << "\t" << Energy << "\t" << thermostat_kinetic << |
273 |
– |
"\t" << thermostat_potential << "\t" << conservedQuantity << endl; |
274 |
– |
|
275 |
|
return conservedQuantity; |
276 |
|
} |
277 |
|
|
280 |
|
const int BUFFERSIZE = 2000; // size of the read buffer |
281 |
|
char buffer[BUFFERSIZE]; |
282 |
|
|
283 |
< |
sprintf(buffer,"\t%g\t%g;", chi, integralOfChidt); |
283 |
> |
sprintf(buffer,"\t%G\t%G;", chi, integralOfChidt); |
284 |
|
parameters += buffer; |
285 |
|
|
286 |
|
return parameters; |