Ignore:
Timestamp:
Oct 19, 2014, 5:10:16 PM (11 years ago)
Author:
Frederik Heber <heber@…>
Branches:
Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
Children:
5c8807
Parents:
9e1bfb (diff), 46ce1c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'DynamicMolecules' into Candidate_v1.4.9

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Atom/atom_atominfo.cpp

    r9e1bfb rb119a0  
    33 * Description: creates and alters molecular systems
    44 * Copyright (C)  2010-2012 University of Bonn. All rights reserved.
     5 * Copyright (C)  2014 Frederik Heber. All rights reserved.
    56 *
    67 *
     
    5556  charge(0.)
    5657{
    57   AtomicPosition.reserve(1);
    58   AtomicPosition.push_back(zeroVec);
    59   AtomicVelocity.reserve(1);
    60   AtomicVelocity.push_back(zeroVec);
    61   AtomicForce.reserve(1);
    62   AtomicForce.push_back(zeroVec);
    63 
    64 };
     58  AtomicPosition.insert( std::make_pair(0, zeroVec) );
     59  AtomicVelocity.insert( std::make_pair(0, zeroVec) );
     60  AtomicForce.insert( std::make_pair(0, zeroVec) );
     61}
    6562
    6663/** Copy constructor of class AtomInfo.
     
    6865AtomInfo::AtomInfo(const AtomInfo &_atom) :
    6966    AtomicPosition(_atom.AtomicPosition),
     67    AtomicVelocity(_atom.AtomicVelocity),
     68    AtomicForce(_atom.AtomicForce),
    7069    AtomicElement(_atom.AtomicElement),
    7170    FixedIon(_atom.FixedIon),
    7271    charge(_atom.charge)
    7372{
    74   AtomicVelocity.reserve(1);
    75   AtomicVelocity.push_back(zeroVec);
    76   AtomicForce.reserve(1);
    77   AtomicForce.push_back(zeroVec);
    78 };
     73}
    7974
    8075AtomInfo::AtomInfo(const VectorInterface &_v) :
     
    8378    charge(0.)
    8479{
    85   if (AtomicPosition.size() < 1)
    86     AtomicPosition.resize(1);
    87   AtomicPosition[0] = _v.getPosition();
    88   AtomicVelocity.reserve(1);
    89   AtomicVelocity.push_back(zeroVec);
    90   AtomicForce.reserve(1);
    91   AtomicForce.push_back(zeroVec);
     80  AtomicPosition.insert( std::make_pair(0, _v.getPosition()) );
     81  AtomicVelocity.insert( std::make_pair(0, zeroVec) );
     82  AtomicForce.insert( std::make_pair(0, zeroVec) );
    9283};
    9384
     
    9889};
    9990
    100 void AtomInfo::AppendTrajectoryStep()
    101 {
    102   NOTIFY(TrajectoryChanged);
    103   AtomicPosition.push_back(zeroVec);
    104   AtomicVelocity.push_back(zeroVec);
    105   AtomicForce.push_back(zeroVec);
     91void AtomInfo::AppendTrajectoryStep(const unsigned int _step)
     92{
     93  if (WorldTime::getTime() == _step)
     94    NOTIFY(TrajectoryChanged);
     95  AtomicPosition.insert( std::make_pair(_step, zeroVec) );
     96  AtomicVelocity.insert( std::make_pair(_step, zeroVec) );
     97  AtomicForce.insert( std::make_pair(_step, zeroVec) );
    10698  LOG(5,"AtomInfo::AppendTrajectoryStep() called, size is ("
    10799      << AtomicPosition.size() << ","
     
    110102}
    111103
    112 void AtomInfo::removeTrajectoryStep()
    113 {
    114   NOTIFY(TrajectoryChanged);
    115   AtomicPosition.pop_back();
    116   AtomicVelocity.pop_back();
    117   AtomicForce.pop_back();
     104void AtomInfo::removeTrajectoryStep(const unsigned int _step)
     105{
     106  if (WorldTime::getTime() == _step)
     107    NOTIFY(TrajectoryChanged);
     108  AtomicPosition.erase(_step);
     109  AtomicVelocity.erase(_step);
     110  AtomicForce.erase(_step);
    118111  LOG(5,"AtomInfo::removeTrajectoryStep() called, size is ("
    119112      << AtomicPosition.size() << ","
     
    141134const double& AtomInfo::operator[](size_t i) const
    142135{
    143   ASSERT(AtomicPosition.size() > WorldTime::getTime(),
    144       "AtomInfo::operator[]() - Access out of range: "
    145       +toString(WorldTime::getTime())
    146       +" not in [0,"+toString(AtomicPosition.size())+").");
    147   return AtomicPosition[WorldTime::getTime()][i];
     136  return atStep(i, WorldTime::getTime());
    148137}
    149138
    150139const double& AtomInfo::at(size_t i) const
    151140{
    152   ASSERT(AtomicPosition.size() > WorldTime::getTime(),
    153       "AtomInfo::at() - Access out of range: "
    154       +toString(WorldTime::getTime())
    155       +" not in [0,"+toString(AtomicPosition.size())+").");
    156   return AtomicPosition[WorldTime::getTime()].at(i);
     141  return atStep(i, WorldTime::getTime());
    157142}
    158143
    159144const double& AtomInfo::atStep(size_t i, unsigned int _step) const
    160145{
    161   ASSERT(AtomicPosition.size() > _step,
    162       "AtomInfo::atStep() - Access out of range: "
    163       +toString(_step)
    164       +" not in [0,"+toString(AtomicPosition.size())+").");
    165   return AtomicPosition[_step].at(i);
     146  ASSERT(!AtomicPosition.empty(),
     147      "AtomInfo::operator[]() - AtomicPosition is empty.");
     148  VectorTrajectory_t::const_iterator iter =
     149      AtomicPosition.lower_bound(_step);
     150  return iter->second[i];
    166151}
    167152
     
    170155  OBSERVE;
    171156  NOTIFY(AtomObservable::PositionChanged);
    172   ASSERT(AtomicPosition.size() > WorldTime::getTime(),
    173       "AtomInfo::set() - Access out of range: "
    174       +toString(WorldTime::getTime())
    175       +" not in [0,"+toString(AtomicPosition.size())+").");
    176   AtomicPosition[WorldTime::getTime()].at(i) = value;
     157  VectorTrajectory_t::iterator iter = AtomicPosition.find(WorldTime::getTime());
     158  if (iter !=  AtomicPosition.end()) {
     159    iter->second[i] = value;
     160  } else {
     161    Vector newPos;
     162    newPos[i] = value;
     163#ifndef NDEBUG
     164    std::pair<VectorTrajectory_t::iterator, bool> inserter =
     165#endif
     166        AtomicPosition.insert( std::make_pair(WorldTime::getTime(), newPos) );
     167    ASSERT( inserter.second,
     168        "AtomInfo::set() - time step "+toString(WorldTime::getTime())
     169        +" present after all?");
     170  }
     171}
     172
     173/** Helps to determine whether the current step really exists or getPosition() has just
     174 * delivered the one closest to it in the past.
     175 *
     176 * \param _step step to check
     177 * \param true - step exists, false - step does not exist, getPosition() delivers closest
     178 */
     179bool AtomInfo::isStepPresent(const unsigned int _step) const
     180{
     181  VectorTrajectory_t::const_iterator iter =
     182      AtomicPosition.find(_step);
     183  return iter != AtomicPosition.end();
    177184}
    178185
    179186const Vector& AtomInfo::getPosition() const
    180187{
    181   ASSERT(AtomicPosition.size() > WorldTime::getTime(),
    182       "AtomInfo::getPosition() - Access out of range: "
    183       +toString(WorldTime::getTime())
    184       +" not in [0,"+toString(AtomicPosition.size())+").");
    185   return AtomicPosition[WorldTime::getTime()];
     188  return getPositionAtStep(WorldTime::getTime());
    186189}
    187190
    188191const Vector& AtomInfo::getPositionAtStep(const unsigned int _step) const
    189192{
    190   ASSERT(_step < AtomicPosition.size(),
    191       "AtomInfo::getPositionAtStep() - Access out of range: "
    192       +toString(_step)
    193       +" not in [0,"+toString(AtomicPosition.size())+").");
    194   return AtomicPosition[_step];
     193  ASSERT(!AtomicPosition.empty(),
     194      "AtomInfo::operator[]() - AtomicPosition is empty.");
     195  VectorTrajectory_t::const_iterator iter =
     196      AtomicPosition.lower_bound(_step);
     197  return iter->second;
    195198}
    196199
     
    207210{
    208211  const element *elem = World::getInstance().getPeriode()->FindElement(Z);
    209   if (elem != NULL) {
    210     OBSERVE;
    211     NOTIFY(AtomObservable::ElementChanged);
    212     AtomicElement = Z;
    213   }
    214 }
    215 
    216 //Vector& AtomInfo::getAtomicVelocity()
    217 //{
    218 //  return AtomicVelocity[0];
    219 //}
    220 
    221 //Vector& AtomInfo::getAtomicVelocity(const int _step)
    222 //{
    223 //  ASSERT(_step < AtomicVelocity.size(),
    224 //      "AtomInfo::getAtomicVelocity() - Access out of range.");
    225 //  return AtomicVelocity[_step];
    226 //}
     212  setType(elem);
     213}
    227214
    228215const Vector& AtomInfo::getAtomicVelocity() const
    229216{
    230   ASSERT(AtomicVelocity.size() > 0,
    231       "AtomInfo::getAtomicVelocity() - Access out of range: "
    232       +toString(WorldTime::getTime())
    233       +" not in [0,"+toString(AtomicPosition.size())+").");
    234   return AtomicVelocity[WorldTime::getTime()];
     217  return getAtomicVelocityAtStep(WorldTime::getTime());
    235218}
    236219
    237220const Vector& AtomInfo::getAtomicVelocityAtStep(const unsigned int _step) const
    238221{
    239   ASSERT(_step < AtomicVelocity.size(),
    240       "AtomInfo::getAtomicVelocity() - Access out of range: "
    241       +toString(_step)
    242       +" not in [0,"+toString(AtomicPosition.size())+").");
    243   return AtomicVelocity[_step];
     222  ASSERT(!AtomicVelocity.empty(),
     223      "AtomInfo::operator[]() - AtomicVelocity is empty.");
     224  VectorTrajectory_t::const_iterator iter =
     225      AtomicVelocity.lower_bound(_step);
     226  // special, we only interpolate between present time steps not into the future
     227  if (_step > AtomicVelocity.begin()->first)
     228    return zeroVec;
     229  else
     230    return iter->second;
    244231}
    245232
    246233void AtomInfo::setAtomicVelocity(const Vector &_newvelocity)
    247234{
     235  setAtomicVelocityAtStep(WorldTime::getTime(), _newvelocity);
     236}
     237
     238void AtomInfo::setAtomicVelocityAtStep(const unsigned int _step, const Vector &_newvelocity)
     239{
    248240  OBSERVE;
    249   NOTIFY(AtomObservable::VelocityChanged);
    250   ASSERT(WorldTime::getTime() < AtomicVelocity.size(),
    251       "AtomInfo::setAtomicVelocity() - Access out of range: "
    252       +toString(WorldTime::getTime())
    253       +" not in [0,"+toString(AtomicPosition.size())+").");
    254   AtomicVelocity[WorldTime::getTime()] = _newvelocity;
    255 }
    256 
    257 void AtomInfo::setAtomicVelocityAtStep(const unsigned int _step, const Vector &_newvelocity)
    258 {
    259   OBSERVE;
     241  VectorTrajectory_t::iterator iter = AtomicVelocity.find(_step);
     242  if (iter !=  AtomicVelocity.end()) {
     243    iter->second = _newvelocity;
     244  } else {
     245#ifndef NDEBUG
     246    std::pair<VectorTrajectory_t::iterator, bool> inserter =
     247#endif
     248        AtomicVelocity.insert( std::make_pair(_step, _newvelocity) );
     249    ASSERT( inserter.second,
     250        "AtomInfo::set() - time step "+toString(_step)
     251        +" present after all?");
     252  }
    260253  if (WorldTime::getTime() == _step)
    261254    NOTIFY(AtomObservable::VelocityChanged);
    262   const unsigned int size = AtomicVelocity.size();
    263   ASSERT(_step <= size,
    264       "AtomInfo::setAtomicVelocityAtStep() - Access out of range: "
    265       +toString(_step)
    266       +" not in [0,"+toString(size)+"].");
    267   if(_step < size) {
    268     AtomicVelocity[_step] = _newvelocity;
    269   } else if (_step == size) {
    270     UpdateSteps();
    271     AtomicVelocity[_step] = _newvelocity;
    272   }
    273255}
    274256
    275257const Vector& AtomInfo::getAtomicForce() const
    276258{
    277   ASSERT(WorldTime::getTime() < AtomicForce.size(),
    278       "AtomInfo::getAtomicForce() - Access out of range: "
    279       +toString(WorldTime::getTime())
    280       +" not in [0,"+toString(AtomicPosition.size())+").");
    281   return AtomicForce[WorldTime::getTime()];
     259  return getAtomicForceAtStep(WorldTime::getTime());
    282260}
    283261
    284262const Vector& AtomInfo::getAtomicForceAtStep(const unsigned int _step) const
    285263{
    286   ASSERT(_step < AtomicForce.size(),
    287       "AtomInfo::getAtomicForce() - Access out of range: "
    288       +toString(_step)
    289       +" not in [0,"+toString(AtomicPosition.size())+").");
    290   return AtomicForce[_step];
     264  ASSERT(!AtomicForce.empty(),
     265      "AtomInfo::operator[]() - AtomicForce is empty.");
     266  VectorTrajectory_t::const_iterator iter =
     267      AtomicForce.lower_bound(_step);
     268  // special, we only interpolate between present time steps not into the future
     269  if (_step > AtomicForce.begin()->first)
     270    return zeroVec;
     271  else
     272    return iter->second;
    291273}
    292274
    293275void AtomInfo::setAtomicForce(const Vector &_newforce)
    294276{
     277  setAtomicForceAtStep(WorldTime::getTime(), _newforce);
     278}
     279
     280void AtomInfo::setAtomicForceAtStep(const unsigned int _step, const Vector &_newforce)
     281{
    295282  OBSERVE;
    296   NOTIFY(AtomObservable::ForceChanged);
    297   ASSERT(WorldTime::getTime() < AtomicForce.size(),
    298       "AtomInfo::setAtomicForce() - Access out of range: "
    299       +toString(WorldTime::getTime())
    300       +" not in [0,"+toString(AtomicPosition.size())+").");
    301   AtomicForce[WorldTime::getTime()] = _newforce;
    302 }
    303 
    304 void AtomInfo::setAtomicForceAtStep(const unsigned int _step, const Vector &_newforce)
    305 {
    306   OBSERVE;
     283  VectorTrajectory_t::iterator iter = AtomicForce.find(_step);
     284  if (iter !=  AtomicForce.end()) {
     285    iter->second = _newforce;
     286  } else {
     287#ifndef NDEBUG
     288    std::pair<VectorTrajectory_t::iterator, bool> inserter =
     289#endif
     290        AtomicForce.insert( std::make_pair(_step, _newforce) );
     291    ASSERT( inserter.second,
     292        "AtomInfo::set() - time step "+toString(_step)
     293        +" present after all?");
     294  }
    307295  if (WorldTime::getTime() == _step)
    308296    NOTIFY(AtomObservable::ForceChanged);
    309   const unsigned int size = AtomicForce.size();
    310   ASSERT(_step <= size,
    311       "AtomInfo::setAtomicForce() - Access out of range: "
    312       +toString(_step)
    313       +" not in [0,"+toString(AtomicPosition.size())+"].");
    314   if(_step < size) {
    315     AtomicForce[_step] = _newforce;
    316   } else if (_step == size) {
    317     UpdateSteps();
    318     AtomicForce[_step] = _newforce;
    319   }
    320297}
    321298
     
    334311void AtomInfo::setPosition(const Vector& _vector)
    335312{
     313  setPositionAtStep(WorldTime::getTime(), _vector);
     314}
     315
     316void AtomInfo::setPositionAtStep(unsigned int _step, const Vector& _vector)
     317{
    336318  OBSERVE;
    337   NOTIFY(AtomObservable::PositionChanged);
    338   ASSERT(WorldTime::getTime() < AtomicPosition.size(),
    339       "AtomInfo::setPosition() - Access out of range: "
    340       +toString(WorldTime::getTime())
    341       +" not in [0,"+toString(AtomicPosition.size())+").");
    342   AtomicPosition[WorldTime::getTime()] = _vector;
    343   //cout << "AtomInfo::setPosition: " << getType()->symbol << " at " << getPosition() << endl;
    344 }
    345 
    346 void AtomInfo::setPositionAtStep(unsigned int _step, const Vector& _vector)
    347 {
    348   OBSERVE;
     319  VectorTrajectory_t::iterator iter = AtomicPosition.find(_step);
     320  if (iter !=  AtomicPosition.end()) {
     321    iter->second = _vector;
     322  } else {
     323#ifndef NDEBUG
     324    std::pair<VectorTrajectory_t::iterator, bool> inserter =
     325#endif
     326        AtomicPosition.insert( std::make_pair(_step, _vector) );
     327    ASSERT( inserter.second,
     328        "AtomInfo::set() - time step "+toString(_step)
     329        +" present after all?");
     330  }
    349331  if (WorldTime::getTime() == _step)
    350332    NOTIFY(AtomObservable::PositionChanged);
    351   const unsigned int size = AtomicPosition.size();
    352   ASSERT(_step <= size,
    353       "AtomInfo::setPosition() - Access out of range: "
    354       +toString(_step)
    355       +" not in [0,"+toString(size)+"].");
    356   if(_step < size) {
    357     AtomicPosition[_step] = _vector;
    358   } else if (_step == size) {
    359     UpdateSteps();
    360     AtomicPosition[_step] = _vector;
    361   }
    362   //cout << "AtomInfo::setPosition: " << getType()->symbol << " at " << getPosition() << endl;
    363333}
    364334
    365335const VectorInterface& AtomInfo::operator+=(const Vector& b)
    366336{
    367   OBSERVE;
    368   NOTIFY(AtomObservable::PositionChanged);
    369   ASSERT(WorldTime::getTime() < AtomicPosition.size(),
    370       "AtomInfo::operator+=() - Access out of range: "
    371       +toString(WorldTime::getTime())
    372       +" not in [0,"+toString(AtomicPosition.size())+").");
    373   AtomicPosition[WorldTime::getTime()] += b;
     337  setPosition(getPosition()+b);
    374338  return *this;
    375339}
     
    377341const VectorInterface& AtomInfo::operator-=(const Vector& b)
    378342{
    379   OBSERVE;
    380   NOTIFY(AtomObservable::PositionChanged);
    381   ASSERT(WorldTime::getTime() < AtomicPosition.size(),
    382       "AtomInfo::operator-=() - Access out of range: "
    383       +toString(WorldTime::getTime())
    384       +" not in [0,"+toString(AtomicPosition.size())+").");
    385   AtomicPosition[WorldTime::getTime()] -= b;
     343  setPosition(getPosition()-b);
    386344  return *this;
    387345}
     
    389347Vector const AtomInfo::operator+(const Vector& b) const
    390348{
    391   ASSERT(WorldTime::getTime() < AtomicPosition.size(),
    392       "AtomInfo::operator+() - Access out of range: "
    393       +toString(WorldTime::getTime())
    394       +" not in [0,"+toString(AtomicPosition.size())+").");
    395   Vector a(AtomicPosition[WorldTime::getTime()]);
     349  Vector a(getPosition());
    396350  a += b;
    397351  return a;
     
    400354Vector const AtomInfo::operator-(const Vector& b) const
    401355{
    402   ASSERT(WorldTime::getTime() < AtomicPosition.size(),
    403       "AtomInfo::operator-() - Access out of range: "
    404       +toString(WorldTime::getTime())
    405       +" not in [0,"+toString(AtomicPosition.size())+").");
    406   Vector a(AtomicPosition[WorldTime::getTime()]);
     356  Vector a(getPosition());
    407357  a -= b;
    408358  return a;
     
    411361double AtomInfo::distance(const Vector &point) const
    412362{
    413   ASSERT(WorldTime::getTime() < AtomicPosition.size(),
    414       "AtomInfo::distance() - Access out of range: "
    415       +toString(WorldTime::getTime())
    416       +" not in [0,"+toString(AtomicPosition.size())+").");
    417   return AtomicPosition[WorldTime::getTime()].distance(point);
     363  return getPosition().distance(point);
    418364}
    419365
    420366double AtomInfo::DistanceSquared(const Vector &y) const
    421367{
    422   ASSERT(WorldTime::getTime() < AtomicPosition.size(),
    423       "AtomInfo::DistanceSquared() - Access out of range: "
    424       +toString(WorldTime::getTime())
    425       +" not in [0,"+toString(AtomicPosition.size())+").");
    426   return AtomicPosition[WorldTime::getTime()].DistanceSquared(y);
     368  return getPosition().DistanceSquared(y);
    427369}
    428370
    429371double AtomInfo::distance(const VectorInterface &_atom) const
    430372{
    431   ASSERT(WorldTime::getTime() < AtomicPosition.size(),
    432       "AtomInfo::distance() - Access out of range: "
    433       +toString(WorldTime::getTime())
    434       +" not in [0,"+toString(AtomicPosition.size())+").");
    435   return _atom.distance(AtomicPosition[WorldTime::getTime()]);
     373  return _atom.distance(getPosition());
    436374}
    437375
    438376double AtomInfo::DistanceSquared(const VectorInterface &_atom) const
    439377{
    440   ASSERT(WorldTime::getTime() < AtomicPosition.size(),
    441       "AtomInfo::DistanceSquared() - Access out of range: "
    442       +toString(WorldTime::getTime())
    443       +" not in [0,"+toString(AtomicPosition.size())+").");
    444   return _atom.DistanceSquared(AtomicPosition[WorldTime::getTime()]);
     378  return _atom.DistanceSquared(getPosition());
    445379}
    446380
    447381VectorInterface &AtomInfo::operator=(const Vector& _vector)
    448382{
    449   OBSERVE;
    450   NOTIFY(AtomObservable::PositionChanged);
    451   ASSERT(WorldTime::getTime() < AtomicPosition.size(),
    452       "AtomInfo::operator=() - Access out of range: "
    453       +toString(WorldTime::getTime())
    454       +" not in [0,"+toString(AtomicPosition.size())+").");
    455   AtomicPosition[WorldTime::getTime()] = _vector;
     383  setPosition(_vector);
    456384  return *this;
    457385}
     
    459387void AtomInfo::ScaleAll(const double *factor)
    460388{
    461   OBSERVE;
    462   NOTIFY(AtomObservable::PositionChanged);
    463   ASSERT(WorldTime::getTime() < AtomicPosition.size(),
    464       "AtomInfo::ScaleAll() - Access out of range: "
    465       +toString(WorldTime::getTime())
    466       +" not in [0,"+toString(AtomicPosition.size())+").");
    467   AtomicPosition[WorldTime::getTime()].ScaleAll(factor);
     389  Vector temp(getPosition());
     390  temp.ScaleAll(factor);
     391  setPosition(temp);
    468392}
    469393
    470394void AtomInfo::ScaleAll(const Vector &factor)
    471395{
    472   OBSERVE;
    473   NOTIFY(AtomObservable::PositionChanged);
    474   ASSERT(WorldTime::getTime() < AtomicPosition.size(),
    475       "AtomInfo::ScaleAll() - Access out of range: "
    476       +toString(WorldTime::getTime())
    477       +" not in [0,"+toString(AtomicPosition.size())+").");
    478   AtomicPosition[WorldTime::getTime()].ScaleAll(factor);
     396  Vector temp(getPosition());
     397  temp.ScaleAll(factor);
     398  setPosition(temp);
    479399}
    480400
    481401void AtomInfo::Scale(const double factor)
    482402{
    483   OBSERVE;
    484   NOTIFY(AtomObservable::PositionChanged);
    485   ASSERT(WorldTime::getTime() < AtomicPosition.size(),
    486       "AtomInfo::Scale() - Access out of range: "
    487       +toString(WorldTime::getTime())
    488       +" not in [0,"+toString(AtomicPosition.size())+").");
    489   AtomicPosition[WorldTime::getTime()].Scale(factor);
     403  Vector temp(getPosition());
     404  temp.Scale(factor);
     405  setPosition(temp);
    490406}
    491407
    492408void AtomInfo::Zero()
    493409{
    494   OBSERVE;
    495   NOTIFY(AtomObservable::PositionChanged);
    496   ASSERT(WorldTime::getTime() < AtomicPosition.size(),
    497       "AtomInfo::Zero() - Access out of range: "
    498       +toString(WorldTime::getTime())
    499       +" not in [0,"+toString(AtomicPosition.size())+").");
    500   AtomicPosition[WorldTime::getTime()].Zero();
     410  setPosition(zeroVec);
    501411}
    502412
    503413void AtomInfo::One(const double one)
    504414{
    505   OBSERVE;
    506   NOTIFY(AtomObservable::PositionChanged);
    507   ASSERT(WorldTime::getTime() < AtomicPosition.size(),
    508       "AtomInfo::One() - Access out of range: "
    509       +toString(WorldTime::getTime())
    510       +" not in [0,"+toString(AtomicPosition.size())+").");
    511   AtomicPosition[WorldTime::getTime()].One(one);
     415  setPosition(Vector(one,one,one));
    512416}
    513417
    514418void AtomInfo::LinearCombinationOfVectors(const Vector &x1, const Vector &x2, const Vector &x3, const double * const factors)
    515419{
    516   OBSERVE;
    517   NOTIFY(AtomObservable::PositionChanged);
    518   ASSERT(WorldTime::getTime() < AtomicPosition.size(),
    519       "AtomInfo::LinearCombinationOfVectors() - Access out of range: "
    520       +toString(WorldTime::getTime())
    521       +" not in [0,"+toString(AtomicPosition.size())+").");
    522   AtomicPosition[WorldTime::getTime()].LinearCombinationOfVectors(x1,x2,x3,factors);
     420  Vector newPos;
     421  newPos.LinearCombinationOfVectors(x1,x2,x3,factors);
     422  setPosition(newPos);
    523423}
    524424
     
    528428double AtomInfo::getKineticEnergy(const unsigned int _step) const
    529429{
    530   ASSERT(_step < AtomicPosition.size(),
    531       "AtomInfo::getKineticEnergy() - Access out of range: "
    532       +toString(WorldTime::getTime())
    533       +" not in [0,"+toString(AtomicPosition.size())+").");
    534   return getMass() * AtomicVelocity[_step].NormSquared();
     430  return getMass() * getAtomicVelocityAtStep(_step).NormSquared();
    535431}
    536432
    537433Vector AtomInfo::getMomentum(const unsigned int _step) const
    538434{
    539   ASSERT(_step < AtomicPosition.size(),
    540       "AtomInfo::getMomentum() - Access out of range: "
    541       +toString(WorldTime::getTime())
    542       +" not in [0,"+toString(AtomicPosition.size())+").");
    543   return getMass()*AtomicVelocity[_step];
    544 }
    545 
    546 /** Extends the trajectory STL vector to the new size.
    547  * Does nothing if \a MaxSteps is smaller than current size.
     435  return getMass() * getAtomicVelocityAtStep(_step);
     436}
     437
     438/** Decrease the trajectory if given \a MaxSteps is smaller.
     439 * Does nothing if \a MaxSteps is larger than current size.
     440 *
    548441 * \param MaxSteps
    549442 */
    550443void AtomInfo::ResizeTrajectory(size_t MaxSteps)
    551444{
    552   for (;AtomicPosition.size() <= (unsigned int)(MaxSteps);)
    553     UpdateSteps();
     445  // mind the reverse ordering due to std::greater, latest time steps are at beginning
     446  VectorTrajectory_t::iterator positer = AtomicPosition.lower_bound(MaxSteps);
     447  if (positer != AtomicPosition.begin()) {
     448    if (positer->first == MaxSteps)
     449      --positer;
     450    AtomicPosition.erase(AtomicPosition.begin(), positer);
     451  }
     452  VectorTrajectory_t::iterator veliter = AtomicVelocity.lower_bound(MaxSteps);
     453  if (veliter != AtomicVelocity.begin()) {
     454    if (veliter->first == MaxSteps)
     455      --veliter;
     456    AtomicVelocity.erase(AtomicVelocity.begin(), veliter);
     457  }
     458  VectorTrajectory_t::iterator forceiter = AtomicForce.lower_bound(MaxSteps);
     459  if (forceiter != AtomicForce.begin()) {
     460    if (forceiter->first == MaxSteps)
     461      --forceiter;
     462    AtomicForce.erase(AtomicForce.begin(), forceiter);
     463  }
    554464}
    555465
    556466size_t AtomInfo::getTrajectorySize() const
    557467{
    558   return AtomicPosition.size();
     468  // mind greater comp for map here: first element is latest in time steps!
     469  return AtomicPosition.begin()->first+1;
    559470}
    560471
     
    562473{
    563474  return getType()->getMass();
     475}
     476
     477/** Helper function to either insert or assign, depending on the element being
     478 * present already.
     479 *
     480 * \param _trajectory vector of Vectors to assign
     481 * \param dest step to insert/assign to
     482 * \param _newvalue new Vector value
     483 */
     484void assignTrajectoryElement(
     485    std::map<unsigned int, Vector, std::greater<unsigned int> > &_trajectory,
     486    const unsigned int dest,
     487    const Vector &_newvalue)
     488{
     489  std::pair<std::map<unsigned int, Vector, std::greater<unsigned int> >::iterator, bool> inserter =
     490      _trajectory.insert( std::make_pair(dest, _newvalue) );
     491  if (!inserter.second)
     492    inserter.first->second = _newvalue;
    564493}
    565494
     
    579508  }
    580509
    581   ASSERT(dest < AtomicPosition.size(),
    582       "AtomInfo::CopyStepOnStep() - destination outside of current trajectory array: "
    583       +toString(dest)
    584       +" not in [0,"+toString(AtomicPosition.size())+").");
    585   ASSERT(src < AtomicPosition.size(),
    586       "AtomInfo::CopyStepOnStep() - source outside of current trajectory array: "
    587       +toString(src)
    588       +" not in [0,"+toString(AtomicPosition.size())+").");
    589   for (int n=NDIM;n--;) {
    590     AtomicPosition.at(dest)[n] = AtomicPosition.at(src)[n];
    591     AtomicVelocity.at(dest)[n] = AtomicVelocity.at(src)[n];
    592     AtomicForce.at(dest)[n] = AtomicForce.at(src)[n];
    593   }
     510  VectorTrajectory_t::iterator positer = AtomicPosition.find(src);
     511  ASSERT( positer != AtomicPosition.end(),
     512      "AtomInfo::CopyStepOnStep() - step "
     513      +toString(src)+" to copy from not present in AtomicPosition.");
     514  VectorTrajectory_t::iterator veliter = AtomicVelocity.find(src);
     515  ASSERT( veliter != AtomicVelocity.end(),
     516      "AtomInfo::CopyStepOnStep() - step "
     517      +toString(src)+" to copy from not present in AtomicVelocity.");
     518  VectorTrajectory_t::iterator forceiter = AtomicForce.find(src);
     519  ASSERT( forceiter != AtomicForce.end(),
     520      "AtomInfo::CopyStepOnStep() - step "
     521      +toString(src)+" to copy from not present in AtomicForce.");
     522  assignTrajectoryElement(AtomicPosition, dest, positer->second);
     523  assignTrajectoryElement(AtomicVelocity, dest, veliter->second);
     524  assignTrajectoryElement(AtomicForce, dest, forceiter->second);
    594525};
    595526
     
    656587};
    657588
    658 //const AtomInfo& operator*=(AtomInfo& a, const double m)
    659 //{
    660 //  a.Scale(m);
    661 //  return a;
    662 //}
    663 //
    664 //AtomInfo const operator*(const AtomInfo& a, const double m)
    665 //{
    666 //  AtomInfo copy(a);
    667 //  copy *= m;
    668 //  return copy;
    669 //}
    670 //
    671 //AtomInfo const operator*(const double m, const AtomInfo& a)
    672 //{
    673 //  AtomInfo copy(a);
    674 //  copy *= m;
    675 //  return copy;
    676 //}
    677 
    678589std::ostream & AtomInfo::operator << (std::ostream &ost) const
    679590{
Note: See TracChangeset for help on using the changeset viewer.