CFD-post作为ANSYS流场分析后处理的御用软件,自然也少不了宏命令这种可以方便用户自动化操作的神器,本文主要介绍一下CFD-post中Session的使用以及如何通过session批处理提取运动体表面点的流场数据。
Session的使用
Session是cfd-post里面类似宏的批处理文件,主要功能就是通过命令语句(条件语句、循环等)实现批量自动化的后处理功能。通过Session可以可以录制你在CFD Post中的每一步操作。其具体使用步骤如下:
点击菜单栏中的Session→new Session,从而新建一个.cse文件;
点击start recording,开始录制接下来的所有操作;
点击stop recording,停止录制宏,并保存。
点击play Session,播放宏命令操作。
Session的修改
CFD-post 使用perl语言,但与一般的perl语言有所不同,在可执行语句(如for循环)前面加!(英文!),CFD Post操作命令语句前面加 >(一般默认就有)。
Perl 是 Practical Extraction and Report Language 的缩写,可翻译为 "实用报表提取语言"。
Perl 是高级、通用、直译式、动态的程序语言。
Perl 最初的设计者为拉里·沃尔(Larry Wall),于1987年12月18日发表。
Perl 借用了C、sed、awk、shell脚本以及很多其他编程语言的特性。
Perl 最重要的特性是Perl内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN。
使用Perl是为了实现循环,判断等自动化的内容,因此本文仅介绍一些基本语法,想要更详细的内容可参考Perl 教程。
声明变量
- 标量是 Perl 语言中最简单的一种数据类型。这种数据类型的变量可以是数字,字符串,浮点数,不作严格的区分。在使用时在变量的名字前面加上一个 $,表示是标量。例如:
1 | $myfirst=123; #数字123 |
- 数组变量以字符 @ 开头,索引从 0 开始,如:
1 | @arr=(1,2,3) |
判断语句
这里仅介绍最基本的if else语句。一个 if 语句后可跟一个可选的 elsif 语句,然后再跟另一个 else 语句。举例如下所示:
1 | $a = 100; |
循环语句
这里仅介绍最基本的for循环语句。语法格式如下所示:
1 | # 语法格式 |
文件操作
在Session中我们可能需要对某些数据文件进行读写,因此了解如何进行文件操作是必不可少的。Perl 使用一种叫做文件句柄类型的变量来操作文件。从文件读取或者写入数据需要使用文件句柄。
以下代码我们使用 open 函数以只读的方式(<)打开文件 file.txt:
1 | # 语法格式 |
至此,我们可以完成对Session的修改以满足我们的大部分功能需求了,接下来介绍如何通过session批处理提取运动体表面点的流场数据。
标记并提取点数据
CFD-post若想提取流场中某个点上的数据,可以通过两种方式实现。
其一是通过insert→location→point的方式插入数据点的坐标,然后利用export导出数据点上的流场信息。或者再insert→location→chart插入一个图表,在general里选择XY-transient or sequence,在Y axis中选择压力,温度或者其它流场信息,然后在data series的location的下拉列表中选择相应的数据点,点击apply,即可得到该点的流场信息随着时间的变化曲线,点击export,即可导出曲线数据。
其二是通过tools→probe的方式,提取指定坐标点的流场信息,这种方式的好处是能够快速得到指定点的数据,但不能获得这个点随时间变化的数据信息,也不能直接导出。
批处理提取运动体表面点的流场数据
上面提到的方式可以轻松获取指定坐标点的流场数据,但是若是想要提取移动点的信息便显得无能为力。例如对于一个小球从空中自由落体运动落到水中这样一个模拟仿真工况,如果我想要提取小球表面上某一点的压力随时间变化的数据,这个时候便需要用到Session了。
当然,我可以在画网格的过程中,标记这个点所处的网格,然后在fluent仿真过程中监测这个网格所有节点的平均压力值,这样也可以实现之前的需求。但问题是,往往我们是在仿真结束后才需要对某些点进行数据提取,而这个时候再进行一遍仿真的话花费时间又太长,因此Session便显得非常必要了。
要想获取运动体表面点的流场数据,首先要获得不同时刻下目标点的坐标数据。仍然以小球入水仿真为例,我们可以在cfd-post中得到小球表面上某一特殊点的坐标数据,比如z坐标最大的那个点的坐标数据,可以通过以下步骤得到:
点击insert→location→point的方式插入一个point 1的标记点,在method中选择variable maximum,然后在location的下拉列表中选择小球壁面,在variable下拉列表中选择z,点击apply,即可在流场中标记该点。如图所示:
点击insert→location→chart插入一个图表,在general里选择XY-transient or sequence,在Y axis中选择z,然后在data series的location的下拉列表中选择相应的标记点point 1,点击apply,即可得到该点的z坐标随着时间变化的曲线,点击export,即可导出曲线数据。
如此,我们便得到了这个特殊标记点的坐标随时间变化的数据文件,然后通过其它的运动体表面监测点与这个特殊标记点的相对坐标位置关系,就可以获得其余所有运动体表面监测点的坐标随时间变化的数据了!
假设运动体只沿着z轴运动,则其余所有运动体表面监测点的xy坐标不变,然后我们对上面的数据文件处理后得到特殊标记点的z坐标随时间变化的数据文件,假设这个文件名为toumao_z.txt。
接下来,就是准备我们的Session文件了。下面这段代码是我自己使用的一个例子,为阅读方便添加了一些注释,可以批处理提取运动体表面点的流场数据。
1 | # 打开数据文件 |