[ Home ] [ News ] [ Contact ] [ Search ] [ nextnano.com ] tighten

 Download Software
 Copyright notice
 Publications

 GUI: nextnanomat
 Tool: nextnano³
 Tool: nextnano++
 Tool: nextnano.QCL
 * password protected

 

 
Up
 

 

Tight binding

The original tighten code that is used inside nextnano3 has been written by Peter Vogl, Walter Schottky Institute, Technische Universität München.
It is based on the sp3d5s* method. For details about this method, see e.g.

   Empirical spds* tight-binding calculation for cubic semiconductors: General method and material parameters
   J.-M. Jancu, R. Scholz, F. Beltram, F. Bassani
   Phys. Rev. B 57, 6493 (1998)

!------------------------------------------------------------!
$tighten                                           optional  !
 calculate-tight-binding-tighten    character      required  !
 tighten-method                     character      optional  !
 tight-binding-model                character      optional  !
 destination-directory              character      required  !
 input-directory                    character      optional  !
 filename-material-parameters       character      optional  !
 filename-distance-parameters       character      optional  !
 filename-tighten                   character      optional  !
 filename-k-vectors                 character      optional  !
 k-vectors-sample-type              character      optional  !
 number-of-k-points                 integer        optional  !
 k-vector                           double_array   required  !
 power-of-distance-dependence       double         optional  !
 calculate-eigenvectors             character      optional  !
 scale                              double         optional  !
 potential-energy-left              double         optional  !
 potential-energy-right             double         optional  !
 debug-level                        integer        optional  !
                                                             !
 filename-states                    character      optional  !
 calculate-only-lattice-geometry    character      optional  !
 output-Hamiltonian                 character      optional  !
 calculate-k-derivatives            character      optional  !
 tighten-option                     character      optional  !
 number-of-band-for-Fermi-energy    integer        optional  !
 number-of-band-for-psi             integer        optional  !
 number-of-bands-to-plot            integer        optional  !

 rescale-to-unstrained-k-points     character      optional  !
for graphene only

$end_tighten                                       optional  !
!------------------------------------------------------------!

 

 

!------------------------------------------------------------!
$atomic-layers                                     optional  !
 layer-number                       integer        required  !
 ion-1                              character      required  !
 ion-1-content                      double         required  !
 ion-2                              character      optional  !
 ion-2-content                      double         optional  !
$end_atomic-layers                                 optional  !
!------------------------------------------------------------!
 

Example

$atomic-layers
is only necessary for the heterostructure tight-binding code but not for the bulk tight-binding code.

 $atomic-layers

 
  !--------------------------------------
  ! layer 1: cation
  ! layer 2: anion
  !--------------------------------------
  layer-number = 1   ion-1-name = Ga   ion-1-content = 0.5d0   ion-2-name = Al   ion-2-content = 0.5d0   ! Ga/Al cation / alloy content
  layer-number = 2   ion-1-name = As   ion-1-content = 1.0d0                                             ! As    anion  / alloy content
  layer-number = 3   ion-1-name = Ga   ion-1-content = 1.0d0                                             ! Ga    cation / alloy content
  layer-number = 4   ion-1-name = As   ion-1-content = 1.0d0                                             ! As    anion  / alloy content

Note: The total number of layers in [001] superlattice direction must be integer multiple of 4 (e.g. 4, 8, 12, ...) because a unit cell consists of 4 atomic layers.
Convert number of layers (atomic layers) into [nm] units:  position  =  layer-number  *  LatticeConstant / 4
Convert number of molecular layers      into [nm] units:  position  =  layer-number  *  LatticeConstant / 2
The lattice constant refers to the constant distance between unit cells in a crystal lattice. A unit cell consists of 2 molecular layers in diamond/zinc blende structure.
 

 

Syntax

rashba2tighten ==> tighten

flow-scheme = 200

 

Example

!-----------------------------------------------------------------!
$tighten                                                          !
 calculate-tight-binding-tighten = yes                            !
 tighten-method                  = rashba2tighten-tighten         !
 tight-binding-model             = Scholz                         ! 'Scholz', 'Sarma'
 destination-directory           = TightBinding/                  !
directory name for tight-binding output. This is where all output goes.
 input-directory                 = ../Syntax/Tight-binding files/ !
directory name for tight-binding input, relative to executable path
!input-directory                 = H:\Tighten\TIGHTEN_nextnano3\  !
directory name for tight-binding input, absolute path
 filename-material-parameters    = TB_material_parameters.in      !
The full filename is then: input-directory/filename-material-parameters
 filename-distance-parameters    = TB_distance_parameters.in      !
The full filename is then: input-directory/filename-distance-parameters
 filename-tighten                = tighten.in                     !
This file is written to destination-directory/ and will be read in again by the tighten algorithm.
                                                                  ! If tighten-method = tighten, the full filename is then: input-directory/filename-tighten
 filename-k-vectors              = k_vectors.in                   !
This file is written to destination-directory/ and will be read in again by the tighten algorithm.
                                                                  !
If tighten-method = tighten, the full filename is then: input-directory/filename-k-vectors
 k-vectors-sample-type           = band                           !
 number-of-k-points              = 1000                           !
 k-vector                        = 0.5d0 0.0d0 0.5d0              ! [2pi/a]
 power-of-distance-dependence    = 2.0d0                          !
 calculate-eigenvectors          = no                             ! 'yes' / 'no'
 scale                           = 1d0                            !
 potential-energy-left           = 0d0                            ! [eV]
 potential-energy-right          = 0d0                            ! [eV]
 debug-level                     = 1                              ! '1', '2', '3'

!-----------------
! Now tighten....
!-----------------
 filename-states                 = states.in                      !
The full filename is then: input-directory/filename-states

 calculate-only-lattice-geometry = no                             ! 'yes' / 'no'
 output-Hamiltonian              = no                             ! 'yes' / 'lower' / 'no'
 calculate-k-derivatives         = no                             ! 'yes' / 'first' / 'second' / 'no'
 tighten-option                  = eigenvalues-only               ! 'eigenvalues-only', 'eigenvectors-and-density', 'eigenvectors-and-g-factor', 'no-eigenvalues'
 number-of-band-for-psi          = 1                              !
used with 2 above, index of 1st of 4 bands w |psi|^2
 number-of-bands-to-plot         = 4                              !
$end_tighten                                                      !
!-----------------------------------------------------------------!

 

 

Syntax

 calculate-tight-binding-tighten = yes      ! do tight-binding calculation with tighten
                                 = no       !
no tight-binding calculation (default)
 

 tighten-method                  = rashba2tighten-tighten ! generate input file for tighten and do tight-binding calculation with tighten
                                 = rashba2tighten         !
generate input file for tighten only
                                 = tighten                !
tight-binding calculation ==> tighten only
 

 tight-binding-model             = Scholz                 ! (default) (only for III-V materials)
                                
= Sarma                  !
                    (for II-VI materials)

Scholz parameterization
  
Empirical spds* tight-binding calculation for cubic semiconductors: General method and material parameters
   J.-M. Jancu, R. Scholz, F. Beltram, F. Bassani
   Phys. Rev. B 57, 6493 (1998)

Sarma parameterization
  
Realistic tight-binding model for the electronic structure of II-VI semiconductors
   S. Sapra, N. Shanthi, D. D. Sarma
   Phys. Rev. B 66, 205202 (2002)
 

 destination-directory           = TightBinding/                  ! directory name for tight-binding output. This is where all output goes.
                                 = ./                             !
(default)
 

 input-directory                 = ../Syntax/Tight-binding files/ ! directory name for tight-binding input, relative to executable path.
                                 = H:\tighten_input\              !
                                 = "H:\My tighten input\"         !
if a blank is contained in the folder name, use "".
                                 = ../tighten_input/
                                 = ./                             !
(default)
 

 filename-material-parameters    = TB_material_parameters.in      ! The full filename is then: input-directory/filename-material-parameters
 filename-distance-parameters    = TB_distance_parameters.in      !
The full filename is then: input-directory/filename-distance-parameters
These files are located in the folder:
C:\Program Files (x86)\nextnano\nextnano3\Syntax\Tight-binding files\
For more information on these input files, see documentation further below.
 

 filename-tighten                = tighten.in                 ! (default) name of tight-binding input file (will be generated by rashba2tighten, and read in again by tighten)
                                                              !
This file is written to destination-directory/ and will be read in again by the tighten algorithm.
                                                              !
If tighten-method = tighten, the full filename is then: input-directory/filename-tighten

This file contains user input for lattice structure and tight-binding parameters.
 filename-k-vectors              = k_vectors.in               ! (default) ==> will be generated by rashba2tighten, and read in again by tighten program
                                                              !
This file is written to destination-directory/ and will be read in again by the tighten algorithm.
                                                              !
If tighten-method = tighten, the full filename is then: input-directory/filename-k-vectors
This file contains the k vectors for the tight-binding Hamiltonian that will be diagonalized, i.e. for which the eigenenergies and eigenfunctions will be calculated.
The columns in this file are:
    REAL(loop_index_over_k)    0.5*(kx+ky)    0.5d0*(ky+kz)    0.5d0*(kx+kz)    kx    ky    kz
 

 k-vectors-sample-type           = band                       ! for bandstructure plot along the lines: Gamma ==> (along Delta to) X = 0.5 G1 ==> (along Z to) M = 0.5 (G1+G2) ==>  (along Sigma to) Gamma ==> Z = 0.5 G3
                                                              !
reciprocal primitive vectors: G1 = (2pi sqrt(2)/a_lateral ) * (1 0 0) ==> along (1 0 0) in-plane direction
                                                              !                      G2 = (2pi sqrt(2)/a_lateral ) * (0 1 0) ==> along (0 1 0) in-plane direction
                                                              !                   
  G3 = (2pi        /a_vertical) * (0 0 1) ==> along superlattice direction
                                                              ! a_lateral:        in-plane lattice constant
                                                              ! a_vertical: out-of-plane lattice constant

                                 = k_parallel_100-Gamma-k_superlattice !
X = -0.5 G1      ==> (along Delta   to) Gamma ==> Z = 0.5 G3
                                 = k_parallel_110-Gamma-k_superlattice !
M = -0.5 (G1+G2) ==> (along Sigma to) Gamma ==> Z = 0.5 G3
                                 = 110G                       !
3 values, namely (000), (kx0,0,0), (0,kx0,0), [110] direction and [1-10] direction
                                 = 100D                       ! "100D" - "001D"
                                 = two                        !
2 values, namely (000) and the one specified (kx0,ky0,kz0)
                                 = cirG                       !
circle Gamma=(000) with radius kmod=|k0|, surrounding Gamma point at distance specified.
                                 = xyz                        ! number_of_k_points
values from ( 0 , 0 , 0 ) ==> (kx0,ky0,kz0)
Here one specifies how the k vectors have to be sampled for the superlattice tight-binding code.
For bulk tight-binding code the relevant options are:
                                 = band                       ! go along axes L -> Gamma -> X -> Gamma -> Z
                                 = 110G                       !
3 values, namely (000)  , (kx0,kx0,0)  , (-kx0, kx0,0)
                                 = 110X                       !
3 values, namely (001)  , (kx0,kx0,1)  , ( kx0,-kx0,1)
                                 = 110D                       !
3 values, namely (00kz0), (kx0,kx0,kz0), (-kx0, kx0,kz0)
                                 = 110L                       !
3 values, namely (0.5,0.5,0.5), (0.5+kx0,0.5+kx0,0.5-2kx0), (0.5+kx0,0.5-kx0,0.5)
                                 = 100G                       !
3 values, namely (000), (kx0,0,0),(0,ky0,0)
                                 = two                        !
2 values, namely (000) and (kx0,ky0,kz0)
                                 = cirG                       !
circle Gamma=(000) in kz=0 plane with radius kmod=|k0|
                                 = cirX                       !
circle X    =(001) in kz=1 plane with radius kmod=|k0|
                                 = cirL                       !
circle L    =(111) in plane lambda*(1,1,-2) + mu*(1,-1,0) with radius kmod=|k0|
                                 = xyz                        ! number_of_k_points
values from ( 0 , 0 , 0 ) ==> (kx0,ky0,kz0)
                                 = xff                        ! number_of_k_points
values from ( 0 ,ky0,kz0) ==> (kx0,ky0,kz0)
                                 = ffz                        ! number_of_k_points
values from (kx0,ky0, 0 ) ==> (kx0,ky0,kz0)

For the bulk tight-binding code of graphene the relevant options are:
                                 = M'_K_Gamma_M_K'_M'         ! band structure of graphene along the path M' ==> K ==> Gamma ==> M ==> K' ==> M'
                                 =    K_Gamma_M_K'            !
band structure of graphene along the path        K ==> Gamma ==> M ==> K'

 

 number-of-k-points              = 1000                       ! number of k vectors for which to calculate eigenvalues (only relevant for band, k_parallel_100-Gamma-k_superlattice, k_parallel_100-Gamma-k_superlattice, xyz so far)

 k-vector                        = 0.5d0  0.0d0  0.5d0        ! for superlattice tight-binding code: k = (kx,ky,kSL) vector in dimensionless units [2sqrt(2)pi/alateral], [2pi/avertical]
 k-vector                        = 0.01d0 0.01d0 0.00d0       ! 
for bulk            tight-binding code: k = (kx,ky,kz)   vector in units of 2pi/(kx0/alateral,ky0/alateral,kz0/avertical)
 

 power-of-distance-dependence    = 2.0d0                      ! ti = t0*(d0/di)**eta  (default: 2d0)
 

 calculate-eigenvectors          = yes                        !
                                 = no                         !
(default)   calculate eigenvalues only
 

 scale                           = 5d0                        ! scale output of wave functions and |psi|2 to improve visualization of |psi|2 in the band edges plot
                                 = 1d0                        !
(default)
 

 potential-energy-left           = 0d0                        ! [eV]  (default: 0d0)  Add potential energy to band edges (value at first layer).
 potential-energy-right          = 0d0                        ! [eV] 
(default: 0d0)  Add potential energy to band edges (value at last layer).
                                                              !
The values in between are interpolated for each layer. This way an electrostatic potential or electric field can be included.
 

 debug-level                     = 1            ! (default)       ! get reduced standard output, this is appropriate to generate an input file if unit cell has many atoms. NOTE: only first element of star is printed.
                                 = 2                          !
get very detailed output, excluding Hamiltonian
                        
        = 3                          !
get very detailed output, including Hamiltonian to stdio
 

!-----------------
! Now tighten....
!-----------------
 filename-states                 = states.in                  !
The full filename is then: input-directory/filename-states
This file is located in the folder:
C:\Program Files (x86)\nextnano\nextnano3\Syntax\Tight-binding files\
For more information on this input file, see documentation further below.
 

 calculate-only-lattice-geometry = no                        ! (default)
                               
 = yes                       ! Calculate only lattice geometry but not tight-binding Hamiltonian.
 

 output-Hamiltonian              = no                        ! (default)  Hamiltonian matrix not written to file
                                 = yes                       !
whole Hamilton matrix is written column wise
                                 = lower                     !
lower triangle is written row wise
 

 calculate-k-derivatives         = no                        ! (default)  do not calculate k-derivatives of H(k)
                                 = yes                       !
calculate first and second
                                 = first                     !
calculate d/dk H(k)
                                 = second                    !
calculate d2/dkikj H(k)
ham_1deriv_output_file
ham_2deriv_output_file
... files that contain nonzero matrix elements of 1st (and 2nd) k-derivative of H in same format as ham_output_file,
BUT ONLY SPIN_UP/SPIN-UP PART since SPIN-DN/SPIN-DN is identical and SPIN_ DN/SPIN-UP=0
'der1.dat'          ! ham_1deriv_output_file = 'der1.dat'
'der2.dat'          ! ham_2deriv_output_file = 'der2.dat'
 

 tighten-option                  = eigenvalues-only          ! (default)  calculate only eigenvalues (eigval)
                                 = eigenvectors-and-density  !
calculate eigenvectors and density of tight-binding Hamiltonian (ev+dens)
                                 = eigenvectors-and-g-factor !
calculate eigenvectors and g-factor (ev+g)
                                 = no-eigenvalues            !
no diagonalization
 

 number-of-band-for-Fermi-energy  =  5   ! integer number > 0
zero of energy is taken at this band for first k-vector
This specifier only applies to the bulk tight-binding algorithm.
 

 number-of-band-for-psi          = 1                         ! (default: 1) used with 2 above, index of 1st of 4 bands w |psi|2 (actually 8 bands due to spin degeneracy)
If ieigenvalues_flag=2, wave functions are calculated at Gamma for every second of number-of-bands-to-plot/2 consecutive bands,
starting with number-of-band-for-psi, where -1 and 0 = top of valence band, 1 and 2 = 1st conduction band. Choose an odd number.
If ieigenvalues_flag=3, g-factor tensor for this plus following (nondegenerate) band is calculated
 

 number-of-bands-to-plot         = 4                         ! (default: 4)
This is the number of bands that are plotted in the files
  - out_wavegamma.dat                 -  |psi|2,... are not shifted
  - out_wavegamma_shift.dat           -
 |psi|2,... are shifted by their eigenenergies with respect to the energy dispersion plot
  - out_wavegamma_shift_bandedges.dat -
 |psi|2,... are shifted by their eigenenergies with respect to the band edges plot
starting from the band indicated with number-of-band-for-psi.

 

 

This flag is only relevant for the tight-binding code of graphene:

 rescale-to-unstrained-k-points = no  ! (default) Do not rescale band structure to unstrained k points. It can be useful to keep the high symmetry points fixed on the graph in order to compare different strains.
                                = yes !
Rescale band structure to unstrained k points. This moves the high symmetry points if strained.

 

 

Necessary input files

  • material parameters
    TB_material_parameters.in  ==> Download file: TB_material_parameters.in

    c11 c12        elastic constants 10-2 [GPa]
    a             
    lattice constant [Angstrom]
                  
    tight-binding parameters [eV]
    nc na
    esc epc esec edct2 edce
    esa epa esea edat2 edae
    Dav           
    absolute deformation potential [eV]
    sss scpas pcsas pps ppp seses secsas scseas secpas pcseas scdas dcsas pcdas dcpas pcdap dcpap secdas dcseas dds ddp ddd
    so_p_c so_p_a
    so_d_c so_d_a
    so_ppca

    Gammav        
    energy of top valence band edge at Gamma point [eV]
    Gammac        
    energy of conduction band edge at Gamma point [eV]
    The last two values are not used for the tight-binding calculation. However, these are the relevant values that are contained in the output files band_edges_nm.dat and band_edges.dat.
    They are the values of the unstrained band edges on an absolute energy scale. They are crude estimates only.
    As already said, they are not input to the actual tight-binding calculation but they are similar to the results of a bulk tight-binding calculation.

    The empirical tight-binding material parameters for Ge are the ones of J.-M. Jancu et al., PRB 57, 6493 (1998), Table II with the following exceptions:
    Es, Ep, Ed, Es* are shifted by +1.7683 eV.
     
  • distance parameters
    TB_distance_parameters.in  ==> Download file: TB_distance_parameters.in

    These parameters are relevant for strained materials or for alloys.

    nsss nscpas npcsas npps nppp nseses nsecsas nscseas nsecpas npcseas nscdas ndcsas npcdas ndcpas npcdap ndcpap nsecdas ndcseas ndds nddp nddd

    bdeff         
    deformation potential [eV] (Note: Different meaning/definition!)
                  
    in order to modify on-site d-energies according to strain (bdeff = bd * ed_scholz)
     
  • states
    states.in                       ==> Download file: states.in

    This noneditable namelist file will be read in by the tighten program and contains the following information:

    &state_description

     number_state_ref   = 10

     state_ref_name(1)  = 's'
     state_ref_name(2)  = 'px'
     state_ref_name(3)  = 'py'
     state_ref_name(4)  = 'pz'
     state_ref_name(5)  = 'se'
     state_ref_name(6)  = 'dxy'
     state_ref_name(7)  = 'dyz'
     state_ref_name(8)  = 'dzx'
     state_ref_name(9)  = 'dx2y2'
     state_ref_name(10) = 'dz2r2'

     number_coup_ref    = 21

     coup_ref_name(1)   = 'sss'
     coup_ref_name(2)   = 'sps'
     coup_ref_name(3)   = 'pss'
     coup_ref_name(4)   = 'pps'
     coup_ref_name(5)   = 'ppp'
     coup_ref_name(6)   = 'seses'
     coup_ref_name(7)   = 'sess'
     coup_ref_name(8)   = 'sses'
     coup_ref_name(9)   = 'seps'
     coup_ref_name(10)  = 'pses'
     coup_ref_name(11)  = 'sds'
     coup_ref_name(12)  = 'dss'
     coup_ref_name(13)  = 'pds'
     coup_ref_name(14)  = 'dps'
     coup_ref_name(15)  = 'pdp'
     coup_ref_name(16)  = 'dpp'
     coup_ref_name(17)  = 'seds'
     coup_ref_name(18)  = 'dses'
     coup_ref_name(19)  = 'dds'
     coup_ref_name(20)  = 'ddp'
     coup_ref_name(21)  = 'ddd'

    /

 

  • Generated output files:
    - k_vectors.in
    - tighten.in
    These are the input files for tighten.
    - out_structure.txt
    - band_edges_unstrained_nm.dat     
    Gamma conduction band edge and topmost valence band edge (units: position [nm], energy [eV], band gap [eV])
    - band_edges_unstrained.dat         Gamma conduction band edge and topmost valence band edge (units: atomic layer , energy [eV])
    - out_ek_tighten_new_bandedges.dat  energy dispersion E(k) where the x axis is either in units of [1/Angstrom] or integer numbers indicating the number of k points
                                        (not shifted, energies correspond to tight-binding material parameters in input file)
    - out_ek_tighten_new.dat            energy dispersion E(k) where the x axis is either in units of [1/Angstrom] or integer numbers indicating the number of k points
                                        (shifted so that topmost valence band edge equals 0 eV)
    - out_ek_tighten.dat                energy dispersion E(k) (original output)
                                        (shifted so that topmost valence band edge equals 0 eV)

 

Output files of tighten (bulk)

  • out_ek_tighten_bulk_new_noshift.dat energy dispersion E(k) (original output)
                                        (not shifted, energies correspond to tight-binding material parameters in input file)
    out_ek_tighten_bulk_new.dat         energy dispersion E(k)
                                       
    (shifted so that valence band edge of first k vector equals 0 eV)
    out_ek_tighten_bulk.dat             energy dispersion E(k) (original output)
                                        (shifted so that valence band edge of first k vector equals 0 eV)
    If k-vectors-sample-type = xyz, then the |k| vectors are in units of [1/nm] of the files out_ek_tighten_bulk_new*.dat.

    hamtightenout_bulk.txt             

     
  • driver_file_sl.in

    'hamtightenout.dat' ! ham_output_file = 'hamout.dat'

     

 

Strain

 $simulation-flow-control
  ...
  strain-calculation = homogeneous-strain

Include biaxial strain for superlattice tighten code.

 

  strain-calculation = no-strain

No strain is considered for superlattice tighten code, i.e. strain tensor is zero and each layer has equilibrium lattice constant in growth direction.

In any case, the lattice constant in the lateral growth direction is the one of the substrate material specified in
 $domain-ccordinates
  ...
  pseudomorphic-on = GaAs

for both, homogeneous-strain and no-strain.

(Internally, strain001V and the trace of the strain tensor are set to zero. The vertical lattice constant is the equilibrium lattice constant of the layer material.)