# Fluent UDF to interpolate material properties from Temp and Pressure dependent table

 Register Blogs Members List Search Today's Posts Mark Forums Read August 10, 2016, 15:54 Fluent UDF to interpolate material properties from Temp and Pressure dependent table #1 New Member   Lauren Blanchette Join Date: Mar 2016 Posts: 9 Rep Power: 9 Hello, I am trying to write a UDF for Fluent to define the material properties through interpolation of a 2-D temperature and pressure dependent table. I am unsure if this is possible or if it is possible to write a subroutine to call to MATLAB for the interpolation. Any help is greatly appreciated. Thank you, Lauren   August 11, 2016, 06:11 #2 Senior Member   Aurelien Thinat Join Date: Jul 2010 Posts: 165 Rep Power: 14 Hi Lauren, Yes it's possible in full UDF. First you have to write a DEFINE_INIT or DEFINE_EXECUTE_ON_DEMAND to put in memory the density (or viscosity, etc...) matrix from an external file : / T0 T1 T2 (...) P0 rho(0,0) rho(1,0) rho(2,0) (...) P1 rho(0,1) rho(1,1) rho(2,1) (...) (...) Then you can define a function performing a bilinear interpolation (https://en.wikipedia.org/wiki/Bilinear_interpolation) . And finaly you can writea "DEFINE_PROPERTY" that will call this function knowing the cell temperature and pressure and return the cell density. Aurelien   August 11, 2016, 11:47 #3 New Member   Lauren Blanchette Join Date: Mar 2016 Posts: 9 Rep Power: 9 Hello Aurelien, Thank you for your response. I have never written a UDF before and am still trying to understand how they operate. The DEFINE_EXECUTE_ON_DEMAND will call to the external file in which has the property matrix? Does this need to be in any type of format (i.e. excel, cvs, txt.)? Then when this is executed in Fluent, it will save the matrix to later call to in another UDF in which has the bilinear interpolation function? Thank you again, Lauren   August 16, 2016, 15:58 #4 New Member   Lauren Blanchette Join Date: Mar 2016 Posts: 9 Rep Power: 9 Hello, I have started to write the DEFINE_EXECUTE_ON_DEMAND file to read in the tables, so far I am just using an example table that is a 3X5 matrix and I have saved this as a text document file. I can compile and load the file fine but when I try to execute this UDF, I receive an error stating 'r6002 floating point support not loaded' any help would be greatly appreciated!! Here is my current define on demand code: #include "udf.h" DEFINE_ON_DEMAND(exampledemand) { real data; int i; FILE *rfile; /* declare a FILE pointer */ rfile = fopen("example.txt", "r"); /* open file for reading */ Message("file opened\n"); /* loop to read file */ i=0; /* initialize before to loop */ for (i=0;i<15;i++) { fscanf (rfile,"%g",&data[i]); /* that supposes one value per line */ } fclose(rfile); Message("file closed\n"); } I have loaded and successfully executed other UDF for examples so I am unsure why this one is giving me this error Thanks! Lauren   August 17, 2016, 09:17 #5 Senior Member   Aurelien Thinat Join Date: Jul 2010 Posts: 165 Rep Power: 14 Hi Lauren, Try something like this : " float data_temp= 0.; fscanf(rfile, "%f",&data_temp); data[i] = data_temp; "   August 17, 2016, 09:30 #6 New Member   Lauren Blanchette Join Date: Mar 2016 Posts: 9 Rep Power: 9 Thank you for your reply! I successfully compiled the txt file I believe but now I am unsure how to define the temperature column and pressure row through the compiled file since I am unsure how to view what format it was saved as (matrix or vector?) to use within the bilinear interpolation, using " float data_temp= 0.; fscanf(rfile, "%f",&data_temp); data[i] = data_temp; " I believe this will make the matrix into a vector array, is this correct?   August 18, 2016, 05:29 #7 Senior Member   Aurelien Thinat Join Date: Jul 2010 Posts: 165 Rep Power: 14 Hi Lauren, data[Nc] is an array of 1 line and N colum (or 1 column and N lines). If you want to store a matrix you need to define data as : Code: `float data[Nc][Nl]` and to store something : Code: ```for i in 0 to Nc for j in 0 to Nl data[i][j] = myvalue; end end```   August 24, 2016, 17:03 #8 New Member   Lauren Blanchette Join Date: Mar 2016 Posts: 9 Rep Power: 9 Hello, So I believe I have been able to write the UDF for one of the properties (density). Now I am just using the same code to try and define the rest of the properties (Cp, Speed of Sound, Viscosity, and Thermal Conductivity) but when I go to upload another UDF it does not seem to let me do this. Is it possible to create more than one UDF to choose from? Also, I have tried it out with just Density defined through the UDF with all other properties constant and it seems to be running quite slow. I was wondering if anyone had any suggestions on how to make the process computationally faster? I am new at creates UDFs and writing in C so I might have taken the long way around. Aurelien, your process seemed to work in terms of created a Temperature and pressure dependent table and then using bilinear interpolation but the only question I have is if it is possible to use a define on demand UDF to upload the tables and then save them for further use? So that at every iteration the tables dont have to be re-read and then interpolated? Here is the code I am currently using: #include "udf.h" #include #include DEFINE_PROPERTY(cell_density, c, t) { int iP; int iT; int NP; int NT; int i; int n; int m; //int j; int k; double* P; double* T; double** H; double TT = C_T(c, t); double PP = C_P(c, t); double H11; double H12; double H21; double H22; double T1; double T2; double P1; double P2; double T2T1; double T2TT; double P2PP; double PPP1; double P2P1; double TTT1; double interpD; double R1; double R2; /*matrix /*Use double , you have floating numbers not int*/ FILE *file; file = fopen("MetastableDensity.txt", "r"); fscanf(file, "%i %i", &NP, &NT); fscanf(file, "%i", &k); P = malloc(NP * sizeof(double*)); T = malloc(NT * sizeof(double*)); H = malloc(NT * sizeof(double*)); for (iT = 0; iT < NT; ++iT) H[iT] = malloc(NT * sizeof(double)); for (iP = 0; iP < NP; iP++) { //Use lf format specifier, %c is for character if (!fscanf(file, "%lf", &P[iP])) break; //printf("%lf ", P[iP]); //Use lf format specifier, \n is for new line } //printf("\n"); for (iT = 0; iT < NT; iT++) { if (!fscanf(file, "%lf", &T[iT])) break; for (iP = 0; iP < NP; iP++) { if (!fscanf(file, "%lf", &H[iT][iP])) break; //printf("%lf ", H[iT][iP]); } //printf("\n"); //printf("%lf ", T[iT]); } //printf("\n"); //printf("\n %i \n", NP); //printf("\n %i \n", NT); //printf("%lf \n", T); //printf("%lf \n", H[(NT - 1)][(NP - 1)]); if (TT < T) { printf("error - low temp"); } for (iT = 0; iT < NT; iT++) { n = 0 + iT; if (TT < T[iT]) break; } printf("\n %i", n); printf("\n %lf \n", T[n]); for (iP = 0; iP < NP; iP++) { m = 0 + iP; if (PP < P[iP]) break; } //printf("\n %i", m); //printf("\n %lf \n", P[m]); //printf("\n %lf", H[n][m]); T2 = T[n - 1]; T1 = T[n]; P2 = P[m - 1]; P1 = P[m]; H11 = H[n - 1][m - 1]; H12 = H[n - 1][m]; H21 = H[n][m - 1]; H22 = H[n][m]; T2T1 = T2 - T1; P2P1 = P2 - P1; T2TT = T2 - TT; P2PP = P2 - PP; PPP1 = PP - P1; TTT1 = TT - T1; //printf("\n %lf", TTT1); R1 = (T2TT / T2T1) * H11 + (TTT1 / T2T1) * H21; R2 = (T2TT / T2T1) * H12 + (TTT1 / T2T1) * H22; interpD = (P2PP / P2P1) * R1 + (PPP1 / P2P1) * R2; return interpD; fclose(file); } Thank you and I appreciate any feedback! Lauren   August 25, 2016, 07:16 #9 Senior Member   Aurelien Thinat Join Date: Jul 2010 Posts: 165 Rep Power: 14 Hi Lauren, Of course it is possible. In the header of your UDF, you can define global variables : Code: ```#include "udf.h" #include #include /* global variables */ static int my_global_integer = 18; DEFINE_PROPERTY(cell_density, c, t) { /* local variables */ int my_local_integer ; my_local_integer = my_global_integer; (...) }``` This way, you can define global tables, initialize them with an execute on demand function, and use them in the define_property function. _____________ For the other question, you can't use several udf files without a header. But you can just write several define_property functions inside 1 file, compile it, and hook all the functions in your model. Aurelien holzkiste likes this.   August 25, 2016, 09:14 #10 New Member   Lauren Blanchette Join Date: Mar 2016 Posts: 9 Rep Power: 9 Thank you for your reply. I will try this technique out. I have to first figure out another dilemma. Is there a way to make specific heat dependent on pressure as well? I believe the DEFINE_SPECIFIC_HEAT option does not allow it since you can't use cell location to get pressure measurement but I didn't know if anyone has figured out how to get around this?   August 25, 2016, 09:27 #11 Senior Member   Aurelien Thinat Join Date: Jul 2010 Posts: 165 Rep Power: 14 Well it's exact that the Cp is not easy to manipulate. Take a look at the section "8.2.6. User-Defined Real Gas Models (UDRGM)" of the ANSYS Fluent UDF guide. You should be able to properly define your fluid this way, but I have never tried this out.   March 14, 2017, 10:55 #12
New Member

Twan Verweij
Join Date: Feb 2012
Location: Rotterdam, the Netherlands
Posts: 1
Rep Power: 0 Quote:
 Originally Posted by Aurelien Thinat Hi Lauren, Yes it's possible in full UDF. First you have to write a DEFINE_INIT or DEFINE_EXECUTE_ON_DEMAND to put in memory the density (or viscosity, etc...) matrix from an external file : / T0 T1 T2 (...) P0 rho(0,0) rho(1,0) rho(2,0) (...) P1 rho(0,1) rho(1,1) rho(2,1) (...) (...) Then you can define a function performing a bilinear interpolation (https://en.wikipedia.org/wiki/Bilinear_interpolation) . And finaly you can writea "DEFINE_PROPERTY" that will call this function knowing the cell temperature and pressure and return the cell density. Aurelien
Dear Aurelien,

Very interesting comment for us CFX-users who have been able to use RGP-property look-up tables and are looking for something similar in Fluent.
I have a question though with which you might be able to help. Is there a fluent memory structure (like in CFX) to save the data globally at initialisation or does something like that have to be included into a UDF library?

I am guessing the latter is most likely. Let's assume serial solvers for the moment, I would like to try the following:
1. write a udf-script to initialise the data from an external database and store that in a udf-library (~100MB)
2. use subroutines to access the library, apply bilinear interpolation (p-T dependence) and send the property out as a fluent-RGP set for each cell for each timestep.

It is a little hard to figure out if this is possible in fluent, i.e. if udf can be used both as a "database" (initialized at the start) and as the database-interface with the fluid-domain.
The thing I'm trying to avoid here is to load the database at every timestep.
Any thoughts?

Thanks,
Twan   March 20, 2017, 17:49 write udf #13 New Member   fatma badji Join Date: Jan 2017 Posts: 3 Rep Power: 8 hello i want to write UDF , i have idea who can i write it but my probleme is in witch programme i will write my function can i use fortrant ?   June 6, 2019, 06:39 #14 Member   Join Date: Jun 2017 Posts: 39 Rep Power: 7 Does anyone experienced problems about thermodynamic consistency while operating such kind of interpolations?   June 21, 2021, 22:56 #15
New Member

wangyang
Join Date: Jun 2021
Posts: 3
Rep Power: 3 Quote:
 Originally Posted by lablan Hello, So I believe I have been able to write the UDF for one of the properties (density). Now I am just using the same code to try and define the rest of the properties (Cp, Speed of Sound, Viscosity, and Thermal Conductivity) but when I go to upload another UDF it does not seem to let me do this. Is it possible to create more than one UDF to choose from? Also, I have tried it out with just Density defined through the UDF with all other properties constant and it seems to be running quite slow. I was wondering if anyone had any suggestions on how to make the process computationally faster? I am new at creates UDFs and writing in C so I might have taken the long way around. Aurelien, your process seemed to work in terms of created a Temperature and pressure dependent table and then using bilinear interpolation but the only question I have is if it is possible to use a define on demand UDF to upload the tables and then save them for further use? So that at every iteration the tables dont have to be re-read and then interpolated? Here is the code I am currently using: #include "udf.h" #include #include DEFINE_PROPERTY(cell_density, c, t) { int iP; int iT; int NP; int NT; int i; int n; int m; //int j; int k; double* P; double* T; double** H; double TT = C_T(c, t); double PP = C_P(c, t); double H11; double H12; double H21; double H22; double T1; double T2; double P1; double P2; double T2T1; double T2TT; double P2PP; double PPP1; double P2P1; double TTT1; double interpD; double R1; double R2; /*matrix /*Use double , you have floating numbers not int*/ FILE *file; file = fopen("MetastableDensity.txt", "r"); fscanf(file, "%i %i", &NP, &NT); fscanf(file, "%i", &k); P = malloc(NP * sizeof(double*)); T = malloc(NT * sizeof(double*)); H = malloc(NT * sizeof(double*)); for (iT = 0; iT < NT; ++iT) H[iT] = malloc(NT * sizeof(double)); for (iP = 0; iP < NP; iP++) { //Use lf format specifier, %c is for character if (!fscanf(file, "%lf", &P[iP])) break; //printf("%lf ", P[iP]); //Use lf format specifier, \n is for new line } //printf("\n"); for (iT = 0; iT < NT; iT++) { if (!fscanf(file, "%lf", &T[iT])) break; for (iP = 0; iP < NP; iP++) { if (!fscanf(file, "%lf", &H[iT][iP])) break; //printf("%lf ", H[iT][iP]); } //printf("\n"); //printf("%lf ", T[iT]); } //printf("\n"); //printf("\n %i \n", NP); //printf("\n %i \n", NT); //printf("%lf \n", T); //printf("%lf \n", H[(NT - 1)][(NP - 1)]); if (TT < T) { printf("error - low temp"); } for (iT = 0; iT < NT; iT++) { n = 0 + iT; if (TT < T[iT]) break; } printf("\n %i", n); printf("\n %lf \n", T[n]); for (iP = 0; iP < NP; iP++) { m = 0 + iP; if (PP < P[iP]) break; } //printf("\n %i", m); //printf("\n %lf \n", P[m]); //printf("\n %lf", H[n][m]); T2 = T[n - 1]; T1 = T[n]; P2 = P[m - 1]; P1 = P[m]; H11 = H[n - 1][m - 1]; H12 = H[n - 1][m]; H21 = H[n][m - 1]; H22 = H[n][m]; T2T1 = T2 - T1; P2P1 = P2 - P1; T2TT = T2 - TT; P2PP = P2 - PP; PPP1 = PP - P1; TTT1 = TT - T1; //printf("\n %lf", TTT1); R1 = (T2TT / T2T1) * H11 + (TTT1 / T2T1) * H21; R2 = (T2TT / T2T1) * H12 + (TTT1 / T2T1) * H22; interpD = (P2PP / P2P1) * R1 + (PPP1 / P2P1) * R2; return interpD; fclose(file); } Thank you and I appreciate any feedback! Lauren
This question is very helpful for us, but at the same time it is not easy to understand because the 'MetastableDensity.txt' is unknown. Therefore, I sincerely hope that you can shown me the content of the 'MetastableDensity.txt'. Thank you very much!  Thread Tools Search this Thread Show Printable Version Email this Page Search this Thread: Advanced Search Display Modes Linear Mode Switch to Hybrid Mode Switch to Threaded Mode Posting Rules You may not post new threads You may not post replies You may not post attachments You may not edit your posts BB code is On Smilies are On [IMG] code is On HTML code is OffTrackbacks are Off Pingbacks are On Refbacks are On Forum Rules Similar Threads Thread Thread Starter Forum Replies Last Post faizan_habib7 CFX 4 February 1, 2016 17:00 mahi FLUENT 0 November 10, 2008 03:53

All times are GMT -4. The time now is 01:21.