1#include "SparseGridHash.h"
6#include <thrust/sort.h>
10 template<typename TDataType>
11 SparseGridHash<TDataType>::SparseGridHash()
15 template<typename TDataType>
16 SparseGridHash<TDataType>::~SparseGridHash()
20 template<typename TDataType>
21 void SparseGridHash<TDataType>::setSpace(Coord lo, Real h, Real L)
27 Real segments = m_L / h;
29 m_level_max = ceil(log2(segments));
32 template<typename Coord>
33 DYN_FUNC void CalculateIndex(
42 int grid_size = (int)pow(Real(2), int(level));
44 Coord p_rel = p - origin;
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);
51 template<typename Coord>
52 __global__ void SGH_CreateAllNodes(
53 DArray<OctreeNode> nodes,
59 int tId = threadIdx.x + (blockIdx.x * blockDim.x);
61 if (tId >= nodes.size()) return;
64 CalculateIndex(i, j, k, points[tId], origin, L, level);
66 nodes[tId] = OctreeNode(level, i, j, k);
68 nodes[tId].setDataIndex(tId);
71 template<typename TDataType>
72 void SparseGridHash<TDataType>::construct(DArray<Coord>& points, Real h)
76 Reduction<Coord> reduce;
77 Coord maxV = reduce.maximum(points.begin(), points.size());
78 Coord minV = reduce.minimum(points.begin(), points.size());
80 Real maxL = maximum(abs(maxV.x - minV.x), maximum(abs(maxV.y - minV.y), abs(maxV.z - minV.z)));
82 Real segments = m_L / h;
83 m_level_max = std::max(ceil(log2(segments)), Real(2));
85 m_L = m_h * pow(Real(2), m_level_max);
87 m_lo = (maxV + minV) / 2 - m_L / 2;
89 m_all_nodes.resize(points.size());
91 cuExecute(m_all_nodes.size(),
99 thrust::sort(thrust::device, m_all_nodes.begin(), m_all_nodes.begin() + m_all_nodes.size(), NodeCmp());
102 DEFINE_CLASS(SparseGridHash);