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

版主:为啥UDF中的例子在练习使用时不能用啊

[复制链接]
发表于 2006-4-3 14:39:35 | 显示全部楼层 |阅读模式

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

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

x
我学习使用udf,源程序是UDF中文帮助的DPM中的例子,编译没出现问题,但是不能计算,出现了错误,
Error:
FLUENT received fatal signal (ACCESS_VIOLATION)
1. Note exact events leading to error.
2. Save case/data under new name.
3. Exit program and restart to continue.
4. Report error to your distributor.
Error Object: ()
请高手指点!!谢谢!
源程序如下:
/***********************************************************************
  UDF for extending post-processing of wall impacts                  
************************************************************************/
#include "udf.h"
#define MIN_IMPACT_VELO -0.1000
/* Minimum particle velocity normal to wall (m/s) to allow Accretion.*/
Domain *domain; /* Get the domain pointer and assign it later to domain*/
enum             /* Enumeration of used User-Defined Memory Locations. */
{
NUM_OF_HITS,    /* Number of particle hits into wall face considered.*/
AVG_DIAMETER,    /* Average diameter of particles that hit the wall. */
AVG_RADI_VELO,    /* Average radial velocity of ""  ""  ------------ */
NUM_OF_USED_UDM
};
int UDM_checked = 0;     /* Availability of UDMLs checked? */
void reset_UDM_s(void);  /* Function to follow below. */
int
check_for_UDM(void)      /* Check for UDMLs'; availability... */
{
Thread *t;
if (UDM_checked)
   return UDM_checked;
if (!rp_axi)
  Internal_Error("UDF-Error: only valid for 2d-axisymmetric cases!\n");
thread_loop_c(t, domain)    /* We require all cell threads to.. */
   {                         /* provide space in memory for UDML */
     if (FLUID_THREAD_P(t))
       if (NULLP(THREAD_STORAGE(t,SV_UDM_I)))
           return 0;
   }
UDM_checked = 1;     /* To make the following work properly... */
reset_UDM_s();       /* This line will only be executed once, */
return UDM_checked;  /* because check_for_UDM checks... */
}                      /* ...for UDM_checked first. */
void
reset_UDM_s(void)
{
Thread *t;
cell_t  c;
face_t  f;
int     i;
if (!check_for_UDM())  /* Don';t do it, if memory is not available. */
   return;
Message("Resetting User Defined Memory...\n");
thread_loop_f(t, domain)
   {
     if (NNULLP(THREAD_STORAGE(t,SV_UDM_I)))
       {
         begin_f_loop(f, t)
           {
             for (i = 0; i < NUM_OF_USED_UDM; i++)
               F_UDMI(f, t, i) = 0.;
           }
         end_f_loop(f, t)
       }
     else
       {
         Message("  Skipping FACE thread no. %d..\n", THREAD_ID(t));
       }
   }
thread_loop_c(t, domain)
   {
     if (NNULLP(THREAD_STORAGE(t,SV_UDM_I)))
       {
         begin_c_loop(c, t)
           {
             for (i = 0; i < NUM_OF_USED_UDM; i++)
               C_UDMI(c, t, i) = 0.;
           }
         end_c_loop(c, t)
       }
     else
       {
         Message(" Skipping CELL thread no. %d..\n", THREAD_ID(t));
       }
   }                /* Skipping Cell Threads can happen if the user */
                           /* uses reset_UDM prior to initializing. */
Message(" --- Done.\n");
}
DEFINE_DPM_SCALAR_UPDATE(dpm_scalup, c, t, if_init, p)
{  if (if_init)
   P_USER_REAL(p, 0) = 0;    /* Simple initialization. Used later for
                              * stopping trajectory calculation */
}
DEFINE_DPM_EROSION(dpm_accr, p, t, f, normal, alpha, Vmag, Mdot)
{
real A[ND_ND], area;
int num_in_data;
Thread *t0;
cell_t  c0;
real radi_pos[2], radius, imp_vel[2], vel_ortho;
/* The following is ONLY valid for 2d-axisymmetric calculations!!! */
/* Additional effort is necessary because DPM tracking is done in  */
/* THREE dimensions for TWO-dimensional axisymmetric calculations. */
radi_pos[0] = p->state.pos[1];      /* Radial location vector. */
radi_pos[1] = p->state.pos[2];      /* (Y and Z in 0 and 1...) */
radius = NV_MAG(radi_pos);
NV_VS(radi_pos, =, radi_pos, /, radius);
                              /* Normalized radius direction vector.*/
imp_vel[0] = P_VEL(p)[0];    /* Axial particle velocity component. */
imp_vel[1] = NVD_DOT(radi_pos, P_VEL(p)[1], P_VEL(p)[2], 0.);
/* Dot product of normalized radius vector and y & z components */
/* of particle velocity vector gives _radial_ particle velocity */
/* component  */
vel_ortho = NV_DOT(imp_vel, normal); /*velocity orthogonal to wall */
if (vel_ortho < MIN_IMPACT_VELO)  /* See above, MIN_IMPACT_VELO */
   return;
if (!UDM_checked)       /* We will need some UDM';s, */
   if (!check_for_UDM()) /* so check for their availability.. */
     return;             /* (Using int variable for speed, could */
                         /*  even just call check_for UDFM().) */
c0 = F_C0(f, t);
t0 = THREAD_T0(f, t);
num_in_data = F_UDMI(f, t, NUM_OF_HITS);
  /* Add particle to statistics: Calculate...:
  current_particle_property +
  earlier_particles_averaged_property * number_of_earlier_particles
  -----------------------------------------------------------------
               number_of_earlier_particles + 1                    */
/* Average diameter of particles that hit the particular wall face:*/
F_UDMI(f, t, AVG_DIAMETER) = (P_DIAM(p)
                         +  num_in_data * F_UDMI(f, t, AVG_DIAMETER))
                            / (num_in_data + 1);
C_UDMI(c0,t0,AVG_DIAMETER) = F_UDMI(f, t, AVG_DIAMETER);
/* Average velocity normal to wall of particles hitting the wall:*/
F_UDMI(f, t, AVG_RADI_VELO) = (vel_ortho
                       +  num_in_data * F_UDMI(f, t, AVG_RADI_VELO))
                          / (num_in_data + 1);
C_UDMI(c0,t0,AVG_RADI_VELO) = F_UDMI(f, t, AVG_RADI_VELO);
F_UDMI(f, t, NUM_OF_HITS) = num_in_data + 1;
C_UDMI(c0,t0,NUM_OF_HITS) = num_in_data + 1;
F_AREA(A, f, t);
area = NV_MAG(A);
F_STORAGE_R(f,t,SV_DPMS_ACCRETION) += Mdot / area;
                                          /* copied from source. */
P_USER_REAL(p, 0) = 1.;     /* "Evaporate" */
}
DEFINE_DPM_LAW(stop_dpm_law, p, if_cpld)
{
if (0. < P_USER_REAL(p, 0))
   P_MASS(p) = 0.;          /* "Evaporate" */
}
DEFINE_ON_DEMAND(reset_UDM)
{
/* assign domain pointer with global domain */
domain = Get_Domain(1);
reset_UDM_s();
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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