CFD Online Discussion Forums

CFD Online Discussion Forums (http://www.cfd-online.com/Forums/)
-   FLUENT (http://www.cfd-online.com/Forums/fluent/)
-   -   Accretion UDF error (http://www.cfd-online.com/Forums/fluent/44145-accretion-udf-error.html)

sigma March 16, 2007 12:43

Accretion UDF error
 
Hi, I'm a new FLUENT user and trying to use the accretion UDF. My system is WindowsXP and I'm using the FLUENT Manual UDF example for erosion/accretion. The udf is compiled fine, but when I run it, I got the ACCESS_VIOLATION error. I tryied to find out at which point the code is crashed and it seems like it occures in function DEFINE_DPM_EROSION at point of: if(!check_for_UDM()), but i'm not shure...Does anybody have such a problem? Thanks a lot for help! Here is the code i'm using (from FLUENT Manual):

#include "udf.h"

#define MIN_IMPACT_VELO -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 be executed only 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 UDMs, */

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(t);

num_in_data = F_UDMI(f,t,NUM_OF_HITS);

/* 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();

}


All times are GMT -4. The time now is 11:19.