In this section of the tutorial, we will compute the electrical conductivity, carrier mobility tensors as well as the Seebeck coefficient and thermal conductivity. PERTURBO can compute these quantities using the relaxation time approximantion (RTA) of the Boltzmann transport equation (BTE): calc_mode = 'trans-rta'.

Another, more accurate, but also more expensive method is the iterative approach (ITA) to fully solve the linearized BTE: calc_mode = 'trans-ita'. The RTA and ITA calculations can be carried out in the presence of magnetic field: calc_mode = 'trans-mag-rta' and calc_mode = 'trans-mag-ita'.

Relaxation time approximation (RTA)
calc_mode = ‘trans-rta’

Requires the same variables as those specified in the calculation mode 'setup', except for the following two variables:

Here is the input file (pert.in):

&perturbo
 prefix      = 'si'
 calc_mode   = 'trans-rta'

 boltz_kdim(1) = 80
 boltz_kdim(2) = 80
 boltz_kdim(3) = 80

 boltz_emin = 6.4
 boltz_emax = 6.9
 band_min = 5
 band_max = 6

 ftemper  = 'si.temper'
 
 boltz_nstep = 0  ! optional
/

Before running perturbo.x, remember to put the following files in the run directory:

  • ‘prefix’_epwan.h5: here si_epwan.h5
  • ftemper: here si.temper obtained in the 'setup' calculation
  • ‘prefix’_tet.h5: here si_tet.h5 obtained in the 'setup' calculation
  • ‘prefix’.imsigma: here si.imsigma obtained in the 'imsigma' calculation

Run perturbo.x:

$ mpirun -n 1 perturbo.x -npools 1 -i pert.in > pert.out

This calculation usually takes a few minutes. We obtain five output files:

  • ‘prefix’.cond contains the conductivity and mobility tensors for each configuration in the temper file
  • ‘prefix’.tdf contains transport distribution function (TDF) as a function of carrier energy and temperature
  • ‘prefix’_tdf.h5 includes all the information of the TDF and occupation changes for each configuration in HDF5 format
  • ‘prefix’.trans_coef contains the conductivity, mobility, Seebeck coefficient and thermal conductivity tensors
  • pert_output.yml is the YAML output file containing information about the input and output parameters as well as the conductivity and mobility

In our example, the output file is si.cond, which is shown here:

#==========================================================#
#                  Conductivity (1/Ohm/m)                  #
#----------------------------------------------------------#

#  T (K)   E_f(eV)   n_c (cm^-3)      sigma_xx       sigma_xy       sigma_yy       sigma_xz       sigma_yz       sigma_zz
  300.00   6.55048   0.99458E+18    0.235555E+05  -0.744950E-06   0.235555E+05  -0.126413E-06  -0.247918E-04   0.235555E+05


#==========================================================#
#                    Mobility (cm^2/V/s)                   #
#--------------------(for semiconductor)-------------------#

#  T (K)   E_f(eV)   n_c (cm^-3)       mu_xx          mu_xy          mu_yy          mu_xz          mu_yz          mu_zz
  300.00   6.55048   0.99458E+18    0.147822E+04  -0.467493E-07   0.147822E+04  -0.793302E-08  -0.155581E-05   0.147822E+04

The calculated electron mobility at 300 K is ~ 1478 cm2V-1s-1, in reasonably good agreement with the experimental value of roughly 1400 cm2V-1s-1.

The second output file is si.tdf, whose format is shown below:

 #  E(eV)    (-df/dE) (a.u.)    TDF(E)_(xx xy yy xz yz zz) (a.u.)   #
  
 # Temperature:  300.0000  Chemical Potential:   6.550482

    6.632612    2.0230556858340698E+01    0.000000E+00   0.000000E+00   0.000000E+00   0.000000E+00   0.000000E+00   0.000000E+00
   ......
   ......

Column 1 is the carrier energy (eV), column 2 is the energy derivative of Fermi-Dirac distribution at the energy given by column 1, and columns 3-8 are the TDF values for each energy (same as conductivity, TDF has six components, usually the longitudinal component is plotted), respectively. The data for each temperature and chemical potential combination is given in a separate block of the file. In this case, we look at one temperature and one concentration, so there is only one block in the file.

Please refer to the calc_mode='trans-pp' to see the description of the ‘prefix’.trans_coef output file.

In more rigorous calculations, the user will need to converge the conductivity and mobility with respect to the number of \(\mathbf{k}\) and \(\mathbf{q}\) points, namely the variables boltz_kdim and boltz_qdim.

An example for hole carriers is also provided, in the folder “example02-silicon-perturbo/perturbo/pert-trans-RTA-hole”.

Full solution: Iterative approach (ITA)
calc_mode = ‘trans-ita’

Requires the same input file variables as the calculation mode 'setup', except for the following 6 variables:

  • calc_mode: is set to 'trans-ita'
  • boltz_nstep: contains the maximum number of iterations in the iterative scheme for solving Boltzmann equation, where a typical value is 10
  • phfreq_cutoff: contains phonon threshold (meV). Phonons with energy smaller than the cutoff will be ignored.
  • delta_smear: contains broadening (meV) for a Gaussian function to present the Dirac delta function
  • tmp_dir: contains output directory containing the e-ph matrix elements used in the calculations
  • load_scatter_eph: if .true., it will read the e-ph matrix elements from tmp_dir. The default is .false.

Here is the input file (pert.in):

&perturbo
 prefix      = 'si'
 calc_mode   = 'trans-ita'

 boltz_kdim(1) = 80
 boltz_kdim(2) = 80
 boltz_kdim(3) = 80

 boltz_emin = 6.4
 boltz_emax = 6.9
 band_min = 5
 band_max = 6

 ftemper  = 'si.temper'

 tmp_dir = './tmp'
 !load_scatter_eph = .true.

 boltz_nstep = 10 !max number of iterations
 phfreq_cutoff = 1  !meV
 delta_smear = 10  !meV
/

Before running the ITA calculation, make sure that the following files are in the run directory :

  • ‘prefix’_epwan.h5: here si_epwan.h5
  • ftemper: here si.temper
  • ‘prefix’_tet.h5: here si_tet.h5
export OMP_NUM_THREADS=4
$ mpirun -n 8 perturbo.x -npools 8 -i pert.in > pert.out

This task is time-consuming using one thread and one MPI process on a single core. To speed up the calculations, we run it on multiple cores using hybrid MPI plus OpenMP parallelization. After the calculation has completed, we obtain 5 output files, ‘prefix’.cond, ‘prefix’.tdf, ‘prefix’_tdf.h5, ‘prefix’.trans_coef, and pert_output.yml, similar to the RTA calculation.

An example calculation for holes is also provided in the folder “example02-silicon-perturbo/perturbo/pert-trans-ITA-hole”, link.

Magnetic RTA
calc_mode = ‘trans-mag-rta’

Requires the same input file variables as the calculation mode 'trans-rta', except for the following variables:

  • calc_mode: is set to 'trans-mag-rta'
  • boltz_nstep: Note that in the magnetic Boltzmann equation, RTA requires a finite number of iterations.

Here is the input file (pert.in):

&perturbo
 prefix      = 'si'
 calc_mode   = 'trans-mag-rta'

 boltz_kdim(1) = 80
 boltz_kdim(2) = 80
 boltz_kdim(3) = 80

 boltz_emin = 6.4
 boltz_emax = 6.9
 band_min = 5
 band_max = 6

 ftemper  = 'si.temper'

 boltz_nstep = 10 !max number of iterations
/

Before running the calculation, make sure that the following files are in the run directory :

  • ‘prefix’_epwan.h5: here si_epwan.h5
  • ftemper: here si.temper
  • ‘prefix’_tet.h5: here si_tet.h5
  • ‘prefix’.imsigma: here si.imsigma (optional but recommended for faster calculations)

The ‘prefix’.temper file needs to be modified to include magnetic fields. Add the \(x\), \(y\), and \(z\) values of magnetic fields (in Tesla) in the last three columns of the temper file.

1 F                                  ! Bx   By   Bz
300.00   6.5504824219   0.9945847E+18  0.00 0.00 0.01

Run PERTURBO:

export OMP_NUM_THREADS=4
$ mpirun -n 8 perturbo.x -npools 8 -i pert.in > pert.out

We run the calculation on multiple cores using hybrid MPI plus OpenMP parallelization. After the calculation has completed, we obtain 5 output files, ‘prefix’.cond, ‘prefix’.tdf, and ‘prefix’_tdf.h5, ‘prefix’.trans_coef, and pert_output.yml .

Because all elements of the conductivity tensor are independent in a non-zero magnetic field, the ‘prefix’.cond file prints out all 9 elements of the conductivity and mobility tensors.


          #==========================================================#
          #                  Conductivity (1/Ohm/m)                  #
          #----------------------------------------------------------#

#  T (K)   E_f(eV)   n_c (cm^-3)      sigma_xx       sigma_xy       sigma_yy       sigma_xz       sigma_yz       sigma_zz       sigma_yx       sigma_zx       sigma_zy
  300.00   6.55048   0.99458E+18    0.235554E+05  -0.353835E+02   0.235554E+05   0.169392E-04  -0.324052E-04   0.235555E+05   0.353972E+02   0.235280E-02  -0.101837E-02
          #--------------------iterative process---------------------#
  #iter.       sigma_xx       sigma_xy       sigma_yy       sigma_xz       sigma_yz       sigma_zz       sigma_yx       sigma_zx       sigma_zy
  #   1      0.235555E+05  -0.744950E-06   0.235555E+05  -0.126413E-06  -0.247918E-04   0.235555E+05  -0.744950E-06  -0.126413E-06  -0.247918E-04
  #   2      0.235554E+05  -0.353835E+02   0.235554E+05   0.169392E-04  -0.324052E-04   0.235555E+05   0.353972E+02   0.235280E-02  -0.101837E-02
          #----------------------------------------------------------#



          #==========================================================#
          #                    Mobility (cm^2/V/s)                   #
          #--------------------(for semiconductor)-------------------#

#  T (K)   E_f(eV)   n_c (cm^-3)       mu_xx          mu_xy          mu_yy          mu_xz          mu_yz          mu_zz          mu_yx          mu_zx          mu_zy
  300.00   6.55048   0.99458E+18    0.147822E+04  -0.222049E+01   0.147822E+04   0.106302E-05  -0.203359E-05   0.147822E+04   0.222135E+01   0.147650E-03  -0.639081E-04

In a magnetic calculation, the Seebeck and thermal conductivity tensors are not computed. Hence, the ‘prefix’.trans_coef file only contains the conductivity and mobility tensors.

          #==========================================================#
          #                  Conductivity (1/Ohm/m)                  #
          #----------------------------------------------------------#

#  T (K)   E_f(eV)   n_c (cm^-3)      sigma_xx       sigma_xy       sigma_yy       sigma_xz       sigma_yz       sigma_zz       sigma_yx       sigma_zx       sigma_zy
  300.00   6.55048   0.99458E+18    0.235554E+05  -0.353835E+02   0.235554E+05   0.169392E-04  -0.324052E-04   0.235555E+05   0.353972E+02   0.235280E-02  -0.101837E-02



          #==========================================================#
          #                    Mobility (cm^2/V/s)                   #
          #--------------------(for semiconductor)-------------------#

#  T (K)   E_f(eV)   n_c (cm^-3)       mu_xx          mu_xy          mu_yy          mu_xz          mu_yz          mu_zz          mu_yx          mu_zx          mu_zy
  300.00   6.55048   0.99458E+18    0.147822E+04  -0.222049E+01   0.147822E+04   0.106302E-05  -0.203359E-05   0.147822E+04   0.222135E+01   0.147650E-03  -0.639081E-04

Magnetic ITA
calc_mode = ‘trans-mag-ita’

Requires the same input file variables as the calculation mode 'trans-ita', except for the following variable:

Here is the input file (pert.in):

&perturbo
 prefix      = 'si'
 calc_mode   = 'trans-mag-ita'

 boltz_kdim(1) = 80
 boltz_kdim(2) = 80
 boltz_kdim(3) = 80

 boltz_emin = 6.4
 boltz_emax = 6.9
 band_min = 5
 band_max = 6

 ftemper  = 'si.temper'

 tmp_dir = './tmp'
 !load_scatter_eph = .true.

 boltz_nstep = 10 !max number of iterations
 phfreq_cutoff = 1  !meV
 delta_smear = 10  !meV
/

Before running the calculation, make sure that the following files are in the run directory :

  • ‘prefix’_epwan.h5: here si_epwan.h5
  • ftemper: here si.temper
  • ‘prefix’_tet.h5: here si_tet.h5
  • ‘prefix’.imsigma: here si.imsigma (optional)

Like in the calculation mode 'trans-mag-rta', the ‘prefix’.temper file needs to be modified to include magnetic fields. Add the \(x\), \(y\), and \(z\) values of magnetic fields (in Tesla) in the last three columns of the temper file.

1 F                                    !Bx   By   Bz
300.00   6.5504824219   0.9945847E+18  0.00 0.00 0.01

Run PERTURBO:

export OMP_NUM_THREADS=4
$ mpirun -n 8 perturbo.x -npools 8 -i pert.in > pert.out

We run the calculation on multiple cores using hybrid MPI plus OpenMP parallelization. After the calculation has completed, we obtain 5 output files, ‘prefix’.cond, ‘prefix’.tdf, and ‘prefix’_tdf.h5, ‘prefix’.trans_coef, and pert_output.yml . The format of the output files is the same as in the calculation mode 'trans-mag-rta'.

Postprocessing of transport
calc_mode = ‘trans-pp’

Uses the similar input file to the 'trans' calculation modes, but requires the additional file ‘prefix’_tdf.h5 obtained in the 'trans' calculation.

Change the calculation mode in the input file to 'trans-pp'. Before running perturbo.x, make sure that four files exist in the current directory:

  • ‘prefix’_epwan.h5: here si_epwan.h5
  • ftemper: here si.temper
  • ‘prefix’_tet.h5: here si_tet.h5
  • ‘prefix’_tdf.h5: here si_tdf.h5

Run perturbo.x:

$ mpirun -n 1 perturbo.x -npools 1 -i pert.in > pert.out

It takes a few seconds. We obtain a file, ‘prefix’.trans_coef, in this case, si.trans_coef, which has the following format:

         #==========================================================#
         #                  Conductivity (1/Ohm/m)                  #
         #----------------------------------------------------------#

#  T (K)   E_f(eV)   n_c (cm^-3)      sigma_xx       sigma_xy       sigma_yy       sigma_xz       sigma_yz       sigma_zz
  300.00   6.55048   0.99458E+18    0.251810E+05  -0.106635E+00   0.251823E+05  -0.172325E+00   0.142428E+00   0.251812E+05

         #==========================================================#
         #                    Mobility (cm^2/V/s)                   #
         #--------------------(for semiconductor)-------------------#

#  T (K)   E_f(eV)   n_c (cm^-3)       mu_xx          mu_xy          mu_yy          mu_xz          mu_yz          mu_zz
  300.00   6.55048   0.99458E+18    0.158023E+04  -0.669186E-02   0.158031E+04  -0.108143E-01   0.893806E-02   0.158025E+04

          #==========================================================#
          #                Seebeck coefficient (mV/K)                #
          #----------------------------------------------------------#

#  T (K)   E_f(eV)   n_c (cm^-3)        S_xx           S_xy           S_yy           S_xz           S_yz           S_zz
  300.00   6.55048   0.99458E+18   -0.428128E+00  -0.125064E-06  -0.428127E+00   0.500669E-07  -0.531919E-07  -0.428128E+00

          #==========================================================#
          #                Thermal conductivity (W/m/K)              #
          #------------------(Electronic contribution)---------------#

#  T (K)   E_f(eV)   n_c (cm^-3)      kappa_xx       kappa_xy       kappa_yy       kappa_xz       kappa_yz       kappa_zz
  300.00   6.55048   0.99458E+18    0.686130E-01  -0.143531E-06   0.686131E-01  -0.142782E-06  -0.114048E-07   0.686144E-01

The two blocks for the conductivity and mobility are the same as those in the 'trans' calculation mode, but the output file of 'trans-pp' has an additional block with the Seebeck coefficient results.

An example calculation for holes is also provided in the folder
“example02-silicon-perturbo/perturbo/pert-trans-pp-hole”.