CFD Online Discussion Forums

CFD Online Discussion Forums (http://www.cfd-online.com/Forums/)
-   Fluent UDF and Scheme Programming (http://www.cfd-online.com/Forums/fluent-udf/)
-   -   DEFINE_CG_MOTION vs DEFINE_GRID_MOTION (http://www.cfd-online.com/Forums/fluent-udf/106415-define_cg_motion-vs-define_grid_motion.html)

cfd seeker August 28, 2012 11:02

DEFINE_CG_MOTION vs DEFINE_GRID_MOTION
 
I am trying to simulate the flapping motion of simple wing using a UDF. I came across two types of UDF's for the said purpose. I would like to know the difference between the two types and which one is better if we want to simulate flapping/pitching/twisting/rolling motion of the wing. Thanks in advance

Regards

Amir August 30, 2012 01:46

Dear friend,

DEFINE_GRID_MOTION macro is more general than DEFINE_CG_MOTION. with DEFINE_CG_MOTION macro you can just define a rigid body motion but with DEFINE_GRID_MOTION macro you can describe the motion of each computational node.

Bests,

cfd seeker September 3, 2012 14:20

Thanks Amir for your reply. I am currently doing CFD analysis of flapping wing for which I have a UDF but there are some problems in that and its not working properly. I will share my UDF here in a day or two and will need your help to remove errors from it. Thanks

cfd seeker September 7, 2012 11:49

Hi guys I am back with my UDF :) I want to simulate flapping motion of wing. The wing goes up from the mean position, comes back to the mean position and completes the half cycle in opposite direction. Here instead of going up, it again goes down and keep on flapping between mean position and downward direction which ofcourse is wrong. I am not able to figure out the mistake in the UDF. Kindly I need the help to correct it. Thanks in advance

#include "udf.h"
DEFINE_GRID_MOTION(s1020, domain, dt, time, dtime)
{
Thread *tf = DT_THREAD (dt);
face_t f;
Node *v;
real NV_VEC(omega), NV_VEC(axis), NV_VEC(dp);
real NV_VEC(origin), NV_VEC(rvec);
real sign, terma, PI;
int n;
/* set deforming flag on adjacent cell zone */
SET_DEFORMING_THREAD_FLAG(THREAD_T0(tf));
terma = 26.178*time;
sign = -1 * sin (26.178 * time);
Message (" terma = %10.7f\n",terma);
Message (" time = %10.5f, sign = %10.5f \n", time, sign);
PI = 3.141592654;
/* if ( terma>PI )
{
sign = -sign;
}
*/
NV_S(omega, =, 0.0);
NV_D(axis, =, 1.0, 0.0, 0.0);
NV_D(origin, =, 0.5, 0.0, 0.0);
Message (" axis = %10.5f, origin = %10.5f \n", axis, origin);
begin_f_loop(f, tf)
{
f_node_loop(f, tf, n)
{
v = F_NODE(f, tf, n);
/* update node if z position is greater than 0.02 and that the current node */
/* has not been previously visited when looping through previous faces */
if (NODE_Z(v) > 0.02 && NODE_POS_NEED_UPDATE (v))
{
/* indicate that node position has been update so taht it's not */
/* updated more than once */
NODE_POS_UPDATED(v);
omega [0] = sign * pow (NODE_Z(v)/4, 0.5);
NV_VV(rvec, =, NODE_COORD(v), -, origin);
NV_CROSS(dp, omega, rvec);
NV_S(dp, *=, dtime);
if ( terma>(2.*PI) )
NV_V(NODE_COORD(v), -=, dp);
else
NV_V(NODE_COORD(v), +=, dp);
}
}
}
end_f_loop(f, tf);
}

cfd seeker September 7, 2012 11:52

1 Attachment(s)
I am attaching the txt file of the UDF in case any body wants to open it in C

Amir September 8, 2012 03:47

Hi,

If just the direction is the issue, I solved it for my previous UDFs in this manner:
Suppose you know the magnitude of omega, A and the period is T; so you can do something like this:


Code:

dd=T/4;
time1=time;
time=time1/dd;
time=time1-((int)time)*dd;
if (time1<=dd)
{
        dtheta=A*dtime
}
else
{
        time2=(time1-dd)/(2.0*dd);
        m=((int)time2)+1;
        dtheta=pow(-1,m)*A*dtime;
}

i.e., you need to generate this sequence: +1,-1,-1,+1,+1,-1,-1,....

Hope that help.

Bests,

cfd seeker September 8, 2012 10:11

Quote:

Originally Posted by Amir (Post 380832)
Hi,

If just the direction is the issue, I solved it for my previous UDFs in this manner:
Suppose you know the magnitude of omega, A and the period is T; so you can do something like this:


Code:

dd=T/4;
time1=time;
time=time1/dd;
time=time1-((int)time)*dd;
if (time1<=dd)
{
        dtheta=A*dtime
}
else
{
        time2=(time1-dd)/(2.0*dd);
        m=((int)time2)+1;
        dtheta=pow(-1,m)*A*dtime;
}

i.e., you need to generate this sequence: +1,-1,-1,+1,+1,-1,-1,....

Hope that help.

Bests,

Thanks Amir for your reply. I am just a beginner in UDF's and some one helped me to modify the UDF in the current shape. So i don't know much about UDF's and C, can you kindly suggest me where I am going wrong in my UDF and where to incorporate the lines suggested by you . Thanks

Amir September 8, 2012 17:11

Quote:

Originally Posted by cfd seeker (Post 380857)
Thanks Amir for your reply. I am just a beginner in UDF's and some one helped me to modify the UDF in the current shape. So i don't know much about UDF's and C, can you kindly suggest me where I am going wrong in my UDF and where to incorporate the lines suggested by you . Thanks

It seems the problem is here:
Code:

if ( terma>(2.*PI) )
NV_V(NODE_COORD(v), -=, dp);
else
NV_V(NODE_COORD(v), +=, dp);

These conditions are not appropriate to model your movement properly.
To correct your code, you have to change your code in this manner:
Code:

period=2.0*PI/(26.178);
if (time<=(period/4.0))
{
        NV_CROSS(dp, abs(omega), rvec);
}
else
{
        time2=(time-(period/4.0))/(period/2.0);
        m=((int)time2)+1;
        NV_CROSS(dp, abs(omega)*pow(-1,m), rvec);
}

Substitute it in proper lines. (It may need additional changes in its format)

P.S. : We're here to help you figure out and eliminate the issues by yourself not to give you the final answer.

Bests,

cfd seeker September 12, 2012 10:50

nclude "udf.h"
DEFINE_GRID_MOTION(s1020, domain, dt, time, dtime)
{
Thread *tf = DT_THREAD (dt);
face_t f;
Node *v;
real NV_VEC(omega), NV_VEC(axis), NV_VEC(dp);
real NV_VEC(origin), NV_VEC(rvec);
real sign, terma, PI,period;
int n,time2,m;
/* set deforming flag on adjacent cell zone */
SET_DEFORMING_THREAD_FLAG(THREAD_T0(tf));
terma = 26.178*time;
sign = -1 * sin (26.178 * time);
Message (" terma = %10.7f\n",terma);
Message (" time = %10.5f, sign = %10.5f \n", time, sign);
PI = 3.141592654;
/* if ( terma>PI )
{
sign = -sign;
}
*/
NV_S(omega, =, 0.0);
NV_D(axis, =, 1.0, 0.0, 0.0);
NV_D(origin, =, 0.5, 0.0, 0.0);
Message (" axis = %10.5f, origin = %10.5f \n", axis, origin);
begin_f_loop(f, tf)
{
f_node_loop(f, tf, n)
{
v = F_NODE(f, tf, n);
/* update node if z position is greater than 0.02 and that the current node */
/* has not been previously visited when looping through previous faces */

if (NODE_Z(v) > 0.02 && NODE_POS_NEED_UPDATE (v))
{
/* indicate that node position has been update so taht it's not */
/* updated more than once */

NODE_POS_UPDATED(v);
omega [0] = sign * pow (NODE_Z(v)/4, 0.5);




NV_VV(rvec, =, NODE_COORD(v), -, origin);

/*NV_CROSS(dp, omega, rvec);
NV_S(dp, *=, dtime);
if ( terma>(2.0*PI) )
NV_V(NODE_COORD(v), -=, dp);
else
NV_V(NODE_COORD(v), +=, dp);*/
period=2*PI/(26.178);

if (time<=(period/4.0))
{
NV_CROSS(dp,omega, rvec);
NV_V(NODE_COORD(v), +=, dp);
}
else
{
time2=(time-(period/4.0))/(period/2.0);
m=((int)time2)+1;

NV_S(omega,*=,pow(-1,m));

NV_CROSS(dp,omega), rvec);
NV_V(NODE_COORD(v), +=, dp);
}



}
}
}
end_f_loop(f, tf);
}

I have made the fallowing changes but UDF still not working, kindly take out sometime and have a look at it and suggest something.....

Amir September 12, 2012 15:26

int time2!!!

cfd seeker September 12, 2012 22:07

sorry Amir the mistake you pointed out was corrected in the original UDF but still its not working....I dont know what's happening in the changed version but the amplitude of the wing becomes so high that it becomes almost vertical and never comes back

Amir September 13, 2012 04:07

Quote:

Originally Posted by cfd seeker (Post 381507)
sorry Amir the mistake you pointed out was corrected in the original UDF but still its not working....I dont know what's happening in the changed version but the amplitude of the wing becomes so high that it becomes almost vertical and never comes back

Maybe it's better to write the amplitude or omega in file to see where to change the code.

Bests,

cfd seeker September 13, 2012 05:57

Quote:

Originally Posted by Amir (Post 381541)
Maybe it's better to write the amplitude or omega in file to see where to change the code.

Bests,

Sorry didn't get the point? please explain.....
Quote:

period=2.0*PI/(26.178); if (time<=(period/4.0)) { NV_CROSS(dp, abs(omega), rvec); } else { time2=(time-(period/4.0))/(period/2.0); m=((int)time2)+1; NV_CROSS(dp, abs(omega)*pow(-1,m), rvec); }
In the above commands I am not able to use "abs" with omega to get the absolute value of omega, every time I use the command "abs" fluent gives error....so is this thing causing problem or what else?

cfd seeker September 13, 2012 05:59

So instead of "abs(omega)" I am only using "omega"...is this thing causing problem or what else?

fchan September 13, 2012 10:15

Quote:

Originally Posted by cfd seeker (Post 381566)
So instead of "abs(omega)" I am only using "omega"...is this thing causing problem or what else?

Did you include math.h?

cfd seeker September 13, 2012 10:30

Quote:

Originally Posted by fchan (Post 381637)
Did you include math.h?

no i didn't....is it necessary?

fchan September 13, 2012 11:41

Quote:

Originally Posted by cfd seeker (Post 381641)
no i didn't....is it necessary?

Yes! Also, use fabs() instead of abs() for float/double variables.

Quick google: http://www-control.eng.cam.ac.uk/~pc...h_details.html

TL;DR: add #include <math.h>

Good luck.

cfd seeker September 13, 2012 21:47

Thanks fchan for your help. Have you seen my UDF? is everything ok except this?

cfd seeker September 14, 2012 01:52

Quote:

Originally Posted by fchan (Post 381654)
Yes! Also, use fabs() instead of abs() for float/double variables.

Quick google: http://www-control.eng.cam.ac.uk/~pc...h_details.html

TL;DR: add #include <math.h>

Good luck.

its not necessary to include <math.h> in UDF's. I read it today. It is necessary to include math.h IN "C" but its not necessary in UDF. Something else is wrong with my UDF.....

Amir September 14, 2012 09:24

Quote:

Originally Posted by cfd seeker (Post 381564)
Sorry didn't get the point? please explain.....

Store the value of omega/amplitude in a file in different times and check where the issue is.
Quote:

Originally Posted by cfd seeker (Post 381564)
In the above commands I am not able to use "abs" with omega to get the absolute value of omega, every time I use the command "abs" fluent gives error....so is this thing causing problem or what else?

That's the general idea and it may need changes in its format; I'm not sure, maybe using functions in NV commands are not allowed; store abs(...) in a temporary variable and use that in NV command instead.

Bests,


All times are GMT -4. The time now is 15:03.