找回密码
 注册
查看: 3036|回复: 6

udf

[复制链接]
发表于 2010-12-10 15:06:36 | 显示全部楼层 |阅读模式

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

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

x
与时间有关的udf编译成功,初始化为什么是死循环呢!
发表于 2010-12-14 10:07:45 | 显示全部楼层
唉,这是提问还是算命呢?一行字结束,一切的一切,都要别人去猜……
 楼主| 发表于 2010-12-14 10:44:31 | 显示全部楼层

回复 2# 浪子轻狂 的帖子

我做的模拟是 脉冲激光焊接模拟!具体就是在小于T0时间内加载激光,在大于T0小于T的时间内不做用激光,大于T后进行下一个循环。如图1,2所示。我尝试用DEFINE_PROFILE宏 写了一个程序但是一直不能实现此功能,我的思路是用t=RP_Get_Real("flow-time");然后k=t-(i-1)*T其中i为当前周期数 T为周期 然后用k于T0比较 若k<T0则加载光源若T>K>T0则 不加载激光 若k>=T则i++但是一直没有实现这一功能 初始化的时候就出现了问题,一直循环跳不出循环!udf程序如下:#include "udf.h"
DEFINE_PROFILE(temperature_profile, thread, position)
{
real m[ND_ND];
real x,x1;
real y,y1;
face_t f;
real x0,y0,R;
real v=0.00167;
real T=0.03;
real T0=0.006;
int i=1;
real k;
real r=0.0003;
real J=1.5;
real t=RP_Get_Real("flow-time");
do
{
k=t-(i-1)*T;
if(k<=T0)
  {
    begin_f_loop(f,thread)
   {
    F_CENTROID(m,f,thread);
    x=m[0];
    y=m[1];
    x0=v*t;
    y0=0;
    R=sqrt(x-x0)*(x-x0)+(y-y0)*(y-y0);
    if(R<=r)
    F_PROFILE(f,thread,position)=3*1.5*0.8/(3.14159*T0*r*r)*exp(-3*R*R/r*r);
    else
    F_PROFILE(f, thread, position)=0;
   }
   end_f_loop(f, thread)
   printf("1");
   printf("%f",t);
  }
else if(T>k>T0)
{
printf("2");
printf("%f",t);
}
else
{
i++;
printf("3");
printf("%f",t);
}
}while(i<=10);
}
您给提点建议啊!

[ 本帖最后由 linken 于 2010-12-14 10:46 编辑 ]
未命名.jpg
发表于 2011-1-22 02:01:37 | 显示全部楼层
首先指出一个地方是否是有问题的:R=sqrt(x-x0)*(x-x0)+(y-y0)*(y-y0);
好像少了括号

另外要想实现楼主的意图,根本不能在profile里面使用对时间的循环,do                                 //  此循环可能是随机的,出现死循环很正常
{
k=t-(i-1)*T;                   //此处如果满足,则进入else if语句,
                    但是里面没有对i进行重新赋值,
                    判断就会跳出,i一直不变,循环一直不结束,死了
if(k<=T0)
  {
      }
else if(T>k>T0)         //开始直接满足此处,循环直接挂掉
{
printf("2");
printf("%f",t);
}
else                            //开始如果满足此处条件,
                   则循环未执行任何内容,跳出,不会死,但也没赋值
{
i++;
printf("3");
printf("%f",t);
}
}while(i<=10);

我猜你的程序初始化的时间是零,当然满足上面的第一条,因此程序死循环了
发表于 2011-1-22 02:05:22 | 显示全部楼层
附上正确程序,首先根据设定的初始时间判断何时开启光源,接着进入周期脉冲阶段,直到人为停止程序,如有问题请回复
#include "udf.h"
DEFINE_PROFILE(temperature_profile, thread, position)
{
        real m[ND_ND];
        real x,x1;
        real y,y1;
        face_t f;
        real x0,y0,R;
        real v=0.00167;
        real T=0.03;
        real T0=0.006;
        real t0=9;         /*&frac14;&Ugrave;&Eacute;è&iquest;&ordf;&Ecirc;&frac14;&AElig;&ocirc;&para;&macr;&Ecirc;±&frac14;&auml;&Icirc;&ordf;t0*/
        int i=1;
        real k;
        real r=0.0003;
        real J=1.5;

        real t = RP_Get_Real("flow-time");
        k=t - T * floor((t-t0)/T);
        if(k<=T0)
        {
                begin_f_loop(f,thread)
                {
                        F_CENTROID(m,f,thread);
                        x=m[0];
                        y=m[1];
                        x0=v*t;
                        y0=0;
                        R=sqrt((x-x0)*(x-x0)+(y-y0)*(y-y0));
                        if(R<=r)
                                F_PROFILE(f,thread,position)=3*1.5*0.8/(3.14159*T0*r*r)*exp(-3*R*R/r*r);
                        else
                                F_PROFILE(f, thread, position)=0;
                }
                end_f_loop(f, thread)
                        printf("1");
                printf("%f",t);
        }
        else
        {
                begin_f_loop(f,thread)
                {
                        F_PROFILE(f, thread, position)=0;
                }
                end_f_loop(f, thread)
                printf("2");
                printf("%f",t);               
        }
        k=0;
}
发表于 2011-12-29 12:23:06 | 显示全部楼层
版主人真厚道,流体论坛定会繁荣昌盛.
发表于 2011-12-29 12:28:31 | 显示全部楼层


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

本版积分规则

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