这次我们从类的角度来观察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。
这里直接说结论(函数调用顺序):
- main()中调用base->run()
- SimulationBase::run()中调用runSimulation()
- SimulationBase::runSimulation()中调用m_gui->run()
- Simulator_GUI_imgui::run()中调用MiniGL::mainLoop()
- MiniGL::mainLoop()中调用idlefunc()
- SimulatorBase::timeStep()中调用Simulation::getCurrent()->getTimeStep()->step()
- TimeStepDFSPH::step()中调用sim->computeNonPressureForces();
附录:如何使用Understand看UML类图
整个项目的UML类图
会弹出一个非常大的图
(如果你发现是空白,那一定是因为图片太大你在空白处)
PS: 双击可以收起成员
查看某个类的类图
查看某个类对应代码
右键
快速查看基类和子类
右键
这个窗口很有用,可以快速跳转到对应代码
和绝大部分IDE一样,在函数上control+左键可以快速跳转