23 views

Uploaded by Saravanan Palanisamy

Attribution Non-Commercial (BY-NC)

- Introduction to Pro_C
- C Programming Foundation Level
- C_GUI_Programming.pdf
- Btech Syllabus
- C Interview Questions
- GSM Adaptive Multi-Rate Coding.pdf
- A Simple Makefile Tutorial
- HCL Placement Papers
- compliance
- Principles of Programming Languages Lecture Notes Unit 1
- C Programming Session 07
- C Array
- Dg Computer Apps
- Make
- Programs of C
- 71841400 Interview Questions
- Structures and Union
- Sess-4
- paper_13
- B.a., B.sc., B.com. Part II Subject - Computer Application

You are on page 1of 33

What are User Defined Functions Introduction to C Set-Up C User Routines in Fluent Implementing a Custom Turbulence Model Programming in other CFD Commercial Codes

Why programming in commercial codes?

The codes are general-purpose but cannot anticipate all needs New (physical) models can be developed in a user-friendly environment Large number of problems (test-cases) can be addressed with the same implementation

C (Fluent) or FORTRAN (StarCD, CFX) routines programmed by the user linked to the solver to perform certain operations: initialization special boundary condition (i.e. space or time dependent) material properties source terms reaction rates postprocessing and reporting debugging .

ME469B/6/GI 2

Specify a Parabolic Velocity Profile at the Inlet

Goal: The UDF (inlet_parab) set the values of the x-velocity component at the cell faces of the inlet boundary zone

Inlet zone

1) 2) 3) 4)

Determine the cell-faces belonging to the inlet zone Loop on all those faces Determine the coordinate of the face centroid Specify the x-velocity component

ME469B/6/GI 3

Parabolic Velocity Profile:

function inlet_parab Definitions Loop over all the inlet cell faces Evaluate the face centroid coordinates The function return the velocity

ME469B/6/GI

Compile/interpret the UDF: Define User Defined

ME469B/6/GI 5

Solve the equations Solve Iterate

Final Result

ME469B/6/GI

C Programming

Typical C function:

ME469B/6/GI

C vs. FORTRAN

ME469B/6/GI

Statements MUST end with a semicolon ;

Comments are placed anywhere in the program between /* */ Statements are grouped by curly brackets { }

Variables defined within the body functions are local Variables defined outside the body functions are global and can be used by all the functions that follows Variables MUST be ALWAYS defined explicitly Integer/real/double functions have to return a integer/real/double value C is case sensitive!

ME469B/6/GI 9

Basic Statements

Arithmetic expressions in C look like FORTRAN

a = y + (i-b)/4;

a = mycompute(y,i,b);

mystuff(a,y,i,b);

a = pow(b,2); /* pow(x,y) returns x raised to y */

ME469B/6/GI

10

Arrays of variables are defined using the notation

int a[10]; /*define an array of ten integers */ Note the brackets are square [] not round ()!! Note that the arrays ALWAYS start from 0

Standard C types are: Integer, Real, Double, Char C allows to define additional types

typedef struct list{int id, float x[3], int id_next};

ME469B/6/GI

11

Pointers

A pointer is a variable which contain the address of another variable Pointers are defined as:

int *a_p; int a; /* pointer to an integer variable */ /* an integer variable */

Set-up a pointer

a = 1; a_p = &a; /* &a return the address of variable a */

ME469B/6/GI

12

Operators

Arithmetic Operators Logical Operators

ME469B/6/GI

13

Conditional Statements

if and if-else Example

ME469B/6/GI

14

Loop Procedure

for loops Example

ME469B/6/GI

15

C Preprocessor

It handles Macro substitutions

#define A B #define my_f(x,y) x+y*3-5

#include udf.h #include math.h

ME469B/6/GI

16

Programming in C

Additional information are: http://www.cs.cf.ac.uk/Dave/C/CE.html Plenty of books: The C Programming Language, Kernighan & Ritchie, 1988

ME469B/6/GI

17

Commercial CFD codes allow the development of User Defined Functions for various applications. Anyway, the core of the software is closed. UDF must be compiled and linked to the main code Most codes provide macros and additional tools to facilitate the use of UDFs In Fluent there are two options: Interpreted The code is executed on a line-by-line basis at run time + does not need a separate compiler (completely automatic) - slows down the execution and uses more memory - somewhat limited in scope Compiled A library of UDF is compiled and linked to the main code Overcomes all the disadvantages reported above

ME469B/6/GI 18

Define User Defined Interpreted

Display of code translation in assembly (and eventual compiling errors)

ME469B/6/GI 19

ME469B/6/GI 20

10

my_library

Makefile makefile

src my_udf.c

lnx86

ME469B/6/GI

3d

my_udf.c

libudf.so

21

In the directory

/usr/local/Fluent.Inc/fluent6/src

There are two files Makefile.udf makefile.udf to be copied in the directory my_library to be copied in the directory my_library/src

The first one does not require modifications. In the second one two macros MUST be modified

SOURCE = my_udf.c FLUENT_INC = /usr/local/Fluent.Inc

ME469B/6/GI

22

11

UDFs in FLUENT

Boundary Conditions Initial Conditions Adjust Function Source Terms Material Properties Execute on Demand User Defined Scalars User Defined Memory Pointers to threads Geometry Macros Cell and Face Variables Arithmetic and Trigonometric Functions

Available MACROS

Programming Tools

ME469B/6/GI

23

Boundary Conditions

The inlet profile specification is based on the macro DEFINE_PROFILE DEFINE_PROFILE can be used for wall boundary conditions as well to impose temperature, velocity, shear stress, etc. It is possible to specify a constant value, a position-dependent or time-dependent values and to link the values on the boundary to the values in the internal cells Internal Values

x x

BC

Note that the BCs are applied to the faces of the cells (face centroids)

ME469B/6/GI 24

12

Initial Conditions

The initial condition specification can be performed using the macro DEFINE_INIT Space-dependent conditions might be imposed The routine is executed once at the beginning of the solution process It is attached in the UDFs hooks Define User Defined Function Hooks

ME469B/6/GI

25

Initial Conditions

Note that the difference between the DEFINE_PROFILE and DEFINE_INIT is that the former performs a loop on the face-centroids belonging to a certain zone whereas the latter loops on the cell-centroids Example:

ME469B/6/GI

26

13

Adjust Function

Similar to the DEFINE_INIT but it is executed every iteration: DEFINE_ADJUST Can be used for postprocessing, clipping, etc. It is attached in the UDFs hooks Define User Defined Function Hooks

ME469B/6/GI

27

Source Terms

To add a source term in the equations: DEFINE_SOURCE Can be used for: Continuity Momentum (component by component) Turbulent quantities Energy It is different from the previous macros because it works on a cell-by-cell basis (no need to perform loops!)

ME469B/6/GI

28

14

Source Terms

Define Boundary Conditions Fluid

ME469B/6/GI

29

Source Terms

In FLUENT the source terms are written in the form S (f) = A + B f where f is the dependent variable A is treated explicitly and B f is treated implicitly In the DEFINE_SOURCE both terms A and B have to be specified

ME469B/6/GI

30

15

Material Properties

To define the properties of the materials : DEFINE_PROPERTIES Can be used for: Viscosity Density Thermal Conductivity . As for the source terms works on a cell-by-cell basis

ME469B/6/GI

31

Material Properties

Define Material Property

All the available UDFs Are shown in the menu

ME469B/6/GI

32

16

Execute on Demand

To perform operations instantaneously : EXECUTE_ON_DEMAND It is executed when activated by the user Can be used for: Debugging Postprocessing . Define User Defined Execute on Demand

ME469B/6/GI

33

In addition to the Continuity and Momentum Equations (and Energy) generic transport equations can be solved (up to 50!) To include scalars in the calculations 1) Define the number of scalars Define User Defined User Defined Scalars 2) Define the diffusion and source terms in the generic equation

ME469B/6/GI

34

17

When UDS are defined in the material property panel the diffusivity of the scalars MUST be defined Define Material Property

Note that the default diffusivity for the scalars is constant and equal to 1!

ME469B/6/GI 35

Boundary conditions for the scalars can be defined as Constant Value Constant Gradient User Defined Define Boundary Conditions Wall

ME469B/6/GI

36

18

The Source terms for the scalars are set using the DEFINE_SOURCE macro Introduced before The scalar equations can be further customized 1) Convective terms can be modified using the macro DEFINE_UDS_FLUX 2) Unsteady term can be modified using the macro DEFINE_UDS_UNSTEADY

ME469B/6/GI

37

The User Defined Scalars are used to solve additional equations eventually coupled to the mean flow equations Sometimes it is useful to define temporary field variables to store and retrieve values not directly available UDM are defined: Define User Defined User Defined Memory

ME469B/6/GI

38

19

I/O in UDF

User Defined Scalars and User Defined Memory are AUTOMATICALLY Stored in the Fluent Data files Additional I/O (from and to the Fluent Case and Data files) can be Accomplished using the macro DEFINE_RW_FILE

ME469B/6/GI

39

Detailed Programming

The macros introduced before are interpreted/compiled and attached to the various Fluent panels The detailed programming is based on additional macros that allow to loop on cells to retrieve field variables, etc. Loop Macros Geometry Macros Field Variable Macros Control Macros Arithmetic and Trigonometric Macros Before looking at the Macros, the Fluent Data structure in introduced

ME469B/6/GI 40

20

Data Structure

It is based on a hierarchy of structures Threads (zones) are collection of cells or faces Domain is a collections of threads

ME469B/6/GI

41

Threads

Every zone is associated to a single ID (available in the boundary conditions menu)

zone ID

Given the ID of a thread the pointer can be retrieved as:

Thread *tf = Lookup_Thread(domain, ID);

Given the thread pointer the ID of the zone can be retrieved as:

ID = THREAD_ID(thread);

ME469B/6/GI 42

21

Loop Macros

ME469B/6/GI

43

Cell-face connectivity

When looping on faces the surrounding cells can be accessed using the macros:

cell0_thread = F_C0_THREAD(face,thread) cell1_thread = F_C1_THREAD(face,thread) cell0_id = F_C0(face,thread) cell1_id = F_C1(face,thread)

cell0

face

cell1

When looping on cells adjacent faces and cells can be accessed using the macros:

for(nf=0;nf<C_NFACES(cell,thread);nf++) { face_id = C_FACE(cell,thread,nf); face_thread = C_FACE_THREAD(cell,thread,nf); }

ME469B/6/GI

44

22

Geometry Macros

ME469B/6/GI 45

ME469B/6/GI

46

23

ME469B/6/GI 47

Control Macros

ME469B/6/GI 48

24

Low-Re k-e model

Development of a custom turbulence model can be accomplished using the UDFs. k-e model with damping functions formulation:

Transport Equations

ME469B/6/GI

49

Eddy Viscosity P= S=

Damping functions

ME469B/6/GI

50

25

DEFINE_SOURCE(k_source, thread, eqn) DEFINE_SOURCE(d_source, thread, eqn) DEFINE_PROPERTY(ke_diffusivity, domain) DEFINE_PROFILE(wall_d_bc, domain) DEFINE_ADJUST(turb_adjust, domain)

ME469B/6/GI

51

Density Molecular viscosity Eddy viscosity Strain Rate Magnitude Wall distance

ME469B/6/GI

52

26

UDF Header

#include "udf.h" /* Turbulence model constants */ #define C_MU 0.09 #define SIG_TKE 1.0 #define SIG_TDR 1.3 #define C1_D 1.44 #define C2_D 1.92 /* User-defined scalars */ enum { TKE, TDR, N_REQUIRED_UDS };

ME469B/6/GI

53

Damping Functions

These are defined on a cell-by-cell basis

/* Reynolds number definitions */ real Re_y(cell_t c, Thread *t) { return C_R(c,t)*sqrt(C_UDSI(c,t,TKE))*C_WALL_DIST(c,t)/C_MU_L(c,t);} real Re_t(cell_t c, Thread *t) { return C_R(c,t)*SQR(C_UDSI(c,t,TKE))/C_MU_L(c,t)/C_UDSI(c,t,TDR);} /* Damping Functions */ real f_mu(cell_t c, Thread *t) { return tanh(0.008*Re_y(c,t))*(1.+4/pow(Re_t(c,t),0.75));} real f_1(cell_t c, Thread *t) { return 1.;} real f_2(cell_t c, Thread *t) { return (1.-2/9*exp(-Re_t(c,t)*Re_t(c,t)/36))*(1.-exp(-Re_y(c,t)/12));}

ME469B/6/GI

54

27

The production term in the k equation is: e is obtained from the definition of the eddy viscosity to increase the coupling between the equations and to define an implicit term

DEFINE_SOURCE(k_source, c, t, dS, eqn) { real G_k; G_k = C_MU_T(c,t)*SQR(Strainrate_Mag(c,t)); dS[eqn] = -2.*C_R(c,t)*C_R(c,t)*C_MU*f_mu(c,t)*C_UDSI(c,t,TKE)/C_MU_T(c,t); return G_k - C_R(c,t)*C_R(c,t)*C_MU*f_mu(c,t)*SQR(C_UDSI(c,t,TKE))/C_MU_T(c,t); }

ME469B/6/GI

55

The production term in the e equation is: It contains already both k and e. No need for manipulations!

DEFINE_SOURCE(d_source, c, t, dS, eqn) { real G_k; G_k = C_MU_T(c,t)*SQR(Strainrate_Mag(c,t)); dS[eqn] = C1_D*f_1(c,t)*G_k/C_UDSI(c,t,TKE) - 2.*C2_D*f_2(c,t)*C_R(c,t)*C_UDSI(c,t,TDR)/C_UDSI(c,t,TKE); return C1_D*f_1(c,t)*G_k*C_UDSI(c,t,TDR)/C_UDSI(c,t,TKE) - C2_D*f_2(c,t)*C_R(c,t)*SQR(C_UDSI(c,t,TDR))/C_UDSI(c,t,TKE); }

ME469B/6/GI

56

28

Diffusivity

The diffusion terms in the scalar equations are set-up together

DEFINE_DIFFUSIVITY(ke_diffusivity, c, t, eqn) { real diff; real mu = C_MU_L(c,t); real mu_t = C_R(c,t)*C_MU*f_mu(c,t)*SQR(C_UDSI(c,t,TKE))/C_UDSI(c,t,TDR); switch (eqn) { case TKE: diff = mu_t/SIG_TKE + mu; break; case TDR: diff = mu_t/SIG_TDR + mu; break; default: diff = mu_t + mu; } return diff; }

ME469B/6/GI

57

Eddy Viscosity

The eddy viscosity is set in the adjust routine (called at the beginning of each Iteration) and it is used in the mean flow and in the scalar equations

DEFINE_ADJUST(turb_adjust, domain) { Thread *t; cell_t c; /* Set the turbulent viscosity */ thread_loop_c (t, domain) if (FLUID_THREAD_P(t)) { begin_c_loop(c,t) { C_MU_T(c,t) = C_R(c,t)*C_MU*f_mu(c,t)*SQR(C_UDSI(c,t,TKE))/C_UDSI(c,t,TDR); } end_c_loop(c,t) } }

ME469B/6/GI

58

29

Only the boundary condition for e is complicated because it requires the value of the derivative of k (the square root of k)

DEFINE_PROFILE(wall_d_bc, t, position) { face_t f; cell_t c0; Thread *t0 = t->t0; /* t0 is cell thread */ real xw[ND_ND], xc[ND_ND], dx[ND_ND], rootk, dy, drootkdy;

The derivative is rootk/dy begin_f_loop(f,t) { rootk is the sqrt of k in c0 = F_C0(f,t); the adjacent cell center rootk = sqrt(MAX(C_UDSI(c0,t0,TKE), 0.)); dy is the distance between F_CENTROID(xw,f,t); cell and face center C_CENTROID(xc,c0,t0); NV_VV(dx, =, xc, -, xw); dy = ND_MAG(dx[0], dx[1], dx[2]); drootkdy = rootk/dy; F_PROFILE(f,t,position) = 2.*C_MU_L(c0,t0)/C_R(c0,t0)*drootkdy*drootkdy; } end_f_loop(f,t)

} ME469B/6/GI 59

Set-Up a case using the standard k-e Define two scalars (TKE, TDR) Compile and Attach the UDFs Deactivate the Equations for k and e Initialize and solve the RANS + TKE and TDR

ME469B/6/GI

60

30

Source terms

Boundary conditions

ME469B/6/GI

61

ME469B/6/GI

62

31

The convergence is for the mean flow + the two scalars (turbulent quantities deactivated!)

For postprocessing purposes the UDS have to be used instead of turbulent quantities

ME469B/6/GI 63

Additional Information

Many additional macros are available to implement different physical models combustion models particles-based models . It is formally possible to develop additional numerical methods flux discretizations variable reconstruction and clipping . Information are available in the FLUENT UDF manual (class web site)

ME469B/6/GI

64

32

CFX

CFX (v4) is a structured code; the data structure is much simpler because the field variables are accessed directly. It uses 1D arrays where the quantities are stored in succession CFX UDFs are written in FORTRAN For example: U(I,J,K) U(IJK) where IJK = (K-1)*NI*NJ+(J-1)*NI There are no macros, but examples of subroutines to perform the customization USRBC USRSRC USRDIF .

ME469B/6/GI 65

Star-CD

StarCD is an unstructured code similar to Fluent in term of data organization But similar to CFX for the organization of the UDF. StarCD has threads (as Fluent) and the UDF work normally on a cell-by-cell basis StarCD UDFs are written in FORTRAN There are no macros, but examples of subroutines to perform the customization BCDEFW SORSCA DIFFUS .

ME469B/6/GI

66

33

- Introduction to Pro_CUploaded byappleapps
- C Programming Foundation LevelUploaded byMuhammad Zaheer Khalil
- C_GUI_Programming.pdfUploaded byAlcides Acevedo
- Btech SyllabusUploaded byKishor Kumar
- C Interview QuestionsUploaded bySunil Subramanya
- GSM Adaptive Multi-Rate Coding.pdfUploaded byWANKHAMA
- A Simple Makefile TutorialUploaded byShuyu Yang
- HCL Placement PapersUploaded bysivasubramani14
- complianceUploaded byBas Ramu
- Principles of Programming Languages Lecture Notes Unit 1Uploaded byLaraibZafarKhan
- C Programming Session 07Uploaded byJASPER WESSLY
- C ArrayUploaded byarvind
- Dg Computer AppsUploaded bymurugeshseethapathy9882
- MakeUploaded byoundhakar
- Programs of CUploaded byshera_wala
- 71841400 Interview QuestionsUploaded byVenkataprasad Boddu
- Structures and UnionUploaded bysurendiran
- Sess-4Uploaded byAshish Srivastava
- paper_13Uploaded bykhabiran
- B.a., B.sc., B.com. Part II Subject - Computer ApplicationUploaded byKAMLESH BANSAL
- June 2010Uploaded byDilpreet Sachdeva
- New Microsoft Office Word DocumentUploaded byShashikumar Pathi
- Dark corners and pitfalls of C++ - CodeProjectUploaded bygfgomes
- Arrays.pptUploaded byAnjali Naidu
- Mr Masitara..CUITUploaded byAsprilla Mangombe
- Vol2 apgUploaded byRoxana Sandu
- c for Small Scale ApplnsUploaded bysjo05
- C - Language by PrashanthUploaded byPrashanth
- Unit - 2 Final ECE ESUploaded byVivek Kutty
- Chapter 2 C Programming BasicsUploaded bykathirdcn

- Java TutorialUploaded bymonighos
- GoLang_sheetSheet.pdfUploaded bySam
- Algorithms in Java-Euclids AlgorithmUploaded byYasir Qureshi
- Arrays Tutorial (C#)Uploaded byAbhishek Tripathi
- TCL Training Verdi 201107Uploaded byRikki Agar
- Basic Scripting and InteractivityUploaded byPrashant Pandey
- TypescriptUploaded byBradley Mitchell
- Computer Aided Design and Manufacturing (Final Submission)Uploaded byMomoh Osazele
- Manual Basic X11Uploaded byhrimages
- OOP-C pulseUploaded byNikhil Surani
- Introduction to C++Uploaded bySyed Zulqadar Hassan
- ECER10Uploaded bykaran_19856
- Part IIUploaded byLeng Sovannarith
- ArrayList _ Java Examples - Java Program Sample Source CodeUploaded byAkhil Singh
- bpj lesson 18Uploaded byapi-308024418
- mcs011b3Uploaded byrkthbd5845
- Perl TutorialUploaded byAjit Teli
- CRS ApplicationShellASHUploaded byMrFlibble
- Manual U-touch XLOGIC.pdfUploaded byJuan Carlos Cosme
- Report - JatinUploaded byJatin Sharma
- Core Java Book.docxUploaded byraghu84taduri
- Dac Eandc Qb Question Bank Php QuesUploaded bynisha sharma
- Zephir PHP Extension Tutorial DocumentationUploaded byRomi Nur Ismanto
- PCREUploaded byDocumentation Junkie
- NXC_GuideUploaded byjvillena4839
- About Preference Variables.helpUploaded byocnogueira
- Misra c 2012 ComplianceUploaded bykaesarx
- 50881563-hp-javaUploaded bySahithi Naraparaju
- GandJ_1998_Ch2Uploaded byByron Alleman
- Matlab FrequentlyUploaded byKarthik Sharma