许可优化
产品
解决方案
服务支持
关于
软件库
当前位置:服务支持 >  软件文章 >  Fluent极客世界:自定义功能(UDF,jou等)强大揭秘

Fluent极客世界:自定义功能(UDF,jou等)强大揭秘

阅读数 6
点赞 0
article_banner

ANSYS 在开发Fluent时,给这个软件留下来了强大的二次开发、耦合仿真、自定义求解的功能,在本篇文章里将对这些功能做一简单的概述,由于笔者水平有限,还没有全部掌握这些模块的应用,本文将随笔者的使用经验积累长期更新。

掌握这些功能将可以使你在求解复杂问题条件时如鱼得水,虽然Fluent不如openFOAM 开放,很多自定义功能实现起来并不简单,但是对于一般的CFD 使用者而言,仍有很大的开发空间可去探索

第一部分:功能介绍 & 可解决的问题

1. UDF

Fluent 最常用的用户自定义功能,基于C语言,Fluent为用户提供了非常丰富的宏,从材料物性、模型修改、边界条件控制、自定义后处理变量等多方面,可选择多种触发时机。与expression 相比,在边界条件设置上有功能重叠的部分。

  • 自定义材料物性
  • 自定义边界条件:非均匀入口速度、非均匀热流密度
  • 自定义模型的源项:实现闪蒸
  • 自定义动态入口:随时间、求解的变量控制的入口参数

2. Workbench 参数化

参数化建模与参数化设计是Workbench一大亮点,模型中的某个尺寸、Fluent中的某个边界条件等几乎所有可作为变量的“数字”都是设为一个“参数”,在workbench内如果是workflow建立的仿真流程,软件就已经记录了你从建模、划分网格、求解前处理、后处理的所有设置,改变某个参数的值workbench可自动更新仿真流程。配合Workbench的DesignXplorer模块实现单目标和多目标的参数优化设计。

  • 自动化仿真
  • 参数的优化设计

3. jou / scheme语言

Fluent的内置脚本语言,用于实现Fluent的自动化仿真,注意这里的自动化相当于将你在软件上的GUI操作(图形化界面操作)和TUI操作(控制台的命令行)记录为scheme编程语言,在Fluent直接导入脚本可以在几秒内完成需要几分钟的前处理设置,当然由于Fluent允许replace mesh 并保留原有设置不变,有时候脚本并不是必须的。

jou记录GUI操作和TUI命令,相对来说TUI命令兼容性、适用性更好,因为图形化界面过程操作步骤太多容易出错。scheme语言在jou基础上增加了编程语言变量、IO操作、循环判断的功能,更大地扩展了脚本的功能性。

  • 自动脚本:自动更新边界条件、初始化、计算、保存case和date

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. 其他

  • 从网格节点数据自定义python绘图
  • Fluent小工具:profile文件坐标修改器

第二部分:应用

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);
}
  • UDF调用外部多层嵌套DLL

Runner:Fluent udf调用外部“动态调用dll”的dll

2. Workbench 参数化


3. jou / scheme语言

  • 录制/使用jou方法

File → Write → Start Journal 输入保存路径和文件名

File → Read → Journal 选择jou文件

  • 自动脚本:自动更新边界条件、初始化、计算、保存case和date

/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 区间 ,入口名,迭代次数,保存名称
  • 常用TUI命令
***** 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

  • 自定义入口参数的值:迭代次数<50,速度 1m/s,否则 2m/s
IF(Iteration<50,1[m/s],2[m/s])
  • 自定义入口参数的值:要求入口速度和进出口压差存在函数关系

更新:更完善的计算结果导向边界设置方法,原来的可能会引发bug

  1. 设定迭代次数<50次的速度初值,每隔100次时的变化值VAdjust,和期间稳定值 VCurrent
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. 其他

  • 从网格节点数据自定义python绘图

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()
从网格节点数据自定义python绘图的结果图片
  • Fluent 小工具

profile文件坐标修改器(有bug欢迎修改)——将某个文件的profile坐标修改平移缩放已适应其他的同形状边界

github.com/runrun-xjtu/


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删
相关文章
QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空