85 |
|
stringToEnumMap_["ShiftScaleVAM"] = rnemdShiftScaleVAM; |
86 |
|
stringToEnumMap_["Unknown"] = rnemdUnknown; |
87 |
|
|
88 |
+ |
runTime_ = simParams->getRunTime(); |
89 |
+ |
statusTime_ = simParams->getStatusTime(); |
90 |
+ |
|
91 |
|
rnemdObjectSelection_ = simParams->getRNEMD_objectSelection(); |
92 |
|
evaluator_.loadScriptString(rnemdObjectSelection_); |
93 |
|
seleMan_.setSelectionSet(evaluator_.evaluate()); |
158 |
|
if (simParams->haveRNEMD_outputRotTemperature()) { |
159 |
|
outputRotTemp_ = simParams->getRNEMD_outputRotTemperature(); |
160 |
|
} |
161 |
+ |
// James put this in. |
162 |
+ |
outputDen_ = false; |
163 |
+ |
if (simParams->haveRNEMD_outputDen()) { |
164 |
+ |
outputDen_ = simParams->getRNEMD_outputDen(); |
165 |
+ |
} |
166 |
+ |
outputAh_ = false; |
167 |
+ |
if (simParams->haveRNEMD_outputAh()) { |
168 |
+ |
outputAh_ = simParams->getRNEMD_outputAh(); |
169 |
+ |
} |
170 |
+ |
outputVz_ = false; |
171 |
+ |
if (simParams->haveRNEMD_outputVz()) { |
172 |
+ |
outputVz_ = simParams->getRNEMD_outputVz(); |
173 |
+ |
} else if ((rnemdType_ == rnemdPz) || (rnemdType_ == rnemdPzScale)) { |
174 |
+ |
outputVz_ = true; |
175 |
+ |
} |
176 |
+ |
|
177 |
|
|
178 |
|
#ifdef IS_MPI |
179 |
|
if (worldRank == 0) { |
207 |
|
rnemdFileName = "temperatureR.log"; |
208 |
|
rotTempLog_.open(rnemdFileName.c_str()); |
209 |
|
} |
210 |
< |
|
210 |
> |
|
211 |
> |
//James put this in |
212 |
> |
if (outputDen_) { |
213 |
> |
rnemdFileName = "Density.log"; |
214 |
> |
denLog_.open(rnemdFileName.c_str()); |
215 |
> |
} |
216 |
> |
if (outputAh_) { |
217 |
> |
rnemdFileName = "Ah.log"; |
218 |
> |
AhLog_.open(rnemdFileName.c_str()); |
219 |
> |
} |
220 |
> |
if (outputVz_) { |
221 |
> |
rnemdFileName = "velocityZ.log"; |
222 |
> |
vzzLog_.open(rnemdFileName.c_str()); |
223 |
> |
} |
224 |
> |
logFrameCount_ = 0; |
225 |
|
#ifdef IS_MPI |
226 |
|
} |
227 |
|
#endif |
266 |
|
xyzTempCount_.resize(rnemdLogWidth_, 0); |
267 |
|
rotTempHist_.resize(rnemdLogWidth_, 0.0); |
268 |
|
rotTempCount_.resize(rnemdLogWidth_, 0); |
269 |
+ |
// James put this in |
270 |
+ |
DenHist_.resize(rnemdLogWidth_, 0.0); |
271 |
+ |
pzzHist_.resize(rnemdLogWidth_, 0.0); |
272 |
|
|
273 |
|
set_RNEMD_exchange_total(0.0); |
274 |
|
if (simParams->haveRNEMD_targetFlux()) { |
333 |
|
painCave.isFatal = 0; |
334 |
|
painCave.severity = OPENMD_INFO; |
335 |
|
simError(); |
336 |
< |
|
336 |
> |
|
337 |
|
if (outputTemp_) tempLog_.close(); |
338 |
|
if (outputVx_) vxzLog_.close(); |
339 |
|
if (outputVy_) vyzLog_.close(); |
353 |
|
zTempLog_.close(); |
354 |
|
} |
355 |
|
if (outputRotTemp_) rotTempLog_.close(); |
356 |
< |
|
356 |
> |
// James put this in |
357 |
> |
if (outputDen_) denLog_.close(); |
358 |
> |
if (outputAh_) AhLog_.close(); |
359 |
> |
if (outputVz_) vzzLog_.close(); |
360 |
> |
|
361 |
|
#ifdef IS_MPI |
362 |
|
} |
363 |
|
#endif |
494 |
|
RealType val; |
495 |
|
int rank; |
496 |
|
} max_vals, min_vals; |
497 |
< |
|
497 |
> |
|
498 |
|
if (my_min_found) { |
499 |
|
min_vals.val = min_val; |
500 |
|
} else { |
800 |
|
Kcz *= 0.5; |
801 |
|
Kcw *= 0.5; |
802 |
|
|
803 |
< |
std::cerr << "Khx= " << Khx << "\tKhy= " << Khy << "\tKhz= " << Khz |
804 |
< |
<< "\tKhw= " << Khw << "\tKcx= " << Kcx << "\tKcy= " << Kcy |
805 |
< |
<< "\tKcz= " << Kcz << "\tKcw= " << Kcw << "\n"; |
806 |
< |
std::cerr << "Phx= " << Phx << "\tPhy= " << Phy << "\tPhz= " << Phz |
807 |
< |
<< "\tPcx= " << Pcx << "\tPcy= " << Pcy << "\tPcz= " <<Pcz<<"\n"; |
803 |
> |
// std::cerr << "Khx= " << Khx << "\tKhy= " << Khy << "\tKhz= " << Khz |
804 |
> |
// << "\tKhw= " << Khw << "\tKcx= " << Kcx << "\tKcy= " << Kcy |
805 |
> |
// << "\tKcz= " << Kcz << "\tKcw= " << Kcw << "\n"; |
806 |
> |
// std::cerr << "Phx= " << Phx << "\tPhy= " << Phy << "\tPhz= " << Phz |
807 |
> |
// << "\tPcx= " << Pcx << "\tPcy= " << Pcy << "\tPcz= " <<Pcz<<"\n"; |
808 |
|
|
809 |
|
#ifdef IS_MPI |
810 |
|
MPI::COMM_WORLD.Allreduce(MPI::IN_PLACE, &Phx, 1, MPI::REALTYPE, MPI::SUM); |
1145 |
|
void RNEMD::doShiftScale() { |
1146 |
|
|
1147 |
|
Snapshot* currentSnap_ = info_->getSnapshotManager()->getCurrentSnapshot(); |
1148 |
+ |
RealType time = currentSnap_->getTime(); |
1149 |
|
Mat3x3d hmat = currentSnap_->getHmat(); |
1150 |
|
|
1151 |
|
seleMan_.setSelectionSet(evaluator_.evaluate()); |
1162 |
|
Vector3d Pc(V3Zero); |
1163 |
|
RealType Mc = 0.0; |
1164 |
|
RealType Kc = 0.0; |
1165 |
+ |
|
1166 |
|
|
1167 |
|
for (sd = seleMan_.beginSelected(selei); sd != NULL; |
1168 |
|
sd = seleMan_.nextSelected(selei)) { |
1240 |
|
Kh *= 0.5; |
1241 |
|
Kc *= 0.5; |
1242 |
|
|
1243 |
< |
std::cerr << "Mh= " << Mh << "\tKh= " << Kh << "\tMc= " << Mc |
1244 |
< |
<< "\tKc= " << Kc << endl; |
1245 |
< |
std::cerr << "Ph= " << Ph << "\tPc= " << Pc << endl; |
1246 |
< |
|
1243 |
> |
// std::cerr << "Mh= " << Mh << "\tKh= " << Kh << "\tMc= " << Mc |
1244 |
> |
// << "\tKc= " << Kc << endl; |
1245 |
> |
// std::cerr << "Ph= " << Ph << "\tPc= " << Pc << endl; |
1246 |
> |
|
1247 |
|
#ifdef IS_MPI |
1248 |
|
MPI::COMM_WORLD.Allreduce(MPI::IN_PLACE, &Ph[0], 3, MPI::REALTYPE, MPI::SUM); |
1249 |
|
MPI::COMM_WORLD.Allreduce(MPI::IN_PLACE, &Pc[0], 3, MPI::REALTYPE, MPI::SUM); |
1257 |
|
if ((Mh > 0.0) && (Mc > 0.0)) {//both slabs are not empty |
1258 |
|
Vector3d vc = Pc / Mc; |
1259 |
|
Vector3d ac = njzp_ / Mc + vc; |
1260 |
+ |
Vector3d acrec = njzp_ / Mc; |
1261 |
|
RealType cNumerator = Kc - targetJzKE_ - 0.5 * Mc * ac.lengthSquare(); |
1262 |
|
if (cNumerator > 0.0) { |
1263 |
|
RealType cDenominator = Kc - 0.5 * Mc * vc.lengthSquare(); |
1266 |
|
if ((c > 0.9) && (c < 1.1)) {//restrict scaling coefficients |
1267 |
|
Vector3d vh = Ph / Mh; |
1268 |
|
Vector3d ah = jzp_ / Mh + vh; |
1269 |
+ |
Vector3d ahrec = jzp_ / Mh; |
1270 |
|
RealType hNumerator = Kh + targetJzKE_ |
1271 |
|
- 0.5 * Mh * ah.lengthSquare(); |
1272 |
|
if (hNumerator > 0.0) { |
1274 |
|
if (hDenominator > 0.0) { |
1275 |
|
RealType h = sqrt(hNumerator / hDenominator); |
1276 |
|
if ((h > 0.9) && (h < 1.1)) { |
1277 |
< |
std::cerr << "cold slab scaling coefficient: " << c << "\n"; |
1278 |
< |
std::cerr << "hot slab scaling coefficient: " << h << "\n"; |
1277 |
> |
// std::cerr << "cold slab scaling coefficient: " << c << "\n"; |
1278 |
> |
// std::cerr << "hot slab scaling coefficient: " << h << "\n"; |
1279 |
|
vector<StuntDouble*>::iterator sdi; |
1280 |
|
Vector3d vel; |
1281 |
|
for (sdi = coldBin.begin(); sdi != coldBin.end(); sdi++) { |
1305 |
|
// this is a redundant variable for doShiftScale() so that |
1306 |
|
// RNEMD can output one exchange quantity needed in a job. |
1307 |
|
// need a better way to do this. |
1308 |
+ |
//cerr << "acx =" << ac.x() << "ahx =" << ah.x() << '\n'; |
1309 |
+ |
//cerr << "acy =" << ac.y() << "ahy =" << ah.y() << '\n'; |
1310 |
+ |
//cerr << "acz =" << ac.z() << "ahz =" << ah.z() << '\n'; |
1311 |
+ |
Asum_ += (ahrec.z() - acrec.z()); |
1312 |
+ |
Jsum_ += (jzp_.z()*((1/Mh)+(1/Mc))); |
1313 |
+ |
AhCount_ = ahrec.z(); |
1314 |
+ |
if (outputAh_) { |
1315 |
+ |
AhLog_ << time << " "; |
1316 |
+ |
AhLog_ << AhCount_; |
1317 |
+ |
AhLog_ << endl; |
1318 |
+ |
} |
1319 |
|
} |
1320 |
|
} |
1321 |
|
} |
1324 |
|
} |
1325 |
|
} |
1326 |
|
if (successfulExchange != true) { |
1327 |
< |
sprintf(painCave.errMsg, |
1328 |
< |
"RNEMD: exchange NOT performed!\n"); |
1329 |
< |
painCave.isFatal = 0; |
1330 |
< |
painCave.severity = OPENMD_INFO; |
1331 |
< |
simError(); |
1327 |
> |
// sprintf(painCave.errMsg, |
1328 |
> |
// "RNEMD: exchange NOT performed!\n"); |
1329 |
> |
// painCave.isFatal = 0; |
1330 |
> |
// painCave.severity = OPENMD_INFO; |
1331 |
> |
// simError(); |
1332 |
|
failTrialCount_++; |
1333 |
|
} |
1334 |
|
} |
1371 |
|
StuntDouble* sd; |
1372 |
|
int idx; |
1373 |
|
|
1374 |
+ |
logFrameCount_++; |
1375 |
+ |
|
1376 |
|
// alternative approach, track all molecules instead of only those |
1377 |
|
// selected for scaling/swapping: |
1378 |
|
/* |
1381 |
|
Molecule* mol; |
1382 |
|
StuntDouble* integrableObject; |
1383 |
|
for (mol = info_->beginMolecule(miter); mol != NULL; |
1384 |
< |
mol = info_->nextMolecule(miter)) |
1384 |
> |
mol = info_->nextMolecule(miter)) |
1385 |
|
integrableObject is essentially sd |
1386 |
|
for (integrableObject = mol->beginIntegrableObject(iiter); |
1387 |
|
integrableObject != NULL; |
1484 |
|
/ PhysicalConstants::kb;//may move to getStatus() |
1485 |
|
rotTempHist_[binNo] += value; |
1486 |
|
} |
1487 |
< |
|
1487 |
> |
// James put this in. |
1488 |
> |
if (outputDen_) { |
1489 |
> |
//value = 1.0; |
1490 |
> |
DenHist_[binNo] += 1; |
1491 |
> |
} |
1492 |
> |
if (outputVz_) { |
1493 |
> |
value = mass * vel[2]; |
1494 |
> |
//vyzCount_[binNo]++; |
1495 |
> |
pzzHist_[binNo] += value; |
1496 |
> |
} |
1497 |
|
} |
1498 |
|
} |
1499 |
|
|
1559 |
|
MPI::COMM_WORLD.Allreduce(MPI::IN_PLACE, &rotTempCount_[0], |
1560 |
|
rnemdLogWidth_, MPI::INT, MPI::SUM); |
1561 |
|
} |
1562 |
< |
|
1562 |
> |
// James put this in |
1563 |
> |
if (outputDen_) { |
1564 |
> |
MPI::COMM_WORLD.Allreduce(MPI::IN_PLACE, &DenHist_[0], |
1565 |
> |
rnemdLogWidth_, MPI::REALTYPE, MPI::SUM); |
1566 |
> |
} |
1567 |
> |
if (outputAh_) { |
1568 |
> |
MPI::COMM_WORLD.Allreduce(MPI::IN_PLACE, &AhCount_, |
1569 |
> |
1, MPI::REALTYPE, MPI::SUM); |
1570 |
> |
} |
1571 |
> |
if (outputVz_) { |
1572 |
> |
MPI::COMM_WORLD.Allreduce(MPI::IN_PLACE, &pzzHist_[0], |
1573 |
> |
rnemdLogWidth_, MPI::REALTYPE, MPI::SUM); |
1574 |
> |
} |
1575 |
> |
|
1576 |
|
// If we're the root node, should we print out the results |
1577 |
|
int worldRank = MPI::COMM_WORLD.Get_rank(); |
1578 |
|
if (worldRank == 0) { |
1629 |
|
} |
1630 |
|
rotTempLog_ << endl; |
1631 |
|
} |
1632 |
< |
|
1632 |
> |
// James put this in. |
1633 |
> |
Mat3x3d hmat = currentSnap_->getHmat(); |
1634 |
> |
if (outputDen_) { |
1635 |
> |
denLog_ << time; |
1636 |
> |
for (j = 0; j < rnemdLogWidth_; j++) { |
1637 |
> |
|
1638 |
> |
RealType binVol = hmat(0,0) * hmat(1,1) * (hmat(2,2) / float(nBins_)); |
1639 |
> |
denLog_ << "\t" << DenHist_[j] / (float(logFrameCount_) * binVol); |
1640 |
> |
} |
1641 |
> |
denLog_ << endl; |
1642 |
> |
} |
1643 |
> |
if (outputVz_) { |
1644 |
> |
vzzLog_ << time; |
1645 |
> |
for (j = 0; j < rnemdLogWidth_; j++) { |
1646 |
> |
vzzLog_ << "\t" << pzzHist_[j] / mHist_[j]; |
1647 |
> |
} |
1648 |
> |
vzzLog_ << endl; |
1649 |
> |
} |
1650 |
|
#ifdef IS_MPI |
1651 |
|
} |
1652 |
|
#endif |
1682 |
|
rotTempCount_[j] = 0; |
1683 |
|
rotTempHist_[j] = 0.0; |
1684 |
|
} |
1685 |
+ |
// James put this in |
1686 |
+ |
if (outputDen_) |
1687 |
+ |
for (j = 0; j < rnemdLogWidth_; j++) { |
1688 |
+ |
//pyzCount_[j] = 0; |
1689 |
+ |
DenHist_[j] = 0.0; |
1690 |
+ |
} |
1691 |
+ |
if (outputVz_) |
1692 |
+ |
for (j = 0; j < rnemdLogWidth_; j++) { |
1693 |
+ |
//pyzCount_[j] = 0; |
1694 |
+ |
pzzHist_[j] = 0.0; |
1695 |
+ |
} |
1696 |
+ |
// reset the counter |
1697 |
+ |
|
1698 |
+ |
Numcount_++; |
1699 |
+ |
if (Numcount_ > int(runTime_/statusTime_)) |
1700 |
+ |
cerr << "time =" << time << " Asum =" << Asum_ << '\n'; |
1701 |
+ |
if (Numcount_ > int(runTime_/statusTime_)) |
1702 |
+ |
cerr << "time =" << time << " Jsum =" << Jsum_ << '\n'; |
1703 |
+ |
|
1704 |
+ |
logFrameCount_ = 0; |
1705 |
|
} |
1706 |
|
} |
1707 |
|
|