CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   FLUENT (https://www.cfd-online.com/Forums/fluent/)
-   -   Drag coefficient, DPM. (https://www.cfd-online.com/Forums/fluent/50752-drag-coefficient-dpm.html)

jorge poyatos March 3, 2009 11:29

Drag coefficient, DPM.
 
Hello,

I am trying to simulate a turbulent flow with the DPM but the drag coefficient is too low.

I have found that there is a correction called Magelli correction and it is possible to get it from fluent users as a UDF. I dont have access to fluent users so please somebody send it to me? it is in Fluent UDF Archive UDF52.

Thank you very much.


cfd_user March 3, 2009 14:12

Re: Drag coefficient, DPM.
 
hello, i know you have been posting the same query many times here. i checked, & there is no Solution ID 52 ! this is what i get:

UDF for computing wall shear stress on user-selected walls(Solution ID=1459) UDF for accessing field variables on the nodes of a face thread(Solution ID=1413) UDF to export variable data into a file in ASCII format from the parallel version(Solution ID=1412) UDF to flag the cells at a boundary that have reversed flow (backflow)(Solution ID=1351) UDF for reading tabulated or experimental values of material properties into FLUENT(Solution ID=1338) UDF template for implementing a droplet breakup model with steady discrete phase model (DPM) tracking(Solution ID=1328) UDF to compute the integral of a variable along a line(Solution ID=1293) Using a UDF to generate a Step-by-Step particle tracking report file from a calculation running in batch mode(Solution ID=1263) How to print to the GUI or an output file from a UDF(Solution ID=1175) How to make contour plots of difference in pressures (or any other variable) in two data sets(Solution ID=416) How can my UDF write output files with the flow time as part of the file name?(Solution ID=1105) UDF to determine the amount of time fluid spends in high shear regions(Solution ID=1072) UDF to extract variables on surface created for postprocessing(Solution ID=1056) UDF to compute particle slip velocity(Solution ID=920) UDF to calculate and report the torque on a rotor shaft(Solution ID=917) UDF to obtain the mean diameter of particles at each cell in a spray simulation(Solution ID=830) UDF to model a moving porous medium(Solution ID=831) Compute fluid residence time(Solution ID=619) Compute fan pressure drop as a function of radius(Solution ID=508) Compute radiation heat transfer rate on an interior surface(Solution ID=669) Compute turbulent diffusion coefficient for a user-defined scalar(Solution ID=668) Access to values computed by a custom field function inside a UDF(Solution ID=512) Compute radial, axial and tangential velocity components inside a UDF(Solution ID=562) Compute Swirl Ratio(Solution ID=650) Reading and Interpolating source term from point data input file not aligned with the grid(Solution ID=625) Herschel-Bulkley viscosity with spatial dependence(Solution ID=585) Transient velocity profile imposed on a moving wall(Solution ID=616) Modeling forced diffusion in binary gas or liquid mixtures (single phase only)(Solution ID=672) Adjusting mass flow inlet boundary conditions to achieve a target thrust(Solution ID=718) UDF to dynamically change the timestep size during calculation(Solution ID=757) UDF to specify both spatial and temporal temperature profile on a wall zone(Solution ID=825) ---------------------- so please give the correct soltuion ID.

thanks.

jorge poyatos March 4, 2009 07:37

Re: Drag coefficient, DPM.
 
Thank you!

I have a technical note from Fluent TN253, "Solid-liquid Multiphase Flow Validation in Tall Stirred Vessels with Multiple Impeller Systems", where it is said:

This constant CD was then prescribed using a user-defined function (Fluent UDF Archive UDF52)

I don't know where to find it but if you could try I woud be very pleased. My project is stuck now!

Thank you again!

cfd_user March 4, 2009 08:11

Re: Drag coefficient, DPM.
 
can u send me that technical note by my mail asap ? thanks.

jorge poyatos March 4, 2009 08:50

Re: Drag coefficient, DPM.
 
I need your mail adrees to link the file. You can also look it up on the internet just writing in google:

Solid-liquid Multiphase Flow Validation in Tall Stirred Vessels with Multiple Impeller Systems.

Thank you again for your interest!

cfd_user March 6, 2009 11:57

Re: Drag coefficient, DPM.
 
just copy + paste.........

#include "sg_mphase.h" #include "sg.h" #include <stdio.h> #define pi 4.*atan(1.)

/* ************************************************** ********* */ /* (c) 2003 Fluent Inc. */ /* Author: Andre Bakker. Last edit: Sep. 2, 2003 */ /* ************************************************** ********* */ /* These UDFs were developed by Bakker specifically to help */ /* with the modeling of solids suspensions in stirred vessels */ /* but can be used for other applications also. */ /* */ /* They can be distributed freely. */ /* */ /* These two UDFs set the drag coefficient to a user specified */ /* value and also fix the overall volume fraction of the */ /* granular phase to a user specified value. To function */ /* properly, the user should first read the SCHEME file */ /* "granular.scm" before reading case and data. This creates */ /* an input panel DEFINE | GRANULAR DRAG AND VOLUME FRACTION */ /* The user specifies the necessary inputs there. */ /* */ /* To use the drag UDF, select it under DEFINE | PHASES | */ /* INTERACTION | DRAG | USER DEFINED | custom_CD */ /* If the drag coefficient in the panel is set to <=0 */ /* this UDF will use the Schiller-Nauman drag law with the */ /* correction by Pinelli. Otherwise, the constant drag */ /* coefficient specified by the user in the input panel is */ /* used. That allows the user to finetune the drag coefficient */ /* for a given system. */ /* */ /* To fix the overall volume fraction select the UDF under */ /* DEFINE | USER DEFINED | FUNCTION HOOKS | ADJUST FUNCTION | */ /* fix_gran_vf. This is useful, for running certain multiphase */ /* simulations in steady state, e.g. batch stirred tanks */ /* with solids suspensions. This can cut CPU time by orders of */ /* magnitude compared to running transient. */ /* */ /* Obviously, the user can choose to only use the fix_gran_vf */ /* UDF without using the drag coefficient UDF (and just use */ /* Fluent's drag laws) and still gain the CPU time advantage. */ /* */ /* ************************************************** ********* */

/* ************************************************** ********* */ /* UDF for customizing the drag law in Fluent */ /* ************************************************** ********* */

DEFINE_EXCHANGE_PROPERTY(custom_CD, cell, mix_thread, s_col, f_col) {

Thread *thread_g, *thread_s; real cd = RP_Get_Real("granpar/cd"); real diam2 = RP_Get_Real("granpar/dp"); real rho_s = RP_Get_Real("granpar/rhos"); real rhol = RP_Get_Real("granpar/rhol"); real mul = RP_Get_Real("granpar/mul");

real x_vel_g, x_vel_s, y_vel_g, y_vel_s, abs_v, slip_x, slip_y,

reyp, void_g, fdrgs, taup, k_g_s,z_vel_g,z_vel_s,slip_z; real lkolm,pinelli;

/* find the threads for the gas (primary) */ /* and solids (secondary phases) */ thread_g = THREAD_SUB_THREAD(mix_thread, s_col);/* gas phase */ thread_s = THREAD_SUB_THREAD(mix_thread, f_col);/* solid phase*/

/* find phase velocities and properties*/ x_vel_g = C_U(cell, thread_g); y_vel_g = C_V(cell, thread_g); z_vel_g = C_W(cell, thread_g);

x_vel_s = C_U(cell, thread_s); y_vel_s = C_V(cell, thread_s); z_vel_s = C_W(cell, thread_s);

slip_x = x_vel_g - x_vel_s; slip_y = y_vel_g - y_vel_s; slip_z = z_vel_g - z_vel_s;

/*compute slip*/ abs_v = sqrt(slip_x*slip_x + slip_y*slip_y + slip_z*slip_z);

/*compute reynolds number*/ if (mul<1.0E-30) mul=0.001; reyp = rhol*abs_v*diam2/mul;

/* compute particle relaxation time */ taup = rho_s*diam2*diam2/18./mul;

/*================================================= =============*/ /* if cd<1E-30 then use Schiller-Nauman with Pinelli Correction */ /* first compute Schiller-Nauman drag coefficient */ if (cd<1.0E-30) {

if (reyp > 1000)

{

cd=0.44;

}

else

{

cd=24.0*(1.0+0.15*pow(reyp,0.687))/reyp;

}

/* now calculate pinelli correction to drag coefficient */

lkolm = pow(mul/rhol,3.0);

lkolm = pow(lkolm/C_D(cell,thread_g),0.25);

pinelli = 16.0*lkolm/diam2-1.0;

pinelli = (exp(pinelli)-exp(-pinelli))/(exp(pinelli)+exp(-pinelli)); /* calculate TANH */

pinelli = 0.4*pinelli+0.6;

cd=cd/pow(pinelli,2.0); } /*================================================= =============*/

void_g = C_VOF(cell, thread_g); /* get gas vol frac*/

/*compute drag and return drag coeff, k_g_s*/ if (reyp<0.001) reyp=0.001; fdrgs = cd*reyp/24;

k_g_s = (1.-void_g)*rho_s*fdrgs/taup;

return k_g_s; }

/* ************************************************** ********* */ /* UDF for fixing the volume fraction of the granular phase */ /* ************************************************** ********* */

DEFINE_ADJUST(fix_gran_vf, domain) { Thread *t; Thread **pt; int doprint = RP_Get_Integer("granpar/verbose"); int gphase = RP_Get_Integer("granpar/vftofix") - 1; real targetvf = RP_Get_Real("granpar/vftrgt"); real vof_max =

DOMAIN_PROP_CONSTANT(DOMAIN_SUB_DOMAIN(domain,gpha se),PROP_packing) - 1.e-3; real vof_max2 =

DOMAIN_PROP_CONSTANT(DOMAIN_SUB_DOMAIN(domain,gpha se),PROP_packing) - 1.e-2; real packvolume; real notpackvolume; real totvolume; real multiplier; real deltavof;

packvolume = 0.0; notpackvolume = 0.0; totvolume = 0.0;

/* loop over domain */ mp_thread_loop_c (t,domain,pt)

if (FLUID_THREAD_P(t))

{

cell_t c;

begin_c_loop_int (c,t)

{

real c_vol = C_VOLUME(c,t);

totvolume += c_vol;

if (C_VOF(c,pt[gphase]) > vof_max2)

{

packvolume += C_VOF(c,pt[gphase])*c_vol;

}

else

{

notpackvolume += C_VOF(c,pt[gphase])*c_vol;

}

}

end_c_loop_int (c,t)

} /*ensure all compute nodes have the same summation values for parallel calculations */ #if RP_NODE

totvolume=PRF_GRSUM1(totvolume);

packvolume=PRF_GRSUM1(packvolume);

notpackvolume=PRF_GRSUM1(notpackvolume); #endif /*end loop over domain */

/* execute rest only if totvolume>0, otherwise the */ /* routine was called from the compute host in parallel */

if (totvolume>0) {

multiplier=(targetvf*totvolume-packvolume)/notpackvolume; if (multiplier<1.0) multiplier=(targetvf*totvolume)/(packvolume+notpackvolume); if (doprint>0) {

Message ("mass correction factor = %8.6g\n",multiplier);

Message (""); }

if (multiplier<1.0) { mp_thread_loop_c (t,domain,pt)

if (FLUID_THREAD_P(t))

{

cell_t c;

begin_c_loop_int (c,t)

{

deltavof = C_VOF(c,pt[gphase]) * multiplier;

deltavof -= C_VOF(c,pt[gphase]);

C_VOF(c,pt[gphase]) += deltavof;

C_VOF(c,pt[0]) -= deltavof;

}

end_c_loop_int (c,t)

} } else { mp_thread_loop_c (t,domain,pt)

if (FLUID_THREAD_P(t))

{

cell_t c;

begin_c_loop_int (c,t)

{

if (C_VOF(c,pt[gphase]) < vof_max2)

{

deltavof = C_VOF(c,pt[gphase]) * multiplier;

if (deltavof > vof_max) deltavof=vof_max;

deltavof -= C_VOF(c,pt[gphase]);

C_VOF(c,pt[gphase]) += deltavof;

C_VOF(c,pt[0]) -= deltavof;

}

}

end_c_loop_int (c,t)

} } } }

/* ************************************************** *********** */ /* END OF UDF granular.c */ /* ************************************************** *********** */

/* ************************************************** *********** */ /* SCHEME FILE "granular.scm" below */ /* ************************************************** *********** */

(rpsetvar 'udf/adjust-fcn "fix_gran_vf") ;; ;; Create rpvars for the model if they don't ;; exist. ;; (if (not (rp-var-object 'granpar/VFTRGT))

(rp-var-define 'granpar/VFTRGT 0.000682 'real #f)) (if (not (rp-var-object 'granpar/VFTOFIX))

(rp-var-define 'granpar/VFTOFIX 2 'integer #f)) (if (not (rp-var-object 'granpar/VERBOSE))

(rp-var-define 'granpar/VERBOSE 0 'integer #f)) (if (not (rp-var-object 'granpar/CD))

(rp-var-define 'granpar/CD 5.1 'real #f)) (if (not (rp-var-object 'granpar/DP))

(rp-var-define 'granpar/DP 3.27e-4 'real #f)) (if (not (rp-var-object 'granpar/RHOS))

(rp-var-define 'granpar/RHOS 2450.0 'real #f)) (if (not (rp-var-object 'granpar/RHOL))

(rp-var-define 'granpar/RHOL 998.2 'real #f)) (if (not (rp-var-object 'granpar/MUL))

(rp-var-define 'granpar/MUL 0.001003 'real #f))

;; ;; Create a panel for the granular mass fix model. ;; (define gui-granpar (let ((panel #f)

(vftrgt)

(vftofix)

(verbose)

(cd)

(dp)

(rhos)

(rhol)

(mul))

(define (update-cb . args) ;update panel fields

(cx-set-real-entry vftrgt (rpgetvar 'granpar/VFTRGT))

(cx-set-integer-entry vftofix (rpgetvar 'granpar/VFTOFIX))

(cx-set-integer-entry verbose (rpgetvar 'granpar/VERBOSE))

(cx-set-real-entry cd (rpgetvar 'granpar/CD))

(cx-set-real-entry dp (rpgetvar 'granpar/DP))

(cx-set-real-entry rhos (rpgetvar 'granpar/RHOS))

(cx-set-real-entry rhol (rpgetvar 'granpar/RHOL))

(cx-set-real-entry mul (rpgetvar 'granpar/MUL)))

(define (apply-cb . args)

(rpsetvar 'granpar/VFTRGT (cx-show-real-entry vftrgt))

(rpsetvar 'granpar/VFTOFIX (cx-show-integer-entry vftofix))

(rpsetvar 'granpar/VERBOSE (cx-show-integer-entry verbose))

(rpsetvar 'granpar/CD (cx-show-real-entry cd))

(rpsetvar 'granpar/DP (cx-show-real-entry dp))

(rpsetvar 'granpar/RHOS (cx-show-real-entry rhos))

(rpsetvar 'granpar/RHOL (cx-show-real-entry rhol))

(rpsetvar 'granpar/MUL (cx-show-real-entry mul)))

(lambda args

(if (not panel)

(let ((table)

(form))

(set! panel (cx-create-panel "Granular Drag and Volume Fraction"

apply-cb update-cb))

(set! table (cx-create-table panel ""

'border #f

'visible-rows 9

'below 0

'right-of 0))

(set! vftrgt

(cx-create-real-entry table

"Fixed Overall Volume Fraction"

'width 10

'row 1 'col 0

'minimum 0

'maximum 1))

(set! vftofix

(cx-create-integer-entry table

"Granular Phase to Fix Volume Fraction"

'width 10

'row 2 'col 0

'minimum 2

'maximum 20))

(set! verbose

(cx-create-integer-entry table

"Print Correction Factor (0=off, 1=on)"

'width 10

'row 3 'col 0

'minimum 0

'maximum 1))

(set! cd

(cx-create-real-entry table

"Drag Coefficient"

'width 10

'row 4 'col 0

'minimum 0

'maximum 1000))

(set! dp

(cx-create-real-entry table

"Particle Diameter (m)"

'width 10

'row 5 'col 0

'minimum 0

'maximum 1.0))

(set! rhos

(cx-create-real-entry table

"Solids Density (kg/m3)"

'width 10

'row 6 'col 0

'minimum 0

'maximum 13000))

(set! rhol

(cx-create-real-entry table

"Liquid Density (kg/m3)"

'width 10

'row 7 'col 0

'minimum 0

'maximum 13000))

(set! mul

(cx-create-real-entry table

"Liquid Viscosity (Pa-s)"

'width 10

'row 8 'col 0

'minimum 0

'maximum 10000))

))

(cx-show-panel panel))))

(cx-add-item "Define" "Granular Drag and Volume Fraction" #\U #f cx-client? gui-granpar) /*************************************************/

Please note these points when using this UDF :

The original purpose of this UDF was to improve the modeling of solids suspensions in stirred vessels. The UDF has two parts:

(1) It allows the user to fix the overall volume fraction of a secondary phase in a domain. This allows the user then to run Eulerian multiphase calculations for batch stirred tanks in steady state with MRF, instead of having to run them transient. This cuts CPU time dramatically. (2) It allows the user to specify either a constant value for the drag coefficient or use the Pinelli drag law. This helps fine tune the results for given systems. These two components to the UDF can be used independently. The UDF comes with a SCHEME file granular.scm which is required for the UDF to function. The UDF is compiled.

have a nice weekend !


Jorge poyatos March 9, 2009 13:57

Re: Drag coefficient, DPM.
 
Thank you! very very much!

I have to make it works now!

cfd_user March 9, 2009 14:38

Re: Drag coefficient, DPM.
 
u r welcome :)

Jorge poyatos March 11, 2009 13:27

Re: Drag coefficient, DPM.
 
Hi! sorry again, but i am having some problems with the UDF, I am using it for discrete phase model so i changed some parameters. I can interpret it without problems but when i try to display the particles track i get the next error:

FLUENT received fatal signal (ACCESS VIOLATION) 1. Note exact evets leading to error 2. Save case/data under new name 3. Exit program and restart to continue. 4. Report error to your distributor. Error Object: ()

The UDF is as follows:

#include "udf.h"

#include "mem.h"

DEFINE_DPM_DRAG(particle_drag_force,Re,p)

{

cell_t c;

Thread *t;

real drag_force;

double cd,epsilon,lkolm,pinelli;

epsilon = C_D(c, t);

if (Re > 1000)

{

cd=0.44;

}

else

{cd=24*(1+0.15*pow(Re,0.687))/Re;

}

lkolm = pow(0.001003/998.2,3);

lkolm = pow(lkolm/epsilon,0.25);

pinelli = 16.0*lkolm/0.000421-1.0;

pinelli = (exp(pinelli)-exp(-pinelli))/(exp(pinelli)+exp(-pinelli)); /* calculate TANH */

pinelli = 0.4*pinelli+0.6;

cd=cd/pow(pinelli,2.0);

drag_force = 18*cd*Re/24 ;

return (drag_force);

}

I realized that when i change: epsilon = C_D(c, t); by: epsilon = 10000 or any constant value.

Everything goes right.

I don't know if you can help me? But thanks anyway.


cfd_user March 11, 2009 14:28

Re: Drag coefficient, DPM.
 
I do not understand the use of C_D(c,t) in a DPM UDF. Pls chack that.

jorge poyatos March 11, 2009 17:07

Re: Drag coefficient, DPM.
 
I need to define the kolmogorov microscale for every cell in order to calculate the drag coefficient for every cell(every velocity), and to calculate the kolmogorov microscale i need the turbulent disipation rate (epsilon), so I try to use C_D(c,t) to get this value.

chengshaojie March 19, 2009 21:14

Quote:

Originally Posted by jorge poyatos
;157333
I need to define the kolmogorov microscale for every cell in order to calculate the drag coefficient for every cell(every velocity), and to calculate the kolmogorov microscale i need the turbulent disipation rate (epsilon), so I try to use C_D(c,t) to get this value.

hi, sir
as i know, ε is the average rate of energy dissipation per unit mass. pls look for http://en.wikipedia.org/wiki/Kolmogorov_microscales

chengshaojie March 24, 2009 20:56

dear sir ,
could someone send me the file at www.fluentusers.com/udf_archive/udf_examples/UDF52.htm please.
i cannot access to it, thank you.
my e-mail:chengshaojie9856@yahoo.cn

green iran January 7, 2012 04:53

Hello guys
i need urgent help. actually i'm in need to this scheme and udf file for my solid-liquid simulation. i just copied and pasted them separately in a notepad as text.but when i launch FLUENT i received this message for scheme file:
unbound variable
Error Object: /*
i deleted /* in scm file but it didn't work. i still receive the same problem with another Error object for instance a name of variables.
i'm really stuck. i'll be very appreciate if you give me some comments.
appreciate in advance

mali28 January 20, 2012 13:41

Quote:

Originally Posted by chengshaojie (Post 210706)
dear sir ,
could someone send me the file at www.fluentusers.com/udf_archive/udf_examples/UDF52.htm please.
i cannot access to it, thank you.
my e-mail:chengshaojie9856@yahoo.cn

Am I too late?

This is UDF52.htm

#include "udf.h" #include "sg_mphase.h" #include "sg.h" #include <stdio.h> #define pi 4.*atan(1.) /* ************************************************** ********* */ /* (c) 2003 Fluent Inc. */ /* Author: Andre Bakker. Last edit: Sep. 2, 2003 */ /* ************************************************** ********* */ /* These UDFs were developed by Bakker specifically to help */ /* with the modeling of solids suspensions in stirred vessels */ /* but can be used for other applications also. */ /* */ /* They can be distributed freely. */ /* */ /* These two UDFs set the drag coefficient to a user specified */ /* value and also fix the overall volume fraction of the */ /* granular phase to a user specified value. To function */ /* properly, the user should first read the SCHEME file */ /* "granular.scm" before reading case and data. This creates */ /* an input panel DEFINE | GRANULAR DRAG AND VOLUME FRACTION */ /* The user specifies the necessary inputs there. */ /* */ /* To use the drag UDF, select it under DEFINE | PHASES | */ /* INTERACTION | DRAG | USER DEFINED | custom_CD */ /* If the drag coefficient in the panel is set to <=0 */ /* this UDF will use the Schiller-Nauman drag law with the */ /* correction by Pinelli. Otherwise, the constant drag */ /* coefficient specified by the user in the input panel is */ /* used. That allows the user to finetune the drag coefficient */ /* for a given system. */ /* */ /* To fix the overall volume fraction select the UDF under */ /* DEFINE | USER DEFINED | FUNCTION HOOKS | ADJUST FUNCTION | */ /* fix_gran_vf. This is useful, for running certain multiphase */ /* simulations in steady state, e.g. batch stirred tanks */ /* with solids suspensions. This can cut CPU time by orders of */ /* magnitude compared to running transient. */ /* */ /* Obviously, the user can choose to only use the fix_gran_vf */ /* UDF without using the drag coefficient UDF (and just use */ /* Fluent's drag laws) and still gain the CPU time advantage. */ /* */ /* ************************************************** ********* */ /* ************************************************** ********* */ /* UDF for customizing the drag law in Fluent */ /* ************************************************** ********* */ DEFINE_EXCHANGE_PROPERTY(custom_CD, cell, mix_thread, s_col, f_col) { Thread *thread_g, *thread_s; real cd = RP_Get_Real("granpar/cd"); real diam2 = RP_Get_Real("granpar/dp"); real rho_s = RP_Get_Real("granpar/rhos"); real rhol = RP_Get_Real("granpar/rhol"); real mul = RP_Get_Real("granpar/mul"); real x_vel_g, x_vel_s, y_vel_g, y_vel_s, abs_v, slip_x, slip_y, reyp, void_g, fdrgs, taup, k_g_s,z_vel_g,z_vel_s,slip_z; real lkolm,pinelli; /* find the threads for the gas (primary) */ /* and solids (secondary phases) */ thread_g = THREAD_SUB_THREAD(mix_thread, s_col);/* gas phase */ thread_s = THREAD_SUB_THREAD(mix_thread, f_col);/* solid phase*/ /* find phase velocities and properties*/ x_vel_g = C_U(cell, thread_g); y_vel_g = C_V(cell, thread_g); z_vel_g = C_W(cell, thread_g); x_vel_s = C_U(cell, thread_s); y_vel_s = C_V(cell, thread_s); z_vel_s = C_W(cell, thread_s); slip_x = x_vel_g - x_vel_s; slip_y = y_vel_g - y_vel_s; slip_z = z_vel_g - z_vel_s; /*compute slip*/ abs_v = sqrt(slip_x*slip_x + slip_y*slip_y + slip_z*slip_z); /*compute reynolds number*/ if (mul<1.0E-30) mul=0.001; reyp = rhol*abs_v*diam2/mul; /* compute particle relaxation time */ taup = rho_s*diam2*diam2/18./mul; /*================================================= =============*/ /* if cd<1E-30 then use Schiller-Nauman with Pinelli Correction */ /* first compute Schiller-Nauman drag coefficient */ if (cd<1.0E-30) { if (reyp > 1000) { cd=0.44; } else { cd=24.0*(1.0+0.15*pow(reyp,0.687))/reyp; } /* now calculate pinelli correction to drag coefficient */ lkolm = pow(mul/rhol,3.0); lkolm = pow(lkolm/C_D(cell,thread_g),0.25); pinelli = 16.0*lkolm/diam2-1.0; pinelli = (exp(pinelli)-exp(-pinelli))/(exp(pinelli)+exp(-pinelli)); /* calculate TANH */ pinelli = 0.4*pinelli+0.6; cd=cd/pow(pinelli,2.0); } /*================================================= =============*/ void_g = C_VOF(cell, thread_g); /* get gas vol frac*/ /*compute drag and return drag coeff, k_g_s*/ if (reyp<0.001) reyp=0.001; fdrgs = cd*reyp/24; k_g_s = (1.-void_g)*rho_s*fdrgs/taup; return k_g_s; } /* ************************************************** ********* */ /* UDF for fixing the volume fraction of the granular phase */ /* ************************************************** ********* */ DEFINE_ADJUST(fix_gran_vf, domain) { Thread *t; Thread **pt; int doprint = RP_Get_Integer("granpar/verbose"); int gphase = RP_Get_Integer("granpar/vftofix") - 1; real targetvf = RP_Get_Real("granpar/vftrgt"); real vof_max = DOMAIN_PROP_CONSTANT(DOMAIN_SUB_DOMAIN(domain,gpha se),PROP_packing) - 1.e-3; real vof_max2 = DOMAIN_PROP_CONSTANT(DOMAIN_SUB_DOMAIN(domain,gpha se),PROP_packing) - 1.e-2; real packvolume; real notpackvolume; real totvolume; real multiplier; real deltavof; packvolume = 0.0; notpackvolume = 0.0; totvolume = 0.0; /* loop over domain */ mp_thread_loop_c (t,domain,pt) if (FLUID_THREAD_P(t)) { cell_t c; begin_c_loop_int (c,t) { real c_vol = C_VOLUME(c,t); totvolume += c_vol; if (C_VOF(c,pt[gphase]) > vof_max2) { packvolume += C_VOF(c,pt[gphase])*c_vol; } else { notpackvolume += C_VOF(c,pt[gphase])*c_vol; } } end_c_loop_int (c,t) } /*ensure all compute nodes have the same summation values for parallel calculations */ #if RP_NODE totvolume=PRF_GRSUM1(totvolume); packvolume=PRF_GRSUM1(packvolume); notpackvolume=PRF_GRSUM1(notpackvolume); #endif /*end loop over domain */ /* execute rest only if totvolume>0, otherwise the */ /* routine was called from the compute host in parallel */ if (totvolume>0) { multiplier=(targetvf*totvolume-packvolume)/notpackvolume; if (multiplier<1.0) multiplier=(targetvf*totvolume)/(packvolume+notpackvolume); if (doprint>0) { Message ("mass correction factor = %8.6g\n",multiplier); Message (""); } if (multiplier<1.0) { mp_thread_loop_c (t,domain,pt) if (FLUID_THREAD_P(t)) { cell_t c; begin_c_loop_int (c,t) { deltavof = C_VOF(c,pt[gphase]) * multiplier; deltavof -= C_VOF(c,pt[gphase]); C_VOF(c,pt[gphase]) += deltavof; C_VOF(c,pt[0]) -= deltavof; } end_c_loop_int (c,t) } } else { mp_thread_loop_c (t,domain,pt) if (FLUID_THREAD_P(t)) { cell_t c; begin_c_loop_int (c,t) { if (C_VOF(c,pt[gphase]) < vof_max2) { deltavof = C_VOF(c,pt[gphase]) * multiplier; if (deltavof > vof_max) deltavof=vof_max; deltavof -= C_VOF(c,pt[gphase]); C_VOF(c,pt[gphase]) += deltavof; C_VOF(c,pt[0]) -= deltavof; } } end_c_loop_int (c,t) } } } } /* ************************************************** *********** */ /* END OF UDF granular.c */ /* ************************************************** *********** */ /* ************************************************** *********** */ /* SCHEME FILE "granular.scm" below */ /* ************************************************** *********** */ (rpsetvar 'udf/adjust-fcn "fix_gran_vf") ;; ;; Create rpvars for the model if they don't ;; exist. ;; (if (not (rp-var-object 'granpar/VFTRGT)) (rp-var-define 'granpar/VFTRGT 0.000682 'real #f)) (if (not (rp-var-object 'granpar/VFTOFIX)) (rp-var-define 'granpar/VFTOFIX 2 'integer #f)) (if (not (rp-var-object 'granpar/VERBOSE)) (rp-var-define 'granpar/VERBOSE 0 'integer #f)) (if (not (rp-var-object 'granpar/CD)) (rp-var-define 'granpar/CD 5.1 'real #f)) (if (not (rp-var-object 'granpar/DP)) (rp-var-define 'granpar/DP 3.27e-4 'real #f)) (if (not (rp-var-object 'granpar/RHOS)) (rp-var-define 'granpar/RHOS 2450.0 'real #f)) (if (not (rp-var-object 'granpar/RHOL)) (rp-var-define 'granpar/RHOL 998.2 'real #f)) (if (not (rp-var-object 'granpar/MUL)) (rp-var-define 'granpar/MUL 0.001003 'real #f)) ;; ;; Create a panel for the granular mass fix model. ;; (define gui-granpar (let ((panel #f) (vftrgt) (vftofix) (verbose) (cd) (dp) (rhos) (rhol) (mul)) (define (update-cb . args) ;update panel fields (cx-set-real-entry vftrgt (rpgetvar 'granpar/VFTRGT)) (cx-set-integer-entry vftofix (rpgetvar 'granpar/VFTOFIX)) (cx-set-integer-entry verbose (rpgetvar 'granpar/VERBOSE)) (cx-set-real-entry cd (rpgetvar 'granpar/CD)) (cx-set-real-entry dp (rpgetvar 'granpar/DP)) (cx-set-real-entry rhos (rpgetvar 'granpar/RHOS)) (cx-set-real-entry rhol (rpgetvar 'granpar/RHOL)) (cx-set-real-entry mul (rpgetvar 'granpar/MUL))) (define (apply-cb . args) (rpsetvar 'granpar/VFTRGT (cx-show-real-entry vftrgt)) (rpsetvar 'granpar/VFTOFIX (cx-show-integer-entry vftofix)) (rpsetvar 'granpar/VERBOSE (cx-show-integer-entry verbose)) (rpsetvar 'granpar/CD (cx-show-real-entry cd)) (rpsetvar 'granpar/DP (cx-show-real-entry dp)) (rpsetvar 'granpar/RHOS (cx-show-real-entry rhos)) (rpsetvar 'granpar/RHOL (cx-show-real-entry rhol)) (rpsetvar 'granpar/MUL (cx-show-real-entry mul))) (lambda args (if (not panel) (let ((table) (form)) (set! panel (cx-create-panel "Granular Drag and Volume Fraction" apply-cb update-cb)) (set! table (cx-create-table panel "" 'border #f 'visible-rows 9 'below 0 'right-of 0)) (set! vftrgt (cx-create-real-entry table "Fixed Overall Volume Fraction" 'width 10 'row 1 'col 0 'minimum 0 'maximum 1)) (set! vftofix (cx-create-integer-entry table "Granular Phase to Fix Volume Fraction" 'width 10 'row 2 'col 0 'minimum 2 'maximum 20)) (set! verbose (cx-create-integer-entry table "Print Correction Factor (0=off, 1=on)" 'width 10 'row 3 'col 0 'minimum 0 'maximum 1)) (set! cd (cx-create-real-entry table "Drag Coefficient" 'width 10 'row 4 'col 0 'minimum 0 'maximum 1000)) (set! dp (cx-create-real-entry table "Particle Diameter (m)" 'width 10 'row 5 'col 0 'minimum 0 'maximum 1.0)) (set! rhos (cx-create-real-entry table "Solids Density (kg/m3)" 'width 10 'row 6 'col 0 'minimum 0 'maximum 13000)) (set! rhol (cx-create-real-entry table "Liquid Density (kg/m3)" 'width 10 'row 7 'col 0 'minimum 0 'maximum 13000)) (set! mul (cx-create-real-entry table "Liquid Viscosity (Pa-s)" 'width 10 'row 8 'col 0 'minimum 0 'maximum 10000)) )) (cx-show-panel panel)))) (cx-add-item "Define" "Granular Drag and Volume Fraction" #\U #f cx-client? gui-granpar)


All times are GMT -4. The time now is 23:51.