记录一下,方便后续查找。
ANSYS Fluent提供了一些实用程序,您可以在UDF中使用这些实用程序来访问或操作矢量量以及处理二维和三维。这些实用程序在代码中被实现为宏。
矢量实用程序宏有一个命名约定。
V表示矢量,S表示标量,D表示三个矢量分量的序列( a sequence of three vector components of),其中第三个分量在二维计算中总是被忽略。矢量函数中不遵循括号、指数、乘法、除法、加法和减法(PEMDAS)的标准运算顺序约定。相反,下划线(_)符号用于将操作数分组为对(pair),以便在对组执行操作之前对(pair)的元素执行操作。
有两种方法可以处理UDF中涉及二维和三维的表达式。
第一种是使用显式方法指导编译器分别编译2D和3D代码的单独部分。这是在条件if语句中使用RP_2D和RP_3D完成的。
第二种方法允许您在UDF中包含通用的3D表达式,并使用ND和NV宏,这些宏将在使用RP_2D编译时删除z组件。NV宏操作在矢量上,而ND宏操作在单独的组件上。
在条件if语句中使用RP_2D和RP_3D宏将指示编译器分别为2D和3D编译代码的单独部分。例如,如果您想指示编译器仅为三维版本的ANSYS Fluent计算涡流项,那么您可以在UDF中使用以下条件编译语句:
#if RP_3D
/* compute swirl terms */
#endif
在UDF中使用ND宏可以在代码中包含通用的3D(三维)表达式,并且在使用RP_2D编译时,ND宏负责删除向量的z分量。(ND:Number Dimension?)
常数ND_ND对于RP_2D(ANSYS Fluent 2D)定义为2,对于RP_3D(ANSYS Fluent 3D)定义为3。当您想要构建二维矩阵和三维矩阵时,可以使用它。当您使用ND_ND时,您的UDF将适用于2D和3D情况,而不需要任何修改。
real A[ND_ND][ND_ND]
for (i=0; i
实用程序ND_SUM(Number Dimension SUM)计算ND_ND参数的总和。
ND_SUM(x, y, z)
2D: x + y;
3D: x + y + z;
实用程序ND_SET生成ND_ND赋值语句。
ND_SET(u, v, w, C_U(c, t), C_V(c, t), C_W(c, t))
u = C_U(c, t);
v = C_V(c, t);
if 3D:
21
w = C_W(c, t);
21代表什么含义?
NV宏与ND宏具有相同的目的,但它们对向量(即长度为ND_ND的数组)而不是单独的组件进行操作。
实用程序NV_V对两个矢量执行运算。相当于给一个矢量赋值为另一个矢量。
NV_V(a, =, x);
a[0] = x[0]; a[1] = x[1]; etc.
注意,如果在上面的等式中使用+=而不是=,则得到
a[0]+=x[0]; etc.
See DEFINE_GRID_MOTION for an example UDF that utilizes NV_V.
实用程序NV_VV对矢量元素执行操作。对元素执行的操作取决于在下面的宏调用中用什么符号(-,/,*)代替+符号作为参数。
NV_VV(a, =, x, +, y)
2D: a[0] = x[0] + y[0], a[1] = x[1] + y[1];
See DEFINE_GRID_MOTION for an example UDF that utilizes NV_VV.
实用程序NV_V_VS将一个矢量添加到另一个与标量相乘的矢量。
NV_V_VS(a, =, x, +, y, *, 0.5);
2D: a[0] = x[0] + (y[0]*0.5), a[1] = x[1] +(y[1]*0.5);
请注意,+号可以用-、/或*代替,*号可以用/代替。
实用程序NV_VS_VS将一个矢量与另一个矢量相加,每个矢量乘以标量。
NV_VS_VS(a,=,x,*,2.0,+,y,*,0.5);
2D:a[0]=(x[0]*2.0)+(y[0]*0.5),a[1]=(x[1]*2.0)=(y[1]*0.5);
请注意,+号可以用来代替-、*或/,*号可以用/代替。
您可以在UDF中使用一些宏,这些宏将允许您执行诸如计算矢量幅度、点积和叉积之类的操作。例如,可以使用实函数NV_MAG(V)来计算向量V的大小。或者,也可以使用实数函数NV_MAG2(V)获得向量V大小的平方。
实用程序NV_MAG计算矢量的大小。这取为向量分量平方和的平方根。
NV_MAG(x)
2D:sqrt(x[0]*x[0]+x[1]*x[1]);
3D:sqrt(x[0]*x[0]+x[1]*x[1]+x[2]*x[2]);
实用程序NV_MAG2计算矢量分量的平方和。
NV_MAG2(x)
2D:(x[0]*x[0]+x[1]*x[1]);
3D:(x[0]*x[0]+x[1]*x[1]+x[2]*x[2]);
See DEFINE_DPM_BC for an example UDF that utilizes NV_MAG.
以下实用程序计算两组矢量分量的点积。
ND_DOT(x, y, z, u, v, w)
2D: (x*u + y*v);
3D: (x*u + y*v + z*w);
NV_DOT(x, u)
2D: (x[0]*u[0] + x[1]*u[1]);
3D: (x[0]*u[0] + x[1]*u[1] + x[2]*u[2]);
NVD_DOT(x, u, v, w)
2D: (x[0]*u + x[1]*v);
3D: (x[0]*u + x[1]*v + x[2]*w);
See DEFINE_DOM_SPECULAR_REFLECTIVITY for an example UDF that utilizes NV_DOT.
对于3D,CROSS宏返回矢量叉积的指定分量。对于2D,宏返回向量的叉积,每个向量的z分量设置为0。
ND_CROSS_X(x0,x1,x2,y0,y1,y2)
2D: 0.0
3D: (((x1)*(y2))-(y1)*(x2)))
ND_CROSS_Y(x0,x1,x2,y0,y1,y2)
2D: 0.0
3D: (((x2)*(y0))-(y2)*(x0)))
ND_CROSS_Z(x0,x1,x2,y0,y1,y2)
2D and 3D: (((x0)*(y1))-(y0)*(x1)))
NV_CROSS_X(x,y)
ND_CROSS_X(x[0],x[1],x[2],y[0],y[1],y[2])
NV_CROSS_Y(x,y)
ND_CROSS_Y(x[0],x[1],x[2],y[0],y[1],y[2])
NV_CROSS_Z(x,y)
ND_CROSS_Z(x[0],x[1],x[2],y[0],y[1],y[2])
NV_CROSS(a,x,y)
a[0] = NV_CROSS_X(x,y);
a[1] = NV_CROSS_Y(x,y);
a[2] = NV_CROSS_Z(x,y);
See DEFINE_GRID_MOTION for an example UDF that utilizes NV_CROSS.
帮助文档中各用法如下:
ND_DOT(x, y, z, u, v, w):
2D: (x*u + y*v);
3D: (x*u + y*v + z*w);
NV_DOT(x, u):
2D: (x[0]*u[0] + x[1]*u[1]);
3D: (x[0]*u[0] + x[1]*u[1] + x[2]*u[2]);
NVD_DOT(x, u, v, w):
2D: (x[0]*u + x[1]*v);
3D: (x[0]*u + x[1]*v + x[2]*w);ND_SUM(x, y, z)
2D: x + y;
3D: x + y + z;
real NV_VEC(psi--- defines a vector psi[0]i+psi[1]j+psi[2]k
NV_D(psi,=,u,v,w)--- assigns values in 3directions to a vector
psi = ui+vj+wk
NV_S(psi,*=,R) => psi = psi * R (assigns/modifies magnitude)
NV_DS(psi_vec,=,u,v,w,*,dens) =>direction & scalar operations
psi_vec = (ui+vj+wk)*dens;