In fluids modeling, a really easy way to build an model of a scalar (e.g., a polutant or chemical) that is transported by a flowfield is using a particle tracking model.

Here, you have millions of finite particles, with x and y locations (and possibly mass). building code to advect the particles by the flow-field and diffuse them based on a random walk Gaussian diffusion model is pretty trivial.

What's hard is when you want to actually make sense of these millions of particles: you need to convert them into a concentration. How many particles are in a unit of space? Binning codes are usually pretty slow, and can be the major hold-up in a particle tracking model.

That's why I was stoked yesterday to find MATLAB's accumarray function. It offers a quick way to bin particles, and operates slightly (10-15%) faster than my old bench-mark binning code. Here's my binning function for anybody who's interested:

function [Conc]=bin_Particles(Xpos,Ypos,Ms,L,dx)
%-------------------------------------------------------------------------%
% PDF2d(C1, C2, nBins)
% Written By: Mike Soltys (www.MikeSoltys.com)
% Last modified: 4/25/13
%
% Required Inputs:
% Xpos: 1 x n vector of particles X locations.
% Ypos: 1 x n vector of particles y locations.
% Ms: 1 x n vector of particles masses
%
% L: The domain will reach from -L to L in both x and y
% dx: The domain will be broken into dx sized bits.
%
% output:
% Conc: a (2L/dx+1) X (2L/dx+1) matrix with concentrations
%
%-------------------------------------------------------------------------%
%Detrmine Bin Locations
Xs=round(( Xpos+L)*L/dx )+1;Xs(Xs<1)=1;Xs(Xs>(1+2*L/dx))=(1+2*L/dx);
Ys=round(( Ypos+L)*L/dx )+1;Ys(Ys<1)=1;Ys(Ys>(1+2*L/dx))=(1+2*L/dx);
%Use accumarray to create matrix.
Conc(:,:)=accumarray([Ys, Xs],Ms);
end

### Related Posts: