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:
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
Edit Makefile to select the .so (linux) or the .dylib (MacOS) shared library
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.