list manipulation – Trouble Iterating My Simulated Forest Fire

I’m having some trouble iterating my simulation of a forest fire. I’m new to mathematica, so apologies for poor coding. I’m sure there are far neater and more efficient ways of doing this, but i would like to know whats the problem with the method im using currently if possible.

This is my code to get the adjacent elements, including ‘wrap around’:

neighbourPos(m_, i_, j_) := Transpose(Mod({i, j} + {{-1, 0, 1, 0}, {0, -1, 0, 1}}, Dimensions(m),));

For the fire, 2s represent burning trees, 1s trees and 0s empty ground. After one timestep, trees adjacent to a fire will set on fire and original fire(s) will burn themselves out and become ‘0s’. This my code to simulate the spread of the fire:

nextState(m_) :=  
 (firepos = Position(m, 2); 
  a = MapAt(2 # &, m, 
    neighbourPos(m, Position(m, 2)((1, 1)), Position(m, 2)((1, 2)))); 
  MapAt(0 &, a, firepos))

It seems to work. Up to a point anyway. I would like to eventually plot the thing with ListAnimate, however, When i try to iterate nextState until the fire is burnt out with FixedPointList it stops working properly after 6 iterations and i get a load of errors.

e.g

MatrixPlot(mat/2, PlotRange -> {0, 1}, ColorFunction -> "Rainbow", ColorFunctionScaling -> False)

Gives

Starting matrix

Then

MatrixPlot(nextState(mat)/2, PlotRange -> {0, 1}, ColorFunction -> "Rainbow",  ColorFunctionScaling -> False)

Matrix after one iteration

But then errors come after more iterations.

In(1):= fireStates(m_) := FixedPointList(nextState, m);

In(14):= frames = fireStates(mat);

During evaluation of In(14):= Part::partw: Part 1 of {} does not exist.

During evaluation of In(14):= Part::partw: Part 1 of {} does not exist.

During evaluation of In(14):= MapAt::pkspec1: The expression Mod(1+{}((1,1)),10,1) cannot be used as a part specification.

During evaluation of In(14):= Thread::tdlen: Objects of unequal length in Mod({{0,1,2,1},{1,0,1,2}},{3},1) cannot be combined.

During evaluation of In(14):= MapAt::psl: Position specification Transpose(Mod({{0,1,2,1},{1,0,1,2}},{3},1)) in MapAt(2 #1&,MapAt(2 #1&,<<1>>,{{Mod(-1+{}((1,1)),10,1),Mod({}((1,2)),10,1)},{<<1>>,Mod(<<1>>)},<<1>>,{Mod({}((1,1)),10,1),Mod(1+{}((1,2)),10,1)}}),Transpose(Mod({{0,1,2,1},{1,0,1,2}},{3},1))) is not a machine-sized integer or a list of machine-sized integers.

During evaluation of In(14):= MapAt::partw: Part {3,4,2,1,2,3} of MapAt(2 #1&,MapAt(2 #1&,<<1>>,{{Mod(-1+{}((1,1)),10,1),Mod({}((1,2)),10,1)},{<<1>>,Mod(<<1>>)},<<1>>,{Mod({}((1,1)),10,1),Mod(1+{}((1,2)),10,1)}}),Transpose(Mod({{0,1,2,1},{1,0,1,2}},{3},1))) does not exist.

During evaluation of In(14):= Thread::tdlen: Objects of unequal length in Mod({{1,2,3,2},{1,0,1,2}},{3},1) cannot be combined.

During evaluation of In(14):= MapAt::psl: Position specification Transpose(Mod({{1,2,3,2},{1,0,1,2}},{3},1)) in MapAt(2 #1&,MapAt(0&,MapAt(2 #1&,MapAt(<<1>>),Transpose(Mod(<<1>>))),{{1,1,1},{3,1,2,1,3},{3,2,2,1,2,3},{3,3,2,1,3},{3,4,2,1,2,3}}),Transpose(Mod({{1,2,3,2},{1,0,1,2}},{3},1))) is not a machine-sized integer or a list of machine-sized integers.

During evaluation of In(14):= MapAt::partw: Part {2,2,3,4,2,1,2,3} of MapAt(2 #1&,MapAt(0&,MapAt(2 #1&,MapAt(<<1>>),Transpose(Mod(<<1>>))),{{1,1,1},{3,1,2,1,3},{3,2,2,1,2,3},{3,3,2,1,3},{3,4,2,1,2,3}}),Transpose(Mod({{1,2,3,2},{1,0,1,2}},{3},1))) does not exist.

During evaluation of In(14):= Thread::tdlen: Objects of unequal length in Mod({{1,2,3,2},{1,0,1,2}},{3},1) cannot be combined.

During evaluation of In(14):= General::stop: Further output of Thread::tdlen will be suppressed during this calculation.

During evaluation of In(14):= MapAt::psl: Position specification Transpose(Mod({{1,2,3,2},{1,0,1,2}},{3},1)) in MapAt(2 #1&,MapAt(0&,MapAt(<<1>>),{{2,1,1,1},{2,2,1,1,1},{2,2,3,1,2,1,3},{2,2,3,2,2,1,2,3},<<3>>,{2,3,1,1,2,4},{3,2,3},{3,3,2},<<5>>}),Transpose(Mod({{1,2,3,2},{1,0,1,2}},{3},1))) is not a machine-sized integer or a list of machine-sized integers.

During evaluation of In(14):= General::stop: Further output of MapAt::psl will be suppressed during this calculation.

During evaluation of In(14):= MapAt::partw: Part {2,2,2,2,3,4,2,1,2,3} of MapAt(2 #1&,MapAt(0&,MapAt(<<1>>),{{2,1,1,1},{2,2,1,1,1},{2,2,3,1,2,1,3},{2,2,3,2,2,1,2,3},<<3>>,{2,3,1,1,2,4},{3,2,3},{3,3,2},<<5>>}),Transpose(Mod({{1,2,3,2},{1,0,1,2}},{3},1))) does not exist.

During evaluation of In(14):= General::stop: Further output of MapAt::partw will be suppressed during this calculation.

Many many thanks in advance for anyone kind enough to help.

Cheers.