在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之道
评论前必须登录!
注册