【fluent】The fluent process could not be started、Fatal signal raised sig SIGSEGV的解决办法

一、问题背景

本次case用到了UDF,并且其中采用了UDM变量(总数为4个)。

在刚开始将网格文件导入fluent时,对同一个实体的内部面interiors和区域zones进行了merge合并。
响应警报见下图,警报内容是——内部面发现中发现了不同固体。

我不是很懂这个警报的意思,由于是警报,应该无足轻重,就忽略了。
【fluent】The fluent process could not be started、Fatal signal raised sig SIGSEGV的解决办法_第1张图片

随后定义report monitor,设置了3个监测参数。(在上面的过程中,我还开启了能量模型,默认的湍流模型,以及设置了材料属性…)

以上的所有过程,都没有错误发生。

而当我选中Standard Initialization(标准初始化),Compute from下拉框选择inlet之后,立即报错,我甚至都没来得及点Initialize。
【fluent】The fluent process could not be started、Fatal signal raised sig SIGSEGV的解决办法_第2张图片
出错内容如下:Node x: Process xx: Received signal SIGSEGV.
【fluent】The fluent process could not be started、Fatal signal raised sig SIGSEGV的解决办法_第3张图片
myid (999999):Fatal signal raised sig SIGSEGV。

这张图的意思是说我开了64个核心,每一个核心对应一个错误日志文件,当我打开999999这个节点的日志时,发现它是host节点(ID就是六个九),错误内容如上所述。
【fluent】The fluent process could not be started、Fatal signal raised sig SIGSEGV的解决办法_第4张图片
The fluent process could not be started.这个错误描述很常见。

【fluent】The fluent process could not be started、Fatal signal raised sig SIGSEGV的解决办法_第5张图片
free(): corrupted unsorted chunks。
【fluent】The fluent process could not be started、Fatal signal raised sig SIGSEGV的解决办法_第6张图片

二、曾经尝试的解决办法

2.1 增加计算核心数目和节点数目


因为原先我是64个核心,1个节点,曙光智算的工程师就让我多加一个节点,搞到128个核心。
【fluent】The fluent process could not be started、Fatal signal raised sig SIGSEGV的解决办法_第7张图片

【fluent】The fluent process could not be started、Fatal signal raised sig SIGSEGV的解决办法_第8张图片
选择cas文件,启动fluent,而后再去初始化,又出错了。
【fluent】The fluent process could not be started、Fatal signal raised sig SIGSEGV的解决办法_第9张图片

2.2 更改(往往是减小)计算核心数

【fluent】The fluent process could not be started、Fatal signal raised sig SIGSEGV的解决办法_第10张图片
还是出错。

2.3 标准初始化改成混合初始化

【fluent】The fluent process could not be started、Fatal signal raised sig SIGSEGV的解决办法_第11张图片
选中混合初始化的时候没出错,一初始化就报错。

2.4 不合并zones区域和interiors内部面

诚如本文伊始所言,由于在ansys meshing网格划分时给同一个实体的不同部分划分不同类型网格的需要,我在SCDM中对它们进行了分割。

为了更清楚、直观地显示边界(依据可以划分到同一个边界就划分到同一个边界的原则),我对同一个实体的不同部分进行了merge合并,zones和interiors都很容易合并。但即使是同一个实体上的wall,也难以合并。

本次我没有合并zones和interiors,
【fluent】The fluent process could not be started、Fatal signal raised sig SIGSEGV的解决办法_第12张图片
【fluent】The fluent process could not be started、Fatal signal raised sig SIGSEGV的解决办法_第13张图片

再加上一顿常规设置,这次compute from选择inlet之后,并没有报错。
【fluent】The fluent process could not be started、Fatal signal raised sig SIGSEGV的解决办法_第14张图片
随后,在按下initialize按钮后,也即初始化之后,发出警报【Warning: zone of type interior found between different solids!】,此警报就是我上面说过的怀疑是错误合并zones、interiors之后导致的警报,没想到这次不合并也警报了,说明此种警报与合并操作无关,并且也说明这个警报不影响此种错误。
【fluent】The fluent process could not be started、Fatal signal raised sig SIGSEGV的解决办法_第15张图片
但是,随后我定义监测点、动画、云图后,设置求解计算方式,点击calculate之后,又报错了,说明这个方法解决问题并不彻底。
【fluent】The fluent process could not be started、Fatal signal raised sig SIGSEGV的解决办法_第16张图片

2.5 定义scheme变量后,还是出错

工程师在trn日志文件中发现了**unable to find rpvar "sheet/thread-id’**错误,如获至宝的我怀疑很可能就是因为在UDF中调用的scheme变量没有在fluent的console中定义,才落得如此错误。

【fluent】The fluent process could not be started、Fatal signal raised sig SIGSEGV的解决办法_第17张图片
随后,我在fluent中定义了相关scheme变量,

合并了zones和interiors时,出错了。又来一次没合并zones和interiors的算例,这次还是选择inlet时就出错了。

2.6 设置和增加在GUI界面中定义的UDM数目

这个方法以及下面的方法3我是从公众号Fluent学习笔记的文章UDF常见错误及报错信息中收获到的。

SIGSEGV:SIG是信号名的通用前缀, SEGV是segmentation violation存储器区段错误。

当你在UDF中用到了UDM,但是在GUI界面中定义UDM的数目少了时就会报错,可以多定义但不能少定义。

如果出现这个问题,编译正常,但是加载的时候可能出错(据我测试发现如果一个UDM也不定义,load时就会出错,不像Fluent学习笔记里说的不会出错),计算的时候也会出错。

如上所述,我将GUI界面的UDM数量定义多于在UDF中调用的UDM数量时,最终还是报错了。

三、有效的解决方法——正确使用UDF中的数据结构

UDF的数据结构指的是fluent udf中的thread、cell_t、face_t等指针型数据单元。

如果仅仅是做了数据结构的声明,但是没有赋予取值(定义/初始化),直接就调用这个数据结构时,仅仅给warning。

例如下面这个UDF,因为if (PRINCIPAL_FACE_P(f, t))是在begin_f_loop(f, t)之前定义的,所以实际上这个f并没有被赋予任何网格面指针。

DEFINE_PROFILE(Inlet_Temp, t, i)
{
    #if !RP_HOST
    face_t f;
    real time = RP_Get_Real("flow-time");

    if(time<7200 || time==7200)
    {
        bou_temp = 300 + 0.025*time;
    }
    else if(time>7200 && time<18000 && time==18000)
    {
        bou_temp = 480;
    }
    else if(time>18000 && time<28800 && time==28800)
    {
        bou_temp = 480 - (time-18000)/60;
    }
    else 
        bou_temp = 300;
    node_to_host_real_1(bou_temp);

在linux系统中编译时,出现警报:
warning: ‘f’ is used uninitialized in this function [-Wuninitialized]
#define FAST_C_STORAGE(c, t, sv, type) (FAST_T_STORAGE(t, sv, type)[c])
curing_heat_v2.c:36:12: note: ‘f’ was declared here face_t f;

正确的写法应该是将if判断放在循环迭代宏之前。

    if (PRINCIPAL_FACE_P(f, t))
    {
        begin_f_loop(f, t)
        {
            F_PROFILE(f, t, i) = bou_temp;
        }
        end_f_loop(f, t)
    }
    #endif

四、扩展篇

以上报错内容中,【The fluent process could not be started.】这个或者【The fl process could not be started.】在网上是很常见的,随便搜索一大堆人提问和回答。

出了这个错误之后,在fluent中不能进行任何操作,不论是GUI界面操作还是TUI文本命令操作。

在公众号Ansys流体大本营的一篇文章【仿真技巧】The fl process could not be started怎么处理中,总结的比较详细。

1)操作系统的原因
2)初值不佳及中间步骤收敛情况差的原因
3)防火墙的原因
4)节点之间的通讯问题
5)超线程问题
6)存在UDF/UDS/UDM的问题(本人的补充:例如UDF中用到UDM,但是没有在GUI界面中定义UDM的数目
7)计算过程中内存不足的问题:尤其是有自适应网格加密
8)GPGPU不支持的问题
9)并行的问题:切换不同MPI,2021R1及以后推荐使用msmpi并设置IP;在之前版本中算例静置也会出现此报错,指定IP即可。
11)没有许可,或者相应的许可没有释放

而公众号泵小丫也曾经发过一篇心得https://mp.weixin.qq.com/s/ioskhs-2_SlVQNV99PTjDA,他用热点给电脑供网,在出去一圈(网断了)回来后,发现出现这个错误,他认为是WIFI网络断了导致的。(可是我很是疑惑呀,fluent还需要联网才能运算?)

后话

虽然上面的方法解决了我的问题,但是之后我又遇到了新的问题

Error: eval: unbound variable
Error Object:

如果你们也遇到了,看我的新博客吧

你可能感兴趣的:(fluent,udf,ansys,fluent,UDF)