Changeset be729b for src/Dynamics


Ignore:
Timestamp:
Apr 10, 2018, 6:43:30 AM (7 years ago)
Author:
Frederik Heber <frederik.heber@…>
Branches:
AutomationFragmentation_failures, Candidate_v1.6.1, ChemicalSpaceEvaluator, Exclude_Hydrogens_annealWithBondGraph, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_contraction-expansion, Gui_displays_atomic_force_velocity, PythonUI_with_named_parameters, StoppableMakroAction, TremoloParser_IncreasedPrecision
Children:
038ccd
Parents:
6458e7
git-author:
Frederik Heber <frederik.heber@…> (06/27/17 21:13:13)
git-committer:
Frederik Heber <frederik.heber@…> (04/10/18 06:43:30)
Message:

ForceAnnealing::anneal() now only once reduces deltat.

  • TESTFIX: Marked regression test ForceAnnealing (and redo) as XFAIL as we have removed storing the position update in the atomic velocities.
  • TESTFIX: Marked Python tests on ForceAnnealing without bondgraph as XFAIL for the same reason.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Dynamics/ForceAnnealing.hpp

    r6458e7 rbe729b  
    170170      Vector &maxComponents)
    171171  {
     172    bool deltat_decreased = false;
    172173    for(typename AtomSetMixin<T>::iterator iter = AtomicForceManipulator<T>::atoms.begin();
    173174        iter != AtomicForceManipulator<T>::atoms.end(); ++iter) {
     
    193194        maxComponents[i] = std::max(maxComponents[i], fabs(currentGradient[i]));
    194195
    195       // are we in initial step? Then don't check against velocity
    196       if ((currentStep > 1) && (!(*iter)->getAtomicVelocity().IsZero()))
    197         // update with currentDelta tells us how the current gradient relates to
    198         // the last one: If it has become larger, reduce currentDelta
    199         if ((PositionUpdate.ScalarProduct((*iter)->getAtomicVelocity()) < 0)
    200             && (currentDeltat > MinimumDeltat)) {
    201           currentDeltat = .5*currentDeltat;
    202           LOG(2, "DEBUG: Upgrade in other direction: " << PositionUpdate.NormSquared()
    203               << " > " << (*iter)->getAtomicVelocity().NormSquared()
    204               << ", decreasing deltat: " << currentDeltat);
     196      // steps may go back and forth again (updates are of same magnitude but
     197      // have different sign: Check whether this is the case and one step with
     198      // deltat to interrupt this sequence
     199      const Vector PositionDifference = currentPosition - oldPosition;
     200      if ((currentStep > 1) && (!PositionDifference.IsZero()))
     201        if ((PositionUpdate.ScalarProduct(PositionDifference) < 0)
     202            && (fabs(PositionUpdate.NormSquared()-PositionDifference.NormSquared()) < 1e-3)) {
     203          // for convergence we want a null sequence here, too
     204          if (!deltat_decreased) {
     205            deltat_decreased = true;
     206            currentDeltat = .5*currentDeltat;
     207          }
     208          LOG(2, "DEBUG: Upgrade in other direction: " << PositionUpdate
     209              << " > " << PositionDifference
     210              << ", using deltat: " << currentDeltat);
    205211          PositionUpdate = currentDeltat * currentGradient;
    206212      }
     213
    207214      // finally set new values
    208215      (*iter)->setPosition(currentPosition + PositionUpdate);
    209       (*iter)->setAtomicVelocity(PositionUpdate);
    210       //std::cout << "Id of atom is " << (*iter)->getId() << std::endl;
    211 //        (*iter)->VelocityVerletUpdateU((*iter)->getId(), CurrentTimeStep-1, Deltat, IsAngstroem);
    212216    }
    213217  }
Note: See TracChangeset for help on using the changeset viewer.