CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   Fluent UDF and Scheme Programming (https://www.cfd-online.com/Forums/fluent-udf/)
-   -   converting instructions of a wall to instructions of a domain (https://www.cfd-online.com/Forums/fluent-udf/200312-converting-instructions-wall-instructions-domain.html)

youhane March 29, 2018 10:20

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)
}

youhane March 30, 2018 18:45

Any helps please !! :(:(

pakk March 31, 2018 11:46

This version is working, but what exactly do you change in the version where it not working?

youhane April 2, 2018 19:15

Quote:

Originally Posted by pakk (Post 687247)
This version is working, but what exactly do you change in the version where it not working?

Thanks for your reply Mr. pakk.

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 ?

pakk April 3, 2018 04:58

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.

youhane April 3, 2018 10:04

Quote:

Originally Posted by pakk (Post 687419)
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.

Thanks Mr. Pakk. So this is what I'm trying to achieve :

https://image.noelshack.com/fichiers...3-13-52-04.png

So could you help me please?

pakk April 4, 2018 01:55

Part of your code is this:

Code:

/* Loop over all cells */
begin_f_loop(f,t)

The problem is that the comment and the code itself do not agree. As the comment says, you should loop over all cells, but the code below shows that you loop over all faces.

So rewrite your code to work with cells instead of faces.

youhane April 4, 2018 08:46

Quote:

Originally Posted by pakk (Post 687519)
Part of your code is this:

Code:

/* Loop over all cells */
begin_f_loop(f,t)

The problem is that the comment and the code itself do not agree. As the comment says, you should loop over all cells, but the code below shows that you loop over all faces.

So rewrite your code to work with cells instead of faces.

unfortunately, I tried the code with cells before I used it with faces. Neither of them have worked. This is the code with cells: ( I tried also thread_loop_c(t,d) instead of thread_loop_f(t,d) and there is no results :( )


#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)
}

pakk April 4, 2018 08:49

Code:

/* Loop over all cell threads in the domain */
  thread_loop_f(t,d)

Again, code and comment do not agree. Comment is correct, code is wrong.

But what do you mean with "no results"??? Program crashed, error warning, strange results, compilation error... What?

youhane April 4, 2018 09:05

Quote:

Originally Posted by pakk (Post 687581)
Code:

/* Loop over all cell threads in the domain */
  thread_loop_f(t,d)

Again, code and comment do not agree. Comment is correct, code is wrong.

But what do you mean with "no results"??? Program crashed, error warning, strange results, compilation error... What?

yes when I put that:

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.

pakk April 4, 2018 09:07

If you are running in serial mode (not parallel), then I can't see where the problem is.

youhane April 4, 2018 09:17

Quote:

Originally Posted by pakk (Post 687587)
If you are running in serial mode (not parallel), then I can't see where the problem is.

unfortunately, I run it in serial mode :(

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.

pakk April 4, 2018 09:19

Message("tavg=%f\n",tavg);

youhane April 4, 2018 09:30

Quote:

Originally Posted by pakk (Post 687589)
Message("tavg=%f\n",tavg);

Excuse me but that gives this error in the fluent window:

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);
}

pakk April 4, 2018 09:32

You should (as always) be compiling, not interpreting.

youhane April 4, 2018 09:40

Quote:

Originally Posted by pakk (Post 687594)
You should (as always) be compiling, not interpreting.

okey thank you very much, I will refrer to the udf manuel to learn the difference between them, that may be my whole problem :)


All times are GMT -4. The time now is 04:42.