Analysis of the zero-bias results

Table of Contents

In this chapter you will extract data from the zero-bias calculation. You will first compare the transmission spectrum with the Partial Device Density Of States (PDDOS) of the phenylene ring. Subsequently, you will calculate the Molecular Projected Self-Consistent Hamiltonian (MPSH), and rationalize the transmission in terms of the MPSH states. To this end you will also calculate the transmission eigenstates. Finally, you will calculate the energy-dependent Local Density of States (LDOS), in order to obtain a spatial view of the energy levels.

The transmission spectrum and density of states

First take a look at the analysis objects calculated in the previous section. Locate the file au_dtb_au.nc in the VNL file browser, select the "Transmission Spectrum" object in the Result Browser (upper right panel), and finally click the "Show Plot" button in the lower panel, the Result Viewer.

The transmission spectrum with no applied bias.

Figure 1: The transmission spectrum with no applied bias.


There are three broad peaks, at around -3, -1.5 and 2.5 eV. Also note the narrow peak at 2.394 eV which rises above T(E)=1. In the following you will investigate the origin of these peaks.

Next select the Device Density of States object in the NC file, and click the Show button to open the DOS analyzer window. Select all carbon and hydrogen atoms using Ctrl left-click. If you zoom into the figure by drawing a rectangle with the left mouse button, you should now see the following plot.

Note the similarity in the peak structure of the PDDOS and the transmission spectrum, indicating that there is a clear correspondence between the energy levels on the phenylene ring and the transmission spectrum.

The Molecular Projected Self-Consistent Hamiltonian (MPSH)

To understand the energy levels of the phenylene ring in the presence of the surrounding electrodes, you will now calculated the MPSH states. The MPSH states are obtained by diagonalizing the molecular part of the full self-consistent Hamiltonian [1].

Open the Script Generator and

  1. double-click Analysis from File to add it to the script;

  2. add Analysis/MolecularEnergySpectrum;

  3. change the output filename to dtb_analysis.nc.

Open the Analysis from File script block and select au_dtb_au.nc from the file browser.

Open the MolecularEnergySpectrum block and select projection on carbon and hydrogen.

Send the script to the Job Manager and execute it (the execution only takes a few seconds). Inspect the MPSH energies in the log file.

Note that state 13, 14, 15 and 16 have energies in the range relevant for the transmission spectrum. In the following you will investigate the symmetry of these states.

To calculate the eigenstates of the MPSH levels, reopen the last Script Generator (it is available from the windows menu at the top of each VNL window, if you didn't close it).

Add four Analysis/EigenState blocks.

Open each EigenState script block and select projection on carbon and hydrogen. Set the Quantum number to 13, 14, 15, 16 in each respective block.

You may delete the MolecularEnergySpectrum block, it is no longer needed (select it and press the Delete key).

Send the script to the Job Manager and execute the script.

Select dtb_analysis.nc in the file browser, and choose the first eigenstate in the result file, and click the button Isosurface>Show. In the Viewer which opens up, open the Plot>Properties menu and select the Isosurface in the Plot tree.

  1. Set the isovalue to 0.05.

  2. Set the grid sampling to 1 for improved graphical quality.

To visualize the eigenstate together with geometry, drag and drop the file au_dtb_au.py onto the Viewer.

Isosurface plots of MPSH eigenstates 13, 14, 15 an 16 using an isovalue of 0.05.

Figure 2: Isosurface plots of MPSH eigenstates 13, 14, 15 an 16 using an isovalue of 0.05.


[Tip] Tip

To ensure the same view of the 4 eigenstates it is convenient to produce all plots in the same viewer. To do this drag an drop each eigenstate object into the same viewer. This will produce a contour plot of each eigenstate.

To generate isosurfaces instead, select from the menu PlotsShow/hideEigenstateIsosurface for each eigenstate. Hide objects by removing their tick in the PlotsShow/hide menu.

Note that all the states are anti-symmetric in the plane of the benzene ring. This means that they are the \pi-orbitals of the benzene ring, i.e. they are linear combinations of the p-orbitals on each carbon atom which are perpendicular to the plane of the molecule. There are 6 such p-orbitals which means that there are 6 \pi-orbitals.

By visually inspecting the symmetry of the different eigenstates the remaining two \pi-orbitals are identified as state 10 and 18. These are visualized in Figure 3.

Isosurface plots of MPSH eigenstates 10 and 18 suing an isovalue of 0.15.

Figure 3: Isosurface plots of MPSH eigenstates 10 and 18 suing an isovalue of 0.15.


[Note] Note

There are 6 electrons in the \pi-band, corresponding to that lowest 3 states are occupied. We may therefore denote state 14 the HOMO and state 15 the LUMO.

Transmission eigenvalues and eigenstates

In this chapter you will analyze the transmission eigenstates at the peak positions in the transmission spectrum, i.e. at energies -3, -1.5 and 2.394 eV.

Re-open the Script Generator and delete the Eigenstate blocks.

Instead, add three Analysis/TransmissionEigenvalues blocks.

Set the energies to -3, -1.5 and 2.394 eV, into the respective TransmissionEigenvalues blocks.

Execute the script using the Job Manager and inspect the log file.

The transmission eigenvalues are obtained by diagonalizing the transmission matrix. The number of eigenvalues indicates the number of individual channels through the molecule, and the eigenvalue shows the strength of each channel. The eigenvalues are the true transmission probabilities, and thus lie in the interval [0,1]. If several channels are available at a particular energy, their sum - and hence the transmission coefficient at this energy - may however be larger than 1.

Most of the eigenvalues are very small and can be neglected. The two largest eigenvalues at each energy is listed below:

| Energy                       = -3.000000e+00 eV          |
| -------------------------------------------------------- |
| Number of transmission modes = 21                        |
+----------------------------------------------------------+
Eigenvalues (Up):
  8.108052e-01
  1.734361e-02
| Energy                       = -1.500000e+00 eV          |
| -------------------------------------------------------- |
| Number of transmission modes = 7                         |
+----------------------------------------------------------+
Eigenvalues (Up):
  7.993159e-01
  2.220198e-02
| Energy                       =  2.394000e+00 eV          |
| -------------------------------------------------------- |
| Number of transmission modes = 6                         |
+----------------------------------------------------------+
Eigenvalues (Up):
  6.740397e-01
  2.157626e-01

Note that at the first two energies there is only one dominating eigenstate, while at the last energy there are two dominating eigenvalues. (The fact that they do not sum up to the total transmission spectrum T(E) will be discussed in the next section!)

The next step is to visualize the transmission eigenstates for the first two peak energies, where there is only one significant eigenvalue.

  • Re-open the Script Generator and delete the TransmissionEigenvalues blocks.

  • Add two Analysis/TransmissionEigenstates blocks.

  • Enter the energies -3 and -1.5 into the Analysis/TransmissionEigenstates blocks. Leave the quantum number at 0, corresponding to the highest eigenvalue.

  • Execute the script via the Job Manager.

The objects will again be saved in the file dtb_analysis.nc and can be visualized using the same approach as for the eigenstates. Below are shown isosurfaces of the two transmission eigenstates.

Isosurfaces of the transmission eigenstates for the only significant transmission eigenchannel at k=(0,0) and energies -3.0 eV and -1.5 eV.

Figure 4: Isosurfaces of the transmission eigenstates for the only significant transmission eigenchannel at k=(0,0) and energies -3.0 eV and -1.5 eV.


[Tip] Tip

The transmission eigenstate is a complex wave function. The isosurface shows the absolute value of the wave function while the color of the isosurface indicates the phase. Since the phase is periodic, it is best to use a periodic color map. The color map can be chosen from the plot Properties; below is shown the settings used for producing the plots above.

The transmission eigenstate at -3.0 eV has a clear resemblance with MPSH state 13, i.e. the HOMO-1 state. The transmission eigenstate at -1.5 eV is also a π-state,

k-dependent transmission

You will now analyze the transmission at 2.394 eV. Previously, you found that there are two important transmission eigenstates at this energy with transmission probabilities 0.674 and 0.216. The sum of these eigenvalues give a total transmission of 0.89, i.e. well below the value 1.1 obtained from inspecting Figure 1. This is because Figure 1 shows the k-point averaged transmission. This discrepancy suggest that there must be a strong k-dependence of the transmission at this energy. You will now calculate the k-dependent transmission coefficients at this energy.

  • Re-open the Script Generator and delete the TransmissionEigenstates blocks.

  • Add an Analysis/TransmissionSpectrum block.

  • Open the TransmissionSpectrum block and set

    1. energy start and end equally to 2.394 eV,

    2. number of energy points to 1,

    3. k-point sampling to 21 x 21 points.

  • Execute the script using the Job Manager.

When the calculation has finished you can visualize the k-dependent transmission with the script below

#read the transmission spectrum
transmission = nlread('dtb_analysis.nc',TransmissionSpectrum)[-1]
#get the transmission spectrum
trans_coeff = transmission.transmission()
#select spin up component
T_uu = trans_coeff[0]
# shape of the components are [energy_points, k_points]
(n_e,n_k) = T_uu.shape
# assume equal many k_points in A and B directions
n_A=n_B=numpy.sqrt(n_k)
#reshape the arrays for plotting, assume only one energy point
T_uu = T_uu.reshape(n_A,n_B)

#get the k-points, x component
K_A = transmission.kpoints()[:,0]
K_A = K_A.reshape(n_A,n_B)
#get the k-points, y component
K_B = transmission.kpoints()[:,1]
K_B = K_B.reshape(n_A,n_B)

import pylab
#plot the transmission
pylab.figure()
pylab.xlabel('k_A',fontsize=12,family='sans-serif')
pylab.ylabel('k_B',fontsize=12,family='sans-serif')
pylab.contourf(K_A,K_B,T_uu,40)
pylab.colorbar()
pylab.axis([-.5,.5,-.5,.5])
pylab.yticks(numpy.arange(-0.5,0.51,0.1),fontsize=10)
pylab.xticks(numpy.arange(-0.5,0.51,0.1),fontsize=10)
pylab.title('Au-DTB-Au : Transmission at E=2.394')
pylab.savefig('kdependent_transmission.png',dpi=100)

pylab.show()

plot_transmission.py

Save the file on your computer and execute it by dropping the file on the Job Manager. (If ATK cannot find the data file, dtb_analysis.nc, you might need to set the absolute path for the file in the script.) You should now see the following plot

k-dependent transmission at E=2.94 eV.

Figure 5: k-dependent transmission at E=2.94 eV.


The contour plot of the k-dependent transmission above has a pronounced peak at (kA,kB)=(0.22,0.0), with a transmission coefficient of 1.6. We missed this peak in the computation of the transmission spectrum earlier, because we did not have a dense enough k-point sampling, and hence the transmission was underestimated. With the 3x3 k-point sampling we had, the primary contribution came from the Γ point (0,0).

[Note] Note

This shows the importance of carefully checking the convergence of the results in the k-point sampling of the transmission spectrum. There is no reason to assume that the same number of points used to get a correct electron density (i.e. the k-points used in the self-consistent calculation) also give an accurate transmission.

k-dependent transmission eigenchannels

You will now calculate the transmission eigenstates at the k-point with the strongest transmission. We can choose either point (-0.22,0 or (0.22,0); they are equivalent by time-reversal symmetry.

  • Re-open the Script Generator and delete the TransmissionSpectrum block.

  • Add an Analysis/TransmissionEigenvalues block.

  • Add two Analysis/TransmissionEigenstates blocks.

    1. Open the TransmissionEigenvalues block, set the energy to 2.394 eV, and the k-point to (0.22,0)

    2. Open the first TransmissionEigenstates block, set the energy to 2.394 eV, and set the k-point to (0.22,0)

    3. Open the second TransmissionEigenstates block, set the energy to 2.394 eV, set the k-point to (0.22,0) and the quantum number to 1.

  • Execute the script using the Job Manager.

Inspect the log file to find the transmission eigenvalues, 0.96 and 0.64 and plot the corresponding eigenstates as shown below.

Isosurfaces of the two highest transmission eigenstates at energy 2.94 eV. The n=1 state has a weaker coupling the right electrode, and therefore a lower transmission probability (0.64) compared to n=0 which conducts almost perfectly (0.96).

Figure 6: Isosurfaces of the two highest transmission eigenstates at energy 2.94 eV. The n=1 state has a weaker coupling the right electrode, and therefore a lower transmission probability (0.64) compared to n=0 which conducts almost perfectly (0.96).


By comparing to the MPSH eigenstates, we can find that the n=0 eigenstate arises from transmission through MPSH state 15 and the n=1 eigenstate arise from transmission through MPSH state 16. State 16 has a node at the molecular axis, which makes the coupling with the surface weak. This state gives therefore rise to a very narrow peak in the transmission spectrum.

Energy dependent LDDOS

In this section you will calculate the energy-dependent Local Device Density of States (LDDOS). It is related to the PDDOS calculated above, however, instead of projecting the DDOS onto orbitals, the DDOS is projected in real space.

  • Re-open the Script Generator and delete the previous analysis blocks.

  • Add an Analysis/LocalDeviceDensityOfStates block.

  • Open the LocalDeviceDensityOfStates block and set the k-point sampling to 3 x 3.

  • Change the output filename to lddos.nc

The aim is to calculate the LDDOS in the energy range -3,3 eV with steps of 0.2 eV. This gives 31 spectra, and to set this up in the Script Generator will require that you add 30 more LocalDeviceDensityOfStates blocks. Instead of this tedious task, you will use scripting.

Use "Send To" to transfer the script to the Editor.

In the Editor, add the following lines before the LocalDeviceDensityOfStates block.

energies = numpy.linspace(-3,3,31)
for e in energies:

Indent the rest of the script by selecting the lines and pressing the TAB key. Finally, change the energy keyword into

        energy=e*eV,

The script should now look like the following

configuration = nlread('au_dtb_au.nc', object_id='gID000')[0]

# make list of energies to be used for ldos
energies = numpy.linspace(-3,3,31)

# calculate ldos for each energy in the list
for e in energies:
    local_device_density_of_states = LocalDeviceDensityOfStates(
        configuration=configuration,
        energy=e*eV,
        kpoints=MonkhorstPackGrid(3,3),
        contributions=All,
        energy_zero_parameter=AverageFermiLevel,
        infinitesimal=1e-06*eV,
        self_energy_calculator=KrylovSelfEnergy(),
        spin=Spin.Sum,
        )
    nlsave(r'lddos.nc', local_device_density_of_states)

lddos.py

The script will take around 30 min to execute on a serial machine. You may execute it using the Job Manager.

To plot the data use the script below

# import list with lddos
lddos_list = nlread('lddos.nc', LocalDeviceDensityOfStates)

#Find the z-spacing
dX, dY, dZ = lddos_list[0].volumeElement().convertTo(Ang)
dz = dZ.norm()
shape = lddos_list[0].shape()
z = dz * numpy.arange(shape[2])

# calculate average lddos along z for each spectrum
energies = []
lddos_z = []
for lddos in lddos_list:
    energies = energies + [lddos.energy().inUnitsOf(eV)]
    avg_z = numpy.apply_over_axes(numpy.mean,lddos[:,:,:],[0,1]).flatten()
    lddos_z = lddos_z + [avg_z]

# plot as contour plot
# make variables
energies = numpy.array(energies)
X, Y = numpy.meshgrid(z, energies)
Z = numpy.array(lddos_z).reshape(numpy.shape(X))


import pylab
#plot the LDDOS(E, z)
pylab.xlabel('z (Angstrom)',fontsize=12,family='sans-serif')
pylab.ylabel('Energy (eV)',fontsize=12,family='sans-serif')
contour_values = numpy.linspace(0,0.02,21)
pylab.contourf(X, Y, Z, contour_values)
pylab.colorbar()
pylab.axis([6,16,-3, 3])

pylab.title('Au-DTB-Au : LDDOS(E, z)')
pylab.savefig('lddos.png',dpi=100)


pylab.show()

lddos_ana.py

Execute the script, and you should see the following plot.

Local Device Density of States (LDDOS) averaged over x and y, plotted along z as a function of energy. In the white regions the LDDOS is very high, corresponding to metallic regions.

Figure 7: Local Device Density of States (LDDOS) averaged over x and y, plotted along z as a function of energy. In the white regions the LDDOS is very high, corresponding to metallic regions.


The LDDOS shows a high density in the metallic gold electrodes (white regions) and the central colored region corresponds to the vacuum gap. In the central region there are three peaks as a function of energy, positioned at -3, -1.4, 2.4 eV, in agreement with the peaks in the transmission spectrum.

If you add more LDDOS objects (i.e. more points in energy, the script above uses 31) you can enhance the energy resolution.