基于Fluent求解器进行二次开发到底怎么做?
- 作者优秀
- 优秀教师/意见领袖/博士学历/特邀专家/独家讲师
- 平台推荐
- 内容稀缺
一、写在前面
Ansys Fluent软件作为通用的流体仿真软件,功能模型虽然多而全,但是缺乏相应的行业专业性。同时仿真分析具有一定的技术门槛,既需要技术人员具备行业基础,也需要积累相关仿真经验,对软件操作要有较高的熟练度,所以对企业技术人员来说,学习周期长入门难度大。定制化的二次开发可以将技术、行业经验与仿真流程封装成仿真模板工具,用户仅需输入工况参数,后台自动执行仿真计算,便得到需要的仿真结果;既解决了行业性问题,也降低了仿真门槛,同时也是数字化资产的沉淀。Ansys IcePak软件大家都有听过吧,它是针对电子行业的散热分析软件,本身就是基于Fluent求解器进行二次开发,融合了电子行业规范、热分析流程等形成的专业工具。Ansys IcePak基于Fluent求解器开发
通过C语言进行UDF(用户自定义函数)开发,添加自定义物理模型、边界条件和材料属性等,后续可以通过ACT或者Scheme界面开发进行封装。对成熟的仿真流程进行自动化脚本开发,然后通过界面开发及软件封装技术,将外部知识、其他仿真工具、仿真流程和标准规范进行集成,形成定制化仿真工具。通常来说,Fluent中物理模型能满足绝大多数场景需要,所以实际开发多以仿真模板开发为主。开发过程可以分为项目调研、软件设计、软件开发和软件测试四个阶段;其中最为核心的就是脚本开发、界面开发和软件封装的技术。
二次开发技术路线示意
Fluent提供文本用户命令(TUI命令)和界面用户命令(GUI命令),两者都是基于Scheme语言编写。对于大多数Fluent的GUI操作,都有一个相关的TUI命令对应,而有很多其他的操作只能通过TUI命令完成。下面我们来详细介绍下TUI命令。在界面右下角处的控制台(Consle)窗口,按<Enter>键查看当前选项,然后通过输入完整的命令或者子菜单命令。输入”q”字符然后<Enter>可以返回TUI树上一级,如下所示。Fluent支持TUI日志文件的录制,便于自动和批量重复仿真工作,具体操作如下:- ① 点击File > Write > Start Journal(或输入TUI命令:file start-journal ),设置日志文件存放位置和名称,扩展名为*.jou。
- ② 通过GUI界面或者是输入TUI命令来进行仿真流程设置,Fluent后台会自动记录GUI操作和输入的TUI命令。
- ③ 录制完成后,点击 File > Write > Stop Journal(或输入TUI命令:file stop-journal ),停止日志文件录制。
录制文件内容会取决于我们是通过GUI操作还是TUI命令来完成。下面例子显示了不同方式进行网格读取操作记录的命令文本。显然,通过输入TUI命令录制的日志文件更容易阅读,也更简洁;同时,TUI命令不是上下文敏感的,这是GUI操作生成日志的一个缺点。这里的上下文敏感指的是,如果你在点击记录之前打开面板,然后修改面板,操作将被记录。如果在没有打开该面板的情况下重播日志,则日志可能无法运行,因为修改该面板的命令毫无意义。所以推荐大家采用输入TUI命令方式录制脚本。Fluent帮助文档中有一个文本命令列表,用于帮助设置正确的TUI命令。
2019R1版本后支持TUI命令的自动补全,可以通过File→Preference打开设置窗口,勾选上Console auto-completer选项,然后确定后即可。通过自动补全明显提高开发效率。自动补全功能示意
为了在Fluent中创建通用脚本,我们可以灵活地使用通配符进行更复杂的操作。通配符允许根据前缀、中缀或后缀选择多个边界或单元区域,如Fluid*、* Fluid*或*Fluid。使用通配符对于编写通用脚本非常有用,我们可以根据命名约定设置预处理或后处理边界;逗号“,”符号将接受TUI参数的默认值,并且“()”可用于结束列表输入。我们来看一个案例:如报告所有前缀为car*的墙壁区域x方向的力,输入TUI命令的过程及参数如下:
- 对应完整的TUI命令为:/report/forces/wall-forces no car* () 1 0 0 ,
- 通过使用GUI操作:Results → Reports → Forces,可以与完整TUI命令输入控制台得到一样结果。
只要了解TUI命令的结构,编写TUI日志是很简单的;但是,TUI日志具备明显的缺陷,就是TUI本质是基于Scheme封装的文本命令,是无法进行流程控制,而且代码复用性差。Scheme是一个完整的语言,具备数据结构、流程控制、函数编程的功能,通过将Scheme脚本与TUI命名相结合,可以让脚本更加智能化、复用性更好。Boolean – 布尔类型
Number – 数字类型
Character – 字符类型
Symbol – 符号类型
Strings – 字符串类型
Vectors – 向量类型
其中最常用的是Boolean、Number、Strings和lists类型,不同类型有对应的函数方法,可以参见《MIT/GNU Scheme Reference Manual》。Scheme为动态数据类型,通过define函数声明和定义变量,通过set!函数可更改变量值。Fluent中提供ti-menu-load-string函数来调用TUI命令,这样就能将TUI命令嵌入到Scheme脚本中,去进行流程控制,方式如下:在结合Scheme和TUI日志开发脚本代码时,format是使用最多的函数命令,通过格式化字符串转换,很方便去替换TUI文本中的参数值,已达到对TUI日志进行封装的效果。
~a :直接替换显示,适用所有数据类型
~s :字符串显示,带双引号“”
~d :数字类型表示
- ~f : 浮点数表示法,指定有效数字,如~5.2f
使用Scheme脚本为我们提供函数封装的能力,可以将执行的一系列命令放入函数中,对外使用只需暴露函数的签名,更好得去梳理代码的结构。例如,我们使用如下命令,设置入口边界inlet的速度1.0m/s,温度为290K;
可以使用Scheme脚本对上面TUI命令进行函数封装,并对边界名称、速度大小和温度值进行参数提取,如下:函数封装到了好处就是提升复用性,比如模型有多个入口边界,但是入口速度和温度不一样,都可以通过函数去调用设置,如入口边界inlet-hot速度为0.8m/s,温度为320k,直接调用函数命令(set-inlet-bc “inlet-hot” 0.8 320)去设置,是不是非常方便呢。Fluent脚本环境中封装了非常多Scheme方法,通过以下方法可以将the-environment环境中的函数名写入到fluent-env.txt文件中。
将写入文本进行换行处理,可以得到以下内容:记录着Fluent环境中预定义的Scheme函数名,但是并未给出函数调用的参数和类型,官方也是没有开发文档对其进行解释;这里说明下Scheme脚本Ansys官方是不提供任何技术支持的。
因为Scheme是底层脚本接口,是面向开发者而不是面向用户的,TUI日志可以满足用户的大多数需要,但是预定义Scheme API却能为开发者提供极大便利性和更强大功能。这里有一个比较笨的方法分享给大家,可以在Console中去尝试获取参数:可以先无参数调用方法,如果参数错误的都会有相应提示,然后根据提示补充相应参数再尝试。脚本开发完成后,通常都需要开发图形用户界面去交互;在Fluent二次开发中有三种开发形式,对应不同交互方式:Fluent Scheme API中提供函数去创建菜单、对话框和窗体界面等,界面嵌入在Fluent中,优点是可直接与Fluent界面交互,实时双向的数据传递。但是Scheme脚本开发工具的代码开发难度大,因为无法可视化设计界面,而且官方提供的文档相对简单,需要深入了解Scheme语言,对于工程师朋友来说不太推荐。在Fluent 16.0之后版本,Ansys为其添加了ACT插件扩展的支持,界面嵌入在Fluent软件的右侧,可直接与Fluent界面交互,可实现实时双向数据传递。
ACT的开发方式更为灵活,同时采用XML和Python语言,可以可视化设计界面,对于工程师朋友来说更加友好,上手学习起来更快,是推荐的开发方式。
采用外置界面开发,界面是独立于Fluent软件中,是全封装形式,通常采用批处理调用方式,既界面提供参数输入,仿真过程读取脚本后在后台顺序执行命令,中间与Fluent图形窗口无交互,数据间传递不是实时双向传递的。
外置界面开发可以采用界面框架非常多,比如说.NET的WinForms、跨平台的QT框架、Tkinter界面框架等,大家可以根据自己喜好选择。小田老师在日常项目开发中,喜欢使用Qt框架,主要看重其跨平台和信号-槽机制,使用QtDesigner可以可视化设计界面,同时采用Qt For Python项目的PySide2模块,能使用Python语言去快速开发界面,对于工程师朋友是非常友好的,上手更快。针对上述三种开发方法,涉及到的集成封装技术各有不同,下面简单和大家讲解下集成封装技术。在如下示例代码中,通过为Panel窗口的按钮绑定回调函数update-cb,实现界面OK按钮点击后获取输入然后执行脚本命令完成操作。在ACT中API访问入口为ExtAPI,首先需要获得scheme脚本控制器实例,命令如下:
接着通过XML定义的<onupdate>回调函数为update_callback,然后在Python文件中实现回调函数,实现获取界面输入,最后执行Scheme脚本代码。外置程序独立于Fluent,通常是采用批处理方式调用Fluent进程,然后执行脚本文件进行仿真操作,流程如下所示。
这里就不得不说一下Fluent中批处理调用参数:在Windows系统的后台运行ANSYS Fluent,可以使用以下命令:
fluent是输入以交互方式运行的命令,需将<ansys_dir>\fluent\ntbin\win64添加到系统环境中。
3ddp 表示3D双精度,其他选项为3d、2d和2ddp。
-tx 表示求解器以x核并行。
-meshing 表示启动到Fluent Meshing模式。
-ty 表示网格划分以y核并行。
-g表示要在任务栏中最小化地运行程序。
-i journal表示读取指定的日志文件。
wait是在DOS批处理文件或其他脚本中键入的命令,必须等待ANSYS Fluent完成后才能运行。
- -hidden表示运行ANSYS Fluent,完全隐藏,无交互。
如果使用Python调用的话,推荐使用subprocess模块下的Popen方法,如下:
在界面集成封装时候,有一个非常关键技术点,就是需要使用多线程技术:为仿真调用开一个工作线程,避免调用时堵塞主线程出现界面未响应情况。作者简介:小田老师,仿真秀年度优秀作者,硕士毕业于天津大学,擅长Ansys产品的仿真及二次开发,曾独立完成多个结构和流体仿真咨询及开发项目,具备丰富的仿真咨询及二次开发经验。声明:原创作品,部分图片和内容源自网络,如有不当请联系我们,欢迎分享,禁止私自转载,转载请联系我们。1000G资料
获赞 10051粉丝 21523文章 3526课程 218