PeriDyno 1.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
ParticleFluid.cpp
Go to the documentation of this file.
1#include "ParticleFluid.h"
2
3//ParticleSystem
4#include "Module/CalculateNorm.h"
8
10
11//Framework
13
14//Collision
15#include "Collision/NeighborPointQuery.h"
16
17//Topology
18#include "Topology/PointSet.h"
19
20//Rendering
21#include "ColorMapping.h"
22#include "GLPointVisualModule.h"
23
24namespace dyno
25{
27
28 template<typename TDataType>
30 : ParticleSystem<TDataType>()
31 {
32 auto smoothingLength = this->animationPipeline()->template createModule<FloatingNumber<TDataType>>();
33 smoothingLength->varValue()->setValue(Real(0.006));
34
35 auto samplingDistance = this->animationPipeline()->template createModule<FloatingNumber<TDataType>>();
36 samplingDistance->varValue()->setValue(Real(0.005));
37
38 auto integrator = std::make_shared<ParticleIntegrator<TDataType>>();
39 this->stateTimeStep()->connect(integrator->inTimeStep());
40 this->statePosition()->connect(integrator->inPosition());
41 this->stateVelocity()->connect(integrator->inVelocity());
42 this->animationPipeline()->pushModule(integrator);
43
44 auto nbrQuery = std::make_shared<NeighborPointQuery<TDataType>>();
45 smoothingLength->outFloating()->connect(nbrQuery->inRadius());
46 this->statePosition()->connect(nbrQuery->inPosition());
47 this->animationPipeline()->pushModule(nbrQuery);
48
49 auto density = std::make_shared<SemiImplicitDensitySolver<TDataType>>();
50 smoothingLength->outFloating()->connect(density->inSmoothingLength());
51 samplingDistance->outFloating()->connect(density->inSamplingDistance());
52 this->stateTimeStep()->connect(density->inTimeStep());
53 this->statePosition()->connect(density->inPosition());
54 this->stateVelocity()->connect(density->inVelocity());
55 nbrQuery->outNeighborIds()->connect(density->inNeighborIds());
56 this->animationPipeline()->pushModule(density);
57
58 auto viscosity = std::make_shared<ImplicitViscosity<TDataType>>();
59 viscosity->varViscosity()->setValue(Real(1.0));
60 this->stateTimeStep()->connect(viscosity->inTimeStep());
61 smoothingLength->outFloating()->connect(viscosity->inSmoothingLength());
62 samplingDistance->outFloating()->connect(viscosity->inSamplingDistance());
63 this->statePosition()->connect(viscosity->inPosition());
64 this->stateVelocity()->connect(viscosity->inVelocity());
65 nbrQuery->outNeighborIds()->connect(viscosity->inNeighborIds());
66 this->animationPipeline()->pushModule(viscosity);
67
68 //Setup the default render modules
69 auto calculateNorm = std::make_shared<CalculateNorm<DataType3f>>();
70 this->stateVelocity()->connect(calculateNorm->inVec());
71 this->graphicsPipeline()->pushModule(calculateNorm);
72
73 auto colorMapper = std::make_shared<ColorMapping<DataType3f>>();
74 colorMapper->varMax()->setValue(5.0f);
75 calculateNorm->outNorm()->connect(colorMapper->inScalar());
76 this->graphicsPipeline()->pushModule(colorMapper);
77
78 auto ptRender = std::make_shared<GLPointVisualModule>();
79 ptRender->varPointSize()->setValue(0.0035f);
80 ptRender->setColor(Color(1, 0, 0));
81 ptRender->setColorMapMode(GLPointVisualModule::PER_VERTEX_SHADER);
82
83 this->statePointSet()->connect(ptRender->inPointSet());
84 colorMapper->outColor()->connect(ptRender->inColor());
85
86 this->graphicsPipeline()->pushModule(ptRender);
87
88 this->setDt(Real(0.001));
89 }
90
91 template<typename TDataType>
93 {
94 Log::sendMessage(Log::Info, "ParticleFluid released \n");
95 }
96
97 template<typename TDataType>
99 {
100 auto emitters = this->getParticleEmitters();
101
102 int curNum = this->statePosition()->size();
103 int totalNum = curNum;
104 if (emitters.size() > 0)
105 {
106 for (int i = 0; i < emitters.size(); i++)
107 {
108 totalNum += emitters[i]->sizeOfParticles();
109 }
110
111 if (totalNum > curNum)
112 {
113 DArray<Coord> pBuf;
114 DArray<Coord> vBuf;
115
116 if (curNum > 0)
117 {
118 pBuf.assign(this->statePosition()->getData());
119 vBuf.assign(this->stateVelocity()->getData());
120 }
121
122 this->statePosition()->resize(totalNum);
123 this->stateVelocity()->resize(totalNum);
124
125 DArray<Coord>& new_pos = this->statePosition()->getData();
126 DArray<Coord>& new_vel = this->stateVelocity()->getData();
127
128 //Assign attributes from initial states
129 if (curNum > 0)
130 {
131 new_pos.assign(pBuf, curNum, 0, 0);
132 new_vel.assign(vBuf, curNum, 0, 0);
133
134 pBuf.clear();
135 vBuf.clear();
136 }
137
138 //Assign attributes from emitters
139 int offset = curNum;
140 for (int i = 0; i < emitters.size(); i++)
141 {
142 int num = emitters[i]->sizeOfParticles();
143 if (num > 0)
144 {
145 DArray<Coord>& points = emitters[i]->getPositions();
146 DArray<Coord>& vels = emitters[i]->getVelocities();
147
148 new_pos.assign(points, num, offset, 0);
149 new_vel.assign(vels, num, offset, 0);
150
151 offset += num;
152 }
153 }
154 }
155 }
156
157 if (this->varReshuffleParticles()->getValue())
158 {
159 auto& pos = this->statePosition()->getData();
160 auto& vel = this->stateVelocity()->getData();
161
162 DArray<OcKey> morton(pos.size());
163
166
167 morton.clear();
168 }
169 }
170
171 template<typename TDataType>
173 {
174 auto initials = this->getInitialStates();
175
176 if (initials.size() > 0)
177 {
178 int totalNum = 0;
179
180 for (int i = 0; i < initials.size(); i++)
181 {
182 totalNum += initials[i]->statePosition()->size();
183 }
184
185 this->statePosition()->resize(totalNum);
186 this->stateVelocity()->resize(totalNum);
187
188 if (totalNum > 0)
189 {
190 DArray<Coord>& new_pos = this->statePosition()->getData();
191 DArray<Coord>& new_vel = this->stateVelocity()->getData();
192
193 int offset = 0;
194 for (int i = 0; i < initials.size(); i++)
195 {
196 auto inPos = initials[i]->statePosition()->getDataPtr();
197 auto inVel = initials[i]->stateVelocity()->getDataPtr();
198 if (!inPos->isEmpty())
199 {
200 uint num = inPos->size();
201
202 new_pos.assign(*inPos, num, offset, 0);
203 new_vel.assign(*inVel, num, offset, 0);
204
205 offset += num;
206 }
207 }
208 }
209 }
210 else {
211 this->statePosition()->resize(0);
212 this->stateVelocity()->resize(0);
213 }
214 }
215
216 template<typename TDataType>
218 {
220
221 if (!this->statePosition()->isEmpty())
222 {
223 auto points = this->statePointSet()->getDataPtr();
224 points->setPoints(this->statePosition()->getData());
225 }
226 else
227 {
228 auto points = this->statePointSet()->getDataPtr();
229 points->clear();
230 }
231 }
232
233 template<typename TDataType>
238
240}
#define DEFINE_CLASS(name)
Definition Object.h:140
#define IMPLEMENT_TCLASS(name, T1)
Definition Object.h:103
double Real
Definition Typedef.inl:23
@ Info
Information to user.
Definition Log.h:48
static void sendMessage(MessageType type, const std::string &text)
Add a new message to log.
Definition Log.cpp:41
std::shared_ptr< GraphicsPipeline > graphicsPipeline()
Definition Node.cpp:320
void setDt(Real dt)
Definition Node.cpp:98
std::shared_ptr< AnimationPipeline > animationPipeline()
Definition Node.cpp:311
void preUpdateStates() override
void resetStates() override
TDataType::Real Real
static void reorderParticles(DArray< Coord > &pos, DArray< Coord > &vel, DArray< OcKey > &morton)
static void calculateMortonCode(DArray< OcKey > &morton, DArray< Coord > &pos, Real d)
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
Array< T, DeviceType::GPU > DArray
Definition Array.inl:89
unsigned int uint
Definition VkProgram.h:14