五十、UDF常見錯誤及報錯信息
1 UDF報錯
UDF錯誤主要分為兩類:
第一類:UDF代碼錯誤
這類錯誤非常常見,但是也非常容易解決,因為Build過程,控制臺會提示有問題的代碼行數(shù)。只要根據(jù)提示更改源代碼即可。
第二類:UDF設(shè)置出錯
這類錯誤原因非常多,基本特點就是Build能順利通過,load也沒問題。但是一計算或者初始化就有直接報錯。
常見的原因:UDM未開啟或數(shù)量不對;UDF中的thread、cell、face等數(shù)據(jù)結(jié)構(gòu)使用不當。
?
正確的UDF總是千篇一律,但錯誤的UDF卻各有各的錯誤。使用的多了會發(fā)現(xiàn)常見的錯誤基本就這么幾個,要注意排查。
?
以下介紹幾種常見的錯誤及對應(yīng)的報錯信息,以便大家進行UDF錯誤排查。
?
2?常見錯誤
2.1 常見錯誤1:UDF代碼存在問題
將UDF編譯Build之后,先不要點擊load,此時會出現(xiàn)如下圖一堆亂碼信息,我們需要從中找到有用的信息。如圖出現(xiàn)了下圖框出的部分
上圖中有warning行,當出現(xiàn)了warning行,不必理會,UDF可以正常進行計算
..........srcoriginal.c: warning C4819: ??????????????????
?
但是當出現(xiàn)了error行,則說明UDF代碼出現(xiàn)了問題。下面的報錯信息c(17)表明UDF的第17行代碼出現(xiàn)了問題,可針對此行進行修改。
........srcoriginal.c (17): error C2065: ??ter??:???????????
?
注:
1. 有時候報錯信息會很多,很多行都有問題。但是可能只修改一行代碼,錯誤完全消失。比如忘記聲明變量i,但是下面很多行都使用到了此變量,報錯信息就會很多。只要聲明了這個變量,錯誤信息都會消失。
2. 常見的代碼錯誤:
忘記寫分號;
使用全角符號()和;
沒有聲明變量
多了或者缺少{ ??}
?
2.2 常見錯誤2:環(huán)境變量配置失敗
UDF代碼沒問題的情況下,build也沒有報錯信息。但是點擊load,會彈出下圖窗口,說明環(huán)境變量配置不成功,需要重新配置環(huán)境變量。
The UDF library you are trying to load (libudf) is not compiled forparallel use on the current platform (win64).
注:
1. 下圖表示的是UDF沒有編譯成功。如果UDF代碼有誤,build后出現(xiàn)報錯信息,沒有修改UDF直接點擊load,也會彈出下面的窗口。
2. 一般環(huán)境變量配置不成功的話,點擊build會很快編譯完成,說明沒有編譯成功;而環(huán)境變量配置成功,點擊build,編譯過程會有一段時間,說明正在進行編譯。
?
3)?常見錯誤3:UDF命名出錯
UDF命名是有要求的,不能出現(xiàn)中文字符這一點大家都知道。
同時UDF的文件名中不能出現(xiàn)空格,這一點很容易被大家忽視。只要文件名中包含空格或者全角符號,那點擊build之后,就會出現(xiàn)下面的報錯信息。
此時報錯信息不會出現(xiàn)多少行代碼(類似c(17))出現(xiàn)問題,因此難以排查。報錯信息的最后一個后就是UDF的文件名,表示UDF 命名有問題。
?
2.4 常見錯誤4:UDM未開啟或數(shù)量不夠
當UDF中使用用戶自定義變量UDM時,必須開啟UDM,并且設(shè)置足夠多的數(shù)量,否則UDF會出錯。
這種情況下UDF編譯build通過,load也沒問題。
但是只要一點擊Calculate就立馬報錯。這時會出現(xiàn)下圖的報錯信息,Received signal SIGSEGV
SIGSEGV:SIG是信號名的通用前綴, SEGV是segmentation violation存儲器區(qū)段錯誤。這里就是指UDF中的UDM沒有分配內(nèi)存導(dǎo)致的錯誤。
只需要打開UDM,或者把UDM的數(shù)量調(diào)多就行,多了可以,但少了不行。
?
2.5 常見錯誤5:UDF數(shù)據(jù)結(jié)構(gòu)錯誤
UDF自定義內(nèi)部的數(shù)據(jù)結(jié)構(gòu)有很多,我們經(jīng)常用到的主要是三個:線程Thread、網(wǎng)格cell和面face。如果在UDF對這些數(shù)據(jù)結(jié)構(gòu)錯誤的使用,那么UDF編譯能正常通過,load也沒問題,但一點計算就會報錯。
比如thread1線程只進行了聲明,但并沒有從fluent獲取。如果直接使用thread1,則編譯通過,load通過,但點擊計算,可能會報下圖錯誤:Received signal SIGSEGV
?
這種問題,報錯的信息可能有很多種。但是基本都有一個特點,那就是編譯沒問題、load沒問題,但一點擊計算又出錯。
?
?
2.6 常見錯誤6:UDF被其他cas占用
UDF編譯的過程:選擇UDF后,點擊build,會生成一個libudf文件夾。點擊load后,fluent會直接調(diào)用libudf文件夾下的已經(jīng)編譯好的文件。
此時源UDF文件與fluent沒有任何關(guān)系,即使刪除掉源UDF文件,fluent也可以正常運行。但是不能刪掉libudf文件,這個文件會一直被fluent占用。
?
注:libudf是編譯過程生成的文件夾名稱,可在點擊build之前,在Library Name處更改此名。
正是由于上面的原因,又會引出一個UDF常見的問題。正常情況下,udf會被一個cas所使用,但如果兩個cas想同時使用一個udf,在cas1已經(jīng)使用此UDF進行計算的情況下,cas2如果仍然選擇這個UDF,點擊build之后,可能出現(xiàn)如下圖的報錯:
錯誤的原因:cas1已經(jīng)生成了libudf,并且已經(jīng)將這個libudf加載進fluent中了,也就是說libudf已經(jīng)被cas1占用了。此時cas2想再生成libudf,應(yīng)該要覆蓋掉之前的libudf文件夾,但由于libudf被占用,因此無法覆蓋,也就無法生成。
?
也就是說,這種錯誤和udf無關(guān),同一個文件夾下兩個完全不同的udf被兩個cas調(diào)用,如果這兩個cas編譯udf時生成的文件夾名稱相同,仍然會報上圖的錯誤。
?
解決辦法:解決辦法很簡單,兩個cas的Library Name取不同的名稱即可消除此錯誤。
?
?
2.7 常見錯誤7:libudf未正常更新
這種錯誤偶爾才會出現(xiàn)。
正常情況下,當UDF更改之后,需要重新對其編譯,如果不編譯,那還是使用原來的UDF進行計算。
但是在有些情況下,重新編譯UDF可能會不成功,但是控制臺不會出現(xiàn)進行報錯信息,計算也能夠正常進行。
怎么知道UDF是否正常更新呢?一方面如果計算殘差和原來一模一樣,沒有突變,那可能就有問題。
另一方面,查看libudf文件夾下的src文件夾,里面是fluent真正加載的UDF文件,打開這個文件,看看是否和新的UDF是否相同。
?
3 UDF正常編譯信息
什么樣的信息說明build沒有問題??
首先build加載時間比較長,其次文本控制臺沒有任何error的信息。可能會出現(xiàn)很多???或者亂碼,只要沒有error就行。比如下圖,盡管出現(xiàn)亂碼,但是沒有error,說明編譯正常。
4 UDF亂碼正常顯示
在windows平臺下,UDF編譯之后控制臺信息是亂碼的。可通過對電腦進行設(shè)置,使其正常顯示。
打開控制面板
點進去時鐘和區(qū)域--管理---更改系統(tǒng)區(qū)域設(shè)置
?
勾選Beta版,點擊確定,然后重啟電腦,此時fluent編譯UDF就不會出現(xiàn)亂碼了。但是UDF的一些中文注釋,可能會變成亂碼。
公眾號:Fluent學(xué)習(xí)筆記
為了方便大家學(xué)習(xí)交流,我創(chuàng)建了QQ群:466988009,大家可以在其中討論相關(guān)的問題,同時我會將所有文章的源文件都放到QQ群中,還會放一些其它的學(xué)習(xí)文件。歡迎大家加入。
?