一、问题说明
在fluent中利用export功能导出ASCII格式的文件,例如下面的文件,第2-4列是单元中心坐标值,第5列是温度值。
如果给出和「导出这个ASCII数据文件时用的几何模型尺寸」一致或等比例放缩的几何模型,可否根据这个ASCII文件里存在的坐标和物理量之间逐个对应的关系得到温度云图呢?
二、固体(mechanical)中的external data功能
在固体中,可以用这个功能将ASCII文件的数据导入,只要你拥有坐标和物理量取值的对应关系。
关于external data功能,在网上已经有一篇shenyutong写的博客讲得非常清楚,我就不赘述了。
ANSYS workbench 根据坐标施加载荷- external data载荷映射
唯一需要注意的地方就是,你将温度、压力等物理量按照软件提示导入后,得到的Preview of File可能只显示接近10行,此时你不要担心,因为这只是一个局部的预览,不代表真的只导入了这么点数据进去。
三、流体(fluent)中有无相关功能直接实现按坐标赋予物理量(边界)?
在fluent中,没有像external data这样的比较完善地按坐标导入物理量/载荷/边界/初始条件的功能。
但是,我可以为你分析一下可以如何实现这个功能。
目前我认为应该只有用UDF搭配ASCII文件才能实现,诸如插值功能、初始化中的域函数都没办法做。
首先我来分析一下插值功能和初始化中的域函数为什么没办法做。
四、插值功能(interpolate)只能导入二进制数据文件
在file选项卡中有一个插值功能,单击后打开对话框,可以看到它允许你写出和导入插值文件,这个插值文件其实就是物理场数据文件。
我曾经写的文章里介绍了这个功能,详见【Fluent】接着上一次计算的结果继续计算,利用计算过程中得到的物理场(温度、速度、压力等)插值Interpolate文件初始化模型的方法。
在写出插值文件时,允许我们勾选非二进制,这样也方便我们在文本编辑器中直接查看,方便我们利用MATLAB或其他编程语言进行数据处理。
但是这个写出的文件中并不包含坐标,我估计如果导出二进制文件也是不包含坐标,那么fluent在导入时可能是按节点/单元格的ID从小到大来依次插值的。
在导入插值文件时,我们可以发现二进制选项默认勾选,所以这也在提示我们别无他选,只能导入二进制文件。
这一点,很重要,至少在fluent 2022R1版本中,还不支持直接将ASCII这种文本文件的数据直接导入模型。
五、初始化中的域函数(field function)功能
域函数功能可根据坐标和物理量之间的函数关系,来为模型赋予物理量。
如下图所示,只要将域函数的第一级选项设置为mesh,第二级选项中就会提供X Y Z三个坐标(当然还有其他坐标形式),在definition中定义坐标和物理量之间的函数关系。
创建完域函数后,再初始化中的patch里,勾选使用域函数的选项,选择对应域函数,就可以实现依函数关系为坐标赋值。
由于导出的ASCII文件中,坐标和物理量之间的关系非常复杂,没办法用函数关系表示,所以我们也就无法用此功能实现需求。
UDF在初始化宏里也可以定义物理量随坐标变换的函数关系,本质上和这个域函数patch相同,也不浪费口舌了。
六、fluent中的UDF搭配ASCII文本文件根据节点或单元格和坐标最小距离来插值
如果你当时导出ASCII文件时用的模型网格和你此次想要导入数据于其中的模型网格完全一样,为了考虑导出时坐标可能存在误差,你可以直接用一个距离判定阈值,例如1e-8。
当文本文件中某一个坐标和单元格/节点之间距离小于阈值,就认为应该把这个坐标上的物理量取值赋予到这个单元格/节点上。
而如果你后来重新划分了网格,进行了加密或使其变松,你可以用下面的方法实现按坐标赋值。
首先,你可以在DEFINE_INIT初始化宏中或DEFINE_ON_DEMAND手动执行宏中定义下面的算法。
1、遍历所有单元格/节点,得到它们的坐标值;
2、对于每一个单元格/节点,依次和ASCII文本文件中的各个坐标点计算距离,取最接近的n(eg-3)个坐标点;
3、以距离的倒数为权重,将这些坐标点的物理量的加权求和赋予给这个单元格/节点。
当然,你也可以设计其他插值方法,只要合理即可,准确度虽然有损,但是总比不能导入好吧!
同理可推,如果后来你放缩了几何模型,那么你需要先对ASCII文本文件进行一个坐标缩放。