乐于分享
好东西不私藏

Ansys Fluent文档-UDF篇:模型特定的DEFINE宏(一)

Ansys Fluent文档-UDF篇:模型特定的DEFINE宏(一)

2.3 模型特定的DEFINE

1DEFINE_ANISOTROPIC_CONDUCTIVITY

①描述

可以使用DEFINE_ANISOTROPIC_CONDUCTIVITY来指定固体中的导热系数矩阵,以模拟各向异性导热。

②用法

DEFINE_ANISOTROPIC_CONDUCTIVITY (name,c,t,dmatrix)

nameUDF名称;

cell_t c:单元格索引;

Thread *t:指向要应用各向异性电导率的单元线程的指针;

Real dmatrix[ND_ND] [ND_ND]:待用户填充的各向异性电导率矩阵。

DEFINE_ANISOTROPIC_CONDUCTIVITY包含四个参数:namectdmatrix。需要提供name,即UDF的名称。ctdmatrix是由Fluent求解器传递给UDF的变量。函数将计算单个单元的导热矩阵,并用该矩阵填充dmatrix。请注意,各向异性导热UDF是由Fluent在单元线程循环内调用的。因此,UDF不需要在线程中遍历单元,因为Fluent已在函数调用外部完成了这一操作。

③示例

以下UDF名为cyl_ortho_cond,用于计算圆柱壳的各向异性传导矩阵,该圆柱壳在径向、切向和轴向具有不同的传导率。此函数可作为编译型UDF执行。

#include"udf.h"/* Computation of anisotropic conductivity matrix for * cylindrical orthotropic conductivity *//* axis definition for cylindrical conductivity */// 定义圆柱坐标系的静态常量// 原点坐标:定义圆柱坐标系的起点static const real origin[3] = {0.00.00.0};// 圆柱轴线方向向量:定义圆柱的轴向(z轴方向)static const real axis[3] = {0.00.01.0};/* conductivities in radial, tangential and axial directions */// 定义三个正交方向的热导率:// cond[0]: 径向热导率 (radial direction)// cond[1]: 切向热导率 (tangential/azimuthal direction) // cond[2]: 轴向热导率 (axial direction)static const real cond[3] = {1.00.010.01};// 定义各向异性热导率函数// cyl_ortho_cond: 函数名// c: 单元索引// t: 线程指针// dmatrix: 输出参数,2x2(2D)或3x3(3D)的热导率张量矩阵DEFINE_ANISOTROPIC_CONDUCTIVITY(cyl_ortho_cond, c, t, dmatrix){    // 声明一个3x3的矩阵x,用于存储单元在笛卡尔坐标系中的主方向    real x[3][3]; /* principal direction matrix for cell in cartesian coords. */    // 声明单元中心坐标数组    real xcent[ND_ND];    // 声明径向距离变量    real R;    // 获取当前单元的中心坐标    C_CENTROID(xcent, c, t);    // 计算径向向量:单元中心到圆柱坐标系原点的向量    // NV_VV(x[0], =, xcent, -, origin): x[0] = xcent - origin    // x[0] 现在是径向方向向量(但需要归一化)    NV_VV(x[0], =, xcent, -, origin);    // 如果是3D情况,设置轴向方向向量#if RP_3D    // NV_V(x[2], =, axis): x[2] = axis    // x[2] 是圆柱轴向方向    NV_V(x[2], =, axis);#endif    // 如果是3D情况,需要确保径向方向垂直于轴向#if RP_3D    // 计算径向向量在轴向方向上的投影长度    // R = NV_DOT(x[0], x[2]): R = x[0]·x[2]    R = NV_DOT(x[0], x[2]);    // 从径向向量中减去轴向分量,使其垂直于轴向    // NV_VS(x[0], -=, x[2], *, R): x[0] = x[0] - R * x[2]    NV_VS(x[0], -=, x[2], *, R);#endif    // 计算径向向量的模(距离)    R = NV_MAG(x[0]);    // 如果距离大于0,将径向向量归一化(单位化)    if (R > 0.0)        NV_S(x[0], /=, R);  // x[0] = x[0] / R    // 计算切向方向向量(垂直于径向和轴向)#if RP_3D    // 3D情况:切向方向 = 轴向 × 径向(叉积)    // N3V_CROSS(x[1], x[2], x[0]): x[1] = x[2] × x[0]    N3V_CROSS(x[1], x[2], x[0]);#else    // 2D情况:切向方向 = 径向方向顺时针旋转90度    // x[1][0] = -x[0][1]    // x[1][1] = x[0][0]    x[1][0] = -x[0][1];    x[1][1] = x[0][0];#endif    /* dmatrix is computed as xT*cond*x */    // 计算热导率张量矩阵:dmatrix = x^T * diag(cond) * x    // dmatrix[0][0] 分量    dmatrix[0][0] = cond[0] * x[0][0] * x[0][0]        + cond[1] * x[1][0] * x[1][0]#if RP_3D        + cond[2] * x[2][0] * x[2][0]  // 3D情况添加轴向分量#endif    ;    // dmatrix[1][1] 分量    dmatrix[1][1] = cond[0] * x[0][1] * x[0][1]        + cond[1] * x[1][1] * x[1][1]#if RP_3D        + cond[2] * x[2][1] * x[2][1]  // 3D情况添加轴向分量#endif    ;    // dmatrix[1][0] 分量(非对角元素)    dmatrix[1][0] = cond[0] * x[0][1] * x[0][0]        + cond[1] * x[1][1] * x[1][0]#if RP_3D        + cond[2] * x[2][1] * x[2][0]  // 3D情况添加轴向分量#endif    ;    // dmatrix[0][1] 分量(对称矩阵,等于dmatrix[1][0])    dmatrix[0][1] = dmatrix[1][0];    // 如果是3D情况,计算额外的矩阵元素#if RP_3D    // dmatrix[2][2] 分量(z方向)    dmatrix[2][2] = cond[0] * x[0][2] * x[0][2]        + cond[1] * x[1][2] * x[1][2]        + cond[2] * x[2][2] * x[2][2]    ;    // dmatrix[0][2] 分量(x-z平面)    dmatrix[0][2] = cond[0] * x[0][0] * x[0][2]        + cond[1] * x[1][0] * x[1][2]        + cond[2] * x[2][0] * x[2][2]    ;    // dmatrix[2][0] 分量(对称)    dmatrix[2][0] = dmatrix[0][2];    // dmatrix[1][2] 分量(y-z平面)    dmatrix[1][2] = cond[0] * x[0][1] * x[0][2]        + cond[1] * x[1][1] * x[1][2]        + cond[2] * x[2][1] * x[2][2]    ;    // dmatrix[2][1] 分量(对称)    dmatrix[2][1] = dmatrix[1][2];#endif}

2DEFINE_CAPILLARY_PRESSURE

①描述

可以使用DEFINE_CAPILLARY_PRESSURE为电解模型自定义毛细管压力公式。

②用法

DEFINE_CAPILLARY_PRESSURE (name,c,t,cp,dcpdalpha)

nameUDF名称;

cell_t c:单元格索引;

Thread *t:指向单元或面线程的指针;

Thread *cp:指向毛细压力的指针;

Real dcpdalpha:指向液相体积分数空间中毛细压力梯度的指针。

DEFINE_CAPILLARY_PRESSURE包含五个参数:namectcp以及dcpdalpha。需要提供name,即UDF的名称。ctcpdcpdalpha是由Fluent求解器传递给UDF的变量。

③示例

以下示例展示了如何使用DEFINE_CAPILLARY_PRESSURE为液相体积分数空间中的毛细管压力及其梯度赋予常数值。

 #include "udf.h" DEFINE_CAPILLARY_PRESSURE(capillary_pre,c,t,cp,dpcdalpha) {  *cp = 100;  *dpcdalpha = 10000;  return; }

3DEFINE_CHEM_STEP

①描述

可以使用DEFINE_CHEM_STEP来指定一个时间步长内因均相反应导致的质量分数变化:

其中Yi0是第i种组分的初始质量分数,t时间,Δt是给定的时间步长,而dYi/dtith物种质量分数的净变化率。YiΔt是积分结束时ith物种的质量分数。

DEFINE_CHEM_STEP用于层流有限速率(采用刚性化学反应求解器)、EDCPDF输运模型。

②用法

DEFINE_CHEM_STEP (name, c, t, p, num_p, n_spe, dt, pres, temp, yk)

nameUDF名称;

cell_t c:当前粒子的单元索引;

Thread *t:指向粒子单元线程的指针;

Particle *p:指向粒子数据结构的指针,该结构表示 PDF 传输模型使用的粒子;

int num_p:未使用;

int n_spec:体积分布种类数量;

double *dt:时间步;

double *pres:压力指针;

double *temp:温度指针;

double *yk:初始物种质量分数数组的指针。

DEFINE_CHEM_STEP包含九个参数:namecpnum_pn_spedtprestempyk。需要提供name的定义。cpn_spedtprestempyk是由Fluent求解器传递给UDF的变量。num_p在该函数中未被使用,可忽略。函数的输出是积分步长后的质量分数数组yk。数组yk中的初始质量分数会被覆盖重写。

③示例

以下名为user_chem_stepUDF假定净体积反应速率表达式为:

其中Nspe是物种数量。

ODE的积分存在解析解,形式为:

 #include"udf.h" DEFINE_CHEM_STEP(user_chem_step,cell,thread,particle,nump,nspe,dt,pres,temp,yk) {   int i;   double c = 1./(double)nspe;   double decay = exp(-(*dt));   for(i=0;i<n_spe;i++)      yk[i] = (yk[i]-c)*decay + c; }

4DEFINE_CPHI

①描述

可以使用DEFINE_CPHI设置混合常数Cφ的值。该功能适用于模拟Cφ显著偏离默认值2的流动情况,这种情况通常发生在低雷诺数和/或高施密特数条件下。

②用法

DEFINE_CPHI (name, c, t)

nameUDF名称;

cell_t c:单元索引;

Thread *t:指向单元格线程的指针;

DEFINE_CPHI有三个参数:namect。需要定义namectFluent求解器传递给UDF。计算混合常数(Cφ)的实际值,并将其返回给求解器。

5DEFINE_CORNER_FLOW_CORRECTION_CCORNER

①描述

可以使用DEFINE_CORNER_FLOW_CORRECTION_CCORNER来指定自定义系数Ccorner,该系数用于角流修正项中,以便在特定流动需要时影响角流修正的强度。

②用法

DEFINE_CORNER_FLOW_CORRECTION_CCORNER (name, c, t)

nameUDF名称;

cell_t c:用于标识需要应用角流修正系数Ccorner的单元的索引;

Thread *t:指向单元格线程的指针;

这些函数有三个参数:namectname是需要定义的名称。ct是由Fluent求解器传递给UDF的变量。UDF将返回角流校正系数Ccorner的实际值。

③示例

在以下示例中,演示了分区处理方法。根据x坐标的不同,角流修正系数Ccorner具有不同的取值。

include"udf.h"DEFINE_CORNER_FLOW_CORRECTION_CCORNER(corner_flow_ccorner, c, t){    // 声明局部变量corner_flow_correction_ccorner,用于存储要返回的修正系数    real corner_flow_correction_ccorner;    // 声明数组xc,用于存储单元的中心坐标    // ND_ND: Fluent宏,表示空间维度(2D时为2,3D时为3)    real xc[ND_ND];    // 获取当前单元的中心坐标,存储到xc数组中    C_CENTROID(xc, c, t);    // 根据单元中心坐标的x值(xc[0])决定修正系数    // 如果x坐标大于2.0,修正系数设为1.1;否则设为1.0    if (xc[0] > 2.0)        corner_flow_correction_ccorner = 1.1;  // x>2.0区域的修正系数    else        corner_flow_correction_ccorner = 1.0;  // x≤2.0区域的修正系数    // 返回计算得到的修正系数    return corner_flow_correction_ccorner;}

参考资料:Ansys Fluent UDF Manual》 2023R1

CFD理论基础合集(持续更新中):

Ansys Fluent帮助文档-UDF篇:用户自定义函数概述(UDFs)(一)

Ansys Fluent帮助文档-UDF篇:用户自定义函数概述(UDFs)(二)

Ansys Fluent帮助文档-UDF篇:通用DEFINE宏(一)

Ansys Fluent帮助文档-UDF篇:通用DEFINE宏(二)

Ansys Fluent帮助文档-UDF篇:通用DEFINE宏(三)

特别感谢您的阅读、点赞、转发、推荐!

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » Ansys Fluent文档-UDF篇:模型特定的DEFINE宏(一)

评论 抢沙发

5 + 1 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮