1

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

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

我将在 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...

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

4

2 回答 2

2

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

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

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

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

于 2013-01-22T16:37:00.233 回答
1

好吧,这不是一件容易的事!

首先:您想模拟基本扩散或气体的完整运动?第二种情况一点也不简单,但你可以在这里得到一个想法。

如果您只想在静态环境中扩散气体,事情会更容易,但您无法测量总压力,您唯一的变量将是气体的局部浓度。

这种现象受菲克定律支配;第二个可能是您正在寻找的。

阅读有限差分方法以了解如何离散化扩散方程。题目相当大,在这里写一个完整的答案。

于 2013-01-22T11:38:34.603 回答