Ansys Learning Forum › Forums › Discuss Simulation › Fluids › Modelling porous material › Reply To: Modelling porous material
Hi Rob, I completely understand that. Thank you for all your help so far. Would you be able to help with my code for an individual UDF for this energy source above. I have been stuck on this for the past week, and tried multiple methods but to no avail, with ANSYS crashing each time I run this as an energy source term in the porous material.Â
I have attached the equation I am modelling for reference.
Â
Â
#define Tsolidus 300.0
#define Tliquidus 304.0
#define L_f 250 //Latent heat of fusion
Â
#define UDM_RHO_F_PREV 0Â // UDM index for storing previous rho_f
#define UDM_LAMBDA_PREV 1Â // UDM index for storing previous lambda
Â
DEFINE_EXECUTE_ON_LOADING(init_values, udf_name)
{
   Thread *t;
   cell_t c;
   Domain *d = Get_Domain(1); // Get domain using Fluent API, assuming single-phase flow
  Â
   /* Loop over all cells to initialize UDM values */
   thread_loop_c(t, d)
   {
       begin_c_loop_all(c, t)
       {
           C_UDMI(c,t,UDM_RHO_F_PREV) = 1000.0; //initializing previous rho_f
           C_UDMI(c,t,UDM_LAMBDA_PREV) = 0.0; //initializing previous lambda
       }
       end_c_loop_all(c, t)
   }
}
Â
DEFINE_SOURCE(energy_sourceN, c, t, dS, eqn)
{
 real lambda, lambda_prev, V[ND_ND], rho_f, Sl, d_lambda_dt, grad_lambda_dot_V, T, rho_f_prev;
Â
 T = C_T(c, t);
 rho_f = C_R(c, t);
 C_CENTROID(V, c, t);
Â
 rho_f_prev = C_UDMI(c, t, UDM_RHO_F_PREV); // Fetch the previous value of rho_f from UDM
 lambda_prev = C_UDMI(c, t, UDM_LAMBDA_PREV); // Fetch the previous value of lambda from UDM
Â
 // Calculate lambda
 if (T < Tsolidus)
   lambda = 0.0;
 else if (T > Tliquidus)
   lambda = 1.0;
 else
   lambda = (T - Tsolidus) / (Tliquidus - Tsolidus);
Â
 // Calculate d(lambda*rho_f*L_f)/dt
 d_lambda_dt = ((rho_f * lambda * L_f * 0.85) - (rho_f_prev * lambda_prev * L_f * 0.85)) / CURRENT_TIMESTEP;
Â
 // The gradient calculation requires more attention. Below is just a placeholder, and you need to implement the correct gradient calculation.
 grad_lambda_dot_V = (C_R_G(c,t)[0] * V[0] + C_R_G(c,t)[1] * V[1]) * lambda * L_f;
Â
 Sl = d_lambda_dt + grad_lambda_dot_V;
Â
 dS[eqn] = 0; // Adjust the source term linearization if necessary
Â
 // Store the current time step values of rho_f and lambda to UDM
 C_UDMI(c, t, UDM_RHO_F_PREV) = rho_f;
 C_UDMI(c, t, UDM_LAMBDA_PREV) = lambda;
Â
 return Sl;
}