首先描述下遇到的问题:
在一个cas中用到了C_UDSI_G表示电势梯度,用来计算电流密度,计算过程完全正常,后处理也能看到电流密度分布,保存cas和dat文件,退出,然后读入cas,接着读入dat的瞬间就报错:

在DEFINE_ADJUST宏中用到了C_UDSI_G宏,初始化计算后也是直接报如上的错。
经过一番查找已经发现问题:当我读入dat的时候,因为用到了DEFINE_PROFILE宏,而根据调用顺序(如下图),它是会在初始化之前调用一次的(虽然不知道为啥单纯导入数据也会调用DEFINE_PROFILE宏),这时因为没有dat数据,C_UDSI_G没法取到它的值,所以会报错;同理,在初始化的时候,执行DEFINE_ADJUST宏过程中,一样因为没有获取到C_UDSI_G的值而报错。

之前想的解决是,先不导入dat,将hook上的DEFINE_PROFILE宏全换成常数,并且需要计算一步获取到数据值(推荐将松弛因子尽可能改小,防止结果数据有较大改动),然后才能正常导入dat。

同理,初始化错误可以通过先不加载DEFINE_ADJUST宏,计算一步,再加载DEFINE_ADJUST宏即可正常计算。
然后一次不经意间看到了一个关于uds的判断语句,瞬间解决:

if (NULL != THREAD_STORAGE(t0, SV_UDS_I(0)) && NULL != T_STORAGE_R_NV(t0,SV_UDSI_G(0)))
{    
NV_V(J0,=,C_UDSI_G(c0,t0,0));
jc0=diff*NV_MAG(J0);
F_PROFILE(f,f_thread,position)=jc0;
}
else
{  
F_PROFILE(f,f_thread,position)=6000; 
 }

这条判断语句的作用是检测当前有没有存储UDS和UDS梯度的值,同理如果是其他梯度宏替换即可。(不知道其他梯度宏会不会有我上面说的报错)
在用到C_UDSI_G的地方加上即可,else后面加上语句:赋予你要输出的变量一个常数值即可,比如上面举例。(尽量接近最终解,符合实际物理场,避免第一步迭代获取常数值后切换到梯度宏得到的值相差太大造成计算不稳定)实际测试通过DEFINE_ADJUST宏输出Message也支持了我的猜想,确实初始化时没有获取到C_UDSI_G的值。

最后修改:2022 年 06 月 14 日
如果觉得我的文章对你有用,请随意赞赏