Donnan Volumes

How to take Donnan volumes into account in clay systems.

The adsorption models for clay and organic matter surfaces contain a so called “Donnan layer”. The volumes of these Donnan layers are calculated and used for bookkeeping of the amount chemical substances they contain. However, these Donnan volumes are not taken into account int (subtracted from) the total volume of the (pore) solution.

There are a number of reasons for this:

  • Taking volumes explicitly into account is not straightforward in most chemical speciation models as Donnan volumes depend on chemical composition of the pore solution, and vice versa.
    This implies that it is necessary to solve an extra equation, (or use simplified calculations that calculate volumes from ionic strength)
  • Model calculations from which available sorption parameters were derived generally did not treat these Donnan layers explicitly.
  • The “error” made by this simplification is usually small, as Donnan layers usually only take up a small percentage of total solution volume, especially in batch sorption experiments.

However, for systems with low liquid solid ratios and large surface areas per liter pore solution (e.g. clays)
the volumes of Donnan layers can take up a significant fraction of the pore space.

In ORCHESTRA it is relatively straightforward to take these volumes correctly into account.

This can be done as follows:

1) Make sure that the chemical system contains a “liter” phase to which all solution, colloidal, solid phases e.a. are linked as daughter phases.

This ensures that the “liter” phase contains the accumulated sum of chemical components in all these daughter phases, including all Donnan layers.
For each primary entity name, the variable <name>.liter thus contains the total concentration in mol/l per liter summed over  of all solution, donnan and sorption phases.


2) Define a variable “freevolume” that represents the volume of free pore water (liter free pore water solution per liter of total pore volume):

 @Var: freevolume 1.0 // default value is 1.0


3) Use this variable in the link that connects the solution with the liter phase instead of the default number 1.

@link_phase(solution, liter, "freevolume")

we can now vary the amount of freevolume per liter pore volume.


4) Introduce a dummy species “dvol” with charge 0 and fixed/given concentration of 1/mol

@species(dvol, 0)
@primary_entity(dvol, 0.0)

This dummy species just makes use of the automatic standard phase hierarchy and is used for adding up the volumes of free water and Donnan volumes. It does not interfere with the rest of the chemical system, as it has no chemical reactions defined, but it will act as a tracer chemical that freely distributes over free pore solution and donnan volumes with equal concentrations of 1 mol/l everywhere. As a result the total amount of this tracer in dvol.liter will be equal to the total volume of Donnan volumes plus free pore water volume.


5) Introduce an extra equation in the chemistry file that solves the unknown freevolume variable, to agree with the given dvol.liter = 1.

@Uneq2: unknown:(name:, freevolume,  delta:, 1e-3, type:, lin, step: , .1) equation:(name:, dvol.liter, tol: , 1e-6)

Now we are going to iteratively solve the free pore water volume to agree with a given total amount of dvol per liter of 1.

Note that we have to give the value of dvol.liter (1) as input for these calculations.