knitr::opts_chunk$set(echo = TRUE)

DOI Build Status

Intro

This is the R package which ties model of bandgap(Eg) and strain vs x (Ga) and Y(As) molar fractions in InGaAsP material. The model 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 Electronics vol 35, NO. 5, May 1999

The model allows to transform Eg, Strain into molar fractions x(Ga), and y(As) and back:
$Eg,Strain <--> x,y$

The intention behind this was to exercise good coding practices in R:

Installation

Type the commands below in R or RStudio:

install.packages("devtools")

devtools::install_github("krzyklo/ingaasp2rcpp")

The package location on GitHub: https://github.com/krzyklo/ingaasp2rcpp.

InGaAsP Calculator in web browser

InGaAsP calculator as simple web application written in Shiny - web application framework for R:

https://krzyklo.shinyapps.io/ingaasp/

Figures - comparison with reference paper

The figures below shows digitized data (circles) and InGaAsP calculator results (lines) for $Eg,Strain <-> x,y$ transformations in both directions. As we could see below the model accurately reproduces the data from the figures in reference paper.

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")

The plot above shows the relation between bandgap Eg and strain of various InGaAsP composition variants. It was created by fixing x or y molar fractions, and then vary the other molar fraction between 0 and 1. For example, InP material used as substrate have x=0 and y=0, and is located at r modPQ_Eg_XY(0,0) eV and 0 strain. InP location is at crossing point of two ternaries: magenta ($InAs_yP_{1-y}$) and brown ($In_{1-x}Ga_xP$) data series. For $InAs_yP_{1-y}$ by adding more As, the layer on InP substrate become compressively strained (negative sign of strain), and bandgap decrease, as we go toward InAs material.
Adding Ga to InP would increase tensile strain (+ sign) of resulting ($In_{1-x}Ga_xP$), but bandgap Eg changes very little on the path toward GaP material.
The black data series is $In_{1-x}Ga_xAs$ material, it shows the lowest limits of bandgap achievable in the InGaAsP compound, and it could be compressively or tensily strained.
The 0 strain molar fractions for $In_{1-x}Ga_xAs$ are Ga=r round(ingaasp2rcpp::PQ_X_YStrain(1,0),digits=3), and bandgap of this InGaAs lattice matched to InP is r round(PQ_Eg_XY(PQ_X_YStrain(1,0),1),digits=2) eV.

x<-round(ingaasp2rcpp::PQ_X_YStrain(1,0),digits=3)
round(PQ_Eg_XY(x,1),digits = 2)
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="blue",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","yellow","brown","blue","orange","red","green"),
       lty=1,
       legend=c("Eg=1.3eV","Eg=1.2eV","Eg=1.0eV","0% strain","0.5% strain","-0.5% strain", "Eg fitting"),
       lwd=2,cex=0.9,bty="n")
title(xlab="X (Ga molar fraction)", ylab="Y (As molar fraction", line=2, cex.lab=1.1)

In the plot above two types of x and y relation are shown. Firstly, for the cases where strain was fixed, and Eg was varied. The second, where Eg was fixed, and strain varied. Plot of X, and Y molar fractions as function of Eg, and strain is less straightforward to generate, as not all combinations of Eg and strain values have physical meaning (x and y values smaller than 1), and root finding technique need to be employed (bisection). An example of unphysical result is Eg=0.7eV, and 0 strain. This pair is leading to y composition larger than 1.

round(modPQ_XY_EgStrain(0.7,0),3)

Constant strain lead to linear dependence between x and y molar fractions. In the plot 0% strain is shown with blue color, whereas -0.5% and 0.5% strain with red and orange respectively.

Information about Objects and Functions

The naming convention used in this package is that all functions exported for user are starting with PQ or modPQ prefix, with a few exceptions. PQ functions are not vectorized, user should work with modPQ functions which are vectorized. After prefix, there is underscore and return variable(s), followed by second underscore with input arguments.
For example modPQ_X_EgStrain means that function will return x (Ga molar fraction), and take bandgap Eg and Strain in absolute units as input arguments.

After installation please type library(help="ingaasp2rcpp") to see all the objects from the package with brief description. Below is the list of functions, and their arguments:

lsf.str("package:ingaasp2rcpp")

Typical usage

Calculate what target composition have InGaAsP layer with given PL and target, eg. PL=1200nm, strain=0%:

modPQ_XY_EgStrain(modPQ_PL2Eg(1200),0)

Calculate composition of the outcome of growth eg. PL=1220nm, strain=500 ppm:

modPQ_XY_EgStrain(modPQ_PL2Eg(1220),500/1e6)

Then growth model is used to modify reagents flow, to obtain outcome closer to target.



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