Ignore:
Timestamp:
Aug 5, 2015, 5:32:13 PM (9 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:
d07a38
Parents:
ec8471
git-author:
Frederik Heber <heber@…> (08/04/15 13:53:52)
git-committer:
Frederik Heber <heber@…> (08/05/15 17:32:13)
Message:

FIX: updateBoundingBox() must not call molecule::getBoundingBox() on every update.

  • this is O(N2). We now update by using the current center and radius and looking at the last changed atom's position. This diverges with respect to the radius after some time. Hence, a true getBoundingBox() should be called after a while.
Location:
src/UIElements/Views/Qt4/Qt3D
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp

    rec8471 r6fe4f7  
    143143      BoundingBoxUpdater,
    144144      "MoleculeBoundingBox_"+toString(_molid),
    145       updateBoundingBox(),
     145      initBoundingBox(),
    146146      BoundingBoxChannels),
    147147  PresentAtoms(
     
    220220      BoundingBoxUpdater,
    221221      "MoleculeBoundingBox_"+toString(_molid),
    222       updateBoundingBox(),
     222      initBoundingBox(),
    223223      BoundingBoxChannels),
    224224  PresentAtoms(
     
    403403}
    404404
     405GLMoleculeObject_molecule::BoundingBoxInfo GLMoleculeObject_molecule::initBoundingBox() const
     406{
     407  BoundingBoxInfo info;
     408  info.position = zeroVec;
     409  info.radius = 0.;
     410  return info;
     411}
     412
    405413GLMoleculeObject_molecule::BoundingBoxInfo GLMoleculeObject_molecule::updateBoundingBox() const
    406414{
    407   BoundingBoxInfo info;
     415  BoundingBoxInfo info = BoundingBox.get();
    408416  const molecule * const _molecule = getMolecule(MolIndex.get());
    409417  if (_molecule != NULL) {
    410     Shape shape = _molecule->getBoundingSphere();
    411     info.position = shape.getCenter();
    412     info.radius = shape.getRadius();
     418    // just update the position and radius by looking at the last atom
     419    int atomcount = _molecule->getAtomCount();
     420    atomId_t lastatomid = _molecule->lastChangedAtomId();
     421    const atom * const lastatom =
     422        const_cast<const World &>(World::getInstance()).getAtom(AtomById(lastatomid));
     423    if (lastatom != NULL) {
     424      const Vector oldcenter = info.position;
     425      const double oldradius = info.radius;
     426      // update position: center is exactly updated
     427      Vector newcenter = (double)(atomcount-1) * oldcenter;
     428      newcenter += lastatom->getPosition();
     429      newcenter *= 1./(double)atomcount;
     430      info.position = newcenter;
     431      // update radius: radius is always larger than exact update
     432      double newradius = newcenter.DistanceSquared(lastatom->getPosition());
     433      double oldupdatedradius = oldradius*oldradius + (newcenter - oldcenter).NormSquared();
     434      info.radius = sqrt( std::max(newradius, oldupdatedradius) );
     435    }
    413436  } else
    414437    ELOG(2, "GLMoleculeObject_molecule cannot updateBoundingBox, molecule with "
  • src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp

    rec8471 r6fe4f7  
    125125  };
    126126
     127  BoundingBoxInfo initBoundingBox() const;
     128
    127129  QGeometryData updateTesselationHull() const;
    128130  BoundingBoxInfo updateBoundingBox() const;
Note: See TracChangeset for help on using the changeset viewer.