写在前言,此文章本意用于学习过程中的自我回顾及参考记录,本文章内容主要来源于ANSYS FLUENT 官方帮助文档,网络资料及部分使用过程中自己的理解。由于鄙人涉世未深,学历低下,资质愚钝,内容若有不对之处,请大家批评指正。
6dof模型用于指定物体被动运动,DEFINE_SDOF_PROPERTIES可为求解器指定对象的六自由度属性 。包括质量及惯性张量 ,以及外力和力矩的性质。
DEFINE_SDOF_PROPERTIES (name, properties, dt, time, dtime)
| 变量名称 | 解释 |
|---|---|
| symbol name | udf名称 |
| real *properties | 定义指向六自由度属性数组的指针(该udf使用中没用过不太理解) |
| Dynamic_Thread *dt | 定义指向用户规定的“用于存储动网格属性 的”数据结构的指针(该udf使用中没用过不太理解) |
| real time | 当前时间 |
| real dtime | 时间步 |
| 返回值 | 空 |
|---|
DEFINE_SDOF_PROPERTIES有四个参数:name、properties、dt和dtime。用户可以指定udf名称,属性、dt和dtime是由ANSYS Fluent求解器传递给UDF 的变量。用户可以为传递给求解器的属性数组指针指定如下所示的任意6dof特性值:
SDOF_MASS /* 质量 kg */
SDOF_IXX, /* 转动惯量 kgm2 */
SDOF_IYY, /* 转动惯量 kg m2 */
SDOF_IZZ, /*转动惯量 kg m2 */
SDOF_IXY, /* 惯性积kg m2 */
SDOF_IXZ, /* 惯性积kg m2 */
SDOF_IYZ, /* 惯性积kg m2 */
SDOF_LOAD_LOCAL, /* boolean */ 不清楚干啥的,欢迎解答
SDOF_LOAD_F_X, /*外力N */
SDOF_LOAD_F_Y, /* 外力 N*/
SDOF_LOAD_F_Z, /* 外力N */
SDOF_LOAD_M_X, /* 外力矩N M */
SDOF_LOAD_M_Y, /* 外力矩N M*/
SDOF_LOAD_M_Z, /* 外力矩N M*/
SDOF_ZERO_TRANS_X, /* 约束X方向平移 */
SDOF_ZERO_TRANS_Y, /* 约束Y方向平移 */
SDOF_ZERO_TRANS_Z, /* 约束Z方向平移 */
SDOF_ZERO_ROT_X, /* 约束绕X轴转动 */
SDOF_ZERO_ROT_Y, /* 约束绕Y轴转动*/
SDOF_ZERO_ROT_Z, /* 约束绕Z轴转动 */
SDOF_SYMMETRY_X, /* 对称模型对称面法向向量*/没用过,理解不透
SDOF_SYMMETRY_Y, /* 对称模型对称面法向向量*/
SDOF_SYMMETRY_Z, /* 对称模型对称面法向向量 */
例:
#include "udf.h"
DEFINE_SDOF_PROPERTIES(delta_missile, prop, dt, time, dtime)
/* 指定6dof特性 */
{
prop[SDOF_MASS] = 907.185;
prop[SDOF_IXX] = 27.116;
prop[SDOF_IYY] = 488.094;
prop[SDOF_IZZ] = 488.094;
{
register real dfront = fabs (DT_CG (dt)[2] - (0.179832*DT_THETA (dt)[1]));
register real dback = fabs (DT_CG (dt)[2] + (0.329184*DT_THETA (dt)[1]));
/*定义实值dfront、dback,fabs函数取DT_CG重心z做表的绝对值,后面的DT_THETA(dt)[1]我认为是取得刚体y轴的方向矢量,但
如如此理解的话,0.179832*DT_THETA(dt)[1]应如何理解?翻阅了很多资料,都没有得到清楚的解释,此处暂放。如果有懂的大牛,欢迎讲解*/
if (dfront <= 0.100584)
{
prop[SDOF_LOAD_F_Z] = 10676.0;
prop[SDOF_LOAD_M_Y] = -1920.0;
}
if (dback <= 0.100584)
{
prop[SDOF_LOAD_F_Z] += 42703.0;
prop[SDOF_LOAD_M_Y] += 14057.0;
}
/*判断语句,指定的dfront和dback达到设定条件后,即施加外力、力矩 */
}
printf ("\ndelta_missile: updated 6DOF properties"); /*输出6dof运动轨迹 */
}
tips:1.6dof特性可通过udf指定,较新版本中也可通过gui界面指定,但gui界面指定灵活性较差。
2.6dof特性只能通过udf或gui界面中的一种指定,二者不可兼容。
3.6dof模型只需制定初始位置的刚体重心,刚体速度,刚体方位角,刚体角速度等,开始计算后刚体重心和方位角数据会由软件中自动追踪并更新。
讨论:1.一般情况下,6dof模型所设置重心为真实重心,刚体运动将绕该点进行,此时惯性张量一般只存在于Ixx、Iyy及Izz方向,其他似乎均为零。简单回顾相关力学课程内容,认为也应如此。
2.特殊运动,如6dof下的单摆运动,旋转中心与重心并不重合。该情况下,凭借臆测,未经证实,我认为有两种处理方法,简述如下:
1)该方法由网上案例教程在半睡半醒状态下推理并胡乱理解得到。在6dof gui设置页面中,重心位置指定为所期望的单摆旋转中心。此时,重心≠真实的重心。但转动惯量仍可按照真实重心计算得到的转动惯量定义,但需通过UDF应用CG_DISTANCE宏指定重心与旋转中心距离,并结合Gui界面中刚体方位角参数,以及转轴偏心带来的额外重力矩,由Fluent重新求解转动情况。网上案例及所用udf如下:
#include "udf.h"
#define CG_DISTANCE 0.5
DEFINE_SDOF_PROPERTIES(flap, prop, dt, time, dtime)
{
prop[SDOF_MASS] = 828.47;
prop[SDOF_IZZ] = 310.5;
prop[SDOF_IXX] = 306.36;
prop[SDOF_IYY] = 4.1328;
prop[SDOF_IXY] = 0.0;
prop[SDOF_IYZ] = 0.0;
prop[SDOF_IXZ] = 0.0;
prop[SDOF_ZERO_TRANS_X] = TRUE;
prop[SDOF_ZERO_TRANS_Y] = TRUE;
prop[SDOF_ZERO_TRANS_Z] = TRUE;
prop[SDOF_ZERO_ROT_X] = TRUE;
prop[SDOF_ZERO_ROT_Y] = TRUE;
prop[SDOF_ZERO_ROT_Z] = FALSE;
prop[SDOF_LOAD_M_Z] = -9.81 * 0.5 * sin(DT_THETA(dt)[2]) * 828.47;
}
2)第二种方案是我自己的理解,这种情况下,可以通过建模软件直接将重心指定在期望的旋转中心上,得到一组新的惯性张量用于6dof特性定义。然后,仍在Gui界面中设定所期望的旋转中心为重心,并指定初始的刚体方位等参数。但无需在udf中通过 CG_DISTANCE指定重心和旋转中心的距离,且无需并添加由于旋转偏心产生的额外的重力矩问题。
随笔写此,日后领悟加深后再行补充修改。