• No results found

Fluent UDF Training-2

N/A
N/A
Protected

Academic year: 2021

Share "Fluent UDF Training-2"

Copied!
39
0
0

Loading.... (view fulltext now)

Full text

(1)

ANSYS FLUENT GUIDE

ANSYS FLUENT GUIDE

Advanced FLUENT User-Defined Functions

Advanced FLUENT User-Defined Functions

You can access and manipulate almost every solver data and fully control the

You can access and manipulate almost every solver data and fully control the

solution process in UDF-s written in C programming Language.

solution process in UDF-s written in C programming Language.

2011

2011

Saeed Sadeghi (www.fluent.blogfa.com)

(2)
(3)

2 2 Introduction Introduction

Table of Contents

Table of Contents

1 1 Introduction Introduction ... ... 44 2

2 User User Access Access to to the the FLUENT FLUENT Solver Solver ... 4... 4 3

3 C C Programming Programming ... ... 55 4

4 Cfd Cfd Programming Programming in in FLUENT FLUENT ... ... 77 5

5 UDF UDF Basics Basics ... ... 77 6

6 Using Using UDFs UDFs in in the the Solvers Solvers ... ... 88 7

7 Data Data structure structure overview overview ... ... 88 7.1

7.1 The The Domain Domain ... ... 88 7.2

7.2 The The Threads Threads ... ... 99 7.3

7.3 Cell Cell and and Face Face Datatypes Datatypes ... ... 99 7.4

7.4 Some Some Additional Additional info info on on Faces Faces ... ... 99 8

8 Fluent Fluent UDF UDF Data Data Structure Structure Summary Summary ... . 1010 9

9 Geometry Geometry Macros Macros ... ... 1111 10

10 Cell Cell Field Field Variable Variable Macros Macros ... ... 1212 11

11 Face Face Field Field Variable Variable Macros Macros ... ... 1313 12

12 Looping Looping and and Thread Thread Macros Macros ... ... 1414 13

13 Macros Macros ... ... 1515 13.1

13.1 DEFINE Macros DEFINE Macros ... ... 1515 13.2

13.2 Othe UDF Othe UDF Applications Applications ... ... 1616 14

14 User User Defined Defined Memories Memories ... ... 1717 15

15 User User Defined Defined Scalars...Scalars... ... 1818 16

16 Interpreted Interpreted vs. vs. Compiled Compiled UDF’s UDF’s ... ... 1919 17

17 UDF UDF Technical Technical Support Support ... ... 1919 18

18 Example: Example: Parabolic Parabolic Inlet Inlet Velocity Velocity Profile Profile ... ... 2020 18.1

18.1 Step 1: Step 1: Prepare Prepare the the Source Source Code Code ... ... 2020 18.2

18.2 Step 3: Step 3: Interpret Interpret or or Compile Compile the the UDF UDF ... ... 2020 18.3

18.3 Step 4: Step 4: Activate Activate the the UDF UDF ... ... 2121 18.4

18.4 Steps Steps 5 5 and and 6: 6: Run Run the the Calculations Calculations ... ... 2121 18.5

18.5 Numerical Numerical Solution Solution of of the the Example Example ... ... 2121 19

19 Example: Example: Checking Checking Effect Effect of of Porous Porous Zone Zone on on Momentum Momentum Equation Equation ... ... 2222 19.1

19.1 Using Using Fluent Fluent Built-in Built-in Porous Porous Zone Zone ... ... 2222 19.2

19.2 Using Using Momentum Momentum Source Source Terms...Terms... ... 2323 20

(4)

3 3 Introduction Introduction 20.1 20.1 Preparation Preparation ... ... 2424 20.2 20.2 Mesh Mesh ... ... 2424 20.3

20.3 General General Settings Settings ... ... 2424 20.4

20.4 Models Models ... ... 2525 20.5

20.5 Materials Materials ... ... 2525 20.6

20.6 Boundary Boundary Conditions Conditions ... ... 2626 20.6.1

20.6.1 Setting Setting Velocity Velocity Inlet Inlet ... ... 2929 20.6.2

20.6.2 Pressure Outlet Pressure Outlet ... ... 2929 20.7

20.7 Writing Writing UDF UDF ... ... 3030 20.7.1

20.7.1 Compiling the Compiling the UDF...UDF... ... 3232 20.8

20.8 Checking Checking Oxygen Oxygen Mass Mass Balance Balance ... ... 3737 21

21 Fluent Fluent Frequently Frequently Asked Asked Questions Questions ... ... 3939 21.1

21.1 My My UDF UDF won't won't interpret interpret or or compile compile - - what what is is wrong? wrong? ... 39... 39 21.2

21.2 How How to to Set Set Environment Environment Variables Variables ... ... 3939 21.2.1

21.2.1 On On Windows Windows 32 32 Bit Bit ... ... 3939 21.2.2

(5)

4 Introduction

1

Introduction

• What is a User Defined Function?

o A UDF is a routine (programmed by the user) written in C which can be dynamically linked with the solver.

 Standard C functions

• e.g., trigonometric, exponential, control blocks, do-loops, file i/o, etc.

 Pre-Defined Macros

• Allows access to field variable, material property, and cell geometry data. • Why build UDF’s?

o Standard interface cannot be programmed to anticipate all needs.

 Customization of boundary conditions, source terms, reaction rates, material properties, etc.

 Adjust functions (once per iteration)

 Execute on Demand functions

 Solution Initialization

(6)

5 C Programming

3

C Programming

• Basic syntax rules:

o Each statement must be terminated with a semicolon ; o Comments can be inserted anywhere between /* and */ o Variables must be explicitly declared (unlike in FORTRAN) o Compound statements must be enclosed by { }

o Functions have the following format:

return-value-type function-name (parameter-list) { function body }

o Macros are defined in the header files, they can be used just like functions

• Built-in data types: int, float, double, enum, Boolean:

int niter, a; /* declaring ‘niter’ and ‘a’ as integers */

float dx[10]; /* ‘dx’ is a real array with 10 members, the array index always starts from dx[0] */

enum { X, Y, Z }; /* X, Y, Z are enumeration constants 0, 1, 2 */

• pointer is a special kind of variable that contains the memory address, not content, of 

another variable

• Pointers are declared using the * notation:

int *ip; /* ip is declared as a pointer to integer */

• We can make a pointer point to the address of predefined variable as follows:

int a=1; int *ip;

ip = &a; /* &a returns the address of variable a */

printf(“content of address pointed to by ip = %d\n”, *ip);

• Pointers are also used to point to the beginning of an array

o Thuspointers are used to address arrays in C

• Array variables can be defined using the notation name[size], where name is the variable

name and size is an integer which defines the number of elements in the array (from 0 to size-1)

• Operators

= (assignment) +, -, *, /, % (modulus) <, >, >=, <=, ==, !=

(7)

6 C Programming

agg += single; /* it means agg = agg + single; */

*= multiplication assignment, -= subtraction assignment, /= division assignment

• Basic control structures

if ( … ) <statement>; if ( … ) <statement>; else <statement>; if ( … ) <statement>; else if ( … ) <statement>; For Loops: for ( k=0; k<NUM; k++ ) <statement>; While loops: While ( … ) <statement>; Conditional operator ( ? : )

( condition ? operand a : operand b ) example:

real At = (rp_axi ? At*2*M_PI : At ); true

(8)

7 Cfd Programming in FLUENT

4

Cfd Programming in FLUENT

• We (as CFD programmers in FLUENT) want to know how FLUENT organizes data so that we

know:

o How to access mesh information for a particular cell zone or a fac e zone

 Cell centroids, cell volumes, the neighbors, etc.

 Face centroids, face areas, face normal directions (vectors), etc. o How to access field data for cells (and faces): pressure, velocity, density, etc. o How to efficiently loop through these cells or faces in the codes

• How to sypply customized source terms, boundary co nditions, and fluid properties, etc., to

the solver

• How to modify the behaviors or specific model parameters for various physical models as in

turbulence, reactions kinetics, multiphase, and dynamic mesh, etc.

• How to implement user’s own governing equations in the finite-volume framework of 

FLUENT solver

5

UDF Basics

• UDF’s assigns values (e.g., boundary data, source terms)

to individual cells and cell faces in fluid and boundary zones.

o In a UDF, zones are referred to as threads.

o A looping macro is used to access individual cells belonging to a thread.

 e.g., a face-loop macro visits 563 faces on face zone 3 (velocity-inlet).

• Position of each face is available to

calculate and assign spatially varying properties.

 Thread and variable references are automatically passed to UDF when assigned to boundary in GUI.

• Values returned to the solver by UDFs must

(9)

8 Using UDFs in the Solvers

6

Using UDFs in the Solvers

• The basic steps for using UDFs inFLUENT are as follows:

STEP 1: Create a file containing the UDF source code STEP 2: Start the solver and read in your case/data files STEP 3: Interpret or Compile the UDF

STEP 4: Assign the UDF to the appropriate variable and zone in BC panel. STEP 5: Set the UDF update frequency in the Iterate panel.

STEP 6: Run the calculation

7

Data structure overview

7.1 The Domain

• Domain is the set of connectivity and hierarchy info for the entire data structure in a given

problem for single phase flows. It includes: o All fluid zones (‘fluid threads’) o All solid zones (‘solid threads’)

o All boundary zones (‘boundary threads’)

• Cell: cell is the computational unit, conservation equations are solved over each cell • Face: direction in the outward normal

• Threads: represent the collection of cells or faces; a Thread represents a fluid or solid or

boundary zone

• Multiphase simulations (singlephase simulations use single domain only)

o Each phase has its own “Domain-structure”

(10)

9 Data structure overview

o Multiphase UDF will be discussed later

7.2 The Threads

• A Thread is a sub-set of the Domain structure

• Individual ‘fluid’, ‘solid’ and each ‘boundary’ zones are identified as ‘zones’ and their

datatype is Thread

• ‘zone’ and ‘Thread’ terms are often used interchangeably

• Some further details about Zone/Thread ID and Thread-datatype:

o Zones are identified at mesh level with an integer ID in the Define/Boundary Condition panel

o Threads, a Fluent-specific datatype, store structured info rmation about the mesh, connectivity, models, property, etc. all in one place

o Users identify zones through the ID’s

o Zone/Thread-ID and Threads are correlated through UDF macro’s

7.3 Cell and Face Datatypes

• Control volumes of fluid and solid zones are also called ‘cells’ in FLUENT

o The data structure for the cell zones is typed as ‘cell_t’ (the cell thread index) o The data structure for the cell faces is typed as ‘face_t’ (the face thread index)

• A fluid or solid zone is called a cell zone, which can be accessed by using cell threads • Boundary or internal faces can be accessed by using face threads

7.4 Some Additional info on Faces

• Each Control volume has a finite number of faces

o Faces on the boundary are also typed ‘face_t’; their ensemble are listed as boundary face-threads with the

o fluid & solid cell-threads under Define-o Boundary_Condition panel

o Those faces which are inside the flow-domain and do not o share any external boundary are not accessible from GUI o (because you do not need them)

(11)

10 Fluent UDF Data Structure Summary

8

Fluent UDF Data Structure Summary

• The data structure for accessing a cell zone is typed as ‘cell_t’ (the cell thread index); the

data structure for faces is typed as ‘face_t' (the face thread index)

Type Example Declaration

Domain *d d is a pointer to domain thread

Thread *t t is a pointer to thread

Cell_t *c c is cell thread index

Face_t f f is a face thread index

Node *node node is pointer to a node

• Each thread (zone) has a unique integer ID available in the

boundary condition panel (or can be listed by the list-zone TUI command: /grid/modify-zones/list-zones)

• Given a correct ID, the Lookup_Thread macro can retrieve

thethread pointer 

Int ID = 7;

Thread *tf = Lookup_Thread (domain, ID);

• Conversely, given a thread pointer tf, the zone ID can be

retrieved

ID = THREAD_ID(tf);

• Once we have the correct pointer (for a specific zone), we can access the members belonging

to the zone without any problem. Thread pointer provides the leading address of the thread (zone)

(12)

11 Geometry Macros

9

Geometry Macros

• C_NNODES(c, t) Number of nodes in a cell • C_NFACES(c, t) No. of faces in a cell • F_NNODES(f, t) No. of nodes in face

• C_CENTROID(x, c, t) x, y, z - coords of cell centroid • F_CENTROID(x, f, t) x, y, z – coords of face

centroid

• F_AREA(A, f, t) Area vector of a face

• NV_MAG(A) Area-magnitude

• C_VOLUME(c, t) Volume of a cell • C_VOLUME_2D(c, t) Volume of a 2D cell

(Depth is 1m in 2D; 2*π m in axi-symmetric solver) • NODE_X(nn) Node x-coord; (nn is a node pointer)

• NODE_Y(nn) Node y-coord;

• NODE_Z(nn) Node z-coord;

• real flow_time(); returns actual time

• int time_step; returns time step number

(13)

12 Cell Field Variable Macros

10 Cell Field Variable Macros

C_R(c, t); density C_P(c,t); pressure C_U(c,t); u-velocity C_V(c,t); v-velocity C_W(c,t); w-velocity C_T(c,t); temperature C_H(c,t); enthalpy C_K(c,t); turbulent KE C_D(c,t); tke dissipation

C_YI(c,t,i); species mass fraction C_UDSI(c,t,i); UDS scalars

C_UDMI(c,t,i); UDM scalars

C_DUDX(c,t); velocity derivative C_DUDY(c,t); velocity derivative C_DYDZ(c,t); velocity derivative C_DVDX(c,t); velocity derivative C_DVDY(c,t); velocity derivative C_DVDZ(c,t); velocity derivative C_DWDX(c,t); velocity derivative C_DWDY(c,t); velocity derivative C_DWDZ(c,t); velocity derivative C_MU_L(c,t); laminar viscosity C_MU_T(c,t); turbulent viscosity C_MU_EFF(c,t); effective viscosity

C_K_L(c,t); laminar thermal conductivity C_K_T(c,t); turbulent thermal conductivity C_K_EFF(c,t); effective thermal conductivity C_CP(C c,t); specific heat

C_RGAS(c,t); gas constant

C_DIFF_L(c,t); laminar species diffusivity C_DIFF_EFF(c,t); effective species diffusivity

(14)

13 Face Field Variable Macros

11 Face Field Variable Macros

• Face field variables are only available when using the segregated solver and generally, only at

exterior boundaries. F_R(f, t); density F_P(f, t); pressure F_U(f, t); u-velocity F_V(f, t); v-velocity F_W(f, t); w-velocity F_T(f, t); temperature F_H(f, t); enthalpy F_K(f, t); turbulent KE F_D(f, t); tke dissipation

F_YI(f, t); species mass fraction F_UDSI(f, t); UDS scalars

F_UMI(f, t); UDM scalars

(15)

14 Looping and Thread Macros

12 Looping and Thread Macros

cell_t c; defines a cell

face_t f; defines a face Thread *t; pointer to a thread

Domain *d; pointer to collection of all threads

thread_loop_c(t, d) {

... loop that steps through all cell threads in domain }

thread_loop_f(t, d) {

………. loop that steps through all face threads in domain }

begin_c_loop(c, t) {

………. Loop that steps through all cells in a thread }

end_c_loop

befing_f_loop(c, t) {

………. Loop that steps through all faces in a thread }

C_face_loop(f, t, n) {

………. Loop that visits all faces of cell c in thread t }

Thread *tf = Lookup_Thread(domain, ID); return thread pointer of integer ID of zone

THREAD_ID(tf); returns zone integer ID of thread pointer

Code enclosed in { } is executed in loop.

Specialized variable types used for referencing

(16)

15 Macros

13 Macros

• Macros are pre-defined (Fluent) functions:

o Allows definition of UDF functionality and function name (DEFINE_ macro) o Allow access to field variables, cell information, looping capabilities, etc.

• Macros are defined in header files.

o The udf.h header file must

 #include “udf.h”

be included in your source code.

o The header files must be accessible in your path.

 Typically stored in Fluent.Inc/src/directory. o Other “.h” header files may need to be included.

 Depends upon relevant variables and macros needed in your UDF, e.g.,

• dpm.h for DPM variable access

• A list of often used macros is provided in the UDF User’s Guide.

13.1 DEFINE Macros

• Any UDF you write must

o 18 general purpose macros and 13 DPM-related macros (not listed); begin with a DEFINE_ macro:

DEFINE_ADJUST(name,domain); general purpose UDF called every iteration DEFINE_INIT(name,domain); UDF used to initialize field variables

DEFINE_ON_DEMAND(name); defines an ‘execute-on-demand’ function DEFINE_RW_FILE(name,face,thread,index); customize reads/writes to case/data files DEFINE PROFILE(name,thread,index); defines boundary profiles

DEFINE_SOURCE(name,cell,thread,ds,index); defines source terms DEFINE_HEAT_FLUX(name,face,thread,c0,t0,cid,cir); defines heat flux DEFINE_PROPERTY(name,cell,thread); defines material properties

DEFINE_DIFFUSIVITY(name,cell,thread,index); defines UDF and species diffusivities DEFINE_UDS_FLUX(name,face,thread,index); defines UDS flux terms

DEFINE_UDS_UNSTEADY(name,face,thread,index); defines UDS transient terms DEFINE_SR_RATE(name,face,thread,r,mw,yi,rr); defines surface reaction rates

(17)

16 Macros

DEFINE_TURBULENT_VISCOSIT(name, cell, thread); defines procedure for calculating turbulent viscosity

DEFINE_TURB_PREMIX_SOURCE(name, cell, thread, turbflamespeed, source); defines turbulent flame speed

DEFINE_NOX_RATE(name, cell, thread, nox); defines NOx production and destruction rates

13.2 Othe UDF Applications

• In addition to defining boundary values, source terms and material properties, UDFs can be used

for:

o Initialization

 Executes once per initialization o Adjust

 Executes every iteration o Wall Heat Flux

 Defines fluid-side diffusive and radiative wall heat fluxes in terms of heat transfer coefficients

 Applies to all walls

o User Defined Surface and Volumetric Reactions o Read-Write to/from case and data files

 Read order and Write order must be same. o Execute-on-Demand capability

(18)

17 /User Defined Memories

14 User Defined Memories

• User-allocated memory

o Up to 500 field variables can be defined. o Can be accessed by UDFs:

 C_UDMI(cell, thread, index);

 F_UDMI(face, thread, index); o Can be accessed for post-processing. o Information is stored in data file.

(19)

18 User Defined Scalars

15 User Defined Scalars

• FLUNET can solve (up to 50) generic transport equations

for User Defined Scalars:

1,..., k k k i k k scalars i i F S k N t x x φ 

φ

φ 

φ 

+

Γ

=

=

• User Specifies:

DefineModelsUser-Defined Scalars… o Number of User-Defined Scalars

o Flux Function F

 DEFINE_UDS_FLUX(name, face, thread, index)

 DEFINE_UDS_UNSTEADY(name, cell, thread, index)

 ‘case’ statement can be used to associate multiple f lux and transient functions with each UDS.

o Example

 Can be used to determine magnetic and/or electric field in a fluid zone.

• User must also specify:

o Source terms o Diffusivity,

 ‘case’ statement needed to define UDF diffusivities for each UDS.

o Boundary Conditions for each UDS.

 Specified Flux or Specified Value.

(20)

19 Interpreted vs. Compiled UDF’s

16 Interpreted vs. Compiled UDF’s

• Functions can either be read in and interpreted at run time orcompiled and grouped into a shared

library that is linked with the standard FLUENT executable.

• Interpreted vs. compiled code

o Interpreter

 Interpreter is a large program that sits in the computer’s memory.

 Executes code on a “line by line” basis instantaneously

 Advantages – does not need a separate compiler

 Disadvantage – slow and takes up space in memory o Compiler (refer to User’s Guide for instructions)

 Code is translated “once” into machine l anguage (object modules).

 Efficient way to run UDF’s. Uses Makefiles

 Creates “shared libraries” which are linked with the rest of the solver

 Overcomes interpreter limitations e.g. mixed mode arithmetic, structure references etc.

17 UDF Technical Support 

• Because UDF’s can be very complicated, Fluent Inc. does not assume responsibility for the

accuracy or stability of solutions obtained using UDFs that are user-generated.

o Support will be limited to guidance related to communication between a UDF and the FLUENT solver.

o Other aspects of the UDF development process that include conceptual function design, implementation (writing C code), compilation and debugging of C source code, execution of  the UDF, and function design verification will remain the responsibility of the UDF author.

(21)

20 Example: Parabolic Inlet Velocity Profile

18 Example: Parabolic Inlet Velocity Profile

• We would like to impose a parabolic inlet velocity to the 2D elbow shown. • The x velocity is to be specified as

2

( ) 20 1

0.0745

y u y

=

18.1 Step 1: Prepare the Source Code

• The DEFINE_PROFILE macro allows the function inlet_x_velocity to be defined.

o All UDFs begin with a DEFINE_ macro.

o inlet_x_velocity will be identifiable in solver GUI.

o thread and nv are arguments of the DEFINE_PROFILE macro, which are used to identify the zone and variable being defined, respectively.

o The macro begin_f_loop loops over all faces f , pointed by thread.

• The F_CENTROID macro assigns cell position vector to x[]. • The F_PROFILE macro applies the velocity component to face f .

18.2 Step 3: Interpret or Compile the UDF

DefineUser-DefinedFunctions

Interpreted…

DefineUser-DefinedFunctions

Compiled…

• Add the UDF source code to the Source

File Name list.

• Click Interpret.

• The assembly language code will

display in the FLUENT console.

• Add the UDF source code to the Source

files list.

• Click Build to create UDF library. • Click Load to load the library.

• You can also unload a library if needed.

DefineUser-DefinedFunctions

Manage…

0

(22)

21 Example: Parabolic Inlet Velocity Profile

18.3 Step 4: Activate the UDF

• Open the boundary condition panel for the

surface to which you would like to apply the UDF.

• Switch from Constant to the UDF function in

the X_Velocity drop-down list.

18.4 Steps 5 and 6: Run the Calculations

• You can change the UDF Profile Update Interval in the Iterate

panel (default value is 1).

o This setting controls how often (either iterations or time steps if unsteady) the UDF profile is updated.

• Run the calculation as usual.

18.5 Numerical Solution of the Example

• The figure at the right shows the velocity

field through the 2D elbow.

• The bottom figure shows the velocity

vectors at the inlet. Notice the imposed parabolic profile.

(23)

22 Example: Checking Effect of Porous Zone on Momentum Equation

19 Example: Checking Effect of Porous Zone on Momentum Equation

Many industrial applications such as filters, catalyst beds and packing, involve modeling the flow through porous media. This tutorial illustrates how to set up and solve a problem involving gas flow through porous media.

The problem solved here involves gas flow through a channel using FLUENT in two different ways to validate it. In the first one we use porous zone parameters and in the second one we write a UDF includes momentum source terms for porous zone pressure drop.

19.1 Using Fluent Built-in Porous Zone

 FileReadCase Read a mesh file

 DefineBoundary Conditions

 Select fluid zone then Click Set to enter the fluid zone parameters.

 Check the “Porous Zone” to enable porous zone

 On Porous zone, set the Viscous Resistance equal to 5.68e6 (1/m2) in both directions.

 Change theFluid Porosity from 1 to 0.4 at the end of this Porous Zone Tab.

 For inlet condition, set the Velocity inlet equal to 1 (m/s) on the inlet velocity magnitude normal to boundary.

 To solve the case, go to: Solve Iterate… Number of Iterations = 1000

 After convergence we can display results as follows.

(24)

23 Example: Checking Effect of Porous Zone on Momentum Equation

19.2 Using Momentum Source Terms

#include "udf.h"

#define por_gdl 0.4

#define i_permeability 5.68e6 // Inverse Permeability (1/m^2)

#define urf 0.1 // under relaxation factor for stability of momentum source term real s1=0., s2=0.;

DEFINE_SOURCE(xmom_src,c,t,dS,eqn) {

real source, mu, u; mu = C_MU_L(c,t); u = C_U(c,t); source = -(mu*u*i_permeability); dS[eqn] = -(mu*i_permeability); s1 = s1*(1-urf) + source*urf; return s1; } DEFINE_SOURCE(ymom_src,c,t,dS,eqn) {

real source, mu, v; mu = C_MU_L(c,t); v = C_V(c,t); source = -(mu*v*i_permeability); dS[eqn] = -(mu*i_permeability); s2 = s2*(1-urf) + source*urf; return s2; }

(25)

24 Example: Modeling Fuel Cell

20 Example: Modeling Fuel Cell

20.1 Preparation

Use FLUENT Launcher to start 2D version of ANSYS FLUENT.

Note: The Display Options are enabled by default. Therefore, once you read in the mesh, it will be displayed in the embedded graphics windows.

20.2 Mesh

1. Read the mesh file FileReadMesh

2. Check the mesh

 GeneralCheck

ANSYS FLUENT will perform various checks on the mesh and report the progress in the ANSYS FLUENT console window. Ensure that the minimum volume reported is a positive number.

3. Scale the mesh

 GeneralScale…

(a) Select mm (millimeter) from the Mesh Was Created In drop-down list in the Scaling group box.

(b) Click Scale to scale the mesh. (c) Close the Scale Mesh dialog box. 4. Check the mesh.

 GeneralCheck

Note: It is a good idea to check the mesh after you manipulate it (i.e., scale, convert to polyhedral, merge, separate, fuse, add zones, or smooth and swap). This will ensure that the quality of the mesh has not been compromised.

20.3 General Settings

 DefineModelsSolver

(26)

25 Example: Modeling Fuel Cell

20.4 Models

 DefineModelsSpeciesTransport & Reaction…

(a) Enable Species Transport

(b) Click OK to Close the Species Model box.

(c) FLUENT will notify that “Available material properties or method have changed. Please confirm the property values before continuing”. Click OK to close the dialog box.

20.5 Materials

 DefineMaterials…

1. Revise the properties for the mixture materials.

(27)

26 Example: Modeling Fuel Cell

(a) Click the Edit… button to the right of the Mixture Species drop-down list to open Species dialog box.

You can add or remove species from the mixture material as necessary using the Species dialog box. i. Retain the default selections from the Selected Species selection list.

ii. Click OK to close the Species dialog box.

(b) Click Change/Create to accept the material property settings. (c) Close the Create/Edit Materials dialog box.

20.6 Boundary Conditions

 DefineOperating Conditions

Because the effect of gravity can be neglected, Retain setting in Operating Conditions and Click OK to Close the dialog box.

(28)

27 Example: Modeling Fuel Cell

 DefineBoundary Conditions

(a) Set Boundary condition for gdl fluid zone, by clicking on the Set button

(b) CheckPorous zone radio button to enable porous zone.

(c) Set value for Viscous Resistance in both directions. These parameters are inverse of  permeability (1/m^2).

Fluent uses these values for calculating momentum source term due to the porous zone.

(29)

28 Example: Modeling Fuel Cell

(f) Set Boundary condition for cl fluid zone, by clicking on the Set button

(g) Check theporous zone button to enable the cl porous zone. (h) Set viscous resistance variables for both directions.

(30)

29 Example: Modeling Fuel Cell

20.6.1 Setting Velocity Inlet 

(a) By selecting inlet at Boundary Condition dialog box and Clicking on set button, you will see the Velocity inlet dialog box, which can be used to specify inlet conditions such as inlet velocity, temperature, species mass fraction, etc.

(b) Set Velocity magnitude equal to 0.03 (m/s), that is entering the domain normal to the boundary face.

(c) Click the Species Tab to set mass fraction of species. Fluent will automatically calculate the mass fraction of the last specie, that is equal to 1 minus sum of the mass fraction of the other species.

(31)

30 Example: Modeling Fuel Cell

(b) Select pressure outlet on the right side of the boundary conditions dialog box, to specify pressure at the outlet of the fuel cell.

(c) Click set button to enter Pressure Outlet dialog box.

(d) To prevent solution damage by reverse flows, we should specify outlet conditions near to real condition.

(e) For this, we have chosen inlet species mass fraction for the outlet condition. (f) Leave the other parameters by default and cli ck OK.

20.7 Writing UDF

#include "udf.h" #define por_cl 0.1 #define por_gdl 0.4

#define i_permeability 5.68e6 //5.681e10 // (1/m^2)

#define R UNIVERSAL_GAS_CONSTANT // 8.3143 kJ/kmol.K this is known within Fluent #define zita_cat 2.e3

#define V_oc 1.207 #define j_ref_cat 20. #define alpha_cat 2. #define lambda_cat 1. #define phi_sol 0. #define phi_mem 0. #define C_ref_o2 1.

#define F 9.65e4 // C/kmol

#define h_cl 0.02e-3 // Cathalyst layer thickness [m] #define L 71.12e-3 // Channel Length [m]

#define diff_o2 3.2348e-5 /* mass diffusivity of oxygen */ #define diff_h2o 3.89e-5 /* mass diffusivity of water */ #define diff_n2 2.88e-5 /* mass diffusivity of nitrogen */ #define i_h2o 0

#define i_o2 1 #define i_n2 2

#define mw_h2o 18. // kg/kmol #define mw_o2 32. // kg/kmol

(32)

31 Example: Modeling Fuel Cell

#define mw_n2 28. // kg/kmol enum{ current };

real R_cat(cell_t c, Thread *t)

{ // this routine returns Reraction_Rate_cat as "R_cat"

real eta_cat, C_o2, T, xyz[ND_ND], x ,y, z, Reraction_Rate_cat, i, i0_over_C_ref; C_o2 = C_YI(c,t,i_o2);

T = C_T(c,t);

//eta_cat = phi_sol-phi_mem-V_oc; i=C_UDMI(c,t,current);

i0_over_C_ref=0.8*1e4; //[A/m^2] Ref. Khakbaz-Kermani

eta_cat = R*T / (alpha_cat*F) * log(i/C_o2/i0_over_C_ref); //Butler-Volmer Ref. Khakbaz-Kermani C_CENTROID(xyz,c,t); x=xyz[0]; y=xyz[1]; //z=xyz[2]; // Option 0 // Reraction_Rate_cat = 10000.0; // Option 1 Reraction_Rate_cat = 100000. *(1.0 - x/L); // Option 2 from Fluent FC manual

// Reraction_Rate_cat = (zita_cat*j_ref_cat)*pow(C_o2/C_ref_o2,lambda_cat)*(exp(-alpha_cat*F*eta_cat/(R*T))); // Option 3 // Reraction_Rate_cat = (zita_cat*j_ref_cat)*pow(C_o2/C_ref_o2,lambda_cat)*(exp(-alpha_cat*F*eta_cat/(R*T))); return Reraction_Rate_cat; } DEFINE_SOURCE(O2_src,c,t,dS,eqn) { real source;

source = -mw_o2*R_cat(c,t)/(4.*F) *por_cl;// (kg/kmol)()/(C/kmol) //Message("%f, %f, %f, %f, %f\n",mw_o2,R_cat(c,t),por_cl, source, F); C_UDMI(c,t,current)= -4.*F /mw_o2 *source *h_cl; // this is local current density

dS[eqn] = 0.0; return source;

(33)

32 Example: Modeling Fuel Cell

dS[eqn] = 0.0; return source; } DEFINE_SOURCE(MASS_src,c,t,dS,eqn) { real source;

source = ( -mw_o2/(4.*F) + mw_h2o/(2.*F) )*R_cat(c,t) *por_cl; dS[eqn] = 0.0; return source; } DEFINE_DIFFUSIVITY(mix_diff, c, t, i) { real diff; switch (i) { case 0: diff = diff_h2o*por_cl*sqrt(por_cl); break; case 1: diff = diff_o2*por_cl*sqrt(por_cl); break; case 2: diff = diff_n2*por_cl*sqrt(por_cl); break; default: diff = 0.0; } return diff; }

20.7.1 Compiling the UDF

 DefineUser-DefinedFunctionsCompiled

(34)

33 Example: Modeling Fuel Cell

 Build the UDF and then click on Load to load the Library that is named libudf .

 Note that the UDF source files should be in the directory that contains your case and data files. ClickOK to build the library.

 Now the fluent creates library libudf.lib, object libudf.exp and other required files.

 You can load the library if fluent reveal no error and the message “Done” have seen at the end of the commend window.

(35)

34 Example: Modeling Fuel Cell

 If you have build and load a udf before, be sure to unload it in the Manage dialog box. Else an error will appear that an libudf is in use.

 Now you should hook functions to its specified equation.

 On the cl fluid zone, check Source Terms.

 On theSource Terms Tab, click Edit in front of Mass equation.

 Then add a source and select MASS_src and click ok to add the source term on solution.

 Repeat this procedure for the other equations, such as H2O, O2, … .

 We have used a UDM in the UDF, so we should specify a UDM for it.

(36)

35 Example: Modeling Fuel Cell

 Fluent enables the energy equation by enabling Species Transport equation. In this example, we don’t need the energy equation. To prevent solving this equation go to Solve Solution Controls and click on Energy in Equations box.

 To have a good initial guess for better and time saving convergence, we can specify the conditions of inlet to the all domain.

 So, Solve Initialize Solution Initialize, Compute from inlet and click on Init to specify its condition to all domains.

(37)

36 Example: Modeling Fuel Cell

 On iterate window, Solve Iterate, specify the number iterations and start iteration by clicking on iterate.

Figure 20-1: Scaled Residuals

(38)

37 Example: Modeling Fuel Cell

20.8 Checking Oxygen Mass Balance

To check Oxygen mass balance, we should calculate the rate of oxygen mass enters the domain at the inlet (kg/s), the rate of oxygen mass consumes at the catalyst layer (kg/s), and the rate of oxygen mass exits the domain from outlet.

So, we should add amacro to the end of previous UDF as follows: DEFINE_ON_DEMAND(data) { real A[ND_ND]; real sum; int inlet_ID = 7; int outlet_ID = 6; int cl_ID = 2; Domain *d = Get_Domain(1);

Thread *t_inlet = Lookup_Thread (d,inlet_ID); Thread *t_outlet = Lookup_Thread (d,outlet_ID); Thread *t_cl = Lookup_Thread (d,cl_ID);

face_t f; cell_t c; /////////////////////////// sum = 0.; begin_f_loop(f,t_inlet) { F_AREA(A,f,t_inlet);

sum += F_FLUX(f,t_inlet) *F_YI(f,t_inlet,i_o2)*1.e6; }

end_f_loop(f,t_inlet);

Message("inlet = %f *e-6(kg/s)\n", sum); ///////////////////////////

sum =0.;

begin_f_loop(f,t_outlet) {

F_AREA(A,f,t_outlet);

sum += F_FLUX(f,t_outlet) *F_YI(f,t_outlet,i_o2)*1.e6; }

end_f_loop(f,t_outlet);

Message("outlet= %f *e-6(kg/s)\n", sum); ///////////////////////////

sum =0.;

begin_c_loop(c,t_cl) {

sum += -mw_o2*R_cat(c,t_cl)/(4.*F) *por_cl*C_VOLUME(c,t_cl)*1.e6; }

(39)

38 Example: Modeling Fuel Cell

• The macro “DEFINE_ON_DEMAN” executes when we want. For example at the beginning,

intermediate and at the end of solution, it can be executed.

• The array A is defined in ND_ND dimension to reserve area.

• ND_ND is a Fluent macro that is equal to 2 in 2-dimensioanl and 3 in 3-dimensional case. • sum is defined to summarize value of cells in a group cells (Threads)

• inlet_ID, outlet_ID and cl_ID are the number of zone that can be found in Boundary

Conditions dialog box.

• Get_Domain(1) specifies the domain to the 1 to d which is defined as Domain pointer • Lookup_Thread (d,ID) is defined to find the Thread which its ID number is equal to inlet_D,

outlet_ID and cl_ID.

• With face_t and cell_t we can define variables that reserves face and cell data. • begin_f_loop(f,t_inlet), loops throw all faces of the Thread t_inlet that its ID is 7. • F_AREA(A,f,t_inlet), returns area of the face f of thread t_inlet.

• F_FLUX(f,t_inlet), returns the mass flow rate the face f of the thread t_inlet.

• F_YI(f,t_inlet,i_o2), returns mass fraction of the specie that its ID is i_o2 of the face f of the

thread t_inlet.

• Message(“…\n”,…), is used to write mass flow rate of Oxygen on the fluent command

window. Result is written below: inlet = -5.721122 *e-6(kg/s) outlet= 5.153047 *e-6(kg/s) porous= -0.589597 *e-6(kg/s)

References

Related documents