本文介绍Fluent UDF中一些常用的数据结构。
在Fluent UDF中,除了可以使用标准C/C++语言的数据类型外,还可以使用一些Fluent中特有的与求解器相关的数据类型(这些数据类型与计算网格有关)来定义UDF中的数据。这些数据类型定义的变量通常作为参数提供给DEFINE宏,用于访问和获取Fluent的求解数据。
一些比较常用的Fluent数据类型包括:
1、Node
结构体。用于存储与网格节点相关的数据。
2、face_t
整型数。用于标识face Thread中的特定网格面。可以将其视为网格面的编号。
3、cell_t
整型数。用于标识cell Thread中的特定网格单元。可将其视为网格单元的编号。
4、Thread
结构体。存储其所代表的网格单元或网格面的数据。在Thread数据结构中包含有一个指针数组,其中每个指针都指向一个特定场变量(如压力、速度或梯度)的网格单元值或网格面值数组。在该指针数组中,用来标识指向特定场变量(单元值或面值)数组的指针的索引为Svar类型。在多相流问题中,每一相以及Mixture相都有一个Thread结构。
5、Svar
用于标识Thread结构中存储的指针的索引。该索引变量的所有可能值都定义在文件src/storage/storage.h
中所包含的关于该类型的枚举中。需要注意有些值是使用SV_[COUPLED_],SOLUTION_VAR[_WITH_FC](...), SV_UDS_I(...) or SV_UDSI_G(...)
等宏生成的,这些值无法在枚举中直接找到。若数组中的指针值为NULL,那么表示还未分配相应场变量的内存,此时可以利用函数Alloc_Storage_Vars(domain, SV_..., ..., SV_NULL);
分配内存。利用表达式if (NULLP(THREAD_STORAGE(t, SV_...))
可以用来测试某个特定场变量的内存是否已经被分配到某个Thread上。
6、Domain
结构体。用于存储与网格节点、网格面和网格单元Thread集合相关的数据。单相流问题只有一个Domain结构;对于多相流问题,每一相、相间相互作用以及混合物都有Domain结构。
除了基本数据类型外,还有一些专门针对多相流UDF的特殊Thread及Domain数据结构。这些数据类型用于存储所有相的混合物的属性及变量,以及在使用多相流模型(Mixture、VOF或Eulerian)时存储每个独立的相的属性和变量。
在多相流应用中,顶层Domain被称为superdomain
。每个相占据一个被称为subdomain
的Domain。第三种Domain类型为相互作用Domain,其被引入以允许定义相间相互作用。当需要混合相的属性和变量时,可以利用superdomain获取信息。subdomain只存放单个相的信息,每一个相都有自己的subdomain。
求解信息存储在Thread数据结构中,Thread必须与superdomain以及每个subdomain相关联。也就是说,对于superdomain中定义的每个网格单元或网格面的Thread,每个subdomain都有一个相应的网格单元或网格面的Thread。在superdomain的一个Thread中定义的一些信息是与每个subdomain相应Thread共享的。
上图引入了domain_id和phase_domain_index的概念。domain_id可以在UDF中用来区分superdomain和主相及次相Domain。superdomain(mixture)的domain_id总是被分配为1,交互domain也用domain_id标识。domain_id不一定按顺序排列,各相的id值可以通过gui界面查看。
在UDF中,phase_domain_index可以用来区分主相和次相的phase-level thread。对于主相的phase-level Thread,其phase_domain_index总是被指定为0。
(未完待续)