CFD Online Discussion Forums

CFD Online Discussion Forums (http://www.cfd-online.com/Forums/)
-   FLUENT (http://www.cfd-online.com/Forums/fluent/)
-   -   the problem of UDF (http://www.cfd-online.com/Forums/fluent/40429-problem-udf.html)

zzb April 4, 2006 07:32

the problem of UDF
 
I am studying UDF,I have a problem doing a example of UDF hlep,there is not erroe in compiling ,but do not run.How to do with? 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(); }


Lobby.H April 4, 2006 10:21

Re: the problem of UDF
 
i don't fully understand your code but i've seen somewhere else that if this error occurs, just double check your udf defining. A example he can take is if there's solid in your b.c., when you define velocity or some other parameter with define_init, this will happen.

RoM April 5, 2006 05:36

Re: the problem of UDF
 
Please look here for a short description how to post preformated code. Most people wont have the time to reformate the mess you posted above, let alone debugging.

http://www.cfd-online.com/Forum/fluent.cgi?file=help

Some observations from me:

Dont use the domain pointer as global variable. If someone forgets to call the reset_udm function, it will remain uninitialized. You use particle scalars in your udf, did you allocate any (its easy to forget)?

RoM


All times are GMT -4. The time now is 10:09.