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’_epr.h5: here si_epr.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 the following two output files:

  • ‘prefix’_tdf.h5 includes all the information of the TDF and occupation changes for each configuration in HDF5 format
  • pert_output.yml is the YAML output file containing information about the input and output parameters as well as the conductivity and mobility

The outputted YAML file, here called si_trans-rta.yml, contains the inputs and outputs of the 'trans-rta' calculation. The fields labeled trans contains the information unique to the 'trans-rta' calculation. For information on fields common to all Perturbo calculations, see this page.

The first section of the trans field is given below.

trans:

   temperature units: K

   chemical potential units: eV

   concentration units: cm-3

   conductivity units: 1/Ohm/m

   mobility units: cm2/V/s

   Seebeck coefficient units: mV/K

   # Electronic contribution
   # Not well tested, use with caution
   thermal conductivity units: W/m/K

   # Configuration means one line in the temper file:
   # temperature efermi concentration
   number of configurations:   5

The first few fields are self-explanatory and give information on the units used in the rest of the si_trans-rta.yml file.

The main results for each configuration index are shown in the configuration index field below. Note that in this case, we only used one configuration.

   configuration index:

      1:

         temperature: 150.00000

         chemical potential:   6.6083300781

         concentration:  0.1021448E+19

         conductivity:

            components:
               xx:   0.12523028E+06
               xy:  -0.66306464E+00
               yy:   0.12523632E+06
               xz:  -0.63777879E+00
               yz:   0.49996202E+00
               zz:   0.12523116E+06
               yx:  -0.66306464E+00
               zx:  -0.63777879E+00
               zy:   0.49996202E+00


            tensor:
               - [    0.12523028E+06,   -0.66306464E+00,   -0.63777879E+00,  ]
               - [   -0.66306464E+00,    0.12523632E+06,    0.49996202E+00,  ]
               - [   -0.63777879E+00,    0.49996202E+00,    0.12523116E+06,  ]

         mobility:

            components:
               ......


            tensor:
               - [    0.76521302E+04,   -0.40516216E-01,   -0.38971137E-01,  ]
               - [   -0.40516216E-01,    0.76524996E+04,    0.30549916E-01,  ]
               - [   -0.38971137E-01,    0.30549916E-01,    0.76521841E+04,  ]

         Seebeck coefficient:

            components:
               ......

            tensor:
               ......

            # Thermal conductivity: not well tested, use with caution

         thermal conductivity:

            components:
               ......


            tensor:
               - [    0.17035066E+00,   -0.72217031E-06,   -0.42527057E-06,  ]
               - [   -0.72217031E-06,    0.17035564E+00,    0.11057464E-05,  ]
               - [   -0.42527057E-06,    0.11057464E-05,    0.17035078E+00,  ]

      2:
        .......

Under the configuration index field, data for each of the configurations from the ftemper file are given. Note that all tensors (conductivity, mobility, Seebeck coefficient, and thermal conductivity), are given by components under the components field, and in tensor form under the tensor field. The results are identical, but are presented in both forms for clarity.

  • The temperature in K units, chemical potential in eV units, and carrier concentration in cm3 units defining the configuration are listed.
  • Under the conductivity field, the conductivity tensor computed for the configuration is given in Ohm-1 m-1 units.
  • Under the mobility field, the mobility tensor computed for the configuration is given in cm2V-1m-1 units.
  • Under the Seebeck coefficient field, the Seebeck coefficient tensor computed for the configuration is given in mV K-1 units.
  • Under the thermal conductivity field, the thermal conductivity tensor computed for the configuration is given in W m-1 ^K^ units. Please note that this calculation is not well tested and should be used with caution.

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.

Two additional fields are grid field and scatter parallelization fields, which give information on the number of \(\mathbf{k}\) points and their distribution across the MPI tasks.

grid:
   number of  tetrahedra selected:      76296
   number of reducible k-points:      15975
   number of irreducible k-points:        450


scatter parallelization:

   MPI task index:

      1:
         number of q-points:          121781
         number of (k,q) pairs:         4977063

         ......
      16:
      number of q-points:          122520
      number of (k,q) pairs:         4981812

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.

We may next use Perturbopy to export the data from the YAML file to Python for postprocessing. For more details, see the Perturbopy tutorial.

We obtain three output files containing a copy of the results:
  • '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'.trans_coef contains the conductivity, mobility, Seebeck coefficient and thermal conductivity tensors
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 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.


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’_epr.h5: here si_epr.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 output files, ‘prefix’_tdf.h5, and ‘prefix’_trans-ita.yml, similar to the RTA calculation.

The outputted YAML file, here called si_trans-ita.yml, contains the inputs and outputs of the 'trans-ita' calculation. The field labeled trans contains the information unique to the 'trans-ita' calculation. For information on fields common to all Perturbo calculations, see this page.

The trans field of the ‘prefix’_trans-ita.yml file is identical to the trans field of the trans-rta example but contains an additional field iteration for each configuration:

configuration index:

      1:
          # (see trans-RTA section for details)
          ...... 

          number of iterations:    4

          iteration:

              1:

                 conductivity:

                    components:
                       xx:   0.24817300E+05
                       xy:  -0.10178186E+00
                       yy:   0.24817960E+05
                       xz:  -0.79157444E-01
                       yz:   0.39313206E-01
                       zz:   0.24817360E+05
                       yx:  -0.10178186E+00
                       zx:  -0.79157444E-01
                       zy:   0.39313206E-01


                    tensor:
                       - [    0.24817300E+05,   -0.10178186E+00,   -0.79157444E-01,  ]
                       - [   -0.10178186E+00,    0.24817960E+05,    0.39313206E-01,  ]
                       - [   -0.79157444E-01,    0.39313206E-01,    0.24817360E+05,  ]

              ......
              
              4:

                 conductivity:

                    components:
                       ......


                    tensor:
                       - [    0.25389272E+05,   -0.31056698E-01,   -0.20778462E+00,  ]
                       - [   -0.31056698E-01,    0.25390489E+05,    0.59898721E-01,  ]
                       - [   -0.20778462E+00,    0.59898721E-01,    0.25389500E+05,  ]
      ......

The additional iteration field is present for each configuration. In the this field, the conductivity tensors computed during each ITA iteration are given in Ohm-1 m-1 units. There are 4 iterations in this case. Note that again, it is given in two forms: by components under the components field, and in tensor form under the tensor field.

We may next use Perturbopy to export the data from the YAML file to Python for postprocessing. For more details, see the Perturbopy tutorial.

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’_epr.h5: here si_epr.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 ‘prefix’_tdf.h5 and si_trans-mag-rta.yml .

The outputted YAML file, here called si_trans-mag-rta.yml, contains the inputs and outputs of the 'trans-mag-rta' calculation. The fields labeled trans contains the information unique to the 'trans-mag-rta' calculation. For information on fields common to all Perturbo calculations, see this page.

Please see the trans-rta example for information on the trans field, and see the trans-ita example for information on the additional iterations field. The ‘prefix’_trans-mag-rta.yml has the following additional data entries specifying the magnetic field.

trans:

   ......

   magnetic field units: T

   ......

   configuration index:

      1:

         ......

         magnetic field: [   0.10000,     0.00000,     0.00000,  ]

         ......

The only difference is that now, for each configuration, the magnetic field is printed in Tesla units; also, the Seebeck coefficient and thermal conductivity tensors are not computed. Also note that all elements of the conductivity and mobility tensors are independent in a non-zero magnetic field.

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.

We may next use Perturbopy to export the data from the YAML file to Python for postprocessing. For more details, see the Perturbopy tutorial.

We obtain 3 additional output files containing a copy of the results: 'prefix'.cond , 'prefix'.tdf , and 'prefix'.trans_coef. 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’_epr.h5: here si_epr.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 ‘prefix’_mag-ita.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’_epr.h5: here si_epr.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 may next use Perturbopy to export the data from the YAML file to Python for postprocessing. For more details, see the Perturbopy tutorial.

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”.