Fluent UDF【4】:C語言

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

1 C語言中的注釋

C語言中的注釋利用/*及*/來實現。例如:

/*這是一個注釋*/

注釋也可以跨行實現,如:

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

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

2 基本數據類型

Fluent UDF解釋器支持的標準C數據類型包括:

  • int。整形,存儲形如1,2,3之類的整數。
  • long。長整形。存儲數據與int類似,但范圍更廣。
  • float。浮點型。存儲小數,如1.234等
  • double。雙精度浮點型。與float類似。
  • char。字符型,如'a','b','c'等。
    Fluent UDF中還有real型,其實這是Fluent自定義的數據類型,在雙精度求解器中,real類型與double類型相同,而在單精度求解器中,real類型等同于float類型。UDF自動進行轉換,因此在需要浮點數時,可以全部采用real類型。

3 常數

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

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

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

WALL_ID = WALL_ID +1 ;

4 變量

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

4.1 全局變量和局部變量

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

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

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

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 外部變量

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

extern real volume;

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

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

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

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;
}

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

4.3 靜態變量

靜態變量(聲明時添加static關鍵字)在用于局部變量或全局變量時具有不同的作用。局部變量被聲明為static時,當函數返回后變量并不銷毀,變量的值依舊被保留。
全局變量被聲明為static時,該變量能夠被此源文件中的所有函數調用,但不能被其他源文件中的函數調用。實際上是變量被隱藏了。
例如在文件mysource.c中有如下代碼:

#include "udf.h"
static real abs_coeff = 1.0; /*靜態全局變量*//* 此變量只能被本文件中的其他函數調用 */DEFINE_SOURCE(energy_source, c, t, dS, eqn)
{real source; /* 局部變量*/int P1 = ....; /* 局部變量*/
/*變量只能被當前函數調用,但在函數返回時變量并不釋放 */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;
}

更多關于static的描述可參見文章[www.cnblogs.com/stoneJin/archive/2011/09/21/2183313.html] (www.cnblogs.com/stoneJin/archive/2011/09/21/2183313.html)
溫馨提示:與全局變量類似,靜態變量也盡量少用,容易造成不必要的麻煩。

5 用戶自定義數據類型

C語言允許用戶自己定義數據類型,通過使用結構體及typedef關鍵字。如定義類型:

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

上例定義了一個結構體類型mylist,并定義了三個結構體變量x,y,z。

6 強制轉換

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

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

計算完畢后,z=4。

7 函數

C語言中的函數執行獨立的任務。函數能夠被同一源文件中的其他函數調用,也可以由源文件之外的函數調用。
函數定義包含函數名以及被傳遞給函數的零個或多個參數列表。函數包含一個包含在大括號內的主體,主體中包含執行任務的指令。 函數可以返回特定類型的值。
函數返回特定數據類型的值(例如,實數),如果類型為void,則不返回任何值。 要確定DEFINE宏的返回數據類型,可查看udf.h文件中宏的相應#define語句。

8 數組

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

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

9 指針

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

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

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

int *ip;
ip =&a;

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

*ip =4;

當指針作為函數的參數,此時為傳址調用,在函數體內修改指針參數的值,會改變調用函數時傳遞的參數的值。此功能可以實現一個函數返回多個值。
如下的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;
}

輸出結果:

sum=3,a=5

傳遞的參數值被函數體內的程序改變。

10 流程控制

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

10.1 if語句

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

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

例如:

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

若邏輯判斷存在多個分支,可以采用if-else結構。如:

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

10.2 for循環

for語句常用于循環表達。

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

11 操作符

常用的代數操作符:

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

常用的邏輯操作符:

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

12 C庫函數

常用的三角函數:

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);

常用的數學函數:

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);

一些常用的標準輸入輸出函數:

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,...);

更多的內容可參閱C語言教程。


更多CFD資料可微信掃描下方二維碼關注微信公眾號。

微信掃碼關注公眾號

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281748.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281748.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281748.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java 畫磚塊,鋼筆畫入門:教你畫磚塊

說到磚塊很多朋友會想到搬磚&#xff0c;繪畫吧今天要教大家用鋼筆畫一塊磚&#xff0c;因為畫建筑的時候經常要畫磚墻&#xff0c;我們先從簡單的磚塊學起&#xff0c;之后繪畫吧會給大家分享畫一面磚墻的哦。繪制要點&#xff1a;本教程的主體物選擇了一塊有小殘缺面的磚頭。…

[轉] Node.js的線程和進程

[From] http://www.admin10000.com/document/4196.html 前言 很多Node.js初學者都會有這樣的疑惑&#xff0c;Node.js到底是單線程的還是多線程的&#xff1f;通過本章的學習&#xff0c;能夠讓讀者較為清晰的理解Node.js對于單/多線程的關系和支持情況。同時本章還將列舉一些讓…

第三方支付異步通知的陷阱

版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 https://blog.csdn.net/j16421881/article/details/78703792 用戶下單后調用第三方支付付款&#xff0c;然后接收第三方支付的異步通知&#xff0c;以便確認支付是否成功。 如下圖 但異步通知可能…

js請求php文件 302,采集某個 url, js 請求 200,瀏覽器訪問 302

/** 文件名: sso.js* 描述: 提供對 CAS 單點登錄的封裝** 功能說明&#xff1a;* 實現多個應用之間的單點登錄( SSO )功能&#xff0c;應用可以部署在不同的域名。容器的退出直接寫在頭里&#xff0c;避免 JS 過多加載** 版本: 1.0.0.1* 作者: [email protected]* 日期&#xf…

Jetty 類載入問題處理

前幾日使用 Jetty (9.2)部署公司一個 web 項目,這個項目原本部署在 Tomcat server上,一切正常,可是部署到 Jetty 后,啟動報錯.關鍵錯誤信息為"java.lang.NoClassDefFoundError: Could not initialize class org.apache.tomcat.jdbc.pool.DataSource" 項目使用了 Tomc…

2.3 萬 Star,Nginx 可視化配置工具

你好&#xff0c;這里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;實用的工具或組件&#xff0c;希望對您有用&#xff01;對于前后端開發工程師來說&#xff0c; Nginx 是必須掌握的工具&#xff0c;因為它不僅僅是一個 Web Server&#xff0c;還包含了其他…

城市智慧停車系統方案的產品設計體系介紹

最近幾年隨著大數據技術快速發展與應用&#xff0c;智慧城市隨即被正式提出。而且&#xff0c;我們也可以深刻感受到“智慧”正在慢慢改變我們的生活方式和城市。要讓城市變智慧的地方太多太多&#xff0c;當前我們接觸做多的可能就是外出停車&#xff0c;比如很多商場的停車系…

vue.js:利用vue.js做一個抽獎小游戲

MVVM模式是什么&#xff1a;MModel(模型)&#xff0c;VView&#xff08;視圖&#xff09;,VM ViewModel(簡寫成MVVM) . 代碼如下&#xff1a; 運行代碼結果&#xff1a; 1.你沒有中獎&#xff1a; 2.恭喜你&#xff0c;你中獎了&#xff1a; 轉載于:https://www.cnblogs.com/ya…

滾動加載數據 php,無刷新動態加載數據 滾動條加載適合評論等頁面

滾屏加載更多數據,適合評論等頁面本例的數據庫很簡單&#xff0c;一看就明了復制代碼 代碼如下:$querymysql_query("select * from content order by id desc limit 0,10");while ($rowmysql_fetch_array($query)) {?>js文件復制代碼 代碼如下:$(function(){var …

Java之品優購課程講義_day20(5)

資源過濾與變量替換 修改 pom.xml &#xff0c;在 build 節點中添加如下配置 <filters><filter>src/main/resources/filters/db_${env}.properties</filter></filters><resources><resource><directory>src/main/resources</dir…

國際主流固件接口組織UEFI全面支持LoongArch,龍架構已完成上游TianoCore EDK2代碼合并...

2022年9月初&#xff0c;UEFI官方組織在發布的UEFI specification V2.10規范中全面支持了LoongArch64架構以及部分LoongArch32架構。近期&#xff0c;龍芯團隊又完成了LoongArch基礎代碼與UEFI上游TianoCore EDK2的合并&#xff0c;LoongArch進入TianoCore EDK2主分支&#xff…

Invalidate和postInvalidate

為什么80%的碼農都做不了架構師&#xff1f;>>> Android提供了Invalidate方法實現界面刷新&#xff0c;但是Invalidate不能直接在線程中調用&#xff0c;因為他是違背了單線程模型&#xff1a;android UI操作并不是線程安全的&#xff0c;并且這些操作必須在UI線程…

java比c好逆向,吐槽一下java的效率。。。比起C差的真的好遠。。。

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓刷計算機編程題目&#xff0c;USACO某道題&#xff0c;因為最近想用java&#xff0c;就寫了一個&#xff0c;各種查錯優化之后總算通過了&#xff1a;TASK: camelotLANG: JAVACompiling...Compile: OKExecuting...Test 1: TEST OK …

.Net輕松處理億級數據--clickhouse及可視化界面安裝介紹

前言我是在17年就聽說過Clickhouse,那時還未接觸過億數據的運算&#xff0c;那時我在的小公司對于千萬數據的解決方案還停留在分庫分表&#xff0c;最好的也是使用mycat做的集群。這些解決方案都比較復雜&#xff0c;畢竟通常來說那些需要大量存儲的數據基本都是像日志&#xf…

[USACO 4.2] 完美的牛欄

★★☆ 輸入文件&#xff1a;stall4.in 輸出文件&#xff1a;stall4.out 簡單對比 時間限制&#xff1a;1 s 內存限制&#xff1a;128 MB USACO/stall4(譯by Felicia Crazy)描述 農夫約翰上個星期剛剛建好了他的新牛棚&#xff0c;他使用了最新的擠奶技術。不幸的是&am…

003Java語言環境搭建

JRE,JDK JRE(Java Runtime Environment java運行環境)&#xff1a;包括java虛擬機和java程序所需要的核心類庫&#xff0c; 如果要運行一個開發好的java程序&#xff0c;計算機中只需要安裝一個JRE JDK&#xff08;Java Development Kit Java開發工具包&#xff09; JDK是提供給…

php 編寫mysql,自己寫的MySQL類

自己寫的MySQL類---------- php debug ----------Serverlocalhost;DataBasemysql;UserIDroot;PassWord123456resource(5) of type (mysql result)Output completed (1 sec consumed) - Normal Terminationclass DBCLS{//debug 調試開關var $debug true;//debuginfo 錯誤信息&a…

NET CORE讀取Excel.xlsx單元格內的圖片,并關聯當前業務ID推送圖片到指定服務器...

NET CORE讀取Excel.xlsx單元格圖片的場景&#xff0c;一般是批量導入業務數據&#xff0c;例如&#xff1a;藥品的圖片&#xff0c;醫師資格證&#xff0c;商品上架、商家營業資質、水果信息、用戶頭像等等這里我截個圖&#xff0c;圖文并茂更好理解特別聲明&#xff1a;粘貼圖…

CSS或HTML如何實現文字下面加點?

就像word里文字加著重號一樣&#xff0c;在字的下面加一個點&#xff0c;用CSS怎么做&#xff1f;注意&#xff0c;我說的是下面加點&#xff0c;不是文字加粗或傾斜&#xff0c;請不要回答<strong>或<em>之類的。 把要著重加點的文字用<span></span>…

數據庫常見錯誤

錯誤&#xff1a; You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 12123123123.0123.0) at line 1 解決辦法&#xff1a; 檢查對應到您的MySQL服務器版本附近使用正確的語法手冊 數…