32 this->varSamplingDistance()->setRange(0.001, 1);
33 this->varSmoothingLength()->setRange(1, 3);
35 auto callback = std::make_shared<FCallBackFunc>(
37 auto d = this->varSamplingDistance()->getValue();
38 auto h = this->varSmoothingLength()->getValue();
39 this->stateSamplingDistance()->setValue(d);
40 this->stateSmoothingLength()->setValue(d * h);
44 this->varSamplingDistance()->attach(callback);
45 this->varSmoothingLength()->attach(callback);
47 this->varSmoothingLength()->setValue(1.2);
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());
56 auto nbrQuery = std::make_shared<NeighborPointQuery<TDataType>>();
57 this->stateSmoothingLength()->connect(nbrQuery->inRadius());
58 this->statePosition()->connect(nbrQuery->inPosition());
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());
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());
80 integrator->connect(density->importModules());
81 density->connect(viscosity->importModules());
84 auto calculateNorm = std::make_shared<CalculateNorm<DataType3f>>();
85 this->stateVelocity()->connect(calculateNorm->inVec());
88 auto colorMapper = std::make_shared<ColorMapping<DataType3f>>();
89 colorMapper->varMax()->setValue(5.0f);
90 calculateNorm->outNorm()->connect(colorMapper->inScalar());
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);
98 this->statePointSet()->connect(ptRender->inPointSet());
99 colorMapper->outColor()->connect(ptRender->inColor());
115 auto emitters = this->getParticleEmitters();
117 int curNum = this->statePosition()->size();
118 int totalNum = curNum;
119 if (emitters.size() > 0)
121 for (
int i = 0; i < emitters.size(); i++)
123 totalNum += emitters[i]->sizeOfParticles();
126 if (totalNum > curNum)
133 pBuf.assign(this->statePosition()->getData());
134 vBuf.assign(this->stateVelocity()->getData());
137 this->statePosition()->resize(totalNum);
138 this->stateVelocity()->resize(totalNum);
146 new_pos.assign(pBuf, curNum, 0, 0);
147 new_vel.assign(vBuf, curNum, 0, 0);
155 for (
int i = 0; i < emitters.size(); i++)
157 int num = emitters[i]->sizeOfParticles();
163 new_pos.assign(points, num, offset, 0);
164 new_vel.assign(vels, num, offset, 0);
172 if (this->varReshuffleParticles()->getValue())
174 auto& pos = this->statePosition()->getData();
175 auto& vel = this->stateVelocity()->getData();
189 auto initials = this->getInitialStates();
191 if (initials.size() > 0)
195 for (
int i = 0; i < initials.size(); i++)
197 totalNum += initials[i]->statePosition()->size();
200 this->statePosition()->resize(totalNum);
201 this->stateVelocity()->resize(totalNum);
209 for (
int i = 0; i < initials.size(); i++)
211 auto inPos = initials[i]->statePosition()->getDataPtr();
212 auto inVel = initials[i]->stateVelocity()->getDataPtr();
213 if (!inPos->isEmpty())
215 uint num = inPos->size();
217 new_pos.assign(*inPos, num, offset, 0);
218 new_vel.assign(*inVel, num, offset, 0);
226 this->statePosition()->resize(0);
227 this->stateVelocity()->resize(0);
void preUpdateStates() override
void resetStates() override
static void reorderParticles(DArray< Coord > &pos, DArray< Coord > &vel, DArray< OcKey > &morton)
static void calculateMortonCode(DArray< OcKey > &morton, DArray< Coord > &pos, Real d)