回顾
上期链接【读splishsplash源代码】一步步调试2–SimulatorBase::timeStep()
上回说到,我们来到
位于\SPlisHSPlasH\DFSPH\TimeStepDFSPH.cpp
的第86行,即TimeStepDFSPH::step()函数入口
此文件夹(DFSPH)中只有四个文件
这次我们讲解TimeStepDFSPH.cpp中的代码流。
TimeStepDFSPH::step()
位于\SPlisHSPlasH\DFSPH\TimeStepDFSPH.cpp
如图所示
这里的关键指针和变量
指针:
- sim 指向模拟对象(如选用的方法)
- tm 指向时间对象
- fm/model 指向动态的数据(如速度、位置、粒子数)。通常用sim指针去调用fm指针,如:sim->getFluidModel(fluidModelIndex)
局部变量:
- h 时间步,这里是0.005
- numParticles 粒子数目
- nModel 有几种流体, 这里为1
- fluidModelIndex 第几种流体,与nModel合用
以下几部分为关键步骤(函数):
- 邻域搜索:performNeighborhoodSearch()
- 计算密度:computeDensities()
- 计算系数:computeDFSPHFactor()
- 计算密度差:divergenceSolve() (DFSPH中的前半)
- 计算非压力梯度力:computeNonPressureForces
- 计算时间步长:updateTimeStepSize
- 根据非压力梯度力更新速度加速度: for循环
- 求解压力:pressureSolve() (DFSPH中的后半)
- 时间积分:for循环
控制流回顾
至此我们的调用顺序为:
- main()中调用base->run()
- SimulatorBase::run()中调用runSimulation()
- SimulatorBase::runSimulation()中调用m_gui->run()
- Simulator_GUI_imgui::run()中调用MiniGL::mainLoop()
- MiniGL::mainLoop()中调用idlefunc()
- SimulatorBase::timeStep()中调用Simulation::getCurrent()->getTimeStep()->step()
- 调用TimeStepDFSPH::step()
篇外话
splishsplash是一个基于面向对象范式的类库。面向对象有个缺点:从静态的结构中很难看出真正的运行时结构。所以就需要走控制流。
我们将在另外的文章中进行静态结构的分析。