--- trunk/src/brains/Stats.cpp 2012/08/22 02:28:28 1782 +++ trunk/src/brains/Stats.cpp 2014/09/26 22:22:28 2022 @@ -35,7 +35,7 @@ * * [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005). * [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006). - * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008). + * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008). * [4] Kuang & Gezelter, J. Chem. Phys. 133, 164101 (2010). * [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011). */ @@ -195,11 +195,19 @@ namespace OpenMD { StatsData hydrogenbonding_potential; hydrogenbonding_potential.units = "kcal/mol"; - hydrogenbonding_potential.title = "Metallic Potential"; + hydrogenbonding_potential.title = "Hydrogen Bonding Potential"; hydrogenbonding_potential.dataType = "RealType"; hydrogenbonding_potential.accumulator = new Accumulator(); data_[HYDROGENBONDING_POTENTIAL] = hydrogenbonding_potential; statsMap_["HYDROGENBONDING_POTENTIAL"] = HYDROGENBONDING_POTENTIAL; + + StatsData reciprocal_potential; + reciprocal_potential.units = "kcal/mol"; + reciprocal_potential.title = "Reciprocal Space Potential"; + reciprocal_potential.dataType = "RealType"; + reciprocal_potential.accumulator = new Accumulator(); + data_[RECIPROCAL_POTENTIAL] = reciprocal_potential; + statsMap_["RECIPROCAL_POTENTIAL"] = RECIPROCAL_POTENTIAL; StatsData short_range_potential; short_range_potential.units = "kcal/mol"; @@ -273,6 +281,14 @@ namespace OpenMD { data_[SYSTEM_DIPOLE] = system_dipole; statsMap_["SYSTEM_DIPOLE"] = SYSTEM_DIPOLE; + StatsData system_quadrupole; + system_quadrupole.units = "C*m*m"; + system_quadrupole.title = "System Quadrupole"; + system_quadrupole.dataType = "Mat3x3d"; + system_quadrupole.accumulator = new MatrixAccumulator(); + data_[SYSTEM_QUADRUPOLE] = system_quadrupole; + statsMap_["SYSTEM_QUADRUPOLE"] = SYSTEM_QUADRUPOLE; + StatsData tagged_pair_distance; tagged_pair_distance.units = "Ang"; tagged_pair_distance.title = "Tagged_Pair_Distance"; @@ -312,6 +328,30 @@ namespace OpenMD { electronic_temperature.accumulator = new Accumulator(); data_[ELECTRONIC_TEMPERATURE] = electronic_temperature; statsMap_["ELECTRONIC_TEMPERATURE"] = ELECTRONIC_TEMPERATURE; + + StatsData com; + com.units = "A"; + com.title = "Center of Mass"; + com.dataType = "Vector3d"; + com.accumulator = new VectorAccumulator(); + data_[COM] = com; + statsMap_["COM"] = COM; + + StatsData comVel; + comVel.units = "A/fs"; + comVel.title = "Center of Mass Velocity"; + comVel.dataType = "Vector3d"; + comVel.accumulator = new VectorAccumulator(); + data_[COM_VELOCITY] = comVel; + statsMap_["COM_VELOCITY"] = COM_VELOCITY; + + StatsData angMom; + angMom.units = "amu A^2/fs"; + angMom.title = "Angular Momentum"; + angMom.dataType = "Vector3d"; + angMom.accumulator = new VectorAccumulator(); + data_[ANGULAR_MOMENTUM] = angMom; + statsMap_["ANGULAR_MOMENTUM"] = ANGULAR_MOMENTUM; // Now, set some defaults in the mask: @@ -344,6 +384,14 @@ namespace OpenMD { statsMask_.set(SYSTEM_DIPOLE); } + // Why do we have both of these? + if (simParams->getAccumulateBoxQuadrupole()) { + statsMask_.set(SYSTEM_QUADRUPOLE); + } + if (info_->getCalcBoxQuadrupole()){ + statsMask_.set(SYSTEM_QUADRUPOLE); + } + if (simParams->havePrintHeatFlux()) { if (simParams->getPrintHeatFlux()){ statsMask_.set(HEATFLUX); @@ -379,6 +427,10 @@ namespace OpenMD { } } + Stats::~Stats() { + data_.clear(); + statsMap_.clear(); + } std::string Stats::getTitle(int index) { assert(index >=0 && index < ENDINDEX); @@ -396,7 +448,6 @@ namespace OpenMD { } void Stats::collectStats(){ - Globals* simParams = info_->getSimParams(); Snapshot* snap = info_->getSnapshotManager()->getCurrentSnapshot(); Thermo thermo(info_); @@ -404,28 +455,28 @@ namespace OpenMD { if (statsMask_[i]) { switch (i) { case TIME: - data_[i].accumulator->add(snap->getTime()); + dynamic_cast(data_[i].accumulator)->add(snap->getTime()); break; case KINETIC_ENERGY: - data_[i].accumulator->add(thermo.getKinetic()); + dynamic_cast(data_[i].accumulator)->add(thermo.getKinetic()); break; case POTENTIAL_ENERGY: - data_[i].accumulator->add(thermo.getPotential()); + dynamic_cast(data_[i].accumulator)->add(thermo.getPotential()); break; case TOTAL_ENERGY: - data_[i].accumulator->add(thermo.getTotalEnergy()); + dynamic_cast(data_[i].accumulator)->add(thermo.getTotalEnergy()); break; case TEMPERATURE: - data_[i].accumulator->add(thermo.getTemperature()); + dynamic_cast(data_[i].accumulator)->add(thermo.getTemperature()); break; case PRESSURE: - data_[i].accumulator->add(thermo.getPressure()); + dynamic_cast(data_[i].accumulator)->add(thermo.getPressure()); break; case VOLUME: - data_[i].accumulator->add(thermo.getVolume()); + dynamic_cast(data_[i].accumulator)->add(thermo.getVolume()); break; case CONSERVED_QUANTITY: - data_[i].accumulator->add(snap->getConservedQuantity()); + dynamic_cast(data_[i].accumulator)->add(snap->getConservedQuantity()); break; case PRESSURE_TENSOR: dynamic_cast(data_[i].accumulator)->add(thermo.getPressureTensor()); @@ -433,71 +484,86 @@ namespace OpenMD { case SYSTEM_DIPOLE: dynamic_cast(data_[i].accumulator)->add(thermo.getSystemDipole()); break; + case SYSTEM_QUADRUPOLE: + dynamic_cast(data_[i].accumulator)->add(thermo.getSystemQuadrupole()); + break; case HEATFLUX: dynamic_cast(data_[i].accumulator)->add(thermo.getHeatFlux()); break; case HULLVOLUME: - data_[i].accumulator->add(thermo.getHullVolume()); + dynamic_cast(data_[i].accumulator)->add(thermo.getHullVolume()); break; case GYRVOLUME: - data_[i].accumulator->add(thermo.getGyrationalVolume()); + dynamic_cast(data_[i].accumulator)->add(thermo.getGyrationalVolume()); break; case TRANSLATIONAL_KINETIC: - data_[i].accumulator->add(thermo.getTranslationalKinetic()); + dynamic_cast(data_[i].accumulator)->add(thermo.getTranslationalKinetic()); break; case ROTATIONAL_KINETIC: - data_[i].accumulator->add(thermo.getRotationalKinetic()); + dynamic_cast(data_[i].accumulator)->add(thermo.getRotationalKinetic()); break; case LONG_RANGE_POTENTIAL: - data_[i].accumulator->add(snap->getLongRangePotential()); + dynamic_cast(data_[i].accumulator)->add(snap->getLongRangePotential()); break; case VANDERWAALS_POTENTIAL: - data_[i].accumulator->add(snap->getLongRangePotentials()[VANDERWAALS_FAMILY]); + dynamic_cast(data_[i].accumulator)->add(snap->getLongRangePotentials()[VANDERWAALS_FAMILY]); break; case ELECTROSTATIC_POTENTIAL: - data_[i].accumulator->add(snap->getLongRangePotentials()[ELECTROSTATIC_FAMILY]); + dynamic_cast(data_[i].accumulator)->add(snap->getLongRangePotentials()[ELECTROSTATIC_FAMILY]); break; case METALLIC_POTENTIAL: - data_[i].accumulator->add(snap->getLongRangePotentials()[METALLIC_FAMILY]); + dynamic_cast(data_[i].accumulator)->add(snap->getLongRangePotentials()[METALLIC_FAMILY]); break; case HYDROGENBONDING_POTENTIAL: - data_[i].accumulator->add(snap->getLongRangePotentials()[HYDROGENBONDING_FAMILY]); + dynamic_cast(data_[i].accumulator)->add(snap->getLongRangePotentials()[HYDROGENBONDING_FAMILY]); break; + case RECIPROCAL_POTENTIAL: + dynamic_cast(data_[i].accumulator)->add(snap->getReciprocalPotential()); + break; case SHORT_RANGE_POTENTIAL: - data_[i].accumulator->add(snap->getShortRangePotential()); + dynamic_cast(data_[i].accumulator)->add(snap->getShortRangePotential()); break; case BOND_POTENTIAL: - data_[i].accumulator->add(snap->getBondPotential()); + dynamic_cast(data_[i].accumulator)->add(snap->getBondPotential()); break; case BEND_POTENTIAL: - data_[i].accumulator->add(snap->getBendPotential()); + dynamic_cast(data_[i].accumulator)->add(snap->getBendPotential()); break; case DIHEDRAL_POTENTIAL: - data_[i].accumulator->add(snap->getTorsionPotential()); + dynamic_cast(data_[i].accumulator)->add(snap->getTorsionPotential()); break; case INVERSION_POTENTIAL: - data_[i].accumulator->add(snap->getInversionPotential()); + dynamic_cast(data_[i].accumulator)->add(snap->getInversionPotential()); break; case RAW_POTENTIAL: - data_[i].accumulator->add(snap->getRawPotential()); + dynamic_cast(data_[i].accumulator)->add(snap->getRawPotential()); break; case RESTRAINT_POTENTIAL: - data_[i].accumulator->add(snap->getRestraintPotential()); + dynamic_cast(data_[i].accumulator)->add(snap->getRestraintPotential()); break; case TAGGED_PAIR_DISTANCE: - data_[i].accumulator->add(thermo.getTaggedAtomPairDistance()); + dynamic_cast(data_[i].accumulator)->add(thermo.getTaggedAtomPairDistance()); break; + case ELECTRONIC_TEMPERATURE: + dynamic_cast(data_[i].accumulator)->add(thermo.getElectronicTemperature()); + break; + case COM: + dynamic_cast(data_[i].accumulator)->add(thermo.getCom()); + break; + case COM_VELOCITY: + dynamic_cast(data_[i].accumulator)->add(thermo.getComVel()); + break; + case ANGULAR_MOMENTUM: + dynamic_cast(data_[i].accumulator)->add(thermo.getAngularMomentum()); + break; /* case SHADOWH: - data_[i].accumulator->add(thermo.getShadowHamiltionian()); + dynamic_cast(data_[i].accumulator)->add(thermo.getShadowHamiltionian()); break; case HELFANDMOMENT: - data_[i].accumulator->add(thermo.getHelfandMoment()); + dynamic_cast(data_[i].accumulator)->add(thermo.getHelfandMoment()); break; */ - case ELECTRONIC_TEMPERATURE: - data_[i].accumulator->add(thermo.getElectronicTemperature()); - break; } } } @@ -506,13 +572,13 @@ namespace OpenMD { int Stats::getIntData(int index) { assert(index >=0 && index < ENDINDEX); RealType value; - data_[index].accumulator->getLastValue(value); + dynamic_cast(data_[index].accumulator)->getLastValue(value); return (int) value; } RealType Stats::getRealData(int index) { assert(index >=0 && index < ENDINDEX); RealType value(0.0); - data_[index].accumulator->getLastValue(value); + dynamic_cast(data_[index].accumulator)->getLastValue(value); return value; } Vector3d Stats::getVectorData(int index) {