找回密码
 注册
查看: 3484|回复: 3

我写的一个udf code,请拍砖

[复制链接]
发表于 2011-6-10 01:42:33 | 显示全部楼层 |阅读模式

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

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

x
我的问题是这样的:一个房间里充满了SO2和空气的混合物,有一个过滤器。我不关心过滤器里面过滤的过程如何,我只是知道过滤器不是100%过滤,而是99.9989%,还有0.0011%的SO2随着风管进入了各个房间。我要做的是:通过取过滤器入口面的SO2质量流量(=F_FLUX*F_AREA*F_YI),设定一个负的source,相当于一个sink移除了99.9989%的SO2,剩下的通过出口面("interior")顺着分管进入了各个内部房间。下面是我的udf,请指教啊请指教!

顺便,我还在把它改写为单机4核的并行udf,我知道除了要在那些需要加总的量之后,写上诸如 a = PRF_GRSUM1(a);之外,我还知道需要写上if !RP_HOST(NODE)或者if RP_HOST(NODE),但是目前还不知道我这里应该如何改。好人你能不能帮我改改呢?
拜谢!!

我的qq: 285607198,能不能加你好友?有问题我还是会在这个帖子里面提问,能不qq问就不问,大家都很忙,我完全明白的。
  
#include "udf.h"
DEFINE_SOURCE(cell_SO2mass_source,cell,thread,dS,eqn)
{
   real x[ND_ND];
   real source, t, massflowrate, volume, vol_tot;
   real ti = RP_Get_Real("flow-time");
   real NV_VEC(flux), NV_VEC(A);   /* declaring vectors flux and A */
   face_t face, f                /*我不需要定义cell_t cell, Thread *thread的吧?因为DEFINE_SOURCE已经call了cell和thread了?*/
   C_CENTROID(x,cell,thread);           /*这个C_CENTROID其实下面我没用到,所以可以删掉*/
   x=x[0];                  /*****给出每个单元的x坐标*******/
   y=x[1];                  /*****给出每个单元的y坐标*******/
   z=x[2];                  /*****给出每个单元的z坐标*******/
   d = Get_Domain(1);          /*我需要用到这个Get_Domain来得到d的线程的,对吧?*/
   t= Lookup_Thread(d, 12);             /* defining the inlet surface thread by specifying the Zone_ID*/
                                        /*我的问题是,如何在fluent里找到那个入口面的Zone_ID呢?*/
begin_f_loop(f,t)
{
NV_D(flux, =, F_U(f,t), F_V(f,t), F_W(f,t));     /* defining flux in terms of velocity field */
NV_S(flux, *=, F_R(f,t))                   /* multiplying density to get flux vector */
F_AREA(A,f,t)                                 /* face normal vector returned from F_AREA */
massflowrate+= F_YI(f,t,i)*NV_DOT(flux,A);  /* dot product of the inlet surface flux and area vector*/
                                                                             /* multiplied by the mass fraction of species i */
}
end_f_loop(f,t)

massflowrate = PRF_GRSUM1(massflowrate);  

     begin_c_loop(cell,thread)
       {
         volume = C_VOLUME(cell,thread);   /* get cell volume */
         vol_tot += volume;
       }
     end_c_loop(cell,thread)
vol_tot = PRF_GRSUM1(vol_tot);  

  source=-0.999989* massflowrate/ vol_tot;
  dS[eqn]=0.0;

return source;
}

我是要写成并行的程序,请问单机多核的并行程序和电脑联网的并行udf是一样的吧?我知道要加上一些必要的比如#IF !RP_HOST(NODE) 或者#IF RP_HOST(NODE),但是我不知道家在哪里,何时加,还有那些 begin_c_loop(cell,thread)也需要改写下,请问这样就行了么?
有没有牛人能帮忙改写下啊?谢谢,谢谢哈!
发表于 2011-6-10 09:35:40 | 显示全部楼层
不要总是想着别人帮你搞定,论坛上是问问题的,即使高手也要花很多时间来调试修改,所以不可能花大量时间帮你去改的。自己去查资料提问题来解决吧。
 楼主| 发表于 2011-6-10 10:30:56 | 显示全部楼层
同意,所以我自己已经快写出来了,可是现在论坛上,只是看看帖子的多,帮忙看看有什么问题的也基本没有。也不指望别人帮忙。

原帖由 gearboy78 于 2011-6-10 01:35 发表
不要总是想着别人帮你搞定,论坛上是问问题的,即使高手也要花很多时间来调试修改,所以不可能花大量时间帮你去改的。自己去查资料提问题来解决吧。
发表于 2011-9-10 16:52:28 | 显示全部楼层

回复 3# aleisia 的帖子

请问你是怎么做的呀,我也有这方面的问题,有3个函数,分别都加上了#IF !RP_HOST,但是好像不行,如果一个函数的话,就可以,请问你是改动了哪里呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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