In [1]:
import numpy as np
import escape as esc

esc.require("0.9.8")
Loading material database from C:\dev\escape-core\python\src\escape\scattering\..\data\mdb\materials.db

Quaternary Alloy HRXRD: In(x)Ga(1-x)As(y)P(1-y) on InP¶

This notebook demonstrates HRXRD simulation of a quaternary alloy epilayer In(x)Ga(1-x)As(y)P(1-y) on an InP substrate. Quaternary alloys have two independent composition parameters, allowing independent control of bandgap and lattice match.

Physical model¶

The lattice parameter is obtained by bilinear interpolation over four binary endpoint compounds:

$a(x,y) = (1-x)(1-y)\,a_{\text{GaP}} + x(1-y)\,a_{\text{InP}} + (1-x)y\,a_{\text{GaAs}} + xy\,a_{\text{InAs}}$

The mapping is: A=Ga, B=In (controlled by x), C=P, D=As (controlled by y). The four endpoints are therefore GaP (AC), InP (BC), GaAs (AD), InAs (BD).

The epitaxial strain model applies the same Poisson distortion as the binary case, with the substrate being InP.

Lattice-matched condition¶

For InP substrate ($a=5.8687$ A), the lattice-matched composition satisfies $a(x,y) = a_{\text{InP}}$. A common telecom composition is In(0.53)Ga(0.47)As(0.77)P(0.23), which is nearly lattice-matched to InP.

References¶

  • Vegard, L. (1921). Z. Physik 5, 17-26.
  • Stepanov et al., Phys. Rev. B 57, 4829-4841 (1998).
  • Adachi, S. (1992). Physical Properties of III-V Semiconductor Compounds.

1. Define parameters¶

In [2]:
src = esc.xrays(1.540562, units="angstrom")

x_In = esc.par("x(In)", 0.53, userlim=[0, 1])
y_As = esc.par("y(As)", 0.77, userlim=[0, 1])

R = esc.par("Relaxation", 0.0, userlim=[0, 1], fixed=True)
nu = esc.par("C12/C11", 0.45, fixed=True)

layer_thkn = esc.par("InGaAsP Thkn", 300.0, units="A")
layer_rough = esc.par("InGaAsP RMS", 2.0, units="A")
sub_rough = esc.par("Sub RMS", 1.0, units="A")

2. Build quaternary alloy unit cell¶

Define four binary endpoint unit cells and use quaternary_alloy_unitcell for bilinear interpolation. Then apply epitaxial strain relative to the InP substrate.

In [3]:
gap_ucell  = esc.unitcell(5.4505, 5.4505, 5.4505, 90, 90, 90)  # GaP  (AC)
inp_ucell  = esc.unitcell(5.8687, 5.8687, 5.8687, 90, 90, 90)  # InP  (BC)
gaas_ucell = esc.unitcell(5.6532, 5.6532, 5.6532, 90, 90, 90)  # GaAs (AD)
inas_ucell = esc.unitcell(6.0583, 6.0583, 6.0583, 90, 90, 90)  # InAs (BD)

sub_ucell = esc.unitcell(5.8687, 5.8687, 5.8687, 90, 90, 90)   # InP substrate

quat_ucell = esc.quaternary_alloy_unitcell(
    x_In, y_As,
    gap_ucell, inp_ucell,   # AC, BC  (y=0 row: phosphides)
    gaas_ucell, inas_ucell, # AD, BD  (y=1 row: arsenides)
    name="InGaAsP")

epi_ucell = esc.epitaxial_unitcell(quat_ucell, sub_ucell, R, nu,
                                   name="InGaAsP epi")

print("Quaternary unit cell parameters:")
for p in quat_ucell.parameters:
    print(f"  {p.name} = {p.value}")
Quaternary unit cell parameters:
  x(In) = 0.53
  y(As) = 0.77

3. Build sample¶

Single InGaAsP layer on InP substrate.

In [4]:
layer_mat = esc.crystal(mid="InP", density="mdb", ucell=epi_ucell)
sub_mat   = esc.crystal(mid="InP", density="mdb", ucell=sub_ucell)

layer = esc.layer(material=layer_mat, thkn=layer_thkn, rough=layer_rough)
substrate = esc.substrate(material=sub_mat, rough=sub_rough)

sample = esc.multilayer(frgr=esc.air(), bkgr=substrate)
stack = esc.layer_stack(repeat=1)
stack.add(layer)
sample.add(stack)

p1 = sample.show(source=src, profile="sld0re")
p2 = sample.show(source=src, profile="sld0im")
esc.show(p1, p2)
Out[4]:
MultiObjectLayout(children=(HTML(value='', layout=Layout(grid_area='footer')), ParametersPanel(children=(Indep…

4. Simulate HRXRD (004) rocking curve¶

In [5]:
K0 = 2.0 * np.pi / src.wavelength
theta = np.linspace(30.0, 33.0, 1000)
p0_vals = K0 * np.sin(np.deg2rad(theta))

p0 = esc.var("p0")
hrxrd = esc.spechrxrd(p0, sample, h=0, k=0, l=4, beta=1.0,
                      formalism="2x2", source=src, name="InGaAsP/InP HRXRD")

hrxrd.show(coordinates=p0_vals).config(ylog=True, xlabel="Kz [1/A]",
                                       ylabel="Intensity")
Out[5]:
FunctorObjectLayout(children=(HTML(value='', layout=Layout(grid_area='footer')), ParametersPanel(children=(Ind…