这个题目听了很多人可能有点懵圈,但一旦你涉及Fluent UDF编程就需要深入了解了。首先看一下下图中真串行和并行的差别,可以看到真串行是一个独立的计算模块,负责所有网格的单独计算,相当于自己管自己的“独行侠”,而并行则是网格剖分成若干个分区计算节点(图中举例是3个核并行计算),网格的计算都在这些分区节点上计算,然后另外多出一个host的协调模块,负责各个分区节点数据交换以及与图形界面沟通的协调工作。网上以前有个形象的比喻,分区节点类似于各个学生,专门做作业,host相当于布置作业的班主任,负责收集作业,协调学生之间关系。
早期Fluent就是如此设计的,真串行和并行是有两套独立的可执行程序,或许Fluent为了减少工作量统一到一套程序,高版本的Fluent就有抛弃真串行的趋势,引入了如下一个分区节点实现的并行,我们称之为“假串行”。这种情况实际还是并行架构,只不过网格在一个分区节点上计算,写UDF时候还得按照并行来考虑。
在较高版本Fluent自带启动面板的“Serial”模式,字面意思是“串行”,实际已经不再是真串行,而是1个分区节点的并行,这就是我们称之为“假串行”的原因。
当然,中期版本Fluent也给大家留了一些过渡的余地,要实现真串行可以选“Parallel”然后将分区节点数里面设为“0”,或者在命令行里面敲类似“fluent 3d -t0”的命令。
可惜的是在高版本Fluent中,连这些“曲线救国”方法也取消了,只有第三方开发的VC++ UDF Studio插件才用技术手段调出了隐藏的真串行。下表列出了真串行在不同Fluent版本以及VC++ UDF Studio插件中的支持情况。
Fluent版本 | Fluent自带图形启动器上Serial为真串行? | Fluent自带图形启动器上利用0核并行启动真串行? | 命令行 –t0启动真串行 | VC++UDF Studio插件启动真串行 |
6.3 ~ 18.1 | 是 | 允许 | 允许 | 允许 |
18.2 ~ 2019R3 | 否 | 允许 | 允许 | 允许 |
2020R1~2020R2 | 否 | 禁止 | 允许 | 允许 |
2021R1~2022R1 | 否 | 禁止 | 禁止 | 允许 |
2022R2 | 否 | 禁止 | 禁止 | 禁止 |
由上表可知,Fluent越来越抛弃真串行,而将程序统一为并行架构。这无疑一下子提升了UDF的门槛,不仅要学习UDF语法,还要考虑并行网格分区,host与node的协调等,对初学者来说是个坏消息。因此,对于喜欢使用高版本Fluent的初学者,建议第一步可以借助VC++ UDF Studio插件中的串行启动来实现真串行(对Fluent 2022R2开始插件也无能为力了),这样可以暂时不考虑并行架构,等熟悉UDF基本用法后再深入学习并行的UDF架构。