MDStressLab++
Loading...
Searching...
No Matches
Grid.cpp
Go to the documentation of this file.
1/*
2 * Grid.cpp
3 *
4 * Created on: Nov 5, 2019
5 * Author: Nikhil
6 */
7
8#include "Grid.h"
9#include <fstream>
10#include "typedef.h"
11#include "SpatialHash.h"
12#include <iostream>
13
14template<ConfigType T>
15Grid<T>::Grid(int _ngrid) : ngrid(_ngrid)
16{
17 this->setCounter();
19 if (numberOfGrids == 1) MY_HEADING("Creating Grids");
20
21 std::cout << "Grid " << numberOfGrids << ". Initializing a grid of size " << ngrid << " to the origin." << std::endl;
22 this->coordinates.resize(ngrid,Vector3d(0.0,0.0,0.0));
23}
24
25template<ConfigType T>
27 Vector3d upperLimit,
28 int ngridx, int ngridy, int ngridz):ngrid(ngridx*ngridy*ngridz)
29{
30 if ( !(lowerLimit.array() < upperLimit.array()).prod() )
31 MY_ERROR("ERROR: The coordinates of lowerLimit are not less than the upperLimit");
32
33 this->setCounter();
35 if (numberOfGrids == 1) MY_HEADING("Creating Grids");
36
37
38 std::cout << "Grid " << numberOfGrids << ". Creating a uniform grid of " << ngrid << " points between (" << lowerLimit
39 << ") and (" << upperLimit << ")"<< std::endl;
40 std::cout << std::endl;
41 coordinates.resize(ngrid);
42
43 int index= 0;
44 Vector3d coordinate;
45 coordinate= lowerLimit;
46 for (auto i : range<int>(0,ngridx))
47 {
48 coordinate(0) = lowerLimit(0) + i*(upperLimit(0)-lowerLimit(0))/ngridx;
49 for (auto j : range<int>(0,ngridy))
50 {
51 coordinate(1) = lowerLimit(1) + j*(upperLimit(1)-lowerLimit(1))/ngridy;
52 for (auto k : range<int>(0,ngridz))
53 {
54 coordinate(2)= lowerLimit(2) + k*(upperLimit(2)-lowerLimit(2))/ngridz;
55 coordinates[index]= coordinate;
56 index++;
57 }
58 }
59 }
60}
61
62template<ConfigType T>
63Grid<T>::Grid(std::string filename)
64{
65 this->setCounter();
67 if (numberOfGrids == 1) MY_HEADING("Creating Grids");
68 std::cout << "Grid " << numberOfGrids << ". Reading grid from filename: " << filename << std::endl;
69 std::cout << std::endl;
70
71 std::ifstream file(filename);
72
73 file >> ngrid;
74 coordinates.resize(ngrid);
75 for(auto& position : coordinates)
76 for (int i_dim=0; i_dim<DIM; i_dim++)
77 if(!(file >> position(i_dim))) MY_ERROR("ERROR: Reading grid coordinates");
78}
79
80// Function to calculate neighbor lists of grid points consisting of particles in subconfig within a distance of
81// padding from the grid points
82template<ConfigType T>
83std::vector<std::set<int>> Grid<T>::getGridNeighborLists(const SubConfiguration& subconfig, const double& padding) const
84{
85 std::vector<std::set<int>> gridNeighborLists;
86
87 // Hash the coordinates
88 Vector3d origin,step;
89 origin.setConstant(0.0);
90 step.setConstant(padding);
91 ConstSpatialHash hashParticles(origin,step,subconfig.coordinates.at(T));
92 // Hash the grid points
93 ConstSpatialHash hashGrid(origin,step,coordinates);
94
95
96 int i_gridPoint= 0;
97 for(const auto& gridPoint : coordinates)
98 {
99 std::set<int> gridContributingList;
100 Triplet bin= hashGrid.hashFunction(i_gridPoint);
101 Triplet neighborBin;
102 // for each neighboring bin of a grid point's bin
103 for (const auto& neighborBin : bin.neighborList())
104 {
105 std::vector<int>& particleList= hashParticles.hashTable[neighborBin];
106 // for each particle in a neighboring bin
107 for(const auto& particle : particleList)
108 {
109 double distance= (subconfig.coordinates.at(T).row(particle)-gridPoint).squaredNorm();
110 if (distance<=pow(padding,2))
111 gridContributingList.insert(particle);
112 }
113 }
114 gridNeighborLists.push_back(gridContributingList);
115 i_gridPoint++;
116
117 }
118 return gridNeighborLists;
119}
120
121template<ConfigType T>
122void Grid<T>::write(std::string filename) const
123{
124 std::ofstream file(filename+".grid");
125
126 file << ngrid << "\n";
127 file << "\n";
128 for (const auto& coordinate : coordinates)
129 file << coordinate << std::endl;
130}
131
132template<ConfigType T>
133void Grid<T>::read(std::string filename)
134{
135 std::cout << "Reading grid from file " << filename << "\n" << std::endl;
136
137 std::ifstream file(filename);
138
139 int ngridInFile;
140 file >> ngridInFile;
141 if (ngrid!= ngridInFile)
142 MY_ERROR("Error: Number of grid points in file" << " = " << ngridInFile <<
143 ", does not equal to " << ngrid << " in grid.");
144
145 for(auto& position : coordinates)
146 for (int i_dim=0; i_dim<DIM; i_dim++)
147 if(!(file >> position(i_dim))) MY_ERROR("ERROR: Reading grid coordinates");
148}
149
150template<ConfigType T>
152{
154 else if (T == Current) GridBase::numberOfCurrentGrids+=1;
155 else MY_ERROR("Unrecognized grid type");
156}
157
158
159template<ConfigType T>
161 // TODO Auto-generated destructor stub
162}
163
164template<ConfigType T>
165GridSubConfiguration<T>::GridSubConfiguration(const Grid<T>& grid, const SubConfiguration& subconfig, const double& padding) :
166grid(grid),
167subconfig(subconfig),
168padding(padding),
169hashGridSubconfig(std::make_pair(ConstSpatialHash(Vector3d::Zero(),Vector3d::Constant(padding),grid.coordinates),
170 ConstSpatialHash(Vector3d::Zero(),Vector3d::Constant(padding),subconfig.coordinates.at(T))))
171{}
172
173template<ConfigType T>
174std::set<int> GridSubConfiguration<T>::getGridPointNeighbors(const int& i_gridPoint) const
175{
176 const ConstSpatialHash& hashGrid= hashGridSubconfig.first;
177 const ConstSpatialHash& hashParticles= hashGridSubconfig.second;
178
179 std::set<int> gridContributingList;
180 Triplet bin= hashGrid.hashFunction(i_gridPoint);
181 Triplet neighborBin;
182 // for each neighboring bin of a grid point's bin
183 for (const auto& neighborBin : bin.neighborList())
184 {
185 //const std::vector<int>& particleList= hashParticles.hashTable.at(neighborBin);
186 const std::vector<int>& particleList=
187 (hashParticles.hashTable.find(neighborBin)!=hashParticles.hashTable.end()) ?
188 hashParticles.hashTable.at(neighborBin) : std::vector<int>();
189
190 // for each particle in a neighboring bin
191 for(const auto& particle : particleList)
192 {
193 double distance= (subconfig.coordinates.at(T).row(particle)-grid.coordinates[i_gridPoint]).squaredNorm();
194 if (distance<=pow(padding,2))
195 gridContributingList.insert(particle);
196 }
197 }
198 return gridContributingList;
199}
std::map< ConfigType, MatrixXd > coordinates
Map from configuration type (Reference or Current) to coordinate matrices.
static int numberOfReferenceGrids
Definition Grid.h:19
static int numberOfCurrentGrids
Definition Grid.h:20
std::vector< Vector3d > coordinates
Definition Grid.h:18
std::set< int > getGridPointNeighbors(const int &) const
Definition Grid.cpp:174
GridSubConfiguration(const Grid< T > &, const SubConfiguration &, const double &)
Definition Grid.cpp:165
Definition Grid.h:31
void setCounter()
Definition Grid.cpp:151
virtual ~Grid()
Definition Grid.cpp:160
std::vector< std::set< int > > getGridNeighborLists(const SubConfiguration &, const double &) const
Definition Grid.cpp:83
void read(std::string)
Definition Grid.cpp:133
int ngrid
Definition Grid.h:39
Grid(int)
Definition Grid.cpp:15
void write(std::string) const
Definition Grid.cpp:122
Triplet hashFunction(const int &i) const
std::map< Triplet, std::vector< int > > hashTable
std::vector< Triplet > neighborList()
Definition SpatialHash.h:42
Definition range.h:11
#define DIM
#define MY_ERROR(message)
Definition typedef.h:17
Eigen::Matrix< double, 1, DIM, Eigen::RowMajor > Vector3d
Definition typedef.h:60
@ Current
Definition typedef.h:70
@ Reference
Definition typedef.h:69
#define MY_HEADING(heading)
Definition typedef.h:36