吾生有涯 学海无涯
析模有界 知识无界

Fluent UDF中的多相流相关宏

内容纲要

本文描述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之道

赞(4) 打赏
版权声明:未经允许,请勿随意用于商业用途。
文章名称:《Fluent UDF中的多相流相关宏》
文章链接:https://www.topcfd.cn/34829/
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
分享到

说两句 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者吧

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册