source: src/linkedcell.cpp@ 09af1b

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 09af1b was 6ac7ee, checked in by Frederik Heber <heber@…>, 16 years ago

Merge branch 'ConcaveHull' of ../espack2 into ConcaveHull

Conflicts:

molecuilder/src/boundary.cpp
molecuilder/src/boundary.hpp
molecuilder/src/builder.cpp
molecuilder/src/linkedcell.cpp
molecuilder/src/linkedcell.hpp
molecuilder/src/vector.cpp
molecuilder/src/vector.hpp
util/src/NanoCreator.c

Basically, this resulted from a lot of conversions two from spaces to one tab, which is my standard indentation. The mess was caused by eclipse auto-indenting. And in espack2:ConcaveHull was the new stuff, so all from ConcaveHull was replaced in case of doubt.
Additionally, vector had ofstream << operator instead ostream << ...

  • Property mode set to 100644
File size: 4.2 KB
Line 
1#include "linkedcell.hpp"
2#include "molecules.hpp"
3
4/** Constructor for class LinkedCell.
5 */
6LinkedCell::LinkedCell()
7{
8 LC = NULL;
9 for(int i=0;i<NDIM;i++)
10 N[i] = 0;
11 index = -1;
12 RADIUS = 0.;
13 max.Zero();
14 min.Zero();
15};
16
17/** Puts all atoms in \a *mol into a linked cell list with cell's lengths of \a RADIUS
18 * \param *mol molecule structure with all Atom's
19 * \param RADIUS edge length of cells
20 */
21LinkedCell::LinkedCell(molecule *mol, double radius)
22{
23 atom *Walker = NULL;
24
25 RADIUS = radius;
26 LC = NULL;
27 for(int i=0;i<NDIM;i++)
28 N[i] = 0;
29 index = -1;
30 max.Zero();
31 min.Zero();
32 cout << Verbose(1) << "Begin of LinkedCell" << endl;
33 if (mol->start->next == mol->end) {
34 cerr << "ERROR: molecule contains no atoms!" << endl;
35 return;
36 }
37 // 1. find max and min per axis of atoms
38 Walker = mol->start->next;
39 for (int i=0;i<NDIM;i++) {
40 max.x[i] = Walker->x.x[i];
41 min.x[i] = Walker->x.x[i];
42 }
43 while (Walker != mol->end) {
44 for (int i=0;i<NDIM;i++) {
45 if (max.x[i] < Walker->x.x[i])
46 max.x[i] = Walker->x.x[i];
47 if (min.x[i] > Walker->x.x[i])
48 min.x[i] = Walker->x.x[i];
49 }
50 Walker = Walker->next;
51 }
52 cout << Verbose(2) << "Bounding box is " << min << " and " << max << "." << endl;
53
54 // 2. find then umber of cells per axis
55 for (int i=0;i<NDIM;i++) {
56 N[i] = (int)floor((max.x[i] - min.x[i])/RADIUS)+1;
57 }
58 cout << Verbose(2) << "Number of cells per axis are " << N[0] << ", " << N[1] << " and " << N[2] << "." << endl;
59
60 // 3. allocate the lists
61 cout << Verbose(2) << "Allocating cells ... " << endl;
62 if (LC != NULL) {
63 cout << Verbose(1) << "ERROR: Linked Cell list is already allocated, I do nothing." << endl;
64 return;
65 }
66 LC = new LinkedAtoms[N[0]*N[1]*N[2]];
67 for (index=0;index<N[0]*N[1]*N[2];index++) {
68 LC [index].clear();
69 }
70
71 // 4. put each atom into its respective cell
72 Walker = mol->start;
73 while (Walker->next != mol->end) {
74 Walker = Walker->next;
75 for (int i=0;i<NDIM;i++) {
76 n[i] = (int)floor((Walker->x.x[i] - min.x[i])/RADIUS);
77 }
78 index = n[0] * N[1] * N[2] + n[1] * N[2] + n[2];
79 LC[index].push_back(Walker);
80 cout << Verbose(2) << *Walker << " goes into cell " << n[0] << ", " << n[1] << ", " << n[2] << " with No. " << index << "." << endl;
81 }
82 cout << Verbose(1) << "End of LinkedCell" << endl;
83};
84
85/** Destructor for class LinkedCell.
86 */
87LinkedCell::~LinkedCell()
88{
89 if (LC != NULL)
90 for (index=0;index<N[0]*N[1]*N[2];index++)
91 LC[index].clear();
92 delete[](LC);
93 for(int i=0;i<NDIM;i++)
94 N[i] = 0;
95 index = -1;
96 max.Zero();
97 min.Zero();
98};
99
100/** Checks whether LinkedCell::n[] is each within [0,N[]].
101 * \return if all in intervals - true, else -false
102 */
103bool LinkedCell::CheckBounds()
104{
105 bool status = true;
106 for(int i=0;i<NDIM;i++)
107 status = status && ((n[i] >=0) && (n[i] < N[i]));
108 if (!status)
109 cerr << "ERROR: indices are out of bounds!" << endl;
110 return status;
111};
112
113
114/** Returns a pointer to the current cell.
115 * \return LinkedAtoms pointer to current cell, NULL if LinkedCell::n[] are out of bounds.
116 */
117LinkedAtoms* LinkedCell::GetCurrentCell()
118{
119 if (CheckBounds()) {
120 index = n[0] * N[1] * N[2] + n[1] * N[2] + n[2];
121 return (&(LC[index]));
122 } else {
123 return NULL;
124 }
125};
126
127/** Calculates the index for a given atom *Walker.
128 * \param *Walker atom to set index to
129 * \return if the atom is also found in this cell - true, else - false
130 */
131bool LinkedCell::SetIndexToAtom(atom *Walker)
132{
133 bool status = false;
134 for (int i=0;i<NDIM;i++) {
135 n[i] = (int)floor((Walker->x.x[i] - min.x[i])/RADIUS);
136 }
137 index = n[0] * N[1] * N[2] + n[1] * N[2] + n[2];
138 if (CheckBounds()) {
139 for (LinkedAtoms::iterator Runner = LC[index].begin(); Runner != LC[index].end(); Runner++)
140 status = status || ((*Runner) == Walker);
141 return status;
142 } else {
143 cerr << Verbose(1) << "ERROR: Atom "<< *Walker << " at " << Walker->x << " is out of bounds." << endl;
144 return false;
145 }
146};
147
148/** Calculates the index for a given Vector *x.
149 * \param *x Vector with coordinates
150 * \return Vector is inside bounding box - true, else - false
151 */
152bool LinkedCell::SetIndexToVector(Vector *x)
153{
154 bool status = true;
155 for (int i=0;i<NDIM;i++) {
156 n[i] = (int)floor((x->x[i] - min.x[i])/RADIUS);
157 if (max.x[i] < x->x[i])
158 status = false;
159 if (min.x[i] > x->x[i])
160 status = false;
161 }
162 return status;
163};
164
Note: See TracBrowser for help on using the repository browser.