首页/文章/ 详情

Fluent UDF中的Domain与Thread

精品
作者优秀平台推荐
详细信息
文章亮点
作者优秀
优秀教师/意见领袖/博士学历/特邀专家
平台推荐
内容稀缺
1年前浏览4583

在Fluent UDF中,Domain与Thread是两个非常重要的数据类型,它们通常以指针的形式出现,在实际应用中可以通过Domain指针及Thread指针获取指定对象的数据。

1 Domain

UDF中的Domain不同于常规意义上讲的计算域,因此不能简单的认为流体域和固体域是两个不同的Domain。

在UDF中,Domain是最顶级的数据结构,可以通过Domain指针去索引其他的数据类型,例如可以通过Domain找到某边界面的Thread,再通过遍历循环找到Thread上的所有网格面以及网格节点信息。

Domain指针的获取有两种方式:利用相的ID通过Get_Domain获取,或者利用DOMAIN_SUB_DOMAIN宏通过其他相获取。

1.1 通过Get_Domain获取

在单相流模型中,只有一个唯一的Domain,可以使用Get_Domain宏直接获取指针,如下面的语句:

Domain *domain = Get_Domain(1);

在多相流中,每一相相当于一个Domain,如利用VOF模型计算油气水三相流,则计算模型中包含有4个Domain:混合相、油相、气相和水相。在获取每一相的Domain时可以采用下面的语句:

Domain *mixture_domain = Get_Domain(1); //获取混合相的Domain
Domain *oil_domain = Get_Domain(2); //获取ID为2的相的Domain
Domain *gas_domain = Get_Domain(3); //获取ID为3的相的Domain
Domain *water_domain = Get_Domain(5); //获取ID为5的相Domain

相的ID可以通过Multiphase Model对话框得到,如下图所示的主相ID为2。

 

注意:混合相的ID始终为1,主相和次相的ID号不一定连续。

若已有相的Domain指针,也可以通过Domain_ID宏获取其ID。如:

int oil_id = Domain_ID(oil_domain);

不过获取相ID好像没多大用处。

1.2 通过DOMAIN_SUB_DOMAIN获取

一些DEFINE宏的参数中包含有Domain指针,当在多相流模型中使用这些宏时,Fluent传递给宏的是混合相的Domain指针,此时可以使用DOMAIN_SUB_DOMAIN宏获取主相或次相的Domain指针。

如下面的语句可以得到主相的Domain指针:

 int phase_domain_index = 0;    /* 主相的索引为0 */
Domain *mixture_domain;
Domain *subdomain = DOMAIN_SUB_DOMAIN(mixture_domain,phase_domain_index);

DOMAIN_SUB_DOMAIN宏需要两个参数:混合相的domain指针及相索引。

混合相的domain指针由Fluent内核传递进来,相索引需要手工指定。

对于主相,其相索引为0,而次相的索引则按照Multiphase Model对话框中各相的排列顺序依次累加。如下图所示,oil为主相,其相索引为0,gas相的索引为1,water相的索引为2。

鉴于相的数量不会太多,因此相索引可以手工指定。

 

注意:相索引不同于相ID。

在UDF中,若已知各相的Domain指针,也可以通过宏DOMAIN_SUPER_DOMAIN获取混合相的指针。如:

 Domain *subdomain;
Domain *mixture_domain = DOMAIN_SUPER_DOMAIN(subdomain);

不过这个宏似乎用处不大。

2 Thread

在UDF中,Thread是使用最为频繁的数据结构,其通常以指针的形式出现。

Thread中包含有计算模型的所有信息,包括网格与物理模型等参数。与Domain类似,Thread指针的获取也有两种方式:利用Lookup_Thread宏及利用THREAD_SUB_THREAD获取。

2.1 利用Lookup_Thread宏

当知道计算区域的ID时,可以利用Lookup_Thread宏获取该区域对应的Thread指针。这里的计算区域可以是Cell Zone,也可以是边界,也可以是网格面或网格节点。如下面的程序:

int zone_ID = 2;
Thread *t = Lookup_Thread(domain,zone_ID);

此宏需要传入一个Domain指针以及区域的ID号。Domain的指针可以通过前面所述的方式获取,而区域指针则可以在GUI界面中查找,如下图所示边界bottomwall的ID为3。

也可以使用TUI命令/define/boundary-conditions/list-zones查看ID。

得到Thread指针后,就可以采用各种遍历循环进行信息获取了。

2.2 利用THREAD_SUB_THREAD获取

在多相流问题中,传入到DEFINE宏的Thread是混合相的Thread指针。此时可以通过THREAD_SUB_THREAD得到主相及次相的Thread指针。

如下面的程序:

int phase_domain_index = 0;           /* 主相的索引    */
Thread *mixture_thread;               /* 混合相的指针 */
Thread *subthread = THREAD_SUB_THREAD(mixture_thread,phase_domain_index); //得到主相的Thread指针

与Domain类似,主相的索引始终为0,次相索引按对话框中相索引依次递加。

若已知主相和次相的Thread指针,也可以通过THREAD_SUPER_THREAD获取混合相的Thread指针。如下面的代码:

 Thread *subthread;
Thread *mixture_thread = THREAD_SUPER_THREAD(subthread);

得到了Thread指针后,即可采用各种循环遍历宏进行数据获取了。

3 Domain与Thread的差异

可以把Domain想象成网格系统,单相流只有一套网格系统,因此只有一个Domain。多相流中,每一相拥有一套网格系统,因此存在多个Domain。

每一套网格系统拥有一个Thread,同时计算区域、边界、网格面、网格节点都可以拥有Thread,如果想要找到某个网格,则需要先通过Domain得到Thread,然后在Thread上进行循环遍历。对于单相流来说只有一个Domain,因此省去了通过Domain找Thread的操作,而多相流则需要在Domain上循环遍历。

可以认为Thread是Domain的下一层级,再下面就是Cell,Face以及Node。


来源:CFD之道
Fluent多相流UDF油气
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2022-10-24
最近编辑:1年前
CFD之道
博士 | 教师 探讨CFD职场生活,闲谈CFD里外
获赞 2445粉丝 10473文章 658课程 27
点赞
收藏

作者推荐

未登录
还没有评论

课程
培训
服务
行家

VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈