24小时热门版块排行榜    

CyRhmU.jpeg
查看: 4641  |  回复: 14

sailote

铁虫 (初入文坛)

[求助] 用udf实现出口温度赋值给进口温度已有1人参与

最近在搞一个非稳态算例,前一时刻流体出口面的平均温度赋值给当前时刻的进口面。初始状态时,流体区域平均分成前后两个区域,前后的温度不一样。
我网上搞了一个udf(如下),计算中,用monitor监控进口和出口的平均温度,每10个时间步长输出一次。发现两者温度曲线相差很大,如图所示(纵坐标为平均温度K,横坐标为时间步长)。请问是这个udf的问题还是怎啦?
real NV_VEC(A);
real avg_temp;
real sum_T_A=0.0;
real sum_A=0.0;
Thread *thread_out;
face_t f;
Domain *domain;
DEFINE_ADJUST(adjust,d)
{domain=Get_Domain(1);
thread_out=Lookup_Thread(domain,14);/14是出口面的id/
begin_f_loop(f,thread_out)
{ F_AREA(A,f,thread_out);
sum_A+=NV_MAG(A);                 
sum_T_A+=NV_MAG(A)*F_T(f, thread_out);
}
end_f_loop(f,thread_out)
avg_temp=sum_T_A/sum_A;
}
DEFINE_PROFLIE(inlet_T,t,i)
{begin_f_loop(f,t)
{F_PROFILE(f,t,i) = avg_temp;
}
end_f_loop(f,t)
}

用udf实现出口温度赋值给进口温度
1212.JPG
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sailote

铁虫 (初入文坛)

后来我怀疑是不是DEFINE_PROFLIE这个有问题,所以把udf改成如下,发现结果像之前一样(上图所示)
Thread *thread_in;
Thread *thread_out;
face_t f;
Domain *domain;
real avg_temp;
real sum_T_A=0.0;
real sum_A=0.0;
real NV_VEC(A);
DEFINE_ADJUST(adjust,d)
{
        domain=Get_Domain(1);
        thread_in=Lookup_Thread(domain,15); /*15是进口面的id*/
        thread_out=Lookup_Thread(domain,14); /*14是出口面的id*/
        begin_f_loop(f,thread_out)
        {
                F_AREA(A,f,thread_out);
                sum_A+=NV_MAG(A);
                sum_T_A+=NV_MAG(A)*F_T(f, thread_out);
        }
        end_f_loop(f,thread_out)
        avg_temp=sum_T_A/sum_A;
        begin_f_loop(f,thread_in)
        {
                F_T(f,thread_in) = avg_temp;
        }
        end_f_loop(f,thread_in)
}
2楼2014-05-14 15:04:44
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sailote

铁虫 (初入文坛)

怎么都没人回复
3楼2014-05-14 20:05:52
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

woshihuolei

银虫 (小有名气)

【答案】应助回帖


感谢参与,应助指数 +1
sailote: 金币+1, 有帮助 2014-05-15 14:07:56
如果是前一时刻赋给当前时刻的话应该是用DEFINE_EXECUTE_AT_END的吧  DEFINE_ADJUST是每次迭代都计算一次
4楼2014-05-15 09:59:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sailote

铁虫 (初入文坛)

引用回帖:
4楼: Originally posted by woshihuolei at 2014-05-15 09:59:34
如果是前一时刻赋给当前时刻的话应该是用DEFINE_EXECUTE_AT_END的吧  DEFINE_ADJUST是每次迭代都计算一次

请问如何使用DEFINE_EXECUTE_AT_END,有没有使用的例子
5楼2014-05-15 13:11:22
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

woshihuolei

银虫 (小有名气)

引用回帖:
5楼: Originally posted by sailote at 2014-05-15 13:11:22
请问如何使用DEFINE_EXECUTE_AT_END,有没有使用的例子...

建议看fluenthelp找一下每个宏的用法
6楼2014-05-15 18:44:35
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhaolei539

铁虫 (小有名气)

楼主问题解决了吗?
我遇到了类似的问题,需要把一面温度值(面的不同位置温度不同)传递给另一个面,两个面网格划分相同。
跟你的情况类似~~
为什么不用PROFILE 而要用ADJUST呢?
努力!
7楼2014-06-12 20:37:53
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sailote

铁虫 (初入文坛)

引用回帖:
7楼: Originally posted by zhaolei539 at 2014-06-12 20:37:53
楼主问题解决了吗?
我遇到了类似的问题,需要把一面温度值(面的不同位置温度不同)传递给另一个面,两个面网格划分相同。
跟你的情况类似~~
为什么不用PROFILE 而要用ADJUST呢?

还没解决,老是算出来有问题。profile是参数赋值函数。ADJUSt是每步迭代之后调整函数。不一样的。我后来用了EXECUTE_AT_END还是不行,我真的不知道出了什么问题。
8楼2014-06-13 16:17:58
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhaolei539

铁虫 (小有名气)

引用回帖:
4楼: Originally posted by woshihuolei at 2014-05-15 09:59:34
如果是前一时刻赋给当前时刻的话应该是用DEFINE_EXECUTE_AT_END的吧  DEFINE_ADJUST是每次迭代都计算一次

你好!想请教提取某个边界面的温度,赋值给另一个边界面
面上不同位置 温度不一样 不知道UDM怎么存储的?我这样写行不行?
#include "udf.h"
DEFINE_PROFILE(hnt_temperature,thread)
{
face_t f;
real tem_liquid;
real tem_solid;
Thread *thread_liquid=Lookup_Thread(domain,14); /*14是交界面液体侧面的id*/;
Thread *thread_solid=Lookup_Thread(domain,15); /*15是交界面固体侧面的id*/;

begin_f_loop(f,thread_liquid)
{   
    temp=F_T(f,thread_liquid);
    F_UDMI(f,t,0)=temp_liquid;
           
}
  end_f_loop(f,thread_liquid)

begin_f_loop(f,thread_solid)
{   
    tem_solid=F_UDMI(f,t,0);
    F_PROFILE(f,thread_solid)=tem_solid;
           
}
  end_f_loop(f,thread_solid)
}
麻烦您帮忙看看 谢谢!
努力!
9楼2014-06-15 09:39:39
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhaolei539

铁虫 (小有名气)

引用回帖:
8楼: Originally posted by sailote at 2014-06-13 16:17:58
还没解决,老是算出来有问题。profile是参数赋值函数。ADJUSt是每步迭代之后调整函数。不一样的。我后来用了EXECUTE_AT_END还是不行,我真的不知道出了什么问题。...

楼主能不能把你的代码发给我 我的问题跟你类似,但是代码导进去之后有错误,您帮我看看我的这个?给我参考一下?卡这里一个月了,不胜感激~~
#include "udf.h"
DEFINE_PROFILE(hnt_temperature,thread)
{
face_t f;
real tem_liquid;
real tem_solid;
Thread *thread_liquid=Lookup_Thread(domain,14); /*14是交界面液体侧面的id*/;
Thread *thread_solid=Lookup_Thread(domain,15); /*15是交界面固体侧面的id*/;

begin_f_loop(f,thread_liquid)
{   
    temp=F_T(f,thread_liquid);
    F_UDMI(f,t,0)=temp_liquid;
           
}
  end_f_loop(f,thread_liquid)

begin_f_loop(f,thread_solid)
{   
    tem_solid=F_UDMI(f,t,0);
    F_PROFILE(f,thread_solid)=tem_solid;
           
}
  end_f_loop(f,thread_solid)
}
麻烦您帮忙看看 谢谢!
努力!
10楼2014-06-15 18:30:21
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 sailote 的主题更新
信息提示
请填处理意见