converting instructions of a wall to instructions of a domain
hello everybody,
Can any one help me please. I'm working with an UDF that makes the velocity inlet in a pipe varies with respect to the average temperature of a wall (THREAD_ID(t)==2 in my UDF). The UDF works perfectly when the thread_id concerned is a wall, but when I change the wall by a surface (2d domain) by changing the THREAD_ID(t) in the code, Fluent generate this error: 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: () This is my udf code: #include "udf.h" DEFINE_PROFILE(unsteady_velocity_profile, th, position) { Domain *d; /* declare domain pointer since it is not passed as an argument to the DEFINE macro */ face_t f; real tavg = 0.; Thread *t; real tempe,volume,vol_tot,area; real A[ND_ND]; d = Get_Domain(1); /* Get the domain using Fluent utility */ /* Loop over all cell threads in the domain */ thread_loop_f(t,d) { /* only use thread with id=2 */ if (THREAD_ID(t)==2) { /* Loop over all cells */ begin_f_loop(f,t) { tempe = F_T(f,t); area=NV_MAG(A); vol_tot += area; tavg += (tempe*area); } end_f_loop(f,t) tavg /= vol_tot; } } begin_f_loop(f, th) { if ( tavg <= 298. ) F_PROFILE(f, th, position) = 0.5; if ( tavg > 301.4 ) F_PROFILE(f, th, position) = 0.; } end_f_loop(f, th) } |
Any helps please !! :(:(
|
This version is working, but what exactly do you change in the version where it not working?
|
Quote:
Yes exactly, when I use the THREAD_ID(t) of a wall, the code work perfectly, but when I want to use the THREAD_ID(t) of a domain ( interior_air in the pictures) either the code generate this error: FLUENT received fatal signal (ACCESS_VIOLATION) when the ID is got from the boundary conditions (ID=2 here) like in this picture: https://image.noelshack.com/fichiers...22684068-1.png Or the code does not generate errors when the ID is got from the cell zone conditions (ID=9 here) like in this picture: https://image.noelshack.com/fichiers...22684279-2.png But even if the code does not generate errors when the ID is got from the cell zone conditions, the velocity defined is always equal to 0.5 , that's mean that the T_average is not well calculated from the interior_air. Can you help me please ? |
The problem is simple to explain: you wrote a UDF to calculate average temperature on a wall. But now you apply it on an interior. An interior is not a wall...
I can't give you a solution. I mean, I can give you many 'solutions' that will get rid of the error, but I can't guess which one is relevant for you, because I don't understand what you are trying to achieve. |
Quote:
https://image.noelshack.com/fichiers...3-13-52-04.png So could you help me please? |
Part of your code is this:
Code:
/* Loop over all cells */ So rewrite your code to work with cells instead of faces. |
Quote:
#include "udf.h" DEFINE_PROFILE(unsteady_velocity_profile, th, position) { Domain *d; /* declare domain pointer since it is not passed as an argument to the DEFINE macro */ face_t f; real tavg = 0.; Thread *t; real tempe,volume,vol_tot; cell_t c; d = Get_Domain(1); /* Get the domain using Fluent utility */ /* Loop over all cell threads in the domain */ thread_loop_f(t,d) { /* only use thread with id=11 */ if (THREAD_ID(t)==9) { /* Loop over all cells */ begin_c_loop(c,t) { volume = C_VOLUME(c,t); /* get cell volume */ tempe = C_T(c,t); /* get cell temperature */ vol_tot += volume; tavg += (tempe*volume); } end_c_loop(c,t) tavg /= vol_tot; } } begin_f_loop(f, th) { if ( tavg <= 298. ) F_PROFILE(f, th, position) = 0.5; if ( tavg > 298. ) F_PROFILE(f, th, position) = 0.; } end_f_loop(f, th) } |
Code:
/* Loop over all cell threads in the domain */ But what do you mean with "no results"??? Program crashed, error warning, strange results, compilation error... What? |
Quote:
thread_loop_c(t,d) { /* only use thread with id=9 */ if (THREAD_ID(t)==9) { /* Loop over all cells */ begin_c_loop(c,t) { volume = C_VOLUME(c,t); /* get cell volume */ tempe = C_T(c,t); /* get cell temperature */ vol_tot += volume; tavg += (tempe*volume); } end_c_loop(c,t) tavg /= vol_tot; the velocity is always 0. that's mean that tavg is always above 298 k. and that's not true. I initialised with 291 k. |
If you are running in serial mode (not parallel), then I can't see where the problem is.
|
Quote:
But please Mr. Pakk, if you can tell me instructions to write the tavg in a separate file or either in the fluent window in every time step, then I can maybe recognize where the problem is. |
Message("tavg=%f\n",tavg);
|
Quote:
unsteady_velocity_profile.c: line 59: function "CX_Message" not found (pc=140). that what I puted in the code: begin_c_loop(c,t) { volume = C_VOLUME(c,t); /* get cell volume */ tempe = C_T(c,t); /* get cell temperature */ vol_tot += volume; tavg += (tempe*volume); } end_c_loop(c,t) tavg /= vol_tot; Message("tavg=%f\n",tavg); } |
You should (as always) be compiling, not interpreting.
|
Quote:
|
All times are GMT -4. The time now is 04:42. |