找回密码
 注册
查看: 6625|回复: 13

Fluent UDS分配存储空房间问题

[复制链接]
发表于 2017-10-19 10:55:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
求助!
现在在使用UDS,在初始化的时候,即DEFINE_INIT时,使用下列程序进行存储空间及对uds和udm的初始化,但是并没有成功。请问是什么问题啊?
DEFINE_INIT(init_parameter,d)
{
cell_t c;
Thread *t;
int i;
printf("1");
if (n_uds < N_REQUIRED_UDS)

Internal_Error("Not enough user defined scalars!(init)\n");

if (n_udm < N_REQUIRED_UDM)   
Internal_Error("Not enough user defined scalars!(init)\n");

thread_loop_c(t,d)
     {
   
         if(NULL!=THREAD_STORAGE(t,SV_UDS_I(Fai))&&NULL!=THREAD_STORAGE(t,SV_UDS_I(Ax))&&NULL!=THREAD_STORAGE(t,SV_UDS_I(Ar)))
        
  {
begin_c_loop(c, t)
             {
             for (i=0; i<N_REQUIRED_UDS; i++)
                {
                 C_UDSI(c,t,i) = 0.0;
                }
             }
         end_c_loop(c, t);
}
         if (NNULLP(THREAD_STORAGE(t, SV_UDM_I)))
{        
begin_c_loop(c, t)
             {
             for (i=0; i<N_REQUIRED_UDM; i++)
                {
                 C_UDMI(c,t,i) = 0.0;
                }
             }
         end_c_loop(c, t);
}      
         
     }

}
利用printf函数看窗口是否输出1,来测定init函数是否运行,发现并没有。
请问是什么问题啊,求各位大神指点指点!
发表于 2017-10-19 13:20:35 | 显示全部楼层
你加载了吗?多线程吗?如果多线程的话,需要修改UDF
另外用message语句试试输出
最后,如果仅仅初始化为0,那么不加载UDF也可以做到
 楼主| 发表于 2017-10-20 08:56:56 | 显示全部楼层
aaa-1234 发表于 2017-10-19 13:20
你加载了吗?多线程吗?如果多线程的话,需要修改UDF
另外用message语句试试输出
最后,如果仅仅初始化为 ...

谢谢回复!
并没有进行多线程运行,出来的错误是segmentation fault.
这个初始化不仅把uds初始化了,还把udm初始化了。
那uds在soulution initialization中能被设置为零,那是不是udm没有被初始化啊?
 楼主| 发表于 2017-10-20 16:20:30 | 显示全部楼层
本帖最后由 smoring2 于 2017-10-20 16:52 编辑

在solution initialization的时候,发现define_Init运行成功了,因为函数的开始和结尾分别都输出了“init begins"和”init ends" ,这是自己用message输出的。

但是运行整个udf还是出现了,segmentation fault的错误,是define_adjust出现了错误。以下为define_adjust函数,发现窗口能输出e_c的值,和输出adjust running begins的提示,但没有输出adjust running ends的提示。
所以认为该函数并没有运行成功。

请教各位大神,这个到底是什么原因啊,函数的编写是哪里有误吗,编译都完全通过了的。

DEFINE_ADJUST(f1,d)
{

  real x[ND_ND];
  real xx;
  real rr;
  real e_c;
  real temp=C_T(c,t);

  if(temp<=6667)
     e_c=0.0;

  else if(temp>6667&&temp<=25000)
     e_c=0.6873*temp-4582.13;
   
  else if(temp>25000&&temp<=30000)
     e_c=(-0.1)*temp+15100;
   
  Message("%g\n",e_c );
  Message("adjust running begins\n");

thread_loop_c(t,d)
   {
     begin_c_loop_all(c,t)
     {
      C_UDMI(c,t,ec)=e_c;
      C_UDMI(c,t,Tx)=C_T_G(c,t)[0];
      C_UDMI(c,t,Tr)=C_T_G(c,t)[1];
      C_UDMI(c,t,jx)=-C_UDMI(c,t,ec)*C_UDSI_G(c,t,Fai)[0];
      C_UDMI(c,t,jr)=-C_UDMI(c,t,ec)*C_UDSI_G(c,t,Fai)[1];
      C_UDMI(c,t,B_0)=C_UDSI_G(c,t,Ar)[0]-C_UDSI_G(c,t,Ax)[1];
       C_CENTROID(x,c,t);
       xx=x[0];
       rr=x[1];
       C_UDMI(c,t,s_Ar)=-miu_0*C_UDMI(c,t,jr)+C_UDSI(c,t,Ar)/rr/rr;
      }
      end_c_loop_all(c,t)
    }
  Message("adjust running ends\n");
}




 楼主| 发表于 2017-10-20 16:23:06 | 显示全部楼层
smoring2 发表于 2017-10-20 16:20
在solution initialization的时候,发现define_Init运行成功了,因为函数的开始和结尾分别都输出了“init b ...


对了 所使用的头文件  只有
#include "udf.h"

发表于 2017-10-23 08:44:13 | 显示全部楼层
你有没有打开足够的UDM,另外诸如 C_UDMI(c,t,Tx)中的Tx这样的名字你定义过了吗?
 楼主| 发表于 2017-10-23 08:50:27 | 显示全部楼层
aaa-1234 发表于 2017-10-23 08:44
你有没有打开足够的UDM,另外诸如 C_UDMI(c,t,Tx)中的Tx这样的名字你定义过了吗?

enum
{
Fai, //0
Ax, //1
Ar, //2
N_REQUIRED_UDS //3
};

enum
{
ec,//0
jx,//1
jr,//2
B_0,//3
s_Ar,//4
Tx,//5
Tr,//6
N_REQUIRED_UDM//7
};

分别枚举了3个uds和7个UDM,然后在软件里也设置了uds数目为3,udm数目为7。
,这个应该是对的吧?
 楼主| 发表于 2017-10-23 09:51:30 | 显示全部楼层
aaa-1234 发表于 2017-10-23 08:44
你有没有打开足够的UDM,另外诸如 C_UDMI(c,t,Tx)中的Tx这样的名字你定义过了吗?

C_UDMI(c,t,Tx)=C_T_G(c,t)[0];
C_UDMI(c,t,Tr)=C_T_G(c,t)[1];

发现是这两个语句导致segmentation fault的错误,但是不知道为什么啊。
发表于 2017-10-24 13:20:25 | 显示全部楼层
如果是这个的话,可能是需要打开梯度存储

http://blog.sina.com.cn/s/blog_60228a0c0101i0n8.html

另外,第一个时间步的话,这个值是不存在的,所以,算两个时间步,再加载这个UDF
 楼主| 发表于 2017-10-24 20:12:43 | 显示全部楼层
aaa-1234 发表于 2017-10-24 13:20
如果是这个的话,可能是需要打开梯度存储

http://blog.sina.com.cn/s/blog_60228a0c0101i0n8.html

按照这个博客的做法把梯度打开,不过请问怎么可以检查自己是否打开了温度梯度?
如果不加载adjust函数的话,x方向动量发散,报错信息为:
Divergence detected in AMG solver: x-momentum -> Increasing relaxation sweeps!
真的很懵蔽啊 不知道为什么
发表于 2017-10-25 07:56:29 | 显示全部楼层
如果打开了梯度,在后处理显示中会出现一些新的梯度值
你如果什么都不加载,就出现问题,那就要查查你的case设置和网格了
 楼主| 发表于 2017-10-25 10:00:11 | 显示全部楼层
aaa-1234 发表于 2017-10-25 07:56
如果打开了梯度,在后处理显示中会出现一些新的梯度值
你如果什么都不加载,就出现问题,那就要查查你的ca ...

请问是不是fluent的对称轴只能是x轴啊?
对材料施加自定义的定压比热容,不同的温度段赋不同的c_p值,结果跳出每个网格的warning:incorrect specific heat value,这个值是按照别人算出来的输运参数给的,是有什么问题吗?
太感谢你的回复了
发表于 2017-10-26 08:24:50 | 显示全部楼层
1. 是的
2. cp值不能用UDF,你可以用fluent自带的多项式
 楼主| 发表于 2017-10-30 21:37:53 | 显示全部楼层
aaa-1234 发表于 2017-10-26 08:24
1. 是的
2. cp值不能用UDF,你可以用fluent自带的多项式

我发现了个问题,如果把udf加载后直接跑程序,就会出segmentation fault这个错误。但是,我为了查错adjust函数,会把函数基本内容注释掉,然后跑一行代码,这行代码可以的话,再加一行,当我跑到最后的时候,是所有代码都加上了,这个时候就不会报错了。所以是一样的代码,直接运行会报错,但是这样来运行就不会报错。而且,我每次运行都初始化了,相当于把所有的uds和udm都归零了,压强和温度也回到了初始状态,应该是没有上一次跑的数据遗留在下一次。相当于是一样的代码,不一样的运行顺序,就会出现不一样的结果。为什么会出现这样的事呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表