Fluent使用UDF遇见Received signal SIGSEGV

Fluent版本:19.0

究其原因,一般是因为我们编写的UDF当中指针错误,导致未能正确获取Fluent一些变量的值,从而造成该错误。

下面我们通过调试手段来为了重现该错误,直观查看错误原因。

我们编写如下示例代码:

Fluent使用UDF遇见Received signal SIGSEGV_第1张图片

调试步骤和算例参考《GCC编译UDFgdb调试UDF

链接:http://blog.sina.com.cn/s/blog_14d64daa10102xxlf.html

我们直接运行算例和UDF 

则会出现Received signal SIGSEGV

Fluent使用UDF遇见Received signal SIGSEGV_第2张图片

Fluent使用UDF遇见Received signal SIGSEGV_第3张图片

然后我们在gdbgui当中添加断点来调试UDF,从而从而能够更加直观的看到Received signal SIGSEGV错误的原因 

Fluent使用UDF遇见Received signal SIGSEGV_第4张图片

打开Fluent,加载UDF,运行算例 

回到浏览器的gdbgui操作界面 

    然后停在gdbgui的断点处

Fluent使用UDF遇见Received signal SIGSEGV_第5张图片

    说明21行断点以前的UDF程序都是没有问题的

Fluent使用UDF遇见Received signal SIGSEGV

gdbgui的控制台中就出现了gdbgui noticed a signal was recieved (Segmentation fault, SIGSEGV).的错误,说明我们的程序执行到UDF21行出现了错误

Fluent使用UDF遇见Received signal SIGSEGV_第6张图片

Fluent使用UDF遇见Received signal SIGSEGV

 

继续执行程序,则会在Fluent当中出现Received signal SIGSEGV的错误

从上面的调试过程我们可以看出是我们的UDF代码的21行出现了问题,可是为什么会出现这个问题呢?问题应该出现在C_P_RG这一个宏上面。这是因为我们在前面的计算当中,求解器不断移走它不需要的数据,没有保留变量无法获取到C_P_RG的值,从而导致received signal SIGSEGV的错误。对于本算例我们可以采用下面的方式修正这个错误:

修改UDF源代码为:

Fluent使用UDF遇见Received signal SIGSEGV_第7张图片

Fluent使用UDF遇见Received signal SIGSEGV

重新编译UDF

我们再次打开Fluent,加载UDF

使用TUI命令:

/solve/set/expert

Save cell residuals for post-processing? [no]

Keep temporary solver memory from being freed? [no] yes

Allow selection of all applicable discretization schemes? [no]

来保留变量的梯度

Fluent使用UDF遇见Received signal SIGSEGV_第8张图片

Fluent使用UDF遇见Received signal SIGSEGV

运行算例,可见Received signal SIGSEGV已经消除,UDF程序可以正常运行,计算顺利完成

Fluent使用UDF遇见Received signal SIGSEGV_第9张图片

转载于:https://www.cnblogs.com/liusuanyatong/p/11259625.html

你可能感兴趣的:(Fluent使用UDF遇见Received signal SIGSEGV)