Cesium实现实时三维CFD仿真计算测试
CFD
CFD(Computational Fluid Dynamics,计算流体动力学)仿真计算,通俗来说,就是用计算机来模拟流体(如空气、水、油等)流动以及伴随的热传递、化学反应等物理现象的一种技术。
你可以把它理解为“虚拟的流体实验”。通过CFD,工程师可以在电脑上“看到”流体的运动轨迹、速度、压力、温度分布等,而不必每次都去做物理实验。

对于我们GIS行业来说,CFD仿真可用于:
🌬️ 城市规划:优化建筑布局,改善城市通风与热环境
在高密度城市中,建筑物会显著影响风的流动。不合理的布局可能导致局部强风(“高楼风”)或通风不畅,加剧热岛效应和空气污染。
具体应用:规划者可以先在GIS中导入真实的建筑三维数据和地形,然后利用CFD模拟不同风向下,整个街区的风速、风压和温度分布。通过分析模拟结果,可以优化建筑的高度、朝向和间距,找到最佳的通风廊道,提升居民舒适度。
🔥 公共安全:模拟危险物质泄漏扩散
城市中的人口和建筑密集,一旦发生燃气泄漏、化学品泄漏或火灾,后果严重。CFD+GIS为此类事件的应急响应提供了科学依据。
具体应用:利用GIS快速建立包含周边建筑群的三维模型,然后通过CFD模拟泄漏气体的扩散路径、浓度分布和影响范围。应急指挥人员可以据此精确划定疏散区域、规划救援路线,并评估事故对学校、医院等关键设施的影响。
在Cesium中实现CDF
LBM(Lattice Boltzmann Method,格子玻尔兹曼方法),是计算流体力学(CFD)中一种与传统方法(如NS方程)思路完全不同的新兴数值模拟技术。
如果说传统CFD是从宏观视角,把流体看作连续的整体来直接计算压力和速度;那么LBM就像是从一个更微观的“上帝视角”出发,模拟大量虚拟粒子在格子上进行“碰撞”和“迁移”的集体行为,最终让宏观的流体现象从这些简单的局部规则中自然“涌现”出来。
在 WebGL 下已经有很多成熟的案例基于LBM算法实现CFD计算,比如shadertoy-LBM 2
不过目前这些案例都是二维的计算,也就是说,流体只能在一个平面上进行流动(比如风撞到墙壁,只能向左右扩散,无法上下扩散),这对于GIS分析来说,显然是不够的。
因此,我们需要做的就是将shadertoy-LBM 2中的二维算法扩展到三维。
在三维的LBM算法中,有三种比较常见的离散速度模型。
| 模型名称 | 速度方向数 | 速度集构成 (在立方体网格上) | 主要特点与定位 |
|---|---|---|---|
| D3Q15 | 15 | 1个静止 + 6个面向邻点 + 8个角点 | 内存占用最少,计算效率高。但由于缺少面对角线方向,数值稳定性较差,精度相对较低,适用于对精度要求不高的简单流动。 |
| D3Q19 | 19 | 1个静止 + 6个面向邻点 + 12个棱心邻点 | 精度和效率的黄金平衡点,是目前工业界和学术界应用最广泛的模型。它完整包含了二阶应力张量,能很好地模拟大多数不可压流体,是通用模拟的首选。 |
| D3Q27 | 27 | 1个静止 + 所有26个相邻格点方向 | 精度和稳定性最高,速度集最完整,旋转对称性最好。但内存消耗和计算量也最大。适合对精度要求极高的湍流、气动声学等复杂模拟。 |
绝大多数通用场景,需要平衡效率与精度的情况下,我们通常选择 D3Q19 作为离散速度模型,它是当之无愧的“万金油”模型。
选好模型时候,我们就需要模仿shadertoy-LBM 2当中的思路,写出 D3Q19 的 19个平衡态分布函数的计算,并将19个分布函数值和一个障碍物值存储起来,以便进行下一次计算。
怎么存储这些值呢?
shadertoy-LBM 2的做法是:
将9个分布函数值(f0-f8)和1个障碍物标记(solid)压缩存储到一张纹理的像素中,利用了RGBA三个通道和2x2的像素块布局。像素块坐标(左上角为基准):
1 | |
如果我们按相同的做法,那么要存下19个分布函数值和一个障碍物值,我们需要至少将纹理分成2*3的像素布局块(2 * 3 * 4 = 24),但是WebGL存在最大纹理大小的限制,如果采用这个方案,我们将无法创建更大的模拟精度,并且存在纹理空间浪费(一个像素块空余了4个像素没用)。
因此我的方案是创建5张RGBA四通道的纹理,利用MRT的方式,将19个分布函数值和一个障碍物值分别存储到不同的位置。
最后根据需求,利用体渲染、等值面、风场线等方式渲染即可。