Fluent UDF中的矢量和量纲宏(Vector and Dimension Macros)

记录一下,方便后续查找。


ANSYS Fluent提供了一些实用程序,您可以在UDF中使用这些实用程序来访问或操作矢量量以及处理二维和三维。这些实用程序在代码中被实现为宏。
矢量实用程序宏有一个命名约定。

V表示矢量,S表示标量,D表示三个矢量分量的序列( a sequence of three vector components of),其中第三个分量在二维计算中总是被忽略。矢量函数中不遵循括号、指数、乘法、除法、加法和减法(PEMDAS)的标准运算顺序约定。相反,下划线(_)符号用于将操作数分组为对(pair),以便在对组执行操作之前对(pair)的元素执行操作。

3.4.1 Macros for Dealing with Two and Three Dimensions(处理二维和三维的宏)

有两种方法可以处理UDF中涉及二维和三维的表达式。

第一种是使用显式方法指导编译器分别编译2D和3D代码的单独部分。这是在条件if语句中使用RP_2D和RP_3D完成的。

第二种方法允许您在UDF中包含通用的3D表达式,并使用ND和NV宏,这些宏将在使用RP_2D编译时删除z组件。NV宏操作在矢量上,而ND宏操作在单独的组件上。

3.4.1.1 RP_2D and RP_3D

在条件if语句中使用RP_2D和RP_3D宏将指示编译器分别为2D和3D编译代码的单独部分。例如,如果您想指示编译器仅为三维版本的ANSYS Fluent计算涡流项,那么您可以在UDF中使用以下条件编译语句:

 #if RP_3D
 /* compute swirl terms */
 #endif 

3.4.2 The ND Macros

在UDF中使用ND宏可以在代码中包含通用的3D(三维)表达式,并且在使用RP_2D编译时,ND宏负责删除向量的z分量。(ND:Number Dimension?

3.4.2.1. ND_ND

常数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

3.4.2.2. ND_SUM

实用程序ND_SUM(Number Dimension SUM)计算ND_ND参数的总和。

 ND_SUM(x, y, z)
  2D: x + y;
  3D: x + y + z;

3.4.2.3. ND_SET

实用程序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代表什么含义?

3.4.3.The NV Macros

NV宏与ND宏具有相同的目的,但它们对向量(即长度为ND_ND的数组)而不是单独的组件进行操作。

3.4.3.1. NV_V(NV_VEC)

实用程序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.

3.4.3.2. NV_VV

实用程序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.

3.4.3.3. NV_V_VS

实用程序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);

请注意,+号可以用-、/或*代替,*号可以用/代替。

3.4.3.4. NV_VS_VS

实用程序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);

请注意,+号可以用来代替-、*或/,*号可以用/代替。

3.4.4. Vector Operation Macros

您可以在UDF中使用一些宏,这些宏将允许您执行诸如计算矢量幅度、点积和叉积之类的操作。例如,可以使用实函数NV_MAG(V)来计算向量V的大小。或者,也可以使用实数函数NV_MAG2(V)获得向量V大小的平方。

3.4.4.1. Vector Magnitude Using NV_MAG and NV_MAG2

实用程序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.

3.4.4.2. Dot Product

以下实用程序计算两组矢量分量的点积。

 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.

3.4.4.3. Cross Product

 对于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.


  1. 在FLUENT中ND_DOT、NV_DOT、NVD_DOT、ND_SUM的区别:

 帮助文档中各用法如下:

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;

  1. 网上搜索到的内容

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;

你可能感兴趣的:(FLUENT,UDF,python,算法)