Fluent使用UDF遇见Received signal SIGSEGV
Fluent版本:19.0
究其原因,一般是因为我们编写的UDF当中指针错误,导致未能正确获取Fluent一些变量的值,从而造成该错误。
下面我们通过调试手段来为了重现该错误,直观查看错误原因。
我们编写如下示例代码:
调试步骤和算例参考《GCC编译UDF和gdb调试UDF》
链接:https://www.cnblogs.com/liusuanyatong/p/11259628.html
我们直接运行算例和UDF
则会出现Received signal SIGSEGV
然后我们在gdbgui当中添加断点来调试UDF,从而从而能够更加直观的看到Received signal SIGSEGV错误的原因
打开Fluent,加载UDF,运行算例
回到浏览器的gdbgui操作界面
然后停在gdbgui的断点处
说明21行断点以前的UDF程序都是没有问题的
gdbgui的控制台中就出现了gdbgui noticed a signal was recieved (Segmentation fault, SIGSEGV).的错误,说明我们的程序执行到UDF的21行出现了错误
继续执行程序,则会在Fluent当中出现Received signal SIGSEGV的错误
从上面的调试过程我们可以看出是我们的UDF代码的21行出现了问题,可是为什么会出现这个问题呢?问题应该出现在C_P_RG这一个宏上面。这是因为我们在前面的计算当中,求解器不断移走它不需要的数据,没有保留变量无法获取到C_P_RG的值,从而导致received signal SIGSEGV的错误。对于本算例我们可以采用下面的方式修正这个错误:
修改UDF源代码为:
重新编译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]
来保留变量的梯度
运行算例,可见Received signal SIGSEGV已经消除,UDF程序可以正常运行,计算顺利完成