PeriDyno 1.0.0
Loading...
Searching...
No Matches
ParticleFluid.cpp
Go to the documentation of this file.
1#include "ParticleFluid.h"
2
3//ParticleSystem
6
7//Framework
9
10//Topology
11#include "Topology/PointSet.h"
12
13namespace dyno
14{
16
19 {
20 auto smoothingLength = std::make_shared<FloatingNumber<DataType3f>>();
21 smoothingLength->varValue()->setValue(Real(0.006));
22 this->animationPipeline()->pushModule(smoothingLength);
23
24 auto integrator = std::make_shared<ParticleIntegrator>();
25 this->stateTimeStep()->connect(integrator->inTimeStep());
26 this->statePosition()->connect(integrator->inPosition());
27 this->stateVelocity()->connect(integrator->inVelocity());
28 this->animationPipeline()->pushModule(integrator);
29
30 //TODO: replace other modules
31// auto nbrQuery = std::make_shared<NeighborPointQuery>();
32// smoothingLength->outFloating()->connect(nbrQuery->inRadius());
33// this->statePosition()->connect(nbrQuery->inPosition());
34// this->animationPipeline()->pushModule(nbrQuery);
35//
36// auto density = std::make_shared<DensityPBD<TDataType>>();
37// smoothingLength->outFloating()->connect(density->varSmoothingLength());
38// this->stateTimeStep()->connect(density->inTimeStep());
39// this->statePosition()->connect(density->inPosition());
40// this->stateVelocity()->connect(density->inVelocity());
41// nbrQuery->outNeighborIds()->connect(density->inNeighborIds());
42// this->animationPipeline()->pushModule(density);
43//
44// auto viscosity = std::make_shared<ImplicitViscosity<TDataType>>();
45// viscosity->varViscosity()->setValue(Real(1.0));
46// this->stateTimeStep()->connect(viscosity->inTimeStep());
47// smoothingLength->outFloating()->connect(viscosity->inSmoothingLength());
48// this->statePosition()->connect(viscosity->inPosition());
49// this->stateVelocity()->connect(viscosity->inVelocity());
50// nbrQuery->outNeighborIds()->connect(viscosity->inNeighborIds());
51// this->animationPipeline()->pushModule(viscosity);
52 }
53
54 ParticleFluid::~ParticleFluid()
55 {
56 Log::sendMessage(Log::Info, "ParticleFluid released \n");
57 }
58
59 void ParticleFluid::preUpdateStates()
60 {
61 auto emitters = this->getParticleEmitters();
62
63 int curNum = this->statePosition()->size();
64 int totalNum = curNum;
65 if (emitters.size() > 0)
66 {
67 for (int i = 0; i < emitters.size(); i++)
68 {
69 totalNum += emitters[i]->sizeOfParticles();
70 }
71
72 if (totalNum > curNum)
73 {
74 DArray<Vec3f> pBuf;
75 DArray<Vec3f> vBuf;
76 DArray<Vec3f> fBuf;
77
78 if (curNum > 0)
79 {
80 pBuf.assign(this->statePosition()->getData());
81 vBuf.assign(this->stateVelocity()->getData());
82 fBuf.assign(this->stateForce()->getData());
83 }
84
85 this->statePosition()->resize(totalNum);
86 this->stateVelocity()->resize(totalNum);
87
88 //Currently, the force is simply set to zero
89 this->stateForce()->resize(totalNum);
90 this->stateForce()->reset();
91
92 DArray<Vec3f>& new_pos = this->statePosition()->getData();
93 DArray<Vec3f>& new_vel = this->stateVelocity()->getData();
94
95 //Assign attributes from intial states
96 if (curNum > 0)
97 {
98 new_pos.assign(pBuf, curNum, 0, 0);
99 new_vel.assign(vBuf, curNum, 0, 0);
100
101 pBuf.clear();
102 vBuf.clear();
103 fBuf.clear();
104 }
105
106 //Assign attributes from emitters
107 int offset = curNum;
108 for (int i = 0; i < emitters.size(); i++)
109 {
110 int num = emitters[i]->sizeOfParticles();
111 if (num > 0)
112 {
113 DArray<Vec3f>& points = emitters[i]->getPositions();
114 DArray<Vec3f>& vels = emitters[i]->getVelocities();
115
116 new_pos.assign(points, num, offset, 0);
117 new_vel.assign(vels, num, offset, 0);
118
119 offset += num;
120 }
121 }
122 }
123 }
124 }
125
127 {
128 if (!this->statePosition()->isEmpty())
129 {
130 auto ptSet = this->statePointSet()->getDataPtr();
131 int num = this->statePosition()->size();
132 auto& pts = ptSet->getPoints();
133 if (num != pts.size())
134 {
135 pts.resize(num);
136 }
137
138 pts.assign(this->statePosition()->getData());
139 }
140 }
141
143 {
144 auto initials = this->getInitialStates();
145
146 if (initials.size() > 0)
147 {
148 int totalNum = 0;
149
150 for (int i = 0; i < initials.size(); i++)
151 {
152 totalNum += initials[i]->statePosition()->size();
153 }
154
155 this->statePosition()->resize(totalNum);
156 this->stateVelocity()->resize(totalNum);
157 this->stateForce()->resize(totalNum);
158 this->stateForce()->reset();
159
160 if (totalNum > 0)
161 {
162 DArray<Vec3f>& new_pos = this->statePosition()->getData();
163 DArray<Vec3f>& new_vel = this->stateVelocity()->getData();
164 DArray<Vec3f>& new_force = this->stateForce()->getData();
165
166 int offset = 0;
167 for (int i = 0; i < initials.size(); i++)
168 {
169 auto inPos = initials[i]->statePosition()->getDataPtr();
170 auto inVel = initials[i]->stateVelocity()->getDataPtr();
171 if (!inPos->isEmpty())
172 {
173 uint num = inPos->size();
174
175 new_pos.assign(*inPos, num, offset, 0);
176 new_vel.assign(*inVel, num, offset, 0);
177
178 offset += num;
179 }
180 }
181 }
182 }
183 else {
184 this->statePosition()->resize(0);
185 this->stateVelocity()->resize(0);
186 this->stateForce()->resize(0);
187 }
188 }
189
190 void ParticleFluid::resetStates()
191 {
192 loadInitialStates();
193
194 if (!this->statePosition()->isEmpty())
195 {
196 auto points = this->statePointSet()->getDataPtr();
197 points->setPoints(this->statePosition()->getData());
198 }
199 else
200 {
201 auto points = this->statePointSet()->getDataPtr();
202 points->clear();
203 }
204 }
205}
#define IMPLEMENT_CLASS(name)
Definition Object.h:79
double Real
Definition Typedef.inl:23
unsigned int uint
Definition VkReduce.h:5
void postUpdateStates() override
This class represents the base class for more advanced particle-based nodes.
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25