| 查看: 1602 | 回复: 4 | ||
[求助]
udf程序改为并行
|
|
程序的目的是根据监测点的压力调节入口的质量流量,维持监测点的压力近似恒定,单核计算时程序可以用,一旦并行就出错,自己试着按帮助里的方法改一直没通(比如加#if !HOST #endif之类),恳请各位指点,先谢过了!把自己的金币全部悬赏! DEFINE_ADJUST(get_p_monitor,d) { Thread *t; cell_t c; real xc[ND_ND];/*网格质心坐标*/ thread_loop_c(t,d) { begin_c_loop(c,t) { C_CENTROID(xc,c,t); if (sqrt(ND_SUM(pow(xc[0] + 2.,2.), pow(xc[1] -1.3,2.), pow(xc[2]-0.,2.)))<0.01 pressure=C_P(c,t);/*点(-2,1.3,0)为监测点,当网格质心与监测点的距离小于0.01时,认为该网格的压力就是监测点的压力*/ } end_c_loop(c,t) } printf("\n pressure=%g\n",pressure); } DEFINE_PROFILE(mass_inlet_as_p,t,i) { face_t f; real mass=0.5; if(pressure<=480000.) mass=mass+0.01; else if(pressure>480000.&&.pressure<520000.)/*根据监测点的压力调节入口质量流量*/ mass=mass; else mass=mass-0.01; begin_f_loop(f,t) { F_PROFILE(f,t,i)=mass; } end_f_loop(f,t) printf("\n pressure=%g\n",pressure); } 如果一并行,每计算一步会出现四个压力值(我用四核并行),其中一个为真实值,另三个是0,然后到下面用压力判断质量流量时用的一直是那个0的压力,所以就流量一直升高。 |
» 猜你喜欢
论文终于录用啦!满足毕业条件了
已经有21人回复
不自信的我
已经有5人回复
磺酰氟产物,毕不了业了!
已经有4人回复
投稿Elsevier的杂志(返修),总是在选择OA和subscription界面被踢皮球
已经有8人回复
» 本主题相关价值贴推荐,对您同样有帮助:
动网格的UDF问题
已经有21人回复
udf在非host节点下并行计算message
已经有11人回复
FLUENT中编写UDF时指针变量是否要初始化
已经有4人回复
单机多核并行计算下UDF的问题
已经有9人回复
一个UDF并行报错
已经有17人回复
fluent UDF代码调用预定义程序的问题(如fortran程序)
已经有15人回复
进行单机多核udf的并行计算,需要怎么设置?
已经有9人回复
求助udf的输入输出
已经有16人回复
UDF 改为并行计算
已经有9人回复
并行计算没有输出?怎么回事
已经有16人回复
UDF 热源随温度变化的处理
已经有4人回复
单机多核一个cpu的串行并行求助
已经有26人回复
激光焊接udf,加载温度场不对
已经有7人回复
FLUENT读取并行case自动删除文件
已经有3人回复
关于MPI并行编程的基本问题
已经有8人回复
【求助】单机多核fluent并行udf
已经有13人回复
【求助】单机多核UDF怎么并行计算
已经有15人回复
2楼2013-11-06 18:00:08
3楼2013-11-07 20:23:45
4楼2013-11-14 19:19:26
【答案】应助回帖
★ ★ ★ ★ ★
1592203609: 金币+5, 谢谢回帖 2013-11-15 21:29:15
1592203609: 金币+5, 谢谢回帖 2013-11-15 21:29:15
|
DEFINE_ADJUST(get_p_monitor,d) { Thread *t; cell_t c; real xc[ND_ND]; thread_loop_c(t,d) { begin_c_loop(c,t) { C_CENTROID(xc,c,t); if (sqrt(ND_SUM(pow(xc[0] + 2.,2.), pow(xc[1] -1.3,2.), pow(xc[2]-0.,2.)))<0.01 pressure=C_P(c,t); /*你这里前面网格的压力会不断的被后面网格所覆盖,Fluent会循环所有网格,所以最后输出的pressure变量只是最后一个网格的压力。可把C_P(c,t)放在一个UDM里面(自己查查,不难)*/ } end_c_loop(c,t) } printf("\n pressure=%g\n",pressure); /*由于并行时流场会被分为几份,输出时有的区域的压力就会输出为零。pressure初始化为零?省略了?*/ } DEFINE_PROFILE(mass_inlet_as_p,t,i) { face_t f; real mass=0.5; if(pressure<=480000.) mass=mass+0.01; else if(pressure>480000.&&.pressure<520000.)/*根据监测点的压力调节入口质量流量*/ mass=mass; else mass=mass-0.01; begin_f_loop(f,t) { F_PROFILE(f,t,i)=mass; } end_f_loop(f,t) printf("\n pressure=%g\n",pressure); /*这种写法输出不会崩溃?这里不是每个网格都输出?我记得DEFINE_PROFILE会循环每个网格,也就是每个网格应该都会执行printf啊?*/ } |
5楼2013-11-15 17:55:42







回复此楼