我目前正在编写一个程序,该程序将非常基本地模拟3D体积中气体的扩散和压力,并在整个过程中都具有边界-例如以蚂蚁洞穴为例。
我想要达到的效果:
1.随着时间的推移,气体扩散到整个环境中,并遵守墙壁。
2.我想测量每个网格点的压力或气体压缩率。这样的效果应该是,如果打开一个房间,气体将以反映压力差的速度从开口中扩散出来。

我的问题是我缺乏全面理解理论数学方程式的知识,老实说,我确实不是在寻找精确的模拟。我只想在物理上取得一些突出的效果。我对流体动力学不感兴趣(例如,模拟烟雾)。

我将用OpenCL编写该程序,但很高兴采用任何形式的代码示例,无论是C还是伪代码。

我想我应该传递3个3D数组-一个用于气体,一个用于定义壁(例如,在xyz = wall处为1),另一个用于存储压力。
我目前假设检查墙很容易。一个人简单地检查每个相邻的小区并为其计算,如果它不是一堵墙:

For each grid point,
  is wallmatrix[x+1] a wall?
    [diffusion math here]
  is wallmatrix[x-1] a wall?
    [diffusion math here]
  is wallmatrix[y+1] a wall?
    [diffusion math here]
  etc...


但是我只是不确定如何处理扩散数学,也不知道如何在所有这些因素中包含压力?

最佳答案

扩散是最容易模拟的事情之一,因为它具有自我平滑功能。

例如,您可以按照恒定的时间步长运行仿真,并跟踪各个粒子的位置,然后在每个时间步长将每个粒子以固定(较小)的距离移动,但方向随机。

也有其他方法,例如,您可以执行基于网格的方法,其中更改每个网格位置中的粒子数量。

您的问题有一个小问题,就是您在哪里说:“以反映压力差的速度扩散出开口”。扩散实际上并没有做到这一点,因为扩散只是粒子的随机运动。不过,我认为,即使直线扩散在这里也可能会让您满意,因为气体会从开口中扩散出来,并且看起来会更快。确实会发生的事情是,它将以与其他任何地方相同的速度扩散出去,只是没有任何东西扩散回去。但是,如果这不令人满意,那么您将需要进入流体动力学,至少要讲一点,因为这是描述压力梯度而不是扩散时流体的行为的方式。

10-07 18:53