Computation and the Human Predicament
The Limits to Growth and the limits to computer modeling
The Dusty Deck
After 40 years of intense scrutiny, further probing of the World3 model is unlikely to yield big surprises. Nevertheless, nagged by a feeling that I still didn’t really understand the model, I decided to take it apart and put it together again.
When I wrote about Limits in 1993, I worked with a simulation package called Stella II, which offers a snazzy interface: You build a model by dragging icons of vats and valves across the screen. For my studies of World3 I was spared even that labor because a prebuilt version of the model came with the software. Stella II is still available, and so are competing products such as Modelica, Simgua and Vensim. These are impressive programs, recommended for serious work with system dynamics models. My aim, however, was not just to run or test the World3 model but to see how the parts fit together. I wanted to bake my cake from scratch, not from the Betty Crocker box.
DYNAMO comes from the Fortran era, when programs were fed to the machine on punch cards, and variables had names like “FIALD” (which stands for “Fraction of Inputs Allocated to Land Development”). Beyond these musty lexical conventions, however, lies an interesting programming language, little known outside the system dynamics community. It is mainly declarative rather than procedural. A program is not a sequence of commands but a list of “equations” (really assignment statements) that specify relationships of variables. The sequencing is handled behind the scenes by the DYNAMO compiler.
The World3 program consists of about 150 equations. The vats and valves of the plumbing diagram correspond to “level equations” and “rate equations,” respectively. A level equation calculates a new value for the level in a vat based on the level at an earlier moment and on the rates of inflow and outflow. The calculation is an integration, which would be represented as follows in DYNAMO:
V.K = V.J + DT * (IN.JK – OUT.JK)
Here V is a level variable, IN and OUT are rate variables, and DT is the integration interval, the unit of time in the simulation. The suffixes .J, .K and .JK are time markers: V.J and V.K represent the level of V at successive instants, and IN.JK is a rate of flow during the interval between time J and time K.
Just as levels depend on rates of inflow and outflow, the flow rates in turn can depend on levels. (Think of a bucket with a hole in the bottom: The rate of flow depends on the height of water in the bucket.) This kind of feedback loop is what gives the system the potential for interesting behavior, but from a computational point of view it is an awkward causal circularity. DYNAMO breaks the circle by updating levels and rates in alternation. The level at time t0 determines the rate at t1, which determines the level at t2, and so on. Some conflicts are harder to resolve and require an explicit reordering of the equations, which DYNAMO handles automatically.