
[Sponsors] 
August 28, 2012, 11:02 
DEFINE_CG_MOTION vs DEFINE_GRID_MOTION

#1 
Senior Member
Join Date: Mar 2011
Location: Germany
Posts: 431
Rep Power: 13 
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 

August 30, 2012, 01:46 

#2 
Senior Member

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,
__________________
Amir 

September 3, 2012, 14:20 

#3 
Senior Member
Join Date: Mar 2011
Location: Germany
Posts: 431
Rep Power: 13 
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


September 7, 2012, 11:49 

#4 
Senior Member
Join Date: Mar 2011
Location: Germany
Posts: 431
Rep Power: 13 
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); } 

September 7, 2012, 11:52 

#5 
Senior Member
Join Date: Mar 2011
Location: Germany
Posts: 431
Rep Power: 13 
I am attaching the txt file of the UDF in case any body wants to open it in C


September 8, 2012, 03:47 

#6 
Senior Member

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=(time1dd)/(2.0*dd); m=((int)time2)+1; dtheta=pow(1,m)*A*dtime; } Hope that help. Bests,
__________________
Amir 

September 8, 2012, 10:11 

#7  
Senior Member
Join Date: Mar 2011
Location: Germany
Posts: 431
Rep Power: 13 
Quote:


September 8, 2012, 17:11 

#8  
Senior Member

Quote:
Code:
if ( terma>(2.*PI) ) NV_V(NODE_COORD(v), =, dp); else NV_V(NODE_COORD(v), +=, dp); 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); } P.S. : We're here to help you figure out and eliminate the issues by yourself not to give you the final answer. Bests,
__________________
Amir 

September 12, 2012, 10:50 

#9 
Senior Member
Join Date: Mar 2011
Location: Germany
Posts: 431
Rep Power: 13 
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..... 

September 12, 2012, 22:07 

#11 
Senior Member
Join Date: Mar 2011
Location: Germany
Posts: 431
Rep Power: 13 
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


September 13, 2012, 04:07 

#12  
Senior Member

Quote:
Bests,
__________________
Amir 

September 13, 2012, 05:57 

#13  
Senior Member
Join Date: Mar 2011
Location: Germany
Posts: 431
Rep Power: 13 
Quote:
Quote:


September 13, 2012, 05:59 

#14 
Senior Member
Join Date: Mar 2011
Location: Germany
Posts: 431
Rep Power: 13 
So instead of "abs(omega)" I am only using "omega"...is this thing causing problem or what else?


September 13, 2012, 10:15 

#15 
New Member
Frederik
Join Date: Apr 2010
Posts: 18
Rep Power: 8 

September 13, 2012, 10:30 

#16 
Senior Member
Join Date: Mar 2011
Location: Germany
Posts: 431
Rep Power: 13 

September 13, 2012, 11:41 

#17 
New Member
Frederik
Join Date: Apr 2010
Posts: 18
Rep Power: 8 
Yes! Also, use fabs() instead of abs() for float/double variables.
Quick google: http://wwwcontrol.eng.cam.ac.uk/~pc...h_details.html TL;DR: add #include <math.h> Good luck. 

September 13, 2012, 21:47 

#18 
Senior Member
Join Date: Mar 2011
Location: Germany
Posts: 431
Rep Power: 13 
Thanks fchan for your help. Have you seen my UDF? is everything ok except this?


September 14, 2012, 01:52 

#19  
Senior Member
Join Date: Mar 2011
Location: Germany
Posts: 431
Rep Power: 13 
Quote:


September 14, 2012, 09:24 

#20  
Senior Member

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

Thread Tools  
Display Modes  

