Fluent C语言UDF问题:每时间步读取初始坐标避免翼型过度旋转
翼型节点旋转Fluent UDF过度旋转问题修复方案
问题根源
你当前代码每时间步读取的是上一步已变形的实时节点坐标作为旋转基准,旋转量会逐时间步叠加,最终导致翼型过度旋转。
修改核心点
- 基准坐标替换:使用Fluent UDF内置的
NODE_ORIGINAL_X、NODE_ORIGINAL_Y宏读取网格初始坐标,作为每步旋转的固定基准 - 补全坐标更新:旋转后X、Y坐标均会变化,原代码仅更新Y坐标,需要同步更新X坐标
- 冗余逻辑合并:两段仅theta取值不同的旋转计算逻辑可合并,降低代码冗余
修改后完整代码
#include "udf.h" #define FTT 0.4 #define chord 1.00000 /*upper surface*/ DEFINE_GRID_MOTION(Up, domain, dt, time, dtime) { Thread *tf = DT_THREAD (dt); face_t f; Node *node_p; real x,y,theta,x_s,y_s,T_max,Tmorph,freq,omega,xuc,yuc, Rux,Ruy,rcux,rcuy; int n; freq = 0.2; omega = 2 * M_PI * freq; Tmorph= 0.0555555794; T_max = FTT+Tmorph; x_s = 0.25*chord; y_s = 0; SET_DEFORMING_THREAD_FLAG (THREAD_T0 (tf)); begin_f_loop (f, tf) { f_node_loop (f, tf, n) { node_p = F_NODE(f, tf, n); // 读取初始基准坐标,而非当前已变形坐标 x = NODE_ORIGINAL_X(node_p); y = NODE_ORIGINAL_Y(node_p); if (NODE_POS_NEED_UPDATE (node_p)) { NODE_POS_UPDATED (node_p); if (x < x_s) { // 先统一计算当前时间步的旋转角 if (CURRENT_TIME >= FTT && CURRENT_TIME <= T_max) { theta = omega * (CURRENT_TIME - FTT); } else if (CURRENT_TIME > T_max) { theta = omega * Tmorph; } else { // 未到变形时间,保持原始坐标 NODE_X(node_p) = x; NODE_Y(node_p) = y; continue; } // 统一执行旋转计算 xuc = x - x_s; yuc = y - y_s; Rux = ((xuc * cos(-theta)) + (yuc * sin(-theta))); Ruy = ((xuc * -sin(-theta)) + (yuc * cos(-theta))); rcux = Rux + x_s; rcuy = Ruy + y_s; // 同时更新X、Y坐标 NODE_X (node_p) = rcux; NODE_Y (node_p) = rcuy ; } } } } end_f_loop (f, tf); }
注意事项
如果你的计算场景中翼型除了旋转还有其他预变形,可将初始坐标存储到用户自定义标量(UDS)中,后续直接读取UDS值作为旋转基准即可,适配性更强。
内容的提问来源于stack exchange,提问作者Thomas Sprengeler
相关产品推荐
相关产品推荐

