CUDAParticleSystemData2.hpp
Go to the documentation of this file.
1 // This code is based on Jet framework.
2 // Copyright (c) 2018 Doyub Kim
3 // CubbyFlow is voxel-based fluid simulation engine for computer games.
4 // Copyright (c) 2020 CubbyFlow Team
5 // Core Part: Chris Ohk, Junwoo Hwang, Jihong Sin, Seungwoo Yoo
6 // AI Part: Dongheon Cho, Minseo Kim
7 // We are making my contributions/submissions to this project solely in our
8 // personal capacity and are not conveying any rights to any intellectual
9 // property of any third parties.
10 
11 #ifndef CUBBYFLOW_CUDA_PARTICLE_SYSTEM_DATA2_HPP
12 #define CUBBYFLOW_CUDA_PARTICLE_SYSTEM_DATA2_HPP
13 
14 #ifdef CUBBYFLOW_USE_CUDA
15 
16 #include <Core/Array/ArrayView.hpp>
17 #include <Core/CUDA/CUDAArray.hpp>
19 #include <Core/Matrix/Matrix.hpp>
20 
21 #include <cuda_runtime.h>
22 
23 namespace CubbyFlow
24 {
25 class CUDAParticleSystemData2
26 {
27  public:
29  using IntData = CUDAArray1<int>;
30 
32  using FloatData = CUDAArray1<float>;
33 
35  using VectorData = CUDAArray1<float2>;
36 
38  CUDAParticleSystemData2();
39 
41  explicit CUDAParticleSystemData2(size_t numberOfParticles);
42 
44  virtual ~CUDAParticleSystemData2() = default;
45 
47  CUDAParticleSystemData2(const CUDAParticleSystemData2& other);
48 
50  CUDAParticleSystemData2(CUDAParticleSystemData2&& other) noexcept;
51 
53  CUDAParticleSystemData2& operator=(const CUDAParticleSystemData2& other);
54 
56  CUDAParticleSystemData2& operator=(
57  CUDAParticleSystemData2&& other) noexcept;
58 
64  void Resize(size_t newNumberOfParticles);
65 
67  size_t NumberOfParticles() const;
68 
74  size_t AddIntData(int initialVal = 0);
75 
81  size_t AddFloatData(float initialVal = 0.0f);
82 
88  size_t AddVectorData(const Vector2F& initialVal = Vector2F{});
89 
91  size_t NumberOfIntData() const;
92 
94  size_t NumberOfFloatData() const;
95 
97  size_t NumberOfVectorData() const;
98 
100  ConstCUDAArrayView1<float2> Positions() const;
101 
103  CUDAArrayView1<float2> Positions();
104 
106  ConstCUDAArrayView1<float2> Velocities() const;
107 
109  CUDAArrayView1<float2> Velocities();
110 
112  ConstCUDAArrayView1<int> IntDataAt(size_t idx) const;
113 
115  CUDAArrayView1<int> IntDataAt(size_t idx);
116 
118  ConstCUDAArrayView1<float> FloatDataAt(size_t idx) const;
119 
121  CUDAArrayView1<float> FloatDataAt(size_t idx);
122 
124  ConstCUDAArrayView1<float2> VectorDataAt(size_t idx) const;
125 
127  CUDAArrayView1<float2> VectorDataAt(size_t idx);
128 
135  void AddParticle(const Vector2F& newPosition,
136  const Vector2F& newVelocity = Vector2F{});
137 
144  void AddParticles(
145  ConstArrayView1<Vector2F> newPositions,
146  ConstArrayView1<Vector2F> newVelocities = ArrayView1<Vector2F>{});
147 
154  void AddParticles(
155  ConstCUDAArrayView1<float2> newPositions,
156  ConstCUDAArrayView1<float2> newVelocities = CUDAArrayView1<float2>{});
157 
159  ConstCUDAArrayView1<uint32_t> NeighborStarts() const;
160 
162  ConstCUDAArrayView1<uint32_t> NeighborEnds() const;
163 
169  const CUDAPointHashGridSearcher2* NeighborSearcher() const;
170 
176  ConstCUDAArrayView1<uint32_t> NeighborLists() const;
177 
179  void BuildNeighborSearcher(float maxSearchRadius);
180 
182  void BuildNeighborLists(float maxSearchRadius);
183 
185  void Set(const CUDAParticleSystemData2& other);
186 
187  protected:
188  CUDAPointHashGridSearcher2Ptr m_neighborSearcher;
189  CUDAArray1<uint32_t> m_neighborStarts;
190  CUDAArray1<uint32_t> m_neighborEnds;
191  CUDAArray1<uint32_t> m_neighborLists;
192 
193  private:
194  size_t m_numberOfParticles = 0;
195  size_t m_positionIdx;
196  size_t m_velocityIdx;
197 
198  std::vector<IntData> m_intDataList;
199  std::vector<FloatData> m_floatDataList;
200  std::vector<VectorData> m_vectorDataList;
201 };
202 
204 using CUDAParticleSystemData2Ptr = std::shared_ptr<CUDAParticleSystemData2>;
205 } // namespace CubbyFlow
206 
207 #endif
208 
209 #endif
Definition: pybind11Utils.hpp:20
Vector2< float > Vector2F
Definition: Matrix.hpp:773