fluent-udf-经验
- 格式:doc
- 大小:32.50 KB
- 文档页数:5
FLUENTUDF官方培训教程一、引言FLUENTUDF(UserDefinedFunctions)是一种强大的功能,允许用户在FLUENT软件中自定义自己的函数,以满足特定的模拟需求。
为了帮助用户更好地了解和使用UDF功能,FLUENT官方提供了一系列培训教程,本教程将对其中的重点内容进行详细介绍。
二、UDF基础知识1.UDF概述UDF是FLUENT软件中的一种编程接口,允许用户自定义自己的函数,包括自定义物理模型、边界条件、求解器控制等。
UDF功能使得FLUENT软件具有很高的灵活性和扩展性,能够满足各种复杂流动问题的模拟需求。
2.UDF编程语言UDF使用C语言进行编程,因此,用户需要具备一定的C语言基础。
UDF编程遵循C语言的语法规则,但为了与FLUENT软件的求解器进行交互,UDF还提供了一些特定的宏和函数。
3.UDF编译与加载编写完UDF代码后,需要将其编译成动态库(DLL)文件,然后加载到FLUENT软件中。
编译和加载UDF的过程如下:(1)编写UDF代码,保存为.c文件;(2)使用FLUENT软件提供的编译器(如gfortran)将.c文件编译成.dll文件;(3)在FLUENT软件中加载编译好的.dll文件。
三、UDF编程实例1.自定义物理模型cinclude"udf.h"DEFINE_TURBULENCE_MODEL(my_k_epsilon_model,d,q){realrho=C_R(d,Q_REYNOLDS_AVERAGE);realmu=C_MU(d,Q_REYNOLDS_AVERAGE);realk=C_K(d,Q_KINETIC_ENERGY);realepsilon=C_EPSILON(d,Q_DISSIPATION_RATE);//自定义湍流模型计算过程}2.自定义边界条件cinclude"udf.h"DEFINE_PROFILE(uniform_velocity_profile,thread,position ){face_tf;realx[ND_ND];begin_f_loop(f,thread){F_CENTROID(x,f,thread);realvelocity_magnitude=10.0;//自定义速度大小realvelocity[ND_ND];velocity[0]=velocity_magnitude;velocity[1]=0.0;velocity[2]=0.0;F_PROFILE(f,thread,position)=velocity_magnitude;}end_f_loop(f,thread)}3.自定义求解器控制cinclude"udf.h"DEFINE_CG_SUBITERATION_BEGIN(my_cg_subiteration_begin,d ,q){realdt=0.01;//自定义时间步长DT(d)=dt;}四、总结本教程对FLUENTUDF官方培训教程进行了简要介绍,包括UDF 基础知识、编程实例等内容。
FLUENT UDF 教程第一章. 介绍本章简要地介绍了用户自定义函数(UDF)及其在Fluent中的用法。
在1.1到1.6节中我们会介绍一下什么是UDF;如何使用UDF,以及为什么要使用UDF,在1.7中将一步步的演示一个UDF例子。
1.1 什么是UDF?1.2 为什么要使用UDF?1.3 UDF的局限1.4 Fluent5到Fluent6 UDF的变化1.5 UDF基础1.6 解释和编译UDF的比较1.7一个step-by-stepUDF例子1.1什么是UDF?用户自定义函数,或UDF,是用户自编的程序,它可以动态的连接到Fluent求解器上来提高求解器性能。
用户自定义函数用C语言编写。
使用DEFINE宏来定义。
UDF中可使用标准C 语言的库函数,也可使用Fluent Inc.提供的预定义宏,通过这些预定义宏,可以获得Flu ent求解器得到的数据。
UDF使用时可以被当作解释函数或编译函数。
解释函数在运行时读入并解释。
而编译UDF则在编译时被嵌入共享库中并与Fluent连接。
解释UDF用起来简单,但是有源代码和速度方面的限制不足。
编译UDF执行起来较快,也没有源代码限制,但设置和使用较为麻烦。
1.2为什么要使用UDF?一般说来,任何一种软件都不可能满足每一个人的要求,FLUENT也一样,其标准界面及功能并不能满足每个用户的需要。
UDF正是为解决这种问题而来,使用它我们可以编写FLUEN T代码来满足不同用户的特殊需要。
当然,FLUENT的UDF并不是什么问题都可以解决的,在下面的章节中我们就会具体介绍一下FLUENT UDF的具体功能。
现在先简要介绍一下UDF的一些功能:定制边界条件,定义材料属性,定义表面和体积反应率,定义FLUENT输运方程中的源项,用户自定义标量输运方程(UDS)中的源项扩散率函数等等。
λ在每次迭代的基础上调节计算值λ方案的初始化λ(需要时)UDF的异步执行λ后处理功能的改善λFLUENT模型的改进(例如离散项模型,多项混合物模型,离散发射辐射模型)λ由上可以看出FLUENT UDF并不涉及到各种算法的改善,这不能不说是一个遗憾。
fluent udf 阶段性小结——Flying_U因工作需要,最近开始学习fluent二次开发功能。
现在,根据工作日志将这一段时间主要的学习过程和总结的经验整理如下。
学习计划:从4月5号开始,计划花上一个月的时间了解和学习fluent udf的基本知识。
目标是能够运用udf初步实现物理模型简化、掌握udf的基本用法并能根据工作需要实现相关udf功能。
4.5-4.6:浏览网站尽可能更多了解udf的知识,结合自己的实际情况分析那些知识是自己需要进一步深入学习的。
此阶段总结:1.udf是用户自定义函数的简称,其通过与fluent接口连接实现扩展fluent功能的作用。
udf的主要功能有:●定制边界条件、材料属性、表面和体积反应率、fluent输运方程的源项、用户自定义的标量方程的源项、扩散函数等●调整每次迭代后的计算结果●初始化流场的解●在需要时进行udf的异步执行●强化后处理功能●强化现有的udf模型●传送返回值、修改fluent变量、操作外部文件案例和data文件2. 自己现在想要实现的是udf功能是定制边界条件、定制fluent输运方程的源项、初始化流场的解和强化后处理功能;(刚开始自己也不太明确自己到底想用udf来做什么,对应上udf的主要功能是哪一部分,然后对自己不懂没理解的功能一一查询。
)3. 有相关资料的渠道有:百度知道,百度文库和doc88。
其中,百度文库各种教程最多,百度知道能够快速定位回答具体的问题,doc88资料觉得更深入一些。
(对搜集的资料进行及时的整理和归纳对自己学习有很大助力,很多资料都是不完全的或者自己当时没有完全理解的需要不同版本或者前后不同时间段对照着学习。
)4.6-4.9 根据自己的需求在udf帮组手册中查找实例并尝试按实例进行对照练习,初步了解udf相关知识,打通udf实现的过程(udf编写、编译和连接)。
主要目的是了解udf的基本用法,初步了解udf宏命令。
此阶段总结:1.udf帮助手册里的实例对初学者特别有用,例子难度小,侧重流程和用法。
Fluent中的UDF详细中文教程(7)第七章 UDF的编译与链接编写好UDF件(详见第三章)后,接下来则准备编译(或链接)它。
在7.2或7.3节中指导将用户编写好的UDF如何解释、编译成为共享目标库的UDF。
_ 第 7.1 节: 介绍_ 第 7.2 节: 解释 UDF_ 第 7.3 节: 编译 UDF7.1 介绍解释的UDF和编译的UDF其源码产生途径及编译过程产生的结果代码是不同的。
编译后的UDF由C语言系统的编译器编译成本地目标码。
这一过程须在FLUENT运行前完成。
在FLUENT运行时会执行存放于共享库里的目标码,这一过程称为“动态装载”。
另一方面,解释的UDF被编译成与体系结构无关的中间代码或伪码。
这一代码调用时是在内部模拟器或解释器上运行。
与体系结构无关的代码牺牲了程序性能,但其UDF可易于共享在不同的结构体系之间,即操作系统和FLUENT版本中。
如果执行速度是所关心的,UDF 文件可以不用修改直接在编译模式里运行。
为了区别这种不同,在FLUENT中解释UDF和编译UDF的控制面板其形式是不同的。
解释UDF的控制面板里有个“Compile按钮”,当点击“Compile按钮”时会实时编译源码。
编译UDF的控制面板里有个“Open 按钮”,当点击“Open按钮” 时会“打开”或连接目标代码库运行FLUENT(此时在运行FLUENT之前需要编译好目标码)。
当FLUENT程序运行中链接一个已编译好的UDF库时,和该共享库相关的东西都被存放到case文件中。
因此,只要读取case文件,这个库会自动地链接到FLUENT处理过程。
同样地,一个已经经过解释的UDF文件在运行时刻被编译,用户自定义的C函数的名称与内容将会被存放到用户的case文件中。
只要读取这个case文件,这些函数会被自动编译。
注:已编译的UDF所用到的目标代码库必须适用于当前所使用的计算机体系结构、操作系统以及FLUENT软件的可执行版本。
FLUENT_UDF官方培训教程
必须原创
FLUENT UDF全称为Fluent User Defined Functions,是ANSYS Fluent有限元分析软件的一种高级应用技术,主要用于定制流体、多相流及热传导模拟中的特殊调整元件。
本文介绍如何使用FLUENT-UDF进行实际模拟的培训教程。
一、FLUENTUDF的概念
FLUENT UDF是一种定制的技术,它可以灵活地增强Fluent本身的模拟能力,并让用户能够自定义函数来调整流体、多相流及热传导模拟中的特殊参数。
FLUENT UDF是一种可以定义特殊参数和条件的技术,它可以让Fluent本身的模拟更加强大。
用户可以根据实际的需求自定义这些特殊参数,从而实现更加全面和精确的模拟。
二、FLUENTUDF的步骤
2.编写UDF函数:
UDF函数可以用C或Fortran语言编写,也可以用Fluent自带的UDFEasy编译器编写。
编写UDF函数的基本步骤是:
(1)编写UDF函数的声明,它在编译器的第一行声明,用于定义函数的相关参数;
(2)编写函数代码,用于计算流体及热传导的相关参数;
(3)编写函数的结束部分,使函数返回正确的值并运行成功。
fluent之UDF⽂件的操作
下⽂转⾃沙场醉客之博客:
可⽤txt⽂件进⾏UDF编程,之后将⽂件改为.c⽂件。
(也可⽤VC编程,保存为.c⽂件)
将程序导⼊到Fluent中利⽤编译功能,具体操作
在 fluent中的Define -> Use-Defined -> Compiled 打开之后,选择source files下⾯的Add...,找到编写好的.c⽂件打开,点击Build,就会⽣成⼀个以liberary name命名的⽂件夹,编译好的资料就放在这个⽂件夹⾥⾯,最后点击load就会将编译好的内容导⼊到Fluent中,这样你在有UDF选项的下拉菜单中就会看到你编好的程序名称。
利⽤UDF编程和C语⾔编程很相似,所以最好知道⼀些C语⾔编程的基础,再掌握⼀些Fluent的UDF固有的⼀些命令,基本上⼀些简单的程序就都没问题了。
在使用Fluent软件进行模拟计算时,经常会遇到需要自定义用户子程序(User Defined Function,简称UDF)的情况。
UDF是Fluent中用户自己编写的函数,用于描述流场中的边界条件、源项等物理过程。
为了正确地使用UDF并进行模拟计算,我们需要了解如何编写和编译UDF。
本教程将向大家介绍如何使用ANSYS Fluent进行UDF的编译,并提供一些常见问题的解决方法。
一、准备工作在进行UDF编译之前,我们需要进行一些准备工作。
1. 确保已安装ANSYS Fluent软件,并且能够正常运行;2. 确保已安装C/C++编译器,常见的编译器有Microsoft Visual Studio、GCC等;3. 编写好UDF的源代码文件,可以使用任何文本编辑器编写,但建议使用支持C/C++语法高亮的编辑器,以便于排查语法错误。
二、设置Fluent编译环境在进行UDF编译之前,我们需要设置Fluent的编译环境,以确保编译器可以正确地识别Fluent的API。
1. 打开命令行终端(Windows系统为cmd,Linux/Unix系统为Terminal);2. 运行以下命令设置Fluent的编译环境:对于Windows系统:```bashcd C:\Program Files\ANSYS Inc\v200\fluentfluent 3d -i```对于Linux/Unix系统:```bashcd /usr/ansys_inc/v200/fluent./fluent 3d -t xxx -g -i```其中,xxx是你的图形界面类型,可以根据你实际的图形界面类型进行替换,一般为Gl 或 X11。
运行上述命令后,Fluent将会启动,并且设置了编译环境。
在Fluent 的命令行界面中,我们可以进行UDF的编译和加载。
三、编译UDF在设置了Fluent的编译环境后,我们可以开始编译UDF了。
1. 将编写好的UDF源代码文件(后缀名通常为.c或.cpp)放置在Fluent的工作目录中;2. 在Fluent的命令行界面中,输入以下命令进行编译:```bash/define/user-definedpiled-functions load my_udf-name/define/user-definedpiled-functionspile my_udf-name/define/user-definedpiled-functions write my_udf-name/exit```其中,my_udf-name是你的UDF源代码文件的文件名(不包括后缀名),例如my_udf。
[转]菜鸟学UDF的感觉,希望对UDFers有用
光看书,感觉UDF不难。
看例子,有些看个四五遍之后才能差不多看懂。
原来,得靠UDF 帮助。
我主要用的是fluent v6.3自带的html格式的帮助,里面东西很全,当然也包括UDF Manual。
里面自带的search功能相当好,只是要注意用好+或-号(逻辑符号),另外,这个功能似乎有些浏览器支持不太好,不过基本上用IE不太容易出问题。
对于从零开始学习UDF,建议还是先看一下UDF中文帮助,我估计大家知道的都是马世虎翻译的那本吧,感觉挺好。
(没想到马世虎跟我是校友,去年给安世亚太投过一份简历,他给我打过电话,当时一阵兴奋,呵呵。
)
对于只涉及到边界条件或物性等的UDF,一般用interpret就可以的,这些我觉得只需要根据例子改一下就是了。
$$ 对于要添加UDS方程的,相对难一点。
我编程用的是三到五个UDS,几十个UDM。
一开始编程时,没有头绪,后来看别人编的,才慢慢发现了一些基本思路。
比如,可以用枚举定义UDS或UDM,这样用起来方便。
enum{
NP,
RHOH2O_Y_UP_X,
RHOH2O_Y_UP_Y,
RHOH2O_Y_UP_Z,
N_REQUIRED_UDS
};//枚举UDS变量名
对于UDM,则用N_REQUIRED_UDM代表个数。
然后在INIT与ADJUST函数中,检查变量个数时则比较方便,如:
DEFINE_INIT(init_parameter,domain)
{
if (n_uds < N_REQUIRED_UDS)
Error(”Not enough user defined scalars!(init)\n”);
if (n_udm<N_REQUIRED_UDM)
Error(”Not enough user defined memories(init)!\n”);
initialise(domain);//代表初始化
}
DEFINE_ADJUST(adjust_compute,domain)
{
if (n_uds < N_REQUIRED_UDS)
Error(”Not enough user defined scalars!(adjust)\n”);
if (n_udm<N_REQUIRED_UDM)
Error(”Not e nough user defined memories(adjust)!\n”);
update_parameter(domain);//代表主函数
}
初始化时,则可:
cell_t c;
Thread *t;
int i;
thread_loop_c(t,d)
{
if(NNULLP(THREAD_STORAGE(t,SV_UDS_I(NP)))&&NNULLP(THREAD_STORAGE( t,SV_UDS_I(NP_R)))) //为各UDS提供存储空间
{
begin_c_loop(c, t)
{
for (i=0; i<N_REQUIRED_UDS; i++)
C_UDSI(c,t,i) = 0.0;
}
end_c_loop(c, t);
}
if(NNULLP(THREAD_STORAGE(t,SV_UDM_I)))
{
begin_c_loop(c, t)
{
for (i=0; i<N_REQUIRED_UDM; i++)
C_UDMI(c,t,i) = 0.0;
}
end_c_loop(c, t);
}
}
对于各UDM量,则可:
real udm_v;
udm_v=0;//用之前对变量进行初始化
…//UDM相关运行
C_UDMI(c,t,UDM_V)=udm_v;//把值输入给UDM,当然之前要对UDM_V进行定义
用UDM有个好处,一是可以在后处理中显示,二是传递变量相当方便,比如在ADJUST 中计算的量用于源项或对流项等,用UDM可以直接调用。
对于invalid number错误,很多时候是因为分母为零,如果习惯UDM初始化为零,则要注意避免零作分母,可以令其初始化不为零或为零时不运算(第二种方法比较好)。
方程与计算
我编程计算的是两相流中一相凝结成核,需要用UDS方程来模拟其成核有关变量(不要来问我程序代码,呵呵)。
我觉得对UDS变量控制方程搞清楚之后,这块一点儿也不难。
一般变量的控制方程(Fluent能认识的),就是含有瞬态项(时间项),对流项,扩散项与源项。
(方程如何处理fluent会自己弄的)对第一项,都有相应的宏来处理。
对于对流项,比如关于phi的方程中的:rho*U*phi的散度,其中U为速度矢量,则fluent 中需要知道的对流项则为rho*U.A,其中U.A代表U与A的点积,A代表单元格的面积向量。
对流是对面而言(2D的话则对线而言),对于边界,只有一边有单元格,而对于内部surface,则两边都有单元格,这时单元格编号从0到1。
比如,对于内部边界,代码可以与下面类似:
real NV_VEC(psi),NV_VEC(A),flux1;//声明向量操作
c0=F_C0(f,t);
t0=F_C0_THREAD(f,t);
F_AREA(A,f,t);//A的获得
c1=F_C1(f,t);
t1=F_C1_THREAD(f,t);
NV_D(psi,=,C_UDMI(c0,t0,UPX),C_UDMI(c0,t0,UPY),C_UDMI(c0,t0,UPZ));
NV_D(psi,+=,C_UDMI(c1,t1,UPX),C_UDMI(c1,t1,UPY),C_UDMI(c1,t1,UPZ));
flux1=NV_DOT(psi,A)/2.0;
对于边界上,则可以只用单元格c0,t0处的值或用f,t处的值(代表直接在边界面上取值,前提是边界上有存储值)。
对于扩散项,一般比较简单,直接用宏DEFINE_DIFFUSIVITY定义扩散系数即可。
注意它在fluent软件中的加入方式,一般是在material菜单中。
species中加入的扩散项与UDS扩散项的加入不在同一处。
对于源项,如果不容易线性化,不如索性定义dS[eqn]=0,这样倒简单。
其它
一开始学fluent时,把松弛因子设为0.1就感觉挺小了。
没想到刚用UDF计算时,得从1e-5开始,慢慢调到1e-1数量级上。
想想挺可怕的。
另外,很多CFD或多相流的东西都是理论与经验数据结合构成的公式,不一定完全准确,再加上数值解法的多样性,使算题时容易出各种各样的问题。
而且UDF有个特点,不能单独运行的,调试也必须放到fluent中,这样当要加入的宏比较多时,就会变得很麻烦,常常一天要建十几个library,然后分别选择不同的宏加载到fluent,然后就是不停的调试。
记得刚开始,我跟我师姐一块,她主要负责物理理论,我主要负责编程,经常因为一个小问题,要调试上大半天,因为编程中,任何一个小问题也必须解决掉。
当然,也经常烦得很,还好,男女搭配干活不太累。
我觉得visual assistX这个软件相当不错,它是为了方便vc环境下的编程。
而用udf编程时,大家感觉不爽的是,没有提示能力,因为它的宏VC环境下是不认识的,所以一片黑颜色不好看,主要的是不利于查错与写代码。
而用visual assistX(网上有破解版的),将fluent udf 常用的几个头方便的目录加入visual assistX中后,就方便多了。
比如,输入C_时,可能就会提示C_UDMI,C_UDSI,C_U,C_R等,因为以C开头的宏太多了,所以只提示最近用过的几个。
又比如,各种枚举量,各种宏等,这时都会以不同的颜色表示,一般常见的拼写错误,一下
子就能看出来,因为颜色不同,方便多了。
visual assistX本身也带有spell check功能,不过最好关掉,因为我们定义变量时常常不是以完整的单词命名,而这时常常很多代码下面都有浅浅的红色的波浪线,很是不爽。
又如,visual assistX提供查询功能,比如,某个宏或某个系统自带的变量名等,会自动显示该名称的出处,点一下go即可查得源文件。
这样可以很方便地查询自己不认识的宏或变量等。
一开始编程时常犯一个错误,就是这样写:powl(C_U(c,t),1/3),实际应该写为
powl(C_U(c,t),1.0/3),因为1/3默认是int型的,所以值为0,显然不是我想要的。
一开始用fluent6.1编程,它对于某个UDF面板处一般只允许一个宏的存在,所以,当你改了一下代码,重新build一个library后,宏会默认地替换掉原来的,这样,对调试是有好处的。
后来用fluent6.3,它允许一个地方加入多个宏,这样,build一个新的library后,需要自己改相关的宏(不变的宏可以不改),一开始觉得这样不如6.1,慢慢发现,它可以同时使用几个不同的library,比如某个量,可以用A方法求一会儿后再用B方法求,总之可以调的东西多了。
感觉,UDF编程除了需要专业知识与一定的C语言基础,更需要耐心。