Introduction

Ultra fast Internet in XXI century is largely based on semiconductor lasers, detectors and modulators (Photonics Integrated Circuits) that are grown in the epitaxy process on InP substrates.
There are two main materials systems used to fabricate advanced semiconductor devices on InP:

This document will be devoted to the first one - InGaAsP. Band structure and optical properties of the InGaAsP material depend on it's composition - molar fractions of 4 binary materials that InGaAsP is composded of:

Usually molar fractions are depicted with equation: $In_{1-x}Ga_xAs_yP_{1-y}$, and the abbreviation commonly used is Phosphide Quaternary (PQ). Composition of grown PQ layers are assesed from measurements of Photoluminescence (PL), and from X-Ray Diffractometry (XRD).
PL allow to obtain bandgap Eg in eV.
XRD allow to get strain/mismatch.

Device designers define InGaAsP bandgap Eg and strain that they would like to achieve in particular layer. Epitaxy engineers translate target Eg and strain into molar fractions x and y (Eg,Str->x,y) with InGaAsP calculator, and then use data about solid vs vapor relations from calibration runs or growth model to set reagent flows in epitaxy reactor. After epitaxy the resulting layers are measured with PL and XRD to evaluate how close to target the outcome of the process is. Too big deviation of target vs outcome cause second iteration of epitaxial growth to get the outcome closer to target. In such case PL is translated to Eg and then, Eg and strain are put into InGaAsP calculator for inverted use case (Eg,Strain->x,y) to get x and y of outcome to calculate reagents flow correction for second growth.

The model implemented in this software is based on paper:
J. Minch, S.H. Park, T. Keating, and S.L. Chuang: "Theory and Experiment if InGaAsP and AlInGaAs Long Wavelength Strained Quantum-Well Lasers" from Journal of Quantum Electronic vol 35, NO. 5, May 1999

Reproducible Research

The equations, tables, and figures from this paper allows to reproduce and verify implementation of the relation between (Eg, Str <-> x,y) in R/C++ programming language.
This model was implemented using R and Rcpp package, which allows to merge speed of the C++ with the power of R.
Rcpp allows to use mature, and advanced C++ libraries such as Boost, Armadillo. In the package bisection for root finding algorithm was implemented from the Boost C++ library.
To facilitate reproducibility and easiness of colaboration/dissemination the model was written as R's package, with TestThat package for unit testing, and Roxygen2 for enhancing documentation of the code.
Final test of the model was to overlay it on the dataseries digitized from the paper, as we could see below, the model from the paper was reproduced very accurately.

Figures

library("ingaasp2rcpp")
data("fig1b")
par(mar=c(3,3,1.5,0))
plot(fig1b$x,fig1b$y10,t="p",xlim=c(-0.02,0.02),ylim=c(0.4,1.4),main="InGaAsP, calculated overlaid on digitized") #x=0..1, y=1
grid()
lines(ingaasp2rcpp::modPQ_EgStrain(seq(0,1,0.05),1)) #x=0..1, y=1
points(fig1b$x,fig1b$x01,col="blue") #x=0.1, y=0..1
lines(ingaasp2rcpp::modPQ_EgStrain(0.1,seq(0,1,0.05)),col="blue") #x=0.1, y=0..1
points(fig1b$x,fig1b$x0,col="magenta")
lines(ingaasp2rcpp::modPQ_EgStrain(0,seq(0,1,0.05)),col="magenta") #x=0, y=0..1
points(fig1b$x,fig1b$y0,col="brown")
lines(ingaasp2rcpp::modPQ_EgStrain(seq(0,1,0.05),0),col="brown") #x=0..1, y=0
points(fig1b$x,fig1b$y07,col="green")
lines(ingaasp2rcpp::modPQ_EgStrain(seq(0,1,0.05),0.7),col="green") #x=0..1, y=0.7
points(fig1b$x,fig1b$y09,col="orange")
lines(ingaasp2rcpp::modPQ_EgStrain(seq(0,1,0.05),0.9),col="orange") #x=0..1, y=0.9
legend("topleft",col=c("black","blue","magenta","brown","green","orange"),
       lty=1,
       legend=c("x=0..1 y=1","x=0.1  y=0..1","x=0     y=0..1","x=0..1 y=0","x=0..1 y=0.7","x=0..1 y=0.9"),
       lwd=1.5,cex=0.9,bty="n")

title(xlab="Strain [absolute units]",ylab="Eg [eV]", line=2, cex.lab=1.1, family="Calibri Light")

Fig. 1 shows relation between strain and bandgap for various InGaAsP compound cases, when one of the molar fractions is fixed, and the second varied from 0 to 1.
Points For example magenta

data("fig1a")
par(mar=c(3,3,1.5,0))
plot(fig1a$x,fig1a$Eg01,t="p",xlim=c(0,1),ylim=c(0,1),main="InGaAsP, calculated overlaid on digitized")
grid()
points(fig1a$x,fig1a$Str0,col="blue") # 0% strain line, y=ax+b - linear relation between them to get 0
lines(modPQ_XY_EgStrain(seq(0.72,1.35,0.05),0),col="red",lwd=2)
lines(modPQ_XY_EgStrain(seq(0.72,1.35,0.05),0.005),col="orange",lwd=1.5) #0.5% strain line
lines(modPQ_XY_EgStrain(seq(0.705,1.2,0.05),-0.005),col="red",lwd=1.5) #-0.5% strain line

points(fig1a$x,fig1a$Str0,col="blue") # 0 strain line, y=ax+b - linear relation between them to get 0 strain
points(fig1a$x,fig1a$Eg4,col="brown") # 
points(fig1a$x,fig1a$Eg02,col="yellow") # 
lines(modPQ_XY_EgStrain(1.3,seq(0,0.055,0.001)),col="green",lwd=1.5) #constant Eg=1.3eV, nonlinear function
lines(modPQ_XY_EgStrain(1,seq(-0.01,0.035,0.001)),col="green",lwd=1.5) #constant Eg=1eV, nonlinear relation in X, Y coordinates
lines(modPQ_XY_EgStrain(1.2,seq(-0.003,0.045,0.001)),col="green",lwd=1.5) #constant Eg=1.2eV,
legend("topleft",col=c("black","blue","magenta","brown","green","orange"),
       lty=1,
       legend=c("x=0..1 y=1","x=0.1  y=0..1","x=0     y=0..1","x=0..1 y=0","x=0..1 y=0.7","x=0..1 y=0.9"),
       lwd=1.5,cex=0.9,bty="n")


krzyklo/ingaasp2rcpp documentation built on Nov. 6, 2021, 7:49 a.m.