找回密码
 注册
查看: 3085|回复: 6

如何将这段代码改写成 并行计算的udf?

[复制链接]
发表于 2011-3-28 16:09:58 | 显示全部楼层 |阅读模式

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

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

x
代码目的是统计某部分网格截面的最小压力,并将该最小压力的网格位置记录下来,单机运行正常,不知道如何改成并行版本
# include "udf.h"
DEFINE_ADJUST(adjust_gradient, domain)
{
       
        Thread *t;
        cell_t c;
        real z=0.0;
        real x1,y1,z1;
        real ii=0;
        real qq=0;
        real pmin=0.0;
        real temp=1.3;
        real x[ND_ND];
        x1=1;
        y1=2;
       


        Message("computing the minimum pressure...\n");


        thread_loop_c (t,domain)
        {
               
                        begin_c_loop (c,t)
                                {
                                        C_CENTROID(x,c,t);
                                        z=x[2];
                                        if(fabs(z+0.3)<0.01)
                                        {
                                                ii=ii+1;
                                                temp = C_P(c,t);         
                                                if(pmin>temp)  
                                                        {
                                                                pmin=temp;
                                                                x1=x[0];
                                                                y1=x[1];
                                                                z1=x[2];
                                                        }
                                        }
                                        qq=qq+1;
                                }
                        end_c_loop (c,t)
               
        }


        Message("the minimum pressure is: %6.6g,the face position is [%6.6g,%6.6g,%6.6g] .\nyes:%g\ntotal:%g\n", pmin,x1,y1,z1,ii,qq);
       
}

[ 本帖最后由 2005011lcj 于 2011-3-29 11:09 编辑 ]
 楼主| 发表于 2011-3-29 11:10:28 | 显示全部楼层
我自己写的并行版本是这样的,但是运行出现浮点错误

# include "udf.h"
DEFINE_ADJUST(min_pressure, domain)
{
       
        real z=0.0;
        real x1,y1,z1;
        real ii=0;
        real qq=0;
        real pmin=0.0;
        real temp=1.3;
        x1=1;
        y1=2;
        z1=3;

                Thread *t;

        #if !RP_HOST
       
                cell_t c;
                real x[ND_ND];
        #endif

        #if !RP_NODE
                Message("computing the minimum pressure...\n");
        #endif
       

        #if !RP_HOST
                thread_loop_c (t,domain)
                {
                                begin_c_loop (c,t)
                                        {
                                                C_CENTROID(x,c,t);
                                                z=x[2];
                                                if(fabs(z+0.3)<0.01)
                                                {
                                                        ii=ii+1;
                                                        temp = C_P(c,t);         
                                                        if(pmin>temp)  
                                                                {
                                                                        pmin=temp;
                                                                        x1=x[0];
                                                                        y1=x[1];
                                                                        z1=x[2];
                                                                }
                                                }
                                                qq=qq+1;
                                        }
                                end_c_loop (c,t)
                }

                # if RP_NODE
                        pmin=PRF_GRLOW1(pmin);
                        ii = PRF_GRSUM1(ii);
                        qq = PRF_GRSUM1(qq);
                # endif /* RP_NODE */

                        node_to_host_real_6(pmin,x1,y1,z1,ii,qq); /* Does nothing in SERIAL */
        #endif /* !RP_HOST */

        #if !RP_NODE /* SERIAL or HOST */
                Message("the minimum pressure is: %6.6g,the face position is [%6.6g,%6.6g,%6.6g] .\nyes:%g\ntotal:%g\n", pmin,x1,y1,z1,ii,qq);
        #endif /* !RP_NODE */

       
}
 楼主| 发表于 2011-3-29 11:16:21 | 显示全部楼层
出错的截图
出错截图.PNG
发表于 2011-3-30 11:31:36 | 显示全部楼层
每个分区都有自己分区范围内的最小压力,对应的坐标为(x1,y1,z1),有多少个分区就有多少个(x1,y1,z1),你的代码里面只是将node0上的(x1,y1,z1)送到host。应该先将所有分区比较后的最小压力的坐标送到node0,然后再调用 node_to_host_real_6

[ 本帖最后由 gearboy78 于 2011-3-30 03:33 编辑 ]
 楼主| 发表于 2011-3-30 16:55:04 | 显示全部楼层

回复 4# gearboy78 的帖子

谢谢指定,不过我总是搞不清楚 node0 是干什么的
发表于 2011-9-24 09:38:49 | 显示全部楼层
node0是计算0结点。另外我看到你的并行代码中少写了一个#endif
发表于 2011-9-25 08:11:26 | 显示全部楼层
楼主和各位大侠,我想问一下进行并行计算时主要修改UDF的什么东西啊,需要添加什么语句呢? 我编写的是传热量,就是把巴兹公式编写进去了,求大侠帮忙啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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