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

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); } 
1 Attachment(s)
I am attaching the txt file of the UDF in case any body wants to open it in C

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; Hope that help. Bests, 
Quote:

Quote:
Code:
if ( terma>(2.*PI) ) To correct your code, you have to change your code in this manner: Code:
period=2.0*PI/(26.178); P.S. : We're here to help you figure out and eliminate the issues by yourself not to give you the final answer. Bests, 
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..... 
int time2!!!

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

Quote:
Bests, 
Quote:
Quote:

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

Quote:

Quote:

Quote:
Quick google: http://wwwcontrol.eng.cam.ac.uk/~pc...h_details.html TL;DR: add #include <math.h> Good luck. 
Thanks fchan for your help. Have you seen my UDF? is everything ok except this?

Quote:

Quote:
Quote:
Bests, 
All times are GMT 4. The time now is 23:28. 