CFD Online Logo CFD Online URL
www.cfd-online.com
[Sponsors]
Home > Forums > Software User Forums > ANSYS > FLUENT

Particle fouling UDF code writing errors modified

Register Blogs Members List Search Today's Posts Mark Forums Read

Reply
 
LinkBack Thread Tools Search this Thread Display Modes
Old   April 7, 2025, 22:56
Question Particle fouling UDF code writing errors modified
  #1
lmz
New Member
 
Muzhen Li
Join Date: Apr 2025
Posts: 1
Rep Power: 0
lmz is on a distinguished road
/*---------------------------------- UDF 头文件及宏定义 ----------------------------------*/
#include "udf.h"

#define UDM_FOULING_RESISTANCE 0 // 污垢热阻 (m²·K/W)
#define UDM_DEPOSITION_RATE 1 // 沉积速率 (kg/m²·s)
#define UDM_FOULING_THICKNESS 2 // 污垢层厚度 (m)

/*---------------------------------- 全局参数定义 ----------------------------------------*/
real C_inf = 0.4; // 近壁颗粒浓度 (kg/m3)
real S_p = 0.8; // 粘附概率 ((无量纲)
real zeta = 1e5; // 污垢粘附强度因子 (N·s/m²)
real rho_f = 2500.0; // 污垢层密度 (kg/m³)
real lambda_f = 1.2; // 污垢导热系数 (W/(m·K))
real dp = 1e-6; // 粒子直径 (m),需根据案例调整
real kB = 1.380649e-23; // 玻尔兹曼常数 (J/K)
real Ct = 0.55; // 热泳系数(无量纲)
real Sc_t = 0.7; // 湍流施密特数(无量纲)

/*---------------------------------- 计算布朗扩散系数 DB --------------------------------*/
real calculate_DB(cell_t c, Thread* thread) {
// Stokes-Einstein公式: DB = (kB * T) / (6 * π * eta * r)
real r = dp / 2.0; // 粒子半径
real eta = C_MU(c, thread); // 动力粘度 (Pa·s)
real T = C_T(c, thread); // 从单元获取温度 (单位: K)
real DB = (kB * T) / (6.0 * 3.1415926 * eta * r);
return DB; // 单位: m²/s
}

/*---------------------------------- 计算热泳扩散系数 DT --------------------------------*/
real calculate_DT(cell_t c, Thread* thread) {
// 热泳模型: DT = Ct * eta * T * grad_T / (rho_l * lambda_l)
real eta = C_MU(c, thread); // 动力粘度 (Pa·s)
real T = C_T(c, thread); // 从单元获取温度 (单位: K)
real rho_l = C_R(c, thread); // 流体密度 (kg/m³)
real lambda_l = C_K(c, thread); // 流体导热系数 (W/(m·K))

// 获取温度梯度(单位:K/m)
real grad_T[ND_ND], grad_T_mag;
C_T_G(c,thread,grad_T); // 获取温度梯度分量
grad_T_mag = NV_MAG(grad_T); // 温度梯度模长

// 计算DT
real DT = Ct * eta * T * grad_T_mag / (rho_l * lambda_l);
return DT; // 单位: m²/s
}

/*---------------------------------- 计算湍流扩散系数 ε_p ------------------------------*/
real calculate_epsilon_p(cell_t c,Thread* thread) {
// 从k-epsilon模型获取k和ε值
real k = C_K(c, thread); // 湍流动能 (m²/s²)
real epsilon = C_EPSILON(c, thread); // 湍流耗散率 (m²/s³)

// 计算湍流粘度 μ_t = Cμ * ρ * k² / ε
real Cmu = 0.09; // k-epsilon模型常数
real rho = C_R(c, thread); // 流体密度 (kg/m³)
real mu_t = Cmu * rho * k * k / (epsilon + 1e-20); // 避免除以0

// 计算湍流运动粘度 ν_t = μ_t / ρ
real nu_t = mu_t / (rho + 1e-6);

// 湍流扩散系数 ε_p = ν_t / Sc_t
real epsilon_p = nu_t / Sc_t;
return epsilon_p; // 单位: m²/s
}

//添加重力速度计算函数
real u_gravity(cell_t c, Thread* thread) {
real g[ND_ND] = { 0.0, 0.0, 9.81 }; // 示例:Y方向重力

//获取关联单元及流体属性
real eta = C_MU(c, thread); // 动力粘度 (Pa·s)
real rho_l = C_R(c, thread); // 流体密度 (kg/m³)

// 计算密度差
real delta_rho = rho_f - rho_l; // 颗粒与流体密度差

// Stokes沉降速度公式
real u = (dp * dp * delta_rho * g[2]) / (18.0 * eta + 1e-20); // 单位: m/s
return u;
}

/*---------------------------------- 改进的无因次浓度模型 ----------------------------*/
real calculate_C_plus(real y_plus,cell_t c, Thread* thread) {
real nu = C_MU(c, thread) / (C_R(c, thread)+1e-6);
real Sc = nu / calculate_DB(c, thread);

// 近壁区(y+ < 5)线性分布
if (y_plus < 5.0) {
return 1.0 - y_plus / (5.0 * Sc);
}
// 缓冲层(5 < y+ < 30)
else if (y_plus < 30.0) {
real C_log = log(1.0 + Sc * y_plus) / (2.5 * Sc);
return 1.0 - 0.2 - C_log;
}
// 对数区(y+ >= 30)
else {
return (1.0 / Sc_t) * log(y_plus) + 5.0;
}
}

real calculate_dC_plus_dy_plus(real y_plus, cell_t c, Thread* thread) {
real nu = C_MU(c, thread) / (C_R(c, thread) + 1e-6);
real Sc = nu / calculate_DB(c, thread);

// 近壁区导数
if (y_plus < 5.0) {
return -1.0 / (5.0 * Sc);
}
// 缓冲层导数
else if (y_plus < 30.0) {
return -Sc / (2.5 * (1.0 + Sc * y_plus));
}
// 对数区导数
else {
return 1.0 / (Sc_t * y_plus);
}
}

/*---------------------------------- 自定义函数:计算沉积通量 ----------------------------*/
real calculate_J(cell_t c, Thread* thread,face_t f) {
// 获取流体属性
//real T = F_T(f, thread); // 面温度 (K)
real eta1 = C_MU(c, thread); // 动力粘度 (Pa·s)
real rho = C_R(c, thread); // 密度 (kg/m³)
real lambda_l = C_K(c, thread); // 流体导热系数 (W/(m·K))

// 获取温度梯度
real grad_T[ND_ND], grad_T_mag;
C_T_G(c, thread, grad_T); // 获取温度梯度矢量
grad_T_mag = NV_MAG(grad_T); // 温度梯度模长

//计算扩散系数
real DB = calculate_DB(c,thread); // 使用参数T_face和eta
real DT = calculate_DT(c,thread);
real epsilon_p = calculate_epsilon_p(c, thread); // 修正:传递thread指针

// 获取壁面剪切应力
real tau_w_vector[ND_ND]; // ND_ND为维度(2D为2,3D为3)
C_WALL_SHEAR(f, thread, tau_w_vector);// 调用宏获取剪切应力矢量(单位:Pa)
real tau_w_mag = NV_MAG(tau_w_vector); // 计算标量剪切应力(模长)sqrt(tau_x^2 + tau_y^2 [+ tau_z^2])

// 计算摩擦速度m/s
real u_star = sqrt(tau_w_mag / (rho+1e-20));

// 获取流体运动粘度ν
real nu = eta1 / rho;
real y_plus = F_YPLUS(f, thread);

// 计算无因次参数C+及其梯度(假设线性分布)
real C_plus = calculate_C_plus(y_plus, c, thread); // C+ = C/C∞
real dC_plus_dy_plus = calculate_dC_plus_dy_plus(y_plus, c, thread); // 动态梯度模型

// 计算无因次沉积速率u_d+
real term1 = -(DB / nu + epsilon_p / nu) * dC_plus_dy_plus;
real term2 = -(u_gravity(c, thread) / u_star) * C_plus; // 重力沉降项(需定义u_gravity函数)
real term3 = -(DT / (nu * u_star)) * C_plus; // 热泳项(简化模型)
real term4 = -(epsilon_p / u_star) * C_plus; // 湍流扩散项(经验模型)

real u_d_plus = term1 + term2 + term3 + term4;
u_d_plus = max(u_d_plus, 0.0); // 确保非负

// 计算沉积速度u_d
real u_d = u_d_plus * u_star;

// 计算沉积通量J
real J = S_p * u_d * C_inf;
return J; // 单位: kg/(m²·s)
}

/*---------------------------------- 主UDF:更新局部污垢参数 -----------------------------*/
DEFINE_ADJUST(update_local_fouling, domain)
{
//real g[ND_ND] = { 0.0, 0.0, 9.81 }; // 重力加速度 (m/s²)
Thread *thread;
face_t f;

// 获取时间步长(兼容瞬态/稳态)
real dt = NNULLP(RP_Get_Real("physical-time-step")) ? 1.0 : RP_Get_Real("physical-time-step");

// 遍历所有壁面边界
thread_loop_f(thread, domain)
{
if (THREAD_TYPE(thread) == BOUNDARY_THREAD &&
Get_Boundary_Type(thread) == BT_WALL)
{
begin_f_loop(f, thread)
{
cell_t c = F_C0(f, thread);
Thread* cthread = F_C0_THREAD(f, thread);

// 验证单元有效性
if (FLUID_THREAD_P(cthread))
{
real eta = C_MU(c, cthread); // 动力粘度
real rho_l = C_R(c, cthread); // 密度
real lambda_l = C_K(c, cthread); // 导热系数

// 获取剪切应力模长
real tau_w_vector[ND_ND];
C_WALL_SHEAR(f, thread, tau_w_vector);
real tau_w = NV_MAG(tau_w_vector);

// 计算沉积速率和去除速率
real J = calculate_J(c, thread, f);
real m_d = J; // 沉积速率 (kg/(m²·s))
real m_r = tau_w * F_UDMI(f, thread, UDM_FOULING_THICKNESS) / zeta; // 公式(5)

// 更新污垢层厚度(时间步长dt=1s)
real x_f_new = F_UDMI(f, thread, UDM_FOULING_THICKNESS) + (m_d - m_r) * dt;
x_f_new = (x_f_new < 0.0) ? 0.0 : x_f_new; // 确保非负
F_UDMI(f, thread, UDM_FOULING_THICKNESS) = x_f_new;

// 计算局部污垢阻力
real R_f = x_f_new / lambda_f; // 公式(6)
F_UDMI(f, thread, UDM_FOULING_RESISTANCE) = R_f;
F_UDMI(f, thread, UDM_DEPOSITION_RATE) = m_d;
}
}
end_f_loop(f, thread);
}
}
}

/*---------------------------------- UDF初始化 ------------------------------------------*/
DEFINE_ON_DEMAND(init_udm)
{
// 初始化UDM存储为0
Domain* domain = Get_Domain(1);
Thread* thread;
face_t f;

thread_loop_f(thread, domain)
{
// 仅处理壁面边界线程
if (THREAD_TYPE(thread) == BOUNDARY_THREAD &&
Get_Boundary_Type(thread) == BT_WALL)
{
begin_f_loop(f, thread)
{
F_UDMI(f, thread, UDM_FOULING_RESISTANCE) = 0.0;
F_UDMI(f, thread, UDM_DEPOSITION_RATE) = 0.0;
F_UDMI(f, thread, UDM_FOULING_THICKNESS) = 0.0;
}
end_f_loop(f, thread);
}
}
}

The above code debugging is not possible, the main problem is define_adjust and define_on_demand macro definition inside the boundary condition setting, please help the expert teachers to modify and improve, thank you.
lmz is offline   Reply With Quote

Reply

Tags
particle deposition, udf

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are Off
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
courant number increases to rather large values 6863523 OpenFOAM Running, Solving & CFD 22 July 6, 2023 00:48
UDF for multicomponent particle vaporization Mohsin Fluent UDF and Scheme Programming 17 January 27, 2021 03:57
UDF for particle interception with pt_termination fortran routine abcdefgh CFX 6 October 6, 2019 14:30
writing code in udf for evaporation manishat88 Fluent Multiphase 0 December 10, 2014 07:08
Check particle impaction with User Fortran Julian K. CFX 3 January 12, 2012 10:46


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