
[Sponsors] 
Viscosity UDF works when interpreted, Doesn't when compiled? 

LinkBack  Thread Tools  Search this Thread  Display Modes 
April 11, 2019, 07:33 
Viscosity UDF works when interpreted, Doesn't when compiled?

#1 
Member
Sebi
Join Date: Mar 2019
Posts: 49
Rep Power: 7 
Hi Again,
I am learning how to compile UDF's instead of just intrerpreting them. I have successfully compiled a UDF and am using it to define a Transient velocity inlet, and a Viscosity model. The compiled UDF works correctly for the velocity inlet, but the viscosity UDF returns a constant viscosity of mu=0.00476. The same UDF works properly when compiled, is there a difference in how they should be written? The Full UDF is below. /* CarreauYasuda Viscosity Model */ #include "udf.h" double muinf=0.00476; double mu0=0.0519; double lambda=0.438; double p=0.409; double n=0.191; DEFINE_PROPERTY(cell_viscosity,c,t) { real diff; real shear; real prod; real power; real cyvisco; diff=(mu0+muinf); prod=((lambda)*(C_STRAIN_RATE_MAG(c,t))); shear=(1+(pow(prod,p))); power=((n1)/(p)); cyvisco=((muinf)+(diff)*(pow(shear,power))); return cyvisco; } /* 2D Parabolic Transient Velocity Profile For Laminar Flow */ #include "udf.h" float a0 = 0.1564; float a1 = 0.03045; float b1 = 0.007764; float a2 = 0.0242; float b2 = 0.03948; float a3 = 0.01151; float b3 = 0.008163; float a4 = 0.009875; float b4 = 0.003343; float a5 = 0.01003; float b5 = 0.002862; float a6 = 0.006133; float b6 = 0.0007519; float a7 = 0.001413; float b7 = 0.001232; float a8 = 0.003654; float b8 = 0.000137; float w = 7.858; DEFINE_PROFILE(LaminarCoronaryVelocity, thread, position) { real x[ND_ND]; real y; real z; real t = CURRENT_TIME; face_t f; begin_f_loop(f, thread) { F_CENTROID(x,f,thread); y = x[1]; z = x[2]; F_PROFILE(f, thread, position) = (2*(a0 + a1*cos(t*w) + b1*sin(t*w) + a2*cos(2*t*w) + b2*sin(2*t*w) + a3*cos(3*t*w) + b3*sin(3*t*w) + a4*cos(4*t*w) + b4*sin(4*t*w) + a5*cos(5*t*w) + b5*sin(5*t*w) + a6*cos(6*t*w) + b6*sin(6*t*w) + a7*cos(7*t*w) + b7*sin(7*t*w) + a8*cos(8*t*w) + b8*sin(8*t*w))*(1(y*y+z*z)/(0.00000196))); } end_f_loop(f, thread) } 

April 11, 2019, 09:05 

#2 
Senior Member
Join Date: Nov 2013
Posts: 1,965
Rep Power: 26 
You use pow, which is not a standard c function, but is included in the math library.
To include this in a compiled function, use: Code:
#include <math.h> Please let me know if it works, because I'm not 100% sure if this is the reason. 

April 11, 2019, 09:17 

#3  
Member
Sebi
Join Date: Mar 2019
Posts: 49
Rep Power: 7 
Quote:
If I make the function much simpler and just have visco=0.05*shear, the viscosity does vary, but when I include the other things it seems to mess up. I am compiling this and running on linux if that makes any difference. 

April 11, 2019, 10:01 

#4 
Senior Member
Join Date: Nov 2013
Posts: 1,965
Rep Power: 26 
OK, that was a tough one...
Your problem is that you were using global variables. Don't use them, except when necessary. Here, they are not necessary at all. Your global variable p is used in one of the templates that Fluent uses. Don't ask me which. But I could see that the effect was that in your function cell_viscosity, the value of p was zero. (In unix, in Windows the value was 0.409.) So, don't define your variables globally if you only use them locally: Code:
/* CarreauYasuda Viscosity Model */ #include "udf.h" DEFINE_PROPERTY(cell_viscosity,c,t) { double muinf=0.00476; double mu0=0.0519; double lambda=0.438; double p=0.409; double n=0.191; real diff; real shear; real prod; real power; real cyvisco; diff=(mu0+muinf); prod=((lambda)*(C_STRAIN_RATE_MAG(c,t))); shear=(1+(pow(prod,p))); power=((n1)/(p)); cyvisco=((muinf)+(diff)*(pow(shear,power))); return cyvisco; } /* 2D Parabolic Transient Velocity Profile For Laminar Flow */ DEFINE_PROFILE(LaminarCoronaryVelocity, thread, position) { float a0 = 0.1564; float a1 = 0.03045; float b1 = 0.007764; float a2 = 0.0242; float b2 = 0.03948; float a3 = 0.01151; float b3 = 0.008163; float a4 = 0.009875; float b4 = 0.003343; float a5 = 0.01003; float b5 = 0.002862; float a6 = 0.006133; float b6 = 0.0007519; float a7 = 0.001413; float b7 = 0.001232; float a8 = 0.003654; float b8 = 0.000137; float w = 7.858; real x[ND_ND]; real y; real z; real t = CURRENT_TIME; face_t f; begin_f_loop(f, thread) { F_CENTROID(x,f,thread); y = x[1]; z = x[2]; F_PROFILE(f, thread, position) = (2*(a0 + a1*cos(t*w) + b1*sin(t*w) + a2*cos(2*t*w) + b2*sin(2*t*w) + a3*cos(3*t*w) + b3*sin(3*t*w) + a4*cos(4*t*w) + b4*sin(4*t*w) + a5*cos(5*t*w) + b5*sin(5*t*w) + a6*cos(6*t*w) + b6*sin(6*t*w) + a7*cos(7*t*w) + b7*sin(7*t*w) + a8*cos(8*t*w) + b8*sin(8*t*w))*(1(y*y+z*z)/(0.00000196))); } end_f_loop(f, thread) } (By the way: you should only include udf.h once.) 

April 11, 2019, 10:06 

#5 
Member
Sebi
Join Date: Mar 2019
Posts: 49
Rep Power: 7 
YES
You sir are a God amongst men! Thank you so much for going to the trouble of finding that out. Now back to the original problem I was trying to solve in the first place about DPM position macros........ 

Tags 
compile, udf 
Thread Tools  Search this Thread 
Display Modes  


Similar Threads  
Thread  Thread Starter  Forum  Replies  Last Post 
Viscosity UDF Gives different Results to fluent Model?  bloodflow  Fluent UDF and Scheme Programming  1  March 28, 2019 21:11 
Problem with divergence  TDK  FLUENT  13  December 14, 2018 07:00 
WILLING TO PAY/ FREELANCER REQUIRED / small UDF coding force loads over body / 6DOF  acasas  CFD Freelancers  1  January 23, 2015 08:26 
I want to use pressure of 1 face in udf that compiled on other face  iman_1844  Fluent UDF and Scheme Programming  3  June 10, 2010 13:55 
error of Interpreted udf  Zhang Junmei  FLUENT  6  December 12, 2001 09:03 