模拟3D矩阵基本扩散的最简单方法是什么?

时间:2013-01-22 09:50:50

标签: c++ opencl physics

我目前正在编写一个程序,它将用非常基本的术语模拟三维体积中气体的扩散和压力,并考虑到例如蚂蚁洞穴。 我想要实现的效果: 随着时间的推移,气体在整个环境中扩散,尊重墙壁。 我想测量每个网格点的压力或压缩气体。这样做的结果应该是,如果房间被打开,气体将以反映压力差的速度扩散出开口。

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

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

我想我应该传递3个3D阵列 - 一个用于气体,一个用于定义墙壁(例如1个在xyz =墙壁),另一个用于存储压力。 我目前正在考虑检查墙很容易。一个人只需检查每个相邻的小区,如果它不是一个墙,则考虑该小区:

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...

但是我不知道如何处理扩散数学,也不知道如何在这一切中包含压力?

2 个答案:

答案 0 :(得分:2)

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

例如,您可以根据恒定时间步长运行模拟并跟踪单个粒子位置,并在每个时间步长移动每个粒子固定(小)距离,但是在随机方向。

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

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

答案 1 :(得分:1)

嗯,这不是一件容易的事!

首先:你想模拟基本扩散或气体的完整运动?第二种情况根本不容易,但你可以得到一个想法here

如果你只是想在静态环境中扩散气体,事情就会变得容易,但你无法衡量 总压力,你唯一的变量将是当地的气体浓度。

这种现象受Fick laws的支配;第二个可能就是你要找的东西。

阅读finite difference方法,了解如何对扩散方程进行离散化。 在这里写一个完整的答案是非常重要的。