Ansys Student 2020R2中Fluent編譯UDF簡介

小肥羊吃草不吃肉發表於2020-09-30

使用內建編譯器

在Ansys Fluent中編譯UDF一般都需要額外安裝相應版本的Visual Studio編譯器,VS的缺點是體量大,佔空間,安裝後還需要額外進行相關設定才能正常使用。而新版本的Ansys Fluent編譯UDF模組中提供了內建編譯器(Build-In Compiler),使得脫離VS編譯UDF稱為可能。

使用內建編譯器編譯一個測試UDF來看看效果,所使用的測試udf原始碼如下:

// message.c
#include "udf.h"
DEFINE_ON_DEMAND(say_hello)
{
    Message("hello, fluent udf compiler test\n");
}

按照正常的編譯流程走一遍,結果不能順利編譯(相同的錯誤在ansys論壇中也被提及點選跳轉),錯誤片段如下:

...
Copied D:\Documents\fluent_case\UDF_test_case/message.c to libudf\\src
(system "copy "G:\ANSYS Inc\ANSYS Student\v202\fluent"\fluent20.2.0\src\udf\sconstruct.udf "libudf\\win64\3d_host\SConstruct" ")
已複製         1 個檔案。
(system "copy "G:\ANSYS Inc\ANSYS Student\v202\fluent"\fluent20.2.0\src\udf\scons_test.bat "libudf\\win64\3d_host\scons_test.bat" ")
已複製         1 個檔案。
...
D:\\Documents\\fluent_case\\UDF_test_case\\libudf\\win64\\3d_node>G:\\ANSYS Inc\\ANSYS Student\\v202\\fluent/../commonfiles/CPython/3_7/winx64/Release/python/scons 
'G:\\ANSYS' 不是內部或外部命令,也不是可執行的程式
或批處理檔案。

注:Fluent整合的終端中顯示中文會亂碼,通過寫入transcript的方式可以正確顯示中文資訊。

可以看出,Ansys Fluent內建的編譯器是通過python的庫scons來實現的,與之相關的有兩個指令碼檔案sconstruct.udfscons_test.bat,而錯誤的原因很明顯:路徑中包含空格,路徑卻沒有使用雙引號!

下面給出解決方法和問題分析,只看解決方法即可,有時間可以看看問題分析

解決方法

Step1 修改G:\ANSYS Inc\ANSYS Student\v202\fluent\fluent20.2.0\src\udf\scons_test.bat檔案,給第3行新增雙引號:

set PYTHONHOME=%FLUENT_INC%/../commonfiles/CPython/3_7/winx64/Release/python
set PYTHONPATH=%FLUENT_INC%/../commonfiles/CPython/3_7/winx64/Release/python
"%FLUENT_INC%/../commonfiles/CPython/3_7/winx64/Release/python/scons"

Step2 修改G:\ANSYS Inc\ANSYS Student\v202\fluent\fluent20.2.0\src\udf\sconstruct.udf檔案,為bldcld的定義中$CC$CLINK變數新增雙引號:

bld = Builder(action = '"$CC" $CFLAGS $DINCPREFIX $SOURCE')
env.Append(BUILDERS = {'Foo' : bld})

cld = Builder(action = '"$CLINK" $DFLAGS /dll /out:$TARGET $SOURCES')
env.Append(BUILDERS = {'Foo_lib' : cld})

問題分析

一步一步來解決問題,檢查兩個指令碼檔案。在"G:\ANSYS Inc\ANSYS Student\v202\fluent"\fluent20.2.0\src\udf\scons_test.bat(按照自己的路徑找該檔案)中:

set PYTHONHOME=%FLUENT_INC%/../commonfiles/CPython/3_7/winx64/Release/python
set PYTHONPATH=%FLUENT_INC%/../commonfiles/CPython/3_7/winx64/Release/python
%FLUENT_INC%/../commonfiles/CPython/3_7/winx64/Release/python/scons

果然,line 3中沒有新增雙引號,如果路徑中包含空格(預設安裝ansys的路徑中包含多個空格),結果就會報錯,所以此處自己手動給line3兩端新增雙引號:"%FLUENT_INC%...scons",即:

set PYTHONHOME=%FLUENT_INC%/../commonfiles/CPython/3_7/winx64/Release/python
set PYTHONPATH=%FLUENT_INC%/../commonfiles/CPython/3_7/winx64/Release/python
"%FLUENT_INC%/../commonfiles/CPython/3_7/winx64/Release/python/scons"

再次使用內建的編譯器,按照正常的流程編譯,結果還是不能順利通過,再次檢查錯誤提示:

G:\\ANSYS Inc\\ANSYS Student\\v202\\fluent\\ntbin\\clang\\bin\\clang-cl 
/c /Za /DUDF_EXPORTING /DUDF_NT /DWIN64 /EHa /wd4224 -Wno-return-type 
-Wno-implicit-function-declaration 
...(此處抓重點,只看關鍵部分)
-I D:\\Documents\\fluent_case\\UDF_test_case\\libudf\\win64\\3d_host 
-I "G:\\ANSYS Inc\\ANSYS Student\\v202\\fluent\\ntbin\\clang\\VC\\include" 
-I "G:\\ANSYS Inc\\ANSYS Student\\v202\\fluent\\ntbin\\clang\\kit\\include\\shared" message.c
'G:\\ANSYS' 不是內部或外部命令,也不是可執行的程式

可以看出,實際呼叫的編譯命令是clang-cl,問題還是一樣:路徑中包含空格,路徑卻沒有使用雙引號!

檢視"G:\ANSYS Inc\ANSYS Student\v202\fluent"\fluent20.2.0\src\udf\sconstruct.udf檔案204~208行片段:

bld = Builder(action = '$CC $CFLAGS $DINCPREFIX $SOURCE')
env.Append(BUILDERS = {'Foo' : bld})

cld = Builder(action = '$CLINK $DFLAGS /dll /out:$TARGET $SOURCES')
env.Append(BUILDERS = {'Foo_lib' : cld})

其中$CC即對應這裡的編譯命令clang-cl,可以看出確實沒有新增雙引號,同樣,下面的連結器也沒有新增雙引號,手動新增之:

bld = Builder(action = '"$CC" $CFLAGS $DINCPREFIX $SOURCE')
env.Append(BUILDERS = {'Foo' : bld})

cld = Builder(action = '"$CLINK" $DFLAGS /dll /out:$TARGET $SOURCES')
env.Append(BUILDERS = {'Foo_lib' : cld})

再次使用內建編譯器,嘗試編譯:

# Build
...
2 warnings generated.
"G:\\ANSYS Inc\\ANSYS Student\\v202\\fluent\\ntbin\\clang\\bin\\lld-link" "G:\\ANSYS Inc\\ANSYS Student\\v202\\fluent\\fluent20.2.0\\win64\\3d_node\\fl_mpi2020.lib" "G:\\ANSYS Inc\\ANSYS Student\\v202\\fluent\\fluent20.2.0\\multiport\\win64\\mpi\\shared\\mport.lib" "G:\\ANSYS Inc\\ANSYS Student\\v202\\fluent\\ntbin\\clang\\VC\\lib\\amd64\\libcmt.lib" "G:\\ANSYS Inc\\ANSYS Student\\v202\\fluent\\ntbin\\clang\\VC\\lib\\amd64\\oldnames.lib" "G:\\ANSYS Inc\\ANSYS Student\\v202\\fluent\\ntbin\\clang\\kit\\lib\\winv6.3\\um\\x64\\kernel32.lib" /dll /out:libudf.dll message.obj udf_names.obj
scons: done building targets.

Done.

# Load
...
Laptopyz: Opening library "D:\\Documents\\fluent_case\\UDF_test_case\\libudf"...Done.

Laptopyz: Opening library "D:\\Documents\\fluent_case\\UDF_test_case\\libudf"...
	say_hello
Done.

可以看出,結果只有warning,能正常BuildLoad,以及呼叫。

使用Visual Studio編譯器

方法1

如果日常有使用VS的需求,可以通過配置VS環境來編譯UDF,一般安裝比Ansys版本低的VS即可,具體配置說明如下(參考:B站視訊,點選跳轉)。

啟動Fluent時,檢視Environment選項卡,其中指定了預設的VS環境配置指令碼udf.bat的路徑。

按照該路徑開啟指定檔案,即G:\ANSYS Inc\ANSYS Student\v202\fluent\ntbin\win64\udf.bat,修改相關內容:1)找到與自己所安裝的VS版本相對應的配置部分,比如本人電腦安裝的是VS2017社群版(對應version 150),找到2017對應的配置部分;2)將預設%ProgramFiles(x86)%替換成VS的安裝目錄,此處我的VS安裝在D:\Program Files (x86)

注:%ProgramFiles(x86)%為系統預設的一個環境變數,指向路徑C:\Program Files (x86),因此如果VS安裝在預設路徑下,應該能直接呼叫VS的編譯器來編譯UDF,否則就需要參考此處的做法來修改。

方法2

另一種使用VS編譯UDF的方式:在VS相關的命令提示符中啟動Fluent。

安裝VS之後,(在軟體啟動欄中)能發現隨之新新增了幾個與VS相關的命令提示符,比如適用於 VS 2017 的 x64 本機工具命令提示。開啟該命令提示符,在終端中輸入"G:\ANSYS Inc\ANSYS Student\v202\fluent\ntbin\win64\fluent.exe"啟動Fluent即可。

原理說明:VS相關的命令提示符啟動後,首先會啟用VS相關的環境變數,再該終端中啟用的程式(fluent)會自動應用相關的環境變數,因此可以直接呼叫VS的編譯器來編譯連結UDF。

方法3

此外,還可以使用第三方編譯UDF小軟體,感興趣的可以試試。
相關連結:編譯udf小軟體(附視訊教程)

相關文章