Published: Oct 2, 2018 by Noe Nieto
Exercising the transfer matrix method
I’m attending a class on Electromagneting Wave Propagation in the Instituto de Ingeniería, UABC Mexicali, with Dr. Carlos Villa Angulo. He kindly allowed me to go to the class altough i’m not currently enrolled as a graduate student. Here in Mexico we say that I’m attending as “Listener (oyente)”. I don’t know the exact term used in english for this but I know nobody visits my blog, so it doesn’t matter anyway.
We are now in the 5th or 6th week of the course and we are now studying the Transfer Matrix Method to understand the propagation of electromagnetic waves (e.g. Light) through different layers of materials with different reflection and absoroption coefficients. There are a lot of applications for this method, and is one used to simulate the absorption of light in a solar cell with multple layers.
Since we are just a few people in the class room (9) the professor assigned a different device for each sudent and everyone must make a presentation and write a detailed report with the calculations made.
The device
My device has 4 layers: ITO (IndiumTinOxide), aSin, aSip and Aluminum. Let’s picture that with majestic detail using our latest, state of the art, ASCII 2D diagrams (but using UTF8, sorry):
~ ~ ~ Air ~ ~ ~
++ <+ Interface 1
 ITO (200nm)  <+ Layer 1
++ <+ Interface 2
 
 aSip (300 nm)  <+ Layer 2
 
++ <+ Interface 3
 
 aSin (10 µm)  <+ Layer 3
~ ~
~ ~
++ <+ Interface 4
 Al (500 nm)  <+ Layer 4
++
* Important: not to scale
Final note (yet important): the professor assigned us to analyze the electric field in only one layer, which in my case is the layer number three, only on the 600nm wavelenght! After this exercise I might post a followup with the analysis of the electric field for all the layers.
So let’s get our hands dirty, will ya?
Step 1: Get the coefficients for the materials
We need to model the behavior of light when it goes through the differnt layers of our device. For that we will use the complex refractive indexes for each material on our device (including air).
The guys at PV Lighthouse are kind enough to publish refractive index tables for a wide variety of materials, including Silicon. They even add the citation of their references!. So, for my own convenience, I’m going to include a small table with the real and imaginary part of all the materials needed to build the device above @ 600 nm.
Layer  λ (nm)  n  k  Notes 

0 (air)  600  1.0  0.0  [Lei18] 
1 (ITO)  600  2.134  8.370E4  ITO Sputtered @1.2e20 cm3 (Lei18) 
2 (aSip)  600  3.710  8.496E2  type amorphous silicon deposited by PECVD (Lei18) 
3 (aSin)  600  3.934  8.559E2  ntype amorphous silicon deposited by PECVD (Lei18) 
4 (Al)  600  1.200  7.260  [Pal85b] 
Table 1  Refractive indexes for Air, ITO, aSi and Al
Step 2: Compute reflection and transmission at the interfaces
The first interface ( ( I_0) ) is between the air and ITO
Air ITO
++
 
+ Transmission > 
 
+> 
 
< Reflection + 
 
 
++
Layer 0  Layer 1

+> Interface 0
The reflection on the interface 3 is right inbetween layer 2 and 3, so i’ll name it ( r_{23} ). It’s calculated by the following expression:
… so … :
The transmission of the interface 3 is, conversely:
Working with complex numbers by using paper and pencil (and maybe a calculator) is no fun, and prone to errors. So I wrote these python functions to compute the transmission and reflection coefficients:
def transmission(n1, n2):
"""
Compute the transmission coefficient between two materials.
Both n1, n2 are the complex refractive indexes for both materials.
"""
return 1 + (n2  n1) / (n2 + n1)
def reflection(n1, n2):
"""
Compute the transmission coefficient between two materials.
Both n1, n2 are the complex refractive indexes for both materials.
"""
return (n2  n1) / (n2 + n1)
Let’s take this functions and test them with our own values:
>>> n2 = 3.710 + 0.08496j
>>> n3 = 3.934 + 0.08559j
>>> reflection(n2, n3)
(0.0292912867293386660.0005711183871910915j)
>>> tmm.transmission(n2, n3)
(1.02929128672933870.0005711183871910915j)
… it works, good.
Interface matrix
The interface matrix describes the effect on the incident field (e.g. light at λ=600nm) when it impacts interface 3. The interface matrix ( I_{23} ), is defined as follows:
After substitution, ( I_{23} ) becomes this:
Which is becoming a bit startling …
… for mere mortals. Yet we are still here, aren’t we?
Python does not support matrices out of the box, but with a little help of numpy we can solve this matrix in no time:
import numpy
>>> n2 = 3.710 + 0.08496j
>>> n3 = 3.934 + 0.08559j
>>> r_23 = reflection(n2, n3)
>>> t_23 = transmission(n2, n3)
>>> 1/t_23
(0.9715419774918925+0.0005390752787160436j)
>>> print(numpy.array([[1, r_23], [r_23, 1]]))
[[1. +0.j 0.029291290.00057112j]
[0.029291290.00057112j 1. +0.j ]]
>>> I_23 = 1/t_23 * numpy.array([[1, r_23], [r_23, 1]])
[[0.97154198+0.00053908j 0.028458020.00053908j]
[0.028458020.00053908j 0.97154198+0.00053908j]]
>>> print(I_23)
[[0.97154198+0.00053908j 0.028458020.00053908j]
[0.028458020.00053908j 0.97154198+0.00053908j]]
Propagation matrix
The propagation matrix describe the effect on the incident field when it propagates through the layer. To find this matrix we need to calculate the propagation coefficient (phase differential?) for the silicon layer 3 at λ= 600 nm. We will use the phasorial notation, which is easier to deal with:
$$
Where:
 ( n_3 ) is the real par of the complex index of diffraction of layer 3 (n=3.934).
 ( \phi_3 ) is the angle of incidence of the light
 ( d_z ) is the height of layer 3 , which in my case is 10 µm.
So ( \beta_3 ) becomes:
Now we can assemble the propagation matrix:
References
 [Lei18] M. Leilaeioun, Z.J. Yu, S. Manzoor, K. Fisher, J. Shi and Z. Holman, ‘Design of the front transparent conductive oxide layer of silicon heterojunction solar for fourterminal tandem applications’, In preparation 2018.
 [Pal85b] E. Palik, Handbook of Optical Constants of Solids Vol I, Academic Press, Orlando, pp. 397–400, 1985.