source: src/Fragmentation/Exporters/SphericalPointDistribution.hpp@ 2d8c4e

Action_Thermostats Add_AtomRandomPerturbation Add_FitFragmentPartialChargesAction Add_RotateAroundBondAction Add_SelectAtomByNameAction Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_StructOpt_integration_tests Automaking_mpqc_open AutomationFragmentation_failures Candidate_v1.5.4 Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator 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_ChargeSampling_PBC Fix_ChronosMutex Fix_FitPartialCharges Fix_FitPotential_needs_atomicnumbers Fix_ForceAnnealing Fix_IndependentFragmentGrids Fix_ParseParticles Fix_ParseParticles_split_forward_backward_Actions Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion GeometryObjects Gui_displays_atomic_force_velocity IndependentFragmentGrids IndependentFragmentGrids_IndividualZeroInstances IndependentFragmentGrids_IntegrationTest IndependentFragmentGrids_Sole_NN_Calculation JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks RotateToPrincipalAxisSystem_UndoRedo SaturateAtoms_findBestMatching StoppableMakroAction Subpackage_CodePatterns Subpackage_JobMarket Subpackage_LinearAlgebra Subpackage_levmar Subpackage_mpqc_open Subpackage_vmg ThirdParty_MPQC_rebuilt_buildsystem TrajectoryDependenant_MaxOrder TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps Ubuntu_1604_changes stable
Last change on this file since 2d8c4e was 6393ff, checked in by Frederik Heber <heber@…>, 9 years ago

Added getConnections() to SphericalPointDistribution.

  • we use tesselation in order to extract the connection information between nearest neighboring points from the BoundaryLines of the tesselation. The triangles are ideal as they assure that no point lies within a triangle, hence all these points may be safely combined.
  • functions reside in extra module as with get().
  • added extensive unit tests.
  • Property mode set to 100644
File size: 8.3 KB
Line 
1/*
2 * SphericalPointDistribution.hpp
3 *
4 * Created on: May 29, 2014
5 * Author: heber
6 */
7
8
9#ifndef SPHERICALPOINTDISTRIBUTION_HPP_
10#define SPHERICALPOINTDISTRIBUTION_HPP_
11
12// include config.h
13#ifdef HAVE_CONFIG_H
14#include <config.h>
15#endif
16
17#include "CodePatterns/Assert.hpp"
18
19#include <cmath>
20#include <list>
21#include <map>
22#include <set>
23#include <vector>
24
25#include "LinearAlgebra/Vector.hpp"
26
27class SphericalPointDistributionTest;
28
29/** contains getters for the VSEPR model for specific number of electrons.
30 *
31 * This struct contains specialized functions returning a list of Vectors
32 * (points in space) to match the VSEPR model for the given number of electrons.
33 *
34 * This is implemented via template specialization of the function get().
35 *
36 * These specializations are taken from the python script \b CreateVspeShapes.py
37 * by Christian Neuen, 07th May 2009.
38 */
39struct SphericalPointDistribution
40{
41 /** Cstor for SphericalPointDistribution, allows setting radius of sphere
42 *
43 * \param _BondLength desired radius of sphere
44 */
45 SphericalPointDistribution(const double _Bondlength = 1.) :
46 Bondlength(_Bondlength)
47 {}
48
49 //!> typedef for the list of points
50 typedef std::list<Vector> Polygon_t;
51 //!> typedef for the list of points with integral weights
52 typedef std::list<std::pair<Vector, int> > WeightedPolygon_t;
53 //!> typedef for a sorted list of indices
54 typedef std::set<unsigned int> IndexSet_t;
55 //!> typedef for the adjacency list of a polygon
56 typedef std::map<unsigned int, IndexSet_t > adjacency_t;
57
58 /** General getter function for the distribution of points on the surface.
59 *
60 * \warn this function needs to be specialized!
61 *
62 * \return Polygon_t with points on the surface centered at (0,0,0)
63 */
64 template <int N> Polygon_t get() const
65 {
66 ASSERT(0, "SphericalPointDistribution::get() - not specialized for "+toString(N)+".");
67 return Polygon_t();
68 }
69
70 template <int N> adjacency_t getConnections()
71 {
72 ASSERT(0, "SphericalPointDistribution::getConnections() - not specialized for "+toString(N)+".");
73 return Polygon_t();
74 }
75
76 /** Matches a given spherical distribution with another containing more
77 * points.
78 *
79 * This is a helper to determine points where to best insert saturation
80 * hydrogens.
81 *
82 * \param _polygon current occupied positions
83 * \param _newpolygon ideal distribution to match best with current occupied
84 * positions
85 * \return remaining vacant positions relative to \a _polygon
86 */
87 static Polygon_t matchSphericalPointDistributions(
88 const WeightedPolygon_t &_polygon,
89 Polygon_t &_newpolygon
90 );
91
92 //!> default radius of the spherical distribution
93 const double Bondlength;
94 //!> precalculated value for root of 3
95 static const double SQRT_3;
96 //!> threshold for L1 error below which matching is immediately acceptable
97 static const double L1THRESHOLD;
98 //!> threshold for L2 error below which matching is acceptable
99 static const double L2THRESHOLD;
100
101 //!> typedef for a full rotation specification consisting of axis and angle.
102 typedef std::pair<Vector, double> Rotation_t;
103
104 //!> typedef for a list of indices (of points in a polygon)
105 typedef std::list<unsigned int> IndexList_t;
106 //!> typedef enumerating possibly multiple points accumulated as one point
107 typedef std::list< IndexList_t > IndexTupleList_t;
108 //!> typedef for a vector of indices
109 typedef std::vector<unsigned int> IndexArray_t;
110 //!> typedef for a Vector of positions
111 typedef std::vector<Vector> VectorArray_t;
112 //!> typedef for a Vector of positions with weights
113 typedef std::vector< std::pair<Vector, int> > WeightedVectorArray_t;
114 //!> typedef for a vector of degrees (or integral weights)
115 typedef std::vector<unsigned int> WeightsArray_t;
116
117 //!> amplitude up to which deviations in checks of rotations are tolerated
118 static const double warn_amplitude;
119
120 struct PolygonWithIndices
121 {
122 //!> array with points
123 VectorArray_t polygon;
124 //!> list with indices for the above points, defining subset
125 IndexList_t indices;
126 };
127
128 static Vector calculateCenterOfMinimumDistance(
129 const SphericalPointDistribution::VectorArray_t &_positions,
130 const SphericalPointDistribution::IndexList_t &_indices);
131
132private:
133 //!> grant unit tests access to private parts
134 friend class SphericalPointDistributionTest;
135
136 static std::pair<double, double> calculateErrorOfMatching(
137 const VectorArray_t &_old,
138 const VectorArray_t &_new,
139 const IndexTupleList_t &_Matching);
140
141 static Polygon_t removeMatchingPoints(
142 const PolygonWithIndices &_points);
143
144 struct MatchingControlStructure {
145 bool foundflag;
146 double bestL2;
147 IndexTupleList_t bestmatching;
148 VectorArray_t oldpoints;
149 VectorArray_t newpoints;
150 WeightsArray_t weights;
151 };
152
153 static void recurseMatchings(
154 MatchingControlStructure &_MCS,
155 IndexTupleList_t &_matching,
156 IndexList_t _indices,
157 WeightsArray_t &_remainingweights,
158 WeightsArray_t::iterator _remainiter,
159 const unsigned int _matchingsize
160 );
161
162 static IndexList_t findBestMatching(
163 const WeightedPolygon_t &_polygon,
164 Polygon_t &_newpolygon
165 );
166
167 static IndexList_t joinPoints(
168 Polygon_t &_newpolygon,
169 const VectorArray_t &_newpoints,
170 const IndexTupleList_t &_bestmatching
171 );
172
173 static Rotation_t findPlaneAligningRotation(
174 const PolygonWithIndices &_referencepositions,
175 const PolygonWithIndices &_currentpositions
176 );
177
178 static Rotation_t findPointAligningRotation(
179 const PolygonWithIndices &remainingold,
180 const PolygonWithIndices &remainingnew);
181};
182
183// declare specializations
184
185template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<0>() const;
186template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<1>() const;
187template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<2>() const;
188template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<3>() const;
189template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<4>() const;
190template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<5>() const;
191template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<6>() const;
192template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<7>() const;
193template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<8>() const;
194template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<9>() const;
195template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<10>() const;
196template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<11>() const;
197template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<12>() const;
198template <> SphericalPointDistribution::Polygon_t SphericalPointDistribution::get<14>() const;
199
200template <> SphericalPointDistribution::adjacency_t SphericalPointDistribution::getConnections<0>();
201template <> SphericalPointDistribution::adjacency_t SphericalPointDistribution::getConnections<1>();
202template <> SphericalPointDistribution::adjacency_t SphericalPointDistribution::getConnections<2>();
203template <> SphericalPointDistribution::adjacency_t SphericalPointDistribution::getConnections<3>();
204template <> SphericalPointDistribution::adjacency_t SphericalPointDistribution::getConnections<4>();
205template <> SphericalPointDistribution::adjacency_t SphericalPointDistribution::getConnections<5>();
206template <> SphericalPointDistribution::adjacency_t SphericalPointDistribution::getConnections<6>();
207template <> SphericalPointDistribution::adjacency_t SphericalPointDistribution::getConnections<7>();
208template <> SphericalPointDistribution::adjacency_t SphericalPointDistribution::getConnections<8>();
209template <> SphericalPointDistribution::adjacency_t SphericalPointDistribution::getConnections<9>();
210template <> SphericalPointDistribution::adjacency_t SphericalPointDistribution::getConnections<10>();
211template <> SphericalPointDistribution::adjacency_t SphericalPointDistribution::getConnections<11>();
212template <> SphericalPointDistribution::adjacency_t SphericalPointDistribution::getConnections<12>();
213template <> SphericalPointDistribution::adjacency_t SphericalPointDistribution::getConnections<14>();
214
215#endif /* SPHERICALPOINTDISTRIBUTION_HPP_ */
Note: See TracBrowser for help on using the repository browser.