Simple Metallic Chain

This notebook demonstrates a quantum transport calculation using the JunPy package. The goal is to compute the density of states and transmission values for a two-probe device. We manually construct the tight-binding Hamiltonian by setting the onsite energies and hopping parameters.

Import Necessary Libraries

We use the built-in module junpy.factory.stack to create a simple two-probe device and its tight-binding Hamiltonian.

import matplotlib.pyplot as plt
import numpy as np
import junpy as jp
from junpy.factory import stack
%config InlineBackend.figure_format = 'svg'
%config InlineBackend.rc = {'font.size': 12}

Build Device

For demonstration, we assume there are 3 sites in the central region and 1 site in each of the left and right electrode unit cells. The spin-polarized onsite energies for each site are set to np.array([[-0.5, 0], [0, 0.5]]), where -0.5 corresponds to spin-up and 0.5 corresponds to spin-down. The hopping energies are set to -1. The spin polarization angles are aligned along the $z$ direction, with values set to 0 radians.

# on-site energy
eA = np.array([[-0.5, 0], [0, 0.5]])
eB = np.array([[-0.5, 0], [0, 0.5]])
eC = np.array([[-0.5, 0], [0, 0.5]])

# hopping energy
t = np.array([[-1, 0], [0, -1]])

# spin polarization angle in unit of radian
sA, sB, sC,  = 0, 0, 0

We first create an empty builder using stack.TwoProbeDeviceBuilder() to construct the device:

builder = stack.TwoProbeDeviceBuilder()

The following statements construct the Hamiltonian parameters for the two-probe device. Here, builder.L, builder.C, and builder.R represent the left, central, and right regions, respectively. The left and right regions are semi-infinite electrodes. To construct the Fermi function, we need to set the reservoir chemical potential and temperature. In this example, the reservoir chemical potentials are set to 0, and the temperatures are set to 100 K. For each region, the add(energy, hopping, nsites, spin, bias) function is used to create a layer containing the Hamiltonian parameters. Here, energy refers to the onsite energy, hopping specifies the hopping energy, nsites is the number of sites in the layer, spin is the spin polarization angle in radians, and bias represents the energy shift of the onsite energy.

# left electrode
builder.L.set(chemicalPotential=0, temperature=100)
builder.L.add(eA, t, nsites=1, spin=sA, bias=0)

# central region
builder.C.add(eA, t, nsites=1, spin=sA, bias=0)
builder.C.add(eB, t, nsites=3, spin=sB, bias=0)
builder.C.add(eC, t, nsites=1, spin=sC, bias=0)

# right electrode
builder.R.set(chemicalPotential=0, temperature=100)
builder.R.add(eC, t, nsites=1, spin=sC, bias=0)

The coupling energies between the layers also need to be specified. We assume that all coupling energies are set to t.

# define coupling between layers
builder.set_layer_coupling(all=t)

The default transport direction is the $z$ direction. To construct a 2D or 3D device, we can set the translation symmetry in the $x$ and $y$ directions. In this example, we construct a simple 1D two-probe device, so the translation symmetry is disabled.

# define translation symmetry
builder.set_translationSymmetry(x=False, y=False)

Once the construction is finished, use create_device to build the device.

# create device
device = builder.create_device()

Calculate Density of States

calcr_dos = jp.DensityOfStates(
    device=device,
    energies=np.linspace(-3, 3, 61),
    kpoints=jp.SymmetryKspaceSampling((1,1,1)),
    etaSigma=0.01)
jp.run(calcr_dos, savefile=False)
Hide code cell output
JunPy version---------------------------: 0.15.0.post29+ga5b3260
Parallelization information
    BLAS Vendor-----------------------------: MKL
    Total number of MPI processes-----------: 1
    OMP_NUM_THREADS-------------------------: 1
    MKL_NUM_THREADS-------------------------: unset
    OPENBLAS_NUM_THREADS--------------------: unset
Calculating density of states... (2024-08-14 20:01:57)
    Device information
        bias (mu2-mu1)--------------------------: 0
        central.numberOfSites-------------------: 5
        central.spinType------------------------: SpinType.GeneralSpin
        lead1.numberOfSites---------------------: 1
        lead1.spinType--------------------------: SpinType.GeneralSpin
        lead1.direction-------------------------: -3
        lead1.temperature-----------------------: 100
        lead1.chemicalPotential-----------------: 0
        lead2.numberOfSites---------------------: 1
        lead2.spinType--------------------------: SpinType.GeneralSpin
        lead2.direction-------------------------: 3
        lead2.temperature-----------------------: 100
        lead2.chemicalPotential-----------------: 0
    Energy sampling
        samplingName----------------------------: CustomSampling
        range-----------------------------------: [-3.0000e+00, 3.0000e+00]
        number----------------------------------: 61
    K-space sampling
        samplingName----------------------------: SymmetryKspaceSampling
        gridNumber------------------------------: (1, 1, 1)
        isTimeReversalSymmetry------------------: True
        numReducedKpoints-----------------------: 1
    Runtime message
        Integrate over energy and k-space...
            Start MPI execution...
            -->   6.6% finished (Elapsed time: 0:00:00.004573)
            -->  11.5% finished (Elapsed time: 0:00:00.001699)
            -->  16.4% finished (Elapsed time: 0:00:00.001630)
            -->  21.3% finished (Elapsed time: 0:00:00.001487)
            -->  26.2% finished (Elapsed time: 0:00:00.001480)
            -->  31.1% finished (Elapsed time: 0:00:00.001430)
            -->  36.1% finished (Elapsed time: 0:00:00.001932)
            -->  41.0% finished (Elapsed time: 0:00:00.001499)
            -->  45.9% finished (Elapsed time: 0:00:00.001404)
            -->  50.8% finished (Elapsed time: 0:00:00.001315)
            -->  55.7% finished (Elapsed time: 0:00:00.001314)
            -->  60.7% finished (Elapsed time: 0:00:00.001766)
            -->  65.6% finished (Elapsed time: 0:00:00.001617)
            -->  70.5% finished (Elapsed time: 0:00:00.001195)
            -->  75.4% finished (Elapsed time: 0:00:00.001387)
            -->  80.3% finished (Elapsed time: 0:00:00.001412)
            -->  85.2% finished (Elapsed time: 0:00:00.001434)
            -->  90.2% finished (Elapsed time: 0:00:00.001451)
            -->  95.1% finished (Elapsed time: 0:00:00.001334)
            --> 100.0% finished (Elapsed time: 0:00:00.001556)
            Wait for other processes...
            --> finished (Elapsed time: 0:00:00.000186)
            Gather results from other processes...
            --> finished (Elapsed time: 0:00:00.000293)
    Density of states report
            Energy_eV       D_up-up       D_dn-dn    D_Re-up-dn    D_Im-up-dn
        -3.000000e+00  1.256112e-03  9.353190e-05  0.000000e+00  0.000000e+00
        -2.900000e+00  2.050678e-03  1.113836e-04  0.000000e+00  0.000000e+00
        -2.800000e+00  3.807053e-03  1.340980e-04  0.000000e+00  0.000000e+00
        -2.700000e+00  8.907812e-03  1.634881e-04  0.000000e+00  0.000000e+00
        -2.600000e+00  3.611755e-02  2.022652e-04  0.000000e+00  0.000000e+00
        -2.500000e+00  5.699298e+00  2.546209e-04  0.000000e+00  0.000000e+00
        -2.400000e+00  2.635411e+00  3.272927e-04  0.000000e+00  0.000000e+00
        -2.300000e+00  1.839267e+00  4.316354e-04  0.000000e+00  0.000000e+00
        -2.200000e+00  1.511842e+00  5.879337e-04  0.000000e+00  0.000000e+00
        -2.100000e+00  1.326195e+00  8.352035e-04  0.000000e+00  0.000000e+00
        -2.000000e+00  1.203896e+00  1.256112e-03  0.000000e+00  0.000000e+00
        -1.900000e+00  1.115984e+00  2.050678e-03  0.000000e+00  0.000000e+00
        -1.800000e+00  1.049216e+00  3.807053e-03  0.000000e+00  0.000000e+00
        -1.700000e+00  9.966793e-01  8.907812e-03  0.000000e+00  0.000000e+00
        -1.600000e+00  9.544100e-01  3.611755e-02  0.000000e+00  0.000000e+00
        -1.500000e+00  9.199549e-01  5.699298e+00  0.000000e+00  0.000000e+00
        -1.400000e+00  8.916953e-01  2.635411e+00  0.000000e+00  0.000000e+00
        -1.300000e+00  8.685007e-01  1.839267e+00  0.000000e+00  0.000000e+00
        -1.200000e+00  8.495421e-01  1.511842e+00  0.000000e+00  0.000000e+00
        -1.100000e+00  8.341881e-01  1.326195e+00  0.000000e+00  0.000000e+00
        -1.000000e+00  8.219456e-01  1.203896e+00  0.000000e+00  0.000000e+00
        -9.000000e-01  8.124258e-01  1.115984e+00  0.000000e+00  0.000000e+00
        -8.000000e-01  8.053250e-01  1.049216e+00  0.000000e+00  0.000000e+00
        -7.000000e-01  8.004137e-01  9.966793e-01  0.000000e+00  0.000000e+00
        -6.000000e-01  7.975308e-01  9.544100e-01  0.000000e+00  0.000000e+00
        -5.000000e-01  7.965804e-01  9.199549e-01  0.000000e+00  0.000000e+00
        -4.000000e-01  7.975308e-01  8.916953e-01  0.000000e+00  0.000000e+00
        -3.000000e-01  8.004137e-01  8.685007e-01  0.000000e+00  0.000000e+00
        -2.000000e-01  8.053250e-01  8.495421e-01  0.000000e+00  0.000000e+00
        -1.000000e-01  8.124258e-01  8.341881e-01  0.000000e+00  0.000000e+00
         0.000000e+00  8.219456e-01  8.219456e-01  0.000000e+00  0.000000e+00
         1.000000e-01  8.341881e-01  8.124258e-01  0.000000e+00  0.000000e+00
         2.000000e-01  8.495421e-01  8.053250e-01  0.000000e+00  0.000000e+00
         3.000000e-01  8.685007e-01  8.004137e-01  0.000000e+00  0.000000e+00
         4.000000e-01  8.916953e-01  7.975308e-01  0.000000e+00  0.000000e+00
         5.000000e-01  9.199549e-01  7.965804e-01  0.000000e+00  0.000000e+00
         6.000000e-01  9.544100e-01  7.975308e-01  0.000000e+00  0.000000e+00
         7.000000e-01  9.966793e-01  8.004137e-01  0.000000e+00  0.000000e+00
         8.000000e-01  1.049216e+00  8.053250e-01  0.000000e+00  0.000000e+00
         9.000000e-01  1.115984e+00  8.124258e-01  0.000000e+00  0.000000e+00
         1.000000e+00  1.203896e+00  8.219456e-01  0.000000e+00  0.000000e+00
         1.100000e+00  1.326195e+00  8.341881e-01  0.000000e+00  0.000000e+00
         1.200000e+00  1.511842e+00  8.495421e-01  0.000000e+00  0.000000e+00
         1.300000e+00  1.839267e+00  8.685007e-01  0.000000e+00  0.000000e+00
         1.400000e+00  2.635411e+00  8.916953e-01  0.000000e+00  0.000000e+00
         1.500000e+00  5.699298e+00  9.199549e-01  0.000000e+00  0.000000e+00
         1.600000e+00  3.611755e-02  9.544100e-01  0.000000e+00  0.000000e+00
         1.700000e+00  8.907812e-03  9.966793e-01  0.000000e+00  0.000000e+00
         1.800000e+00  3.807053e-03  1.049216e+00  0.000000e+00  0.000000e+00
         1.900000e+00  2.050678e-03  1.115984e+00  0.000000e+00  0.000000e+00
         2.000000e+00  1.256112e-03  1.203896e+00  0.000000e+00  0.000000e+00
         2.100000e+00  8.352035e-04  1.326195e+00  0.000000e+00  0.000000e+00
         2.200000e+00  5.879337e-04  1.511842e+00  0.000000e+00  0.000000e+00
         2.300000e+00  4.316354e-04  1.839267e+00  0.000000e+00  0.000000e+00
         2.400000e+00  3.272927e-04  2.635411e+00  0.000000e+00  0.000000e+00
         2.500000e+00  2.546209e-04  5.699298e+00  0.000000e+00  0.000000e+00
         2.600000e+00  2.022652e-04  3.611755e-02  0.000000e+00  0.000000e+00
         2.700000e+00  1.634881e-04  8.907812e-03  0.000000e+00  0.000000e+00
         2.800000e+00  1.340980e-04  3.807053e-03  0.000000e+00  0.000000e+00
         2.900000e+00  1.113836e-04  2.050678e-03  0.000000e+00  0.000000e+00
         3.000000e+00  9.353190e-05  1.256112e-03  0.000000e+00  0.000000e+00
Calculation of density of states finished (2024-08-14 20:01:57)
Elapsed time----------------------------: 0:00:00.054571
# shape: (#kpoints, #energies, #spin)
dos = calcr_dos.densityOfStates(spin='diag')

plt.plot(calcr_dos.energies, dos[0,:,0], '.-', label='spin-up')
plt.plot(calcr_dos.energies, dos[0,:,1], '.-', label='spin-down')
plt.xlabel('Energy (eV)')
plt.ylabel('DOS (1/eV)')
plt.legend()
plt.show()
../../_images/6db683b61ef0f1069c4b3d15c2dd95496ea8ef3547ba66b5ef531e0ddc04f2b6.svg

Calculate Transmission

calcr_trans = jp.Transmission(
    device=device,
    energies=np.linspace(-3, 3, 61),
    kpoints=jp.SymmetryKspaceSampling((1,1,1)),
    etaSigma=1e-4,
)
jp.run(calcr_trans, savefile=False)
Hide code cell output
JunPy version---------------------------: 0.15.0.post29+ga5b3260
Parallelization information
    BLAS Vendor-----------------------------: MKL
    Total number of MPI processes-----------: 1
    OMP_NUM_THREADS-------------------------: 1
    MKL_NUM_THREADS-------------------------: unset
    OPENBLAS_NUM_THREADS--------------------: unset
Calculating transmission... (2024-08-14 20:02:20)
    Device information
        bias (mu2-mu1)--------------------------: 0
        central.numberOfSites-------------------: 5
        central.spinType------------------------: SpinType.GeneralSpin
        lead1.numberOfSites---------------------: 1
        lead1.spinType--------------------------: SpinType.GeneralSpin
        lead1.direction-------------------------: -3
        lead1.temperature-----------------------: 100
        lead1.chemicalPotential-----------------: 0
        lead2.numberOfSites---------------------: 1
        lead2.spinType--------------------------: SpinType.GeneralSpin
        lead2.direction-------------------------: 3
        lead2.temperature-----------------------: 100
        lead2.chemicalPotential-----------------: 0
    Energy sampling
        samplingName----------------------------: CustomSampling
        range-----------------------------------: [-3.0000e+00, 3.0000e+00]
        number----------------------------------: 61
    K-space sampling
        samplingName----------------------------: SymmetryKspaceSampling
        gridNumber------------------------------: (1, 1, 1)
        isTimeReversalSymmetry------------------: True
        numReducedKpoints-----------------------: 1
    Runtime message
        Integrate over energy and k-space...
            Start MPI execution...
            -->   6.6% finished (Elapsed time: 0:00:00.003585)
            -->  11.5% finished (Elapsed time: 0:00:00.001882)
            -->  16.4% finished (Elapsed time: 0:00:00.001779)
            -->  21.3% finished (Elapsed time: 0:00:00.002063)
            -->  26.2% finished (Elapsed time: 0:00:00.001690)
            -->  31.1% finished (Elapsed time: 0:00:00.001729)
            -->  36.1% finished (Elapsed time: 0:00:00.002109)
            -->  41.0% finished (Elapsed time: 0:00:00.002407)
            -->  45.9% finished (Elapsed time: 0:00:00.001634)
            -->  50.8% finished (Elapsed time: 0:00:00.001618)
            -->  55.7% finished (Elapsed time: 0:00:00.001521)
            -->  60.7% finished (Elapsed time: 0:00:00.001520)
            -->  65.6% finished (Elapsed time: 0:00:00.001730)
            -->  70.5% finished (Elapsed time: 0:00:00.002024)
            -->  75.4% finished (Elapsed time: 0:00:00.001649)
            -->  80.3% finished (Elapsed time: 0:00:00.001612)
            -->  85.2% finished (Elapsed time: 0:00:00.001697)
            -->  90.2% finished (Elapsed time: 0:00:00.002344)
            -->  95.1% finished (Elapsed time: 0:00:00.001554)
            --> 100.0% finished (Elapsed time: 0:00:00.001243)
            Wait for other processes...
            --> finished (Elapsed time: 0:00:00.000009)
            Gather results from other processes...
            --> finished (Elapsed time: 0:00:00.000113)
    Transmission report
            Energy_eV       T_up-up       T_dn-dn    T_Re-up-dn    T_Im-up-dn
        -3.000000e+00  7.716049e-12  5.451332e-15  0.000000e+00  0.000000e+00
        -2.900000e+00  2.559462e-11  9.265870e-15  0.000000e+00  0.000000e+00
        -2.800000e+00  1.073804e-10  1.618547e-14  0.000000e+00  0.000000e+00
        -2.700000e+00  6.715972e-10  2.915862e-14  0.000000e+00  0.000000e+00
        -2.600000e+00  1.020449e-08  5.441482e-14  0.000000e+00  0.000000e+00
        -2.500000e+00  4.826224e-01  1.057711e-13  0.000000e+00  0.000000e+00
        -2.400000e+00  1.000000e+00  2.156665e-13  0.000000e+00  0.000000e+00
        -2.300000e+00  1.000000e+00  4.655865e-13  0.000000e+00  0.000000e+00
        -2.200000e+00  1.000000e+00  1.077732e-12  0.000000e+00  0.000000e+00
        -2.100000e+00  1.000000e+00  2.723300e-12  0.000000e+00  0.000000e+00
        -2.000000e+00  1.000000e+00  7.716049e-12  0.000000e+00  0.000000e+00
        -1.900000e+00  1.000000e+00  2.559462e-11  0.000000e+00  0.000000e+00
        -1.800000e+00  1.000000e+00  1.073804e-10  0.000000e+00  0.000000e+00
        -1.700000e+00  1.000000e+00  6.715972e-10  0.000000e+00  0.000000e+00
        -1.600000e+00  1.000000e+00  1.020449e-08  0.000000e+00  0.000000e+00
        -1.500000e+00  1.000000e+00  4.826224e-01  0.000000e+00  0.000000e+00
        -1.400000e+00  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
        -1.300000e+00  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
        -1.200000e+00  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
        -1.100000e+00  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
        -1.000000e+00  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
        -9.000000e-01  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
        -8.000000e-01  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
        -7.000000e-01  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
        -6.000000e-01  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
        -5.000000e-01  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
        -4.000000e-01  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
        -3.000000e-01  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
        -2.000000e-01  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
        -1.000000e-01  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
         0.000000e+00  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
         1.000000e-01  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
         2.000000e-01  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
         3.000000e-01  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
         4.000000e-01  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
         5.000000e-01  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
         6.000000e-01  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
         7.000000e-01  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
         8.000000e-01  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
         9.000000e-01  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
         1.000000e+00  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
         1.100000e+00  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
         1.200000e+00  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
         1.300000e+00  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
         1.400000e+00  1.000000e+00  1.000000e+00  0.000000e+00  0.000000e+00
         1.500000e+00  4.826224e-01  1.000000e+00  0.000000e+00  0.000000e+00
         1.600000e+00  1.020449e-08  1.000000e+00  0.000000e+00  0.000000e+00
         1.700000e+00  6.715972e-10  1.000000e+00  0.000000e+00  0.000000e+00
         1.800000e+00  1.073804e-10  1.000000e+00  0.000000e+00  0.000000e+00
         1.900000e+00  2.559462e-11  1.000000e+00  0.000000e+00  0.000000e+00
         2.000000e+00  7.716049e-12  1.000000e+00  0.000000e+00  0.000000e+00
         2.100000e+00  2.723300e-12  1.000000e+00  0.000000e+00  0.000000e+00
         2.200000e+00  1.077732e-12  1.000000e+00  0.000000e+00  0.000000e+00
         2.300000e+00  4.655865e-13  1.000000e+00  0.000000e+00  0.000000e+00
         2.400000e+00  2.156665e-13  1.000000e+00  0.000000e+00  0.000000e+00
         2.500000e+00  1.057711e-13  4.826224e-01  0.000000e+00  0.000000e+00
         2.600000e+00  5.441482e-14  1.020449e-08  0.000000e+00  0.000000e+00
         2.700000e+00  2.915862e-14  6.715972e-10  0.000000e+00  0.000000e+00
         2.800000e+00  1.618547e-14  1.073804e-10  0.000000e+00  0.000000e+00
         2.900000e+00  9.265870e-15  2.559462e-11  0.000000e+00  0.000000e+00
         3.000000e+00  5.451332e-15  7.716049e-12  0.000000e+00  0.000000e+00
Calculation of transmission finished (2024-08-14 20:02:20)
Elapsed time----------------------------: 0:00:00.046322
# shape: (#kpoints, #energies, #spin)
trans = calcr_trans.transmission(spin='diag')

plt.plot(calcr_trans.energies, trans[0,:,0], '.-', label='spin-up')
plt.plot(calcr_trans.energies, trans[0,:,1], '.-', label='spin-down')
plt.xlabel('Energy (eV)')
plt.ylabel('Transmission')
plt.legend()
plt.show()
../../_images/03dd136421dcf5071894b3e021b75d72ba104186171f5c7fc5b22c2b6bf412b3.svg