找回密码
 注册
查看: 1817|回复: 0

udf验证接口程序,精度的设置对程序的影响

[复制链接]
发表于 2013-5-13 17:34:31 | 显示全部楼层 |阅读模式

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

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

x
小弟利用fluent的计算验证一个接口程序,基本思想是将外部的功率密度利用udf加载为源项进行计算,而其中的要将网格坐标及其对应的功率密度值打印出来,看源项的加载是否成功,但是在打印的时候,程序中deviation的设置对程序有相当大的影响,xyz坐标及其功率密度值共有160000多个,若设置deviation为1e-7,则只能打印出大概10000个数据,也就是源项只加载了10000个功率密度值,若设置deviation为1e-5,则会有接近160000个数据打印,但若设置deviation为1e-3,又会打印出比160000还多很多,即会有重复的数据被加载。
请各位看看程序问题出在什么地方,应该怎样改进?谢谢了
//real Get_PowerDensity(real XYZ[])是一个查找函数,可以略过,重点看看demand的程序 。Data数组中存放的是功率密度的数值。拜托了!      
#include"udf.h"
#include<stdio.h>
#include<math.h>
real XRounding=100;
real YRounding=100;
real ZRounding=100;
int XBucketNum=67;
int YBucketNum=66;
int ZBucketNum=16;
real minX=0;
real minY=-0.327434;
real minZ=0;
real deviation = 1e-7;
int i, aIndex, aSize;
real XYZ[ND_ND];
real x[ND_ND];
int XBucketNo, YBucketNo, ZBucketNo;
real Data[672156] = {
0.00960295,-0.19801800,0.08248210,3.68013000,
0.00971179,-0.19755600,0.08497210,3.67209000,
0.00951925,-0.19755600,0.09909510,3.69973000,
0.00951925,-0.19755600,0.10176300,3.69553000,
0.00951925,-0.19755600,0.11866600,3.71783000,
0.00951925,-0.19755600,0.12133400,3.71644000,
0.00951925,-0.19755600,0.13823700,3.69766000,
0.00951925,-0.19755600,0.14090500,3.70499000,
0.00960295,-0.19801800,0.15751800,3.72015000,
0.00971179,-0.19755600,0.15502800,3.71334000,
0.00987661,-0.19732500,0.08151860,3.70908000,
0.00908895,-0.19732500,0.08089360,3.66649000,
0.00869783,-0.19247900,0.08802500,3.67262000,
0.00872506,-0.19247900,0.08158860,3.72114000,
。。。。。。
}
DEFINE_SOURCE(T_SOURCE, c, t_cell, dS, eqn)                  
{                                                            
    real ij;                                          
    C_CENTROID(XYZ, c, t_cell);                              
    ij = Get_PowerDensity(XYZ);              
    return ij;                                                
}                                                            
real Get_PowerDensity(real XYZ[])                        
{                                                
    XBucketNo =(int)(( XYZ[0] - minX) * XRounding);           
    YBucketNo =(int)(( XYZ[1] - minY) * YRounding);           
    ZBucketNo =(int)(( XYZ[2] - minZ) * ZRounding);           
    aIndex = DataIndex[XBucketNo][YBucketNo][ZBucketNo] * 4;  
    aSize = DataSize[XBucketNo][YBucketNo][ZBucketNo];        
    for (i=0; i<aSize; i++)                                   
    {                                                         
        if(( fabs( Data[aIndex + i*4] -XYZ[0] ) < deviation)  
            &&(fabs(Data[aIndex + i*4 +1]-XYZ[1])<deviation)  
            &&(fabs(Data[aIndex + i*4 +2]-XYZ[2])<deviation))
            return Data[aIndex + i*4 +3];                  
    }                                                                                                         
}            
DEFINE_ON_DEMAND(on_demand_calc)   
{
        FILE *fp;
        Domain *d;
        cell_t c;
        Thread *t;
        d=Get_Domain(1);
        fp=fopen("D:\\data1.txt","w");
        thread_loop_c(t,d)
        {
                begin_c_loop(c,t)
                {
                        C_CENTROID(XYZ, c, t);
                        for (i=0;i<168039;i++)
                        if((fabs(Data[4*i]-XYZ[0])<deviation)&&(fabs(Data[4*i+1]-XYZ[1])<deviation)&&(fabs(Data[4*i+2]-XYZ[2])<deviation))
                                        fprintf(fp,"%g,%g,%g,%g\n",XYZ[0],XYZ[1],XYZ[2],Data[4*i+3]);
                }
                end_c_loop(c,t)
        }  
}
DEFINE_PROFILE(HeatFluxO,thread,index)
{
  face_t f;
  real cos;
   begin_f_loop(f,thread)
   {
     F_CENTROID(x,f,thread);
         if ((x[0]<0))
                 cos=1;
         else if((0.186<x[0]))
                 cos=0;
         else
                 cos=(0.186-x[0])/0.186;
        F_PROFILE(f,thread,index) = 500000*cos;
   }
   end_f_loop(f,thread)
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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