ANSYS 在开发Fluent时,给这个软件留下来了强大的二次开发、耦合仿真、自定义求解的功能,在本篇文章里将对这些功能做一简单的概述,由于笔者水平有限,还没有全部掌握这些模块的应用,本文将随笔者的使用经验积累长期更新。
掌握这些功能将可以使你在求解复杂问题条件时如鱼得水,虽然Fluent不如openFOAM 开放,很多自定义功能实现起来并不简单,但是对于一般的CFD 使用者而言,仍有很大的开发空间可去探索
第一部分:功能介绍 & 可解决的问题
1. UDF
Fluent 最常用的用户自定义功能,基于C语言,Fluent为用户提供了非常丰富的宏,从材料物性、模型修改、边界条件控制、自定义后处理变量等多方面,可选择多种触发时机。与expression 相比,在边界条件设置上有功能重叠的部分。
2. Workbench 参数化
参数化建模与参数化设计是Workbench一大亮点,模型中的某个尺寸、Fluent中的某个边界条件等几乎所有可作为变量的“数字”都是设为一个“参数”,在workbench内如果是workflow建立的仿真流程,软件就已经记录了你从建模、划分网格、求解前处理、后处理的所有设置,改变某个参数的值workbench可自动更新仿真流程。配合Workbench的DesignXplorer模块实现单目标和多目标的参数优化设计。
Fluent的内置脚本语言,用于实现Fluent的自动化仿真,注意这里的自动化相当于将你在软件上的GUI操作(图形化界面操作)和TUI操作(控制台的命令行)记录为scheme编程语言,在Fluent直接导入脚本可以在几秒内完成需要几分钟的前处理设置,当然由于Fluent允许replace mesh 并保留原有设置不变,有时候脚本并不是必须的。
jou记录GUI操作和TUI命令,相对来说TUI命令兼容性、适用性更好,因为图形化界面过程操作步骤太多容易出错。scheme语言在jou基础上增加了编程语言变量、IO操作、循环判断的功能,更大地扩展了脚本的功能性。
4. expression表达式/Custom Field Function
Custom Field Function和expression表达式其实是两个东西,但是他们有相似之处,在这里我简单说明。Custom Field Function用于自定义后处理变量,用数学表达式定义新的物理量,可在contour上展示,但无法用于expression。
expression是用于自定义边界条件的数值,如速度、温度等。表达式可包含IF判断、数学函数、时间、迭代次数、物理量参数、平均最大最小函数等,允许这些元素之间的组合,但是要求表达式的最终单位必须是正确的,例如速度的量纲必须为[m/s]
5. ACT 二次开发
Fluent 和Workbench中给开发者预留了API接口,开发者可通过IPython语言调用这些接口,甚至借此开发出图形化界面,类似于谷歌浏览器的插件一样, ACT也可以当成 Ansys 的插件,后人可以直接利用前人开发的仿真插件/仿真模板实现一键仿真。
6. 其他
第二部分:应用
1. UDF
#include "udf.h"
real tin = 293;
DEFINE_PROFILE(tt_profile,t,i)
{
face_t f;
begin_f_loop(f,t)
{
F_PROFILE(f, t, i) = tin;
}
end_f_loop(f,t)
}
DEFINE_EXECUTE_AT_END(execute_at_end)
{
Domain* d;
Thread *f_thread;
face_t f;
int zone_ID = 7;
int n=0;
real temsum=0,avetem=0,ave=tin;
real flow_time = CURRENT_TIME;
Message("Last timestep tin value: %g\n", tin);
d = Get_Domain(1); /* mixture domain if multiphase */
Thread* thread_name = Lookup_Thread(d, zone_ID);
begin_f_loop(f, thread_name) /* loops over faces in a face thread */
{
temsum = temsum + F_T(f, thread_name);
n = n + 1;
}
end_f_loop(f, thread_name)
temsum = PRF_GISUM1(temsum);
n = PRF_GISUM1(n);
avetem = temsum / n;
tin = 0.5 * (avetem - 273.15) + 7.5 + 273.15;
node_to_host_real_1(tin);
Message("The n value : %d\n", n);
Message("The average temperature of the outlet surface: %g\n", avetem);
Message("New tin value: %g in flowtime %g \n", tin, flow_time);
}
Runner:Fluent udf调用外部“动态调用dll”的dll
2. Workbench 参数化
3. jou / scheme语言
File → Write → Start Journal 输入保存路径和文件名
File → Read → Journal 选择jou文件
/file/set-tui-version "19.5" 需修改为对应Fluent版本,使用 File → Write → Start Journal 录制脚本输入任意TUI命令会自动输出此命令到 jou 文件;
i1(+ i 1.5) 表示 i 从 1 开始每次加 1.5,>= i 3 表示 当>=3时循环停止;
如果由于湍流模型或者其他原因入口边界条件设置字段不同,请自行修改(在命令行根据流程读取出来 no yes 和 被修改字段的位置等),其中 inlet 为入口名称;
/solve/iterate 200 表示迭代 200 次(本脚本只适用于稳态计算);
test-v~a.cas 中 ~a表示v的占位符
(ti-menu-load-string "/file/set-tui-version "19.5"")
(define v 0)
(do ((i 1 (+ i 1.5)))
((>= i 3))
(set! v (+ i))
(ti-menu-load-string (format #f "/define/boundary-conditions/velocity-inlet inlet no no yes yes no ~a no 0 no no yes 5 10" v))
(ti-menu-load-string "/solve/initialize/hyb-initialization yes")
(ti-menu-load-string "/solve/iterate 200")
(ti-menu-load-string (format #f "/file/write-case-data C:\Users\runrun\Desktop\test-v~a.cas" v))
)
;; 修改:i 区间 ,入口名,迭代次数,保存名称
***** IO操作 *****
/file/read-case "C:\Users\runrun\Desktop\***.cas" yes ——读取case
/file/read-case-data "C:\Users\runrun\Desktop\***.cas" yes ——读取case和date
/file/write-case "C:\Users\runrun\Desktop\***.cas" ——输出case
/file/write-case-data "C:\Users\runrun\Desktop\***.cas" ——输出case和date
/file/replace-mesh "C:\Users\runrun\Desktop\***.msh" yes ——替换mesh(保留case设置)
***** 初始设置 *****
/mesh/scale 0.001 0.001 0.001 ——scale网格
/display/mesh-outline ——display网格
***** 模型 *****
/define/models/energy no ——关闭能量方程
***** 材料 *****
/define/materials/copy/fluid/water-liquid ——加入液态水
/define/materials/copy/fluid/water-vapor ——加入气态水
***** 边界条件 *****
/define/boundary-conditions/list-zones ——列出边界-类型-材料-属于cell/face
/define/boundary-conditions/copy-bc ——复制边界条件到另一个面(需要同边界类型)
/mesh/modify-zones/create-periodic-interface ——周期性interface
/define/boundary-conditions/modify-zones/create-periodic-interface ——周期性interface
/define/boundary-conditions/modify-zones/make-periodic ——创建周期性边界
***** 求解 *****
/solve/initialize/hyb-initialization yes ——混合初始化
/solve/iterate ——设定迭代步数并开始迭代
***** 后处理 *****
/surface/iso-surface/x-coordinate ——创建iso面(x坐标)
/report/surface-integrals/facet-avg/ inlet outlet () pressure no ——输出 inlet outlet 压力到控制台
/report/surface-integrals/facet-avg/ inlet outlet () pressure yes .\1.txt no yes ——输出 inlet outlet 压力到1.txt(覆盖)
***** 常规 *****
enter ——列出下级命令
q ——返回上一级命令
***** 其他 *****
pwd ——显示工作目录
↑↓方向 ——输入命令历史
4. expression表达式/Custom Field Function
IF(Iteration<50,1[m/s],2[m/s])
更新:更完善的计算结果导向边界设置方法,原来的可能会引发bug
IF(Iteration<50,7[m/s],IF(mod(Iteration+1, 100)==0,VAdjust,VCurrent))
2. Named Expressions 添加名为 VAdjust 的表达式,假设 inlet 面速度压力满足函数关系 v+p = 10 ,注意 1[m/s/Pa] 是矫正量纲的项
10[m/s]-Average(StaticPressure,["inlet"],Weight="Area")*1[m/s/Pa]
3. Named Expressions 添加名为 VCurrent 的表达式,表示当前平均速度
Average(VelocityMagnitude,["inlet"],Weight="Area")
结果:
5.ACT二次开发
6. 其他
Fluent选择xyplot,选择x、y或z坐标,左边勾选输出到文件,右边选择需要输出的后处理参数,然后写入到文件,将文件名改为.txt结尾,文件中是多达几万/几十万个的网格节点数据
下面展示的代码将展示用python绘制 0.12 - 1.39m 高度的平均速度 v 的分布图
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
import numpy as np
import pandas as pd
df = pd.read_table('./1.txt', sep=' ', header = None, skiprows = 4, comment=')', encoding = 'utf-8', names = ['z', 'v'])
df.loc[df['v'] != 0.0,'v'] = -1 * df['v']
x1 = []
y1 = []
""" 筛选数据取平均值 """
for i in np.arange(0.12, 1.39, 0.01):
ave = df.loc[((df['z'] >= i - 0.005) & (df['z'] < i + 0.005)),'v'].mean()
x1.append(i)
y1.append(ave)
plt.rcParams['font.sans-serif']=['SimHei'] #指定默认字体 SimHei为黑体
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.figure(dpi=600)
plt.grid(axis='y', color='grey', linestyle='--', lw=0.5, alpha=0.5) #网格线
plt.xlabel(r'高度(m)', fontsize = 20)
plt.ylabel(r'风速(m/s)', fontsize = 20)
plt.plot(x1, y1)
plt.show()
profile文件坐标修改器(有bug欢迎修改)——将某个文件的profile坐标修改平移缩放已适应其他的同形状边界
https://github.com/runrun-xjtu/Fluent-and-udf/tree/main/ProfileModification