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.
File:
1 edited

Legend:

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

    r11f0fa rbcb593  
    4242#include "molecule.hpp"
    4343#include "World.hpp"
     44#include "WorldTime.hpp"
    4445
    4546#include <vector>
     
    5960  // TODO: sollte besser stream nutzen, nicht filename direkt (es sei denn, ist prefix), besser fuer unit test
    6061  AtomSetMixin<std::vector<atom *> > set(World::getInstance().getSelectedAtoms());
    61   for (unsigned int step = 0; step < params.MDSteps.get(); ++step) {
    62     VerletForceIntegration<std::vector<atom *> > Verlet(set, params.Deltat.get(), false);
    63     // parse forces into next step
    64     if (!params.forcesfile.get().string().empty()) {
    65       LOG(1, "Parsing forces file.");
    66       if (!Verlet.parseForcesFile(params.forcesfile.get().string().c_str(), step))
    67         LOG(2, "File " << params.forcesfile.get() << " not found.");
    68       else
    69         LOG(2, "File " << params.forcesfile.get() << " found and parsed.");
    70     }
    71     // perform velocity verlet update
    72     LOG(1, "Verlet integrating.");
    73     if (!Verlet(step+1, 1, 0, params.FixedCenterOfMass.get()))
     62  // we always operate relative to current time step
     63  size_t CurrentStep = WorldTime::getInstance().getTime();
     64  VerletForceIntegration<std::vector<atom *> > Verlet(set, params.Deltat.get(), true);
     65  // parse forces into next step
     66  if (!params.forcesfile.get().string().empty()) {
     67    LOG(1, "Parsing forces file.");
     68    if (!Verlet.parseForcesFile(params.forcesfile.get().string().c_str(), CurrentStep))
    7469      LOG(2, "File " << params.forcesfile.get() << " not found.");
    7570    else
    7671      LOG(2, "File " << params.forcesfile.get() << " found and parsed.");
    7772  }
     73  // perform velocity verlet update
     74  LOG(1, "Verlet integrating.");
     75  if (!Verlet(CurrentStep+1, 1, 0, params.FixedCenterOfMass.get()))
     76    ELOG(1, "Velocity verlet failed.");
     77  else
     78    LOG(2, "DEBUG: Successfully performed updates on velocity and position.");
     79  // increment to next time step
     80  World::getInstance().setTime(CurrentStep+1);
    7881
    7982  return Action::success;
Note: See TracChangeset for help on using the changeset viewer.