Fluent UDF中的C語言學(xué)習(xí)【轉(zhuǎn)發(fā)】

2017-07-05  by:CAE仿真在線  來源:互聯(lián)網(wǎng)

Fluent UDF利用的是C語言,本文簡單介紹在UDF中經(jīng)常會用到的C語言常識。
本文部分內(nèi)容來自UDF手冊。

1 C語言中的注釋

C語言中的注釋利用/*及*/來實現(xiàn)。例如:

/*這是一個注釋*/

注釋也可以跨行實現(xiàn),如:

/*這是一個 跨行注釋*/

注意:在編寫UDF的過程中,不能把DEFINE宏(如DEFINE_PROFILE)放置在注釋中,否則會引起編譯錯誤

2 基本數(shù)據(jù)類型

Fluent UDF解釋器支持的標(biāo)準(zhǔn)C數(shù)據(jù)類型包括:

  • int。整形,存儲形如1,2,3之類的整數(shù)。

  • long。長整形。與int類似,但范圍更廣。

  • float。浮點型。存儲小數(shù),如1.234等

  • double。雙精度浮點型。與float類似。

  • char。字符型,如’a’,’b’,’c’等。

Fluent UDF中還有real型,其實這是Fluent自定義的數(shù)據(jù)類型,在雙精度求解器中,real類型與double類型相同,而在單精度求解器中,real類型等同于float類型。UDF自動進行轉(zhuǎn)換,因此在需要浮點數(shù)時,可以全部采用real類型。

3 常數(shù)

在C語言中可以利用#define來定義常數(shù)。需要注意的是,定義為常數(shù)類型后,該變量的值不能改變。如:

#define WALL_ID 5 #define YMIN 0.0 #define YMAX 0.4

這樣定義完畢后,WALL_ID的值不能再發(fā)生改變,因此如下的語句會引發(fā)編譯錯誤:

WALL_ID = WALL_ID +1 ;

4 變量

變量用于存儲數(shù)據(jù)。所有變量都包含類型、名稱以及值,有時候還包含存儲標(biāo)記(如靜態(tài)變量和外部變量)。C語言中所有的變量在使用之前都必須聲明,這樣C編譯器才會知道該如何為此變量分配內(nèi)存。

4.1 全局變量和局部變量

C語言中的全局變量定義在函數(shù)的外部,該變量可以被源文件中所有的函數(shù)引用。全局變量如果未被聲明為靜態(tài)變量的話,還可以被外部函數(shù)引用。如下例中的全局變量聲明:

#include "udf.h" real volume; /*此處定義的是全局變量*/ DEFINE_ADJUST(vol,domain) { /*此處可以訪問變量volume*/ }

局部變量一般定義在函數(shù)體內(nèi),其只在函數(shù)體內(nèi)起作用,在函數(shù)體外無法被訪問到。如下程序中的局部變量定義。

DEFINE_PROPERTY(vis, 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.2 - 0.49 * temp; else mu_lam = 1.; return mu_lam; ?}

4.2 外部變量

當(dāng)在某個源文件中定義了一個未加static的全局變量后,若想在另一個源文件中調(diào)用此變量,此時可以使用外部變量聲明來實現(xiàn)。采用如下聲明:

extern real volume;

注意:extern聲明只能用于編譯型UDF中。
以下是一個利用extern的案例。
假設(shè)在源文件file1.c中定義了全局變量:

#include "udf.h" real volume; DEFINE_ADJUST(vol, domain) { volume = .... }

若其他的的源文件想要利用此全局變量volume, 此時可以創(chuàng)建頭文件,并將變量volume聲明為extern變量,如創(chuàng)建頭文件extfile.h,寫入內(nèi)容:

extern real volume;

之后就可以在其他的源文件中使用此變量volume了,如在源文件file2.c中:

#include "udf.h" #include "extfile.h" DEFINE_SOURCE(heat,c,t,ds,eqn) { real total_source = ...; real source; source = total_source/volume; return source; }

溫馨提示:外部變量使用起來很麻煩也很容易出錯,如果對其不甚了解的話,建議不要使用。

4.3 靜態(tài)變量

靜態(tài)變量(聲明時添加static關(guān)鍵字)在用于局部變量或全局變量時具有不同的作用。局部變量被聲明為static時,當(dāng)函數(shù)返回后變量并不銷毀,變量的值依舊被保留。

全局變量被聲明為static時,該變量能夠被此源文件中的所有函數(shù)調(diào)用,但不能被其他源文件中的函數(shù)調(diào)用。實際上是變量被隱藏了。

例如在文件mysource.c中有如下代碼:

#include "udf.h" static real abs_coeff = 1.0; /*聲明靜態(tài)全局變量*/ /* 此變量只能被本文件中的其他函數(shù)調(diào)用 */ DEFINE_SOURCE(energy_source, c, t, dS, eqn) { real source; /* 局部變量*/ int P1 = ....; /* 局部變量*/ /*變量只能被當(dāng)前函數(shù)調(diào)用,但在函數(shù)返回時變量并不釋放 */ dS[eqn] = -16.* abs_coeff; source =-abs_coeff *(4.* SIGMA_SBC ); return source; } DEFINE_SOURCE(p1_source, c, t, dS, eqn) { real source;int P1 = ...; dS[eqn] = -abs_coeff; source = abs_coeff *(4.* SIGMA_SBC); return source; }

更多關(guān)于static的描述可參見文章:www.cnblogs.com/stoneJin/archive/2011/09/21/2183313.html

溫馨提示:與全局變量類似,靜態(tài)變量也盡量少用,容易造成不必要的麻煩。

5 用戶自定義數(shù)據(jù)類型

C語言允許用戶自己定義數(shù)據(jù)類型,通過使用結(jié)構(gòu)體及typedef關(guān)鍵字。如定義類型:

typedef struct list { int a; real b;int c; }mylist; mylist x,y,z;

上例定義了一個結(jié)構(gòu)體類型mylist,并定義了三個結(jié)構(gòu)體變量x,y,z。

6 強制轉(zhuǎn)換

在C語言中,有時需要對類型進行強制轉(zhuǎn)換,如將浮點型強制轉(zhuǎn)換為整形,如下例中。

int x =1; real y=3.1415926; int z=x+(int)y;

計算完畢后,z=4。

7 函數(shù)

C語言中的函數(shù)執(zhí)行獨立的任務(wù)。函數(shù)能夠被同一源文件中的其他函數(shù)調(diào)用,也可以由源文件之外的函數(shù)調(diào)用。

函數(shù)定義包含函數(shù)名以及被傳遞給函數(shù)的零個或多個參數(shù)列表。函數(shù)包含一個包含在大括號內(nèi)的主體,主體中包含執(zhí)行任務(wù)的指令。 函數(shù)可以返回特定類型的值。

函數(shù)返回特定數(shù)據(jù)類型的值(例如,實數(shù)),如果類型為void,則不返回任何值。 要確定DEFINE宏的返回數(shù)據(jù)類型,可查看udf.h文件中宏的相應(yīng)#define語句。

8 數(shù)組

C語言中數(shù)組變量定義為name[size],其中name為數(shù)組變量的名稱,size為數(shù)組中存儲的單元數(shù)量。C語言中數(shù)組索引從0開始。

int a[10], b[10][10];/*a real rad[5]; a[0] = 1; rad[4] = 3.14159265; b[10][10] = 4;

9 指針

指針是一種存儲變量內(nèi)存地址的變量。換句話說,指針是一個變量,這個變量指向另外一個變量的內(nèi)存地址。指針變量的聲明:

int *ip;/*定義指針變量ip*/

定義了指針變量后,可以利用取址運算符將其他變量的地址賦予指針變量,如:

int *ip; ip =&a;

也可以為指針變量賦值,如:

*ip =4;

當(dāng)指針作為函數(shù)的參數(shù),此時為傳址調(diào)用,在函數(shù)體內(nèi)修改指針參數(shù)的值,會改變調(diào)用函數(shù)時傳遞的參數(shù)的值。此功能可以實現(xiàn)一個函數(shù)返回多個值。
如下的C程序:

#include <stdio.h> int add(int *a,int b) { int sum = 0; sum = *a + b; *a = 5; return sum; } int main() { int *ip; int a = 1; int b = 2; int sum = 0; ip = &a; sum = add(ip,b); printf("sum=%d,a=%d\n",sum,a); return 0; }

輸出結(jié)果:

sum=3,a=5

傳遞的參數(shù)值被函數(shù)體內(nèi)的程序改變。

10 流程控制

C語言中可以用邏輯判斷和循環(huán)來進行流程控制。

10.1 if語句

if語句用于邏輯判斷。可寫成:

if(邏輯判斷表達式) { 語句塊; }

例如:

if(q!=1) { a=0; b=1; }

若邏輯判斷存在多個分支,可以采用if-else結(jié)構(gòu)。如:

if(x<0) { y = x/50; } else(x>=0 && x<3) { x=-x; y = x/25; } else { x= 0; y = 0; }

10.2 for循環(huán)

for語句常用于循環(huán)表達。

int i,j,n<=10; for(i=1;i<n;i++) { j = i*i;printf("%d%d\n",i,j) }

11 操作符

常用的代數(shù)操作符:

= 賦值操作 + 加法計算 - 減法計算 * 乘法運算 / 除法運算 % 求模運算 ++ 累加 -- 累減

常用的邏輯操作符:

< 小于 <= 小于等于 > 大于 >= 大于等于 == 等于 != 不等于

12 C庫函數(shù)

常用的三角函數(shù):

double acos (double x); double asin (double x); double atan (double x); double atan2 (double x, double y); double cos (double x); double sin (double x); double tan (double x); double cosh (double x); double sinh (double x); double tanh (double x);

常用的數(shù)學(xué)函數(shù):

double sqrt (double x); double pow(double x, double y); double exp (double x); double log (double x); double log10 (double x); double fabs (double x); double ceil (double x); double floor (double x);

一些常用的標(biāo)準(zhǔn)輸入輸出函數(shù):

FILE *fopen(char *filename, char *mode); int fclose(FILE *fp); int printf(char *format,...); int fscanf(FILE *fp, char *format,...); int fscanf(FILE *fp, char *format,...);

更多的內(nèi)容可參閱C語言教程。


轉(zhuǎn)自公眾號:胡坤 CFD仿真之道

開放分享:優(yōu)質(zhì)有限元技術(shù)文章,助你自學(xué)成才

相關(guān)標(biāo)簽搜索:Fluent UDF中的C語言學(xué)習(xí)【轉(zhuǎn)發(fā)】 Fluent培訓(xùn) Fluent流體培訓(xùn) Fluent軟件培訓(xùn) fluent技術(shù)教程 fluent在線視頻教程 fluent資料下載 fluent分析理論 fluent化學(xué)反應(yīng) fluent軟件下載 UDF編程代做 Fluent、CFX流體分析 HFSS電磁分析 

編輯
在線報名:
  • 客服在線請直接聯(lián)系我們的客服,您也可以通過下面的方式進行在線報名,我們會及時給您回復(fù)電話,謝謝!
驗證碼

全國服務(wù)熱線

1358-032-9919

廣州公司:
廣州市環(huán)市中路306號金鷹大廈3800
電話:13580329919
          135-8032-9919
培訓(xùn)QQ咨詢:點擊咨詢 點擊咨詢
項目QQ咨詢:點擊咨詢
email:kf@1cae.com