9 #include "imstkDynamicalModel.h" 10 #include "imstkSphState.h" 11 #include "imstkSPHKernels.h" 12 #include "imstkNeighborSearch.h" 13 #include "imstkSphBoundaryConditions.h" 31 SphModelConfig(
const double particleRadius,
const double speedOfSound,
const double restDensity);
35 double m_maxTimestep = 1.0e-3;
36 double m_cflFactor = 1.0;
39 double m_particleRadius = 0.0;
43 double m_restDensity = 1000.0;
46 double m_particleMass = 1.0;
50 bool m_bNormalizeDensity =
false;
51 bool m_bDensityWithBoundary =
false;
54 double m_pressureStiffness = 50000.0;
57 double m_dynamicViscosityCoeff = 1.0e-2;
58 double m_viscosityBoundary = 1.0e-5;
59 double m_surfaceTensionStiffness = 1.0;
60 double m_frictionBoundary = 0.1;
63 double m_kernelOverParticleRadiusRatio = 4.0;
68 Vec3d m_gravity = Vec3d(0.0, -9.81, 0.0);
71 double m_speedOfSound = 18.7;
74 NeighborSearch::Method m_neighborSearchMethod = NeighborSearch::Method::UniformGridBasedSearch;
90 void configure(
const std::shared_ptr<SphModelConfig>& params) { m_modelParameters = params; }
95 bool initialize()
override;
107 assert(m_modelParameters);
108 return m_modelParameters;
115 void setTimeStep(
const double timeStep)
override { setDefaultTimeStep(timeStep); }
128 void setInitialVelocities(
const size_t numParticles,
const Vec3d& initialVelocities);
130 double getParticlePressure(
const double density);
136 void findNearestParticleToVertex(
const VecDataArray<double, 3>& points,
const std::vector<std::vector<size_t>>& indices);
138 void setBoundaryConditions(std::shared_ptr<SphBoundaryConditions> sphBoundaryConditions) { m_sphBoundaryConditions = sphBoundaryConditions; }
139 std::shared_ptr<SphBoundaryConditions> getBoundaryConditions() {
return m_sphBoundaryConditions; }
141 void setRestDensity(
const double restDensity) { m_modelParameters->m_restDensity = restDensity; }
143 std::shared_ptr<TaskNode> getFindParticleNeighborsNode()
const {
return m_findParticleNeighborsNode; }
144 std::shared_ptr<TaskNode> getComputeDensityNode()
const {
return m_computeDensityNode; }
145 std::shared_ptr<TaskNode> getComputePressureNode()
const {
return m_computePressureAccelNode; }
146 std::shared_ptr<TaskNode> getComputeSurfaceTensionNode()
const {
return m_computeSurfaceTensionNode; }
147 std::shared_ptr<TaskNode> getComputeTimeStepSizeNode()
const {
return m_computeTimeStepSizeNode; }
148 std::shared_ptr<TaskNode> getSumAccelsNode()
const {
return m_sumAccelsNode; }
149 std::shared_ptr<TaskNode> getIntegrateNode()
const {
return m_integrateNode; }
150 std::shared_ptr<TaskNode> getComputeViscosityNode()
const {
return m_computeViscosityNode; }
151 std::shared_ptr<TaskNode> getUpdateVelocityNode()
const {
return m_updateVelocityNode; }
152 std::shared_ptr<TaskNode> getMoveParticlesNode()
const {
return m_moveParticlesNode; }
158 void initGraphEdges(std::shared_ptr<TaskNode> source, std::shared_ptr<TaskNode> sink)
override;
164 void computeTimeStepSize();
169 double computeCFLTimeStepSize();
174 void findParticleNeighbors();
179 void computeNeighborRelativePositions();
185 void collectNeighborDensity();
190 void computeDensity();
195 void normalizeDensity();
200 void computePressureAcceleration();
210 void updateVelocity(
const double timestep);
215 void computeViscosity();
222 void computeSurfaceTension();
227 void moveParticles(
const double timestep);
232 std::shared_ptr<TaskNode> m_findParticleNeighborsNode =
nullptr;
233 std::shared_ptr<TaskNode> m_computeDensityNode =
nullptr;
234 std::shared_ptr<TaskNode> m_computePressureAccelNode =
nullptr;
235 std::shared_ptr<TaskNode> m_computeSurfaceTensionNode =
nullptr;
236 std::shared_ptr<TaskNode> m_computeTimeStepSizeNode =
nullptr;
237 std::shared_ptr<TaskNode> m_sumAccelsNode =
nullptr;
238 std::shared_ptr<TaskNode> m_integrateNode =
nullptr;
239 std::shared_ptr<TaskNode> m_updateVelocityNode =
nullptr;
240 std::shared_ptr<TaskNode> m_computeViscosityNode =
nullptr;
241 std::shared_ptr<TaskNode> m_moveParticlesNode =
nullptr;
242 std::shared_ptr<TaskNode> m_normalizeDensityNode =
nullptr;
243 std::shared_ptr<TaskNode> m_collectNeighborDensityNode =
nullptr;
246 std::shared_ptr<PointSet> m_pointSetGeometry;
252 std::shared_ptr<SphModelConfig> m_modelParameters;
253 std::shared_ptr<NeighborSearch> m_neighborSearcher;
255 std::shared_ptr<VecDataArray<double, 3>> m_pressureAccels =
nullptr;
256 std::shared_ptr<VecDataArray<double, 3>> m_surfaceTensionAccels =
nullptr;
257 std::shared_ptr<VecDataArray<double, 3>> m_viscousAccels =
nullptr;
258 std::shared_ptr<VecDataArray<double, 3>> m_neighborVelContr =
nullptr;
259 std::shared_ptr<VecDataArray<double, 3>> m_particleShift =
nullptr;
261 std::shared_ptr<VecDataArray<double, 3>> m_initialVelocities =
nullptr;
262 std::shared_ptr<DataArray<double>> m_initialDensities =
nullptr;
264 int m_timeStepCount = 0;
266 std::shared_ptr<SphBoundaryConditions> m_sphBoundaryConditions =
nullptr;
268 std::vector<size_t> m_minIndices;
void configure(const std::shared_ptr< SphModelConfig > ¶ms)
Set simulation parameters.
double m_particleMassScale
scale particle mass to a smaller value to maintain stability
const std::shared_ptr< SphModelConfig > & getParameters() const
Get the simulation parameters.
void setTimeStep(const double timeStep) override
Set the default time step size, valid only if using a fixed time step for integration.
void resetToInitialState() override
Reset the current state to the initial state.
double m_eta
proportion of position change due to neighbors velocity (XSPH method)
Class that holds the SPH model parameters.
double m_particleRadiusSqr
void setDefaultTimeStep(const double timeStep)
Set the default time step size, valid only if using a fixed time step for integration.
Class contains SPH kernels for time integration, using different kernel for different purposes...
double getTimeStep() const override
Returns the time step size.
Base class for mathematical model of the physics governing the dynamic object.