Fluent自动化仿真(TUI命令脚本教程)
面对多工况、大批量的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进行辅助编写。
官网:https://schemers.org/
下面介绍几个基础的语法:
1. 定义变量
(define x 100)
定义变量x的值为100
(define x (* 2 x))
定义变量x的值为x的两倍
(define y \'(1,2,3))
定义变量y的值为[1,2,3]组成的一个列表
2. 设置循环
- for-each循环
(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循环
(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递归
(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)))
至此,你应该已经能够完成你的完整脚本,如果还有困难,可以参照下面小姜制作的案例:
完整脚本案例
;; ==========================================================;; 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);; 脚本执行完成后,所有工况计算与数据导出完毕
最后
期待你也能用脚本解放双手,静待数据自己躺进你的文件夹哦!
如果遇到困难,欢迎留言交流~