Good overview:
http://software.intel.com/en-us/articles/fluid-simulation-for-video-games-part-1/
Some algorithmics:
http://www.colinbraley.com/Pubs/FluidSimColinBraley.pdf
Conjugate Gradient:
http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf
http://planetmath.org/encyclopedia/ConjugateGradientAlgorithm.html
Sparse symmetric matrix implementation:
package yarangi.math.algebra;
import java.util.HashMap;
import java.util.Map;
public class SparseSymmetricMatrix implements IMatrix
{
private Map matrix;
private int width;
public SparseSymmetricMatrix(int width)
{
this.width = width;
this.matrix = new HashMap (width*width/4);
}
public SparseSymmetricMatrix(int width, double loadFactor)
{
this.width = width;
this.matrix = new HashMap ((int)(loadFactor*width*width));
}
public void set(double value, int i, int j)
{
matrix.put(index(i, j), value);
if(index(i, j) < 0)
}
public double get(int i, int j) {
Double value = matrix.get(index(i, j));
return value == null ? 0 : value;
}
private int index(int i, int j)
{
if(i > j)
return j * width + i;
return i * width + j;
}
public IVector mul(IVector vector) {
IVector result = new Vector(width);
for(int key : matrix.keySet())
{
double value = matrix.get(key);
int row1 = key % width;
int row2 = key / width;
result.set(result.get(row1)+value*vector.get(row2), row1);
if(row1 != row2)
result.set(result.get(row2)+value*vector.get(row1), row2);
}
return result;
}
public IVector mulTranspose(IVector vector) {
return mul(vector);
}
}
May also be of interest:
No comments:
Post a Comment