Все ответы об инженерном анализе

Перед началом работы настоятельно рекомендуем ознакомиться с правилами форума.

Как моделировать мультифазное течение воздух+водяной туман+пыль?

livan
Аватар пользователя livan

Здравствуйте, коллеги! Просветите, пожалуйста, можно ли в Fluent моделировать одновременное течение воздуха с мелкодисперсно-распыленной водой и пылью? стоит задача мокрого пылеулавливания, т.е. ускорения осаждения пыли ее смачиванием, на знаю, с чего начать.

ershovmih
Аватар пользователя ershovmih

Здравствуйте. Предагаю вам использовать модель Eulerian с двумя фазами: воздух (сплошная фаза) и вода (дисперсная фаза). Для твёрдых частиц подключите дополнительно модель DPM или DDPM. Все будет работать. Введите коды UDF для изменения параметров частицы пыли при прохождении через туман с различной долей капель. Можно даже смоделировать снижение концентрации капель тумана от их осаждения на частицы с помощью макроса DEFINE_DPM_SOURCE. Далее для моделирования осаждения пыли на стенки могут потребоваться модели Eulerian Wall Film или Lagrangian Wall Film.

 

 

 

ershovmih
Аватар пользователя ershovmih

Пример применения кодов для конденсации на капельках (из документации программиста 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));
}

 

 

 

livan
Аватар пользователя livan

Спасибо! Буду разбираться.

lavr
Аватар пользователя lavr

Цитата:
Пример применения кодов для конденсации на капельках (из документации программиста Fluent):

Добрый день! Где можно посмотреть документацию програмиста Fluent? Тоже заинтересовала проблема UDF

katcheg
Аватар пользователя katcheg

Здравствуйте! Документация по UDF доступна в Help, а точнее Fluent > Customization Manual

lavr
Аватар пользователя lavr

Цитата:
Здравствуйте! Документация по UDF доступна в Help, а точнее Fluent > Customization Manual

Спасибо большое за наводку, все нашел.

lavr
Аватар пользователя lavr

Добрый день коллеги. Продолжу эту ветку.

Моделирую распыление влаги в потоке воздуха. Использую модель мультифазы Eulerian. Основная фаза - воздух с температурой 20 градусов, вторичная фаза вода с диаметром 10^-5 м (доля 1-2%) . Необходимо получить процесс испарения этой влаги (переход в water-vapor). Как то можно это реализовать в рамках примененного подхода Eulerian, без udf? Я пробовал добавить еще одну эйлерову фазу, не задавать ее сразу и назначать ей материал vapor,  но а) испарения не происходит б) способ задания пара как эйлеровой фазы мне не до конца понятен, т.к. для него нужно задавать диаметр частиц.

 P.S. в принципе у меня получалось смоделировать испарение влаги в воздух с применением species, задавать воду как air-blast-atomizer - в таком случае процесс испарения проходит корректно, относительная влажность воздуха меняется. Но объединять Eulerian и species я еще не пробовал.

ershovmih
Аватар пользователя ershovmih

Здравствуйте, тут вам придётся использовать модель 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);
}
 

lavr
Аватар пользователя lavr

Михаил спасибо! Возникли проблемы при компиляции "в лоб" с libudf, но думаю все решаемо с учетом рекомедаций по MS Visio на данном форуме. Буду разбираться.

Добавить комментарий

Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Приложить файл

Максимальный размер файла: 999 МБ.
Допустимые типы файлов: txt doc docx xls xlsx pdf rar zip 7zip tar.