MRT applicability

Does anybody can explain to me when is the MRT matrix applied? In which type of simulations it is worth using it?

In addition, is there any Scilab/Fortran available source where I can check it??

Albert P

An MRT is usually applied when BGK isn’t good enough (in terms of accuracy and stability). Common cases are low Reynolds number flows using bounce back boundary conditions, and high Reynolds number flow.

In the first case, BGK when used with bounce back gives a large error. This error (due to a numerical slip velocity) is proportional to the square of the grid spacing. This means it should shrink as you refine the mesh, but we would still like to not have it. An MRT (or TRT) model can eliminate this error (or, at the very least, reduce it significantly), and is especially useful for many practical porous media applications.

At high Re numbers, the relaxation time is pushed close to its stability bound and LB codes can become numerically unstable. An MRT allows you to relax the higher order moments at a different rate, and is thus far more stable.

An MRT code will, in general, lead to better accuracy and stability. You should use it when you’re not happy with your results and they need improving. It can always be applied (BGK is just a special case of MRT).

Thanks for the explanation, pleb01 I wish I could somehow get a simple code with this feature deployed. Because I find it difficult to understand the nature of all the elements of the matrix. Is there any source of code or well explained stuff about MRT to people who have started with LBM?

I don’t know about source codes but I think the clearest papers are the “usual” ones: d’Humieres (I forget the year, but this is the original - 1992, I think), Lallemand and Luo 2000 (this is a difficult paper, but the first couple of sections explain the motivation), Dellar 2003. I am sure there are more recent articles which explain how to use it, but I’m afraid I don’t have them - perhaps other people who have learned about the method have some?

There are several ways to construct a collision matrix. One is to use Gram-Schmidt to find the lattice vectors (by lattice vectors I mean polynomials in the lattice velocity c_i. It i these that give the moments. For example the lattice vector [0,1,0,-1,0,1,-1,-1,1], which corresponds to the components of c_{ix}, gives the x-component of momentum. There are at most 9 independent moments for a 9-dimesnsioanl lattice, and thus 9 lattice vectors); another is to express the “ghost” moments via Hermite Polynomials (Dellar 2003). You must also specify the equilibrium function/moments, and details can be found in the references above.

The thing to remember is there is an invertible relationship between f and its moments (m): m=M*f, where M is the matrix made up of lattice vectors. So if you impose an equilibrium function you can find the corresponding moments. Or, stating what the equilibrium moments should be (or what you want them to be), you can find the equilibrium f. The papers above suggest “good” choices of the equilibria.

Regarding implementation, you do collisions in moment space and streaming in distribution space. That is you a) find the moments; b) relax the moments; c) re-construct the post-collision f from its post-collision moments; d) stream f.

MRT is difficult when you see it for the first time, I know, but once you get the hang of it starts to make sense (and has a lot of benefits - but I think there is still no consensus on what the absolute optimal choice of collisions times etc are, so there’s lots of theory to be done!).

Good luck!