【读splishsplash源码】NonPressureForceBase类

这次我们从类的角度来观察NonPressureForceBase

文件位置:
D:\codes\SPH\SPlisHSPlasH\SPlisHSPlasH\SPlisHSPlasH\NonPressureForceBase.h

UML 类图

understand 自动生成的
在这里插入图片描述
其父类为:ParameterObject
其子类为:

  • DragBase
  • ElasticityBase
  • SurfaceTensionBase
  • ViscosityBase
  • VorticityBase

一共五个

其成员函数和成员变量为:
(#表示protected, +表示private)
在这里插入图片描述

在这里插入图片描述
这是个抽象类
可见所有的函数都被定义为了虚函数
尤其注意step函数是纯虚函数,必须被重写。这也是非压力梯度力计算的重点。

除此之外有个FluidModel指针,后续访问流体绝大部分数据都要通过这个指针。

下面我们具体来看一看某一个类,尤其关注step函数。

一个例子:SurfaceTensionBase

在这里插入图片描述

查看其子类:Becker2007(这个是代码量最小的一个)

这里面只重写了五个函数

在这里插入图片描述

着重看step函数

代码很长,就看画红框的部分
在这里插入图片描述

这是一个函数宏

宏定义在Simulation.h
在这里插入图片描述
就是简单地把code的部分复制粘贴成自己的
所以这个宏的意思是在所有邻域粒子之中循环。
我们后续将会常常用到这个宏

NonPressureForces是如何被调用的?

光看类图是无法得知一个函数是如何被调用的。类图只能展示静态的代码结构。而静态代码分析工具(比如understand)是无法得知运行时的状态和先后顺序的。

如果想知道一个函数时如何被调用,在何时被调用的,必须一步步Debug。

这里直接说结论(函数调用顺序):

  1. main()中调用base->run()
  2. SimulationBase::run()中调用runSimulation()
  3. SimulationBase::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()中调用sim->computeNonPressureForces();

附录:如何使用Understand看UML类图

整个项目的UML类图

在这里插入图片描述

会弹出一个非常大的图
(如果你发现是空白,那一定是因为图片太大你在空白处)

在这里插入图片描述
PS: 双击可以收起成员

查看某个类的类图

在这里插入图片描述

查看某个类对应代码

右键
在这里插入图片描述

快速查看基类和子类

右键
在这里插入图片描述

在这里插入图片描述
这个窗口很有用,可以快速跳转到对应代码
在这里插入图片描述

和绝大部分IDE一样,在函数上control+左键可以快速跳转

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值