PeriDyno 1.2.1
Loading...
Searching...
No Matches
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 this->varSamplingDistance()->setRange(0.001, 1);
33 this->varSmoothingLength()->setRange(1, 3);
34
35 auto callback = std::make_shared<FCallBackFunc>(
36 [=]() {
37 auto d = this->varSamplingDistance()->getValue();
38 auto h = this->varSmoothingLength()->getValue();
39 this->stateSamplingDistance()->setValue(d);
40 this->stateSmoothingLength()->setValue(d * h);
41 }
42 );
43
44 this->varSamplingDistance()->attach(callback);
45 this->varSmoothingLength()->attach(callback);
46
47 this->varSmoothingLength()->setValue(1.2);
48
49
50 auto integrator = std::make_shared<ParticleIntegrator<TDataType>>();
51 this->stateTimeStep()->connect(integrator->inTimeStep());
52 this->statePosition()->connect(integrator->inPosition());
53 this->stateVelocity()->connect(integrator->inVelocity());
54 this->animationPipeline()->pushModule(integrator);
55
56 auto nbrQuery = std::make_shared<NeighborPointQuery<TDataType>>();
57 this->stateSmoothingLength()->connect(nbrQuery->inRadius());
58 this->statePosition()->connect(nbrQuery->inPosition());
59 this->animationPipeline()->pushModule(nbrQuery);
60
61 auto density = std::make_shared<SemiImplicitDensitySolver<TDataType>>();
62 this->stateSamplingDistance()->connect(density->inSamplingDistance());
63 this->stateSmoothingLength()->connect(density->inSmoothingLength());
64 this->stateTimeStep()->connect(density->inTimeStep());
65 this->statePosition()->connect(density->inPosition());
66 this->stateVelocity()->connect(density->inVelocity());
67 nbrQuery->outNeighborIds()->connect(density->inNeighborIds());
68 this->animationPipeline()->pushModule(density);
69
70 auto viscosity = std::make_shared<ImplicitViscosity<TDataType>>();
71 viscosity->varViscosity()->setValue(Real(1.0));
72 this->stateTimeStep()->connect(viscosity->inTimeStep());
73 this->stateSmoothingLength()->connect(viscosity->inSmoothingLength());
74 this->stateSamplingDistance()->connect(viscosity->inSamplingDistance());
75 this->statePosition()->connect(viscosity->inPosition());
76 this->stateVelocity()->connect(viscosity->inVelocity());
77 nbrQuery->outNeighborIds()->connect(viscosity->inNeighborIds());
78 this->animationPipeline()->pushModule(viscosity);
79
80 integrator->connect(density->importModules());
81 density->connect(viscosity->importModules());
82
83 //Setup the default render modules
84 auto calculateNorm = std::make_shared<CalculateNorm<DataType3f>>();
85 this->stateVelocity()->connect(calculateNorm->inVec());
86 this->graphicsPipeline()->pushModule(calculateNorm);
87
88 auto colorMapper = std::make_shared<ColorMapping<DataType3f>>();
89 colorMapper->varMax()->setValue(5.0f);
90 calculateNorm->outNorm()->connect(colorMapper->inScalar());
91 this->graphicsPipeline()->pushModule(colorMapper);
92
93 auto ptRender = std::make_shared<GLPointVisualModule>();
94 ptRender->varPointSize()->setValue(0.0035f);
95 ptRender->setColor(Color(1, 0, 0));
96 ptRender->setColorMapMode(GLPointVisualModule::PER_VERTEX_SHADER);
97
98 this->statePointSet()->connect(ptRender->inPointSet());
99 colorMapper->outColor()->connect(ptRender->inColor());
100
101 this->graphicsPipeline()->pushModule(ptRender);
102
103 this->setDt(Real(0.001));
104 }
105
106 template<typename TDataType>
108 {
109 Log::sendMessage(Log::Info, "ParticleFluid released \n");
110 }
111
112 template<typename TDataType>
114 {
115 auto emitters = this->getParticleEmitters();
116
117 int curNum = this->statePosition()->size();
118 int totalNum = curNum;
119 if (emitters.size() > 0)
120 {
121 for (int i = 0; i < emitters.size(); i++)
122 {
123 totalNum += emitters[i]->sizeOfParticles();
124 }
125
126 if (totalNum > curNum)
127 {
128 DArray<Coord> pBuf;
129 DArray<Coord> vBuf;
130
131 if (curNum > 0)
132 {
133 pBuf.assign(this->statePosition()->getData());
134 vBuf.assign(this->stateVelocity()->getData());
135 }
136
137 this->statePosition()->resize(totalNum);
138 this->stateVelocity()->resize(totalNum);
139
140 DArray<Coord>& new_pos = this->statePosition()->getData();
141 DArray<Coord>& new_vel = this->stateVelocity()->getData();
142
143 //Assign attributes from initial states
144 if (curNum > 0)
145 {
146 new_pos.assign(pBuf, curNum, 0, 0);
147 new_vel.assign(vBuf, curNum, 0, 0);
148
149 pBuf.clear();
150 vBuf.clear();
151 }
152
153 //Assign attributes from emitters
154 int offset = curNum;
155 for (int i = 0; i < emitters.size(); i++)
156 {
157 int num = emitters[i]->sizeOfParticles();
158 if (num > 0)
159 {
160 DArray<Coord>& points = emitters[i]->getPositions();
161 DArray<Coord>& vels = emitters[i]->getVelocities();
162
163 new_pos.assign(points, num, offset, 0);
164 new_vel.assign(vels, num, offset, 0);
165
166 offset += num;
167 }
168 }
169 }
170 }
171
172 if (this->varReshuffleParticles()->getValue())
173 {
174 auto& pos = this->statePosition()->getData();
175 auto& vel = this->stateVelocity()->getData();
176
177 DArray<OcKey> morton(pos.size());
178
181
182 morton.clear();
183 }
184 }
185
186 template<typename TDataType>
188 {
189 auto initials = this->getInitialStates();
190
191 if (initials.size() > 0)
192 {
193 int totalNum = 0;
194
195 for (int i = 0; i < initials.size(); i++)
196 {
197 totalNum += initials[i]->statePosition()->size();
198 }
199
200 this->statePosition()->resize(totalNum);
201 this->stateVelocity()->resize(totalNum);
202
203 if (totalNum > 0)
204 {
205 DArray<Coord>& new_pos = this->statePosition()->getData();
206 DArray<Coord>& new_vel = this->stateVelocity()->getData();
207
208 int offset = 0;
209 for (int i = 0; i < initials.size(); i++)
210 {
211 auto inPos = initials[i]->statePosition()->getDataPtr();
212 auto inVel = initials[i]->stateVelocity()->getDataPtr();
213 if (!inPos->isEmpty())
214 {
215 uint num = inPos->size();
216
217 new_pos.assign(*inPos, num, offset, 0);
218 new_vel.assign(*inVel, num, offset, 0);
219
220 offset += num;
221 }
222 }
223 }
224 }
225 else {
226 this->statePosition()->resize(0);
227 this->stateVelocity()->resize(0);
228 }
229 }
230
231 template<typename TDataType>
233 {
235
236 if (!this->statePosition()->isEmpty())
237 {
238 auto points = this->statePointSet()->getDataPtr();
239 points->setPoints(this->statePosition()->getData());
240 }
241 else
242 {
243 auto points = this->statePointSet()->getDataPtr();
244 points->clear();
245 }
246 }
247
248 template<typename TDataType>
253
255}
#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:311
void setDt(Real dt)
Definition Node.cpp:89
std::shared_ptr< AnimationPipeline > animationPipeline()
Definition Node.cpp:302
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