LBM的迁移,实际上就是数组元素的平移。
做迁移的时候,最需要注意的就是数值覆盖。所以用C来实现的时候,替代的顺序和传递的顺序应该是相反的。D2Q9的离散格式如下:
f1(i+1)=f(i)
f3(i)=f3(i+1)
以此类推。
一种C形式的迁移
用for循环语句:
1 | #f1,f3 |
这种方式的代码可以很方便的改成C语言。
2 数组操作型
在MATLAB里面实现这个还有更简洁的方式:
1 | f(2:n,:,1)=f(1:n-1,:,1); |
这种实现和第一种没有本质区别。只是代码显得更简洁。但是如果向其他离散形式进行拓展,比如像三维D3Q15这种就不适合了,需要手动写很多代码。
所以一个更简单,推广性更好的实现是使用数组平移函数circshift。
3 使用circshift
circshift是一个数组平移函数。
这种方式circshift是一个循环平移函数,这里的循环实际上我们并不需要。
假设a=[1,2,3,4,5],我们执行b=circshift(a,1)会得到:
讲道理,我们不需要把5移动到b(1),而希望b(1)=a(1)。所以执行完这个以后,需要对边界进行处理。
代码如下:
1 | for i=1:9 |
这里构造了起始点和终点函数。想象一下,假设平移向量是(1,-1)。那么我们需要的是在x方向从2到n,在y方向需要的是从1到m-1。
于是构造了起始点和终点的函数分别为:
$$
x_{qsd} = 1 + { {c{x^2} + cx} \over 2}
$$
$$
{x_{zd}} = n + { {cx - c{x^2} } \over 2}
$$
这里给的是x方向的,y方向的构造一模一样,只不过cx改为cy,n改为m而已。把平移函数cx=1,cy=-1代入公式,可以得到起始点和终点为:
$$
\eqalign{
& x = 2:n \cr
& y = 1:m - 1 \cr}
$$
这和我们需要的数据是一模一样的。
这个方法的拓展性比较好,不需要针对不同的离散格子模型全部重写代码。