计算流体力学的应用

大家好!本人CFD小白一名。在Github上看到Taichi的项目感觉很有意思就想尝试学习。
有个很笼统的问题,Taichi可以用于计算流体力学的程序开发吗?有没有Taichi只能适合于计算机视觉而不能用于CFD的问题?

另外,做过计算流体力学的同学可能知道OpenFOAM这个库,OpenFOAM也是封装了自己的Tensor场类,然后有非常庞大的函数库,从这个意义上说Taichi的优势是什么呢?

问题比较菜比较笼统请轻拍。。谢谢!

你把 Taichi 当作一门新语言,你的问题就很好解答了。

当然可以。“开发”占比可能就会高一些,毕竟你得自己搭框架。

Taichi (太极) is a programming language designed for high-performance computer graphics .

毕竟是针对图形学设计的,有这样的场景也很正常。

目前的优势应该是 kernel 能在 GPU 上跑,但是 CFD 的软件一般能在集群上跑,这么看起来目前并没有明显的优势。

非常感谢!

我正在看GAMES201课程的内容,里面也提到了Taichi是为计算机视觉而设计的。

但是从前几节课的内容来看,我的理解是,既然Taichi包含了对Tensor矩阵的支持和优化,那就完全可以胜任所有的计算流体力学甚至是所有的数值计算问题求解(当然目前还没有现成的辅助函数等工具)。为什么要特别指出说Taichi是 designed for high-performance computer graphics呢?

对啊,你把它当编程语言就不会有能不能做什么的疑问了。

这个原因也很简单,因为最初的开发者胡渊鸣是做图形学的,他的目标就是给图形学领域提供一个好用的工具,让大家免受折腾环境的烦恼。Taichi 周边的生态也是以图形学相关的居多,比如刚出的 Taichi GLSL

但这其实并不太影响 taichi 的通用性,我自己还想推荐给平时用 python 的朋友试一试 taichi,免费的的 GPU 加速真的很香。

我尝试看过一些 CUDA 编程,新概念有点多,taichi 把他们压缩到 kernelfunc 两个概念,CPU / GPU 切换又十分的顺滑,这是我感触很深的地方,也是我想把它推荐给别人的原因。

5 Likes

楼主这个问题也是我想问的啊,在看到Taichi的时候首先就想着能不能用它来写一个能实际应用的求解器。CFD的主流算法都是基于欧拉网格进行的,不像图形学中方法这么多样,不知道是不是在计算精度的要求上不同,如果能将图形学中的方法引入CFD领域会不会有一些效率上的提升。
最早看到88行MPM实现雪的模拟的时候,以为MPM求解器内嵌在Taichi中,想着能不能尝试用MPM方法做CFD计算来提高速度。看完GAMES201课程前面几节对语言的介绍之后,感觉Taichi就是为张量计算设计的,而且对GPU计算有着很好的支持,如果在编写求解器的时候就能够尽量张量化运算,感觉会给CFD模拟的效率带来较大的提升

1 Like

:smile: 距离我自己提这个问题已经过去了两个月,这期间用Taichi尝试做了一些基础的练习和编程。我现在的感觉是Taichi作为一门用来“学习”或者“研究”计算流体力学的语言是完全没有问题的,甚至是极其理想的。原因就是胡老师在课程中讲到的,Taichi简化了很多数值编程中麻烦的问题,比如并行运算和GPU运算,比如环境的搭建,更重要的是分离了数据结构和程序代码,使得操作稀疏矩阵和稠密矩阵在编程时基本没有差别等等。
但是,如果要真的作为CFD的生产力工具(我指的是用CFD去分析一些实际问题,而不是研究CFD本身),Taichi还是会在库上吃很大的亏。比如著名的计算流体开源库OpenFOAM这些代码,已经把绝绝大多数计算流体需要用到的运算做成了库,而且这些库都经过了反复的优化和验证,如果你要在Taichi里重新从0开始写一些东西,当复杂程度比较高的时候就会遇到困难,当然理论上是完全可以做到的,只是你要用Taichi开始重新造轮子。
打个比方,Taichi就像终端+Vim,而现在的那些现成的CFD库就像Visual Studio。在高手的手里Vim完全可以玩爆VS,但是对于入门者来说也许VS的生产力会高一点,但是也扼杀了你学习底层技能的机会,所以两者并没有绝对的好与坏。
我个人非常喜欢Taichi的哲学,把不应该复杂的事情简化,但是暴露给开发者最多的自由,对于数值计算编程者来说几乎没有black box,这样我觉得学习到的东西是最多的。
回到你说到的效率提升问题,这个可能就不是那么简单了,我做过一些简单的实验,Taichi是可以比一些自己写的单线程的,naive的代码快一些,但是要和商业软件的速度比,其实是有困难的(很多商业软件比如Ansys Fluent,是有非常高效的求解和很智能的收敛判别的),除非你有非常牛逼的代码优化才有可能了,所以性能上只能说是不要期待太多。

TL;DR : Taichi是一门为数值计算research打造的语言,所以你如果想深入CFD的计算内部,Taichi将是非常称手的工具。反之,如果你的目的不是研究CFD而是利用CFD做一些计算,那么Taichi很明显就偏离了你的目标。

谢谢楼主的回复 :grin:
我之前也看过一点OpenFOAM的介绍性资料,感觉学习难度挺大的,不如基于Python环境的Taichi友好。但也确实如您所说,初学者从头造轮子对应用的意义并不大,简化底层操作并且包含GUI的Taichi更适合用来学习CFD算法。
但是我还有一个比较疑惑的地方,就是CFD计算格式和图形学中的模拟算法在效率上的差异。在图形学中,多介质耦合的高动态模拟能做到实时渲染(虽然示例中的粒子/网格数量较少),但CFD算法很难做到。以前写过顶盖驱动空腔流动的简单算例,就明显感觉运行很慢。这种差异会不会是算法逻辑不同的结果,像MPM这样的混合拉格朗日-欧拉方法对CFD算法是否有借鉴意义呢

我对计算流体和图形学的算法也只是浅尝辄止,所以不敢下最终结论,但是就我所知道的范围,图形学的算法做了很多简化从而大大加快了运行速度。比如说不可压缩流体,在CFD的经典算法SIMPLE里面,动量方程因为是非线性的所以要反复迭代求解,得出一个中间步的速度场u*以后再去修正压力场,然后把这两个步骤再进行反复迭代直至最终收敛。图形学则暴力得多,首先速度场直接就忽略粘性,用移流的方法一步求出u*,然后用一步压力修正保证速度无散度就完成了!(具体可以参考GAMES201第四讲欧拉视角流体求解)所以你可以看到,CFD里要迭代迭代再迭代很多步的东西,在图形学里一步就完成了。我个人的粗浅理解是,两者固然可以互相借鉴,但是CFD的算法往往比较接近真实物理解,所以反过来参考图形学的地方可能不是很多。

谢谢解答,想起来在GAMES201课程里胡老师经常会提到,在图形学的流体模拟的过程中,希望流体是能够保持体积并尽量减少耗散,等于是在本构上就化简了流体的特性。第四讲半拉格朗日方法求解物质导数项,直接避免了欧拉网格下的非线性对流项的计算,这样来看图形学方法似乎是在满足视觉“物理”的情况下尽量简化方程。刚才也看了一下论坛里CFD大佬用Taichi写的不可压LBM求解器和可压缩求解器的帖子,用的也还是经典的CFD算法