Changeset b119a0


Ignore:
Timestamp:
Oct 19, 2014, 5:10:16 PM (10 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

Location:
src
Files:
18 edited

Legend:

Unmodified
Added
Removed
  • src/Actions/MoleculeAction/ForceAnnealingAction.cpp

    r9e1bfb rb119a0  
    7979        ++iter) {
    8080      atom * const Walker = iter->second;
    81       Walker->UpdateSteps();
    8281      Walker->setPositionAtStep(CurrentStep+1,
    8382          Walker->getPositionAtStep(CurrentStep));
  • src/Actions/MoleculeAction/VerletIntegrationAction.cpp

    r9e1bfb rb119a0  
    5656using namespace MoleCuilder;
    5757
    58 enum {
     58enum VectorIndexType {
    5959  PositionIndex=0,
    6060  VelocityIndex=1,
    6161  ForceIndex=2,
    6262  MAXINDEX
    63 } VectorIndexType;
     63};
    6464
    6565// and construct the stuff
     
    134134
    135135  // remove current step for all modified atoms
    136   removeLastStep(getIdsFromAtomicInfo(state->UndoInfo));
     136  removeLastStep(getIdsFromAtomicInfo(state->UndoInfo), CurrentStep);
    137137
    138138  // and set back the old step (forces have been changed)
     
    151151
    152152  // set stored new state
    153   addNewStep(state->UndoInfo);
     153  size_t CurrentStep = WorldTime::getInstance().getTime()+1;
     154  addNewStep(state->UndoInfo, CurrentStep);
    154155
    155156  // add a new time step
    156   size_t CurrentStep = WorldTime::getInstance().getTime();
    157   World::getInstance().setTime(CurrentStep+1);
     157  World::getInstance().setTime(CurrentStep);
    158158
    159159  // and set positions of the new step
  • src/Actions/UndoRedoHelpers.cpp

    r9e1bfb rb119a0  
    181181}
    182182
    183 void MoleCuilder::removeLastStep(const std::vector<atomId_t> &_atoms)
     183void MoleCuilder::removeLastStep(const std::vector<atomId_t> &_atoms, const unsigned int _step)
    184184{
    185185  for (size_t i=0; i<_atoms.size(); ++i) {
    186186    atom * const _atom = World::getInstance().getAtom(AtomById(_atoms[i]));
    187     _atom->removeSteps();
    188   }
    189 }
    190 
    191 void MoleCuilder::addNewStep(const std::vector<AtomicInfo> &_movedatoms)
     187    _atom->removeStep(_step);
     188  }
     189}
     190
     191void MoleCuilder::addNewStep(const std::vector<AtomicInfo> &_movedatoms, const unsigned int _step)
    192192{
    193193  for(size_t i=0; i< _movedatoms.size(); ++i) {
    194194    atom * const _atom = World::getInstance().getAtom(AtomById(_movedatoms[i].getId()));
    195     _atom->UpdateSteps();
    196   }
    197 }
    198 
    199 void MoleCuilder::addNewStep(const std::vector<atomId_t> &_ids)
     195    _atom->UpdateStep(_step);
     196  }
     197}
     198
     199void MoleCuilder::addNewStep(const std::vector<atomId_t> &_ids, const unsigned int _step)
    200200{
    201201  for(size_t i=0; i< _ids.size(); ++i) {
    202202    atom * const _atom = World::getInstance().getAtom(AtomById(_ids[i]));
    203     _atom->UpdateSteps();
     203    _atom->UpdateStep(_step);
    204204  }
    205205}
  • src/Actions/UndoRedoHelpers.hpp

    r9e1bfb rb119a0  
    107107   *
    108108   * @param movedatoms atoms whose last step in time to remove
     109   * @param _step which trajectory to remove
    109110   */
    110   void removeLastStep(const std::vector<atomId_t> &movedatoms);
     111  void removeLastStep(const std::vector<atomId_t> &movedatoms, const unsigned int _step);
    111112
    112113  /** Adds another time step to all \a movedatoms.
     
    115116   *
    116117   * @param _ids atoms whose last step in time to remove
     118   * @param _step which trajectory to insert/assign
    117119   */
    118   void addNewStep(const std::vector<atomId_t> &_ids);
     120  void addNewStep(const std::vector<atomId_t> &_ids, const unsigned int _step);
    119121
    120122  /** Adds another time step to all \a movedatoms.
     
    124126   *
    125127   * @param _movedatoms atoms whose last step in time to remove
     128   * @param _step which trajectory to insert/assign
    126129   */
    127   void addNewStep(const std::vector<AtomicInfo> &_movedatoms);
     130  void addNewStep(const std::vector<AtomicInfo> &_movedatoms, const unsigned int _step);
    128131
    129132  /** Helper function to extract id information from vector of AtomicInfo.
  • src/Atom/TesselPoint.cpp

    r9e1bfb rb119a0  
    5252{};
    5353
    54 void TesselPoint::UpdateSteps()
     54void TesselPoint::UpdateStep(const unsigned int _step)
    5555{
    56   ASSERT(0, "TesselPoint::UpdateSteps() should never be called, TesselPoints don't have trajectories.");
    57   AtomInfo::AppendTrajectoryStep();
     56  ASSERT(0, "TesselPoint::UpdateStep() should never be called, TesselPoints don't have trajectories.");
     57  AtomInfo::AppendTrajectoryStep(_step);
    5858};
    5959
    60 void TesselPoint::removeSteps()
     60void TesselPoint::removeStep(const unsigned int _step)
    6161{
    62   ASSERT(0, "TesselPoint::removeSteps() should never be called, TesselPoints don't have trajectories.");
    63   AtomInfo::removeTrajectoryStep();
     62  ASSERT(0, "TesselPoint::removeStep() should never be called, TesselPoints don't have trajectories.");
     63  AtomInfo::removeTrajectoryStep(_step);
    6464};
    6565
  • src/Atom/TesselPoint.hpp

    r9e1bfb rb119a0  
    3737   *
    3838   */
    39   virtual void UpdateSteps();
     39  virtual void UpdateStep(const unsigned int _step);
    4040
    4141  /** Pops the last step in all trajectory vectors.
     
    4545   * the real functions, \sa removeTrajectoryStep(), by all necessary subclasses.
    4646   */
    47   virtual void removeSteps();
     47  virtual void removeStep(const unsigned int _step);
    4848
    4949  /** Getter for this.
  • src/Atom/atom.cpp

    r9e1bfb rb119a0  
    6969    mol(0)
    7070{
    71   AtomicPosition = pointer->AtomicPosition; // copy trajectory of coordination
    72   AtomicVelocity = pointer->AtomicVelocity; // copy trajectory of velocity
    73   AtomicForce = pointer->AtomicForce;
    7471  // sign on to global atom change tracker
    7572  AtomObserver::getInstance().AtomInserted(this);
     
    9390
    9491
    95 void atom::UpdateSteps()
    96 {
    97   LOG(4,"atom::UpdateSteps() called.");
     92void atom::UpdateStep(const unsigned int _step)
     93{
     94  LOG(4,"atom::UpdateStep() called.");
    9895  // append to position, velocity and force vector
    99   AtomInfo::AppendTrajectoryStep();
     96  AtomInfo::AppendTrajectoryStep(WorldTime::getTime()+1);
    10097  // append to ListOfBonds vector
    101   BondedParticleInfo::AppendTrajectoryStep();
    102 }
    103 
    104 void atom::removeSteps()
    105 {
    106   LOG(4,"atom::removeSteps() called.");
     98  BondedParticleInfo::AppendTrajectoryStep(WorldTime::getTime()+1);
     99}
     100
     101void atom::removeStep(const unsigned int _step)
     102{
     103  LOG(4,"atom::removeStep() called.");
    107104  // append to position, velocity and force vector
    108   AtomInfo::removeTrajectoryStep();
     105  AtomInfo::removeTrajectoryStep(_step);
    109106  // append to ListOfBonds vector
    110   BondedParticleInfo::removeTrajectoryStep();
     107  BondedParticleInfo::removeTrajectoryStep(_step);
    111108}
    112109
     
    313310atom* NewAtom(atomId_t _id){
    314311  atom * res = new atom();
    315   // extent trajectory to current time step
    316   const size_t CurrentTime = WorldTime::getTime();
    317   for (size_t step = res->getTrajectorySize(); step <= CurrentTime; ++step)
    318     res->UpdateSteps();
    319312  res->setId(_id);
    320313  return res;
  • src/Atom/atom.hpp

    r9e1bfb rb119a0  
    6565   * real functions, \sa AppendTrajectoryStep(), by all necessary subclasses.
    6666   */
    67   virtual void UpdateSteps();
     67  virtual void UpdateStep(const unsigned int _step);
    6868
    6969  /** Pops the last step in all trajectory vectors.
     
    7373   * the real functions, \sa removeTrajectoryStep(), by all necessary subclasses.
    7474   */
    75   virtual void removeSteps();
     75  virtual void removeStep(const unsigned int _step);
    7676
    7777  /** Output of a single atom with given numbering.
  • 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{
  • src/Atom/atom_atominfo.hpp

    r9e1bfb rb119a0  
    5656   * real functions, \sa AppendTrajectoryStep(), by all necessary subclasses.
    5757   */
    58   virtual void UpdateSteps()=0;
     58  virtual void UpdateStep(const unsigned int _step)=0;
    5959
    6060  /** Pops the last step in all trajectory vectors.
     
    6464   * the real functions, \sa removeTrajectoryStep(), by all necessary subclasses.
    6565   */
    66   virtual void removeSteps()=0;
     66  virtual void removeStep(const unsigned int _step)=0;
    6767
    6868  /** DEPRECATED: Getter for element indicated by AtomicElement.
     
    276276
    277277  // operations for trajectories
     278  bool isStepPresent(const unsigned int _step) const;
    278279  void ResizeTrajectory(size_t MaxSteps);
    279280  size_t getTrajectorySize() const;
     
    297298   * vectors.
    298299   */
    299   void AppendTrajectoryStep();
     300  void AppendTrajectoryStep(const unsigned int _step);
    300301
    301302  /** Function used by this and inheriting classes to decrease the trajectory
    302303   * vectors by one.
    303304   */
    304   void removeTrajectoryStep();
     305  void removeTrajectoryStep(const unsigned int _step);
    305306
    306307  // make these protected only such that deriving atom class still has full
    307308  // access needed for clone and alike
    308   std::vector<Vector> AtomicPosition;       //!< coordinate vector of atom, giving last position within cell
    309   std::vector<Vector> AtomicVelocity;       //!< velocity vector of atom, giving last velocity within cell
    310   std::vector<Vector> AtomicForce;       //!< Force vector of atom, giving last force within cell
     309
     310  //!> typedef for a vector of Vectors with inverse sorting to make lower_bound return present or last past step
     311  typedef std::map<unsigned int, Vector, std::greater<unsigned int> > VectorTrajectory_t;
     312  VectorTrajectory_t AtomicPosition;       //!< coordinate vector of atom, giving last position within cell
     313  VectorTrajectory_t AtomicVelocity;       //!< velocity vector of atom, giving last velocity within cell
     314  VectorTrajectory_t AtomicForce;       //!< Force vector of atom, giving last force within cell
    311315
    312316private:
  • src/Atom/atom_bondedparticle.cpp

    r9e1bfb rb119a0  
    5252BondedParticle::BondedParticle()
    5353{
    54   ListOfBonds.push_back(BondList());
     54  ListOfBonds.insert( std::make_pair(0, emptyList) );
    5555};
    5656
     
    5959BondedParticle::~BondedParticle()
    6060{
    61   removeAllBonds();
     61  for(BondTrajectory_t::iterator iter = ListOfBonds.begin(); !ListOfBonds.empty();
     62      iter = ListOfBonds.begin()) {
     63    removeAllBonds(iter->first);
     64    ListOfBonds.erase(iter);
     65  }
    6266};
    6367
     
    220224}
    221225
    222 /** Removes all bonds in all timesteps and their instances, too.
     226/** Removes all bonds in current timestep and their instances, too.
    223227 *
    224228 */
    225229void BondedParticle::removeAllBonds()
    226230{
    227   for (size_t index = 0; index < ListOfBonds.size(); ++index)
    228     removeAllBonds(index);
     231  removeAllBonds(WorldTime::getTime());
    229232}
    230233
     
    236239{
    237240  //LOG(3,"INFO: Clearing all bonds of " << *this << ": " << ListOfBonds[_step]);
    238   for (BondList::iterator iter = (ListOfBonds[_step]).begin();
    239       !(ListOfBonds[_step]).empty();
    240       iter = (ListOfBonds[_step]).begin()) {
    241     //LOG(3,"INFO: Clearing bond (" << *iter << ") " << *(*iter) << " of list " << &ListOfBonds);
    242     atom * const Other = (*iter)->GetOtherAtom(this);
    243     ASSERT( Other != NULL,
    244         "BondedParticle::removeAllBonds() - cannot find bond partner for "
    245         +toString(**iter)+".");
    246     Other->UnregisterBond(_step, *iter);
    247     UnregisterBond(_step, *iter);
    248   }
     241  BondTrajectory_t::iterator listiter = ListOfBonds.find(_step);
     242  if (listiter != ListOfBonds.end())
     243    for (BondList::iterator iter = listiter->second.begin();
     244        !listiter->second.empty();
     245        iter = listiter->second.begin()) {
     246      //LOG(3,"INFO: Clearing bond (" << *iter << ") " << *(*iter) << " of list " << &ListOfBonds);
     247      atom * const Other = (*iter)->GetOtherAtom(this);
     248      ASSERT( Other != NULL,
     249          "BondedParticle::removeAllBonds() - cannot find bond partner for "
     250          +toString(**iter)+".");
     251      Other->UnregisterBond(_step, *iter);
     252      UnregisterBond(_step, *iter);
     253    }
    249254}
    250255
     
    260265    if (Binder->Contains(this)) {
    261266      //LOG(3,"INFO: Registering bond "<< *Binder << " with atom " << *this << " at step " << _step);
    262       if (ListOfBonds.size() <= _step)
    263         ListOfBonds.resize(_step+1);
    264       ListOfBonds[_step].push_back(Binder);
     267      std::pair< BondTrajectory_t::iterator, bool> inserter =
     268          ListOfBonds.insert( std::make_pair( _step, BondList(1, Binder)) );
     269      if (!inserter.second)
     270        inserter.first->second.push_back(Binder);
    265271      if (WorldTime::getTime() == _step)
    266272        NOTIFY(AtomObservable::BondsAdded);
     
    290296      OBSERVE;
    291297      //LOG(0,"INFO: Unregistering bond "<< *Binder << " from list " << &ListOfBonds << " of atom " << *this << " at step " << step);
     298      BondTrajectory_t::iterator listiter = ListOfBonds.find(_step);
     299      if (listiter != ListOfBonds.end()) {
    292300#ifndef NDEBUG
    293       BondList::const_iterator iter =
    294           std::find(ListOfBonds[_step].begin(), ListOfBonds[_step].end(), Binder);
    295       ASSERT( iter != ListOfBonds[_step].end(),
    296           "BondedParticle::UnregisterBond() - "+toString(*Binder)+" not contained at "
    297           +toString(_step));
     301        BondList::const_iterator iter =
     302            std::find(listiter->second.begin(), listiter->second.end(), Binder);
     303        ASSERT( iter != listiter->second.end(),
     304            "BondedParticle::UnregisterBond() - "+toString(*Binder)+" not contained at "
     305            +toString(_step));
    298306#endif
    299       Binder->removeAtom(this);
    300       ListOfBonds[_step].remove(Binder);
    301       if (WorldTime::getTime() == _step)
    302         NOTIFY(AtomObservable::BondsRemoved);
    303       status = true;
     307        Binder->removeAtom(this);
     308        listiter->second.remove(Binder);
     309        if (WorldTime::getTime() == _step)
     310          NOTIFY(AtomObservable::BondsRemoved);
     311        status = true;
     312      }
    304313    } else {
    305314      ELOG(1, *Binder << " does not contain " << *this << ".");
     
    328337{
    329338  int step = -1;
    330   int tempstep = 0;
    331   for(std::vector<BondList>::const_iterator iter = ListOfBonds.begin();
    332       iter != ListOfBonds.end();
    333       ++iter,++tempstep) {
    334     for (BondList::const_iterator bonditer = iter->begin();
    335         bonditer != iter->end();
     339  for(BondTrajectory_t::const_iterator listiter = ListOfBonds.begin();
     340      listiter != ListOfBonds.end();
     341      ++listiter) {
     342    for (BondList::const_iterator bonditer = listiter->second.begin();
     343        bonditer != listiter->second.end();
    336344        ++bonditer) {
    337345      if ((*bonditer) == Binder) {
    338         step = tempstep;
     346        step = listiter->first;
    339347        break;
    340348      }
  • src/Atom/atom_bondedparticleinfo.cpp

    r9e1bfb rb119a0  
    5757{}
    5858
    59 void BondedParticleInfo::AppendTrajectoryStep()
     59void BondedParticleInfo::AppendTrajectoryStep(const unsigned int _step)
    6060{
    61   ListOfBonds.push_back(BondList());
     61  ListOfBonds.insert( std::make_pair(_step, emptyList) );
    6262  LOG(5,"BondedParticleInfo::AppendTrajectoryStep() called, size is " << ListOfBonds.size());
    6363}
    6464
    65 void BondedParticleInfo::removeTrajectoryStep()
     65void BondedParticleInfo::removeTrajectoryStep(const unsigned int _step)
    6666{
    67   ListOfBonds.pop_back();
     67  ListOfBonds.erase(_step);
    6868  LOG(5,"BondedParticleInfo::removeTrajectoryStep() called, size is " << ListOfBonds.size());
    6969}
     
    7171const BondList& BondedParticleInfo::getListOfBonds() const
    7272{
    73   if(WorldTime::getTime() < ListOfBonds.size())
    74     return ListOfBonds[WorldTime::getTime()];
    75   else
    76     return emptyList;
     73  return getListOfBondsAtStep(WorldTime::getTime());
    7774}
    78 
    79 //BondList& BondedParticleInfo::getListOfBonds()
    80 //{
    81 //  // todo: here we actually need a container on whose destruction notifiy is emitted, i.e.
    82 //  // similar or simply an ObservedContainer.
    83 //  OBSERVE;
    84 //  NOTIFY(AtomObservable::BondsAdded);
    85 //  const unsigned int size = ListOfBonds.size();
    86 //  ASSERT(WorldTime::getTime() <= size,
    87 //      "BondedParticleInfo::getBondsAtStep() - Access out of range: "
    88 //      +toString(WorldTime::getTime())
    89 //      +" not in [0,"+toString(size)+"].");
    90 //  if (WorldTime::getTime() == size) {
    91 //    UpdateSteps();
    92 //  }
    93 //  return ListOfBonds[WorldTime::getTime()];
    94 //}
    9575
    9676const BondList& BondedParticleInfo::getListOfBondsAtStep(unsigned int _step) const
    9777{
    98   if(_step < ListOfBonds.size())
    99     return ListOfBonds[_step];
    100   else
    101     return emptyList;
     78  BondTrajectory_t::const_iterator iter =
     79    ListOfBonds.find(_step);
     80  if (iter != ListOfBonds.end())
     81    return iter->second;
     82  return emptyList;
    10283}
    103 
    104 //BondList& BondedParticleInfo::getListOfBondsAtStep(unsigned int _step)
    105 //{
    106 //  const unsigned int size = ListOfBonds.size();
    107 //  ASSERT(_step <= size,
    108 //      "BondedParticleInfo::getBondsAtStep() - Access out of range: "
    109 //      +toString(_step)
    110 //      +" not in [0,"+toString(size)+"].");
    111 //  if (_step == size) {
    112 //    UpdateSteps();
    113 //  }
    114 //  return ListOfBonds[_step];
    115 //}
  • src/Atom/atom_bondedparticleinfo.hpp

    r9e1bfb rb119a0  
    4949   * real functions, \sa AppendTrajectoryStep(), by all necessary subclasses.
    5050   */
    51   virtual void UpdateSteps()=0;
     51  virtual void UpdateStep(const unsigned int _step)=0;
     52
     53  /** Pops the last step in all trajectory vectors.
     54   *
     55   * This allows to decrease all trajectories contained in different classes
     56   * by one consistently. This is implemented by the topmost class which calls
     57   * the real functions, \sa removeTrajectoryStep(), by all necessary subclasses.
     58   */
     59  virtual void removeStep(const unsigned int _step)=0;
    5260
    5361  /** Const accessor to ListOfBonds of WorldTime::CurrentTime.
     
    8795   * vector.
    8896   */
    89   void AppendTrajectoryStep();
     97  void AppendTrajectoryStep(const unsigned int _step);
    9098
    9199  /** Function used by this and inheriting classes to reduce the ListOfBonds
    92100   * vector by one.
    93101   */
    94   void removeTrajectoryStep();
     102  void removeTrajectoryStep(const unsigned int _step);
    95103
    96   std::vector<BondList> ListOfBonds; //!< list of all bonds
     104  typedef std::map<unsigned int, BondList> BondTrajectory_t;
     105  BondTrajectory_t ListOfBonds; //!< list of all bonds
    97106  static BondList emptyList;  //!< empty list to return when step is not present
    98107};
  • src/Atom/unittests/AtomObserverUnitTest.cpp

    r9e1bfb rb119a0  
    130130void AtomObserverTest::AtomElementTest()
    131131{
    132   atoms[0]->setType(1);
     132  CPPUNIT_ASSERT( atoms[0]->getType()->getAtomicNumber() != 2 );
     133  atoms[0]->setType(2);
    133134
    134135  // check for update
  • src/Fragmentation/Exporters/HydrogenPool.cpp

    r9e1bfb rb119a0  
    103103  const size_t CurrentTime = WorldTime::getTime();
    104104  for (size_t step = _atom->getTrajectorySize(); step <= CurrentTime; ++step)
    105     _atom->UpdateSteps();
     105    _atom->UpdateStep(step);
    106106}
    107107
  • src/LinkedCell/unittests/stubs/TesselPointStub.cpp

    r9e1bfb rb119a0  
    4343  virtual ~TesselPoint();
    4444
    45   virtual void UpdateSteps();
     45  virtual void UpdateStep(const unsigned int _step);
    4646
    4747  TesselPoint * getTesselPoint();
     
    5454{}
    5555
    56 void TesselPoint::UpdateSteps()
     56void TesselPoint::UpdateStep(const unsigned int _step)
    5757{}
    5858
  • src/World.cpp

    r9e1bfb rb119a0  
    234234  if (_step != WorldTime::getTime()) {
    235235    const unsigned int oldstep = WorldTime::getTime();
    236     // set new time
     236
     237    // 1. copy bond graph (such not each addBond causes GUI update)
     238    if (!areBondsPresent(_step)) {
     239//      AtomComposite Set = getAllAtoms();
     240//      BG->cleanAdjacencyList(Set);
     241      copyBondgraph(oldstep, _step);
     242    }
     243
     244    // 2. set new time
    237245    WorldTime::getInstance().setTime(_step);
     246
    238247    // TODO: removed when BondGraph creates the adjacency
    239     // 1. remove all of World's molecules
     248    // 3. remove all of World's molecules
    240249    for (MoleculeIterator iter = getMoleculeIter();
    241250        getMoleculeIter() != moleculeEnd();
     
    244253      destroyMolecule(*iter);
    245254    }
    246     // 2. copy bond graph
    247     if (!areBondsPresent(_step)) {
    248 //      AtomComposite Set = getAllAtoms();
    249 //      BG->cleanAdjacencyList(Set);
    250       copyBondgraph(oldstep, _step);
    251     }
    252 
    253     // 3. scan for connected subgraphs => molecules
     255
     256    // 4. scan for connected subgraphs => molecules
    254257    DepthFirstSearchAnalysis DFS;
    255258    DFS();
  • src/molecule_geometry.cpp

    r9e1bfb rb119a0  
    295295void molecule::Scale(const double *factor)
    296296{
    297   for (iterator iter = begin(); iter != end(); ++iter) {
    298     for (size_t j=0;j<(*iter)->getTrajectorySize();j++) {
    299       Vector temp = (*iter)->getPositionAtStep(j);
    300       temp.ScaleAll(factor);
    301       (*iter)->setPositionAtStep(j,temp);
    302     }
    303   }
     297  for (iterator iter = begin(); iter != end(); ++iter)
     298    for (size_t j=0;j<(*iter)->getTrajectorySize();j++)
     299      if ((*iter)->isStepPresent(j)) {
     300        Vector temp = (*iter)->getPositionAtStep(j);
     301        temp.ScaleAll(factor);
     302        (*iter)->setPositionAtStep(j,temp);
     303      }
    304304};
    305305
     
    309309void molecule::Translate(const Vector &trans)
    310310{
    311   getAtomSet().translate(trans);
     311  for (iterator iter = begin(); iter != end(); ++iter)
     312    for (size_t j=0;j<(*iter)->getTrajectorySize();j++)
     313      if ((*iter)->isStepPresent(j))
     314        (*iter)->setPositionAtStep(j, (*iter)->getPositionAtStep(j) + (trans));
    312315};
    313316
Note: See TracChangeset for help on using the changeset viewer.