Can you tell me a bit more about the use case? I think it would vary.
In general I would say focus on visualizing as much information as possible. In my world I for example have the option to click on any tile during runtime, and see a dump of ALL variables connected to that tile. cellId, elevation, neighbourCellIds, temperature etc. This kind of debugging will help enormously, whatever the use case is.
Also make the implementations as separate as possible. If you for example simulate both vegetation growth and plate tectonics. Those should most likely be independent, structure your program such that you could run them independantly to reduce "nested complexity".
Another general thing is parameter handling. Simulations like these might have ALOT of parameters to tweak. Making it easy to select parameters, and do reruns on the exactly same parameters will be valuable in the long run. Also setting up the simulation so that you can create multiple worlds in sequence, save each to file/image and then compare them afterwards, and see how certain parameters affect the outcome makes it easier for you to test, and get the results you desire.