五十、UDF常見錯(cuò)誤及報(bào)錯(cuò)信息

1 UDF報(bào)錯(cuò)

UDF錯(cuò)誤主要分為兩類:

第一類:UDF代碼錯(cuò)誤

這類錯(cuò)誤非常常見,但是也非常容易解決,因?yàn)锽uild過程,控制臺(tái)會(huì)提示有問題的代碼行數(shù)。只要根據(jù)提示更改源代碼即可。

第二類:UDF設(shè)置出錯(cuò)

這類錯(cuò)誤原因非常多,基本特點(diǎn)就是Build能順利通過,load也沒問題。但是一計(jì)算或者初始化就有直接報(bào)錯(cuò)。

常見的原因:UDM未開啟或數(shù)量不對(duì);UDF中的thread、cell、face等數(shù)據(jù)結(jié)構(gòu)使用不當(dāng)。

 

五十、UDF常見錯(cuò)誤及報(bào)錯(cuò)信息的圖1

正確的UDF總是千篇一律,但錯(cuò)誤的UDF卻各有各的錯(cuò)誤。使用的多了會(huì)發(fā)現(xiàn)常見的錯(cuò)誤基本就這么幾個(gè),要注意排查。

 

五十、UDF常見錯(cuò)誤及報(bào)錯(cuò)信息的圖2

以下介紹幾種常見的錯(cuò)誤及對(duì)應(yīng)的報(bào)錯(cuò)信息,以便大家進(jìn)行UDF錯(cuò)誤排查。

 

2 常見錯(cuò)誤

2.1 常見錯(cuò)誤1:UDF代碼存在問題

 

將UDF編譯Build之后,先不要點(diǎn)擊load,此時(shí)會(huì)出現(xiàn)如下圖一堆亂碼信息,我們需要從中找到有用的信息。如圖出現(xiàn)了下圖框出的部分

五十、UDF常見錯(cuò)誤及報(bào)錯(cuò)信息的圖3

上圖中有warning行,當(dāng)出現(xiàn)了warning行,不必理會(huì),UDF可以正常進(jìn)行計(jì)算

.....\.....\src\original.c: warning C4819: ??????????????????

 

但是當(dāng)出現(xiàn)了error行,則說明UDF代碼出現(xiàn)了問題。下面的報(bào)錯(cuò)信息c(17)表明UDF的第17行代碼出現(xiàn)了問題,可針對(duì)此行進(jìn)行修改。

....\....\src\original.c (17): error C2065: ??ter??:???????????

 

注:

1. 有時(shí)候報(bào)錯(cuò)信息會(huì)很多,很多行都有問題。但是可能只修改一行代碼,錯(cuò)誤完全消失。比如忘記聲明變量i,但是下面很多行都使用到了此變量,報(bào)錯(cuò)信息就會(huì)很多。只要聲明了這個(gè)變量,錯(cuò)誤信息都會(huì)消失。

2. 常見的代碼錯(cuò)誤:

忘記寫分號(hào);

使用全角符號(hào)()和;

沒有聲明變量

多了或者缺少{  }

 

2.2 常見錯(cuò)誤2:環(huán)境變量配置失敗

 

UDF代碼沒問題的情況下,build也沒有報(bào)錯(cuò)信息。但是點(diǎn)擊load,會(huì)彈出下圖窗口,說明環(huán)境變量配置不成功,需要重新配置環(huán)境變量。

The UDF library you are trying to load (libudf) is not compiled forparallel use on the current platform (win64).

 

五十、UDF常見錯(cuò)誤及報(bào)錯(cuò)信息的圖4

注:

1. 下圖表示的是UDF沒有編譯成功。如果UDF代碼有誤,build后出現(xiàn)報(bào)錯(cuò)信息,沒有修改UDF直接點(diǎn)擊load,也會(huì)彈出下面的窗口。

2. 一般環(huán)境變量配置不成功的話,點(diǎn)擊build會(huì)很快編譯完成,說明沒有編譯成功;而環(huán)境變量配置成功,點(diǎn)擊build,編譯過程會(huì)有一段時(shí)間,說明正在進(jìn)行編譯。

 

3) 常見錯(cuò)誤3:UDF命名出錯(cuò)

UDF命名是有要求的,不能出現(xiàn)中文字符這一點(diǎn)大家都知道。

同時(shí)UDF的文件名中不能出現(xiàn)空格,這一點(diǎn)很容易被大家忽視。只要文件名中包含空格或者全角符號(hào),那點(diǎn)擊build之后,就會(huì)出現(xiàn)下面的報(bào)錯(cuò)信息。

 

五十、UDF常見錯(cuò)誤及報(bào)錯(cuò)信息的圖5

此時(shí)報(bào)錯(cuò)信息不會(huì)出現(xiàn)多少行代碼(類似c(17))出現(xiàn)問題,因此難以排查。報(bào)錯(cuò)信息的最后一個(gè)\后就是UDF的文件名,表示UDF 命名有問題。

 

2.4 常見錯(cuò)誤4:UDM未開啟或數(shù)量不夠

當(dāng)UDF中使用用戶自定義變量UDM時(shí),必須開啟UDM,并且設(shè)置足夠多的數(shù)量,否則UDF會(huì)出錯(cuò)。

這種情況下UDF編譯build通過,load也沒問題。

但是只要一點(diǎn)擊Calculate就立馬報(bào)錯(cuò)。這時(shí)會(huì)出現(xiàn)下圖的報(bào)錯(cuò)信息,Received signal SIGSEGV

 

五十、UDF常見錯(cuò)誤及報(bào)錯(cuò)信息的圖6

 

SIGSEGV:SIG是信號(hào)名的通用前綴, SEGV是segmentation violation存儲(chǔ)器區(qū)段錯(cuò)誤。這里就是指UDF中的UDM沒有分配內(nèi)存導(dǎo)致的錯(cuò)誤。

只需要打開UDM,或者把UDM的數(shù)量調(diào)多就行,多了可以,但少了不行。

 

五十、UDF常見錯(cuò)誤及報(bào)錯(cuò)信息的圖7

 

2.5 常見錯(cuò)誤5:UDF數(shù)據(jù)結(jié)構(gòu)錯(cuò)誤

UDF自定義內(nèi)部的數(shù)據(jù)結(jié)構(gòu)有很多,我們經(jīng)常用到的主要是三個(gè):線程Thread、網(wǎng)格cell和面face。如果在UDF對(duì)這些數(shù)據(jù)結(jié)構(gòu)錯(cuò)誤的使用,那么UDF編譯能正常通過,load也沒問題,但一點(diǎn)計(jì)算就會(huì)報(bào)錯(cuò)。

比如thread1線程只進(jìn)行了聲明,但并沒有從fluent獲取。如果直接使用thread1,則編譯通過,load通過,但點(diǎn)擊計(jì)算,可能會(huì)報(bào)下圖錯(cuò)誤:Received signal SIGSEGV

 

五十、UDF常見錯(cuò)誤及報(bào)錯(cuò)信息的圖8

 

這種問題,報(bào)錯(cuò)的信息可能有很多種。但是基本都有一個(gè)特點(diǎn),那就是編譯沒問題、load沒問題,但一點(diǎn)擊計(jì)算又出錯(cuò)。

 

 

2.6 常見錯(cuò)誤6:UDF被其他cas占用

 

UDF編譯的過程:選擇UDF后,點(diǎn)擊build,會(huì)生成一個(gè)libudf文件夾。點(diǎn)擊load后,fluent會(huì)直接調(diào)用libudf文件夾下的已經(jīng)編譯好的文件。

此時(shí)源UDF文件與fluent沒有任何關(guān)系,即使刪除掉源UDF文件,fluent也可以正常運(yùn)行。但是不能刪掉libudf文件,這個(gè)文件會(huì)一直被fluent占用。

 

注:libudf是編譯過程生成的文件夾名稱,可在點(diǎn)擊build之前,在Library Name處更改此名。

 

五十、UDF常見錯(cuò)誤及報(bào)錯(cuò)信息的圖9

正是由于上面的原因,又會(huì)引出一個(gè)UDF常見的問題。正常情況下,udf會(huì)被一個(gè)cas所使用,但如果兩個(gè)cas想同時(shí)使用一個(gè)udf,在cas1已經(jīng)使用此UDF進(jìn)行計(jì)算的情況下,cas2如果仍然選擇這個(gè)UDF,點(diǎn)擊build之后,可能出現(xiàn)如下圖的報(bào)錯(cuò):

 

五十、UDF常見錯(cuò)誤及報(bào)錯(cuò)信息的圖10

錯(cuò)誤的原因:cas1已經(jīng)生成了libudf,并且已經(jīng)將這個(gè)libudf加載進(jìn)fluent中了,也就是說libudf已經(jīng)被cas1占用了。此時(shí)cas2想再生成libudf,應(yīng)該要覆蓋掉之前的libudf文件夾,但由于libudf被占用,因此無(wú)法覆蓋,也就無(wú)法生成。

 

也就是說,這種錯(cuò)誤和udf無(wú)關(guān),同一個(gè)文件夾下兩個(gè)完全不同的udf被兩個(gè)cas調(diào)用,如果這兩個(gè)cas編譯udf時(shí)生成的文件夾名稱相同,仍然會(huì)報(bào)上圖的錯(cuò)誤。

 

解決辦法:解決辦法很簡(jiǎn)單,兩個(gè)cas的Library Name取不同的名稱即可消除此錯(cuò)誤。

 

 

2.7 常見錯(cuò)誤7:libudf未正常更新

這種錯(cuò)誤偶爾才會(huì)出現(xiàn)。

正常情況下,當(dāng)UDF更改之后,需要重新對(duì)其編譯,如果不編譯,那還是使用原來的UDF進(jìn)行計(jì)算。

但是在有些情況下,重新編譯UDF可能會(huì)不成功,但是控制臺(tái)不會(huì)出現(xiàn)進(jìn)行報(bào)錯(cuò)信息,計(jì)算也能夠正常進(jìn)行。

怎么知道UDF是否正常更新呢?一方面如果計(jì)算殘差和原來一模一樣,沒有突變,那可能就有問題。

另一方面,查看libudf文件夾下的src文件夾,里面是fluent真正加載的UDF文件,打開這個(gè)文件,看看是否和新的UDF是否相同。

 

五十、UDF常見錯(cuò)誤及報(bào)錯(cuò)信息的圖11

 

3 UDF正常編譯信息

什么樣的信息說明build沒有問題??

首先build加載時(shí)間比較長(zhǎng),其次文本控制臺(tái)沒有任何error的信息。可能會(huì)出現(xiàn)很多???或者亂碼,只要沒有error就行。比如下圖,盡管出現(xiàn)亂碼,但是沒有error,說明編譯正常。

 

五十、UDF常見錯(cuò)誤及報(bào)錯(cuò)信息的圖12

 

 

4 UDF亂碼正常顯示

在windows平臺(tái)下,UDF編譯之后控制臺(tái)信息是亂碼的。可通過對(duì)電腦進(jìn)行設(shè)置,使其正常顯示。

打開控制面板

 

五十、UDF常見錯(cuò)誤及報(bào)錯(cuò)信息的圖13

點(diǎn)進(jìn)去時(shí)鐘和區(qū)域--管理---更改系統(tǒng)區(qū)域設(shè)置

 

五十、UDF常見錯(cuò)誤及報(bào)錯(cuò)信息的圖14

勾選Beta版,點(diǎn)擊確定,然后重啟電腦,此時(shí)fluent編譯UDF就不會(huì)出現(xiàn)亂碼了。但是UDF的一些中文注釋,可能會(huì)變成亂碼。

為了方便大家學(xué)習(xí)交流,我創(chuàng)建了QQ群:群一人數(shù)已滿員,可加二群:876525686,大家可以在其中討論相關(guān)的問題,同時(shí)我會(huì)將所有文章的源文件都放到QQ群中,還會(huì)放一些其它的學(xué)習(xí)文件。歡迎大家加入。

登錄后免費(fèi)查看全文
立即登錄
App下載
技術(shù)鄰APP
工程師必備
  • 項(xiàng)目客服
  • 培訓(xùn)客服
  • 平臺(tái)客服

TOP

2