FLUENT多相模型的数据结构及循环.docx
1名词解释学习FLUENT UDF编程,必须要从网格拓扑和数据结构(几何数据、求解数据存储的空间)两方 面来理解一些重要概念。节点node ;面face ;单元cellonodes线 thread :线是一块存储空间,有节点线、面线和单元线三类,存储了存在某种联系的节点组、面组或单元 组的信息。定义线的指针Thread *t;线对应的是网格拓扑里面的zone,例如某边界就是一个zone显然它对应的存储空间是面线。Domain *subdomain;real xcND_ND;/* loop over all subdomains (phases) in the superdomain (mixture) */ 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_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.) < 0.25)/* set volume fraction to 1 for centroid */C_VOF(cell,cell_thread)= 1.; else/* otherwise initialize to zero */C_VOF(cell,cell_thread) = 0.;)end_c_loop_all (cell,cell_thread)4.2 Looping Over Phase Threads in Mixture (sub_thread_loop)子线循环已知超级线的指针,对其下面的所有子线进行循环。4.3 Looping Over Phase Cell Threads in Mixture (mp_thread_loop_c)已知超级域的指针,对其中的所有单元线(这些是超级线)进行循环,并提供这些单元线的所有子线的 指针。Thread *pt;Thread *cell_threads;Domain *mixture domain;mp_thread_loop_c(cell_threads, mixture_domainz pt)4.4 Looping Over Phase Face Threads in Mixture (mp_thread_loop_f)已知超级域的指针,对其中的所有面线(这些是超级线)进行循环,并提供这些面线的所有子线的指针。Thread *pt;Thread *face_threads;Domain *mixture domain;mp_thread_loop_f(face_threads/ mixture_domain, pt)4.5 实现循环的多种方式在多相模型下,FLUENT提供了一些专门的循环方式。这时,一方面要注意通用的循环 (thread_loop_c ,thread_loop_f ,begin/end_c_loop ,begin/end_f_loop ,)是否还适合新的情况, 而另一方面,实现同一循环可能有多种方式。在多相模型中,还要区分超级线superthread和子线subthread。域 domain :域是比线更大的存储空间,包含了存在某种联系的所有线。定义域的指针Domain *d;域对应的是网格拓扑里面的domain,由网格定义的所有节点、面和单元线索的组合。在多相模型中,还要区分超级线superdomain和子线subdomain。总的逻辑关系是,域-> 线-> 节点/面/单元,这可以从常用的循环中看出:Domain "domain;Thread *c_thread;cell_t c; /*cell_t是线索(thread )内单元标识符的*/thread_loop_c(c_thread, domain) /*对域内所有单元线做 loop*/begin_c_loop(c, cjhread)/*对线内所有单元做循环*/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 第三种域是交互域(interactiondomam),被用于相的相互作用机制的定义。如果需要混合态属性或 变量(各相的总和),应该用超级域;而如果需要每单相(individual phase )的这些信息,则应该使 用子域。在单相模型情况(只有一相),混合相(mixture )的概念用来代表各组分(species components) 的总和;多相模型的情况,它代表各相的总和。这个区别非常重要,因为FLUENT有能力处理多相多 组分分析。这时一个相可能是多个组分的混合。因为求解信息存储在线thread数据结构中,线必须与超级域或子域联系起来。也就是说,对于每 一个在超级域中定义的单元线或面线,在各子域里面都有对应有单元线或面线。有些超级域的线包含的 信息与相应的子域里的线共享。超级域内的线称为超级线,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, domainjd = 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 ValuesSoiutjonSoiuton 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 ,以 此类推,同时交互域也有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函数,求解器为其传递超级域结构;而勾在某一相的函数则获得子域结构输入。 DEFINE_ADJUST和DEFINEJNIT UDFs是固定超级域上的。其他类型的函数可以勾在不同的相域。3 Advanced Multiphase Macros 高级多相宏对于大多数多相模型的标准UDF ,函数需要的变量(域指针,线指针等)都会由求解器在求解时 直接通过参数的方式传递给函数。你所要完成的就是将这些函数勾到你的模型。但是,可能有些复杂函数需要一些没有通过参数直接传递的变量。比如,DEFINE_ADJUST ,DEFINEJNIT函数只获得了超级域的变量。如果UDF需要相域(subdomain )的指针,则需要使用 本节所述的宏来获取。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 */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宏求的其子线的指针。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 = Lookup_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.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_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 domainjd = 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_domain_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;