source: src/linkedcell.hpp@ af2c424

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
Last change on this file since af2c424 was af2c424, checked in by Frederik Heber <heber@…>, 14 years ago

LinkedCell constructor rewritten.

  • had to introduce getValue(iterator) to: molecule, tesselation, LinkedCell::LinkedNodes
  • LinkedCell::LinkedNodes is not a typedef anymore
  • new class LinkedCell::LinkedNodes derived from stl::list<TesselPoint *> to add getValue(iterator).
  • LinkedCell constructors changed:
    • use template for all classes that have begin(), end() and ... sigh ... getValue()
    • Argh! STL containers do all have begin() and end() but no consistent operator* (maps return pair<> ...)
    • specialized version for PointCloud derivatives
    • various functions had to be changed due to changed signature of LinkedCell constructor
  • Property mode set to 100644
File size: 5.6 KB
RevLine 
[357fba]1/*
2 * linkedcell.hpp
3 *
4 * If the linked cell should be usable, the class has to inherit LCNodeSet and the nodes (containing the Vectors) have to inherit LCNode. This works well
5 * for molecule and atom classes.
6 *
7 * Created on: Aug 3, 2009
8 * Author: heber
9 */
10
[e1bc68]11#ifndef LINKEDCELL_HPP_
12#define LINKEDCELL_HPP_
13
[357fba]14using namespace std;
15
[f66195]16/*********************************************** includes ***********************************/
17
[e1bc68]18// include config.h
19#ifdef HAVE_CONFIG_H
20#include <config.h>
21#endif
22
[357fba]23#include <list>
[af2c424]24#include <vector>
25#include <map>
[357fba]26
[af2c424]27#include "Helpers/Assert.hpp"
28#include "Helpers/Log.hpp"
29#include "Helpers/Verbose.hpp"
[357fba]30#include "defs.hpp"
[af2c424]31#include "World.hpp"
[57f243]32#include "LinearAlgebra/Vector.hpp"
[357fba]33
[f66195]34/****************************************** forward declarations *****************************/
35
[357fba]36class PointCloud;
[f66195]37class TesselPoint;
38
39/********************************************** definitions *********************************/
[e1bc68]40
[c66537]41//< Upper bound for number of cell nodes used in sensibility check on allocation.
42enum { MAX_LINKEDCELLNODES = 1000000 };
[6ac7ee]43
[f66195]44/********************************************** declarations *******************************/
45
[357fba]46/** Linked Cell class for containing Vectors in real space efficiently.
47 */
48class LinkedCell {
[734816]49private:
50
51public:
[af2c424]52 class LinkedNodes : public std::list<TesselPoint *> {
53 public:
54 LinkedNodes();
55 ~LinkedNodes();
56
57 TesselPoint * getValue (const_iterator &rhs) const;
58 TesselPoint * getValue (iterator &rhs) const;
59 };
60 //typedef list<TesselPoint *> LinkedNodes;
[734816]61
62
[042f82]63 Vector max; // upper boundary
64 Vector min; // lower boundary
[357fba]65 LinkedNodes *LC; // linked cell list
[042f82]66 double RADIUS; // cell edge length
67 int N[NDIM]; // number of cells per axis
[776b64]68 mutable int n[NDIM]; // temporary variable for current cell per axis
69 mutable int index; // temporary index variable , access by index = n[0] * N[1] * N[2] + n[1] * N[2] + n[2];
[6ac7ee]70
[042f82]71 LinkedCell();
[af2c424]72 LinkedCell(const PointCloud &set, const double radius);
73 template <class T> LinkedCell(const T &set, const double radius) :
74 LC(NULL),
75 RADIUS(radius),
76 index(-1)
77 {
78 class TesselPoint *Walker = NULL;
79 for(int i=0;i<NDIM;i++)
80 N[i] = 0;
81 max.Zero();
82 min.Zero();
83 DoLog(1) && (Log() << Verbose(1) << "Begin of LinkedCell" << endl);
84 if (set.begin() == set.end()) {
85 DoeLog(1) && (eLog()<< Verbose(1) << "set contains no linked cell nodes!" << endl);
86 return;
87 }
88 // 1. find max and min per axis of atoms
89 typename T::const_iterator Runner = set.begin();
90 for (int i=0;i<NDIM;i++) {
91 max[i] = set.getValue(Runner)->at(i);
92 min[i] = set.getValue(Runner)->at(i);
93 }
94 for (typename T::const_iterator Runner = set.begin(); Runner != set.end(); Runner++) {
95 Walker = set.getValue(Runner);
96 for (int i=0;i<NDIM;i++) {
97 if (max[i] < Walker->at(i))
98 max[i] = Walker->at(i);
99 if (min[i] > Walker->at(i))
100 min[i] = Walker->at(i);
101 }
102 }
103 DoLog(2) && (Log() << Verbose(2) << "Bounding box is " << min << " and " << max << "." << endl);
104
105 // 2. find then number of cells per axis
106 for (int i=0;i<NDIM;i++) {
107 N[i] = static_cast<int>(floor((max[i] - min[i])/RADIUS)+1);
108 }
109 DoLog(2) && (Log() << Verbose(2) << "Number of cells per axis are " << N[0] << ", " << N[1] << " and " << N[2] << "." << endl);
110
111 // 3. allocate the lists
112 DoLog(2) && (Log() << Verbose(2) << "Allocating cells ... ");
113 if (LC != NULL) {
114 DoeLog(1) && (eLog()<< Verbose(1) << "Linked Cell list is already allocated, I do nothing." << endl);
115 return;
116 }
117 ASSERT(N[0]*N[1]*N[2] < MAX_LINKEDCELLNODES, "Number linked of linked cell nodes exceded hard-coded limit, use greater edge length!");
118 LC = new LinkedNodes[N[0]*N[1]*N[2]];
119 for (index=0;index<N[0]*N[1]*N[2];index++) {
120 LC [index].clear();
121 }
122 DoLog(0) && (Log() << Verbose(0) << "done." << endl);
123
124 // 4. put each atom into its respective cell
125 DoLog(2) && (Log() << Verbose(2) << "Filling cells ... ");
126 for (typename T::const_iterator Runner = set.begin(); Runner != set.end(); Runner++) {
127 Walker = set.getValue(Runner);
128 for (int i=0;i<NDIM;i++) {
129 n[i] = static_cast<int>(floor((Walker->at(i) - min[i])/RADIUS));
130 }
131 index = n[0] * N[1] * N[2] + n[1] * N[2] + n[2];
132 LC[index].push_back(Walker);
133 //Log() << Verbose(2) << *Walker << " goes into cell " << n[0] << ", " << n[1] << ", " << n[2] << " with No. " << index << "." << endl;
134 }
135 DoLog(0) && (Log() << Verbose(0) << "done." << endl);
136 DoLog(1) && (Log() << Verbose(1) << "End of LinkedCell" << endl);
137 };
138
139
[042f82]140 ~LinkedCell();
[734816]141 const LinkedCell::LinkedNodes* GetCurrentCell()const ;
142 const LinkedCell::LinkedNodes* GetRelativeToCurrentCell(const int relative[NDIM])const ;
[776b64]143 bool SetIndexToNode(const TesselPoint * const Walker)const ;
[d74077]144 bool SetIndexToVector(const Vector &x)const ;
[ffe885]145 double SetClosestIndexToOutsideVector(const Vector * const x) const;
[776b64]146 bool CheckBounds()const ;
147 bool CheckBounds(const int relative[NDIM])const ;
[893bea]148 void GetNeighbourBounds(int lower[NDIM], int upper[NDIM], int step = 1)const ;
[6ac7ee]149
[893bea]150 LinkedCell::LinkedNodes* GetallNeighbours(const double distance = 0) const;
[734816]151 LinkedCell::LinkedNodes* GetPointsInsideSphere(const double radius, const Vector * const center) const;
[042f82]152 // not implemented yet
[357fba]153 bool AddNode(Vector *Walker);
154 bool DeleteNode(Vector *Walker);
155 bool MoveNode(Vector *Walker);
[e1bc68]156};
157
158#endif /*LINKEDCELL_HPP_*/
Note: See TracBrowser for help on using the repository browser.