UDF总结

UDF总结
UDF总结

UDF使用技巧

1、查找相应的函数的时候,可以现在word里面找到相应的函数名字,然后依次去中文帮助文档、英文帮助文档和网页帮助文档,看看详细解释并找找是否有相应的例子。

2、打个比方来说,thread就是公路,连接的cell和face,cell和face就相当于公路上汽车停靠的站点,

cell_t这个面向的是单元,而face_t面向的是边或者面(二维或三维)

在fluent循环过程中,一般是用thread作线程检索,而cell或者face作检索过程中位置(相当于指示位置的参数)参数的指示

3、对于UDF来说,积分就是做加法,把通过面上每个网格的质量流量相加

4、cell和face的区别,什么时候用cell,什么时候用face?

5、1. begin, end_c_loop macro is used for looping over all the cells in particular thread for serial processing.

2. For parallel processing, the cells inside a partition can be categorized as interior and exterior cells.

3. The macros begin, end_c_loop_int; begin, end_c_loop_ext and begin, end_c_loop_all are used for looping over interior, exterior and all the cells (in a partition) respectively.

4. In parallel simulations, both begin, end_c_loop and begin, end_c_loop_all macros will do the same job.

5. For faces the looping macro in parallel are begin, end_f_loop_int; begin, end_f_loop_ext and begin, end_f_loop for looping over interior, boundary and all faces respectively. For all practical purpose, the user need not separate the interior and boundary faces of a partition. Hence, begin, end_f_loop_int and begin, end_f_loop_ext macros are rarely used.

实际问题

1、DEFINE_UDS_UNSTEADY中的apu包括的函数是不是不包括当前时刻的变量,而su包含前一时刻的变量,所以用了C_STORAGE_R存储前一时刻的变量。

2、等于零是因为计算源项的时候温度还没有更新,所以两个温度值是相等的。这个时候其实是需要两个UDM,分别保存上一步和再上一步的温度。而且可以考虑全部在源项里完成,不用Adjust宏:

source=(C_UDMI(c,t,1)-C_UDMI(c,t,0))/TIME_STEP;

C_UDMI(c,t,0)=C_UDMI(c,t,1);

C_UDMI(c,t,1)=C_T(c,t);

return source;

当然,在刚开始计算的时候要注意下UDM的初始问题,防止出错。

从第三个时间步开始,就是正常的了。

这个方法挺好的,只要一开始的用DEFINE_INIT,对

C_UDMI(c,t,0)=0.;

C_UDMI(c,t,1)=0.;

一、数据类型

二、node

三、cell宏函数

1、

x[];其中,x[0]代表x方向坐标,x[1]代表y方向坐标,x[2]代表z方向坐标。2、

4、

5、

②C_R_G(c,t)只能用于密度基求解器,C_P_G (c,t)只能用于压力基求解器

③C_YI_G (c,t,i)只能用于密度基求解器,用于压力基求解器要设置,一切

设置好后,输入rpsetvar ’species/save-gradients?#t

④只有当已经求解出包含这个变量的方程时才能得到梯度变量,需要如下

设置solve/set/expert回车然后两个yes。输入q可以返回上级目录

6、

②C_R_RG(c,t)只用于密度基求解器,C_P_RG (c,t)只用于压力基求解器

③C_YI_RG (c,t,i)只能用于密度基求解器

④只有当已经求解出包含这个变量的方程时才能得到梯度变量,需要如下

设置solve/set/expert回车然后两个yes。输入q可以返回上级目录

7、

②详细可以看宏DEFINE_UDS_UNSTEADY( name,c,t,i,apu,su)。

8、

9、

注意:prt

10、

11、

②C_POLLUT(c,t,i):

0-Mass Fraction of NO;

1-Mass Fraction of HCN;

2-Mass Fraction of NH3;

3-Mass Fraction of N2O;

4-Soot Mass Fraction;

5-Normalized Radical Nuclei

③ Concentration in particles(颗粒浓度) *10(-15次方)/kg,具体公式需要

看fluent中的介绍。

12、

四、Face 宏函数(只能用于压力基求解器)

1、

x[];其中,x[0]代表x方向坐标,x[1]代表y方向坐标,x[2]代表z方向坐标。2、

3、

4、

值。

②the sign of the flux that is computed by the solver is opposite to that which

is reported in the FLUENT user-interface (e.g., Reports Fluxes...).

五、Connectivity 宏函数

一个面两边的cell可能不是属于同一个thread下的,如果这个面在domain 的外表面上,则只存在C0,如果这个面在domain内部,则存在C0和C1。

1、

和C1

2、

3、INTERIOR_FACE_GEOMETRY(需要增加#include “sg.h”)

INTERIOR_FACE_GEOMETRY(f,t,A,ds,es,A_by_es,dr0,dr1);/这样可以单独使用。

注意:使用之前需定义下面的变量:(用法和C_CENTROID(x,c,t)类似,调用该函数后相应的值会存放在求解器中,需要哪个值自己再调用)

real A[ND_ND]; the area normal vector面的法向量

real ds; distance between the cell centroids

real es[ND_ND]; the unit normal vector in the direction from cell c0 to c1

real A_by_es; the value

real dr0[ND_ND]; vector that connects the centroid of cell c0 to the face centroid

real dr1[ND_ND]; the vector that connects the centroid of cell c1 to the face centroid 4、BOUNDARY_FACE_GEOMETRY(需要增加#include “sg.h”)

BOUNDARY_FACE_GEOMETRY(f,t,A,ds,es,A_by_es,dr0); /这样可以单独使用。

注意:使用之前需定义下面的变量:(用法和C_CENTROID(x,c,t)类似,调用该函数后相应的值会存放在求解器中,需要哪个值自己再调用)

real A[ND_ND]; the area normal vector面的法向量

real ds; distance between the cell centroid and the face centroid

real es[ND_ND]; unit normal vector in the direction from centroid of cell c0 to face

centroid

real A_by_es; the value

real dr0[ND_ND]; vector that connects the centroid of cell c0 to the face centroid

5

6、BOUNDARY_SECONDARY_GRADIENT_SOURCE(需要增加#include “sg.h”)BOUNDARY_SECONDARY_GRADIENT_SOURCE(source,n,dphi,dx,A_by_es,k) 注意:使用它之前一般会使用BOUNDARY_FACE_GEOMETRY

其他注意事项看看中英文帮助文档

六、Special 宏函数

1、Thread Pointer for Zone ID ( Lookup_Thread)//可以用于边界条件的设置

如果你想对某个边界区域进行操作,你可以使用 Lookup_Thread找到你需要的区域对应的指针t,然后进行相应操作。

使用方法如下:

int zone_ID = 2; // ID是边界区域的编号,可以右击网格就可以查到

Thread *t = Lookup_Thread(domain,zone_ID);

注意:多相流情况下使用会有点麻烦,具体看看帮助

2、Zone ID ( THREAD_ID)

使用方法如下:

int zone_ID = THREAD_ID(t);

可以得到t对应的zone的ID整数值。

3、Domain Pointer ( Get_Domain)

Get_Domain(domain_id);

注意:domain_id是整数,对于混合相是1,对于某一个相,可以查看define-phases找到相应的ID。

Get_Domain(domain_id)经常用在宏DEFINE_ON_DEMAND中,DEFINE_ON_DEMAND这个宏一般用于初始化或迭代后数据进行处理(取平均,最大值,最小值等),不能使用在迭代过程当中。

例:DEFINE_ON_DEMAND(my_udf)

{

Domain *mixture_domain;

mixture_domain = Get_Domain(1);

}

4、Set Boundary Condition Value ( F_PROFILE)

F_PROFILE( f, t, i)=…….;

注意:①F_PROFILE是对面进行操作,一般用于边界条件的设定,改变边界条件上各种参数(压力,速度,组分参数)的值。

②i不需要提前定义或赋值,一般配合DEFINE_PROFILE(pressure_profile,t,i)使用,而这里已经定义了i。具体可以参照DEFINE_PROFILE提供的例子。

5、THREAD_SHADOW(t)

if (!NULLP(ts = THREAD_SHADOW(t)))

{

/* Do things here using the shadow wall thread (ts) */

t是薄壁的一部分,对t进行操作

}

如果边界不是薄壁的一部分,THREAD_SHADOW(t)返回NULL

NULLP()括号里面的如果没有分配内存返回TRUE

七、Time-Sampled Data(C_STORAGE_R)时间取样数据

八、Model-Specific Macros用于特定模型的宏

1、DPM宏

2、NOx宏

3、SOx宏

九、User-Defined Scalar (UDS) Transport Equation Macros用户自定义标量输运方程宏

在使用和本节UDS有关的宏的之前,必须先去fluent面板中进行设置标量的个数。Define—User-Defined—Scalars

1、Set_User_Scalar_Name

当你在fluent面板中设置了UDS个数后,系统会给分配的变量相应的名字,例如,分配了2个标量,则两个标量的名字为User Scalar 0和User Scalar 1。

但你可以使用下面的函数对名字进行修改,i代表对第几个标量进行修改,name是字符串格式,可用”……”表示。

Set_User_Scalar_Name(int i,char *name);

注意:上述修改只能修改一次,要改一下改完;最好使用EXECUTE_ON_LOADING宏

2、F_UDSI

s

3、

4、Reserve_User_Scalar_Vars

为避免UDF和UDS冲突,使用这个宏,具体用法如下:

offset = Reserve_User_Scalar_Vars(int num);

这样,UDF library就可以使用C_UDSI(c,t,offset) 到 C_UDSI(c,t,offset+num-1),其他宏也是这样;它经常用在EXECUTE_ON_LOADING、INIT和ON_DEMAND 宏中

5、N_UDS

可以直接使用它,不需要参数,返回FLUENT中已经规定的UDS输运方程的数目。

十、User-Defined Memory (UDM) Macros 用户自定义存储器宏

本章的宏包括UDM和User-Defined Node Memory (UDNM)宏

在使用本节中提供的宏之前,必须先去fluent界面设置变量个数,方法如下:Define—User-Defined—Memory

1、当你定义了变量个数后,系统会默认给相应变量初始的名字,例:

UDM: User Memory 0, User Memory 1

UDNM:User Node Memory 0, User Node Memory 1

如果你要修改相应的名字,需要使用宏Set_User_Memory_Name和宏Set_User_Node_Memory_Name。

2、Set_User_Memory_Name

Set_User_Memory_Name(int i,char *name);

注意:这个宏只能修改一次,要改几个,一下子改完,最好在EXECUTE_ON_LOADING宏中使用。

3、Set_User_Node_Memory_Name

Set_User_Node_Memory_Name(int i,char *name);

注意:这个宏只能修改一次,要改几个,一下子改完,最好在EXECUTE_ON_LOADING宏中使用。

4、

5、

6、

7、Reserve_User_Memory_Vars

为避免UDF和UDM冲突,使用这个宏,具体用法如下:

offset = Reserve_User_Memory_Vars(int num);

这样,UDF 就可以使用C_UDMI(c,t,offset) 到 C_UDMI(c,t,offset+num-1),其他宏也是这样;它经常用在EXECUTE_ON_LOADING、INIT和ON_DEMAND 宏中

十一、Looping Macros 循环宏

Looping Over Cell Threads in a Domain ( thread_loop_c)

Looping Over Face Threads in a Domain ( thread_loop_f)

Looping Over Cells in a Cell Thread ( begin_c_loop/ end_c_loop)

Looping Over Faces in a Face Thread ( begin_f_loop/end_f_loop)

Looping Over Faces of a Cell ( c_face_loop)

Looping Over Nodes of a Cell ( c_node_loop)

Looping Over Nodes of a Face ( f_node_loop)

1、Looping Over Cell Threads in a Domain ( thread_loop_c)

用法如下:

Domain *domain;

Thread *c_thread;

thread_loop_c(c_thread, domain) /*loops over all cell threads in domain*/ {

}

2、Looping Over Face Threads in a Domain ( thread_loop_f)

用法如下:

Thread *f_thread;

Domain *domain;

thread_loop_f(f_thread, domain)/* loops over all face threads in a domain*/ {

}

3、Looping Over Cells in a Cell Thread ( begin_c_loop/ end_c_loop)

用法如下:(经常配合thread_loop_c使用)

cell_t c;

Thread *c_thread;

begin_c_loop(c, c_thread) /* loops over cells in a cell thread */

{

}

end_c_loop(c, c_thread)

4、Looping Over Faces in a Face Thread ( begin_f_loop/end_f_loop)

用法如下:(经常配合thread_loop_f使用)

face_t f;

Thread *f_thread;

begin_f_loop(f, f_thread) /* loops over faces in a face thread */

{

}

end_f_loop(f, f_thread)

5、Looping Over Faces of a Cell ( c_face_loop)

用法如下:

cell_t c;

Thread *t;

face_t f;

Thread *tf;

int n;

c_face_loop(c, t, n) /* loops over all faces of a cell */

{

.

f = C_FACE(c,t,n);

tf = C_FACE_THREAD(c,t,n);

.

}

n是the local face index number,C_FACE宏可以获得面, C_FACE_THREAD 宏可以获得面thread,还有一些宏能用于c_face_loop,在帮助文件里找到

6、Looping Over Nodes of a Cell ( c_node_loop)

用法如下:

cell_t c;

Thread *t;

int n;

Node *node;

c_node_loop(c,t,n)

{

.

node = C_NODE(c,t,n);

.

}

n是the local node index number怎么获得的,C_NODE宏可以获得cell结点。

7、Looping Over Nodes of a Face ( f_node_loop)

用法如下:

face_t f;

Thread *t;

int n;

Node *node;

f_node_loop(f,t,n)

{

.

node = F_NODE(f,t,n); .

.

}

n是the local node index number怎么获得的,F_NODE宏可以获得cell结点。十二、Multiphase Looping Macros

本节中介绍的宏只能用在多相UDF中

1、Looping Over Phase Domains in Mixture ( sub_domain_loop)

sub_domain_loop在每个单相域(子域)循环loops over all phase domains,这个宏提供每个单相的指针和phase_domain_index(用来区别不同的相的线,第一相的线为0,第二相的线为1)。

int phase_domain_index; /* index of subdomain pointers */

Domain *mixture_domain;

Domain *subdomain;

sub_domain_loop(subdomain, mixture_domain, phase_domain_index)

subdomain是指向子域的指针,mixture_domain是指向超级域的指针,phase_domain_index子域第一相为0,第二相为1(注意:它和domain_id不同,

domain_id 超级域mixture domain为1,第一相为2,第二相为3)如果sub_domain_loop 宏用在DEFINE函数中并且他的参数还有domain变量,则mixture_domain会被求解器自动使用;如果不能使用,你可以在DEFINE 函数里使用sub_domain_loop 宏之前用get_domain(1)

subdomain and phase_domain_index are set within the sub_domain_loop macro.

2、Looping Over Phase Threads in Mixture ( sub_thread_loop)

sub_thread_loop在每个单相线循环 loops over all phase-level threads with a mixture-level thread

int phase_domain_index;

Thread *subthread;

Thread *mixture_thread;

sub_thread_loop(subthread, mixture_thread, phase_domain_index)

subthread is a pointer to the phase thread, and mixture_thread is a pointer to the mixture-level thread, phase_domain_index is an index of subdomain pointers that can be retrieved using the PHASE_DOMAIN_INDEX macro.

注意:subthread and phase_domain_index are initialized within the sub_thread_loop macro definition.

3、Looping Over Phase Cell Threads in Mixture ( mp_thread_loop_c)

The mp_thread_loop_c macro loops through all cell threads (at the mixture level) within the mixture domain and provides the pointers of the phase-level (cell) threads associated with each mixture-level thread.

Thread **pt;

Thread *cell_threads;

Domain *mixture_domain;

mp_thread_loop_c(cell_threads, mixture_domain, pt)

the macro also returns a pointer array ( pt) that identifies the corresponding phase-level threads. The pointer to the cell thread for the th phase is pt[i], where i is the phase_domain_index. pt[i] can be used as an argument to macros requiring the phase-level thread pointer.

cell_threads is a pointer to the cell threads, and mixture_domain is a pointer to the mixture-level domain. pt is an array pointer whose elements contain pointers to phase-level threads.

如果 mp_thread_loop_c 宏用在DEFINE函数中并且他的参数还有domain变量,则mixture_domain会被求解器自动使用;如果不能使用,你可以在DEFINE 函数里使用 mp_thread_loop_c 宏之前用get_domain(1)

mp_thread_loop_c经常配合begin_c_loop使用,begin_c_loop嵌在 mp_thread_loop_c中

When begin_c_loop is nested within mp_thread_loop_c, you can loop over all cells in all phase cell threads within a mixture.

4、Looping Over Phase Face Threads in Mixture ( mp_thread_loop_f)

The mp_thread_loop_f macro loops through all face threads (at the mixture level)

within the mixture domain and provides the pointers of the phase-level (face) threads associated with each mixture-level thread.

the macro also returns a pointer array ( pt) that identifies the corresponding phase-level threads. The pointer to the face thread for the th phase is pt[i], where i is the phase_domain_index. pt[i] can be used as an argument to macros requiring the phase-level thread pointer.

Thread **pt;

Thread *face_threads;

Domain *mixture_domain;

mp_thread_loop_f(face_threads, mixture_domain, pt)

face_threads is a pointer to the face threads, and mixture_domain is a pointer to the mixture-level domain. pt is an array pointer whose elements contain pointers to phase-level threads.

mp_thread_loop_f经常配合begin_f_loop使用,begin_f_loop嵌在 mp_thread_loop_f中

When begin_f_loop is nested within mp_thread_loop_f, you can loop over all faces in all phase face threads within a mixture.

十三、 Advanced Multiphase Macros

多相流的定义会有不同

1、DEFINE_ADJUST 和 DEFINE_INIT针对的domain只能用于超级域are passed mixture domain variables only,而像ON_DEMAND宏中参数不传递任何变量,所以我们需要相关的宏来表示我们目前针对的对象具体是什么。编写多相模型的UDF时,要牢记多相模型的数据结构,注意函数获得的参数和函数hook在什么域上,同时还要注意你使用的多相模型的类型。

2、Phase Domain Pointer ( DOMAIN_SUB_DOMAIN)

如果你想获得某一个单相的指针,有两种方法:第一,使用Get_Domain;第二,使用DOMAIN_SUB_DOMAIN。

int phase_domain_index = 0; /* primary phase index is 0 */

Domain *mixture_domain;

Domain*subdomain=DOMAIN_SUB_DOMAIN(mixture_domain,phase_domain_index);

当你使用DEFINE宏并且含有 a phase domain index argument ( DEFINE_EXCHANGE_PROPERTY,DEFINE_VECTOR_EXCHANGE_PROPER TY) ,phase_domain_index不需要设置,否则你要指定phase_domain_index的值。

3、Phase-Level Thread Pointer ( THREAD_SUB_THREAD)

THREAD_SUB_THREAD可以得到the phase-level thread (subthread) pointer。

int phase_domain_index = 0; /* primary phase index is 0 */

Thread *mixture_thread; /* mixture-level thread pointer */

Thread*subthread=THREAD_SUB_THREAD(mixture_thread,phase_domain_index);

mixture_thread is a pointer to a mixture-level thread。如果用DEFINE宏(例如 DEFINE_PROFILE),系统会自动调用mixture_thread,如果不能自动调用,要用宏Lookup_Thread。

当你使用DEFINE宏contains a phase domain index argument ,例如( DEFINE_EXCHANGE_PROPERTY,DEFINE_VECTOR_EXCHANGE_PROPER TY) ,UDF会自动调用某个相,否则你要指定phase_domain_index的值。

4、Phase Thread Pointer Array ( THREAD_SUB_THREADS)

Thread *mixture_thread;

Thread **pt; /* initialize pt */

pt = THREAD_SUB_THREADS(mixture_thread);

mixture_thread is a pointer to a mixture-level thread which can represent a cell thread or a face thread. It is automatically passed to your UDF by the FLUENT solver when you use a DEFINE macro that contains a variable thread argument (e.g., DEFINE_PROFILE), and the function is hooked to the mixture. Otherwise, if the mixture thread pointer is not explicitly passed to your UDF, then you will need to use another method to retrieve it. For example you can use the Lookup_Thread utility macro.

pt[i], an element in the array, is a pointer to the corresponding phase-level thread for the th phase, where i is the phase_domain_index. You can use pt[i] as an argument to some cell variable macros when you want to retrieve specific phase information at a cell. For example, C_R(c,pt[i]) can be used to return the density of the th phase fluid at cell c.

5、Mixture Domain Pointer ( DOMAIN_SUPER_DOMAIN)

通过这个宏,你可以通过a particular phase-level domain (subdomain) pointer 获得 the mixture-level domain pointer.。

Domain *subdomain;

Domain *mixture_domain = DOMAIN_SUPER_DOMAIN(subdomain);

It is automatically passed to your UDF by the FLUENT solver when you use a DEFINE macro that contains a domain variable argument (e.g., DEFINE_ADJUST)在上面的例子中,要事先获得子域(即相域)的指针。如果UDF勾在某一相域上,相域的指针也可以由求解器自动传递给UDF。在当前版本FLUENT中,

DOMAIN_SUPER_DOMAIN 与Get_Domain(1)返回的指针是一样的。但是还是建议在UDF中,尽可能使用DOMAIN_SUPER_DOMAIN,考虑到FLUENT版本的更新,未来可能处理多个超级域。

6、Mixture Thread Pointer ( THREAD_SUPER_THREAD)

You can use the THREAD_SUPER_THREAD macro when your UDF has access to a particular phase-level thread (subthread) pointer, and you want to retrieve the mixture-level thread pointer.

Thread *subthread;

Thread *mixture_thread = THREAD_SUPER_THREAD(subthread);

subthread is a pointer to a particular phase-level thread within the multiphase mixture. It is automatically passed to your UDF by the FLUENT solver when you use a DEFINE macro that contains a thread variable argument (e.g., DEFINE_PROFILE), and the function is hooked to a primary or secondary phase in the mixture.

7、Domain ID ( DOMAIN_ID)

Domain *subdomain;

int domain_id = DOMAIN_ID(subdomain);

8、Phase Domain Index ( PHASE_DOMAIN_INDEX)

Domain *subdomain;

int phase_domain_index = PHASE_DOMAIN_INDEX(subdomain);

十四、Vector and Dimension Macros

1、V denotes a vector, S denotes a scalar, and D denotes a sequence of three vector components of which the third is always ignored for a two-dimensional calculation.

2、Macros for Dealing with Two and Three Dimensions

RP_2D and RP_3D

3、The ND Macros

(1)ND_ND

二维的时候ND_ND为2,三维的时候ND_ND为3,但如果用在数组中,都是从0开始使用,一直到n-1。

Fluent_UDF_第七章_UDF的编译与链接

第七章 UDF的编译与链接 编写好UDF件(详见第三章)后,接下来则准备编译(或链接)它。在7.2或7.3节中指导将用户编写好的UDF如何解释、编译成为共享目标库的UDF。 _ 第 7.1 节: 介绍 _ 第 7.2 节: 解释 UDF _ 第 7.3 节: 编译 UDF 7.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程序的详细解释

对一个简单解释型udf程序的详细解释 #include "udf.h" /*udf.h是一个头文件,如果不写的话就不能使用fluent udf中的宏,函数等*/ DEFINE_PROFILE(pressure_profile, t, i) /*是一个宏,本例中用来说明进口压力与垂直坐标变量(还可以是其他的变量)的关系。pressure_profile 是函数名,可随意指定。t的数据类型是Thread *t ,t 表示指向结构体thread(这里的thread表示边界上所有的网格面的集合)的指针。i的数据类型是Int,表示边界的位置?或者说是什么每个循环内对位置变量(这里应该是质心的纵坐标)设置的数值标签*/ { real x[ND_ND]; /* 定义了质心的三维坐标,数据类型为real*/ real y; /*定义了一个变量y, 数据类型为real */ face_t f; /*定义了一个变量f, 数据类型为face_t,也就是网格面的意思,即f代表一个网格单元的网格面*/ begin_f_loop(f, t) /*表示遍寻网格面,它的意思是说在计算的时候,要扫描所定义边界的所有网格面,对每个网格面都要赋值,值存储在F_PROFILE(f, t, i)中*/ {

F_CENTROID(x,f,t); /*一个函数,它的意思是读取每个网格面质心的二维坐标,并赋值给x。x 为名称,接收三维坐标值。f为网格面(因为这里只是取的面的二维坐标,所以为f,如果是网格单元的话,这里就为c)。t为指向结构体thread(这里的thread 表示边界上所有的网格面的集合)的指针*/ y = x[1]; /*把质心的三维坐标的纵坐标的数值赋给y*/ F_PROFILE(f, t, i) = 1.1e5 - y*y/(.0745*.0745)*0.1e5; /*赋给每个网格面的数值与网格质心纵坐标的关系。其实就是赋给质心的速度值(这里只有大小)与质心纵坐标的函数关系,因为fluent在计算的时候是把数据存储到网格质心上的,所以网格质心的速度值就代表网格的速度值。这里有了网格的质心纵坐标,然后有了质心速度值与纵坐标的函数关系,那么每个进口网格面的速度值也就知道了。f依然代表网格面。t表示指向结构体thread(这里的thread表示边界上所有的网格面的集合)的指针。i每个循环内对位置变量(这里应该是质心的纵坐标)设置的数值标签*/ } end_f_loop(f, t)/*结束循环*/ } 整体来看:包括两个宏:DEFINE_PROFILE(pressure_profile, t, i)和beginend_f_loop(f, t)。两个函数:F_CENTROID(x,f,t)和F_PROFILE(f, t, i)。其他都是变量。

UDF 编译疑难问题

UDF 编译疑难问题 作者华南理工大学何奎2016 5月 随着用户求解的问题越来越复杂,使用fluent 软件难免使用编译型的UDF,编译型需要用户安装微软visual stadio C++ 开发软件,并做正确的环境变量配置。否则则会出现如nmake 不是内部命令的错误。除了编译环境的正确设置,还有一些细节上的疑难问题一并给出解决方法。目前这些问题都是网上搜索不到的,希望有缘人能在百度文库里找到这篇文献。 关于环境变量的设置,网络上已经有大量的实例,现介绍一种简单的环境变量配置方法: 在fluent 的安装目录下找到udf.bat, 修改以下内容: set MSVC_DEFAULT=%ProgramFiles(x86)%\Microsoft Visual Studio 14.0 if exist "%MSVC_DEFAULT%\VC\vcvarsall.bat" set MSVC=%MSVC_DEFAULT% if not "%MSVC%" == "" goto msvc_env110 这个文件中还有其他类似的语句,但是都是重复查找不同的编译环境。通过查找vcvarsall.bat,fluent才知道编译器位置。如果不是就要靠运行msvc_env110,那就要手动设置环境变量了。注意你安装了VS2015以后,在program(x86)中有Microsoft Visual Studio 14.0,Microsoft Visual Studio 12.0,Microsoft Visual Studio 11.0,其中只有一个是有效的,这个要仔细确认(一般只有一个文件夹是完整的安装,估计这样做是为了向下兼容性)。 修改完了这个路径以后就OK了。 环境变量配置完全以后,还会出现一些别的问题。如编译UDF时会利用math.h, 注意编译这个文件有可能会出现很多问题。如下: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\math.h(483): error C2059: 语法错误:“常量”C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\math.h(483): error C2143: 语法错误: 缺少“)”(在“/”的前面) C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\math.h(483): error C2143: 语法错误: 缺少“{”(在“/”的前面) C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\math.h(483): error C2059: 语法错误:“/” C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\math.h(483): error C2059: 语法错误:“)” 如果光按fluent提示的查找错误,是不可能完成错误查找的,打开math.h因为你会看见483行是这样 _Check_return_ _ACRTIMP double __cdeclcbrt(_In_ double _X);(求立方根函数) 这个语句本身是没有什么问题的。如果想修改这条语句完成math.h的编译,那就走入了死胡同。那 么换个版本的math.h呢? 于是换了个瑞典公司开发的版本Copyright 2003-2010 IAR Systems AB(瑞典著名软件开发商). 结果编译出现: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\math.h(19): fatal error C1083: 无法打开包括文件: “ycheck.h”: No such file or directory 如果你查找ycheck.h,想加入这个头文件来解决这个问题的话,你会发现在中文资料库里根本就查不到 这样的头文件。这可能是该公司内部开发的一个头文件。所以这条路又行不通。那么如果将这条预处理程 序忽略掉呢?结果就会出现以下的编译错误: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\math.h(99): error C2061: 语法错误: 标识符“__ATTRIBUTES” C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\math.h(99): error C2059:

Fluent无法编译UDF文件的常见解决方法

解决Fluent无法编译UDF文件的问题 方法1 对于Fluent加载UDF时出现"The UDF library you are trying to load(libudf)is not complied for parallel use on the current platform (win64)"错误,主要是没有正确设置本机VS安装路径,导致udf编译器无法成功编译c代码。解决方法: 1. 找到Fluent内的UDF.bat编译器。这里以我自己2019R2的64位学生版为例,在D:\Program Files\ANSYS Inc\ANSYS Student\v194\fluent\ntbin\win64下找到udf.bat用记事本打开 2. 将本机Visual Studio的安装路径写入。这里以我自己VS2015为例,将本机visual studio 2015的安装路径赋值给MSVC_DEFAULT,由于VS2015的版本代号是14.0,因此将"%ProgramFiles(x86)%\Microsoft Visual Studio 14.0"替换为"D:\Program Files (x86)\Microsoft Visual Studio 14.0",保存文件即可,如图1~2所示 更改前

更改后 方法2 对于某些低版本的VS,以上操作可能不足以解决问题,需要手动配置环境变量,具体方法如下: 1.找到Fluent安装路径下的setenv.exe,双击运行选择是,路径X:\Program Files\ANSYS Inc\v130\fluent\ntbin\win64\setenv.exe 2.右键“我的电脑”—属性—高级—环境变量,添加用户变量,以VS2013为例INCLUDE=D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include; LIB=D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib\amd64;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib\x64;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib\kernel32.lib Path=D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64;D:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE;

64位 ANSYS FLUENT 编译UDF方法

ANSYS FLUENT 12.x 13.x版下使用Visual Studio 2010编译UDF的设置方法 COMSOL出了点问题,只能重装系统搞定。神马软件都要重装啊,今天装好ANSYS后,打开FLUENT界面时,灵感闪现,想出下面的方法设置UDF编译环境。 其实ANSYS版的FLUENT用UDF是不需要到系统环境变量里面设置path,include,lib的,如果您用的是Visual Studio 2010及后续版本,只需要按一定的规则设置udf.bat文件就行了。从udf.bat文件结构看,VS版本在VS2010以前的都可以不用设置,即可使用。 实现方法,以Win7 X64位ANSYS X64位为例: 1.找到fluent安装目录下的udf.bat(C:\Program Files\ANSYS Inc\v121\fluent\ntbin\win64\udf.bat) 用文本编辑器修改udf.bat: 添加 echo trying to find MS C compiler, version 10.0.... set MSVC_DEFAULT=%ProgramFiles(x86)%\Microsoft Visual Studio 10.0 if exist "%MSVC_DEFAULT%\vC\vcvarsall.bat" set MSVC=%MSVC_DEFAULT% if not "%MSVC%" == "" goto msvc_env100 set MSVC_DEFAULT=%ProgramFiles%\Microsoft Visual Studio 10.0 if exist "%MSVC_DEFAULT%\vC\vcvarsall.bat" set MSVC=%MSVC_DEFAULT% if not "%MSVC%" == "" goto msvc_env100 :msvc_env100 set MSVC_VERSION=100 call "%MSVC%\VC\vcvarsall.bat" amd64 goto ms_c_end 注:如果Visual Studio安装到其他盘,(可能)需要修改路径,比如装到D盘Program Files下,便这样添加: set MSVC_DEFAULT=d:\Program Files\Microsoft Visual Studio 10.0 if exist "%MSVC_DEFAULT%\vC\vcvarsall.bat" set MSVC=%MSVC_DEFAULT% if not "%MSVC%" == "" goto msvc_env100 :msvc_env100 set MSVC_VERSION=100 call "%MSVC%\VC\vcvarsall.bat" amd64 goto ms_c_end

udf编译的经验总结

转帖 udf编译的经验总结 关于:"nmake"不是内部命令或外部命令,也不是可运行程序 我在编译UDF时出现如下错误: Error: Floating point error: divide by zero Error Object: () > "nmake"不是内部命令或外部命令,也不是可运行程序 Error Object: () Error: open_udf_library:系统找不到指定目录 Error: Floating point error: divide by zero Error Object: () 我原来装的时turbo c/c++编译器,可能时环境变量没有设好的缘故。换用vc++6.0以后就没有这个问题了,另外,我用的是fluent6.2.16,希望遇到同样问题的同学借鉴一下,呵 呵。 udf编译的经验总结1)安装vc时候,只要选择了“环境变量”这一项,就不需要在“我 的电脑 > 属性 > 高级 > 环境变量”中 更改“include”“lib”“path”变量的值,保持默认状态即可; 2)如果是fluent6.1以上的版本,读入你的case文件,只要在 define->user-defined->functions->complied中, add你的udf源文件(*.c)和“udf.h”头文件,然后确定用户共享库(library name)的 名称,按“build”,就 相当于nmake用户共享库;在这一步中常出现的错误: (a)(system "move user_nt.udf libudf\ntx86\2d")0 (system "copy C:\Fluent.Inc\fluent6.1.22\src\makefile_nt.udf libudf\ntx86\2d\makefile")已复制 1 个文件。 (chdir "libudf")() (chdir "ntx86\2d")() 'nmake' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 'nmake' 不是内部或外部命令,也不是可运行的程序

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帮助手册里的实例对初学者特别有用,例子难度小,侧重流程和用法。 2. 解释型udf使用基本过程:将物理模型简化,确定udf实现的功能;编制c语言源代码;启动fluent并完成相关设置;加载并解释c语言代码;将udf与fluent相关联。初次尝试觉得难度很小,只是对c语言源程序的边界有点模糊,特别是在语言结构方面。 3. 进行编译型udf使用尝试,根据需要需先安装一个c编辑器,因手头有vs2012所以直接安装vs2012。安装vs2012的过程有点艰辛,因为自己电脑上装过其他的VS版本(未完全卸载),以及其他的一些开源c编辑器(一直在用),安装vs2012过程老是不成功(这里推荐使用vs2008,网上教程较多,出现相关的问题都能较容易地找到方法解决)。最后的解决办法是重装系统(各种尝试都未能解决安装问题后,可能与以前安装过的vs卸载不完全有关),并逐步尝试环境变量的设置。vs2012与fluent环境变量成功设置如下(win7 64位系统):

Fluent UDF 中文教程UDF第7章 编译与链接

第七章UDF的编译与链接 编写好UDF件(详见第三章)后,接下来则准备编译(或链接)它。在7.2或7.3节中指导将用户编写好的UDF如何解释、编译成为共享目标库的UDF。 _ 第 7.1 节: 介绍 _ 第 7.2 节: 解释 UDF _ 第 7.3 节: 编译 UDF 7.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必须用DEFINE宏进行定义,DEFINE宏的定义是在udf.h文件中。因此,在用户编译UDF之前,udf.h文件必须被放到一个可被找到的路径,或者放到当前的工作目录中。 udf.h文件放置在: path/Fluent.Inc/fluent6.+x/src/udf.h 其中path是Fluent软件的安装目录,即Fluent.Inc目录。X代表了你所安装的版本号。 通常情况下,用户不应该从安装默认目录中复制udf.h文件。编译器先在当前目录中寻找该文件,如果没找到,编译器会自动到/src目录下寻找。如果你升级了软件的版本,但是没有从你的工作目录中删除旧版本的udf.h文件,你则不能访问到该文件的最新版本。在任何情

udf宏的功能

2.3. Model-Specific DEFINE Macros The DEFINE macros presented in this section are used to set parameters for a particular model in ANSYS Fluent. Table 2.2: Quick Reference Guide for Model-Specific DEFINE Functions – Table 2.6: Quick Reference Guide for Model-Specific DEFINE Functions MULTIPHASE ONLY provides a quick reference guide to the DEFINE macros, the functions they are used to define, and the dialog boxes where they are activated in ANSYS Fluent. Definitions of each DEFINE macro are listed in udf.h. For your convenience, they are listed in Appendix B. DEFINE_ANISOTROPIC_CONDUCTIVITY DEFINE_CHEM_STEP DEFINE_CPHI DEFINE_DIFFUSIVITY DEFINE_DOM_DIFFUSE_REFLECTIVITY DEFINE_DOM_SOURCE DEFINE_DOM_SPECULAR_REFLECTIVITY DEFINE_ECFM_SOURCE DEFINE_ECFM_SPARK_SOURCE DEFINE_EC_RATE DEFINE_EMISSIVITY_WEIGHTING_FACTOR DEFINE_FLAMELET_PARAMETERS DEFINE_ZONE_MOTION DEFINE_GRAY_BAND_ABS_COEFF DEFINE_HEAT_FLUX DEFINE_IGNITE_SOURCE DEFINE_NET_REACTION_RATE DEFINE_NOX_RATE DEFINE_PDF_TABLE DEFINE_PR_RATE DEFINE_PRANDTL UDFs DEFINE_PROFILE DEFINE_PROPERTY UDFs DEFINE_REACTING_CHANNEL_BC DEFINE_REACTING_CHANNEL_SOLVER DEFINE_SBES_BF DEFINE_SCAT_PHASE_FUNC DEFINE_SOLAR_INTENSITY DEFINE_SOLIDIFICATION_PARAMS DEFINE_SOOT_MASS_RATES DEFINE_SOOT_NUCLEATION_RATES DEFINE_SOOT_OXIDATION_RATE DEFINE_SOOT_PRECURSOR DEFINE_SOURCE DEFINE_SOX_RATE DEFINE_SPARK_GEOM (R14.5 spark model) DEFINE_SPECIFIC_HEAT DEFINE_SR_RATE DEFINE_THICKENED_FLAME_MODEL DEFINE_TRANS UDFs DEFINE_TRANSIENT_PROFILE DEFINE_TURB_PREMIX_SOURCE DEFINE_TURB_SCHMIDT UDF DEFINE_TURBULENT_VISCOSITY DEFINE_VR_RATE DEFINE_WALL_FUNCTIONS DEFINE_WSGGM_ABS_COEFF Table 2.2: Quick Reference Guide for Model-Specific DEFINE Functions Function DEFINE Macro Dialog Box Activated In anisotropic thermal conductivity DEFINE_ANISOTROPIC_CONDUCTIVITY Create/Edit Materials mixing constant DEFINE_CPHI User-Defined Function Hooks homogeneous net mass reaction rate for DEFINE_CHEM_STEP User-Defined Function Hooks all species, integrated over a time step

Fluent UDF 第三章 编写UDF

第 3 章 编写 UDF
第 3 章 编写 UDF
本章包含了 FLUENT 中如何写 UDFs 的概述。
3.1 概述 3.2 写解释式 UDFs 的限制 3.3 FLUENT 中 UDFs 求解过程的顺序 3.4 FLUENT 网格拓扑 3.5 FLUENT 数据类型 3.6 使用 DEFINE Macros 定义你的 UDF 3.7 在你的 UDF 源文件中包含 udf.h 文件 3.8 定义你的函数中的变量 3.9 函数体 3.10 UDF 任务 3.11 为多相流应用写 UDFs 3.12 在并行中使用你的 UDF 3.1 概述(Introduction) 在你开始编写将挂到 FLUENT 代码以增强其标准特征的 UDF 之前,你必须 知道几个基本的要求。首先,UDFs 必须用 C 语言编写。它们必须使用 FLUENT 提供的 DEFINE macros 来定义。UDFs 必须含有包含于源代码开始指示的 udf.h 文件;它允许为 DEFINE macros 和包含在编译过程的其它 FLUENT 提供的函数 定义。 UDFs 只使用预先确定的宏和函数从 FLUENT 求解器访问数据。 通过 UDF 传递到求解器的任何值或从求解器返回到 UDF 的,都指定为国际(SI)单位。 总之,当写 UDF 时,你必须记住下面的 FLUENT 要求。 UDFs: 1. 采用 C 语言编写。 2. 必须为 udf.h 文件有一个包含声明。 3. 使用 Fluent.Inc 提供的 DEFINE macros 来定义。 4. 使用 Fluent.Inc 提供的预定义宏和函数来访问 FLUENT 求解器数据。 5. 必须使返回到 FLUENT 求解器的所有值指定为国际单位。 3.2 写解释式 UDFs 的限制(Restriction on Writing Interpreted UDFs)

UDF(用户自定义特征)的创建和使用

UDF(用户自定义特征)的创建和使用 bysgjunfeng 1、什么是UDF? 2、UDF使用过程 2.1创建参照模型 2.2创建UDF 2.3放置UDF 3、替换UDF 4、UDF搭配族表的使用 1、什么是UDF? UDF即用户自定义特征。也就是说可以将数个特征组合起来形成一个新的自己定义的特征,并且会保存在UDF数据库中,随时调入。(类似于AutoCAD中的动态 块) 用户自定义特征用来复制相同或相近外形的特征组,此功能类似于“特征复制”,但又有所不同,功能上比较全面、灵活,但相应的步骤比较繁琐。因此,如果会用特征复制,特别是特征复制里的新参考,将会对此命令有所帮助。 UDF和特征复制的最大区别有以下两点: ●特征复制仅适用于当前的模型,而UDF可以适用与不同的模型。 ●特征复制的局部组无法用另一个局部组替换,而UDF可被另一个UDF替换 UDF的使用流程大体可分为三步:规划并创建参照模型——建立UDF——放置UDF,下面我们用一个简单的例子来说明如何使用UDF。 2、UDF使用过程 在使用UDF之前,首先要创建UDF,缺省时,Pro/ENGINEER将创建的UDF保存在当前工作目录中。为此,可创建UDF库目录,要访问Pro/ENGINEER 的UDF库目

录,可指定带置文件选项"pro_group_dir"的目录名。这样,每次插入UDF时将 自动打开该目录。 建立好参照模型后,单击单击"工具"(Tools)>"UDF 库"(UDF Library)。出现下 图所示UDF菜单 该对话框各选项含义如下: 创建 (Create):建立新的UDF并将其添加到UDF库。 修改 (Modify):修改现有的 UDF。如果有参照零件,系统将在单独的零件窗口 显示 UDF。 列表 (List):列出当前目录中的所有UDF文件,用于查看UDF信息。 数据库管理 (Dbms):管理当前UDF数据库。即对当前UDF数据库中的UDF进行保存、另存为、备份、重命名、拭除、清除、删除等操作。 集成 (Integrate):解决源 UDF 和目标 UDF 之间的差异。 以下以实例说明如何创建及使用UDF。 假定背景:在很多时候建立零件模型时,零件的粗坯都是一个长方体,并且要求该长方体关于基准平面左右前后对称(如下图所示),这就要求在草绘里绘制矩形时要多绘制两条中心线或多标两个尺寸。下面我们将演示如何将这样的长方体 作为UDF来使用。 本实例重在介绍UDF的使用过程,希望能起到抛砖引玉的作用,使大家在实际应

UDF

1.1什么是UDF? UDF是一种可以被加载到fluent求解器中的函数,以提高源代码的功能。比如,你可以使用UDF定义你的边界条件,材料属性和流型源项,以及自定义模型参数,初始化一种算法或增强后处理进程。 UDF可以在任何文本里用C语言编写,然后源代码保存格式为“e.g., myudf.c”。一个源文件可以包含一个或多个UDF,或者你可以定义多个源文件。关于C语言编程的一些基本资料见附录A。 UDF是被fluent Inc提供的宏定义进行定义。它们使用附加的宏代码,使fluent具有数据访问和执行其他任务的功能。 每一个UDF必须在源代码文件的开头包含“#include "udf.h"”,使得宏定义和fluent的其他宏及功能可以在运行的过程中被包含。 含有UDF的源文件可以在fluent里进行解释或编译。对于解释型UDF,在一个单一的运算进程中,源文件被解释后在运行时直接加载。而对于编译型UDF,这个过程包含2个步骤。需要首先建立一个共享的对象代码库,然后将其加载到fluent中。一旦被解释或编译,UDF将会在fluent界面中可见并可选择,然后通过在相应的控制面板中选择函数名称被连接到求解器中。 1.2为什么使用UDF? UDF可以让你自定义fluent来满足你的特殊模型需要。UDF可以在多个应用中使用,下面列举的就是一些例子。 ●定义边界条件,材料属性,表面和体积反应速率,fluent输运方程的源项, UDS输运方程的源项,扩散系数函数等。 ●一次迭代的计算值的调整。 ●初始化一种算法。 ●UDF的异步执行。 ●在迭代结束后执行,退出fluent或者加载编译UDF库。 ●增强后处理。 ●增强现有的fluent模型。

udf使用心得

我接触UDF的时间不算长,2007年7月份开始看UDF的中文帮助,花了一周时间大体看完后,第一感觉:不难啊,至少不像以前别人给我讲的很高深的样子。然后就是UDF编程,直到10月底吧。然后用的时间就不多了。然后就是这两周,我马上就要研究生毕业了,可能这周结束后用UDF编程的可能性会很小了,所以想写点东西,给刚刚学UDF编程的人,希望对大家有用。对于UDF高手,估计是不用向下看了。 UDF框架 光看书,感觉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

UDF的宏用法及相关算例

7 自定义函数(UDF) 7.1,概述 用户自定义函数(User-Defined Functions,即UDFs)可以提高FLUENT程序的标准计算功能。它是用C语言书写的,有两种执行方式:interpreted型和compiled型。Interpreted型比较容易使用,但是可使用代码(C语言的函数等)和运行速度有限制。Compiled型运行速度快,而且也没有代码使用范围的限制,但使用略为繁琐。 我们可以用UDFs来定义: a)边界条件 b)源项 c)物性定义(除了比热外) d)表面和体积反应速率 e)用户自定义标量输运方程 f)离散相模型(例如体积力,拉力,源项等) g)代数滑流(algebraic slip)混合物模型(滑流速度和微粒尺寸) h)变量初始化 i)壁面热流量 j)使用用户自定义标量后处理 边界条件UDFs能够产生依赖于时间,位移和流场变量相关的边界条件。例如,我们可以定义依赖于流动时间的x方向的速度入口,或定义依赖于位置的温度边界。边界条件剖面UDFs用宏DEFINE_PROFILE定义。有关例子可以在5.1和6.1中找到。源项UDFs可以定义除了DO辐射模型之外的任意输运方程的源项。它用宏DEFINE_SOURCE 定义。有关例子在5.2和6.2中可以找到。物性UDFs可用来定义物质的物理性质,除了比热之外,其它物性参数都可以定义。例如,我们可以定义依赖于温度的粘性系数。它用宏DEFINE_PROPERTY定义,相关例子在6.3中。反应速率UDFs用来定义表面或体积反应的反应速率,分别用宏DEFINE_SR_RA TE和DEFINE_VR_RA TE定义,例子见6.4。离散相模型用宏DEFINE_DPM定义相关参数,见5.4。UDFs还可以对任意用户自定义标量的输运方程进行初始化,定义壁面热流量,或计算存贮变量值(用用户自定义标量或用户自定义内存量)使之用于后处理。相关的应用见于5.3,5.5,5.6和5.7。 UDFs有着广泛的应用,本文并不能一一叙述。如果在使用中遇到问题,可以联系FLUENT技术支部门要求帮助。在此推荐一个网站https://www.360docs.net/doc/77430715.html,,上面有FLUENT论坛,可进行相关询问和讨论。 7.1.1 书写UDFs的基本步骤 在使用UDFs处理FLUENT模型的过程中,我们一般按照下面五步进行: 1.概念上函数设计 2.使用C语言书写 3.编译调试C程序 4.执行UDF 5.分析与比较结果 第一步分析我们所处理的模型,目的是得到我们要书写的UDF的数学表达式。第二步将数学表达式转化成C语言源代码。第三步编译调试C语言源代码。第四步在FLUENT中执行UDF。最后一步,将所得到的结果与我们要求的进行比较,如果不满足要求,则需要重复上面的步骤,直到与我们期望的吻合为止。 7.1.2 Interpreted型与Compiled型比较 Compiled UDFs执行的是机器语言,这和FLUENT本身运行的方式是一样 的。一个叫做Makefile的过程能够激活C编辑器,编译我们的C语言代码,从而建立一个目标代码库,目标代码库中包含有高级C语言的低级机器语言诠释。在运行的时候,一个叫做“dynamic loading”的过程将目标代码库与FLUENT 连接。一旦连接之后,连接关系就会在case文件中与目标代码库一起保存,所以读入case文件时,FLUENT就会自动加载与目标代码库的连接。这些库的建立是基于特定计算机和特定FLUENT版本的,所以升级FLUENT版本后,就必须重新建立相应的库。 相反,Interpreted UDFs是在运行的时候直接装载编译C语言代码的。在这种情况下,生成的机器代码不依赖于计算机和FLUENT版本。编译后,函数信息将会保存在case文件中,所以读入case文件时,FLUENT也会自动加载相应的函数。Interpreted UDFs具有较强的可移植性,而且编译比较简单。对于简单的UDFs,如果对运行速度要求不高,一般就采用Interpreted型的。 下面列出的是两种UDFs的一些特性:

在64位操作系统中编译UDF

Fluent:在64位操作系统中编译UDF 2011年09月04日星期日 19:01 编译环境microsoft visual studio2010,fluent版本13.0,操作系统为windows 7 64bit。 测试代码采用UDF手册P394中关于边界条件的实例。 1、解释型 经测试,无需任何配置,甚至不需安装vs2010,也能顺利编译成功。 2、编译型 (1)按照32位系统中相同的编译方式。出现如图2所示的错误提示,这通常是编译器未正确配置的原因。 图2 错误提示 提示找不到 nmake文件,我们需要将其路径放入环境变量的path中,以便于系统搜索。 32位系统中解决办法:搜索nmake文件,将其所在路径添加至环境变量的path 中。 如图3所示,找到了两个nmake文件,我们将其路径全都加入到path中。 图3 两个nmake,其实我们只需要将第一个添加即可,但是为防万一,我们将两个路径全都加入到环境变量中 然而在64位系统中问题依旧,如图4所示。编译时找寻不到nmake文件。原因

在于我们采用的是64位系统。因此还需另寻它法。 图4 依旧的问题,可能是操作系统导致的,因为我们在cmd中可以找到nmake (2)解决方案 打开开始菜单中的visual studio 2010,我们可以看到如图5所示的菜单。找到如图所示的x64 win64命令提示,点击运行它。 图5 visual studio2010的菜单 我们需要找到fluent的真正路径,即fluent.exe所在的路径。可以找到fluent 的快捷方式,点击右键选择属性,可以看到图6所示的对话框。

相关文档
最新文档