Adding-Doubling is a technique developed by van de Hulst that generates fast and accurate estimates of light distributions in any biological tissue (a short bibliography). Since this fast and accurate model is intended for light propagation in biological tissues, the particular features associated with this medium must be incorporated:

- There should be no restriction on the ratio of scattering to absorption, since the ratio varies from nearly zero in the both the ultraviolet (due to protein absorption) and the mid-infrared (due to water absorption) to large values in the therapeutic window in the red and near-infrared.
- There should be no restrictions on the scattering anisotropy, since tissue scattering tends to be strongly forward-peaked (0.7-0.99).
- Internal reflection at boundaries should be included, since air-tissue interfaces are common.

The doubling method assumes knowledge of the reflection and transmission properties for a single thin homogeneous layer. The reflection and transmission of a slab twice as thick is found by juxtaposing two identical slabs and summing the contributions from each slab. The reflection and transmission for an arbitrarily thick slab are obtained by repeatedly doubling until the desired thickness is reached. The adding method extends the doubling method to dissimilar slabs, thereby allowing one to simulate media with different layers and/or internal reflection at boundaries.

Two methods, discrete ordinates and adding-doubling, allow accurate solution of the radiative transport equation for anisotropic scattering and mismatched boundaries. Adding-doubling works naturally with layered media and yields reflection and transmission readily, while discrete ordinates generates internal fluences easily. I selected the adding-doubling method because reflectance is important for diagnostic applications using light. Furthermore when measuring the optical properties of a sample, the only values needed are the total reflection and transmission of the sample.

I wrote a book chapter that summarizes my implementation of the adding-doubling program available below. The typos are summarized in an errata list and these are fixed in the revised chapter. I have also created a text file with a more thorough listing of results for section 5.3.5. Last but not least, you can download a complete listing of the adding-doubling program for actual code to do adding-doubling.

Martin Hammer wrote a small Mathematica 3.0 notebook that implements the core of the adding-doubling method. It does not include boundaries or internal sources, and it is much slower than the same code written directly in C. However, it is a nice piece of work by Martin Hammer and allows one to do adding-doubling calculations in a convenient interactive fashion. It is also small, and if you have Mathematica, you can be up and running immediately.

This adding-doubling code is written in CWeb that facilitates commenting code. An excellent commented source listing is available, If you are interested in code then look on the IAD Github page for download links. (The adding-doubling code can be built/compiled separately from the inverse code.)

A shared-library of all the adding-doubling routines is also available on github

git clone https://github.com/scottprahl/iad.git

cd iad

Edit Makefile to select the .so (linux) or the .dylib (MacOS) shared library

make install-lib

I have created Python Interfaces to Adding-Doubling that are also available on Github. These rely on the shared library above but if that is installed, the python code is indexed by Python Package Index (PyPI) and can be installed by

pip install iadpython

If you want the inverse calculation then you are probably interested in the Inverse Adding-Doubling page.