Boundary Conditions and Finite-Size Effects¶

Model. This notebook compares open and periodic SSH chains and tracks finite-size gaps in the transverse-field Ising model.

Typical uses. Diagnosing boundary modes, separating edge physics from bulk spectra, checking periodic-boundary conventions, and estimating finite-size effects.

Parameters. SSH cell count and hoppings t1, t2 control edge localization; TFIM n_sites, j, and h control the finite-size gap comparison.

Useful plots. Open/periodic SSH spectra, corresponding lowest-energy probability profiles, and TFIM gap versus system size.

InĀ [1]:
import matplotlib.pyplot as plt
import numpy as np

from quantum_lattice_models.models import (
    ssh_edge_state_localizations,
    ssh_model,
    transverse_field_ising,
)
from quantum_lattice_models.plotting import plot_lattice_spectrum, plot_site_probabilities
from quantum_lattice_models.spectra import eigensystem, spectral_gap
InĀ [2]:
n_cells = 10
open_ssh = ssh_model(n_cells=n_cells, t1=0.4, t2=1.0, periodic=False)
periodic_ssh = ssh_model(n_cells=n_cells, t1=0.4, t2=1.0, periodic=True)
open_values, open_vectors = eigensystem(open_ssh)
periodic_values, periodic_vectors = eigensystem(periodic_ssh)
open_weights = ssh_edge_state_localizations(open_vectors, n_cells=n_cells, edge_cells=2)
periodic_weights = ssh_edge_state_localizations(periodic_vectors, n_cells=n_cells, edge_cells=2)

open_index = int(np.argmin(np.abs(open_values)))
periodic_index = int(np.argmin(np.abs(periodic_values)))
print("SSH boundary comparison")
print(
    f"  open:     min |E|={abs(open_values[open_index]):.6e}, "
    f"edge weight={open_weights[open_index]:.6f}"
)
print(
    f"  periodic: min |E|={abs(periodic_values[periodic_index]):.6e}, "
    f"edge weight={periodic_weights[periodic_index]:.6f}"
)
SSH boundary comparison
  open:     min |E|=8.808039e-05, edge weight=0.974401
  periodic: min |E|=6.000000e-01, edge weight=0.400000
InĀ [3]:
fig, axes = plt.subplots(2, 2, figsize=(10, 6.5))
plot_lattice_spectrum(open_ssh, ax=axes[0, 0], zero_line=True, color="#0072B2")
axes[0, 0].set_title("Open SSH spectrum")
plot_lattice_spectrum(periodic_ssh, ax=axes[0, 1], zero_line=True, color="#E69F00")
axes[0, 1].set_title("Periodic SSH spectrum")
plot_site_probabilities(open_vectors[:, open_index], ax=axes[1, 0], title="Open near-zero state")
plot_site_probabilities(
    periodic_vectors[:, periodic_index],
    ax=axes[1, 1],
    title="Periodic lowest-|E| state",
    color="#E69F00",
)
fig.tight_layout()
No description has been provided for this image
InĀ [4]:
sizes = np.arange(2, 9)
open_gaps = [
    spectral_gap(transverse_field_ising(int(n), j=1.0, h=1.0, periodic=False))
    for n in sizes
]
periodic_gaps = [
    spectral_gap(transverse_field_ising(int(n), j=1.0, h=1.0, periodic=True))
    for n in sizes
]

fig, ax = plt.subplots(figsize=(6.5, 3.8))
ax.plot(sizes, open_gaps, marker="o", label="open")
ax.plot(sizes, periodic_gaps, marker="s", label="periodic")
ax.set_xlabel("Number of spin sites")
ax.set_ylabel("Spectral gap at h/J=1")
ax.set_title("TFIM finite-size gap")
ax.set_xticks(sizes)
ax.grid(color="0.88", linewidth=0.8)
ax.legend()
fig.tight_layout()
No description has been provided for this image