最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

udf 中文手冊(cè) ANSYS FLUNT (3)

2023-04-04 17:20 作者:0牙膏0  | 我要投稿

UDF 第3寫UDF

(翻譯不易,辛苦點(diǎn)贊)

本章主要概述了如何在FLUENT寫UDF。

3.1 概述

3.2寫解釋式UDF的限制

3.3 FLUENT中UDF求解過(guò)程的順序

3.4 FLUENT網(wǎng)格拓?fù)?/p>

3.5 FLUENT數(shù)據(jù)類型

3.6 使用DEFINE Macros定義你的UDF

3.7在你的UDF源文件中包含udf.h文件

3.8 定義你的函數(shù)中的變量

3.9函數(shù)體

3.10 UDF 任務(wù)

3.11 為多相流應(yīng)用寫UDF

3.12在并行中使用你的UDF

3.1概述(Introduction

?

UDF是用來(lái)增強(qiáng)FLUENT代碼的標(biāo)準(zhǔn)功能的,在寫UDF之前,我們要明確以下幾個(gè)基本的要求。首先,必須用C語(yǔ)言編寫UDF。必須使用FLUENT提供的DEFINE宏來(lái)定義UDF。UDF必須含有包含于源代碼開始指示的udf.h文件;它允許為DEFINE macros和包含在編譯過(guò)程的其它FLUENT提供的函數(shù)定義。UDF只使用預(yù)先確定的宏和函數(shù)從FLUENT求解器訪問(wèn)數(shù)據(jù)。通過(guò)UDF傳遞到求解器的任何值或從求解器返回到UDF的值,都指定為國(guó)際(SI)單位。

總之,當(dāng)寫UDF時(shí),你必須記住下面的FLUENT要求。UDF:

1.????? 采用C語(yǔ)言編寫。

2.????? 必須為udf.h文件有一個(gè)包含聲明。

3.????? 使用Fluent.Inc提供的DEFINE macros來(lái)定義。

4.????? 使用Fluent.Inc提供的預(yù)定義宏和函數(shù)來(lái)訪問(wèn)FLUENT求解器數(shù)據(jù)。

5.????? 必須使返回到FLUENT求解器的所有值指定為國(guó)際單位。

?

3.2寫解釋式UDF的限制(Restriction on Writing Interpreted UDF

無(wú)論UDF在FLUENT中以解釋還是編譯方式執(zhí)行,用戶定義C函數(shù)(說(shuō)明在Section 3.1中)的基本要求是相同的,但還是有一些影響解釋式UDF的重大編程限制。FLUENT解釋程序不支持所有的C語(yǔ)言編程原理。解釋式UDF不能包含以下C語(yǔ)言編程原理的任何一個(gè):

1.????? goto 語(yǔ)句。

2.????? 非ANSI-C原型語(yǔ)法

3.????? 直接的數(shù)據(jù)結(jié)構(gòu)查詢(direct data structure references)

4.????? 局部結(jié)構(gòu)的聲明

5.????? 聯(lián)合(unions)

6.????? 指向函數(shù)的指針(pointers to functions)

7.????? 函數(shù)數(shù)組。

在訪問(wèn)FLUENT求解器數(shù)據(jù)的方式上解釋式UDF也有限制。解釋式UDF不能直接訪問(wèn)存儲(chǔ)在FLUENT結(jié)構(gòu)中的數(shù)據(jù)。它們只能通過(guò)使用Fluent提供的宏間接地訪問(wèn)這些數(shù)據(jù)。另一方面,編譯式UDF沒有任何C編程語(yǔ)言或其它注意的求解器數(shù)據(jù)結(jié)構(gòu)的限制。

?

3.3 FLUENT求解過(guò)程中UDF的先后順序(Sequencing of UDF in the FLUENT Solution Process

?

當(dāng)你開始寫UDF代碼的過(guò)程時(shí)(依賴于你寫的UDF的類型),理解FLUENT求解過(guò)程中UDF調(diào)用的內(nèi)容或許是重要的。求解器中包含連接你寫的用戶定義函數(shù)的call-outs。知道FLUENT求解過(guò)程中迭代之內(nèi)函數(shù)調(diào)用的先后順序能幫助你在給定的任意時(shí)間內(nèi)確定那些數(shù)據(jù)是當(dāng)前的和有效的。

?

分離式求解器

?

在分離式求解器求解過(guò)程中(Figure 3.3.1),用戶定義的初始化函數(shù)(使用DEFINE_INIT定義的)在迭代循環(huán)開始之前執(zhí)行。然后迭代循環(huán)開始執(zhí)行用戶定義的調(diào)整函數(shù)(使用DEFINE_ADJUST定義的)。接著,求解守恒方程,順序是從動(dòng)量方程和后來(lái)的壓力修正方程到與特定計(jì)算相關(guān)的附加標(biāo)量方程。守恒方程之后,屬性被更新(包含用戶定義屬性)。這樣,如果你的模型涉及到氣體定律,這時(shí),密度將隨更新的溫度(和壓力 and/or 物質(zhì)質(zhì)量分?jǐn)?shù))而被更新。進(jìn)行收斂或者附加要求的迭代的檢查,循環(huán)或者繼續(xù)或停止。

?

耦合求解器

?

在耦合求解器求解過(guò)程中(Figure 3.3.2),用戶定義的初始化函數(shù)(使用DEFINE_INIT定義的)在迭代循環(huán)開始之前執(zhí)行。然后,迭代循環(huán)開始執(zhí)行用戶定義的調(diào)整函數(shù)(使用DEFINE_ADJUST定義的)。接著,F(xiàn)LUENT求解連續(xù)、動(dòng)量和(適合的地方)能量的控制方程和同時(shí)地一套物質(zhì)輸運(yùn)或矢量方程。其余的求解步驟與分離式求解器相同(Figure 3.3.1)。

Figure 3.3.2: Solution Procedure for the Coupled Solver

?

3.4 FLUENT 網(wǎng)格拓?fù)?/strong>

?

在我們開始討論FLUENT特殊的數(shù)據(jù)類型之前,你必須理解網(wǎng)格拓?fù)鋵W(xué)的術(shù)語(yǔ)因?yàn)镕LUENT數(shù)據(jù)類型是為這些實(shí)體定義的。下面是顯示在Figure 3.4.1中的網(wǎng)格實(shí)體的定義。

?? 單元(cell)????????????????????? 區(qū)域被分割成的控制容積

?? 單元中心(cell center)???????????? FLUENT中場(chǎng)數(shù)據(jù)存儲(chǔ)的地方

?? 面(face)??????????????????????? 單元(2D or 3D)的邊界

?? 邊(edge)?????????????????????? 面(3D)的邊界

?? 節(jié)點(diǎn)(node)???????????????????? 網(wǎng)格點(diǎn)

? ?單元線索(cell thread)??????????? 在其中分配了材料數(shù)據(jù)和源項(xiàng)的單元組

?? 面線索(face thread)???????????? 在其中分配了邊界數(shù)據(jù)的面組

?? 節(jié)點(diǎn)線索(node thread)?????????? 節(jié)點(diǎn)組

?? 區(qū)域(domain)???????????? 由網(wǎng)格定義的所有節(jié)點(diǎn)、面和單元線索的組合

Figure ? 3.4.1: Grid Terminology

?

3.5 FLUENT數(shù)據(jù)類型

?

除了標(biāo)準(zhǔn)的C語(yǔ)言數(shù)據(jù)類型如real, int 等可用于在你的UDF中定義數(shù)據(jù)外,還有幾個(gè)FLUENT指定的與求解器數(shù)據(jù)相關(guān)的數(shù)據(jù)類型。這些數(shù)據(jù)類型描述了FLUENT中定義的網(wǎng)格的計(jì)算單位(見Figure 3.4.1)。使用這些數(shù)據(jù)類型定義的變量既有代表性地補(bǔ)充了DEFINE macros的自變量,也補(bǔ)充了其它專門的訪問(wèn)FLUENT求解器數(shù)據(jù)的函數(shù)。

一些更為經(jīng)常使用的FLUENT數(shù)據(jù)類型如下:

? cell_t

? face_t

? Thread

? Domain

? Node

cell_t是線索(thread)內(nèi)單元標(biāo)識(shí)符的數(shù)據(jù)類型。它是一個(gè)識(shí)別給定線索內(nèi)單元的整數(shù)下標(biāo)。face_t是線索內(nèi)面標(biāo)識(shí)符的數(shù)據(jù)類型。它是一個(gè)識(shí)別給定線索內(nèi)面的整數(shù)下標(biāo)。

Thread數(shù)據(jù)類型是?FLUENT中的數(shù)據(jù)結(jié)構(gòu)。它充當(dāng)了一個(gè)與它描述的單元或面的組合相關(guān)的數(shù)據(jù)容器。

Node數(shù)據(jù)類型也是FLUENT中的數(shù)據(jù)結(jié)構(gòu)。它充當(dāng)了一個(gè)與單元或面的拐角相關(guān)的數(shù)據(jù)容器。

Domain數(shù)據(jù)類型代表了FLUENT中最高水平的數(shù)據(jù)結(jié)構(gòu)。它充當(dāng)了一個(gè)與網(wǎng)格中所有節(jié)點(diǎn)、面和單元線索組合相關(guān)的數(shù)據(jù)容器。

!!注意,F(xiàn)LUENT中所有數(shù)據(jù)類型都是 情形敏感的(case-sensitive)。

3.6 使用DEFINE Macros定義你的UDF

?

Fluent.Inc為你提供了一套你必須使用它來(lái)定義你的UDF的預(yù)定義函數(shù)。這些定義UDF的函數(shù)在代碼中作為宏執(zhí)行,可在作為DEFINE(全部大寫)宏的文獻(xiàn)中查閱。對(duì)每個(gè)DEFINE 宏的完整描述和它的應(yīng)用例子,可參考第四章。

DEFINE宏的通用格式為:

DEFINE_MACRONAME(udf_name, passed-in variables)

這里括號(hào)內(nèi)第一個(gè)自變量是你的UDF的名稱。名稱自變量是情形敏感的必須用小寫字母指定。一旦函數(shù)被編譯(和連接),你為你的UDF選擇的名字在FLUENT下拉列表中將變成可見的和可選的。第二套輸入到DEFINE 宏的自變量是從FLUENT求解器傳遞到你的函數(shù)的變量。

在下面的例子中,宏

?DEFINE_PROFILE(inlet_x_velocity, thread, index)

用兩個(gè)從FLUENT傳遞到函數(shù)的變量thread和index定義了名字為inlet_x_velocity的分布函數(shù)。這些passed-in變量是邊界條件區(qū)域的ID(作為指向thread的指針)而index確定了被存儲(chǔ)的變量。一旦UDF被編譯,它的名字(例如,inlet_x_velocity)將在FLUENT適當(dāng)?shù)倪吔鐥l件面板(例如,Velocity Inlet面板)的下拉列表中變?yōu)榭梢姷暮涂蛇x的。

??!注意,所有用于DEFINE宏的自變量必須放在你的源代碼的同一行上。分割DEFINE的聲明為幾行可能導(dǎo)致編譯錯(cuò)誤。

3.7在你的UDF源文件中包含udf.h文件(Including the udf.h File in Your UDF Source File)

?

DEFINE 宏的定義位于稱為udf.h(見附錄A的列表)的頭文件中。為了使DEFINE宏延伸到編譯過(guò)程,你必須在你寫的每個(gè)UDF源文件的開始包含udf.h?文件。

#include "udf.h"

?

/* Always include udf.h when writing a UDF. It translates the DEFINE */

/* and other macros into C, which is what the compiler understands.? */

通過(guò)在你的UDF源文件中包含udf.h,編譯過(guò)程中所有的DEFINE宏的定義與源代碼一起被包含進(jìn)來(lái)。udf.h文件也為所有的C庫(kù)函數(shù)頭文件包含#include指示,與大部分頭文件是針對(duì)Fluent提供的宏和函數(shù)是一樣的(例如,mem.h)。除非有另外的指示,沒必要在你的UDF中個(gè)別地包含這些頭文件。

還有,當(dāng)你編譯你的UDF時(shí),你不必放置udf.h的拷貝在你的當(dāng)?shù)啬夸浵?;一旦你的UDF被編譯,F(xiàn)LUENT求解器會(huì)自動(dòng)地從Fluent.Inc/fluent6.x/src/目錄來(lái)讀取udf.h文件。

舉例

從前面部分的宏

DEFINE_PROFILE(inlet_x_velocity, thread, index)

定義在udf.h文件中為

#define DEFINE_PROFILE(name, t, i) void name(Thread *t, int i)

在編譯過(guò)程中延伸為

void inlet_x_velocity(Thread *thread, int index)

名字為inlet_x_velocity的函數(shù)不返回值由于它被聲明為空的數(shù)據(jù)類型。

3.8在你的函數(shù)中定義變量(Defining Variable in Your Function

?

在你的UDF源文件中包含了udf.h頭文件后,你必須定義真實(shí)的變量。使用把它們定義在所有函數(shù)之外的全局變量(如果它們被源文件中大部分或所有函數(shù)共享)是非常方便的。關(guān)于全局變量的信息見Section 2.5.3。局部于函數(shù)的任何變量必須在函數(shù)內(nèi)聲明。局部變量的信息見Section 2.5.2。

3.9函數(shù)體(Functin Body

?

你的UDF源文件中的C函數(shù)體被包含在DEFINE聲明之下的一對(duì)大括號(hào)內(nèi),顯示在下面的例子中。在這個(gè)例子中,mu_lan和temp是局部變量。只有cell_viscosity函數(shù)認(rèn)識(shí)它們。

例子

DEFINE_PROPERTY(cell_viscosity, cell, thread)

{

? real mu_lam;

? real temp = C_T(cell, thread);

?

? if (temp > 288.)

??? mu_lam = 5.5e-3;

? else if (temp > 286.)

??? mu_lam = 143.2135 - 0.49725 * temp;

? else

??? mu_lam = 1.;

?

? return mu_lam;

}

3.10? UDF任務(wù)(UDF Tasks

UDF可執(zhí)行的任務(wù)有五種不同的類型:

1.????? 返回值

2.????? 修改自變量

3.????? 返回值和修改自變量

4.????? 修改FLUENT變量(不能作為自變量傳遞)

5.????? 寫信息到(或讀取信息從)case或data文件

函數(shù)能返回值,除非它們?cè)趗df.h文件中被定義為void。如果它們不返回值,它們能修改自變量,修改存儲(chǔ)在內(nèi)存中的變量,或與case和data文件一起執(zhí)行輸入輸出(I/O)任務(wù)。

在Section 3.10.1-3.10.5中,提供了描述上面提到的五種不同的函數(shù)任務(wù)中每一種的UDF源代碼例子。

3.10.1 返回值的函數(shù)(Function that Return a Value

?

下面的UDF是一個(gè)返回值到FLUENT求解器的函數(shù)例子。名為cell_viscosity的函數(shù)計(jì)算了依賴溫度的粘度值(mu_lam)并返回這個(gè)值到求解器。

/********************************************************************/

/* UDF that returns a value to the solver???????????????????????????? ??????*/

/* Specifies a temperature-dependent viscosity property?????????????? ???????*/

/********************************************************************/#include "udf.h"

?

DEFINE_PROPERTY(cell_viscosity, cell, thread)

{

? real mu_lam;

? real temp = C_T(cell, thread);

?

? if (temp > 288.)

??? mu_lam = 5.5e-3;

? else if (temp > 286.)

??? mu_lam = 143.2135 - 0.49725 * temp;

? else

??? mu_lam = 1.;

?

? return mu_lam;

}

cell_viscosity使用了DEFINE_PROPERTY 宏(在Section 4.3.6中描述)來(lái)定義。DEFINE_PROPERTY返回一個(gè)udf.h中指定的real數(shù)據(jù)類型。兩個(gè)real變量傳入函數(shù):通過(guò)函數(shù)計(jì)算的層流粘度mu_lam; 和C_T(cell,thread)的值,它是在考慮中的單元的溫度值。溫度值在它下降范圍的基礎(chǔ)上被檢測(cè),mu_lam的適當(dāng)值被計(jì)算。在函數(shù)結(jié)尾,mu_lam的計(jì)算值被返回。

3.10.2修改自變量的函數(shù)(Function that Modify an Argument

?

下面的UDF是一個(gè)修改一個(gè)自變量的函數(shù)的例子。名字為user_rate的函數(shù)為一個(gè)兩種氣態(tài)物質(zhì)的的簡(jiǎn)單系統(tǒng)產(chǎn)生一個(gè)自定義的體積反應(yīng)速率。Real指針rr作為自變量傳遞給函數(shù),指針指向的變量在函數(shù)內(nèi)被修改。

/**************************************************************/

/* UDF that modifies one of its arguments??????????????????? ????????*/

/* Specifies a reaction rate in a porous medium?????????????? ?????????*/

/**************************************************************/

?

#include "udf.h"

?

#define K1 2.0e-2

#define K2 5.

?

DEFINE_VR_RATE(user_rate, c, t, r, mole_weight, species_mf, rr, rr_t)

{

? real s1 = species_mf[0];

? real mw1 = mole_weight[0];

?

? if (FLUID_THREAD_P(t) && THREAD_VAR(t).fluid.porous)

??? *rr = K1*s1/pow((1.+K2*s1),2.0)/mw1;

? else

??? *rr = 0.;

}

user_rate使用了DEFINE_VR _RATE宏(見Section 4.3.14)來(lái)定義。該函數(shù)執(zhí)行一個(gè)當(dāng)前考慮的單元是否在多孔區(qū)域的測(cè)試,這個(gè)反應(yīng)速率只應(yīng)用于多孔區(qū)域。real指針變量rr是一個(gè)傳遞給函數(shù)的自變量。UDF使用廢棄操作符 * 分配反應(yīng)速率值給廢棄指針 *rr。指針rr指向的目標(biāo)是設(shè)置反應(yīng)速率。通過(guò)這個(gè)操作,存儲(chǔ)在內(nèi)存中這個(gè)指針上的字符的地址被改變了,不再是指針地址本身。(關(guān)于廢棄指針的詳細(xì)內(nèi)容見[3])。

3.10.3返回一個(gè)值和修改一個(gè)自變量的函數(shù)(Functions that Return a Value ans Modify an Argument

?

下面的UDF是一個(gè)修改它的自變量并返回一個(gè)值到FLUENT求解器的函數(shù)例子。名字為user_swirl的函數(shù)修改ds自變量,指定旋轉(zhuǎn)速度源項(xiàng)并返回它到求解器。

/**************************************************************/

/* UDF that returns a value and modifies an argument???????? ?????????*/

/* Specifies a swirl-velocity source term???????????????????? ????????*/

/**************************************************************/

?

#include "udf.h"

?

#define OMEGA 50.??? /* rotational speed of swirler */

#define WEIGHT 1.e20 /* weighting coefficients in linearized equation */

?

DEFINE_SOURCE(user_swirl, cell, thread, dS, eqn)

{

? real w_vel, x[ND_ND], y, source;

?

? C_CENTROID(x, cell, thread);

? y = x[1];

?

? w_vel = y*OMEGA;????????? /* linear w-velocity at the cell */

?

? source = WEIGHT*(w_vel - C_WSWIRL(cell,thread));

? dS[eqn] = -WEIGHT;

?

? return source;

}

user_swirl使用DEFINE_SOURCE宏來(lái)定義(在Section 4.3.8中描述)。DEFINE_SOURCE返回一個(gè)在udf.h中指定的數(shù)據(jù)類型。函數(shù)采用自變量ds(它是數(shù)組的名字)并設(shè)置由eqn指定的元素為關(guān)于速度(w_vel)導(dǎo)數(shù)的值。(這是z動(dòng)量方程源項(xiàng))。這個(gè)函數(shù)也計(jì)算了旋轉(zhuǎn)速度源項(xiàng)的值source,并返回這個(gè)值到求解器。

3.10.4修改FLUENT變量的函數(shù)

?

下面的UDF是一個(gè)修改存儲(chǔ)在內(nèi)存中FLUENT變量的函數(shù)例子。名字為inlet_x_velocity的函數(shù)使用F_PROFILE(a Fluent Inc. provided utility(應(yīng)用程序)“Translate by 金山詞霸”)來(lái)修改存儲(chǔ)在內(nèi)存中的x速度分布邊界條件。

/********************************************************************/

/* UDF that modifies a FLUENT solver variable?????????????????????? ?????*/

/* Specifies a steady-state velocity profile boundary condition???? ????????????*/

/********************************************************************/

?

#include "udf.h"

?

DEFINE_PROFILE(inlet_x_velocity, thread, index)

{

? real x[ND_ND];????????? /* this will hold the position vector */

? real y;

? face_t f;

?

? begin_f_loop(f, thread)

??? {

????? F_CENTROID(x,f,thread);

????? y = x[1];

????? F_PROFILE(f, thread, index) = 20. - y*y/(.0745*.0745)*20.;

??? }

? end_f_loop(f, thread)

}

inlet_x_velocity使用DEFINE_PROFLIE宏來(lái)定義(在Section 4.3.5中描述)。它的自變量是thread和index。Thread是一個(gè)指向面線索的指針,而index是一個(gè)每個(gè)循環(huán)內(nèi)為變量設(shè)置數(shù)值標(biāo)簽的整數(shù)。DEFINE_PROPERTY在udf.h文件中一個(gè)返回void的數(shù)據(jù)類型。

函數(shù)由聲明變量f作為face_t數(shù)據(jù)類型開始。一維數(shù)組x和變量y是real 數(shù)據(jù)類型。循環(huán)宏用來(lái)在區(qū)域中每個(gè)面上循環(huán)以創(chuàng)建型線或數(shù)據(jù)數(shù)組。在每個(gè)循環(huán)內(nèi),F(xiàn)_CENTROID為含有index f的面輸出面質(zhì)心的值(數(shù)組 x),index f在由thread指向的線索上。存儲(chǔ)在x[1]中的y坐標(biāo)分配給變量y,它用于計(jì)算x速度。然后這個(gè)值分配給F_PROFILE, 它使用整數(shù)index(由求解器傳遞個(gè)它)來(lái)設(shè)置內(nèi)存中面上的x速度值。

3.10.5寫入Case或Data文件或從中讀取的函數(shù)(Functions that Write to or Read from a Case or Data File)

下面的C源代碼包含了寫信息到data文件和讀回它的函數(shù)例子。這是一個(gè)包含多個(gè)連接在一起的UDF的單個(gè)C文件例子。

/******************************************************************/

/* UDF that increment a variable, write it to a data file??????? ??????????????*/

/* and read it back in??????????????????????????????????????????? ?????*/

/******************************************************************/

?

#include "udf.h"

?

int kount = 0;? /* define global variable kount */

?

DEFINE_ADJUST(demo_calc, domain)

{

? kount++;

? printf("kount = %d\n",kount);

}

?

?

DEFINE_RW_FILE(writer, fp)

{

? printf("Writing UDF data to data file...\n");

? fprintf(fp, "%d",kount); /* write out kount to data file */

}

?

?

DEFINE_RW_FILE(reader, fp)

{

? printf("Reading UDF data from data file...\n");

? fscanf(fp, "%d",&kount); /* read kount from data file */

}

在頂部的列表中,整數(shù)kount被定義為全局的(由于它被源代碼文件中的所有三個(gè)函數(shù)使用)并初始化為0。名字為demo_calc的第一個(gè)函數(shù),使用DEFINE_SDJUST 宏來(lái)定義。(關(guān)于DEFINE_ADJUST的詳細(xì)信息見Section 4.2.1)。在demo_calc中,kount的值每次迭代后增加因?yàn)槊看蔚{(diào)用DEFINE_ADJUST一次。名字為writer的第二個(gè)函數(shù),使用DEFINE_RW_FILE宏來(lái)定義。(關(guān)于DEFINE_RW_FILE的詳細(xì)信息見Section 4.2.4)。當(dāng)保存數(shù)據(jù)文件時(shí),它指示FLUENT寫當(dāng)前kount值到數(shù)據(jù)文件。名字為reader的第三個(gè)函數(shù),當(dāng)讀取數(shù)據(jù)文件時(shí),它指示FLUENT從這個(gè)數(shù)據(jù)文件中讀取kount的值。

這三個(gè)函數(shù)一起工作如下。如果你運(yùn)行10次迭代計(jì)算(kount將增加到值為10)并保存這個(gè)數(shù)據(jù)文件,當(dāng)前kount(10)的值被寫入你的數(shù)據(jù)文件。如果你讀這個(gè)數(shù)據(jù)返回到FLUENT并繼續(xù)計(jì)算,kount將以值10開始隨著每次迭代繼續(xù)增加。注意,你可盡你所想的保存靜態(tài)變量,但是必須保證以與它們被寫的相同順序來(lái)讀取它們。

3.11為多相流應(yīng)用寫UDF(Writing UDF for Mulutiphase Applications

?

當(dāng)一個(gè)多相流模型在FLUENT中被激活時(shí),屬性和變量的存儲(chǔ)和對(duì)單相一樣應(yīng)當(dāng)為所有相的混合設(shè)置它們。這可以通過(guò)使用附加線索(thread)和區(qū)域數(shù)據(jù)結(jié)構(gòu)在代碼中得以表明。

3.11.1多相應(yīng)用的數(shù)據(jù)結(jié)構(gòu)(Data Structure for Multiphase Applications

區(qū)域和線程(Domains and Threads

?

在多相流應(yīng)用中,最高級(jí)別的區(qū)域被用作超級(jí)區(qū)域。每相占據(jù)的區(qū)域用作子區(qū)域第三種類型區(qū)域是相互作用區(qū),為了定義相間的相互作用才引入它的。當(dāng)混合屬性和變量必要時(shí)(所有相的和),超級(jí)區(qū)域用于這些數(shù)量而子區(qū)域攜帶了單相的信息。在單一相中混合的概念用于描述所有種類(成分)的和而在多相中它描述了所有相的總和。這個(gè)區(qū)別是非常重要的因?yàn)橐院蟠a將延伸到多相多組分(例如,這里相是種類的混合)。

由于求解器的數(shù)據(jù)存儲(chǔ)在線程(thread)數(shù)據(jù)結(jié)構(gòu)中,線程必須既和超級(jí)區(qū)域相聯(lián)系又和每個(gè)子區(qū)域相聯(lián)系。就是說(shuō),對(duì)定義在超級(jí)區(qū)域上的每個(gè)單元或面線程,有相應(yīng)的單元或面線程定義在每個(gè)子區(qū)域上。定義在超級(jí)區(qū)域每個(gè)線程上的某些信息與子區(qū)域每個(gè)相應(yīng)線程上的共享。與超級(jí)區(qū)域相關(guān)的線程被用作超級(jí)線程,而與子區(qū)域相關(guān)的線程被用作相級(jí)別線程或子線程。區(qū)域和線程的層次總結(jié)在Figure 3.11.1中。

Figure ? 3.11.1: Domain and Thread Structure ? Hierarchy

Figure 3.11.1也引入了domain_id和phase_domain_indexed的概念。domain_id在UDF中用于辨別超級(jí)區(qū)域從主要和次要的相級(jí)別區(qū)域中。超級(jí)區(qū)域的domain_id值總是被指定為1。相互作用區(qū)域也有相同的domain_id。domain_ids不必要如Figure3.11.1顯示的順序排列。dhase_domain_index在UDF中用于從次要相級(jí)別線程中辨別主要相級(jí)別線程。對(duì)主要相級(jí)別線程,phase_domain_index總是分配值為0。

訪問(wèn)數(shù)據(jù)(Accessing Data

?

當(dāng)你寫UDF或?yàn)槎嘞鄳?yīng)用使用宏時(shí),參考與嘗試訪問(wèn)其屬性的相(subdomain)或混合(super domain)相關(guān)的數(shù)據(jù)結(jié)構(gòu)(thread or domain)是很重要的。作為例子,宏C_R(c,t)將返回線程t的單元c上的密度。如果t是指向超級(jí)線程的指針,那么返回的是混合密度。如果t是指向子線程的指針,那么返回的是相密度。

當(dāng)傳遞到你的UDF的線程或區(qū)域指針不被你的函數(shù)需要時(shí),也有一些例子。這取決于你使用的多相模型,你嘗試修改的屬性或項(xiàng)(例如,你使用的那個(gè)DEFINE宏),還有受到影響的相或混合。為了更好地理解這點(diǎn),回想一個(gè)混合模型和歐拉多相模型之間區(qū)別的例子。在混合模型中,為混合相求解單一的動(dòng)量方程,混合相的屬性由它的相的總和來(lái)決定。在歐拉模型中,動(dòng)量方程為每一相求解。當(dāng)使用混合模型時(shí),F(xiàn)LUENT允許你直接為混合相指定動(dòng)量源項(xiàng)(使用DEFINE_SOURCE),但是不能為歐拉模型。對(duì)后者,你可以為單個(gè)相指定動(dòng)量源項(xiàng)。因此,多相模型及被UDF修改的項(xiàng),決定了那哪個(gè)區(qū)域或線程是需要的。

從求解器傳遞到你的UDF的特定的區(qū)域或線程的結(jié)構(gòu)取決于你使用的DEFINE宏。例如,DEFINE_INIT和DEFINE_ADJUST函數(shù)總是傳遞與超級(jí)區(qū)域相關(guān)的區(qū)域結(jié)構(gòu)。DEFINE_ON_DEMAND函數(shù)不能傳遞任何區(qū)域結(jié)構(gòu)。如果你的UDF不能明確地傳遞指針到你的函數(shù)定義要求的線程或區(qū)域,那么你可以使用multiphase-specific utility macro找會(huì)它(見第6章)。為了你方便使用,表3.11.1-3.11.6總結(jié)了每個(gè)多相模型和相,在該相上為每個(gè)給定變量指定了UDF。從這些信息,你可推斷出那些區(qū)域結(jié)構(gòu)是從求解器傳遞到UDF的。

單相和多相模型應(yīng)用UDF之間的區(qū)別(Differences Between UDF for Single-Phase and Multiphase Applications

注:在許多例子中,為單相流動(dòng)寫的UDF源代碼和為多相流動(dòng)寫的是相同的。例如,假設(shè)函數(shù)只從它被連接(hooked)到的相級(jí)別區(qū)域訪問(wèn)數(shù)據(jù),為單相邊界型線(使用DEFINE_PROFIEL定義的)寫的C代碼為多相邊界型線寫的代碼之間是沒有區(qū)別的。然而,如果那些函數(shù)從除混合級(jí)別區(qū)域之外的任何區(qū)域訪問(wèn)數(shù)據(jù),調(diào)整和初始化UDF的代碼對(duì)單相和多相流動(dòng)是不同的。

3.11.2 對(duì)多相模型使用UDFUsing UDF for Multiphase Models

?

在多相模型中,從求解器傳遞到你的UDF的數(shù)據(jù)結(jié)構(gòu)(例如區(qū)域和線程指針)取決于你使用的DEFINE宏。傳遞哪一個(gè)特定的區(qū)域或線程取決于函數(shù)連接到求解器的什么地方。例如,被連接到混合模型的函數(shù)傳遞超級(jí)區(qū)域結(jié)構(gòu),而連接到特定相的函數(shù)傳遞子區(qū)域結(jié)構(gòu)。表3.11.1-3.11.6列舉了DEFINE和對(duì)每個(gè)多相模型UDF被連接到的相。從這些信息你可推斷出那些數(shù)據(jù)結(jié)構(gòu)被傳遞?;叵隓EFINE_ADJUST和DEFINE_INIT UDF are hardwired to the mixture-level domain,而DEFINE_ON_DEMAND函數(shù)不能連接到任何區(qū)域。

Table ? 3.11.1: DEFINE ? Macro Usage for the VOF Model

Variable

Macro

Phase ? Specified On

volume fraction

DEFINE_PROFILE

secondary ? phase(s)

velocity at a ? boundary

DEFINE_PROFILE

mixture

pressure at a ? boundary

DEFINE_PROFILE

mixture

boundary ? temperature

DEFINE_PROFILE

mixture

turbulent ? kinetic energy

DEFINE_PROFILE

mixture

turbulent ? dissipation rate

DEFINE_PROFILE

mixture

mass source

DEFINE_SOURCE

primary and

?

?

secondary ? phase(s)

momentum source

DEFINE_SOURCE

mixture

energy source

DEFINE_SOURCE

mixture

turbulent ? kinetic energy source

DEFINE_SOURCE

mixture

turbulent ? dissipation rate source

DEFINE_SOURCE

mixture

density

DEFINE_PROPERTY

primary and

?

?

secondary ? phase(s)

viscosity

DEFINE_PROPERTY

primary and

?

?

secondary ? phase(s)

???? Table ? 3.11.2: DEFINE ? Macro Usage for the Mixture Model

Variable

Macro

Phase ? Specified On

volume fraction

DEFINE_PROFILE

secondary ? phase(s)

velocity at a ? boundary

DEFINE_PROFILE

primary and

?

?

secondary ? phase(s)

pressure at a ? boundary

DEFINE_PROFILE

mixture

boundary ? temperature

DEFINE_PROFILE

mixture

turbulent ? kinetic energy

DEFINE_PROFILE

mixture

?


udf 中文手冊(cè) ANSYS FLUNT (3)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
陕西省| 仁怀市| 扎兰屯市| 抚州市| 伊吾县| 辉南县| 金塔县| 长汀县| 青神县| 仁布县| 通榆县| 上饶市| 克拉玛依市| 镇巴县| 神池县| 宽城| 桓仁| 庆元县| 庆云县| 乐至县| 甘德县| 津市市| 永丰县| 蒙山县| 江津市| 双牌县| 梁河县| 忻城县| 建平县| 武威市| 彰化县| 榆社县| 禄丰县| 湖北省| 闵行区| 宝清县| 渝中区| 斗六市| 兴宁市| 夏河县| 扶绥县|