MDStressLab++
Loading...
Searching...
No Matches
Stencil.h
Go to the documentation of this file.
1/*
2 * Stencil.h
3 *
4 * Created on: Dec 13, 2019
5 * Author: Nikhil
6 */
7
8#ifndef SRC_STENCIL_H_
9#define SRC_STENCIL_H_
10
11#include "SpatialHash.h"
12#include "Configuration.h"
13#include "typedef.h"
14#include <map>
15
16class Configuration;
17
18template<ConfigType T>
19class Grid;
20class GridBase;
21
22class Stencil {
23public:
25 std::map<int,int> particleContributingMap;
26
27 //template<ConfigType configType>
28 //void expandStencil(const Grid<configType>* pgrid, const double&, const double&);
29
30 void expandStencil(const std::vector<Vector3d>& gridCoordinates, const MatrixXd& coordinates, const double& contributingNeighborhoodSize, const double& noncontributingNeighborhoodSize)
31 {
32 double padding= contributingNeighborhoodSize + noncontributingNeighborhoodSize;
33
34 Vector3d origin,step;
35 origin.setConstant(0.0);
36 step.setConstant(padding);
37
38 // Hash the coordinates
39 ConstSpatialHash hashParticles(origin,step,coordinates);
40 // Hash the grid points
41 ConstSpatialHash hashGrid(origin,step,gridCoordinates);
42
43#pragma omp parallel
44 {
45 std::map<int, int> particleContributingMapLocal;
46 //int i_gridPoint= 0;
47 // for each grid point
48#pragma omp for
49 //for(const auto& gridPoint : pgrid->coordinates)
50 //{
51 for (int i_gridPoint = 0; i_gridPoint < gridCoordinates.size(); i_gridPoint++) {
52 const auto &gridPoint = gridCoordinates[i_gridPoint];
53 Triplet bin = hashGrid.hashFunction(i_gridPoint);
54 // for each neighboring bin of a grid point's bin
55 for (const auto &neighborBin: bin.neighborList()) {
56
57 const std::vector<int>& particleList=
58 (hashParticles.hashTable.find(neighborBin)!=hashParticles.hashTable.end()) ?
59 hashParticles.hashTable.at(neighborBin) : std::vector<int>();
60
61
62 // for each particle in a neighboring bin
63 for (const auto &particle: particleList) {
64 double distanceSquared = (coordinates.row(particle) -
65 gridPoint).squaredNorm();
66
67 if (distanceSquared <= pow(contributingNeighborhoodSize, 2))
68 //particleContributingMap.insert_or_assign({particle,1});
69 particleContributingMapLocal[particle] = 1;
70 else if (distanceSquared <= pow(padding, 2))
71 particleContributingMapLocal.insert({particle, 0});
72 }
73 }
74 //i_gridPoint++;
75 }
76#pragma omp critical
77 {
78 for(const auto& [particle,contributing] : particleContributingMapLocal) {
79 if (contributing == 1)
80 particleContributingMap[particle] = 1;
81 else
82 particleContributingMap.insert({particle,0});
83 }
84
85 }
86 }
87
88 }
89 template<ConfigType configType>
90 void expandStencil(const Grid<configType>* pgrid, const double& contributingNeighborhoodSize, const double& noncontributingNeighborhoodSize)
91 {
92 expandStencil(pgrid->coordinates, parent.coordinates.at(configType), contributingNeighborhoodSize,noncontributingNeighborhoodSize);
93 }
94
95 void emptyStencil();
96 Stencil(const Configuration&);
97 virtual ~Stencil();
98
99};
100
101//#include "Stencil.cpp"
102
103#endif /* SRC_STENCIL_H_ */
Represents atomic configuration data including coordinates, velocities, and species.
std::vector< Vector3d > coordinates
Definition Grid.h:18
Definition Grid.h:31
Triplet hashFunction(const int &i) const
std::map< Triplet, std::vector< int > > hashTable
const Configuration & parent
Definition Stencil.h:24
void expandStencil(const Grid< configType > *pgrid, const double &contributingNeighborhoodSize, const double &noncontributingNeighborhoodSize)
Definition Stencil.h:90
void expandStencil(const std::vector< Vector3d > &gridCoordinates, const MatrixXd &coordinates, const double &contributingNeighborhoodSize, const double &noncontributingNeighborhoodSize)
Definition Stencil.h:30
std::map< int, int > particleContributingMap
Definition Stencil.h:25
std::vector< Triplet > neighborList()
Definition SpatialHash.h:42
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