24小时热门版块排行榜    

查看: 2820  |  回复: 8

木风10086

新虫 (小有名气)

[交流] UDF的问题 已有2人参与

UDF的内容如下:
#include "udf.h"
#include <stdio.h>
#include "dynamesh_tools.h"

static int nozzle_tid = 10;
static real g_c = 9.81;
static real loc = 0.0;

static real initial_weight = 10.0;
static real burn_rate = 0.0;

static real current_time = -1.0;
static real thrust_prev = 0.0;
static real missile_velocity = 0.0;

static real
missile_weight (real time)
{
  return (initial_weight - burn_rate * time);
}

DEFINE_ON_DEMAND(reset_velocity)
{
  missile_velocity = 0.0;
  thrust_prev      = 0.0;
  current_time     = -1.0;
}

DEFINE_CG_MOTION(missile_1dof, dt, cg_vel, cg_omega, time, dtime)
{
#if 1
  FILE *fp;
#endif

  /* reset velocities */
  NV_S (cg_vel, =, 0.0);
  NV_S (cg_omega, =, 0.0);


  if (!Data_Valid_P ())
    return;

/* Give rocket time to establish thrust for specified time */
  if (time < 0.1)
    Message (" NO MOTION YET: TIME LESS THAN 0.1 SECONDS ";

  if (time < 0.1)
    return;  

  /* update missile velocity only if we are at
     the next new time level */
  if ((time - 0.1*dtime) > current_time)
    {
      Domain *domain;
      Thread *t;
      face_t f;
      real force0, force1, force;
      real area, total, v_avg, dv;
      real w0, w1, mass_flow;

      /* update time stamp */
      current_time = time;

      /* get nozzle exit thread (from predefined thread id) */
      domain = THREAD_DOMAIN (DT_THREAD ((Dynamic_Thread *)dt));
      if (NULLP (t = Lookup_Thread (domain, nozzle_tid)))
        return;

      /* compute average exit velocity (weighted by area) */
      v_avg = 0.0;
      total = 0.0;
      begin_f_loop (f, t)
        {
          area = NV_MAG (F_AREA_CACHE (f, t));

#if RP_3D
          v_avg += area * ND_MAG (F_U (f, t), F_V (f, t), F_W (f, t));
#else
          v_avg += area * ND_MAG (F_U (f, t), F_V (f, t), 0.0);
#endif
          total += area;
        }


      end_f_loop (f, t)
      v_avg /= total;       

/* subtract off missile_velocity to get relative velocity */
/* ???      v_avg = v_avg - missile_velocity;        */
       
      /* compute thrust from mdot and v_e
         note: assume nozzle_exit is type mass-flow-exit  */
      if (THREAD_VAR(t).mfi.flow_spec == MASS_FLOW_TYPE)
        mass_flow = THREAD_VAR(t).mfi.mass_flow;
      else
        {
          real mass_flow;

          /* if mass_flux given as profile, then sum up
             area * mass_flux over face thread, else, mass_flux
             is constant */
          if (IS_PROFILE (THREAD_VAR (t).mfi.mass_flux))
            {
              begin_f_loop (f, t)
                mass_flow = NV_MAG (F_AREA_CACHE (f, t)) *
                            F_VAR (f, t, THREAD_VAR (t).mfi.mass_flux);
              end_f_loop (f, t)                                  
            }
          else
            {
              mass_flow = THREAD_VAR(t).mfi.mass_flux.constant * total;
            }
#if RP_2D
          if (rp_axi)
            mass_flow *= 2.0 * M_PI;
#endif
        }
      force = v_avg * F_VAR (0, t, THREAD_VAR(t).mfi.mass_flux) / total;
      
      /* compute change in velocity (use trapezoidal rule) */
      w0 = missile_weight (time - dtime);
      force0 = (thrust_prev - w0 * g_c) / w0;
      w1 = missile_weight (time);
      force1 = (force - w1 * g_c) / w1;
      dv = MAX (0.0, 0.5 * dtime * (force0 + force1));

      missile_velocity += dv;
      
      loc += missile_velocity * dtime;
      thrust_prev = force;

#if 1
  if( (fp=fopen("silo.dat","a") !=NULL )
    {
      float check = F_FLUX(f,t)+F_GRID_FLUX(f,t);
      fprintf(fp,"%f    %f    %f     %f    %f   %f \n",
              time,missile_velocity,loc,v_avg,F_FLUX(f,t),F_GRID_FLUX(f,t));
      fclose(fp);
    }
#endif
      
      Message ("time = %12.5e, x_vel = %12.5e, force = %12.5e, loc(m)= %1.5e\n",
               time, missile_velocity, 0.5*(force0 + force1), loc);
    }
  
  /* set missile velocity */
  cg_vel[0] = missile_velocity;
}
编译型UDF,build后的提示如下:
silo.c
..\..\src\silo.c(94) : error C2440: “=”: 无法从“Profile”转换为“real”
连着出了好几个问题,现在都已经晕乎了,求助!!!!!
回复此楼

» 猜你喜欢

心情不爽!
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

木风10086

新虫 (小有名气)

这么快就沉了,赶紧自己顶一下
心情不爽!
2楼2015-11-03 16:48:11
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

ls315920

新虫 (小有名气)


小木虫: 金币+0.5, 给个红包,谢谢回帖
貌似遇到大神,赶紧拜拜。。。
虚心学习
3楼2015-11-03 18:44:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

木风10086

新虫 (小有名气)

大家给点建议吧,应该主要是     if (THREAD_VAR(t).mfi.flow_spec == MASS_FLOW_TYPE)
        mass_flow = THREAD_VAR(t).mfi.mass_flow;
      else
这一句中的=两边有问题,但是不知道该怎么解决。
心情不爽!
4楼2015-11-04 11:42:11
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

木风10086

新虫 (小有名气)

自己继续顶吧,实在头大。
心情不爽!
5楼2015-11-04 15:55:15
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

木风10086

新虫 (小有名气)

遇到问题还是靠自己解决,靠论坛什么的实在是不靠谱。
心情不爽!
6楼2015-11-05 08:53:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

死天

专家顾问 (著名写手)


小木虫: 金币+0.5, 给个红包,谢谢回帖
mass_flow = THREAD_VAR(t).mfi.mass_flow;这个有问题

THREAD_VAR(t).mfi.mass_flow的意思是,通俗的说THREAD_VAR(t)列表下的mfi列表下的mass_flow的变量取值,如果我没有记错的话(手头没有UDF,没法查询),这个变量的返回值不是可用于计算的值,而是fluent自定义的变量类型。
7楼2015-11-05 12:21:16
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

木风10086

新虫 (小有名气)

引用回帖:
7楼: Originally posted by 死天 at 2015-11-05 12:21:16
mass_flow = THREAD_VAR(t).mfi.mass_flow;这个有问题

THREAD_VAR(t).mfi.mass_flow的意思是,通俗的说THREAD_VAR(t)列表下的mfi列表下的mass_flow的变量取值,如果我没有记错的话(手头没有UDF,没法查询),这 ...

对,确实是这个,我也是找了好久,在文件里一个个找,最后发现就是这个的问题。在老版本的时候能用,现在的不行了。我不知道想用这个量的话该怎么办,我现在是用别量通过公式反算这个量了,直接提取还是不会。
心情不爽!
8楼2015-11-11 15:10:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

死天

专家顾问 (著名写手)


小木虫: 金币+0.5, 给个红包,谢谢回帖
引用回帖:
8楼: Originally posted by 木风10086 at 2015-11-11 15:10:00
对,确实是这个,我也是找了好久,在文件里一个个找,最后发现就是这个的问题。在老版本的时候能用,现在的不行了。我不知道想用这个量的话该怎么办,我现在是用别量通过公式反算这个量了,直接提取还是不会。...

THREAD_VAR(t).mfi.mass_flow只是个返回值,调用该值,下面应该有个函数来通过该值直接调用库
9楼2015-11-11 18:42:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 木风10086 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见