首页/文章/ 详情

五十、UDF常见错误及报错信息

1年前浏览985

1 UDF报错

   

UDF错误主要分为两类:

第一类:UDF代码错误

这类错误非常常见,但是也非常容易解决,因为Build过程,控制台会提示有问题的代码行数。只要根据提示更改源代码即可。


第二类:UDF设置出错

这类错误原因非常多,基本特点就是Build能顺利通过,load也没问题。但是一计算或者初始化就有直接报错。

常见的原因:UDM未开启或数量不对;UDF中的thread、cell、face等数据结构使用不当。

 

 


正确的UDF总是千篇一律,但错误的UDF却各有各的错误。使用的多了会发现常见的错误基本就这么几个,要注意排查。

 

 

以下介绍几种常见的错误及对应的报错信息,以便大家进行UDF错误排查。

 

2 常见错误

   

2.1 常见错误1:UDF代码存在问题

 

将UDF编译Build之后,先不要点击load,此时会出现如下图一堆乱码信息,我们需要从中找到有用的信息。如图出现了下图框出的部分

 

上图中有warning行,当出现了warning行,不必理会,UDF可以正常进行计算

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

 

但是当出现了error行,则说明UDF代码出现了问题。下面的报错信息c(17)表明UDF的第17行代码出现了问题,可针对此行进行修改。

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

 

注:

1. 有时候报错信息会很多,很多行都有问题。但是可能只修改一行代码,错误完全消失。比如忘记声明变量i,但是下面很多行都使用到了此变量,报错信息就会很多。只要声明了这个变量,错误信息都会消失。


2. 常见的代码错误:

忘记写分号;

使用全角符号()和;

没有声明变量

多了或者缺少{   }

 

2.2 常见错误2:环境变量配置失败

 

UDF代码没问题的情况下,build也没有报错信息。但是点击load,会弹出下图窗口,说明环境变量配置不成功,需要重新配置环境变量。

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

 

 

注:

1. 下图表示的是UDF没有编译成功。如果UDF代码有误,build后出现报错信息,没有修改UDF直接点击load,也会弹出下面的窗口。


2. 一般环境变量配置不成功的话,点击build会很快编译完成,说明没有编译成功;而环境变量配置成功,点击build,编译过程会有一段时间,说明正在进行编译。

 

3) 常见错误3:UDF命名出错

UDF命名是有要求的,不能出现中文字符这一点大家都知道。

同时UDF的文件名中不能出现空格,这一点很容易被大家忽视。只要文件名中包含空格或者全角符号,那点击build之后,就会出现下面的报错信息。

 

 

此时报错信息不会出现多少行代码(类似c(17))出现问题,因此难以排查。报错信息的最后一个\后就是UDF的文件名,表示UDF 命名有问题。

 

2.4 常见错误4:UDM未开启或数量不够

当UDF中使用用户自定义变量UDM时,必须开启UDM,并且设置足够多的数量,否则UDF会出错。

这种情况下UDF编译build通过,load也没问题。

但是只要一点击Calculate就立马报错。这时会出现下图的报错信息,Received signal SIGSEGV

 

 

 

SIGSEGV:SIG是信号名的通用前缀, SEGV是segmentation violation存储器区段错误。这里就是指UDF中的UDM没有分配内存导致的错误。

只需要打开UDM,或者把UDM的数量调多就行,多了可以,但少了不行。

 

 

 

2.5 常见错误5:UDF数据结构错误

UDF自定义内部的数据结构有很多,我们经常用到的主要是三个:线程Thread、网格cell和面face。如果在UDF对这些数据结构错误的使用,那么UDF编译能正常通过,load也没问题,但一点计算就会报错。


比如thread1线程只进行了声明,但并没有从fluent获取。如果直接使用thread1,则编译通过,load通过,但点击计算,可能会报下图错误:Received signal SIGSEGV

 

 

 

这种问题,报错的信息可能有很多种。但是基本都有一个特点,那就是编译没问题、load没问题,但一点击计算又出错。

 

 

2.6 常见错误6:UDF被其他cas占用

 

UDF编译的过程:选择UDF后,点击build,会生成一个libudf文件夹。点击load后,fluent会直接调用libudf文件夹下的已经编译好的文件。


此时源UDF文件与fluent没有任何关系,即使删除掉源UDF文件,fluent也可以正常运行。但是不能删掉libudf文件,这个文件会一直被fluent占用。

 

注:libudf是编译过程生成的文件夹名称,可在点击build之前,在Library Name处更改此名。

 

 


正是由于上面的原因,又会引出一个UDF常见的问题。正常情况下,udf会被一个cas所使用,但如果两个cas想同时使用一个udf,在cas1已经使用此UDF进行计算的情况下,cas2如果仍然选择这个UDF,点击build之后,可能出现如下图的报错:

 

 

错误的原因:cas1已经生成了libudf,并且已经将这个libudf加载进fluent中了,也就是说libudf已经被cas1占用了。此时cas2想再生成libudf,应该要覆盖掉之前的libudf文件夹,但由于libudf被占用,因此无法覆盖,也就无法生成。

 

也就是说,这种错误和udf无关,同一个文件夹下两个完全不同的udf被两个cas调用,如果这两个cas编译udf时生成的文件夹名称相同,仍然会报上图的错误。

 

解决办法:解决办法很简单,两个cas的Library Name取不同的名称即可消除此错误。

 

 

2.7 常见错误7:libudf未正常更新

这种错误偶尔才会出现。

正常情况下,当UDF更改之后,需要重新对其编译,如果不编译,那还是使用原来的UDF进行计算。

但是在有些情况下,重新编译UDF可能会不成功,但是控制台不会出现进行报错信息,计算也能够正常进行。


怎么知道UDF是否正常更新呢?一方面如果计算残差和原来一模一样,没有突变,那可能就有问题。


另一方面,查看libudf文件夹下的src文件夹,里面是fluent真正加载的UDF文件,打开这个文件,看看是否和新的UDF是否相同。

 

 

 

3 UDF正常编译信息

   

什么样的信息说明build没有问题??

首先build加载时间比较长,其次文本控制台没有任何error的信息。可能会出现很多???或者乱码,只要没有error就行。比如下图,尽管出现乱码,但是没有error,说明编译正常。

 

 

 

 

4 UDF乱码正常显示

   

在windows平台下,UDF编译之后控制台信息是乱码的。可通过对电脑进行设置,使其正常显示。

打开控制面板

 

 

点进去时钟和区域--管理---更改系统区域设置

 

 

勾选Beta版,点击确定,然后重启电脑,此时fluent编译UDF就不会出现乱码了。但是UDF的一些中文注释,可能会变成乱码。

来源:Fluent学习笔记
UDF通用控制
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-07-19
最近编辑:1年前
Fluent学习笔记
博士 签名征集中
获赞 122粉丝 312文章 130课程 3
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈