This model demonstrates the kinetics of a reversible reaction of the type:

	A + A <=======> B

An example of such a reaction would be dimerization of acetic acid:

	2 H C-COOH <=======> H C-COOH~...~HOOC-C H
           3           Ku     3                 3 

This reaction is an example of a complex reaction which consists of two 
elementary reactions.  The forward bimolecular reaction 
	A + A --------> B 

is characterized by the constant Kb and the reverse unimolecular reaction

	B ---------> A + A

is chracterized by the constant Ku.
The system of ordinary differential equations (ODE) that describes the 
concentrations of A and B is given below:

	dA           2
        -- = -2Kb * A  + 2Ku * B		(1)

	dB         2
	-- = Kb * A  - Ku * B		(2)

The usual initial conditions are A(0) = Ao and B(0) = 0.  While it is 
possible to solve this system of ODE analytically, chemists usually 
apply the Principle of Stationary Concentrations when they investigate 
the kinetics of reactions of this type.  The Principle says that one can 
assume that the concentrations of the species stop changing from some point 
on after the system reaches equilibrium.  If concentrations are stationary, 
the derivatives

	dA	 dB
	--  and	 --
	dt	 dt

are zero.  Hence one can replace the system of ODE above with the system
of algebraic equations below:
	0 = -2Kb * A*   + 2Ku * B* 		(1')

	0 = Kb * A*  - Ku * B*  		(2')

where concentrations marked with * are stationary concentrations.  The 
second equation (2') is linearly dependent on the first equation (1').  
Luckily we also have another equation coming from the law of the conservation 
of mass:

	A* + 2 * B* = Ao			(3)

From equation (2') we can express B* in terms of A* :

	      Kb     2
	B*  = --  A* 			(4)

We can now plug in expression (4) into (3) and then we will have a quadratic 
equation in terms of A*:

	      Kb   2
	A*  + -- A*  = Ao 		(5)
whose solution is:

             |	        Kb     
	     |  1 + 4 * --   - 1
    	    \|          Ku
           --------------------		(6)
		 2 * --

One can now find the stationary concentration of B using equation (4).

This model demonstrates numerically that the appliction of the Principle 
of Stationary Concentrations is valid in this case.  In this model there 
are two breeds (green turtles and red turtles)  Green turtles turn into red 
turtles bimolecularly whereas red turtles turn back into pairs of green turtles 
monomolecularly.  The user can control the rate at which this changes occur with 
sliders kb and Ku.   if you ran the program long enough with both Ku and Kb values 
being non-zero you will observe that the plots of concentrations become stationary.


Choose the values of Ku and Kb with appropriate sliders:
     - Kb controls the rate of the forward reaction by which two green turtles 
     turn bimolecularly into a single red turtle. 
     - Ku controls the rate of the reverse reaction, by which a red turtle 
     turns unimolecularly into two green turtles. 

Having chosen appropriate values of the constants, press SETUP to clear 
the screen and create an initial number of green turtles.  Note: we do 
not create red turtles initially, although this can be done in principle.

Press RUN to start the simulation.  


You will see turtles wandering around the screen and  changing color.  Pay 
more attention to the plot of the concentrations.  Do the plots soon reach 
stationary concentrations? 

How do the stationary concentrations depend on the values of Kb and Ku?   
You can change Ku and Kb while the model is running.   See if you can 
predict what the stationary concentrations will be with various combinations 
of Kb and Ku. 


Try to implement the following reaction:

 		 Kb         K2
	A + A <======> B -------> C

This reaction underlines a vast number of microbiological processes 
(e.g. fermentation).  You can read about its kinetics in any book on 
Biochemistry.  Look up the so-called Michaeles-Menten equation.  Does 
it check numerically? 

Try to implement the following reaction:

 		 Kb         K2
	A + B <======> C -------> D


The major subroutines are listed below.  Notice how much more complicated 
the implementation of "to react-forward" is.  This is hardly suprising 
considering that it is in general harder to design models where agents 
interact with each other as opposed to models where agents act independently.

to react-forward
  if (count-init-breed-here > 1) and ((random 999) > 998 - Kb) and (id = nobody) 
    setid one-of-turtles-here
    ifelse (id-of id) != nobody [setid nobody][setid-of id who]]

  if id != nobody [
    setbreed prod-breed
    setcolor red
    if who < id [setvalue value + value-of id setvalue-of id value]]

to react-backward
  if (random 999) > (999 - Ku) [ 
    setbreed init-breed
    setcolor green

; This line seems to be unneccessary but without it the code does not work right.

    setid nobody
    hatch [setvalue 1 setid nobody]
    hatch [setvalue 1 setid nobody]

A good indication that this code works correctly is the constancy of 

	sum-of-turtles [value]

If you look closely at the implementation you will see that green turtles 
always carry value equal to one unlike red turtles which always have value two.  
Even though it takes two green turtles to produce a red turtle, the sum of values 
stays the same.  This corresponds to the pricnciple of conservation of mass 
(equation 3).