Lecture 21.2
NEMO 3-D — strain: balls and springs
In the lecture
- An epitaxial layer on a substrate of a different lattice constant deforms: InAs on GaAs is compressed in the plane and stretches along the growth direction.
- The valence force field (VFF): atoms are balls, bonds are springs, with an energy \(E = \sum_\text{bonds}\frac12\alpha(\Delta d)^2 + \sum_\text{angles}\frac12\beta(\Delta\theta)^2\).
- NEMO 3-D places every atom on an ideal site and minimizes this energy over all positions; the strain tensor is an output of the relaxed positions, not an input.
- How strain moves band edges (deformation potentials) and splits heavy and light holes.
- How shear strain creates a piezoelectric polarization, a bound charge and a potential.
In this notebook
- Compute the elastic constants of Keating's force field and compare them with its closed-form expressions and with measured values.
- Relax a pseudomorphic InAs film with open-nemo's valence force field and compare its vertical lattice constant with the continuum formula \(a_\perp = a_0 - 2(C_{12}/C_{11})(a_s - a_0)\), over a range of mismatches.
- Shift the band edges of strained InAs with the deformation potentials of the slide and with strained sp3d5s* tight binding.
- Compute the piezoelectric potential of a small strained InAs pyramid in GaAs.
Run it on your own machine
The notebook needs open-nemo (Python ≥ 3.10 and a C++20 compiler; BLAS/LAPACK).
git clone https://github.com/denphi/open-nemo.git && cd open-nemo
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[notebooks]"
jupyter lab From_Atoms_to_Devices/07_quantum_dots_and_nemo3d/21_2_strain_balls_and_springs.ipynb
Code
import time
import numpy as np
import matplotlib.pyplot as plt
import opennemo as nemo
from opennemo.visualization import style
from opennemo.models import mechanics as M
from opennemo.models import polarization as pz
from opennemo.simulations.piezoelectric import polarization_potential
from opennemo.structures.structure import Structure, bulk
style.use(notebook=True)
P = nemo.structures.materials.load("klimeck2002_sp3d5s")
GAAS, INAS = P["GaAs"], P["InAs"]
aG, aI = GAAS.lattice_constant, INAS.lattice_constant
# Martin's (1970) Keating constants alpha, beta (N/m) with the ideal bonds of this parameter set
KEATING = {("Ga", "As"): (41.19, 8.95, np.sqrt(3) / 4 * aG),
("In", "As"): (35.18, 5.50, np.sqrt(3) / 4 * aI)}
keating = lambda s: M.Keating(s, parameters=KEATING)
1. Lattice mismatch: an epitaxial layer deforms#
GaAs and InAs have the same zincblende structure, but InAs has a 7 % larger lattice constant (\(a_0\) = 0.6058 nm against \(a_s\) = 0.5653 nm for GaAs). When a thin InAs layer is grown on a thick GaAs substrate, the InAs bonds in the growth plane must match the substrate, so the layer is compressed in the plane. It responds by stretching along the growth direction. These deformations, and the islands (quantum dots) that form to relieve them, must be captured by the model.
In continuum elasticity, a cubic crystal biaxially strained in the (001) plane, \(\varepsilon_{xx} = \varepsilon_{yy} = \varepsilon_\parallel = (a_s - a_0)/a_0\), is free of stress along \(z\) (\(\sigma_{zz} = C_{12}\varepsilon_{xx} + C_{12}\varepsilon_{yy} + C_{11}\varepsilon_{zz} = 0\)), so
where \(C_{11}\) and \(C_{12}\) are the elastic constants of the layer. Klimeck stresses that in NEMO 3-D this formula is not used: the strain is a natural result of the interactions between the atoms.
2. The valence force field: atoms are balls, bonds are springs#
Each bond has a natural length \(d_0\) and each pair of bonds at an atom a natural angle \(\theta_0 = \arccos(-1/3) = 109.47°\). Deforming either costs energy:
with two constants per material: \(\alpha\) resists stretching and \(\beta\) resists bending. The sums run over every bond and every angle of the structure, with the constants of each bond type in a heterostructure. Keating's (1966) form, which open-nemo and NEMO 3-D use, writes the same physics with squared lengths and dot products,
which is rotation invariant and reduces to the slide's form for small deformations. More sophisticated force fields exist (NEMO 3-D has some), but two constants already give the three cubic elastic constants:
Since there are only two parameters, the three constants cannot all be fitted: Martin (1970) chose \(\alpha\) and \(\beta\) to reproduce \(C_{11}\) and \(C_{12}\) as well as possible, and \(C_{44}\) follows. open-nemo computes them from the strain energy of the relaxed bulk cell:
Code
measured = {"GaAs": (118.8, 53.8, 59.4), "InAs": (83.3, 45.3, 39.6)} # GPa, room temperature
ec = {}
print(f"{'':5s} {'':10s} {'C11':>7s} {'C12':>7s} {'C44':>7s} (GPa)")
for name, mat, pair in (("GaAs", GAAS, ("Ga", "As")), ("InAs", INAS, ("In", "As"))):
al, be, _ = KEATING[pair]
a = mat.lattice_constant * 1e-9
ec[name] = M.elastic_constants(keating, bulk(nemo.structures.lattice.from_material(mat)))
closed = ((al + 3 * be) / a / 1e9, (al - be) / a / 1e9, 4 * al * be / (a * (al + be)) / 1e9)
print(f"{name:5s} {'open-nemo':10s} {ec[name]['C11']:7.1f} {ec[name]['C12']:7.1f} {ec[name]['C44']:7.1f}")
print(f"{'':5s} {'formula':10s} {closed[0]:7.1f} {closed[1]:7.1f} {closed[2]:7.1f}")
m = measured[name]
print(f"{'':5s} {'measured':10s} {m[0]:7.1f} {m[1]:7.1f} {m[2]:7.1f}")
C11 C12 C44 (GPa)
GaAs open-nemo 120.4 57.0 52.0
formula 120.4 57.0 52.0
measured 118.8 53.8 59.4
InAs open-nemo 85.3 49.0 31.4
formula 85.3 49.0 31.4
measured 83.3 45.3 39.6The relaxed-cell elastic constants agree with the closed-form Keating expressions. \(C_{11}\) and \(C_{12}\) are within 1–8 % of the measured values (slightly high), while \(C_{44}\) is 12 % low for GaAs and 21 % low for InAs. This is the price of a two-parameter model.
3. How NEMO 3-D uses the force field: strain is an output#
NEMO 3-D places every atom on an ideal lattice site, then minimizes the total spring energy over all atom positions (here with L-BFGS); the relaxed bond lengths and angles define the strain. The relaxed positions — not the strain — are passed on to the tight-binding Hamiltonian, which depends on every bond's length and direction. Splittings of degenerate bands then emerge from the deformations themselves.
The test case of slide 3: an InAs film, 6 cubic cells (3.6 nm) thick, on a GaAs substrate of 4 cells whose bottom cell is held fixed, periodic in the plane with the GaAs period and free at the top surface. The vertical lattice constant is read from the spacing of the In planes in the film.
Code
def zincblende_block(lat, nxy, nz, a_plane=None):
# nxy x nxy x nz cubic cells; positions, sublattice and species, in-plane period a_plane
cell, basis, sub = lat.conventional, lat.conventional_basis, lat.conventional_sublattice
g = np.stack(np.meshgrid(np.arange(nxy), np.arange(nxy), np.arange(nz), indexing="ij"), -1).reshape(-1, 3)
X = ((g @ cell)[:, None, :] + basis[None]).reshape(-1, 3)
if a_plane is not None:
X[:, :2] *= a_plane / lat.conventional[0, 0]
sl = np.tile(sub, len(g))
return X, sl, [lat.species[i] for i in sl]
latG = nemo.structures.lattice.from_material(GAAS)
NXY, NSUB, NFILM = 3, 4, 6
X, sl, sp = zincblende_block(latG, NXY, NSUB + NFILM)
in_film = X[:, 2] > NSUB * aG - 1e-9
sp = ["In" if (f and c == "Ga") else c for c, f in zip(sp, in_film)]
film = Structure(X, sp, np.diag([NXY * aG, NXY * aG, 0.0])[:2], sl, latG)
t0 = time.perf_counter()
r = M.relax(keating(film), fixed=X[:, 2] < aG - 1e-9, tol=1e-7)
z, spa = r["positions"][:, 2], np.array(sp)
z_in = np.unique(np.round(z[spa == "In"], 6))
z_ga = np.unique(np.round(z[spa == "Ga"], 6))
a_perp_vff = 2 * np.median(np.diff(z_in))
C11, C12 = ec["InAs"]["C11"], ec["InAs"]["C12"]
a_perp_lin = aI - 2 * C12 / C11 * (aG - aI)
print(f"{film.num_atoms} atoms, {r['iterations']} L-BFGS steps, {time.perf_counter() - t0:.2f} s")
print(f"GaAs substrate: vertical lattice constant {2 * np.median(np.diff(z_ga)):.5f} nm (bulk {aG:.5f})")
print(f"InAs film: a_perp = {a_perp_vff:.5f} nm from the relaxed atoms")
print(f"continuum: a_perp = a0 - 2 C12/C11 (as - a0) = {a_perp_lin:.5f} nm "
f"(2 C12/C11 = {2 * C12 / C11:.3f})")
st = M.atomic_strain(film, r["positions"], lattice_constants={("In", "As"): aI, ("Ga", "As"): aG})
core = st["valid"] & (spa == "In") & (z > (NSUB + 2) * aG) & (z < (NSUB + 4) * aG)
eps = st["strain"][core].mean(axis=0)
print("strain tensor of the film's interior (from the relaxed bonds):")
print(np.array2string(eps, precision=4, suppress_small=True))
print(f"eps_par = (as - a0)/a0 = {(aG - aI) / aI:.4f}")
720 atoms, 146 L-BFGS steps, 0.03 s GaAs substrate: vertical lattice constant 0.56533 nm (bulk 0.56533) InAs film: a_perp = 0.64926 nm from the relaxed atoms continuum: a_perp = a0 - 2 C12/C11 (as - a0) = 0.65237 nm (2 C12/C11 = 1.149) strain tensor of the film's interior (from the relaxed bonds): [[-0.0669 -0. -0. ] [-0. -0.0669 -0. ] [-0. -0. 0.0717]] eps_par = (as - a0)/a0 = -0.0669
The substrate keeps its bulk lattice constant and the film takes the GaAs period in the plane: \(\varepsilon_{xx} = \varepsilon_{yy} = -6.69\,\%\) comes out of the relaxed bonds, together with \(\varepsilon_{zz} = +7.17\,\%\) and no shear. The relaxed \(a_\perp\) = 0.6493 nm is 0.003 nm below the continuum value 0.6524 nm. At a mismatch of 7 % the difference is not an error of either model: the continuum formula is linear in the strain, while Keating's energy, written with squared lengths, is not. A sweep of the substrate lattice constant shows the two agree for small mismatch. Here the "substrate" is an InAs film whose in-plane period is set to \(a_s\), with only its bottom two atomic planes held.
Code
latI = nemo.structures.lattice.from_material(INAS)
f_mis = np.linspace(-0.08, 0.04, 13) # (a_s - a0) / a0
ezz_vff = []
for f in f_mis:
a_s = aI * (1 + f)
X, sl, sp = zincblende_block(latI, 2, 6, a_plane=a_s)
slab = Structure(X, sp, np.diag([2 * a_s, 2 * a_s, 0.0])[:2], sl, latI)
r = M.relax(keating(slab), fixed=X[:, 2] < aI / 4 + 1e-9, tol=1e-8)
zc = np.unique(np.round(r["positions"][np.array(sp) == "In", 2], 6))
ezz_vff.append(2 * np.median(np.diff(zc)) / aI - 1)
ezz_vff = np.array(ezz_vff)
ratio = -2 * C12 / C11
fig, ax = plt.subplots(figsize=(6, 4))
ax.plot(100 * f_mis, 100 * ezz_vff, "o", color=style.OPEN_NEMO, label="relaxed Keating film (open-nemo)")
ax.plot(100 * f_mis, 100 * ratio * f_mis, color=style.CONTEXT,
label=r"continuum: $-2C_{12}/C_{11}\,\varepsilon_\parallel$")
ax.axvline(100 * (aG - aI) / aI, color="0.5", ls=":", lw=1)
ax.text(100 * (aG - aI) / aI + 0.2, -6, "InAs on GaAs", fontsize=8, color="0.4")
ax.set(xlabel=r"in-plane strain $\varepsilon_\parallel$ (%)",
ylabel=r"vertical strain $\varepsilon_{zz}$ (%)",
title="InAs film: vertical response to in-plane strain")
ax.legend(frameon=False, fontsize=8)
fig.tight_layout()
for f, e in zip(f_mis[::3], ezz_vff[::3]):
print(f"eps_par {100 * f:+5.1f} %: eps_zz VFF {100 * e:+6.3f} %, linear {100 * ratio * f:+6.3f} %")
eps_par -8.0 %: eps_zz VFF +8.463 %, linear +9.189 % eps_par -5.0 %: eps_zz VFF +5.451 %, linear +5.743 % eps_par -2.0 %: eps_zz VFF +2.249 %, linear +2.297 % eps_par +1.0 %: eps_zz VFF -1.161 %, linear -1.149 % eps_par +4.0 %: eps_zz VFF -4.802 %, linear -4.594 %

For strains of a per cent or two the relaxed film follows the continuum line; at large compression the force field gives a smaller vertical expansion, and under tension a larger contraction, than the linear law. The atomistic relaxation needs no such formula: it handles any geometry — a film, a pyramid, a random alloy — with the same two constants per bond.
4. Impact of strain on the electronic structure#
Strain changes bond lengths and angles, which shifts the band edges and lifts the degeneracy of the heavy-hole (HH) and light-hole (LH) bands at Γ. In continuum language this is described with deformation potentials (slide 6):
with \(a_c = -5.08\) eV, \(a_v = 1.0\) eV and \(b_v = -1.8\) eV for InAs. The first term of each line is the
hydrostatic shift, proportional to the relative volume change; the \(b_v\) term responds to the
tetragonal distortion and splits HH from LH. Klimeck's caveat: tight binding does not work this way.
It sees only the displaced atoms, and these formulas serve to interpret its results and to check
that it gives the right trends. Below, both are applied to bulk InAs strained biaxially in the (001)
plane, from 0 to the pseudomorphic strain on GaAs, with \(\varepsilon_{zz} = -2(C_{12}/C_{11})
\varepsilon_\parallel\). The tight-binding model is sp3d5s* with spin–orbit coupling and the strain
model of Boykin et al. (2002) (klimeck2002_sp3d5s: bond-length exponents of the two-centre
integrals and strain-dependent on-site energies).
Code
AC, AV, BV = -5.08, 1.0, -1.8
prim = bulk(latI)
sk = nemo.models.tb.SlaterKoster(INAS, spin=True, strain="bond_length")
def gamma_pairs(eps):
# Kramers-pair energies at Gamma of homogeneously strained bulk InAs
e = np.linalg.eigvalsh(sk.build(M.strain_structure(prim, eps)).dense(np.zeros(3)))
return 0.5 * (e[0::2] + e[1::2])
e_par = np.linspace(0, (aG - aI) / aI, 15)
e0 = gamma_pairs(np.zeros((3, 3)))
tb, dp = [], []
for ep in e_par:
ez = -2 * C12 / C11 * ep
lv = gamma_pairs(np.diag([ep, ep, ez]))
tb.append([lv[4] - e0[4], lv[3] - e0[3], lv[2] - e0[2]]) # CB, top VB, second VB
tr, ax_ = 2 * ep + ez, 2 * ep - 2 * ez
dp.append([AC * tr, AV * tr + 0.5 * BV * ax_, AV * tr - 0.5 * BV * ax_]) # CB, HH, LH
tb, dp = np.array(tb), np.array(dp)
print(f"unstrained InAs (TB): CB {e0[4]:.4f}, VB {e0[3]:.4f}, SO {e0[1]:.4f} eV")
print(f"at eps_par = {100 * e_par[-1]:.2f} %, eps_zz = {-200 * C12 / C11 * e_par[-1]:.2f} %:")
for k, name in enumerate(["CB", "HH", "LH"]):
print(f" {name}: shift {1000 * tb[-1, k]:+6.0f} meV (tight binding), {1000 * dp[-1, k]:+6.0f} meV "
f"(deformation potentials)")
unstrained InAs (TB): CB 0.5942, VB 0.2243, SO -0.1689 eV at eps_par = -6.69 %, eps_zz = 7.68 %: CB: shift +221 meV (tight binding), +289 meV (deformation potentials) HH: shift +223 meV (tight binding), +202 meV (deformation potentials) LH: shift +26 meV (tight binding), -316 meV (deformation potentials)
Code
fig, ax = plt.subplots(figsize=(6.4, 4))
for k, (name, c) in enumerate(zip(["CB", "HH", "LH"], style.sweep(3))):
ax.plot(-100 * e_par, 1000 * tb[:, k], color=c, label=f"{name}, tight binding")
ax.plot(-100 * e_par, 1000 * dp[:, k], "--", color=c, label=f"{name}, deformation potentials")
ax.axhline(0, color="0.6", lw=0.8)
ax.set(xlabel=r"in-plane compression $-\varepsilon_\parallel$ (%)", ylabel="band-edge shift (meV)",
title="InAs under (001) biaxial compression")
ax.legend(frameon=False, fontsize=8, ncol=2)
fig.tight_layout()
d = 0.002 # small strains: the TB model's own constants
hp, hm = gamma_pairs(np.eye(3) * d), gamma_pairs(-np.eye(3) * d)
bp = gamma_pairs(np.diag([-d, -d, 2 * d]))
print(f"tight binding, small strain: a_c = {(hp[4] - hm[4]) / (6 * d):.2f} eV, "
f"a_v = {(hp[3] - hm[3]) / (6 * d):.2f} eV, |b_v| = {(bp[3] - bp[2]) / (6 * d):.2f} eV")
tight binding, small strain: a_c = -6.32 eV, a_v = 0.56 eV, |b_v| = 1.18 eV

Both descriptions agree on the trends: the conduction band rises under compression, the valence degeneracy is lifted with the heavy hole on top, and both are of the order of a few hundred meV at the 6.7 % in-plane compression of InAs on GaAs. The numbers differ. The tight-binding model's own deformation potentials, obtained from small strains, are \(a_c = -6.32\) eV, \(a_v = 0.56\) eV and \(|b_v| = 1.18\) eV, not the slide's values; and at large strain the light hole, which is coupled to the split-off band by the strain (the spin–orbit splitting of InAs is only 0.39 eV), does not follow the linear formula at all: it bends back up. In a dot, where the strain varies from atom to atom, tight binding takes all of this into account without any formula.
5. Piezoelectric potential#
Zincblende has no inversion center, so shear strain polarizes it. To first order (slide 7),
with the piezoelectric constant \(e_{14}\) (\(-0.16\) C/m² for GaAs, \(-0.045\) C/m² for InAs). The slide also shows the second-order terms \(\mathbf{P}_2\) with constants \(B_{114}\), \(B_{124}\), \(B_{156}\), products of strain components. The polarization gives a bound charge density and, through Poisson's equation, a potential \(V_p\):
where \(\varepsilon_s\) is the static relative permittivity (sign conventions differ between authors; the slide writes the equation with the opposite sign). A (001) film has no shear strain and hence no piezoelectric field; a dot has shear strain along its edges. Below, the small pyramid of the previous lecture (InAs, base 9 nm, height 3.5 nm, on a wetting layer) is placed in a larger GaAs box of 26 × 26 × 14 cubic cells (14.7 × 14.7 × 7.9 nm, periodic), relaxed, its strain computed per atom against each atom's own material, \(\mathbf{P}_1\) put on the cations, and the potential solved on a grid of spacing \(a/2\), periodic in the plane and held at zero on the bottom and top faces.
Code
NX, NZ, BASE, HEIGHT = 26, 14, 9.0, 3.5
X, sl, sp = zincblende_block(latG, NX, NZ)
c0 = np.array([NX * aG / 2, NX * aG / 2, 2.5])
zr = X[:, 2] - c0[2]
half = BASE / 2 * (1 - zr / HEIGHT)
dot = (zr >= 0) & (zr <= HEIGHT) & (np.abs(X[:, 0] - c0[0]) <= half) & (np.abs(X[:, 1] - c0[1]) <= half)
wet = (zr >= -aG / 4 - 1e-9) & (zr < 0)
sp = ["In" if ((d_ or w_) and c == "Ga") else c for c, d_, w_ in zip(sp, dot, wet)]
pyr = Structure(X, sp, np.diag([NX * aG, NX * aG, NZ * aG]), sl, latG)
t0 = time.perf_counter()
rp = M.relax(keating(pyr), tol=1e-6)
stp = M.atomic_strain(pyr, rp["positions"], lattice_constants=pz.zincblende_lattice_constants(pyr))
strain = np.where(stp["valid"][:, None, None], stp["strain"], np.nan)
pol = pz.zincblende_site_polarization(pyr, strain)
out = polarization_potential(pyr, pol["polarization"], pol["eps_r"], positions=rp["positions"],
periodic=(True, True, False))
print(f"{pyr.num_atoms} atoms relaxed and piezoelectric potential solved in {time.perf_counter() - t0:.1f} s")
shear = np.abs(strain[:, [0, 0, 1], [1, 2, 2]])
print(f"largest |shear strain| {100 * np.nanmax(shear):.2f} %, largest |P| "
f"{np.nanmax(np.linalg.norm(pol['polarization'], axis=1)):.4f} C/m^2")
phi = 1000 * out["atom_potential"]
print(f"potential at the atoms: {phi.min():.1f} to {phi.max():.1f} mV, "
f"total bound charge {out['total_charge']:+.1e} e")
75712 atoms relaxed and piezoelectric potential solved in 7.0 s largest |shear strain| 4.90 %, largest |P| 0.0134 C/m^2 potential at the atoms: -26.7 to 25.3 mV, total bound charge -2.1e-04 e
Code
g = out["grid"]
pot = 1000 * out["potential"].reshape(g.shape)
xs, ys, zs = (np.asarray(ax_) for ax_ in g.axes)
iz = np.argmin(np.abs(zs - (c0[2] + 1.0)))
ix = np.argmin(np.abs(xs - c0[0]))
vmax = np.abs(pot).max()
fig, (a1, a2) = plt.subplots(1, 2, figsize=(11, 4.2))
im = a1.imshow(pot[:, :, iz].T, origin="lower", extent=[xs[0], xs[-1], ys[0], ys[-1]],
cmap=style.SIGNED, vmin=-vmax, vmax=vmax)
a1.plot(c0[0] + BASE / 2 * np.array([-1, 1, 1, -1, -1]), c0[1] + BASE / 2 * np.array([-1, -1, 1, 1, -1]),
color="k", lw=0.8)
a1.grid(False)
a1.set(xlabel="x [100] (nm)", ylabel="y [010] (nm)",
title=f"φ (mV), plane {zs[iz] - c0[2]:.1f} nm above the base")
fig.colorbar(im, ax=a1, label="mV")
diag = np.linspace(-0.45, 0.45, 200) * NX * aG
from scipy.interpolate import RegularGridInterpolator
f = RegularGridInterpolator((xs, ys, zs), pot, bounds_error=False)
for v, name, c in (((1, 1), "[110]", style.OPEN_NEMO), ((1, -1), "[1-10]", style.CONTEXT)):
u = np.array(v) / np.sqrt(2)
line = np.c_[c0[0] + diag * u[0], c0[1] + diag * u[1], np.full_like(diag, zs[iz])]
a2.plot(diag, f(line), color=c, label=name)
a2.axhline(0, color="0.6", lw=0.8)
a2.set(xlabel="distance from the dot axis (nm)", ylabel="φ (mV)", title="line cuts along the base diagonals")
a2.legend(frameon=False, fontsize=8)
fig.tight_layout()

The piezoelectric potential has the quadrupole pattern known from the literature: lobes of opposite sign along the two diagonals [110] and [1$\bar1$0] of the square base, strongest at the pyramid's corners and edges, where the shear strain is largest (up to 4.90 % here). On this plane, 1.1 nm above the base, the potential inside the dot is positive along [110] (about 9 mV) and negative along [1$\bar1$0] (about −4 mV), and the signs reverse just outside the base (−15 and +14 mV). Tens of millivolts are small compared with the band offsets, but comparable to the splitting of the p-like electron states, so the potential breaks the symmetry between [110] and [1$\bar1$0] that the square base alone would keep. NEMO 3-D adds \(-qV_p\) to the on-site energies of the tight-binding Hamiltonian, as the multi-scale chart of lecture 21.1 shows; later lectures of the course discuss its effect on dots.
Summary#
- Lattice mismatch makes an InAs layer on GaAs compress in the plane (\(\varepsilon_\parallel\) = −6.69 %) and expand vertically.
- The valence force field has two constants per material, \(\alpha\) for bond stretching and \(\beta\) for bond bending; they fix \(C_{11}\) and \(C_{12}\), while \(C_{44}\) comes out 12–21 % low.
- Minimizing the force-field energy over all atoms gives the strain as an output: the relaxed film has \(a_\perp\) = 0.6493 nm against 0.6524 nm from linear elasticity; the two agree at small mismatch.
- Tight binding of the strained crystal and deformation potentials agree on trends (CB up, HH above LH under compression) but not on numbers; the light hole is strongly nonlinear.
- Shear strain at the edges of a dot gives a piezoelectric polarization \(2e_{14}(\varepsilon_{yz}, \varepsilon_{xz}, \varepsilon_{xy})\) and a potential of tens of mV (−27 to +25 mV at the atoms of this small pyramid) with lobes of opposite sign along [110] and [1$\bar1$0].
Exercises#
- Set \(\beta\) of InAs to zero in
KEATINGand recompute the elastic constants. What happens to \(C_{44}\), and why is a pure bond-stretching model unstable? - Change the film thickness
NFILMto 2 and to 10 cells. Does \(a_\perp\) in the middle of the film change? Plot the In-plane spacing against height to see the surface and interface regions. - Repeat section 4 for tensile strain (\(\varepsilon_\parallel > 0\)). Which hole band is on top?
- In section 5, use
pz.zincblende_site_polarization(pyr, strain, order="second")to include the second-order terms of slide 7. How much does the potential change?
Further reading#
- Strained InAs/GaAs dot: relaxation and strain shifts of a dot's levels.
- Atomistic piezoelectric potential: the full piezoelectric chain, conventions and comparison with the literature.
- Strain types and directions and strained Si/Ge heterostructures.
- Dot strain profiles: NEMO 3-D strain benchmarks.
- Phonons and relaxation.
- Previous: multi-scale by design; next: sp3d5s* tight binding.
- P. N. Keating, Phys. Rev. 145, 637 (1966); R. M. Martin, Phys. Rev. B 1, 4005 (1970).
- T. B. Boykin, G. Klimeck, R. C. Bowen, F. Oyafuso, Phys. Rev. B 66, 125207 (2002) — the strain model of the tight-binding parameters.
- G. Klimeck et al., IEEE Trans. Electron Devices 54, 2090 (2007) — NEMO 3-D's strain and piezoelectric chain.

