记录一下,方便后续查找。
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_ND; ++i) for (j=0; j<ND_ND; ++j) A[i][j] = f(i, j); 实用程序ND_SUM(Number Dimension SUM)计算ND_ND参数的总和。
ND_SUM(x, y, z) 2https://www.gofarlic.com x + y; 3https://www.gofarlic.com 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 3https://www.gofarlic.com 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) 2https://www.gofarlic.com 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); 2https://www.gofarlic.com 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);2https://www.gofarlic.coma[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)2https://www.gofarlic.com(x[0]*x[0]+x[1]*x[1]);3https://www.gofarlic.com(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) 2https://www.gofarlic.com (x*u + y*v); 3https://www.gofarlic.com (x*u + y*v + z*w); NV_DOT(x, u) 2https://www.gofarlic.com (x[0]*u[0] + x[1]*u[1]); 3https://www.gofarlic.com (x[0]*u[0] + x[1]*u[1] + x[2]*u[2]); NVD_DOT(x, u, v, w) 2https://www.gofarlic.com (x[0]*u + x[1]*v); 3https://www.gofarlic.com (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) 2https://www.gofarlic.com 0.0 3https://www.gofarlic.com (((x1)*(y2))-(y1)*(x2))) ND_CROSS_Y(x0,x1,x2,y0,y1,y2) 2https://www.gofarlic.com 0.0 3https://www.gofarlic.com (((x2)*(y0))-(y2)*(x0))) ND_CROSS_Z(x0,x1,x2,y0,y1,y2) 2D and 3https://www.gofarlic.com (((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): 2https://www.gofarlic.com (x*u + y*v); 3https://www.gofarlic.com (x*u + y*v + z*w); NV_DOT(x, u): 2https://www.gofarlic.com (x[0]*u[0] + x[1]*u[1]); 3https://www.gofarlic.com (x[0]*u[0] + x[1]*u[1] + x[2]*u[2]); NVD_DOT(x, u, v, w): 2https://www.gofarlic.com (x[0]*u + x[1]*v); 3https://www.gofarlic.com (x[0]*u + x[1]*v + x[2]*w); ND_SUM(x, y, z) 2https://www.gofarlic.com x + y; 3https://www.gofarlic.com 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;
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删