-- @example Implementation of a simple runoff model. It uses a -- cellular data created from a tiff file (cabecadeboi.shp). -- The Neighborhood of a Cell is composed by its Moore neighbors that -- have lower height. -- There is an initial rain of 10mm in the highest cells. -- Each cell then sends its water equally to its neighbors. local init = function(model) model.cell = Cell{ init = function(cell) if cell.height > 200 then cell.water = 10 * cell:area() else cell.water = 0 end end, on_synchronize = function(cell) cell.water = 0 end, execute = function(cell) local neighbors = #cell:getNeighborhood() if neighbors == 0 then cell.water = cell.water + cell.past.water else forEachNeighbor(cell, function(neigh) neigh.water = neigh.water + cell.past.water / neighbors end) end end, water100000 = function(cell) if cell.water > 100000 then return 100000 else return cell.water end end } model.cs = CellularSpace{ file = filePath("cabecadeboi.shp", "gis"), instance = model.cell } model.cs:createNeighborhood{ strategy = "mxn", filter = function(cell, neigh) return cell.height >= neigh.height end } model.map1 = Map{ target = model.cs, select = "height", min = 0, max = 255, slices = 8, invert = true, color = "Grays" } model.map2 = Map{ target = model.cs, select = "water100000", min = 0, max = 100000, slices = 8, color = "Blues" } model.timer = Timer{ Event{action = model.cs}, Event{action = model.map1}, Event{action = model.map2} } end Runoff = Model{ finalTime = 50, init = init } Runoff:run()