声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3332|回复: 4

[UDF专题] 给流场以分布的柱坐标形式初场

[复制链接]
发表于 2010-10-29 10:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
本帖最后由 Rainyboy 于 2010-10-29 11:07 编辑

较早的一项工作,我已不从事这方面的工作,贴出来供大家参考吧。

在旋转机械的非定常计算中,往往希望指定一个合适的初场,这将有利于计算的收敛、甚至决定最终收敛的结果。

FLUENT的GUI不能提以供柱坐标表示的初始条件,导致初始化的整周叶片通道中,部分通道流场中有不应该出现的涡。

通过UDF可以完美的解决这个问题,代码如下:
  1. /************************************************************************/
  2. /* 初始化流场:给流场以分布的柱坐标形式初场 */
  3. /* 作者: 范 雨
  4. /* 创建时间: 2009.9.21
  5. /* 历次修改:
  6. /************************************************************************/


  7. #include "udf.h"
  8. #include <stdio.h>
  9. #include <math.h>




  10. //速度常量
  11. #define VELOCITY_R_DIRECTION 0.0
  12. #define VELOCITY_A_DIRECTION -146.0
  13. #define VELOCITY_Z_DIRECTION 167.0

  14. //定义圆周率
  15. #define PI 3.141592653

  16. //接近零的数
  17. #define NEAR_ZERO 1e-15

  18. //记录柱坐标系向量(或者点)的结构体
  19. struct _Vector_Rot
  20. {
  21.     real r;
  22.     real angle;
  23.     real z;
  24. };

  25. //记录直角坐标系向量(或者点)的结构体
  26. struct _Vector_XY
  27. {
  28.     real x;
  29.     real y;
  30.     real z;
  31. };

  32. //柱坐标系向量转直角坐标系
  33. struct _Vector_XY Rot_To_XY(struct _Vector_Rot RotPossition)
  34. {
  35.     struct _Vector_XY XYPossition;
  36.     XYPossition.x = RotPossition.r * cos(RotPossition.angle);
  37.     XYPossition.y = RotPossition.r * sin(RotPossition.angle);
  38.     XYPossition.z = RotPossition.z;
  39.     return XYPossition;
  40. }

  41. //直角坐标系向量转柱坐标系
  42. struct _Vector_Rot XY_To_Rot(struct _Vector_XY XYPossition)
  43. {
  44.     struct _Vector_Rot RotPossition;
  45.     RotPossition.r = pow(pow(XYPossition.x,2)+pow(XYPossition.y,2),0.5);
  46.     if (RotPossition.r > -1*NEAR_ZERO && RotPossition.r < NEAR_ZERO)
  47.     {
  48.         //原点
  49.         RotPossition.angle = 0;
  50.     }
  51.     else
  52.     {
  53.         //不是原点
  54.         if (XYPossition.y < NEAR_ZERO)
  55.         {
  56.             //第三、四象限
  57.             RotPossition.angle = 2* PI - acos(XYPossition.x/RotPossition.r) ;
  58.         }
  59.         else
  60.         {
  61.             //第一、二象限
  62.             RotPossition.angle = acos(XYPossition.x/RotPossition.r);
  63.         }
  64.     }
  65.     RotPossition.z = XYPossition.z;
  66.     return RotPossition;
  67. }

  68. //得到与当前向量(直角坐标)在同一Z位置垂直的单位向量(柱坐标)
  69. struct _Vector_Rot GetXYVector_CZ_CurrentXYVector(struct _Vector_XY CurrentXYVector)
  70. {
  71.     struct _Vector_Rot CurrentRotVector = XY_To_Rot(CurrentXYVector);
  72.     CurrentRotVector.angle += PI/2.0;
  73.     return CurrentRotVector;
  74. }

  75. //得到当前点(直角坐标)的切向速度(直角坐标)
  76. struct _Vector_XY GetRotVelocity_ByXYPossition(struct _Vector_XY XYPossition)
  77. {
  78.     struct _Vector_Rot CurrentRotVector = GetXYVector_CZ_CurrentXYVector(XYPossition);
  79.     CurrentRotVector.r = VELOCITY_A_DIRECTION;
  80.     return Rot_To_XY(CurrentRotVector);
  81. }
  82. //得到当前点(直角坐标)的径向速度(直角坐标)
  83. struct _Vector_XY GetRadixVeclocity_ByXYPossition(struct _Vector_XY XYPossition)
  84. {
  85.     struct _Vector_Rot CurrentRadixVector = XY_To_Rot(XYPossition);
  86.     CurrentRadixVector.r = VELOCITY_R_DIRECTION;
  87.     return Rot_To_XY(CurrentRadixVector);
  88. }

  89. //由点在直角坐标系的坐标得到其速度(直角坐标系表示)
  90. struct _Vector_XY GetXYVelocity_ByXYPossiontion(struct _Vector_XY XYPossition)
  91. {
  92.     struct _Vector_XY CurrentRadixVector_inXY = GetRadixVeclocity_ByXYPossition(XYPossition);
  93.     struct _Vector_XY CurrentRotVector_inXY = GetRotVelocity_ByXYPossition(XYPossition);
  94.     struct _Vector_XY CurrentTotalVector_inXY;
  95.     CurrentTotalVector_inXY.x = CurrentRadixVector_inXY.x + CurrentRotVector_inXY.x;
  96.     CurrentTotalVector_inXY.y = CurrentRadixVector_inXY.y + CurrentRotVector_inXY.y;
  97.     CurrentTotalVector_inXY.z = VELOCITY_Z_DIRECTION;
  98.     return CurrentTotalVector_inXY;
  99. }


  100. /************************************************************************/
  101. /* 在Fluent UDF 中的代码 */
  102. /************************************************************************/

  103. DEFINE_INIT(Further_Init,domain)
  104. {
  105.     FILE *fp;
  106.     cell_t Nod_cell;
  107.     Thread *pNod_Thread;
  108.     real CellPossition[ND_ND];

  109.     struct _Vector_XY sPossition;
  110.     struct _Vector_XY sVelocity;
  111.     fp = fopen("data.txt","w");
  112.     Message("/************************************************************************/\n");
  113.     Message("/* 初始化流场:给流场以分布的柱坐标形式初场 */\n");
  114.     Message("/* 作者: 范 雨 */\n");
  115.     Message("/* 创建时间: 2009.9.21 */\n");
  116.     Message("/* 测试编号: 3.4001 */\n");
  117.     Message("/************************************************************************/\n");
  118.     thread_loop_c(pNod_Thread,domain)
  119.     {
  120.         begin_c_loop_all(Nod_cell,pNod_Thread){
  121.         //得到坐标(直角)
  122.         C_CENTROID(CellPossition,Nod_cell,pNod_Thread);
  123.         fprintf(fp,"Cell Possition %f ,%f ,%f\n",CellPossition[0],CellPossition[1],CellPossition[2]);
  124.         sPossition.x = CellPossition[0];
  125.         sPossition.y = CellPossition[1];
  126.         sPossition.z = CellPossition[2];
  127.         //得到速度(直角)
  128.         sVelocity = GetXYVelocity_ByXYPossiontion(sPossition);
  129.         //设置速度(直角)
  130.         C_U(Nod_cell,pNod_Thread) = sVelocity.x;
  131.         C_V(Nod_cell,pNod_Thread) = sVelocity.y;
  132.         C_W(Nod_cell,pNod_Thread) = sVelocity.z;
  133.         fprintf(fp,"Velocity %f ,%f ,%f\n\n",sVelocity.x,sVelocity.y,sVelocity.z);
  134.         }end_c_loop_all(Nod_cell,pNod_Thread)
  135.     }
  136.     fclose(fp);
  137. }
复制代码


详细的流程为(附件即是此图,同Visio打开):
b_large_710P_3863000077772d13.jpg

用一个简单的圆筒流场示例,运行该代码后的速度矢量(为避免显示混乱,只显示了内外侧的速度矢量)为:
b_large_NgIM_0e330001e4062d13.jpg

InitWithUDF_DetailDesign.rar

117.94 KB, 下载次数: 19

评分

2

查看全部评分

回复
分享到:

使用道具 举报

发表于 2010-11-1 17:34 | 显示全部楼层
高人,下载学习一下
发表于 2011-1-18 05:15 | 显示全部楼层
为何下载不了啊
发表于 2011-2-15 10:56 | 显示全部楼层
 楼主| 发表于 2011-2-22 13:19 | 显示全部楼层
回复 3 # likgo 的帖子

附件就是那个流程图而已……当时是怕上传的图显示不清楚才作为附件的。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-29 00:01 , Processed in 0.081896 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表