最近在做颗粒沉积方面的模拟,用到了define_dpm_erosion这个宏,模拟的情况是圆管壁面沉积。
1.模拟过程包含两部分:a.erosion宏的沉积判定;b.管壁面根据沉积高度进行define_grid_motion的动网格执行;
2.因为流域颗粒比较多,所以计划采用多核进行计算,缩短计算时间;
3.用八核计算时,发现管壁面被分成了4各部分,因为grid_motion中要用到begin_f_loop,是否需要进行并行化语句;
4.目前serial模式没有问题,并行会因为动网格更新时出现负体积而报错,我猜是因为并行将壁面分割的原因(问题可能就出现在分割面重合的那几个节点上)
以下是我grid_motion中的部分语言:中间我还用到了数组计算每个节点的位移高度
DEFINE_GRID_MOTION(dongwangge,domain,dt,time,dtime)
{
Thread *tf=DT_THREAD(dt);
face_t f;
int i,j;
int m,n,l;
real cos_theta,sin_theta;
real sum=0;
int step;
int cha;
FILE *fp;
real vf[1000][2];
real vn[1000][2];
real angle[1000];
real node[1000][2];
real A[ND_ND];
real A1[ND_ND];
Node *v;
Node *vs;
Thread *tf0;
cell_t c0;
step=N_TIME;
cha=step-(step/200)*200;
if(cha==0)
{
.......(利用数组计算了每个节点应该位移的高度)
SET_DEFORMING_THREAD_FLAG(THREAD_T0(tf));// 开始动网格
i=0;
n=0;
begin_f_loop(f,tf)
{
f_node_loop(f,tf,n)
{
v=F_NODE(f,tf,n);
vs=F_NODE_SHADOW(f,tf,n);
if(NODE_POS_NEED_UPDATE(v))
{
NODE_POS_UPDATED(v);
cos_theta=vn[0]/NV_MAG(vn);
sin_theta=vn[1]/NV_MAG(vn);
if(angle<0.965926)
{
NODE_X(v)=(node[i-1][0]+node[0]+node[i+1][0])/3;
NODE_Y(v)=(node[i-1][1]+node[1]+node[i+1][1])/3;//把节点位置移动至三角形重心位置
NODE_X(vs)=(node[i-1][0]+node[0]+node[i+1][0])/3;
NODE_Y(vs)=(node[i-1][1]+node[1]+node[i+1][1])/3;
}
NODE_X(v)=NODE_X(v)-HEIGHT_NODE*cos_theta;
NODE_Y(v)=NODE_Y(v)-HEIGHT_NODE*sin_theta; //网格位置更新
NODE_X(vs)=NODE_X(vs)-HEIGHT_NODE*cos_theta;
NODE_Y(vs)=NODE_Y(vs)-HEIGHT_NODE*sin_theta;
i++;
}
}
}
end_f_loop(f,tf)
begin_f_loop(f,tf)
{
c0 = F_C0(f, tf);
tf0 = F_C0_THREAD(f,tf);
for (i=1; i<9; i++)
{
F_UDMI(f,tf,i)=0.;
C_UDMI(c0,tf0,i)=0.;
}
}
end_f_loop(f, tf)
}
else return;
}
八核分布图.png
壁面四核分布图.png |