24小时热门版块排行榜    

查看: 2005  |  回复: 2

princekeal

银虫 (小有名气)

[求助] 有没有精通FLUENT并行计算过程中数据交换的大神?请教一下!

楼主在模型中启用了VOF模型,并且使用了并行计算,启用了6个进程。

现在楼主需要寻找模型中距离某一个点(这个点是虚拟的,并不在模型中)最近的点。这个最近点的坐标将会用到后续的source中。

在并行计算中每个部分都是独立计算的,各个部分都有自己的一套变量,相互不会影响。通过简单的loop宏楼主可以找到每个部分距离“某一点”最近的点和对应的距离。

这样通过比较这六个距离的大小,就能找到真正的最近点了。这个点可能位于任何一个node中。

但是楼主需要这个点的坐标进行进一步的计算,所以必须把这个点的坐标传递到其他node中才行。

按照FLUENT中的说明,只有node0才能向host节点传递数据,所以楼主希望这样实现把位置坐标传递到其他node中:

nodeX----》node0-----》host------》其他所有node(如果最近点恰好在node0中则只需要node0-----》host------》其他所有node)

但是在实际计算过程中一开始计算程序就崩溃,不知道问题出现在哪……

下面是楼主编写的UDF:

DEFINE_ADJUST(heatinput_control,domain)
{
real EFFI=0.65; /*EFFI是理论上想达到的热输入水平*/
real GSUMI,Gdmin,dmin=10;
real center[3];
int i=N_ITER;
int N;
#if !RP_HOST
Thread *t,**pt;
cell_t c;
real SUMI=0,time=CURRENT_TIME,temp,vloss,temp0=300,vn,d,h=0.002;
real x[ND_ND];
#endif
#if !RP_HOST
thread_loop_c(t,domain)
{begin_c_loop_int(c,t)
{
        SUMI+=C_VOLUME(c,t)*C_UDMI(c,t,12);
}
end_c_loop_int(c,t)}
#if RP_NODE
GSUMI=PRF_GRSUM1(SUMI);
#endif
#endif
node_to_host_real_1(GSUMI);
#if !RP_NODE
        if(GSUMI>(1.01*0.5*EFFI*U*I))
                EFF=EFF*0.9952;
        else if(GSUMI<=(1.01*0.5*EFFI*U*I)&&GSUMI>=(0.99*0.5*EFFI*U*I))
                EFF=EFF;
        else EFF=EFF*1.00478;
        if(i%10==0)
{Message("GSUMI=%f\n",GSUMI);
        Message("EFF=%f\n",EFF);}
#endif
host_to_node_real_1(EFF);

#if !RP_HOST
mp_thread_loop_c(t,domain,pt)
        {Thread *p_phase=pt[1];
        begin_c_loop_int(c,t)
{C_CENTROID(x,c,t);
        if(C_VOF(c,p_phase)>0.3&&C_VOF(c,p_phase)<=1&&C_UDMI(c,t,5)>=1500&&x[1]>=0&&x[1]<=0.00011)
        {
d=sqrt(pow(x[0]-v*time-x0,2)+x[1]*x[1]+pow(x[2]-0.0015-h,2));
C_UDMI(c,t,31)=d;
        if(d<=dmin)
        {dmin=d;
        center[0]=x[0];
        center[0]=x[0];
        center[1]=x[1];
        center[2]=x[2];
        }
        }
}
end_c_loop_int(c,t)
}
#if RP_NODE
Gdmin=PRF_GRLOW1(dmin);
Message("dmin=%f\n",dmin);
Message("Gdmin=%f\n",Gdmin);
#endif
#endif

#if RP_NODE
if(!I_AM_NODE_ZERO_P)
{if(dmin==Gdmin)
PRF_CSEND_REAL(node_zero,center,3,myid);
}
#endif

#if RP_NODE
if(I_AM_NODE_ZERO_P)
{
        compute_node_loop_not_zero(N)
        {PRF_CRECV_REAL(N,center,3,N);
        }
PRF_CSEND_REAL(node_host,center,3,myid);
free(center);
}
#endif

#if RP_HOST
compute_node_loop(N)
{PRF_CRECV_REAL(node_zero,center,3,node_zero);
}
host_to_node_real(center,3);
#endif


#if !RP_HOST
mp_thread_loop_c(t,domain,pt)
        {Thread *p_phase=pt[1];
begin_c_loop(c,t)
{C_CENTROID(x,c,t);
temp=C_T(c,t);
vn=C_U(c,t)*C_UDMI(c,t,6)+C_V(c,t)*C_UDMI(c,t,7)+C_W(c,t)*C_UDMI(c,t,8);
C_UDMI(c,t,30)=vn;
if(C_VOF(c,p_phase)>0.3&&C_VOF(c,p_phase)<=1&&C_UDMI(c,t,5)>=1500)
{if(vn<0)
C_UDMI(c,t,29)=fabs(vn)*1.225*1006*(temp-temp0)*2*C_UDMI(c,t,5);
else
        C_UDMI(c,t,29)=0;
if(x[0]-v*time-x0>=0)
C_UDMI(c,t,12)=6*EFF*I*U/(PI*(af1+ar1)*bh1)*exp(-3*(x[0]-center[0])*(x[0]-center[0])/(af1*af1))*exp(-3*x[1]*x[1]/(bh1*bh1))*2*C_UDMI(c,t,5);
else if(x[0]-v*time-x0<0)
C_UDMI(c,t,12)=(6*EFF*I*U/(PI*(af1+ar1)*bh1)*exp(-3*pow((x[0]-center[0])/ar1,2))*exp(-3*pow(x[1]/bh1,2)))*2*C_UDMI(c,t,5);
else
        C_UDMI(c,t,12)=0;}
else
{C_UDMI(c,t,12)=0;
C_UDMI(c,t,29)=0;}
}
end_c_loop(c,t)
}
#endif
}
回复此楼

» 猜你喜欢

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

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

princekeal

银虫 (小有名气)

拆弹专家

木虫 (正式写手)

相关版块跳转 我要订阅楼主 princekeal 的主题更新
信息提示
请填处理意见