Changeset 893bea for src


Ignore:
Timestamp:
Apr 9, 2010, 1:39:03 PM (15 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:
a3696f
Parents:
dcea0f
Message:

changes to LinkedCell::GetNeighbourBounds(), LinkedCell::GetallNeighbours() and LinkedCell::GetPointsInsideSphere()

Location:
src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/linkedcell.cpp

    rdcea0f r893bea  
    244244};
    245245
     246/** Set the index to the cell containing a given Vector *x.
     247 * \param *x Vector with coordinates
     248 * \return Vector is inside bounding box - true, else - false
     249 */
     250bool LinkedCell::SetIndexToVector(const Vector * const x) const
     251{
     252  for (int i=0;i<NDIM;i++)
     253    n[i] = (int)floor((x->x[i] - min.x[i])/RADIUS);
     254
     255  return CheckBounds();
     256};
     257
    246258/** Calculates the index for a given LCNode *Walker.
    247259 * \param *Walker LCNode to set index tos
     
    269281 * \param *upper upper bounds
    270282 */
    271 void LinkedCell::GetNeighbourBounds(int lower[NDIM], int upper[NDIM]) const
    272 {
    273   for (int i=0;i<NDIM;i++) {
    274     lower[i] = ((n[i]-1) >= 0) ? n[i]-1 : 0;
    275     upper[i] = ((n[i]+1) < N[i]) ? n[i]+1 : N[i]-1;
    276     //Log() << Verbose(0) << " [" << Nlower[i] << "," << Nupper[i] << "] ";
     283void LinkedCell::GetNeighbourBounds(int lower[NDIM], int upper[NDIM], int step) const
     284{
     285  for (int i=0;i<NDIM;i++) {
     286    lower[i] = 0;
     287    for (int s=step; s>0;--s)
     288      if ((n[i]-s) >= 0) {
     289        lower[i] = n[i]-s;
     290        break;
     291      }
     292    upper[i] = 0;
     293    for (int s=step; s>0;--s)
     294      if ((n[i]+s) < N[i]) {
     295        upper[i] = n[i]+s;
     296        break;
     297      }
     298    //Log() << Verbose(0) << " [" << lower[i] << "," << upper[i] << "] ";
    277299    // check for this axis whether the point is outside of our grid
    278300    if (n[i] < 0)
     
    285307};
    286308
    287 /** Calculates the index for a given Vector *x.
    288  * \param *x Vector with coordinates
    289  * \return Vector is inside bounding box - true, else - false
    290  */
    291 bool LinkedCell::SetIndexToVector(const Vector * const x) const
    292 {
    293   bool status = true;
    294   for (int i=0;i<NDIM;i++) {
    295     n[i] = (int)floor((x->x[i] - min.x[i])/RADIUS);
    296     if (max.x[i] < x->x[i])
    297       status = false;
    298     if (min.x[i] > x->x[i])
    299       status = false;
    300   }
    301   return status;
    302 };
    303 
    304309/** Returns a list with all neighbours from the current LinkedCell::index.
    305310 * \param distance (if no distance, then adjacent cells are taken)
    306311 * \return list of tesselpoints
    307312 */
    308 LinkedCell::LinkedNodes* LinkedCell::GetallNeighbours(const double distance = 0) const
    309 {
    310   int N[NDIM], Nlower[NDIM], Nupper[NDIM];
     313LinkedCell::LinkedNodes* LinkedCell::GetallNeighbours(const double distance) const
     314{
     315  int Nlower[NDIM], Nupper[NDIM];
    311316  TesselPoint *Walker = NULL;
    312317  LinkedNodes *TesselList = new LinkedNodes;
    313318
    314319  // then go through the current and all neighbouring cells and check the contained points for possible candidates
    315   //Log() << Verbose(1) << "LC Intervals:";
    316   const int step = (distance == 0) ? 1 : (int)floor(distance/RADIUS)+1;
    317   for (int i=0;i<NDIM;i++) {
    318     Nlower[i] = ((N[i]-step) >= 0) ? N[i]-step : 0;
    319     Nupper[i] = ((N[i]+step) < N[i]) ? N[i]+step : N[i]-step;
    320     //Log() << Verbose(0) << " [" << Nlower[i] << "," << Nupper[i] << "] ";
    321   }
     320  const int step = (distance == 0) ? 1 : (int)floor(distance/RADIUS + 1.);
     321  GetNeighbourBounds(Nlower, Nupper, step);
     322
    322323  //Log() << Verbose(0) << endl;
    323324  for (n[0] = Nlower[0]; n[0] <= Nupper[0]; n[0]++)
     
    344345LinkedCell::LinkedNodes* LinkedCell::GetPointsInsideSphere(const double radius, const Vector * const center) const
    345346{
    346   int N[NDIM], Nlower[NDIM], Nupper[NDIM];
    347347  const double radiusSquared = radius*radius;
    348348  TesselPoint *Walker = NULL;
    349349  LinkedNodes *TesselList = new LinkedNodes;
    350 
    351   if (SetIndexToVector(center)) {
    352     for(int i=0;i<NDIM;i++) // store indices of this cell
    353     N[i] = n[i];
    354     //Log() << Verbose(1) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << index << "." << endl;
    355   } else {
     350  LinkedNodes *NeighbourList = NULL;
     351
     352  // set index of LC to center of sphere
     353  if (!SetIndexToVector(center)) {
    356354    DoeLog(1) && (eLog()<< Verbose(1) << "Vector " << *center << " is outside of LinkedCell's bounding box." << endl);
    357355    return TesselList;
    358356  }
    359   // then go through the current and all neighbouring cells and check the contained points for possible candidates
    360   //Log() << Verbose(1) << "LC Intervals:";
    361   for (int i=0;i<NDIM;i++) {
    362     Nlower[i] = ((N[i]-1) >= 0) ? N[i]-1 : 0;
    363     Nupper[i] = ((N[i]+1) < N[i]) ? N[i]+1 : N[i]-1;
    364     //Log() << Verbose(0) << " [" << Nlower[i] << "," << Nupper[i] << "] ";
    365   }
    366   //Log() << Verbose(0) << endl;
    367   for (n[0] = Nlower[0]; n[0] <= Nupper[0]; n[0]++)
    368     for (n[1] = Nlower[1]; n[1] <= Nupper[1]; n[1]++)
    369       for (n[2] = Nlower[2]; n[2] <= Nupper[2]; n[2]++) {
    370         const LinkedNodes *List = GetCurrentCell();
    371         //Log() << Verbose(1) << "Current cell is " << n[0] << ", " << n[1] << ", " << n[2] << " with No. " << index << "." << endl;
    372         if (List != NULL) {
    373           for (LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) {
    374             Walker = *Runner;
    375             if ((center->DistanceSquared(Walker->node) - radiusSquared) > MYEPSILON) {
    376               TesselList->push_back(Walker);
    377             }
    378           }
    379         }
     357
     358  // gather all neighbours first, then look who fulfills distance criteria
     359  NeighbourList = GetallNeighbours(radius);
     360  if (NeighbourList != NULL) {
     361    for (LinkedNodes::const_iterator Runner = NeighbourList->begin(); Runner != NeighbourList->end(); Runner++) {
     362      Walker = *Runner;
     363      if ((center->DistanceSquared(Walker->node) - radiusSquared) < MYEPSILON) {
     364        TesselList->push_back(Walker);
    380365      }
     366    }
     367    delete(NeighbourList);
     368  } else
     369    DoeLog(2) && (eLog()<< Verbose(2) << "Around vector " << *center << " there are no atoms." << endl);
    381370  return TesselList;
    382371};
  • src/linkedcell.hpp

    rdcea0f r893bea  
    6363    bool CheckBounds()const ;
    6464    bool CheckBounds(const int relative[NDIM])const ;
    65     void GetNeighbourBounds(int lower[NDIM], int upper[NDIM])const ;
     65    void GetNeighbourBounds(int lower[NDIM], int upper[NDIM], int step = 1)const ;
    6666
    67     LinkedCell::LinkedNodes* GetallNeighbours(const double distance) const;
     67    LinkedCell::LinkedNodes* GetallNeighbours(const double distance = 0) const;
    6868    LinkedCell::LinkedNodes* GetPointsInsideSphere(const double radius, const Vector * const center) const;
    6969
Note: See TracChangeset for help on using the changeset viewer.