Changeset bcb593 for src/Atom


Ignore:
Timestamp:
Jul 11, 2013, 9:43:31 PM (12 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:
9c1324
Parents:
11f0fa
git-author:
Frederik Heber <heber@…> (06/18/13 14:35:36)
git-committer:
Frederik Heber <heber@…> (07/11/13 21:43:31)
Message:

FIX: VerletIntegrationAction now assumes forces have just been calculated.

  • according to Wikipedia's Velocity_Verlet info, we first integrate position, then calculate forces, then integrate velocity. This assumes that forces based on next time step's position are already known. This is possible when parsed from file but not if they are calculated dynamically via fragmentation. Hence, we now integrate velocity from last time step to current, then integrate position from current time step to next. Then we are in the position to calculate forces and do this cycle again.
  • for this, VelocityVerletUpdate was split into ..X() and ..U() for independent integration of position and velocity.
  • VelocityVerletIntegration::operator() now first corrects forces, then integrates velocites, corrects them too and finally integrates positions according to the above new scheme.
  • removed option MDSteps from VerletIntegrationAction.
  • TESTFIX: Had to change regression rest on VerletIntegration since the cycle sequence has changed. It was nonsense before to have the forces already in some file respective to future position that actually first need to come out of the time integration.
Location:
src/Atom
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/Atom/atom_atominfo.cpp

    r11f0fa rbcb593  
    279279{
    280280  OBSERVE;
    281   NOTIFY(AtomObservable::VelocityChanged);
     281  NOTIFY(AtomObservable::ForceChanged);
    282282  ASSERT(WorldTime::getTime() < AtomicForce.size(),
    283283      "AtomInfo::setAtomicForce() - Access out of range: "
     
    291291  OBSERVE;
    292292  if (WorldTime::getTime() == _step)
    293     NOTIFY(AtomObservable::VelocityChanged);
     293    NOTIFY(AtomObservable::ForceChanged);
    294294  const unsigned int size = AtomicForce.size();
    295295  ASSERT(_step <= size,
     
    579579};
    580580
    581 /** Performs a velocity verlet update of the trajectory.
    582  * Parameters are according to those in configuration class.
     581/** Performs a velocity verlet update of the position at \a NextStep from \a LastStep information only.
     582 *
     583 * We calculate \f$x(t + \delta t) = x(t) + v(t)* \delta t + .5 * \delta t * \delta t * F(t)/m \f$.
     584 *
     585 *
    583586 * \param NextStep index of sequential step to set
    584587 * \param Deltat time step width
    585588 * \param IsAngstroem whether the force's underlying unit of length is angstroem or bohr radii
    586589 */
    587 void AtomInfo::VelocityVerletUpdate(int nr, const unsigned int NextStep, double Deltat, bool IsAngstroem)
     590void AtomInfo::VelocityVerletUpdateX(int nr, const unsigned int NextStep, double Deltat, bool IsAngstroem)
    588591{
    589592  const unsigned int LastStep = NextStep == 0 ? 0 : NextStep-1;
    590593
    591594  LOG(2, "INFO: Particle that currently " << *this);
    592   LOG(2, "INFO: Integrating with mass=" << getMass() << " and Deltat="
     595  LOG(2, "INFO: Integrating position with mass=" << getMass() << " and Deltat="
    593596      << Deltat << " at NextStep=" << NextStep);
    594   // update force
    595   // (F+F_old)/2m = a and thus: v = (F+F_old)/2m * t = (F + F_old) * a
    596   LOG(3, "INFO: Force at step " << NextStep << " is " << getAtomicForceAtStep(NextStep));
    597597
    598598  // update position
     
    603603    LOG(4, "INFO: position with velocity " << getAtomicVelocityAtStep(LastStep) << " from last step " << tempVector);
    604604    tempVector += .5*Deltat*Deltat*(getAtomicForceAtStep(LastStep))*(1./getMass());     // F = m * a and s =
    605     LOG(4, "INFO: position with force " << getAtomicForceAtStep(NextStep) << " from last step " << tempVector);
     605    LOG(4, "INFO: position with force " << getAtomicForceAtStep(LastStep) << " from last step " << tempVector);
    606606    setPositionAtStep(NextStep, tempVector);
    607607    LOG(3, "INFO: Position at step " << NextStep << " set to " << tempVector);
    608608  }
     609};
     610
     611/** Performs a velocity verlet update of the velocity at \a NextStep.
     612 *
     613 * \note forces at NextStep should have been calculated based on position at NextStep prior
     614 * to calling this function.
     615 *
     616 * We calculate \f$v(t) = v(t - \delta t) + \delta _t * .5 * (F(t - \delta t) + F(t))/m \f$.
     617 *
     618 * Parameters are according to those in configuration class.
     619 * \param NextStep index of sequential step to set
     620 * \param Deltat time step width
     621 * \param IsAngstroem whether the force's underlying unit of length is angstroem or bohr radii
     622 */
     623void AtomInfo::VelocityVerletUpdateU(int nr, const unsigned int NextStep, double Deltat, bool IsAngstroem)
     624{
     625  const unsigned int LastStep = NextStep == 0 ? 0 : NextStep-1;
     626
     627  LOG(2, "INFO: Particle that currently " << *this);
     628  LOG(2, "INFO: Integrating velocity with mass=" << getMass() << " and Deltat="
     629      << Deltat << " at NextStep=" << NextStep);
    609630
    610631  // Update U
  • src/Atom/atom_atominfo.hpp

    r11f0fa rbcb593  
    267267  size_t getTrajectorySize() const;
    268268  void CopyStepOnStep(const unsigned int dest, const unsigned int src);
    269   void VelocityVerletUpdate(int nr, const unsigned int NextStep, double Deltat, bool IsAngstroem);
     269  void VelocityVerletUpdateX(int nr, const unsigned int NextStep, double Deltat, bool IsAngstroem);
     270  void VelocityVerletUpdateU(int nr, const unsigned int NextStep, double Deltat, bool IsAngstroem);
    270271  double getKineticEnergy(const unsigned int step) const;
    271272  Vector getMomentum(const unsigned int step) const;
Note: See TracChangeset for help on using the changeset viewer.