CFD计算中存在众多的向量,典型的如速度、角速度等。向量的运算要比标量运算复杂,UDF提供了众多的向量操作宏用于向量的运算。
对于这些向量操作宏,UDF头文件中对这些宏的名称进行了区分。如宏名称中包含v,则表示为向量,S表示为标量,D表示为向量的三个分量序列,在2D模型中,第三个分量被忽略。矢量函数不遵循括号、指数、乘法、除法、加法和减法(PEMDAS)的运算顺序约定。 取而代之的是利用下划线(_)符号将操作数分组成对,以便在成组之前对元素执行操作。
UDF中使用较多的ND操作宏包括:ND_ND、ND_SUM及ND_SET。
ND_ND为常数,在2D模型中其值为2,在3D模型中其值为3。
注意:ND_ND宏的值不可以改变。如下语句ND_ND=1是错误的。在实际应用过程中,把ND_ND当做是数字。
如下语句定义了一个矩阵:
real A[ND_ND][ND_ND];
ND_SUM宏用于计算其参数的和。
如代码:
ND_SUM(x,y,z);
在2D模型中,其等效于:
x+y;
而在3D模型中,其等效于:
x+y+z;
ND_SET宏用于设置其参数。如:
ND_SET(u,v,w,C_U(c,t),C_V(c,t),C_W(c,t));
在2D模型中,其等效为:
u = C_U(c,t); v = C_V(c,t);
在3D模型中,其等效为:
u = C_U(c,t); v = C_V(c,t); w = C_W(c,t);
NV宏与ND宏类似,只不过NV宏操作的是向量。
NV_V宏进行向量赋值操作。如代码:
NV_V(a, = , x);
其等效于:
a[0] = x[0]; a[1] = x[1]; a[2] = x[2];
宏中间的操作符可以是+=,此时则换为:
a[0] += x[0]; a[1] += x[1]; a[2] += x[2];
NV_VV宏能实现向量元素操作。如代码:
NV_VV(a , = , x , + , y);
则其等效于:
a[0] = x[0] + y[0]; a[1] = x[1] + y[1];
此宏可用于向量与标量的乘积运算。如:
NV_V_VS(a, = , x, + , y, *, 0.5);
等效于:
a[0] = x[0] + y[0] * 0.5; a[1] = x[1] + y[1] * 0.5;
矢量与标量的混合运算。如:
NV_VS_VS(a, =, x, *, 2.0, +, y, *, 0.5);
此语句等效于:
a[0] = (x[0]*2.0) + (y[0]*0.5); a[1] = (x[1]*2.0) + (y[1]*0.5);
向量操作宏可用于向量的求模运算、点乘与叉乘运算。
这两个宏用于求取向量的模及模的平方。如宏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]);
NV_DO宏用于向量的点积。可以有多种用法,如下示例:
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_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);
本篇文章来源于微信公众号: CFD之道
评论前必须登录!
注册