Tests for thin layers
Scott Prahl
May 2024
Adding-doubling starts with a thin layer and then add the thin layer to itself or double it. Obviously the accuracy of the calculation depends on producing a thin layer with the right thinness and the properties that characterize it.
In this notebook, are shown two different methods for calculating the thin layer.
[1]:
import numpy as np
import iadpython
Zero thickness layer
Since I wanted the limiting cases of graphs to be correct, I wanted to correctly implement a zero thickness layer. This is trivial for index-matched samples, but when the sample has a non-unity index of refraction
This is tricky to implement because it is really easy to end up dividing by zero.
[2]:
s = iadpython.Sample(n=1.5, quad_pts=8)
r, t = iadpython.zero_layer(s)
s.wrmatrix(r)
s.wrmatrix(t)
cos_theta | 0.05175 0.24597 0.49938 0.69360 0.76791 0.84962 0.94593 1.00000 | flux
----------+-------------------------------------------------------------------------+---------
0.05175 | 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 | 0.00000
0.24597 | 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 | 0.00000
0.49938 | 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 | 0.00000
0.69360 | 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 | 0.00000
0.76791 | 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 | 0.00000
0.84962 | 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 | 0.00000
0.94593 | 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 | 0.00000
1.00000 | 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 | 0.00000
----------+-------------------------------------------------------------------------+---------
flux | 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 | 0.00000
cos_theta | 0.05175 0.24597 0.49938 0.69360 0.76791 0.84962 0.94593 1.00000 | flux
----------+-------------------------------------------------------------------------+---------
0.05175 | 74.52736 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 | 1.00000
0.24597 | 0.00000 8.36376 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 | 1.00000
0.49938 | 0.00000 0.00000 4.11964 0.00000 0.00000 0.00000 0.00000 0.00000 | 1.00000
0.69360 | 0.00000 0.00000 0.00000 5.56066 0.00000 0.00000 0.00000 0.00000 | 1.00000
0.76791 | 0.00000 0.00000 0.00000 0.00000 11.59817 0.00000 0.00000 0.00000 | 1.00000
0.84962 | 0.00000 0.00000 0.00000 0.00000 0.00000 5.95335 0.00000 0.00000 | 1.00000
0.94593 | 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 6.31230 0.00000 | 1.00000
1.00000 | 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 31.41641 | 1.00000
----------+-------------------------------------------------------------------------+---------
flux | 1.00000 1.00000 1.00000 1.00000 1.00000 1.00000 1.00000 1.00000 | 1.00000
IGI start method
The Infinitesimal Generator Method (IGI) is one of the two methods available to create a starting layer. Wiscombe wrote a paper that showed that the diamond initialization is generally better than this method. Since the IGI method does particularly poorly with highly anisotropic scattering samples, it is no longer used. So the IGI implementation just sits there.
These two test just verify that things work.
[3]:
s = iadpython.Sample(a=1, b=100, g=0)
r, t = iadpython.igi(s)
s.wrmatrix(r)
s.wrmatrix(t)
cos_theta | 0.08859 0.40947 0.78766 1.00000 | flux
----------+-------------------------------------+---------
0.08859 | 1.55547 0.33652 0.17494 0.13780 | 0.27559
0.40947 | 0.33652 0.07281 0.03785 0.02981 | 0.05962
0.78766 | 0.17494 0.03785 0.01968 0.01550 | 0.03100
1.00000 | 0.13780 0.02981 0.01550 0.01221 | 0.02441
----------+-------------------------------------+---------
flux | 0.27559 0.05962 0.03100 0.02441 | 0.04883
cos_theta | 0.08859 0.40947 0.78766 1.00000 | flux
----------+-------------------------------------+---------
0.08859 | 13.04576 0.33652 0.17494 0.13780 | 0.72441
0.40947 | 0.33652 2.84330 0.03785 0.02981 | 0.94038
0.78766 | 0.17494 0.03785 1.83038 0.01550 | 0.96900
1.00000 | 0.13780 0.02981 0.01550 7.62158 | 0.97559
----------+-------------------------------------+---------
flux | 0.72441 0.94038 0.96900 0.97559 | 0.95117
[4]:
s = iadpython.Sample(a=1, b=100, g=0.9, quad_pts=4)
r, t = iadpython.igi(s)
s.wrmatrix(r)
s.wrmatrix(t)
cos_theta | 0.08859 0.40947 0.78766 1.00000 | flux
----------+-------------------------------------+---------
0.08859 | 3.19060 0.51300 0.09360 -0.01636 | 0.33415
0.40947 | 0.51300 0.04916 0.00524 0.00941 | 0.03956
0.78766 | 0.09360 0.00524 0.00250 0.00486 | 0.00723
1.00000 | -0.01636 0.00941 0.00486 -0.00628 | 0.00409
----------+-------------------------------------+---------
flux | 0.33415 0.03956 0.00723 0.00409 | 0.02988
cos_theta | 0.08859 0.40947 0.78766 1.00000 | flux
----------+-------------------------------------+---------
0.08859 | 9.56148 0.66419 0.16129 -0.01868 | 0.66585
0.40947 | 0.66419 2.80843 0.07395 0.02700 | 0.96044
0.78766 | 0.16129 0.07395 1.83985 0.07886 | 0.99277
1.00000 | -0.01868 0.02700 0.07886 7.57767 | 0.99591
----------+-------------------------------------+---------
flux | 0.66585 0.96044 0.99277 0.99591 | 0.97012
Diamond Initialization
[5]:
s = iadpython.Sample(a=1, b=100, g=0.0, quad_pts=4)
r, t = iadpython.diamond(s)
rr = np.array(
[
[1.04004, 0.27087, 0.14472, 0.11473],
[0.27087, 0.07055, 0.03769, 0.02988],
[0.14472, 0.03769, 0.02014, 0.01596],
[0.11473, 0.02988, 0.01596, 0.01266],
]
)
tt = np.array(
[
[15.57900, 0.27087, 0.14472, 0.11473],
[0.27087, 2.86214, 0.03769, 0.02988],
[0.14472, 0.03769, 1.83444, 0.01596],
[0.11473, 0.02988, 0.01596, 7.63134],
]
)
print("r true")
s.wrmatrix(rr)
print("r ")
s.wrmatrix(r)
print("===============================================================")
print("t true")
s.wrmatrix(tt)
print("t ")
s.wrmatrix(t)
r true
cos_theta | 0.08859 0.40947 0.78766 1.00000 | flux
----------+-------------------------------------+---------
0.08859 | 1.04004 0.27087 0.14472 0.11473 | 0.21605
0.40947 | 0.27087 0.07055 0.03769 0.02988 | 0.05627
0.78766 | 0.14472 0.03769 0.02014 0.01596 | 0.03006
1.00000 | 0.11473 0.02988 0.01596 0.01266 | 0.02383
----------+-------------------------------------+---------
flux | 0.21605 0.05627 0.03006 0.02383 | 0.04488
r
cos_theta | 0.08859 0.40947 0.78766 1.00000 | flux
----------+-------------------------------------+---------
0.08859 | 1.04004 0.27087 0.14472 0.11473 | 0.21605
0.40947 | 0.27087 0.07055 0.03769 0.02988 | 0.05627
0.78766 | 0.14472 0.03769 0.02014 0.01596 | 0.03006
1.00000 | 0.11473 0.02988 0.01596 0.01266 | 0.02383
----------+-------------------------------------+---------
flux | 0.21605 0.05627 0.03006 0.02383 | 0.04488
===============================================================
t true
cos_theta | 0.08859 0.40947 0.78766 1.00000 | flux
----------+-------------------------------------+---------
0.08859 | 15.57900 0.27087 0.14472 0.11473 | 0.78395
0.40947 | 0.27087 2.86214 0.03769 0.02988 | 0.94373
0.78766 | 0.14472 0.03769 1.83444 0.01596 | 0.96993
1.00000 | 0.11473 0.02988 0.01596 7.63134 | 0.97617
----------+-------------------------------------+---------
flux | 0.78395 0.94373 0.96993 0.97617 | 0.95512
t
cos_theta | 0.08859 0.40947 0.78766 1.00000 | flux
----------+-------------------------------------+---------
0.08859 | 15.57900 0.27087 0.14472 0.11473 | 0.78395
0.40947 | 0.27087 2.86214 0.03769 0.02988 | 0.94373
0.78766 | 0.14472 0.03769 1.83444 0.01596 | 0.96994
1.00000 | 0.11473 0.02988 0.01596 7.63134 | 0.97617
----------+-------------------------------------+---------
flux | 0.78395 0.94373 0.96994 0.97617 | 0.95512