找回密码
 注册
查看: 3491|回复: 14

udf 根据监测点的压力值设置入口的质量流量

[复制链接]
发表于 2013-5-14 19:42:41 | 显示全部楼层 |阅读模式

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

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

x
初学udf,请大家帮忙看下哪有问题,或者如果这样思路不对,应该如何做,已被折磨n天,跪求大神指教。
#include "udf.h"
#include "mem.h"
#define m_standard 8000.
#define m_interval 500.
DEFINE_ADJUST(mass_inlet,d)
{
Thread *t1,*t2;
cell_t c;
face_t f;
real xc[ND_ND];
int i;
real p=0.;
thread_loop_c(t1,d)
{
/*坐标为(10,10)的点为监测点,循环找到一些和它接近的点,
把这些点的压力值赋给p,并认为最后一次赋的值即为监测点的值*/
begin_c_loop(c,t1)
{
C_CENTROID(xc,c,t1);
if(sqrt(ND_SUM(pow(xc[0]-10.,2.),
pow(xc[1]-10.,2.)))<0.001)
p=C_P(c,t1);
}
end_c_loop(c,t1)
}
/*根据监测点的压力值,来改变入口的质量流量*/
begin_f_loop(f,t2)
{
if(p<=350000.)
F_PROFILE(f,t2,i) = m_standard+m_interval;
else if(p>350000.&&p<380000.)
F_PROFILE(f,t2,i) = m_standard;
else
F_PROFILE(f,t2,i) = m_standard-m_interval;
}
end_f_loop(f,t2)
}
 楼主| 发表于 2013-5-19 14:35:03 | 显示全部楼层
跪求解答!!!自己顶一下
发表于 2013-5-20 15:37:25 | 显示全部楼层

回复 1# ltpreason 的帖子

if(sqrt(ND_SUM(pow(xc[0]-10.,2.),
pow(xc[1]-10.,2.)))<0.001)
p=C_P(c,t1);

上面的<0.001是不是要考虑网格单元的大小和长度单位?
如果不满足上面的 if 条件,那么p=0.0 (real p=0. )  (似乎也没什么)。

也不知道你遇到什么问题啊,以上只是个人的想法啊。
发表于 2013-5-21 00:25:57 | 显示全部楼层
解决了没呢,你得把出现的问题说出来啊。
 楼主| 发表于 2013-5-21 08:09:11 | 显示全部楼层

回复 3# JohnQiang 的帖子

你好,我按照您的提示修改了一下 直接把p=350000,或者把0.001改大 还是报错,麻烦您再费费神?
报错是这样的
fluent receive fatal signal(access_violation)
1.note exact events leading to error
2.save case/data under new name
3.exit program and restart to continue
4.report error to your distributor
error object#f
 楼主| 发表于 2013-5-21 08:11:26 | 显示全部楼层

回复 4# chongdaql 的帖子

没有。。 报错是这样的。
fluent receive fatal signal(access_violation)
1.note exact events leading to error
2.save case/data under new name
3.exit program and restart to continue
4.report error to your distributor
error object#f 麻烦大神给出出主意?
 楼主| 发表于 2013-5-21 08:13:30 | 显示全部楼层

回复 4# chongdaql 的帖子

编译可以通过 在设置边界条件时一调用就这样报错
发表于 2013-5-21 10:32:45 | 显示全部楼层

回复 1# ltpreason 的帖子

begin_f_loop(f,t2)
{
if(p<=350000.)
F_PROFILE(f,t2,i) = m_standard+m_interval;
else if(p>350000.&&p<380000.)
F_PROFILE(f,t2,i) = m_standard;
else
F_PROFILE(f,t2,i) = m_standard-m_interval;
}
end_f_loop(f,t2)

上面程序错了,应放在DEFINE_PROFILE()宏里(不应放在ADJUST宏中),在边界条件里加载。你试试
发表于 2013-5-21 11:51:54 | 显示全部楼层

回复 1# ltpreason 的帖子

F_PROFILE(f,t2,i)  应该是给边界条件的吧(inlet),而不是全计算域。
发表于 2013-5-21 11:53:11 | 显示全部楼层

回复 1# ltpreason 的帖子

#include "udf.h"
#define m_standard 8000.
#define m_interval 500.
real pressure;
DEFINE_ADJUST(mass_inlet_Get_P,d)
{
    Thread *t;
    cell_t c;
    real xc[ND_ND];
    thread_loop_c(t,d)
        {
       begin_c_loop(c,t)
           {
          C_CENTROID(xc,c,t);
          if(sqrt(ND_SUM(pow(xc[0]-10.,2.), pow(xc[1]-10.,2.), pow(xc[2]-10.,2.)))<0.001)
             pressure=C_P(c,t);
           }
           end_c_loop(c,t)
         }
}

DEFINE_PROFILE(mass_inlet_as_P,t,i)
{
        face_t f;
        begin_f_loop(f,t)
        {
                /*根据监测点的压力值,来改变入口的质量流量*/
                if(pressure<=350000.)
                        F_PROFILE(f,t,i) = m_standard+m_interval;
                else if(pressure>350000.&&pressure<380000.)
                        F_PROFILE(f,t,i) = m_standard;
                else
                        F_PROFILE(f,t,i) = m_standard-m_interval;
        }
        end_f_loop(f,t)
}
 楼主| 发表于 2013-5-21 19:11:01 | 显示全部楼层

回复 10# JohnQiang 的帖子

膜拜大神!!非常感谢!!!!!祝您一切顺利。
 楼主| 发表于 2013-6-7 18:43:40 | 显示全部楼层

回复 10# JohnQiang 的帖子

大神您好,这个程序我用了之后发现这样一个问题。
我在边界条件那加载DEFINE_PROFILE这个程序段,发现在计算时入口的质量流量直接等于m_standard+m_interval,并且一直保持不变。
我分析是不是DEFINE_ADJUST这一块根本就没运行,导致pressure=0.
所以在DEFINE_PROFILE这里判断就一直pressure<=350000。
求指导。
发表于 2013-6-22 19:46:59 | 显示全部楼层

回复 12# ltpreason 的帖子

DEFINE_ADJUST加载了没有?
2013-06-22_200614.jpg
发表于 2013-6-25 22:19:54 | 显示全部楼层
楼上正解!我也学习了。
发表于 2013-7-1 09:58:01 | 显示全部楼层

回复 12# ltpreason 的帖子

楼主你好,我也要编写一个UDF程序流量程序,请问你的m_standard是整个入口的质量流量吗?根据我的理解,F_PROFILE(f,t,i) = m_standard;这个赋值语句应该是对一个网格上的face赋值,直接把整个面上的流量给它合适吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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