PeriDyno 1.0.0
Loading...
Searching...
No Matches
SparseGridHash.cu
Go to the documentation of this file.
1#include "SparseGridHash.h"
2
3#include "Object.h"
4#include "DataTypes.h"
5
6#include <thrust/sort.h>
7
8namespace dyno
9{
10 template<typename TDataType>
11 SparseGridHash<TDataType>::SparseGridHash()
12 {
13 }
14
15 template<typename TDataType>
16 SparseGridHash<TDataType>::~SparseGridHash()
17 {
18 }
19
20 template<typename TDataType>
21 void SparseGridHash<TDataType>::setSpace(Coord lo, Real h, Real L)
22 {
23 m_lo = lo;
24 m_h = h;
25 m_L = L;
26
27 Real segments = m_L / h;
28
29 m_level_max = ceil(log2(segments));
30 }
31
32 template<typename Coord>
33 DYN_FUNC void CalculateIndex(
34 int& i,
35 int& j,
36 int& k,
37 Coord p,
38 Coord origin,
39 Real L,
40 int level)
41 {
42 int grid_size = (int)pow(Real(2), int(level));
43
44 Coord p_rel = p - origin;
45
46 i = (int)floor(p_rel.x / L * grid_size);
47 j = (int)floor(p_rel.y / L * grid_size);
48 k = (int)floor(p_rel.z / L * grid_size);
49 }
50
51 template<typename Coord>
52 __global__ void SGH_CreateAllNodes(
53 DArray<OctreeNode> nodes,
54 DArray<Coord> points,
55 Coord origin,
56 Real L,
57 int level)
58 {
59 int tId = threadIdx.x + (blockIdx.x * blockDim.x);
60
61 if (tId >= nodes.size()) return;
62
63 int i, j, k;
64 CalculateIndex(i, j, k, points[tId], origin, L, level);
65
66 nodes[tId] = OctreeNode(level, i, j, k);
67
68 nodes[tId].setDataIndex(tId);
69 }
70
71 template<typename TDataType>
72 void SparseGridHash<TDataType>::construct(DArray<Coord>& points, Real h)
73 {
74 m_h = h;
75
76 Reduction<Coord> reduce;
77 Coord maxV = reduce.maximum(points.begin(), points.size());
78 Coord minV = reduce.minimum(points.begin(), points.size());
79
80 Real maxL = maximum(abs(maxV.x - minV.x), maximum(abs(maxV.y - minV.y), abs(maxV.z - minV.z)));
81
82 Real segments = m_L / h;
83 m_level_max = std::max(ceil(log2(segments)), Real(2));
84
85 m_L = m_h * pow(Real(2), m_level_max);
86
87 m_lo = (maxV + minV) / 2 - m_L / 2;
88
89 m_all_nodes.resize(points.size());
90
91 cuExecute(m_all_nodes.size(),
92 SGH_CreateAllNodes,
93 m_all_nodes,
94 points,
95 m_lo,
96 m_L,
97 m_level_max);
98
99 thrust::sort(thrust::device, m_all_nodes.begin(), m_all_nodes.begin() + m_all_nodes.size(), NodeCmp());
100 }
101
102 DEFINE_CLASS(SparseGridHash);
103}