Exciton-phonon coupling and luminescence: Difference between revisions

From The Yambo Project
Jump to navigation Jump to search
 
(19 intermediate revisions by 2 users not shown)
Line 13: Line 13:
== Requirements ==
== Requirements ==


This is an advanced topic: we assume that you already know something about the theory<ref name="Toyozawa" /><ref name="cudazzo" /><ref name="antonius" /><ref name="fulvio2" /><ref name="fulvio_thesis" /><ref name="pierre_thesis" /> and applications<ref name="zanfrognini" /><ref name="pierre" /><ref name="marini_g" /><ref name="chan" /><ref name="murali" /><ref name="chen" /><ref name="fulvio1" /><ref name="elena" /> of exciton-phonon physics.  
This is an advanced topic: we assume that you already know something about the theory<ref name="toyozawa2003" /><ref name="antonius2017" /><ref name="cudazzo2020" /><ref name="paleari2019_PhD" /><ref name="paleari2022" /><ref name="lechifflart2023_PhD" /> and applications<ref name="paleari2019" /><ref name="cannuccia2019" /><ref name="chen2020" /><ref name="zanfrognini2023" /><ref name="lechifflart2023" /><ref name="chan2023" /><ref name="marini2024" /><ref name="murali2025" /> of exciton-phonon physics.  


Also, we assume that you already know how to run both a basic '''Yambo''' GW-BSE calculation and a DFPT phonon calculation with '''Quantum ESPRESSO'''.
Also, we assume that you already know how to run both a basic '''Yambo''' GW-BSE calculation and a DFPT phonon calculation with '''Quantum ESPRESSO'''.
Line 33: Line 33:
First of all, we run a standard scf calculation with <code>pw.x</code> for Yambo. We stick with non-symmorphic symmetries. At the end, we will have the QE <code>save</code> directory.
First of all, we run a standard scf calculation with <code>pw.x</code> for Yambo. We stick with non-symmorphic symmetries. At the end, we will have the QE <code>save</code> directory.


INPUT
This is the input <code>mos2.scf</code>:
 
&control
          wf_collect = .true.,
          calculation = "scf",
            verbosity = 'high',
          pseudo_dir = '$PSEUDO_DIR',
              prefix = "mos2",
              outdir = '.',
  /&end
  &system
              ecutwfc = 100.0,
          occupations = 'fixed',
                ibrav = 4,
            celldm(1) = 5.9000811881,
            celldm(3) = 6.7795677253,
                  nat = 3,
                ntyp = 2,
            lspinorb = .true.
            noncolin = .true.
            assume_isolated = '2D'
        force_symmorphic = .true.
  /&end
  &electrons
    electron_maxstep = 200,
          mixing_beta = 0.7,
            conv_thr = 1.d-08,
  /&end
  ATOMIC_SPECIES
    Mo  95.940      Mo_ONCV_PBE_FR-1.0.upf
    S    32.065    S_ONCV_PBE_FR-1.1.upf
  ATOMIC_POSITIONS { crystal }
Mo      0.333333333  0.666666667  0.000000000
S        0.666666667  0.333333333  0.073413577
S        0.666666667  0.333333333  -0.073413577
  K_POINTS { automatic }
6 6 1 0 0 0
 
Here we are using full relativistic pseudopotentials from the SG-15 database.
 
We can run it on our machine (for example using 4 MPI tasks) as:


  mpirun -np 4 pw.x -inp mos2.scf > scf.out
  mpirun -np 4 pw.x -inp mos2.scf > scf.out
== Step 2: nscf calculation for Yambo ==
Copy the QE <code>save</code> directory from the scf calculation and run the nscf calculation for any number of empty states, with the correct <code>k</code>-grid we want to use in Yambo. Here we are using a badly underconverged grid of 6x6x1.
This reciprocal-space grid will also match the momentum transfer <code>q</code> grid on which excitons and phonons will be defined!
The electronic wavefunctions computed at this step and stored in the new nscf <code>save</code> directory will be used both by Yambo and by the electron-phonon code: this is important because using different sets of wavefunctions would lead to a phase mismatch issue in the exciton-phonon matrix elements.
The nscf input <code>mos2.nscf</code> is
&control
          wf_collect = .true.,
          calculation = "nscf",
            verbosity = 'high',
          pseudo_dir = '$PSEUDO_DIR',
              prefix = "mos2",
              outdir = '.',
  /&end
  &system
              ecutwfc = 100.0,
          occupations = 'fixed',
                ibrav = 4,
            celldm(1) = 5.9000811881,
            celldm(3) = 6.7795677253,
                  nat = 3,
                ntyp = 2,
            lspinorb = .true.
            noncolin = .true.
                nbnd  = 250
            assume_isolated = '2D'
        force_symmorphic = .true.
  /&end
  &electrons
    electron_maxstep = 200,
          mixing_beta = 0.7,
            conv_thr = 1.d-08,
  /&end
  ATOMIC_SPECIES
    Mo  95.940      Mo_ONCV_PBE_FR-1.0.upf
    S    32.065    S_ONCV_PBE_FR-1.1.upf
  ATOMIC_POSITIONS { crystal }
Mo      0.333333333  0.666666667  0.000000000
S        0.666666667  0.333333333  0.073413577
S        0.666666667  0.333333333  -0.073413577
  K_POINTS { automatic }
6 6 1 0 0 0
Again, we run the calculation
mpirun -np 4 pw.x -inp mos2.nscf > nscf.out
== Step 3: dvscf phonon calculation ==
Now we run the phonon calculation.
Copy the <code>save</code> directory from the '''scf''' calculation and run <code>ph.x</code> for a dvscf calculation with a standard <code>q</code>-grid matching the <code>k</code>-grid we wanna use in Yambo.
At the end, we will have the <code>_ph0</code> directory containing the variation of the self-consistent potential, <math>\Delta V_{SCF}(q)</math>, and the <code>*.dyn</code> files with the phonon energies and eigenvectors.
NB: one could further refine the phonon energies by enforcing the acoustic sum rule, including non-analytic long-range contributions, interpolating to finer grids... all of this can be done within Quantum ESPRESSO and will not be covered in this version of the tutorial.
The input is <code>mos2.dvscf</code>:
mos2_dvscf
&inputph
  tr2_ph=1.0d-12,
  verbosity='high'
  prefix='mos2',
  fildvscf = 'mos2-dvscf',
  electron_phonon = 'dvscf',
  fildyn='mos2.dyn',
  epsil=.false.,
  ldisp=.true.,
  recover=.true.,
  nq1=6,
  nq2=6,
  nq3=1
/
And now we run as
nohup mpirun -np 8 ph.x -inp mos2.dvscf > dvscf.out &
This time we use nohup and more processes because this calculation may take some time. It is a good idea to set <code>recover=.true.</code> as in a real calculation you will easily breach walltime, and in this way you can safely restart.
== Step 4: create Yambo <code>SAVE</code> directory ==
This is just the standard Yambo initialization: run
p2y
and then
yambo
in the '''nscf''' <code>save</code> folder and then move the newly generated <code>SAVE</code> directory to a convenient place.
== Step 5: run a BSE calculation ==
Now we switch from QE to Yambo. Here, we forgo the GW step for simplicity (we can use a scissor operator to open the band gap).
This calculation has a couple of differences with respect to a standard BSE calculation for optical absorption. We can look at the input file <code>bse.in</code>:
<span style="color:blue"># Runlevels</span>
optics                      # [R OPT] Optics
rim_cut                      # [R RIM CUT] Coulomb potential
bss                          # [R BSS] Bethe Salpeter Equation solver
em1s                        # [R Xs] Static Inverse Dielectric Matrix
bse                          # [R BSE] Bethe Salpeter Equation.
bsk                          # [R BSK] Bethe Salpeter Equation kernel
<span style="color:blue"># RIM and cutoff settings</span>
RandQpts=1000000            # [RIM] Number of random q-points in the BZ
RandGvec= 100            RL    # [RIM] Coulomb interaction RS components
CUTGeo= "slab z"              # [CUT] Coulomb Cutoff geometry: box/cylinder/sphere X/Y/Z/XY..
<span style="color:blue"># Static screening</span>
X_and_IO_CPU= "1 1 4 2 1"      # [PARALLEL] CPUs for each role
X_and_IO_ROLEs= "q g k c v"      # [PARALLEL] CPUs roles (q,g,k,c,v)
X_and_IO_nCPU_LinAlg_INV=-1      # [PARALLEL] CPUs for Linear Algebra (if -1 it is automatically set)
Chimod= "hartree"            # [X] IP/Hartree/ALDA/LRC/BSfxc
% QpntsRXs
    1 | 7 |                # [Xs] Transferred momenta
%
% BndsRnXs
    1 |  200 |                # [Xs] Polarization function bands
%
% LongDrXs
  1.000000 | 1.000000 | 1.000000 |        # [Xs] [cc] Electric Field
%
NGsBlkXs= 8            Ry    # [Xs] Response block size
<span style="color:blue"># BSE</span>
BS_CPU= "4.1.2"                  # [PARALLEL] CPUs for each role
BS_ROLEs= "k.eh.t"                # [PARALLEL] CPUs roles (k,eh,t)
BS_nCPU_diago=4              # [PARALLEL] CPUs for matrix diagonalization
BSEmod= "causal"            # [BSE] resonant/causal/coupling
BSKmod= "SEX"                # [BSE] IP/Hartree/HF/ALDA/SEX/BSfxc
BSSmod= "d"                  # [BSS] (h)aydock/(d)iagonalization/(i)nversion/(t)ddft`
BSENGexx=  40          Ry    # [BSK] Exchange components
ALLGexx                      # [BSS] Force the use use all RL vectors for the exchange part
BSENGBlk=  8          Ry    # [BSK] Screened interaction block size
<span style="color:red">Lkind="full"                  #[BSE,X] bar(default)/full/tilde</span>
% KfnQP_E
  1.000000 | 1.000000 | 1.000000 |        # [EXTQP BSK BSS] E parameters  (c/v) eV|adim|adim
%
% BEnRange
  0.00000 |  4.00000 | eV    # [BSS] Energy range
%
% BDmRange
  0.05000 |  0.05000 | eV    # [BSS] Damping range
%
BEnSteps= 2000              # [BSS] Energy steps
% BLongDir
  1.000000 | 0.000000 | 0.000000 |        # [BSS] [cc] Electric Field
%
<span style="color:red">% BSEQptR</span>
<span style="color:red"> 1 | 7 |                    # [BSK] Transferred momenta range</span>
<span style="color:red">%</span>
% BSEBands
    25 |  28 |                # [BSK] Bands range
%
WRbsWF                      # [BSS] Write to disk excitonic the FWs
First of all, we compute the excitons for all the momenta in the irreducible Brillouin zone for our discrete grid via the <code>BSEQptR</code> variable. This will be a '''finite-momentum''' BSE calculation, analogous to the phonon one.
Second, we change the variable <code>Lkind</code> from <code>bar</code> to <code>full</code>. In Yambo, <code>Lkind="bar"</code>, which is the default for optical absorption, means that we are computing the excitonic response function without the long-range component of the exchange interaction. This cannot be used when computing the exciton momentum dependence, where the long-range exchange interaction can play a role, therefore we have to include it with <code>Lkind="full"</code>. This allows for the calculation of the excitonic longitudinal-transverse splitting (in 3D systems) as well.
We can now run the code:
nohup mpirun -np 8 yambo -F bse.in -J bse_Lfull -C bse_Lfull &
At the end of the calculation, we have obtained the <code>ndb.BS_diago_Q*</code> databases inside the directory <code>bse_Lfull</code>. They contain information on the exciton energies and wavefunctions at each momentum. Do not forget to check the report and logs of your calculation in the same directory to make sure that the code is doing what you want.
== Step 6: obtain the electron-phonon matrix elements ==
We have finished the heavy simulations. Now it's time for the postprocessing. The first order of business is the reconstruction of the electron-phonon coupling matrix elements from the dvscf results and the electronic wavefunctions.
In order to do this, we will run the <code>lelphc</code> executable of the '''LetzElPhC''' code. We will run via command line using yambopy, although it will be instructive to have look at the <code>lelphc</code> input files later.
We run in the same directory where the Yambo <code>SAVE</code> is (remember than you can also virtually move it with a symbolic link).
Type:
yambopy l2y
to see the help for the calculation. For example, if we want to do a serial run of LetzElPhC for bands from <math>n_i</math> to <math>n_f</math>, we should type:
yambopy l2y -ph path/of/ph_input.in -b n_i n_f
Here <math>n_i</math> and <math>n_f</math> are integers representing the initial and final band indices.
These should coincide with those used for the Bethe-Salpeter kernel, i.e. those specified in the <code>BSEBands</code> variable of the BSE input file (this is not strictly necessary, but certainly efficient since these calculations use a lot of disk space).
For our system, we want to do a parallel calculation with 4 qpools and 2 kpools. In addition, we want to explicitly specify the path of the <code>lelphc</code> executable and avoid automatically deleting the LetzElPhC data. So we type:
yambopy l2y -ph path/of/dvscf/mos2.dvscf -b 25 28 -par 4 2 -lelphc path/to/lelphc_exe --debug
At the end, check the <code>SAVE</code>
ls SAVE/ndb.elph_gkkp*
to see that it has created the Yambo-compatible electron-phonon databases.
If you saved the <code>lelphc.in</code> input file, you can inspect it:
# LetzElPhC input for yambo generated by yambopy
nqpool      = 2
nkpool      = 4
start_bnd  = 25
end_bnd    = 28
save_dir    = ./SAVE
kernel      = dfpt
ph_save_dir = dvscf/ph_save
convention = yambo
You can also run it as it is, but the code will generate the database <code>ndb.elph</code>. In order to convert it to the <code>ndb.elph_gkkp*</code> databases of Yambo, you still need a couple of lines of python using the Yambopy class <code>ConvertElectronPhononDB</code> in <code>yambopy/letzelph_interface/lelph2y.py</code>.
Notice the variable <code>convention=yambo</code>: what does it mean? At variance with QE and many other codes, Yambo uses the "backward" momentum transfer convention for electronic scatterings. That is, an electronic transition goes from band <math>n</math> and momentum <math>k-q</math> to band <math>m</math> and momentum <math>k</math>. In the "forward" momentum transfer convention (the more standard one), the transitions go from <math>nk</math> to <math>mk+q</math>. Therefore, this variable ensures that the electron-phonon coupling matrix elements are computed as <math>\langle mk|dV|nk-q\rangle</math>. This will have consequences also in the formulation of the ''exciton''-phonon coupling matrix element.


== References ==
== References ==


<references>
<references>
<ref name="Toyozawa" >Optical processes in solids, Toyozawa, Yutaka, and Chris Oxlade. Cambridge University Press, (2003). </ref>
<ref name="toyozawa2003" >Optical processes in solids, Toyozawa, Yutaka, and Chris Oxlade. Cambridge University Press, (2003). </ref>
<ref name='pierre'>P. Lechifflart, F. Paleari, D. Sangalli, C. Attaccalite, ''First-principles study of luminescence in hexagonal boron nitride single layer: Exciton-phonon coupling and the role of substrate'',  
<ref name='lechifflart2023'>P. Lechifflart, F. Paleari, D. Sangalli, C. Attaccalite, ''First-principles study of luminescence in hexagonal boron nitride single layer: Exciton-phonon coupling and the role of substrate'',  
[https://doi.org/10.1103/PhysRevMaterials.7.024006 Phys. Rev. M, '''7''' (2), 024006 (2023)]; [https://arxiv.org/abs/2212.10407 arXiv2212.1047]</ref>
[https://doi.org/10.1103/PhysRevMaterials.7.024006 Phys. Rev. M, '''7''' (2), 024006 (2023)]; [https://arxiv.org/abs/2212.10407 arXiv2212.1047]</ref>
<ref name='elena'>E. Cannuccia, B. Monserrat and C. Attaccalite, ''Theory of phonon-assisted luminescence in solids: Application to hexagonal boron nitride'', [https://doi.org/10.1103/PhysRevB.99.081109 Phys. Rev. B '''99''', 081109(R) (2019)]; [https://arxiv.org/abs/1807.11797 arXiv1807.11797]</ref>
<ref name='cannuccia2019'>E. Cannuccia, B. Monserrat and C. Attaccalite, ''Theory of phonon-assisted luminescence in solids: Application to hexagonal boron nitride'', [https://doi.org/10.1103/PhysRevB.99.081109 Phys. Rev. B '''99''', 081109(R) (2019)]; [https://arxiv.org/abs/1807.11797 arXiv1807.11797]</ref>
<ref name='fulvio1'>F. Paleari et al., ''Exciton-Phonon Coupling in the Ultraviolet Absorption and Emission Spectra of Bulk Hexagonal Boron Nitride'', [https://doi.org/10.1103/PhysRevLett.122.187401 Phys. Rev. Lett. '''122''', 187401 (2019)]; [https://arxiv.org/abs/1810.08976 arXiv1810.089776] </ref>
<ref name='paleari2019'>F. Paleari et al., ''Exciton-Phonon Coupling in the Ultraviolet Absorption and Emission Spectra of Bulk Hexagonal Boron Nitride'', [https://doi.org/10.1103/PhysRevLett.122.187401 Phys. Rev. Lett. '''122''', 187401 (2019)]; [https://arxiv.org/abs/1810.08976 arXiv1810.089776] </ref>
<ref name='chen'>[https://arxiv.org/abs/2002.08913 Exciton-Phonon Interaction and Relaxation Times from First Principles],
<ref name='chen2020'>[https://arxiv.org/abs/2002.08913 Exciton-Phonon Interaction and Relaxation Times from First Principles],
Hsiao-Yi Chen, Davide Sangalli, and Marco Bernardi, Phys. Rev. Lett. '''125''', 107401(2020)</ref>
Hsiao-Yi Chen, Davide Sangalli, and Marco Bernardi, Phys. Rev. Lett. '''125''', 107401(2020)</ref>
<ref name="pierre_thesis">[https://www.yambo-code.eu/wiki/images/5/54/These_final.pdf Exciton-phonon coupling and phonon-assisted luminescence in hexagonal Boron Nitride nanostructures], PhD Thesis, Pierre Lechifflart (2023)</ref>
<ref name="lechifflart2023_PhD">[https://www.yambo-code.eu/wiki/images/5/54/These_final.pdf Exciton-phonon coupling and phonon-assisted luminescence in hexagonal Boron Nitride nanostructures], PhD Thesis, Pierre Lechifflart (2023)</ref>
<ref name='fulvio_thesis'>F. Paleari, ''First-principles approaches to the description of indirect absorption and luminescence spectroscopy: exciton-phonon coupling in hexagonal boron nitride'', [https://wwwen.uni.lu/research/fstm/dphyms/people/fulvio_paleari PhD thesis, University of Luxembourg (2019)]</ref>
<ref name='paleari2019_PhD'>F. Paleari, ''First-principles approaches to the description of indirect absorption and luminescence spectroscopy: exciton-phonon coupling in hexagonal boron nitride'', [https://wwwen.uni.lu/research/fstm/dphyms/people/fulvio_paleari PhD thesis, University of Luxembourg (2019)]</ref>
<ref name='zanfrognini'>[https://arxiv.org/abs/2305.17554 Distinguishing different stackings in layered materials via luminescence spectroscopy], M. Zanfrognini et al. Phys. Rev. Lett. '''131''', 206902 (2023) </ref>
<ref name='zanfrognini2023'>[https://arxiv.org/abs/2305.17554 Distinguishing different stackings in layered materials via luminescence spectroscopy], M. Zanfrognini et al. Phys. Rev. Lett. '''131''', 206902 (2023) </ref>
<ref name='marini_g'>[https://arxiv.org/abs/2402.03826 Optical absorption and photoluminescence of single layer boron nitride from a first principles cumulant approach], G. Marini, M. Calandra, P. Cudazzo, Nano Lett., '''24''', 20, 6017 (2024)</ref>
<ref name='marini2024'>[https://arxiv.org/abs/2402.03826 Optical absorption and photoluminescence of single layer boron nitride from a first principles cumulant approach], G. Marini, M. Calandra, P. Cudazzo, Nano Lett., '''24''', 20, 6017 (2024)</ref>
<ref name='antonius'>G. Antonius, S. G. Louie, ''Theory of exciton-phonon coupling'', [https://doi.org/10.1103/PhysRevB.105.085111 Phys. Rev. B, '''105''', 085111 (2022)]; [https://arxiv.org/abs/1705.04245 arXiv1705.04245 (2017)]</ref>
<ref name='antonius2017'>G. Antonius, S. G. Louie, ''Theory of exciton-phonon coupling'', [https://doi.org/10.1103/PhysRevB.105.085111 Phys. Rev. B, '''105''', 085111 (2022)]; [https://arxiv.org/abs/1705.04245 arXiv1705.04245 (2017)]</ref>
<ref name='fulvio2'>[https://arxiv.org/abs/2205.02783 Exciton-phonon interaction calls for a revision of the “exciton” concept], F. Paleari, A. Marini, Phys. Rev. B, '''106''', 125403 (2022)</ref>
<ref name='paleari2022'>[https://arxiv.org/abs/2205.02783 Exciton-phonon interaction calls for a revision of the “exciton” concept], F. Paleari, A. Marini, Phys. Rev. B, '''106''', 125403 (2022)</ref>
<ref name='cudazzo'> P. Cudazzo, ''First-principles description of the exciton-phonon interaction: A cumulant approach'', [https://doi.org/10.1103/PhysRevB.102.045136 Phys. Rev. B, '''102''', 045136 (2020)]; [https://orbilu.uni.lu/bitstream/10993/44769/1/main.pdf Open access pdf from Luxembourg University]</ref>
<ref name='cudazzo2020'> P. Cudazzo, ''First-principles description of the exciton-phonon interaction: A cumulant approach'', [https://doi.org/10.1103/PhysRevB.102.045136 Phys. Rev. B, '''102''', 045136 (2020)]; [https://orbilu.uni.lu/bitstream/10993/44769/1/main.pdf Open access pdf from Luxembourg University]</ref>
<ref name='chan'>[https://arxiv.org/abs/2212.08451 Exciton Lifetime and Optical Line Width Profile via Exciton–Phonon Interactions: Theory and First-Principles Calculations for Monolayer MoS2], Y-h Chan, J. B. Haber, M. H. Naik, J. B. Neaton, D. Y. Qiu, F. H. da Jornada, S. G. Louie, Nano Lett., '''23''', 9 (2023)</ref>
<ref name='chan2023'>[https://arxiv.org/abs/2212.08451 Exciton Lifetime and Optical Line Width Profile via Exciton–Phonon Interactions: Theory and First-Principles Calculations for Monolayer MoS2], Y-h Chan, J. B. Haber, M. H. Naik, J. B. Neaton, D. Y. Qiu, F. H. da Jornada, S. G. Louie, Nano Lett., '''23''', 9 (2023)</ref>
<ref name='murali'>[https://arxiv.org/abs/2407.16111 Origin of Interlayer Exciton–Phonon Coupling in 2D Heterostructures], M. Nalabothula, S. Reichardt, L. Wirtz, Nano Lett., '''25''', 15 (2025)</ref>
<ref name='murali2025'>[https://arxiv.org/abs/2407.16111 Origin of Interlayer Exciton–Phonon Coupling in 2D Heterostructures], M. Nalabothula, S. Reichardt, L. Wirtz, Nano Lett., '''25''', 15 (2025)</ref>
</references>
</references>

Latest revision as of 18:48, 18 September 2025

Tdgw-phonon-usc-01-1024x829.jpg

In this advanced tutorial, we will calculate exciton-phonon interactions from first principles by interfacing DFPT (for phonon calculations) and BSE (for exciton calculations).

The DFTP calculations are run with Quantum ESPRESSO, while the many-body GW-BSE calculations are run with Yambo. Finally, the exciton-phonon interaction will be obtained by combining and postprocessing the databases computed in the two previous runs. The great advantage of this workflow is that the calculations can be run in the irreducible Brillouin zones both for the electronic momenta ([math]\displaystyle{ k }[/math]) and the transfer momenta ([math]\displaystyle{ Q }[/math], [math]\displaystyle{ q }[/math]) of excitons and phonons, thus speeding up considerably the jobs while reducing the IO and memory load.

We will first compute the exciton-phonon coupling matrix elements: these are the building blocks needed to construct experimental observables such as phonon-assisted optical spectra (such as luminescence), Raman spectra and exciton lifetimes. We will do this in the case of monolayer MoS2, a 2D system with large spin-orbit interaction.

As an example of application, we will consider the case of phonon-assisted luminescence. We will do this in the case of bulk hBN, a layered indirect insulator with strong electron-phonon coupling.

Note: this tutorial will be updated when new exc-ph tools become available in Yambopy (including full-python postprocessing, Raman spectra, interpolated lifetimes, etc).

Requirements

This is an advanced topic: we assume that you already know something about the theory[1][2][3][4][5][6] and applications[7][8][9][10][11][12][13][14] of exciton-phonon physics.

Also, we assume that you already know how to run both a basic Yambo GW-BSE calculation and a DFPT phonon calculation with Quantum ESPRESSO.

Besides the QE executables pw.x and ph.x, we also use the yambo phonon-specific executable yambo_ph and the python utility Yambopy. The auxiliary code LetzElPhC (executable lelphc) will be used to obtain the electron-phonon matrix elements by reading the same electronic wavefunctions used by Yambo (and stored in the SAVE directory), while also making full use of crystal symmetries. LetzElPhC (link) will be run by Yambopy, but it must nonetheless be installed. Finally, the exciton-phonon properties can be computed either using yambo_ph or using Yambopy itself.

Workflow scheme.png

Step 0: Pseudopotentials, equilibrium structure and convergence

In a real calculation, it is important to ensure that both the pseudopotential and the lattice parameters that we are using are compatible and perform well for the electronic excited states and for the lattice vibrations simultaneously. Furthermore, you have to make sure that the wave function cutoff ecutwfc is converged with respect to the DFPT step and not just to the DFT one. This is in addition to the other customary convergence tests for DFT, DFPT, GW and BSE calculations.

This is often the most time-demanding step when starting on a new system.

For the sake of this tutorial, we assume that we have already done all these tests and we are starting the final workflow to get the exciton-phonon properties.

Step 1: scf calculation

First of all, we run a standard scf calculation with pw.x for Yambo. We stick with non-symmorphic symmetries. At the end, we will have the QE save directory.

This is the input mos2.scf:

&control
          wf_collect = .true.,
         calculation = "scf",
           verbosity = 'high',
          pseudo_dir = '$PSEUDO_DIR',
              prefix = "mos2",
              outdir = '.',
 /&end
 &system
             ecutwfc = 100.0,
         occupations = 'fixed',
               ibrav = 4,
           celldm(1) = 5.9000811881,
           celldm(3) = 6.7795677253,
                 nat = 3,
                ntyp = 2,
            lspinorb = .true.
            noncolin = .true.
            assume_isolated = '2D'
        force_symmorphic = .true.
 /&end
 &electrons
    electron_maxstep = 200,
         mixing_beta = 0.7,
            conv_thr = 1.d-08,
 /&end
  ATOMIC_SPECIES
   Mo  95.940      Mo_ONCV_PBE_FR-1.0.upf
   S    32.065     S_ONCV_PBE_FR-1.1.upf
  ATOMIC_POSITIONS { crystal }
Mo       0.333333333   0.666666667   0.000000000
S        0.666666667   0.333333333   0.073413577
S        0.666666667   0.333333333  -0.073413577
 K_POINTS { automatic }
6 6 1 0 0 0

Here we are using full relativistic pseudopotentials from the SG-15 database.

We can run it on our machine (for example using 4 MPI tasks) as:

mpirun -np 4 pw.x -inp mos2.scf > scf.out

Step 2: nscf calculation for Yambo

Copy the QE save directory from the scf calculation and run the nscf calculation for any number of empty states, with the correct k-grid we want to use in Yambo. Here we are using a badly underconverged grid of 6x6x1.

This reciprocal-space grid will also match the momentum transfer q grid on which excitons and phonons will be defined!

The electronic wavefunctions computed at this step and stored in the new nscf save directory will be used both by Yambo and by the electron-phonon code: this is important because using different sets of wavefunctions would lead to a phase mismatch issue in the exciton-phonon matrix elements.

The nscf input mos2.nscf is

&control
          wf_collect = .true.,
         calculation = "nscf",
           verbosity = 'high',
          pseudo_dir = '$PSEUDO_DIR',
              prefix = "mos2",
              outdir = '.',
 /&end
 &system
             ecutwfc = 100.0,
         occupations = 'fixed',
               ibrav = 4,
           celldm(1) = 5.9000811881,
           celldm(3) = 6.7795677253,
                 nat = 3,
                ntyp = 2,
            lspinorb = .true.
            noncolin = .true.
               nbnd  = 250
            assume_isolated = '2D'
        force_symmorphic = .true.
 /&end
 &electrons
    electron_maxstep = 200,
         mixing_beta = 0.7,
            conv_thr = 1.d-08,
 /&end
  ATOMIC_SPECIES
   Mo  95.940      Mo_ONCV_PBE_FR-1.0.upf
   S    32.065     S_ONCV_PBE_FR-1.1.upf
  ATOMIC_POSITIONS { crystal }
Mo       0.333333333   0.666666667   0.000000000
S        0.666666667   0.333333333   0.073413577
S        0.666666667   0.333333333  -0.073413577
 K_POINTS { automatic }
6 6 1 0 0 0


Again, we run the calculation

mpirun -np 4 pw.x -inp mos2.nscf > nscf.out

Step 3: dvscf phonon calculation

Now we run the phonon calculation.

Copy the save directory from the scf calculation and run ph.x for a dvscf calculation with a standard q-grid matching the k-grid we wanna use in Yambo.

At the end, we will have the _ph0 directory containing the variation of the self-consistent potential, [math]\displaystyle{ \Delta V_{SCF}(q) }[/math], and the *.dyn files with the phonon energies and eigenvectors.

NB: one could further refine the phonon energies by enforcing the acoustic sum rule, including non-analytic long-range contributions, interpolating to finer grids... all of this can be done within Quantum ESPRESSO and will not be covered in this version of the tutorial.

The input is mos2.dvscf:

mos2_dvscf
&inputph
  tr2_ph=1.0d-12,
  verbosity='high'
  prefix='mos2',
  fildvscf = 'mos2-dvscf',
  electron_phonon = 'dvscf',
  fildyn='mos2.dyn',
  epsil=.false.,
  ldisp=.true.,
  recover=.true.,
  nq1=6,
  nq2=6,
  nq3=1
/

And now we run as

nohup mpirun -np 8 ph.x -inp mos2.dvscf > dvscf.out &

This time we use nohup and more processes because this calculation may take some time. It is a good idea to set recover=.true. as in a real calculation you will easily breach walltime, and in this way you can safely restart.

Step 4: create Yambo SAVE directory

This is just the standard Yambo initialization: run

p2y 

and then

yambo 

in the nscf save folder and then move the newly generated SAVE directory to a convenient place.

Step 5: run a BSE calculation

Now we switch from QE to Yambo. Here, we forgo the GW step for simplicity (we can use a scissor operator to open the band gap).

This calculation has a couple of differences with respect to a standard BSE calculation for optical absorption. We can look at the input file bse.in:

# Runlevels
optics                       # [R OPT] Optics
rim_cut                      # [R RIM CUT] Coulomb potential
bss                          # [R BSS] Bethe Salpeter Equation solver
em1s                         # [R Xs] Static Inverse Dielectric Matrix
bse                          # [R BSE] Bethe Salpeter Equation.
bsk                          # [R BSK] Bethe Salpeter Equation kernel
# RIM and cutoff settings
RandQpts=1000000             # [RIM] Number of random q-points in the BZ
RandGvec= 100            RL    # [RIM] Coulomb interaction RS components
CUTGeo= "slab z"               # [CUT] Coulomb Cutoff geometry: box/cylinder/sphere X/Y/Z/XY..
# Static screening
X_and_IO_CPU= "1 1 4 2 1"       # [PARALLEL] CPUs for each role
X_and_IO_ROLEs= "q g k c v"      # [PARALLEL] CPUs roles (q,g,k,c,v)
X_and_IO_nCPU_LinAlg_INV=-1      # [PARALLEL] CPUs for Linear Algebra (if -1 it is automatically set)
Chimod= "hartree"            # [X] IP/Hartree/ALDA/LRC/BSfxc
% QpntsRXs
   1 | 7 |                 # [Xs] Transferred momenta
%
% BndsRnXs
   1 |  200 |                 # [Xs] Polarization function bands
%
% LongDrXs
 1.000000 | 1.000000 | 1.000000 |        # [Xs] [cc] Electric Field
%
NGsBlkXs= 8            Ry    # [Xs] Response block size
# BSE
BS_CPU= "4.1.2"                   # [PARALLEL] CPUs for each role
BS_ROLEs= "k.eh.t"                 # [PARALLEL] CPUs roles (k,eh,t)
BS_nCPU_diago=4              # [PARALLEL] CPUs for matrix diagonalization
BSEmod= "causal"             # [BSE] resonant/causal/coupling
BSKmod= "SEX"                # [BSE] IP/Hartree/HF/ALDA/SEX/BSfxc
BSSmod= "d"                  # [BSS] (h)aydock/(d)iagonalization/(i)nversion/(t)ddft`
BSENGexx=  40          Ry    # [BSK] Exchange components
ALLGexx                      # [BSS] Force the use use all RL vectors for the exchange part
BSENGBlk=  8           Ry    # [BSK] Screened interaction block size
Lkind="full"                  #[BSE,X] bar(default)/full/tilde
% KfnQP_E
 1.000000 | 1.000000 | 1.000000 |        # [EXTQP BSK BSS] E parameters  (c/v) eV|adim|adim
%
% BEnRange
  0.00000 |  4.00000 | eV    # [BSS] Energy range
%
% BDmRange
  0.05000 |  0.05000 | eV    # [BSS] Damping range
%
BEnSteps= 2000               # [BSS] Energy steps
% BLongDir
 1.000000 | 0.000000 | 0.000000 |        # [BSS] [cc] Electric Field
%
% BSEQptR
 1 | 7 |                     # [BSK] Transferred momenta range
%
% BSEBands
   25 |  28 |                 # [BSK] Bands range
%
WRbsWF                      # [BSS] Write to disk excitonic the FWs

First of all, we compute the excitons for all the momenta in the irreducible Brillouin zone for our discrete grid via the BSEQptR variable. This will be a finite-momentum BSE calculation, analogous to the phonon one.

Second, we change the variable Lkind from bar to full. In Yambo, Lkind="bar", which is the default for optical absorption, means that we are computing the excitonic response function without the long-range component of the exchange interaction. This cannot be used when computing the exciton momentum dependence, where the long-range exchange interaction can play a role, therefore we have to include it with Lkind="full". This allows for the calculation of the excitonic longitudinal-transverse splitting (in 3D systems) as well.

We can now run the code:

nohup mpirun -np 8 yambo -F bse.in -J bse_Lfull -C bse_Lfull &

At the end of the calculation, we have obtained the ndb.BS_diago_Q* databases inside the directory bse_Lfull. They contain information on the exciton energies and wavefunctions at each momentum. Do not forget to check the report and logs of your calculation in the same directory to make sure that the code is doing what you want.

Step 6: obtain the electron-phonon matrix elements

We have finished the heavy simulations. Now it's time for the postprocessing. The first order of business is the reconstruction of the electron-phonon coupling matrix elements from the dvscf results and the electronic wavefunctions.

In order to do this, we will run the lelphc executable of the LetzElPhC code. We will run via command line using yambopy, although it will be instructive to have look at the lelphc input files later.

We run in the same directory where the Yambo SAVE is (remember than you can also virtually move it with a symbolic link).

Type:

yambopy l2y

to see the help for the calculation. For example, if we want to do a serial run of LetzElPhC for bands from [math]\displaystyle{ n_i }[/math] to [math]\displaystyle{ n_f }[/math], we should type:

yambopy l2y -ph path/of/ph_input.in -b n_i n_f

Here [math]\displaystyle{ n_i }[/math] and [math]\displaystyle{ n_f }[/math] are integers representing the initial and final band indices.

These should coincide with those used for the Bethe-Salpeter kernel, i.e. those specified in the BSEBands variable of the BSE input file (this is not strictly necessary, but certainly efficient since these calculations use a lot of disk space).

For our system, we want to do a parallel calculation with 4 qpools and 2 kpools. In addition, we want to explicitly specify the path of the lelphc executable and avoid automatically deleting the LetzElPhC data. So we type:

yambopy l2y -ph path/of/dvscf/mos2.dvscf -b 25 28 -par 4 2 -lelphc path/to/lelphc_exe --debug

At the end, check the SAVE

ls SAVE/ndb.elph_gkkp*

to see that it has created the Yambo-compatible electron-phonon databases.

If you saved the lelphc.in input file, you can inspect it:

# LetzElPhC input for yambo generated by yambopy
nqpool      = 2
nkpool      = 4
start_bnd   = 25
end_bnd     = 28
save_dir    = ./SAVE
kernel      = dfpt
ph_save_dir = dvscf/ph_save
convention = yambo

You can also run it as it is, but the code will generate the database ndb.elph. In order to convert it to the ndb.elph_gkkp* databases of Yambo, you still need a couple of lines of python using the Yambopy class ConvertElectronPhononDB in yambopy/letzelph_interface/lelph2y.py.

Notice the variable convention=yambo: what does it mean? At variance with QE and many other codes, Yambo uses the "backward" momentum transfer convention for electronic scatterings. That is, an electronic transition goes from band [math]\displaystyle{ n }[/math] and momentum [math]\displaystyle{ k-q }[/math] to band [math]\displaystyle{ m }[/math] and momentum [math]\displaystyle{ k }[/math]. In the "forward" momentum transfer convention (the more standard one), the transitions go from [math]\displaystyle{ nk }[/math] to [math]\displaystyle{ mk+q }[/math]. Therefore, this variable ensures that the electron-phonon coupling matrix elements are computed as [math]\displaystyle{ \langle mk|dV|nk-q\rangle }[/math]. This will have consequences also in the formulation of the exciton-phonon coupling matrix element.

References

  1. Optical processes in solids, Toyozawa, Yutaka, and Chris Oxlade. Cambridge University Press, (2003).
  2. G. Antonius, S. G. Louie, Theory of exciton-phonon coupling, Phys. Rev. B, 105, 085111 (2022); arXiv1705.04245 (2017)
  3. P. Cudazzo, First-principles description of the exciton-phonon interaction: A cumulant approach, Phys. Rev. B, 102, 045136 (2020); Open access pdf from Luxembourg University
  4. F. Paleari, First-principles approaches to the description of indirect absorption and luminescence spectroscopy: exciton-phonon coupling in hexagonal boron nitride, PhD thesis, University of Luxembourg (2019)
  5. Exciton-phonon interaction calls for a revision of the “exciton” concept, F. Paleari, A. Marini, Phys. Rev. B, 106, 125403 (2022)
  6. Exciton-phonon coupling and phonon-assisted luminescence in hexagonal Boron Nitride nanostructures, PhD Thesis, Pierre Lechifflart (2023)
  7. F. Paleari et al., Exciton-Phonon Coupling in the Ultraviolet Absorption and Emission Spectra of Bulk Hexagonal Boron Nitride, Phys. Rev. Lett. 122, 187401 (2019); arXiv1810.089776
  8. E. Cannuccia, B. Monserrat and C. Attaccalite, Theory of phonon-assisted luminescence in solids: Application to hexagonal boron nitride, Phys. Rev. B 99, 081109(R) (2019); arXiv1807.11797
  9. Exciton-Phonon Interaction and Relaxation Times from First Principles, Hsiao-Yi Chen, Davide Sangalli, and Marco Bernardi, Phys. Rev. Lett. 125, 107401(2020)
  10. Distinguishing different stackings in layered materials via luminescence spectroscopy, M. Zanfrognini et al. Phys. Rev. Lett. 131, 206902 (2023)
  11. P. Lechifflart, F. Paleari, D. Sangalli, C. Attaccalite, First-principles study of luminescence in hexagonal boron nitride single layer: Exciton-phonon coupling and the role of substrate, Phys. Rev. M, 7 (2), 024006 (2023); arXiv2212.1047
  12. Exciton Lifetime and Optical Line Width Profile via Exciton–Phonon Interactions: Theory and First-Principles Calculations for Monolayer MoS2, Y-h Chan, J. B. Haber, M. H. Naik, J. B. Neaton, D. Y. Qiu, F. H. da Jornada, S. G. Louie, Nano Lett., 23, 9 (2023)
  13. Optical absorption and photoluminescence of single layer boron nitride from a first principles cumulant approach, G. Marini, M. Calandra, P. Cudazzo, Nano Lett., 24, 20, 6017 (2024)
  14. Origin of Interlayer Exciton–Phonon Coupling in 2D Heterostructures, M. Nalabothula, S. Reichardt, L. Wirtz, Nano Lett., 25, 15 (2025)