void runStep()
{
int x, y;
for ( x = 0; x < mSize; x++ )
{
delta[ 0 ][ x ] = 0;
delta[ 1 ][ x ] = 0;
}
// Boundary conditions
int idx;
idx = 0;
for ( y = 0; y < reactorExtent; y++ )
{
chemical[ 0 ][ idx ] = chemical[ 0 ][ idx + reactorExtent - 2 ];
chemical[ 0 ][ idx + reactorExtent - 1 ] = chemical[ 0 ][ idx + 1 ];
chemical[ 1 ][ idx ] = chemical[ 1 ][ idx + reactorExtent - 2 ];
chemical[ 1 ][ idx + reactorExtent - 1 ] = chemical[ 1 ][ idx + 1 ];
idx += reactorExtent;
}
int skip = reactorExtent * ( reactorExtent - 1 );
for ( y = 0; y < reactorExtent; y++ )
{
chemical[ 0 ][ y ] = chemical[ 0 ][ y + skip - reactorExtent ];
chemical[ 0 ][ y + skip ] = chemical[ 0 ][ y + reactorExtent ];
chemical[ 1 ][ y ] = chemical[ 1 ][ y + skip - reactorExtent ];
chemical[ 1 ][ y + skip ] = chemical[ 1 ][ y + reactorExtent ];
}
// Diffusion
idx = reactorExtent + 1;
for ( y = 0; y < reactorExtent - 2; y++ )
{
for ( x = 0; x < reactorExtent - 2; x++ )
{
delta[ 0 ][ idx ] += MULT( chemical[ 0 ][ idx - reactorExtent ] + chemical[ 0 ][ idx - 1 ]
- 4 * chemical[ 0 ][ idx ] + chemical[ 0 ][ idx + 1 ]
+ chemical[ 0 ][ idx + reactorExtent ], hdiv0 );
delta[ 1 ][ idx ] += MULT( chemical[ 1 ][ idx - reactorExtent ] + chemical[ 1 ][ idx - 1 ]
- 4 * chemical[ 1 ][ idx ] + chemical[ 1 ][ idx + 1 ]
+ chemical[ 1 ][ idx + reactorExtent ], hdiv1 );
idx++;
}
idx += 2;
}
// Reaction (Grey-Scott)
idx = reactorExtent + 1;
int U, V;
for ( y = 0; y < reactorExtent - 2; y++ )
{
for ( x = 0; x < reactorExtent - 2; x++ )
{
U = chemical[ 0 ][ idx ];
V = chemical[ 1 ][ idx ];
int UVV = MULT( MULT( U, V ), V );
delta[ 0 ][ idx ] += -UVV + MULT( F, ( 1 << 16 ) - U );
delta[ 1 ][ idx ] += UVV - MULT( F + k, V );
idx++;
}
idx += 2;
}
// Update concentrations
for ( x = 0; x < mSize; x++ )
{
chemical[ 0 ][ x ] += MULT( delta[ 0 ][ x ], dt );
chemical[ 1 ][ x ] += MULT( delta[ 1 ][ x ], dt );
}
}