《FLUENT多相模型的数据结构及循环.docx》由会员分享,可在线阅读,更多相关《FLUENT多相模型的数据结构及循环.docx(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1名词解释学习FLUENT UDF编程,必须要从网格拓扑和数据结构(几何数据、求解数据存储的空间)两方 面来理解一些重要概念。节点node ;面face ;单元cellonodes线 thread :线是一块存储空间,有节点线、面线和单元线三类,存储了存在某种联系的节点组、面组或单元 组的信息。定义线的指针Thread *t;线对应的是网格拓扑里面的zone,例如某边界就是一个zone显然它对应的存储空间是面线。Domain *subdomain;real xcND_ND;/* loop over all subdomains (phases) in the superdomain (mixt
2、ure) */ sub_domain_loop(subdomain/ mixture_domainz phase_domain_index)(/* loop if secondary phase */if (DOMAINJD(subdomain) = 3)/* loop over all cell threads in the secondary phase domain */ thread_loop_c (cell_thread,subdomain)(/* loop over all cells in secondary phase cell threads */ begin_c_loop_
3、all (celLcelLthread)C_CENTROID(xczcell/cell_thread);if (sqrt(ND_SUM(pow(xc0 - 0.5,2)pow(xcl - 0.52),pow(xc2 - 0.5,2.) 线- 节点/面/单元,这可以从常用的循环中看出:Domain domain;Thread *c_thread;cell_t c; /*cell_t是线索(thread )内单元标识符的*/thread_loop_c(c_thread, domain) /*对域内所有单元线做 loop*/begin_c_loop(c, cjhread)/*对线内所有单元做循环*/
4、end_c_loop(c, c_thread)2 Multiphase-specific Data Types 多相专用数据类型除了在Data Types in ANSYS FLUENT中呈献的ANSYS FLUENT专用的数据类型,还有一些专 用于多相UDF的度thread加域domain殿据结构。当使用多相模型时(Mixture, VOF, or Eulerian), 这些数据结构用来存储混合相(mixture of all of the phases )和每个单独相的属性和变量。在多相应用中,最高级别的域是超级域(superdomain 每一相占据一个子域(subdomain )o 第三
5、种域是交互域(interactiondomam),被用于相的相互作用机制的定义。如果需要混合态属性或 变量(各相的总和),应该用超级域;而如果需要每单相(individual phase )的这些信息,则应该使 用子域。在单相模型情况(只有一相),混合相(mixture )的概念用来代表各组分(species components) 的总和;多相模型的情况,它代表各相的总和。这个区别非常重要,因为FLUENT有能力处理多相多 组分分析。这时一个相可能是多个组分的混合。因为求解信息存储在线thread数据结构中,线必须与超级域或子域联系起来。也就是说,对于每 一个在超级域中定义的单元线或面线,在
6、各子域里面都有对应有单元线或面线。有些超级域的线包含的 信息与相应的子域里的线共享。超级域内的线称为超级线,mixture-level thread ,而与子域联系的线 称为子线,phase-level thread.旦g出总结了域和线的体系结构。Figure 1.5 Domain and Thread Structure Hierarchymixture-level thread (e.g., fluid zone)mixture domain, domainjd = 1primary phase domain, domainjd = 2secondary phase domain, dom
7、ainjd = 3secondary phase domain, domainjd = 4interaction domains domainjd 5, 6, 7mixture-level thread (e.g., inlet zone)phase-level threads for inlet zone identified by phase_domain_indexProblem SetupGeneral Models MaterialsCdl Zone ConditionsBourriary ConditionsDynamc Mesh Reference ValuesSoiutjonS
8、oiuton MethodsSobtJon ControlMonitorsSoluDon ImbaiizaoonCaiculation Activities Run CakJationResultsGraphcs and Animabons PtotsReports两 Edt. |lnteractionT1 10 口PhasesPhasesFigure 1.5 弓|入了 domain_id 和 phase_domain_index 的概念。domain_id 用于将超级域与子 域区分开,超级域(mixture domain)的domain_id总是1 ,第一相对应的子域domain_id是2
9、,以 此类推,同时交互域也有domain_id。可以使用函数Domain *d=Get_Domain(domain_id)来得到 域的指针do在Phases设置面上,ID显示的就是domainjdophase_domain_index用来区分不同单相的线。第一相的phase_domain_index 0,第二相的 phase_domain_index 是 lo不同多相模型的数据结构也有不同。比如,在Mixture模型中,只求解混合相的动量方程,而在 Eulerian模型中对每一相都要求解动量方程。如果对它们指定源项数据结构式不同的。勾在(hooked t。)混合态的UDF函数,求解器为其传递超
10、级域结构;而勾在某一相的函数则获得子域结构输入。 DEFINE_ADJUST和DEFINEJNIT UDFs是固定超级域上的。其他类型的函数可以勾在不同的相域。3 Advanced Multiphase Macros 高级多相宏对于大多数多相模型的标准UDF ,函数需要的变量(域指针,线指针等)都会由求解器在求解时 直接通过参数的方式传递给函数。你所要完成的就是将这些函数勾到你的模型。但是,可能有些复杂函数需要一些没有通过参数直接传递的变量。比如,DEFINE_ADJUST ,DEFINEJNIT函数只获得了超级域的变量。如果UDF需要相域(subdomain )的指针,则需要使用 本节所述的
11、宏来获取。ON_DEMAND UDF没有获得任何参数传递,因此。n demand函数也常常要 用到这些宏。当你在编写多相模型的UDF时,必须要牢记多相模型的数据结构体系。要注意函数获得的参数, 函数勾在什么域上(GUI或者固定的X同样还有注意你使用的多相模型的类型。3.1 Phase Domain Pointer (DOMAIN_SUB_DOMAIN)相域(子域)的指针已有超级域指针的情况下,有两种方式获取子域的指针:DOMAIN_SUB_DOMAIN宏或 Get_Domainoint phase_domain_index = 0;/* 第一相的 phase_domain_index 是 0
12、*/Domain *mixture_domain;/* 超级域的指针 */Domain *subdomain = DOMAIN_SUB_DOMAIN(mixture_domainzphase_domain_index);在上面的例子中,要事先获得超级域的指针。如前文所述,某些函数勾在超级域上,求解器就会自 动传递超级域指针到UDF。而某些函数则不能显式地得到超级域的指针,则需要用宏Get_Domain(l) 来获取。3.2 Phase-Level Thread Pointer (THREAD_SUB_THREAD)相级线的指针已知超级线的指针,贝IJ可以使用THREAD_SUB_THREAD宏
13、求的其子线的指针。int phase_domain_index = 0;I*第一相的 phase_domain_index 是 0 */Thread *mixture_thread;/* 超级线的指针 */Thread *subthread = THREAD_SUB_THREAD(mixture_thread/phase_domain_index);在上面的例子中,要事先获得超级线的指针。同样,超级线的指针可能通过函数形参获取,或者使 用 Lookup_Thread 获取。int zoneJD = 2; /*通过 ZONE ID 来求的线*/Thread *thread_name = Look
14、up_Thread(domainzzoneJD);3.3 Phase Thread Pointer Array (THREAD_SUB_THREADS)子线的指针数组已知超级线的指针,可以使用THREAD_SUB_THREADS宏求得其所有子线的指针组成的数组。Thread *mixture_thread;Thread *pt; /* initialize pt */pt = THREAD_SUB_THREADS(mixture_thread);ptiL数组的一个单元是phase_domain_index为i的单相对应的子线的指针。例如,C_R(c,pti)可用于返回第i相在单元c的密度。3.
15、4 Mixture Domain Pointer (DOMAIN_SUPER_DOMAIN)超级域的指针如果已知某子域的指针,可以用宏求的它的超级域可以成为父域) 的指针。Domain *subdomain;Domain *mixture_domain = DOMAIN_SUPER_DOMAIN(subdomain);在上面的例子中,要事先获得子域(即相域)的指针。如果UDF勾在某一相域上,相域的指针也 可以由求解器自动传递给UDFO在当前版本FLUENT中,DOMAIN_SUPER_DOMAIN与 Get_Domain(l)返回的指针是一样的。但是还是建议在UDF中,尽可能使用 DOMAIN
16、_SUPER_DOMAIN ,考虑到FLUENT版本的更新,未来可能处理多个超级域。3.5 Mixture Thread Pointer (THREAD_SUPER_THREAD)超级线的指针如果已知子线的指针,可以用THREAD_SUPER_THREAD宏求超级线的指针。Thread *subthread;Thread *mixture_thread 二 THREAD_SUPER_THREAD(subthread);3.6 Domain ID (DOMAINJD)如果已知某一子域的指针,可以用DOMAIND宏获取该子域的domain_idoDomain *subdomain;int doma
17、injd = DOMAIND(subdomain);3.7 Phase Domain Index (PHASE_DOMAINJNDEX)如果已知某一子域的指针,可以用PHASE_DOMAINJNDEX宏获取该子域的 phase_domain_indexoDomain *subdomain;int phase_domain_index = PHASE_DOMAINJNDEX(subdomain);4 . Multiphase Looping Macros 多相循环宏本节讨论只在多相UDF中应用的循环。4.1 Looping Over Phase Domains in Mixture (sub_d
18、omain_loop)子域循环该循环对所有子域进行循环,这是一种获取各单相域的指针的方法之一。int phase_domain_index; /* index of subdomain pointers */Domain *mixture domain;Domain *subdomain;sub_domain_loop(subdomain, mixture_domain, phase_domainjndex)参数中,subdomain是子域的指针;mixturjdomain是超级域的指针。 例子:下面UDF分块初始化某一相的体积分数,只在求解开始执行一次。 /*UDF for initializing phase volume fraction*/#include udf.h/* domain pointer that is passed by INIT function is mixture domain */ DEFINEJNIT(my_init_function, mixture_domain)(int phase_domain_index;cell_t cell;Thread *cell_thread;