MDStressLab++
Loading...
Searching...
No Matches
SpatialHash.h
Go to the documentation of this file.
1/*
2 * SpatialHash.h
3 *
4 * Created on: Nov 27, 2019
5 * Author: Nikhil
6 */
7
8#ifndef SRC_SPATIALHASH_H_
9#define SRC_SPATIALHASH_H_
10
11#include <vector>
12#include <iostream>
13#include <map>
14#include <vector>
15#include <cmath>
16#include "range.h"
17#include "typedef.h"
18
25class Triplet: public Vector3i
26{
27public:
28 Triplet()=default;
29 Triplet(int i,int j,int k): Vector3i(i,j,k) {}
30 Triplet(const Vector3i& base) : Vector3i(base){}
31
32 // Define < operator to use std::map<Triplet,std::vector<int>>
33 bool operator <(const Triplet& rhs) const
34 {
35 if (this->operator()(0) < rhs(0)) return true;
36 if (rhs(0) < this->operator()(0)) return false;
37 if (this->operator()(1) < rhs(1)) return true;
38 if (rhs(1) < this->operator()(1)) return false;
39 if (this->operator()(2) < rhs(2)) return true;
40 return false;
41 }
42
43 std::vector<Triplet> neighborList()
44 {
45 std::vector<Triplet> tripletList;
46 for (auto i : range<int>(-1,2))
47 for (auto j : range<int>(-1,2))
48 for (auto k : range<int>(-1,2))
49 {
50 Triplet s= static_cast<Vector3i>(*this + Triplet(i,j,k));
51 tripletList.push_back(s);
52 }
53 return tripletList;
54 }
55
56 virtual ~Triplet(){}
57};
58
59
67template<bool flag, typename T, typename U>
68struct Select
69{
73 typedef T Result;
74};
75
76template<typename T, typename U>
77struct Select<false, T, U> { typedef U Result; };
78
86template<bool isConst>
88public:
91 typedef typename Select<isConst, const std::vector<Vector3d>, std::vector<Vector3d>>::Result C;
92
104 std::vector<Eigen::Map<B>> coordinates;
108 std::map<Triplet,std::vector<int>> hashTable;
109
114 {
115 int size= coordinates.rows();
116 for(int i_point=0; i_point<size; i_point++)
117 {
118 Eigen::Map<B> vector(&coordinates(i_point,0),3);
119 this->coordinates.push_back(vector);
120 hashTable[hashFunction(i_point)].push_back(i_point);
121 }
122 }
126 {
127 int size= coordinates.size();
128 for(int i_point=0; i_point<size; i_point++)
129 {
130 Eigen::Map<B> vector(&coordinates[i_point](0),3);
131 this->coordinates.push_back(vector);
132 hashTable[hashFunction(i_point)].push_back(i_point);
133 }
134
135 }
136
140 Triplet hashFunction(const int& i) const
141 {
142 assert(!(i<0));
143 Triplet triple;
144 Vector3i& base= triple;
145 Vector3d coordinate= coordinates[i];
146 coordinate= coordinate-origin;
147 coordinate= (coordinate.array()/step.array()).floor().matrix();
148 base= coordinate.template cast<int>();
149 return triple;
150 }
151
152 virtual ~SpatialHash(){}
153
154};
156
161class BoxPoints : public SpatialHash<false>
162{
163private:
164 Matrix3d cell;
165public:
169 {
170 cell= step.asDiagonal();
171 }
173 const Matrix3d& cell,
174 MatrixXd& coordinates):SpatialHash<false>(origin,cell.diagonal(),coordinates),cell(cell){}
177 std::vector<Vector3d>& coordinates) : SpatialHash<false>(origin,step,coordinates)
178 {
179 cell= step.asDiagonal();
180 }
182 const Matrix3d& cell,
183 std::vector<Vector3d>& coordinates) : SpatialHash<false>(origin,cell.diagonal(),coordinates),cell(cell) {}
184
185 virtual ~BoxPoints(){}
186
191 void fold(const Vector3i& pbc)
192 {
193 Matrix3d inverseCell= cell.inverse();
194 int size= coordinates.size();
195 for(auto i_point : range<int>(0,size))
196 {
197 Vector3d relativePosition= coordinates[i_point] - origin;
198 Vector3d fractionalPosition= (inverseCell * relativePosition.transpose()).transpose();
199 Vector3d foldedFractionalPosition= fractionalPosition;
200 for (int i_dim=0; i_dim<DIM; ++i_dim)
201 if (pbc(i_dim))
202 foldedFractionalPosition(i_dim)-= std::floor(foldedFractionalPosition(i_dim));
203
204 if ((foldedFractionalPosition-fractionalPosition).squaredNorm()>epsilon)
205 {
206 std::cout << "Folding point " << i_point << ": "
207 << coordinates[i_point] << " ---> ";
208 coordinates[i_point]= origin + (cell * foldedFractionalPosition.transpose()).transpose();
209 std::cout << coordinates[i_point] << std::endl;
210 }
211 }
212 }
213};
214
215#endif /* SRC_SPATIALHASH_H_ */
SpatialHash< true > ConstSpatialHash
BoxPoints(Vector3d origin, const Matrix3d &cell, MatrixXd &coordinates)
void fold(const Vector3i &pbc)
virtual ~BoxPoints()
BoxPoints(Vector3d origin, Vector3d step, MatrixXd &coordinates)
BoxPoints(Vector3d origin, const Matrix3d &cell, std::vector< Vector3d > &coordinates)
BoxPoints(Vector3d origin, Vector3d step, std::vector< Vector3d > &coordinates)
Select< isConst, constVector3d, Vector3d >::Result B
Definition SpatialHash.h:90
SpatialHash(Vector3d origin, Vector3d step, C &coordinates)
Vector3d step
Select< isConst, conststd::vector< Vector3d >, std::vector< Vector3d > >::Result C
Definition SpatialHash.h:91
Vector3d origin
Definition SpatialHash.h:96
std::vector< Eigen::Map< B > > coordinates
Triplet hashFunction(const int &i) const
SpatialHash(Vector3d origin, Vector3d step, A &coordinates)
Select< isConst, constMatrixXd, MatrixXd >::Result A
Definition SpatialHash.h:89
virtual ~SpatialHash()
std::map< Triplet, std::vector< int > > hashTable
Triplet(int i, int j, int k)
Definition SpatialHash.h:29
bool operator<(const Triplet &rhs) const
Definition SpatialHash.h:33
Triplet()=default
Triplet(const Vector3i &base)
Definition SpatialHash.h:30
virtual ~Triplet()
Definition SpatialHash.h:56
std::vector< Triplet > neighborList()
Definition SpatialHash.h:43
Definition range.h:11
void transpose(double const *mat, double *const trans)
Definition helper.hpp:59
#define DIM
Eigen::Matrix< double, DIM, DIM, Eigen::RowMajor > Matrix3d
Definition typedef.h:56
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > MatrixXd
Definition typedef.h:54
Eigen::Matrix< double, 1, DIM, Eigen::RowMajor > Vector3d
Definition typedef.h:60
Eigen::Matrix< int, 1, DIM, Eigen::RowMajor > Vector3i
Definition typedef.h:61
const double epsilon
Definition typedef.h:73