本文描述Fluent UDF中多相流相关宏的使用方法。
对于大多数为多相流模型编写的大多数标准UDF(如源相、材料属性、边界分布),宏所需的变量(如Domain指针、Thread指针等)在求解过程中由求解器以参数的形式直接传递给UDF,用户所要做的只是将UDF加载到模型上即可。然而,如果要编写更复杂的UDF,而这些UDF需要一个不直接通过参数传递的变量(如向DEFINE_ADJUST和DEFINE_INIT函数传递mixture domain变量),则需要使用一些特殊的宏来获取这些变量。
1 多相流访问宏
下面介绍多相流UDF中一些用于数据访问的宏。
1.1 DOMAIN_SUB_DOMAIN
可以使用DOMAIN_SUB_DOMAIN
宏或Get_Domain
获得对mixture domain中特定相(或subdomain)指针的访问。
DOMAIN_SUB_DOMAIN
宏包含有两个参数:mixture_domain
和 phase_domain_index
。
该宏返回给定phase_domain_index
的相的subdomain指针。如下面的示例代码:
int phase_domain_index = 0; //相索引,可以通过GUI查看
Domain *mixture_domain; //混合相的Domain指针,若无传入,可以使用Get_Domain(1)获取
Domain *subdomain = DOMAIN_SUB_DOMAIN(mixture_domain,phase_domain_index);
mixture_domain是一个指向混合相domain的指针。当使用包含Domain参数的DEFINE宏(例如DEFINE_ADJUST)且UDF加载到混合相时,该指针会被Fluent求解器自动传递给UDF。若mixture_domain没有传递给UDF,则需要在调用sub_domain_loop之前使用另一个宏(如Get_Domain(1))来获取。
phase_domain_index是一个subdomain指针的索引。当使用包含相domain索引参数的DEFINE宏(DEFINE_EXCHANGE_PROPERTY, DEFINE_VECTOR_EXCHANGE_PROPERTY),并且UDF加载到指定的相时,phase_domain_index会被求解器自动传递给UDF。
否则需要对DOMAIN_SUB_DOMAIN宏中的phase_domain_index的整数值进行硬编码。如果多相流模型只定义了两个相,那么phase_domain_index对于主相为0,对于次相为1。然而如果多相流模型定义了多个次相,则需要使用PHASE_DOMAIN_INDEX
工具来检索给定domain相应的phase_domain_index。
1.2 THREAD_SUB_THREAD
THREAD_SUB_THREAD
宏可以用来索引给定phase_domain_index的subthread指针。THREAD_SUB_THREAD包括两个参数:mixure_thread与phase_domain_index。
该函数返回给定phase_domain_index的phase-level thread指针。注意THREAD_SUB_THREAD在实现上与DOMAIN_SUB_DOMAIN宏类似。
int phase_domain_index = 0; //主相索引为0
Thread *mixture_thread; //混合相thread指针
Thread *subthread = THREAD_SUB_THREAD(mixture_thread,phase_domain_index);
mixture_thread是一个指向mixture-level thread的指针。当使用包含thread参数的DEFINE宏(例如DEFINE_PROFILE)且该函数被加载到mixture相上时,求解器会自动将其自动传递给UDF。否则,若mixture thread指针没有显式传递给UDF,则需要使用Lookup_Thread
宏来获取该指针。
phase_domain_index为subdomain指针的索引。其为一个整数,0开始表示主相,每个次相递增1。当使用包含phase_domain_index参数的DEFINE宏(如DEFINE_EXCHANGE_PROPERTY、DEFINE_VECTOR_EXCHANGE_PROPERTY等)且将UDF加载到特定相时, 求解器会自动将phase_domain_index传递给UDF。若多相流模型仅定义了两相,则主相的phase_domain_index为0,次相为1。但若多相流模型定义了多个次相,则需要使用PHASE_DOMAIN_INDEX
宏获取给定domain的相应phase_domain_index。
1.3 THREAD_SUB_THREADS
THREAD_SUB_THREADS
宏可以用来获取一个包含指向相thread(subthread)的指针数组pt。该宏包含一个参数:mixed_thread。
其基本调用形式为:
Thread *mixture_thread;
Thread **pt;
pt = THREAD_SUB_THREADS(mixture_thread);
mixture_thread是一个指向mixture级别的thread指针,其可以代表一个网格thread或一个网格面thread。当使用包含thread变量参数的DEFINE宏(如DEFINE_PROFILE),且该UDF加载到mixture相时,其被Fluent求解器自动传递给UDF。若mixture thread指针没有显式地传递UDF,则需要使用其他方法(如利用Lookup_Thread宏)来获取。
pt[i]是数组中的一个元素,其指向第i相的相应phase-level thread的指针,其中i为phase_domain_index。当想要获取某个网格单元的特定相的信息时,可以使用pt[i]作为一些网格变量宏的参数,如利用C_R(c,pt[i])可以返回网格单元c的第i相流体的密度。
指针pt[i]也可以使用THREAD_SUB_THREAD(mixture_thread, i)
来获取。
1.4 DOMAIN_SUPER_DOMAIN
当UDF可以访问一个特定的subdomain指针时,可以使用DOMAIN_SUPER_DOMAIN
得到mixture-level的domain指针。DOMAIN_SUPER_DOMAIN有一个参数:subdomain。DOMAIN_SUPER_DOMAIN在实现上类似于THREAD_SUPER_THREAD宏。
基本使用形式:
Domain *subdomain;
Domain *mixture_domain = DOMAIN_SUPER_DOMAIN(subdomain);
subdomain是一个指向多相流的phase-level domain的指针。当使用包含域变量参数的DEFINE宏(例如DEFINE_ADJUST),并且该函数加载到主相或次相时,其会被Fluent求解器自动传递给UDF。
注意:在当前版本的Fluent中,DOMAIN_SUPER_DOMAIN将返回与
Get_Domain(1)
相同的指针。因此如果UDF中有一个subdomain指针,建议使用DOMAIN_SUPER_DOMAIN宏,而不是Get_Domain宏,以避免与Fluent未来版本存在兼容性的问题。”
1.5 THREAD_SUPER_THREAD
当UDF可以访问一个特定的phase-level thread(subthread)指针,可以使用THREAD_SUPER_THREAD
宏获取mixture-level thread指针。THREAD_SUPER_THREAD有一个参数:subthread。
基本使用形式为:
Thread *subthread;
Thread *mixture_thread = THREAD_SUPER_THREAD(subthread);
subthread是一个指向多相流中特定phase-level thread的指针。当使用包含thread变量参数的DEFINE宏(如DEFINE_PROFILE),且该函数加载到主相或次相上时,Fluent求解器会自动将subthread传递给UDF。
1.6 DOMAIN_ID
可以使用DOMAIN_ID
宏获取给定phase-level domain指针所对应的domain_id。DOMAIN_ID有一个参数,即subdomain,其是一个phase-level domain的指针。顶级域(mixture)的默认domain_id值为1,也就是说,如果传递给DOMAIN_ID的domain指针是mixture_level的domain指针,那么该函数将返回1。
注意:该宏返回的domain_id与Fluent的Phases对话框中显示的相的ID相同。
”
1.7 PHASE_DOMAIN_INDEX
可以利用PHASE_DOMAIN_INDEX
宏获取一个给定的phase-level domain(subdomain)指针的phase_domain_index。PHASE_DOMAIN_INDEX有一个参数,即subdomain,其是一个phase-level domain指针。phase_domain_index是subdomain指针的索引,其为一个整数,对于主相从0开始,对于每个次相递增1。
Domain *subdomain;
int phase_domain_index = PHASE_DOMAIN_INDEX(subdomain);
2 多相流循环宏
此处描述的循环宏只用于多相流的UDF中。
2.1 sub_domain_loop
sub_domain_loop宏在mixture domain中的所有相domain(subdomain)上循环。该宏遍历并提供在mixture domain中定义的每个相的domain指针,以及相应的phase_domain_index。
基本应用形式:
int phase_domain_index;
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 domain的指针,mixture_domain是一个指向mixture domain的指针。当使用包含domain变量参数的DEFINE宏(例如DEFINE_ADJUST),并且UDF加载到mixture相时,Fluent求解器会自动将 mixture_domain传递给UDF。若mixture_domain 没有明确地传递给UDF,则需要在调用sub_domain_loop 之前使用其它的宏(如Get_Domain(1))来获取它。
phase_domain_index 是subdomain指针的索引。主相的phase_domain_index为0,次相索引值依次递增。注意,subdomain和phase_domain_index是在sub_domain_loop宏中设置的。
下面是一个简单的示例,用于体积分数的初始化。
#include "udf.h"
DEFINE_INIT(my_init_function, mixture_domain)
{
int phase_domain_index;
cell_t cell;
Thread *cell_thread;
Domain *subdomain;
real xc[ND_ND];
// 在superdomain(mixture)上循环遍历所有的subdomain(phases)
sub_domain_loop(subdomain, mixture_domain, phase_domain_index)
{
/* 若phase的ID为3 */
if (DOMAIN_ID(subdomain) == 3)
/* 遍历次相上的所有网格Thread */
thread_loop_c(cell_thread, subdomain)
{
/* 在次相thread上遍历网格 */
begin_c_loop_all(cell, cell_thread)
{
C_CENTROID(xc, cell, cell_thread);
if (sqrt(ND_SUM(pow(xc[0] - 0.5, 2.),
pow(xc[1] - 0.5, 2.),
pow(xc[2] - 0.5, 2.))) < 0.25)
/* 设置体积分数为1 */
C_VOF(cell, cell_thread) = 1.;
else
/* 设置体积分数为零 */
C_VOF(cell, cell_thread) = 0.;
}
end_c_loop_all(cell, cell_thread)
}
}
}
2.2 sub_thread_loop
sub_thread_loop宏在与一个mixture thread相关的所有phase thread(subthread)上循环。该宏循环并返回每个subthread的指针以及相应的phase_domain_index。
int phase_domain_index;
Thread *subthread;
Thread *mixture_thread;
sub_thread_loop(subthread, mixture_thread, phase_domain_index)
{
//循环操作
}
sub_thread_loop包括三个参数:subthread、mixual_thread和phase_domain_index。subthread是一个phase thread的指针,mixture_thread是一个mixture thread指针。
当使用包含线程变量参数的DEFINE宏(例如DEFINE_PROFILE),并且UDF加载到混合相时,Fluent求解器会自动将 mixture_thread传递给UDF。如果mixture thread没有显式地传递给UDF,则需要在调用sub_thread_loop之前获取该变量。
phase_domain_index是一个subdomain指针的索引,可以使用PHASE_DOMAIN_INDEX
宏来获取,其中0代表主相,次相递增1。
注意:subthread和phase_domain_index在sub_thread_loop宏定义中被初始化。
”
2.3 mp_thread_loop_c
mp_thread_loop_c宏在mixture domain中循环所有的cell domain(在mixture level),并提供与每个mixture-level thread相关的相(单元)的thread指针。这与应用于mixture domain的thread_loop_c宏几乎完全相同。不同的是,除了在每个网格thread中步进外,该宏还返回一个指针数组(pt),用于标识相应的相的thread。第i相的cell thread的指针为pt[i],其中i为phase_domain_index。
pt[i]可以作为需要phase-level thread指针的宏的参数。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、mixed_domain和pt。其中cell_threads是一个指向网格thread的指针,mixed_domain是一个指向mixture-level domain的指针。pt是一个数组指针,其元素包含指向格相thread的指针。
当使用包含domain变量参数的DEFINE宏(例如DEFINE_ADJUST),并且UDF加载到mixture相上时,Fluent求解器自动将mixture_domain传递给UDF。若mixture_domain 没有被显式地传递给UDF,则需要使用UDF宏(如Get_Domain(1))来获取。注意pt和cell_threads的值是在循环函数中设置的。
mp_thread_loop_c通常与begin_c_loop一起使用。begin_c_loop在一个网格thread中对网格进行循环。当begin_c_loop嵌套在mp_thread_loop_c中时,可以在一个mixture物中的所有相网格thread中的所有网格单元上循环。
2.4 mp_thread_loop_f
mp_thread_loop_f宏在mixture domain内循环遍历所有的网格面thread(在mixture-level上),并提供与每个mixture-level thread相关的phase-level(网格面)thread的指针。这与应用于mixture domain的thread_loop_f宏几乎相同。
不同的是,除了通过每个面thread的步进,该宏还返回一个指针数组(pt),用于识别相应的phase-level thread。第i相的网格面thread的指针为pt[i],其中i为phase_domain_index。pt[i]可以作为需要phase-level thread指针的宏的参数使用,其值可以使用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、mixed_domain和pt。其中face_threads是一个指向网格面thread的指针,mixed_domain是一个指向mixture-level domain的指针。pt是一个数组指针,其元素包含指向格相thread的指针。
当使用包含domain变量参数的DEFINE宏(例如DEFINE_ADJUST),并且UDF加载到mixture相上时,Fluent求解器自动将mixture_domain传递给UDF。若mixture_domain 没有被显式地传递给UDF,则需要使用UDF宏(如Get_Domain(1))来获取。注意pt和cell_threads的值是在循环函数中设置的。
mp_thread_loop_f通常与begin_f_loop一起使用。begin_f_loop在一个网格面thread中对网格面进行循环。当begin_f_loop嵌套在mp_thread_loop_f中时,可以在一个mixture物中的所有相网格面thread中的所有网格面上循环。
(完)
本篇文章来源于微信公众号: CFD之道
评论前必须登录!
注册