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/)
-   -   UDF for energy source term (https://www.cfd-online.com/Forums/fluent-udf/96938-udf-energy-source-term.html)

engloly February 5, 2012 15:46

UDF for energy source term
 
in my heat transfer model i want to write a udf for the energy source term
S y = - density * dH\dt
where H= the total enthalpy , t= time

my udf is ;

#include "udf.h"
#define dens 800.0
DEFINE_SOURCE(heat source,cell,thread,dS,eqn)
{
real source ;
source= - C_H-G(cell,thread)*dens ;
dS [eqn] =0 ;
return source ;
}


can any one help me to , i dont know if the cell enthaly gredient is equal to the chane of enthalpy with time?

engloly February 25, 2012 09:26

im waiting for ur help???

Philipp_Sch February 28, 2012 08:36

No, the gradient is a spacial derivative. Besides, it is a vector. You need a time derivative, which YOU have to provide.

engloly March 1, 2012 21:57

yes u are right
but how can i write the dh/dt?

Micael March 6, 2012 16:49

I did this before. I don't have access to it right now, but here is the idea (I AM NOT SURE OF THE EXACT SYNTAX, I just write it roughly by memory):

1- compute/store H in a UDM with a "Adjust" UDF
2- then derive it in your Source UDF, something like that (first order in that example):
time_step = "macro for time step goes here";
dHdt = (UDM(0) - UDM_M1(0)) / time_step; // suppose you put H in UDM(0)

For what I remember, it was not that easy to implement, but the idea is there. Among all, make sure to understand exactly when "Adjust" is executed.

This line:
dS [eqn] =0 ;
can be a problem. Make sure to understand what it means, look at UDF guide. You may need to derive your source term to ever converge (depend on your problem). I always derive my source term, it is either safer or downright necessary (numerically).

Keep motivation high, this problem will be challenging if you are beginner, but it is feasible.

ComputerGuy March 7, 2012 16:40

Quote:

Originally Posted by engloly (Post 347214)
yes u are right
but how can i write the dh/dt?

Perhaps something like the following:

Make sure you enable a user-defined memory location... Also, I'm assuming you want the density at the current time step, not the average density between the two timesteps (current and previous). Also, enthalpy has a spatial gradient (x/y/z), but you want the gradient w.r.t. time.

This is a crude approximation of a derivative. Ideally, you should do some higher order approximations.

Finally: there is an "if" statement in there to ensure that, at the beginning of the simulation where you have no derivative information, no source term is calculated.

--ComputerGuy

Code:

#include "udf.h"
DEFINE_SOURCE(heat_source,cell,thread,dS,eqn)
{
        real source;
        source=0.0;
        real dHdt;
        dHdt=(C_H(cell,thread)-C_UDMI(cell,thread,0))/CURRENT_TIMESTEP;
        if(CURRENT_TIME>0)
        {
                source= -dHdt*C_R(cell,thread);
        }
        C_UDMI(cell,thread,0)=C_H(cell,thread);
        dS[eqn] =0.0;
        return source;
}


Micael March 7, 2012 18:00

Quote:

Originally Posted by ComputerGuy (Post 348228)
Perhaps something like the following:

Make sure you enable a user-defined memory location... Also, I'm assuming you want the density at the current time step, not the average density between the two timesteps (current and previous). Also, enthalpy has a spatial gradient (x/y/z), but you want the gradient w.r.t. time.

This is a crude approximation of a derivative. Ideally, you should do some higher order approximations.

Finally: there is an "if" statement in there to ensure that, at the beginning of the simulation where you have no derivative information, no source term is calculated.

--ComputerGuy

Code:

#include "udf.h"
DEFINE_SOURCE(heat_source,cell,thread,dS,eqn)
{
    real source;
    source=0.0;
    real dHdt;
    dHdt=(C_H(cell,thread)-C_UDMI(cell,thread,0))/CURRENT_TIMESTEP;
    if(CURRENT_TIME>0)
    {
        source= -dHdt*C_R(cell,thread);
    }
    C_UDMI(cell,thread,0)=C_H(cell,thread);
    dS[eqn] =0.0;
    return source;
}


I don't think that can work. The reason is that DEFINE_SOURCE should be called more than once per time step (many iterations to solve a given time step). Hence, this line should be remove:
Code:


C_UDMI(cell,thread,0)=C_H(cell,thread);

C_UDMI(cell,thread,0) should be compute only once per time step and an DEFINE_EXECUTE_AT_END (or was it an DEFINE_ADJUST? - I don't remember) can do this. I do remember that it was tricky, I could find those files this weekend.

Keep in mind that dS[eqn]=0 could lead to convergence problem, but it is ok to try it first like that.

Otherwise, ComputerGuy is right, DEFINE_SOURCE should looks similar to that.

ComputerGuy March 7, 2012 18:17

Quote:

Originally Posted by Micael (Post 348244)
I don't think that can work. The reason is that DEFINE_SOURCE should be called more than once per time step (many iterations to solve a given time step). Hence, this line should be remove:
Code:


C_UDMI(cell,thread,0)=C_H(cell,thread);

C_UDMI(cell,thread,0) should be compute only once per time step and an ADJUST can do this. I do remember that it was tricky, I could find those files this weekend.

Hmmm, you're right. Ok... Something like this ought to record the enthalpy once per timestep.

ComputerGuy

Code:


#include "udf.h"

DEFINE_EXECUTE_AT_END(ThisRunsAtEndOfTimestep)
{

  Domain *d;
  Thread *t;
  cell_t c;
  d = Get_Domain(1);  /* mixture domain if multiphase */

 thread_loop_c(t,d)
    {
    if (FLUID_THREAD_P(t))
      {
        begin_c_loop(c,t)
          {
          C_UDMI(c,t,0)=C_H(c,t);
        }
        end_c_loop(c,t)
      }
    }
}


DEFINE_SOURCE(heat_source,cell,thread,dS,eqn)
{
    real source;
    source=0.0;
    real dHdt;
    dHdt=(C_H(cell,thread)-C_UDMI(cell,thread,0))/CURRENT_TIMESTEP;
    if(CURRENT_TIME>0)
    {
        source= -dHdt*C_R(cell,thread);
    }
    dS[eqn] =0.0;
    return source;
}


Micael March 7, 2012 19:51

Yes, that's it ComputerGuy! :)

Only left is the special case of the very first time step and the whole thing is adressed.

ComputerGuy March 7, 2012 20:13

Quote:

Originally Posted by Micael (Post 348256)
Yes, that's it ComputerGuy! :)

Only left is the special case of the very first time step and the whole thing is adressed.

I think, because the code runs at the end of the time step, it should be fine. I've also addressed this in the define_source macro, where I check to see that the time is > 0. If it isn't, it wouldn't be possible to obtain a derivative, and thus I set the source to zero.

engloly: Let us know if these work

ComputerGuy

Micael March 8, 2012 15:33

Still one detail, the UDM should be initialized so that during the first time step there is a value for it.

mehrandadsetan June 25, 2017 06:05

Energy source term does not work!
 
Dear all,

I wrote a udf for energy equation, but I think it depends on the magnitude of sigma_r.:confused::confused:
For sigma_r equal to 3e-1, udf works well :cool:, but if you change it to 3e-3, udf doesn't work. :eek:
can anybody help me?

UDF code:

#include "udf.h"
#define PI 3.14159265
#define ei 40e-3
#define sigma_r 3e-3
#define sigma_t 0.5e-6
#define t0 0
DEFINE_SOURCE(Energy_source, c, ct, dS, eqn)
{
real source;
real pos[ND_ND];
real centre[ND_ND];
real flow_time;
real r;
NV_D(centre,=,0.8,0,0); /* Set a vector */
flow_time = CURRENT_TIME; /* Special Fluent macro */
C_CENTROID(pos,c,ct);
NV_VV(pos,=,pos,-,centre); /* Vector arithmetic */
r = NV_MAG(pos);
source = (ei/(4*pow(PI,2)*pow(sigma_r,3)*sigma_t))*exp(-0.5*pow((flow_time-t0)/sigma_t,2))*exp(-0.5*pow(r/sigma_r,2));
dS[eqn] = 0;
return source;
}


All times are GMT -4. The time now is 13:05.