面对多工况、大批量的Fluent仿真,是否曾抓耳挠腮呢?重复性的手动设置边界条件是否令你头疼?
本文教你用Fluent 自带的文本用户接口TUI 与 Scheme 脚本语言,实现Fluent仿真的"无人驾驶",实现给脚本到生成数据文件夹的全过程自动化。
TUI命令
TUI(Text User Interface)是 ANSYS Fluent 提供的文本用户接口,用户可以通过Fluent控制台输入命令的形式,把鼠标点击实现的仿真设置转化为由命令实现。
假设你有一个批量仿真的任务,包括设置边界条件、初始化、设置求解器等等,那么想要实现自动脚本仿真,第一步就是:
找到你所需功能对应的TUI命令
找到TUI命令最简单准确的方法就是查询Ansys文档。由于Ansys文档的TUI部分仅有英文,如果全部翻译会将命令语句也翻译为中文,阅读效果极差,也不便于相关功能的查找。这里小姜整理了TUI文档并进行批量翻译,制作了一个简易的中英TUI文档。包含文内搜索和树状索引功能。
++文档链接请关注小姜,后台回复"TUI"获取++

至此,你应该可以通过文档检索找到你所需的TUI命令,假设你找到了设置壁面边界条件的命令:
define/boundary-conditions/wall
你会发现从文档中找到的仅仅是命令而已,并不包含该命令对应的参数格式。那么下一步:
找到TUI命令的参数形式
把上一步找到的命令define/boundary-conditions/wall
输入到控制台中,点击回车

键入命令后你会发现控制台返回了所有壁面的名称,并在最后一行给出了你需要输入的第一个参数:
zone id/name
也就是区域的名称或id。而[]中的内容,代表此时的默认值,如果直接回车,就等效于输入了这个值。这时候只要输入你需要选择的区域名称,我们就获得了第一个参数值。

假设,我们要修改的区域是所有source开头的区域,那么此时需要使用到 * 通配符,与正则相似,* 能够匹配任意字符,source开头的所有区域即为source*

输入后控制台会列出你选择的区域,并询问是否继续输入,如果没有,我们输入**()** 代表结束区域的选择。++注意:先点击回车,当让你输入第二个区域的时候,再输入括号来结束++

结束了区域选择,控制台会继续根据当前命令,询问你其它输入值。此处需要用户键入区域厚度
以此类推,从输入区域开始,之后的每一次询问后的回答,都是按照顺序排列的参数。输入完所有参数,命令才会执行

通过这次与TUI控制台的对话,我们得到了此次命令对应的参数,那么完整的命令即为:
define/boundary-conditions/wall source* () 0 no 0 no no no 1
对于这一条带参数的完整命令,将其直接输入控制台,那么Fluent将会自动完成上述所有操作。以此类推,对于其它命令,同样也可以通过"对话"的形式找到对应的参数形式。
简单的脚本仿真(无循环)
至此,如果你没有循环或是变量替换的需求,你已经可以通过TUI脚本实现你的简单自动化仿真。只要将你的命令按照顺序写进一个txt文件,并将文件后缀修改为.log或.jou,然后通过Fluent界面点击:文件>读入>脚本,选择你刚刚创建的文件即可。

当然想要批量仿真、循环与变量的自动运算与带入才是关键。那么还需要:
Scheme 脚本
Scheme是一个完整的脚本语言,Fluent支持读入Scheme脚本文件,并与TUI结合使用,这一部分小姜仅作简单介绍,由于网上资源多,可以找到较为详细的教程。也可以通过ai进行辅助编写。
下面介绍几个基础的语法:
1. 定义变量
(define x 100)
定义变量x的值为100
(define x (* 2 x))
定义变量x的值为x的两倍
(define y '(1,2,3))
定义变量y的值为[1,2,3]组成的一个列表
2. 设置循环
- for-each循环
scheme
(for-each
(lambda (var)
...body...)
list-expr)
; 示例:批量修改边界名称
(for-each
(lambda (b-name)
(ti-menu-load-string (format #f "/define/boundary-conditions zone-name ~a" b-name)))
'("inlet" "outlet" "wall"))
- do循环
scheme
(do ((var start next) ...) ; 可同时定义多个变量
((test) result) ; 终止条件与返回值
body...)
; 示例:i 从 0 到 9,j 从 100 到 90,每次减 1
(do ((i 0 (+ i 1))
(j 100 (- j 1)))
((>= i 10) 'done)
(display (format #f "i=~a, j=~a\n" i j)))
- let-loop递归
scheme
(let loop ((i start-val)) ; i 为循环变量
(if (> i end-val) ; 终止条件
'done ; 循环结束返回值
(begin
...body... ; 可使用 i
(loop (+ i step))))) ; 步进
; 示例:迭代 100 步,步长 10
(let loop ((i 0))
(if (> i 100)
(display "loop finished\n")
(begin
(ti-menu-load-string (format #f "/solve/iterate 10"))
(loop (+ i 10)))))
3. 变量带入
通过format #f "/define/boundary-conditions zone-name ~a" b-name
的形式,可以将b-name变量值带入到~a所在的位置
4. 调用TUI命令
可以将TUI命令嵌入到Scheme脚本中,示例如下:
(ti-menu-load-string "define/boundary-conditions/wall ")
如果带入变量:
(ti-menu-load-string (format #f "/define/boundary-conditions/wall ~a" zone-name)))
至此,你应该已经能够完成你的完整脚本,如果还有困难,可以参照下面小姜制作的案例:
完整脚本案例
scheme
;; ==========================================================
;; Fluent TUI 批处理脚本(Scheme)
;; 功能:循环修改固体区域体积热源、温度,并完成计算与导出
;; 版本:23.1
;; ==========================================================
;; 1. 设定 TUI 版本,确保命令解析一致性
(ti-menu-load-string "/file/set-tui-version \"23.1\"")
;; 2. 定义需要遍历的参数列表
;; 2.1 热源倍率列表
(define load-list '(0.6 1))
;; 2.2 固体区域名称列表(共 37 个区域)
(define zone-list
'("solid1-15" "solid3-15" "solid5-15" "solid7-15" "solid9-15"
"solid10-15" "solid12-15" "solid14-15" "solid16-15" "solid18-15"
"solid19-15" "solid21-15" "solid23-15" "solid25-15" "solid27-15"
"solid28-15" "solid30-15" "solid32-15" "solid34-15" "solid36-15"
"solid37-15" "solid39-15" "solid41-15" "solid43-15" "solid45-15"
"solid46-15" "solid48-15" "solid50-15" "solid52-15" "solid53-15"
"solid55-15" "solid57-15" "solid59-15" "solid60-15" "solid62-15"
"solid64-15" "solid66-15"))
;; 2.3 初始温度列表(单位:K)
(define t-list '(423.15 573.15))
;; 3. 三层嵌套循环
;; 外层:遍历热源倍率
(for-each
(lambda (loadrate)
;; 3.1 更新 named-expression "load" 为当前倍率
(ti-menu-load-string
(format #f "/define/named-expressions/edit load definition ~a" loadrate))
;; 中层:遍历温度
(for-each
(lambda (t)
;; 内层:遍历所有固体区域
(for-each
(lambda (zone)
;; 3.2 设置固体区域温度
(ti-menu-load-string
(format #f "/define/boundary-conditions/solid ~a no no yes yes ~a no no 0 no 0 no no yes"
zone t))
;; 3.3 混合初始化
(ti-menu-load-string "/solve/initialize/hyb-initialization ok")
;; 3.4 迭代 100 步
(ti-menu-load-string "/solve/iterate 100")
;; 3.5 导出该区域温度场 ASCII 数据
(ti-menu-load-string
(format #f "/file/export/ascii load~a_vel0.05_~a_~a.txt * () y temperature no"
loadrate zone t))
;; 3.6 恢复该区域体积热源并重新赋值
;; 热源表达式:153283 * load^2 [kg m^-1 s^-3]
(ti-menu-load-string
(format #f "/define/boundary-conditions/solid ~a no yes 1 yes \"153283[kg m^-1 s^-3]*load*load\" no no no 0 no 0 no no yes"
zone)))
zone-list))
t-list))
load-list)
;; 脚本执行完成后,所有工况计算与数据导出完毕
最后
期待你也能用脚本解放双手,静待数据自己躺进你的文件夹哦!
如果遇到困难,欢迎留言交流~