48#include "applications/dynamicProps/TimeCorrFunc.hpp"
54#include "utils/Revision.hpp"
55#include "utils/simError.h"
61 TimeCorrFunc<T>::TimeCorrFunc(
SimInfo* info,
const string& filename,
62 const string& sele1,
const string& sele2) :
64 dumpFilename_(filename), seleMan1_(info_), seleMan2_(info_),
65 selectionScript1_(sele1), selectionScript2_(sele2), evaluator1_(info_),
66 evaluator2_(info_), autoCorrFunc_(false), doSystemProperties_(false),
67 doMolecularProperties_(false), doObjectProperties_(false),
68 doBondProperties_(false), allowTimeFuzz_(false) {
69 reader_ =
new DumpReader(info_, dumpFilename_);
71 uniqueSelections_ = (sele1.compare(sele2) != 0) ? true :
false;
73 Globals* simParams = info_->getSimParams();
74 if (simParams->haveSampleTime()) {
75 deltaTime_ = simParams->getSampleTime();
77 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
78 "TimeCorrFunc Error: can not figure out deltaTime\n");
83 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
"Scanning for frames.");
85 painCave.severity = OPENMD_INFO;
88 nFrames_ = reader_->getNFrames();
91 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
92 "Not enough frames for a meaningful time correlation"
93 " (need >= 2, have %d).\n",
96 painCave.severity = OPENMD_WARNING;
100 nTimeBins_ = nFrames_;
103 histogram_.resize(nTimeBins_, zeroType);
104 count_.resize(nTimeBins_, 0);
106 times_.resize(nFrames_);
107 sele1ToIndex_.resize(nFrames_);
108 GIDtoSele1_.resize(nFrames_);
109 selection1StartFrame_.resize(nFrames_);
111 if (uniqueSelections_) {
112 sele2ToIndex_.resize(nFrames_);
113 GIDtoSele2_.resize(nFrames_);
114 selection2StartFrame_.resize(nFrames_);
117 progressBar_ = std::make_unique<ProgressBar>();
121 void TimeCorrFunc<T>::preCorrelate() {
122 evaluator1_.loadScriptString(selectionScript1_);
124 if (!evaluator1_.isDynamic()) {
125 seleMan1_.setSelectionSet(evaluator1_.evaluate());
126 validateSelection(seleMan1_);
129 if (uniqueSelections_) {
130 evaluator2_.loadScriptString(selectionScript2_);
131 if (!evaluator2_.isDynamic()) {
132 seleMan2_.setSelectionSet(evaluator2_.evaluate());
133 validateSelection(seleMan2_);
137 progressBar_->clear();
139 for (
int istep = 0; istep < nFrames_; istep++) {
140 reader_->readFrame(istep);
141 currentSnapshot_ = info_->getSnapshotManager()->getCurrentSnapshot();
142 times_[istep] = currentSnapshot_->getTime();
144 progressBar_->setStatus(istep + 1, nFrames_);
145 progressBar_->update();
151 RealType dt2Avg(0.0);
155 for (
int istep = 1; istep < nFrames_; istep++) {
156 RealType dt = times_[istep] - times_[istep - 1];
160 dtMean_ /= RealType(nFrames_ - 1);
161 dt2Avg /= RealType(nFrames_ - 1);
162 dtSigma_ = std::sqrt(dt2Avg - dtMean_ * dtMean_);
165 if (dtSigma_ > 1.0e-6) {
166 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
167 "TimeCorrFunc::preCorrelate: sampleTime (%f) does not match\n"
168 "\tthe mean spacing between configurations (%f), with\n"
169 "\tsigma (%f). Proceeding with the mean value.\n",
170 deltaTime_, dtMean_, dtSigma_);
171 allowTimeFuzz_ =
true;
172 painCave.isFatal = 0;
173 painCave.severity = OPENMD_INFO;
181 if (nStart_ >= nFrames_) {
182 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
183 "TimeCorrFunc: nStart (%d) >= nFrames (%d).\n",
185 painCave.isFatal = 1;
188 navg_ = (nFrames_ - nStart_ - nSep_) / nStride_;
190 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
191 "TimeCorrFunc: trajectory too short for even one window.\n"
192 "\tnFrames=%d, nStart=%d, nTimeBins=%d, nSep=%d\n",
193 nFrames_, nStart_, nTimeBins_, nSep_);
194 painCave.isFatal = 1;
197 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
198 "TimeCorrFunc: windowing enabled.\n"
199 "\tnStart=%d, nTimeBins=%d, nSep=%d, nStride=%d, navg=%d\n",
200 nStart_, nTimeBins_, nSep_, nStride_, navg_);
201 painCave.isFatal = 0;
202 painCave.severity = OPENMD_INFO;
211 void TimeCorrFunc<T>::computeFrame(
int istep) {
215 int imol1, imol2, isd1, isd2, ibond1, ibond2;
218 if (evaluator1_.isDynamic()) {
219 seleMan1_.setSelectionSet(evaluator1_.evaluate());
220 validateSelection(seleMan1_);
223 if (uniqueSelections_ && evaluator2_.isDynamic()) {
224 seleMan2_.setSelectionSet(evaluator2_.evaluate());
225 validateSelection(seleMan2_);
228 if (doSystemProperties_) {
229 computeProperty1(istep);
230 if (!autoCorrFunc_) computeProperty2(istep);
233 if (doMolecularProperties_) {
235 if (selectionModeRestart_)
236 GIDtoSele1_[istep].resize(info_->getNGlobalMolecules(), -1);
238 for (mol = seleMan1_.beginSelectedMolecule(imol1); mol != NULL;
239 mol = seleMan1_.nextSelectedMolecule(imol1)) {
240 index = computeProperty1(istep, mol);
242 if (index == sele1ToIndex_[istep].size()) {
243 sele1ToIndex_[istep].push_back(mol->getGlobalIndex());
245 sele1ToIndex_[istep].resize(index + 1);
246 sele1ToIndex_[istep][index] = mol->getGlobalIndex();
248 if (selectionModeRestart_) {
249 GIDtoSele1_[istep][mol->getGlobalIndex()] = index;
252 selection1StartFrame_[istep].push_back(istep);
254 int prevIndex = GIDtoSele1_[istep-1][mol->getGlobalIndex()];
256 selection1StartFrame_[istep].push_back(istep);
258 selection1StartFrame_[istep].push_back(selection1StartFrame_[istep-1][prevIndex]);
262 if (!uniqueSelections_) { index = computeProperty2(istep, mol); }
265 if (uniqueSelections_) {
267 if (selectionModeRestart_)
268 GIDtoSele2_[istep].resize(info_->getNGlobalMolecules(), -1);
270 for (mol = seleMan2_.beginSelectedMolecule(imol2); mol != NULL;
271 mol = seleMan2_.nextSelectedMolecule(imol2)) {
273 index = computeProperty1(istep, mol);
275 index = computeProperty2(istep, mol);
277 if (index == sele2ToIndex_[istep].size()) {
278 sele2ToIndex_[istep].push_back(mol->getGlobalIndex());
280 sele2ToIndex_[istep].resize(index + 1);
281 sele2ToIndex_[istep][index] = mol->getGlobalIndex();
283 if (selectionModeRestart_) {
285 GIDtoSele2_[istep][mol->getGlobalIndex()] = index;
287 selection2StartFrame_[istep].push_back(istep);
289 int prevIndex = GIDtoSele2_[istep-1][mol->getGlobalIndex()];
291 selection2StartFrame_[istep].push_back(istep);
293 selection2StartFrame_[istep].push_back(selection2StartFrame_[istep-1][prevIndex]);
300 if (doObjectProperties_) {
302 if (selectionModeRestart_)
303 GIDtoSele1_[istep].resize(info_->getNGlobalIntegrableObjects(), -1);
305 for (sd = seleMan1_.beginSelected(isd1); sd != NULL;
306 sd = seleMan1_.nextSelected(isd1)) {
307 index = computeProperty1(istep, sd);
309 if (index == sele1ToIndex_[istep].size()) {
310 sele1ToIndex_[istep].push_back(sd->getGlobalIndex());
312 sele1ToIndex_[istep].resize(index + 1);
313 sele1ToIndex_[istep][index] = sd->getGlobalIndex();
316 if (selectionModeRestart_) {
318 GIDtoSele1_[istep][sd->getGlobalIndex()] = index;
320 selection1StartFrame_[istep].push_back(istep);
322 int prevIndex = GIDtoSele1_[istep-1][sd->getGlobalIndex()];
324 selection1StartFrame_[istep].push_back(istep);
326 selection1StartFrame_[istep].push_back(selection1StartFrame_[istep-1][prevIndex]);
330 if (!uniqueSelections_) { index = computeProperty2(istep, sd); }
333 if (uniqueSelections_) {
335 if (selectionModeRestart_)
336 GIDtoSele2_[istep].resize(info_->getNGlobalIntegrableObjects(), -1);
338 for (sd = seleMan2_.beginSelected(isd2); sd != NULL;
339 sd = seleMan2_.nextSelected(isd2)) {
341 index = computeProperty1(istep, sd);
343 index = computeProperty2(istep, sd);
345 if (index == sele2ToIndex_[istep].size()) {
346 sele2ToIndex_[istep].push_back(sd->getGlobalIndex());
348 sele2ToIndex_[istep].resize(index + 1);
349 sele2ToIndex_[istep][index] = sd->getGlobalIndex();
351 if (selectionModeRestart_) {
353 GIDtoSele2_[istep][sd->getGlobalIndex()] = index;
355 selection2StartFrame_[istep].push_back(istep);
357 int prevIndex = GIDtoSele2_[istep-1][sd->getGlobalIndex()];
359 selection2StartFrame_[istep].push_back(istep);
361 selection2StartFrame_[istep].push_back(selection2StartFrame_[istep-1][prevIndex]);
368 if (doBondProperties_) {
370 if (selectionModeRestart_)
371 GIDtoSele1_[istep].resize(info_->getNGlobalBonds(), -1);
373 for (bond = seleMan1_.beginSelectedBond(ibond1); bond != NULL;
374 bond = seleMan1_.nextSelectedBond(ibond1)) {
375 index = computeProperty1(istep, bond);
377 if (index == sele1ToIndex_[istep].size()) {
378 sele1ToIndex_[istep].push_back(bond->getGlobalIndex());
380 sele1ToIndex_[istep].resize(index + 1);
381 sele1ToIndex_[istep][index] = bond->getGlobalIndex();
384 if (selectionModeRestart_) {
386 GIDtoSele1_[istep][bond->getGlobalIndex()] = index;
388 selection1StartFrame_[istep].push_back(istep);
390 int prevIndex = GIDtoSele1_[istep-1][bond->getGlobalIndex()];
392 selection1StartFrame_[istep].push_back(istep);
394 selection1StartFrame_[istep].push_back(selection1StartFrame_[istep-1][prevIndex]);
398 if (!uniqueSelections_) { index = computeProperty2(istep, bond); }
401 if (uniqueSelections_) {
403 if (selectionModeRestart_)
404 GIDtoSele2_[istep].resize(info_->getNGlobalBonds(), -1);
406 for (bond = seleMan2_.beginSelectedBond(ibond2); bond != NULL;
407 bond = seleMan2_.nextSelectedBond(ibond2)) {
409 index = computeProperty1(istep, bond);
411 index = computeProperty2(istep, bond);
413 if (index == sele2ToIndex_[istep].size()) {
414 sele2ToIndex_[istep].push_back(bond->getGlobalIndex());
416 sele2ToIndex_[istep].resize(index + 1);
417 sele2ToIndex_[istep][index] = bond->getGlobalIndex();
419 if (selectionModeRestart_) {
421 GIDtoSele2_[istep][bond->getGlobalIndex()] = index;
423 selection2StartFrame_[istep].push_back(istep);
425 int prevIndex = GIDtoSele2_[istep-1][bond->getGlobalIndex()];
427 selection2StartFrame_[istep].push_back(istep);
429 selection2StartFrame_[istep].push_back(selection2StartFrame_[istep-1][prevIndex]);
439 void TimeCorrFunc<T>::setWindowingParameters(RealType tcorr_fs,
int nStart, RealType tsep_fs) {
454 nSep_ =
static_cast<int>(tsep_fs / deltaTime_);
455 int nBins = (tcorr_fs > 0)
456 ?
static_cast<int>(tcorr_fs / deltaTime_)
458 nStride_ = std::max(1, nBins + nSep_);
459 useWindowing_ = (nStride_ != nBins || nStart_ > 0);
460 nTimeBins_ = useWindowing_ ? nBins : nFrames_;
463 histogram_.assign(nTimeBins_, zeroType);
464 count_.assign(nTimeBins_, 0);
468 void TimeCorrFunc<T>::doCorrelate() {
469 painCave.isFatal = 0;
470 painCave.severity = OPENMD_INFO;
471 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
472 "Starting pre-correlate scan.");
476 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
477 "Calculating correlation function.");
481 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
482 "Doing post-correlation calculations.");
486 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
"Writing output.");
492 void TimeCorrFunc<T>::correlation() {
494 for (
unsigned int i = 0; i < nTimeBins_; ++i) {
495 histogram_[i] = zeroType;
499 progressBar_->clear();
509 RealType samples =
static_cast<RealType
>(navg_ * nTimeBins_);
512 for (
int ii = 0; ii < navg_; ++ii) {
513 int frame0 = nStart_ + ii * nStride_;
515 for (
int tt = 0; tt < nTimeBins_; ++tt) {
516 int frame2 = frame0 + tt;
517 if (frame2 >= nFrames_)
break;
520 progressBar_->setStatus(visited, samples);
521 progressBar_->update();
524 correlateFrames(frame0, frame2, tt);
533 RealType samples = 0.5 * (nFrames_ + 1) * nFrames_;
536 for (
int i = 0; i < nFrames_; ++i) {
537 RealType time1 = times_[i];
539 for (
int j = i; j < nFrames_; ++j) {
541 progressBar_->setStatus(visited, samples);
542 progressBar_->update();
544 RealType time2 = times_[j];
546 if (std::fabs((time2 - time1) - (j - i) * dtMean_) >
547 6 * dtSigma_ * (j - i)) {
548 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
549 "TimeCorrFunc::correlation: mean sampleTime (%f)\n"
550 "\tin %s does not match actual time-spacing between\n"
551 "\tconfigurations %d (t = %f) and %d (t = %f).\n",
552 dtMean_, dumpFilename_.c_str(), i, time1, j, time2);
553 if (allowTimeFuzz_) {
554 painCave.isFatal = 0;
555 painCave.severity = OPENMD_INFO;
557 painCave.isFatal = 1;
558 painCave.severity = OPENMD_ERROR;
563 int timeBin = (nFrames_== 1) ? 0 : int((time2 - time1)/dtMean_ + 0.5);
564 correlateFrames(i, j, timeBin);
578 void TimeCorrFunc<T>::correlateFrames(
int frame1,
int frame2,
int timeBin) {
582 std::vector<int>::iterator i1;
583 std::vector<int>::iterator i2;
588 if (doSystemProperties_) {
589 corrVal = calcCorrVal(frame1, frame2);
590 histogram_[timeBin] += corrVal;
594 s1 = sele1ToIndex_[frame1];
596 if (uniqueSelections_)
597 s2 = sele2ToIndex_[frame2];
599 s2 = sele1ToIndex_[frame2];
601 for (i1 = s1.begin(), i2 = s2.begin(); i1 != s1.end() && i2 != s2.end();
608 while (i1 != s1.end() && *i1 < *i2) {
612 while (i2 != s2.end() && *i2 < *i1) {
616 if (i1 == s1.end() || i2 == s2.end())
break;
618 if (selectionModeRestart_) {
620 int ssf1 = selection1StartFrame_[frame1][i1 - s1.begin()];
621 int ssf2 = uniqueSelections_ ?
622 selection2StartFrame_[frame2][i2 - s2.begin()] :
623 selection1StartFrame_[frame2][i2 - s2.begin()];
626 if (ssf1 != ssf2)
break;
627 corrVal = calcCorrVal(frame1, frame2,
628 i1 - s1.begin(), i2 - s2.begin());
631 corrVal = calcCorrVal(frame1, frame2,
632 i1 - s1.begin(), i2 - s2.begin());
634 histogram_[timeBin] += corrVal;
641 void TimeCorrFunc<T>::postCorrelate() {
643 for (
unsigned int i = 0; i < nTimeBins_; ++i) {
645 histogram_[i] /= count_[i];
647 histogram_[i] = zeroType;
653 void TimeCorrFunc<T>::validateSelection(SelectionManager&) {}
656 void TimeCorrFunc<T>::writeCorrelate() {
657 ofstream ofs(outputFilename_.c_str());
662 ofs <<
"# " << getCorrFuncType() <<
"\n";
663 ofs <<
"# OpenMD " << r.getFullRevision() <<
"\n";
664 ofs <<
"# " << r.getBuildDate() <<
"\n";
665 ofs <<
"# selection script1: \"" << selectionScript1_;
666 ofs <<
"\"\tselection script2: \"" << selectionScript2_ <<
"\"\n";
667 if (!paramString_.empty())
668 ofs <<
"# parameters: " << paramString_ <<
"\n";
669 if (!labelString_.empty())
670 ofs <<
"#time\t" << labelString_ <<
"\n";
672 ofs <<
"#time\tcorrVal\n";
674 for (
unsigned int i = 0; i < nTimeBins_; ++i) {
676 RealType lagTime = useWindowing_ ?
677 static_cast<RealType
>(i) * dtMean_ :
678 times_[i] - times_[0];
679 ofs << lagTime <<
"\t" << histogram_[i] <<
"\n";
683 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
684 "TimeCorrFunc::writeCorrelate Error: fail to open %s\n",
685 outputFilename_.c_str());
686 painCave.isFatal = 1;
695 void TimeCorrFunc<Vector3d>::writeCorrelate() {
696 ofstream ofs(outputFilename_.c_str());
701 ofs <<
"# " << getCorrFuncType() <<
"\n";
702 ofs <<
"# OpenMD " << r.getFullRevision() <<
"\n";
703 ofs <<
"# " << r.getBuildDate() <<
"\n";
704 ofs <<
"# selection script1: \"" << selectionScript1_;
705 ofs <<
"\"\tselection script2: \"" << selectionScript2_ <<
"\"\n";
706 if (!paramString_.empty())
707 ofs <<
"# parameters: " << paramString_ <<
"\n";
708 if (!labelString_.empty())
709 ofs <<
"#time\t" << labelString_ <<
"\n";
711 ofs <<
"#time\tcorrVal\n";
713 for (
unsigned int i = 0; i < nTimeBins_; ++i) {
716 ofs << times_[i] - times_[0] <<
"\t";
717 for (
int j = 0; j < 3; j++) {
718 ofs << histogram_[i](j) <<
'\t';
726 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
727 "TimeCorrFunc::writeCorrelate Error: fail to open %s\n",
728 outputFilename_.c_str());
729 painCave.isFatal = 1;
738 void TimeCorrFunc<Mat3x3d>::writeCorrelate() {
739 ofstream ofs(outputFilename_.c_str());
744 ofs <<
"# " << getCorrFuncType() <<
"\n";
745 ofs <<
"# OpenMD " << r.getFullRevision() <<
"\n";
746 ofs <<
"# " << r.getBuildDate() <<
"\n";
747 ofs <<
"# selection script1: \"" << selectionScript1_;
748 ofs <<
"\"\tselection script2: \"" << selectionScript2_ <<
"\"\n";
749 if (!paramString_.empty())
750 ofs <<
"# parameters: " << paramString_ <<
"\n";
751 if (!labelString_.empty())
752 ofs <<
"#time\t" << labelString_ <<
"\n";
754 ofs <<
"#time\tcorrVal\n";
756 for (
unsigned int i = 0; i < nTimeBins_; ++i) {
760 ofs << times_[i] - times_[0] <<
"\t";
761 for (
int j = 0; j < 3; j++) {
762 for (
int k = 0; k < 3; k++) {
763 ofs << histogram_[i](j, k) <<
'\t';
771 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
772 "TimeCorrFunc::writeCorrelate Error: fail to open %s\n",
773 outputFilename_.c_str());
774 painCave.isFatal = 1;
784 CrossCorrFunc<T>::CrossCorrFunc(SimInfo* info,
const std::string& filename,
785 const std::string& sele1,
786 const std::string& sele2) :
787 TimeCorrFunc<T>(info, filename, sele1, sele2) {
788 this->autoCorrFunc_ =
false;
792 AutoCorrFunc<T>::AutoCorrFunc(SimInfo* info,
const std::string& filename,
793 const std::string& sele1,
794 const std::string& sele2) :
795 TimeCorrFunc<T>(info, filename, sele1, sele2) {
796 this->autoCorrFunc_ =
true;
800 SystemACF<T>::SystemACF(SimInfo* info,
const std::string& filename,
801 const std::string& sele1,
const std::string& sele2) :
802 AutoCorrFunc<T>(info, filename, sele1, sele2) {
803 this->autoCorrFunc_ =
true;
804 this->doSystemProperties_ =
true;
805 this->doMolecularProperties_ =
false;
806 this->doObjectProperties_ =
false;
807 this->doBondProperties_ =
false;
811 SystemCCF<T>::SystemCCF(SimInfo* info,
const std::string& filename,
812 const std::string& sele1,
const std::string& sele2) :
813 CrossCorrFunc<T>(info, filename, sele1, sele2) {
814 this->autoCorrFunc_ =
false;
815 this->doSystemProperties_ =
true;
816 this->doMolecularProperties_ =
false;
817 this->doObjectProperties_ =
false;
818 this->doBondProperties_ =
false;
822 ObjectACF<T>::ObjectACF(SimInfo* info,
const std::string& filename,
823 const std::string& sele1,
const std::string& sele2) :
824 AutoCorrFunc<T>(info, filename, sele1, sele2) {
825 this->autoCorrFunc_ =
true;
826 this->doSystemProperties_ =
false;
827 this->doMolecularProperties_ =
false;
828 this->doObjectProperties_ =
true;
829 this->doBondProperties_ =
false;
833 ObjectCCF<T>::ObjectCCF(SimInfo* info,
const std::string& filename,
834 const std::string& sele1,
const std::string& sele2) :
835 CrossCorrFunc<T>(info, filename, sele1, sele2) {
836 this->autoCorrFunc_ =
false;
837 this->doSystemProperties_ =
false;
838 this->doMolecularProperties_ =
false;
839 this->doObjectProperties_ =
true;
840 this->doBondProperties_ =
false;
844 MoleculeACF<T>::MoleculeACF(SimInfo* info,
const std::string& filename,
845 const std::string& sele1,
846 const std::string& sele2) :
847 AutoCorrFunc<T>(info, filename, sele1, sele2) {
848 this->autoCorrFunc_ =
true;
849 this->doSystemProperties_ =
false;
850 this->doMolecularProperties_ =
true;
851 this->doObjectProperties_ =
false;
852 this->doBondProperties_ =
false;
856 MoleculeCCF<T>::MoleculeCCF(SimInfo* info,
const std::string& filename,
857 const std::string& sele1,
858 const std::string& sele2) :
859 CrossCorrFunc<T>(info, filename, sele1, sele2) {
860 this->autoCorrFunc_ =
false;
861 this->doSystemProperties_ =
false;
862 this->doMolecularProperties_ =
true;
863 this->doObjectProperties_ =
false;
864 this->doBondProperties_ =
false;
867 template class AutoCorrFunc<RealType>;
868 template class TimeCorrFunc<RealType>;
869 template class CrossCorrFunc<RealType>;
871 template class AutoCorrFunc<Vector3d>;
872 template class TimeCorrFunc<Vector3d>;
873 template class CrossCorrFunc<Vector3d>;
875 template class AutoCorrFunc<Mat3x3d>;
876 template class TimeCorrFunc<Mat3x3d>;
877 template class CrossCorrFunc<Mat3x3d>;
879 template class TimeCorrFunc<DynamicVector<RealType>>;
881 template class AutoCorrFunc<Vector<RealType, 4>>;
882 template class TimeCorrFunc<Vector<RealType, 4>>;
883 template class CrossCorrFunc<Vector<RealType, 4>>;
885 template class SystemACF<RealType>;
886 template class SystemACF<Vector3d>;
887 template class SystemACF<Mat3x3d>;
889 template class SystemCCF<RealType>;
890 template class SystemCCF<Vector3d>;
891 template class SystemCCF<Mat3x3d>;
893 template class ObjectACF<RealType>;
894 template class ObjectACF<Vector3d>;
895 template class ObjectACF<Mat3x3d>;
897 template class ObjectCCF<RealType>;
898 template class ObjectCCF<Vector3d>;
899 template class ObjectCCF<Mat3x3d>;
900 template class ObjectCCF<int>;
902 template class MoleculeACF<RealType>;
903 template class MoleculeACF<Vector3d>;
904 template class MoleculeACF<Mat3x3d>;
905 template class MoleculeACF<Vector<RealType, 4>>;
907 template class MoleculeCCF<RealType>;
908 template class MoleculeCCF<Vector3d>;
909 template class MoleculeCCF<Mat3x3d>;
One of the heavy-weight classes of OpenMD, SimInfo maintains objects and variables relating to the cu...
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.