找回密码
 注册
Simdroid-非首页
查看: 314|回复: 15

[FLUENT/GAMBIT] 求教udf达人 脉冲激光的加载!

[复制链接]
发表于 2010-12-14 09:19:38 | 显示全部楼层 |阅读模式 来自 大连理工大学
我做的模拟是 脉冲激光焊接模拟!具体就是在小于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);
}

本帖子中包含更多资源

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

×
 楼主| 发表于 2010-12-14 09:52:52 | 显示全部楼层 来自 大连理工大学
Simdroid开发平台
大家给提点建议啊 我已经自己弄了三个星期了还是没有一点进展,udf高手给点建议吧! 1# abcmn0233
回复 不支持

使用道具 举报

发表于 2010-12-14 13:27:41 | 显示全部楼层 来自 北京
编译是通过的对不对。
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-14 13:44:19 | 显示全部楼层 来自 大连理工大学
对编译是通过了 就是初始化的时候 总是执行<T0那个循环 不管你改成什么条件 效果一样!不断执行 跳不出循环 导致无法初始化! 3# lihui54312
回复 不支持

使用道具 举报

发表于 2010-12-15 15:32:19 | 显示全部楼层 来自 上海嘉定区
你要判断t在哪个位置,可以用     i=求整(t/T)   来实现,
然后 判断  t-i*T 是否大于 T0 来实现激光的释放与否。

很好的课题,希望有了结果之后上来分享交流一下,谢谢!
回复 不支持

使用道具 举报

发表于 2010-12-15 15:34:56 | 显示全部楼层 来自 北京
我尝试拿CFX 做下
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-15 17:27:43 | 显示全部楼层 来自 大连理工大学
我也曾尝试用这种方法但是两个变量取余涉及到了变量类型的问题,所以我直接把取余运算 变成了t=i*T这种形式!
5# mycc
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-15 17:29:28 | 显示全部楼层 来自 大连理工大学
谢谢!如果有结果的话请您通知我,qq569049814!再不行的话我就又要尝试用其它软件了纠结啊! 6# lihui54312
回复 不支持

使用道具 举报

发表于 2010-12-16 07:53:01 | 显示全部楼层 来自 上海嘉定区
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);

        i=11; /* 可以跳出循环*/
      }
    else if(T>k>T0)
   {
    printf("2");
    printf("%f",t);

    i=11; /* 可以跳出循环*/


   }


程序是不会出错的,它会按照你写的执行,你应该仔细分析你的程序为何无法跳出程序,然后再找到解决之道。你无法跳出程序的原因是i 一直没有变化,因此会一直在循环中,加一行 i=11 就会强制跳出循环。
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-16 08:46:56 | 显示全部楼层 来自 大连理工大学
我已经尝试用其它方法来实现这一过程没有用循环来实现,因为从上一周期到下一周期要循环所以我想用N_TIME命令来提取当前的时间步的总数 然后计算一个周期的时间步总数 用这一方法来判断目前光斑的位置 这样就用不到循环了!估计可以实现。 9# mycc
回复 不支持

使用道具 举报

发表于 2010-12-16 09:09:44 | 显示全部楼层 来自 黑龙江哈尔滨
10# abcmn0233
你能不能先编一个简单的循环???
比如一个c语言程序 0-T输出一个数1,T-2T输出0,2T-3T输出1,。。。
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-16 13:49:04 | 显示全部楼层 来自 大连理工大学
好建议 我再试试!
11# 水若无痕
回复 不支持

使用道具 举报

发表于 2011-1-22 22:19:49 | 显示全部楼层 来自 黑龙江哈尔滨
首先,实现这个功能的udf无需在宏内有do循环,Fluent迭代一次,就是做了一次循环,这是基本的
其次,程序混乱,可能由于循环的思想,导致楼主没有对时间进行判断,没有经过判断的时间,何来周期性呢,
小错误:
R=sqrt(x-x0)*(x-x0)+(y-y0)*(y-y0);------》R=sqrt((x-x0)*(x-x0)+(y-y0)*(y-y0));

以下我编译了一个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;
        real t0=9;
        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;
}

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-1-25 08:35:23 | 显示全部楼层 来自 黑龙江哈尔滨
获奖感言
我的回复能得到版主承认,说明我的工作还是有意义滴,嘿嘿
继续努力中,,,,
回复 不支持

使用道具 举报

发表于 2011-2-28 12:38:57 | 显示全部楼层 来自 湖北武汉
楼主做出来没?做好了可以发上来看看,学习学习啊
回复 不支持

使用道具 举报

发表于 2011-2-28 21:33:34 | 显示全部楼层 来自 陕西西安
脉冲型边界条件在CFX中也不好实现,估计只能调用user fortran了。
回复 不支持

使用道具 举报

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

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-27 19:16 , Processed in 0.078367 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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