CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   FLUENT (https://www.cfd-online.com/Forums/fluent/)
-   -   Urgent! UDF error "implicit declaration of function" (https://www.cfd-online.com/Forums/fluent/77257-urgent-udf-error-implicit-declaration-function.html)

ivanbuz June 17, 2010 16:54

Urgent! UDF error "implicit declaration of function"
 
Urgent, will wait online for answers!

After compiling the following UDF, I see the error message "inlet_u.c:39: warning: implicit declaration of function erf". And the simulation crash if I continue using this UDF.

What is the reason? and How can I solve it? Thanks!


/* UDF for specifying a transient inlet velocity profile boundary condition */

#include "udf.h"
#include "math.h"
#define PI 4.*atan(1.)
#define RT 0.00183
real VM=21.911;
real VNin=0.01;

/**************** x velocity ****************/
DEFINE_PROFILE(v_x, thread, index)
{

face_t f;
real t,dt,u;
real D1,D2,D3,D4,D5,D6,D7;
real G1,G2,G3;

/* wind gust model parameters */
D1=VM*700;
D2=7/(3*RT);
D3=1;
D4=3/(3*RT);
D5=0.15;
D6=7/(10*RT);
D7=2*PI/(RT/10);

/* get flow time */
t = CURRENT_TIME;

/* u = X Velocity */
if (t<=VNin*RT)
{ u = VM;}
else
{ /* get dt */
dt = t-VNin*RT;
/* wind gust model */
G1=D1*dt*exp(-D2*dt);
G2=D3*erf(D4*dt);
G3=D5*exp(-D6*dt)*sin(D7*dt);
/* get u */
u = VM+G1+G2+G3;}

/* assign X velocity */
begin_f_loop(f, thread)
{ F_PROFILE(f, thread, index) = u; }
end_f_loop(f, thread)

}

ivanbuz June 17, 2010 16:57

The only problem is the function erf. But I have included math.h, anything else needs to be done? Or math.h is NOT the right header file to include if I want to use function erf?

erf is error function.

DoHander June 17, 2010 17:24

I suppose you are on a Windows system ? If yes the erf function is not implemented in math.h :) . So basically you will need to implement a custom version of erf in your UDF function.

If you are on Linux erf should be already defined in math.h so you need to search for the error in a different place.

Do

ivanbuz June 17, 2010 17:30

Thank you so much for replying.

I run Fluent on Linux. I searched the src folder (it contains the udf.h file) for the file math.h and did NOT find it.

If I have to implement a custom version of erf, how to do it?

I checked the UDF manual, it says "C compilers include a library of standard mathematical and I/O functions", but it does not say what if I want to use a function like erf.

DoHander June 17, 2010 17:35

I would recommend you to use a good book like:

http://books.google.ca/books?id=1aAO...page&q&f=false

for understanding the theory (erf is not so easy to implement in C). BTW you can not use the code from the book because it is very C++ (template classes and so on) and Fluent won't accept it, but probably you can modify the code ...

Do

DoHander June 17, 2010 17:37

Hey,

try the same code but with:

#include <math.h>

instead of:

#include "math.h"

Let me know if this has solved your problem.

Do

DoHander June 17, 2010 17:39

/* UDF for specifying a transient inlet velocity profile boundary condition */

#include "udf.h"
#include <math.h>
#define PI 4.*atan(1.)
#define RT 0.00183
real VM=21.911;
real VNin=0.01;

/**************** x velocity ****************/
DEFINE_PROFILE(v_x, thread, index)
{

face_t f;
real t,dt,u;
real D1,D2,D3,D4,D5,D6,D7;
real G1,G2,G3;

/* wind gust model parameters */
D1=VM*700;
D2=7/(3*RT);
D3=1;
D4=3/(3*RT);
D5=0.15;
D6=7/(10*RT);
D7=2*PI/(RT/10);

/* get flow time */
t = CURRENT_TIME;

/* u = X Velocity */
if (t<=VNin*RT)
{ u = VM;}
else
{ /* get dt */
dt = t-VNin*RT;
/* wind gust model */
G1=D1*dt*exp(-D2*dt);
G2=D3*erf(D4*dt);
G3=D5*exp(-D6*dt)*sin(D7*dt);
/* get u */
u = VM+G1+G2+G3;}

/* assign X velocity */
begin_f_loop(f, thread)
{ F_PROFILE(f, thread, index) = u; }
end_f_loop(f, thread)

}

ivanbuz June 17, 2010 17:39

Is it possible that a function libarary containing erf is NOT installed so I can NOT use erf?

ivanbuz June 17, 2010 17:43

I tried #include <math.h> with no luck. got the same error message

DoHander June 17, 2010 17:46

It depends of your Linux system, but yes it is possible to not have a C compiler installed.

What you can do is to give a search on all your system after math.h (probably it is in /usr/... but better check all), once you find math.h you can check directly if your particular system implements erf (on Ubuntu 9.04 I know the function is implemented).

If you want I can send you my messenger id (in a private message) and we will be able to talk faster.

Do

ivanbuz June 17, 2010 17:54

Thank you DoHander,

I am in a rush. And It just came to my mind that I can use (1-exp(-D4*t)) to replace erf function in the code, and it turns out that the velocity profile looks very similar to the one using erf. Engineer must make approximations all the time anyway. I will come back to solve this problem later.

:) thanks again.

Ivan

DoHander June 17, 2010 18:01

You use a very crude approximation for erf, you will get about 10^-1 error if you use (1-exp(x)) instead of the actual erf.

The good thing is that if you were capable to compile your code using the exp function you have math.h on your system :). The bad thing is that probably you don't have an erf implementation.

Do

DoHander June 17, 2010 18:02

Here is a slightly better approximation:

http://en.wikipedia.org/wiki/Error_function

Do

ivanbuz June 17, 2010 18:11

Great! that is indeed a better approximation with elementary functions. Thanks!!

Ivan


All times are GMT -4. The time now is 11:12.