2024年3月15日發(作者:慘無人道的意思)

第七章 UDF的編譯與鏈接
編寫好UDF件(詳見第三章)后,接下來則準備編譯(或鏈接)它。
在7.2或7.3節中指導將用戶編寫好的UDF如何解釋、編譯成為共享目
標庫的UDF。
_ 第 7.1 節: 介紹
_ 第 7.2 節: 解釋 UDF
_ 第 7.3 節: 編譯 UDF
7.1 介紹
解釋的UDF和編譯的UDF其源碼產生途徑及編譯過程產生的結果代碼
是不同的。編譯后的UDF由C語言系統的編譯器編譯成本地目標碼。這
一過程須在FLUENT運行前完成。在FLUENT運行時會執行存放于共享庫
里的目標碼,這一過程稱為“動態裝載”。
另一方面,解釋的UDF被編譯成與體系結構無關的中間代碼或偽碼。
這一代碼調用時是在內部模擬器或解釋器上運行。與體系結構無關的
代碼犧牲了程序性能,但其UDF可易于共享在不同的結構體系之間,
即操作系統和FLUENT版本中。如果執行速度是所關心的,UDF文件可
以不用修改直接在編譯模式里運行。
為了區別這種不同,在FLUENT中解釋UDF和編譯UDF的控制面板其形式
是不同的。解釋UDF的控制面板里有個“Compile按鈕”,當點擊
“Compile按鈕”時會實時編譯源碼。編譯UDF的控制面板里有個“Open
按鈕”,當點擊“Open按鈕” 時會“打開”或連接目標代碼庫運行
FLUENT(此時在運行FLUENT之前需要編譯好目標碼)。
當FLUENT程序運行中鏈接一個已編譯好的UDF庫時,和該共享庫相關
的東西都被存放到ca文件中。因此,只要讀取ca文件,這個庫會
自動地鏈接到FLUENT處理過程。同樣地,一個已經經過解釋的UDF文
件在運行時刻被編譯,用戶自定義的C函數的名稱與內容將會被存放
到用戶的ca文件中。只要讀取這個ca文件,這些函數會被自動編
譯。
注:已編譯的UDF所用到的目標代碼庫必須適用于當前所使用的計算
機體系結構、操作系統以及FLUENT軟件的可執行版本。一旦用戶的
FLUENT升級、操作系統改變了或者運行在不同的類型的計算機,必須
重新編譯這些庫。
UDF必須用DEFINE宏進行定義,DEFINE宏的定義是在udf.h文件中。因
此,在用戶編譯UDF之前,udf.h文件必須被放到一個可被找到的路徑,
或者放到當前的工作目錄中。
udf.h文件放置在:
path
//fluent6.
+x
/src/udf.h
其中path是Fluent軟件的安裝目錄,即目錄。X代表了你
所安裝的版本號。
通常情況下,用戶不應該從安裝默認目錄中復制udf.h文件。編譯器
先在當前目錄中尋找該文件,如果沒找到,編譯器會自動到/src目錄
下尋找。如果你升級了軟件的版本,但是沒有從你的工作目錄中刪除
舊版本的udf.h文件,你則不能訪問到該文件的最新版本。在任何情
況下都不應該改變udf.h文件。
7.2 UDF解釋
這一節介紹編譯經過解釋的UDF的步驟。一旦經過解釋的UDF被編譯,
用戶自定義的C函數的名稱與內容將會被存放到ca文件中。只要讀
取這個ca文件,這些函數便會自動被編譯。
編譯被解釋的UDF的一般程序如下:
1. 如果用戶沒有在網絡Windows計算機上使用并行的FLUENT版本,則
需要確定UDF的C源碼和ca文件與當前工作目錄一致。具體步驟見
7.2.2節。
! 如果源碼不在當前工作目錄,則用戶編譯UDF時,用戶必須在解釋
UDF的控制面板里輸入文件的完全路徑,而不是只輸入文件名。
2. 在當前工作目錄下運行FLUENT。
3. 讀取(或建立)ca文件。
4. 打開“Interpreted UDFs panel”,編譯UDF(如vprofile.c)。
圖7.2.1 解釋的UDF的控制面板
(a) 在“Source File Name”下輸入C源碼的文件名(如vprofile.c)。
! 如果自定義的C源碼不在工作目錄中,用戶必須輸入完全的自定義
的C函數路徑。
當寫入ca文件時,自定義源碼的名稱(或源碼的完全路徑)會存放
到ca文件中。
(b) 在“CPP Command Name”指定為C的預處理程序。當然也有其它
有效的ANSI C預處理程序,包括gcc -E和cc –E。詳細檢查所用
的計算機系統管理。
(c) 如果自定義函數局部變量數不引起棧的溢出,則保持“Stack
Size”的默認值為1000。此時,所設 “Stack Size” 的數要遠
遠大于局部變量用的數。
(d) 選擇“Display Asmbly Listing”,則當函數編譯匯編碼的清
單會出現在窗口的控制臺內。這一選項會保存于ca文件,當用
戶接著運行FLUENT時匯編碼會自動顯示。
(e) 如果用戶使用“Fluent Inc”提供的C預處理程序,選擇“U
Contributed CPP”。
(f) 點擊“Compile”編譯UDF。
自定義C程序的名稱和內容會存入于所寫的ca文件。只要編譯UDF,
匯編碼會出現在控制窗口,所示范例如下。
(g) 編譯結束點擊“Clo”。
! 如果在一次模擬中使用多于一個的UDF,用戶需要將這些函數連接
在一個C文件中,例如all.c。然后用“Interpreted UDFs”面板編
譯連接的文件。這些函數可以作為邊界條件、源項及特性等。
7.2.2 基于Windows并行網絡的目錄結構
在基于Windows網絡上使用并行FLUENT版本需要專門的方法組織用戶
文件。具體步驟如下:
1. 在“”目錄下創建一個名為“udf” 的可寫子目錄。
2. 在udf目錄下創建子目錄(如myudf),將UDF的C
源碼存放于這個目錄下。如果在同一串下多個用戶運行工作,每
個用戶在udf目錄下創建自己的子目錄(如
abcudf和xyzudf)。
! 因為源碼不在當前工作目錄下,所以在編譯UDF時必須在
“Interpreted UDFs”面板中輸入文件的完全路徑。例如,編譯
example.c文件時,輸入如下:
3. 確定所建立的ca文件在當前工作目錄下。
7.2.3 調試解釋的UDF
編譯UDF時出錯信息會出現在控制窗口中。用戶有可能因錯誤滾動太
快不能看到所用的出錯信息。因此調試UDF時用戶想關掉“Display
Asmbly Listing”。
如果在調試UDF的過程中一直打開“Interpreted UDFs”面板,由于
在獨立窗口進行編輯,編譯按鈕則會不斷重復編譯。然后,直到無出
錯信息調試和編譯才會結束。
下面介紹一個出錯例子,即在“Interpreted UDFs”控制面板中,編
譯被解釋過的UDF時指定了錯誤的源文件。上面曾介紹過如果僅僅從
當前工作目錄下啟動FLUENT,在“Interpreted UDFs”控制面板中鍵
入用戶的C源碼的文件名,則ca文件和C源碼被指定于當前工作目錄
下。如果用戶編譯的C源碼與工作目錄是不同的路徑,用戶必須輸入C
源碼所在的完整路徑。否則會出現以下的錯誤信息:
gcc: vprofile.c: No such file or directory
gcc: No input files
Error: vprofile.c: line 1: syntax error.
如果編譯UDF寫完ca文件后,接著移動C源碼到不同位置,會在接著
運行FLUENT的過程中產生同樣的錯誤信息。
為了避免錯誤,只需要在“Interpreted UDFs”控制面板中的“Source
File Name”下輸入完全的路徑名,然后點擊“Compile”。此時寫ca
文件會保存C源碼的新路徑。
7.3 編譯UDF
這一節介紹如何鏈接編譯好的UDF。這一過程需要使用C編譯器。大部
分UNIX的操作系統提供了C編譯器。如果在PC機上運行,需要安裝VC++
編譯器(如微軟C++、v6.0或更高的版本)。一旦編譯好的UDF庫文件
在FLUENT運行時鏈接到FLUENT處理過程,和共享庫相關的東西會保存
到ca文件。因此,只要讀取ca文件,編譯的庫文件會自動鏈接到
FLUENT處理過程。在控制窗口將會出現鏈接狀態的報告如下:
Opening library "libp1/ultra/2d/"...
p1_adjust
energy_source
p1_source
p1_diffusivity
p1_bc
Done.
7.3.1 一般程序
編譯和鏈接一個編譯好的UDF的一般程序如下所示:
1. 在當前工作目錄下,建立專門的目錄結構(見7.3.2節)。
2. 編譯用戶的UDF和修建共享庫(見7.3.3節)。
3. 在當前工作目錄下運行FLUENT。
4. 讀取(或建立)ca文件(確信ca文件在當前工作目錄下)。
5. 鏈接共享庫到FLUENT(見7.3.4節)。
7.3.2 建立目錄結構
對于UNIX系統和Windows系統來說,目錄結構是不同的。下面分別介
紹在兩種系統下如何建立目錄結構。
UNIX系統
對于UNIX系統下編譯的UDF來說,和2兩個
文件在編譯UDF庫被需要。makefile文件包含了用戶自定義部分,在
這部分允許輸入用戶源函數和FLUENT的安裝路徑。這些文件的完整路
徑如下:
path
//fluent6.
+x
/src/
path
//fluent6.
+x
/src/2
其中
path是用戶直接安裝
的路徑,
x是用戶安裝
Fluent
版
本的相應數(如,
fluent6.0為0)。
! FLUENT安裝后所釋放的2文件名為。
下面介紹建立共享庫所要求的目錄結構。通過下面的例子來介紹目錄
結構的建立,如圖7.3.1所示。
圖7.3.1 為編譯好的UDF建立庫目錄的樣本(UNIX)
需要注意的是在圖7.3.1所示的目錄結構為FLUENT的兩種版本:二維
單精度串型和二維單精度平行。
!不要在目錄(2d,2d host,等等)下存放任何文件。當編譯用戶庫
(見7.3.3節)時,圖7.3.1中所示的文件會自動存放。
1. 在當然工作目錄下,創建一個儲存用戶庫的目錄(如libudf)。
2. 從以上所示目錄下復制2到用戶目錄(如libudf),
且改名為Makefile。
3. 在用戶創建的庫目錄下,建立一個儲存用戶源碼、命名為src的源
碼目錄。
4. 復制用戶源碼(如udfexample.c)到所建的/src目錄下。
5. 從以上所示目錄下復制到用戶的/src目錄,并且命
名為makefile。
6. 鑒別FLUENT所運行的計算機的體系機構。
(a) 開始FLUENT程序。
(b) 向上滾動FLUENT的控制窗口到“Starting”信息處,鑒定FLUENT
的體系機構。
(c) 退出FLUENT程序。
! 如果體系機構是irix6.5,需要在makefile進行額外的修改。
7. 為體系機構所建不同版本下創建目錄(如ultra/2d和ultra/3d)。
存在的版本如下所示:
z single-precision rial 2D or 3D: 2d or 3d
z double-precision rial 2D or 3D: 2ddp or 3ddp
z single-precision parallel 2D or 3D: 2d_node and
2d_host or 3d_node and 3d_host
z double-precision parallel 2D or 3D: 2ddp_node and
2ddp_host or 3ddp_node and 3ddp_host
! 需要注意:不管計算節點的數量,用戶必須為每個并行版本的求解
器(如在三維下有兩個目錄,二維雙精度版本下有兩個目錄,等等)
創建兩個調試目錄。
!不要在目錄(2d,2d host,等等)下存放任何文件。當編譯用戶庫
(見7.3.3節)時,圖7.3.1中所示的文件會自動存放。
Windows系統
對于Windows系統下編譯的UDF來說,makefile_和ur_
兩個文件在編譯UDF庫被需要。ur_文件中包含了用戶自定義
部分,在這部分允許輸入用戶源函數及其它信息。
為了建立共享庫所要求的目錄結構,需要按照上面所講的操作步驟進
行。通過下面的例子來介紹目錄結構的建立,如圖7.3.2所示。
需要注意的是在圖7.3.2所示的目錄結構為FLUENT的兩種版本:二維
單精度串型和二維單精度并行。
圖7.3.2 為編譯好的UDF建立庫目錄的樣本(Windows)
1. 在當前工作目錄下,創建一個儲存用戶庫的目錄(如libudf)。
2. 在用戶創建的庫目錄下,建立一個儲存用戶源碼、命名為src的源
碼目錄。
3. 復制用戶源碼(如udfexample.c)到所建的/src目錄下。
4. 建立所使用體系機構的目錄,如基于Windows的Intel系統使用的
目錄為ntx86。
5. 針對所用的體系機構建立不同版本的目錄(如ntx862d)。存在
的版本如下所示:
z single-precision rial 2D or 3D: 2d or 3d
z double-precision rial 2D or 3D: 2ddp or 3ddp
z single-precision parallel 2D or 3D: 2d_node and
2d_host or 3d_node and 3d_host
z double-precision parallel 2D or 3D: 2ddp_node and
2ddp_host or 3ddp_node and 3ddp_host
! 需要注意:不管計算節點的數量,用戶必須為每個并行版本的求解
器(如在三維下有兩個目錄,二維雙精度版本下有兩個目錄,等等)
創建兩個調試目錄。
6.復制makefile_和ur_到相應版本所建的目錄下,如
2d。
! 對于并行的版本來說,一定要復制這兩個文件到主機和節點目錄,
即如圖7.3.2所示的2d_node and 2d_host目錄。
這兩個文件的完整路徑如下:
path
ent6.
+x
srcmakefile_
path
ent6.
+x
srcur_
其中
path是用戶直接安裝
的路徑,
x是用戶安裝
Fluent
版
本的相應數(如,
fluent6.0為0)。
! 確定makefile_和ur_為最新版本所用文件。如果安
裝新的FLUENT 6版本,必須復制新的makefile_和
ur_到相應的創建目錄。
7. 重命名makefile_為makefile。
7.3.3 編譯和創建用戶共享庫
下面分別介紹UNIX和Windows系統下如何編譯和創建共享庫。
UNIX系統
在建立目錄并存放文件到相應位置后,便能開始編譯和創建共享庫。
1. 在用戶的src目錄下編輯文件makefile,設置參數如下:
z SOURCES = 編譯好的用戶自定義函數
z FLUENT INC = 用戶的安裝路徑
下面是一個makefile的例子:
#-----------------------------------------------------
------#
# makefile for ur defined functions.
#
#-----------------------------------------------------
------#
#-----------------------------------------------------
------#
# Ur modifiable ction.
#-----------------------------------------------------
------#
SOURCES= udfexample.c
FLUENT_INC= /path/
#-----------------------------------------------------
------#
# Build targets (do not modify below this line).
#-----------------------------------------------------
------#
.
.
2. 如果體系機構是irix6.5,還需要在makefile中進行附加變化。
(a) 找到makefile文件中找到下面的命令行
CFLAGS_IRIX6R10= -KPIC -ansi -fullwarn -O -n32
(b) 改變“-ansi”為“-xansi”,即
CFLAGS_IRIX6R10= -KPIC -xansi -fullwarn -O -n32
對于其它的體系機構不需要進行以上變動。
3. 在工作目錄(如libudf)下,執行make命令,包含前一步(在7.3.2
節)確定的體系機構(如ultra),即
make "FLUENT ARCH=ultra"
控制窗口顯示信息為:
# linking to ../../src/udfexample.c in ultra/2d
# linking to ../../src/makefile in ultra/2d
# building library in ultra/2d
# linking to ../../src/udfexample.c in ultra/3d
# linking to ../../src/makefile in ultra/3d
# building library in ultra/3d
以上面的makefile為例,用戶自定義函數udfexample.c被編譯和存放
于版本所指定的共享庫中,如在圖7.3.1中所示的2d,
2d_host和2d_node。雖然在這個例子中只用了一個C函數,但是用戶
在“SOURCES = in the makefile”下可通過空格分隔多個源文件。
Windows系統
在建立目錄并存放文件到相應位置后,便能開始編譯和創建共享庫。
1. 用文本文件編譯ur_文件,設置參數為:
z SOURCES =編譯好的用戶自定義函數。在每個文件前加前綴
$(SRC),如 一個函數為$(SRC)udfexample.c,兩個函數
為$(SRC)udfexample.c $ (SRC)udfexample2.c)。
z VERSION =所用版本,即如圖7.3.2所示2d,3d,2ddp,3ddp,
2d host,2d node,3d host,3d node,2ddp host,2ddp node,
3ddp host,或3ddp node。
z PARALLEL NODE =并行連接庫。對于求解器的一系列版本無指
定的并行連接庫。可能的輸入為:
-{ none: rial
-{ smpi: parallel using shared memory (for
multiprocessor machines)
-{ vmpi: parallel using shared memory or network with
vendor MPI software
-{ net: parallel using network communicator with
RSHD software
! 如果使用的是并行求解器,需要復制兩個ur_文件(一個
是主目錄的,一個是節點目錄),并且指定兩個文件適當的SOURCE,
VERSION, and PARALLEL NODE。
下面給出ur_文件的一個例子:
對于指定多個用戶定義函數只需要在SOURCES下輸入它們,并用空格
分開即可。
2. 在MS-DOS 命令提示窗口,鍵入nmake建立目錄,如
libudfntx862d。
需要注意的是如果創建存在問題,通過鍵入nmake clean來進行完
整的重建。
7.3.4 連接共享庫到FLUENT可執行文件
按照7.3.3小節所示的unix或windows環境下的步驟編譯共享庫后,就
可以將其連接到FLUENT程序中。將共享庫連接到FLUENT程序中的步驟
如下:
1. 從當前工作目錄下啟動FLUENT。
2. 讀取(或設置)ca文件。(確認此ca文件保存在當前的工作
目錄下。)
3. 連接共享庫到FLUENT執行文件中。
(a) 如果共享庫保存在當前工作目錄中,在Library Name對話框中
輸入相對路徑(例如, libudf), 否則輸入完整路徑,(例如,
~myhome/myfiles/libudf).
!注意,如果存放共享庫的目錄不在當前的工作目錄或其子目錄下,
一定要輸入完整的路徑名。
(b) 單擊Open按鈕,這會將共享庫連接到FLUENT執行文件中。求
解器會自動搜索相應的結構格式和版本。一旦共享庫連接到
FLUENT執行文件以及ca文件被寫入以后,此連接關系就被保存
在ca文件中。因此,無論何時將ca文件讀入FLURENT,此共
享庫都會被自動連接。
7.3.5 編譯和連接共享庫時常見的錯誤
指定庫的名稱
僅當從當前的工作目錄下運行FLUENT并且共享庫的目錄是當前工作
目錄的子目錄時,才可以在Compiled UDFs 面板上直接輸入共享庫的
目錄(例如libudf)。如果被使用的共享庫不在上述位置上,連接此共
享庫時,必須提供其完整的路徑。否則會出現以下錯誤:
Opening library "libudf/ultra/3d/"...
Error: open_udf_library: couldn't open library:
libudf/ultra/3d/
如果將共享庫移至其他的位置,而要讀入的ca文件又包含此共享庫
的連接,也會出現上述錯誤信息。
解決方法
為了解決這個問題,可以在Library Name in the Compiled UDFs 面
板上輸入共享庫的完整路徑,然后單擊Open按鈕。雖然同樣的錯誤信
息仍將出現,但是新的路徑會保存在ca文件中。重新讀入ca文件
就會得到正確的連接。
使用不同版本的FLUENT
如果采用一個版本的FLUENT(例如6.0.1)編譯UDF,而試圖采用另一個
不同的版本(例如6.0.2)讀入ca文件時,會出現以下錯誤:
Error: open_udf_library: library version 6.0.1 incompatible
with solver version 6.0.2
解決辦法
用新版本的FLUENT重新編譯UDF,然后再次讀入ca文件。
本文發布于:2024-03-15 00:16:11,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/1710432971161012.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:Fluent中的UDF詳細中文教程(7).doc
本文 PDF 下載地址:Fluent中的UDF詳細中文教程(7).pdf
| 留言與評論(共有 0 條評論) |