Ignore:
Timestamp:
Aug 9, 2013, 2:20:36 PM (11 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:
58fcbe5
Parents:
b5f548
git-author:
Frederik Heber <heber@…> (07/17/13 10:02:19)
git-committer:
Frederik Heber <heber@…> (08/09/13 14:20:36)
Message:

Extracted SamplingGrid::getDiscreteWindowIndices() from SamplingGrid::addWindowOntoWindow().

  • this allows others to know when window starts and ends in discrete steps.
  • FIX: getDiscreteWindowIndices() needs to check for zero length for divide by zero.
Location:
src/Fragmentation/Summation/SetValues
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/Fragmentation/Summation/SetValues/SamplingGrid.cpp

    rb5f548 r3f64ee  
    455455}
    456456
     457void SamplingGrid::getDiscreteWindowIndices(
     458    const double *larger_wbegin,
     459    const double *larger_wend,
     460    const double *smaller_wbegin,
     461    const double *smaller_wend,
     462    size_t *pre_offset,
     463    size_t *post_offset,
     464    size_t *length,
     465    size_t *total) const
     466{
     467  const size_t gridpoints_axis = getGridPointsPerAxis();
     468  const double round_offset =
     469      (std::numeric_limits<size_t>::round_style == std::round_toward_zero) ?
     470          0.5 : 0.; // need offset to get to round_toward_nearest behavior
     471  for(size_t index=0;index<3;++index) {
     472    if (fabs(end[index] - begin[index]) > std::numeric_limits<double>::epsilon()*1e4) {
     473      // we refrain from using floor/ceil as the window's starts and ends,
     474      // the grids have to be compatible (equal level), should always be on
     475      // discrete grid point locations.
     476      const double delta = (double)gridpoints_axis/(end[index] - begin[index]);
     477      // delta is conversion factor from box length to discrete length, i.e. number of points
     478      pre_offset[index] = delta*(smaller_wbegin[index] - larger_wbegin[index])+round_offset;
     479      length[index] = delta*(smaller_wend[index] - smaller_wbegin[index])+round_offset;
     480      post_offset[index] = delta*(larger_wend[index] - smaller_wend[index])+round_offset;
     481      total[index] = delta*(larger_wend[index] - larger_wbegin[index])+round_offset;
     482    } else {
     483      pre_offset[index] = 0;
     484      length[index] = 0;
     485      post_offset[index] = 0;
     486      total[index] = 0;
     487    }
     488    // total is used as safe-guard against loss due to discrete conversion
     489    ASSERT( pre_offset[index]+post_offset[index]+length[index] == total[index],
     490        "SamplingGrid::getDiscreteWindowIndices() - pre, post, and length don't sum up to total for "
     491        +toString(index)+"th component.");
     492  }
     493}
     494
    457495void SamplingGrid::addWindowOntoWindow(
    458496    const double larger_wbegin[3],
     
    476514#endif
    477515  // the only issue are indices
    478   const size_t gridpoints_axis = getGridPointsPerAxis();
    479516  size_t pre_offset[3];
    480517  size_t post_offset[3];
    481518  size_t length[3];
    482519  size_t total[3];
    483   const double round_offset =
    484       (std::numeric_limits<size_t>::round_style == std::round_toward_zero) ?
    485           0.5 : 0.; // need offset to get to round_toward_nearest behavior
    486   for(size_t index=0;index<3;++index) {
    487     // we refrain from using floor/ceil as the window's starts and ends,
    488     // the grids have to be compatible (equal level), should always be on
    489     // discrete grid point locations.
    490     const double delta = (double)gridpoints_axis/(end[index] - begin[index]);
    491     // delta is conversion factor from box length to discrete length, i.e. number of points
    492     pre_offset[index] = delta*(smaller_wbegin[index] - larger_wbegin[index])+round_offset;
    493     length[index] = delta*(smaller_wend[index] - smaller_wbegin[index])+round_offset;
    494     post_offset[index] = delta*(larger_wend[index] - smaller_wend[index])+round_offset;
    495     total[index] = delta*(larger_wend[index] - larger_wbegin[index])+round_offset;
    496     // total is used as safe-guard against loss due to discrete conversion
    497     ASSERT( pre_offset[index]+post_offset[index]+length[index] == total[index],
    498         "SamplingGrid::addWindowOntoWindow() - pre, post, and length don't sum up to total for "
    499         +toString(index)+"th component.");
    500   }
     520  getDiscreteWindowIndices(
     521      larger_wbegin, larger_wend,
     522      smaller_wbegin, smaller_wend,
     523      pre_offset,
     524      post_offset,
     525      length,
     526      total
     527      );
    501528  // assert that calculated lengths match with given vector sizes
    502529#ifndef NDEBUG
  • src/Fragmentation/Summation/SetValues/SamplingGrid.hpp

    rb5f548 r3f64ee  
    199199  void setWindow(const double _begin_window[3], const double _end_window[3]);
    200200
     201  /** Helper function to convert begin_window and end_window that are w.r.t.
     202   * to domain [begin:end] to indices that can be used when traversing the grid.
     203   *
     204   * \param larger_wbegin begin of domain
     205   * \param larger_wend end of domain
     206   * \param smaller_wbegin begin of window
     207   * \param smaller_wend end of window
     208   * \param pre_offset discrete length from 0 to start of window
     209   * \param post_offset discrete length from end of window to end
     210   * \param length discrete length of window
     211   * \param total total number of points for checking, should be sum of other three
     212   */
     213  void getDiscreteWindowIndices(
     214      const double *larger_wbegin,
     215      const double *larger_wend,
     216      const double *smaller_wbegin,
     217      const double *smaller_wend,
     218      size_t *pre_offset,
     219      size_t *post_offset,
     220      size_t *length,
     221      size_t *total) const;
     222
    201223private:
    202224  /** Sets the size of the domain.
Note: See TracChangeset for help on using the changeset viewer.