Здравствуйте, коллеги! Просветите, пожалуйста, можно ли в Fluent моделировать одновременное течение воздуха с мелкодисперсно-распыленной водой и пылью? стоит задача мокрого пылеулавливания, т.е. ускорения осаждения пыли ее смачиванием, на знаю, с чего начать.
Перед началом работы настоятельно рекомендуем ознакомиться с правилами форума.
Как моделировать мультифазное течение воздух+водяной туман+пыль?
14 февраля, 2022 - 09:45
#1
Здравствуйте. Предагаю вам использовать модель Eulerian с двумя фазами: воздух (сплошная фаза) и вода (дисперсная фаза). Для твёрдых частиц подключите дополнительно модель DPM или DDPM. Все будет работать. Введите коды UDF для изменения параметров частицы пыли при прохождении через туман с различной долей капель. Можно даже смоделировать снижение концентрации капель тумана от их осаждения на частицы с помощью макроса DEFINE_DPM_SOURCE. Далее для моделирования осаждения пыли на стенки могут потребоваться модели Eulerian Wall Film или Lagrangian Wall Film.
Пример применения кодов для конденсации на капельках (из документации программиста Fluent):
/**********************************************************************
Concatenated UDFs for the Discrete Phase Model including
an implementation of a condensation model
an example for the use of DPM_SWITCH
***********************************************************************/
#include "udf.h"
#include "dpm.h"
#define UDM_RH 0 /* no. of UDM holding relative humidity */
#define N_REQ_UDM 1 /* 1 more than UDM_RH */
#define CONDENS 1.0e-4 /* a condensation rate constant */
int h2o_index=0; /* index of water vapor species in mixture material */
real mw_h2o=18.; /* molecular weight of water */
real H2O_Saturation_Pressure(real T)
{
real ratio, aTmTp;
T = MAX(T, 273);
T = MIN(T, 647.286);
aTmTp = .01 * (T - 338.15);
ratio = (647.286 / T - 1.) *
(-7.419242 + aTmTp * (.29721 +
aTmTp * (-.1155286 +
aTmTp * (8.685635e-3 +
aTmTp * (1.094098e-3 +
aTmTp * (-4.39993e-3 +
aTmTp * (2.520658e-3 -
aTmTp * 5.218684e-4)))))));
return (22.089e6 * exp(MIN(ratio, 35.)));
}
real myHumidity(cell_t c, Thread *t)
{
int i;
Material *m = THREAD_MATERIAL(t), *sp;
real yi_h2o = 0; /* water mass fraction */
real r_mix = 0.0; /* sum of [mass fraction / mol. weight] over all species */
real humidity;
if ((MATERIAL_TYPE(m) == MATERIAL_MIXTURE) && (FLUID_THREAD_P(t)))
{
yi_h2o = C_YI(c, t, h2o_index); /* water vapor mass fraction */
mixture_species_loop(m, sp, i)
{
r_mix += C_YI(c,t,i) / MATERIAL_PROP(sp, PROP_mwi);
}
humidity = op_pres * yi_h2o / (mw_h2o * r_mix) /
H2O_Saturation_Pressure(C_T(c,t));
return humidity;
}
else
return 0.;
}
DEFINE_DPM_LAW(condenshumidlaw, tp, coupled)
{
real area;
real mp_dot;
/* Get Cell and Thread from Particle Structure */
cell_t c = TP_CELL(tp);
Thread *t = TP_CELL_THREAD(tp);
area = 4.0 * M_PI * (TP_DIAM(tp) * TP_DIAM(tp));
/* Note This law only used if Humidity > 1.0 so mp_dot always positive*/
mp_dot = CONDENS * sqrt(area) * (myHumidity(c, t) - 1.0);
if (mp_dot > 0.0)
{
TP_MASS(tp) += mp_dot * TP_DT(tp);
TP_DIAM(tp) = pow(6.0 * TP_MASS(tp) / (TP_RHO(tp) * M_PI), 1./3.);
}
/* Assume condensing particle is in thermal equilibrium with fluid in cell */
TP_T(tp) = C_T(c,t);
}
DEFINE_DPM_SOURCE(dpm_source, c, t, S, strength, tp)
{
real mp_dot;
/* mp_dot is the mass source to the continuous phase
* (Difference in mass between entry and exit from cell)
* multiplied by strength (Number of particles/s in stream)
*/
mp_dot = (TP_MASS0(tp) - TP_MASS(tp)) * strength;
if (TP_CURRENT_LAW(tp) == DPM_LAW_USER_1)
{
/* Sources relevant to the user law 1:
* add the source to the condensing species
* equation and adjust the energy source by
* adding the latent heat at reference temperature
*/
S->species[h2o_index] += mp_dot;
S->energy -= mp_dot * TP_INJECTION(tp)->latent_heat_ref;
}
}
DEFINE_DPM_SWITCH(dpm_switch, tp, coupled)
{
cell_t c = TP_CELL(tp);
Thread *t = TP_CELL_THREAD(tp);
Material *m = TP_MATERIAL(tp);
/* If the relative humidity is higher than 1
* and the particle temperature below the boiling temperature
* switch to condensation law
*/
if ((C_UDMI(c,t,UDM_RH) > 1.0) && (TP_T(tp) < DPM_BOILING_TEMPERATURE(tp, m)))
TP_CURRENT_LAW(tp) = DPM_LAW_USER_1;
else
TP_CURRENT_LAW(tp) = DPM_LAW_INITIAL_INERT_HEATING;
}
DEFINE_ADJUST(adj_relhum, domain)
{
cell_t cell;
Thread *thread;
if(sg_udm < N_REQ_UDM)
Message("\nNot enough user defined memory allocated. %d required.\n",
N_REQ_UDM);
else
{
real humidity, min, max;
min = 1e10;
max = 0.0;
thread_loop_c(thread, domain)
{
/* Check if thread is a Fluid thread and has UDMs set up on it */
if (FLUID_THREAD_P(thread) && NNULLP(THREAD_STORAGE(thread, SV_UDM_I)))
{
Material *m = THREAD_MATERIAL(thread), *sp;
int i;
/* Set the species index and molecular weight of water */
if (MATERIAL_TYPE(m) == MATERIAL_MIXTURE)
mixture_species_loop (m,sp,i)
{
if (0 == strcmp(MIXTURE_SPECIE_NAME(m,i),"h2o") ||
(0 == strcmp(MIXTURE_SPECIE_NAME(m,i),"H2O")))
{
h2o_index = i;
mw_h2o = MATERIAL_PROP(sp,PROP_mwi);
}
}
begin_c_loop(cell,thread)
{
humidity = myHumidity(cell, thread);
min = MIN(min, humidity);
max = MAX(max, humidity);
C_UDMI(cell, thread, UDM_RH) = humidity;
}
end_c_loop(cell, thread)
}
}
Message("\nRelative Humidity set in udm-%d", UDM_RH);
Message(" range:(%f,%f)\n", min, max);
}/* end if for enough UDSs and UDMs */
}
DEFINE_ON_DEMAND(set_relhum)
{
adj_relhum(Get_Domain(1));
}
Спасибо! Буду разбираться.
Добрый день! Где можно посмотреть документацию програмиста Fluent? Тоже заинтересовала проблема UDF
Здравствуйте! Документация по UDF доступна в Help, а точнее Fluent > Customization Manual
Спасибо большое за наводку, все нашел.
Добрый день коллеги. Продолжу эту ветку.
Моделирую распыление влаги в потоке воздуха. Использую модель мультифазы Eulerian. Основная фаза - воздух с температурой 20 градусов, вторичная фаза вода с диаметром 10^-5 м (доля 1-2%) . Необходимо получить процесс испарения этой влаги (переход в water-vapor). Как то можно это реализовать в рамках примененного подхода Eulerian, без udf? Я пробовал добавить еще одну эйлерову фазу, не задавать ее сразу и назначать ей материал vapor, но а) испарения не происходит б) способ задания пара как эйлеровой фазы мне не до конца понятен, т.к. для него нужно задавать диаметр частиц.
P.S. в принципе у меня получалось смоделировать испарение влаги в воздух с применением species, задавать воду как air-blast-atomizer - в таком случае процесс испарения проходит корректно, относительная влажность воздуха меняется. Но объединять Eulerian и species я еще не пробовал.
Здравствуйте, тут вам придётся использовать модель Lee для фазового перехода.
Газовая фаза будет состоять из пара и сухого воздуха
UDF всё равно потребуется для ввода температуры насыщения такой, чтобы капли испарялись в местах, где влажность ниже 100% с нужной интенсивностью
Код вот такой:
#include "udf.h"
#include "sg.h"
#include "sg_mphase.h"
#include "flow.h"
#include "mem.h"
#include "metric.h"
#include "surf.h"
#include "dpm.h"
#define mw_vapor 18.0 /*[kg/kmol]*/
#define mw_air 29.0 /*[kg/kmol]*/
/*** This UDF is based on the Antoine equation
Thermodynamics of humid air. Markku J. Lampinen ***/
real molefrac(real mass_frac, real M1, real M2)
{
real x; /* x is mole fraction */
if(mass_frac <= 0.0)
x = 0.0;
else
x = M2/( M2+M1*( (1./mass_frac) - 1.) );
return x;
}
DEFINE_PROPERTY(Tsat_line,c,t)
{
real x_vap;
real y_vap;
real P_vap;
real Tsat;
real P;
real P_op;
int h2o_index = 0; /* index of water vapor species in mixture material */
Thread *pri_th;
P_op = RP_Get_Real("operating-pressure");
P = C_P(c,t) + P_op;
pri_th = THREAD_SUB_THREAD(t, 0); /* 0 - primary phase domain index */
x_vap = C_YI( c, pri_th, h2o_index); /* mass fraction */
y_vap = molefrac(x_vap, mw_vapor, mw_air); /* mole fraction */
P_vap = P*y_vap;
Tsat = 178.958123003*pow(P_vap, 0.0632392273);
return(Tsat);
}
Михаил спасибо! Возникли проблемы при компиляции "в лоб" с libudf, но думаю все решаемо с учетом рекомедаций по MS Visio на данном форуме. Буду разбираться.
Добавить комментарий