【读splishsplash源代码】一步步调试3-- TimeStepDFSPH::step()

回顾

上期链接【读splishsplash源代码】一步步调试2–SimulatorBase::timeStep()

上回说到,我们来到
位于\SPlisHSPlasH\DFSPH\TimeStepDFSPH.cpp
的第86行,即TimeStepDFSPH::step()函数入口

此文件夹(DFSPH)中只有四个文件
在这里插入图片描述

这次我们讲解TimeStepDFSPH.cpp中的代码流。

TimeStepDFSPH::step()

位于\SPlisHSPlasH\DFSPH\TimeStepDFSPH.cpp
如图所示

step1
这里的关键指针和变量
指针:

  1. sim 指向模拟对象(如选用的方法)
  2. tm 指向时间对象
  3. fm/model 指向动态的数据(如速度、位置、粒子数)。通常用sim指针去调用fm指针,如:sim->getFluidModel(fluidModelIndex)

局部变量:

  1. h 时间步,这里是0.005
  2. numParticles 粒子数目
  3. nModel 有几种流体, 这里为1
  4. fluidModelIndex 第几种流体,与nModel合用

以下几部分为关键步骤(函数):

  1. 邻域搜索:performNeighborhoodSearch()
  2. 计算密度:computeDensities()
  3. 计算系数:computeDFSPHFactor()
  4. 计算密度差:divergenceSolve() (DFSPH中的前半)
    step2
  5. 计算非压力梯度力:computeNonPressureForces
  6. 计算时间步长:updateTimeStepSize
  7. 根据非压力梯度力更新速度加速度: for循环
  8. 求解压力:pressureSolve() (DFSPH中的后半)
  9. 时间积分:for循环

在这里插入图片描述

控制流回顾

至此我们的调用顺序为:

  1. main()中调用base->run()
  2. SimulatorBase::run()中调用runSimulation()
  3. SimulatorBase::runSimulation()中调用m_gui->run()
  4. Simulator_GUI_imgui::run()中调用MiniGL::mainLoop()
  5. MiniGL::mainLoop()中调用idlefunc()
  6. SimulatorBase::timeStep()中调用Simulation::getCurrent()->getTimeStep()->step()
  7. 调用TimeStepDFSPH::step()

篇外话

splishsplash是一个基于面向对象范式的类库。面向对象有个缺点:从静态的结构中很难看出真正的运行时结构。所以就需要走控制流。

我们将在另外的文章中进行静态结构的分析。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值