首页 理论教育 UDF实用工具宏:提高Excel工作效率的必备利器

UDF实用工具宏:提高Excel工作效率的必备利器

时间:2023-06-20 理论教育 版权反馈
【摘要】:FLUENT公司提供了针对FLUENT软件中的变量操作的一系列工具。这些工具中大部分可以作为宏直接执行。这个宏用于合并两个面线。当使用DEFINE宏时,mixture_domain通过FLUENT软件中的求解器自动传递UDF,混合物就和UDF相关了。这个宏运行并将指针返回每个子线程及相关的phase_domain_index。如果mixture_thread没有显式地传递给UDF,则需要在调用sub_thread_loop之前,调用工具宏恢复它。phase_domain_index是子区指针索引号,可以用phase_domain_index宏恢复。

UDF实用工具宏:提高Excel工作效率的必备利器

FLUENT公司提供了针对FLUENT软件中的变量操作的一系列工具。这些工具中大部分可以作为宏直接执行。

1.一般目的的循环宏

一般目的的循环宏主要完成基本的查询,可以用于FLUENT软件中单相和多相模型的UDF中。

(1)查询控制区的单元线 可以用thread_loop_c查询给定控制区的单元线。它包含单独的说明,后面是对控制区的单元线所做操作,包含在{}中。

978-7-111-36022-3-Chapter06-20.jpg

注意

thread_loop_c在执行上和thread_loop_f相似。

(2)查询控制区的面 可以用thread_loop_f查询给定控制区的面。它包含单独的说明,后面是对控制区的面单元所做操作,包含在{}中。注意,thread_loop_f在执行上和thread_loop_c相似。

978-7-111-36022-3-Chapter06-21.jpg

978-7-111-36022-3-Chapter06-22.jpg

(3)查询单元线中的单元 可以用begin_c_loop和end_c_loop查询给定单元线c_thread上所有的单元。它包含begin和end loop的说明,其定义包含在{}中,可对单元线中的单元进行操作。当需要查找控制区单元线的单元时,应用的loop全部嵌套在thread_loop_c中。

978-7-111-36022-3-Chapter06-23.jpg

(4)查询面线中的面 可以用begin_f_loop和end_f_loop查找给定面线f_thread的所有的面。它包含begin和end loop的说明,其定义包含在{}中,可对面线中的面单元进行操作。当查找控制区面线的所有面时,应用的loop嵌套在thread_loop_f中。

978-7-111-36022-3-Chapter06-24.jpg

(5)查询单元中的面 下面函数用于查询给定单元中所有面。它包含单独的查询说明,后面是所做的操作,包含在{}中。

978-7-111-36022-3-Chapter06-25.jpg

这里,n是本地-面的索引号。本地-面的索引号用在C_FACE宏中以获得所有面的数量。

另一个在c_face_loop中有用的宏是C_FACE_THREAD。这个宏用于合并两个面线。

(6)查询单元节点 可以用c_node_loop查询单元节点。下面函数用于查询给定单元中所有节点,包含单独的查询说明,后面是所做的操作,包含在{}中。

cell_t c;

Thread*t;

int n;

c_node_loop(c,t,n)

978-7-111-36022-3-Chapter06-26.jpg

这里,n是本地节点的索引号。本地-面的索引号用在C_NODE宏中以获得所有面的数量。

2.多相组分查询宏

多相组分查询宏用于多相模型的UDF中。

(1)查询混合物中相的控制区sub_domain_loop宏用于查询混合物控制区的所有相的子区。这个宏查询并在混合物控制区给每个相区定义指针以及相关的phase_domain_index。注意,sub_domain_loop宏在执行中和sub_thread_loop宏相似。

int phase_domain_index;*/index of subdomain pointers*/

Domain*mixture_domain;

Domain*subdomain;

sub_domain_loop(subdomain,mixture_domain,phase_domain_index)

sub_domain_loop宏的变量是subdomain、mixture_domain和phase_domain_index。

subdomain是phase-level domain的指针,mixture_domain是mixture-level domain的指针。当使用DEFINE宏时,mixture_domain(包含控制区变量e.g.,DEFINE_ADJUST)通过FLUENT软件中的求解器自动传递UDF,混合物就和UDF相关了。如果mixture_domain没有显式地传递给UDF,则使用另外一个宏来恢复它。phase_domain_index是子区指针索引号,phase_domain_index是初始相的索引号,用0表示,混合物中其他的相依次加1。

注意

subdomain和phase_domain_index是在sub_domain_loop宏定义中初始化的。

(2)查询混合物的相线sub_thread_loop宏在所有与混合线程相关的子线程上循环。这个宏运行并将指针返回每个子线程及相关的phase_domain_index。如果subthread指针与入口区域相关,那么这个宏将提供给入口区域每个相面线指针。

int phase_domain_index;

Thread*subthread;

Thread*mixture_thread;

sub_thread_loop(subthread,mixture_thread,phase_domain_index)

sub_thread_loop宏的自变量是subthread、mixture_thread和phase_domain_index。

subthread是相线的指针,mixture_thread是mixture-level thread的指针。当使用DEFINE宏(包含一个线自变量)时,通过FLUENT软件中的求解器mixture_thread自动传递给UDF,UDF就和混合物相关了。如果mixture_thread没有显式地传递给UDF,则需要在调用sub_thread_loop之前,调用工具宏恢复它。phase_domain_index是子区指针索引号,可以用phase_domain_index宏恢复。初始相的索引号为0,混合物中其他相依次加1。

注意

subthread和phase_domain_index在sub_thread_loop宏定义中被初始化。

(3)查询混合物中所有单元的线mp_thread_loop_c宏在混合域内所有的单元线程中循环,并提供了与每个混合线程相关的子线程的指针。当在混合域使用时,该宏几乎和thread_loop_c宏是等价的。不同在于,除了运行每个单元线程外,该宏也会返回一个与相关子线程等价的指针数组(pt)。单元线第i相的指针是pt[i],这里i是相控制区索引号phase_domain_index。pt[i]可以用做宏的自变量,需要相等值线的指针。相控制区索引号phase_domain_index可以用phase_domain_index宏恢复。

Thread**pt;

Thread*cell_threads;

Domain*mixture_domain;

mp_thread_loop_c(cell_threads,mixture_domain,pt)

mp_thread_loop_c宏的自变量是cell_threads、mixture_domain和pt。cell_threads是网格线的指针,mixture_domain是mixture-level domain的指针,pt是含有phase-level的指针数组。当用包含控制区变量(e.g.,DEFINE_ADJUST)的宏DEFINE时,mixture_domain通过FLUENT软件中的求解器自动传递给UDF文件,UDF就和混合物相关了。如果mixture_domain没有显式地传递给UDF文件,则应用另外一个工具e.g.,Get_Domain(1)来恢复。注意,pt和cell_threads的值是由查询函数派生出来的。mp_thread_loop_c是典型的用于begin_c_loop中,begin_c_loop查询网格线内的所有网格。当begin_c_loop嵌套在mp_thread_loop_c中,就可以查询混合物中相单元线的所有网格了。

(4)查询混合物中所有的相面线mp_thread_loop_f宏查询混合物控制区内所有混合物等值线的面线并且给每个与混合物等值线有关的相等值线指针。在混合物控制区内mp_thread_loop_f宏和thread_loop_f宏几乎是等价的。区别是:除了查找每一个面线,这个宏还返回一个指针数组pt,它与相等值线相互关联。指向第i相的面线指针是pt[i],这里i是相控制区索引号phase_domain_index。当需要相等值线指针时,pt[i]可以作为宏的自变量。phase_domain_index可以用phase_domain_index宏恢复。

Thread**pt;

Thread*face_threads;

Domain*mixture_domain;

mp_thread_loop_f(face_threads,mixture_domain,pt)

mp_thread_loop_f宏的自变量是face_threads、mixture_domain和pt。face_threads是面线的指针,mixture_domain是mixture_level domain的指针,pt是含有phase-level的指针数组。

当用包含控制区变量(e.g.,DEFINE_ADJUST)的宏DEFINE时,mixture_domain通过FLUENT软件中的求解器自动传递给UDF文件,UDF就和混合物相关了。如果mixture_ domain没有显式地传递给UDF文件,则应用另外一个工具e.g.,Get_Domain(1)来恢复。

注意

pt和cell_threads的值是由查询函数派生出来的。mp_thread_loop_f宏是典型的用于begin_f_loop宏中。begin_f_loop宏查询网格线内的所有网格。当begin_f_loop宏嵌套在mp_thread_loop_f宏中,就可以查询混合物中相单元线的所有网格。

3.设置面变量的宏

当设置面变量的值时,可应用F_PROFILE宏。当生成边界条件的外形或存储新的变量值时,自动调用这一函数。

F_PROFILE(f,t,n)

F_PROFILE宏的自变量是f,面的索引号是face_t,t面上线的指针还有一个整数n。这些变量通过FLUENT软件中的求解器自动传递给UDF,不需要赋值。整数n是在边界上设定的变量标志符。例如,进口边界包含总压和总温,二者都在用户定义函数中定义。进口边界的变量在FLUENT软件中赋予整数0,其他赋予1。当在FLUENT软件中的进口边界面板中定义边界条件时,这些整数值由求解器设定。

4.访问没有赋值的自变量的宏

针对单相和多相的模型(如定义源项、性质和外形),大多数标准的UDF在求解过程中通过求解器自动作为自变量直接传递给UDF。然而,并非所有的UDF都直接把函数所需要的自变量传递给求解器。例如,DEFINE_ADJUST宏和DEFINE_INIT UDFs宏传递给混合物控制区变量,这里DEFINE_ON_DEMAND UDFs是没有被传递的自变量。下面提供了通过DEFINE函数访问没有被直接传递给UDF文件的工具。

(1)Get_Domain若控制区指针没有显式地作为自变量传递给UDF,则可以用Get_ Domain宏恢复控制区指针。

Get_Domain(domain_id);

domain_id是一个整数,混合物控制区其值为1,在多相混合物模型中其值依次加1。

在单相流中,domain_id为1,Get_Domain(1)将放回流体控制区指针。

978-7-111-36022-3-Chapter06-27.jpg

在多相流中,Get_Domain的返回值或者是混合物等值线,或单相等值线,或相等值线或相等值线控制区指针。domain_id的值在混合物控制区始终是1,可以用FLUENT软件中的图形用户界面获得domain_id。

978-7-111-36022-3-Chapter06-28.jpg

(2)通过相控制区索引号使用相控制区指针 有两个方法可以获得混合物控制区具体相(或子区)的指针。

1)用DOMAIN_SUB_DOMAIN宏。

2)Get_Domain。

DOMAIN_SUB_DOMAIN宏有两个自变量:mixture_domain和phase_domain_index。这个函数返回给定phase_domain_index的相指针。

注意

DOMAIN_SUB_DOMAIN宏在执行上和THREAD_SUB_THREAD宏相似。

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

Domain*mixture_domain;

Domain*subdomain=DOMAIN_SUB_DOMAIN(mixture_domain,phase_domain_index);

mixture_domain是mixture-level domain的指针。

当用包含控制区自变量(如DEFINE_ADJUST)and的DEFINE宏时,自动通过FLUENT软件中的求解器传递给UDF文件,UDF文件就和混合物相关联了。否则,如果mixture_domain没有显式地传递给UDF,就需要在调用sub_domain_loop宏之前,用其他宏工具来恢复(如Get_Domain(1))。

phase_domain_index是子区指针的索引号。它是一个整数,初始相值为0,以后每相依次加1。当用包含相控制区变量(DEFINE_EXCHANGE_PROPERTY,DEFINE_VECTOR_ EXCHANGE_PROPERTY)的DEFINE宏时,phase_domain_index自动通过FLUENT软件中的求解器传递给UDF,UDF就和互相作用的相关联了。否则,需要用硬代码调用DOMAIN_SUB_DOMAIN宏给phase_domain_index指针赋值。如果多相流模型有两相,则phase_domain_index初始相的值是0,第二相的值为1。然而,如果多相流模型中有更多的相,就需要用PHASE_DOMAIN_INDEX宏来恢复与给定控制区的phase_domain_index。

(3)通过相控制区索引号使用相等值线指针THREAD_SUB_THREAD宏可以用来恢复给定相控制区索引号的phase-level thread(subthread)指针。THREAD_SUB_THREAD宏有两个自变量:mixture_thread和phase_domain_index。这一函数返回给定phase_domain_ index的phase-level线指针。

注意

THREAD_SUB_THREAD宏在执行上与DOMAIN_SUB_DOMAIN宏相似。

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是mixture-level线的指针。当使用包含控制区自变量(如DEFINE_PROFILE)和DEFINE宏时,就会自动通过FLUENT软件中的求解器传递给UDF文件,UDF文件就和混合物相关联了。否则,如果混合物控制线指针没有显式地传递给UDF,就需要在调用Lookup_Thread宏之前,用另外一个宏工具来恢复(如Get_Domain(1))。

phase_domain_index是子区指针的索引号。它是一个整数,初始相值为0,以后每相依次加1。当使用包含相控制区索引号变量(DEFINE_EXCHANGE_PROPERTY,DEFINE_ VECTOR_EXCHANGE_PROPERTY)的DEFINE宏时,phase_domain_index通过FLUENT软件中的求解器自动传递给UDF,UDF就和具体的相互作用相互关联了。否则,就需要用硬代码改变宏THREAD_SUB_THREAD的phase_domain_index值。如果多相流模型中只有两相,那么phase_domain_index对初始相是0,第二个相为1。然而,如果有更多的相,就需要用PHASE_DOMAIN_INDEX宏来恢复与给定区域相关的phase_domain_index。

(4)通过混合物等值线使用相线指针数组THREAD_SUB_THREADS宏可以用于恢复指针数组pt,它的元素包含相等值线(子线)的指针。THREADS_SUB_THREADS宏有一个变量mixture_thread。

Thread*mixture_thread;

Thread**pt;/*initialize pt*/(www.xing528.com)

pt=THREAD_SUB_THREADS(mixture_thread);

mixture_thread是mixture-level thread代表网格线或面线的指针。当用包含线变量DEFINE宏时,就会通过FLUENT软件中的求解器自动传递给UDF,这个函数就和混合物相关联了。否则,如果混合物线的指针没有显式地传递给UDF,就需要用令一个方法来恢复。

pt[i]数组的元素是与第I相的相等值线有关的值,这里i是phase_domain_index。当要恢复网格具体相的信息时,可以用pt[i]作为一些网格变量宏的自变量。指针pt[i]可以用THREAD_SUB_THREAD宏来恢复,用I作为自变量。phase_domain_index可以用PHASE_ DOMAIN_INDEX宏来恢复。

(5)通过相控制区指针调用混合物控制区指针 当UDF有权访问特殊的相等值线(子区)指针时,可以用DOMAIN_SUPER_DOMAIN宏恢复混合物等值线控制区指针。DOMAIN_ SUPER_DOMAIN宏含有一个变量subdomain。

注意

DOMAIN_SUPER_DOMAIN宏在执行上和THREAD_SUPER_THREAD宏非常相似。 Domain*subdomain;Domain*mixture_domain=DOMAIN_SUPER_DOMAIN(subdomain);

subdomain是多相流混合物控制区相等值线的指针。当用包含控制区变量DEFINE宏时,通过FLUENT软件中的求解器,它可以自动传递给UDF文件,这个函数就会和混合物中的第一相和第二相相关联了。

注意

在FLUENT6.3版本中,DOMAIN_SUPER_DOMAIN宏将返回与Get_ Domain(1)相同的指针。这样,如果UDF可以使用子区的指针,建议使用DOMAIN_SUPER_DOMAIN宏来代替Get_Domain宏以避免将来的FLUENT版本造成不兼容问题。

(6)通过相线指针使用混合物线指针 当UDF有权访问某一条相线子线指针,而想恢复混合物的等值线指针时,可以使用THREAD_SUPER_THREAD宏。THREAD_SUPER_ THREAD宏有一个自变量subthread。

Thread*subthread;

Thread*mixture_thread=THREAD_SUPER_THREAD(subthread);

subthread在多相流混合物中是一个特殊的相等值线指针。当用包含线变量DEFINE宏时,通过FLUENT软件中的求解器,它自动传递给UDF文件,这个函数就和混合物中的两相相互关联了。

(7)通过区的ID使用线指针 当要在FLUENT软件的边界条件面板中恢复与给定区域ID的线指针时,可以使用Lookup_Thread宏。UDF还可以使用Lookup_Thread宏来获得指针。这一过程分两步:首先,从FLUENT软件的边界条件面板中导入区域的ID;然后,使用硬代码作为自变量调用Lookup_Thread宏。Lookup_Thread宏返回与给定区域ID相关的线的指针。可以将线指针赋给thread_name,在UDF中使用。

int zone_ID;

Thread*thread_name=Lookup_Thread(domain,zone_ID);

在多相流的上下文中,通过Lookup_Thread宏返回的线是与控制区自变量相关的相的等值线。(8)使用相的控制区指针 当有权访问与给定相等值线控制区指针的domain_id时,可以使用DOMAIN_ID宏。DOMAIN_ID宏有一个自变量subdomain,它是相等值线控制区的指针。控制区(混合物)的最大的等值线的domain_id的默认值是1,即如果被传递给DOMAIN_ID宏的控制区指针是混合物控制区的等值线指针,那么函数的返回值为1。

注意

当在FLUENT软件的相面板中选择需要的相时,宏所返回的domain_id 是和显示在图形用户界面中的整数值ID是相同的。

Domain*subdomain;

int domain_id=DOMAIN_ID(subdomain);

(9)通过相控制区使用相控制区索引号PHASE_DOMAIN_INDEX宏返回给定相等值线控制区(子区)指针的phase_domain_index。PHASE_DOMAIN_INDEX宏有一个自变量subdomain,它是phase-level domain的指针。phase_domain_index是子区指针的索引号。初始相的值为整数0,以后每相依次加1。

Domain*subdomain;

int phase_domain_index=PHASE_DOMAIN_INDEX(subdomain);

5.访问邻近网格和线的变量

可以用Fluent Inc.提供的宏来确定邻近网格面。在复杂的UDF文件中,当查询特定网格或线的面时,可能会用到这个信息。对给定的面f和它的线tf,两个相邻的网格点为c0和c1。如果是控制区附面层上的面,则只有c0、c1的值为NULL。一般的,当把网格导入到FLUENT软件中时,按照右手定则定义面上节点的顺序,面f上的网格点c0、c1都存在。下面是宏返回网格点c0和c1的ID和所在的线。

cell_t c0=F_C0(f,tf);/*returns ID for c0*/

tc0=THREAD_T0(tf);/*returns the cell thread for c0*/

cell_t c1=F_C1(f,tf);/*returns ID for c1*/

tc1=THREAD_T1(tf);/*returns the cell thread for c1*/

宏与F_AREA和F_FLUX返回的信息是直接相关的,这些值从网格c0到c1返回正值。

6.为网格定义内存

为了存储、恢复由UDF网格区域变量的值,可以用C_UDMI函数分配500个单元。这些值可以用做后处理。例如,通过其他的UDFs。这个在用户定义内存中存储变量的方法比用户定义标量(C_UDSI)更有效。 C_UDMI(c,thread,index)

C_UDMI有3个自变量:c、thread和index。c是网格标志符号,thread是网格线指针,index是识别数据内存分配的。与索引号0相关的用户定义的内存区域为0(或udm-0)。在在内存中存放变量之前,首先需要在FLUENT软件的User-Defined Memory面板中分配内存。

7.矢量工具

FLUENT软件提供了一些工具,可以用来在UDF中计算有关矢量的量。这些工具在源程序中以宏的形式运行。例如,可以用实函数NV_MAG(V)计算矢量V的大小(模)。另外,可以用函数NV_MAG2(V)获得矢量V模的平方。在矢量工具宏中有个约定俗成的惯例,V代表矢量,S代表标量,D代表一系列三维的矢量,最后一项在二维计算中被忽略。

在矢量函数中约定的计算顺序,即括号、指数、乘除、加减(PEMDAS)不再适用。相反下画线符号(_)用来表示一组操作数,因此对元素的操作先于形成一个矢量。注意,这部分所有的矢量工具都用在D和3D中。因此,没有必要在UDF中做任何的测试。

(1)NV_MAG:计算矢量的大小,即矢量二次方和的二次方根。

NV_MAG(x)

2D:sqrt(x[0]*x[0]+x[1]*x[1]);

3D:sqrt(x[0]*x[0]+x[1]*x[1]+x[2]*x[2]);

(2)NV_MAG2:计算矢量的二次方和。

NV_MAG2(x)

2D:(x[0]*x[0]+x[1]*x[1]);

3D:(x[0]*x[0]+x[1]*x[1]+x[2]*x[2]);

(3)ND_ND:在RP_2D(FLUENT 2D)和RP_3D(FLUENT 3D)中,常数ND_ND定义为2。如果要在2D中建立一个矩阵,或在3D中建立一个矩阵,则可以用到它。

real A[ND_ND][ND_ND]

for(i=0;i<ND_ND;++i)for(j=0;J<ND_ND;++j)

A[i][j]=f(i,j);

(4)ND_SUM:计算ND_ND的和。

ND_SUM(x,y,z)

2D:x+y;

3D:x+y+z;

(5)ND_SET:产生ND_ND任务说明。

ND_SET(u,v,w,C_U(c,t),C_V(c,t),C_W(c,t))

u=C_U(c,t);

v=C_V(c,t);

if 3D:

w=C_W(c,t);

(6)NV_V:完成对两个矢量的操作。

NV_V(a,=,x);

a[0]=x[0];a[1]=x[1];etc.

注意

如果在上面的方程中用+=代替=,将得到a[0]+=x[0];等语句。

(7)NV_VV:完成对矢量的基本操作。在下面的宏调用中,这些操作用符号(−,/,*)代替。

NV_VV(a,=,x,+,y)

2D:a[0]=x[0]+y[0],a[1]=x[1]+y[1];

(8)NV_VS_VS:用来把两个矢量相加(后一项都乘以一个常数)。

NV_V_VS(a,=,x,+,y,*,0.5);

2D:a[0]=x[0]+(y[0]*0.5),a[1]=x[1]+(y[1]*0.5);

注意

符号+可以换成−,*或/,符号*可以替换成/。

(9)NV_VS_VS:用来把两个矢量相加(每一项都乘以一个常数)。

NV_VS_VS(a,=,x,*,2.0,+,y,*,0.5);

2D:a[0]=(x[0]*2.0)+(y[0]*0.5),a[1]=(x[1]*2.0)+(y[1]*0.5);

注意

符号+可以换成−,*或/,符号*可以替换成/。

(10)ND_DOT:计算两个矢量的点积。

ND_DOT(x,y,z,u,v,w)

2D:(x*u+y*v);

3D:(x*u+y*v+z*w);

NV_DOT(x,u)

2D:(x[0]*u[0]+x[1]*u[1]);

3D:(x[0]*u[0]+x[1]*u[1]+x[2]*u[2]);

NVD_DOT(x,u,v,w)

2D:(x[0]*u+x[1]*v);

3D:(x[0]*u+x[1]*v+x[2]*w);

8.与非定常数值模拟有关的宏

用RP变量宏有权访问UDF中非定常的变量。例如,UDF可以利用RP_Get_Real宏获得流动时间。

real current_time;

current_time=RP_Get_Real("flow-time");

表6-17是在每个时间步长处理时间信息的RP宏列表。

表6-17 RP宏列表

978-7-111-36022-3-Chapter06-29.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈