找回密码
 注册
查看: 3686|回复: 0

[求助]并行计算中,DEFINE_DPM_OUTPUT的使用问题,写chukou.dpm时出错。

[复制链接]
发表于 2007-8-18 20:43:47 | 显示全部楼层 |阅读模式

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

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

x
在离散相质点追踪的使用中,需要得到出口取样器的质点轨迹的数据进行分析,因此使用了DEFINE_DPM_OUTPUT宏来得到相关的数据,并写出一个可以读取得chukou.dpm的文件。开始写了一个UDF,单机单核运行时,可以正常工作,后来在双核机上运行发现写出的chukou.dpm文件中没有数据,是空的。
看了并行udf的使用说明,才知道,原来写文件必须在主机上进行,而主机的内存中是没有任何计算数据的,写文件必须要将节点计算的数据发送到主机后才能写文件,因此,又根据例子和自己的理解写了一个udf,见下面,但这个udf一运行就进入死循环,同时输出的chukou.dpm还是空文件;
搞了好几天,找不到原因,请高人指点!
DEFINE_DPM_OUTPUT(JILIANG,header,fp,p,thread,plane)
{
         
   char name[100];
   real DPMSHUJU[11];
   int pe;
         
   if (header)
   {
       if (NNULLP(thread))
          fprintf(fp,"(%s %d)\n",thread->head->dpm_summary.sort_file_name,11);
       else
          fprintf(fp,"(%s %d)\n",plane->sort_file_name,11);
          fprintf(fp,"(%10s %10s %10s %10s %10s %10s %10s"
          " %10s %10s %10s %10s %s)\n",
          "X","Y","Z","U","V","W","diameter","T","mass-flow",
          "time","JILIANG","name");
   }
       else
   {
   
       DPMSHUJU[0]=p->state.pos[0];
       DPMSHUJU[1]=p->state.pos[1];
   DPMSHUJU[2]=p->state.pos[2];
   DPMSHUJU[3]=p->state.V[0];
   DPMSHUJU[4]=p->state.V[1];
   DPMSHUJU[5]=p->state.V[2];
   DPMSHUJU[6]=p->state.diam;
   DPMSHUJU[7]=p->state.temp;
   DPMSHUJU[8]=p->flow_rate;
   DPMSHUJU[9]=p->state.time;
   DPMSHUJU[10]=p->user[0];
       pe = (I_AM_NODE_ZERO_P) ? node_host : node_zero;
   PRF_CSEND_REAL(pe, DPMSHUJU, 11, myid);
   if (I_AM_NODE_ZERO_P)
           compute_node_loop_not_zero (pe)
   {
      
              PRF_CRECV_REAL(pe, DPMSHUJU, 11, pe);
            
              PRF_CSEND_REAL(node_host, DPMSHUJU, 11, myid);
              
   }
           
   #if RP_HOST
           compute_node_loop (pe)
   {
             PRF_CRECV_REAL(node_zero, DPMSHUJU, 11, node_zero);
      }
   #endif
       sprintf(name,"%s:%d",p->injection->name,p->part_id);
               fprintf(fp,
               "((%10.6g %10.6g %10.6g %10.6g %10.6g %10.6g "
               "%10.6g %10.6g %10.6g %10.6g %10.6g) %s)\n",
               DPMSHUJU[0], DPMSHUJU[1], DPMSHUJU[2],
               DPMSHUJU[3], DPMSHUJU[4], DPMSHUJU[5],
               DPMSHUJU[6], DPMSHUJU[7], DPMSHUJU[8], DPMSHUJU[9],
               DPMSHUJU[10], name);

   }
}
说明:
1、自己认为,在主机中创建了一个存放数据的数组,就不需要在主机中设置动态内存。所以没有按例子设置动态内存。
2、自己理解,在PRF_CSEND_REAL(to, buffer, nelem, tag)和PRF_CRECV_REAL(from, buffer, nelem, tag)中,buffer是指被传送数组的文件名,nelem是被传送数组的元素个数;
3、由于质点追踪得到的数据是储存在结构型数据中,由于不知道如何将结构型数据传输到主机中,所以另外定义了一个储存的数组。
4、运行提示是不能应用到这个文件,另外打开一个新文件,然后就进入死循环;

请高人指点一下,我的udf和想法那里出了问题,如何改正才能在并行计算中运行!
谢谢!

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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