w90_boltzwann Module

Compute Boltzman tranport properties

BoltzWann routines by G. Pizzi, D. Volja, B. Kozinsky, M. Fornari and N. Marzari August, 2012

Affiliations: THEOS, EPFL, Station 12, 1015 Lausanne (Switzerland) DMSE, MIT, 77 Massachusetts Ave, Cambridge, MA, 02139 Central Michigan University, Mount Pleasant, MI 48859 Robert Bosch LLC, Cambridge, MA, 02139

Please cite the following paper when publishing results obtained using the BoltzWann module:

[1] G. Pizzi, D. Volja, B. Kozinsky, M. Fornari, N. Marzari Comp. Phys. Comm. 185, 422 (2014) DOI: 10.1016/j.cpc.2013.09.015 (arXiv:1305.1587)


Uses

  • module~~w90_boltzwann~~UsesGraph module~w90_boltzwann w90_boltzwann module~w90_comms w90_comms module~w90_boltzwann->module~w90_comms module~w90_constants w90_constants module~w90_boltzwann->module~w90_constants module~w90_dos w90_dos module~w90_boltzwann->module~w90_dos module~w90_error w90_error module~w90_boltzwann->module~w90_error module~w90_utility w90_utility module~w90_boltzwann->module~w90_utility module~w90_comms->module~w90_constants module~w90_error_base w90_error_base module~w90_comms->module~w90_error_base module~w90_dos->module~w90_constants module~w90_dos->module~w90_error module~w90_error->module~w90_comms module~w90_error->module~w90_error_base module~w90_utility->module~w90_comms module~w90_utility->module~w90_constants

Used by

  • module~~w90_boltzwann~~UsedByGraph module~w90_boltzwann w90_boltzwann program~postw90 postw90 program~postw90->module~w90_boltzwann

Variables

Type Visibility Attributes Name Initial
integer, private, parameter :: XX = 1
integer, private, parameter :: XY = 2
integer, private, parameter :: YY = 3
integer, private, parameter :: XZ = 4
integer, private, parameter :: YZ = 5
integer, private, parameter :: ZZ = 6
character(len=74), private, parameter :: pub_string_1 = "Please cite the following paper when publishing results obtained using    "
character(len=74), private, parameter :: pub_string_2 = "the BoltzWann module:                                                     "
character(len=74), private, parameter :: pub_string_3 = "G. Pizzi, D. Volja, B. Kozinsky, M. Fornari, and N. Marzari,              "
character(len=74), private, parameter :: pub_string_4 = "Comp. Phys. Comm. 185, 422 (2014); DOI:10.1016/j.cpc.2013.09.015          "

Functions

private function MinusFermiDerivative(E, mu, KT)

Arguments

Type IntentOptional Attributes Name
real(kind=dp), intent(in) :: E

This function calculates -dn(E)/dE, where n(E) is the Fermi distribution function.

Read more…
real(kind=dp), intent(in) :: mu
real(kind=dp), intent(in) :: KT

Return Value real(kind=dp)


Subroutines

public subroutine boltzwann_main(pw90_boltzwann, dis_manifold, pw90_dos, kpt_latt, pw90_band_deriv_degen, postw90_oper, pw90_spin, physics, ws_region, w90_system, wannier_data, ws_distance, wigner_seitz, print_output, HH_R, SS_R, v_matrix, u_matrix, eigval, real_lattice, scissors_shift, mp_grid, num_wann, num_bands, num_kpts, effective_model, have_disentangled, spin_decomp, seedname, stdout, timer, error, comm)

This is the main routine of the BoltzWann module. It calculates the transport coefficients using the Boltzmann transport equation.

Read more…

Arguments

Type IntentOptional Attributes Name
type(pw90_boltzwann_type), intent(in) :: pw90_boltzwann
type(dis_manifold_type), intent(in) :: dis_manifold
type(pw90_dos_mod_type), intent(in) :: pw90_dos
real(kind=dp), intent(in) :: kpt_latt(:,:)
type(pw90_band_deriv_degen_type), intent(in) :: pw90_band_deriv_degen
type(pw90_oper_read_type), intent(in) :: postw90_oper
type(pw90_spin_mod_type), intent(in) :: pw90_spin
type(pw90_physical_constants_type), intent(in) :: physics
type(ws_region_type), intent(in) :: ws_region
type(w90_system_type), intent(in) :: w90_system
type(wannier_data_type), intent(in) :: wannier_data
type(ws_distance_type), intent(inout) :: ws_distance
type(wigner_seitz_type), intent(inout) :: wigner_seitz
type(print_output_type), intent(in) :: print_output
complex(kind=dp), intent(inout), allocatable :: HH_R(:,:,:)
complex(kind=dp), intent(inout), allocatable :: SS_R(:,:,:,:)
complex(kind=dp), intent(in) :: v_matrix(:,:,:)
complex(kind=dp), intent(in) :: u_matrix(:,:,:)
real(kind=dp), intent(in) :: eigval(:,:)
real(kind=dp), intent(in) :: real_lattice(3,3)
real(kind=dp), intent(in) :: scissors_shift
integer, intent(in) :: mp_grid(3)
integer, intent(in) :: num_wann
integer, intent(in) :: num_bands
integer, intent(in) :: num_kpts
logical, intent(in) :: effective_model
logical, intent(in) :: have_disentangled
logical, intent(in) :: spin_decomp
character(len=50), intent(in) :: seedname
integer, intent(in) :: stdout
type(timer_list_type), intent(inout) :: timer
type(w90_error_type), intent(out), allocatable :: error
type(w90_comm_type), intent(in) :: comm

private subroutine calcTDFandDOS(pw90_boltzwann, dis_manifold, pw90_dos, kpt_latt, postw90_oper, pw90_band_deriv_degen, pw90_spin, ws_region, print_output, wannier_data, ws_distance, wigner_seitz, HH_R, SS_R, u_matrix, v_matrix, eigval, real_lattice, TDF, TDFEnergyArray, cell_volume, scissors_shift, mp_grid, num_bands, num_kpts, num_wann, num_valence_bands, num_elec_per_state, effective_model, have_disentangled, spin_decomp, seedname, stdout, timer, error, comm)

This routine calculates the Transport Distribution Function (TDF) in units of 1/hbar^2 * eV*fs/angstrom, and possibly the DOS.

Read more…

Arguments

Type IntentOptional Attributes Name
type(pw90_boltzwann_type), intent(in) :: pw90_boltzwann
type(dis_manifold_type), intent(in) :: dis_manifold
type(pw90_dos_mod_type), intent(in) :: pw90_dos
real(kind=dp), intent(in) :: kpt_latt(:,:)
type(pw90_oper_read_type), intent(in) :: postw90_oper
type(pw90_band_deriv_degen_type), intent(in) :: pw90_band_deriv_degen
type(pw90_spin_mod_type), intent(in) :: pw90_spin
type(ws_region_type), intent(in) :: ws_region
type(print_output_type), intent(in) :: print_output
type(wannier_data_type), intent(in) :: wannier_data
type(ws_distance_type), intent(inout) :: ws_distance
type(wigner_seitz_type), intent(inout) :: wigner_seitz
complex(kind=dp), intent(inout), allocatable :: HH_R(:,:,:)
complex(kind=dp), intent(inout), allocatable :: SS_R(:,:,:,:)
complex(kind=dp), intent(in) :: u_matrix(:,:,:)
complex(kind=dp), intent(in) :: v_matrix(:,:,:)
real(kind=dp), intent(in) :: eigval(:,:)
real(kind=dp), intent(in) :: real_lattice(3,3)
real(kind=dp), intent(out) :: TDF(:,:,:)

The TDF(i,EnIdx,spin) output array, where: - i is an index from 1 to 6 giving the component of the symmetric tensor , where 1=xx, 2=xy, 3=yy, 4=xz, 5=yz, 6=zz as defined by the module constants XX, XY, ... (in this way the mapping (i,j) -> i+((j-1)*j)/2 is satisfied for the packed storage of the upper triangle [i<=j]). - EnIdx is the index of the energies; the corresponding energy is given by TDFEnergyArray(EndIdx) array (in eV). - Spin may be only 1 if spin_decomp=.false. If it is instead true, 1 contains the total TDF, 2 the spin-up component and 3 the spin-up component

real(kind=dp), intent(in) :: TDFEnergyArray(:)

TDFEnergyArray The array with the energies for which the TDF is calculated, in eV

real(kind=dp), intent(in) :: cell_volume
real(kind=dp), intent(in) :: scissors_shift
integer, intent(in) :: mp_grid(3)
integer, intent(in) :: num_bands
integer, intent(in) :: num_kpts
integer, intent(in) :: num_wann
integer, intent(in) :: num_valence_bands
integer, intent(in) :: num_elec_per_state
logical, intent(in) :: effective_model
logical, intent(in) :: have_disentangled
logical, intent(in) :: spin_decomp
character(len=50), intent(in) :: seedname
integer, intent(in) :: stdout
type(timer_list_type), intent(inout) :: timer
type(w90_error_type), intent(out), allocatable :: error
type(w90_comm_type), intent(in) :: comm

private subroutine TDF_kpt(pw90_boltzwann, ws_region, pw90_spin, wannier_data, ws_distance, wigner_seitz, HH_R, SS_R, deleig_k, eig_k, EnergyArray, kpt, real_lattice, TDF_k, mp_grid, num_wann, num_elec_per_state, spin_decomp, error, comm)

This subroutine calculates the contribution to the TDF of a single k point

Read more…

Arguments

Type IntentOptional Attributes Name
type(pw90_boltzwann_type), intent(in) :: pw90_boltzwann
type(ws_region_type), intent(in) :: ws_region
type(pw90_spin_mod_type), intent(in) :: pw90_spin
type(wannier_data_type), intent(in) :: wannier_data
type(ws_distance_type), intent(inout) :: ws_distance
type(wigner_seitz_type), intent(in) :: wigner_seitz
complex(kind=dp), intent(inout), allocatable :: HH_R(:,:,:)
complex(kind=dp), intent(inout), allocatable :: SS_R(:,:,:,:)
real(kind=dp), intent(in) :: deleig_k(:,:)

array with the band derivatives at the given k point (in eV * angstrom / (2pi) as internally given by the code) already corrected in case of degeneracies, as returned by the wham_get_deleig_a routine

real(kind=dp), intent(in) :: eig_k(:)

array with the eigenvalues at the given k point (in eV)

real(kind=dp), intent(in) :: EnergyArray(:)

array with the energy grid on which to calculate the DOS (in eV) It must have at least two elements

real(kind=dp), intent(in) :: kpt(3)

the three coordinates of the k point vector whose DOS contribution we want to calculate (in relative coordinates)

real(kind=dp), intent(in) :: real_lattice(3,3)
real(kind=dp), intent(out) :: TDF_k(:,:,:)

TDF_k array in which the contribution is stored. Three dimensions: TDF_k(ij, energyidx, spinidx), where: - ij indexes the components of the TDF (symmetric) tensor (1=XX, 2=XY, ...); see the global constants defined in the module - energyidx is the index of the energies, corresponding to the one of the EnergyArray array; - spinidx=1 contains the total dos; if if spin_decomp==.true., then spinidx=2 and spinidx=3 contain the spin-up and spin-down contributions to the DOS

integer, intent(in) :: mp_grid(3)
integer, intent(in) :: num_wann
integer, intent(in) :: num_elec_per_state
logical, intent(in) :: spin_decomp
type(w90_error_type), intent(out), allocatable :: error
type(w90_comm_type), intent(in) :: comm