Difference between revisions of "Yambopy tutorial: band structures"

From The Yambo Project
Jump to navigation Jump to search
Line 174: Line 174:
  scissor list (shift,c,v) [eV,adim,adim]: [1.8985204833551723, 1.026524081134514, 1.0515886598785766]
  scissor list (shift,c,v) [eV,adim,adim]: [1.8985204833551723, 1.026524081134514, 1.0515886598785766]


In addition to the scissor operator, we can plot the GW (and DFT) band structure, in the path. The first choice would be to plot exact GW calculations, without interpolation, to check that the results are meaningfull (or not).
In addition to the scissor operator, we can plot the GW (and DFT) band structure, in the path. The first choice would be to plot exact GW calculations, without interpolation, to check that the results are meaningfull (or not). This plot is independent of the number of k-points ('''npoints''') that we want to plot in the interpolation. The class YamboQPDB finds the calculated points that belong to the path and plot them. Be aware that if we use coarse grids the class would not find any point and the function will not work.


  ks_bs_0, qp_bs_0 = ydb.get_bs_path(lat,path)
  ks_bs_0, qp_bs_0 = ydb.get_bs_path(lat,path)
Line 192: Line 192:
[[File:Figure 8-GW-band-structure-interpolated.png|400px|center]]
[[File:Figure 8-GW-band-structure-interpolated.png|400px|center]]


Finally
Finally, we can compare the calculated GW eigenvalues with the interpolation.


[[File:Figure 8-GW-band-structure-comparison.png|400px|center]]
[[File:Figure 8-GW-band-structure-comparison.png|400px|center]]

Revision as of 16:03, 4 April 2022

The full tutorial, including the Quantum espresso and Yambo databases that we will read, can be downloaded and extracted from the yambo website:

$wget www.yambo-code.org/educational/tutorials/files/databases_qepy.tar
$tar -xvf databases_qepy.tar
$cd databases_qepy

Tutorial 1. BN (semiconductor). Band structure

The qepy classes are useful not only to execute Quantum Espresso but also to analyze the results. The full qepy library is imported by simply doing:

from qepy import *

Plot Band structure

The class PwXML reads the data file generated by Quantum Espresso and post-process the data. The class is initiated doing:

xml = PwXML(prefix='bn', path='bands')

The variable prefix corresponds to the same variable of the QE input. The folder location is indicated by variable path. Previously to plot the bands, we define the k-points path using the function Path:

npoints = 50
path_kpoints = Path([ [[0.0, 0.0, 0.0],'$\Gamma$'],
                      [[0.5, 0.0, 0.0],'M'],
                      [[1./3,1./3,0.0],'K'],
                      [[0.0, 0.0, 0.0],'$\Gamma$']], [int(npoints*2),int(npoints),int(sqrt(5)*npoints)])

It is worth to note that the path should coincide with the selected path for the QE calculations.

In order to plot we do:

xml.plot_eigen(path_kpoints)

This function will automaticall plot the bands as shown below running the script:

python plot-qe-bands.py

Band structure of BN calculated at the level of DFT-LDA

Alternatively we can use the function plot_eigen_ax. This functions requires as input the figure object and with given axes, as in the next example.

Plot atomic orbital projected Band structure

In addition to the band structure, useful information regarding the atomic orbital nature of the electronic bands can be displayed using the class ProjwfcXML. Before we need to use the QE function projwfc.x to create the file atomic_proj.xml. The function projects wavefunctions onto orthogonalized atomic wavefunctions, among others functionalities. The orbital order is explained in the input documentation of the projwfc.x function (https://www.quantum-espresso.org/Doc/INPUT_PROJWFC.html#idm94). To run projwf.x we can use the class ProjwfcIn:

proj = ProjwfcIn(prefix='bn')
proj.run(folder='bands')

Be aware that this can take a while in a large system with many k-points. As in the class PwXML, we define the path_kpoints and also the selected atomic orbitals to project our bands. We have chosen to represent the projection weight onto the boron and nitrogen orbitals

atom_1 = list(range(16))
atom_2 = list(range(16,32)) 

The full list of orbitals is written in the file bands/prowfc.log. We have also defined the figure box

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(5,7))
ax  = fig.add_axes( [ 0.12, 0.10, 0.70, 0.80 ])

The class ProjwfcXML runs with this example:

band = ProjwfcXML(prefix='bn',path='bands',qe_version='7.0')
band.plot_eigen(ax,path_kpoints=path_kpoints,cmap='viridis',selected_orbitals=atom_1,selected_orbitals_2=atom_2)

We can run now the file:

python plot-qe-orbitals.py

Atomic orbital projected band structure of monolayer BN

We have chosen the colormap 'viridis' (variable cmap). We can also plot the bands varying the size. In this case we pass only the variable selected_orbitals (see next tutorial). The colormap can be represented in many ways and qepy does not include a particular function for this. An example is:

import matplotlib as mpl
cmap=plt.get_cmap('viridis')
bx  = fig.add_axes( [ 0.88, 0.10, 0.05, 0.80 ])
norm = mpl.colors.Normalize(vmin=0.,vmax=1.)
cb1 = mpl.colorbar.ColorbarBase(bx, cmap=cmap, norm=norm,orientation='vertical',ticks=[0,1])
cb1.set_ticklabels(['B', 'N'])

Tutorial 2. Iron. Ferromagnetic metalic material

In the case of spin-polarized calculations we can plot the spin up and down band structures. We have included in the tutorial the example of using the Classes Tasks and Flows developed in yambopy. You can check the file flow-iron.py to check an example. Yambopy includes basic predefined workflows to run the common QE and Yambo calculations. In this case we are using the class PwBandsTasks.

python flow-iron.py

In order to plot the spin-polarized bands. We have to run the file:

python plot-qe-bands.py

The class PwXML automatically detects the spin polarized case (nspin=2 in QE input file). The spin up channel is displayed with red and the spin down channel with blue. In the case of iron we have selected this path:

npoints = 50
path_kpoints = Path([ [[0.0, 0.0, 0.0 ],'G'],
                      [[0.0, 0.0, 1.0 ],'H'],
                      [[1./2,0.0,1./2.],'N'],
                      [[0.0, 0.0, 0.0 ],'G'],
                      [[1./2, 1./2, 1./2 ],'P'],
                      [[1./2,0.0,1./2. ],'N']], [npoints,npoints,npoints,npoints,npoints])
xml = PwXML(prefix='pw',path='bands/t0')
xml.plot_eigen(path_kpoints)
Spin polarized band structure of iron calculated by DFT

The analysis of the projected atomic orbitals is also implemented. In this case the results are more cumbersome because the projection is separated in spin up and down channels. In the case of representing the size as a function of the weight of the orbitals, we have represented exclusively the d orbitals:

atom_d = [3,4,5,6,7]
band = ProjwfcXML(prefix='pw',path='bands/t0',qe_version='7.0')
band.plot_eigen(ax,path_kpoints=path_kpoints,selected_orbitals=atom_d,color='red',color_2='blue')

If we run the file:

plot-qe-orbitals-size.py
Iron band structure. Size is proportional to the weights of the projection on atomic d-orbitals. Red (blue) is up (down) spin polarization.

From the plot is clear that d orbitals are mainly localized around the Fermi energy.

Another option is to plot the orbital composition as a colormap running the file:

plot-qe-orbitals-colormap.py
Figure 5-iron-bands-colormap.png

Here we have added the p and d orbitals in the analysis:

atom_p = [0,1,2]
atom_d = [3,4,5,6,7]
band = ProjwfcXML(prefix='pw',path='bands/t0',qe_version='7.0')
band.plot_eigen(ax,path_kpoints=path_kpoints,cmap='viridis',cmap2='rainbow',selected_orbitals=atom_p,selected_orbitals_2=atom_d)

The colormap bar is added in the same way as in Tutorial 1 (see script).

Tutorial 3

Yambopy is used mainly to run Yambo and QE calculations. Nevertheless, there are classes to analyse the results of Yambo and deals with the database generated by Yambo. In the case of GW quasi-particle calculations we can use the class YamboQPDB to find the scissor operator, plot the GW bands and to interpolated the GW bands in a smoother k-path. The example runs by doing:

python plot-qp.py

See below for an explanation of the tutorial. As usual, we can import the qepy and yambopy libraries:

 from qepy import *
 from yambopy import *
 import matplotlib.pyplot as plt

We define the k-points path.

 npoints = 10
 path = Path([ [[  0.0,  0.0,  0.0],'$\Gamma$'],
               [[  0.5,  0.0,  0.0],'M'],
               [[1./3.,1./3.,  0.0],'K'],
               [[  0.0,  0.0,  0.0],'$\Gamma$']], [int(npoints*2),int(npoints),int(sqrt(5)*npoints)] )

Importantly, the number of points is a free choice. We can increase the variable npoints as we wish, just the interpolation will take more time. In order to analyse GW results we need to have the file related to the basic data of our Yambo calculation (SAVE/ns.db1) and the netcdf file with the quasi-particle resutls (ndb.QP). We load the data calling the respective classes:

# Read Lattice information from SAVE
lat  = YamboSaveDB.from_db_file(folder='SAVE',filename='ns.db1')
# Read QP database
ydb  = YamboQPDB.from_db(filename='ndb.QP',folder='qp-gw')

The first option is to plot and calculate the scissor operator. We need to select the index of the top valence band:

n_top_vb = 4
ydb.plot_scissor_ax(ax,n_top_vb)

Yambopy displays the fitting and also the data of the slope of each fitting. Notice that this is also a test if the GW calculations are running well. If the dependence is not linear would be very rare and you should double-check your results!

Figure 6-slope-scissor.png

In this case the slope is:

valence bands:
slope:     1.0515886598785766
conduction bands:
slope:     1.026524081134514
scissor list (shift,c,v) [eV,adim,adim]: [1.8985204833551723, 1.026524081134514, 1.0515886598785766]

In addition to the scissor operator, we can plot the GW (and DFT) band structure, in the path. The first choice would be to plot exact GW calculations, without interpolation, to check that the results are meaningfull (or not). This plot is independent of the number of k-points (npoints) that we want to plot in the interpolation. The class YamboQPDB finds the calculated points that belong to the path and plot them. Be aware that if we use coarse grids the class would not find any point and the function will not work.

ks_bs_0, qp_bs_0 = ydb.get_bs_path(lat,path)
ks_bs_0.plot_ax(ax,legend=True,color_bands='r',label='KS')
qp_bs_0.plot_ax(ax,legend=True,color_bands='b',label='QP-GW')
Figure 7-GW-band-structure-non-interpolated.png

The interplation of the DFT and GW band structures has a similar aspect:

ks_bs, qp_bs = ydb.interpolate(lat,path,what='QP+KS',lpratio=20)
ks_bs.plot_ax(ax,legend=True,color_bands='r',label='KS')
qp_bs.plot_ax(ax,legend=True,color_bands='b',label='QP-GW')

The lpratio can be increase if the interpolation does not work. The interpolation is the one implemented by abipy.

Figure 8-GW-band-structure-interpolated.png

Finally, we can compare the calculated GW eigenvalues with the interpolation.

Figure 8-GW-band-structure-comparison.png

Links