找回密码
 注册
查看: 2238|回复: 10

[求助]我写的边界压力的UDF,请指教~

[复制链接]
发表于 2007-12-3 01:05:52 | 显示全部楼层 |阅读模式

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

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

x
我的想法是:先用Adjust求出口水深,然后利用PROFILE指定压力:
#include "stdafx.h"
//write your include header here......

#include "udf.h"
real h=0;

extern "C"{

DEFINE_ADJUST(depth, domain)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//normal function body here
Domain *d,*sd;
d=Get_Domain(4);     /*出口边界区域*/
Thread *t;
cell_t c;
real x[ND_ND],y,vof_water;
int phase_domain_index;
sub_domain_loop(sd,d,phase_domain_index)
{
if(DOMAIN_ID(sd)==3)       /*如果为副相区域,水为副相*/
thread_loop_c(t,sd)
{
      begin_c_loop_all(c,t)
  {
  C_CENTROID(x,c,t);
  y=x[1];
  vof_water=C_VOF(c,t);
  if((vof_water>0)&&(y>h))   /*求水深*/
  h=y;
  }
  end_c_loop_all(c,t)
}
printf("flow depth:%g\n",h);
}
}

DEFINE_PROFILE(outlet_pressure,t,i)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//normal function body here
  face_t f;
  real x[ND_ND],y;
  begin_f_loop(f,t)
  {
  C_CENTROID(x,f,t);
  y=x[1];
  if(y<h)
  F_PROFILE(f,t,i)=998.2*9.81*(h-y);  /*指定水的压力*/
  else
  F_PROFILE(f,t,i)=0;/*空气的压力为零*/
  }
  end_f_loop(f,t)
}
}
  
问题是加载UDF之后,计算中并没有执行,边界压力还是零,好像是Adjust函数得到的水深h没有传给边界函数。不知道怎么才能把一个函数计算得到的数,传给另外一个函数呢?全局变量也没起作用啊~
先谢谢了!
发表于 2007-12-4 16:22:17 | 显示全部楼层

[求助]我写的边界压力的UDF,请指教~

不好一下就确定你的问题在什么地方。不过如下几个地方
我觉得存在问题。

我的想法是:先用Adjust求出口水深,然后利用PROFILE指定压力:
&#35;include "stdafx.h"
//write your include header here......

&#35;include "udf.h"
real h=0;

extern "C"{

DEFINE_ADJUST(depth, domain)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//normal function body here
Domain *d,*sd;
d=Get_Domain(4);     /*出口边界区域*/   
******* 出口边界区域应该是face吧? 边界的 zone ID = 4? ********
  
Thread *t;
cell_t c;
real x[ND_ND],y,vof_water;
int phase_domain_index;
sub_domain_loop(sd,d,phase_domain_index)
{
if(DOMAIN_ID(sd)==3)       /*如果为副相区域,水为副相*/
thread_loop_c(t,sd)         
************* 边界 face面上用_c循环估计存在问题 *********
{
     begin_c_loop_all(c,t)
{
C_CENTROID(x,c,t);
y=x[1];
vof_water=C_VOF(c,t);   
*******************  很怀疑此时调用 C_VOF() 的返回值,呵呵 ****************
if((vof_water>0)&&(y>h))   /*求水深*/
h=y;
}
end_c_loop_all(c,t)
}
printf("flow depth:%g\n",h);
}
}

DEFINE_PROFILE(outlet_pressure,t,i)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//normal function body here
face_t f;
real x[ND_ND],y;
begin_f_loop(f,t)
{
C_CENTROID(x,f,t);
*********  边界上应该是face而非cell 应该用F_CENTROID()吧? ************
y=x[1];
if(y<h)
F_PROFILE(f,t,i)=998.2*9.81*(h-y);  /*指定水的压力*/
else
F_PROFILE(f,t,i)=0;/*空气的压力为零*/
}
end_f_loop(f,t)
}
}
 楼主| 发表于 2007-12-5 11:02:42 | 显示全部楼层

[求助]我写的边界压力的UDF,请指教~

非常感谢~
我的问题就是你指出的:
1.因为要用DEFINE_PROFILE指定边界面压力,只能用面轮循(单元轮循只能指定固定不变的压力值);但是求水相VOF的时候,C_VOF(c,pt)只能为单元轮循,所以只有写两个函数;
2.要求水深,需要指定在出口边界面相邻的单元轮循,且指针指向水相才能求得相应C_VOF(c,pt);
对第二个问题我实在是没招了,不晓得该用哪个多相轮循才好~
请教大家!多谢~
发表于 2007-12-5 11:15:48 | 显示全部楼层

[求助]我写的边界压力的UDF,请指教~

可以做界面的loop,不过在具体计算C_VOF的时候,
计算与界面相邻Cell的C_VOF应该可以。
发表于 2007-12-9 16:15:37 | 显示全部楼层

[求助]我写的边界压力的UDF,请指教~

没有看懂,这个语句是什么意思?谢谢
AFX_MANAGE_STATE(AfxGetStaticModuleState());
 楼主| 发表于 2007-12-9 22:51:37 | 显示全部楼层

[求助]我写的边界压力的UDF,请指教~

这句是用本论坛里hp2&0388026发布的VC++软件时,本身自带的,我也不懂意思,sorry
发表于 2007-12-10 10:36:59 | 显示全部楼层

[求助]我写的边界压力的UDF,请指教~

有两个疑问:
1。这两个函数的调用时间不一样,DEFINE_ADJUST 每次迭代前都得调用,而DEFINE_PROFILE是程序运行初期调用的用于定义一些边界参数。这样你先用ADJUST 计算完出后水深,还能进行PROFILE调用吗?为什么不把求水深的程序代码直接放到PROFILE函数里。
2。DEFINE_ADJUST函数中有一句:printf("flow depth:%g\n",h);
运行的时候在控制台有显示吗?你用的是Compiled编译并Hooks的?
还是Interpreted解释编译并hooks的?
发表于 2007-12-11 08:58:07 | 显示全部楼层

[求助]我写的边界压力的UDF,请指教~

两个问题已经弄清楚了~~
发表于 2007-12-11 09:00:25 | 显示全部楼层

[求助]我写的边界压力的UDF,请指教~

有两个疑问:
1。这两个函数的调用时间不一样,DEFINE_ADJUST 每次迭代前都得调用,而DEFINE_PROFILE是程序运行初期调用的用于定义一些边界参数。这样你先用ADJUST 计算完出后水深,还能进行PROFILE调用吗?为什么不把求水深的程序代码直接放到PROFILE函数里。
DEFINE_RPROFILE 每次迭代都会调用。
2。DEFINE_ADJUST函数中有一句:printf("flow depth:%g\n",h);
运行的时候在控制台有显示吗?你用的是Compiled编译并Hooks的?
还是Interpreted解释编译并hooks的?
printf("flow depth:%g\n",h);应该换成:
Message("flow depth:%g\n",h);
 楼主| 发表于 2007-12-16 21:35:54 | 显示全部楼层

[求助]我写的边界压力的UDF,请指教~

哈哈~ 谢谢了!好细心啊!
我改过来,是要用Message命令,但是有个问题,算水深的指针并没有指向出口边界,我估计是指向入口了,这个是用DEFINE_ADJUST求水深:
DEFINE_ADJUST(flow_depth, domain)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//normal function body here
  cell_t c0;
  Thread *tc0;
  int ID=4;     /*出口边界的ID为4*/
  Thread *t=Lookup_Thread(domain,ID);   /*指向出口边界*/
  tc0=THREAD_T0(t);
  real x[ND_ND],y,vof_w;
  real h=0.0f;
  
  Thread *st;
  int phase_id=1;
  st=THREAD_SUB_THREAD(tc0,phase_id);   /*水为第二相,指向水*/
  sub_thread_loop(st,tc0,phase_id)
  {
  begin_c_loop(c0,st)
  {
       vof_w=C_VOF(c0,st);
   C_CENTROID(x,c0,st);
   y=x[1];
   if((y>h)&&(vof_w>0))      /*求水深*/
       h=y;
  }
  end_c_loop(c0,st)
  }
  Message("depth:%f %f\n",y,h);
}
 楼主| 发表于 2007-12-16 21:48:00 | 显示全部楼层

[求助]我写的边界压力的UDF,请指教~

运行上面的UDF得到的结果很奇怪,就是h从一开始就不变:
reversed flow in 117 faces on pressure-inlet 4.
  1235 6.7916e-03 5.6455e-05 8.4345e-05 2.6754e-04 7.8948e-04  0:00:01   16
depth:0.629669 1.675764  /*输出行*/
reversed flow in 117 faces on pressure-inlet 4.
  1236 2.1405e-03 1.9576e-05 2.9711e-05 6.6438e-05 2.3195e-04  0:00:01   15
depth:0.629669 1.675764  /*输出行*/
一直都不变,并且h的值是出口边界上最高的单元的中心纵坐标的值。
y的值也不变,但不知道是什么值。
   我想是不是求VOF的if条件有问题,因为我的指针指的是第二相——水,那么再判断该单元水的VOF肯定是大于0了,判断多余?
但我的本意是想指针指向边界上的单元,然后这些单元上如果水的VOF>0,才求它的Y坐标。应该怎么改呢?
    请求大侠拔刀相助了~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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