我遇到了线性求解器的以下实现,用于实现Jos Stam的稳定流体方法:
/**
* Iterative linear system solver using the Gauss-sidel
* relaxation technique. Room for much improvement here...
**/
void linearSolver(int b, float[] x, float[] x0, float a, float c)
{
for (int k = 0; k < 20; k++)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
x[I(i, j)] = (a * ( x[I(i-1, j)] + x[I(i+1, j)]
+ x[I(i, j-1)] + x[I(i, j+1)])
+ x0[I(i, j)]) / c;
}
}
setBoundry(b, x);
}
}
(http://www.multires.caltech.edu/teaching/demos/java/FluidSolver.java的实施)
我能够收集x
和x0
是矩阵,其中I
只是数组中的一个简单索引函数,而b
只是一个标志要设置的边界条件。
但我不确定这段代码到底在做什么。我认为线性求解器通常会尝试为x
计算Ax = b
。但是在这段代码中似乎没有任何向量,只有矩阵。
有没有人知道这段代码是如何工作的?我试图通过预处理共轭梯度的方法使其更有效。但我不明白这里的参考实现。