![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Description
You can use DEFINE_DPM_HEAT_MASS to specify the heat and mass transfer of multicomponent particles to the gas phase.
Usage
DEFINE_DPM_HEAT_MASS( name, p, C_p, hgas, hvap, cvap_surf, Z, dydt, dzdt) |
Argument Type | Description |
symbol name | UDF name. |
Tracked_Particle *p | Pointer to the Tracked_Particle data structure which |
contains data related to the particle being tracked. | |
real C_p | Particle heat capacity. |
real *hgas | Enthalpies of vaporizing gas phase species. |
real *hvap | Vaporization enthalpies of vaporizing components. |
real *cvap_surf | Vapor equilibrium concentrations of vaporizing components. |
real Z | Compressibility,
![]() |
real *dydt | Source terms of the particle temperature and component masses. |
dpms_t *dzdt | Source terms of the gas phase enthalpy and species masses. |
Function returns | |
void | |
There are eight arguments to DEFINE_DPM_HEAT_MASS: name, e, p, C_p, hgas, hvap, cvap_surf, dydt,and dzdt. You supply name, the name of the UDF. e, p, C_p, hgas, hvap,and cvap_surf are variables that are passed by the ANSYS FLUENT solver to your UDF. Your UDF will need to compute the particle and gas phase source terms and store the values in dydt and dzdt, respectively.
Example
The following is an example of a compiled UDF that uses DEFINE_DPM_HEAT_MASS. It implements the source terms for the following:
Source Term | Variable | Unit |
particle temperature | dydt[0] | K/s |
particle component mass | dydt[1..] | kg/s |
gas phase enthalpy | dzdt->energy | J/s |
gas phase species mass | dzdt->species[0..] | kg/s |
/*********************************************************************** UDF for defining the heat and mass transport for multicomponent particle vaporization ***********************************************************************/ #include "udf.h" DEFINE_DPM_HEAT_MASS(multivap,p,Cp,hgas,hvap,cvap_surf,Z,dydt,dzdt) { int ns; Material *sp; real dens_total = 0.0; /* total vapor density*/ real P_total = 0.0; /* vapor pressure */ int nc = TP_N_COMPONENTS(p); /* number of particle components */ Thread *t0 = P_CELL_THREAD(p); /* thread where the particle is in*/ Material *gas_mix = THREAD_MATERIAL(DPM_THREAD(t0, p)); /* gas mixture material */ Material *cond_mix = P_MATERIAL(p); /* particle mixture material*/ cphase_state_t *c = &(p->cphase); /* cell information of particle location*/ real molwt[MAX_SPE_EQNS]; /* molecular weight of gas species */ real Tp = P_T(p); /* particle temperature */ real mp = P_MASS(p); /* particle mass */ real molwt_bulk = 0.; /* average molecular weight in bulk gas */ real Dp = DPM_DIAM_FROM_VOL(mp / P_RHO(p)); /* particle diameter */ real Ap = DPM_AREA(Dp); /* particle surface */ real Pr = c->sHeat * c->mu / c->tCond; /* Prandtl number */ real Nu = 2.0 + 0.6 * sqrt(p->Re) * pow(Pr, 1./3.); /* Nusselt number */ real h = Nu * c->tCond / Dp; /* Heat transfer coefficient*/ real dh_dt = h * (c->temp - Tp) * Ap; /* heat source term*/ dydt[0] += dh_dt / (mp * Cp); dzdt->energy -= dh_dt; mixture_species_loop(gas_mix,sp,ns) { molwt[ns] = MATERIAL_PROP(sp,PROP_mwi); /* molecular weight of gas species */ molwt_bulk += c->yi[ns] / molwt[ns]; /* average molecular weight */ } /* prevent division by zero */ molwt_bulk = MAX(molwt_bulk,DPM_SMALL); for (ns = 0; ns < nc; ns++) { int gas_index = TP_COMPONENT_INDEX_I(p,ns); /* gas species index of vaporization */ if( gas_index >= 0 ) { /* condensed material */ Material * cond_c = MIXTURE_COMPONENT(cond_mix, ns); /* vaporization temperature */ real vap_temp = MATERIAL_PROP(cond_c,PROP_vap_temp); /* diffusion coefficient */ real D = MATERIAL_PROP_POLYNOMIAL(cond_c, PROP_binary_diffusivity, c->temp); /* Schmidt number */ real Sc = c->mu / ( c->rho * D ); /* mass transfer coefficient */ real k = (2. + 0.6 * sqrt(p->Re) * pow(Sc, 1./3.)) * D / Dp; /* bulk gas concentration (ideal gas) */ real cvap_bulk = c->pressure / UNIVERSAL_GAS_CONSTANT / c->temp * c->yi[gas_index] / molwt_bulk / solver_par.molWeight[gas_index]; /* vaporization rate */ real vap_rate = k * molwt[gas_index] * Ap * (cvap_surf[ns] - cvap_bulk); /* no vaporization below vaporization temperature, no condensation */ if (Tp < vap_temp || vap_rate < 0.0) vap_rate = 0.; dydt[1+ns] -= vap_rate; dzdt->species[gas_index] += vap_rate; /* dT/dt = dh/dt / (m Cp)*/ dydt[0] -= hvap[gas_index] * vap_rate / ( mp * Cp ); /* gas enthalpy source term */ dzdt->energy += hgas[gas_index] * vap_rate; P_total += cvap_surf[ns]; dens_total += cvap_surf[ns] * molwt[gas_index]; } } /* multicomponent boiling */ P_total *= Z * UNIVERSAL_GAS_CONSTANT * Tp; if (P_total > c->pressure && dydt[0] > 0.) { real h_boil = dydt[0] * mp * Cp; /* keep particle temperature constant */ dydt[0] = 0.; for (ns = 0; ns < nc; ns++) { int gas_index = TP_COMPONENT_INDEX_I(p,ns); if (gas_index >= 0) { real boil_rate = h_boil / hvap[gas_index] * cvap_surf[ns] * molwt[gas_index] / dens_total; /* particle component mass source term */ dydt[1+ns] -= boil_rate; /* fluid species source */ dzdt->species[gas_index] += boil_rate; /* fluid energy source */ dzdt->energy += hgas[gas_index] * boil_rate; } } } } |
Hooking a DPM Particle Heat and Mass Transfer UDF to
ANSYS FLUENT
After the UDF that you have defined using DEFINE_DPM_HEAT_MASS is interpreted (Chapter 4) or compiled (Chapter 5), the name of the argument that you supplied as the first DEFINE macro argument (e.g., multivap) will become visible in the Set Injection Properties dialog box in ANSYS FLUENT. See Section 6.4.5 for details on how to hook your DEFINE_DPM_HEAT_MASS UDF to ANSYS FLUENT.