Fluent UDF【4】:C语言
Fluent UDF利用的是C語(yǔ)言,本文簡(jiǎn)單介紹在UDF中經(jīng)常會(huì)用到的C語(yǔ)言常識(shí)。
本文部分內(nèi)容來(lái)自UDF手冊(cè)。
1 C語(yǔ)言中的注釋
C語(yǔ)言中的注釋利用/*及*/來(lái)實(shí)現(xiàn)。例如:
/*這是一個(gè)注釋*/注釋也可以跨行實(shí)現(xiàn),如:
/*這是一個(gè) 跨行注釋*/注意:在編寫(xiě)UDF的過(guò)程中,不能把DEFINE宏(如DEFINE_PROFILE)放置在注釋中,否則會(huì)引起編譯錯(cuò)誤
2 基本數(shù)據(jù)類(lèi)型
Fluent UDF解釋器支持的標(biāo)準(zhǔn)C數(shù)據(jù)類(lèi)型包括:
- int。整形,存儲(chǔ)形如1,2,3之類(lèi)的整數(shù)。
- long。長(zhǎng)整形。存儲(chǔ)數(shù)據(jù)與int類(lèi)似,但范圍更廣。
- float。浮點(diǎn)型。存儲(chǔ)小數(shù),如1.234等
- double。雙精度浮點(diǎn)型。與float類(lèi)似。
- char。字符型,如'a','b','c'等。
Fluent UDF中還有real型,其實(shí)這是Fluent自定義的數(shù)據(jù)類(lèi)型,在雙精度求解器中,real類(lèi)型與double類(lèi)型相同,而在單精度求解器中,real類(lèi)型等同于float類(lèi)型。UDF自動(dòng)進(jìn)行轉(zhuǎn)換,因此在需要浮點(diǎn)數(shù)時(shí),可以全部采用real類(lèi)型。
3 常數(shù)
在C語(yǔ)言中可以利用#define來(lái)定義常數(shù)。需要注意的是,定義為常數(shù)類(lèi)型后,該變量的值不能改變。如:
#define WALL_ID 5 #define YMIN 0.0 #define YMAX 0.4這樣定義完畢后,WALL_ID的值不能再發(fā)生改變,因此如下的語(yǔ)句會(huì)引發(fā)編譯錯(cuò)誤:
WALL_ID = WALL_ID +1 ;4 變量
變量用于存儲(chǔ)數(shù)據(jù)。所有變量都包含類(lèi)型、名稱(chēng)以及值,有時(shí)候還包含存儲(chǔ)標(biāo)記(如靜態(tài)變量和外部變量)。C語(yǔ)言中所有的變量在使用之前都必須聲明,這樣C編譯器才會(huì)知道該如何為此變量分配內(nèi)存。
4.1 全局變量和局部變量
C語(yǔ)言中的全局變量定義在函數(shù)的外部,該變量可以被源文件中所有的函數(shù)引用。全局變量如果未被聲明為靜態(tài)變量的話(huà),還可以被外部函數(shù)引用。如下例中的全局變量聲明:
#include "udf.h" real volume; /*此處定義的是全局變量*/ DEFINE_ADJUST(vol,domain) {/*此處可以訪(fǎng)問(wèn)變量volume*/ }局部變量一般定義在函數(shù)體內(nèi),其只在函數(shù)體內(nèi)起作用,在函數(shù)體外無(wú)法被訪(fǎng)問(wèn)到。如下程序中的局部變量定義。
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;elsemu_lam = 1.;return mu_lam; }4.2 外部變量
當(dāng)在某個(gè)源文件中定義了一個(gè)未加static的全局變量后,若想在另一個(gè)源文件中調(diào)用此變量,此時(shí)可以使用外部變量聲明來(lái)實(shí)現(xiàn)。采用如下聲明:
extern real volume;注意:extern聲明只能用于編譯型UDF中。
以下是一個(gè)利用extern的案例。
假設(shè)在源文件file1.c中定義了全局變量:
若其他的的源文件想要利用此全局變量volume, 此時(shí)可以創(chuàng)建頭文件,并將變量volume聲明為extern變量,如創(chuàng)建頭文件extfile.h,寫(xiě)入內(nèi)容:
extern real volume;之后就可以在其他的源文件中使用此變量volume了,如在源文件file2.c中:
#include "udf.h" #include "extfile.h" DEFINE_SOURCE(heat_source,c,t,ds,eqn) {real total_source = ...;real source;source = total_source/volume;return source; }溫馨提示:外部變量使用起來(lái)很麻煩也很容易出錯(cuò),如果對(duì)其不甚了解的話(huà),建議不要使用。
4.3 靜態(tài)變量
靜態(tài)變量(聲明時(shí)添加static關(guān)鍵字)在用于局部變量或全局變量時(shí)具有不同的作用。局部變量被聲明為static時(shí),當(dāng)函數(shù)返回后變量并不銷(xiāo)毀,變量的值依舊被保留。
全局變量被聲明為static時(shí),該變量能夠被此源文件中的所有函數(shù)調(diào)用,但不能被其他源文件中的函數(shù)調(diào)用。實(shí)際上是變量被隱藏了。
例如在文件mysource.c中有如下代碼:
更多關(guān)于static的描述可參見(jiàn)文章[www.cnblogs.com/stoneJin/archive/2011/09/21/2183313.html] (www.cnblogs.com/stoneJin/archive/2011/09/21/2183313.html)
溫馨提示:與全局變量類(lèi)似,靜態(tài)變量也盡量少用,容易造成不必要的麻煩。
5 用戶(hù)自定義數(shù)據(jù)類(lèi)型
C語(yǔ)言允許用戶(hù)自己定義數(shù)據(jù)類(lèi)型,通過(guò)使用結(jié)構(gòu)體及typedef關(guān)鍵字。如定義類(lèi)型:
typedef struct list {int a;real b;int c; }mylist; mylist x,y,z;上例定義了一個(gè)結(jié)構(gòu)體類(lèi)型mylist,并定義了三個(gè)結(jié)構(gòu)體變量x,y,z。
6 強(qiáng)制轉(zhuǎn)換
在C語(yǔ)言中,有時(shí)需要對(duì)類(lèi)型進(jìn)行強(qiáng)制轉(zhuǎn)換,如將浮點(diǎn)型強(qiáng)制轉(zhuǎn)換為整形,如下例中。
int x =1; real y=3.1415926; int z=x+(int)y;計(jì)算完畢后,z=4。
7 函數(shù)
C語(yǔ)言中的函數(shù)執(zhí)行獨(dú)立的任務(wù)。函數(shù)能夠被同一源文件中的其他函數(shù)調(diào)用,也可以由源文件之外的函數(shù)調(diào)用。
函數(shù)定義包含函數(shù)名以及被傳遞給函數(shù)的零個(gè)或多個(gè)參數(shù)列表。函數(shù)包含一個(gè)包含在大括號(hào)內(nèi)的主體,主體中包含執(zhí)行任務(wù)的指令。 函數(shù)可以返回特定類(lèi)型的值。
函數(shù)返回特定數(shù)據(jù)類(lèi)型的值(例如,實(shí)數(shù)),如果類(lèi)型為void,則不返回任何值。 要確定DEFINE宏的返回?cái)?shù)據(jù)類(lèi)型,可查看udf.h文件中宏的相應(yīng)#define語(yǔ)句。
8 數(shù)組
C語(yǔ)言中數(shù)組變量定義為name[size],其中name為數(shù)組變量的名稱(chēng),size為數(shù)組中存儲(chǔ)的單元數(shù)量。C語(yǔ)言中數(shù)組索引從0開(kāi)始。
int a[10], b[10][10]; /*a real rad[5]; a[0] = 1; rad[4] = 3.14159265; b[10][10] = 4;9 指針
指針是一種存儲(chǔ)變量?jī)?nèi)存地址的變量。換句話(huà)說(shuō),指針是一個(gè)變量,這個(gè)變量指向另外一個(gè)變量的內(nèi)存地址。指針變量的聲明:
int *ip;/*定義指針變量ip*/定義了指針變量后,可以利用取址運(yùn)算符將其他變量的地址賦予指針變量,如:
int *ip; ip =&a;也可以為指針變量賦值,如:
*ip =4;當(dāng)指針作為函數(shù)的參數(shù),此時(shí)為傳址調(diào)用,在函數(shù)體內(nèi)修改指針參數(shù)的值,會(huì)改變調(diào)用函數(shù)時(shí)傳遞的參數(shù)的值。此功能可以實(shí)現(xiàn)一個(gè)函數(shù)返回多個(gè)值。
如下的C程序:
輸出結(jié)果:
sum=3,a=5傳遞的參數(shù)值被函數(shù)體內(nèi)的程序改變。
10 流程控制
C語(yǔ)言中可以用邏輯判斷和循環(huán)來(lái)進(jìn)行流程控制。
10.1 if語(yǔ)句
if語(yǔ)句用于邏輯判斷。可寫(xiě)成:
if(邏輯判斷表達(dá)式) {語(yǔ)句塊; }例如:
if(q!=1) {a=0;b=1; }若邏輯判斷存在多個(gè)分支,可以采用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語(yǔ)句常用于循環(huán)表達(dá)。
int i,j,n<=10; for(i=1;i<n;i++) {j = i*i;printf("%d%d\n",i,j) }11 操作符
常用的代數(shù)操作符:
= 賦值操作 + 加法計(jì)算 - 減法計(jì)算 * 乘法運(yùn)算 / 除法運(yùn)算 % 求模運(yùn)算 ++ 累加 -- 累減常用的邏輯操作符:
< 小于 <= 小于等于> 大于>= 大于等于== 等于!= 不等于12 C庫(kù)函數(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語(yǔ)言教程。
更多CFD資料可微信掃描下方二維碼關(guān)注微信公眾號(hào)。
總結(jié)
以上是生活随笔為你收集整理的Fluent UDF【4】:C语言的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: masm5.0与masm32
- 下一篇: Jetty 类载入问题处理