From 40a0e68e24b155a54a80f11a6e16cb4a36078463 Mon Sep 17 00:00:00 2001 From: Felix Mildner Date: Tue, 24 Jun 2025 19:09:40 +0100 Subject: [PATCH 01/21] Applied photoemission patch file --- optados/Makefile | 1 + optados/documents/bib.bib | 32 +- optados/documents/user_guide.tex | 853 ++- optados/examples/Photoemission/Cu/Cu.cell | 30 + optados/examples/Photoemission/Cu/Cu.odi | 23 + optados/examples/Photoemission/Cu/Cu.param | 25 + optados/ford/project.md | 4 +- optados/make.system | 24 +- optados/src/Makefile | 14 +- optados/src/algorithms.f90 | 53 + optados/src/build.f90 | 17 + optados/src/cell.f90 | 125 +- optados/src/comms.F90 | 2 + optados/src/constants.f90 | 47 + optados/src/core.f90 | 10 +- optados/src/dos_utils.f90 | 4 +- optados/src/electronic.f90 | 539 +- optados/src/jdos_utils.f90 | 64 +- optados/src/od2od.f90 | 543 +- optados/src/optados.f90 | 23 +- optados/src/optics.f90 | 382 +- optados/src/parameters.f90 | 313 +- optados/src/pdos.F90 | 10 +- optados/src/photo.f90 | 6466 +++++++++++++++++ optados/src/projection_utils.f90 | 4 +- .../Cu100_5L_photo/Cu100_5L-out.cell | 117 + .../Cu100_5L_photo/Cu100_5L.bands.bz2 | Bin 0 -> 1133 bytes .../checkpoints/Cu100_5L_photo/Cu100_5L.cell | 28 + .../Cu100_5L_photo/Cu100_5L.dome_fmt.bz2 | Bin 0 -> 3800 bytes .../Cu100_5L_photo/Cu100_5L.fem_fmt.bz2 | Bin 0 -> 28569 bytes .../Cu100_5L_photo/Cu100_5L.gkgrid_fmt.bz2 | Bin 0 -> 59093 bytes .../Cu100_5L_photo/Cu100_5L.ome_fmt.bz2 | Bin 0 -> 371657 bytes .../checkpoints/Cu100_5L_photo/Cu100_5L.param | 31 + .../Cu100_5L_photo/Cu100_5L.pdos_fmt.bz2 | Bin 0 -> 44702 bytes .../Cu100_5L_photo/Cu100_5L.tmprob_fmt.bz2 | Bin 0 -> 1273 bytes optados/test-suite/tests/jobconfig | 55 +- .../tests/testopt_core_absorb/.gitignore | 1 + .../tests/testopt_core_all/.gitignore | 1 + .../testopt_core_chemical_shift/.gitignore | 6 + .../tests/testopt_core_emisson/.gitignore | 1 + .../tests/testopt_core_polarised/.gitignore | 1 + .../tests/testopt_dos_adaptive/.gitignore | 1 + .../tests/testopt_dos_adaptive_dat/.gitignore | 1 + .../testopt_dos_adaptive_no_spin/.gitignore | 1 + .../tests/testopt_dos_linear/.gitignore | 1 + .../tests/testopt_dos_linear_dome/.gitignore | 1 + .../testopt_jdos_adaptive_dome/.gitignore | 1 + .../testopt_jdos_adaptive_dome/Si2-out.cell | 1 + .../tests/testopt_jdos_fixed_odo/Si2-out.cell | 1 + .../testopt_jdos_linear_no_spin/.gitignore | 1 + .../testopt_jdos_linear_no_spin/Si2-out.cell | 1 + .../testopt_miz_chemical_shift/.gitignore | 3 + .../testopt_optics_conductivity/.gitignore | 1 + .../tests/testopt_optics_drude/.gitignore | 1 + .../tests/testopt_optics_intraband/.gitignore | 1 + .../tests/testopt_optics_polar/.gitignore | 1 + .../tests/testopt_optics_poly/.gitignore | 1 + .../tests/testopt_optics_tensor/.gitignore | 1 + .../tests/testopt_optics_unpolar/.gitignore | 1 + .../tests/testopt_pdos_angular/.gitignore | 1 + .../tests/testopt_pdos_string1/.gitignore | 1 + .../tests/testopt_pdos_string2/.gitignore | 1 + .../tests/testopt_pdos_string3/.gitignore | 1 + .../tests/testopt_pdos_string4/.gitignore | 1 + .../tests/testopt_photo_finput1/.gitignore | 5 + .../tests/testopt_photo_finput1/Cu100_5L.odi | 17 + .../benchmark.out.default.inp=Cu100_5L.odi | 3 + .../tests/testopt_photo_general/.gitignore | 7 + .../testopt_photo_general/Cu100_5L-out.cell | 1 + .../testopt_photo_general/Cu100_5L.bands.bz2 | 1 + .../Cu100_5L.dome_fmt.bz2 | 1 + .../tests/testopt_photo_general/Cu100_5L.odi | 18 + .../Cu100_5L.ome_fmt.bz2 | 1 + .../Cu100_5L.pdos_fmt.bz2 | 1 + .../Cu100_5L.tmprob_fmt.bz2 | 1 + .../tests/testopt_photo_general/Makefile | 33 + .../benchmark.out.default.inp=Cu100_5L.odi | 162 + .../tests/testopt_photo_mpi/.gitignore | 7 + .../tests/testopt_photo_mpi/.opt_err | 3 + .../tests/testopt_photo_mpi/Cu100_5L-out.cell | 1 + .../testopt_photo_mpi/Cu100_5L.bands.bz2 | 1 + .../testopt_photo_mpi/Cu100_5L.dome_fmt.bz2 | 1 + .../tests/testopt_photo_mpi/Cu100_5L.log | 50 + .../tests/testopt_photo_mpi/Cu100_5L.odi | 18 + .../testopt_photo_mpi/Cu100_5L.ome_fmt.bz2 | 1 + .../testopt_photo_mpi/Cu100_5L.pdos_fmt.bz2 | 1 + .../testopt_photo_mpi/Cu100_5L.tmprob_fmt.bz2 | 1 + .../tests/testopt_photo_mpi/Makefile | 33 + .../benchmark.out.default.inp=Cu100_5L.odi | 162 + .../tests/testopt_photo_mpi_qemat/.gitignore | 9 + .../tests/testopt_photo_mpi_qemat/.opt_err | 3 + .../testopt_photo_mpi_qemat/Cu100_5L-out.cell | 1 + .../Cu100_5L.bands.bz2 | 1 + .../Cu100_5L.dome_fmt.bz2 | 1 + .../Cu100_5L.fem_fmt.bz2 | 1 + .../testopt_photo_mpi_qemat/Cu100_5L.odi | 19 + .../Cu100_5L.ome_fmt.bz2 | 1 + .../Cu100_5L.pdos_fmt.bz2 | 1 + .../Cu100_5L.tmprob_fmt.bz2 | 1 + .../Cu100_5L_3step_6.000_qe_matrix.dat | 21 + .../tests/testopt_photo_mpi_qemat/Makefile | 33 + .../benchmark.out.default.inp=Cu100_5L.odi | 23 + .../tests/testopt_photo_sweep/.gitignore | 8 + .../testopt_photo_sweep/Cu100_5L-out.cell | 1 + .../testopt_photo_sweep/Cu100_5L.bands.bz2 | 1 + .../testopt_photo_sweep/Cu100_5L.dome_fmt.bz2 | 1 + .../tests/testopt_photo_sweep/Cu100_5L.odi | 19 + .../testopt_photo_sweep/Cu100_5L.ome_fmt.bz2 | 1 + .../testopt_photo_sweep/Cu100_5L.pdos_fmt.bz2 | 1 + .../Cu100_5L.tmprob_fmt.bz2 | 1 + .../tests/testopt_photo_sweep/Makefile | 33 + .../benchmark.out.default.inp=Cu100_5L.odi | 5763 +++++++++++++++ optados/test-suite/tests/userconfig | 36 + .../tools/parsers/parse_photo_odo.py | 68 + .../tools/parsers/parse_photo_opterr.py | 41 + .../tools/parsers/parse_photo_qemat.py | 36 + 116 files changed, 16252 insertions(+), 277 deletions(-) create mode 100644 optados/examples/Photoemission/Cu/Cu.cell create mode 100644 optados/examples/Photoemission/Cu/Cu.odi create mode 100644 optados/examples/Photoemission/Cu/Cu.param create mode 100644 optados/src/build.f90 create mode 100644 optados/src/photo.f90 create mode 100644 optados/test-suite/checkpoints/Cu100_5L_photo/Cu100_5L-out.cell create mode 100644 optados/test-suite/checkpoints/Cu100_5L_photo/Cu100_5L.bands.bz2 create mode 100644 optados/test-suite/checkpoints/Cu100_5L_photo/Cu100_5L.cell create mode 100644 optados/test-suite/checkpoints/Cu100_5L_photo/Cu100_5L.dome_fmt.bz2 create mode 100644 optados/test-suite/checkpoints/Cu100_5L_photo/Cu100_5L.fem_fmt.bz2 create mode 100644 optados/test-suite/checkpoints/Cu100_5L_photo/Cu100_5L.gkgrid_fmt.bz2 create mode 100644 optados/test-suite/checkpoints/Cu100_5L_photo/Cu100_5L.ome_fmt.bz2 create mode 100644 optados/test-suite/checkpoints/Cu100_5L_photo/Cu100_5L.param create mode 100644 optados/test-suite/checkpoints/Cu100_5L_photo/Cu100_5L.pdos_fmt.bz2 create mode 100644 optados/test-suite/checkpoints/Cu100_5L_photo/Cu100_5L.tmprob_fmt.bz2 create mode 100644 optados/test-suite/tests/testopt_core_chemical_shift/.gitignore create mode 120000 optados/test-suite/tests/testopt_jdos_adaptive_dome/Si2-out.cell create mode 120000 optados/test-suite/tests/testopt_jdos_fixed_odo/Si2-out.cell create mode 120000 optados/test-suite/tests/testopt_jdos_linear_no_spin/Si2-out.cell create mode 100644 optados/test-suite/tests/testopt_miz_chemical_shift/.gitignore create mode 100644 optados/test-suite/tests/testopt_photo_finput1/.gitignore create mode 100644 optados/test-suite/tests/testopt_photo_finput1/Cu100_5L.odi create mode 100644 optados/test-suite/tests/testopt_photo_finput1/benchmark.out.default.inp=Cu100_5L.odi create mode 100644 optados/test-suite/tests/testopt_photo_general/.gitignore create mode 120000 optados/test-suite/tests/testopt_photo_general/Cu100_5L-out.cell create mode 120000 optados/test-suite/tests/testopt_photo_general/Cu100_5L.bands.bz2 create mode 120000 optados/test-suite/tests/testopt_photo_general/Cu100_5L.dome_fmt.bz2 create mode 100644 optados/test-suite/tests/testopt_photo_general/Cu100_5L.odi create mode 120000 optados/test-suite/tests/testopt_photo_general/Cu100_5L.ome_fmt.bz2 create mode 120000 optados/test-suite/tests/testopt_photo_general/Cu100_5L.pdos_fmt.bz2 create mode 120000 optados/test-suite/tests/testopt_photo_general/Cu100_5L.tmprob_fmt.bz2 create mode 100644 optados/test-suite/tests/testopt_photo_general/Makefile create mode 100644 optados/test-suite/tests/testopt_photo_general/benchmark.out.default.inp=Cu100_5L.odi create mode 100644 optados/test-suite/tests/testopt_photo_mpi/.gitignore create mode 100644 optados/test-suite/tests/testopt_photo_mpi/.opt_err create mode 120000 optados/test-suite/tests/testopt_photo_mpi/Cu100_5L-out.cell create mode 120000 optados/test-suite/tests/testopt_photo_mpi/Cu100_5L.bands.bz2 create mode 120000 optados/test-suite/tests/testopt_photo_mpi/Cu100_5L.dome_fmt.bz2 create mode 100644 optados/test-suite/tests/testopt_photo_mpi/Cu100_5L.log create mode 100644 optados/test-suite/tests/testopt_photo_mpi/Cu100_5L.odi create mode 120000 optados/test-suite/tests/testopt_photo_mpi/Cu100_5L.ome_fmt.bz2 create mode 120000 optados/test-suite/tests/testopt_photo_mpi/Cu100_5L.pdos_fmt.bz2 create mode 120000 optados/test-suite/tests/testopt_photo_mpi/Cu100_5L.tmprob_fmt.bz2 create mode 100644 optados/test-suite/tests/testopt_photo_mpi/Makefile create mode 100644 optados/test-suite/tests/testopt_photo_mpi/benchmark.out.default.inp=Cu100_5L.odi create mode 100644 optados/test-suite/tests/testopt_photo_mpi_qemat/.gitignore create mode 100644 optados/test-suite/tests/testopt_photo_mpi_qemat/.opt_err create mode 120000 optados/test-suite/tests/testopt_photo_mpi_qemat/Cu100_5L-out.cell create mode 120000 optados/test-suite/tests/testopt_photo_mpi_qemat/Cu100_5L.bands.bz2 create mode 120000 optados/test-suite/tests/testopt_photo_mpi_qemat/Cu100_5L.dome_fmt.bz2 create mode 120000 optados/test-suite/tests/testopt_photo_mpi_qemat/Cu100_5L.fem_fmt.bz2 create mode 100644 optados/test-suite/tests/testopt_photo_mpi_qemat/Cu100_5L.odi create mode 120000 optados/test-suite/tests/testopt_photo_mpi_qemat/Cu100_5L.ome_fmt.bz2 create mode 120000 optados/test-suite/tests/testopt_photo_mpi_qemat/Cu100_5L.pdos_fmt.bz2 create mode 120000 optados/test-suite/tests/testopt_photo_mpi_qemat/Cu100_5L.tmprob_fmt.bz2 create mode 100644 optados/test-suite/tests/testopt_photo_mpi_qemat/Cu100_5L_3step_6.000_qe_matrix.dat create mode 100644 optados/test-suite/tests/testopt_photo_mpi_qemat/Makefile create mode 100644 optados/test-suite/tests/testopt_photo_mpi_qemat/benchmark.out.default.inp=Cu100_5L.odi create mode 100644 optados/test-suite/tests/testopt_photo_sweep/.gitignore create mode 120000 optados/test-suite/tests/testopt_photo_sweep/Cu100_5L-out.cell create mode 120000 optados/test-suite/tests/testopt_photo_sweep/Cu100_5L.bands.bz2 create mode 120000 optados/test-suite/tests/testopt_photo_sweep/Cu100_5L.dome_fmt.bz2 create mode 100644 optados/test-suite/tests/testopt_photo_sweep/Cu100_5L.odi create mode 120000 optados/test-suite/tests/testopt_photo_sweep/Cu100_5L.ome_fmt.bz2 create mode 120000 optados/test-suite/tests/testopt_photo_sweep/Cu100_5L.pdos_fmt.bz2 create mode 120000 optados/test-suite/tests/testopt_photo_sweep/Cu100_5L.tmprob_fmt.bz2 create mode 100644 optados/test-suite/tests/testopt_photo_sweep/Makefile create mode 100644 optados/test-suite/tests/testopt_photo_sweep/benchmark.out.default.inp=Cu100_5L.odi create mode 100644 optados/test-suite/tools/parsers/parse_photo_odo.py create mode 100644 optados/test-suite/tools/parsers/parse_photo_opterr.py create mode 100644 optados/test-suite/tools/parsers/parse_photo_qemat.py diff --git a/optados/Makefile b/optados/Makefile index 0fe4cc2f..497b13d1 100644 --- a/optados/Makefile +++ b/optados/Makefile @@ -41,6 +41,7 @@ veryclean: cd ./documents && $(MAKE) veryclean cd ./python && $(MAKE) veryclean cd ./test-suite && $(PYTHON_VER) clean_tests -i + cd ./ford && $(MAKE) veryclean dist: optados-$(VER).tar.gz diff --git a/optados/documents/bib.bib b/optados/documents/bib.bib index a904730b..1703131f 100644 --- a/optados/documents/bib.bib +++ b/optados/documents/bib.bib @@ -197,8 +197,6 @@ @Article{tait:JPCM:2016 author = {E. W. Tait and L. E. Ratcliff and M. C. Payne and P. D. Haynes and N. D. M. Hine}, journal = {J. Phys: Condens Matter}, year = 2016, - volume = in, - pages = press } @article{mizoguchi, @@ -218,6 +216,30 @@ @article{mizoguchi %%%%%%%%% All the ones above here I know are necessary. AJM - - - +@article{Forbes2007, + author = {Forbes, Richard G. and Deane, Jonathan H. B.}, + title = {Reformulation of the standard theory of Fowler–Nordheim tunnelling and cold field electron emission}, + journal = {Proceedings of the Royal Society A: Mathematical, Physical and Engineering Sciences}, + volume = {463}, + number = {2087}, + pages = {2907-2927}, + ISSN = {1364-5021}, + DOI = {10.1098/rspa.2007.0030}, + url = {https://dx.doi.org/10.1098/rspa.2007.0030}, + year = {2007}, + type = {Journal Article} +} + +@article{Nordheim1928, + author = {Nordheim, L. W.}, + title = {The effect of the image force on the emission and reflexion of electrons by metals}, + journal = {Proceedings of the Royal Society of London. Series A, Containing Papers of a Mathematical and Physical Character}, + volume = {121}, + number = {788}, + pages = {626-639}, + ISSN = {0950-1207}, + DOI = {10.1098/rspa.1928.0222}, + url = {https://dx.doi.org/10.1098/rspa.1928.0222}, + year = {1928}, + type = {Journal Article} +} \ No newline at end of file diff --git a/optados/documents/user_guide.tex b/optados/documents/user_guide.tex index da10d683..7da59e71 100644 --- a/optados/documents/user_guide.tex +++ b/optados/documents/user_guide.tex @@ -4,9 +4,13 @@ %\usepackage{multirow} \usepackage{footnote} \usepackage{amsbsy} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{gensymb} \usepackage[dvips]{graphicx} %\usepackage{fancyheadings} \usepackage{fancyhdr} +\usepackage{nicefrac} %\setlength{\parindent}{0in} %\setlength{\parskip}{0.05in} \setlength{\parskip}{0.1in} @@ -359,6 +363,7 @@ \subsection{Core-level spectra} In core-level absorption spectra there are several sources of broadening coming from the experimental set up and lifetime effects. These can be included in \optados\ by broadening the theoretical spectrum using a combination of Gaussian and Lorentzian functions. To include instrumentation and lifetime effects, \verb@core_LAI_broadening@ should be set to true. \subsection{Optical properties} +\label{subsec:opticprops} In the low-loss EELS regime, the approximations used for core-level spectroscopy do not hold and the full form of the loss function needs to be calculated. This is done by calculating $\varepsilon_2$ using equations \ref{Eqn:Epsilon2} and \ref{Eqn:Dipole} and then using the Kramers-Kronig relations to find $\varepsilon_1$. Once the dielectric function has been calculated, the loss-function is simulated (without local field effects) using equation \ref{Eqn:LossFn}. As the dielectric function has been calculated, several other optical properties (which are listed below) can also be computed \cite{dressel}. @@ -407,7 +412,280 @@ \subsection{Intraband term} \end{equation} where $\Gamma$ denotes the relaxation rate. +\section{Photoemission model} +The formalism adopted in the photoemission model adopted here requires that the excitation spectrum can be described within a quasi-particle model, with excitations represented as transitions between energy levels in a band structure of single particle states. The one-particle transition probability for the absorption of a photon of frequency $\omega$ is defined by Fermi's golden rule, + +\begin{equation} +\Gamma_{i \rightarrow j} = \frac{2 \pi}{\hbar} M (i,j,{\bf{k}},s ) \delta(E{(j,{\bf{k}},s)}-E{(i,{\bf{k}},s)}-\hbar \omega ) + \label{fermi_golden_rule} +\end{equation} + +where $E$ is the electronic state eigenvalue, $i$ and $j$ are the indices for the initial and final state respectively, $s$ is the spin index, $\bf{k}$ is the wave vector of the electronic wave function, $M(i,j,{\bf{k}},s)$ is the photoemission matrix element and the Dirac delta function $\delta(E{(j,{\bf{k}},s)}-E{(i,{\bf{k}},s)}-\hbar \omega)$ ensure the energy conservation in the photoemission process. The Dirac delta function can be evaluated using the fixed-width Gaussian broadening, adaptive Gaussian broadening or linear extrapolative scheme implemented in the OptaDOS code. + +The photoemission matrix element $M(i,j,\bf{k},s)$ in Eq.~\ref{fermi_golden_rule} is + +\begin{equation} +M(i,j,{\bf{k}},s) = \left | \left \langle \psi_{{\bf{k}},j,s}\left | H' \right | \psi_{{\bf{k}},i,s} \right \rangle \right |^2 + \label{matrix_elements} +\end{equation} + +The Fermi's golden rule describes the transition probability from an initial eigenstate $\psi_i$ to a final state $\psi_j$ as a result of a weak perturbation $H'$ cause by the light. The perturbation due to the light $H'$ can be evaluated by calculating the effect of the electromagnetic field on the electron (Eq.~\ref{matrix2}). + +\begin{equation} +H' = \frac{e}{2m_{0}} (p \cdot A + A \cdot p) + \frac{e^2 A^2}{2 m_0} +\label{matrix2} +\end{equation} + +where $p = - i \hbar \nabla $ is the momentum operator and here $A$ is the polarization vector of the incoming electromagnetic wave. The $A^2$ term can be neglected under the assumption of a weak field. The Hamiltonian can be simplified due to the Coulomb gauge, $\nabla \cdot A = 0$. The perturbation due to the light field is rewritten as + +\begin{equation} +H' = \frac{e}{2m_{0}} p \cdot A +\label{matrix3} +\end{equation} + +The optical matrix from which the optical properties of a solid can be obtained. + +\subsection{Photoemission final state} + +Within the one-electron photoemission approach, two distinct photoemission models have been developed and widely used in previous work in order to describe the photoemission process. The current implementation generates two distinct optical matrices (Eq.~\ref{matrix_elements}) where the final state $\psi_j$ changes according to the photoemission model. + +\begin{itemize} +\item[{\bf --}] \verb#Three step photoemission model# : The three step model divides the photoemission process into three steps. In the first step, the ground state electrons are excited into a final state in the crystal or Bloch state + +\begin{equation} +\psi_{j}{(\bf{r})} = \sum C_{j,\bf{G}} e^{i(\bf{k}+\bf{G})\bf{r}} + \label{bloch_wave} +\end{equation} + +Where $C_{j,\bf{G}}$ are the plane wave coefficients and $\bf{G}$ are the reciprocal lattice vectors. In the second step, the excited Bloch electrons will have a probability to travel to the surface of the material. Once the electrons reach the surface of the material, in the third step, the electrons will escape into the vacuum. + +\item[{\bf --}] \verb#One step photoemission model# : The one step model final state in this work is described as + +\begin{equation} +\psi_{j}{(\bf{r})} = e^{i \bf{k}\bf{r}}e^{-\frac{z \cdot sin (1-\theta (i,j,\bf{k}))}{\lambda(\omega) }} + \label{1_final_electron_wave} +\end{equation} + +where $\lambda(\omega)$ is the electrons scattering length and $sin (1-\theta (i,j,\bf{k}))$ considers the scattering length increase with emission angles away from the surface normal. +\end{itemize} + +\subsection{Atomic projection} +\label{subsec:atomicproj} + +It is possible to project the energy bands of a periodic solid onto localised atom centred orbitals, and therefore to define atomic contributions to the excitation. This is particularly convenient as it allows to explicitly calculate the contributions from excitation in each sub-surface layer. The contribution of each atomic layer that composed the slab can be performed by projecting the delocalised Bloch functions onto localised representations such as atomic orbitals (AO) or Wannier functions. CASTEP calculates this projection $W(i, j,\bf{k}, \mu,s)$ as + +\begin{equation} +W(i, j,\bf{k}, \mu,s) =\sum_{\nu} T^{*}_{\mu ij,s}({\bf{k}}) T_{\mu ij,s}({\bf{k}}) S_{\nu \mu}(\bf{k})^{-1} +\label{weights} +\end{equation} + +where $T_{\mu ij,s}({\bf k}) = \left \langle \Psi_{ij,s}({\bf k}) \mid \phi_{\mu}({\bf k}) \right \rangle$ are the overlap matrices between linear combination of atomic orbitals (LCAO) basis $\phi_{\mu}({\bf k})$ and plane wave state $\Psi_{ij,s}({\bf k})$, and $S_{\nu \mu}({\bf k}) = \left \langle \phi_{\nu}({\bf k}) \mid \phi_{\mu}({\bf k}) \right \rangle$ are the overlap matrices of the LCAO basis. + +\subsection{Temperature} + +The original formulation of the Kohn-Sham DFT describes a system of interacting particles in an external potential at zero temperature. Later, Mermin extended this formalism for a finite temperature $T>0$. In the current implementation, the finite temperature formalism of Mermin is adopted by introducing a Fermi-Dirac distribution in which the state occupancy is + +\begin{equation} +n(i,{\bf{k}},T,s) = \frac{1}{e^{(E_{F}-E_i ({\bf{k}},s))/k_BT}+1} + \label{Fermi_dirac} +\end{equation} + +where $E_F$ is the Fermi energy and $k_B$ is the Boltzmann constant. + +\subsection{Light decay} + +The intensity of the light at each atom $\mu$ of the surface, expressed as + +\begin{equation} +I(\omega,\mu) = I(\omega, \mu-1)e^{-\alpha(\omega,\mu)t(\mu)}-R(\omega,\mu) + \label{Intensity} +\end{equation} + +where $\alpha(\omega,\mu)$ is the absorption coefficient within each layer, $t(\mu)$ is the length of the light path and $R(\omega,\mu)$ is the reflective coefficient of the surface. The calculation of the optical characteristics is analogous to the equations in Section \ref{subsec:opticprops}, but the contributions from each layer is calculated by weighting the electronic structure by the weights $W$ from Section \ref{subsec:opticprops}. + +\subsection{Electron transport} +Determining absorption in each sub-surface layer requires the use of an explicit electron transport model for each of the layers. In the current implementation, a simple model of the inelastic scattering rate is used for the electron transport in the three step model and the escape probability of a free electron as it travels through a material in the one step model. The inelastic mean free path theory explains that electrons can only travel a certain average distance without suffering an inelastic scattering event. The assumption that once an electron suffers an inelastic scattering event the electron will be reabsorbed is adopted in this work, resulting in an escape function for the $i \rightarrow j$ excitation as a function of the escape depth; + +\begin{equation} +esc(\omega,i,j,{\bf{k}},\mu,s) = e^{-\frac{d(\mu)sin(1-\theta(i,j,{\bf{k}},s))}{\lambda(\omega)}} + \label{IMFP} +\end{equation} + +The angle $\theta(i,j,\bf{k})$ indicates that electrons that travels with a higher angle with respect to the surface normal travels a longer distance inside the material. When passing the potential "step" at the surface it is assumed that the electron's transverse momentum is conserved, while the longitudinal momentum is reduced by the work function barrier. Therefore two sets of angles must be calculated for within the material ($\theta_{int}$) and after passing the surface ($\theta_{ext}$). These angles are calculated as + +\begin{equation} +\begin{split} + \theta_{int}{(i,j, {\bf{k}},s)} &= acos \frac{E_\parallel(i,{\bf{k}},s)}{E_K(j,{\bf{k}},s)}\\ + \theta_{ext}{(i,j, {\bf{k}},s)} &= acos \frac{E_\parallel(i,{\bf{k}},s)}{E_K(j,{\bf{k}},s)-W} +\end{split} +\label{theta} +\end{equation} + +where $E_\parallel(i,\bf{k})$ is the transverse energy, $E_K(j,\bf{k})$ is the final state kinetic energy and $W$ is the work function. The angle $\theta_{ext}$ is used to determine if emission is possible under the chosen conditions, while $\theta_{int}$ is used to model the electron's propagation distance. + +\subsection{Transverse momentum conservation} + +The momentum of photons can be considered as negligible compared to the momentum of the surface electrons and therefore, the electron momentum is conserved upon excitation. In addition, since electrons can only travel very short distances inside a material, photoemission is considered as a surface phenomenon. At the surface of a crystal, the periodic transverse symmetry perpendicular to the surface is broken and so the pseudo momentum perpendicular to the surface is not a conserved quantity. The parallel momentum conservation is described by + +\begin{equation} +\Theta'({\bf{k}}_\perp) +\begin{cases} + 1, & {\bf{k}}_\perp(i,j,s) \geq 0 \\ + \delta((E_v - E(j,{\bf{k}}),s),& {\bf{k}}_\perp(i,j,s) < 0 +\end{cases} + \label{eq:Heaviside} +\end{equation} + +where $E_v$ is the vacuum level and + +\begin{equation} +k_{\perp}(i,j,{\bf{k}},s) = \frac{2m}{\hbar^2}(E(j,{\bf{k}},s)-E_v)- {\bf{k}_{\parallel}}(i,\bf{k},s)^2 + \label{E_perp} +\end{equation} + +Here ${\bf{k}_{\parallel}}(i,{\bf{k}},s)$ is the electron parallel momentum inside the crystal. + +$\Theta'$ is a modified version of the Heavyside step function $\Theta$ in which $0$ is replaced by a Dirac delta function $\delta(E_v - E_f)$ evaluated with a Gaussian function is included to account for finite temperature broadening of electrons that do not strictly fulfil the parallel momentum conservation. + +\begin{equation} + \delta(E_v - E(j,{\bf{k}},s)) = \frac{1}{\sigma \sqrt{2\pi}}exp \left (-\frac{1}{2}\frac{E_v - E(j,{\bf{k}},s)}{\sigma^2}\right ) + \label{eq:Gaussian_vac} +\end{equation} + +where the width $\sigma$ can be used to approach external parameters such as the electron temperature. + +\subsection{Emission from the surface} +In the three step model the final step considers the transmission across the surface into vacuum. The approach in the OptaDOS photoemission module is based on S. Hüfner, in Advanced Texts in Physics, Springer Berlin, Heidelberg, 3 edn., 2003, ch. 6, pp. 349-357. + +To approximate the probability of this occuring, one can represent the propagating electron using a set of plane waves. The final bands in the three step model are bloch bands, so they can be represented as +\begin{equation} + \psi_f(\mathbf{k}) = \sum_G u_f(\mathbf{k},\mathbf{G})e^{i(\mathbf{k}+\mathbf{G})\cdot\mathbf{r}} +\end{equation} +where $u_f$ are the plane wave coefficients, $\mathbf{G}$ are the reciprocal lattice vectors, $\mathbf{k}$ is the electron momentum, and $\mathbf{r}$ is the position vector. Each of these components is able to match onto an equal component on the other side of the surface. Since the the transverse momentum is conserved, all the components with the same $\mathbf{k_{||}+G_{||}}$ must be treated together. Thus the total transmission probability can be approximated as + +\begin{equation} + \left|T(E_f,\mathbf{k_{||}})\right|^2 = \left|t(E_f,\mathbf{k_{||}})\right|^2 \left| \sum_{(k+G)_\perp>0}u_f(\mathbf{G},\mathbf{k}) \right|^2 +\end{equation} + +where $\left|t(E_f,\mathbf{k_{||}})\right|^2$ represents the transmission probability for the electron in general and the sum $\sum_{(k+G)_\perp>0}$ is the contribution from all the plane wave components propagating towards the surface. The factor $\left|t(E_f,\mathbf{k_{||}})\right|^2$ is already included in Equation \eqref{eq:Heaviside}, so only the second factor is explicitly calculated in CASTEP and supplied to OptaDOS in a {\tt *.tmprob\_bin} file. Thus we can define + +\begin{equation} + T(E_f,\mathbf{k_{||}}) = \left| \sum_{(k+G)_\perp>0}u_f(\mathbf{G},\mathbf{k}) \right|^2 + \label{eq:transmit_prob} +\end{equation} + +\subsection{Field emission} +\label{subsec:fieldemission} + +In applications such as the generation of free electrons for particle accelerators, an external electric field is commonly used to increase the photocathode's efficienccy for a given light energy. The effect of this external electric field is included using an approximation based on the Fowler-Nordheim (FN) theory of field emission. The external electric field is assumed to be both uniform and to only modify the vacuum potential barrier, the electron distribution is in thermodynamic equilibrium and obeys Fermi-Dirac statistics and the emission surface is flat and planar with a constant uniform local work function. The barrier height is lowered due to the presence of the electric field. This lowering is calculated as +\begin{equation} +W_{eff} = W - \sqrt{\frac{e^3 F}{4 \pi \varepsilon_0}} +\end{equation} +where $W$ is the user supplied work function, $F$ is the electric field strength in \nicefrac{V}{\AA} and $\epsilon_0$ is the vacuum permittivity. +The vacuum potential in the FN theory in this current implementation is described using a Schottky-Nordheim barrier $M$ defined as + +\begin{equation} +M = \phi - eFz - \frac{e^2}{16 \pi \epsilon_0 z} +\label{SN_barrier} +\end{equation} + +where $e$ is the electron charge, $\epsilon_0$ is the vacuum permittivity, $\phi$ is the work function barrier, $F$ is the external electric field and $z$ is the distance from the surface. The current implementation follows the arguments put forward in an article by Forbes \cite{Forbes2007} to calculate the transmission probability across the modified barrier. \\ The transmission probability $D$ is calculated as +\begin{equation} +D \approx exp[-G] +\end{equation} +which assumes that the so-called "JWKB exponent" $G$ is sufficiently large that $exp[-G] \ll 1$. $G$ is generally defined as +\begin{equation} + G \equiv g_e \int M^{\frac{1}{2}}dz~~\text{with}~~g_e=\frac{2(2 m_e)^{1/2}}{\hbar} +\end{equation} +where the integral is over the range with $M>0$, $m_e$ is the electron mass and $\hbar$ is reduced Planck's constant. $G$ can be calculated for a triangular barrier where $M=h-eFz$ as +\begin{equation} + G^{el} = \frac{bh^{3/2}}{F}~~\text{with}~~b \equiv \frac{2g_e}{3e} +\end{equation} +where $h$ is the height of the barrier and $F$ is the electric field strength. To generalise this to a modified barrier shape, one can define +\begin{equation} + G \equiv \nu G^{el} +\end{equation} +where the correction factor $\nu$ is calculated using a series expansion presented in Equation (4.17) in Forbes,2007.\cite{Forbes2007} + +\subsection{Projected, bulk and total quantum efficiency and mean transverse energy} +\label{subsec:QE_MTE} + +For the three step model the QE can be thus defined by the following. By considering Fermi's Golden rule (Eq.~\ref{fermi_golden_rule}) for the excitation probability, the projection onto atomic orbitals (Eq.~\ref{weights}), temperature effects on the electronic population (Eq.~\ref{Fermi_dirac}), light decay (Eq.~\ref{Intensity}), electron scattering effects (Eq.~\ref{IMFP}), the momentum conservation rules (Eq.~\ref{eq:Heaviside}), and the probability for transmission across the surface (Eq.~\ref{eq:transmit_prob}), the QE in this model is computed as + +\begin{multline} +QE{(\omega, {\bf{k}},\mu, T, s)}= \frac{1}{A}\sum_{i,j,s} \Gamma_{i \rightarrow j} W( i,j,{\bf{k}},\mu,s)~n(i,T,s) (1-n(j,T,s))~I(\omega,\mu) \\ +esc(\omega,f,{\bf{k}},\mu,s)\Theta({\bf{k}}_\perp) T(E_f,\mathbf{k_{||}}) (1+D(j,s)) + \label{eq:3step_projected_qe_equation} +\end{multline} + +where $A$ is the surface area of the simulation cell, $i$ and $j$ are the initial and final band respectively and $s$ is the spin channel. For the one step model the amount of factors is slightly reduced and thus the QE is calculated as +\begin{multline} +QE{(\omega, {\bf{k}},\mu, T, s)}= \frac{1}{A}\sum_{i,j,s} \Gamma_{i \rightarrow j} W( i,j,{\bf{k}},\mu,s) n(i,T,s) I(\omega,\mu) \\ +esc(\omega,f,{\bf{k}},\mu,s)\Theta({\bf{k}}_\perp) (1+D(i,s)) + \label{eq:1step_projected_qe_equation} +\end{multline} + +The atomic weighting of the contributions of the atomic sites allows the projected quantum efficiency to be defined as; + +\begin{equation} +QE{(\omega ,\mu, T)}= \int_{BZ} QE{(\omega, {\bf{k}},\mu, T)}\frac{d{\bf{k}}}{8\pi^3} + \label{projected_qe_integral} +\end{equation} + +The accuracy of the computed surface photoemission can be limited by the computational resources. First principle simulations of surfaces are typically performed in using the slab model. In this model, a 2D periodic slab of material of finite thickness in the third dimension (a periodic "slab") separated from the repetitive images by a vacuum region is used to model a semi-infinite surface. The properties of the surface simulated using the slab model usually converges quickly with respect to the slab thickness, so only a small, finite number of atomic layers is required. Sun and Ceder developed an efficient scheme for the creation and convergence of surface slabs that was able to converge the surface energy with slabs as thin as seven atomic layers. However, photoemitted electrons can be emitted from layers deeper inside the material, in the orders of nanometres (tens to hundreds of atomic layers). + +Since the electronic properties of the slab in a suitable construction of a surface converges with respect to the slab thickness for a small finite number of atomic layers, the centre of the slab approximates bulk conditions. It is therefore possible to compute the photoemission efficiently from layers many nanometres from the surface by replicating bulk layers to simulate the photoemission from a slab model of arbitrary thickness. In the current implementation, the contribution of the deeper atomic layers to the photoemission process is approximated by the repetition of the atomic layer at the centre of the slab. The QE contribution of the bulk states is expressed as + +\begin{equation} +QE_{bulk}(\omega,T) = \sum^{\tau}_{\mu = N} QE(\omega,\mu,T) + \label{QE_bulk} +\end{equation} + +where $N$ is the index of the atomic layer at the centre of the slab and + +\begin{equation} +\tau = \frac{n_{IMFP}~\lambda}{d(N)} + \label{QE_bulk_tau} +\end{equation} + +defines the maximum number of layers to consider as a multiple of the IMFP value supplied by the user. Here $\lambda$ is the IMFP value, $n_{IMFP}$ is an integer to determine the cutoff distance for the bulk slab approximation as a multiple of $\lambda$ (default~=~10), and $d(N)$ is the thickness of the slab layer. + +The total quantum efficiency $QE_{tot}{( \omega, T)}$ is the sum of the explicitly computed $N$ surface layers and the bulk contribution + +\begin{equation} +QE_{tot}( \omega , T)= \sum_{\mu}^N QE{( \omega ,\mu, T)} + QE_{bulk}(\omega,T) + \label{total_qe} +\end{equation} + +The mean transverse energy + +\begin{equation} +MTE(\omega, T) =\int_{BZ} \frac{\sum_{\mu}^N{QE(\omega,{\bf{k}},\mu, T)}\frac{\hbar^2}{m_e}\bf{k_{\parallel}}^2}{QE_{tot}( \omega , T)} \frac{d{\bf{k}}}{8\pi^3} + \label{mean_te} +\end{equation} + +is the sum of the QE contribution at each atomic site times the transverse energy of a particular $\bf{k}$ point, normalized to the total quantum efficiency integrated over the Brillouin zone (BZ). This could also be described as a weighted sum for the contributions across all the $\mathbf{k}$ points. + +\subsection{Transverse momentum for supercell geometries} +When using $\mathbf{k}$ points to calculate the electron's transverse momentum a problem arises when calculating the electronic structure of supercell (SC) structures. With a SC, a phenomenon generally called "band folding" occurs. This means, that the bands start being "folded" towards the $\Gamma$ point at the center of the BZ. More specifically a band present at the PC zone boundary is "folded" onto the $\Gamma$ point. If one now calculates the transverse momentum associated with that band using just the $\mathbf{k}$ point's one gets unsurprisingly 0, rather than \nicefrac{$\pi$}{\bf{a}}.\\ +Since that transverse momentum has an important role in deciding if an emission is allowed, this means, that this specific emission is now possible at much lower photon energies. In addition the transverse energy distribution is also reduced, here to 0 specifically. These two differences are present for all "folded" bands and in total show the effect of a much higher QE value and lower MTE value when comparing the PC and SC geometries.\\ + +One can, however, recover the original transverse momentum. For this each of the $\mathbf{k}$ points is expanded into a grid of $\mathbf{k_{x,y} + G_{x,y}}$ points, where $\mathbf{G_{x,y}}$ are the reciprocal cell's $x$ and $y$ vectors. The grid's coordinates in \nicefrac{1}{\AA} are calculated by +\begin{align} + c_x(\mathbf{k_x + G_x}) &= \mathbf{k_x + \alpha \cdot G_x(x) + \beta \cdot G_y (x)}\\ + c_y(\mathbf{k_y + G_y}) &= \mathbf{k_y + \alpha \cdot G_x(y) + \beta \cdot G_y (y)} +\end{align} +where $\mathbf{k}$ is in cartesian coordinates and +\begin{align*} +[\alpha] = \{x \in \mathbb{Z} \ &| -\alpha_{max} \leq x \leq \alpha_{max} \} \\ +[\beta] = \{x \in \mathbb{Z} \ &| -\beta_{max} \leq x \leq \beta_{max} \}. +\end{align*} +The values of $\alpha_{max}$ and $\beta_{max}$ are chosen, so that $|c_x| < 3.8 $ \nicefrac{1}{\AA} and $|c_y| < 3.8 $ \nicefrac{1}{\AA} to limit the number of grid points. The value on each of the grid points is calculated by summing up the $u_f$ coefficients for the $z$ direction as +\begin{equation} + w_{gk}(\mathbf{k_{x,y} + G_{x,y}}) = \sum_{G_z} \left| u_f(\mathbf{G},\mathbf{k_{x,y}}) \right|^2 +\end{equation} +where $u_f$ are the plane wave basis coefficients. The $c_{x,y}$ and $w_{gk}$ values are read from a {\tt *.gkgrid\_bin} file. The calculation of QE and MTE values is performed analogous to Section \ref{subsec:QE_MTE} for each of the grid points with $c_{x,y}$ replacing $\mathbf{k_{||}}$. \chapter{Getting Started}\label{chap:getting_started} \section{Installation} @@ -427,7 +705,7 @@ \section{Installation} The following are no longer supported but are provided for legacy systems: \begin{itemize} -\item[{\bf --}] \verb#g95# +\item[{\bf --}] \verb#g95# \item[{\bf --}] \verb#pathscale# \item[{\bf --}] \verb#sun# \end{itemize} @@ -500,6 +778,7 @@ \chapter{Structure of the Program} \label{sec:structure} \item \texttt{optados}: main program \item \texttt{optics}: calculate dielectric function then generate optical properties \item \texttt{parameters}: read, store and check input file parameters +\item \texttt{photoemission}: perform a photoemission characteristics calculation \item \texttt{pdos}: perform PDOS calculation \item \texttt{pdis}: perform a projected dispersion calculation \item \texttt{projection\_utils}: routines for reading and writing projectors @@ -513,6 +792,95 @@ \chapter{Structure of the Program} \label{sec:structure} \end{center} \end{figure} +\section{Structure of the Photoemission module} \label{sec:photostructure} +\begin{itemize} +\item {\bf analyse\_geometry}: this subroutine identifies which atoms +belong to each layer and which is the maximum one to include in the calculations (half slab). +It contains: + \begin{itemize} + \item a sorting algorithm to get an ordering by the atom's z coordinate + \item an algorithm to calculate the center of the slab and define a set of equally spaced boxes representing layers within the slab + \item identification of the maximum layer to use for the calculation + \item identification of the maximum atom to use for the calculation + \item identification of the number of atoms in each of the layers + \end{itemize} + +\item {\bf calc\_band\_info}: this subroutine checks that the supplied band energies are sorted in ascending order, as that is essential in the later stages of the calculation. The included steps are: +\begin{itemize} + \item check that the band energies are in ascending order at every k-point + \item save the index for the first unoccupied band at every k-point +\end{itemize} + +\item {\bf calc\_photon\_energies}: this subroutine allows the photoemission module to calculate the photoemission and other characteristics for a number of photon energies in a single run. It calculates the number of steps to take during the run and sets all the necessary variables to properly initalise arrays later. + +\item {\bf make\_pdos\_weights\_atoms}: this subroutine calculates the +PDOS on atoms by summing the orbital contributions for a certain atom. It is taken from the {\it pdos\_merge} subroutine of +pdos.F90, but only the sum over atoms is included. +It contains: + \begin{itemize} + \item the sum of the orbital contribution of the same atom + \item the sum of all atomic contribution at fixed {\bf k} +and band indices. + \end{itemize} + +\item {\bf calc\_photo\_optics}: this subroutine calculates the optical properties of the system using the following steps: +\begin{itemize} + \item calculate the optical weights using {\bf od\_optics : make\_weights } For the photoemission calculation, the optics\_geom can be + \begin{itemize} + \item {\bf polarized}: the three indices specify the + vector of oscillation for the incoming radiation's electric field; + \item {\bf unpolarized}: the three indices define a + plane perpendicular to the direction + of the light propagation. See Section \ref{sec:opticsparams} for further details. + \end{itemize} + Full dielectric tensor calculation is not implemented for photoemission calculations. + \item weight the \emph{ optical weights } using the \emph{ pdos\_weights\_atoms } + \item calculate the atom projected joint density of states (jDOS) for each of the atoms using {\bf jdos\_utils\_calculate} + \item calculate the imaginary part of the dielectric function $\epsilon_2$ using {\bf od\_optics : \\ calc\_epsilon\_2 } + \item calculate the real part of the dielectric function $\epsilon_1$ with the Kramers-Kronig relations using {\bf od\_optics : calc\_epsilon\_1} + \item calculate the refractive index $n$ of each atom using {\bf od\_optics : calc\_refract} + \item calculate the absorption coefficient $A$ of each atom using {\bf od\_optics : calc\_absorp} + \item calculate the reflectivity of each atom using {\bf od\_optics : calc\_reflect} +\end{itemize} + +\item {\bf calc\_absorp\_layer}: this subroutine calculates + the portion of light absorbed by each layer. + If there is only one layer, the thickness is fixed to one. + +\item {\bf effective\_wf}: this subroutine calculates the reduction of the work function in line with the Nordheim-Fowler theory when applying an electric field.\cite{Nordheim1928} + +\item {\bf calc\_field\_emission}: this subroutine uses Nordheim-Fowler barrier theory, to calculate the probability of an electron in a band with a certain energy to tunnel through the reduced barrier height, see \ref{subsec:fieldemission} for the equations + +% (write down the formula to split it +% layer-by-layer). +\item {\bf calc\_angle}: this subroutine calculates the electron's the transverse energy and its photoemission angles theta/phi within the slab and after passing into the vacuum. + +\item {\bf calc\_electron\_esc}: this subroutine calculates the escape length and the probability for the emission of the electron from a each of the layers. The probability is calculated according to the inelastic mean free path (IMFP) theory. The user can supply either a {\bf single IMFP value}, that will be used for the entire material, or a {\bf list of IMFP values} for each layer being calculated. In the second case, a weighted IMFP value is calculated for each layer based on the thickness of each layer and its respective location within the slab. + +\item {\bf bulk\_emission}: Due to computational constraints, the thickness of a slab model cannot be made very high. To account for the lack of bulk like material, that can still contribute to the overall photoemission, the most internal layer is replicated until emitted electrons have a chance of reaching the surface of $< 1 \cdot 10^{-5}$. The contributions from these layers are summed up. + +\item {\bf QE calculation}: Calculates the layer-by-layer QE. + Two options are available: + \begin{itemize} + \item {\bf calc\_three\_step\_model}: Calculates the QE assuming a final Bloch state (conduction band) in the crystal. + \item {\bf calc\_one\_step\_model}: Calculates the QE assuming a final free electron state. + \end{itemize} + +\item {\bf weighted\_mean\_te}: Weights the contribution to the transverse energy of each individual state at a certain k-point according to its QE contribution. + +\item {\bf write\_qe\_data}: this subroutine takes the calculated contributions and MTE and writes it to the output file concisely for the user. + +\item {\bf extra calculations}: A number of options are available. + \begin{itemize} + \item {\bf qe\_tensor}: Write out the contributions of each band for all k-points, spins and atoms. This can be used to study the specific origin of photoemitted electrons, for detailed visualisations and much more. + \item {\bf bindenergy\_curve}: Calculate and write out a {\bf QE vs binding energy} plot. A Gaussian broadening is applied. Additionally, the ranges for emission angles $\theta$ and $\phi$ can be set to allow for comparison with ARPES data, $e.g.$ energy distribution curves (EDC). + \item {\bf binding\_energy\_momentum\_map}: Calculate and write a {\bf binding energy vs transverse energy} map as a matrix with the value of each grid point representing the QE contribution at that point. The contributions are Gaussian broadened and the ranges for emission angles $\theta$ and $\phi$ can be set to allow for comparison with ARPES data. + \item {\bf const\_binding\_energy\_map}: Calculate and write a {\boldmath $p_x$ vs $p_y$} matrix of grid points where the value at each grid point represents the total QE contribution at a specified binding energy. The specified binding energy is w.r.t. $E_F$. + \item {\bf p\_tensor}: Calculate and write a {\boldmath$p_x$,$p_y$,$p_z$} tensor of grid points for electron momenta in $\frac{1}{\text{\AA}}$. Each value at that grid point represents the QE contribution at that specific set of electron momenta. The contributions are Gaussian broadened and the ranges for emission angles $\theta$ and $\phi$ can be set to allow for comparison with ARPES data. + \end{itemize} +\end{itemize} + + \chapter{Parameters}\label{chap:parameters} \section{{\tt seedname.odi} File} @@ -764,6 +1132,7 @@ \section{Projected Dispersion Parameters} been requested). \section{Optics Parameters} +\label{sec:opticsparams} \subsection[optics\_geom]{\tt character(len=20) :: optics\_geom} @@ -857,6 +1226,157 @@ \section{Core-level Parameters} The default value, if \verb#core_LAI_broadening = true#, is 0. +\section{Photoemission Parameters} + +\subsection[photo\_model]{\tt character(len=20) :: photo\_model} + +Set the final state for the photoemitted electrons. + +\begin{itemize} +\item[{\bf --}] \verb#3step# (default) + +Read the matrix elements and calculate the photoemission assuming a conduction band final state in the solid. +\item[{\bf --}] \verb#1step# + +Read the matrix elements and calculate the photoemission assuming a free electron final state. +\item[{\bf --}] \verb#ds_like_pe# + +Calculate a DOS dependent emission model based on an extension of the Dowell-Schmerge Model. +\end{itemize} + +\subsection[photo\_momentum]{\tt character(len=20) :: photo\_momentum} + +Set the way the photoelectron's transverse momentum to the surface is computed. + +\begin{itemize} +\item[{\bf --}] \verb#crystal# (default)\\ Takes the transverse crystal momentum $\mathbf{k_{x,y}}$ to compute the electrons transverse energy. +\item[{\bf --}] \verb#gkgrid# \\ Instead of using a set of crystal momentum \textbf{k} values on a grid, $e.g.$ Monkhorst Pack (MP), each \textbf{k} point is expanded into a set of grid points. This grid is centered on each of the crystal momenta $\mathbf{k_{x,y}}$ and expanded using the reciprocal lattice vectors $\mathbf{G_x}$ and $\mathbf{G_y}$. This option allows to get consistent results for both primitive cell (PC) and super cell (SC) slab geometries. When using {\tt crystal}, the QE/MTE values for SC slabs are over/underestimated due to the bands being folded towards the $\Gamma$ point in SC geometries. +\end{itemize} + +\subsection[photon\_energy]{\tt real(kind=dp) :: photo\_photon\_energy} +Sets the photon energy at which the photoemission characteristics are calculated. If {\tt task = photoemission}, photo\_photon\_energy has to be set. If {\tt task = photo\_energy\_sweep}, this value {\bf must not} be set, otherwise OptaDOS will give an error message and terminate. + +There is no default value + +\subsection[photo\_photon\_min]{\tt real(kind=dp) :: photo\_photon\_min} +If {\tt task = photo\_energy\_sweep} this represents the initial energy of the photon energy sweep. The photon energy will be increased for each step by the value of {\tt jdos\_spacing}. + +\subsection[photo\_photon\_max]{\tt real(kind=dp) :: photo\_photon\_max} +If {\tt task = photo\_energy\_sweep} this represents the final energy of the photon energy sweep. The photon energy will be increased for each step by the value of {\tt jdos\_spacing} up to and including {\tt photo\_photon\_max}. + +{\bf ATTENTION} : If setting photo\_photon\_min/max the difference between them has to be an integer multiple (including 0) of {\tt jdos\_spacing}, otherwise OptaDOS will give an error message and terminate. + +\subsection[photo\_slab\_min]{\tt real(kind=dp) :: photo\_slab\_min} +Sets the assumed lower boundary of the material's slab. This value is used to calculate the slab's volume and center. It should be the same distance from the assumed center of the material slab to ensure the slab's center can be reliably found by OptaDOS. This needs to be determined/estimated by the user and could for example be the coordinate of the atom with the lowest z-coordinate plus that atom's vdW-radius. + +There is no default value + +\subsection[photo\_slab\_max]{\tt real(kind=dp) :: photo\_slab\_max} +Sets the assumed upper boundary of the material's slab. This value is used to calculate the slab's volume and center. It should be the same distance from the assumed center of the material slab to ensure the slab's center can be reliably found by OptaDOS. This needs to be determined/estimated by the user and could for example be the coordinate of the atom with the highest z-coordinate plus that atom's vdW-radius. + +There is no default value + +\subsection[photo\_work\_function]{\tt real(kind=dp) :: photo\_work\_function} + +Sets the assumed work function for the calculation. This needs to be determined/estimated by the user. + +There is no default value + +\subsection[photo\_bulk\_cutoff]{\tt real(kind=dp) :: photo\_bulk\_cutoff} +Sets the multiple of the IMFPs after which to terminate the bulk approximation. The number of layers in the bulk approximation depends on the value(s) set in {\tt photo\_imfp\_value}. + +The default value is 10 + +\subsection[photo\_elec\_field]{\tt real(kind=dp) :: photo\_elec\_field} + +Sets the external electric field in \nicefrac{V}{\AA}. + +The default value is 0.0 \nicefrac{V}{\AA} + +\subsection[photo\_imfp\_value]{\tt character(len=20) :: photo\_imfp\_choice} +\begin{itemize} + \item[{\bf --}] \verb#const# (default) + \item[{\bf --}] \verb#layers# + \item[{\bf --}] \verb#curve# (experimental) +\end{itemize} +This sets the choice for how to treat the {\tt photo\_imfp\_value} input. For the {\tt const} option a single value is used for all layers in the slab. For the {\tt layers} option each explicit layer must be given a value. The IMFP value for a specific layer is calculated as a weighted average of all the above layers. The {\tt curve} option is only experimental and calculates an IMFP value based on each electron's excess energy during propagation within the material. + +\subsection[photo\_imfp\_value]{\tt real(kind=dp) :: photo\_imfp\_value} + +Set the inelastic mean free path (IMFP) value(s) in \AA~for the calculation. See {\tt photo\_imfp\_choice} for further explanation. When using {\tt layers} the number of values must equal the number of explicit layers being used for the calculation. This is generally \nicefrac{\# slab layers}{2} for an even number of total layers and \nicefrac{\# slab layers}{2} + 1 for an odd number of total layers. + +There is no default value and the parameter must be set for all calculations. + +\subsection[photo\_temperature]{\tt real(kind=dp) :: photo\_temperature} + +Sets the assumed temperature during the calculation in Kelvin. The occupation of bands is smeared using a Fermi-Dirac distribution with this temperature value. + +The default value is 298 K + +\subsection[write\_photo\_output]{\tt character(len=80) :: photo\_output} +\begin{itemize} +\item[{\bf --}] \verb#off# (default)\\ \\ +No extra output is written. +\item[{\bf --}] \verb#qe_tensor#\\ \\ +Write out the contributions of each band for all k-points, spins and atoms. This can be used to study the specific origin of photoemitted electrons, for detailed visualisations and much more. +\item[{\bf --}] \verb#bindenergy_curve#\\ \\ +Calculate and write out a \textit{QE} vs \textit{binding energy} curve. A Gaussian broadening of width {\tt photo\_bindenergy\_broadening} is applied. The energy bin width $= 0.001$ eV. The emission angle ranges are limited by the values for the min/max values $\theta$ and $\phi$ set to allow for comparison with ARPES data, $e.g.$ energy distribution curves (EDC). +\item[{\bf --}] \verb#bindenergy_ptrans_map#\\ \\ +Calculate and write a \textit{binding energy} vs \textit{transverse momentum} map as a matrix with the value of each grid point representing the QE contribution at that point. The energy bin width $= 0.001$ eV. The transverse momentum bin width is controlled by {\tt photo\_kmat\_bin\_width}. \\ +A Gaussian broadening of width {\tt photo\_bindenergy\_broadening} is applied. The broadening in \textbf{p} has a FWHM of \nicefrac{1}{2} distance between \textbf{k} points, $i.e.$ a half step between MP grid points. The emission angle ranges are limited by the values for the min/max values $\theta$ and $\phi$ set to allow for comparison with ARPES data. +\item[{\bf --}] \verb#const_bindenergy_p_map#\\ \\ +Calculate and write a {\boldmath $p_x$ vs $p_y$} matrix of grid points where the value at each grid point represents the total QE contribution at a constant binding energy across the entire map. The momentum bin width is controlled by {\tt photo\_kmat\_bin\_width}. The binding energy value is set by {\tt photo\_const\_bindenergy\_value} w.r.t. the Fermi energy ($E_F$).\\ +The contributions are Gaussian broadened in energy with a width of {\tt photo\_bindenergy \_broadening}. The broadening in the {\boldmath $p_x$ vs $p_y$} direction has a FWHM of \nicefrac{1}{2} distance between \textbf{k} points, $i.e.$ a half step between MP grid points. +The emission angle ranges are limited by the values for the min/max values $\theta$ and $\phi$ set to allow for comparison with ARPES data. +\item[{\bf --}] \verb#p_tensor#\\ \\ +Calculate and write a {\boldmath$p_x$,$p_y$,$p_z$} tensor of grid points for electron momenta in \nicefrac{1}{\AA}. Each value at that grid point represents the QE contribution at that specific set of electron momenta values. \\The contributions are Gaussian broadened in {\boldmath$p_x$} and {\boldmath$p_y$} with a FWHM of half a step between k grid points, $i.e.$ MP grid points. In the {\boldmath$p_z$} direction the value {\tt photo\_bindenergy \_broadening} is converted to \nicefrac{1}{\AA}. The ranges for emission angles $\theta$ and $\phi$ can be set to allow for comparison with ARPES data. +\end{itemize} + +\subsection[photo\_theta\_min]{\tt real(kind=dp) :: photo\_theta\_min} +Sets the lower limit of the polar emission angle $\mathbf{\theta}$ for contributions when calculating angle dependent quantities. See {\tt photo\_output} for examples. + +The default value is $0 \degree$ + +\subsection[photo\_theta\_max]{\tt real(kind=dp) :: photo\_theta\_max} +Sets the lower limit of the polar emission angle $\mathbf{\theta}$ for contributions when calculating angle dependent quantities. See {\tt photo\_output} for examples. + +The default value is $90 \degree$ + +\subsection[photo\_phi\_min]{\tt real(kind=dp) :: photo\_phi\_min} +Sets the lower limit of the azimuthal emission angle $\mathbf{\phi}$ for contributions when calculating angle dependent quantities. See {\tt photo\_output} for examples. + +The default value is $0 \degree$ + +\subsection[photo\_phi\_max]{\tt real(kind=dp) :: photo\_phi\_max} +Sets the lower limit of the azimuthal emission angle $\mathbf{\phi}$ for contributions when calculating angle dependent quantities. See {\tt photo\_output} for examples. + +The default value is $90 \degree$ + +\subsection[photo\_bindenergy\_broadening]{\tt real(kind=dp) :: photo\_bindenergy\_broadening} +Sets the Gaussian broadening width in the energy dimension for {\tt photo\_output}. \\ + +The default value is $0.0257$ eV $ = k_b \cdot 298$ K + +\subsection[photo\_pmat\_bind\_width]{\tt real(kind=dp) :: photo\_pmat\_bind\_width} +Sets the bin width in the momentum dimension for {\tt photo\_output}. + +The default value is $0.005$ \nicefrac{1}{\AA} + +\subsection[photo\_const\_bindenergy\_value]{\tt real(kind=dp) :: photo\_const\_bindenergy\_value} +Sets the binding energy value for the {\tt photo\_output} option {\tt const\_bindenergy\_p\_map} w.r.t the Fermi energy. + +The default value is $0.0$ eV, $i.e.$ $E_F$ + +\subsection[photo\_gk\_max\_vectors]{\tt integer :: photo\_gk\_max\_vectors} +The number of {$\mathbf{G + k}$} grid points present in the {\tt SEEDNAME.gkgrid\_bin} file. +If {\tt photo\_momentum} is {\tt gkgrid} this value has to be set. The correct value is printed in the Castep output file when running the Spectral task {\tt PHOTOOPTICS}.\\ + +The default value is 1, $i.e.$ correct behaviour for {\tt photo\_momentum = crystal} + +\subsection[photo\_use\_tmprob]{\tt logical :: photo\_use\_tmprob} +Defines if the probability for transmission across the surface step should be included when calculating the three step model. + +The default value is {\tt True}. This requires a {\tt SEEDNAME.tmprob\_bin} file to be present. \chapter{CASTEP Examples} @@ -1318,13 +1838,13 @@ \section{CORE with Mizoguchi Chemical Shift} \end{verbatim} To run a singlepoint calculation, we want to remove the \verb#CHARGE : +1# that we added in the \verb#.param# file and change the task to \verb#task : singlepoint# so your \verb#NaGe-singlepoint.param# file should look like: \begin{verbatim} -task : singlepoint +task : singlepoint cut_off_energy : 250 eV xc_functional : PBE ! charge : +1 write_checkpoint : None \end{verbatim} -Here we have commented out the line for charge inclusion, and changed the task keyword. Run the \castep\ calculation and compare the ground state total energies of your two different files. You should see that the groundstate energy of -11848.48889250 eV is less than the core hole groundstate energy. +Here we have commented out the line for charge inclusion, and changed the task keyword. Run the \castep\ calculation and compare the ground state total energies of your two different files. You should see that the groundstate energy of -11848.48889250 eV is less than the core hole groundstate energy. \item Now we want to calculate the Mizoguchi chemical shift associated with this difference in energies. To do this, we will use the code located at \verb#tools/miz_chemical_shift#. This code is written in \python\ and you can see the different keywords it takes using the \verb#--help# flag. To calculate the shift for our system we will use the command: \begin{verbatim} ../../tools/miz_chemical_shift -i NaGe -e Ge -s NaGe-singlepoint @@ -1340,6 +1860,180 @@ \section{CORE with Mizoguchi Chemical Shift} Now when we run \optados\ again, the energy scale on the x-axis will be shifted by the amount specified in your input file for \optados\ . This is especially useful when comparing your results to experimental data, as it will allow you to apply a shift to your output from optados into the experimentally relevant energy range. For reference, the known experimental absorption edge for Ge is 11.1031 eV, very close to the shift calculated using the Mizoguchi method. In addition, this is a useful tool when calculating this shift across different core-hole sites in your cell, when your cell has more than one symmetry-inequivalent atom, such that the relative absorption energies of each atom are accounted for. \end{enumerate} +\section{Photoemission} + +This is an example of using photoemission module for calculating the photoemission properties of Cu(100) surface using a 16 atomic layers slab.\\ +\begin{itemize} +\item Input Files +\begin{itemize} +\item \verb#examples/Cu_photo/Cu.cell# - The \castep\ cell file containing information about the simulation cell. +\item \verb#examples/Cu_photo/Cu.param# - The \castep\ parameter file containing information about the parameters for the SCF and spectral calculations. +\item \verb#examples/Cu_photo/Cu.odi# - The \optados\ input file, containing the parameters necessary to run \optados. +\end{itemize} +\end{itemize} + +\begin{enumerate} +%%%% Step 1 %%%%% +\item Perform a \castep\ calculation using the \verb#Cu.cell# and \verb#Cu.param# input files. Slab calculations are time-consuming calculations, a high performing computer should be used. + + \verb#$ castep Cu# + +More help can be found in the tutorials on the \castep\ website \verb#www.castep.org#. + +%%%% Step 2 %%%%% +\item Perform an \optados~calculation. + +\verb#$ optados.x Cu# + +This generates several files: +\begin{itemize} +\item \verb#Cu.odo# -- \optados~general output file. +\item \verb#Cu_bindenergy_curve.dat# -- The Gaussian broadened angle-resolved binding energy spectra raw output data. +\end{itemize} + +%%%% Step 3 %%%%% +\item Open the \verb#Cu.odo# file in a text editor (\emph{$e.g.$} vi or emacs). The relevant \optados~parameters for the optical properties and photoemission are printed. The input file provided creates the following ouput of photoemission parameters: + +\begin{verbatim} ++----------------------- PHOTOEMISSION PARAMETERS ---------------------------+ +| Photoemission Model : 3-Step Model | +| Photoemission Final State : Bloch State | +| *** Including transmission probability across surface *** | +| Photon Energy (eV) : 5.0000 | +| Work Function (eV) : 4.5430 | +| Slab Max Z-Coord. (Ang) : 43.2730 | +| Slab Min Z-Coord. (Ang) : 13.4180 | +| IMFP Constant (Ang) : 5.3000 | +| Bulk cutoff dist. (int. multiple of IMFP) : 10.0 | +| Electric Field Strength (V/Ang) : 0.0000 | +| Smearing Temperature (K) : 300.00 | +| Transverse Momentum Scheme : crystal | +| Theta - min - (deg) : 0.00 | +| Theta - max - (deg) : 90.00 | +| Phi - min - (deg) : 0.00 | +| Phi - max - (deg) : 90.00 | +| Binding Energy Broad. Width (eV) : 0.0257 | ++----------------------------------------------------------------------------+ +\end{verbatim} + +\begin{verbatim} ++----------------------- Electronic Data ------------------------------------+ +| Number of Bands : 190 | +| Grid size : 27 x 27 x 1 | +| Number of K-points : 105 | +| Spin-Polarised Calculation : False | +| Number of electrons : 176.00 | ++----------------------------------------------------------------------------+ +\end{verbatim} + +By default \optados~calculates the Fermi energy from the supplied bands file and the calculated DOS, but can also be supplied by the user. An exemplary output for the calculated Fermi energy this is as follows: + +\begin{verbatim} ++----------------------------- Fermi Energy Analysis ------------------------+ +| From Adaptive broadening | +| Spin Component : 1 occupation between 175.99388 and 176.00354 <- Occ | +| Fermi energy (Adaptive broadening) : 0.1564 eV <- EfA | ++----------------------------------------------------------------------------+ +| Fermi energy from DOS : 0.1564 eV <- EfD | ++----------------------------------------------------------------------------+ + +\end{verbatim} + +Since we had \verb#efermi : optados#, \optados~sets the internal value of the Fermi level to the one it has derived from the DOS. In a slab model, the top and bottom surfaces are equivalent by symmetry and therefore, only the top half is used for the photoemission calculation. + +\begin{verbatim} ++------------------------------- Atomic Order ------------------------------+ +| Atom | Atom Order | Box/Layer | Atom Z-Coordinate (Ang) | +| Cu 1 1 41.6231471 | +| Cu 2 2 39.8961554 | +| Cu 3 3 38.1122009 | +| Cu 4 4 36.3320172 | +| Cu 5 5 34.5547056 | +| Cu 6 6 32.7843275 | +| Cu 7 7 31.0032436 | +| Cu 8 8 29.2256894 | +| Cu 9 27.4397504 | +| Cu 10 25.6609942 | +| Cu 11 23.8772995 | +| Cu 12 22.1048226 | +| Cu 13 20.3261459 | +| Cu 14 18.5453609 | +| Cu 15 16.7608782 | +| Cu 16 15.0335815 | ++----------------------------------------------------------------------------+ +| Max number of atoms: 8 Total number of boxes: 8 | +| Volume of box for layer selection (Ang^3) : 11.33627 | ++----------------------------------------------------------------------------+ +\end{verbatim} + +The optical properties for each of the explicit layers is calculated, but not explicitly printed. To get more info on timing of each step we can use a higher printing level (iprint = 2). We can set the printing level (iprint = 3) to write out files of the relevant optical properties for each layer. An exemplary output for a box/layer is as follows: +\begin{verbatim} ++------------------------ Starting BOX # 1 of 8 ------------------------+ + ++----------------------------------------------------------------------------+ +|max_band_energy (before correction) : 25.987 <-- JDOS Grid | +| efermi : 0.156 <-- JDOS Grid | +| jdos_max_energy : 25.830 <-- JDOS Grid | +| jdos_nbins : 2583 <-- JDOS Grid | +| jdos_spacing : 0.010 <-- JDOS Grid | +| delta_bins : 0.010 <-- JDOS Grid | ++----------------------------------------------------------------------------+ ++------------------------------ Calculate JDOS ------------------------------+ ++----------------------------------------------------------------------------+ ++ Time to calculate Joint Density of States 1.867 (sec) + ++------------ Using atom_volume = 11.33626961 ------------------------+ +\end{verbatim} + +After calculation of the optical properties for a set of energies, we can start calculating the photoemission characteristics for a specific photon energy. We also calculate an approximation for a bulk like slab of material to extend the explicit surface slab layers. Some information on light intensity and electron escape probability of this extended slab is printed: + +\begin{verbatim} ++---------------------- Bulk Approximation Slab Info ------------------------+ +| Number Bulk layers = 29 | +| Vol. per layer = 11.3363 | +| Total Volume = 328.7518 | ++---- P_esc values for an electron with E = E_fermi and E_transverse = 0 ----+ +| Layer # 1 I_light = 0.517860E+00 P_esc = 0.688302E-01 | +| Layer # 2 I_light = 0.501957E+00 P_esc = 0.491400E-01 | +| Layer # 3 I_light = 0.479013E+00 P_esc = 0.350825E-01 | +| ...... | +| Layer # 27 I_light = 0.144792E-02 P_esc = 0.107853E-04 | +| Layer # 28 I_light = 0.935618E-03 P_esc = 0.769998E-05 | +| Layer # 29 I_light = 0.595220E-03 P_esc = 0.549725E-05 | ++----------------------------------------------------------------------------+ +\end{verbatim} + +Finally the layer QE, total QE and MTE are calculated and printed: + +\begin{verbatim} ++----------------------------------------------------------------------------+ +| Work Function 4.5430 eV Photon Energy 5.0000 eV | +| Effective Work Function 4.5430 eV Electric Field 0.0000 V/A | +| Final State : Bloch State | ++----------------------------------------------------------------------------+ +| Atom | Atom Order | Layer | Quantum Efficiency | +| Cu 1 1 0.1220E-006 | +| Cu 2 2 0.3016E-017 | +| Cu 3 3 0.5586E-008 | +| Cu 4 4 0.9952E-008 | +| Cu 5 5 0.1400E-007 | +| Cu 6 6 0.9265E-008 | +| Cu 7 7 0.4518E-008 | +| Cu 8 8 0.1398E-008 | +| Bulk 0.4176E-007 | +| Total Quantum Efficiency (electrons/photon): 0.2085E-006 | +| Weighted Mean Transverse Energy (eV): 0.3414E-001 | ++----------------------------------------------------------------------------+ +\end{verbatim} + +With debug printing {\tt iprint = 3} many more digits are printed.\\ + +%%%% Step 4 %%%%% + +\item With the option \verb#photo_output : bindenergy_curve# a QE vs binding energy curve, also known as energy distribution curve (EDC) for ARPES experiments will be printed. To visualise this file, use: \verb#xmgrace -nxy Cu_bindenergy_curve.dat#. + +\end{enumerate} + + \chapter{ONETEP Examples} \section{(L)PDOS} \onetep\ outputs an \optados\ compatible \verb@seedname_prefix.bands@ file, and from version 4.2 onwards, a \verb@seedname_prefix.pdos_bin@, \verb@seedname_prefix.dome_bin@ and a \verb@seedname-out.cell@ file. Where \verb@prefix@ may be one of \verb@val@, \verb@cond@ or \verb@joint@. @@ -1384,7 +2078,6 @@ \section{EELS/ELNES} %A paper on PDOS in \onetep\ is in preparation. - \chapter{Frequently Asked Questions} \section{\optados\ crashes complaining that it can't read the @@ -1489,7 +2182,7 @@ \section{\texttt{.bands} file} end do end do \end{verbatim} -%\begin{landscape} +\begin{landscape} \section{\texttt{.ome\_bin} file} The \texttt{.ome\_bin} file is required for adaptive and linear broadening, and for optics calculations. % @@ -1519,6 +2212,90 @@ \section{\texttt{.ome\_bin} file} end do \end{verbatim} %\end{landscape} +\clearpage + +\section{\texttt{.fem\_bin} file} +The \texttt{.fem\_bin} file is required for the one step model. +The \texttt{.fem\_bin} file is an unformatted file. +\begin{verbatim} +integer,parameter:: dp=selected_real_kind(15,300) ! Define double precision +real(dp):: file_version=1.0_dp ! File version +character(len=80):: file_header ! File header comment +integer:: num_kpoints ! Number of k-points +integer:: num_spins ! Number of spins +integer:: max_eigenv ! Number of bands included in matrix elements +integer:: num_eigenvalues(1:num_spins) ! Number of eigenvalues per spin channel +! Information on: (num_energy_step, min_e_photon, size_energy_step, +! assumed E_Fermi, assumed E_workfct) +real(dp):: fem_energy_info(5) +! FEMs +complex(dp):: foptical_mat(max_eigenv,1:3,1:num_energy_step,1:num_kpoints,num_spins) + +write(fem_unit) file_version +write(fem_unit) file_header +write(fem_unit) fem_energy_info(1:5) + +do ik=1,num_kpoints + do is=1,num_spins + write(fem_unit) (((foptical_mat(ib,i,ne,ik,is),ib=1,num_eigenvalues(is)),& + i=1,3),ne=1,num_energy_step) + end do +end do +\end{verbatim} + +\clearpage + +\section{\texttt{.tmprob\_bin} file} +The \texttt{.tmprob\_bin} file is required for the three step model if {\tt photo\_use\_tmprob} is {\tt True}. +The \texttt{.tmprob\_bin} file is an unformatted file. +\begin{verbatim} +integer,parameter:: dp=selected_real_kind(15,300) ! Define double precision +real(dp):: file_version=1.0_dp ! File version +character(len=80):: file_header ! File header comment +integer:: num_kpoints ! Number of k-points +integer:: num_spins ! Number of spins +integer:: max_eigenv ! Number of bands included in tmprobs +integer:: num_eigenvalues(1:num_spins) ! Number of eigenvalues per spin channel +complex(dp):: transmit_prob(max_eigenv, num_spins,1:num_kpoints)! OMEs + +write(tmprob_unit) file_version +write(tmprob_unit) file_header + +do ik=1,num_kpoints + do is=1,num_spins + write(tmprob_unit) (transmit_prob(ib,is,ik),ib=1,num_eigenvalues(is)) + end do +end do +\end{verbatim} + +\clearpage + +\section{\texttt{.gkgrid\_bin} file} +The \texttt{.gkgrid\_bin} file is required if {\tt photo\_momentum} is set to {\tt gkgrid}. +The \texttt{.gkgrid\_bin} file is an unformatted file. +\begin{verbatim} +integer,parameter:: dp=selected_real_kind(15,300) ! Define double precision +real(dp):: file_version=1.0_dp ! File version +character(len=80):: file_header ! File header comment +integer:: num_kpoints ! Number of k-points +integer:: num_spins ! Number of spins +integer:: max_eigenv ! Number of bands included in tmprobs +integer:: max_gkgrid ! Number of grid points +integer:: num_eigenvalues(1:num_spins) ! Number of eigenvalues per spin channel +complex(dp):: photo_gkgrid(3,max_gkgrid,max_eigenv,num_spins,num_kpoints)! OMEs + +write(gkgrid_unit) file_version +write(gkgrid_unit) file_header + +do ik=1,num_kpoints + do is=1,num_spins + write(gkgrid_unit) (((photo_gkgrid(i,gdx,ib,is,ik),i=1,3),gdx=1,max_gkgrid),& + ib=1,num_eigenvalues(is)) + end do +end do +\end{verbatim} +\clearpage + %\begin{landscape} \section{\texttt{.pdos\_bin} file} The \texttt{.pdos\_bin} file is required for PDOS calculations. @@ -1548,7 +2325,9 @@ \section{\texttt{.pdos\_bin} file} write(pdos_file) species(1_:num_popn_orb) write(pdos_file) ion(1:num_popn_orb) write(pdos_file) am_channel(1:num_popn_orb) - +\end{verbatim} +\clearpage +\begin{verbatim} do nk=1,num_kpoints write(pdos_file) nk, kpoint_positions(nk,:) do ns = 1,num_spins @@ -1562,8 +2341,8 @@ \section{\texttt{.pdos\_bin} file} \end{verbatim} %\end{landscape} - -\begin{landscape} +\clearpage +% \begin{landscape} \section{\texttt{.elnes\_bin} file} The \texttt{.elnes\_bin} file is required for ELNES calculations. % @@ -1598,6 +2377,62 @@ \section{\texttt{.elnes\_bin} file} end do \end{verbatim} +\section{\texttt{.dome\_bin} file} +The \texttt{.dome\_bin} file contains the first derivative of a band with respect to k. Also known as electron velocity. + +The \texttt{.dome\_bin} file is an unformatted file. +\begin{verbatim} +integer,parameter:: dp=selected_real_kind(15,300) ! Define double precision +real(dp):: file_version=1.0_dp ! File version +character(len=80):: file_header ! File header comment +integer:: num_kpoints ! Number of k-points +integer:: num_spins ! Number of spins +integer:: max_eigenv ! Number of bands included in matrix elements +integer:: num_eigenvalues(1:num_spins) ! Number of eigenvalues per spin channel +real(dp):: band_gradient(max_eigenv,1:3,1:num_kpoints,num_spins)! + +write(gradient_unit) file_version +write(gradient_unit) file_headerphoto_gkgrid + +do ik=1,num_kpoints + do is=1,num_spins + write(gradient_unit) ((band_gradient(ib,i,ik,is),ib=1,num_eigenvalues(is)),i=1,3) + end do +end do +\end{verbatim} + +\clearpage + +\section{\texttt{.effmass\_bin} file} +The \texttt{.effmass\_bin} file contains the second derivative of a band with respect to k. Also known as effective mass. It is currently not used for any application, but this definition is included for future reference. + +The \texttt{.effmass\_bin} file is an unformatted file. +\begin{verbatim} +integer,parameter:: dp=selected_real_kind(15,300) ! Define double precision +real(dp):: file_version=1.0_dp ! File version +character(len=80):: file_header ! File header comment +integer:: num_kpoints ! Number of k-points +integer:: num_spins ! Number of spins +integer:: max_eigenv ! Number of bands included in matrix elements +integer:: num_eigenvalues(1:num_spins) ! Number of eigenvalues per spin channel +real(dp):: band_curvature(max_eigenv,1:3,1:3,1:num_kpoints,num_spins)! OMEs + +write(curvature_unit) file_version +write(curvature_unit) file_header + +do ik=1,num_kpoints + do is=1,num_spins + do ib = 1,nbands + do i = 1,3 + do j= 1,3 + write(curvature_unit) optical_mat(ib,i,j,ik,is) + end do + end do + end do + end do +end do +\end{verbatim} + \end{landscape} \end{appendix} @@ -1605,4 +2440,4 @@ \section{\texttt{.elnes\_bin} file} \end{document} -% LocalWords: odi jdos dos +% LocalWords: odi jdos dos \ No newline at end of file diff --git a/optados/examples/Photoemission/Cu/Cu.cell b/optados/examples/Photoemission/Cu/Cu.cell new file mode 100644 index 00000000..15f1274c --- /dev/null +++ b/optados/examples/Photoemission/Cu/Cu.cell @@ -0,0 +1,30 @@ +%BLOCK LATTICE_CART +2.519427 0.000000 0.000000 +0.000000 2.519427 0.000000 +0.000000 0.000000 56.690974 +%ENDBLOCK LATTICE_CART + +%BLOCK positions_frac + Cu 1.000000000000000 0.000000000000000 0.7342111 + Cu 0.500000000000000 0.500000000000000 0.7037479 + Cu 1.000000000000000 0.000000000000000 0.6722799 + Cu 0.500000000000000 0.500000000000000 0.6408783 + Cu 1.000000000000000 0.000000000000000 0.6095275 + Cu 0.500000000000000 0.500000000000000 0.5782989 + Cu 1.000000000000000 0.000000000000000 0.5468815 + Cu 0.500000000000000 0.500000000000000 0.5155263 + Cu 1.000000000000000 0.000000000000000 0.4840233 + Cu 0.500000000000000 0.500000000000000 0.4526469 + Cu 1.000000000000000 0.000000000000000 0.4211834 + Cu 0.500000000000000 0.500000000000000 0.3899178 + Cu 1.000000000000000 0.000000000000000 0.3585429 + Cu 0.500000000000000 0.500000000000000 0.3271308 + Cu 1.000000000000000 0.000000000000000 0.2956534 + Cu 0.500000000000000 0.500000000000000 0.2651847 +%ENDBLOCK positions_frac + +SYMMETRY_GENERATE +SNAP_TO_SYMMETRY: TRUE +FIX_ALL_CELL: TRUE +KPOINT_MP_GRID: 9 9 1 +SPECTRAL_KPOINT_MP_GRID: 27 27 1 \ No newline at end of file diff --git a/optados/examples/Photoemission/Cu/Cu.odi b/optados/examples/Photoemission/Cu/Cu.odi new file mode 100644 index 00000000..a6eae3f6 --- /dev/null +++ b/optados/examples/Photoemission/Cu/Cu.odi @@ -0,0 +1,23 @@ +task : photoemission +JDOS_SPACING : 0.01 +BROADENING : adaptive +adaptive_smearing : 0.4 +OPTICS_GEOM : unpolar +optics_qdir : 1 1 0 + +photo_model : 3step +photo_photon_energy : 5.0 +# If the task is set to photo_photon_sweep these can be used instead of photo_photon_energy +#photo_photon_min : 4.5 +#photo_photon_max : 8.0 +photo_work_function : 4.54683 +photo_slab_min : 13.41798 +photo_slab_max : 43.27299 +photo_elec_field : 0.00 +photo_imfp_value : 5.3 +photo_momentum : crystal +photo_temperature : 300 +# For photo_momentum = gkgrid this must be set to 49 +photo_gk_max_vectors : 1 + +iprint : 1 \ No newline at end of file diff --git a/optados/examples/Photoemission/Cu/Cu.param b/optados/examples/Photoemission/Cu/Cu.param new file mode 100644 index 00000000..fa99968a --- /dev/null +++ b/optados/examples/Photoemission/Cu/Cu.param @@ -0,0 +1,25 @@ +TASK: SPECTRAL +SPECTRAL_TASK: PHOTOOPTICS +XC_FUNCTIONAL: PBEsol +PERC_EXTRA_BANDS: 50 +ELEC_ENERGY_TOL: 1e-07 eV +MAX_SCF_CYCLES: 1000 +GEOM_MAX_ITER : 100 + +CUT_OFF_ENERGY: 566 eV +MIXING_SCHEME: Pulay +OPT_STRATEGY: Speed +SPIN_POLARIZED: FALSE + +SMEARING_WIDTH: 300.0 K +NUM_DUMP_CYCLES: 0 + +FINE_GRID_SCALE: 3.0 +GRID_SCALE: 2.0 + +IPRINT : 1 + +WRITE_FORMATTED_POTENTIAL : TRUE +WRITE_FORMATTED_DENSITY : TRUE +PDOS_CALCULATE_WEIGHTS : TRUE + diff --git a/optados/ford/project.md b/optados/ford/project.md index f6940b89..6613e664 100644 --- a/optados/ford/project.md +++ b/optados/ford/project.md @@ -11,7 +11,9 @@ sort: permission-alpha source: true coloured_edges: true graph: true +display: public + #private For high quality theoretical DOS, Projected-DOS, Joint-DOS, Optics and core-loss spectroscopy. -A collaboration between the Departments of Materials at the Unvieristies of Birmimgham, Oxford and Cambridge. +A collaboration between the Departments of Materials at the Universities of Birmimgham, Oxford and Cambridge. diff --git a/optados/make.system b/optados/make.system index 06819acd..eebd09de 100644 --- a/optados/make.system +++ b/optados/make.system @@ -17,7 +17,7 @@ PREFIX := $(strip $(PREFIX)) EXE_SUFFIX := .x86_64 #------------------------------------------- -# T H I N G S Y O U M I G H T W A N T +# T H I N G S Y O U M I G H T W A N T # T O F I D D L E W I T H export PYTHON_VER := python3 @@ -34,27 +34,27 @@ endif ifeq ($(SYSTEM), gfortran) F90_SERIAL= gfortran - F90_PARALLEL= mpif90 + F90_PARALLEL= mpif90 FFLAGS= -fconvert=big-endian -fPIC FFLAGS_PARALLEL= -DMPI FFLAGS_FAST= -O3 - FFLAGS_DEBUG= -O0 -g -fcheck=all + FFLAGS_DEBUG= -O0 -g -fcheck=all EXTENSION=.gfortran endif ifeq ($(SYSTEM), nag) F90_SERIAL= nagfor F90_PARALLEL= mpif90 - FFLAGS= -DNAG + FFLAGS= -DNAG FFLAGS_PARALLEL= - FFLAGS_FAST= -O3 -Oassumed -w=all -ieee=full - FFLAGS_DEBUG= -Ddebug -g -O0 -pg -C=all -gline -w=all -ieee=full + FFLAGS_FAST= -O3 -Oassumed -w=all -ieee=full + FFLAGS_DEBUG= -Ddebug -g -O0 -pg -C=all -gline -w=all -ieee=full EXTENSION=.nag endif ifeq ($(SYSTEM), ifort) F90_SERIAL= ifort - F90_PARALLEL= mpif90 + F90_PARALLEL= mpif90 FFLAGS= -convert big_endian FFLAGS_PARALLEL= -DMPI FFLAGS_FAST= -O3 @@ -64,7 +64,7 @@ endif ifeq ($(SYSTEM), pathscale) F90_SERIAL= pathf95 - F90_PARALLEL= mpif90 + F90_PARALLEL= mpif90 FFLAGS= -byteswapio FFLAGS_PARALLEL= -DMPI FFLAGS_FAST= -O3 -OPT:Ofast -ffast-math -OPT:recip=ON -OPT:malloc_algorithm=1 @@ -76,18 +76,18 @@ ifeq ($(SYSTEM), pgf90) F90_SERIAL= pgf90 F90_PARALLEL= mpif90 FFLAGS= -Mbyteswapio - FFLAGS_PARALLEL= -DMPI + FFLAGS_PARALLEL= -DMPI FFLAGS_FAST= -O3 - FFLAGS_DEBUG= -O0 -C -pg -g -Mbounds + FFLAGS_DEBUG= -O0 -C -pg -g -Mbounds EXTENSION=.pgf90 endif ifeq ($(SYSTEM), sun) F90_SERIAL= sunf95 F90_PARALLEL= mpif90 - FFLAGS= + FFLAGS= FFLAGS_PARALLEL= -DMPI - FFLAGS_FAST= + FFLAGS_FAST= FFLAGS_DEBUG= -O0 -C -pg -g EXTENSION=.sunf95 endif diff --git a/optados/src/Makefile b/optados/src/Makefile index 03c1bbfc..f3da2fd9 100644 --- a/optados/src/Makefile +++ b/optados/src/Makefile @@ -13,6 +13,7 @@ ifeq ($(BUILD), debug) EXTENSION:=.debug else FFLAGS+=$(FFLAGS_FAST) + EXTENSION:=.x endif @@ -24,11 +25,11 @@ else F90:=$(F90_SERIAL) endif -#EXTENSION:=$(EXTENSION)$(EXE_SUFFIX) -EXTENSION:=.x +EXTENSION:=$(EXTENSION)$(EXE_SUFFIX) +#EXTENSION:=.x # Put object names here -OBJS=build.o algorithms.o cell.o comms.o constants.o core.o dos.o dos_utils.o electronic.o io.o jdos.o jdos_utils.o optics.o parameters.o pdos.o pdis.o projection_utils.o xmgrace_utils.o +OBJS=build.o algorithms.o cell.o comms.o constants.o core.o dos.o dos_utils.o electronic.o io.o jdos.o jdos_utils.o optics.o parameters.o pdos.o pdis.o projection_utils.o xmgrace_utils.o photo.o all : optados tools @@ -38,7 +39,7 @@ od2od : od2od.f90 $(OBJS) ../make.system $(F90) $(FFLAGS) $< $(OBJS) -o ../od2od optados : optados.f90 $(OBJS) ../make.system - $(F90) $(FFLAGS) $< $(OBJS) -o ../optados$(EXTENSION) + $(F90) $(FFLAGS) $< $(OBJS) -o $(PREFIX)optados$(EXTENSION) algorithms.o : algorithms.f90 io.o constants.o ../make.system $(F90) -c $(FFLAGS) $< @@ -85,6 +86,9 @@ pdos.o : pdos.F90 projection_utils.o cell.o comms.o constants.o io.o dos.o elect pdis.o : pdis.f90 projection_utils.o cell.o comms.o constants.o io.o dos.o electronic.o ../make.system $(F90) -c $(FFLAGS) $< +photo.o : photo.f90 comms.o constants.o io.o electronic.o jdos_utils.o cell.o parameters.o xmgrace_utils.o ../make.system + $(F90) -c $(FFLAGS) $< + projection_utils.o : projection_utils.f90 cell.o comms.o constants.o cell.o electronic.o io.o parameters.o ../make.system $(F90) -c $(FFLAGS) $< @@ -108,7 +112,7 @@ clean: veryclean: clean - rm -f optados$(EXTENSION) optados$(EXTENSION).debug optados$(EXTENSION).mpi ../od2od ../optados.x + rm -f optados$(EXTENSION) optados$(EXTENSION).debug optados$(EXTENSION).mpi ../od2od ../optados.x ../optados.mpi ../optados.debug install: cp optados$(EXTENSION) $(INSTALL_DIR) diff --git a/optados/src/algorithms.f90 b/optados/src/algorithms.f90 index 11f4f54e..381dd0c2 100644 --- a/optados/src/algorithms.f90 +++ b/optados/src/algorithms.f90 @@ -43,6 +43,8 @@ module od_algorithms public :: utility_lowercase public :: utility_cart_to_frac public :: utility_frac_to_cart + public :: utility_reciprocal_frac_to_cart + public :: utility_reciprocal_cart_to_frac public :: channel_to_am public :: algorithms_erf public :: algor_dist_array @@ -249,6 +251,57 @@ subroutine utility_cart_to_frac(cart, frac, recip_lat) end subroutine utility_cart_to_frac + !=================================================================== + subroutine utility_reciprocal_frac_to_cart(frac_rec, cart_rec, recip_lattice) + !==================================================================! + ! ! + ! Convert k points from fractional to Cartesian coordinates ! + ! ! + !=================================================================== + + implicit none + + real(kind=dp), intent(in) :: recip_lattice(3, 3) + real(kind=dp), intent(in) :: frac_rec(3) + real(kind=dp), intent(out) :: cart_rec(3) + + integer :: i + + do i = 1, 3 + cart_rec(i) = recip_lattice(1, i)*frac_rec(1) + recip_lattice(2, i)*frac_rec(2) + recip_lattice(3, i)*frac_rec(3) + end do + + return + + end subroutine utility_reciprocal_frac_to_cart + + !=================================================================== + subroutine utility_reciprocal_cart_to_frac(cart, frac, real_lattice) + !==================================================================! + ! ! + ! Convert from fractional to Cartesian coordinates in reicprocal ! + ! ! + !=================================================================== + use od_constants, only: twopi + implicit none + + real(kind=dp), intent(in) :: real_lattice(3, 3) + real(kind=dp), intent(out) :: frac(3) + real(kind=dp), intent(in) :: cart(3) + + integer :: i + + do i = 1, 3 + frac(i) = real_lattice(1, i)*cart(1) + real_lattice(2, i)*cart(2) + real_lattice(3, i)*cart(3) + + end do + + frac = frac/twopi + + return + + end subroutine utility_reciprocal_cart_to_frac + function algorithms_erf(x) ! Calculate the error function ! From the NSWC Mathematics Subroutine Library diff --git a/optados/src/build.f90 b/optados/src/build.f90 new file mode 100644 index 00000000..078fdf51 --- /dev/null +++ b/optados/src/build.f90 @@ -0,0 +1,17 @@ +module od_build + implicit none + + private ! unless otherwise stated + + type, public :: build_info_type + character(len=20) :: build = '' + character(len=20) :: compiler = 'gfortran' + character(len=20) :: build_type = 'debug' + character(len=20) :: comms_arch = 'serial' + character(len=20) :: source_time = '16:47:50' + character(len=20) :: source_date = 'Mon 28 Aug 2023' + character(len=20) :: compile_date = 'Mon 28 Aug 2023' + character(len=20) :: compile_time = '16:49 BST' + end type build_info_type + type(build_info_type), public, save :: build_info +end module od_build diff --git a/optados/src/cell.f90 b/optados/src/cell.f90 index d74ec0ac..a00ae434 100644 --- a/optados/src/cell.f90 +++ b/optados/src/cell.f90 @@ -69,6 +69,10 @@ module od_cell character(len=2), allocatable, public, save :: atoms_symbol(:) integer, public, save :: num_atoms integer, public, save :: num_species + character(len=maxlen), allocatable, public, save :: atoms_label_tmp(:) + + ! Added for photoemission + real(kind=dp), allocatable, public, save :: atoms_pos_cart_photo(:, :) !-------------------------------------------------------------------------! ! G L O B A L L Y A V A I L A B L E F U N C T I O N S @@ -79,6 +83,9 @@ module od_cell public :: cell_read_cell public :: cell_get_symmetry public :: cell_dist + ! Added for photoemission + public :: cell_get_real_lattice + public :: cell_calc_kpoint_r_cart !-------------------------------------------------------------------------! contains @@ -418,7 +425,7 @@ subroutine cell_read_cell logical :: found_e, found_s, frac character(len=maxlen) :: dummy character(len=maxlen), allocatable :: ctemp(:) - character(len=maxlen), allocatable :: atoms_label_tmp(:) + !character(len=maxlen), allocatable :: atoms_label_tmp(:) logical :: lconvert character(len=maxlen), allocatable :: in_data(:) @@ -554,6 +561,7 @@ subroutine cell_read_cell atoms_pos_cart_tmp = atoms_pos_cart_tmp*bohr2ang end if + call cell_get_real_lattice if (frac) then do loop = 1, num_atoms call utility_frac_to_cart(atoms_pos_frac_tmp(:, loop), atoms_pos_cart_tmp(:, loop), real_lattice) @@ -599,6 +607,11 @@ subroutine cell_read_cell if (ierr /= 0) call io_error('Error allocating atoms_pos_frac in cell_get_atoms') allocate (atoms_pos_cart(3, max_sites, num_species), stat=ierr) if (ierr /= 0) call io_error('Error allocating atoms_pos_cart in cell_get_atoms') + allocate (atoms_pos_cart_photo(3, num_atoms), stat=ierr) + if (ierr /= 0) call io_error('Error allocating atoms_pos_cart_photo in cell_get_atoms') + + ! Making a copy to use in the photo.f90 subroutine "analyse_geometry" + atoms_pos_cart_photo = atoms_pos_cart_tmp do loop = 1, num_species counter = 0 @@ -849,6 +862,8 @@ subroutine cell_get_atoms atoms_pos_cart_tmp = atoms_pos_cart_tmp*bohr2ang end if + call cell_get_real_lattice + if (frac) then do loop = 1, num_atoms call utility_frac_to_cart(atoms_pos_frac_tmp(:, loop), atoms_pos_cart_tmp(:, loop), real_lattice) @@ -946,6 +961,8 @@ subroutine cell_calc_lattice ! THESE ARE IN BOHR, DON'T GET TRIPPED UP AGAIN! real_lattice = real_lattice*bohr2ang + call cell_get_real_lattice + recip_lattice(1, 1) = real_lattice(2, 2)*real_lattice(3, 3) - & real_lattice(3, 2)*real_lattice(2, 3) recip_lattice(2, 1) = real_lattice(2, 3)*real_lattice(3, 1) - & @@ -1067,11 +1084,19 @@ subroutine cell_dist if (ierr /= 0) call io_error('Error allocating atoms_label in cell_dist') allocate (atoms_symbol(num_species), stat=ierr) if (ierr /= 0) call io_error('Error allocating atoms_symbol in cell_dist') + ! For Photoemission + allocate (atoms_pos_cart_photo(3, num_atoms), stat=ierr) + if (ierr /= 0) call io_error('Error allocating atoms_pos_cart_photo in cell_dist') + allocate (atoms_label_tmp(num_atoms), stat=ierr) + if (ierr /= 0) call io_error('Error allocating atoms_label_tmp in cell_dist') end if call comms_bcast(atoms_pos_frac(1, 1, 1), 3*num_species*max_sites) call comms_bcast(atoms_pos_cart(1, 1, 1), 3*num_species*max_sites) call comms_bcast(atoms_label(1), len(atoms_label(1))*num_species) call comms_bcast(atoms_symbol(1), len(atoms_symbol(1))*num_species) + ! For Photoemission + call comms_bcast(atoms_pos_cart_photo(1, 1), 3*num_atoms) + call comms_bcast(atoms_label_tmp(1), maxlen*num_atoms) end if call comms_bcast(num_crystal_symmetry_operations, 1) if (num_crystal_symmetry_operations > 0) then @@ -1087,4 +1112,102 @@ subroutine cell_dist end subroutine cell_dist + !=========================================================================! + subroutine cell_get_real_lattice + !========================================================================= + ! This subroutine reads the lattice parameters from the bands file in + ! order to have them stored when the frac_to_cart and cart_frac subroutines + ! are called. Independently of having used the elec_read_band_energy + ! subroutine before. + + use od_comms, only: on_root + use od_io, only: io_file_unit, seedname, filename_len, stdout, io_time, & + io_error + use od_constants, only: bohr2ang + + integer :: band_unit + character(filename_len) :: band_filename + + !Open the bands file + band_unit = io_file_unit() + band_filename = trim(seedname)//".bands" +! print*,'band_filename=',band_filename + + ! Read the header from the bands file + if (on_root) then + open (unit=band_unit, file=band_filename, status="old", form='formatted')!,err=100) +!100 call io_error('Error: Problem opening bands file in cell_get_real_lattice') + read (band_unit, *) + read (band_unit, *) + read (band_unit, *) + read (band_unit, *) + read (band_unit, *) + read (band_unit, *) + read (band_unit, *) real_lattice(:, 1) + read (band_unit, *) real_lattice(:, 2) + read (band_unit, *) real_lattice(:, 3) + end if + real_lattice = real_lattice*bohr2ang + if (on_root) close (unit=band_unit) + + end subroutine cell_get_real_lattice + + !=========================================================================! + subroutine cell_calc_kpoint_r_cart + !========================================================================= + ! This subroutine calculates the cartesian coordinates of the k points + use od_algorithms, only: utility_reciprocal_frac_to_cart + use od_comms, only: my_node_id + use od_io, only: io_file_unit, seedname, filename_len, stdout, io_time, & + io_error +! use od_electronic, only : elec_read_band_energy + + integer :: i, ik, loop, ierr + real(kind=dp), allocatable, dimension(:, :) :: kpoint_r_tmp + real(kind=dp), allocatable, dimension(:, :) :: kpoint_r_cart_tmp + + allocate (kpoint_r_tmp(3, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error allocating kpoint_r_tmp in& +& cell_calc_kpoint_r_cart') + allocate (kpoint_r_cart_tmp(3, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error allocating kpoint_r_cart_tmp in& +& cell_calc_kpoint_r_cart') + + kpoint_r_tmp = kpoint_r + + !This is to be sure that the k point fractional coordinates are stored. + !If they are, the elec_read_band_energy will return. +! call elec_read_band_energy + + ! We will call this only if we have not read in the cell before. With a parallel build + ! the non root nodes would not get the updated cell and perform another bohr2ang + ! conversion. If I try to insert a comms_bcast in the cell_get_ + ! F.Mildner 04/2023 + if (.not. abs(cell_volume) .gt. 0.0_dp) then + call cell_get_real_lattice + call cell_calc_lattice + end if + do loop = 1, num_kpoints_on_node(my_node_id) + call utility_reciprocal_frac_to_cart(kpoint_r_tmp(:, loop), kpoint_r_cart_tmp(:, loop), recip_lattice) +! print*,kpoint_r_tmp(1,loop),kpoint_r_tmp(2,loop),kpoint_r_tmp(3,loop),& +! kpoint_r_cart_tmp(1,loop),kpoint_r_cart_tmp(2,loop),kpoint_r_cart_tmp(3,loop) +!print*,loop,kpoint_r_cart_tmp(:,loop),recip_lattice + end do + + kpoint_r_cart = kpoint_r_cart_tmp +! do loop=1,num_kpoints_on_node(my_node_id) +! print*,kpoint_r_tmp(1,loop),kpoint_r_cart(1,loop),& +! kpoint_r_tmp(2,loop),kpoint_r_cart(2,loop),& +! kpoint_r_tmp(3,loop),kpoint_r_cart(3,loop) +! end do + + deallocate (kpoint_r_tmp, stat=ierr) + if (ierr /= 0) call io_error('Error: cell_calc_kpoint_r_cart - & +& failed to deallocate kpoint_r_tmp') + + deallocate (kpoint_r_cart_tmp, stat=ierr) + if (ierr /= 0) call io_error('Error: cell_calc_kpoint_r_cart - & +& failed to deallocate kpoint_r_cart_tmp') + + end subroutine cell_calc_kpoint_r_cart end module od_cell diff --git a/optados/src/comms.F90 b/optados/src/comms.F90 index 1b77df7d..2a6c3af2 100644 --- a/optados/src/comms.F90 +++ b/optados/src/comms.F90 @@ -535,6 +535,8 @@ subroutine comms_reduce_int(array, size, op) call MPI_reduce(array, array_red, size, MPI_integer, MPI_sum, 0, mpi_comm_world, error) case ('PRD') call MPI_reduce(array, array_red, size, MPI_integer, MPI_prod, 0, mpi_comm_world, error) + case ('MAX') + call MPI_reduce(array, array_red, size, MPI_integer, MPI_max, 0, mpi_comm_world, error) case default print *, 'Unknown operation in comms_reduce_int' call comms_error diff --git a/optados/src/constants.f90 b/optados/src/constants.f90 index 94d4e6ea..56e1628c 100644 --- a/optados/src/constants.f90 +++ b/optados/src/constants.f90 @@ -48,6 +48,33 @@ module od_constants complex(dp), parameter, public :: cmplx_0 = (0.0_dp, 0.0_dp) complex(dp), parameter, public :: cmplx_i = (0.0_dp, 1.0_dp) + !Optics constants + real(kind=dp), parameter, public :: epsilon_0 = 8.8541878176E-12_dp + real(kind=dp), parameter, public :: e_charge = 1.602176487E-19_dp + real(kind=dp), parameter, public :: e_mass = 9.10938215E-31_dp + real(kind=dp), parameter, public :: hbar = 1.054571628E-34_dp + real(kind=dp), parameter, public :: c_speed = 299792458.0_dp + + !Photoemission constants + real(kind=dp), parameter, public :: epsilon_zero = 55.26349406_dp !e^2 GeV^-1 fm^-1 + real(kind=dp), parameter, public :: j_to_ev = 6.24150934E+18_dp !J eV^-1 + real(kind=dp), parameter, public :: ev_to_j = 1.602176565E-19_dp !eV J^-1 + real(kind=dp), parameter, public :: ev_to_hartree = 0.03674932379_dp !eV Ha^-1 + real(kind=dp), parameter, public :: rad_to_deg = 57.2957795_dp !deg rad^-1 + real(kind=dp), parameter, public :: deg_to_rad = 0.0174532925_dp !rad^-1 to deg + real(kind=dp), parameter, public :: boltzmann = 1.38064852E-23_dp !J K^-1 + real(kind=dp), parameter, public :: kB = 8.617333262E-5_dp ! ev K^-1 + ! Constants for field emission in Photoemission Module + real(kind=dp), parameter, public :: b_factor = 0.6830890_dp ! eV^(-3/2) V A^-1 + real(kind=dp), parameter, public :: p1 = 0.03270530446_dp + real(kind=dp), parameter, public :: p2 = 0.009157798739_dp + real(kind=dp), parameter, public :: p3 = 0.002644272807_dp + real(kind=dp), parameter, public :: p4 = 0.00008987173811_dp + real(kind=dp), parameter, public :: q1 = 0.1874993441_dp + real(kind=dp), parameter, public :: q2 = 0.01750636947_dp + real(kind=dp), parameter, public :: q3 = 0.005527069444_dp + real(kind=dp), parameter, public :: q4 = 0.001023904180_dp + character(len=3), parameter, dimension(109), public :: periodic_table_name = (/ & & 'H ', 'He', & & 'Li', 'Be', 'B ', 'C ', 'N ', 'O ', 'F ', 'Ne', & @@ -61,4 +88,24 @@ module od_constants & 'Ac', 'Th', 'Pa', 'U ', 'Np', 'Pu', 'Am', 'Cm', 'Bk', 'Cf', 'Es', 'Fm', 'Md', 'No', 'Lr', & & 'Rf', 'Db', 'Sg', 'Bh', 'Hs', 'Mt'/) + ! Based on: S. Alvarez, Dalton Transactions, 2013, 42, 8617-8636. + ! If value == 1.0_dp then no value was supplied, subject to change + real(kind=dp), parameter, dimension(109), public :: periodic_table_vdw = (/ & + & 1.20_dp, 1.43_dp, & + & 2.12_dp, 1.98_dp, 1.91_dp, 1.77_dp, 1.66_dp, 1.50_dp, 1.46_dp, 1.58_dp, & + & 2.50_dp, 2.51_dp, 2.25_dp, 2.19_dp, 1.90_dp, 1.89_dp, 1.82_dp, 1.83_dp, & + & 2.73_dp, 2.62_dp, 2.58_dp, 2.46_dp, 2.42_dp, 2.45_dp, 2.45_dp, 2.44_dp, 2.40_dp, 2.40_dp, 2.38_dp, 2.39_dp, 2.32_dp, & + & 2.29_dp, 1.88_dp, 1.82_dp, 1.86_dp, 2.25_dp, & + & 3.21_dp, 2.84_dp, 2.75_dp, 2.52_dp, 2.56_dp, 2.45_dp, 2.44_dp, 2.46_dp, 2.44_dp, 2.15_dp, 2.53_dp, 2.49_dp, 2.43_dp, & + & 2.42_dp, 2.47_dp, 1.99_dp, 2.04_dp, 2.06_dp, & + & 3.48_dp, 3.03_dp, & + & 2.98_dp, 2.88_dp, 2.92_dp, 2.95_dp, 1.0_dp, 2.90_dp, 2.87_dp, 2.83_dp, 2.79_dp, 2.87_dp, 2.81_dp, 2.83_dp, 2.79_dp, & + & 2.80_dp, 2.74_dp, & + & 2.63_dp, 2.53_dp, 2.57_dp, 2.49_dp, 2.48_dp, 2.41_dp, 2.29_dp, 2.32_dp, 2.45_dp, 2.47_dp, 2.60_dp, 2.54_dp, 1.0_dp, & + & 1.0_dp, 1.0_dp, & + & 1.0_dp, 1.0_dp, & + & 2.8_dp, 2.93_dp, 2.88_dp, 2.71_dp, 2.82_dp, 2.81_dp, 2.83_dp, 3.05_dp, 3.4_dp, 3.05_dp, 2.7_dp, 1.0_dp, 1.0_dp, 1.0_dp,& + & 1.0_dp, & + & 1.0_dp, 1.0_dp, 1.0_dp, 1.0_dp, 1.0_dp, 1.0_dp/) + end module od_constants diff --git a/optados/src/core.f90 b/optados/src/core.f90 index 158cb46a..d7903328 100644 --- a/optados/src/core.f90 +++ b/optados/src/core.f90 @@ -83,10 +83,10 @@ end subroutine core_calculate subroutine core_prepare_matrix_elements use od_electronic, only: elnes_mat, elnes_mwab, nbands, nspins, num_electrons, electrons_per_state, & - efermi, band_energy + efermi, band_energy use od_comms, only: my_node_id use od_cell, only: num_kpoints_on_node, cell_get_symmetry, & - num_crystal_symmetry_operations, crystal_symmetry_operations + num_crystal_symmetry_operations, crystal_symmetry_operations use od_parameters, only: core_geom, core_qdir, core_type, legacy_file_format, devel_flag use od_io, only: io_error @@ -176,8 +176,8 @@ subroutine write_core use od_constants, only: bohr2ang, periodic_table_name, pi use od_parameters, only: dos_nbins, core_LAI_broadening, LAI_gaussian, LAI_gaussian_width, & - LAI_lorentzian, LAI_lorentzian_scale, LAI_lorentzian_width, LAI_lorentzian_offset, output_format, & - set_efermi_zero, core_chemical_shift + LAI_lorentzian, LAI_lorentzian_scale, LAI_lorentzian_width, LAI_lorentzian_offset, output_format, & + set_efermi_zero, core_chemical_shift use od_electronic, only: elnes_mwab, elnes_orbital, efermi, efermi_set, nspins use od_io, only: seedname, io_file_unit, io_error use od_dos_utils, only: E, dos_utils_set_efermi, vbm_energy, cbm_energy @@ -698,7 +698,7 @@ subroutine core_lorentzian use od_constants, only: pi, dp use od_parameters, only: LAI_lorentzian_width, LAI_lorentzian_scale, LAI_lorentzian_offset, & - LAI_gaussian_width, dos_nbins, LAI_gaussian, adaptive, linear, fixed + LAI_gaussian_width, dos_nbins, LAI_gaussian, adaptive, linear, fixed use od_dos_utils, only: E use od_electronic, only: nspins, elnes_mwab, efermi use od_dos_utils, only: efermi_fixed, efermi_adaptive, efermi_linear diff --git a/optados/src/dos_utils.f90 b/optados/src/dos_utils.f90 index 41f74143..7cbe60b5 100644 --- a/optados/src/dos_utils.f90 +++ b/optados/src/dos_utils.f90 @@ -997,8 +997,8 @@ subroutine setup_energy_scale end do if (on_root .and. (iprint > 2)) then - write (stdout, '(1x,1a,a39,e11.5,13x,a14)') '|', 'dos_min_energy : ', dos_min_energy, "<-- DOS Grid |" - write (stdout, '(1x,1a,a39,e11.5,13x,a14)') '|', 'dos_max_energy : ', dos_max_energy, "<-- DOS Grid |" + write (stdout, '(1x,1a,a39,e12.5,12x,a14)') '|', 'dos_min_energy : ', dos_min_energy, "<-- DOS Grid |" + write (stdout, '(1x,1a,a39,e12.5,12x,a14)') '|', 'dos_max_energy : ', dos_max_energy, "<-- DOS Grid |" write (stdout, '(1x,1a,a39,f11.3,13x,a14)') '|', 'min_band_energy : ', min_band_energy, "<-- DOS Grid |" write (stdout, '(1x,1a,a39,f11.3,13x,a14)') '|', 'max_band_energy : ', max_band_energy, "<-- DOS Grid |" write (stdout, '(1x,1a,a39,i11,13x,a14)') '|', 'dos_nbins : ', dos_nbins, "<-- DOS Grid |" diff --git a/optados/src/electronic.f90 b/optados/src/electronic.f90 index 09fa703f..8f2986a2 100644 --- a/optados/src/electronic.f90 +++ b/optados/src/electronic.f90 @@ -40,6 +40,19 @@ module od_electronic complex(kind=dp), allocatable, public, save :: optical_mat(:, :, :, :, :) complex(kind=dp), allocatable, public, save :: elnes_mat(:, :, :, :, :) + !Additional variables for photoemission.- V.Chang Nov-2020, + real(kind=dp), allocatable, public, save :: band_curvature(:, :, :, :, :) + complex(kind=dp), allocatable, public, save :: foptical_mat(:, :, :, :, :) + ! F. Mildner April-2023 + character(len=80), public, save :: femfile_header + ! fem_energy_info: energy_count, energy_min, energy_step, energy_fermi, energy_workfct + real(kind=dp), dimension(5), public, save :: fem_energy_info + ! F.Mildner Feb/Mar-2025 + real(kind=dp), allocatable, public, save :: transmit_prob(:, :, :) + character(len=80), public, save :: tmprob_file_header + real(kind=dp), allocatable, public, save :: photo_gkgrid(:, :, :, :, :) + character(len=80), public, save :: photo_gkgrid_file_header + real(kind=dp), public, save :: efermi ! The fermi energy we finally decide on logical, public, save :: efermi_set = .false. ! Have we set efermi? real(kind=dp), public, save :: unshifted_efermi ! The fermi energy we finally decide on, perhaps not set to 0 @@ -114,6 +127,12 @@ module od_electronic public :: elec_elnes_find_channel_names public :: elec_elnes_find_channel_numbers + !Additional functions for photoemission - V.Chang Nov-2020, F.Mildner after Jun 2023 + public :: elec_read_band_curvature + public :: elec_read_foptical_mat + public :: elec_read_transmit_prob + public :: elec_read_gk_grid_points + !-------------------------------------------------------------------------! contains @@ -219,8 +238,8 @@ subroutine elec_read_band_gradient time0 = io_time() if (on_root) then - if (iprint > 1) write (stdout, '(a)') ' ' - if (iprint > 1) write (stdout, '(a)') ' Reading band gradients from file: '//trim(gradient_filename) + if (iprint > 1) write (stdout, '(1x,a)') ' ' + if (iprint > 1) write (stdout, '(1x,a)') ' Reading band gradients from file: '//trim(gradient_filename) gradient_unit = io_file_unit() if (index(devel_flag, 'old_filename') > 0 .or. legacy_file_format) then gradient_filename = trim(seedname)//".cst_vel" @@ -232,13 +251,13 @@ subroutine elec_read_band_gradient if ((file_version - file_ver) > 0.001_dp) & call io_error('Error: Trying to read newer version of dome_bin file. Update optados!') read (gradient_unit) domefile_header - if (iprint > 1) write (stdout, *) trim(domefile_header) + if (iprint > 1) write (stdout, '(1x,a)') trim(domefile_header) end if end if ! Figure out how many kpoint should be on each node call algor_dist_array(nkpoints, num_kpoints_on_node) - allocate (band_gradient(1:nbands, 1:3, 1:num_kpoints_on_node(0), 1:nspins), stat=ierr) + allocate (band_gradient(1:nbands, 1:3, 1:num_kpoints_on_node(my_node_id), 1:nspins), stat=ierr) if (ierr /= 0) call io_error('Error: Problem allocating band_gradient in elec_read_band_gradient') band_gradient = 0.0_dp @@ -249,7 +268,7 @@ subroutine elec_read_band_gradient read (gradient_unit) ((band_gradient(ib, i, ik, is), ib=1, nbands), i=1, 3) end do end do - call comms_send(band_gradient(1, 1, 1, 1), nbands*3*nspins*num_kpoints_on_node(0), inodes) + call comms_send(band_gradient(1, 1, 1, 1), nbands*3*nspins*num_kpoints_on_node(inodes), inodes) end do do ik = 1, num_kpoints_on_node(0) do is = 1, nspins @@ -259,7 +278,7 @@ subroutine elec_read_band_gradient end if if (.not. on_root) then - call comms_recv(band_gradient(1, 1, 1, 1), nbands*3*nspins*num_kpoints_on_node(0), root_id) + call comms_recv(band_gradient(1, 1, 1, 1), nbands*3*nspins*num_kpoints_on_node(my_node_id), root_id) end if ! write(*,*) "I'm node", my_node_id, "k-pts:", num_kpoints_on_node(my_node_id),"bgarray:", & @@ -271,10 +290,12 @@ subroutine elec_read_band_gradient band_gradient = band_gradient*bohr2ang*H2eV time1 = io_time() - if (on_root .and. iprint > 1) write (stdout, '(1x,a40,f11.3,a)') 'Time to read band gradients ', time1 - time0, ' (sec)' + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a30,29x,f11.3,a8)') '+ Time to read band gradients ', time1 - time0, ' (sec) +' + end if else ! lets try to get the data from the cst_ome file - allocate (band_gradient(1:nbands, 1:3, 1:num_kpoints_on_node(0), 1:nspins), stat=ierr) + allocate (band_gradient(1:nbands, 1:3, 1:num_kpoints_on_node(my_node_id), 1:nspins), stat=ierr) if (ierr /= 0) call io_error('Error: Problem allocating band_gradient (b) in elec_read_band_gradient') if (allocated(optical_mat)) then @@ -298,6 +319,122 @@ subroutine elec_read_band_gradient end subroutine elec_read_band_gradient + !========================================================================= + subroutine elec_read_band_curvature + !========================================================================= + ! Read the .ddome file in paralell if appropriate. These are the + ! curvatures of the bands at each kpoint. + !------------------------------------------------------------------------- + ! Arguments: None + !------------------------------------------------------------------------- + ! Parent module variables: band_curvature,nspins,nbands + !------------------------------------------------------------------------- + ! Modules used: See below + !------------------------------------------------------------------------- + ! Key Internal Variables: None + !------------------------------------------------------------------------- + ! Necessary conditions: None + !------------------------------------------------------------------------- + ! Known Worries: None + !------------------------------------------------------------------------- + ! Written by V Chang Nov 2020 + !========================================================================= + use od_comms, only: on_root, my_node_id, num_nodes, root_id,& + & comms_recv, comms_send, comms_bcast + use od_io, only: io_time, filename_len, seedname, stdout, io_file_unit,& + & io_error + use od_cell, only: num_kpoints_on_node, nkpoints + use od_constants, only: bohr2ang, H2eV + use od_parameters, only: legacy_file_format, iprint, devel_flag + use od_algorithms, only: algor_dist_array + implicit none + + integer :: curvature_unit, i, j, ib, jb, is, ik, inodes, ierr, loop + character(filename_len) :: curvature_filename + character(len=80) :: header + logical :: exists + real(kind=dp) :: time0, time1, file_version + real(kind=dp), parameter :: file_ver = 1.0_dp + ! Check that we haven't already done this. + if (allocated(band_curvature)) return + + ! first try to read a effective mass file + + curvature_filename = trim(seedname)//".ddome_bin" + + if (on_root) inquire (file=curvature_filename, exist=exists) + call comms_bcast(exists, 1) + + if (exists) then ! good. We are reading from a velocity file + + time0 = io_time() + if (on_root) then + if (iprint > 1) write (stdout, '(a)') ' ' + if (iprint > 1) write (stdout, '(a)') ' Reading band curvature from file:'//trim(curvature_filename) + curvature_unit = io_file_unit() + curvature_filename = trim(seedname)//".ddome_bin" + open (unit=curvature_unit, file=curvature_filename, status="old", form='unformatted', err=102) + read (curvature_unit) file_version + if ((file_version - file_ver) > 0.001_dp) & + call io_error('Error: Trying to read newer version of ddome_bin file. Update optados!') + read (curvature_unit) femfile_header + if (iprint > 1) write (stdout, *) trim(femfile_header) + + end if + ! Figure out how many kpoint should be on each node + call algor_dist_array(nkpoints, num_kpoints_on_node) + allocate (band_curvature(1:nbands, 1:3, 1:3, 1:num_kpoints_on_node(my_node_id), 1:nspins), stat=ierr) + if (ierr /= 0) call io_error('Error: Problem allocating band_curvature in elec_read_band_curvature') + + if (on_root) then + do inodes = 1, num_nodes - 1 + do ik = 1, num_kpoints_on_node(inodes) + do is = 1, nspins + do ib = 1, nbands + do i = 1, 3 + do j = 1, 3 + read (curvature_unit) band_curvature(ib, i, j, ik, is) + end do + end do + end do + end do + end do + call comms_send(band_curvature(1, 1, 1, 1, 1), nbands*3*3*nspins*num_kpoints_on_node(inodes), inodes) + end do + do ik = 1, num_kpoints_on_node(0) + do is = 1, nspins + do ib = 1, nbands + do i = 1, 3 + do j = 1, 3 + read (curvature_unit) band_curvature(ib, i, j, ik, is) + end do + end do + end do + end do + end do + end if + + if (.not. on_root) then + call comms_recv(band_curvature(1, 1, 1, 1, 1), nbands*3*3*nspins*num_kpoints_on_node(my_node_id), root_id) + end if + + if (on_root) close (unit=curvature_unit) + + ! Convert all band curvatures to eV Ang^2 + band_curvature = band_curvature*bohr2ang*bohr2ang*H2eV + + time1 = io_time() + if (on_root .and. iprint > 1) write (stdout, '(1x,a40,f11.3,a)') 'Time to read band curvature', time1 - time0, ' (sec)' + + end if + + return + +101 call io_error('Error: Problem opening cst_vel file in read_band_curvature') +102 call io_error('Error: Problem opening dome_bin file in read_band_curvature') + + end subroutine elec_read_band_curvature + !========================================================================= subroutine elec_read_optical_mat !========================================================================= @@ -358,7 +495,7 @@ subroutine elec_read_optical_mat ! Figure out how many kpoints should be on each node call algor_dist_array(nkpoints, num_kpoints_on_node) - allocate (optical_mat(1:nbands, 1:nbands, 1:3, 1:num_kpoints_on_node(0), 1:nspins), stat=ierr) + allocate (optical_mat(1:nbands, 1:nbands, 1:3, 1:num_kpoints_on_node(my_node_id), 1:nspins), stat=ierr) if (ierr /= 0) call io_error('Error: Problem allocating optical_mat in elec_read_optical_mat') if (legacy_file_format) then @@ -377,7 +514,7 @@ subroutine elec_read_optical_mat end do end do end do - call comms_send(optical_mat(1, 1, 1, 1, 1), nbands*nbands*3*nspins*num_kpoints_on_node(0), inodes) + call comms_send(optical_mat(1, 1, 1, 1, 1), nbands*nbands*3*nspins*num_kpoints_on_node(inodes), inodes) end do do ik = 1, num_kpoints_on_node(0) @@ -404,7 +541,7 @@ subroutine elec_read_optical_mat , jb=1, nbands), i=1, 3) end do end do - call comms_send(optical_mat(1, 1, 1, 1, 1), nbands*nbands*3*nspins*num_kpoints_on_node(0), inodes) + call comms_send(optical_mat(1, 1, 1, 1, 1), nbands*nbands*3*nspins*num_kpoints_on_node(inodes), inodes) end do do ik = 1, num_kpoints_on_node(0) do is = 1, nspins @@ -415,7 +552,7 @@ subroutine elec_read_optical_mat end if if (.not. on_root) then - call comms_recv(optical_mat(1, 1, 1, 1, 1), nbands*nbands*3*nspins*num_kpoints_on_node(0), root_id) + call comms_recv(optical_mat(1, 1, 1, 1, 1), nbands*nbands*3*nspins*num_kpoints_on_node(my_node_id), root_id) end if if (on_root) close (unit=gradient_unit) @@ -441,6 +578,357 @@ subroutine elec_read_optical_mat end subroutine elec_read_optical_mat + !========================================================================= + subroutine elec_read_foptical_mat + !========================================================================= + ! Read the .fem_bin file in paralell if appropriate. These are the + ! free electron matrix at each kpoint. + !------------------------------------------------------------------------- + ! Arguments: None + !------------------------------------------------------------------------- + ! Parent module variables: foptical_mat,nspins,nbands + !------------------------------------------------------------------------- + ! Modules used: See below + !------------------------------------------------------------------------- + ! Key Internal Variables: None + !------------------------------------------------------------------------- + ! Necessary conditions: None + !------------------------------------------------------------------------- + ! Known Worries: None + !------------------------------------------------------------------------- + ! Written by V Chang Nov 2020 + !========================================================================= + use od_comms, only: on_root, my_node_id, num_nodes, root_id,& + & comms_recv, comms_send, comms_reduce, comms_bcast + use od_io, only: io_time, filename_len, seedname, stdout, io_file_unit,& + & io_error + use od_cell, only: num_kpoints_on_node, nkpoints, kpoint_r + use od_constants, only: bohr2ang, H2eV + use od_parameters, only: legacy_file_format, iprint, devel_flag + use od_algorithms, only: algor_dist_array + implicit none + + integer :: fem_unit, i, ib, jb, is, ik, inodes, ierr, gam_unit = 23, inode = 0, ktmp, energy_count + character(filename_len) :: fem_filename + real(kind=dp) :: time0, time1, file_version, tolerance = 0.000001_dp + real(kind=dp), parameter :: file_ver = 1.0_dp + complex(kind=dp), dimension(:, :, :, :), allocatable :: foptical_mat_temp + logical :: have_gamma = .False. + + ! Check that we haven't already done this. + + if (allocated(foptical_mat)) return + + time0 = io_time() + if (on_root) then + fem_unit = io_file_unit() + fem_filename = trim(seedname)//".fem_bin" + if (iprint > 1) write (stdout, '(1x,a)') 'Reading foptical matrix elements from file: '//trim(fem_filename) + open (unit=fem_unit, file=fem_filename, status="old", form='unformatted', err=102) + read (fem_unit) file_version + if ((file_version - file_ver) > 0.001_dp) & + call io_error('Error: Trying to read newer version of fem_bin file. Update optados!') + read (fem_unit) femfile_header + do i = 1, 5 + read (fem_unit) fem_energy_info(i) + end do + if (iprint > 1) write (stdout, '(1x,a)') trim(femfile_header) + end if + + call comms_bcast(fem_energy_info(1), 5) + energy_count = nint(fem_energy_info(1)) + ! Figure out how many kpoints should be on each node + call algor_dist_array(nkpoints, num_kpoints_on_node) + allocate (foptical_mat(nbands, 3, energy_count, num_kpoints_on_node(my_node_id), nspins), stat=ierr) + if (ierr /= 0) call io_error('Error: Problem allocating foptical_mat in elec_read_optical_mat') + if (on_root) then + do inodes = 1, num_nodes - 1 + do ik = 1, num_kpoints_on_node(inodes) + do is = 1, nspins + read (fem_unit) (((foptical_mat(ib, i, jb, ik, is), ib=1, nbands), i=1, 3), jb=1, energy_count) + end do + end do + call comms_send(foptical_mat(1, 1, 1, 1, 1), nbands*energy_count*3*nspins*num_kpoints_on_node(inodes), inodes) + end do + do ik = 1, num_kpoints_on_node(0) + do is = 1, nspins + read (fem_unit) (((foptical_mat(ib, i, jb, ik, is), ib=1, nbands), i=1, 3), jb=1, energy_count) + end do + end do + end if + + if (.not. on_root) then + call comms_recv(foptical_mat(1, 1, 1, 1, 1), nbands*energy_count*3*nspins*num_kpoints_on_node(my_node_id), root_id) + end if + + if (on_root) close (unit=fem_unit) + + ! Convert all free electron matrix elements to eV Ang + if (legacy_file_format) then + foptical_mat = foptical_mat*bohr2ang*bohr2ang*H2eV + else + foptical_mat = foptical_mat*bohr2ang*H2eV + end if + + if (index(devel_flag, 'write_gam_fome') .gt. 0) then + do ik = 1, num_kpoints_on_node(my_node_id) + if (kpoint_r(1, ik) .lt. tolerance .and. kpoint_r(2, ik) .lt. tolerance .and. kpoint_r(3, ik) .lt. tolerance) then + inode = my_node_id + ktmp = ik + have_gamma = .True. + write (stdout, *) 'node', my_node_id, 'k#', ktmp + end if + end do + call comms_reduce(inode, 1, 'SUM') + if (have_gamma .and. .not. on_root) then + ! allocate the tmp array + allocate (foptical_mat_temp(1:nbands, 1:3, energy_count, 1:nspins), stat=ierr) + if (ierr /= 0) call io_error('Error: Problem allocating foptical_mat_temp in elec_read_foptical_mat') + ! write to tmp array + foptical_mat_temp = foptical_mat(:, :, :, ktmp, :) + ! send the tmp array to root node + call comms_send(foptical_mat_temp(1, 1, 1, 1), (nbands)*energy_count*3*nspins, root_id) + ! deallocate the tmp array + deallocate (foptical_mat_temp, stat=ierr) + if (ierr /= 0) call io_error('Error: Problem deallocating foptical_mat_temp in elec_read_foptical_mat') + end if + if (on_root) then + if (have_gamma) then + ! Write out the fomes + open (unit=gam_unit, action='write', file=trim(seedname)//'_gamma_fomes.dat') + write (gam_unit, '(1x,a28)') '############################' + write (gam_unit, *) '# Free electron OMEs for', seedname + write (gam_unit, '(1x,a28)') '############################' + do is = 1, nspins + write (gam_unit, *) 'Spin Channel', is + write (gam_unit, *) '# bands + free electron band', nbands + 1 + do ib = 1, nbands + write (gam_unit, '(1x, I3, 999(1x,ES24.16E2))') ib, ((foptical_mat(ib, i, jb, ktmp, is), i=1, 3), jb=1, energy_count) + end do + end do + close (unit=gam_unit) + else + ! allocate the tmp array + allocate (foptical_mat_temp(1:nbands, 1:3, energy_count, 1:nspins), stat=ierr) + if (ierr /= 0) call io_error('Error: Problem allocating foptical_mat_temp in elec_read_foptical_mat') + ! receive the tmp array to root node + call comms_recv(foptical_mat_temp(1, 1, 1, 1), (nbands)*energy_count*3*nspins, inode) + ! write out the tmp array + open (unit=gam_unit, action='write', file=trim(seedname)//'_gamma_fomes.dat') + write (gam_unit, '(1x,a28)') '############################' + write (gam_unit, *) '# Free electron OMEs for', seedname + write (gam_unit, '(1x,a28)') '############################' + do is = 1, nspins + write (gam_unit, *) 'Spin Channel', is + write (gam_unit, *) '# bands + free electron band', nbands + do ib = 1, nbands + 1 + write (gam_unit, '(1x, I3, 999(1x,ES24.16E2))') ib, ((foptical_mat(ib, i, jb, ktmp, is), i=1, 3), jb=1, energy_count) + end do + end do + close (unit=gam_unit) + ! deallocate the tmp array + deallocate (foptical_mat_temp, stat=ierr) + if (ierr /= 0) call io_error('Error: Problem deallocating foptical_mat_temp in elec_read_foptical_mat') + end if + end if + end if + time1 = io_time() + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a59,f11.3,a8)') & + '+ Time to read Free electron Matrix Elements & + & ', time1 - time0, ' (sec) +' + end if + + return + +102 call io_error('Error: Problem opening fem_bin file in read_band_foptical_mat') + + end subroutine elec_read_foptical_mat + + subroutine elec_read_transmit_prob + !========================================================================= + ! Read the .tmprob_bin file in paralell if appropriate. These are electron + ! transmission coefficients at the surface into the vacuum for each band + ! and spin at all the k-points. + !------------------------------------------------------------------------- + ! Arguments: None + !------------------------------------------------------------------------- + ! Parent module variables: transmit_probabils,nspins,nbands + !------------------------------------------------------------------------- + ! Modules used: See below + !------------------------------------------------------------------------- + ! Key Internal Variables: None + !------------------------------------------------------------------------- + ! Necessary conditions: None + !------------------------------------------------------------------------- + ! Known Worries: None + !------------------------------------------------------------------------- + ! Written by F Mildner Jan 2025 + !========================================================================= + use od_comms, only: on_root, my_node_id, num_nodes, root_id,& + & comms_recv, comms_send, comms_reduce, comms_bcast + use od_io, only: io_time, filename_len, seedname, stdout, io_file_unit,& + & io_error + use od_cell, only: num_kpoints_on_node, nkpoints, kpoint_r + use od_constants, only: bohr2ang, H2eV + use od_parameters, only: legacy_file_format, iprint, devel_flag + use od_algorithms, only: algor_dist_array + implicit none + + integer :: tmprob_unit, i, ib, jb, is, ik, inodes, ierr + real(kind=dp) :: time0, time1, file_version + real(kind=dp), parameter :: file_ver = 1.0_dp + character(filename_len) :: tmcoeff_filename + + time0 = io_time() + + if (allocated(transmit_prob)) return + + if (on_root) then + tmprob_unit = io_file_unit() + tmcoeff_filename = trim(seedname)//".tmprob_bin" + if (iprint > 1) write (stdout, '(1x,a)') 'Reading transmission probabilities from file: '//trim(tmcoeff_filename) + open (unit=tmprob_unit, file=tmcoeff_filename, status="old", form='unformatted', err=102) + read (tmprob_unit) file_version + if ((file_version - file_ver) > 0.001_dp) & + call io_error('Error: Trying to read newer version of tmprob_bin file. Update optados!') + read (tmprob_unit) tmprob_file_header + if (iprint > 1) write (stdout, '(1x,a)') trim(tmprob_file_header) + end if + + call algor_dist_array(nkpoints, num_kpoints_on_node) + allocate (transmit_prob(1:nbands, 1:nspins, 1:num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: Problem allocating foptical_mat in elec_read_optical_mat') + if (on_root) then + do inodes = 1, num_nodes - 1 + do ik = 1, num_kpoints_on_node(inodes) + do is = 1, nspins + read (tmprob_unit) (transmit_prob(ib, is, ik), ib=1, nbands) + end do + end do + call comms_send(transmit_prob(1, 1, 1), (nbands)*nspins*num_kpoints_on_node(inodes), inodes) + end do + do ik = 1, num_kpoints_on_node(0) + do is = 1, nspins + read (tmprob_unit) (transmit_prob(ib, is, ik), ib=1, nbands) + end do + end do + end if + + if (.not. on_root) then + call comms_recv(transmit_prob(1, 1, 1), (nbands)*nspins*num_kpoints_on_node(my_node_id), root_id) + end if + + if (on_root) close (unit=tmprob_unit) + + time1 = io_time() + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a59,f11.3,a8)') & + '+ Time to read Free electron Matrix Elements & + & ', time1 - time0, ' (sec) +' + end if + + return +102 call io_error('Error: Problem opening tmprob_bin file in read_transmit_probabil') + end subroutine elec_read_transmit_prob + + subroutine elec_read_gk_grid_points(max_gkgrid) + !========================================================================= + ! Read the .gkgrid_bin file containing the contributions from a list of + ! k + G vectors. These can be used to "unfold" bands into their respective + ! contributions from different BZs and calculate photoemission from SC + ! structures. + !------------------------------------------------------------------------- + ! Arguments: None + !------------------------------------------------------------------------- + ! Parent module variables: photo_gkgrid,nspins,nbands + !------------------------------------------------------------------------- + ! Modules used: See below + !------------------------------------------------------------------------- + ! Key Internal Variables: None + !------------------------------------------------------------------------- + ! Necessary conditions: None + !------------------------------------------------------------------------- + ! Known Worries: None + !------------------------------------------------------------------------- + ! Written by F Mildner Mar 2025 + !========================================================================= + + use od_comms, only: on_root, my_node_id, num_nodes, root_id,& + & comms_recv, comms_send, comms_reduce, comms_bcast + use od_io, only: io_time, filename_len, seedname, stdout, io_file_unit,& + & io_error + use od_cell, only: num_kpoints_on_node, nkpoints, kpoint_r + use od_constants, only: bohr2ang, H2eV + use od_parameters, only: legacy_file_format, iprint, photo_gk_max_vectors, devel_flag + use od_algorithms, only: algor_dist_array + implicit none + + integer :: photo_gkgrid_unit, i, gdx, ib, is, ik, inodes, ierr + real(kind=dp) :: time0, time1, file_version + real(kind=dp), parameter :: file_ver = 1.0_dp + character(filename_len) :: gkgrid_filename + + integer, intent(inout) :: max_gkgrid + + time0 = io_time() + + if (allocated(photo_gkgrid)) return + + if (on_root) then + photo_gkgrid_unit = io_file_unit() + gkgrid_filename = trim(seedname)//".gkgrid_bin" + if (iprint > 1) write (stdout, '(1x,a)') 'Reading gkgrid contributions from file: '//trim(gkgrid_filename) + open (unit=photo_gkgrid_unit, file=gkgrid_filename, status="old", form='unformatted', err=102) + read (photo_gkgrid_unit) file_version + if ((file_version - file_ver) > 0.001_dp) & + call io_error('Error: Trying to read newer version of gkgrid_bin file. Update optados!') + read (photo_gkgrid_unit) photo_gkgrid_file_header + if (iprint > 1) write (stdout, '(1x,a)') trim(photo_gkgrid_file_header) + end if + + call algor_dist_array(nkpoints, num_kpoints_on_node) + allocate (photo_gkgrid(3, max_gkgrid, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: Problem allocating photo_gkgrid in elec_read_gk_grid_points') + if (on_root) then + do inodes = 1, num_nodes - 1 + do ik = 1, num_kpoints_on_node(inodes) + do is = 1, nspins + read (photo_gkgrid_unit) (((photo_gkgrid(i, gdx, ib, is, ik), i=1, 3), gdx=1, max_gkgrid), & + ib=1, nbands) + end do + end do + call comms_send(photo_gkgrid(1, 1, 1, 1, 1), & + 3*max_gkgrid*nbands*nspins*num_kpoints_on_node(inodes), inodes) + end do + do ik = 1, num_kpoints_on_node(0) + do is = 1, nspins + read (photo_gkgrid_unit) (((photo_gkgrid(i, gdx, ib, is, ik), i=1, 3), gdx=1, max_gkgrid), & + ib=1, nbands) + end do + end do + end if + + if (.not. on_root) then + call comms_recv(photo_gkgrid(1, 1, 1, 1, 1), & + 3*max_gkgrid*nbands*nspins*num_kpoints_on_node(my_node_id), root_id) + end if + + if (on_root) close (unit=photo_gkgrid_unit) + + photo_gkgrid(1:2, :, :, :, :) = photo_gkgrid(1:2, :, :, :, :)/bohr2ang + + time1 = io_time() + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a59,f11.3,a8)') & + '+ Time to read Gkgrid Contributions ', time1 - time0, ' (sec) +' + end if + + return + +102 call io_error('Error: Problem opening gkgrid_bin file in read_gk_grid_points') + end subroutine elec_read_gk_grid_points + !========================================================================= subroutine elec_read_band_energy !(band_energy,kpoint_r,kpoint_weight) !========================================================================= @@ -528,11 +1016,11 @@ subroutine elec_read_band_energy !(band_energy,kpoint_r,kpoint_weight) ! call algor_dist_array(nkpoints, num_kpoints_on_node) ! - allocate (band_energy(1:nbands, 1:nspins, 1:num_kpoints_on_node(0)), stat=ierr) + allocate (band_energy(1:nbands, 1:nspins, 1:num_kpoints_on_node(my_node_id)), stat=ierr) if (ierr /= 0) call io_error('Error: Problem allocating band_energy in read_band_energy') - allocate (kpoint_weight(1:num_kpoints_on_node(0)), stat=ierr) + allocate (kpoint_weight(1:num_kpoints_on_node(my_node_id)), stat=ierr) if (ierr /= 0) call io_error('Error: Problem allocating kpoint_weight in read_band_energy') - allocate (kpoint_r(1:3, 1:num_kpoints_on_node(0)), stat=ierr) + allocate (kpoint_r(1:3, 1:num_kpoints_on_node(my_node_id)), stat=ierr) if (ierr /= 0) call io_error('Error: Problem allocating kpoint_r in read_band_energy') if (on_root) then @@ -555,9 +1043,9 @@ subroutine elec_read_band_energy !(band_energy,kpoint_r,kpoint_weight) end do end do end do - call comms_send(band_energy(1, 1, 1), nbands*nspins*num_kpoints_on_node(0), inodes) - call comms_send(kpoint_r(1, 1), 3*num_kpoints_on_node(0), inodes) - call comms_send(kpoint_weight(1), num_kpoints_on_node(0), inodes) + call comms_send(band_energy(1, 1, 1), nbands*nspins*num_kpoints_on_node(inodes), inodes) + call comms_send(kpoint_r(1, 1), 3*num_kpoints_on_node(inodes), inodes) + call comms_send(kpoint_weight(1), num_kpoints_on_node(inodes), inodes) end do do ik = 1, num_kpoints_on_node(0) @@ -591,9 +1079,9 @@ subroutine elec_read_band_energy !(band_energy,kpoint_r,kpoint_weight) end if if (.not. on_root) then - call comms_recv(band_energy(1, 1, 1), nbands*nspins*num_kpoints_on_node(0), root_id) - call comms_recv(kpoint_r(1, 1), 3*num_kpoints_on_node(0), root_id) - call comms_recv(kpoint_weight(1), num_kpoints_on_node(0), root_id) + call comms_recv(band_energy(1, 1, 1), nbands*nspins*num_kpoints_on_node(my_node_id), root_id) + call comms_recv(kpoint_r(1, 1), 3*num_kpoints_on_node(my_node_id), root_id) + call comms_recv(kpoint_weight(1), num_kpoints_on_node(my_node_id), root_id) end if if (on_root) close (unit=band_unit) @@ -1152,6 +1640,7 @@ subroutine elec_pdos_read integer :: dummyi, ib, ik, is, iorbitals integer :: pdos_in_unit, ierr, inodes character(filename_len) :: pdos_filename + logical :: full_debug_pdos_weights = .False. real(kind=dp) :: time0, time1, file_version real(kind=dp), parameter :: file_ver = 1.0_dp @@ -1188,7 +1677,7 @@ subroutine elec_pdos_read write (stdout, *) " pdos_mwab%nspins : ", pdos_mwab%nspins write (stdout, *) " pdos_mwab%norbitals: ", pdos_mwab%norbitals write (stdout, *) " pdos_mwab%nbands : ", pdos_mwab%nbands - endif + end if allocate (pdos_orbital%species_no(pdos_mwab%norbitals), stat=ierr) if (ierr /= 0) call io_error(" Error : cannot allocate pdos_orbital") @@ -1235,7 +1724,7 @@ subroutine elec_pdos_read allocate (nbands_occ(1:num_kpoints_on_node(my_node_id), 1:pdos_mwab%nspins), stat=ierr) if (ierr /= 0) stop " Error : cannot allocate nbands_occ" allocate (pdos_weights(1:pdos_mwab%norbitals, 1:pdos_mwab%nbands, & - 1:num_kpoints_on_node(0), 1:pdos_mwab%nspins), stat=ierr) + 1:num_kpoints_on_node(my_node_id), 1:pdos_mwab%nspins), stat=ierr) if (ierr /= 0) stop " Error : cannot allocate pdos_weights" if (on_root) then @@ -1257,7 +1746,7 @@ subroutine elec_pdos_read end do end do call comms_send(pdos_weights(1, 1, 1, 1), pdos_mwab%norbitals*pdos_mwab%nbands* & - nspins*num_kpoints_on_node(0), inodes) + nspins*num_kpoints_on_node(inodes), inodes) end do do ik = 1, num_kpoints_on_node(0) @@ -1275,7 +1764,7 @@ subroutine elec_pdos_read if (.not. on_root) then call comms_recv(pdos_weights(1, 1, 1, 1), pdos_mwab%norbitals*pdos_mwab%nbands* & - nspins*num_kpoints_on_node(0), root_id) + nspins*num_kpoints_on_node(my_node_id), root_id) end if if (on_root) close (pdos_in_unit) diff --git a/optados/src/jdos_utils.f90 b/optados/src/jdos_utils.f90 index 773043b7..3cbc520d 100644 --- a/optados/src/jdos_utils.f90 +++ b/optados/src/jdos_utils.f90 @@ -48,6 +48,7 @@ module od_jdos_utils !------------------------------------------------------------------------------- ! P U B L I C F U N C T I O N S public :: jdos_utils_calculate + public :: setup_energy_scale !------------------------------------------------------------------------------- real(kind=dp), save :: delta_bins ! Width of bins @@ -63,9 +64,9 @@ subroutine jdos_utils_calculate(matrix_weights, weighted_jdos) ! Main routine in dos module, drives the calculation of Density of states for ! both task : dos and also if it is required elsewhere. !=============================================================================== - use od_parameters, only: linear, fixed, adaptive, quad, iprint, dos_per_volume + use od_parameters, only: linear, fixed, adaptive, quad, iprint, dos_per_volume, photo use od_electronic, only: elec_read_band_gradient, band_gradient, nspins, electrons_per_state, & - num_electrons, efermi_set + num_electrons, efermi_set use od_comms, only: on_root use od_io, only: stdout, io_error, io_time use od_cell, only: cell_volume @@ -104,11 +105,10 @@ subroutine jdos_utils_calculate(matrix_weights, weighted_jdos) ! Now everything is set up, we can perform the dos accumulation in parellel time0 = io_time() - call setup_energy_scale - + call setup_energy_scale(E) if (fixed) then if (calc_weighted_jdos) then - call calculate_jdos('f', jdos_fixed, matrix_weights, weighted_jdos) + call calculate_jdos('f', jdos_fixed, matrix_weights, weighted_jdos=weighted_jdos) call jdos_utils_merge(jdos_fixed, weighted_jdos) else call calculate_jdos('f', jdos_fixed) @@ -118,7 +118,7 @@ subroutine jdos_utils_calculate(matrix_weights, weighted_jdos) end if if (adaptive) then if (calc_weighted_jdos) then - call calculate_jdos('a', jdos_adaptive, matrix_weights, weighted_jdos) + call calculate_jdos('a', jdos_adaptive, matrix_weights, weighted_jdos=weighted_jdos) call jdos_utils_merge(jdos_adaptive, weighted_jdos) else call calculate_jdos('a', jdos_adaptive) @@ -127,7 +127,7 @@ subroutine jdos_utils_calculate(matrix_weights, weighted_jdos) end if if (linear) then if (calc_weighted_jdos) then - call calculate_jdos('l', jdos_linear, matrix_weights, weighted_jdos) + call calculate_jdos('l', jdos_linear, matrix_weights, weighted_jdos=weighted_jdos) call jdos_utils_merge(jdos_linear, weighted_jdos) else call calculate_jdos('l', jdos_linear) @@ -155,14 +155,26 @@ subroutine jdos_utils_calculate(matrix_weights, weighted_jdos) !------------------------------------------------------------------------------- if (dos_per_volume) then - if (fixed) then - jdos_fixed = jdos_fixed/cell_volume - end if - if (adaptive) then - jdos_adaptive = jdos_adaptive/cell_volume - end if - if (linear) then - jdos_linear = jdos_linear/cell_volume + if (photo) then + if (fixed) then + jdos_fixed = jdos_fixed + end if + if (adaptive) then + jdos_adaptive = jdos_adaptive + end if + if (linear) then + jdos_linear = jdos_linear + end if + else + if (fixed) then + jdos_fixed = jdos_fixed/cell_volume + end if + if (adaptive) then + jdos_adaptive = jdos_adaptive/cell_volume + end if + if (linear) then + jdos_linear = jdos_linear/cell_volume + end if end if ! if(quad) then @@ -174,7 +186,7 @@ subroutine jdos_utils_calculate(matrix_weights, weighted_jdos) end subroutine jdos_utils_calculate !=============================================================================== - subroutine setup_energy_scale + subroutine setup_energy_scale(E) !=============================================================================== ! Sets up all broadening independent DOS concerns ! Calls the relevant dos calculator. @@ -189,6 +201,7 @@ subroutine setup_energy_scale integer :: idos, ierr real(kind=dp) :: max_band_energy + real(kind=dp), intent(out), allocatable, optional :: E(:) if (jdos_max_energy < 0.0_dp) then ! we have to work it out ourselves max_band_energy = maxval(band_energy) @@ -285,17 +298,20 @@ subroutine calculate_jdos(jdos_type, jdos, matrix_weights, weighted_jdos) use od_cell, only: num_kpoints_on_node, kpoint_grid_dim, kpoint_weight,& &recip_lattice use od_parameters, only: adaptive_smearing, fixed_smearing, iprint, & - &finite_bin_correction, scissor_op, hybrid_linear_grad_tol, hybrid_linear, exclude_bands, num_exclude_bands + finite_bin_correction, scissor_op, hybrid_linear_grad_tol, & + hybrid_linear, exclude_bands, num_exclude_bands, & + photo, photo_slab_max, photo_slab_min use od_io, only: io_error, stdout use od_electronic, only: band_gradient, nbands, band_energy, nspins, electrons_per_state, & & efermi use od_dos_utils, only: doslin, doslin_sub_cell_corners use od_algorithms, only: gaussian + use od_constants, only: pi implicit none integer :: ik, is, ib, idos, jb, i integer :: N2, N_geom, ierr - real(kind=dp) :: dos_temp, cuml, width, adaptive_smearing_temp + real(kind=dp) :: dos_temp, cuml, width, adaptive_smearing_temp, mean_height real(kind=dp) :: grad(1:3), step(1:3), EV(0:4), sub_cell_length(1:3) character(len=1), intent(in) :: jdos_type @@ -318,7 +334,7 @@ subroutine calculate_jdos(jdos_type, jdos, matrix_weights, weighted_jdos) case ("f") fixed = .true. case default - call io_error(" ERROR : unknown jdos_type in jcalculate_dos ") + call io_error(" ERROR : unknown jdos_type in calculate_jdos ") end select width = 0.0_dp @@ -328,6 +344,10 @@ subroutine calculate_jdos(jdos_type, jdos, matrix_weights, weighted_jdos) do i = 1, 3 sub_cell_length(i) = sqrt(recip_lattice(i, 1)**2 + recip_lattice(i, 2)**2 + recip_lattice(i, 3)**2)*step(i) end do + if (photo) then + mean_height = (photo_slab_min + photo_slab_max)/(2*2) + sub_cell_length(3) = sqrt(recip_lattice(3, 1)**2 + recip_lattice(3, 2)**2 + (pi/mean_height)**2)*step(3) + end if adaptive_smearing_temp = adaptive_smearing*sum(sub_cell_length)/3.0_dp end if @@ -426,15 +446,17 @@ subroutine jdos_utils_merge(jdos, weighted_jdos) !=============================================================================== use od_comms, only: comms_reduce use od_electronic, only: nspins - use od_comms, only: comms_reduce implicit none real(kind=dp), intent(inout), allocatable, optional :: weighted_jdos(:, :, :) ! bins.spins, orbitals real(kind=dp), allocatable, intent(inout) :: jdos(:, :) + integer :: N_geom + if (present(weighted_jdos)) N_geom = size(weighted_jdos, 3) + call comms_reduce(jdos(1, 1), nspins*jdos_nbins, "SUM") - if (present(weighted_jdos)) call comms_reduce(weighted_jdos(1, 1, 1), nspins*jdos_nbins*1, "SUM") + if (present(weighted_jdos)) call comms_reduce(weighted_jdos(1, 1, 1), nspins*jdos_nbins*N_geom, "SUM") ! if(.not.on_root) then ! if(allocated(jdos)) deallocate(jdos,stat=ierr) diff --git a/optados/src/od2od.f90 b/optados/src/od2od.f90 index 969f63b3..d5e493c6 100644 --- a/optados/src/od2od.f90 +++ b/optados/src/od2od.f90 @@ -5,7 +5,8 @@ module od_conv use od_constants, only: dp use od_electronic, only: elec_read_optical_mat, elec_read_band_gradient, elec_read_elnes_mat,& & elec_pdos_read, elec_read_band_energy, omefile_header, domefile_header, pdosfile_header,& - & elnesfile_header + & elnesfile_header, elec_read_foptical_mat, femfile_header, fem_energy_info, tmprob_file_header, & + & elec_read_transmit_prob, photo_gkgrid, photo_gkgrid_file_header, elec_read_gk_grid_points use od_parameters, only: iprint use od_io, only: stdout, io_error, seedname implicit none @@ -19,6 +20,8 @@ module od_conv !! Type of file to convert to. character(len=10), save :: format_precision = "es23.10" !! Things get messy below 10 s.f. between bin files and fmt files + integer :: max_gvec + character(len=7), save :: str_gvec contains !========================================================================= subroutine print_usage() @@ -33,6 +36,12 @@ subroutine print_usage() write (stdout, '(A)') " and is one of: " write (stdout, '(A)') " ome_fmt : a formatted optical matrix element file" write (stdout, '(A)') " ome_bin : an unformatted optical matrix element file" + ! Added by F. Mildner (04/2023+02/2025) for photoemission + write (stdout, '(A)') " fem_fmt : a formatted free electron optical matrix element file" + write (stdout, '(A)') " fem_bin : an unformatted free electron optical matrix element file" + write (stdout, '(A)') " tmprob_fmt : a formatted bandwise electron transmission coefficient file" + write (stdout, '(A)') " tmprob_bin : an unformatted bandwise electron transmission coefficient file" + write (stdout, '(A)') " dome_fmt : a formatted diagonal optical matrix element file" write (stdout, '(A)') " dome_bin : an unformatted diagonal optical matrix element file" write (stdout, '(A)') " pdos_fmt : a formatted projected density of states file" @@ -81,6 +90,9 @@ subroutine conv_get_seedname case ("-w", "--out_seedname") i = i + 1 call get_command_argument(i, outseedname) + case ("-gv") + i = i + 1 + call get_command_argument(i, str_gvec) case ("--") !! End of flags i = i + 1 call get_command_argument(i, seedname) @@ -246,6 +258,420 @@ subroutine write_ome_bin() write (stdout, *) " Sucesfully written an unformatted ome file --> "//trim(outseedname)//".ome_bin" end subroutine write_ome_bin + !========================================================================= + ! F R E E E L E C T R O N O P T I C A L M A T R I X E L E M E N T S + !========================================================================= + + !========================================================================= + subroutine read_fem_fmt() + !! Read a formatted Optical Matrix Elements file. + use od_constants, only: dp, bohr2ang, H2eV + use od_io, only: io_time, filename_len, seedname, stdout, io_file_unit,& + & io_error + use od_cell, only: nkpoints + use od_electronic, only: nspins, nbands, foptical_mat + use od_constants, only: bohr2ang, H2eV + implicit none + + real(dp):: file_version = 1.0_dp ! File version + character(len=100):: string + integer :: ik, is, ib, i, jb, energy_count, ierr, fem_unit = 6 + + write (stdout, *) " Read a formatted .fem file. " + + open (unit=fem_unit, form='formatted', recl=1073741824, file=trim(seedname)//".fem_fmt") + read (fem_unit, '('//trim(format_precision)//')') file_version + + read (fem_unit, '(a80)') femfile_header + do i = 1, 5 + read (fem_unit, '('//trim(format_precision)//')') fem_energy_info(i) + end do + + energy_count = int(fem_energy_info(1)) + write (stdout, *) fem_energy_info + if (.not. allocated(foptical_mat)) then + write (stdout, *) " Allocating foptical_mat." + allocate (foptical_mat(nbands, 3, energy_count, nkpoints, nspins), stat=ierr) + end if + ! Total number of elements of fem + write (stdout, *) 'nbands', nbands, 'energy_count', energy_count + write (string, '(I0,"(1x,",a,")")') 2*3*nbands*energy_count, trim(format_precision) + write (stdout, *) string + + ! write(string,'(a)') trim(format_precision) + write (stdout, *) nkpoints, nspins, nbands + + do ik = 1, nkpoints + do is = 1, nspins + read (fem_unit, '('//trim(string)//')') (((foptical_mat(ib, i, jb, ik, is), ib=1, nbands), i=1, 3), jb=1, energy_count) + end do + end do + + foptical_mat = foptical_mat*(bohr2ang*H2eV) + + close (unit=fem_unit) + + write (stdout, *) trim(seedname)//".fem_fmt"//"--> Formatted fem sucessfully read. " + + end subroutine read_fem_fmt + + !========================================================================= + subroutine write_fem_fmt() + !! Write a formatted ome file. + use od_constants, only: dp, bohr2ang, H2eV + use od_io, only: io_time, filename_len, stdout, io_file_unit,& + & io_error + use od_cell, only: nkpoints + use od_electronic, only: nspins, nbands, foptical_mat + use od_constants, only: bohr2ang, H2eV + implicit none + + real(dp):: file_version = 1.0_dp ! File version + character(len=100):: string + integer :: ik, is, ib, i, jb, energy_count, fem_unit = 6 + + write (stdout, *) " Write a formatted .fem file. " + + foptical_mat = foptical_mat/(bohr2ang*H2eV) + energy_count = nint(fem_energy_info(1)) + + open (unit=fem_unit, form='formatted', file=trim(outseedname)//".fem_fmt") + + write (string, '(I0,"(1x,",a,")")') 2*3*nbands*energy_count, trim(format_precision) + + write (stdout, '(a80)') adjustl(femfile_header) + + write (fem_unit, '('//trim(format_precision)//')') file_version + write (fem_unit, '(a80)') adjustl(femfile_header) + do i = 1, 5 + write (fem_unit, '('//format_precision//')') fem_energy_info(i) + end do + + do ik = 1, nkpoints + do is = 1, nspins + write (fem_unit, '('//trim(string)//')') (((foptical_mat(ib, i, jb, ik, is), ib=1, nbands), i=1, 3), jb=1, energy_count) + end do + end do + + close (unit=fem_unit) + + write (stdout, *) " Sucesfully written a formatted fem file --> "//trim(outseedname)//".fem_fmt" + end subroutine write_fem_fmt + + !========================================================================= + subroutine read_fem_bin() + !! Read a binary ome file. Wrapper to keep the naming tidy. + implicit none + write (stdout, *) " Read a unformatted fem_bin file. " + + call elec_read_foptical_mat() + write (stdout, *) " "//trim(seedname)//".fem_bin"//" --> Unformatted fem_bin sucessfully read. " + end subroutine read_fem_bin + + !========================================================================= + subroutine write_fem_bin() + !! Write a binary ome file. + use od_constants, only: dp, bohr2ang, H2eV + use od_io, only: io_time, filename_len, stdout, io_file_unit,& + & io_error + use od_cell, only: nkpoints + use od_electronic, only: nspins, nbands, foptical_mat + use od_constants, only: bohr2ang, H2eV + implicit none + + real(dp):: file_version = 1.0_dp ! File version + integer :: ik, is, ib, i, jb, energy_count, fem_unit = 6 + + write (stdout, *) " Write a binary fem file." + + foptical_mat = foptical_mat/(bohr2ang*H2eV) + energy_count = int(fem_energy_info(1)) + + open (unit=fem_unit, form='unformatted', file=trim(outseedname)//".fem_bin") + + write (stdout, *) "-> Femfile_version ", file_version + write (fem_unit) file_version + write (stdout, *) "-> Femfile_header ", trim(femfile_header) + write (fem_unit) adjustl(femfile_header) + do i = 1, 5 + write (fem_unit) fem_energy_info(i) + end do + + do ik = 1, nkpoints + do is = 1, nspins + write (fem_unit) (((foptical_mat(ib, jb, i, ik, is), ib=1, nbands), i=1, 3), jb=1, energy_count) + end do + end do + + write (stdout, *) " Succesfully written an unformatted fem file --> "//trim(outseedname)//".fem_bin" + end subroutine write_fem_bin + + !========================================================================= + ! B A N D T R A N S M I S S I O N C O E F F I C I E N T S + !========================================================================= + + !========================================================================= + !========================================================================= + subroutine read_tmprob_fmt() + !! Read a formatted Optical Matrix Elements file. + use od_constants, only: dp, bohr2ang, H2eV + use od_io, only: io_time, filename_len, seedname, stdout, io_file_unit,& + & io_error + use od_cell, only: nkpoints + use od_electronic, only: nspins, nbands, transmit_prob + use od_constants, only: bohr2ang, H2eV + implicit none + + real(dp):: file_version = 1.0_dp ! File version + character(len=100):: string + integer :: ik, is, ib, ierr, tmcoeff_unit = 6 + + write (stdout, *) " Read a formatted .tmprob file. " + + open (unit=tmcoeff_unit, form='formatted', recl=1073741824, file=trim(seedname)//".tmprob_fmt") + read (tmcoeff_unit, '('//trim(format_precision)//')') file_version + + read (tmcoeff_unit, '(a80)') tmprob_file_header + + if (.not. allocated(transmit_prob)) then + write (stdout, *) " Allocating transmit_coeffs." + allocate (transmit_prob(nbands, nspins, nkpoints), stat=ierr) + end if + ! ! Total number of elements of tmprob + ! write(stdout,*) 'nbands', nbands + write (string, '(I0,"(1x,",a,")")') nbands, trim(format_precision) + ! write(stdout,*) string + + ! write(string,'(a)') trim(format_precision) + ! write(stdout,*) nkpoints, nspins, nbands + + do ik = 1, nkpoints + do is = 1, nspins + read (tmcoeff_unit, '('//trim(string)//')') (transmit_prob(ib, ik, is), ib=1, nbands) + end do + end do + + close (unit=tmcoeff_unit) + + write (stdout, *) trim(seedname)//".tmprob_fmt"//"--> Formatted tmprob sucessfully read. " + + end subroutine read_tmprob_fmt + + !========================================================================= + subroutine write_tmprob_fmt() + !! Write a formatted ome file. + use od_constants, only: dp, bohr2ang, H2eV + use od_io, only: io_time, filename_len, stdout, io_file_unit,& + & io_error + use od_cell, only: nkpoints + use od_electronic, only: nspins, nbands, transmit_prob + use od_constants, only: bohr2ang, H2eV + implicit none + + real(dp):: file_version = 1.0_dp ! File version + character(len=100):: string + integer :: ik, is, ib, tmcoeff_unit = 6 + + write (stdout, *) " Write a formatted .tmprob file. " + + open (unit=tmcoeff_unit, form='formatted', file=trim(outseedname)//".tmprob_fmt") + + write (string, '(I0,"(1x,",a,")")') nbands, trim(format_precision) + ! write(stdout, *) string + + write (stdout, '(a80)') tmprob_file_header + write (stdout, '(a80)') adjustl(tmprob_file_header) + + write (tmcoeff_unit, '('//trim(format_precision)//')') file_version + write (tmcoeff_unit, '(a80)') adjustl(tmprob_file_header) + + do ik = 1, nkpoints + do is = 1, nspins + write (tmcoeff_unit, '('//trim(string)//')') (transmit_prob(ib, ik, is), ib=1, nbands) + end do + end do + + close (unit=tmcoeff_unit) + + write (stdout, *) " Sucesfully written a formatted tmprob file --> "//trim(outseedname)//".tmprob_fmt" + end subroutine write_tmprob_fmt + + !========================================================================= + subroutine read_tmprob_bin() + !! Read a binary ome file. Wrapper to keep the naming tidy. + implicit none + write (stdout, *) " Read an unformatted tmprob file. " + + call elec_read_transmit_prob() + write (stdout, *) " "//trim(seedname)//".tmprob_bin"//"--> Unformatted tmprob sucessfully read. " + end subroutine read_tmprob_bin + + !========================================================================= + subroutine write_tmprob_bin() + !! Write a binary ome file. + use od_constants, only: dp, bohr2ang, H2eV + use od_io, only: io_time, filename_len, stdout, io_file_unit, io_error + use od_cell, only: nkpoints + use od_electronic, only: nspins, nbands, transmit_prob + use od_constants, only: bohr2ang, H2eV + implicit none + + real(dp):: file_version = 1.0_dp ! File version + integer :: ik, is, ib, tmcoeff_unit = 6 + + write (stdout, *) " Write a binary tmprob file." + + open (unit=tmcoeff_unit, form='unformatted', file=trim(outseedname)//".tmprob_bin") + + write (stdout, *) "-> tmprob file_version ", file_version + write (tmcoeff_unit) file_version + write (stdout, *) "-> tmprob file_header ", trim(tmprob_file_header) + write (tmcoeff_unit) adjustl(tmprob_file_header) + + ! write(0,*) nkpoints, nspins, nbands + do ik = 1, nkpoints + do is = 1, nspins + write (tmcoeff_unit) (transmit_prob(ib, ik, is), ib=1, nbands) + end do + end do + + write (stdout, *) " Sucesfully written an unformatted tmprob file --> "//trim(outseedname)//".tmprob_bin" + end subroutine write_tmprob_bin + + !========================================================================= + ! P H O T O S P E C T R A L F U N C T I O N + !========================================================================= + + !========================================================================= + !========================================================================= + subroutine read_gkgrid_fmt() + !! Read a formatted Optical Matrix Elements file. + use od_constants, only: dp, bohr2ang, H2eV + use od_io, only: io_time, filename_len, seedname, stdout, io_file_unit,& + & io_error + use od_cell, only: nkpoints + use od_electronic, only: nspins, nbands, photo_gkgrid + use od_constants, only: bohr2ang, H2eV + implicit none + + real(dp):: file_version = 1.0_dp ! File version + character(len=100):: string + integer :: ik, is, ib, i, gdx, ierr, gkgrid_unit = 6 + + write (stdout, *) " Read a formatted .gkgrid_fmt file. " + + open (unit=gkgrid_unit, form='formatted', recl=1073741824, file=trim(seedname)//".gkgrid_fmt") + read (gkgrid_unit, '('//trim(format_precision)//')') file_version + + read (gkgrid_unit, '(a80)') photo_gkgrid_file_header + read (str_gvec, *) max_gvec + if (.not. allocated(photo_gkgrid)) then + write (stdout, *) " Allocating spectral function." + allocate (photo_gkgrid(3, max_gvec, nbands, nspins, nkpoints), stat=ierr) + end if + ! ! Total number of elements of tmprob + ! write(stdout,*) 'nbands', nbands + write (string, '(I0,"(1x,",a,")")') nbands*max_gvec*3, trim(format_precision) + ! write(stdout,*) string + + ! write(string,'(a)') trim(format_precision) + ! write(stdout,*) nkpoints, nspins, nbands + + do ik = 1, nkpoints + do is = 1, nspins + read (gkgrid_unit, '('//trim(string)//')') (((photo_gkgrid(i, gdx, ib, is, ik), i=1, 3), gdx=1, max_gvec), & + ib=1, nbands) + end do + end do + + close (unit=gkgrid_unit) + + write (stdout, *) trim(seedname)//".gkgrid_fmt"//"--> Formatted gkgrid sucessfully read. " + + end subroutine read_gkgrid_fmt + + !========================================================================= + subroutine write_gkgrid_fmt() + !! Write a formatted ome file. + use od_constants, only: dp, bohr2ang, H2eV + use od_io, only: io_time, filename_len, stdout, io_file_unit,& + & io_error + use od_cell, only: nkpoints + use od_electronic, only: nspins, nbands, photo_gkgrid, photo_gkgrid_file_header + use od_constants, only: bohr2ang, H2eV + implicit none + + real(dp):: file_version = 1.0_dp ! File version + character(len=100):: string + integer :: ik, is, ib, i, gdx, gkgrid_unit = 6 + + write (stdout, *) " Write a formatted .gkgrid file. " + + open (unit=gkgrid_unit, form='formatted', file=trim(outseedname)//".gkgrid_fmt") + + write (string, '(I0,"(1x,",a,")")') nbands*max_gvec*3, trim(format_precision) + ! write(stdout, *) string + + write (stdout, '(a80)') photo_gkgrid_file_header + write (stdout, '(a80)') adjustl(photo_gkgrid_file_header) + + write (gkgrid_unit, '('//trim(format_precision)//')') file_version + write (gkgrid_unit, '(a80)') adjustl(photo_gkgrid_file_header) + + do ik = 1, nkpoints + do is = 1, nspins + write (gkgrid_unit, '('//trim(string)//')') (((photo_gkgrid(i, gdx, ib, is, ik), i=1, 3), & + gdx=1, max_gvec), ib=1, nbands) + end do + end do + + close (unit=gkgrid_unit) + + write (stdout, *) " Sucesfully written a formatted gkgrid file --> "//trim(outseedname)//".gkgrid_fmt" + end subroutine write_gkgrid_fmt + + !========================================================================= + subroutine read_gkgrid_bin() + !! Read a binary ome file. Wrapper to keep the naming tidy. + implicit none + write (stdout, *) " Read an unformatted gkgrid file. " + read (str_gvec, *) max_gvec + call elec_read_gk_grid_points(max_gvec) + write (stdout, *) " "//trim(seedname)//".gkgrid_bin"//"--> Unformatted gkgrid sucessfully read. " + end subroutine read_gkgrid_bin + + !========================================================================= + subroutine write_gkgrid_bin() + !! Write a binary ome file. + use od_constants, only: dp, bohr2ang, H2eV + use od_io, only: io_time, filename_len, stdout, io_file_unit, io_error + use od_cell, only: nkpoints + use od_electronic, only: nspins, nbands, photo_gkgrid, photo_gkgrid_file_header + use od_constants, only: bohr2ang, H2eV + implicit none + + real(dp):: file_version = 1.0_dp ! File version + integer :: ik, is, ib, i, gdx, gkgrid_unit = 6 + + write (stdout, *) " Write a binary gkgrid file." + + open (unit=gkgrid_unit, form='unformatted', file=trim(outseedname)//".gkgrid_bin") + + write (stdout, *) "-> gkgrid file_version ", file_version + write (gkgrid_unit) file_version + write (stdout, *) "-> gkgrid file_header ", trim(photo_gkgrid_file_header) + write (gkgrid_unit) adjustl(photo_gkgrid_file_header) + + ! write(0,*) nkpoints, nspins, nbands + do ik = 1, nkpoints + do is = 1, nspins + write (gkgrid_unit) (((photo_gkgrid(i, gdx, ib, is, ik), i=1, 3), gdx=1, max_gvec), ib=1, nbands) + end do + end do + + write (stdout, *) " Sucesfully written an unformatted gkgrid file --> "//trim(outseedname)//".gkgrid_bin" + end subroutine write_gkgrid_bin + !========================================================================= ! D I A G O N A L O P T I C A L M A T R I X E L E M E N T S !========================================================================= @@ -256,14 +682,14 @@ subroutine read_dome_fmt() use od_constants, only: dp use od_io, only: io_time, filename_len, seedname, stdout, io_file_unit,& & io_error - use od_cell, only: num_kpoints_on_node, nkpoints + use od_cell, only: nkpoints use od_electronic, only: nspins, nbands, band_gradient use od_constants, only: bohr2ang, H2eV implicit none real(dp):: file_version = 1.0_dp ! File version character(len=100):: string - integer :: ik, is, ib, i, jb, dome_unit = 6 + integer :: ik, is, ib, i, dome_unit = 6 write (stdout, *) " Read a formatted dome file. " @@ -298,16 +724,16 @@ end subroutine read_dome_fmt subroutine write_dome_fmt() !! Write a diagonal ome formatted file. use od_constants, only: dp - use od_io, only: io_time, filename_len, seedname, stdout, io_file_unit,& + use od_io, only: io_time, filename_len, stdout, io_file_unit,& & io_error - use od_cell, only: num_kpoints_on_node, nkpoints + use od_cell, only: nkpoints use od_electronic, only: nspins, nbands, band_gradient use od_constants, only: bohr2ang, H2eV implicit none real(dp):: file_version = 1.0_dp ! File version character(len=100):: string - integer :: ik, is, ib, i, jb, dome_unit = 6 + integer :: ik, is, ib, i, dome_unit = 6 write (stdout, *) " Write a formatted ome file." @@ -344,16 +770,15 @@ end subroutine read_dome_bin subroutine write_dome_bin() !! Write a diagonal ome file. use od_constants, only: dp - use od_io, only: io_time, filename_len, seedname, stdout, io_file_unit,& - & io_error - use od_cell, only: num_kpoints_on_node, nkpoints + use od_io, only: io_time, filename_len, stdout, io_file_unit, io_error + use od_cell, only: nkpoints use od_electronic, only: nspins, nbands, band_gradient use od_constants, only: bohr2ang, H2eV implicit none real(dp):: file_version = 1.0_dp ! File version - integer :: ik, is, ib, i, jb, dome_unit = 6 + integer :: ik, is, ib, i, dome_unit = 6 write (stdout, *) " Write a binary dome file." @@ -951,7 +1376,7 @@ program od2od implicit none logical :: file_found - logical :: ome_conv, dome_conv, pdos_conv, elnes_conv, dummy_conv + logical :: ome_conv, fem_conv, tmcoeff_conv, dome_conv, pdos_conv, elnes_conv, dummy_conv !! Flags to stop people trying to, say, read in a pdos and write out an !! elnes. That's not going to end well. real(kind=dp) :: time0, time1 @@ -1013,6 +1438,8 @@ program od2od write (stdout, *) "+----------------------------------------------------------------------------+" ome_conv = .false. + fem_conv = .false. + tmcoeff_conv = .false. dome_conv = .false. pdos_conv = .false. elnes_conv = .false. @@ -1020,52 +1447,82 @@ program od2od ! Main case to decide what file format to read in. read_input:select case(trim(infile)) -case ("ome_fmt") + case ("ome_fmt") ome_conv = .true. call get_band_energy() call write_read_file() call read_ome_fmt() -case ("ome_bin") + case ("ome_bin") ome_conv = .true. call get_band_energy() call write_read_file() call read_ome_bin() -case ("dome_fmt") + case ("fem_fmt") + fem_conv = .true. + call get_band_energy() + call write_read_file() + call read_fem_fmt() + case ("fem_bin") + fem_conv = .true. + call get_band_energy() + call write_read_file() + call read_fem_bin() + case ("tmprob_fmt") + tmcoeff_conv = .true. + call get_band_energy() + call write_read_file() + call read_tmprob_fmt() + case ("tmprob_bin") + tmcoeff_conv = .true. + call get_band_energy() + call write_read_file() + call read_tmprob_bin() + case ("gkgrid_fmt") + tmcoeff_conv = .true. + call get_band_energy() + call write_read_file() + call read_gkgrid_fmt() + case ("gkgrid_bin") + tmcoeff_conv = .true. + call get_band_energy() + call write_read_file() + call read_gkgrid_bin() + case ("dome_fmt") dome_conv = .true. call get_band_energy() call write_read_file() call read_dome_fmt() -case ("dome_bin") + case ("dome_bin") dome_conv = .true. call get_band_energy() call write_read_file() call read_dome_bin() -case ("pdos_fmt") + case ("pdos_fmt") pdos_conv = .true. call get_band_energy() call write_read_file() call read_pdos_fmt() -case ("pdos_bin") + case ("pdos_bin") pdos_conv = .true. call get_band_energy() call write_read_file() call read_pdos_bin() -case ("elnes_fmt") + case ("elnes_fmt") elnes_conv = .true. call get_band_energy() call write_read_file() call read_elnes_fmt() -case ("elnes_bin") + case ("elnes_bin") elnes_conv = .true. call get_band_energy() call write_read_file() call read_elnes_bin() -case ("dummy") + case ("dummy") dummy_conv = .true. call get_band_energy() call write_read_file() write (stdout, *) " Not reading any input file." -case default + case default call io_error('Unknown Input File format speccified') end select read_input write (stdout, *) "+----------------------------------------------------------------------------+" @@ -1073,39 +1530,63 @@ program od2od write (stdout, *) "+------------------------------- Write File ---------------------------------+" ! Main case to decide what file format to write. write_output:select case(trim(outfile)) -case ("ome_fmt") + case ("ome_fmt") if (.not. (dome_conv .or. ome_conv)) call io_error(' Input format '//trim(infile)//' not compatible with output format '& &//trim(outfile)) if (dome_conv) call pad_an_ome() call write_ome_fmt() -case ("ome_bin") + case ("ome_bin") if (.not. (dome_conv .or. ome_conv)) call io_error(' Input format '//trim(infile)//' not compatible with output format '& &//trim(outfile)) if (dome_conv) call pad_an_ome() call write_ome_bin() -case ("dome_fmt") + case ("fem_fmt") + if (.not. (fem_conv)) call io_error(' Input format '//trim(infile)//' not compatible with output format '& + &//trim(outfile)) + call write_fem_fmt() + case ("fem_bin") + if (.not. (fem_conv)) call io_error(' Input format '//trim(infile)//' not compatible with output format '& + &//trim(outfile)) + call write_fem_bin() + case ("tmprob_fmt") + if (.not. (tmcoeff_conv)) call io_error(' Input format '//trim(infile)//' not compatible with output format'& + &//trim(outfile)) + call write_tmprob_fmt + case ("tmprob_bin") + if (.not. (tmcoeff_conv)) call io_error(' Input format '//trim(infile)//' not compatible with output format'& + &//trim(outfile)) + call write_tmprob_bin + case ("gkgrid_fmt") + if (.not. (tmcoeff_conv)) call io_error(' Input format '//trim(infile)//' not compatible with output format'& + &//trim(outfile)) + call write_gkgrid_fmt + case ("gkgrid_bin") + if (.not. (tmcoeff_conv)) call io_error(' Input format '//trim(infile)//' not compatible with output format'& + &//trim(outfile)) + call write_gkgrid_bin + case ("dome_fmt") if (.not. (dome_conv .or. ome_conv)) call io_error(' Input format '//trim(infile)//& &' not compatible with output format '//trim(outfile)) if (ome_conv) call slice_an_ome() call write_dome_fmt() -case ("dome_bin") + case ("dome_bin") if (.not. (dome_conv .or. ome_conv)) call io_error(' Input format '//trim(infile)//& &' not compatible with output format '//trim(outfile)) if (ome_conv) call slice_an_ome() call write_dome_bin() -case ("pdos_fmt") + case ("pdos_fmt") if (.not. pdos_conv) call io_error(' Input format '//trim(infile)//' not compatible with output format '//trim(outfile)) call write_pdos_fmt() -case ("pdos_bin") + case ("pdos_bin") if (.not. pdos_conv) call io_error(' Input format '//trim(infile)//' not compatible with output format '//trim(outfile)) call write_pdos_bin() -case ("elnes_fmt") + case ("elnes_fmt") if (.not. elnes_conv) call io_error(' Input format '//trim(infile)//' not compatible with output format '//trim(outfile)) call write_elnes_fmt() -case ("elnes_bin") + case ("elnes_bin") if (.not. elnes_conv) call io_error(' Input format '//trim(infile)//' not compatible with output format '//trim(outfile)) call write_elnes_bin() -case ("dummy") + case ("dummy") write (stdout, *) " Not writing any output file." if (dummy_conv) then write (stdout, *) @@ -1114,7 +1595,7 @@ program od2od write (stdout, *) write (stdout, *) " No point in taking up disk space unnecessarily, eh ?" end if -case default + case default call io_error('Unknown Output File format speccified') end select write_output diff --git a/optados/src/optados.f90 b/optados/src/optados.f90 index aaa0aa6b..d273a42c 100644 --- a/optados/src/optados.f90 +++ b/optados/src/optados.f90 @@ -38,7 +38,8 @@ program optados use od_io, only: io_get_seedname, io_time, io_date, io_file_unit,&! Functions & stdout, stderr, seedname ! Variables use od_parameters, only: param_read, param_write_header, param_Dist, param_write, & - param_dealloc, pdos, pdis, dos, jdos, core, optics, iprint, param_write_atomic_coord + param_dealloc, pdos, pdis, dos, jdos, core, optics, photo, iprint, param_write_atomic_coord, & + devel_flag, photo_photon_energy, photo_model use od_cell, only: cell_calc_lattice, cell_report_parameters, cell_dist use od_electronic, only: elec_read_band_energy, elec_read_band_energy_ordered, elec_report_parameters use od_dos, only: dos_calculate @@ -47,10 +48,11 @@ program optados use od_pdos, only: pdos_calculate use od_pdis, only: pdis_calculate use od_optics, only: optics_calculate + use od_photo, only: photo_calculate use od_build, only: build_info implicit none - real(kind=dp) :: time0, time1 ! Varaibles for timing + real(kind=dp) :: time0, time1 ! Variables for timing logical :: odo_found ! Ouptut file exists? character(len=9) :: stat, pos ! Status and position of .odo file character(len=9) :: ctime ! Temp. time string @@ -201,6 +203,23 @@ program optados end if !-------------------------------------------------------------------------! + !-------------------------------------------------------------------------! + ! C A L L P H O T O E M I S S I O N R O U T I N E S + if (photo) then + time0 = io_time() + call photo_calculate + time1 = io_time() + if (on_root) then + write (stdout, '(1x,a78)') '| |' + write (stdout, '(1x,a59,f11.3,a8)') & + '+ Time to calculate Photoemission ', time1 - time0, ' (sec) +' + write (stdout, '(1x,a78)') '+============================================================================+' + write (stdout, *) ' ' + write (stdout, *) ' ' + end if + end if + !-------------------------------------------------------------------------! + !-------------------------------------------------------------------------! ! C A L L J D O S R O U T I N E S if (jdos) then diff --git a/optados/src/optics.f90 b/optados/src/optics.f90 index 37a90b94..0419ab1d 100644 --- a/optados/src/optics.f90 +++ b/optados/src/optics.f90 @@ -23,14 +23,28 @@ !=============================================================================== module od_optics - use od_constants, only: dp + use od_constants, only: dp, epsilon_0, e_charge, e_mass, hbar, c_speed implicit none private public :: optics_calculate + public :: make_weights + public :: calc_epsilon_2 + public :: calc_epsilon_1 + public :: calc_conduct + public :: calc_refract + public :: calc_loss_fn + public :: calc_absorp + public :: calc_reflect + public :: write_epsilon + public :: write_conduct + public :: write_refract + public :: write_loss_fn + public :: write_absorp + public :: write_reflect type :: graph_labels - character(20) :: name + character(40) :: name character(40) :: title character(20) :: x_label character(20) :: y_label @@ -65,12 +79,6 @@ module od_optics integer :: N integer :: N2 - real(kind=dp), parameter :: epsilon_0 = 8.8541878176E-12_dp - real(kind=dp), parameter :: e_charge = 1.602176487E-19_dp - real(kind=dp), parameter :: e_mass = 9.10938215E-31_dp - real(kind=dp), parameter :: hbar = 1.054571628E-34_dp - real(kind=dp), parameter :: c_speed = 299792458.0_dp - contains subroutine optics_calculate @@ -79,12 +87,12 @@ subroutine optics_calculate ! use od_electronic, only: optical_mat, elec_read_optical_mat, nbands, nspins, & - efermi, efermi_set, elec_dealloc_optical - use od_cell, only: cell_volume, num_kpoints_on_node, kpoint_r + efermi, efermi_set, elec_dealloc_optical + use od_cell, only: cell_volume, num_kpoints_on_node, kpoint_r, real_lattice use od_jdos_utils, only: jdos_utils_calculate use od_comms, only: on_root, my_node_id use od_parameters, only: optics_geom, adaptive, linear, fixed, optics_intraband, & - optics_drude_broadening + optics_drude_broadening, photo_slab_min, photo_slab_max, devel_flag use od_dos_utils, only: dos_utils_calculate_at_e, dos_utils_set_efermi use od_io, only: stdout @@ -101,10 +109,10 @@ subroutine optics_calculate call elec_read_optical_mat ! Form matrix element - call make_weights + call make_weights(matrix_weights) ! Send matrix element to jDOS routine and get weighted jDOS back - call jdos_utils_calculate(matrix_weights, weighted_jdos) + call jdos_utils_calculate(matrix_weights, weighted_jdos=weighted_jdos) ! Calculate weighted DOS at Ef for intraband term if (optics_intraband) then @@ -124,11 +132,9 @@ subroutine optics_calculate if (on_root) then ! Calculate epsilon_2 - call calc_epsilon_2 - + call calc_epsilon_2(weighted_jdos, weighted_dos_at_e) ! Calculate epsilon_1 call calc_epsilon_1 - ! Calculate other optical properties if (.not. index(optics_geom, 'tensor') > 0) then call calc_conduct @@ -142,8 +148,8 @@ subroutine optics_calculate call write_epsilon if (.not. index(optics_geom, 'tensor') > 0) then call write_conduct - call write_refract call write_loss_fn + call write_refract call write_absorp call write_reflect end if @@ -154,17 +160,19 @@ end subroutine optics_calculate ! Subroutines go here !*************************************************************** - subroutine make_weights + subroutine make_weights(matrix_weights) !*************************************************************** use od_constants, only: dp use od_electronic, only: nbands, nspins, optical_mat, num_electrons, & - electrons_per_state, band_energy, efermi + electrons_per_state, band_energy, efermi use od_cell, only: nkpoints, cell_volume, num_kpoints_on_node, cell_get_symmetry, & - num_crystal_symmetry_operations, crystal_symmetry_operations, kpoint_r + num_crystal_symmetry_operations, crystal_symmetry_operations, kpoint_r use od_parameters, only: optics_geom, optics_qdir, legacy_file_format, scissor_op, devel_flag use od_io, only: io_error, stdout use od_comms, only: my_node_id + real(kind=dp), intent(out), allocatable, dimension(:, :, :, :, :) :: matrix_weights + real(kind=dp), dimension(3) :: qdir real(kind=dp), dimension(3) :: qdir1 real(kind=dp), dimension(3) :: qdir2 @@ -353,7 +361,7 @@ subroutine make_weights matrix_weights(n_eigen, n_eigen2, N, N_spin, N_geom) = (factor/3.0_dp)* & & (real(g(1)*conjg(g(1)), dp) + real(g(2)*conjg(g(2)), dp) + & & real(g(3)*conjg(g(3)), dp)) - write (*, *) matrix_weights(n_eigen, n_eigen2, N, N_spin, N_geom) + ! write (*, *) matrix_weights(n_eigen, n_eigen2, N, N_spin, N_geom) ! print *, n_eigen, n_eigen2, N, matrix_weights(n_eigen,n_eigen2,N,N_spin,N_geom) ! print *, band_energy(n_eigen2,N_spin,N), band_energy(n_eigen,N_spin,N) else @@ -492,7 +500,7 @@ subroutine make_weights end subroutine make_weights !*************************************************************** - subroutine calc_epsilon_2 + subroutine calc_epsilon_2(weighted_jdos, weighted_dos_at_e, photo_atom_volume) !*************************************************************** ! This subroutine calculates epsilon_2 @@ -500,19 +508,37 @@ subroutine calc_epsilon_2 use od_cell, only: nkpoints, cell_volume use od_electronic, only: nspins, electrons_per_state, nbands use od_jdos_utils, only: E, jdos_nbins - use od_parameters, only: optics_intraband, optics_drude_broadening + use od_parameters, only: optics_intraband, optics_drude_broadening, photo, iprint + use od_io, only: stdout + use od_comms, only: on_root + + real(kind=dp), intent(in), allocatable, dimension(:, :, :) :: weighted_jdos + real(kind=dp), intent(in), allocatable, dimension(:, :) :: weighted_dos_at_e + real(kind=dp), intent(in), optional :: photo_atom_volume integer :: N_energy integer :: N integer :: N_spin integer :: N2 + integer :: jdos_bin + integer :: i, j real(kind=dp) ::dE real(kind=dp) :: x real(kind=dp) :: epsilon2_const dE = E(2) - E(1) - epsilon2_const = (e_charge*pi*1E-20)/(cell_volume*1E-30*epsilon_0) + if (present(photo_atom_volume)) then + epsilon2_const = (e_charge*pi*1E-20)/(photo_atom_volume*1E-30*epsilon_0) + + if (iprint .gt. 2) write (stdout, '(1x,a33,1x,f15.8,3x,a25)') & + '+------------ Using atom_volume =', photo_atom_volume, '------------------------+' + else + if (iprint .gt. 2) write (stdout, '(1x,a78)') & + '+----------------------------- Using cell_volume ----------------------------+' + epsilon2_const = (e_charge*pi*1E-20)/(cell_volume*1E-30*epsilon_0) + end if + !epsilon2_const = (e_charge*pi*1E-20)/(cell_volume*1E-30*epsilon_0) if (optics_intraband) then allocate (intra(N_geom)) @@ -522,7 +548,16 @@ subroutine calc_epsilon_2 intra(N) = intra(N) + weighted_dos_at_e(N_spin, N) end do end do - intra = intra*e_charge/(cell_volume*1E-10*epsilon_0) + if (present(photo_atom_volume)) then + if (iprint .gt. 2) write (stdout, '(1x,a33,1x,f15.8,3x,a25)') '+------------ Using atom_volume =', photo_atom_volume, & + '------------------------+' + intra = intra*e_charge/(photo_atom_volume*1E-10*epsilon_0) + else + if (iprint .gt. 2) write (stdout, '(1x,a78)') & + '+----------------------------- Using cell_volume ----------------------------+' + intra = intra*e_charge/(cell_volume*1E-10*epsilon_0) + end if + ! intra = intra*e_charge/(cell_volume*1E-10*epsilon_0) end if if (.not. optics_intraband) then @@ -560,9 +595,17 @@ subroutine calc_epsilon_2 x = x + ((N*(dE**2)*epsilon(N, 2, 1, 3))/((hbar**2)*E(N)*e_charge)) end if end do - N_eff = (x*e_mass*cell_volume*1E-30*epsilon_0*2)/(pi) + if (present(photo_atom_volume)) then + N_eff = (x*e_mass*photo_atom_volume*1E-30*epsilon_0*2)/(pi) + if (iprint .gt. 2) write (stdout, '(1x,a33,1x,f15.8,3x,a25)') '+------------ Using atom_volume =', photo_atom_volume, & + '------------------------+' + else + if (iprint .gt. 2) write (stdout, '(1x,a78)') & + '+----------------------------- Using cell_volume ----------------------------+' + N_eff = (x*e_mass*cell_volume*1E-30*epsilon_0*2)/(pi) + end if + ! N_eff = (x*e_mass*cell_volume*1E-30*epsilon_0*2)/(pi) end if - end subroutine calc_epsilon_2 !*************************************************************** @@ -774,11 +817,11 @@ subroutine calc_refract &(epsilon(N_energy, 2, 1, 1)**2))**0.5_dp) - epsilon(N_energy, 1, 1, 1)))**(0.5_dp) end do else - do N_energy = 1, jdos_nbins + do N_energy = 2, jdos_nbins refract(N_energy, 1) = (0.5_dp*((((epsilon(N_energy, 1, 1, 3)**2) +& &((epsilon(N_energy, 2, 1, 3)/(E(N_energy)*e_charge))**2))**0.5_dp) + epsilon(N_energy, 1, 1, 1)))**(0.5_dp) end do - do N_energy = 1, jdos_nbins + do N_energy = 2, jdos_nbins refract(N_energy, 2) = (0.5_dp*((((epsilon(N_energy, 1, 1, 1)**2) +& &((epsilon(N_energy, 2, 1, 3)/(E(N_energy)*e_charge))**2))**0.5_dp) - epsilon(N_energy, 1, 1, 1)))**(0.5_dp) end do @@ -825,7 +868,7 @@ subroutine calc_reflect end subroutine calc_reflect !*************************************************************** - subroutine write_epsilon + subroutine write_epsilon(photo_box, photo_at_e, photo_volume) !*************************************************************** ! This subroutine writes out the dielectric function @@ -839,10 +882,18 @@ subroutine write_epsilon integer :: N, N2, N3 real(kind=dp) ::dE integer :: epsilon_unit + integer, intent(in), optional :: photo_box + real(kind=dp), intent(in), dimension(:, :), optional :: photo_at_e + real(kind=dp), intent(in), optional :: photo_volume + character(len=3) :: box_char type(graph_labels) :: label - - label%name = "epsilon" + if (present(photo_box)) then + write (box_char, '(I0.3)') photo_box + label%name = "epsilon_photo_box_"//trim(adjustl(box_char)) + else + label%name = "epsilon" + end if label%title = "Dielectric Function" ! Dimensionless label%x_label = "Energy (eV)" label%y_label = "" @@ -853,40 +904,54 @@ subroutine write_epsilon ! Open the output file epsilon_unit = io_file_unit() - open (unit=epsilon_unit, action='write', file=trim(seedname)//'_epsilon.dat') - + if (present(photo_box)) then + write (box_char, '(I0.3)') photo_box + open (unit=epsilon_unit, action='write', file=trim(seedname)//'_epsilon_photo_box_'//trim(adjustl(box_char))//'.dat') + else + open (unit=epsilon_unit, action='write', file=trim(seedname)//'_epsilon.dat') + end if ! Write into the output file - write (epsilon_unit, *) '#*********************************************' - write (epsilon_unit, *) '# Dielectric function ' - write (epsilon_unit, *) '#*********************************************' - write (epsilon_unit, *) '#' - write (epsilon_unit, *) '# Number of k-points: ', nkpoints + write (epsilon_unit, '(a46)') '#*********************************************' + write (epsilon_unit, '(a32)') '# Dielectric function' + write (epsilon_unit, '(a46)') '#*********************************************' + write (epsilon_unit, '(a1)') '#' + write (epsilon_unit, '(a22, i6)') '# Number of k-points: ', nkpoints if (nspins == 1) then - write (epsilon_unit, *) '# Number of electrons:', num_electrons(1) + write (epsilon_unit, '(a23, f12.5)') '# Number of electrons:', num_electrons(1) + else + write (epsilon_unit, '(a23, f12.5, 1x, f12.5)') '# Number of electrons:', num_electrons(1), num_electrons(2) + end if + write (epsilon_unit, '(a15,i7)') '# Number of bands:', nbands + if (present(photo_volume)) then + write (epsilon_unit, '(a57,f12.5)') '# Volume calculated for optics and photoemission (Ang^3):', photo_volume else - write (epsilon_unit, *) '# Number of electrons:', num_electrons(1), num_electrons(2) + write (epsilon_unit, '(a35, f23.10)') '# Volume of the unit cell (Ang^3):', cell_volume end if - write (epsilon_unit, *) '# Number of bands:', nbands - write (epsilon_unit, *) '# Volume of the unit cell (Ang^3):', cell_volume - write (epsilon_unit, *) '#' - write (epsilon_unit, '(1x,a,f10.6,1x,a,f10.6,1x,a)') & + write (epsilon_unit, '(a1)') '#' + write (epsilon_unit, '(a35,f10.6,1x,a5,f10.6,1x,a8)') & & '# Dielectric function calculated to', jdos_max_energy, 'eV in', dE, 'eV steps' - write (epsilon_unit, *) '#' - write (epsilon_unit, *) '# optics_geom: ', optics_geom + write (epsilon_unit, '(a1)') '#' + write (epsilon_unit, '(a16,a20)') '# optics_geom: ', optics_geom if (index(optics_geom, 'polar') > 0) then - write (epsilon_unit, '(1x,a,f10.3,f10.3,f10.3)') '# q-vector', & + write (epsilon_unit, '(a10,f10.3,f10.3,f10.3)') '# q-vector', & & optics_qdir(1), optics_qdir(2), optics_qdir(3) - write (epsilon_unit, *) '# q_weight:', q_weight + write (epsilon_unit, '(a12,f23.10)') '# q_weight:', q_weight end if if (scissor_op > 0) then - write (epsilon_unit, '(1x,a,f10.3,f10.3,f10.3)') '# Scissor operator:', scissor_op + write (epsilon_unit, '(a19,3(1x,f12.5))') '# Scissor operator:', scissor_op end if - write (epsilon_unit, *) '#' + write (epsilon_unit, '(a1)') '#' if (optics_intraband) then - write (epsilon_unit, *) '# Calculation includes intraband term' - if (fixed) write (epsilon_unit, *) '# DOS at Ef:', dos_at_e(1, :) - if (adaptive) write (epsilon_unit, *) '# DOS at Ef:', dos_at_e(2, :) - if (linear) write (epsilon_unit, *) '# DOS at Ef:', dos_at_e(3, :) + write (epsilon_unit, '(a37)') '# Calculation includes intraband term' + if (present(photo_at_e)) then + if (fixed) write (epsilon_unit, *) '# DOS at Ef:', photo_at_e(1, :) + if (adaptive) write (epsilon_unit, *) '# DOS at Ef:', photo_at_e(2, :) + if (linear) write (epsilon_unit, *) '# DOS at Ef:', photo_at_e(3, :) + else + if (fixed) write (epsilon_unit, *) '# DOS at Ef:', dos_at_e(1, :) + if (adaptive) write (epsilon_unit, *) '# DOS at Ef:', dos_at_e(2, :) + if (linear) write (epsilon_unit, *) '# DOS at Ef:', dos_at_e(3, :) + end if do N = 1, N_geom write (epsilon_unit, *) '# Plasmon energy:', (intra(N)**0.5) end do @@ -907,7 +972,7 @@ subroutine write_epsilon do N2 = 2, 3 write (epsilon_unit, *) '' write (epsilon_unit, *) '' - do N = 1, jdos_nbins + do N = 2, jdos_nbins write (epsilon_unit, *) E(N), epsilon(N, 1, 1, N2), epsilon(N, 2, 1, N2)/(E(N)*e_charge) end do end do @@ -967,7 +1032,7 @@ subroutine write_loss_fn use od_cell, only: nkpoints, cell_volume use od_parameters, only: optics_geom, optics_qdir, jdos_max_energy, scissor_op, output_format, & - optics_intraband, optics_lossfn_broadening + optics_intraband, optics_lossfn_broadening use od_electronic, only: nbands, num_electrons, nspins use od_jdos_utils, only: jdos_nbins, E use od_io, only: seedname, io_file_unit, stdout @@ -1011,9 +1076,9 @@ subroutine write_loss_fn write (loss_fn_unit, *) '#' write (loss_fn_unit, *) '# Number of k-points: ', nkpoints if (nspins == 1) then - write (loss_fn_unit, *) '# Number of electrons:', num_electrons(1) + write (loss_fn_unit, '(a23, f12.5)') '# Number of electrons:', num_electrons(1) else - write (loss_fn_unit, *) '# Number of electrons:', num_electrons(1), num_electrons(2) + write (loss_fn_unit, '(a23, f12.5, 1x, f12.5)') '# Number of electrons:', num_electrons(1), num_electrons(2) end if write (loss_fn_unit, *) '# No of bands:', nbands write (loss_fn_unit, *) '# Volume of the unit cell (Ang^3):', cell_volume @@ -1119,9 +1184,9 @@ subroutine write_conduct write (conduct_unit, *) '#' write (conduct_unit, *) '# Number of k-points: ', nkpoints if (nspins == 1) then - write (conduct_unit, *) '# Number of electrons:', num_electrons(1) + write (conduct_unit, '(a23, f12.5)') '# Number of electrons:', num_electrons(1) else - write (conduct_unit, *) '# Number of electrons:', num_electrons(1), num_electrons(2) + write (conduct_unit, '(a23, f12.5, 1x, f12.5)') '# Number of electrons:', num_electrons(1), num_electrons(2) end if write (conduct_unit, *) '# No of bands:', nbands write (conduct_unit, *) '# Volume of the unit cell (Ang^3):', cell_volume @@ -1156,7 +1221,7 @@ subroutine write_conduct end subroutine write_conduct !*************************************************************** - subroutine write_refract + subroutine write_refract(photo_box, photo_volume) !*************************************************************** ! This subroutine writes out the refractive index @@ -1168,10 +1233,17 @@ subroutine write_refract integer :: N integer :: refract_unit + integer, intent(in), optional :: photo_box + real(kind=dp), intent(in), optional :: photo_volume + character(len=3) :: box_char type(graph_labels) :: label - - label%name = "refractive_index" + if (present(photo_box)) then + write (box_char, '(I0.3)') photo_box + label%name = "refractive_index_photo_box_"//trim(adjustl(box_char)) + else + label%name = "refractive_index" + end if label%title = "Refractive Index" ! Dimensionless label%x_label = "Energy (eV)" label%y_label = "" @@ -1180,33 +1252,42 @@ subroutine write_refract ! Open the output file refract_unit = io_file_unit() - open (unit=refract_unit, action='write', file=trim(seedname)//'_refractive_index.dat') + if (present(photo_box)) then + write (box_char, '(I0.3)') photo_box + open (unit=refract_unit, action='write', file=trim(seedname)//'_refractive_index_photo_box_'//trim(adjustl(box_char))//'.dat') + else + open (unit=refract_unit, action='write', file=trim(seedname)//'_refractive_index.dat') + end if ! Write into the output file - write (refract_unit, *) '#*********************************************' - write (refract_unit, *) '# Refractive index ' - write (refract_unit, *) '#*********************************************' - write (refract_unit, *) '#' - write (refract_unit, *) '# N=n+ik' - write (refract_unit, *) '#' - write (refract_unit, *) '# Number of k-points: ', nkpoints + write (refract_unit, '(a46)') '#*********************************************' + write (refract_unit, '(a30)') '# Refractive index' + write (refract_unit, '(a46)') '#*********************************************' + write (refract_unit, '(a1)') '#' + write (refract_unit, '(a8)') '# N=n+ik' + write (refract_unit, '(a1)') '#' + write (refract_unit, '(a22, i6)') '# Number of k-points: ', nkpoints if (nspins == 1) then - write (refract_unit, *) '# Number of electrons:', num_electrons(1) + write (refract_unit, '(a23, f12.5)') '# Number of electrons:', num_electrons(1) else - write (refract_unit, *) '# Number of electrons:', num_electrons(1), num_electrons(2) + write (refract_unit, '(a23, f12.5, 1x, f12.5)') '# Number of electrons:', num_electrons(1), num_electrons(2) end if - write (refract_unit, *) '# No of bands:', nbands - write (refract_unit, *) '# Volume of the unit cell (Ang^3):', cell_volume - write (refract_unit, *) '#' - write (refract_unit, *) '# optics_geom: ', optics_geom + write (refract_unit, '(a15,i7)') '# No of bands:', nbands + if (present(photo_volume)) then + write (refract_unit, '(a57,f12.5)') '# Volume calculated for optics and photoemission (Ang^3):', photo_volume + else + write (refract_unit, '(a35, f23.10)') '# Volume of the unit cell (Ang^3):', cell_volume + end if + write (refract_unit, '(a1)') '#' + write (refract_unit, '(a16,a20)') '# optics_geom: ', optics_geom if (index(optics_geom, 'polar') > 0) then - write (refract_unit, '(1x,a,f10.3,f10.3,f10.3)') '# q-vector', optics_qdir(1), optics_qdir(2), optics_qdir(3) - write (refract_unit, *) '# q_weight:', q_weight + write (refract_unit, '(a12,3(1x,f12.5))') '# q-vector', optics_qdir(1), optics_qdir(2), optics_qdir(3) + write (refract_unit, '(a12,f23.10)') '# q_weight:', q_weight end if if (scissor_op > 0) then - write (refract_unit, '(1x,a,f10.3,f10.3,f10.3)') '# Scissor operator:', scissor_op + write (refract_unit, '(1x,a19,3(1x,f12.5))') '# Scissor operator:', scissor_op end if - write (refract_unit, *) '#' + write (refract_unit, '(a1)') '#' do N = 1, jdos_nbins write (refract_unit, *) E(N), refract(N, 1), refract(N, 2) end do @@ -1225,7 +1306,7 @@ subroutine write_refract end subroutine write_refract !*************************************************************** - subroutine write_absorp + subroutine write_absorp(photo_box, photo_volume) !*************************************************************** ! This subroutine writes out the absorption coefficient @@ -1237,10 +1318,17 @@ subroutine write_absorp integer :: N integer :: absorp_unit + integer, intent(in), optional :: photo_box + real(kind=dp), intent(in), optional :: photo_volume + character(len=3) :: box_char type(graph_labels) :: label - - label%name = "absorption" + if (present(photo_box)) then + write (box_char, '(I0.3)') photo_box + label%name = "absorption_photo_box_"//trim(adjustl(box_char)) + else + label%name = "absorption" + end if label%title = "Absorption Coefficient (m-1)" ! per metre label%x_label = "Energy (eV)" label%y_label = "" @@ -1248,35 +1336,50 @@ subroutine write_absorp ! Open the output file absorp_unit = io_file_unit() - open (unit=absorp_unit, action='write', file=trim(seedname)//'_absorption.dat') + if (present(photo_box)) then + write (box_char, '(I0.3)') photo_box + open (unit=absorp_unit, action='write', file=trim(seedname)//'_absorption_photo_box_'//trim(adjustl(box_char))//'.dat') + else + open (unit=absorp_unit, action='write', file=trim(seedname)//'_absorption.dat') + end if ! Write into the output file - write (absorp_unit, *) '#*********************************************' - write (absorp_unit, *) '# Absorption coefficent ' - write (absorp_unit, *) '#*********************************************' - write (absorp_unit, *) '#' - write (absorp_unit, *) '#' - write (absorp_unit, *) '# Number of k-points: ', nkpoints + write (absorp_unit, '(a46)') '#*********************************************' + write (absorp_unit, '(a35)') '# Absorption coefficent' + write (absorp_unit, '(a46)') '#*********************************************' + write (absorp_unit, '(a1)') '#' + write (absorp_unit, '(a1)') '#' + write (absorp_unit, '(a22, i6)') '# Number of k-points: ', nkpoints if (nspins == 1) then - write (absorp_unit, *) '# Number of electrons:', num_electrons(1) + write (absorp_unit, '(a23, f12.5)') '# Number of electrons: ', num_electrons(1) + else + write (absorp_unit, '(a23, f12.5, 1x, f12.5)') '# Number of electrons: ', num_electrons(1), num_electrons(2) + end if + write (absorp_unit, '(a15,i7)') '# No of bands: ', nbands + if (present(photo_volume)) then + write (absorp_unit, '(a57,f12.5)') '# Volume calculated for optics and photoemission (Ang^3):', photo_volume else - write (absorp_unit, *) '# Number of electrons:', num_electrons(1), num_electrons(2) + write (absorp_unit, '(a35, f23.10)') '# Volume of the unit cell (Ang^3): ', cell_volume end if - write (absorp_unit, *) '# No of bands:', nbands - write (absorp_unit, *) '# Volume of the unit cell (Ang^3):', cell_volume - write (absorp_unit, *) '#' - write (absorp_unit, *) '# optics_geom: ', optics_geom + write (absorp_unit, '(a1)') '#' + write (absorp_unit, '(a16,a20)') '# optics_geom: ', optics_geom if (index(optics_geom, 'polar') > 0) then - write (absorp_unit, '(1x,a,f10.3,f10.3,f10.3)') '# q-vector', optics_qdir(1), optics_qdir(2), optics_qdir(3) - write (absorp_unit, *) '# q_weight:', q_weight + write (absorp_unit, '(a12,3(1x,f12.5))') '# q-vector :', optics_qdir(1), optics_qdir(2), optics_qdir(3) + write (absorp_unit, '(a12,f23.10)') '# q_weight :', q_weight end if if (scissor_op > 0) then - write (absorp_unit, '(1x,a,f10.3,f10.3,f10.3)') '# Scissor operator:', scissor_op + write (absorp_unit, '(a19,3(1x,f12.5))') '# Scissor operator:', scissor_op + end if + write (absorp_unit, '(a1)') '#' + if (.not. present(photo_box)) then + do N = 1, jdos_nbins + write (absorp_unit, *) E(N), absorp(N) + end do + else + do N = 1, jdos_nbins + write (absorp_unit, '(2(1x,es37.30))') E(N), absorp(N) + end do end if - write (absorp_unit, *) '#' - do N = 1, jdos_nbins - write (absorp_unit, *) E(N), absorp(N) - end do ! Close output file close (unit=absorp_unit) @@ -1292,7 +1395,7 @@ subroutine write_absorp end subroutine write_absorp !*************************************************************** - subroutine write_reflect + subroutine write_reflect(photo_box, photo_volume) !*************************************************************** ! This subroutine writes out the reflection coefficient @@ -1304,9 +1407,17 @@ subroutine write_reflect integer :: N integer :: reflect_unit + integer, intent(in), optional :: photo_box + real(kind=dp), intent(in), optional :: photo_volume + character(len=3) :: box_char type(graph_labels) :: label - label%name = "reflection" + if (present(photo_box)) then + write (box_char, '(I0.3)') photo_box + label%name = "reflection_photo_box_"//trim(adjustl(box_char)) + else + label%name = "reflection" + end if label%title = "Reflection Coefficient" ! Dimensionless label%x_label = "Energy (eV)" label%y_label = "" @@ -1314,36 +1425,51 @@ subroutine write_reflect ! Open the output file reflect_unit = io_file_unit() - open (unit=reflect_unit, action='write', file=trim(seedname)//'_reflection.dat') + if (present(photo_box)) then + write (box_char, '(I0.3)') photo_box + open (unit=reflect_unit, action='write', file=trim(seedname)//'_reflection_photo_box_'//trim(adjustl(box_char))//'.dat') + else + open (unit=reflect_unit, action='write', file=trim(seedname)//'_reflection.dat') + end if ! Write into the output file - write (reflect_unit, *) '#*********************************************' - write (reflect_unit, *) '# Reflection coefficient ' - write (reflect_unit, *) '#*********************************************' - write (reflect_unit, *) '#' - write (reflect_unit, *) '# N=n+ik' - write (reflect_unit, *) '#' - write (reflect_unit, *) '# Number of k-points: ', nkpoints + write (reflect_unit, '(a46)') '#*********************************************' + write (reflect_unit, '(a34)') '# Reflection coefficient' + write (reflect_unit, '(a46)') '#*********************************************' + write (reflect_unit, '(a1)') '#' + write (reflect_unit, '(a8)') '# N=n+ik' + write (reflect_unit, '(a1)') '#' + write (reflect_unit, '(a22, i6)') '# Number of k-points: ', nkpoints if (nspins == 1) then - write (reflect_unit, *) '# Number of electrons:', num_electrons(1) + write (reflect_unit, '(a23, f12.5)') '# Number of electrons: ', num_electrons(1) else - write (reflect_unit, *) '# Number of electrons:', num_electrons(1), num_electrons(2) + write (reflect_unit, '(a23, f12.5, 1x, f12.5)') '# Number of electrons:', num_electrons(1), num_electrons(2) end if - write (reflect_unit, *) '# No of bands:', nbands - write (reflect_unit, *) '# Volume of the unit cell (Ang^3):', cell_volume - write (reflect_unit, *) '#' - write (reflect_unit, *) '# optics_geom: ', optics_geom + write (reflect_unit, '(a15,i7)') '# No of bands: ', nbands + if (present(photo_volume)) then + write (reflect_unit, '(a57,f12.5)') '# Volume calculated for optics and photoemission (Ang^3):', photo_volume + else + write (reflect_unit, '(a35, f23.10)') '# Volume of the unit cell (Ang^3): ', cell_volume + end if + write (reflect_unit, '(a1)') '#' + write (reflect_unit, '(a16,a20)') '# optics_geom: ', optics_geom if (index(optics_geom, 'polar') > 0) then - write (reflect_unit, '(1x,a,f10.3,f10.3,f10.3)') '# q-vector', optics_qdir(1), optics_qdir(2), optics_qdir(3) - write (reflect_unit, *) '# q_weight:', q_weight + write (reflect_unit, '(a12,3(1x,f12.5))') '# q-vector :', optics_qdir(1), optics_qdir(2), optics_qdir(3) + write (reflect_unit, '(a12,f23.10)') '# q_weight :', q_weight end if if (scissor_op > 0) then - write (reflect_unit, '(1x,a,f10.3,f10.3,f10.3)') '# Scissor operator:', scissor_op + write (reflect_unit, '(a19,3(1x,f12.5))') '# Scissor operator:', scissor_op + end if + write (reflect_unit, '(a1)') '#' + if (.not. present(photo_box)) then + do N = 1, jdos_nbins + write (reflect_unit, *) E(N), reflect(N) + end do + else + do N = 1, jdos_nbins + write (reflect_unit, '(2(1x,es37.30))') E(N), reflect(N) + end do end if - write (reflect_unit, *) '#' - do N = 1, jdos_nbins - write (reflect_unit, *) E(N), reflect(N) - end do ! Close output file close (unit=reflect_unit) diff --git a/optados/src/parameters.f90 b/optados/src/parameters.f90 index 40552086..197c83b9 100644 --- a/optados/src/parameters.f90 +++ b/optados/src/parameters.f90 @@ -5,7 +5,7 @@ ! Young-Su Lee, Nicola Marzari, Ivo Souza, David Vanderbilt ! ! ! ! This file is distributed under the terms of the GNU ! -! General Public License. See the file `COPYING' in ! +! General Public License. See the file 'COPYING' in ! ! the root directory of the present distribution, or ! ! http://www.gnu.org/copyleft/gpl.txt . ! ! ! @@ -59,6 +59,7 @@ module od_parameters logical, public, save :: compare_jdos logical, public, save :: optics logical, public, save :: core + logical, public, save :: photo !Broadening parameters logical, public, save :: fixed @@ -118,6 +119,34 @@ module od_parameters logical, public, save :: LAI_lorentzian real(kind=dp), public, save :: core_chemical_shift ! used in conjunction with miz_chemical_shift script in tools + ! Photoemission parameters - F.Mildner, et al. Jun-2025 + character(len=20), public, save :: photo_model + character(len=90), public, save :: photo_output + character(len=20), public, save :: photo_momentum + real(kind=dp), public, save :: photo_photon_energy + logical, public, save :: photo_energy_sweep + real(kind=dp), public, save :: photo_photon_min + real(kind=dp), public, save :: photo_photon_max + real(kind=dp), public, save :: photo_slab_min + real(kind=dp), public, save :: photo_slab_max + real(kind=dp), public, save :: photo_work_function + real(kind=dp), public, save :: photo_bulk_cutoff + real(kind=dp), public, save :: photo_temperature + real(kind=dp), public, save :: photo_elec_field + integer, public, save :: photo_len_imfp_value + real(kind=dp), dimension(:), allocatable, public, save :: photo_imfp_value + character(len=20), public, save :: photo_imfp_choice + real(kind=dp), public, save :: photo_phi_min + real(kind=dp), public, save :: photo_phi_max + real(kind=dp), public, save :: photo_theta_min + real(kind=dp), public, save :: photo_theta_max + real(kind=dp), public, save :: photo_bindenergy_broadening + real(kind=dp), public, save :: photo_pmat_bin_width + real(kind=dp), public, save :: photo_const_bindenergy_value + logical, public, save :: photo_remove_box_states + logical, public, save :: photo_use_tmprob + integer, public, save :: photo_gk_max_vectors + real(kind=dp), public, save :: lenconfac private @@ -168,7 +197,7 @@ subroutine param_read() call io_error('Error: value of energy_unit not recognised in param_read') dos = .false.; pdos = .false.; pdis = .false.; jdos = .false.; optics = .false. - core = .false.; compare_dos = .false.; compare_jdos = .false. + core = .false.; compare_dos = .false.; compare_jdos = .false.; photo = .false.; photo_energy_sweep = .false. call param_get_vector_length('task', found, i_temp) if (found .and. i_temp > 0) then allocate (task_string(i_temp), stat=ierr) @@ -191,6 +220,10 @@ subroutine param_read() dos = .true.; compare_dos = .true. elseif (index(task_string(loop), 'dos') > 0) then dos = .true. + elseif (index(task_string(loop), 'photoemission') > 0) then + photo = .true. + elseif (index(task_string(loop), 'photo_energy_sweep') > 0) then + photo = .true.; photo_energy_sweep = .true. elseif (index(task_string(loop), 'none') > 0) then dos = .false.; pdos = .false.; jdos = .false.; optics = .false.; core = .false. elseif (index(task_string(loop), 'all') > 0) then @@ -202,13 +235,12 @@ subroutine param_read() deallocate (task_string, stat=ierr) if (ierr /= 0) call io_error('Error: param_read - deallocation failed for task_string') end if - if ((compare_dos .or. compare_jdos) .and. (pdos .or. core .or. optics)) & - call io_error('Error: compare_dos/compare_jdos are not comptable with pdos, core or optics tasks') + if ((compare_dos .or. compare_jdos) .and. (pdos .or. core .or. optics .or. photo)) & + call io_error('Error: compare_dos/compare_jdos are not comptable with pdos, core, optics or photoemission tasks') - if (pdis .and. (optics .or. core .or. jdos .or. pdos .or. dos .or. compare_dos .or. compare_jdos)) & + if (pdis .and. (optics .or. core .or. jdos .or. pdos .or. dos .or. compare_dos .or. compare_jdos .or. photo)) & call io_error('Error: projected bandstructure not compatible with any other tasks') - i_temp = 0 fixed = .false.; adaptive = .false.; linear = .false.; quad = .false. call param_get_keyword('broadening', found, c_value=c_string) if (found) then @@ -252,7 +284,7 @@ subroutine param_read() linear_smearing = 0.0_dp call param_get_keyword('linear_smearing', found, r_value=linear_smearing) - efermi_user = -990.0_dp + efermi_user = -999.0_dp if (.not. pdis) then efermi_choice = "optados" else @@ -411,10 +443,120 @@ subroutine param_read() call param_get_keyword('lai_lorentzian_offset', found, r_value=LAI_lorentzian_offset) if (LAI_lorentzian_offset .lt. 0.0_dp) call io_error('Error: LAI_lorentzian_offset must be positive') + ! Photoemission parameters - V.Chang Nov-2020, F.Mildner Nov-2022/Mar-2025 + if (photo .and. index(optics_geom, 'tensor') > 0) then + call io_error('Error: optics_geom tensor requested, but this does not currently work with photoemission') + end if + photo_model = '1step' + call param_get_keyword('photo_model', found, c_value=photo_model) + if (index(photo_model, '3step') > 0 .and. index(photo_model, '1step') > 0 .or. & + index(photo_model, '3step') > 0 .and. index(photo_model, 'ds_like_pe') > 0 .or. & + index(photo_model, '1step') > 0 .and. index(photo_model, 'ds_like_pe') > 0) then + call io_error('Error: value of photoemission model not recognised in param_read') + end if + + photo_momentum = 'crystal' + call param_get_keyword('photo_momentum', found, c_value=photo_momentum) + if (index(photo_momentum, 'kp') == 0 .and. index(photo_momentum, 'crystal') == 0 .and. index(photo_momentum, 'operator') == 0 & + .and. index(photo_momentum, 'gkgrid') == 0) & + call io_error('Error: value of momentum not recognised in param_read') + + call param_get_keyword('photo_photon_energy', found, r_value=photo_photon_energy) + if (found .and. photo_energy_sweep) call io_error('Error: cannot set photon energy for photon energy sweep calculation') + if (photo .and. .not. found .and. .not. photo_energy_sweep) & + call io_error('Error: please set photon energy for photoemission calculation') + + photo_photon_min = 3.0_dp + call param_get_keyword('photo_photon_min', found, r_value=photo_photon_min) + photo_photon_max = 2.0_dp + call param_get_keyword('photo_photon_max', found, r_value=photo_photon_max) + if (photo_photon_min .gt. photo_photon_max .and. photo_energy_sweep) & + call io_error('Error: max photon value is lower than min photon value or they have not been set') + + call param_get_keyword('photo_work_function', found, r_value=photo_work_function) + if (photo .and. .not. found) & + call io_error('Error: please set workfunction for photoemission calculation') + + photo_slab_min = 0.0_dp + call param_get_keyword('photo_slab_min', found, r_value=photo_slab_min) + photo_slab_max = 0.0_dp + call param_get_keyword('photo_slab_max', found, r_value=photo_slab_max) + + if (photo_slab_max .lt. 0.0_dp .or. photo_slab_min .lt. 0.0_dp) then + call io_error('Error: the supplied min or max values are negative, which causes faulty calculations!') + end if + if (photo_slab_max .lt. photo_slab_min) then + call io_error('Error: the supplied slab_max value is less than the slab_min value!') + end if + + photo_elec_field = 0.00_dp + call param_get_keyword('photo_elec_field', found, r_value=photo_elec_field) + + photo_remove_box_states = .False. + call param_get_keyword('photo_remove_box_states', found, l_value=photo_remove_box_states) + + photo_imfp_choice = 'const' + call param_get_keyword('photo_imfp_choice', found, c_value=photo_imfp_choice) + + i_temp = 0 + call param_get_vector_length('photo_imfp_value', found, i_temp) + + if (index(photo_imfp_choice, 'const') > 0) then + if (i_temp .gt. 1) call io_error('Error: IMFP choice set to const, but supplied more than 1 value') + photo_len_imfp_value = i_temp + allocate (photo_imfp_value(i_temp), stat=ierr) + if (ierr /= 0) call io_error('Error: param_read - allocation failed for photo_imfp_value') + call param_get_keyword_vector('photo_imfp_value', found, i_temp, r_value=photo_imfp_value) + + else if (index(photo_imfp_choice, 'layers') > 0) then + photo_len_imfp_value = i_temp + allocate (photo_imfp_value(i_temp), stat=ierr) + if (ierr /= 0) call io_error('Error: param_read - allocation failed for photo_imfp_value') + call param_get_keyword_vector('photo_imfp_value', found, i_temp, r_value=photo_imfp_value) + + else if (index(photo_imfp_choice, 'curve') > 0) then + allocate (photo_imfp_value(1), stat=ierr) + if (ierr /= 0) call io_error('Error: param_read - allocation failed for photo_imfp_value') + call param_get_keyword_vector('photo_imfp_value', found, i_temp, r_value=photo_imfp_value) + photo_imfp_value = 0.0_dp + end if + + photo_bulk_cutoff = 10.0_dp + call param_get_keyword('photo_bulk_cutoff', found, r_value=photo_bulk_cutoff) + + photo_temperature = 298.0_dp + call param_get_keyword('photo_temperature', found, r_value=photo_temperature) + + photo_output = 'off' + call param_get_keyword('photo_output', found, c_value=photo_output) + + photo_theta_min = 0.0_dp + call param_get_keyword('photo_theta_min', found, r_value=photo_theta_min) + photo_theta_max = 90.0_dp + call param_get_keyword('photo_theta_max', found, r_value=photo_theta_max) + photo_phi_min = 0.0_dp + call param_get_keyword('photo_phi_min', found, r_value=photo_phi_min) + photo_phi_max = 90.0_dp + call param_get_keyword('photo_phi_max', found, r_value=photo_phi_max) + + photo_bindenergy_broadening = 0.01285_dp + call param_get_keyword('photo_bindenergy_broadening', found, r_value=photo_bindenergy_broadening) + photo_pmat_bin_width = 0.005_dp + call param_get_keyword('photo_pmat_bin_width', found, r_value=photo_pmat_bin_width) + photo_const_bindenergy_value = 0.0_dp + call param_get_keyword('photo_const_bindenergy_value', found, r_value=photo_const_bindenergy_value) + photo_gk_max_vectors = 1 + call param_get_keyword('photo_gk_max_vectors', found, i_value=photo_gk_max_vectors) + if ((photo_gk_max_vectors .gt. 1) .and. (index(photo_momentum, 'gkgrid') .eq. 0)) then + call io_error('Error: When choosing a photo_momentum other than gkgrid, photo_gk_max_vectors must = 1') + end if + photo_use_tmprob = .True. + call param_get_keyword('photo_use_tmprob', found, l_value=photo_use_tmprob) + num_atoms = 0 num_species = 0 num_crystal_symmetry_operations = 0 - if (pdos .or. pdis .or. core .or. optics) then + if (pdos .or. pdis .or. core .or. optics .or. photo .or. jdos) then ! try to read in the atoms from the cell file. ! We don't need them otherwise, so let's not bother ! if(index(devel_flag,'old_filename')>0) then @@ -571,7 +713,7 @@ subroutine param_write_atomic_coord temp_symb = atoms_label(nsp) else temp_symb = atoms_symbol(nsp) - endif + end if write (stdout, '(1x,a1,1x,a7,1x,i3,7x,3F8.4,3x,a1,1x,3F8.4,4x,a1)') '|', trim(temp_symb), nat, & atoms_pos_frac(:, nat, nsp), '|', atoms_pos_cart(:, nat, nsp)*lenconfac, '|' end do @@ -682,6 +824,12 @@ subroutine param_write else write (stdout, '(1x,a78)') '| Output Core-level Spectra : False |' end if + !Photoemission + if (photo) then + write (stdout, '(1x,a78)') '| Photoemission Calculation : True |' + else + write (stdout, '(1x,a78)') '| Photoemission Calculation : False |' + end if write (stdout, '(1x,a46,2x,i3,26x,a1)') '| iprint level :', iprint, '|' if (legacy_file_format) then write (stdout, '(1x,a78)') '| Use CASTEP < 6.0 file format : True |' @@ -699,25 +847,26 @@ subroutine param_write end if end if - write (stdout, '(1x,a78)') '+--------------------------SPECTRAL PARAMETERS ------------------------------+' + write (stdout, '(1x,a78)') '+-------------------------- SPECTRAL PARAMETERS -----------------------------+' if (fixed) then write (stdout, '(1x,a78)') '| Fixed Width Smearing : True |' - write (stdout, '(1x,a46,1x,1F10.5,20x,a1)') '| Smearing Width :', fixed_smearing, '|' + write (stdout, '(1x,a46,1x,F10.5,20x,a1)') '| Smearing Width :', fixed_smearing, '|' end if if (adaptive) then write (stdout, '(1x,a78)') '| Adaptive Width Smearing : True |' - write (stdout, '(1x,a46,1x,1F10.5,20x,a1)') '| Adaptive Smearing ratio :', adaptive_smearing, '|' + write (stdout, '(1x,a46,1x,F10.5,20x,a1)') '| Adaptive Smearing ratio :', adaptive_smearing, '|' end if - if (linear) & + if (linear) then write (stdout, '(1x,a78)') '| Linear Extrapolation : True |' - write (stdout, '(1x,a46,1x,1F10.5,20x,a1)') '| Smearing Width :', linear_smearing, '|' + write (stdout, '(1x,a46,1x,F10.5,20x,a1)') '| Smearing Width :', linear_smearing, '|' + end if if (quad) & write (stdout, '(1x,a78)') '| Quadratic Extrapolation : True |' if (finite_bin_correction) & write (stdout, '(1x,a78)') '| Finite Bin Correction : True |' if (hybrid_linear) then - write (stdout, '(1x,a78)') '| Hybrid Linear Correction : True |' - write (stdout, '(1x,a46,2x,F10.8,19x,a1)') '| Hybrid Linear Gradient Tolerance :', hybrid_linear_grad_tol, '|' + write (stdout, '(1x,a78)') '| Hybrid Linear Correction : True |' + write (stdout, '(1x,a46,1x,F10.5,20x,a1)') '| Hybrid Linear Gradient Tolerance :', hybrid_linear_grad_tol, '|' end if if (numerical_intdos) & write (stdout, '(1x,a78)') '| Numerical Integration of P/DOS : True |' @@ -752,7 +901,12 @@ subroutine param_write write (stdout, '(1x,a78)') '| Compute the band gap : False |' end if - if (optics) then + if (photo) then + write (stdout, '(1x,a19,26x,a2,f7.4,3x,21a)') '| JDOS bin spacing', ': ', jdos_spacing, 'eV |' + write (stdout, '(1x,a22,23x,a2,f7.4,3x,21a)') '| JDOS max energy bin', ': ', jdos_max_energy, 'eV |' + end if + + if (optics .or. photo) then write (stdout, '(1x,a78)') '+-------------------------------- OPTICS ------------------------------------+' if (index(optics_geom, 'polycrys') > 0) then write (stdout, '(1x,a78)') '| Geometry for Optics Calculation : Polycrystalline |' @@ -816,10 +970,91 @@ subroutine param_write write (stdout, '(1x,a78)') '| Include lifetime and Instrument Broadening: False |' end if end if - + ! Added for Photoemission output - F. Mildner, 12/2022 + if (photo) then + write (stdout, '(1x,a78)') '+----------------------- PHOTOEMISSION PARAMETERS ---------------------------+' + if (index(photo_model, '1step') > 0) then + write (stdout, '(1x,a78)') '| Photoemission Model : 1-Step Model |' + write (stdout, '(1x,a78)') '| Photoemission Final State : Free Electron State |' + elseif (index(photo_model, '3step') > 0) then + write (stdout, '(1x,a78)') '| Photoemission Model : 3-Step Model |' + write (stdout, '(1x,a78)') '| Photoemission Final State : Bloch State |' + if (photo_use_tmprob) then + write (stdout, '(1x,a78)') '| *** Including transmission probability across surface *** |' + else + write (stdout, '(1x,a78)') '| *** NOT Including transmission probability across surface *** |' + end if + elseif (index(photo_model, 'ds_like_pe') > 0) then + write (stdout, '(1x,a78)') '| Photoemission Model : Simplified PE Model |' + end if + if (photo_energy_sweep) then + write (stdout, '(1x,a46,1x,1f10.4,a4,1f7.4,a10)') '| Photon Energy Sweep :', photo_photon_min,& + & ' -> ', photo_photon_max, ' eV |' + else + write (stdout, '(1x,a46,1x,1f10.4,20x,a1)') '| Photon Energy (eV) :', photo_photon_energy, '|' + end if + write (stdout, '(1x,a46,1x,1f10.4,20x,a1)') '| Work Function (eV) :', photo_work_function, '|' + ! write (stdout, '(1x,a46,1x,1f10.4,20x,a1)') '| Surface Area (Ang**2) :', photo_surface_area, '|' + ! write (stdout, '(1x,a46,1x,1f10.4,20x,a1)') '| Slab Volume (Ang**3) :', photo_slab_volume, '|' + write (stdout, '(1x,a46,1x,1f10.4,20x,a1)') '| Slab Max Z-Coord. (Ang) :', photo_slab_max, '|' + write (stdout, '(1x,a46,1x,1f10.4,20x,a1)') '| Slab Min Z-Coord. (Ang) :', photo_slab_min, '|' + if (index(photo_imfp_choice, 'const') > 0) then + write (stdout, '(1x,a46,1x,1f10.4,20x,a1)') '| IMFP Constant (Ang) :', photo_imfp_value(1), '|' + else if (index(photo_imfp_choice, 'layers') > 0) then + write (stdout, '(1x,a78)') '| Layer by Layer IMFP Constants (Ang) : Layer values provided by user |' + write (stdout, '(1x,a78)') '| will be printed later |' + else if (index(photo_imfp_choice, 'curve') > 0) then + write (stdout, '(1x,a78)') '| Energy Dependent IMFP Curve : Values will be printed later |' + end if + write (stdout, '(1x,a46,3x,f5.1,23x,a1)') '| Bulk cutoff dist. (int. multiple of IMFP) :', photo_bulk_cutoff, '|' + if ((photo_elec_field .gt. 1.0E-4_dp) .or. (photo_elec_field .lt. 1.0E-25_dp)) then + write (stdout, '(1x,a46,1x,1f10.4,20x,a1)') '| Electric Field Strength (V/Ang) :', photo_elec_field, '|' + else + write (stdout, '(1x,a46,1x,E17.9,13x,a1)') '| Electric Field Strength (V/Ang) :', photo_elec_field, '|' + end if + write (stdout, '(1x,a46,1x,1f8.2,22x,a1)') '| Smearing Temperature (K) :', photo_temperature, '|' + write (stdout, '(1x,a46,5x,a9,17x,a1)') '| Transverse Momentum Scheme :', photo_momentum, '|' + if (photo_remove_box_states) then + write (stdout, '(1x,a78)') '| Identify and remove box states : True |' + end if + if (index(photo_momentum, 'gkgrid') > 0) then + write (stdout, '(1x,a47,1x,1i6,23x,a1)') '| # of G + k Grid Contributions : ', photo_gk_max_vectors, '|' + end if + if (index(photo_output, 'off') == 0 .or. index(photo_output, 'qe_tensor') == 0) then + write (stdout, '(1x,a46,1x,1f8.2,22x,a1)') '| Theta - min - (deg) :', photo_theta_min, '|' + write (stdout, '(1x,a46,1x,1f8.2,22x,a1)') '| Theta - max - (deg) :', photo_theta_max, '|' + write (stdout, '(1x,a46,1x,1f8.2,22x,a1)') '| Phi - min - (deg) :', photo_phi_min, '|' + write (stdout, '(1x,a46,1x,1f8.2,22x,a1)') '| Phi - max - (deg) :', photo_phi_max, '|' + end if + if (index(photo_output, 'off') == 0 .or. index(photo_output, 'qe_tensor') == 0) then + write (stdout, '(1x,a46,4x,1f7.4,20x,a1)') '| Binding Energy Broad. Width (eV) :', & + & photo_bindenergy_broadening, '|' + end if + if (index(photo_output, 'bindenergy_ptrans_map') > 0 .or. index(photo_output, 'p_tensor') > 0) then + write (stdout, '(1x,a46,4x,1f8.5,19x,a1)') '| Binding Energy P Matrix Bin Width (1/A) :', photo_pmat_bin_width, '|' + end if + if (index(photo_output, 'const_bindenergy_p_map') > 0) then + write (stdout, '(1x,a46,2x,1f8.3,21x,a1)') '| Binding Energy for const. E Map (eV) :', & + photo_const_bindenergy_value, '|' + end if + if (index(photo_output, 'off') == 0) then + write (stdout, '(1x,a78)') '| ------ List of extra values to be calculated and written to file ------- |' + write (stdout, '(1x,a78)') '| ------------------------------------------------------------------------ |' + if (index(photo_output, 'bindenergy_ptrans_map') > 0) write (stdout, '(1x,a78)') & + '| --------------- Binding Energy vs transverse Energy map ---------------- |' + if (index(photo_output, 'p_tensor') > 0) write (stdout, '(1x,a78)') & + '| -------------------- Full momentum (px,py,pz) tensor ------------------- |' + if (index(photo_output, 'bindenergy_curve') > 0) write (stdout, '(1x,a78)') & + '| ---------------------- Binding Energy curve (EDC) ---------------------- |' + if (index(photo_output, 'const_bindenergy_p_map') > 0) write (stdout, '(1x,a78)') & + '| --------------------- Constant binding Energy map ---------------------- |' + if (index(photo_output, 'qe_tensor') > 0) write (stdout, '(1x,a78)') & + '| ---------------------------- Full QE tensor ---------------------------- |' + end if + end if write (stdout, '(1x,a78)') '+----------------------------------------------------------------------------+' - write (stdout, *) ' ' - + if (num_exclude_bands > 0) write (stdout, '(1x,a16,1x,999(1x,I3))') 'excluded_bands :', exclude_bands(:) + if (scan(devel_flag, "AEIOUaeiou") > 0) write (stdout, '(1x,a12,1x,a100)') 'devel_flag :', devel_flag end subroutine param_write !==================================================================! @@ -849,7 +1084,7 @@ subroutine param_in_file ! to lowercase characters ! !=======================================! - use od_io, only: io_file_unit, io_error, seedname + use od_io, only: io_file_unit, io_error, seedname, options use od_algorithms, only: utility_lowercase implicit none @@ -859,7 +1094,6 @@ subroutine param_in_file in_unit = io_file_unit() open (in_unit, file=trim(seedname)//'.odi', form='formatted', status='old', err=101) - num_lines = 0; tot_num_lines = 0 do read (in_unit, '(a)', iostat=ierr, err=200, end=210) dummy @@ -1496,6 +1730,8 @@ subroutine param_dist call comms_bcast(pdos, 1) call comms_bcast(jdos, 1) call comms_bcast(optics, 1) + call comms_bcast(photo, 1) + call comms_bcast(photo_energy_sweep, 1) call comms_bcast(core, 1) call comms_bcast(compare_dos, 1) call comms_bcast(compare_jdos, 1) @@ -1542,6 +1778,39 @@ subroutine param_dist call comms_bcast(projectors_string, len(projectors_string)) call comms_bcast(set_efermi_zero, 1) ! + ! Photoemission + call comms_bcast(photo_model, len(photo_model)) + call comms_bcast(photo_momentum, len(photo_momentum)) + call comms_bcast(photo_photon_energy, 1) + if (photo_energy_sweep) then + call comms_bcast(photo_photon_min, 1) + call comms_bcast(photo_photon_max, 1) + end if + call comms_bcast(photo_work_function, 1) + call comms_bcast(photo_slab_max, 1) + call comms_bcast(photo_slab_min, 1) + call comms_bcast(photo_elec_field, 1) + call comms_bcast(photo_remove_box_states, 1) + call comms_bcast(photo_len_imfp_value, 1) + if (.not. on_root) then + allocate (photo_imfp_value(photo_len_imfp_value), stat=ierr) + if (ierr /= 0) call io_error('Error: param_dist - allocation failed for photo_imfp_value') + end if + call comms_bcast(photo_imfp_value(1), photo_len_imfp_value) + call comms_bcast(photo_imfp_choice, len(photo_imfp_choice)) + call comms_bcast(photo_bulk_cutoff, 1) + call comms_bcast(photo_temperature, 1) + call comms_bcast(photo_output, len(photo_output)) + call comms_bcast(photo_theta_min, 1) + call comms_bcast(photo_theta_max, 1) + call comms_bcast(photo_phi_min, 1) + call comms_bcast(photo_phi_max, 1) + call comms_bcast(photo_bindenergy_broadening, 1) + call comms_bcast(photo_pmat_bin_width, 1) + call comms_bcast(photo_const_bindenergy_value, 1) + call comms_bcast(photo_gk_max_vectors, 1) + call comms_bcast(photo_use_tmprob, 1) + call comms_bcast(num_exclude_bands, 1) if (num_exclude_bands > 1) then if (.not. on_root) then diff --git a/optados/src/pdos.F90 b/optados/src/pdos.F90 index 5f104e76..3c1f57e5 100644 --- a/optados/src/pdos.F90 +++ b/optados/src/pdos.F90 @@ -174,13 +174,13 @@ subroutine write_proj_to_file(start_proj, stop_proj, name) if (iprint > 2) write (stdout, '(1x,a30,a30,17x,a1)') "| Writing PDOS projectors to: ", trim(name), "|" if (ierr .ne. 0) call io_error(" ERROR: Cannot open output file in pdos: pdos_write") - write (pdos_file, *) "##############################################################################" - write (pdos_file, *) "#" - write (pdos_file, *) "# O p t a D O S o u t p u t f i l e " + write (pdos_file, '(a78)') "##############################################################################" + write (pdos_file, '(1a)') "#" + write (pdos_file, '(a57)') "# O p t a D O S o u t p u t f i l e " write (pdos_file, '(1x,a1)') "#" call io_date(cdate, ctime) - write (pdos_file, *) '# Generated on ', cdate, ' at ', ctime - write (pdos_file, '(1x,a78)') "##############################################################################" + write (pdos_file, '(a16, 11a, 4a, 9a)') '# Generated on ', cdate, ' at ', ctime + write (pdos_file, '(a78)') "##############################################################################" write (pdos_file, '(1a,a)') '#', '+----------------------------------------------------------------------------+' write (pdos_file, '(1a,a)') '#', '| Partial Density of States -- Projectors |' write (pdos_file, '(1a,a)') '#', '+----------------------------------------------------------------------------+' diff --git a/optados/src/photo.f90 b/optados/src/photo.f90 new file mode 100644 index 00000000..f9275a25 --- /dev/null +++ b/optados/src/photo.f90 @@ -0,0 +1,6466 @@ +!-*- mode: F90; mode: font-lock; column-number-mode: true -*-! +! +! This file is part of OptaDOS +! +! OptaDOS - For obtaining electronic structure properties based on +! integrations over the Brillouin zone +! Copyright (C) 2011 Andrew J. Morris, R. J. Nicholls, C. J. Pickard +! and J. R. Yates +! +! This program is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by +! the Free Software Foundation, either version 3 of the License, or +! (at your option) any later version. +! +! This program is distributed in the hope that it will be useful, +! but WITHOUT ANY WARRANTY; without even the implied warranty of +! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +! GNU General Public License for more details. +! +! You should have received a copy of the GNU General Public License +! along with this program. If not, see . +! +!=============================================================================== +module od_photo + !! This is the module for calculating the photoemission. + use od_constants, only: dp + + implicit none + private + public :: photo_calculate + + real(kind=dp), allocatable, public, dimension(:, :, :, :) :: pdos_weights_atoms + real(kind=dp), allocatable, public, dimension(:, :, :, :) :: pdos_weights_boxes + real(kind=dp), allocatable, public, dimension(:, :, :, :, :) :: matrix_weights + real(kind=dp), allocatable, public, dimension(:, :, :, :) :: photo_matrix_weights + real(kind=dp), allocatable, public, dimension(:, :, :, :, :) :: projected_matrix_weights + real(kind=dp), allocatable, public, dimension(:, :, :) :: foptical_matrix_weights + real(kind=dp), allocatable, public, dimension(:, :, :) :: weighted_jdos + real(kind=dp), allocatable, public, dimension(:, :) :: absorp_layer + real(kind=dp), allocatable, public, dimension(:, :, :) :: pdos_weights_k_band + real(kind=dp), allocatable, public, save :: E(:) + real(kind=dp), allocatable, dimension(:, :, :) :: imfp_val + real(kind=dp), allocatable, dimension(:, :, :, :, :) :: electron_esc + real(kind=dp), dimension(:, :), allocatable :: I_layer + real(kind=dp), allocatable, dimension(:, :) :: reflect_photo + real(kind=dp), allocatable, dimension(:, :) :: absorp_photo + real(kind=dp), allocatable, dimension(:, :) :: refract + real(kind=dp), allocatable, dimension(:) :: reflect + real(kind=dp), allocatable, dimension(:) :: absorp + real(kind=dp) :: box_height + real(kind=dp) :: box_volume + integer, dimension(:), allocatable :: box_atom + integer, dimension(:), allocatable :: atoms_per_box + integer :: num_boxes + real(kind=dp) :: photo_slab_volume + real(kind=dp) :: slab_middle_ref + real(kind=dp) :: cell_area + real(kind=dp), dimension(:), allocatable :: atom_imfp + real(kind=dp), dimension(:, :, :), allocatable :: band_imfp + real(kind=dp), dimension(:), allocatable :: boxes_top_z_coord + real(kind=dp), dimension(:, :), allocatable :: new_atom_coordinates + real(kind=dp), allocatable, dimension(:, :, :, :) :: phi_arpes + real(kind=dp), allocatable, dimension(:, :, :, :) :: theta_arpes + real(kind=dp), allocatable, dimension(:, :, :, :) :: theta_internal + real(kind=dp), allocatable, dimension(:, :, :, :) :: E_kinetic + real(kind=dp), allocatable, dimension(:, :, :, :) :: E_transverse + real(kind=dp), allocatable, dimension(:) :: bind_energy + real(kind=dp), allocatable, dimension(:, :) :: weighted_be_atom + real(kind=dp) :: total_be_contribs + real(kind=dp) :: total_be_kmat_contribs + real(kind=dp), allocatable, dimension(:, :) :: ekin_k_matrix + real(kind=dp), allocatable, dimension(:, :) :: kxky_matrix + real(kind=dp), allocatable, dimension(:, :, :) :: p_tensor + integer, dimension(3) :: max_bin_p + integer :: max_energy = -1 + real(kind=dp), allocatable, dimension(:, :, :, :) :: qe_osm + real(kind=dp), allocatable, dimension(:, :, :, :) :: te_osm + real(kind=dp), allocatable, dimension(:, :, :, :, :) :: qe_tsm + real(kind=dp), allocatable, dimension(:, :, :, :) :: te_tsm + real(kind=dp), allocatable, dimension(:, :, :, :) :: gkgrid_weight + real(kind=dp) :: mean_te + real(kind=dp) :: total_qe + real(kind=dp), allocatable, dimension(:) :: layer_qe + integer, dimension(:), allocatable :: atom_order + real(kind=dp) :: work_function_eff + real(kind=dp) :: evacuum + real(kind=dp) :: evacuum_eff + real(kind=dp) :: total_field_emission + real(kind=dp), allocatable, dimension(:, :, :) :: field_emission + integer :: N_geom + integer :: max_atoms + integer :: max_bin_e, max_bin_k + real(kind=dp) :: max_e_kinetic, max_k_transverse, plot_extra_upper = 1.0_dp + real(kind=dp) :: q_weight + ! Added by Felix Mildner, 12/2022 and later + integer, allocatable, dimension(:) :: index_energy + integer :: number_energies, current_energy_index, current_photo_energy_index + real(kind=dp) :: temp_photon_energy, time_a, time_b + integer, allocatable, dimension(:, :):: min_index_unocc + ! The Free Electron Matrix (FEM) elements are calculated for a specific E_fermi offset, workfct and photon + ! energies in Castep. Thus we must read it from the file and ensure they are compatible with the parameters + ! used for the OptaDOS run. + ! fem_energy_info: energy_count, energy_min, energy_step, energy_fermi, energy_workfct + integer :: energy_count + real(kind=dp) :: energy_min, energy_step, energy_fermi, energy_workfct +contains + + subroutine photo_calculate + !! Main subroutine calling all the other subroutine steps. + use od_electronic, only: elec_dealloc_optical, elec_pdos_read, elec_read_optical_mat, & + efermi, efermi_set, elec_read_foptical_mat, elec_dealloc_pdos + use od_jdos_utils, only: jdos_utils_calculate, setup_energy_scale + use od_comms, only: on_root + use od_parameters, only: photo_work_function, photo_model, photo_elec_field, photo_output, photo_energy_sweep, & + photo_photon_min, jdos_spacing, photo_photon_energy, photo_momentum, iprint + use od_dos_utils, only: dos_utils_set_efermi, dos_utils_calculate_at_e, dos_utils_deallocate + use od_io, only: stdout, io_error, io_time + use od_pdos, only: pdos_calculate + + implicit none + + integer :: i + + if (on_root) then + write (stdout, '(1x,a78)') '+============================================================================+' + write (stdout, '(1x,a78)') '+ Photoemission Calculation +' + write (stdout, '(1x,a78)') '+============================================================================+' + write (stdout, '(1x,a78)') '| |' + end if + + if (.not. efermi_set) then + call dos_utils_set_efermi + call dos_utils_deallocate + end if + + ! Identify layers + call analyse_geometry + call calc_band_info + call calc_photon_energies + + if (.not. index(photo_model, 'ds_like_pe') > 0) then + call elec_read_optical_mat + ! THIS PART COMES FROM THE PDOS MODULE + ! read in the pdos weights + call elec_pdos_read + call make_pdos_weights_atoms + call elec_dealloc_pdos + + ! Calculate the optical properties of the slab + call calc_photo_optics + call calc_absorp_layer + end if + + ! Electric field and field emission + if (photo_elec_field .gt. 0.0_dp) then + call effective_wf + call calc_field_emission + else + evacuum_eff = efermi + photo_work_function + work_function_eff = photo_work_function + end if + + if (photo_energy_sweep) then + do i = 1, number_energies + time_a = io_time() + temp_photon_energy = photo_photon_min + (i - 1)*jdos_spacing + if (on_root) write (stdout, '(1x,a50,f8.4,a20)') '+--------------- Starting Photoemission Sweep with', temp_photon_energy, & + ' eV ---------------+' + current_photo_energy_index = i + current_energy_index = index_energy(i) + ! Calculate the photoemission angles theta/phi and transverse energy + ! We will not need that when calculating the simplified model + if (.not. index(photo_model, 'ds_like_pe') > 0) then + call calc_angle + + !Calculate the electron escape length + call calc_electron_esc + + call bulk_emission + end if + + !Calculate the QE + !Three-step-model + if (index(photo_model, '3step') > 0) then + call calc_three_step_model + !One-step-model + elseif (index(photo_model, '1step') > 0) then + !Read the one-step matrix elements + if (.not. allocated(foptical_matrix_weights)) call elec_read_foptical_mat + !Calculate the one-step optical matrix + call make_foptical_weights + !Calculate QE + call calc_one_step_model + ! Simplified DS like model + elseif (index(photo_model, 'ds_like_pe') > 0) then + call calc_ds_like_model + end if + + !Weight the contribution of each electron + !to the transverse energy spread according to their QE + call weighted_mean_te + + call write_qe_data + ! Only call the binding energy gaussian broadening and file printing if necessary + if (index(photo_output, 'off') == 0) then + !Broaden ouputs using a gaussian function + if (index(photo_output, 'bindenergy_curve') > 0) call binding_energy_curve + if (index(photo_output, 'bindenergy_ptrans_map') > 0) then + if (index(photo_momentum, 'gkgrid') > 0) then + call binding_energy_momentum_map_gkgrid + else + call binding_energy_momentum_map + end if + end if + if (index(photo_output, 'p_tensor') > 0) call full_momentum_tensor + if (index(photo_output, 'const_bindenergy_p_map') > 0) then + if (index(photo_momentum, 'gkgrid') > 0) then + call const_binding_energy_map_gkgrid + else + call const_binding_energy_map + end if + end if + !Write either a binding energy output with after Gaussian broadening + if (index(photo_output, 'qe_tensor') > 0) call write_qe_tensor + end if + time_b = io_time() + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a44,15x,f11.3,a8)') '+ Time to calculate Photoemission sweep step', time_b - time_a, ' (sec) +' + end if + end do + else + temp_photon_energy = photo_photon_energy + current_photo_energy_index = 1 + current_energy_index = index_energy(1) + ! Calculate the photoemission angles theta/phi and transverse energy + ! We will not need that when calculating the simplified model + if (.not. index(photo_model, 'ds_like_pe') > 0) then + call calc_angle + + !Calculate the electron escape length + call calc_electron_esc + + call bulk_emission + end if + + !Calculate the QE + !Three-step-model + if (index(photo_model, '3step') > 0) then + call calc_three_step_model + !One-step-model + elseif (index(photo_model, '1step') > 0) then + !Read the one-step matrix elements + if (.not. allocated(foptical_matrix_weights)) call elec_read_foptical_mat + !Calculate the one-step optical matrix + call make_foptical_weights + !Calculate QE + call calc_one_step_model + ! Simplified DS like model + elseif (index(photo_model, 'ds_like_pe') > 0) then + call calc_ds_like_model + end if + + !Weight the contribution of each electron + !to the transverse energy spread according to their QE + call weighted_mean_te + call write_qe_data + + ! Only call the binding energy gaussian broadening and file printing if necessary + if (index(photo_output, 'off') == 0) then + !Broaden ouputs using a gaussian function + if (index(photo_output, 'bindenergy_curve') > 0) call binding_energy_curve + if (index(photo_output, 'bindenergy_ptrans_map') > 0) then + if (index(photo_momentum, 'gkgrid') > 0) then + call binding_energy_momentum_map_gkgrid + else + call binding_energy_momentum_map + end if + end if + if (index(photo_output, 'p_tensor') > 0) call full_momentum_tensor + if (index(photo_output, 'const_bindenergy_p_map') > 0) then + if (index(photo_momentum, 'gkgrid') > 0) then + call const_binding_energy_map_gkgrid + else + call const_binding_energy_map + end if + end if + !Write either a binding energy output with after Gaussian broadening + if (index(photo_output, 'qe_tensor') > 0) call write_qe_tensor + end if + + end if + ! Deallocate the rest that was needed for the photoemission calcs + call photo_deallocate + + if (on_root) write (stdout, '(1x,a78)') '| End of Photoemission Calculation |' + + end subroutine photo_calculate + + subroutine analyse_geometry + !* This subroutine identifies and defines a set of boxes, + ! that represent layers, with a height = interlayer distance + ! at the middle of the slab. All atoms are then sorted into + ! these boxes for later use. + use od_constants, only: dp, periodic_table_name, periodic_table_vdw, deg_to_rad + use od_cell, only: num_atoms, atoms_pos_cart_photo, atoms_label_tmp, cell_volume, real_lattice + use od_io, only: stdout, io_error + use od_comms, only: on_root + use od_parameters, only: photo_imfp_value, photo_slab_max, photo_slab_min, iprint + implicit none + integer :: ierr, atom, counter, i, ic, atom_index, first, temp, atom_1, atom_2 + real(kind=dp) :: diff_temp, diff_top = 10000.0_dp, diff_bottom = 10000.0_dp + integer, dimension(2) :: indices_top_bottom + real(kind=dp), dimension(2) :: mean_heights = 0.0_dp + + allocate (atom_order(num_atoms), stat=ierr) + if (ierr /= 0) call io_error('Error: analyse_geometry - allocation of atom_order failed') + + allocate (box_atom(num_atoms), stat=ierr) + if (ierr /= 0) call io_error('Error: analyse_geometry - allocation of box_atom failed') + box_atom = 1000 + + ! allocate (layer(num_atoms), stat=ierr) + if (ierr /= 0) call io_error('Error: analyse_geometry - allocation of layer failed') + do i = 1, num_atoms + atom_order(i) = i + end do + + ! Check that we have gamma = 90 deg as that is currently assumed for a lot of calculations!! + if (real_lattice(3, 1) .gt. 0.000001_dp .and. real_lattice(3, 2) .gt. 0.000001_dp) then + call io_error('ERROR: analyse_geometry - The c axis is not parallel to the cart. z axis - not currently implemented!') + end if + + do atom_1 = 1, num_atoms - 1 + first = atom_order(atom_1) + do atom_2 = atom_1 + 1, num_atoms + atom_index = atom_1 + if (atoms_pos_cart_photo(3, atom_order(atom_2)) .gt. atoms_pos_cart_photo(3, first)) then + first = atom_order(atom_2) + atom_index = atom_2 + end if + if (atom_index /= atom_1) then + temp = atom_order(atom_1) + atom_order(atom_1) = atom_order(atom_index) + atom_order(atom_index) = temp + end if + end do + end do + + ! Capitalise the first letter of the atomic label for later + do atom = 1, num_atoms + ic = ichar(atoms_label_tmp(atom_order(atom)) (1:1)) + if ((ic .ge. ichar('a')) .and. (ic .le. ichar('z'))) & + atoms_label_tmp(atom_order(atom)) (1:1) = char(ic + ichar('Z') - ichar('z')) + end do + + ! -------------------------------------------------------------------------------------------- + ! * The following code was added in Nov 2023 to test out a new layer assignment scheme * + ! * A set of boxes with the height of the central slab layer distance is created and the * + ! * atoms are sorted into those boxes by their z-coordinate. * + ! -------------------------------------------------------------------------------------------- + ! determine the cell area, and photo_slab_volume for later use + cell_area = cell_volume/real_lattice(3, 3) + photo_slab_volume = (photo_slab_max - photo_slab_min)*cell_area + ! determine the approximate middle of slab as reference + slab_middle_ref = (photo_slab_max + photo_slab_min)/2 + ! find the nearest two atoms to the middle and determine their layers + indices_top_bottom = 1 + do atom = 1, num_atoms + diff_temp = atoms_pos_cart_photo(3, atom_order(atom)) - slab_middle_ref + ! Do we have an odd number of layers? Then we only need to include + ! the innermost layer and move on. + if (abs(diff_temp) .lt. 0.1) then + indices_top_bottom(1) = atom_order(atom) + indices_top_bottom(2) = atom_order(atom + 1) + slab_middle_ref = atoms_pos_cart_photo(3, atom_order(atom)) - 1 + exit + end if + if (diff_temp .gt. 0.0_dp) then + if (diff_temp .lt. diff_top) then + indices_top_bottom(1) = atom_order(atom) + diff_top = diff_temp + end if + end if + if (diff_temp .lt. 0.0_dp) then + if (abs(diff_temp) .lt. diff_bottom) then + indices_top_bottom(2) = atom_order(atom) + diff_bottom = abs(diff_temp) + end if + end if + end do + ! find potential atoms in the vicinity of the top and bottom atom within 0.5 A + ! and determing the mean z-coordinate of them (to get mean z-coord of a layer of atoms) + ! This way we can slightly change the height of the box if the layers are slightly + ! crumpled and the order of atoms does not influence our value. + do i = 1, 2 + counter = 0 + diff_top = atoms_pos_cart_photo(3, indices_top_bottom(i)) + 0.5 + diff_bottom = atoms_pos_cart_photo(3, indices_top_bottom(i)) - 0.5 + do atom = 1, num_atoms + if (atoms_pos_cart_photo(3, atom_order(atom)) .gt. diff_bottom .and. & + atoms_pos_cart_photo(3, atom_order(atom)) .lt. diff_top) then + counter = counter + 1 + mean_heights(i) = mean_heights(i) + atoms_pos_cart_photo(3, atom_order(atom)) + end if + end do + mean_heights(i) = mean_heights(i)/counter + end do + ! determine the box height + box_volume + new slab middle reference + box_height = mean_heights(1) - mean_heights(2) + slab_middle_ref = sum(mean_heights)/2 + box_volume = box_height*cell_area + ! determine the number of boxes we need until we have reached the top of the slab + num_boxes = ceiling((atoms_pos_cart_photo(3, atom_order(1)) - slab_middle_ref)/box_height) + if (num_boxes .eq. 0) num_boxes = 1 + ! set up box top points as middle_reference + n(1...)*box_height + if (.not. allocated(boxes_top_z_coord)) then + allocate (boxes_top_z_coord(num_boxes)) + end if + if (.not. allocated(atoms_per_box)) then + allocate (atoms_per_box(num_boxes)) + end if + atoms_per_box = 0 + do i = 1, num_boxes + boxes_top_z_coord(i) = slab_middle_ref + (num_boxes + 1 - i)*box_height + end do + ! put each of the atoms into a box + do i = 1, num_boxes + counter = 0 + diff_top = boxes_top_z_coord(i) + diff_bottom = boxes_top_z_coord(i) - box_height + do atom = 1, num_atoms + if (atoms_pos_cart_photo(3, atom_order(atom)) .gt. diff_bottom .and. & + atoms_pos_cart_photo(3, atom_order(atom)) .lt. diff_top) then + counter = counter + 1 + box_atom(atom) = i + end if + end do + atoms_per_box(i) = counter + end do + max_atoms = sum(atoms_per_box) + ! We want to artifically set the box of the bulk slab to num_boxes + 1 + ! since we later use this to access I_layer in the QE calculation + box_atom(max_atoms + 1) = num_boxes + 1 + + if (on_root) then + if (iprint .gt. 2) then + write (stdout, 420) '+', 'box height (Ang) = ', box_height, ',', '# of boxes = ', num_boxes, '+' +420 format(1x, a1, 5x, a19, F13.9, a1, 12x, a13, I4, 9x, a1) + write (stdout, 421) '+', '# of atoms in each box:', (atoms_per_box(i), i=1, num_boxes) +421 format(1x, a1, 5x, a23, 99(1x, I2)) + end if + write (stdout, '(1x,a78)') '+------------------------------- Atomic Order ------------------------------+' + write (stdout, '(1x,a78)') '| Atom | Atom Order | Box/Layer | Atom Z-Coordinate (Ang) |' + + do atom = 1, num_atoms + if ((box_atom(atom) .lt. num_boxes)) then + write (stdout, '(1x,a3,a2,8x,i3,11x,i3,18x,F12.7,a18)') "| ", trim(atoms_label_tmp(atom_order(atom))), & + atom_order(atom), box_atom(atom), atoms_pos_cart_photo(3, atom_order(atom)), "|" + else + write (stdout, '(1x,a3,a2,8x,i3,14x,18x,F12.7,a18)') "| ", trim(atoms_label_tmp(atom_order(atom))), & + atom_order(atom), atoms_pos_cart_photo(3, atom_order(atom)), "|" + end if + end do + write (stdout, '(1x,a78)') '+----------------------------------------------------------------------------+' + write (stdout, 226) '| Max number of atoms:', max_atoms, ' Total number of boxes:', num_boxes, ' |' + write (stdout, 227) '| Volume of box for layer selection (Ang^3) : ', box_volume, ' |' + write (stdout, '(1x,a78)') '+----------------------------------------------------------------------------+' + end if +226 format(1x, a23, I12, 1x, a25, 1x, I12, a4) +227 format(1x, a57, f14.5, a7) + + !TEST IF THE SUPPLIED IMFP LIST IS LONG ENOUGH + if (allocated(photo_imfp_value) .and. size(photo_imfp_value, 1) .gt. 1 .and. & + size(photo_imfp_value, 1) .lt. num_boxes - 1) then + call io_error('The supplied list of layer dependent imfp values is less than the calculated max_layer. Check input!') + end if + + end subroutine analyse_geometry + + subroutine calc_band_info + !=============================================================================== + ! This subroutine determines useful indices of band energies for later use in + ! the QE and MTE calculation to reduce loop times. + ! This relies on an IMPORTANT assumption: the bands file is ordered by energy + ! and not by band number (e.g. after being processed by bands2orbitals) + ! Felix Mildner, 28th March 2023 + !=============================================================================== + use od_electronic, only: efermi, band_energy, nbands, nspins + use od_cell, only: num_kpoints_on_node + use od_comms, only: my_node_id, on_root + use od_parameters, only: iprint + use od_io, only: stdout, io_time, io_error + implicit none + integer :: N_k, N_spin, n_eigen, ierr + real(kind=dp) :: time0, time1 + + time0 = io_time() + + allocate (min_index_unocc(nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_band_info - allocation of min_index_unocc failed') + + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen = 2, nbands ! Loop over bands + ! TODO: Test if this is the behaviour we want and or if we have to change the condition + if (band_energy(n_eigen - 1, N_spin, N_k) .gt. band_energy(n_eigen, N_spin, N_k)) then + call io_error('Error: the band energies in the .bands file used are NOT ORDERED CORRECTLY (i.e. by increasing energy) & + & which will give WRONG RESULTS with the current code!') + end if + end do + end do + end do + + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen = 1, nbands ! Loop over bands + ! TODO: Test if this is the behaviour we want and or if we have to change the condition + if (band_energy(n_eigen, N_spin, N_k) .gt. efermi) then + min_index_unocc(N_spin, N_k) = n_eigen + exit + end if + end do + end do + end do + + time1 = io_time() + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a36,23x,f11.3,a8)') '+ Time to calculate Band Energy Info', time1 - time0, ' (sec) +' + end if + + end subroutine calc_band_info + + subroutine calc_photon_energies + use od_constants, only: dp + use od_parameters, only: photo_energy_sweep, photo_photon_min, photo_photon_max, jdos_spacing, photo_photon_energy + use od_io, only: io_error + implicit none + real(kind=dp) :: num_energies, temp + integer :: ierr, i + + if (photo_energy_sweep) then + num_energies = (photo_photon_max - photo_photon_min)/jdos_spacing + number_energies = int(num_energies) + 1 + if (photo_photon_max - photo_photon_min .eq. 0.0_dp) then + number_energies = 1 + else if (mod(num_energies, 1.0_dp) > 1.0E-10_dp) then + number_energies = number_energies + 1 + if (abs(mod(num_energies, 1.0_dp) - 1) > 1.0E-10_dp) & + call io_error('Error: calc_photon_energies - given photon sweep min/max values do not give integer # of photon steps') + end if + allocate (index_energy(number_energies), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_photon_energies - allocation of index_energy failed') + do i = 1, number_energies + temp = (i - 1)*jdos_spacing + photo_photon_min + ! Account for E = 0.0 + index_energy(i) = int(temp/jdos_spacing) + 1 + end do + else + number_energies = 1 + allocate (index_energy(number_energies), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_photon_energies - allocation of index_energy failed') + ! Account for E = 0.0 + index_energy(number_energies) = int(photo_photon_energy/jdos_spacing) + 1 + end if + + end subroutine calc_photon_energies + + subroutine make_pdos_weights_atoms + !!This subroutine is equivalent to pdos_merge of pdos.F90, but only for atoms + use od_electronic, only: pdos_orbital, pdos_weights, pdos_mwab, nspins + use od_cell, only: num_kpoints_on_node, num_atoms, cell_calc_kpoint_r_cart, kpoint_r_cart + use od_comms, only: my_node_id, on_root + use od_io, only: io_error, stdout, seedname, io_date + use od_parameters, only: devel_flag + implicit none + character(len=9) :: ctime ! Temp. time string + character(len=11):: cdate ! Temp. date string + integer :: N_k, N_spin, n_eigen, np, ierr, atom, box, i, i_max, pdos_unit = 32 + + allocate (pdos_weights_atoms(pdos_mwab%nbands, nspins, num_kpoints_on_node(my_node_id), num_atoms), stat=ierr) + if (ierr /= 0) call io_error('Error: make_pdos_weights_atoms - allocation of pdos_weights_atoms failed') + + allocate (pdos_weights_k_band(pdos_mwab%nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: make_pdos_weights_atoms - allocation of pdos_weights_k_band failed') + + pdos_weights_atoms = 0.0_dp + pdos_weights_k_band = 0.0_dp + + allocate (pdos_weights_boxes(pdos_mwab%nbands, nspins, num_kpoints_on_node(my_node_id), num_boxes), stat=ierr) + if (ierr /= 0) call io_error('Error: make_pdos_weights_atoms - allocation of pdos_weights_atoms failed') + pdos_weights_boxes = 0.0_dp + + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + do n_eigen = 1, pdos_mwab%nbands + i = 1 + do np = 1, pdos_mwab%norbitals + if (np .gt. 1) then + if (pdos_orbital%rank_in_species(np) .ne. pdos_orbital%rank_in_species(np - 1)) then + i = i + 1 + end if + end if + pdos_weights_atoms(n_eigen, N_spin, N_k, i) = & + pdos_weights_atoms(n_eigen, N_spin, N_k, i) + & + pdos_weights(np, n_eigen, N_k, N_spin) + end do + end do + end do + end do + i_max = i + do atom = 1, num_atoms + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + do n_eigen = 1, pdos_mwab%nbands + if (pdos_weights_atoms(n_eigen, N_spin, N_k, atom_order(atom)) .lt. 0.0_dp) then + pdos_weights_atoms(n_eigen, N_spin, N_k, atom_order(atom)) = 0.0_dp + end if + pdos_weights_k_band(n_eigen, N_spin, N_k) = pdos_weights_k_band(n_eigen, N_spin, N_k) + & + pdos_weights_atoms(n_eigen, N_spin, N_k, atom_order(atom)) + end do + end do + end do + end do + ! We need the pdos contributions for each box to calculate the optical properties for + ! each box representing a layer. The values are summed up for all the atoms in that + ! specific box. + do atom = 1, max_atoms + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + do n_eigen = 1, pdos_mwab%nbands + if (pdos_weights_atoms(n_eigen, N_spin, N_k, atom_order(atom)) .lt. 0.0_dp) then + pdos_weights_atoms(n_eigen, N_spin, N_k, atom_order(atom)) = 0.0_dp + end if + pdos_weights_boxes(n_eigen, N_spin, N_k, box_atom(atom)) = & + pdos_weights_boxes(n_eigen, N_spin, N_k, box_atom(atom)) + & + pdos_weights_atoms(n_eigen, N_spin, N_k, atom_order(atom)) + end do + end do + end do + end do + + if (index(devel_flag, 'output_pdos_weights') > 0 .and. on_root) then + call cell_calc_kpoint_r_cart + write (stdout, '(a78)') "+---------------- Printing K-Points in Cartesian Coordinates ----------------+" + i = 0 + do N_k = 1, num_kpoints_on_node(my_node_id) + write (stdout, '(1x,I4,4x,3(1x,E22.15))') i, kpoint_r_cart(:, N_k) + i = i + 1 + end do + call io_date(cdate, ctime) + ! write out atomic/box weights + open (unit=pdos_unit, action='write', file=trim(seedname)//'_pdos_boxes.dat') + write (pdos_unit, '(1x,a28)') '############################' + write (pdos_unit, *) '# OptaDOS Photoemission: Printing PDOS-Boxes-Weights on ', cdate, ' at ', ctime + write (pdos_unit, '(1x,a19,1x,a99)') '# PDOS weights for', seedname + write (pdos_unit, '(1x,a24,1x,I4)') '# Number of PDOS Bands :', size(pdos_weights_boxes, 1) + write (pdos_unit, '(1x,a24,1x,I2)') '# Number of Spins :', size(pdos_weights_boxes, 2) + write (pdos_unit, '(1x,a24,1x,I4)') '# Number of K-points :', size(pdos_weights_boxes, 3) + write (pdos_unit, '(1x,a24,1x,I4)') '# Number of Boxes :', size(pdos_weights_boxes, 4) + write (pdos_unit, '(1x,a45)') '# F U L L _ P D O S _ B O X _ W E I G H T S' + write (pdos_unit, '(1x,a28)') '############################' + do box = 1, num_boxes + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + write (pdos_unit, '(9999(1x,es24.16))') (pdos_weights_boxes(n_eigen, N_spin, N_k, box), n_eigen=1, pdos_mwab%nbands) + end do + end do + end do + close (unit=pdos_unit) + + open (unit=pdos_unit, action='write', file=trim(seedname)//'_pdos_atoms.dat') + write (pdos_unit, '(1x,a28)') '############################' + write (pdos_unit, *) '# OptaDOS Photoemission: Printing PDOS-Atoms-Weights on ', cdate, ' at ', ctime + write (pdos_unit, '(1x,a19,1x,a99)') '# PDOS weights for', seedname + write (pdos_unit, '(1x,a24,1x,I4)') '# Number of PDOS Bands :', size(pdos_weights_atoms, 1) + write (pdos_unit, '(1x,a24,1x,I2)') '# Number of Spins :', size(pdos_weights_atoms, 2) + write (pdos_unit, '(1x,a24,1x,I4)') '# Number of K-points :', size(pdos_weights_atoms, 3) + write (pdos_unit, '(1x,a24,1x,I4)') '# Number of Atoms :', size(pdos_weights_atoms, 4) + write (pdos_unit, '(1x,a45)') '# F U L L _ P D O S _ A T O M _ W E I G H T S' + write (pdos_unit, '(1x,a28)') '############################' + do atom = 1, num_atoms + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + write (pdos_unit, '(9999(1x,es24.16))') (pdos_weights_atoms(n_eigen, N_spin, N_k, atom), n_eigen=1, pdos_mwab%nbands) + end do + end do + end do + close (unit=pdos_unit) + + ! Write out the k-band weights + open (unit=pdos_unit, action='write', file=trim(seedname)//'_pdos_k_band.dat') + write (pdos_unit, '(1x,a28)') '############################' + write (pdos_unit, *) '# OptaDOS Photoemission: Printing PDOS-Weights-K-Band on ', cdate, ' at ', ctime + write (pdos_unit, '(1x,a19,1x,a99)') '# PDOS weights for', seedname + write (pdos_unit, '(1x,a24,1x,I4)') '# Number of PDOS Bands :', size(pdos_weights_k_band, 1) + write (pdos_unit, '(1x,a24,1x,I2)') '# Number of Spins :', size(pdos_weights_k_band, 2) + write (pdos_unit, '(1x,a24,1x,I4)') '# Number of K-points :', size(pdos_weights_k_band, 3) + write (pdos_unit, '(1x,a45)') '# F U L L _ P D O S _ K _ B A N D _ W E I G H T S' + write (pdos_unit, '(1x,a28)') '############################' + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + write (pdos_unit, '(9999(1x,es24.16))') (pdos_weights_k_band(n_eigen, N_spin, N_k), n_eigen=1, pdos_mwab%nbands) + end do + end do + close (unit=pdos_unit) + end if + + if (index(devel_flag, 'print_qe_constituents') > 0 .and. on_root) then + write (stdout, '(1x,a78)') '+------------------------ Printing pDOS_weights_atoms -----------------------+' + write (stdout, 125) shape(pdos_weights_atoms) + write (stdout, 125) i_max, pdos_mwab%nbands, num_kpoints_on_node(my_node_id), nspins +125 format(4(1x, I4)) + write (stdout, '(9999(es15.8))') ((((pdos_weights_atoms(n_eigen, N_spin, N_k, i), N_spin=1, nspins) & + , n_eigen=1, pdos_mwab%nbands), N_k=1, num_kpoints_on_node(my_node_id)), i=1, i_max) + write (stdout, '(1x,a78)') '+----------------------------- Finished Printing ----------------------------+' + write (stdout, '(1x,a78)') '+----------------------- Printing pDOS_weights_k_band -----------------------+' + write (stdout, 124) shape(pdos_weights_k_band) + write (stdout, 124) pdos_mwab%nbands, num_kpoints_on_node(my_node_id), nspins +124 format(3(1x, I4)) + write (stdout, '(9999(es15.8))') (((pdos_weights_k_band(n_eigen, N_spin, N_k), & + N_k=1, num_kpoints_on_node(my_node_id)), N_spin=1, nspins), n_eigen=1, pdos_mwab%nbands) + write (stdout, '(1x,a78)') '+----------------------------- Finished Printing ----------------------------+' + end if + end subroutine make_pdos_weights_atoms + + subroutine calc_photo_optics + !! This subroutine calculates the projected optical characteristics for each layer. + use od_optics, only: make_weights, calc_epsilon_2, calc_epsilon_1, calc_refract, calc_absorp, calc_reflect, & + epsilon, refract, absorp, reflect, intra, write_absorp, write_epsilon, write_reflect, write_refract + use od_io, only: stdout, io_error, io_time, seedname, io_date + use od_electronic, only: elec_read_optical_mat, nbands, nspins, efermi, elec_dealloc_optical, elec_read_band_gradient, & + nbands, nspins, band_energy + use od_cell, only: num_kpoints_on_node, num_kpoints_on_node, cell_calc_kpoint_r_cart + use od_jdos_utils, only: jdos_utils_calculate, jdos_nbins, setup_energy_scale, jdos_deallocate, E + use od_comms, only: comms_bcast, on_root, my_node_id + use od_parameters, only: optics_intraband, jdos_spacing, devel_flag, iprint, jdos_max_energy, photo_model + use od_dos_utils, only: dos_utils_calculate_at_e + use od_constants, only: epsilon_0, e_charge + implicit none + real(kind=dp), allocatable, dimension(:, :, :, :) :: dos_matrix_weights + real(kind=dp), allocatable, dimension(:, :) :: weighted_dos_at_e + real(kind=dp), allocatable, dimension(:, :) :: dos_at_e + integer :: N_k, N2, N_spin, n_eigen, n_eigen_final, atom, ierr, energy, box + integer :: jdos_bin, i, s, is, idos, wjdos_unit = 23 + real(kind=dp) :: time0, time1 + character(len=3) :: atom_s + + time0 = io_time() + + allocate (absorp_photo(num_boxes, number_energies), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_photo_optics - allocation of absorp_photo failed') + + allocate (reflect_photo(num_boxes, number_energies), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_photo_optics - allocation of absorp_photo failed') + + if (index(devel_flag, 'optics_restart') > 0) then + call setup_energy_scale(E) + if (on_root) then + if (.not. allocated(absorp)) then + allocate (absorp(jdos_nbins), stat=ierr) + if (ierr /= 0) call io_error("Error: calc_photo_optics cannot allocate absorp") + end if + if (.not. allocated(reflect)) then + allocate (reflect(jdos_nbins), stat=ierr) + if (ierr /= 0) call io_error("Error: calc_photo_optics cannot allocate reflect") + end if + call read_absorp_file + call read_reflect_file + end if + call comms_bcast(absorp_photo(1, 1), num_boxes*number_energies) + call comms_bcast(reflect_photo(1, 1), num_boxes*number_energies) + + time1 = io_time() + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a47,12x,f11.3,a8)') '+ Time to read Photoemission Optical Properties', time1 - time0, ' (sec) +' + end if + + call make_weights(matrix_weights) + call elec_dealloc_optical + + if (index(photo_model, '3step') > 0 .or. index(photo_model, 'ds_like_pe') > 0) then + ! Flip the kpt and spin indices in the matrix_weights array for contiguous memory access later + allocate (photo_matrix_weights(nbands, nbands, nspins, num_kpoints_on_node(my_node_id))) + if (ierr /= 0) call io_error('Error: calc_photo_optics - allocation of photo_matrix_weights failed') + + do N_spin = 1, nspins + do N_k = 1, num_kpoints_on_node(my_node_id) + photo_matrix_weights(:, :, N_spin, N_k) = matrix_weights(:, :, N_k, N_spin, 1) + end do + end do + end if + ! get rid of the old, now unnecessary array - either because we have the 1step model, + ! or we have transferred the relevant data to photo_matrix_weights + deallocate (matrix_weights, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_photo_optics - failed to deallocate photo_matrix_weights') + N_geom = 1 + return + end if + + call make_weights(matrix_weights) + N_geom = size(matrix_weights, 5) + call elec_dealloc_optical + + if (.not. index(photo_model, 'ds_like_pe') > 0) then + allocate (projected_matrix_weights(nbands, nbands, num_kpoints_on_node(my_node_id), nspins, N_geom), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_photo_optics - allocation of projected_matrix_weights failed') + do box = 1, num_boxes ! Loop over boxes + ! + if (iprint > 1 .and. on_root) then + write (stdout, 145) '+--------------------- Starting BOX/Layer # ', box, ' of ', num_boxes, ' ---------------------+' + end if + ! (Re-)Setting the weights for new box + projected_matrix_weights = 0.0_dp + + do N2 = 1, N_geom + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen = 1, nbands ! Loop over state 1 + do n_eigen_final = n_eigen, nbands ! Loop over state 2 + if (band_energy(n_eigen, N_spin, N_k) > efermi .and. n_eigen /= n_eigen_final) cycle + if (band_energy(n_eigen_final, N_spin, N_k) < efermi .and. n_eigen /= n_eigen_final) cycle + if (pdos_weights_k_band(n_eigen, N_spin, N_k) .eq. 0.0_dp) then + cycle + end if + projected_matrix_weights(n_eigen, n_eigen_final, N_k, N_spin, N2) = & + matrix_weights(n_eigen, n_eigen_final, N_k, N_spin, N2)* & + (pdos_weights_boxes(n_eigen, N_spin, N_k, box)/pdos_weights_k_band(n_eigen, N_spin, N_k)) + end do ! Loop over state 2 + end do ! Loop over state 1 + end do ! Loop over spins + end do ! Loop over kpoints + end do + + if (index(devel_flag, 'print_qe_constituents') > 0 .and. on_root) then + write (stdout, '(1x,a37,I3,a38)') '+-------------------------------Atom-', atom, & + '-------------------------------------+' + write (stdout, '(1x,a78)') '+--------------------- Printing Projected Matrix Weights --------------------+' + write (stdout, 126) shape(projected_matrix_weights) + write (stdout, 126) nbands, nbands, num_kpoints_on_node(my_node_id), nspins, N_geom + write (stdout, '(9999(es15.8))') (((((projected_matrix_weights(n_eigen, n_eigen_final, N_k, N_spin, N2), & + N2=1, N_geom), N_spin=1, nspins), N_k=1, num_kpoints_on_node(my_node_id)), & + n_eigen_final=1, nbands), n_eigen=1, nbands) + write (stdout, '(1x,a78)') '+----------------------------- Finished Printing ----------------------------+' + end if + + ! Send matrix element to jDOS routine and get weighted jDOS back + call jdos_utils_calculate(projected_matrix_weights, weighted_jdos=weighted_jdos) + + if (on_root .and. iprint .gt. 2) then + N_geom = size(matrix_weights, 5) + write (atom_s, '(I3)') box + 100 + open (unit=wjdos_unit, action='write', file=trim(seedname)//'_weighted_jdos_'//trim(adjustl(atom_s))//'.dat') + write (wjdos_unit, '(1x,a28)') '############################' + write (wjdos_unit, '(1x,a19,1x,a99)') '# Weighted JDOS for', seedname + write (wjdos_unit, '(1x,a23,1x,F10.4,1x,a4)') '# maximum JDOS energy :', jdos_max_energy, '[eV]' + write (wjdos_unit, '(1x,a23,1x,F10.4,1x,a4)') '# JDOS step size :', jdos_spacing, '[eV]' + write (wjdos_unit, '(1x,a28)') '############################' + do is = 1, nspins + write (wjdos_unit, *) 'Spin Channel :', is + do idos = 1, jdos_nbins + write (wjdos_unit, *) E(idos), ' , ', sum(weighted_jdos(idos, is, 1:N_geom)) + end do + end do + close (unit=wjdos_unit) + end if + + if (index(devel_flag, 'print_qe_constituents') > 0 .and. on_root) then + write (stdout, '(1x,a78)') '+------------------------ Printing Weighted Joint-DOS -----------------------+' + write (stdout, 124) shape(weighted_jdos) + write (stdout, 124) jdos_nbins, nspins, N_geom + write (stdout, '(9999(es15.8))') (((weighted_jdos(jdos_bin, N_spin, N2), N2=1, N_geom), N_spin=1, nspins) & + , jdos_bin=1, jdos_nbins) + write (stdout, '(1x,a78)') '+----------------------------- Finished Printing ----------------------------+' + end if + + if (optics_intraband) then + allocate (dos_matrix_weights(size(matrix_weights, 5), nbands, num_kpoints_on_node(my_node_id), nspins), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_photo_optics - allocation of dos_matrix_weights failed') + allocate (dos_at_e(3, nspins), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_photo_optics - allocation of dos_at_e failed') + allocate (weighted_dos_at_e(nspins, size(matrix_weights, 5)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_photo_optics - allocation of weighted_dos_at_e failed') + dos_at_e = 0.0_dp + weighted_dos_at_e = 0.0_dp + do N_geom = 1, size(matrix_weights, 5) + do n_eigen = 1, nbands + dos_matrix_weights(N_geom, n_eigen, :, :) = matrix_weights(n_eigen, n_eigen, :, :, N_geom) + end do + end do + call dos_utils_calculate_at_e(efermi, dos_at_e, dos_matrix_weights, weighted_dos_at_e) + weighted_dos_at_e = weighted_dos_at_e/atoms_per_box(box) + end if + + if (on_root) then + if (index(devel_flag, 'print_qe_constituents') > 0 .and. optics_intraband) then + write (stdout, '(1x,a36,f8.4,a34)') '+------------------------ E_Fermi = ', efermi, & + '---------------------------------+' + write (stdout, '(1x,a78)') '+------------------------ Printing DOS Matrix Weights -----------------------+' + write (stdout, 125) shape(dos_matrix_weights) + write (stdout, 125) size(matrix_weights, 5), nbands, num_kpoints_on_node(my_node_id), nspins + write (stdout, '(9999(es15.8))') ((((dos_matrix_weights(n_eigen, n_eigen_final, N_k, s), s=1, nspins), N_k=1, & + num_kpoints_on_node(my_node_id)), n_eigen_final=1, nbands), n_eigen=1, & + size(matrix_weights, 5)) + write (stdout, '(1x,a78)') '+----------------------------- Finished Printing ----------------------------+' + write (stdout, '(1x,a78)') '+--------------------------- Printing DOS @ Energy --------------------------+' + write (stdout, '(9(es15.8))') ((dos_at_e(i, s), i=1, 3), s=1, nspins) + write (stdout, '(1x,a78)') '+----------------------------- Finished Printing ----------------------------+' + write (stdout, '(1x,a78)') '+----------------------- Printing Weighted DOS @ Energy ---------------------+' + write (stdout, '(9999(es15.8))') ((weighted_dos_at_e(s, n_eigen), s=1, nspins), n_eigen=1, size(matrix_weights, 5)) + write (stdout, '(1x,a78)') '+----------------------------- Finished Printing ----------------------------+' + end if + + ! Calculate epsilon_2 + call calc_epsilon_2(weighted_jdos, weighted_dos_at_e, box_volume) + + ! Calculate epsilon_1 + call calc_epsilon_1 + + ! Calculate other optical properties + call calc_refract + call calc_absorp + call calc_reflect + + if (iprint .gt. 2) then + call write_epsilon(box, photo_at_e=dos_at_e, photo_volume=box_volume) + call write_refract(box, photo_volume=box_volume) + call write_absorp(box, photo_volume=box_volume) + call write_reflect(box, photo_volume=box_volume) + end if + + do energy = 1, number_energies + absorp_photo(box, energy) = absorp(index_energy(energy)) + reflect_photo(box, energy) = reflect(index_energy(energy)) + end do + + if (index(devel_flag, 'print_qe_constituents') > 0) then + write (stdout, '(1x,a78)') '+-------------------- Printing Material Optical Properties ------------------+' + write (stdout, '(1x,a78)') '+--------------------------- Printing Epsilon Array -------------------------+' + write (stdout, 125) shape(epsilon) + if (.not. optics_intraband) then + write (stdout, '(9999(E17.8E3))') (((epsilon(jdos_bin, N_k, N2, 1), jdos_bin=1, jdos_nbins), N_k=1, 2), & + N2=1, N_geom) + else + write (stdout, '(9999(E17.8E3))') ((((epsilon(jdos_bin, N_k, N2, i), jdos_bin=1, jdos_nbins), N_k=1, 2), & + N2=1, N_geom), i=1, 3) + end if + write (stdout, '(1x,a78)') '+----------------------------- Finished Printing ----------------------------+' + + write (stdout, '(1x,a78)') '+----------------------------- Printing Absorption --------------------------+' + write (stdout, '(99(E17.8E3))') (absorp_photo(atom, energy), energy=1, number_energies) + write (stdout, '(1x,a78)') '+----------------------------- Finished Printing ----------------------------+' + + write (stdout, '(1x,a78)') '+----------------------------- Printing Reflection --------------------------+' + write (stdout, '(99(E17.8E3))') (reflect_photo(atom, energy), energy=1, number_energies) + write (stdout, '(1x,a78)') '+----------------------------- Finished Printing ----------------------------+' + end if + if (index(devel_flag, 'print_qe_constituents') > 0) then + write (stdout, '(1x,a78)') '+----------------------------- Printing Absorption - box --------------------+' + write (stdout, '(99(E17.8E3))') (absorp_photo(box, energy), energy=1, number_energies) + write (stdout, '(1x,a78)') '+----------------------------- Finished Printing ----------------------------+' + + write (stdout, '(1x,a78)') '+----------------------------- Printing Reflection - box --------------------+' + write (stdout, '(99(E17.8E3))') (reflect_photo(box, energy), energy=1, number_energies) + write (stdout, '(1x,a78)') '+----------------------------- Finished Printing ----------------------------+' + end if + ! Deallocate extra arrays produced in the case of using optics_intraband + deallocate (epsilon, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_photo_optics - failed to deallocate epsilon') + deallocate (refract, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_photo_optics - failed to deallocate refract') + deallocate (absorp, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_photo_optics - failed to deallocate absorp') + deallocate (reflect, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_photo_optics - failed to deallocate reflect') + if (optics_intraband) then + deallocate (intra, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_photo_optics - failed to deallocate intra') + end if + end if + if (optics_intraband) then + deallocate (dos_matrix_weights, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_photo_optics - failed to deallocate dos_matrix_weights') + deallocate (dos_at_e, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_photo_optics - failed to deallocate dos_at_e') + deallocate (weighted_dos_at_e, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_photo_optics - failed to deallocate weighted_dos_at_e') + end if + call jdos_deallocate + deallocate (weighted_jdos, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_photo_optics - failed to deallocate weighted_jdos') + end do ! Loop over boxes + call comms_bcast(absorp_photo(1, 1), num_boxes*number_energies) + call comms_bcast(reflect_photo(1, 1), num_boxes*number_energies) + end if +145 format(1x, a45, I3, a4, I3, a23) +124 format(3(1x, I4)) +125 format(4(1x, I4)) +126 format(5(1x, I4)) + + ! Deallocating this out of the loop to reduce memory operations - could lead to higher memory consumption + deallocate (projected_matrix_weights, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_photo_optics - failed to deallocate projected_matrix_weights') + if (index(photo_model, '3step') > 0 .or. index(photo_model, 'ds_like_pe') > 0) then + ! Flip the kpt and spin indices in the matrix_weights array for contiguous memory access later + allocate (photo_matrix_weights(nbands, nbands, nspins, num_kpoints_on_node(my_node_id))) + if (ierr /= 0) call io_error('Error: calc_photo_optics - allocation of photo_matrix_weights failed') + + do N_spin = 1, nspins + do N_k = 1, num_kpoints_on_node(my_node_id) + photo_matrix_weights(:, :, N_spin, N_k) = matrix_weights(:, :, N_k, N_spin, 1) + end do + end do + end if + ! get rid of the old, now unnecessary array - either because we have the 1step model, + ! or we have transferred the relevant data to photo_matrix_weights + deallocate (matrix_weights, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_photo_optics - failed to deallocate photo_matrix_weights') + + time1 = io_time() + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a52,7x,f11.3,a8)') '+ Time to calculate Photoemission Optical Properties', time1 - time0, ' (sec) +' + end if + + end subroutine calc_photo_optics + + subroutine read_absorp_file + ! This subroutine reads in a series of absorption coefficient curves + ! from a number of appropriately named files. This way the relevant + ! optical data for photoemission can be read as a checkpoint. This can + ! be used to for example calculate the photoemission for a set of + ! k-points along a bandstructure path with the optical properties of + ! a MP grid like k-point distribution, as that is expected to have better + ! convergence. + ! Written by F Mildner, Mar 2025 + use od_optics, only: absorp + use od_jdos_utils, only: jdos_nbins + use od_io, only: seedname, io_file_unit, io_error + + integer :: absorp_unit, box, i, N, ierr, energy + character(len=3) :: box_char + character(len=100) :: dummya + absorp_unit = io_file_unit() + + do box = 1, num_boxes + + write (box_char, '(I0.3)') box + open (unit=absorp_unit, file=trim(seedname)//'_absorption_photo_box_'//trim(adjustl(box_char))//'.dat', iostat=ierr) + if (ierr /= 0) call io_error('Error: Could not open absorption curve .dat file for box #'//trim(adjustl(box_char))) + ! skip header + do i = 1, 50 + read (absorp_unit, *) dummya + if (index(dummya, '#') .eq. 0) exit + end do + do N = 2, jdos_nbins + read (absorp_unit, '(1x,a37,1x,es37.30)') dummya, absorp(N) + end do + close (unit=absorp_unit) + + do energy = 1, number_energies + absorp_photo(box, energy) = absorp(index_energy(energy)) + end do + + end do + end subroutine read_absorp_file + + subroutine read_reflect_file + ! This subroutine reads in a series of reflection coefficient curves + ! from a number of appropriately named files. This way the relevant + ! optical data for photoemission can be read as a checkpoint. This can + ! be used to for example calculate the photoemission for a set of + ! k-points along a bandstructure path with the optical properties of + ! a MP grid like k-point distribution, as that is expected to have better + ! convergence. + ! Written by F Mildner, Mar 2025 + use od_optics, only: reflect + use od_jdos_utils, only: jdos_nbins + use od_io, only: seedname, io_file_unit, io_error + + integer :: reflect_unit, box, i, N, ierr, energy + character(len=3) :: box_char + character(len=100) :: dummya + + reflect_unit = io_file_unit() + + do box = 1, num_boxes + write (box_char, '(I0.3)') box + open (unit=reflect_unit, file=trim(seedname)//'_reflection_photo_box_'//trim(adjustl(box_char))//'.dat', iostat=ierr) + if (ierr /= 0) call io_error('Error: Could not open absorption curve .dat file for box #'//trim(adjustl(box_char))) + ! skip header + do i = 1, 50 + read (reflect_unit, *) dummya + if (index(dummya, '#') .eq. 0) exit + end do + do N = 2, jdos_nbins + read (reflect_unit, '(1x,a37,1x,es37.30)') dummya, reflect(N) + end do + close (unit=reflect_unit) + + do energy = 1, number_energies + reflect_photo(box, energy) = reflect(index_energy(energy)) + end do + + end do + end subroutine read_reflect_file + + subroutine calc_absorp_layer + !!This subroutine calculates the absorption coefficient for a specific layer + ! use od_cell, only: atoms_pos_cart_photo + ! use od_jdos_utils, only: jdos_nbins + use od_io, only: io_error + implicit none + real(kind=dp) :: I_0 + integer :: box, i, ierr + + allocate (I_layer(num_boxes + 1, number_energies), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_absorp_layer - allocation of I_layer failed') + I_layer = 0.0_dp + + I_0 = 1.0_dp + I_layer = 1.0_dp + + do i = 1, number_energies + I_layer(1, i) = I_0 - reflect_photo(1, i) + end do + ! Calculate the unreflected portion of incoming light + do i = 1, number_energies + I_layer(1, i) = I_0 - reflect_photo(1, i) + end do + ! If we have more than one box with atoms in it, calculate the incident light intensity for each + if (num_boxes .gt. 1) then + do box = 2, num_boxes + do i = 1, number_energies + I_layer(box, i) = I_layer(box - 1, i)* & + exp(-(absorp_photo(box, i)*box_height*1E-10)) + if (I_layer(box, i) .lt. 0.0_dp) I_layer(box, i) = 0.0_dp + end do + end do + end if + ! Since we later combine the bulk slab emission probability (contains already light intensity) into the + ! layer by layer emission probability array (does not contain light intensity), we have to set the + ! intensity value artifically to 1.0 to have it not influence the final value. + ! We are only ever accessing I_layer to max_atoms, so this has no effect on the rest. + I_layer(box_atom(max_atoms + 1), 1:number_energies) = 1.0_dp + + if (allocated(reflect_photo)) then + deallocate (reflect_photo, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_absorp_layer - failed to deallocate reflect_photo') + end if + + end subroutine calc_absorp_layer + + subroutine effective_wf + + !photo_elec_field given in eV/A + + use od_parameters, only: photo_work_function, photo_elec_field + use od_electronic, only: efermi + use od_constants, only: pi, epsilon_zero, e_charge + implicit none + + work_function_eff = photo_work_function - sqrt(e_charge**3*1.0E4_dp*photo_elec_field/(4*pi*epsilon_zero)) + + evacuum_eff = work_function_eff + efermi + + end subroutine effective_wf + + subroutine calc_field_emission + !!*This subroutine calculates the Schottky effect + ! parameter photo_elec_field given in V/m + use od_cell, only: num_kpoints_on_node + use od_parameters, only: photo_work_function, photo_elec_field, photo_temperature + use od_electronic, only: efermi, band_energy, nbands, nspins + use od_io, only: io_error + use od_comms, only: my_node_id, comms_reduce + use od_constants, only: pi, epsilon_zero, kB, e_charge, b_factor, p1, p2, p3, p4, q1, q2, q3, q4 + implicit none + integer :: ierr + real(kind=dp), allocatable, dimension(:, :, :) :: field_energy + real(kind=dp), allocatable, dimension(:, :, :) :: temp_emission + real(kind=dp) :: fermi_dirac, barrier_height, argument, exponent + real(kind=dp) :: l_prime, p_term, q_term, v_function, transmission_prob + integer :: N_k, N_spin, n_eigen + + allocate (field_emission(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_field_emission - allocation of field_emission failed') + field_emission = 0.0_dp + + allocate (field_energy(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_field_emission - allocation of field_energy failed') + field_energy = 0.0_dp + + allocate (temp_emission(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_field_emission - allocation of temp_emission failed') + temp_emission = 0.0_dp + + evacuum = efermi + photo_work_function + + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen = 1, nbands + barrier_height = photo_work_function - (band_energy(n_eigen, N_spin, N_k) - efermi) + field_energy(n_eigen, N_spin, N_k) = abs(evacuum - band_energy(n_eigen, N_spin, N_k)) + argument = (band_energy(n_eigen, N_spin, N_k) - efermi)/(kB*photo_temperature) + ! This is a bit of an arbitrary condition, but exp(+-575) ~ 1E(+-250) + ! so this cutoff condition saves us from running into arithmetic + ! issues when computing fermi_dirac due to possible under/over-flow. + if (argument .gt. 575.0_dp) then + fermi_dirac = 0.0_dp + elseif (argument .lt. -575.0_dp) then + fermi_dirac = 1.0_dp + else + fermi_dirac = 1.0_dp/(exp(argument) + 1.0_dp) + end if + + ! + if (photo_elec_field**2*1.0E4_dp/(4.0_dp*pi*epsilon_zero) .lt. (field_energy(n_eigen, N_spin, N_k)**2)) & + then + if (barrier_height .le. 0.0_dp) then + field_emission(n_eigen, N_spin, N_k) = 1.0_dp + else + l_prime = (e_charge**3*1.0E4_dp/(4*pi*epsilon_zero))*photo_elec_field/barrier_height**2 + p_term = 1.0_dp + (p1*l_prime) + (p2*l_prime**2.0_dp) + (p3*l_prime**3.0_dp) + (p4*l_prime**4.0_dp) + q_term = q1 + (q2*l_prime) + (q3*l_prime**2.0_dp) + (q4*l_prime**3.0_dp) + v_function = (1.0_dp - l_prime)*p_term + q_term*l_prime*log(l_prime) + + exponent = -1.0_dp*v_function*b_factor*sqrt(barrier_height**3.0_dp)/photo_elec_field + if (exponent .lt. -575.0_dp) then + transmission_prob = 0.0_dp + else + transmission_prob = exp(exponent) + end if + field_emission(n_eigen, N_spin, N_k) = transmission_prob + end if + end if + temp_emission(n_eigen, N_spin, N_k) = field_emission(n_eigen, N_spin, N_k)*fermi_dirac + end do + end do + end do + + total_field_emission = sum(temp_emission(1:nbands, 1:nspins, 1:num_kpoints_on_node(my_node_id)))/cell_area + call comms_reduce(total_field_emission, 1, "SUM") + + deallocate (field_energy, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_field_emission - failed to deallocate field_energy') + + deallocate (temp_emission, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_field_emission - failed to deallocate temp_emission') + + end subroutine calc_field_emission + + !=============================================================================== + subroutine calc_angle + !*******======================================================================= + ! This subroutine calculates the photoemission angles theta and phi + ! Theta: angle between the photoemitted electron and the surface normal + ! Phi: angle between the photoemission direction and the x axis + ! orig. Victor Chang, 7th February 2020 + ! parts rewritten Felix Mildner, after Mar 2023 + !=============================================================================== + use od_cell, only: num_kpoints_on_node, cell_calc_kpoint_r_cart, kpoint_r_cart + use od_electronic, only: nbands, nspins, band_energy, band_gradient, elec_read_band_gradient, elec_read_band_curvature, & + band_curvature, photo_gkgrid, elec_read_gk_grid_points + use od_comms, only: my_node_id, on_root + use od_parameters, only: photo_model, photo_momentum, devel_flag, iprint, photo_gk_max_vectors + use od_dos_utils, only: doslin, doslin_sub_cell_corners + use od_algorithms, only: gaussian + use od_io, only: stdout, io_error, io_file_unit, stdout, io_time + use od_jdos_utils, only: jdos_utils_calculate + use od_constants, only: hbar, ev_to_j, j_to_ev, e_mass, rad_to_deg + implicit none + integer :: N_k, N_spin, n_eigen, ierr, gk_maxvec, gdx + + real(kind=dp), allocatable, dimension(:, :, :, :):: E_x + real(kind=dp), allocatable, dimension(:, :, :, :):: E_y + real(kind=dp) :: tol = 1.0E-10_dp + real(kind=dp) :: time0, time1 + + time0 = io_time() + gk_maxvec = photo_gk_max_vectors + + if (.not. allocated(E_transverse)) then + allocate (E_transverse(gk_maxvec, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_angle - allocation of E_transverse failed') + end if + E_transverse = 0.0_dp + + if (.not. allocated(theta_arpes)) then + allocate (theta_arpes(gk_maxvec, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_angle - allocation of theta_arpes failed') + end if + ! Impossible value as default that is equal to no emission + theta_arpes = 91.0_dp + + if (.not. allocated(theta_internal)) then + allocate (theta_internal(gk_maxvec, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_angle - allocation of theta_internal failed') + end if + ! Impossible value as default that is equal to no emission + theta_internal = 91.0_dp + + if (.not. allocated(phi_arpes)) then + allocate (phi_arpes(gk_maxvec, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_angle - allocation of phi_arpes failed') + end if + ! Default value to as set along x axis + phi_arpes = 0.0_dp + + if (.not. allocated(E_kinetic)) then + allocate (E_kinetic(gk_maxvec, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_angle - allocation of E_kinetic failed') + end if + E_kinetic = 0.0_dp + + allocate (E_x(gk_maxvec, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_angle - allocation of E_x failed') + E_x = 0.0_dp + + allocate (E_y(gk_maxvec, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_angle - allocation of E_y failed') + E_y = 0.0_dp + + if (index(photo_momentum, 'kp') > 0) then + call elec_read_band_gradient + call elec_read_band_curvature + end if + if (index(photo_momentum, 'operator') > 0) then + call elec_read_band_gradient + end if + + if (index(photo_momentum, 'crystal') > 0) call cell_calc_kpoint_r_cart + + if (index(photo_momentum, 'gkgrid') > 0) then + call elec_read_gk_grid_points(gk_maxvec) + + if (.not. allocated(gkgrid_weight)) then + allocate (gkgrid_weight(gk_maxvec, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_angle - allocation of gkgrid_weight failed') + end if + ! move the important spectral weight into the smaller array for later use + gkgrid_weight(1:gk_maxvec, 1:nbands, 1:nspins, 1:num_kpoints_on_node(my_node_id)) = & + photo_gkgrid(3, 1:gk_maxvec, 1:nbands, 1:nspins, 1:num_kpoints_on_node(my_node_id)) + + else + + if (.not. allocated(gkgrid_weight)) then + allocate (gkgrid_weight(1, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_angle - allocation of gkgrid_weight failed') + gkgrid_weight = 1.0_dp + end if + end if + + if ((index(devel_flag, 'print_qe_formula_values') > 0 .and. on_root) .or. & + (index(devel_flag, 'print_qe_matrix_full') > 0 .and. on_root) & + .or. (index(devel_flag, 'print_qe_matrix_reduced') > 0 .and. on_root)) then + call cell_calc_kpoint_r_cart + write (stdout, '(a78)') "+---------------- Printing K-Points in Cartesian Coordinates ----------------+" + do N_k = 1, num_kpoints_on_node(my_node_id) + write (stdout, '(3(1x,E22.15))') kpoint_r_cart(:, N_k) + end do + write (stdout, '(1x,a78)') '+----------------------------- Finished Printing ----------------------------+' + end if + + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen = 1, nbands + do gdx = 1, photo_gk_max_vectors + ! if (index(photo_momentum, 'kp') > 0) then + ! E_x(gdx, n_eigen, N_spin, N_k) = abs & + ! (0.5_dp*(1/(band_curvature(n_eigen, 1, 1, N_k, N_spin)*ev_to_j*1E-20/(hbar**2)))* & + ! (band_gradient(n_eigen, 1, N_k, N_spin)*(ev_to_j*1E-10/hbar))**2)*j_to_ev + ! E_y(gdx, n_eigen, N_spin, N_k) = abs & + ! (0.5_dp*(1/(band_curvature(n_eigen, 2, 2, N_k, N_spin)*ev_to_j*1E-20/(hbar**2)))* & + ! (band_gradient(n_eigen, 2, N_k, N_spin)*(ev_to_j*1E-10/hbar))**2)*j_to_ev + ! end if + if (index(photo_momentum, 'crystal') > 0) then + E_x(gdx, n_eigen, N_spin, N_k) = (((hbar**2)/(2*e_mass))*((kpoint_r_cart(1, N_k)*1E+10)**2))*j_to_ev + E_y(gdx, n_eigen, N_spin, N_k) = (((hbar**2)/(2*e_mass))*((kpoint_r_cart(2, N_k)*1E+10)**2))*j_to_ev + end if + if (index(photo_momentum, 'gkgrid') > 0) then + E_x(gdx, n_eigen, N_spin, N_k) = (((hbar**2)/(2*e_mass))* & + ((photo_gkgrid(1, gdx, n_eigen, N_spin, N_k)*1E+10)**2))*j_to_ev + E_y(gdx, n_eigen, N_spin, N_k) = (((hbar**2)/(2*e_mass))* & + ((photo_gkgrid(2, gdx, n_eigen, N_spin, N_k)*1E+10)**2))*j_to_ev + end if + ! if (index(photo_momentum, 'operator') > 0) then + ! E_x(gdx, n_eigen, N_spin, N_k) = abs & + ! (0.5_dp*e_mass* & + ! (band_gradient(n_eigen, 1, N_k, N_spin)*(ev_to_j*1E-10/hbar))**2)*j_to_ev + ! E_y(gdx, n_eigen, N_spin, N_k) = abs & + ! (0.5_dp*e_mass* & + ! (band_gradient(n_eigen, 2, N_k, N_spin)*(ev_to_j*1E-10/hbar))**2)*j_to_ev + ! end if + E_transverse(gdx, n_eigen, N_spin, N_k) = E_x(gdx, n_eigen, N_spin, N_k) + E_y(gdx, n_eigen, N_spin, N_k) + end do + end do + end do + end do + + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen = 1, nbands + do gdx = 1, photo_gk_max_vectors + if ((abs(E_x(gdx, n_eigen, N_spin, N_k)) .lt. tol) .and. (abs(E_y(gdx, n_eigen, N_spin, N_k)) .lt. tol)) then + phi_arpes(gdx, n_eigen, N_spin, N_k) = 0.0_dp + elseif ((abs(E_y(gdx, n_eigen, N_spin, N_k)) .lt. tol)) then + phi_arpes(gdx, n_eigen, N_spin, N_k) = 90.0_dp + else + phi_arpes(gdx, n_eigen, N_spin, N_k) = atan(E_x(gdx, n_eigen, N_spin, N_k)/E_y(gdx, n_eigen, N_spin, N_k))*rad_to_deg + end if + end do + end do + end do + end do + ! theta is the angle between emitted electron and the surface normal + ! 3 Step Model - calculating the final energy of the electrons as the FINAL STATE ENERGY + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen = 1, nbands + do gdx = 1, photo_gk_max_vectors + ! total kinetic energy after emission and passing through work function potential step + E_kinetic(gdx, n_eigen, N_spin, N_k) = (band_energy(n_eigen, N_spin, N_k) + temp_photon_energy - evacuum_eff) + ! E_kinetic is the final kinetic energy of the electron after emission + if (E_kinetic(gdx, n_eigen, N_spin, N_k) .lt. E_transverse(gdx, n_eigen, N_spin, N_k)) cycle + ! Angle of electron outside material, after passing the surface and loosing E(work_function) + ! acos(E_ortho/E_kinetic) + theta_arpes(gdx, n_eigen, N_spin, N_k) = (acos((E_kinetic(gdx, n_eigen, N_spin, N_k) & + - E_transverse(gdx, n_eigen, N_spin, N_k)) & + /E_kinetic(gdx, n_eigen, N_spin, N_k)))*rad_to_deg + ! Angle of electron within material, before passing the surface + theta_internal(gdx, n_eigen, N_spin, N_k) = (acos((E_kinetic(gdx, n_eigen, N_spin, N_k) + work_function_eff & + - E_transverse(gdx, n_eigen, N_spin, N_k)) & + /(E_kinetic(gdx, n_eigen, N_spin, N_k) + & + work_function_eff)))*rad_to_deg + end do + end do + end do + end do + + if (index(devel_flag, 'print_qe_constituents') > 0 .and. on_root) then + write (stdout, '(1x,a78)') '+------------------------ Printing Transverse Energy ------------------------+' + write (stdout, '(3(1x,I4))') shape(E_transverse) + write (stdout, '(3(1x,I4))') nbands, num_kpoints_on_node(my_node_id), nspins + write (stdout, '(9999(es15.8))') ((((E_transverse(gdx, n_eigen, N_spin, N_k), gdx=1, photo_gk_max_vectors), & + N_spin=1, nspins), N_k=1, num_kpoints_on_node(my_node_id)), n_eigen=1, nbands) + write (stdout, '(1x,a78)') '+----------------------------- Finished Printing ----------------------------+' + end if + + deallocate (E_y, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_angle - failed to deallocate E_y') + + deallocate (E_x, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_angle - failed to deallocate E_x') + + if (allocated(band_curvature)) then + deallocate (band_curvature, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_angle - failed to deallocate band_curvature') + end if + + if (allocated(band_gradient)) then + deallocate (band_gradient, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_angle - failed to deallocate band_gradient') + end if + + if (allocated(kpoint_r_cart)) then + deallocate (kpoint_r_cart, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_angle - failed to deallocate kpoint_r_cart') + end if + + if (allocated(photo_gkgrid)) then + deallocate (photo_gkgrid, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_angle - failed to deallocate photo_gkgrid') + end if + + time1 = io_time() + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a39,20x,f11.3,a8)') '+ Time to calculate Photoemission Angle', time1 - time0, ' (sec) +' + end if + + end subroutine calc_angle + + subroutine calc_electron_esc + !! This subroutine calculates the electron escape probability for each of the layers + use od_constants, only: dp, deg_to_rad, bohr2ang, H2eV, pi + use od_electronic, only: nbands, nspins, band_energy + use od_cell, only: num_kpoints_on_node, atoms_pos_cart_photo, atoms_label_tmp + use od_io, only: io_error, stdout, io_time + use od_comms, only: my_node_id, on_root + use od_parameters, only: photo_imfp_value, photo_imfp_choice, iprint, photo_gk_max_vectors + implicit none + integer :: atom, N_k, N_spin, n_eigen, ierr, i, gdx + real(kind=dp) :: tolerance + real(kind=dp) :: exponent, time0, time1, scale_factor, scaled_x, g1, g2 + + tolerance = 1.0E-12_dp + time0 = io_time() + allocate (new_atom_coordinates(3, max_atoms), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_electron_esc - allocation of new_atom_coordinates failed') + + !Redefine new z coordinates where the first layer is at z=0 + new_atom_coordinates = atoms_pos_cart_photo + do atom = 1, max_atoms + new_atom_coordinates(3, atom_order(atom)) = atoms_pos_cart_photo(3, atom_order(atom)) - & + (atoms_pos_cart_photo(3, atom_order(1))) + end do + + if (.not. allocated(electron_esc)) then + allocate (electron_esc(photo_gk_max_vectors, nbands, nspins, num_kpoints_on_node(my_node_id), max_atoms + 1), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_electron_esc - allocation of electron_esc failed') + end if + electron_esc = 0.0_dp + + if (.not. allocated(atom_imfp)) then + allocate (atom_imfp(max_atoms), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_electron_esc_list - allocation of atom_imfp failed') + end if + atom_imfp = 0.0_dp + if (index(photo_imfp_choice, 'layers') > 0) then + if (on_root) then + write (stdout, '(1x,a78)') '+--------------- User Supplied and Calculated IMFP Constants ----------------+' + write (stdout, '(1x,a78)') '| Atom | Atom Order | Layer | Layer Thickness | User Input IMFP | Calc. IMFP |' + end if + + ! Calculate the layer dependent imfp constant as a list for each layer + do atom = 1, max_atoms + do i = 1, box_atom(atom) + atom_imfp(atom) = atom_imfp(atom) + box_height*photo_imfp_value(i) + end do + atom_imfp(atom) = atom_imfp(atom)/(box_atom(atom)*box_height) + if (on_root) then + write (stdout, 225) "|", trim(atoms_label_tmp(atom_order(atom))), atom_order(atom), & + box_atom(atom), box_height, photo_imfp_value(box_atom(atom)), atom_imfp(atom), " |" +225 format(1x, a1, a4, 6x, I3, 8x, I3, 6x, E14.6E3, 3x, F11.4, 3x, F11.4, a5) + end if + end do + if (on_root) write (stdout, '(1x,a78)') '+----------------------------------------------------------------------------+' + else if (index(photo_imfp_choice, 'const') > 0) then + atom_imfp = photo_imfp_value(1) + else if (index(photo_imfp_choice, 'curve') > 0) then + if (.not. allocated(band_imfp)) then + allocate (band_imfp(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_electron_esc_list - allocation of atom_imfp failed') + end if + band_imfp = 0.0_dp + scale_factor = 6.9_dp + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + do n_eigen = 1, nbands + scaled_x = (band_energy(n_eigen, N_spin, N_k)/scale_factor) + 1 + if ((1.0_dp - scaled_x) > 1E-10_dp) cycle + g1 = LOG(scaled_x - 1.0_dp) + ((8.0_dp/3.0_dp) - 2.0_dp*LOG(2.0_dp)) + if (scaled_x < 2.0_dp) then + g2 = g2 + (2.0_dp/3.0_dp)*(SQRT(2.0_dp - scaled_x)**(3.0_dp)) + g2 = g2 + (2.0_dp*SQRT(2.0_dp - scaled_x)) + g2 = g2 + LOG(ABS((SQRT(2.0_dp - scaled_x) - 1.0_dp)/(SQRT(2.0_dp - scaled_x) + 1.0_dp))) + else + g2 = 0.0_dp + end if + band_imfp(n_eigen, N_spin, N_k) = bohr2ang*(4.0_dp*pi/3.0_dp)*(scaled_x/(g1 - g2))*(SQRT(2.0_dp*scale_factor/H2eV)) + ! write (stdout, *) "scaled_x", scaled_x, "g1", g1, "g2", g2, band_imfp(n_eigen, N_spin, N_k) + end do + end do + end do + write (stdout, '(1x,a78)') '+------------------ IMFP Values from Energy Dependent Curve -----------------+' + write (stdout, *) 'min', minval(band_imfp), 'max', maxval(band_imfp) + end if + + if ((index(photo_imfp_choice, 'const') > 0) .or. (index(photo_imfp_choice, 'layers') > 0)) then + do atom = 1, max_atoms + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen = 1, nbands + do gdx = 1, photo_gk_max_vectors + ! is the emission possible? + if (cos(theta_internal(gdx, n_eigen, N_spin, N_k)*deg_to_rad) .gt. tolerance) then + ! The electron's kinetic energy inside the material is higher, than after the emission + ! through the surface. Thus follows an angle closer to normal direction and one needs + ! the internal theta angle. + exponent = (new_atom_coordinates(3, atom_order(atom))/ & + cos(theta_internal(gdx, n_eigen, N_spin, N_k)*deg_to_rad))/atom_imfp(atom) + if (exponent .gt. -575.0_dp) then + electron_esc(gdx, n_eigen, N_spin, N_k, atom) = exp(exponent) + else + electron_esc(gdx, n_eigen, N_spin, N_k, atom) = 0.0_dp + end if + end if + end do + end do + end do + end do + end do + else if ((index(photo_imfp_choice, 'curve') > 0)) then + do atom = 1, max_atoms + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen = 1, nbands + do gdx = 1, photo_gk_max_vectors + if (cos(theta_internal(gdx, n_eigen, N_spin, N_k)*deg_to_rad) .gt. tolerance) then + exponent = (new_atom_coordinates(3, atom_order(atom))/ & + cos(theta_internal(gdx, n_eigen, N_spin, N_k)*deg_to_rad))/band_imfp(n_eigen, N_spin, N_k) + if ((exponent .gt. -575.0_dp) .and. (exponent .lt. 575.0_dp)) then + electron_esc(gdx, n_eigen, N_spin, N_k, atom) = exp(exponent) + else if (exponent .gt. -575.0_dp) then + electron_esc(gdx, n_eigen, N_spin, N_k, atom) = 1.0_dp + end if + end if + end do + end do + end do + end do + end do + end if + + time1 = io_time() + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a40,19x,f11.3,a8)') '+ Time to calculate Photoemission Escape', time1 - time0, ' (sec) +' + end if + end subroutine calc_electron_esc + + subroutine bulk_emission + !! This subroutine calculates the contribution from the approximated bulk material + use od_constants, only: dp, deg_to_rad + use od_electronic, only: nbands, nspins + use od_cell, only: num_kpoints_on_node + use od_comms, only: my_node_id, on_root, comms_reduce, comms_bcast + use od_parameters, only: photo_imfp_value, photo_imfp_choice, photo_bulk_cutoff, iprint, photo_gk_max_vectors + use od_io, only: io_error, io_time, stdout + implicit none + real(kind=dp), dimension(:), allocatable :: bulk_light_tmp + integer :: N_k, N_spin, n_eigen, i, num_layers, ierr, gdx + real(kind=dp) :: exponent, time0, time1, band_imfp_max + + time0 = io_time() + +235 format(1x, a1, 5x, a8, I3, 5x, a10, E13.6E2, 2x, a8, E13.6E2, 9x, a1) + + if (index(photo_imfp_choice, 'layers') > 0) then + num_layers = int((atom_imfp(max_atoms)*photo_bulk_cutoff)/box_height) + else if (index(photo_imfp_choice, 'const') > 0) then + num_layers = int((photo_imfp_value(1)*photo_bulk_cutoff)/box_height) + else if (index(photo_imfp_choice, 'curve') > 0) then + band_imfp_max = maxval(band_imfp) + call comms_reduce(band_imfp_max, 1, 'MAX') + call comms_bcast(band_imfp_max, 1) + num_layers = min(5000, int((band_imfp_max*photo_bulk_cutoff)/box_height)) + end if + + allocate (bulk_light_tmp(num_layers), stat=ierr) + if (ierr /= 0) call io_error('Error: bulk_emission - allocation of bulk_light_tmp failed') + bulk_light_tmp = 0.0_dp + + bulk_light_tmp(1) = I_layer(box_atom(max_atoms), current_photo_energy_index)* & + exp(-(absorp_photo(box_atom(max_atoms), current_photo_energy_index)*box_height*1E-10)) + do i = 2, num_layers + bulk_light_tmp(i) = bulk_light_tmp(i - 1)* & + exp(-(absorp_photo(box_atom(max_atoms), current_photo_energy_index)*i*box_height*1E-10)) + end do + + if ((index(photo_imfp_choice, 'layers') > 0) .or. (index(photo_imfp_choice, 'const') > 0)) then + do i = 1, num_layers + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen = 1, nbands + do gdx = 1, photo_gk_max_vectors + if (cos(theta_internal(gdx, n_eigen, N_spin, N_k)*deg_to_rad) .gt. 0.0_dp) then + exponent = (new_atom_coordinates(3, atom_order(max_atoms)) - i*box_height/ & + cos(theta_internal(gdx, n_eigen, N_spin, N_k)*deg_to_rad))/atom_imfp(max_atoms) + ! This makes sure, that exp(exponent) does not underflow the dp fp value. + ! As exp(-575) is ~1E-250, this should be more than enough precision. + if (exponent .gt. -575.0_dp) then + electron_esc(gdx, n_eigen, N_spin, N_k, max_atoms + 1) = & + electron_esc(gdx, n_eigen, N_spin, N_k, max_atoms + 1) + exp(exponent)*bulk_light_tmp(i) + end if + end if + end do + end do + end do + end do + end do + else if (index(photo_imfp_choice, 'curve') > 0) then + do i = 1, num_layers + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen = 1, nbands + do gdx = 1, photo_gk_max_vectors + if (cos(theta_internal(gdx, n_eigen, N_spin, N_k)*deg_to_rad) .gt. 0.0_dp) then + exponent = (new_atom_coordinates(3, atom_order(max_atoms)) - i*box_height/ & + cos(theta_internal(gdx, n_eigen, N_spin, N_k)*deg_to_rad))/band_imfp(n_eigen, N_spin, N_k) + ! This makes sure, that exp(exponent) does not underflow the dp fp value. + ! As exp(-575) is ~1E-250, this should be more than enough precision. + if (exponent .gt. -575.0_dp) then + electron_esc(gdx, n_eigen, N_spin, N_k, max_atoms + 1) = & + electron_esc(gdx, n_eigen, N_spin, N_k, max_atoms + 1) + exp(exponent)*bulk_light_tmp(i) + end if + end if + end do + end do + end do + end do + end do + end if ! If statement + + if (on_root) then + ! write out the bulk properties + write (stdout, '(1x,a78)') '+---------------------- Bulk Approximation Slab Info ------------------------+' + ! write out num_layers + write (stdout, '(1x,a1,5x,a18,1x,a1,1x,I5,45x,a1)') '|', 'Number Bulk layers', '=', num_layers, '|' + ! write out the total volume + volume per layer + write (stdout, '(1x,a1,5x,a14,5x,a1,1x,F10.4,40x,a1)') '|', 'Vol. per layer', '=', box_volume, '|' + write (stdout, '(1x,a1,5x,a12,7x,a1,1x,F10.4,40x,a1)') '|', 'Total Volume', '=', num_layers*box_volume, '|' + write (stdout, '(1x,a78)') '+---- P_esc values for an electron with E = E_fermi and E_transverse = 0 ----+' + ! write out bulk_light_tmp + if (num_layers .lt. 6) then + do i = 1, num_layers + exponent = (new_atom_coordinates(3, atom_order(max_atoms)) - i*box_height)/atom_imfp(max_atoms) + ! This makes sure, that exp(exponent) does not underflow the dp fp value. + ! As exp(-575) is ~1E-250, this should be more than enough precision. + if (exponent .gt. -575.0_dp) then + exponent = exp(exponent) + else + exponent = 0.0_dp + end if + write (stdout, 235) '|', 'Layer # ', i, 'I_light = ', bulk_light_tmp(i), 'P_esc = ', exponent, '|' + end do + else + do i = 1, num_layers + exponent = (new_atom_coordinates(3, atom_order(max_atoms)) - i*box_height)/atom_imfp(max_atoms) + ! This makes sure, that exp(exponent) does not underflow the dp fp value. + ! As exp(-575) is ~1E-250, this should be more than enough precision. + if (exponent .gt. -575.0_dp) then + exponent = exp(exponent) + else + exponent = 0.0_dp + end if + if (i .le. 3 .or. i .gt. num_layers - 3) then + write (stdout, 235) '|', 'Layer # ', i, 'I_light = ', bulk_light_tmp(i), 'P_esc = ', exponent, '|' + elseif (i .eq. 4) then + write (stdout, '(1x,a1,35x,a6,35x,a1)') '|', '......', '|' + end if + end do + end if ! If statement printing of slab light intensities formatting + write (stdout, '(1x,a78)') '+----------------------------------------------------------------------------+' + end if ! If statement extra printing of slab data + + deallocate (bulk_light_tmp, stat=ierr) + if (ierr /= 0) call io_error('Error: bulk_emission - failed to deallocate bulk_light_tmp') + + deallocate (new_atom_coordinates, stat=ierr) + if (ierr /= 0) call io_error('Error: bulk_emission - failed to deallocate new_atom_coordinates') + + time1 = io_time() + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a38,21x,f11.3,a8)') '+ Time to calculate Bulk Photoemission', time1 - time0, ' (sec) +' + write (stdout, '(1x,a78)') '+----------------------------------------------------------------------------+' + end if + + end subroutine bulk_emission + + subroutine calc_ds_like_model + !*=============================================================================== + ! This subroutine calculates the QE using a simplified model following a Dowell- + ! Schmerge like Model by Saha et al. + ! Felix Mildner, May 2024 + !=============================================================================== + use od_cell, only: num_kpoints_on_node, kpoint_weight + use od_electronic, only: nbands, nspins, band_energy, efermi, electrons_per_state, elec_read_band_gradient, & + elec_read_band_curvature + use od_comms, only: my_node_id, on_root, num_nodes, comms_send, comms_recv, comms_bcast + use od_parameters, only: photo_temperature, devel_flag, iprint, num_exclude_bands, & + exclude_bands, photo_model + use od_dos_utils, only: doslin, doslin_sub_cell_corners + use od_algorithms, only: gaussian + use od_io, only: stdout, io_error, io_file_unit, io_time, seedname, io_date + use od_jdos_utils, only: jdos_utils_calculate, setup_energy_scale + use od_constants, only: pi, kB, inv_sqrt_two_pi + implicit none + real(kind=dp), allocatable, dimension(:, :, :, :) :: delta_temp + real(kind=dp), allocatable, dimension(:, :, :) :: fermi_dirac + real(kind=dp), allocatable, dimension(:) :: qe_k_temp + real(kind=dp) :: width, norm_vac, qe_factor, argument, time0, time1, final_fd, initial_fd, excess_energy + integer :: N_k, N_spin, n_eigen, n_eigen_final, ierr, i, qe_unit, token, inode + character(len=10) :: char_e + character(len=99) :: filename + character(len=9) :: ctime ! Temp. time string + character(len=11) :: cdate ! Temp. date string + + width = (1.0_dp/11604.45_dp)*photo_temperature + qe_factor = 1.0_dp/(cell_area) + norm_vac = inv_sqrt_two_pi/width + + time0 = io_time() + + if (.not. allocated(qe_tsm)) then + allocate (qe_tsm(nbands, nbands, nspins, num_kpoints_on_node(my_node_id), 3), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - allocation of qe_tsm failed') + end if + qe_tsm = 0.0_dp + + if (.not. allocated(fermi_dirac)) then + allocate (fermi_dirac(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - allocation of fermi_dirac failed') + end if + fermi_dirac = 0.0_dp + + call photo_calculate_delta(delta_temp, .false.) + + if (iprint > 1 .and. on_root) then + write (stdout, '(1x,a78)') '+-------------------------- Calculating DS Like QE --------------------------+' + end if + + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + do n_eigen = 1, nbands + argument = (band_energy(n_eigen, N_spin, N_k) - efermi)/(kB*photo_temperature) + ! This is a bit of an arbitrary condition, but exp(+-575) ~ 1E(+-250) + ! so this cutoff condition saves us from running into arithmetic + ! issues when computing fermi_dirac due to possible under/over-flow. + if (argument .gt. 575.0_dp) then + fermi_dirac(n_eigen, N_spin, N_k) = 0.0_dp + elseif (argument .lt. -575.0_dp) then + fermi_dirac(n_eigen, N_spin, N_k) = 1.0_dp + else + fermi_dirac(n_eigen, N_spin, N_k) = 1.0_dp/(exp(argument) + 1.0_dp) + end if + end do + end do + end do + + call setup_energy_scale(E) + i = 0 + if (on_root) write (stdout, *) '*** Calculating a simplified Dowell Schmerge like model for PE ***' + + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen_final = min_index_unocc(N_spin, N_k), nbands + if (num_exclude_bands .gt. 1) then + if (any(exclude_bands == n_eigen_final)) then + cycle + end if + end if + excess_energy = band_energy(n_eigen_final, N_spin, N_k) - evacuum_eff + excess_energy = max(excess_energy, 0.0_dp) + final_fd = 1 - fermi_dirac(n_eigen_final, N_spin, N_k) + do n_eigen = 1, n_eigen_final - 1 + initial_fd = fermi_dirac(n_eigen, N_spin, N_k) + ! Calculating the QE denominator + qe_tsm(n_eigen, n_eigen_final, N_spin, N_k, 1) = delta_temp(n_eigen, n_eigen_final, N_spin, N_k)* & + electrons_per_state*kpoint_weight(N_k)* & + final_fd*initial_fd + ! Calculating the QE numerator and MTE denominator + qe_tsm(n_eigen, n_eigen_final, N_spin, N_k, 2) = delta_temp(n_eigen, n_eigen_final, N_spin, N_k)* & + electrons_per_state*kpoint_weight(N_k)* & + final_fd*initial_fd*excess_energy + ! Calculating the MTE numerator + qe_tsm(n_eigen, n_eigen_final, N_spin, N_k, 3) = delta_temp(n_eigen, n_eigen_final, N_spin, N_k)* & + electrons_per_state*kpoint_weight(N_k)* & + final_fd*initial_fd*excess_energy**2 + end do + end do + end do + end do + + if (allocated(delta_temp)) then + deallocate (delta_temp, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_ds_like_model - failed to deallocate delta_temp') + end if + + if (allocated(fermi_dirac)) then + deallocate (fermi_dirac, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_ds_like_model - failed to deallocate fermi_dirac') + end if + + time1 = io_time() + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a78)') '+----------------------------------------------------------------------------+' + write (stdout, '(1x,a41,18x,f11.3,a8)') '+ Time to calculate DS like Photoemission', time1 - time0, ' (sec) +' + end if + + if (index(devel_flag, 'print_kpt_qe_data') > 0) then + if (on_root) then + qe_unit = io_file_unit() + write (char_e, '(F7.3)') temp_photon_energy + filename = trim(seedname)//'_'//trim(photo_model)//'_'//trim(adjustl(char_e))//'_k_point_QE.dat' + write (stdout, *) 'opening file' + open (unit=qe_unit, action='write', file=filename) + write (qe_unit, *) '# The k point dependent QE values' + call io_date(cdate, ctime) + write (qe_unit, *) '## OptaDOS Photoemission: Printing QE K point Data on ', cdate, ' at ', ctime + end if + + allocate (qe_k_temp(num_kpoints_on_node(0)), stat=ierr) + if (ierr /= 0) call io_error('Error: calculate_three_step_model - failed to allocate qe_k_temp on root') + token = -1 + + ! allocate and sum the 3step qe matrix on non-root + if (.not. on_root) then + do N_k = 1, num_kpoints_on_node(my_node_id) + qe_k_temp(N_k) = sum(qe_tsm(:, :, :, N_k, :)) + end do + ! - wait for the token + call comms_recv(token, 1, 0) + ! - send the respective qe_matrix for that node + call comms_send(qe_k_temp(1), num_kpoints_on_node(my_node_id), 0) + ! - send token back to root node + call comms_send(token, 1, 0) + end if + + if (on_root) then + do inode = 1, num_nodes - 1 + ! - send to the token to notes in turn + call comms_send(token, 1, inode) + ! - receive the qe_matrix from the other notes and write it to the file + call comms_recv(qe_k_temp(1), num_kpoints_on_node(inode), inode) + ! write out the qe_matrix to the file + do N_k = 1, num_kpoints_on_node(inode) + write (qe_unit, *) qe_k_temp(N_k) + end do + ! - receive the token from a node + call comms_recv(token, 1, inode) + end do + ! - write root qe_matrix elements + do N_k = 1, num_kpoints_on_node(my_node_id) + write (qe_unit, *) sum(qe_tsm(:, :, :, N_k, :)) + end do + close (unit=qe_unit) + end if + deallocate (qe_k_temp, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_ds_like_model - failed to deallocate qe_k_temp') + end if + + end subroutine calc_ds_like_model + + !=============================================================================== + subroutine calc_three_step_model + !*=============================================================================== + ! This subroutine calculates the QE using the three step model. + ! Victor Chang, 7th February 2020 + ! edited by Felix Mildner, 03/2023 + !=============================================================================== + use od_cell, only: num_kpoints_on_node, kpoint_weight + use od_electronic, only: nbands, nspins, band_energy, efermi, electrons_per_state, elec_read_band_gradient, & + elec_read_band_curvature, transmit_prob, elec_read_transmit_prob + use od_comms, only: my_node_id, on_root, num_nodes, comms_send, comms_recv, comms_bcast + use od_parameters, only: scissor_op, photo_temperature, devel_flag, photo_energy_sweep, iprint, & + photo_model, photo_gk_max_vectors, photo_output, photo_use_tmprob + use od_dos_utils, only: doslin, doslin_sub_cell_corners + use od_algorithms, only: gaussian + use od_io, only: stdout, io_error, io_file_unit, io_time, seedname, io_date + use od_jdos_utils, only: jdos_utils_calculate + use od_constants, only: pi, kB, inv_sqrt_two_pi + implicit none + real(kind=dp), allocatable, dimension(:, :, :, :) :: delta_temp + real(kind=dp), allocatable, dimension(:, :, :) :: fermi_dirac + real(kind=dp), allocatable, dimension(:, :, :, :) :: transverse_gauss + real(kind=dp), allocatable, dimension(:, :, :) :: vacuum_gauss + real(kind=dp), allocatable, dimension(:) :: qe_k_temp + real(kind=dp) :: width, norm_vac, qe_factor, argument, ekin_temp, & + time0, time1, final_fd, temp_contribution, gk_factor, te_gk_factor + integer :: N_k, N_spin, n_eigen_init, n_eigen_final, atom, ierr, gdx, qe_unit, token, inode + character(len=10) :: char_e + character(len=99) :: filename + character(len=9) :: ctime ! Temp. time string + character(len=11) :: cdate ! Temp. date string + + width = kB*photo_temperature + qe_factor = 1.0_dp/(cell_area) + norm_vac = inv_sqrt_two_pi/width + + time0 = io_time() + + if (.not. allocated(field_emission)) then + allocate (field_emission(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - allocation of field_emission failed') + end if + field_emission = 0.0_dp + + if (.not. allocated(qe_tsm)) then + allocate (qe_tsm(nbands, nbands, nspins, num_kpoints_on_node(my_node_id), max_atoms + 1), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - allocation of qe_tsm failed') + end if + qe_tsm = 0.0_dp + + if (.not. allocated(te_tsm)) then + allocate (te_tsm(nbands, nspins, num_kpoints_on_node(my_node_id), max_atoms + 1), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - allocation of te_tsm failed') + end if + te_tsm = 0.0_dp + + if (.not. allocated(fermi_dirac)) then + allocate (fermi_dirac(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - allocation of fermi_dirac failed') + end if + fermi_dirac = 0.0_dp + + if (.not. allocated(vacuum_gauss)) then + allocate (vacuum_gauss(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - allocation of fermi_dirac failed') + end if + vacuum_gauss = 0.0_dp + + if (.not. allocated(transverse_gauss)) then + allocate (transverse_gauss(photo_gk_max_vectors, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - allocation of fermi_dirac failed') + end if + transverse_gauss = 0.0_dp + + if (photo_use_tmprob) then + call elec_read_transmit_prob() + else + if (.not. allocated(transmit_prob)) then + allocate (transmit_prob(nbands, nspins, num_kpoints_on_node(my_node_id))) + if (ierr /= 0) call io_error('Error: calc_three_step_model - allocation of fermi_dirac failed') + end if + transmit_prob = 1.0_dp + end if + + if (index(devel_flag, 'print_qe_constituents') > 0 .and. on_root .and. .not. photo_energy_sweep) then + write (stdout, '(1x,a78)') '+----------------- Printing Matrix Weights in 3Step Function ----------------+' + write (stdout, '(5(1x,I4))') shape(photo_matrix_weights) + write (stdout, '(5(1x,I4))') nbands, nbands, nspins, num_kpoints_on_node(my_node_id), N_geom + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + write (stdout, '(99999(es15.8))') ((photo_matrix_weights(n_eigen_init, n_eigen_final, N_spin, N_k), & + n_eigen_final=1, nbands), n_eigen_init=1, nbands) + end do + end do + write (stdout, '(1x,a78)') '+----------------------------- Finished Printing ----------------------------+' + end if + + call photo_calculate_delta(delta_temp, .false.) + + if (iprint > 1 .and. on_root) then + write (stdout, '(1x,a78)') '+--------------------------- Calculating 3Step QE ---------------------------+' + end if + + if (index(devel_flag, 'print_qe_constituents') > 0 .and. on_root .and. .not. photo_energy_sweep) then + write (stdout, '(1x,a78)') '+---------------------- Printing Delta Function Values ----------------------+' + write (stdout, '(5(1x,I4))') shape(delta_temp) + write (stdout, '(5(1x,I4))') nbands, nbands, num_kpoints_on_node(my_node_id), nspins + do N_spin = 1, nspins + do N_k = 1, num_kpoints_on_node(my_node_id) + write (stdout, '(99999(es15.8))') ((delta_temp(n_eigen_init, n_eigen_final, N_spin, N_k), & + n_eigen_final=1, nbands), n_eigen_init=1, nbands) + end do + end do + write (stdout, '(1x,a78)') '+----------------------------- Finished Printing ----------------------------+' + end if + + ! if (index(devel_flag, 'print_qe_formula_values') > 0 .and. on_root .and. .not. photo_energy_sweep) & + ! then + ! i = 17 ! Defines the number of columns printed in the loop - needed for reshaping the data array during postprocessing + ! write (stdout, '(1x,a78)') '+------------ Printing list of values going into 3step QE Values ------------+' + ! write (stdout, '(14(1x,a17))') 'calced_qe_value', 'initial_state_energy', 'final_state_energy', 'spectral_func', & + ! 'photo_matrix_weights', & + ! 'delta_temp', 'electron_esc', 'kpoint_weight', 'I_layer', 'transverse_gauss', 'vacuum_gauss', 'fermi_dirac', & + ! 'pdos_weights_atoms', 'pdos_weights_k_band' + ! write (stdout, '(1x,a11,6(1x,I4))') 'Array Shape', max_atoms, nbands, nbands, nspins, num_kpoints_on_node(my_node_id), i + ! end if + + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + do n_eigen_init = 1, nbands + argument = (band_energy(n_eigen_init, N_spin, N_k) - efermi)/(kB*photo_temperature) + ! This is a bit of an arbitrary condition, but exp(+-575) ~ 1E(+-250) + ! so this cutoff condition saves us from running into arithmetic + ! issues when computing fermi_dirac due to possible under/over-flow. + if (argument .gt. 575.0_dp) then + fermi_dirac(n_eigen_init, N_spin, N_k) = 0.0_dp + elseif (argument .lt. -575.0_dp) then + fermi_dirac(n_eigen_init, N_spin, N_k) = 1.0_dp + else + fermi_dirac(n_eigen_init, N_spin, N_k) = 1.0_dp/(exp(argument) + 1.0_dp) + end if + + ! The vacuum gauss represents the necessary condition: is the final state above E_vacuum? + ! The transverse gauss represents the sufficient condition: after "emission", do we have enough energy for E_ortho > 0? + ! Is the final state energy above the vauum level? + if (band_energy(n_eigen_init, N_spin, N_k) .lt. evacuum_eff) then + vacuum_gauss(n_eigen_init, N_spin, N_k) = gaussian(band_energy(n_eigen_init, N_spin, N_k) + & + scissor_op, width, evacuum_eff)/norm_vac + else + vacuum_gauss(n_eigen_init, N_spin, N_k) = 1.0_dp + end if + ! Is there enough total energy for this kpt/band for E_ortho > 0 after passing through surface potential step + ! (workfunction), evacuum_eff = efermi + work_function_eff + do gdx = 1, photo_gk_max_vectors + ! Is (photon_energy - transverse energy) > (work_function - E_field_lowering) + ! Is the final kinetic energy ortho > 0? + ekin_temp = temp_photon_energy - E_transverse(gdx, n_eigen_init, N_spin, N_k) + if (ekin_temp .le. work_function_eff) then + transverse_gauss(gdx, n_eigen_init, N_spin, N_k) = gaussian(ekin_temp, width, work_function_eff)/norm_vac + else + transverse_gauss(gdx, n_eigen_init, N_spin, N_k) = 1.0_dp + end if + end do + + end do + end do + end do + + do atom = 1, max_atoms + ! if (iprint > 2 .and. on_root) then + ! write (stdout, '(1x,a1,a38,i4,a3,i4,1x,16x,a11)') ',', & + ! "Calculating atom ", atom, " of", max_atoms, "<-- QE-3S |" + ! end if + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen_final = min_index_unocc(N_spin, N_k), nbands + final_fd = 1 - fermi_dirac(n_eigen_final, N_spin, N_k) + do n_eigen_init = 1, n_eigen_final - 1 + ! do most of the calculation + temp_contribution = (qe_factor*photo_matrix_weights(n_eigen_init, n_eigen_final, N_spin, N_k) & + *delta_temp(n_eigen_init, n_eigen_final, N_spin, N_k)*transmit_prob(n_eigen_final, N_spin, N_k) & + *electrons_per_state*kpoint_weight(N_k)*(I_layer(box_atom(atom), current_photo_energy_index)) & + *vacuum_gauss(n_eigen_final, N_spin, N_k)*fermi_dirac(n_eigen_init, N_spin, N_k)*final_fd & + *(pdos_weights_atoms(n_eigen_init, N_spin, N_k, atom_order(atom)) & + /pdos_weights_k_band(n_eigen_init, N_spin, N_k))) & + *(1.0_dp + field_emission(n_eigen_init, N_spin, N_k)) + do gdx = 1, photo_gk_max_vectors + ! do the gkgrid_dependent part + gk_factor = gkgrid_weight(gdx, n_eigen_init, N_spin, N_k) & + *electron_esc(gdx, n_eigen_final, N_spin, N_k, atom) & + *transverse_gauss(gdx, n_eigen_init, N_spin, N_k) + te_gk_factor = gk_factor*E_transverse(gdx, n_eigen_init, N_spin, N_k) + qe_tsm(n_eigen_init, n_eigen_final, N_spin, N_k, atom) = qe_tsm(n_eigen_init, n_eigen_final, N_spin, N_k, atom) & + + temp_contribution*gk_factor + te_tsm(n_eigen_init, N_spin, N_k, atom) = te_tsm(n_eigen_init, N_spin, N_k, atom) & + + temp_contribution*te_gk_factor + + ! if (index(devel_flag, 'print_qe_formula_values') > 0 .and. on_root) then + ! write (stdout, '(6(1x,I4))') gdx,n_eigen, n_eigen2, N_spin, N, atom + ! write (stdout, '(15(1x,E17.9E3))') qe_tsm(n_eigen, n_eigen2, N_spin, N, atom), + ! band_energy(n_eigen, N_spin, N), band_energy(n_eigen2, N_spin, N), + ! gkgrid_weight(gdx, n_eigen_init, N_spin, N_k), matrix_weights(n_eigen, n_eigen2, N, N_spin, 1), & + ! delta_temp(n_eigen, n_eigen2, N_spin, N), electron_esc(n_eigen, N_spin, N, atom), & + ! kpoint_weight(N), I_layer(layer(atom), current_photo_energy_index), transverse_g, vac_g, & + ! fermi_dirac(n_eigen_init, N_spin, N_k), final_fd,& + ! pdos_weights_atoms(n_eigen, N_spin, N, atom_order(atom)), pdos_weights_k_band(n_eigen, N_spin, N) + ! end if + end do + end do + end do + end do + end do + end do + + call photo_calculate_delta(delta_temp, .true.) + + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen_final = min_index_unocc(N_spin, N_k), nbands + final_fd = 1 - fermi_dirac(n_eigen_final, N_spin, N_k) + do n_eigen_init = 1, n_eigen_final - 1 + temp_contribution = & + (qe_factor*photo_matrix_weights(n_eigen_init, n_eigen_final, N_spin, N_k) & + *delta_temp(n_eigen_init, n_eigen_final, N_spin, N_k) & + *transmit_prob(n_eigen_final, N_spin, N_k) & + *electrons_per_state*kpoint_weight(N_k) & + *vacuum_gauss(n_eigen_final, N_spin, N_k)*fermi_dirac(n_eigen_init, N_spin, N_k)*final_fd & + *(pdos_weights_atoms(n_eigen_init, N_spin, N_k, atom_order(max_atoms)) & + /pdos_weights_k_band(n_eigen_init, N_spin, N_k))) & + *(1.0_dp + field_emission(n_eigen_init, N_spin, N_k)) + do gdx = 1, photo_gk_max_vectors + gk_factor = gkgrid_weight(gdx, n_eigen_init, N_spin, N_k) & + *transverse_gauss(gdx, n_eigen_init, N_spin, N_k) & + *electron_esc(gdx, n_eigen_final, N_spin, N_k, max_atoms + 1) + te_gk_factor = gk_factor*E_transverse(gdx, n_eigen_init, N_spin, N_k) + qe_tsm(n_eigen_init, n_eigen_final, N_spin, N_k, atom) = & + qe_tsm(n_eigen_init, n_eigen_final, N_spin, N_k, atom) + temp_contribution*gk_factor + te_tsm(n_eigen_init, N_spin, N_k, atom) = te_tsm(n_eigen_init, N_spin, N_k, atom) & + + temp_contribution*te_gk_factor + end do + end do + end do + end do + end do + + if (index(devel_flag, 'print_qe_formula_values') > 0 .and. on_root) then + write (stdout, '(1x,a78)') '+----------------------------- Finished Printing ----------------------------+' + end if + + if (allocated(delta_temp)) then + deallocate (delta_temp, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - failed to deallocate delta_temp') + end if + + if (allocated(fermi_dirac)) then + deallocate (fermi_dirac, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - failed to deallocate fermi_dirac') + end if + + if (allocated(transverse_gauss)) then + deallocate (transverse_gauss, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - failed to deallocate transverse_gauss') + end if + + if (allocated(vacuum_gauss)) then + deallocate (vacuum_gauss, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - failed to deallocate vacuum_gauss') + end if + + if (allocated(transmit_prob) .and. index(photo_output, 'off') > 0) then + deallocate (transmit_prob, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - failed to deallocate transmit_prob') + end if + + if (allocated(gkgrid_weight) .and. index(photo_output, 'off') > 0) then + deallocate (gkgrid_weight, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - failed to deallocate gkgrid_weight') + end if + + if (index(devel_flag, 'print_qe_matrix_full') > 0 .and. on_root) then + write (stdout, '(1x,a78)') '+----------------------- Printing Full 3step QE Matrix ----------------------+' + write (stdout, '(6(1x,I4))') shape(qe_tsm) + write (stdout, '(6(1x,I4))') photo_gk_max_vectors, nbands, nbands, num_kpoints_on_node(my_node_id), nspins, max_atoms + 1 + do atom = 1, max_atoms + 1 + do N_spin = 1, nspins + do N_k = 1, num_kpoints_on_node(my_node_id) + write (stdout, '(99999(ES16.8E3))') ((qe_tsm(n_eigen_init, n_eigen_final, N_spin, N_k, atom), & + n_eigen_final=1, nbands), n_eigen_init=1, nbands) + end do + end do + end do + write (stdout, '(1x,a78)') '+----------------------------- Finished Printing ----------------------------+' + end if + + time1 = io_time() + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a78)') '+----------------------------------------------------------------------------+' + write (stdout, '(1x,a39,20x,f11.3,a8)') '+ Time to calculate 3step Photoemission', time1 - time0, ' (sec) +' + end if + + if (index(devel_flag, 'print_kpt_qe_data') > 0) then + if (on_root) then + qe_unit = io_file_unit() + write (char_e, '(F7.3)') temp_photon_energy + filename = trim(seedname)//'_'//trim(photo_model)//'_'//trim(adjustl(char_e))//'_k_point_QE.dat' + write (stdout, *) 'opening file' + open (unit=qe_unit, action='write', file=filename) + write (qe_unit, *) '# The k point dependent QE values' + call io_date(cdate, ctime) + write (qe_unit, *) '## OptaDOS Photoemission: Printing QE K point Data on ', cdate, ' at ', ctime + end if + + allocate (qe_k_temp(num_kpoints_on_node(0)), stat=ierr) + if (ierr /= 0) call io_error('Error: calculate_three_step_model - failed to allocate qe_k_temp on root') + token = -1 + + ! allocate and sum the 3step qe matrix on non-root + if (.not. on_root) then + do N_k = 1, num_kpoints_on_node(my_node_id) + qe_k_temp(N_k) = sum(qe_tsm(:, :, :, N_k, :)) + end do + ! - wait for the token + call comms_recv(token, 1, 0) + ! - send the respective qe_matrix for that node + call comms_send(qe_k_temp(1), num_kpoints_on_node(my_node_id), 0) + ! - send token back to root node + call comms_send(token, 1, 0) + end if + + if (on_root) then + do inode = 1, num_nodes - 1 + ! - send to the token to notes in turn + call comms_send(token, 1, inode) + ! write(stdout, *) 'sent token to node and receiving data from', inode + call comms_recv(qe_k_temp(1), num_kpoints_on_node(inode), inode) + ! write out the qe_matrix to the file + do N_k = 1, num_kpoints_on_node(inode) + write (qe_unit, *) qe_k_temp(N_k) + end do + ! - receive the token from a node + call comms_recv(token, 1, inode) + end do + ! - write root qe_matrix elements + do N_k = 1, num_kpoints_on_node(my_node_id) + write (qe_unit, *) sum(qe_tsm(:, :, :, N_k, :)) + end do + close (unit=qe_unit) + end if + deallocate (qe_k_temp, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - failed to deallocate qe_k_temp') + end if + end subroutine calc_three_step_model + + !=============================================================================== + subroutine photo_calculate_delta(delta_temp, calculate_bulk) + !*=============================================================================== + ! Wrapper around the delta function subroutine to pass correct arguments + ! Victor Chang, 7th February 2020 + !=============================================================================== + use od_parameters, only: linear, fixed, adaptive, quad, iprint + use od_electronic, only: elec_read_band_gradient, band_gradient, efermi_set + use od_comms, only: on_root + use od_io, only: stdout, io_error, io_time + ! use od_cell, only: cell_volume + use od_dos_utils, only: dos_utils_set_efermi + use od_jdos_utils, only: setup_energy_scale, jdos_deallocate + + implicit none + + real(kind=dp) :: time0, time1 + integer :: ierr + + logical, intent(in) :: calculate_bulk + real(kind=dp), intent(out), allocatable, optional :: delta_temp(:, :, :, :) !I've added this + + if (iprint > 1 .and. on_root) then + write (stdout, '(1x,a78)') '+---------------------- Calculate JDOS DELTA FUNCTION -----------------------+' + end if + + !------------------------------------------------------------------------------- + ! R E A D B A N D G R A D I E N T S + ! If we're using one of the more accurate roadening schemes we also need to read in the + ! band gradients too + if (quad .or. linear .or. adaptive) then + if (.not. allocated(band_gradient)) call elec_read_band_gradient + end if + !------------------------------------------------------------------------------- + if (iprint > 1 .and. on_root) then + write (stdout, '(1x,a78)') '+----------------------------------------------------------------------------+' + end if + if (.not. efermi_set) call dos_utils_set_efermi + + time0 = io_time() + + call setup_energy_scale(E) + + if (fixed) then + if (calculate_bulk) then + call calculate_delta('f', delta_temp, .true.) + else + call calculate_delta('f', delta_temp, .false.) + end if + end if + if (adaptive) then + if (calculate_bulk) then + call calculate_delta('a', delta_temp, .true.) + else + call calculate_delta('a', delta_temp, .false.) + end if + end if + if (linear) then + if (calculate_bulk) then + call calculate_delta('l', delta_temp, .true.) + else + call calculate_delta('l', delta_temp, .false.) + end if + end if + + if (quad) then + call io_error("quadratic broadening not implemented") + end if + + call jdos_deallocate + + if (allocated(E)) then + deallocate (E, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_calculate_delta - failed to deallocate E') + end if + + if (allocated(band_gradient) .and. current_photo_energy_index .eq. number_energies) then + deallocate (band_gradient, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_calculate_delta - failed to deallocate band_gradient') + end if + + time1 = io_time() + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a34,25x,f11.3,1x,a7)') & + '+ Time to calculate Delta Function', time1 - time0, '(sec) +' + end if + !------------------------------------------------------------------------------- + + end subroutine photo_calculate_delta + + !=============================================================================== + subroutine calculate_delta(delta_type, delta_temp, calculate_bulk) + !*=============================================================================== + ! This subroutine evaluates the delta function between the valence band + ! and the conduction band using the method specified in the input. + ! orig. Victor Chang, 7 February 2020 + ! edited by Felix Mildner, after March 2022 + !=============================================================================== + use od_comms, only: my_node_id, on_root + use od_cell, only: num_kpoints_on_node, kpoint_grid_dim, recip_lattice + use od_parameters, only: adaptive_smearing, fixed_smearing, iprint, finite_bin_correction, & + scissor_op, hybrid_linear_grad_tol, hybrid_linear, exclude_bands, & + num_exclude_bands, jdos_max_energy, photo_slab_max + use od_io, only: io_error, stdout + use od_electronic, only: band_gradient, nbands, band_energy, nspins, efermi + use od_jdos_utils, only: jdos_nbins + use od_dos_utils, only: doslin, doslin_sub_cell_corners + use od_algorithms, only: gaussian + use od_constants, only: pi, inv_sqrt_two_pi + implicit none + + integer :: ik, is, ib, jb, i, ierr + real(kind=dp) :: cuml, width, adaptive_smearing_temp + real(kind=dp) :: grad(1:3), step(1:3), EV(0:4), sub_cell_length(1:3) + real(kind=dp), save :: delta_bins + + character(len=1), intent(in) :: delta_type + real(kind=dp), intent(inout), allocatable, optional :: delta_temp(:, :, :, :) + logical, intent(in) :: calculate_bulk + + logical :: linear, fixed, adaptive, force_adaptive + real(kind=dp) :: half_slab_height, norm_width + + linear = .false. + fixed = .false. + adaptive = .false. + + select case (delta_type) + case ("l") + linear = .true. + case ("a") + adaptive = .true. + case ("f") + fixed = .true. + case default + call io_error(" ERROR : unknown jdos_type in calculate_delta ") + end select + + width = 0.0_dp + delta_bins = jdos_max_energy/real(jdos_nbins - 1, dp) + half_slab_height = photo_slab_max - slab_middle_ref + + if (linear .or. adaptive) step(:) = 1.0_dp/real(kpoint_grid_dim(:), dp)/2.0_dp + if (adaptive .or. hybrid_linear) then + do i = 1, 2 + sub_cell_length(i) = sqrt(recip_lattice(i, 1)**2 + recip_lattice(i, 2)**2 + recip_lattice(i, 3)**2)*step(i) + end do + if (calculate_bulk) then + sub_cell_length(3) = sqrt(recip_lattice(3, 1)**2 + recip_lattice(3, 1)**2 + (pi/box_height)**2)*step(3) + else + sub_cell_length(3) = sqrt(recip_lattice(3, 1)**2 + recip_lattice(3, 1)**2 + (pi/half_slab_height)**2)*step(3) + end if + adaptive_smearing_temp = adaptive_smearing*sum(sub_cell_length)/3.0_dp + end if + + if (fixed) width = fixed_smearing + + if (.not. allocated(delta_temp)) then + allocate (delta_temp(nbands, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calculate_delta - allocation of delta_temp failed') + end if + delta_temp = 0.0_dp + + do ik = 1, num_kpoints_on_node(my_node_id) + if (iprint > 2 .and. on_root) then + if (mod(real(ik, dp), 10.0_dp) == 0.0_dp) write (stdout, '(1x,a1,a38,i4,a3,i4,1x,a14,2x,a11)') '^', & + "Calculating k-point ", ik, " of", num_kpoints_on_node(my_node_id), 'on this node.', "<-- Delta |" + end if + do is = 1, nspins + occ_states: do ib = 1, nbands + if (num_exclude_bands > 0) then + if (any(exclude_bands == ib)) cycle + end if + if (band_energy(ib, is, ik) .ge. efermi) cycle occ_states + unocc_states: do jb = 1, nbands + if (band_energy(jb, is, ik) .lt. efermi) cycle unocc_states + if (linear .or. adaptive) grad(:) = band_gradient(jb, :, ik, is) - band_gradient(ib, :, ik, is) + + ! If the band is very flat linear broadening can have problems describing it. In this case, fall back to + ! adaptive smearing (and take advantage of FBCS if required). + force_adaptive = .false. + if (.not. fixed) then + if (hybrid_linear .and. (hybrid_linear_grad_tol > sqrt(dot_product(grad, grad)))) force_adaptive = .true. + if (linear .and. .not. force_adaptive) call doslin_sub_cell_corners(grad, step, band_energy(jb, is, ik) - & + band_energy(ib, is, ik) + scissor_op, EV) + if (adaptive .or. force_adaptive) width = sqrt(dot_product(grad, grad))*adaptive_smearing_temp + end if + ! Hybrid Adaptive -- This way we don't lose weight at very flat parts of the + ! band. It's a kind of fudge that we wouldn't need if we had infinitely small bins. + if (finite_bin_correction .and. (width < delta_bins)) width = delta_bins + norm_width = inv_sqrt_two_pi/width + + ! The linear method has a special way to calculate the integrated dos + ! we have to take account for this here. + if (linear .and. .not. force_adaptive) then + delta_temp(ib, jb, is, ik) = doslin(EV(0), EV(1), EV(2), EV(3), EV(4), E(current_energy_index), cuml) + else + delta_temp(ib, jb, is, ik) = gaussian((band_energy(jb, is, ik) - band_energy(ib, is, ik)) + scissor_op, width, & + E(current_energy_index)) + end if + + end do unocc_states + end do occ_states + end do + end do + + if (iprint > 1 .and. on_root) then + write (stdout, '(1x,a78)') '+----------------------------------------------------------------------------+' + end if + + end subroutine calculate_delta + + !=============================================================================== + subroutine make_foptical_weights + !*=============================================================================== + ! This subroutine calculates the optical matrix elements for the one step + ! photoemission model. + ! orig. Victor Chang, 7th February 2020 + ! edited by Felix Mildner, after April 2024 + !=============================================================================== + use od_constants, only: dp, hbar, e_mass + use od_electronic, only: nbands, nspins, num_electrons, electrons_per_state, foptical_mat, fem_energy_info, efermi + use od_cell, only: num_kpoints_on_node, cell_get_symmetry, num_crystal_symmetry_operations, crystal_symmetry_operations + use od_parameters, only: optics_geom, optics_qdir, legacy_file_format, devel_flag, photo_energy_sweep, jdos_spacing,& + & photo_work_function, iprint + use od_io, only: io_error, stdout + use od_comms, only: my_node_id, on_root + + implicit none + + complex(kind=dp), dimension(3) :: g + real(kind=dp), dimension(3) :: qdir, qdir1, qdir2 + real(kind=dp), dimension(2) :: num_occ + real(kind=dp) :: q_weight1, q_weight2, factor, energy_max, tolerance = 0.0001_dp + integer :: N_k, i, j, N_in, N_spin, N2, N3, n_eigen, num_symm, ierr, energy_index + + if (.not. legacy_file_format .and. index(devel_flag, 'old_filename') > 0) then + num_symm = 0 + call cell_get_symmetry + end if + num_symm = num_crystal_symmetry_operations + + num_occ = 0.0_dp + do N_spin = 1, nspins + num_occ(N_spin) = num_electrons(N_spin) + end do + + if (electrons_per_state == 2) then + num_occ(1) = num_occ(1)/2.0_dp + end if + + ! fem_energy_info: energy_count, energy_min, energy_step, energy_fermi, energy_workfct + energy_count = int(fem_energy_info(1)) + energy_min = fem_energy_info(2) + energy_step = fem_energy_info(3) + energy_fermi = fem_energy_info(4) + energy_workfct = fem_energy_info(5) + energy_max = energy_min + energy_step*(energy_count - 1) + ! Check the inputs are compatible + ! Are the jdos_step and energy_step compatible? + ! Check this specifically for photon_sweep, as that is quite important, otherwise check if the current energy can be + ! reached using the input step + if (photo_energy_sweep .and. jdos_spacing .lt. energy_step) then + if (on_root) then + write (stdout, *) 'jdos_spacing = ', jdos_spacing, '1step energy steps for OMEs:', energy_step + write (stdout, *) 'The jdos_spacing is smaller than the supplied energy_step from the .fem_bin and thus incompatible!' + call io_error('The jdos_spacing is smaller than the supplied energy_step from the .fem_bin and thus incompatible!') + end if + end if + ! If energy_step is lt jdos_spacing - is the mod==0? + if (photo_energy_sweep .and. energy_step .lt. jdos_spacing) then + if (abs(modulo(jdos_spacing, energy_step)) .gt. tolerance) then + if (on_root) then + write (stdout, *) 'jdos_spacing = ', jdos_spacing, '1step energy steps for OMEs:', energy_step + write (stdout, *) 'The jdos_spacing and energy_step for 1step OMEs are not a multiple of each other!' + call io_error('The jdos_spacing and energy_step for 1step OMEs are not a multiple of each other!') + end if + end if + end if + ! Is the current photon_energy within the bounds of the energy_min and energy_max values? + if (temp_photon_energy .gt. energy_max .or. temp_photon_energy .lt. energy_min) then + if (on_root) then + write (stdout, *) 'current E_photon = ', temp_photon_energy, 'energy bounds for 1step OMEs:' & + , energy_min, '->', energy_max + write (stdout, *) 'The current photon energy is out of the min->max range of the 1step OMEs!' + call io_error('The current photon energy is out of the min->max range of the 1step OMEs!') + end if + end if + ! Is the fermi_energy within error? + if (abs(energy_fermi - efermi) .gt. tolerance) then + if (on_root) then + write (stdout, *) 'optados E_fermi:', efermi, '1step OME E_fermi:', energy_fermi + write (stdout, *) 'The Fermi Energy calculated in OptaDOS and supplied from the .fem_bin are incompatible!' + call io_error('The Fermi Energy calculated in OptaDOS and supplied from the .fem_bin are incompatible!') + end if + end if + ! Is the energy_workfct within error? + if (abs(energy_workfct - photo_work_function) .gt. tolerance) then + if (on_root) then + write (stdout, *) 'optados workfct:', photo_work_function, '1step OME workfct:', energy_workfct + write (stdout, *) 'The Workfct from OptaDOS input and supplied from the .fem_bin are incompatible!' + call io_error('The Workfct from OptaDOS input and supplied from the .fem_bin are incompatible!') + end if + end if + + ! Calculate the correct energy index in foptical_mat to use for the population of foptical_matrix_weights + energy_index = nint(((temp_photon_energy - energy_min)/energy_step)) + 1 + if (on_root .and. iprint .gt. 2) write (stdout, *) 'energy_index:', energy_index + + if (.not. allocated(foptical_matrix_weights)) then + allocate (foptical_matrix_weights(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: make_foptical_weights - allocation of foptical_matrix_weights failed') + end if + foptical_matrix_weights = 0.0_dp + + if (index(optics_geom, 'polar') > 0) then + qdir = optics_qdir + q_weight = ((qdir(1)**2) + (qdir(2)**2) + (qdir(3)**2))**0.5_dp + if (q_weight < 0.001_dp) call io_error("Error: please check optics_qdir, norm close to zero") + end if + + if (index(optics_geom, 'unpolar') > 0) then + !TO CHANGE WHEN THE light_direction IS CORRECTED + if (optics_qdir(3) .lt. 1E-06) then + qdir1(1) = 0.0_dp + qdir1(2) = 0.0_dp + qdir1(3) = 1.0_dp + else + qdir1(1) = 1.0_dp + qdir1(2) = 1.0_dp + qdir1(3) = -(optics_qdir(1) + optics_qdir(2))/optics_qdir(3) + end if + qdir2(1) = (optics_qdir(2)*qdir1(3)) - (optics_qdir(3)*qdir1(2)) + qdir2(2) = (optics_qdir(3)*qdir1(1)) - (optics_qdir(1)*qdir1(3)) + qdir2(3) = (optics_qdir(1)*qdir1(2)) - (optics_qdir(2)*qdir1(1)) + q_weight1 = ((qdir1(1)**2) + (qdir1(2)**2) + (qdir1(3)**2))**0.5_dp + q_weight2 = ((qdir2(1)**2) + (qdir2(2)**2) + (qdir2(3)**2))**0.5_dp + end if + + N_in = 1 ! 0 = no inversion, 1 = inversion + g = 0.0_dp + factor = 1.0_dp/(temp_photon_energy**2) + + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen = 1, nbands ! Loop over state + if (index(optics_geom, 'unpolar') > 0) then + if (num_symm == 0) then + g(1) = (((qdir1(1)*foptical_mat(n_eigen, 1, energy_index, N_k, N_spin)) + & + (qdir1(2)*foptical_mat(n_eigen, 2, energy_index, N_k, N_spin)) + & + (qdir1(3)*foptical_mat(n_eigen, 3, energy_index, N_k, N_spin)))/q_weight1) + g(2) = (((qdir2(1)*foptical_mat(n_eigen, 1, energy_index, N_k, N_spin)) + & + (qdir2(2)*foptical_mat(n_eigen, 2, energy_index, N_k, N_spin)) + & + (qdir2(3)*foptical_mat(n_eigen, 3, energy_index, N_k, N_spin)))/q_weight2) + foptical_matrix_weights(n_eigen, N_spin, N_k) = & + 0.5_dp*factor*(real(g(1)*conjg(g(1)), dp) + real(g(2)*conjg(g(2)), dp)) + else ! begin unpolar symmetric + do N2 = 1, num_symm + do N3 = 1, 1 + N_in + ! Calculating foptical_matrix_weights contribution for qdir1 + do i = 1, 3 + qdir(i) = 0.0_dp + do j = 1, 3 + qdir(i) = qdir(i) + ((-1.0_dp)**(N3 + 1))*(crystal_symmetry_operations(j, i, N2)*qdir1(j)) + end do + end do + g(1) = (((qdir(1)*foptical_mat(n_eigen, 1, energy_index, N_k, N_spin)) + & + (qdir(2)*foptical_mat(n_eigen, 2, energy_index, N_k, N_spin)) + & + (qdir(3)*foptical_mat(n_eigen, 3, energy_index, N_k, N_spin)))/q_weight1) + foptical_matrix_weights(n_eigen, N_spin, N_k) = & + foptical_matrix_weights(n_eigen, N_spin, N_k) + & + (0.5_dp/Real((num_symm*(N_in + 1)), dp))*real(g(1)*conjg(g(1)), dp)*factor + g(1) = 0.0_dp + ! Calculating foptical_matrix_weights contribution for qdir2 + do i = 1, 3 ! if I include an extra variable I can merge this and the last do loops + qdir(i) = 0.0_dp + do j = 1, 3 + qdir(i) = qdir(i) + ((-1.0_dp)**(N3 + 1))*(crystal_symmetry_operations(j, i, N2)*qdir2(j)) + end do + end do + g(1) = (((qdir(1)*foptical_mat(n_eigen, 1, energy_index, N_k, N_spin)) + & + (qdir(2)*foptical_mat(n_eigen, 2, energy_index, N_k, N_spin)) + & + (qdir(3)*foptical_mat(n_eigen, 3, energy_index, N_k, N_spin)))/q_weight2) + foptical_matrix_weights(n_eigen, N_spin, N_k) = & + foptical_matrix_weights(n_eigen, N_spin, N_k) + & + (0.5_dp/Real((num_symm*(N_in + 1)), dp))*real(g(1)*conjg(g(1)), dp)*factor + end do + end do + end if !end unpolar symmetric + elseif (index(optics_geom, 'polar') > 0) then + if (num_symm == 0) then + g(1) = (((qdir(1)*foptical_mat(n_eigen, nbands + 1, 1, N_k, N_spin)) + & + (qdir(2)*foptical_mat(n_eigen, nbands + 1, 2, N_k, N_spin)) + & + (qdir(3)*foptical_mat(n_eigen, nbands + 1, 3, N_k, N_spin)))/q_weight) + foptical_matrix_weights(n_eigen, N_spin, N_k) = factor*real(g(1)*conjg(g(1)), dp) + else !begin polar symmetric + do N2 = 1, num_symm + do N3 = 1, 1 + N_in + do i = 1, 3 + qdir(i) = 0.0_dp + do j = 1, 3 + qdir(i) = qdir(i) + ((-1.0_dp)**(N3 + 1))* & + (crystal_symmetry_operations(j, i, N2)*optics_qdir(j)) + end do + end do + g(1) = 0.0_dp + g(1) = (((qdir(1)*foptical_mat(n_eigen, 1, energy_index, N_k, N_spin)) + & + (qdir(2)*foptical_mat(n_eigen, 2, energy_index, N_k, N_spin)) + & + (qdir(3)*foptical_mat(n_eigen, 3, energy_index, N_k, N_spin)))/q_weight) + foptical_matrix_weights(n_eigen, N_spin, N_k) = & + foptical_matrix_weights(n_eigen, N_spin, N_k) + & + (1.0_dp/Real((num_symm*(N_in + 1)), dp))*factor*real(g(1)*conjg(g(1)), dp) + end do + end do + end if ! end polar symmetric + end if ! end photo_geom + end do ! loop over state 1 + end do ! loop over spins + end do ! loop over kpoints + + if (allocated(foptical_mat) .and. current_photo_energy_index .eq. number_energies) then + deallocate (foptical_mat, stat=ierr) + if (ierr /= 0) call io_error('Error: make_foptical_weights - failed to deallocate foptical_mat') + end if + + if (index(devel_flag, 'print_qe_constituents') > 0 .and. on_root .and. .not. photo_energy_sweep) then + write (stdout, '(1x,a78)') '+------------------------- Printing Free OM Weights -------------------------+' + write (stdout, 126) shape(foptical_matrix_weights) + write (stdout, 126) nbands + 1, nbands + 1, num_kpoints_on_node(my_node_id), nspins, N_geom +126 format(5(1x, I4)) + do N_spin = 1, nspins + do N_k = 1, num_kpoints_on_node(my_node_id) + write (stdout, '(99999(es15.8))') (foptical_matrix_weights(n_eigen, N_spin, N_k), n_eigen=1, nbands) + end do + end do + write (stdout, '(1x,a78)') '+----------------------------- Finished Printing ----------------------------+' + end if + + end subroutine make_foptical_weights + + !=============================================================================== + subroutine calc_one_step_model + !=============================================================================== + ! This subroutine calculates the QE using a one step model. + ! orig. Victor Chang, 7th February 2020 + ! edited by Felix Mildner, after April 2024 + !=============================================================================== + + use od_cell, only: num_kpoints_on_node, kpoint_weight + use od_electronic, only: nbands, nspins, band_energy, efermi, electrons_per_state, elec_read_band_gradient,& + & elec_read_band_curvature + use od_comms, only: my_node_id, num_nodes + use od_parameters, only: scissor_op, photo_temperature, devel_flag, photo_energy_sweep, & + iprint, photo_model, photo_gk_max_vectors + use od_dos_utils, only: doslin, doslin_sub_cell_corners + use od_algorithms, only: gaussian + use od_comms, only: on_root, comms_recv, comms_send + use od_io, only: stdout, io_error, io_file_unit, io_time, seedname, io_date + use od_jdos_utils, only: jdos_utils_calculate + use od_constants, only: pi, kB, inv_sqrt_two_pi + implicit none + integer :: N_k, N_spin, n_eigen, atom, ierr, i, gdx, kpt_total, inode, token, qe_unit + + real(kind=dp) :: width, norm_vac, qe_factor, argument, time0, time1 + real(kind=dp) :: temp_contribution, e_ortho_kin_temp, efinal_temp + real(kind=dp) :: gk_factor, te_gk_factor + real(kind=dp), allocatable, dimension(:, :, :) :: fermi_dirac + real(kind=dp), allocatable, dimension(:, :, :, :) :: transverse_gauss + real(kind=dp), allocatable, dimension(:, :, :) :: vacuum_gauss + real(kind=dp), allocatable, dimension(:) :: qe_k_temp + character(len=99) :: filename + character(len=10) :: char_e + character(len=9) :: ctime ! Temp. time string + character(len=11) :: cdate ! Temp. date string + + if (index(devel_flag, 'write_fem_matrix') > 0) then + kpt_total = sum(num_kpoints_on_node(0:num_nodes - 1)) + call write_distributed_fem_data(kpt_total) + end if + + qe_factor = 1.0_dp/(cell_area) + width = (1.0_dp/11604.45_dp)*photo_temperature + norm_vac = inv_sqrt_two_pi/width + + time0 = io_time() + if (iprint > 1 .and. on_root) then + write (stdout, '(1x,a78)') '+--------------------------- Calculating 1Step QE ---------------------------+' + end if + + if (.not. allocated(field_emission)) then + allocate (field_emission(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_one_step_model - allocation of field_emission failed') + end if + field_emission = 0.0_dp + + if (.not. allocated(fermi_dirac)) then + allocate (fermi_dirac(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - allocation of fermi_dirac failed') + end if + fermi_dirac = 0.0_dp + + if (.not. allocated(vacuum_gauss)) then + allocate (vacuum_gauss(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - allocation of vacuum_gauss failed') + end if + vacuum_gauss = 1.0_dp + + if (.not. allocated(transverse_gauss)) then + allocate (transverse_gauss(photo_gk_max_vectors, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - allocation of transverse_gauss failed') + end if + transverse_gauss = 1.0_dp + + if (.not. allocated(qe_osm)) then + allocate (qe_osm(nbands, nspins, num_kpoints_on_node(my_node_id), max_atoms + 1), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_one_step_model - allocation of qe_osm failed') + end if + qe_osm = 0.0_dp + + if (.not. allocated(te_osm)) then + allocate (te_osm(nbands, nspins, num_kpoints_on_node(my_node_id), max_atoms + 1), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_one_step_model - allocation of te_osm failed') + end if + te_osm = 0.0_dp + + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + do n_eigen = 1, nbands + argument = (band_energy(n_eigen, N_spin, N_k) - efermi)/(kB*photo_temperature) + ! This is a bit of an arbitrary condition, but exp(+-230) ~ 1E(+-100) + ! so this cutoff condition saves us from running into arithmetic + ! issues when computing fermi_dirac due to possible under/over-flow. + if (argument .gt. 230.0_dp) then + fermi_dirac(n_eigen, N_spin, N_k) = 0.0_dp + elseif (argument .lt. -230.0_dp) then + fermi_dirac(n_eigen, N_spin, N_k) = 1.0_dp + else + fermi_dirac(n_eigen, N_spin, N_k) = 1.0_dp/(exp(argument) + 1.0_dp) + end if + + ! The vacuum gauss represents the necessary condition: is the final state above E_vacuum? + ! The transverse gauss represents the sufficient condition: after "emission", do we have energy for E_ortho > 0? + + ! Is the final total energy of the electron (E_initial + scissor + hw) above the vacuum level? + efinal_temp = band_energy(n_eigen, N_spin, N_k) + scissor_op + temp_photon_energy + if (efinal_temp .lt. evacuum_eff) then + vacuum_gauss(n_eigen, N_spin, N_k) = gaussian(efinal_temp, width, evacuum_eff)/norm_vac + else + vacuum_gauss(n_eigen, N_spin, N_k) = 1.0_dp + end if + + ! is the photon energy large enough to allow an emission at this kpoint/k+G + do gdx = 1, photo_gk_max_vectors + e_ortho_kin_temp = temp_photon_energy - E_transverse(gdx, n_eigen, N_spin, N_k) + if (e_ortho_kin_temp .le. work_function_eff) then + transverse_gauss(gdx, n_eigen, N_spin, N_k) = gaussian(e_ortho_kin_temp, width, work_function_eff)/norm_vac + else + transverse_gauss(gdx, n_eigen, N_spin, N_k) = 1.0_dp + end if + end do + + end do + end do + end do + + if (index(devel_flag, 'print_qe_formula_values') > 0 .and. on_root .and. .not. photo_energy_sweep) then + i = 13 ! Defines the number of columns printed in the loop - needed for reshaping the data array during postprocessing + write (stdout, '(1x,a78)') '+------------ Printing list of values going into 1step QE Values ------------+' + write (stdout, '(13(7x,a17))') 'calced_qe_value', 'contribution', 'band_energy', 'gkgrid_weight', & + 'foptical_matrix_weights', & + & 'electron_esc', 'kpoint_weight', 'I_layer', 'transverse_gauss', 'vacuum_gauss', 'fermi_dirac', 'pdos_weights_atoms', & + 'pdos_weights_k_band' + write (stdout, '(1x,a11,6(1x,I4))') 'Array Shape', i, max_atoms, nbands, nspins, num_kpoints_on_node(my_node_id) + end if + do atom = 1, max_atoms + 1 + ! if (iprint > 2 .and. on_root .and. (atom .le. max_atoms)) then + ! write (stdout, '(1x,a1,a38,i4,a3,i4,1x,16x,a11)') ',', "Calculating atom ", atom, " of", max_atoms, "<-- QE-1S |" + ! end if + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen = 1, nbands + temp_contribution = (qe_factor & + *foptical_matrix_weights(n_eigen, N_spin, N_k) & + *electrons_per_state*kpoint_weight(N_k) & + *(I_layer(box_atom(atom), current_photo_energy_index)) & + *vacuum_gauss(n_eigen, N_spin, N_k) & + *fermi_dirac(n_eigen, N_spin, N_k) & + *(pdos_weights_atoms(n_eigen, N_spin, N_k, atom_order(atom)) & + /pdos_weights_k_band(n_eigen, N_spin, N_k))) & + *(1.0_dp + field_emission(n_eigen, N_spin, N_k)) + do gdx = 1, photo_gk_max_vectors + gk_factor = gkgrid_weight(gdx, n_eigen, N_spin, N_k) & + *electron_esc(gdx, n_eigen, N_spin, N_k, atom) & + *transverse_gauss(gdx, n_eigen, N_spin, N_k) + te_gk_factor = gk_factor*E_transverse(gdx, n_eigen, N_spin, N_k) + qe_osm(n_eigen, N_spin, N_k, atom) = qe_osm(n_eigen, N_spin, N_k, atom) & + + temp_contribution*gk_factor + te_osm(n_eigen, N_spin, N_k, atom) = te_osm(n_eigen, N_spin, N_k, atom) & + + temp_contribution*te_gk_factor + ! if ((temp_contribution*gk_factor) .gt. 0.0_dp .and. index(devel_flag, 'print_qe_formula_values') > 0 & + ! .and. on_root) then + ! write (stdout, '(5(1x,I4))') gdx, n_eigen, N_spin, N_k, atom + ! write (stdout, '(13(7x,E17.9E3))') qe_osm(n_eigen, N_spin, N_k, atom), temp_contribution*gk_factor, & + ! band_energy(n_eigen, N_spin, N_k), & + ! gkgrid_weight(gdx, n_eigen, N_spin, N_k), foptical_matrix_weights(n_eigen, N_spin, N_k), & + ! electron_esc(gdx, n_eigen, N_spin, N_k, atom), kpoint_weight(N_k), & + ! I_layer(box_atom(atom), current_photo_energy_index), transverse_gauss(gdx, n_eigen, N_spin, N_k), & + ! vacuum_gauss(n_eigen, N_spin, N_k), & + ! fermi_dirac(n_eigen, N_spin, N_k), pdos_weights_atoms(n_eigen, N_spin, N_k, atom_order(atom)), & + ! pdos_weights_k_band(n_eigen, N_spin, N_k) + ! end if + end do + end do + end do + end do + end do + + if (index(devel_flag, 'print_qe_formula_values') > 0 .and. on_root) then + write (stdout, '(1x,a78)') '+----------------------------- Finished Printing ----------------------------+' + end if + + if ((index(devel_flag, 'print_qe_constituents') > 0 .or. index(devel_flag, 'print_qe_matrix_full') > 0) .and. on_root) then + write (stdout, '(1x,a78)') '+------------------------- Printing 1step QE Matrix -------------------------+' + write (stdout, 125) shape(qe_osm) + write (stdout, 125) nbands, num_kpoints_on_node(my_node_id), nspins, max_atoms + 1 +125 format(4(1x, I4)) + do atom = 1, max_atoms + 1 + do N_spin = 1, nspins + do N_k = 1, num_kpoints_on_node(my_node_id) + write (stdout, '(9999(ES16.8E3))') (qe_osm(n_eigen, N_spin, N_k, atom), n_eigen=1, nbands) + end do + end do + end do + write (stdout, '(1x,a78)') '+----------------------------- Finished Printing ----------------------------+' + end if + + if (index(devel_flag, 'print_kpt_qe_data') > 0) then + if (on_root) then + qe_unit = io_file_unit() + write (char_e, '(F7.3)') temp_photon_energy + filename = trim(seedname)//'_'//trim(photo_model)//'_'//trim(adjustl(char_e))//'_k_point_QE.dat' + write (stdout, *) 'opening file' + open (unit=qe_unit, action='write', file=filename) + write (qe_unit, *) '# The k point dependent QE values' + call io_date(cdate, ctime) + write (qe_unit, *) '## OptaDOS Photoemission: Printing QE K point Data on ', cdate, ' at ', ctime + end if + + allocate (qe_k_temp(num_kpoints_on_node(0)), stat=ierr) + if (ierr /= 0) call io_error('Error: calculate_one_step_model - failed to allocate qe_k_temp on root') + token = -1 + + ! allocate and sum the 3step qe matrix on non-root + if (.not. on_root) then + do N_k = 1, num_kpoints_on_node(my_node_id) + qe_k_temp(N_k) = sum(qe_osm(:, :, N_k, :)) + end do + ! - wait for the token + call comms_recv(token, 1, 0) + ! - send the respective qe_matrix for that node + call comms_send(qe_k_temp(1), num_kpoints_on_node(my_node_id), 0) + ! - send token back to root node + call comms_send(token, 1, 0) + end if + + if (on_root) then + do inode = 1, num_nodes - 1 + ! - send to the token to notes in turn + call comms_send(token, 1, inode) + ! - receive the qe_matrix from the other notes and write it to the file + call comms_recv(qe_k_temp(1), num_kpoints_on_node(inode), inode) + ! write out the qe_matrix to the file + do N_k = 1, num_kpoints_on_node(inode) + write (qe_unit, *) qe_k_temp(N_k) + end do + ! - receive the token from a node + call comms_recv(token, 1, inode) + end do + ! - write root qe_matrix elements + do N_k = 1, num_kpoints_on_node(my_node_id) + write (qe_unit, *) sum(qe_osm(:, :, N_k, :)) + end do + close (unit=qe_unit) + end if + deallocate (qe_k_temp, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_one_step_model - failed to deallocate qe_k_temp') + end if + + if (allocated(fermi_dirac)) then + deallocate (fermi_dirac, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - failed to deallocate fermi_dirac') + end if + + if (allocated(transverse_gauss)) then + deallocate (transverse_gauss, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - failed to deallocate transverse_gauss') + end if + + if (allocated(vacuum_gauss)) then + deallocate (vacuum_gauss, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - failed to deallocate vacuum_gauss') + end if + + time1 = io_time() + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a78)') '+----------------------------------------------------------------------------+' + write (stdout, '(1x,a39,20x,f11.3,a8)') '+ Time to calculate 1step Photoemission', time1 - time0, ' (sec) +' + end if + + end subroutine calc_one_step_model + + !=============================================================================== + subroutine weighted_mean_te + !*=============================================================================== + ! This subroutine calculates the weighted arithmetic mean transverse energy + ! sum(QE*mte)/(total QE) + ! orig. Victor Chang, 7 February 2020 + ! edited by Felix Mildner, after June 2023 + !=============================================================================== + use od_cell, only: cell_calc_kpoint_r_cart + use od_electronic, only: elec_read_band_gradient, elec_read_band_curvature + use od_comms, only: on_root, comms_reduce, comms_bcast + use od_parameters, only: photo_model, iprint + use od_dos_utils, only: doslin, doslin_sub_cell_corners + use od_algorithms, only: gaussian + use od_io, only: io_error, io_file_unit, io_time, stdout + use od_jdos_utils, only: jdos_utils_calculate + use od_constants, only: inv_sqrt_two_pi + implicit none + real(kind=dp) :: time0, time1, qe_term1, qe_term2, mte_term1, mte_term2 + integer :: atom, ierr + + time0 = io_time() + + if (iprint > 1 .and. on_root) then + write (stdout, '(1x,a78)') '+----------------------------- Calculating MTE ------------------------------+' + end if + + if (.not. allocated(layer_qe)) then + allocate (layer_qe(max_atoms + 1), stat=ierr) + if (ierr /= 0) call io_error('Error: weighted_mean_te - allocation of layer_qe failed') + end if + layer_qe = 0.0_dp + + if (index(photo_model, '3step') > 0) then + do atom = 1, max_atoms + 1 + ! Calculate the qe contribution of each atom/layer + layer_qe(atom) = sum(qe_tsm(:, :, :, :, atom)) + end do + + ! Sum the data from other nodes that have more k-points stored + call comms_reduce(layer_qe(1), max_atoms + 1, 'SUM') + ! Calculate the total QE + total_qe = sum(layer_qe(1:(max_atoms + 1))) + mean_te = sum(te_tsm(:, :, :, :)) + ! Sum the data from other nodes that have more k-points stored + call comms_reduce(mean_te, 1, 'SUM') + call comms_bcast(total_qe, 1) + + if (total_qe .gt. 0.0_dp) then + mean_te = mean_te/total_qe + else + mean_te = 0.0_dp + end if + + deallocate (te_tsm, stat=ierr) + if (ierr /= 0) call io_error('Error: weighted_mean_te - failed to deallocate te_tsm') + + elseif (index(photo_model, '1step') > 0) then + do atom = 1, max_atoms + 1 + ! Calculate the qe contribution of each atom/layer + layer_qe(atom) = sum(qe_osm(:, :, :, atom)) + end do + call FLUSH (stdout) + + ! Sum the data from other nodes that have more k-points stored + call comms_reduce(layer_qe(1), max_atoms + 1, 'SUM') + ! Calculate the total QE + total_qe = sum(layer_qe) + call comms_bcast(total_qe, 1) + + ! Calculate the sum of transverse E from all the bands and k-points on node + mean_te = sum(te_osm) + ! Sum the data from other nodes that have more k-points stored + call comms_reduce(mean_te, 1, 'SUM') + + if (total_qe .gt. 0.0_dp) then + mean_te = mean_te/total_qe + else + mean_te = 0.0_dp + end if + + deallocate (te_osm, stat=ierr) + if (ierr /= 0) call io_error('Error: weighted_mean_te - failed to deallocate te_osm') + + else if (index(photo_model, 'ds_like_pe') > 0) then + + qe_term1 = sum(qe_tsm(:, :, :, :, 2)) + call comms_reduce(qe_term1, 1, 'SUM') + qe_term2 = sum(qe_tsm(:, :, :, :, 1)) + call comms_reduce(qe_term2, 1, 'SUM') + mte_term1 = sum(qe_tsm(:, :, :, :, 3)) + call comms_reduce(mte_term1, 1, 'SUM') + mte_term2 = sum(qe_tsm(:, :, :, :, 2)) + call comms_reduce(mte_term2, 1, 'SUM') + total_qe = qe_term1/qe_term2 + mean_te = 0.5*(mte_term1/mte_term2) + + end if + + time1 = io_time() + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a23,36x,f11.3,a8)') '+ Time to calculate MTE', time1 - time0, ' (sec) +' + end if + + end subroutine weighted_mean_te + + subroutine write_qe_data + !*=============================================================================== + ! This subroutine writes the calculated Photoemission data to the output file. + ! The contents of this routine used to be part of the subroutine weighted_mean_te, but were moved + ! here to make the subroutine names more representative of their function. + !=============================================================================== + use od_cell, only: cell_calc_kpoint_r_cart, atoms_label_tmp + use od_comms, only: on_root + use od_parameters, only: photo_work_function, photo_elec_field, photo_model, iprint + use od_dos_utils, only: doslin, doslin_sub_cell_corners + use od_algorithms, only: gaussian + use od_io, only: stdout, io_error, io_file_unit, stdout + use od_jdos_utils, only: jdos_utils_calculate + integer :: atom + + if (on_root) then + write (stdout, '(1x,a78)') '+------------------------------ Photoemission -------------------------------+' + write (stdout, '(1x,a78)') '+----------------------------------------------------------------------------+' + write (stdout, 223) '| Work Function ', photo_work_function, & + 'eV Photon Energy', temp_photon_energy, 'eV |' + write (stdout, 224) '| Effective Work Function', work_function_eff, & + 'eV Electric Field', photo_elec_field, 'V/A |' + + if (index(photo_model, '3step') > 0) then + write (stdout, '(1x,a78)') '| Final State : Bloch State |' + elseif (index(photo_model, '1step') > 0) then + write (stdout, '(1x,a78)') '| Final State : Free Electron State |' + end if + write (stdout, '(1x,a78)') '+----------------------------------------------------------------------------+' + write (stdout, '(1x,a78)') '| Atom | Atom Order | Layer | Quantum Efficiency |' + if (index(photo_model, 'ds_like_pe') > 0) then + write (stdout, '(1x,a78)') '| ********** Calculated a simplified DS like PE model ********** |' + write (stdout, 227) '| Total Quantum Efficiency (electrons/photon):', total_qe, ' |' + + write (stdout, 228) '| Weighted Mean Transverse Energy (eV):', mean_te, ' |' + else + ! Larger number of digits for debug purposes + if (iprint .gt. 2) then + do atom = 1, max_atoms + write (stdout, 231) "|", trim(atoms_label_tmp(atom_order(atom))), atom_order(atom), & + box_atom(atom), layer_qe(atom), " |" + end do + write (stdout, 232) "| Bulk", layer_qe(max_atoms + 1), & + &" |" + + write (stdout, 233) '| Total Quantum Efficiency (electrons/photon):', total_qe, ' |' + + write (stdout, 234) '| Weighted Mean Transverse Energy (eV):', mean_te, ' |' + else + do atom = 1, max_atoms + write (stdout, 225) "|", trim(atoms_label_tmp(atom_order(atom))), atom_order(atom), & + box_atom(atom), layer_qe(atom), " |" + end do + write (stdout, 226) "| Bulk", layer_qe(max_atoms + 1), & + &" |" + + write (stdout, 227) '| Total Quantum Efficiency (electrons/photon):', total_qe, ' |' + + write (stdout, 228) '| Weighted Mean Transverse Energy (eV):', mean_te, ' |' + end if + end if + + if (photo_elec_field .gt. 0.0_dp) then + ! Larger number of digits for debug purposes + if (iprint .gt. 2) then + write (stdout, 234) '| Total field emission (electrons/A^2):', total_field_emission, ' |' + else + write (stdout, 228) '| Total field emission (electrons/A^2):', total_field_emission, ' |' + end if + end if + + write (stdout, '(1x,a78)') '+----------------------------------------------------------------------------+' + end if +223 format(1x, a20, f15.4, 1x, a24, f11.4, a7) +224 format(1x, a25, f10.4, 1x, a25, f10.4, a7) +225 format(1x, a1, a4, 8x, I3, 10x, I3, 16x, E17.4E3, 9x, a7) +226 format(1x, a6, 38x, E18.4E3, 9x, a7) +227 format(1x, a46, E20.4E3, 5x, a7) +228 format(1x, a39, 7x, E20.4E3, 5x, a7) + +231 format(1x, a1, a4, 8x, I3, 10x, I3, 16x, E24.16E3, 2x, a7) +232 format(1x, a6, 38x, E25.16E3, 2x, a7) +233 format(1x, a46, E25.16E3, a7) +234 format(1x, a39, 7x, E25.16E3, a7) + end subroutine write_qe_data + + subroutine binding_energy_curve + !=============================================================================== + !* This subroutine calculates a binding energy vs contributed QE curve and writes + ! it to a file. Can be thought of as an energy distribution curve (EDC) in an + ! ARPES experiment + ! orig. Victor Chang, 7 February 2020 + ! edited Felix Mildner, after August 2024 + !=============================================================================== + use od_cell, only: num_kpoints_on_node, kpoint_weight + use od_electronic, only: nbands, nspins, band_energy, efermi, electrons_per_state, transmit_prob + use od_parameters, only: photo_work_function, photo_model, photo_theta_min, photo_theta_max, photo_temperature, & + & photo_phi_min, photo_phi_max, photo_bindenergy_broadening, photo_gk_max_vectors, scissor_op, iprint, optics_geom, optics_qdir + use od_algorithms, only: gaussian + use od_comms, only: my_node_id, comms_reduce, comms_bcast, on_root + use od_io, only: io_error, io_file_unit, stdout, io_time, io_date, seedname + use od_constants, only: inv_sqrt_two_pi, kB, rad_to_deg, twopi + implicit none + + real(kind=dp), allocatable, dimension(:, :, :, :) :: delta_temp + real(kind=dp), allocatable, dimension(:, :, :, :) :: binding_temp + real(kind=dp), allocatable, dimension(:, :, :) :: fermi_dirac + real(kind=dp), allocatable, dimension(:, :, :, :) :: transverse_gauss + real(kind=dp), allocatable, dimension(:, :, :) :: vacuum_gauss + real(kind=dp), allocatable, dimension(:, :, :, :) :: arpes_mask + real(kind=dp), allocatable, dimension(:, :) :: qe_atom + real(kind=dp) :: time0, time1 + real(kind=dp) :: temp_contribution, gk_factor, norm_vac, qe_factor, width, argument + real(kind=dp) :: final_fd, ekin_temp, be_temp, qe_contrib + real(kind=dp) :: total_weighted, qe_norm + integer :: N_k, N_spin, n_eigen_init, n_eigen, n_eigen_final, atom, e_scale, gdx, ierr + integer :: middle_idx, width_idx, window_width, e_min, e_max + integer :: binding_unit + character(len=100) :: out_string + character(len=99) :: filename + character(len=10) :: char_e + character(len=9) :: ctime ! Temp. time string + character(len=11) :: cdate ! Temp. date string + + time0 = io_time() + if (on_root) write (stdout, '(1x,a78)') '+---------------- Starting Binding Energy Curve Calculation -----------------+' + ! We are redoing parts of the QE calculation, so we need these factors + qe_factor = 1.0_dp/(cell_area) + width = kB*photo_temperature + norm_vac = inv_sqrt_two_pi/width + ! How many SD out from the center should the Gaussian broadening be summed up? + window_width = 12 + max_energy = int((temp_photon_energy - photo_work_function)*1000) + 500 + if (max_energy .lt. 500) return + + if (.not. allocated(fermi_dirac)) then + allocate (fermi_dirac(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - allocation of fermi_dirac failed') + end if + fermi_dirac = 0.0_dp + + if (.not. allocated(transverse_gauss)) then + allocate (transverse_gauss(photo_gk_max_vectors, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - allocation of transverse_gauss failed') + end if + transverse_gauss = 0.0_dp + + if (.not. allocated(arpes_mask)) then + allocate (arpes_mask(photo_gk_max_vectors, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: binding_energy_curve - allocation of arpes_mask failed') + end if + arpes_mask = 0.0_dp + + if (.not. allocated(vacuum_gauss)) then + allocate (vacuum_gauss(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: calc_three_step_model - allocation of vacuum_gauss failed') + end if + vacuum_gauss = 0.0_dp + + if (.not. allocated(bind_energy)) then + allocate (bind_energy(max_energy), stat=ierr) + if (ierr /= 0) call io_error('Error: binding_energy_curve - allocation of bind_energy failed') + end if + bind_energy = 0.0_dp + + if (.not. allocated(weighted_be_atom)) then + allocate (weighted_be_atom(max_energy, max_atoms + 1), stat=ierr) + if (ierr /= 0) call io_error('Error: binding_energy_curve - allocation of weighted_be_atom failed') + end if + weighted_be_atom = 0.0_dp + + if (.not. allocated(binding_temp)) then + allocate (binding_temp(max_energy, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: binding_energy_curve - allocation of binding_temp failed') + end if + binding_temp = 0.0_dp + + total_be_contribs = 0.0_dp + + if (index(photo_model, '3step') > 0) then + do e_scale = 1, max_energy + bind_energy(e_scale) = (e_scale - 1)*0.001_dp - 0.5_dp + end do + + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen_init = 1, nbands + be_temp = efermi - band_energy(n_eigen_init, N_spin, N_k) + middle_idx = ceiling(be_temp*1000) + 500 + width_idx = ceiling((photo_bindenergy_broadening*window_width)*1000) + do e_scale = max(middle_idx - width_idx, 1), min(middle_idx + width_idx, max_energy) + ! do e_scale = 1, max_energy + binding_temp(e_scale, n_eigen_init, N_spin, N_k) = & + gaussian(be_temp, photo_bindenergy_broadening, bind_energy(e_scale)) + end do + end do + end do + end do + + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + do n_eigen_init = 1, nbands + argument = (band_energy(n_eigen_init, N_spin, N_k) - efermi)/(kB*photo_temperature) + ! This is a bit of an arbitrary condition, but exp(+-230) ~ 1E(+-100) + ! so this cutoff condition saves us from running into arithmetic + ! issues when computing fermi_dirac due to possible under/over-flow. + if (argument .gt. 230.0_dp) then + fermi_dirac(n_eigen_init, N_spin, N_k) = 0.0_dp + elseif (argument .lt. -230.0_dp) then + fermi_dirac(n_eigen_init, N_spin, N_k) = 1.0_dp + else + fermi_dirac(n_eigen_init, N_spin, N_k) = 1.0_dp/(exp(argument) + 1.0_dp) + end if + + ! The vacuum gauss represents the necessary condition: is the final state above E_vacuum? + ! The transverse gauss represents the sufficient condition: after "emission", do we have enough energy for E_ortho > 0? + ! Is the final state energy above the vauum level? + if (band_energy(n_eigen_init, N_spin, N_k) .lt. evacuum_eff) then + vacuum_gauss(n_eigen_init, N_spin, N_k) = gaussian(band_energy(n_eigen_init, N_spin, N_k) + & + scissor_op, width, evacuum_eff)/norm_vac + else + vacuum_gauss(n_eigen_init, N_spin, N_k) = 1.0_dp + end if + ! Is there enough total energy for this kpt/band for E_ortho > 0 after passing through surface potential step + ! (workfunction), evacuum_eff = efermi + work_function_eff + do gdx = 1, photo_gk_max_vectors + ! Is (photon_energy - transverse energy) > (work_function - E_field_lowering) + ! Is the final kinetic energy ortho > 0? + ekin_temp = temp_photon_energy - E_transverse(gdx, n_eigen_init, N_spin, N_k) + if (ekin_temp .le. work_function_eff) then + transverse_gauss(gdx, n_eigen_init, N_spin, N_k) = gaussian(ekin_temp, width, work_function_eff)/norm_vac + else + transverse_gauss(gdx, n_eigen_init, N_spin, N_k) = 1.0_dp + end if + if (theta_arpes(gdx, n_eigen_init, N_spin, N_k) .ge. photo_theta_min .and. & + theta_arpes(gdx, n_eigen_init, N_spin, N_k) .le. photo_theta_max) then + if (phi_arpes(gdx, n_eigen_init, N_spin, N_k) .ge. photo_phi_min .and. & + phi_arpes(gdx, n_eigen_init, N_spin, N_k) .le. photo_phi_max) then + arpes_mask(gdx, n_eigen_init, N_spin, N_k) = 1.0_dp + end if + end if + end do + + end do + end do + end do + + call photo_calculate_delta(delta_temp, .false.) + + do atom = 1, max_atoms + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen_final = 2, nbands + ! if (num_exclude_bands .gt. 1) then + ! if (any(exclude_bands == n_eigen_final)) then + ! cycle + ! end if + ! end if + final_fd = 1 - fermi_dirac(n_eigen_final, N_spin, N_k) + do n_eigen_init = 1, n_eigen_final - 1 + middle_idx = ceiling((efermi - band_energy(n_eigen_init, N_spin, N_k))*1000) + 500 + width_idx = ceiling(photo_bindenergy_broadening*window_width*1000) + temp_contribution = & + qe_factor*photo_matrix_weights(n_eigen_init, n_eigen_final, N_spin, N_k) & + *delta_temp(n_eigen_init, n_eigen_final, N_spin, N_k)*transmit_prob(n_eigen_final, N_spin, N_k) & + *electrons_per_state*kpoint_weight(N_k)*(I_layer(box_atom(atom), current_photo_energy_index)) & + *vacuum_gauss(n_eigen_final, N_spin, N_k)*fermi_dirac(n_eigen_init, N_spin, N_k)*final_fd & + *(pdos_weights_atoms(n_eigen_init, N_spin, N_k, atom_order(atom)) & + /pdos_weights_k_band(n_eigen_init, N_spin, N_k)) & + *(1.0_dp + field_emission(n_eigen_final, N_spin, N_k)) + do gdx = 1, photo_gk_max_vectors + gk_factor = arpes_mask(gdx, n_eigen_final, N_spin, N_k) & + *gkgrid_weight(gdx, n_eigen_init, N_spin, N_k) & + *electron_esc(gdx, n_eigen_final, N_spin, N_k, atom) & + *transverse_gauss(gdx, n_eigen_init, N_spin, N_k) + qe_contrib = temp_contribution*gk_factor + total_be_contribs = total_be_contribs + qe_contrib + do e_scale = max(middle_idx - width_idx, 1), min(middle_idx + width_idx, max_energy) + weighted_be_atom(e_scale, atom) = & + weighted_be_atom(e_scale, atom) + (binding_temp(e_scale, n_eigen_init, N_spin, N_k)*qe_contrib) + end do + end do + end do + end do + end do + end do + end do + + call photo_calculate_delta(delta_temp, .true.) + + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen_final = 2, nbands + ! if (num_exclude_bands .gt. 1) then + ! if (any(exclude_bands == n_eigen_final)) then + ! cycle + ! end if + ! end if + final_fd = 1 - fermi_dirac(n_eigen_final, N_spin, N_k) + do n_eigen_init = 1, n_eigen_final - 1 + middle_idx = ceiling((efermi - band_energy(n_eigen_init, N_spin, N_k))*1000) + 500 + width_idx = ceiling(photo_bindenergy_broadening*window_width*1000) + temp_contribution = & + (qe_factor*photo_matrix_weights(n_eigen_init, n_eigen_final, N_spin, N_k) & + *delta_temp(n_eigen_init, n_eigen_final, N_spin, N_k) & + *transmit_prob(n_eigen_final, N_spin, N_k) & + *electrons_per_state*kpoint_weight(N_k) & + *vacuum_gauss(n_eigen_final, N_spin, N_k)*fermi_dirac(n_eigen_init, N_spin, N_k)*final_fd & + *(pdos_weights_atoms(n_eigen_init, N_spin, N_k, atom_order(max_atoms)) & + /pdos_weights_k_band(n_eigen_init, N_spin, N_k))) & + *(1.0_dp + field_emission(n_eigen_final, N_spin, N_k)) + do gdx = 1, photo_gk_max_vectors + gk_factor = arpes_mask(gdx, n_eigen_final, N_spin, N_k) & + *gkgrid_weight(gdx, n_eigen_init, N_spin, N_k) & + *electron_esc(gdx, n_eigen_final, N_spin, N_k, max_atoms + 1) & + *transverse_gauss(gdx, n_eigen_init, N_spin, N_k) + qe_contrib = temp_contribution*gk_factor + total_be_contribs = total_be_contribs + qe_contrib + do e_scale = max(middle_idx - width_idx, 1), min(middle_idx + width_idx, max_energy) + weighted_be_atom(e_scale, max_atoms + 1) = & + weighted_be_atom(e_scale, max_atoms + 1) + (binding_temp(e_scale, n_eigen_init, N_spin, N_k)*qe_contrib) + end do + end do + end do + end do + end do + end do + + elseif (index(photo_model, '1step') > 0) then + do e_scale = 1, max_energy + bind_energy(e_scale) = (e_scale - 1)*0.001_dp - 0.5_dp + end do + + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen = 1, nbands + be_temp = efermi - band_energy(n_eigen, N_spin, N_k) + middle_idx = ceiling(be_temp*1000) + 500 + width_idx = ceiling(photo_bindenergy_broadening*window_width*1000) + do e_scale = max(middle_idx - width_idx, 1), min(middle_idx + width_idx, max_energy) + binding_temp(e_scale, n_eigen, N_spin, N_k) = & + gaussian(be_temp, photo_bindenergy_broadening, bind_energy(e_scale)) + end do + end do + end do + end do + + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + do n_eigen = 1, nbands + argument = (band_energy(n_eigen, N_spin, N_k) - efermi)/(kB*photo_temperature) + ! This is a bit of an arbitrary condition, but exp(+-230) ~ 1E(+-100) + ! so this cutoff condition saves us from running into arithmetic + ! issues when computing fermi_dirac due to possible under/over-flow. + if (argument .gt. 230.0_dp) then + fermi_dirac(n_eigen, N_spin, N_k) = 0.0_dp + elseif (argument .lt. -230.0_dp) then + fermi_dirac(n_eigen, N_spin, N_k) = 1.0_dp + else + fermi_dirac(n_eigen, N_spin, N_k) = 1.0_dp/(exp(argument) + 1.0_dp) + end if + + if ((band_energy(n_eigen, N_spin, N_k) + temp_photon_energy) .lt. evacuum_eff) then + vacuum_gauss(n_eigen, N_spin, N_k) = gaussian((band_energy(n_eigen, N_spin, N_k) + temp_photon_energy) + & + scissor_op, width, evacuum_eff)/norm_vac + else + vacuum_gauss(n_eigen, N_spin, N_k) = 1.0_dp + end if + + do gdx = 1, photo_gk_max_vectors + ! evacuum_eff = efermi + photo_work_function + ! Is (photon_energy - transverse energy) > (work_function - E_field_lowering) + ! Is the final kinetic energy > 0? + ekin_temp = temp_photon_energy - E_transverse(gdx, n_eigen, N_spin, N_k) + if (ekin_temp .le. work_function_eff) then + transverse_gauss(gdx, n_eigen, N_spin, N_k) = gaussian(ekin_temp, width, work_function_eff)/norm_vac + else + transverse_gauss(gdx, n_eigen, N_spin, N_k) = 1.0_dp + end if + + if (theta_arpes(gdx, n_eigen, N_spin, N_k) .ge. photo_theta_min .and. & + theta_arpes(gdx, n_eigen, N_spin, N_k) .le. photo_theta_max) then + if (phi_arpes(gdx, n_eigen, N_spin, N_k) .ge. photo_phi_min .and. & + phi_arpes(gdx, n_eigen, N_spin, N_k) .le. photo_phi_max) then + arpes_mask(gdx, n_eigen, N_spin, N_k) = 1.0_dp + end if + end if + end do + + end do + end do + end do + + do atom = 1, max_atoms + 1 + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen = 1, nbands + middle_idx = ceiling((efermi - band_energy(n_eigen, N_spin, N_k))*1000) + 500 + width_idx = ceiling(photo_bindenergy_broadening*window_width*1000) + temp_contribution = (qe_factor*foptical_matrix_weights(n_eigen, N_spin, N_k) & + *electrons_per_state*kpoint_weight(N_k) & + *I_layer(box_atom(atom), current_photo_energy_index) & + *vacuum_gauss(n_eigen, N_spin, N_k) & + *fermi_dirac(n_eigen, N_spin, N_k) & + *(pdos_weights_atoms(n_eigen, N_spin, N_k, atom_order(atom)) & + /pdos_weights_k_band(n_eigen, N_spin, N_k))) & + *(1.0_dp + field_emission(n_eigen, N_spin, N_k)) + do gdx = 1, photo_gk_max_vectors + gk_factor = arpes_mask(gdx, n_eigen, N_spin, N_k) & + *gkgrid_weight(gdx, n_eigen, N_spin, N_k) & + *electron_esc(gdx, n_eigen, N_spin, N_k, atom) & + *transverse_gauss(gdx, n_eigen, N_spin, N_k) + qe_contrib = temp_contribution*gk_factor + total_be_contribs = total_be_contribs + qe_contrib + e_min = max(middle_idx - width_idx, 1) + e_max = min(middle_idx + width_idx, max_energy) + do e_scale = e_min, e_max + weighted_be_atom(e_scale, atom) = & + weighted_be_atom(e_scale, atom) & + + (binding_temp(e_scale, n_eigen, N_spin, N_k)*qe_contrib) + end do + end do + end do + end do + end do + end do + end if + + allocate (qe_atom(max_atoms + 1, max_energy), stat=ierr) + if (ierr /= 0) call io_error('Error: write_qe_tensor - allocation of qe_atom failed') + qe_atom = 0.0_dp + do e_scale = 1, max_energy !loop over binding energy + do atom = 1, max_atoms + 1 + qe_atom(atom, e_scale) = weighted_be_atom(e_scale, atom) + end do + end do + + call comms_reduce(qe_atom(1, 1), max_energy*(max_atoms + 1), "SUM") + + total_weighted = sum(qe_atom(:, :)) + call comms_reduce(total_weighted, 1, "SUM") + call comms_reduce(total_be_contribs, 1, "SUM") + + if (on_root) then + ! Rescale the broadened contributions array + ! to the sum of all individual contributions + if (total_weighted .gt. 0.0_dp) then + qe_norm = total_be_contribs/total_weighted + else + qe_norm = 1.0_dp + end if + + qe_atom = qe_atom*qe_norm + + binding_unit = io_file_unit() + write (char_e, '(F7.3)') temp_photon_energy + filename = trim(seedname)//'_'//trim(photo_model)//'_'//trim(adjustl(char_e))// & + '_bindenergy_curve.dat' + write (stdout, '(1x,a)') '| Writing out to *SEEDNAME*_'//trim(photo_model)//'_' & + //trim(adjustl(char_e))//'_bindenergy_curve.dat' + open (unit=binding_unit, action='write', file=filename) + call io_date(cdate, ctime) + write (binding_unit, '(1x,a60,a11,a4,a9)') '## OptaDOS Photoemission: Printing Broadened Binding Energy on ',& + & cdate, ' at ', ctime + write (binding_unit, '(1x,a13,a)') '## Seedname: ', trim(adjustl(seedname)) + write (binding_unit, '(1x,a24,a12)') '## Photoemission Model: ', trim(adjustl(photo_model)) + write (binding_unit, '(1x,a23,f7.3)') '## Photon Energy [eV]: ', temp_photon_energy + write (binding_unit, '(1x,a21,a15)') '## Optics Geometry : ', trim(adjustl(optics_geom)) + write (binding_unit, '(1x,a39,3(1x,f10.5))') '## Optics q-dir vector [unnormalised] :', optics_qdir(1:3) + write (binding_unit, '(1x,a35,f9.5)') '## Binding Energy Broadening [eV]: ', photo_bindenergy_broadening + write (binding_unit, '(1x,a64,2(1x,f7.2))') '## Emission angle theta min, max (w.r.t. surface normal) [deg]: ', & + photo_theta_min, photo_theta_max + write (binding_unit, '(1x,a54,2(1x,f7.2))') '## Emission angle phi min, max (w.r.t. x-axis) [deg]: ', & + photo_phi_min, photo_phi_max + write (binding_unit, '(1x,a34,f9.5)') '## Fermi Energy Ekin offset [eV]: ', (temp_photon_energy - photo_work_function) + write (binding_unit, '(1x,a66,1x,a50)') '## Binding Energy (EB) [eV] | Total QE from sum(atoms + bulk) @ EB',& + &'| Contributions from: atom1 | atom2 | ... | bulk |' + write (out_string, '(a,I0,"(1x,",a,")")') "1x,ES25.6E2,", max_atoms + 2, "ES25.12E3" + + do e_scale = 1, max_energy + write (binding_unit, '('//trim(out_string)//')') bind_energy(e_scale), & + sum(qe_atom(1:max_atoms + 1, e_scale)), qe_atom(1:max_atoms + 1, e_scale) + end do + + close (unit=binding_unit) + end if + + if (allocated(qe_atom)) then + deallocate (qe_atom, stat=ierr) + if (ierr /= 0) call io_error('Error: binding_energy_curve - failed to deallocate qe_atom') + end if + + if (allocated(arpes_mask)) then + deallocate (arpes_mask, stat=ierr) + if (ierr /= 0) call io_error('Error: binding_energy_curve - failed to deallocate arpes_mask') + end if + + if (allocated(binding_temp)) then + deallocate (binding_temp, stat=ierr) + if (ierr /= 0) call io_error('Error: binding_energy_curve - failed to deallocate binding_temp') + end if + + if (allocated(bind_energy)) then + deallocate (bind_energy, stat=ierr) + if (ierr /= 0) call io_error('Error: write_qe_tensor - failed to deallocate bind_energy') + end if + + time1 = io_time() + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a40,19x,f11.3,a8)') '+ Time to calculate binding energy curve', time1 - time0, ' (sec) +' + write (stdout, '(1x,a78)') '+----------------------------------------------------------------------------+' + end if + end subroutine binding_energy_curve + + subroutine binding_energy_momentum_map + !*=============================================================================== + ! This subroutine calculates a binding energy vs reciprocal transverse momentum + ! map of the gaussian broadened band contributions and writes it to a file. + ! Can be thought of the bandstructure projection along the transverse diagonal + ! showing the contributions of emitting bands. + ! written by Felix Mildner, after May 2025 + !=============================================================================== + use od_cell, only: num_kpoints_on_node, cell_calc_kpoint_r_cart, kpoint_r_cart, kpoint_weight, & + kpoint_grid_dim, recip_lattice + use od_electronic, only: nbands, nspins, band_energy, efermi, electrons_per_state, transmit_prob, & + photo_gkgrid, elec_read_gk_grid_points + use od_parameters, only: photo_work_function, photo_model, photo_theta_min, photo_theta_max, photo_temperature, & + & photo_phi_min, photo_phi_max, photo_bindenergy_broadening, photo_gk_max_vectors, scissor_op, iprint, & + & photo_momentum, photo_pmat_bin_width, optics_geom, optics_qdir + use od_algorithms, only: gaussian + use od_comms, only: my_node_id, comms_reduce, comms_bcast, on_root + use od_io, only: io_error, io_file_unit, stdout, io_time, io_date, seedname + use od_constants, only: inv_sqrt_two_pi, kB, rad_to_deg, twopi, e_mass, hbar, ev_to_j + implicit none + + integer :: i, N_k, N_spin, n_eigen_init, n_eigen, n_eigen_final, atom, kdx, edx, gdx, ierr + integer :: window_width, matrix_unit + integer :: k_window, e_window, center_bin_e, center_bin_k, kdx_min, kdx_max, edx_min, edx_max + real(kind=dp) :: temp_contribution, gk_factor, norm_vac, qe_factor, width, argument, gk + real(kind=dp) :: step(1:2), sub_cell_length(1:2), k_broadening, temp_k, min_e, gauss_e, e_temp + real(kind=dp) :: final_fd, ekin_temp, qe_contrib + real(kind=dp) :: total_weighted, qe_norm + real(kind=dp) :: time0, time1 + + real(kind=dp), allocatable, dimension(:, :, :) :: fermi_dirac + real(kind=dp), allocatable, dimension(:, :, :, :) :: transverse_gauss + real(kind=dp), allocatable, dimension(:, :, :) :: vacuum_gauss + real(kind=dp), allocatable, dimension(:, :, :, :) :: arpes_mask + real(kind=dp), allocatable, dimension(:, :, :, :) :: delta_temp + real(kind=dp), allocatable, dimension(:, :, :, :) :: binding_temp + real(kind=dp), allocatable, dimension(:) :: gauss_k + + character(len=100) :: out_string + character(len=99) :: filename + character(len=10) :: char_e + character(len=9) :: ctime ! Temp. time string + character(len=11) :: cdate ! Temp. date string + + time0 = io_time() + if (on_root) write (stdout, '(1x,a78)') '+--------- Starting Binding Energy vs Transverse P Map Calculation ----------+' + ! We are redoing parts of the QE calculation, so we need these factors + qe_factor = 1.0_dp/(cell_area) + width = kB*photo_temperature + norm_vac = inv_sqrt_two_pi/width + ! How many standard deviations out from the center should the Gaussian broadening be summed up? + window_width = 12 + max_energy = int((temp_photon_energy - photo_work_function)*1000) + 500 + if (max_energy .lt. 500) return + + if (.not. allocated(fermi_dirac)) then + allocate (fermi_dirac(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: binding_energy_momentum_map - allocation of fermi_dirac failed') + end if + fermi_dirac = 0.0_dp + + if (.not. allocated(transverse_gauss)) then + allocate (transverse_gauss(photo_gk_max_vectors, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: binding_energy_momentum_map - allocation of transverse_gauss failed') + end if + transverse_gauss = 0.0_dp + + if (.not. allocated(arpes_mask)) then + allocate (arpes_mask(photo_gk_max_vectors, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: binding_energy_momentum_map - allocation of arpes_mask failed') + end if + arpes_mask = 0.00_dp + + if (.not. allocated(vacuum_gauss)) then + allocate (vacuum_gauss(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: binding_energy_momentum_map - allocation of vacuum_gauss failed') + end if + vacuum_gauss = 0.0_dp + + total_be_contribs = 0.0_dp + + call cell_calc_kpoint_r_cart + step(:) = 0.5_dp/real(kpoint_grid_dim(1:2), dp) + do i = 1, 2 + sub_cell_length(i) = sqrt(recip_lattice(i, 1)**2 + recip_lattice(i, 2)**2 + recip_lattice(i, 3)**2)*step(i) + end do + ! diagonal distance between MP points in reciprocal space divided by 2*2*sqrt(2*ln(2)) + ! so that FWHM = the step distance between the kpoints + k_broadening = sqrt(sub_cell_length(1)**2 + sub_cell_length(2)**2)/(4.70964009_dp) + + ! calculate the number of bins to go left and right of center + ! set to 10 standard deviations (width) of a gaussian function + k_window = 15*ceiling(k_broadening/photo_pmat_bin_width) + e_window = 15*ceiling(photo_bindenergy_broadening/photo_pmat_bin_width) + ! get the maximum k + max_k_transverse = 0.0_dp + do N_k = 1, num_kpoints_on_node(my_node_id) + temp_k = sqrt(kpoint_r_cart(1, N_k)**2 + kpoint_r_cart(2, N_k)**2) + max_k_transverse = max(max_k_transverse, temp_k) + end do + call comms_reduce(max_k_transverse, 1, "MAX") + call comms_bcast(max_k_transverse, 1) + max_bin_k = ceiling(max_k_transverse/photo_pmat_bin_width) + + ! calculating upper bound of energy range with some extra for plotting + max_e_kinetic = temp_photon_energy - work_function_eff + plot_extra_upper + ! calculating lower bound of energy range + ! Restrict lower E_kinetic bound to either -0.25 eV or minimal E_kinetic + ! This makes sure the program does not print huge matrices at higher photon energies + min_e = max(minval(E_kinetic) - 0.25_dp, -0.25_dp) + call comms_reduce(min_e, 1, 'MIN') + call comms_bcast(min_e, 1) + max_bin_e = ceiling((max_e_kinetic - min_e)/photo_pmat_bin_width) + + if (max_bin_e .lt. 0 .or. max_bin_k .lt. 0) return + + ! set up the matrix of energy vs transverse k + if (.not. allocated(ekin_k_matrix)) then + allocate (ekin_k_matrix(max_bin_k, max_bin_e), stat=ierr) + if (ierr /= 0) call io_error('Error: binding_energy_momentum_map - allocation of ekin_k_matrix failed') + end if + ekin_k_matrix = 0.0_dp + + if (.not. allocated(gauss_k)) then + allocate (gauss_k(max_bin_k), stat=ierr) + if (ierr /= 0) call io_error('Error: binding_energy_momentum_map - allocation of gauss_k failed') + end if + gauss_k = 0.0_dp + + if (index(photo_model, '3step') > 0) then + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + do n_eigen_init = 1, nbands + argument = (band_energy(n_eigen_init, N_spin, N_k) - efermi)/(kB*photo_temperature) + ! This is a bit of an arbitrary condition, but exp(+-230) ~ 1E(+-100) + ! so this cutoff condition saves us from running into arithmetic + ! issues when computing fermi_dirac due to possible under/over-flow. + if (argument .gt. 230.0_dp) then + fermi_dirac(n_eigen_init, N_spin, N_k) = 0.0_dp + elseif (argument .lt. -230.0_dp) then + fermi_dirac(n_eigen_init, N_spin, N_k) = 1.0_dp + else + fermi_dirac(n_eigen_init, N_spin, N_k) = 1.0_dp/(exp(argument) + 1.0_dp) + end if + + ! The vacuum gauss represents the necessary condition: is the final state above E_vacuum? + ! The transverse gauss represents the sufficient condition: after "emission", do we have enough energy for E_ortho > 0? + ! Is the final state energy above the vauum level? + if (band_energy(n_eigen_init, N_spin, N_k) .lt. evacuum_eff) then + vacuum_gauss(n_eigen_init, N_spin, N_k) = gaussian(band_energy(n_eigen_init, N_spin, N_k) + & + scissor_op, width, evacuum_eff)/norm_vac + else + vacuum_gauss(n_eigen_init, N_spin, N_k) = 1.0_dp + end if + ! Is there enough total energy for this kpt/band for E_ortho > 0 after passing through surface potential step + ! (workfunction), evacuum_eff = efermi + work_function_eff + ! Is (photon_energy - transverse energy) > (work_function - E_field_lowering) + ! Is the final kinetic energy ortho > 0? + ekin_temp = temp_photon_energy - E_transverse(1, n_eigen_init, N_spin, N_k) + if (ekin_temp .le. work_function_eff) then + transverse_gauss(1, n_eigen_init, N_spin, N_k) = gaussian(ekin_temp, width, work_function_eff)/norm_vac + else + transverse_gauss(1, n_eigen_init, N_spin, N_k) = 1.0_dp + end if + if (theta_arpes(1, n_eigen_init, N_spin, N_k) .ge. photo_theta_min .and. & + theta_arpes(1, n_eigen_init, N_spin, N_k) .le. photo_theta_max) then + if (phi_arpes(1, n_eigen_init, N_spin, N_k) .ge. photo_phi_min .and. & + phi_arpes(1, n_eigen_init, N_spin, N_k) .le. photo_phi_max) then + arpes_mask(1, n_eigen_init, N_spin, N_k) = 1.0_dp + end if + end if + end do + end do + end do + + call photo_calculate_delta(delta_temp, .false.) + + do atom = 1, max_atoms + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + temp_k = sqrt(kpoint_r_cart(1, N_k)**2 + kpoint_r_cart(2, N_k)**2) + ! calculate the bin position in k and e + center_bin_k = ceiling(temp_k/photo_pmat_bin_width) + kdx_min = max(center_bin_k - k_window, 1) + kdx_max = min(center_bin_k + k_window, max_bin_k) + gk = (kdx_min - 1)*photo_pmat_bin_width + do kdx = kdx_min, kdx_max + gauss_k(kdx) = gaussian(temp_k, k_broadening, gk) + gk = gk + photo_pmat_bin_width + end do + do N_spin = 1, nspins ! Loop over spins + do n_eigen_final = 2, nbands + ! if (num_exclude_bands .gt. 1) then + ! if (any(exclude_bands == n_eigen_final)) then + ! cycle + ! end if + ! end if + final_fd = 1 - fermi_dirac(n_eigen_final, N_spin, N_k) + do n_eigen_init = 1, n_eigen_final - 1 + temp_contribution = & + qe_factor*photo_matrix_weights(n_eigen_init, n_eigen_final, N_spin, N_k) & + *delta_temp(n_eigen_init, n_eigen_final, N_spin, N_k)*transmit_prob(n_eigen_final, N_spin, N_k) & + *electrons_per_state*kpoint_weight(N_k)*I_layer(box_atom(atom), current_photo_energy_index) & + *vacuum_gauss(n_eigen_final, N_spin, N_k)*fermi_dirac(n_eigen_init, N_spin, N_k)*final_fd & + *(pdos_weights_atoms(n_eigen_init, N_spin, N_k, atom_order(atom)) & + /pdos_weights_k_band(n_eigen_init, N_spin, N_k)) & + *(1.0_dp + field_emission(n_eigen_final, N_spin, N_k)) + gk_factor = arpes_mask(1, n_eigen_final, N_spin, N_k) & + *gkgrid_weight(1, n_eigen_init, N_spin, N_k) & + *electron_esc(1, n_eigen_final, N_spin, N_k, atom) & + *transverse_gauss(1, n_eigen_init, N_spin, N_k) + qe_contrib = temp_contribution*gk_factor + total_be_kmat_contribs = total_be_kmat_contribs + qe_contrib + center_bin_e = ceiling((E_kinetic(1, n_eigen_init, N_spin, N_k) - min_e)/photo_pmat_bin_width) + edx_min = max(center_bin_e - e_window, 1) + edx_max = min(center_bin_e + e_window, max_bin_e) + e_temp = min_e + (edx_min - 1)*photo_pmat_bin_width + do edx = edx_min, edx_max + gauss_e = gaussian(E_kinetic(1, n_eigen_init, N_spin, N_k), photo_bindenergy_broadening, & + e_temp) + e_temp = e_temp + photo_pmat_bin_width + do kdx = kdx_min, kdx_max + ekin_k_matrix(kdx, edx) = ekin_k_matrix(kdx, edx) + gauss_e*gauss_k(kdx)*qe_contrib + end do + end do + end do + end do + end do + end do + end do + + call photo_calculate_delta(delta_temp, .true.) + + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + temp_k = sqrt(kpoint_r_cart(1, N_k)**2 + kpoint_r_cart(2, N_k)**2) + ! calculate the bin position in k and e + center_bin_k = ceiling(temp_k/photo_pmat_bin_width) + kdx_min = max(center_bin_k - k_window, 1) + kdx_max = min(center_bin_k + k_window, max_bin_k) + gk = (kdx_min - 1)*photo_pmat_bin_width + do kdx = kdx_min, kdx_max + gauss_k(kdx) = gaussian(temp_k, k_broadening, gk) + gk = gk + photo_pmat_bin_width + end do + do N_spin = 1, nspins ! Loop over spins + do n_eigen_final = 2, nbands + ! if (num_exclude_bands .gt. 1) then + ! if (any(exclude_bands == n_eigen_final)) then + ! cycle + ! end if + ! end if + final_fd = 1 - fermi_dirac(n_eigen_final, N_spin, N_k) + do n_eigen_init = 1, n_eigen_final - 1 + temp_contribution = & + (qe_factor*photo_matrix_weights(n_eigen_init, n_eigen_final, N_spin, N_k) & + *delta_temp(n_eigen_init, n_eigen_final, N_spin, N_k) & + *transmit_prob(n_eigen_final, N_spin, N_k) & + *electrons_per_state*kpoint_weight(N_k) & + *vacuum_gauss(n_eigen_final, N_spin, N_k)*fermi_dirac(n_eigen_init, N_spin, N_k)*final_fd & + *(pdos_weights_atoms(n_eigen_init, N_spin, N_k, atom_order(max_atoms)) & + /pdos_weights_k_band(n_eigen_init, N_spin, N_k))) & + *(1.0_dp + field_emission(n_eigen_final, N_spin, N_k)) + + gk_factor = arpes_mask(1, n_eigen_final, N_spin, N_k) & + *gkgrid_weight(1, n_eigen_init, N_spin, N_k) & + *electron_esc(1, n_eigen_final, N_spin, N_k, max_atoms + 1) & + *transverse_gauss(1, n_eigen_init, N_spin, N_k) + qe_contrib = temp_contribution*gk_factor + total_be_kmat_contribs = total_be_kmat_contribs + qe_contrib + center_bin_e = ceiling((E_kinetic(1, n_eigen_init, N_spin, N_k) - min_e)/photo_pmat_bin_width) + edx_min = max(center_bin_e - e_window, 1) + edx_max = min(center_bin_e + e_window, max_bin_e) + e_temp = min_e + (edx_min - 1)*photo_pmat_bin_width + do edx = edx_min, edx_max + gauss_e = gaussian(E_kinetic(1, n_eigen_init, N_spin, N_k), photo_bindenergy_broadening, & + e_temp) + e_temp = e_temp + photo_pmat_bin_width + do kdx = kdx_min, kdx_max + ekin_k_matrix(kdx, edx) = ekin_k_matrix(kdx, edx) + gauss_e*gauss_k(kdx)*qe_contrib + end do + end do + end do + end do + end do + end do + end if + + if (index(photo_model, '1step') > 0) then + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + do n_eigen = 1, nbands + argument = (band_energy(n_eigen, N_spin, N_k) - efermi)/(kB*photo_temperature) + ! This is a bit of an arbitrary condition, but exp(+-230) ~ 1E(+-100) + ! so this cutoff condition saves us from running into arithmetic + ! issues when computing fermi_dirac due to possible under/over-flow. + if (argument .gt. 230.0_dp) then + fermi_dirac(n_eigen, N_spin, N_k) = 0.0_dp + elseif (argument .lt. -230.0_dp) then + fermi_dirac(n_eigen, N_spin, N_k) = 1.0_dp + else + fermi_dirac(n_eigen, N_spin, N_k) = 1.0_dp/(exp(argument) + 1.0_dp) + end if + + if ((band_energy(n_eigen, N_spin, N_k) + temp_photon_energy) .lt. evacuum_eff) then + vacuum_gauss(n_eigen, N_spin, N_k) = gaussian((band_energy(n_eigen, N_spin, N_k) + temp_photon_energy) + & + scissor_op, width, evacuum_eff)/norm_vac + else + vacuum_gauss(n_eigen, N_spin, N_k) = 1.0_dp + end if + + ! evacuum_eff = efermi + photo_work_function + ! Is (photon_energy - transverse energy) > (work_function - E_field_lowering) + ! Is the final kinetic energy > 0? + ekin_temp = temp_photon_energy - E_transverse(1, n_eigen, N_spin, N_k) + if (ekin_temp .le. work_function_eff) then + transverse_gauss(1, n_eigen, N_spin, N_k) = gaussian(ekin_temp, width, work_function_eff)/norm_vac + else + transverse_gauss(1, n_eigen, N_spin, N_k) = 1.0_dp + end if + + if (theta_arpes(1, n_eigen, N_spin, N_k) .ge. photo_theta_min .and. & + theta_arpes(1, n_eigen, N_spin, N_k) .le. photo_theta_max) then + if (phi_arpes(1, n_eigen, N_spin, N_k) .ge. photo_phi_min .and. & + phi_arpes(1, n_eigen, N_spin, N_k) .le. photo_phi_max) then + arpes_mask(1, n_eigen, N_spin, N_k) = 1.0_dp + end if + end if + end do + end do + end do + + ! for all the bands, spins, kpts, atoms + do atom = 1, max_atoms + 1 + do N_k = 1, num_kpoints_on_node(my_node_id) + temp_k = sqrt(kpoint_r_cart(1, N_k)**2 + kpoint_r_cart(2, N_k)**2) + ! calculate the bin position in k and e + center_bin_k = ceiling(temp_k/photo_pmat_bin_width) + kdx_min = max(center_bin_k - k_window, 1) + kdx_max = min(center_bin_k + k_window, max_bin_k) + gk = (kdx_min - 1)*photo_pmat_bin_width + do kdx = kdx_min, kdx_max + gauss_k(kdx) = gaussian(temp_k, k_broadening, gk) + gk = gk + photo_pmat_bin_width + end do + do N_spin = 1, nspins + do n_eigen = 1, nbands + temp_contribution = (qe_factor*foptical_matrix_weights(n_eigen, N_spin, N_k) & + *electrons_per_state*kpoint_weight(N_k) & + *I_layer(box_atom(atom), current_photo_energy_index) & + *vacuum_gauss(n_eigen, N_spin, N_k) & + *fermi_dirac(n_eigen, N_spin, N_k) & + *(pdos_weights_atoms(n_eigen, N_spin, N_k, atom_order(atom)) & + /pdos_weights_k_band(n_eigen, N_spin, N_k))) & + *(1.0_dp + field_emission(n_eigen, N_spin, N_k)) + gk_factor = arpes_mask(1, n_eigen, N_spin, N_k) & + *gkgrid_weight(1, n_eigen, N_spin, N_k) & + *electron_esc(1, n_eigen, N_spin, N_k, atom) & + *transverse_gauss(1, n_eigen, N_spin, N_k) + qe_contrib = temp_contribution*gk_factor + total_be_kmat_contribs = total_be_kmat_contribs + qe_contrib + center_bin_e = ceiling((E_kinetic(1, n_eigen, N_spin, N_k) - min_e)/photo_pmat_bin_width) + edx_min = max(center_bin_e - e_window, 1) + edx_max = min(center_bin_e + e_window, max_bin_e) + e_temp = min_e + (edx_min - 1)*photo_pmat_bin_width + do edx = edx_min, edx_max + gauss_e = gaussian(E_kinetic(1, n_eigen, N_spin, N_k), photo_bindenergy_broadening, & + e_temp) + e_temp = e_temp + photo_pmat_bin_width + do kdx = kdx_min, kdx_max + ekin_k_matrix(kdx, edx) = ekin_k_matrix(kdx, edx) + gauss_e*gauss_k(kdx)*qe_contrib + end do + end do + end do + end do + end do + end do + end if + + call comms_reduce(ekin_k_matrix(1, 1), max_bin_e*max_bin_k, 'SUM') + call comms_reduce(total_be_kmat_contribs, 1, 'SUM') + total_weighted = sum(ekin_k_matrix(:, :)) + if (total_weighted .gt. 0.0_dp) then + qe_norm = total_be_kmat_contribs/total_weighted + else + qe_norm = 1.0_dp + end if + call comms_bcast(qe_norm, 1) + ekin_k_matrix = ekin_k_matrix*qe_norm + + if (on_root) then + matrix_unit = io_file_unit() + write (char_e, '(F7.3)') temp_photon_energy + filename = trim(seedname)//'_'//trim(photo_model)//'_'//trim(adjustl(char_e))// & + '_Ebind_ptrans_map.dat' + write (stdout, '(1x,a)') '| Writing out to *SEEDNAME*_'//trim(photo_model)//'_' & + //trim(adjustl(char_e))//'_Ebind_ptrans_map.dat' + open (unit=matrix_unit, action='write', file=filename) + call io_date(cdate, ctime) + write (matrix_unit, '(a56,a11,a4,a9)') '## OptaDOS Photoemission: Energy vs P_transverse matrix ',& + & cdate, ' at ', ctime + write (matrix_unit, '(a14,a)') '## Seedname : ', trim(adjustl(seedname)) + write (matrix_unit, '(a25,a12)') '## Photoemission Model : ', trim(adjustl(photo_model)) + write (matrix_unit, '(a24,f7.3)') '## Photon Energy [eV] : ', temp_photon_energy + write (matrix_unit, '(a21,a15)') '## Optics Geometry : ', trim(adjustl(optics_geom)) + write (matrix_unit, '(a39,3(1x,f10.5))') '## Optics q-dir vector [unnormalised] :', optics_qdir(1:3) + write (matrix_unit, '(a36,f9.5)') '## Binding Energy Broadening [eV] : ', photo_bindenergy_broadening + write (matrix_unit, '(a65,2(1x,f7.2))') '## Emission angle theta min, max (w.r.t. surface normal) [deg] : ', & + photo_theta_min, photo_theta_max + write (matrix_unit, '(a55,2(1x,f7.2))') '## Emission angle phi min, max (w.r.t. x-axis) [deg] : ', & + photo_phi_min, photo_phi_max + write (matrix_unit, '(a35,f9.5)') '## Fermi Energy Ekin offset [eV] : ', max_e_kinetic - plot_extra_upper + write (matrix_unit, '(a34,f9.5)') '## Max k_transverse value [1/A] : ', max_k_transverse + write (matrix_unit, '(a20,f9.5)') '## Bin width [eV] : ', photo_pmat_bin_width + write (matrix_unit, '(a19,2(1x,I10),a2)') '## Matrix Shape : (', max_bin_e, max_bin_k, ' )' + + write (out_string, '(I0,"(1x,",a,")")') max_bin_k, 'ES25.12E3' + + do edx = 1, max_bin_e + write (matrix_unit, '('//trim(out_string)//')') (ekin_k_matrix(kdx, edx), kdx=1, max_bin_k) + end do + + close (unit=matrix_unit) + end if + ! Safety comms sync + call comms_bcast(qe_norm, 1) + + if (allocated(arpes_mask)) then + deallocate (arpes_mask, stat=ierr) + if (ierr /= 0) call io_error('Error: binding_energy_momentum_map - failed to deallocate arpes_mask') + end if + + if (allocated(binding_temp)) then + deallocate (binding_temp, stat=ierr) + if (ierr /= 0) call io_error('Error: binding_energy_momentum_map - failed to deallocate binding_temp') + end if + + if (allocated(gauss_k)) then + deallocate (gauss_k, stat=ierr) + if (ierr /= 0) call io_error('Error : binding_energy_momentum_map - failed to deallocate gauss_k') + end if + + if (allocated(ekin_k_matrix)) then + deallocate (ekin_k_matrix, stat=ierr) + if (ierr /= 0) call io_error('Error: write_qe_tensor - failed to deallocate ekin_k_matrix') + end if + + time1 = io_time() + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a47,12x,f11.3,a8)') '+ Time to calculate binding energy momentum map', time1 - time0, ' (sec) +' + write (stdout, '(1x,a78)') '+----------------------------------------------------------------------------+' + call FLUSH (stdout) + end if + end subroutine binding_energy_momentum_map + + subroutine binding_energy_momentum_map_gkgrid + !*=============================================================================== + ! This subroutine calculates a binding energy vs reciprocal transverse momentum + ! map of the gaussian broadened band contributions and writes it to a file. + ! This is the optimised version for the photo_momentum option to allow supercell + ! calculations. Can be thought of the bandstructure projection along the + ! transverse diagonal showing the contributions of emitting bands. + ! written by Felix Mildner, after May 2025 + !=============================================================================== + use od_cell, only: num_kpoints_on_node, cell_calc_kpoint_r_cart, kpoint_r_cart, kpoint_weight, & + kpoint_grid_dim, recip_lattice + use od_electronic, only: nbands, nspins, band_energy, efermi, electrons_per_state, transmit_prob, & + photo_gkgrid, elec_read_gk_grid_points + use od_parameters, only: photo_work_function, photo_model, photo_theta_min, photo_theta_max, photo_temperature, & + & photo_phi_min, photo_phi_max, photo_bindenergy_broadening, photo_gk_max_vectors, scissor_op, iprint, & + & photo_momentum, photo_pmat_bin_width, optics_geom, optics_qdir + use od_algorithms, only: gaussian + use od_comms, only: my_node_id, comms_reduce, comms_bcast, on_root + use od_io, only: io_error, io_file_unit, stdout, io_time, io_date, seedname + use od_constants, only: inv_sqrt_two_pi, kB, rad_to_deg, twopi, e_mass, hbar, ev_to_j + implicit none + + integer :: i, N_k, N_spin, n_eigen_init, n_eigen, n_eigen_final, atom, kdx, edx, gdx, ierr + integer :: window_width, matrix_unit + integer :: k_window, e_window, center_bin_e, center_bin_k, kdx_min, kdx_max, edx_min, edx_max + real(kind=dp) :: temp_contribution, gk_factor, norm_vac, qe_factor, width, argument, gk + real(kind=dp) :: step(1:2), sub_cell_length(1:2), k_broadening, temp_k, min_e, gauss_e, e_temp + real(kind=dp) :: final_fd, ekin_temp, qe_contrib + real(kind=dp) :: total_weighted, qe_norm + real(kind=dp) :: time0, time1 + + real(kind=dp), allocatable, dimension(:, :, :) :: fermi_dirac + real(kind=dp), allocatable, dimension(:, :, :, :) :: transverse_gauss + real(kind=dp), allocatable, dimension(:, :, :) :: vacuum_gauss + real(kind=dp), allocatable, dimension(:, :, :, :) :: arpes_mask + real(kind=dp), allocatable, dimension(:, :, :, :) :: delta_temp + real(kind=dp), allocatable, dimension(:, :, :, :) :: binding_temp + real(kind=dp), allocatable, dimension(:) :: gauss_k + + character(len=100) :: out_string + character(len=99) :: filename + character(len=10) :: char_e + character(len=9) :: ctime ! Temp. time string + character(len=11) :: cdate ! Temp. date string + + time0 = io_time() + if (on_root) write (stdout, '(1x,a78)') '+--------- Starting Binding Energy vs Transverse P Map Calculation ----------+' + ! We are redoing parts of the QE calculation, so we need these factors + qe_factor = 1.0_dp/(cell_area) + width = kB*photo_temperature + norm_vac = inv_sqrt_two_pi/width + ! How many standard deviations out from the center should the Gaussian broadening be summed up? + window_width = 12 + max_energy = int((temp_photon_energy - photo_work_function)*1000) + 500 + if (max_energy .lt. 500) return + + if (.not. allocated(fermi_dirac)) then + allocate (fermi_dirac(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: binding_energy_momentum_map - allocation of fermi_dirac failed') + end if + fermi_dirac = 0.0_dp + + if (.not. allocated(transverse_gauss)) then + allocate (transverse_gauss(photo_gk_max_vectors, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: binding_energy_momentum_map - allocation of transverse_gauss failed') + end if + transverse_gauss = 0.0_dp + + if (.not. allocated(arpes_mask)) then + allocate (arpes_mask(photo_gk_max_vectors, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: binding_energy_momentum_map - allocation of arpes_mask failed') + end if + arpes_mask = 0.00_dp + + if (.not. allocated(vacuum_gauss)) then + allocate (vacuum_gauss(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: binding_energy_momentum_map - allocation of vacuum_gauss failed') + end if + vacuum_gauss = 0.0_dp + + total_be_contribs = 0.0_dp + + call cell_calc_kpoint_r_cart + step(:) = 0.5_dp/real(kpoint_grid_dim(1:2), dp) + do i = 1, 2 + sub_cell_length(i) = sqrt(recip_lattice(i, 1)**2 + recip_lattice(i, 2)**2 + recip_lattice(i, 3)**2)*step(i) + end do + ! diagonal distance between MP points in reciprocal space divided by 2*2*sqrt(2*ln(2)) + ! so that FWHM = the step distance between the kpoints + k_broadening = sqrt(sub_cell_length(1)**2 + sub_cell_length(2)**2)/(4.70964009_dp) + + ! calculate the number of bins to go left and right of center + ! set to 10 standard deviations (width) of a gaussian function + k_window = 15*ceiling(k_broadening/photo_pmat_bin_width) + e_window = 15*ceiling(photo_bindenergy_broadening/photo_pmat_bin_width) + ! get the maximum k + max_k_transverse = 0.0_dp + call elec_read_gk_grid_points(photo_gk_max_vectors) + max_k_transverse = sqrt((2*e_mass*((temp_photon_energy - work_function_eff + 0.5)*ev_to_j))/(hbar*hbar))*1E-10 + max_bin_k = ceiling(max_k_transverse/photo_pmat_bin_width) + + ! calculating upper bound of energy range with some extra for plotting + max_e_kinetic = temp_photon_energy - work_function_eff + plot_extra_upper + ! calculating lower bound of energy range + ! Restrict lower E_kinetic bound to either -0.25 eV or minimal E_kinetic + ! This makes sure the program does not print huge matrices at higher photon energies + min_e = max(minval(E_kinetic) - 0.25_dp, -0.25_dp) + call comms_reduce(min_e, 1, 'MIN') + call comms_bcast(min_e, 1) + max_bin_e = ceiling((max_e_kinetic - min_e)/photo_pmat_bin_width) + + if (max_bin_e .lt. 0 .or. max_bin_k .lt. 0) return + + ! set up the matrix of energy vs transverse k + if (.not. allocated(ekin_k_matrix)) then + allocate (ekin_k_matrix(max_bin_k, max_bin_e), stat=ierr) + if (ierr /= 0) call io_error('Error: binding_energy_momentum_map - allocation of ekin_k_matrix failed') + end if + ekin_k_matrix = 0.0_dp + + if (.not. allocated(gauss_k)) then + allocate (gauss_k(max_bin_k), stat=ierr) + if (ierr /= 0) call io_error('Error: full_momentum_tensor - allocation of gauss_k failed') + end if + gauss_k = 0.0_dp + + if (index(photo_model, '3step') > 0) then + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + do n_eigen_init = 1, nbands + argument = (band_energy(n_eigen_init, N_spin, N_k) - efermi)/(kB*photo_temperature) + ! This is a bit of an arbitrary condition, but exp(+-230) ~ 1E(+-100) + ! so this cutoff condition saves us from running into arithmetic + ! issues when computing fermi_dirac due to possible under/over-flow. + if (argument .gt. 230.0_dp) then + fermi_dirac(n_eigen_init, N_spin, N_k) = 0.0_dp + elseif (argument .lt. -230.0_dp) then + fermi_dirac(n_eigen_init, N_spin, N_k) = 1.0_dp + else + fermi_dirac(n_eigen_init, N_spin, N_k) = 1.0_dp/(exp(argument) + 1.0_dp) + end if + + ! The vacuum gauss represents the necessary condition: is the final state above E_vacuum? + ! The transverse gauss represents the sufficient condition: after "emission", do we have enough energy for E_ortho > 0? + ! Is the final state energy above the vauum level? + if (band_energy(n_eigen_init, N_spin, N_k) .lt. evacuum_eff) then + vacuum_gauss(n_eigen_init, N_spin, N_k) = gaussian(band_energy(n_eigen_init, N_spin, N_k) + & + scissor_op, width, evacuum_eff)/norm_vac + else + vacuum_gauss(n_eigen_init, N_spin, N_k) = 1.0_dp + end if + ! Is there enough total energy for this kpt/band for E_ortho > 0 after passing through surface potential step + ! (workfunction), evacuum_eff = efermi + work_function_eff + do gdx = 1, photo_gk_max_vectors + ! Is (photon_energy - transverse energy) > (work_function - E_field_lowering) + ! Is the final kinetic energy ortho > 0? + ekin_temp = temp_photon_energy - E_transverse(gdx, n_eigen_init, N_spin, N_k) + if (ekin_temp .le. work_function_eff) then + transverse_gauss(gdx, n_eigen_init, N_spin, N_k) = gaussian(ekin_temp, width, work_function_eff)/norm_vac + else + transverse_gauss(gdx, n_eigen_init, N_spin, N_k) = 1.0_dp + end if + if (theta_arpes(gdx, n_eigen_init, N_spin, N_k) .ge. photo_theta_min .and. & + theta_arpes(gdx, n_eigen_init, N_spin, N_k) .le. photo_theta_max) then + if (phi_arpes(gdx, n_eigen_init, N_spin, N_k) .ge. photo_phi_min .and. & + phi_arpes(gdx, n_eigen_init, N_spin, N_k) .le. photo_phi_max) then + arpes_mask(gdx, n_eigen_init, N_spin, N_k) = 1.0_dp + end if + end if + end do + + end do + end do + end do + + call photo_calculate_delta(delta_temp, .false.) + + do atom = 1, max_atoms + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen_final = 2, nbands + ! if (num_exclude_bands .gt. 1) then + ! if (any(exclude_bands == n_eigen_final)) then + ! cycle + ! end if + ! end if + final_fd = 1 - fermi_dirac(n_eigen_final, N_spin, N_k) + do n_eigen_init = 1, n_eigen_final - 1 + temp_contribution = & + qe_factor*photo_matrix_weights(n_eigen_init, n_eigen_final, N_spin, N_k) & + *delta_temp(n_eigen_init, n_eigen_final, N_spin, N_k)*transmit_prob(n_eigen_final, N_spin, N_k) & + *electrons_per_state*kpoint_weight(N_k)*I_layer(box_atom(atom), current_photo_energy_index) & + *vacuum_gauss(n_eigen_final, N_spin, N_k)*fermi_dirac(n_eigen_init, N_spin, N_k)*final_fd & + *(pdos_weights_atoms(n_eigen_init, N_spin, N_k, atom_order(atom)) & + /pdos_weights_k_band(n_eigen_init, N_spin, N_k)) & + *(1.0_dp + field_emission(n_eigen_final, N_spin, N_k)) + do gdx = 1, photo_gk_max_vectors + gk_factor = arpes_mask(gdx, n_eigen_final, N_spin, N_k) & + *gkgrid_weight(gdx, n_eigen_init, N_spin, N_k) & + *electron_esc(gdx, n_eigen_final, N_spin, N_k, atom) & + *transverse_gauss(gdx, n_eigen_init, N_spin, N_k) + qe_contrib = temp_contribution*gk_factor + total_be_kmat_contribs = total_be_kmat_contribs + qe_contrib + + temp_k = sqrt(photo_gkgrid(1, gdx, n_eigen_init, N_spin, N_k)**2 + & + photo_gkgrid(2, gdx, n_eigen_init, N_spin, N_k)**2) + center_bin_k = ceiling(temp_k/photo_pmat_bin_width) + kdx_min = max(center_bin_k - k_window, 1) + kdx_max = min(center_bin_k + k_window, max_bin_k) + gk = (kdx_min - 1)*photo_pmat_bin_width + do kdx = kdx_min, kdx_max + gauss_k(kdx) = gaussian(temp_k, k_broadening, gk) + gk = gk + photo_pmat_bin_width + end do + + center_bin_e = ceiling((E_kinetic(gdx, n_eigen_init, N_spin, N_k) - min_e)/photo_pmat_bin_width) + edx_min = max(center_bin_e - e_window, 1) + edx_max = min(center_bin_e + e_window, max_bin_e) + e_temp = min_e + (edx_min - 1)*photo_pmat_bin_width + do edx = edx_min, edx_max + gauss_e = gaussian(E_kinetic(gdx, n_eigen_init, N_spin, N_k), photo_bindenergy_broadening, & + e_temp) + e_temp = e_temp + photo_pmat_bin_width + do kdx = kdx_min, kdx_max + ekin_k_matrix(kdx, edx) = ekin_k_matrix(kdx, edx) + gauss_e*gauss_k(kdx)*qe_contrib + end do + end do + end do + end do + end do + end do + end do + end do + + call photo_calculate_delta(delta_temp, .true.) + + do N_k = 1, num_kpoints_on_node(my_node_id) ! Loop over kpoints + do N_spin = 1, nspins ! Loop over spins + do n_eigen_final = 2, nbands + ! if (num_exclude_bands .gt. 1) then + ! if (any(exclude_bands == n_eigen_final)) then + ! cycle + ! end if + ! end if + final_fd = 1 - fermi_dirac(n_eigen_final, N_spin, N_k) + do n_eigen_init = 1, n_eigen_final - 1 + temp_contribution = & + (qe_factor*photo_matrix_weights(n_eigen_init, n_eigen_final, N_spin, N_k) & + *delta_temp(n_eigen_init, n_eigen_final, N_spin, N_k) & + *transmit_prob(n_eigen_final, N_spin, N_k) & + *electrons_per_state*kpoint_weight(N_k) & + *vacuum_gauss(n_eigen_final, N_spin, N_k)*fermi_dirac(n_eigen_init, N_spin, N_k)*final_fd & + *(pdos_weights_atoms(n_eigen_init, N_spin, N_k, atom_order(max_atoms)) & + /pdos_weights_k_band(n_eigen_init, N_spin, N_k))) & + *(1.0_dp + field_emission(n_eigen_final, N_spin, N_k)) + do gdx = 1, photo_gk_max_vectors + gk_factor = arpes_mask(gdx, n_eigen_final, N_spin, N_k) & + *gkgrid_weight(gdx, n_eigen_init, N_spin, N_k) & + *electron_esc(gdx, n_eigen_final, N_spin, N_k, max_atoms + 1) & + *transverse_gauss(gdx, n_eigen_init, N_spin, N_k) + qe_contrib = temp_contribution*gk_factor + total_be_kmat_contribs = total_be_kmat_contribs + qe_contrib + + temp_k = sqrt(photo_gkgrid(1, gdx, n_eigen_init, N_spin, N_k)**2 & + + photo_gkgrid(2, gdx, n_eigen_init, N_spin, N_k)**2) + center_bin_k = ceiling(temp_k/photo_pmat_bin_width) + kdx_min = max(center_bin_k - k_window, 1) + kdx_max = min(center_bin_k + k_window, max_bin_k) + gk = (kdx_min - 1)*photo_pmat_bin_width + do kdx = kdx_min, kdx_max + gauss_k(kdx) = gaussian(temp_k, k_broadening, gk) + gk = gk + photo_pmat_bin_width + end do + + center_bin_e = ceiling((E_kinetic(gdx, n_eigen_init, N_spin, N_k) - min_e)/photo_pmat_bin_width) + edx_min = max(center_bin_e - e_window, 1) + edx_max = min(center_bin_e + e_window, max_bin_e) + e_temp = min_e + (edx_min - 1)*photo_pmat_bin_width + do edx = edx_min, edx_max + gauss_e = gaussian(E_kinetic(gdx, n_eigen_init, N_spin, N_k), photo_bindenergy_broadening, & + e_temp) + e_temp = e_temp + photo_pmat_bin_width + do kdx = kdx_min, kdx_max + ekin_k_matrix(kdx, edx) = ekin_k_matrix(kdx, edx) + gauss_e*gauss_k(kdx)*qe_contrib + end do + end do + end do + end do + end do + end do + end do + end if + + if (index(photo_model, '1step') > 0) then + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + do n_eigen = 1, nbands + argument = (band_energy(n_eigen, N_spin, N_k) - efermi)/(kB*photo_temperature) + ! This is a bit of an arbitrary condition, but exp(+-230) ~ 1E(+-100) + ! so this cutoff condition saves us from running into arithmetic + ! issues when computing fermi_dirac due to possible under/over-flow. + if (argument .gt. 230.0_dp) then + fermi_dirac(n_eigen, N_spin, N_k) = 0.0_dp + elseif (argument .lt. -230.0_dp) then + fermi_dirac(n_eigen, N_spin, N_k) = 1.0_dp + else + fermi_dirac(n_eigen, N_spin, N_k) = 1.0_dp/(exp(argument) + 1.0_dp) + end if + + if ((band_energy(n_eigen, N_spin, N_k) + temp_photon_energy) .lt. evacuum_eff) then + vacuum_gauss(n_eigen, N_spin, N_k) = gaussian((band_energy(n_eigen, N_spin, N_k) + temp_photon_energy) + & + scissor_op, width, evacuum_eff)/norm_vac + else + vacuum_gauss(n_eigen, N_spin, N_k) = 1.0_dp + end if + + do gdx = 1, photo_gk_max_vectors + ! evacuum_eff = efermi + photo_work_function + ! Is (photon_energy - transverse energy) > (work_function - E_field_lowering) + ! Is the final kinetic energy > 0? + ekin_temp = temp_photon_energy - E_transverse(gdx, n_eigen, N_spin, N_k) + if (ekin_temp .le. work_function_eff) then + transverse_gauss(gdx, n_eigen, N_spin, N_k) = gaussian(ekin_temp, width, work_function_eff)/norm_vac + else + transverse_gauss(gdx, n_eigen, N_spin, N_k) = 1.0_dp + end if + + if (theta_arpes(gdx, n_eigen, N_spin, N_k) .ge. photo_theta_min .and. & + theta_arpes(gdx, n_eigen, N_spin, N_k) .le. photo_theta_max) then + if (phi_arpes(gdx, n_eigen, N_spin, N_k) .ge. photo_phi_min .and. & + phi_arpes(gdx, n_eigen, N_spin, N_k) .le. photo_phi_max) then + arpes_mask(gdx, n_eigen, N_spin, N_k) = 1.0_dp + end if + end if + end do + end do + end do + end do + + ! for all the bands, spins, kpts, atoms + do atom = 1, max_atoms + 1 + kpoints: do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + do n_eigen = 1, nbands + temp_contribution = (qe_factor*foptical_matrix_weights(n_eigen, N_spin, N_k) & + *electrons_per_state*kpoint_weight(N_k) & + *I_layer(box_atom(atom), current_photo_energy_index) & + *vacuum_gauss(n_eigen, N_spin, N_k) & + *fermi_dirac(n_eigen, N_spin, N_k) & + *(pdos_weights_atoms(n_eigen, N_spin, N_k, atom_order(atom)) & + /pdos_weights_k_band(n_eigen, N_spin, N_k))) & + *(1.0_dp + field_emission(n_eigen, N_spin, N_k)) + do gdx = 1, photo_gk_max_vectors + gk_factor = arpes_mask(gdx, n_eigen, N_spin, N_k) & + *gkgrid_weight(gdx, n_eigen, N_spin, N_k) & + *electron_esc(gdx, n_eigen, N_spin, N_k, atom) & + *transverse_gauss(gdx, n_eigen, N_spin, N_k) + qe_contrib = temp_contribution*gk_factor + total_be_kmat_contribs = total_be_kmat_contribs + qe_contrib + + temp_k = sqrt(photo_gkgrid(1, gdx, n_eigen, N_spin, N_k)**2 + photo_gkgrid(2, gdx, n_eigen, N_spin, N_k)**2) + center_bin_k = ceiling(temp_k/photo_pmat_bin_width) + kdx_min = max(center_bin_k - k_window, 1) + kdx_max = min(center_bin_k + k_window, max_bin_k) + gk = (kdx_min - 1)*photo_pmat_bin_width + do kdx = kdx_min, kdx_max + gauss_k(kdx) = gaussian(temp_k, k_broadening, gk) + gk = gk + photo_pmat_bin_width + end do + + center_bin_e = ceiling((E_kinetic(gdx, n_eigen, N_spin, N_k) - min_e)/photo_pmat_bin_width) + edx_min = max(center_bin_e - e_window, 1) + edx_max = min(center_bin_e + e_window, max_bin_e) + e_temp = min_e + (edx_min - 1)*photo_pmat_bin_width + do edx = edx_min, edx_max + gauss_e = gaussian(E_kinetic(gdx, n_eigen, N_spin, N_k), photo_bindenergy_broadening, & + e_temp) + e_temp = e_temp + photo_pmat_bin_width + do kdx = kdx_min, kdx_max + ekin_k_matrix(kdx, edx) = ekin_k_matrix(kdx, edx) + gauss_e*gauss_k(kdx)*qe_contrib + end do + end do + end do + end do + end do + end do kpoints + end do + end if + + call comms_reduce(ekin_k_matrix(1, 1), max_bin_e*max_bin_k, 'SUM') + call comms_reduce(total_be_kmat_contribs, 1, 'SUM') + total_weighted = sum(ekin_k_matrix(:, :)) + if (total_weighted .gt. 0.0_dp) then + qe_norm = total_be_kmat_contribs/total_weighted + else + qe_norm = 1.0_dp + end if + call comms_bcast(qe_norm, 1) + ekin_k_matrix = ekin_k_matrix*qe_norm + + if (on_root) then + matrix_unit = io_file_unit() + write (char_e, '(F7.3)') temp_photon_energy + filename = trim(seedname)//'_'//trim(photo_model)//'_'//trim(adjustl(char_e))// & + '_Ebind_ptrans_map.dat' + write (stdout, '(1x,a)') '| Writing out to *SEEDNAME*_'//trim(photo_model)//'_' & + //trim(adjustl(char_e))//'_Ebind_ptrans_map.dat' + open (unit=matrix_unit, action='write', file=filename) + call io_date(cdate, ctime) + write (matrix_unit, '(a56,a11,a4,a9)') '## OptaDOS Photoemission: Energy vs P_transverse matrix ',& + & cdate, ' at ', ctime + write (matrix_unit, '(a14,a)') '## Seedname : ', trim(adjustl(seedname)) + write (matrix_unit, '(a25,a12)') '## Photoemission Model : ', trim(adjustl(photo_model)) + write (matrix_unit, '(a24,f7.3)') '## Photon Energy [eV] : ', temp_photon_energy + write (matrix_unit, '(a21,a15)') '## Optics Geometry : ', trim(adjustl(optics_geom)) + write (matrix_unit, '(a39,3(1x,f10.5))') '## Optics q-dir vector [unnormalised] :', optics_qdir(1:3) + write (matrix_unit, '(a36,f9.5)') '## Binding Energy Broadening [eV] : ', photo_bindenergy_broadening + write (matrix_unit, '(a65,2(1x,f7.2))') '## Emission angle theta min, max (w.r.t. surface normal) [deg] : ', & + photo_theta_min, photo_theta_max + write (matrix_unit, '(a55,2(1x,f7.2))') '## Emission angle phi min, max (w.r.t. x-axis) [deg] : ', & + photo_phi_min, photo_phi_max + write (matrix_unit, '(a35,f9.5)') '## Fermi Energy Ekin offset [eV] : ', max_e_kinetic - plot_extra_upper + write (matrix_unit, '(a34,f9.5)') '## Max k_transverse value [1/A] : ', max_k_transverse + write (matrix_unit, '(a20,f9.5)') '## Bin width [eV] : ', photo_pmat_bin_width + write (matrix_unit, '(a19,2(1x,I10),a2)') '## Matrix Shape : (', max_bin_e, max_bin_k, ' )' + + write (out_string, '(I0,"(1x,",a,")")') max_bin_k, 'ES25.12E3' + + do edx = 1, max_bin_e + write (matrix_unit, '('//trim(out_string)//')') (ekin_k_matrix(kdx, edx), kdx=1, max_bin_k) + end do + + close (unit=matrix_unit) + end if + ! Safety comms sync + call comms_bcast(qe_norm, 1) + + if (allocated(arpes_mask)) then + deallocate (arpes_mask, stat=ierr) + if (ierr /= 0) call io_error('Error: binding_energy_momentum_map - failed to deallocate arpes_mask') + end if + + if (allocated(binding_temp)) then + deallocate (binding_temp, stat=ierr) + if (ierr /= 0) call io_error('Error: binding_energy_momentum_map - failed to deallocate binding_temp') + end if + + if (allocated(gauss_k)) then + deallocate (gauss_k, stat=ierr) + if (ierr /= 0) call io_error('Error : binding_energy_momentum_map - failed to deallocate gauss_k') + end if + + if (allocated(photo_gkgrid)) then + deallocate (photo_gkgrid, stat=ierr) + if (ierr /= 0) call io_error('Error : binding_energy_momentum_map - failed to deallocate photo_gkgrid') + end if + + if (allocated(ekin_k_matrix)) then + deallocate (ekin_k_matrix, stat=ierr) + if (ierr /= 0) call io_error('Error: write_qe_tensor - failed to deallocate ekin_k_matrix') + end if + + time1 = io_time() + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a47,12x,f11.3,a8)') '+ Time to calculate binding energy momentum map', time1 - time0, ' (sec) +' + write (stdout, '(1x,a78)') '+----------------------------------------------------------------------------+' + call FLUSH (stdout) + end if + end subroutine binding_energy_momentum_map_gkgrid + + subroutine full_momentum_tensor + !*=============================================================================== + ! This subroutine calculates the px,py,pz momentum tensor of emitted electrons, + ! applies a gaussian broadening to each contribution and writes it to a file. + ! written by Felix Mildner, after May 2025 + !=============================================================================== + use od_cell, only: num_kpoints_on_node, cell_calc_kpoint_r_cart, kpoint_r_cart, kpoint_weight, & + kpoint_grid_dim, recip_lattice, num_crystal_symmetry_operations, crystal_symmetry_operations + use od_electronic, only: nbands, nspins, band_energy, efermi, electrons_per_state, transmit_prob + use od_parameters, only: photo_model, photo_theta_min, photo_theta_max, photo_temperature, & + & photo_phi_min, photo_phi_max, photo_bindenergy_broadening, photo_gk_max_vectors, scissor_op, iprint, & + & photo_pmat_bin_width, devel_flag, optics_geom, optics_qdir + use od_algorithms, only: gaussian + use od_comms, only: my_node_id, comms_reduce, comms_bcast, on_root + use od_io, only: io_error, io_file_unit, stdout, io_time, io_date, seedname + use od_constants, only: inv_sqrt_two_pi, kB, rad_to_deg, twopi, e_mass, ev_to_j, hbar + implicit none + + integer :: i, N_k, N_spin, n_eigen_init, n_eigen, n_eigen_final, atom, gdx, ierr + integer :: matrix_unit, total_ks, nsymm_op, x_center, y_center, z_center, xdx, ydx, zdx + integer :: xdx_offset, ydx_offset, zdx_offset, xdx_window, ydx_window, zdx_window + integer :: xdx_min, xdx_max, ydx_min, ydx_max, zdx_min, zdx_max + real(kind=dp), allocatable, dimension(:, :, :, :) :: delta_temp + real(kind=dp), allocatable, dimension(:, :, :, :) :: binding_temp + real(kind=dp), allocatable, dimension(:, :, :, :) :: e_z + real(kind=dp), allocatable, dimension(:, :, :, :) :: transverse_gauss + real(kind=dp), allocatable, dimension(:, :, :, :) :: arpes_mask + real(kind=dp), allocatable, dimension(:, :, :) :: vacuum_gauss + real(kind=dp), allocatable, dimension(:, :, :) :: fermi_dirac + real(kind=dp), allocatable, dimension(:) :: gauss_y, gauss_x + real(kind=dp) :: step(1:2), sub_cell_length(1:2), temp_mat(2, 2), current_k(2) + real(kind=dp) :: qe_contrib, gauss_z, total_weighted, qe_norm + real(kind=dp) :: kx_broadening, ky_broadening, kz_broadening, k_prefactor, kz + real(kind=dp) :: final_fd, ekin_temp, z_max, xy_max, wave_prefactor + real(kind=dp) :: temp_contribution, gk_factor, norm_vac, qe_factor, width, argument + character(len=100) :: out_string + character(len=99) :: filename + character(len=10) :: char_e + character(len=9) :: ctime ! Temp. time string + character(len=11) :: cdate ! Temp. date string + real(kind=dp) :: time0, time1 + + time0 = io_time() + if (on_root) write (stdout, '(1x,a78)') '+---------------- Starting Full Momentum Tensor Calculation -----------------+' + + if (.not. allocated(fermi_dirac)) then + allocate (fermi_dirac(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: full_momentum_tensor - allocation of fermi_dirac failed') + end if + fermi_dirac = 0.0_dp + + if (.not. allocated(transverse_gauss)) then + allocate (transverse_gauss(photo_gk_max_vectors, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: full_momentum_tensor - allocation of transverse_gauss failed') + end if + transverse_gauss = 0.0_dp + + if (.not. allocated(arpes_mask)) then + allocate (arpes_mask(photo_gk_max_vectors, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: full_momentum_tensor - allocation of arpes_mask failed') + end if + arpes_mask = 0.00_dp + + if (.not. allocated(vacuum_gauss)) then + allocate (vacuum_gauss(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: full_momentum_tensor - allocation of vacuum_gauss failed') + end if + vacuum_gauss = 0.0_dp + + if (.not. allocated(e_z)) then + allocate (e_z(photo_gk_max_vectors, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: full_momentum_tensor - allocation of e_z failed') + end if + e_z = 1000.0_dp + + total_be_contribs = 0.0_dp + qe_factor = 1.0_dp/(cell_area) + width = kB*photo_temperature + norm_vac = inv_sqrt_two_pi/width + wave_prefactor = 2*e_mass/(hbar**2) + + ! get kinetic energy at efermi for reference + max_e_kinetic = temp_photon_energy - work_function_eff + if (max_e_kinetic .lt. 0.0_dp) return + ! calculating lower bound of energy range + total_ks = kpoint_grid_dim(1)*kpoint_grid_dim(2) + do i = 1, 2 + step(i) = 0.5_dp/real(kpoint_grid_dim(i), dp) + sub_cell_length(i) = sqrt(recip_lattice(i, 1)**2 + recip_lattice(i, 2)**2 + recip_lattice(i, 3)**2)*step(i) + end do + + ! diagonal distance between MP points in reciprocal space divided by 2*2*sqrt(2*ln(2)) so that + ! the FWHM = 1/2 the step distance between the kpoints + kx_broadening = sub_cell_length(1)/(4.70964009_dp) + ky_broadening = sub_cell_length(2)/(4.70964009_dp) + ! kz_broadening = photo_bindenergy_broadening[1/A]/(4.70964009_dp) + kz_broadening = sqrt((2*e_mass*(photo_bindenergy_broadening*ev_to_j))/(hbar*hbar))*1E-10/(4.70964009_dp) + + ! calculate the number of bins to go left and right + ! set to 15 standard deviations (width) of a gaussian function + xdx_window = ceiling(15*kx_broadening/photo_pmat_bin_width) + ydx_window = ceiling(15*ky_broadening/photo_pmat_bin_width) + zdx_window = ceiling(15*kz_broadening/photo_pmat_bin_width) + + call cell_calc_kpoint_r_cart + max_e_kinetic = temp_photon_energy - work_function_eff + z_max = sqrt((2*e_mass*((max_e_kinetic + 0.5)*ev_to_j))/(hbar*hbar))*1E-10 + xy_max = min((abs(maxval(kpoint_r_cart(1:2, :))) + 0.5), z_max) + xdx_offset = ceiling(xy_max/photo_pmat_bin_width) + ydx_offset = ceiling(xy_max/photo_pmat_bin_width) + zdx_offset = ceiling(z_max/photo_pmat_bin_width) + zdx_window + + call comms_reduce(xdx_offset, 1, "MAX") + call comms_reduce(ydx_offset, 1, "MAX") + call comms_bcast(xdx_offset, 1) + call comms_bcast(ydx_offset, 1) + max_bin_p(1) = 2*xdx_offset + 1 + max_bin_p(2) = 2*ydx_offset + 1 + max_bin_p(3) = zdx_offset + 1 + + if (.not. allocated(p_tensor)) then + allocate (p_tensor(max_bin_p(1), max_bin_p(2), max_bin_p(3)), stat=ierr) + if (ierr /= 0) call io_error('Error: full_momentum_tensor - allocation of p_tensor failed') + end if + p_tensor = 0.0_dp + + if (.not. allocated(gauss_x)) then + allocate (gauss_x(max_bin_p(1)), stat=ierr) + if (ierr /= 0) call io_error('Error: full_momentum_tensor - allocation of gauss_x failed') + end if + gauss_x = 0.0_dp + if (.not. allocated(gauss_y)) then + allocate (gauss_y(max_bin_p(2)), stat=ierr) + if (ierr /= 0) call io_error('Error: full_momentum_tensor - allocation of gauss_y failed') + end if + gauss_y = 0.0_dp + + if (index(photo_model, '3step') > 0) then + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + do n_eigen = 1, nbands + argument = (band_energy(n_eigen, N_spin, N_k) - efermi)/(kB*photo_temperature) + ! This is a bit of an arbitrary condition, but exp(+-230) ~ 1E(+-100) + ! so this cutoff condition saves us from running into arithmetic + ! issues when computing fermi_dirac due to possible under/over-flow. + if (argument .gt. 230.0_dp) then + fermi_dirac(n_eigen, N_spin, N_k) = 0.0_dp + elseif (argument .lt. -230.0_dp) then + fermi_dirac(n_eigen, N_spin, N_k) = 1.0_dp + else + fermi_dirac(n_eigen, N_spin, N_k) = 1.0_dp/(exp(argument) + 1.0_dp) + end if + + ! The vacuum gauss represents the necessary condition: is the final state above E_vacuum? + ! The transverse gauss represents the sufficient condition: after "emission", do we have enough energy for E_ortho > 0? + ! Is the final state energy above the vauum level? + if (band_energy(n_eigen, N_spin, N_k) .lt. evacuum_eff) then + vacuum_gauss(n_eigen, N_spin, N_k) = gaussian(band_energy(n_eigen, N_spin, N_k) + & + scissor_op, width, evacuum_eff)/norm_vac + else + vacuum_gauss(n_eigen, N_spin, N_k) = 1.0_dp + end if + ! Is there enough total energy for this kpt/band for E_ortho > 0 after passing through surface potential step + ! (workfunction), evacuum_eff = efermi + work_function_eff + do gdx = 1, photo_gk_max_vectors + ! Is (photon_energy - transverse energy) > (work_function - E_field_lowering) + ! Is the final kinetic energy ortho > 0? + ekin_temp = temp_photon_energy - E_transverse(gdx, n_eigen, N_spin, N_k) + if (ekin_temp .le. work_function_eff) then + transverse_gauss(gdx, n_eigen, N_spin, N_k) = gaussian(ekin_temp, width, work_function_eff)/norm_vac + else + transverse_gauss(gdx, n_eigen, N_spin, N_k) = 1.0_dp + end if + if (theta_arpes(gdx, n_eigen, N_spin, N_k) .ge. photo_theta_min .and. & + theta_arpes(gdx, n_eigen, N_spin, N_k) .le. photo_theta_max) then + if (phi_arpes(gdx, n_eigen, N_spin, N_k) .ge. photo_phi_min .and. & + phi_arpes(gdx, n_eigen, N_spin, N_k) .le. photo_phi_max) then + arpes_mask(gdx, n_eigen, N_spin, N_k) = 1.0_dp + end if + end if + e_z(gdx, n_eigen, N_spin, N_k) = E_kinetic(gdx, n_eigen, N_spin, N_k) - & + E_transverse(gdx, n_eigen, N_spin, N_k) + if (e_z(gdx, n_eigen, N_spin, N_k) < 0.0_dp) then + e_z(gdx, n_eigen, N_spin, N_k) = 1000.0_dp + end if + end do + end do + end do + end do + + call photo_calculate_delta(delta_temp, .false.) + + do nsymm_op = 1, num_crystal_symmetry_operations + ! make s_inv 2x2 as the inverse of the symmetry operation with A^-1 formula + temp_mat = crystal_symmetry_operations(1:2, 1:2, nsymm_op) + do atom = 1, max_atoms + do N_k = 1, num_kpoints_on_node(my_node_id) + if (index(devel_flag, 'no_symmetry') > 0) then + current_k = kpoint_r_cart(1:2, N_k) + k_prefactor = 1.0_dp/num_crystal_symmetry_operations + else + current_k = matmul(temp_mat, kpoint_r_cart(1:2, N_k)) + k_prefactor = kpoint_weight(N_k)*total_ks/num_crystal_symmetry_operations + end if + x_center = nint(current_k(1)/photo_pmat_bin_width) + xdx_offset + xdx_min = max(x_center - xdx_window, 1) + xdx_max = min(x_center + xdx_window, max_bin_p(1)) + do xdx = xdx_min, xdx_max + gauss_x(xdx) = gaussian(current_k(1), kx_broadening, (xdx - xdx_offset)*photo_pmat_bin_width) + end do + y_center = nint(current_k(2)/photo_pmat_bin_width) + ydx_offset + ydx_min = max(y_center - ydx_window, 1) + ydx_max = min(y_center + ydx_window, max_bin_p(2)) + do ydx = ydx_min, ydx_max + gauss_y(ydx) = gaussian(current_k(2), ky_broadening, (ydx - ydx_offset)*photo_pmat_bin_width) + end do + + do N_spin = 1, nspins ! Loop over spins + do n_eigen_final = 2, nbands + ! if (num_exclude_bands .gt. 1) then + ! if (any(exclude_bands == n_eigen_final)) then + ! cycle + ! end if + ! end if + final_fd = 1 - fermi_dirac(n_eigen_final, N_spin, N_k) + do n_eigen_init = 1, n_eigen_final - 1 + temp_contribution = & + qe_factor*photo_matrix_weights(n_eigen_init, n_eigen_final, N_spin, N_k) & + *delta_temp(n_eigen_init, n_eigen_final, N_spin, N_k)*transmit_prob(n_eigen_final, N_spin, N_k) & + *electrons_per_state*kpoint_weight(N_k)*(I_layer(box_atom(atom), current_photo_energy_index)) & + *vacuum_gauss(n_eigen_final, N_spin, N_k)*fermi_dirac(n_eigen_init, N_spin, N_k)*final_fd & + *(pdos_weights_atoms(n_eigen_init, N_spin, N_k, atom_order(atom)) & + /pdos_weights_k_band(n_eigen_init, N_spin, N_k)) & + *(1.0_dp + field_emission(n_eigen_final, N_spin, N_k)) + do gdx = 1, photo_gk_max_vectors + gk_factor = arpes_mask(gdx, n_eigen_final, N_spin, N_k) & + *gkgrid_weight(gdx, n_eigen_init, N_spin, N_k) & + *electron_esc(gdx, n_eigen_final, N_spin, N_k, atom) & + *transverse_gauss(gdx, n_eigen_init, N_spin, N_k) + qe_contrib = gk_factor*temp_contribution*k_prefactor + total_be_kmat_contribs = total_be_kmat_contribs + qe_contrib + kz = sqrt(wave_prefactor*(e_z(gdx, n_eigen_final, N_spin, N_k)*ev_to_j))*1E-10_dp + z_center = nint(kz/photo_pmat_bin_width) + 1 + zdx_min = max(z_center - zdx_window, 1) + zdx_max = min(z_center + zdx_window, max_bin_p(3)) + do zdx = zdx_min, zdx_max + gauss_z = gaussian(kz, kz_broadening, zdx*photo_pmat_bin_width) + do ydx = ydx_min, ydx_max + do xdx = xdx_min, xdx_max + p_tensor(xdx, ydx, zdx) = p_tensor(xdx, ydx, zdx) + gauss_x(xdx)*gauss_y(ydx)*gauss_z*qe_contrib + end do + end do + end do + end do + end do + end do + end do + end do + end do + end do + + call photo_calculate_delta(delta_temp, .true.) + + do nsymm_op = 1, num_crystal_symmetry_operations + ! make s_inv 2x2 as the inverse of the symmetry operation with A^-1 formula + temp_mat = crystal_symmetry_operations(1:2, 1:2, nsymm_op) + do N_k = 1, num_kpoints_on_node(my_node_id) + if (index(devel_flag, 'no_symmetry') > 0) then + current_k = kpoint_r_cart(1:2, N_k) + k_prefactor = 1.0_dp/num_crystal_symmetry_operations + else + current_k = matmul(temp_mat, kpoint_r_cart(1:2, N_k)) + k_prefactor = kpoint_weight(N_k)*total_ks/num_crystal_symmetry_operations + end if + x_center = nint(current_k(1)/photo_pmat_bin_width) + xdx_offset + xdx_min = max(x_center - xdx_window, 1) + xdx_max = min(x_center + xdx_window, max_bin_p(1)) + do xdx = xdx_min, xdx_max + gauss_x(xdx) = gaussian(current_k(1), kx_broadening, (xdx - xdx_offset)*photo_pmat_bin_width) + end do + y_center = nint(current_k(2)/photo_pmat_bin_width) + ydx_offset + ydx_min = max(y_center - ydx_window, 1) + ydx_max = min(y_center + ydx_window, max_bin_p(2)) + do ydx = ydx_min, ydx_max + gauss_y(ydx) = gaussian(current_k(2), ky_broadening, (ydx - ydx_offset)*photo_pmat_bin_width) + end do + do N_spin = 1, nspins + do n_eigen_final = 2, nbands + ! if (num_exclude_bands .gt. 1) then + ! if (any(exclude_bands == n_eigen_final)) then + ! cycle + ! end if + ! end if + final_fd = 1 - fermi_dirac(n_eigen_final, N_spin, N_k) + do n_eigen_init = 1, n_eigen_final - 1 + temp_contribution = & + (qe_factor*photo_matrix_weights(n_eigen_init, n_eigen_final, N_spin, N_k) & + *delta_temp(n_eigen_init, n_eigen_final, N_spin, N_k) & + *transmit_prob(n_eigen_final, N_spin, N_k) & + *electrons_per_state*kpoint_weight(N_k) & + *vacuum_gauss(n_eigen_final, N_spin, N_k)*fermi_dirac(n_eigen_init, N_spin, N_k)*final_fd & + *(pdos_weights_atoms(n_eigen_init, N_spin, N_k, atom_order(max_atoms)) & + /pdos_weights_k_band(n_eigen_init, N_spin, N_k))) & + *(1.0_dp + field_emission(n_eigen_final, N_spin, N_k)) + do gdx = 1, photo_gk_max_vectors + gk_factor = arpes_mask(gdx, n_eigen_final, N_spin, N_k) & + *gkgrid_weight(gdx, n_eigen_init, N_spin, N_k) & + *electron_esc(gdx, n_eigen_final, N_spin, N_k, max_atoms + 1) & + *transverse_gauss(gdx, n_eigen_init, N_spin, N_k) + qe_contrib = gk_factor*temp_contribution*k_prefactor + total_be_kmat_contribs = total_be_kmat_contribs + qe_contrib + kz = sqrt(wave_prefactor*(e_z(gdx, n_eigen_final, N_spin, N_k)*ev_to_j))*1E-10_dp + z_center = nint(kz/photo_pmat_bin_width) + 1 + zdx_min = max(z_center - zdx_window, 1) + zdx_max = min(z_center + zdx_window, max_bin_p(3)) + do zdx = zdx_min, zdx_max + gauss_z = gaussian(kz, kz_broadening, zdx*photo_pmat_bin_width) + do ydx = ydx_min, ydx_max + do xdx = xdx_min, xdx_max + p_tensor(xdx, ydx, zdx) = p_tensor(xdx, ydx, zdx) + gauss_x(xdx)*gauss_y(ydx)*gauss_z*qe_contrib + end do + end do + end do + end do + end do + end do + end do + end do + end do + end if + if (index(photo_model, '1step') > 0) then + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + do n_eigen = 1, nbands + argument = (band_energy(n_eigen, N_spin, N_k) - efermi)/(kB*photo_temperature) + ! This is a bit of an arbitrary condition, but exp(+-230) ~ 1E(+-100) + ! so this cutoff condition saves us from running into arithmetic + ! issues when computing fermi_dirac due to possible under/over-flow. + if (argument .gt. 230.0_dp) then + fermi_dirac(n_eigen, N_spin, N_k) = 0.0_dp + elseif (argument .lt. -230.0_dp) then + fermi_dirac(n_eigen, N_spin, N_k) = 1.0_dp + else + fermi_dirac(n_eigen, N_spin, N_k) = 1.0_dp/(exp(argument) + 1.0_dp) + end if + + if ((band_energy(n_eigen, N_spin, N_k) + temp_photon_energy) .lt. evacuum_eff) then + vacuum_gauss(n_eigen, N_spin, N_k) = gaussian((band_energy(n_eigen, N_spin, N_k) + temp_photon_energy) + & + scissor_op, width, evacuum_eff)/norm_vac + else + vacuum_gauss(n_eigen, N_spin, N_k) = 1.0_dp + end if + + do gdx = 1, photo_gk_max_vectors + ! evacuum_eff = efermi + photo_work_function + ! Is (photon_energy - transverse energy) > (work_function - E_field_lowering) + ! Is the final kinetic energy > 0? + ekin_temp = temp_photon_energy - E_transverse(gdx, n_eigen, N_spin, N_k) + if (ekin_temp .le. work_function_eff) then + transverse_gauss(gdx, n_eigen, N_spin, N_k) = gaussian(ekin_temp, width, work_function_eff)/norm_vac + else + transverse_gauss(gdx, n_eigen, N_spin, N_k) = 1.0_dp + end if + + if (theta_arpes(gdx, n_eigen, N_spin, N_k) .ge. photo_theta_min .and. & + theta_arpes(gdx, n_eigen, N_spin, N_k) .le. photo_theta_max) then + if (phi_arpes(gdx, n_eigen, N_spin, N_k) .ge. photo_phi_min .and. & + phi_arpes(gdx, n_eigen, N_spin, N_k) .le. photo_phi_max) then + arpes_mask(gdx, n_eigen, N_spin, N_k) = 1.0_dp + end if + end if + e_z(gdx, n_eigen, N_spin, N_k) = E_kinetic(gdx, n_eigen, N_spin, N_k) - E_transverse(gdx, n_eigen, N_spin, N_k) + if (e_z(gdx, n_eigen, N_spin, N_k) < 0.0_dp) then + e_z(gdx, n_eigen, N_spin, N_k) = 1000.0_dp + end if + end do + end do + end do + end do + + do nsymm_op = 1, num_crystal_symmetry_operations + temp_mat = crystal_symmetry_operations(1:2, 1:2, nsymm_op) + + do atom = 1, max_atoms + 1 + do N_k = 1, num_kpoints_on_node(my_node_id) + if (index(devel_flag, 'no_symmetry') > 0) then + current_k = kpoint_r_cart(1:2, N_k) + k_prefactor = 1.0_dp/num_crystal_symmetry_operations + else + current_k = matmul(temp_mat, kpoint_r_cart(1:2, N_k)) + k_prefactor = kpoint_weight(N_k)*total_ks/num_crystal_symmetry_operations + end if + x_center = nint(current_k(1)/photo_pmat_bin_width) + xdx_offset + xdx_min = max(x_center - xdx_window, 1) + xdx_max = min(x_center + xdx_window, max_bin_p(1)) + do xdx = xdx_min, xdx_max + gauss_x(xdx) = gaussian(current_k(1), kx_broadening, (xdx - xdx_offset)*photo_pmat_bin_width) + end do + y_center = nint(current_k(2)/photo_pmat_bin_width) + ydx_offset + ydx_min = max(y_center - ydx_window, 1) + ydx_max = min(y_center + ydx_window, max_bin_p(2)) + do ydx = ydx_min, ydx_max + gauss_y(ydx) = gaussian(current_k(2), ky_broadening, (ydx - ydx_offset)*photo_pmat_bin_width) + end do + do N_spin = 1, nspins + do n_eigen = 1, nbands + temp_contribution = (qe_factor*foptical_matrix_weights(n_eigen, N_spin, N_k) & + *electrons_per_state*kpoint_weight(N_k) & + *I_layer(box_atom(atom), current_photo_energy_index) & + *vacuum_gauss(n_eigen, N_spin, N_k) & + *fermi_dirac(n_eigen, N_spin, N_k) & + *(pdos_weights_atoms(n_eigen, N_spin, N_k, atom_order(atom)) & + /pdos_weights_k_band(n_eigen, N_spin, N_k))) & + *(1.0_dp + field_emission(n_eigen, N_spin, N_k)) + do gdx = 1, photo_gk_max_vectors + gk_factor = arpes_mask(gdx, n_eigen, N_spin, N_k) & + *gkgrid_weight(gdx, n_eigen, N_spin, N_k) & + *electron_esc(gdx, n_eigen, N_spin, N_k, atom) & + *transverse_gauss(gdx, n_eigen, N_spin, N_k) + qe_contrib = gk_factor*temp_contribution*k_prefactor + total_be_kmat_contribs = total_be_kmat_contribs + qe_contrib + kz = sqrt(wave_prefactor*(e_z(gdx, n_eigen, N_spin, N_k)*ev_to_j))*1E-10_dp + z_center = nint(kz/photo_pmat_bin_width) + 1 + zdx_min = max(z_center - zdx_window, 1) + zdx_max = min(z_center + zdx_window, max_bin_p(3)) + do zdx = zdx_min, zdx_max + gauss_z = gaussian(kz, kz_broadening, zdx*photo_pmat_bin_width) + do ydx = ydx_min, ydx_max + do xdx = xdx_min, xdx_max + p_tensor(xdx, ydx, zdx) = p_tensor(xdx, ydx, zdx) + gauss_x(xdx)*gauss_y(ydx)*gauss_z*qe_contrib + end do + end do + end do + end do + end do + end do + end do + end do + end do + end if + + call comms_reduce(p_tensor(1, 1, 1), max_bin_p(1)*max_bin_p(2)*max_bin_p(3), 'SUM') + call comms_reduce(total_be_kmat_contribs, 1, 'SUM') + total_weighted = sum(p_tensor(:, :, :)) + if (total_weighted .gt. 0.0_dp) then + qe_norm = total_be_kmat_contribs/total_weighted + else + qe_norm = 1.0_dp + end if + call comms_bcast(qe_norm, 1) + p_tensor = p_tensor*qe_norm + + if (on_root) then + matrix_unit = io_file_unit() + write (char_e, '(F7.3)') temp_photon_energy + filename = trim(seedname)//'_'//trim(photo_model)//'_'//trim(adjustl(char_e))//'_ptensor.dat' + write (stdout, '(1x,a)') '| Writing out to *SEEDNAME*_'//trim(photo_model)//'_' & + //trim(adjustl(char_e))//'_ptensor.dat' + call io_date(cdate, ctime) + open (unit=matrix_unit, action='write', file=filename) + write (matrix_unit, '(a59,a11,a4,a9)') '## OptaDOS Photoemission: Printing Full Momentum Tensor on ',& + & cdate, ' at ', ctime + write (matrix_unit, '(a13,a)') '## Seedname: ', trim(adjustl(seedname)) + write (matrix_unit, '(a24,a12)') '## Photoemission Model: ', trim(adjustl(photo_model)) + write (matrix_unit, '(a23,f7.3)') '## Photon Energy [eV]: ', temp_photon_energy + write (matrix_unit, '(a21,a15)') '## Optics Geometry : ', trim(adjustl(optics_geom)) + write (matrix_unit, '(a39,3(1x,f10.5))') '## Optics q-dir vector [unnormalised] :', optics_qdir(1:3) + write (matrix_unit, '(a64,2(1x,f7.2))') '## Emission angle theta min, max (w.r.t. surface normal) [deg]: ', & + photo_theta_min, photo_theta_max + write (matrix_unit, '(a54,2(1x,f7.2))') '## Emission angle phi min, max (w.r.t. x-axis) [deg]: ', & + photo_phi_min, photo_phi_max + write (matrix_unit, '(a14,f9.5)') '## Bin width: ', photo_pmat_bin_width + write (matrix_unit, '(a61)') '## Note: x and y are from -k to +k including 0, z is 0 to kz!' + write (matrix_unit, '(a19,3(i7,a3))') '## Matrix Shape: ( ', max_bin_p(1), ' , ', max_bin_p(2), ' , ', max_bin_p(3), ' )' + + write (out_string, '(I0,"(",a,")")') max_bin_p(1), 'E9.1E3' + do zdx = 1, max_bin_p(3) + do ydx = 1, max_bin_p(2) + write (matrix_unit, '('//trim(out_string)//')') (p_tensor(xdx, ydx, zdx), xdx=1, max_bin_p(1)) + end do + end do + close (unit=matrix_unit) + end if + + if (allocated(arpes_mask)) then + deallocate (arpes_mask, stat=ierr) + if (ierr /= 0) call io_error('Error: full_momentum_tensor - failed to deallocate arpes_mask') + end if + if (allocated(binding_temp)) then + deallocate (binding_temp, stat=ierr) + if (ierr /= 0) call io_error('Error: full_momentum_tensor - failed to deallocate binding_temp') + end if + if (allocated(e_z)) then + deallocate (e_z, stat=ierr) + if (ierr /= 0) call io_error('Error: full_momentum_tensor - failed to deallocate e_z') + end if + if (allocated(p_tensor)) then + deallocate (p_tensor, stat=ierr) + if (ierr /= 0) call io_error('Error: full_momentum_tensor - failed to deallocate p_tensor') + end if + if (allocated(gauss_x)) then + deallocate (gauss_x, stat=ierr) + if (ierr /= 0) call io_error('Error: full_momentum_tensor - failed to deallocate gauss_x') + end if + if (allocated(gauss_y)) then + deallocate (gauss_y, stat=ierr) + if (ierr /= 0) call io_error('Error: full_momentum_tensor - failed to deallocate gauss_y') + end if + time1 = io_time() + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a40,19x,f11.3,a8)') '+ Time to calculate full momentum tensor', time1 - time0, ' (sec) +' + write (stdout, '(1x,a78)') '+----------------------------------------------------------------------------+' + call FLUSH (stdout) + end if + end subroutine full_momentum_tensor + + subroutine const_binding_energy_map + !*=============================================================================== + ! This subroutine calculates a map of reciprocal space at a specified binding + ! energy and writes it out to a file. + ! written by Felix Mildner, after Jan 2025 + !=============================================================================== + use od_cell, only: num_kpoints_on_node, cell_calc_kpoint_r_cart, kpoint_r_cart, kpoint_weight, & + kpoint_grid_dim, recip_lattice, num_crystal_symmetry_operations, crystal_symmetry_operations + use od_electronic, only: nbands, nspins, band_energy, efermi, electrons_per_state, transmit_prob + use od_parameters, only: photo_model, photo_theta_min, photo_theta_max, photo_temperature, photo_phi_min, photo_phi_max, & + photo_bindenergy_broadening, photo_gk_max_vectors, scissor_op, iprint, photo_pmat_bin_width, & + devel_flag, optics_geom, optics_qdir, photo_const_bindenergy_value + use od_algorithms, only: gaussian + use od_comms, only: my_node_id, comms_reduce, comms_bcast, on_root + use od_io, only: io_error, io_file_unit, stdout, io_time, io_date, seedname + use od_constants, only: inv_sqrt_two_pi, kB, rad_to_deg, twopi, ev_to_j, e_mass, hbar + implicit none + + real(kind=dp), allocatable, dimension(:, :, :, :) :: delta_temp + real(kind=dp), allocatable, dimension(:, :, :, :) :: binding_temp + real(kind=dp), allocatable, dimension(:, :, :, :) :: arpes_mask + real(kind=dp), allocatable, dimension(:, :, :, :) :: transverse_gauss + real(kind=dp), allocatable, dimension(:, :, :) :: fermi_dirac + real(kind=dp), allocatable, dimension(:, :, :) :: vacuum_gauss + real(kind=dp), allocatable, dimension(:) :: gauss_y, gauss_x + real(kind=dp) :: step(1:2), sub_cell_length(1:2), gauss_e, temp_mat(2, 2), current_k(2), final_fd, ekin_temp, z_max, xy_max + real(kind=dp) :: k_prefactor, ref_level, kx_broadening, ky_broadening, qe_contrib, time0, time1 + real(kind=dp) :: temp_contribution, gk_factor, norm_vac, qe_factor, width, argument, total_weighted, qe_norm + integer :: i, N_k, N_spin, n_eigen_init, n_eigen, n_eigen_final, atom, gdx, ierr + integer :: matrix_unit, nsymm_op, x_center, y_center, xdx, ydx, xdx_min, xdx_max, ydx_min, ydx_max, px_max, py_max + integer :: total_ks, xdx_window, ydx_window, ydx_offset, xdx_offset, window_width + character(len=100) :: out_string + character(len=99) :: filename + character(len=10) :: char_e, char_ref + character(len=9) :: ctime ! Temp. time string + character(len=11) :: cdate ! Temp. date string + + time0 = io_time() + if (on_root) write (stdout, '(1x,a78)') '+------------ Starting Constant Binding Energy Map Calculation --------------+' + + if (.not. allocated(fermi_dirac)) then + allocate (fermi_dirac(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - allocation of fermi_dirac failed') + end if + fermi_dirac = 0.0_dp + + if (.not. allocated(transverse_gauss)) then + allocate (transverse_gauss(photo_gk_max_vectors, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - allocation of transverse_gauss failed') + end if + transverse_gauss = 0.0_dp + + if (.not. allocated(arpes_mask)) then + allocate (arpes_mask(photo_gk_max_vectors, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - allocation of arpes_mask failed') + end if + arpes_mask = 0.0_dp + + if (.not. allocated(vacuum_gauss)) then + allocate (vacuum_gauss(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - allocation of vacuum_gauss failed') + end if + vacuum_gauss = 0.0_dp + + qe_factor = 1.0_dp/(cell_area) + width = kB*photo_temperature + norm_vac = inv_sqrt_two_pi/width + + ! get kinetic energy at efermi for reference + max_e_kinetic = temp_photon_energy - work_function_eff + total_ks = kpoint_grid_dim(1)*kpoint_grid_dim(2) + ref_level = temp_photon_energy - work_function_eff - photo_const_bindenergy_value + do i = 1, 2 + step(i) = 0.5_dp/real(kpoint_grid_dim(i), dp) + sub_cell_length(i) = sqrt(recip_lattice(i, 1)**2 + recip_lattice(i, 2)**2 + recip_lattice(i, 3)**2)*step(i) + end do + ! diagonal distance between MP points in reciprocal space divided by 2*2*sqrt(2*ln(2)) so that + ! the FWHM = 1/2 the step distance between the kpoints + kx_broadening = sub_cell_length(1)/(4.70964009_dp) + ky_broadening = sub_cell_length(2)/(4.70964009_dp) + ! k_broadening = sqrt((2*e_mass*(photo_bindenergy_broadening*0.01_dp*ev_to_j))/(hbar*hbar))*1E-10 + + ! calculate the number of bins to go left and right + ! set to 5 standard deviations (width) of a gaussian function + xdx_window = ceiling(15*kx_broadening/photo_pmat_bin_width) + ydx_window = ceiling(15*ky_broadening/photo_pmat_bin_width) + + call cell_calc_kpoint_r_cart + max_e_kinetic = temp_photon_energy - work_function_eff + z_max = sqrt((2*e_mass*((max_e_kinetic + 0.5)*ev_to_j))/(hbar*hbar))*1E-10 + xy_max = min((abs(maxval(kpoint_r_cart(1:2, :))) + 0.5), z_max) + xdx_offset = ceiling(xy_max/photo_pmat_bin_width) + ydx_offset = ceiling(xy_max/photo_pmat_bin_width) + + call comms_reduce(xdx_offset, 1, "MAX") + call comms_reduce(ydx_offset, 1, "MAX") + call comms_bcast(xdx_offset, 1) + call comms_bcast(ydx_offset, 1) + + px_max = 2*xdx_offset + 1 + py_max = 2*ydx_offset + 1 + ! set up the kx x ky matrix + allocate (kxky_matrix(px_max, py_max), stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - allocation of kxky_matrix failed') + kxky_matrix = 0.0_dp + + if (.not. allocated(gauss_x)) then + allocate (gauss_x(px_max), stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - allocation of gauss_x failed') + end if + gauss_x = 0.0_dp + if (.not. allocated(gauss_y)) then + allocate (gauss_y(py_max), stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - allocation of gauss_y failed') + end if + gauss_y = 0.0_dp + + if (index(photo_model, '3step') > 0) then + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + do n_eigen_init = 1, nbands + argument = (band_energy(n_eigen_init, N_spin, N_k) - efermi)/(kB*photo_temperature) + ! This is a bit of an arbitrary condition, but exp(+-230) ~ 1E(+-100) + ! so this cutoff condition saves us from running into arithmetic + ! issues when computing fermi_dirac due to possible under/over-flow. + if (argument .gt. 230.0_dp) then + fermi_dirac(n_eigen_init, N_spin, N_k) = 0.0_dp + elseif (argument .lt. -230.0_dp) then + fermi_dirac(n_eigen_init, N_spin, N_k) = 1.0_dp + else + fermi_dirac(n_eigen_init, N_spin, N_k) = 1.0_dp/(exp(argument) + 1.0_dp) + end if + ! The vacuum gauss represents the necessary condition: is the final state above E_vacuum? + ! The transverse gauss represents the sufficient condition: after "emission", do we have enough energy for E_ortho > 0? + ! Is the final state energy above the vauum level? + if (band_energy(n_eigen_init, N_spin, N_k) .lt. evacuum_eff) then + vacuum_gauss(n_eigen_init, N_spin, N_k) = gaussian(band_energy(n_eigen_init, N_spin, N_k) + & + scissor_op, width, evacuum_eff)/norm_vac + else + vacuum_gauss(n_eigen_init, N_spin, N_k) = 1.0_dp + end if + ! Is there enough total energy for this kpt/band for E_ortho > 0 after passing through surface potential step + ! (workfunction), evacuum_eff = efermi + work_function_eff + do gdx = 1, photo_gk_max_vectors + ! Is (photon_energy - transverse energy) > (work_function - E_field_lowering) + ! Is the final kinetic energy ortho > 0? + ekin_temp = temp_photon_energy - E_transverse(gdx, n_eigen_init, N_spin, N_k) + if (ekin_temp .le. work_function_eff) then + transverse_gauss(gdx, n_eigen_init, N_spin, N_k) = gaussian(ekin_temp, width, work_function_eff)/norm_vac + else + transverse_gauss(gdx, n_eigen_init, N_spin, N_k) = 1.0_dp + end if + if (theta_arpes(gdx, n_eigen_init, N_spin, N_k) .ge. photo_theta_min .and. & + theta_arpes(gdx, n_eigen_init, N_spin, N_k) .le. photo_theta_max) then + if (phi_arpes(gdx, n_eigen_init, N_spin, N_k) .ge. photo_phi_min .and. & + phi_arpes(gdx, n_eigen_init, N_spin, N_k) .le. photo_phi_max) then + arpes_mask(gdx, n_eigen_init, N_spin, N_k) = 1.0_dp + end if + end if + end do + + end do + end do + end do + + call photo_calculate_delta(delta_temp, .false.) + + do nsymm_op = 1, num_crystal_symmetry_operations + temp_mat = crystal_symmetry_operations(1:2, 1:2, nsymm_op) + do atom = 1, max_atoms + do N_k = 1, num_kpoints_on_node(my_node_id) + if (index(devel_flag, 'no_symmetry') > 0) then + current_k = kpoint_r_cart(1:2, N_k) + k_prefactor = 1.0_dp/num_crystal_symmetry_operations + else + current_k = matmul(temp_mat, kpoint_r_cart(1:2, N_k)) + k_prefactor = kpoint_weight(N_k)*total_ks/num_crystal_symmetry_operations + end if + x_center = nint(current_k(1)/photo_pmat_bin_width) + xdx_offset + xdx_min = max(x_center - xdx_window, 1) + xdx_max = min(x_center + xdx_window, px_max) + do xdx = xdx_min, xdx_max + gauss_x(xdx) = gaussian(current_k(1), kx_broadening, (xdx - xdx_offset)*photo_pmat_bin_width) + end do + y_center = nint(current_k(2)/photo_pmat_bin_width) + ydx_offset + ydx_min = max(y_center - ydx_window, 1) + ydx_max = min(y_center + ydx_window, py_max) + do ydx = ydx_min, ydx_max + gauss_y(ydx) = gaussian(current_k(2), ky_broadening, (ydx - ydx_offset)*photo_pmat_bin_width) + end do + do N_spin = 1, nspins ! Loop over spins + do n_eigen_final = 2, nbands + ! if (num_exclude_bands .gt. 1) then + ! if (any(exclude_bands == n_eigen_final)) then + ! cycle + ! end if + ! end if + final_fd = 1 - fermi_dirac(n_eigen_final, N_spin, N_k) + do n_eigen_init = 1, n_eigen_final - 1 + temp_contribution = & + qe_factor*photo_matrix_weights(n_eigen_init, n_eigen_final, N_spin, N_k) & + *delta_temp(n_eigen_init, n_eigen_final, N_spin, N_k)*transmit_prob(n_eigen_final, N_spin, N_k) & + *electrons_per_state*kpoint_weight(N_k)*(I_layer(box_atom(atom), current_photo_energy_index)) & + *vacuum_gauss(n_eigen_final, N_spin, N_k)*fermi_dirac(n_eigen_init, N_spin, N_k)*final_fd & + *(pdos_weights_atoms(n_eigen_init, N_spin, N_k, atom_order(atom)) & + /pdos_weights_k_band(n_eigen_init, N_spin, N_k)) & + *(1.0_dp + field_emission(n_eigen_final, N_spin, N_k)) + do gdx = 1, photo_gk_max_vectors + gk_factor = arpes_mask(gdx, n_eigen_final, N_spin, N_k) & + *gkgrid_weight(gdx, n_eigen_init, N_spin, N_k) & + *electron_esc(gdx, n_eigen_final, N_spin, N_k, atom) & + *transverse_gauss(gdx, n_eigen_init, N_spin, N_k) + qe_contrib = k_prefactor*temp_contribution*gk_factor + total_be_contribs = total_be_contribs + qe_contrib + gauss_e = gaussian(E_kinetic(gdx, n_eigen_final, N_spin, N_k), photo_bindenergy_broadening, ref_level) + do ydx = ydx_min, ydx_max + do xdx = xdx_min, xdx_max + kxky_matrix(xdx, ydx) = kxky_matrix(xdx, ydx) + gauss_x(xdx)*gauss_y(ydx)*gauss_e*qe_contrib + end do + end do + end do + end do + end do + end do + end do + end do + end do + + call photo_calculate_delta(delta_temp, .true.) + + do nsymm_op = 1, num_crystal_symmetry_operations + temp_mat = crystal_symmetry_operations(1:2, 1:2, nsymm_op) + + do N_k = 1, num_kpoints_on_node(my_node_id) + if (index(devel_flag, 'no_symmetry') > 0) then + current_k = kpoint_r_cart(1:2, N_k) + k_prefactor = 1.0_dp/num_crystal_symmetry_operations + else + current_k = matmul(temp_mat, kpoint_r_cart(1:2, N_k)) + k_prefactor = kpoint_weight(N_k)*total_ks/num_crystal_symmetry_operations + end if + x_center = nint(current_k(1)/photo_pmat_bin_width) + xdx_offset + xdx_min = max(x_center - xdx_window, 1) + xdx_max = min(x_center + xdx_window, px_max) + do xdx = xdx_min, xdx_max + gauss_x(xdx) = gaussian(current_k(1), kx_broadening, (xdx - xdx_offset)*photo_pmat_bin_width) + end do + y_center = nint(current_k(2)/photo_pmat_bin_width) + ydx_offset + ydx_min = max(y_center - ydx_window, 1) + ydx_max = min(y_center + ydx_window, py_max) + do ydx = ydx_min, ydx_max + gauss_y(ydx) = gaussian(current_k(2), ky_broadening, (ydx - ydx_offset)*photo_pmat_bin_width) + end do + do N_spin = 1, nspins ! Loop over spins + do n_eigen_final = 2, nbands + ! if (num_exclude_bands .gt. 1) then + ! if (any(exclude_bands == n_eigen_final)) then + ! cycle + ! end if + ! end if + final_fd = 1 - fermi_dirac(n_eigen_final, N_spin, N_k) + do n_eigen_init = 1, n_eigen_final - 1 + temp_contribution = & + (qe_factor*photo_matrix_weights(n_eigen_init, n_eigen_final, N_spin, N_k) & + *delta_temp(n_eigen_init, n_eigen_final, N_spin, N_k) & + *transmit_prob(n_eigen_final, N_spin, N_k) & + *electrons_per_state*kpoint_weight(N_k) & + *vacuum_gauss(n_eigen_final, N_spin, N_k)*fermi_dirac(n_eigen_init, N_spin, N_k)*final_fd & + *(pdos_weights_atoms(n_eigen_init, N_spin, N_k, atom_order(max_atoms)) & + /pdos_weights_k_band(n_eigen_init, N_spin, N_k))) & + *(1.0_dp + field_emission(n_eigen_final, N_spin, N_k)) + do gdx = 1, photo_gk_max_vectors + gk_factor = arpes_mask(gdx, n_eigen_final, N_spin, N_k) & + *gkgrid_weight(gdx, n_eigen_init, N_spin, N_k) & + *electron_esc(gdx, n_eigen_final, N_spin, N_k, max_atoms + 1) & + *transverse_gauss(gdx, n_eigen_init, N_spin, N_k) + qe_contrib = temp_contribution*gk_factor*k_prefactor + total_be_contribs = total_be_contribs + qe_contrib + gauss_e = gaussian(E_kinetic(gdx, n_eigen_final, N_spin, N_k), photo_bindenergy_broadening, ref_level) + do ydx = ydx_min, ydx_max + do xdx = xdx_min, xdx_max + kxky_matrix(xdx, ydx) = kxky_matrix(xdx, ydx) + gauss_x(xdx)*gauss_y(ydx)*gauss_e*qe_contrib + end do + end do + end do + end do + end do + end do + end do + end do + end if + + if (index(photo_model, '1step') > 0) then + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + do n_eigen = 1, nbands + argument = (band_energy(n_eigen, N_spin, N_k) - efermi)/(kB*photo_temperature) + ! This is a bit of an arbitrary condition, but exp(+-230) ~ 1E(+-100) + ! so this cutoff condition saves us from running into arithmetic + ! issues when computing fermi_dirac due to possible under/over-flow. + if (argument .gt. 230.0_dp) then + fermi_dirac(n_eigen, N_spin, N_k) = 0.0_dp + elseif (argument .lt. -230.0_dp) then + fermi_dirac(n_eigen, N_spin, N_k) = 1.0_dp + else + fermi_dirac(n_eigen, N_spin, N_k) = 1.0_dp/(exp(argument) + 1.0_dp) + end if + + if ((band_energy(n_eigen, N_spin, N_k) + temp_photon_energy) .lt. evacuum_eff) then + vacuum_gauss(n_eigen, N_spin, N_k) = gaussian((band_energy(n_eigen, N_spin, N_k) + temp_photon_energy) + & + scissor_op, width, evacuum_eff)/norm_vac + else + vacuum_gauss(n_eigen, N_spin, N_k) = 1.0_dp + end if + + do gdx = 1, photo_gk_max_vectors + ! evacuum_eff = efermi + photo_work_function + ! Is (photon_energy - transverse energy) > (work_function - E_field_lowering) + ! Is the final kinetic energy > 0? + ekin_temp = temp_photon_energy - E_transverse(gdx, n_eigen, N_spin, N_k) + if (ekin_temp .le. work_function_eff) then + transverse_gauss(gdx, n_eigen, N_spin, N_k) = gaussian(ekin_temp, width, work_function_eff)/norm_vac + else + transverse_gauss(gdx, n_eigen, N_spin, N_k) = 1.0_dp + end if + + if (theta_arpes(gdx, n_eigen, N_spin, N_k) .ge. photo_theta_min .and. & + theta_arpes(gdx, n_eigen, N_spin, N_k) .le. photo_theta_max) then + if (phi_arpes(gdx, n_eigen, N_spin, N_k) .ge. photo_phi_min .and. & + phi_arpes(gdx, n_eigen, N_spin, N_k) .le. photo_phi_max) then + arpes_mask(gdx, n_eigen, N_spin, N_k) = 1.0_dp + end if + end if + end do + end do + end do + end do + + do nsymm_op = 1, num_crystal_symmetry_operations + ! make s_inv 2x2 as the inverse of the symmetry operation with A^-1 formula + temp_mat = crystal_symmetry_operations(1:2, 1:2, nsymm_op) + + do atom = 1, max_atoms + 1 + ! do atom = 1, 1 + do N_k = 1, num_kpoints_on_node(my_node_id) + if (index(devel_flag, 'no_symmetry') > 0) then + current_k = kpoint_r_cart(1:2, N_k) + k_prefactor = 1.0_dp/num_crystal_symmetry_operations + else + current_k = matmul(temp_mat, kpoint_r_cart(1:2, N_k)) + k_prefactor = kpoint_weight(N_k)*total_ks/num_crystal_symmetry_operations + end if + x_center = nint(current_k(1)/photo_pmat_bin_width) + xdx_offset + xdx_min = max(x_center - xdx_window, 1) + xdx_max = min(x_center + xdx_window, px_max) + do xdx = xdx_min, xdx_max + gauss_x(xdx) = gaussian(current_k(1), kx_broadening, (xdx - xdx_offset)*photo_pmat_bin_width) + end do + y_center = nint(current_k(2)/photo_pmat_bin_width) + ydx_offset + ydx_min = max(y_center - ydx_window, 1) + ydx_max = min(y_center + ydx_window, py_max) + do ydx = ydx_min, ydx_max + gauss_y(ydx) = gaussian(current_k(2), ky_broadening, (ydx - ydx_offset)*photo_pmat_bin_width) + end do + do N_spin = 1, nspins + kxkybands: do n_eigen = 1, nbands + temp_contribution = (qe_factor*foptical_matrix_weights(n_eigen, N_spin, N_k) & + *electrons_per_state*kpoint_weight(N_k) & + *I_layer(box_atom(atom), current_photo_energy_index) & + *vacuum_gauss(n_eigen, N_spin, N_k) & + *fermi_dirac(n_eigen, N_spin, N_k) & + *(pdos_weights_atoms(n_eigen, N_spin, N_k, atom_order(atom)) & + /pdos_weights_k_band(n_eigen, N_spin, N_k))) & + *(1.0_dp + field_emission(n_eigen, N_spin, N_k)) + do gdx = 1, photo_gk_max_vectors + ! temp_ekin_upper = E_kinetic(gdx, n_eigen,N_spin,N_k) - 8*photo_bindenergy_broadening + ! temp_ekin_lower = E_kinetic(gdx, n_eigen,N_spin,N_k) + 8*photo_bindenergy_broadening + ! if (temp_ekin_upper .gt. ref_level .or. temp_ekin_lower .lt. ref_level) cycle kxkybands + gk_factor = arpes_mask(gdx, n_eigen, N_spin, N_k) & + *gkgrid_weight(gdx, n_eigen, N_spin, N_k) & + *electron_esc(gdx, n_eigen, N_spin, N_k, atom) & + *transverse_gauss(gdx, n_eigen, N_spin, N_k) + qe_contrib = temp_contribution*gk_factor*k_prefactor + total_be_contribs = total_be_contribs + qe_contrib + gauss_e = gaussian(E_kinetic(gdx, n_eigen, N_spin, N_k), photo_bindenergy_broadening, ref_level) + do ydx = ydx_min, ydx_max + do xdx = xdx_min, xdx_max + kxky_matrix(xdx, ydx) = kxky_matrix(xdx, ydx) + gauss_x(xdx)*gauss_y(ydx)*gauss_e*qe_contrib + end do + end do + end do + end do kxkybands + end do + end do + end do + end do + end if + + call comms_reduce(kxky_matrix(1, 1), px_max*py_max, 'SUM') + call comms_reduce(total_be_contribs, 1, 'SUM') + total_weighted = sum(kxky_matrix(:, :)) + if (total_weighted .gt. 0.0_dp) then + qe_norm = total_be_contribs/total_weighted + else + qe_norm = 1.0_dp + end if + call comms_bcast(qe_norm, 1) + kxky_matrix = kxky_matrix*qe_norm + + if (on_root) then + matrix_unit = io_file_unit() + write (char_e, '(F7.3)') temp_photon_energy + write (char_ref, '(F7.2)') photo_const_bindenergy_value + filename = trim(seedname)//'_'//trim(photo_model)//'_'//trim(adjustl(char_e))//'_ref_'// & + trim(adjustl(char_ref))//'_const_map.dat' + write (stdout, '(1x,a)') '| Writing out to *SEEDNAME*_'//trim(photo_model)// & + '_'//trim(adjustl(char_e))//'_ref_'//trim(adjustl(char_ref))//'_const_map.dat' + open (unit=matrix_unit, action='write', file=filename) + call io_date(cdate, ctime) + write (matrix_unit, '(a66,a11,a4,a9)') '## OptaDOS Photoemission: Printing Constant Binding Energy Map on ',& + & cdate, ' at ', ctime + write (matrix_unit, '(a13,a)') '## Seedname: ', trim(adjustl(seedname)) + write (matrix_unit, '(a24,a8)') '## Photoemission Model: ', trim(adjustl(photo_model)) + write (matrix_unit, '(a23,f7.3)') '## Photon Energy [eV]: ', temp_photon_energy + write (matrix_unit, '(a21,a15)') '## Optics Geometry : ', trim(adjustl(optics_geom)) + write (matrix_unit, '(a39,3(1x,f10.5))') '## Optics q-dir vector [unnormalised] :', optics_qdir(1:3) + write (matrix_unit, '(a64,2(1x,f7.2))') '## Emission angle theta min, max (w.r.t. surface normal) [deg]: ', & + photo_theta_min, photo_theta_max + write (matrix_unit, '(a54,2(1x,f7.2))') '## Emission angle phi min, max (w.r.t. x-axis) [deg]: ', & + photo_phi_min, photo_phi_max + write (matrix_unit, '(a43,f9.5)') '## Kinetic Energy of Electrons shown [eV]: ', ref_level + write (matrix_unit, '(a43,f9.5)') '## Reference Energy of Map (E-E_F) [eV]: ', photo_const_bindenergy_value + write (matrix_unit, '(a23,f9.5)') '## Momentum bin width: ', photo_pmat_bin_width + write (matrix_unit, '(a19,i10,a3,i10,a2)') '## Matrix Shape: ( ', px_max, ' , ', py_max, ' )' + + write (out_string, '(I0,"(1x,",a,")")') px_max, 'ES25.12E3' + do ydx = 1, py_max + write (matrix_unit, '('//trim(out_string)//')') (kxky_matrix(xdx, ydx), xdx=1, px_max) + end do + close (unit=matrix_unit) + end if + + if (allocated(arpes_mask)) then + deallocate (arpes_mask, stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - failed to deallocate arpes_mask') + end if + if (allocated(binding_temp)) then + deallocate (binding_temp, stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - failed to deallocate binding_temp') + end if + if (allocated(kxky_matrix)) then + deallocate (kxky_matrix, stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - deallocation of kxky_matrix failed') + end if + if (allocated(gauss_x)) then + deallocate (gauss_x, stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - failed to deallocate gauss_x') + end if + if (allocated(gauss_y)) then + deallocate (gauss_y, stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - failed to deallocate gauss_y') + end if + + time1 = io_time() + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a45,14x,f11.3,a8)') '+ Time to calculate const. binding energy map', time1 - time0, ' (sec) +' + write (stdout, '(1x,a78)') '+----------------------------------------------------------------------------+' + call FLUSH (stdout) + end if + + end subroutine const_binding_energy_map + + subroutine const_binding_energy_map_gkgrid + !*=============================================================================== + ! This subroutine calculates a map of reciprocal space at a specified binding + ! energy and writes it out to a file. This is the optimised version for the + ! photo_momentum option to allow supercell calculations. + ! written by Felix Mildner, after May 2025 + !=============================================================================== + use od_cell, only: num_kpoints_on_node, cell_calc_kpoint_r_cart, kpoint_r_cart, kpoint_weight, & + kpoint_grid_dim, recip_lattice, num_crystal_symmetry_operations, crystal_symmetry_operations + use od_electronic, only: nbands, nspins, band_energy, efermi, electrons_per_state, transmit_prob, & + photo_gkgrid, elec_read_gk_grid_points + use od_parameters, only: photo_model, photo_theta_min, photo_theta_max, photo_temperature, photo_phi_min, photo_phi_max, & + photo_bindenergy_broadening, photo_gk_max_vectors, scissor_op, iprint, photo_pmat_bin_width, & + devel_flag, optics_geom, optics_qdir, photo_const_bindenergy_value + use od_algorithms, only: gaussian + use od_comms, only: my_node_id, comms_reduce, comms_bcast, on_root + use od_io, only: io_error, io_file_unit, stdout, io_time, io_date, seedname + use od_constants, only: inv_sqrt_two_pi, kB, rad_to_deg, twopi, ev_to_j, e_mass, hbar + implicit none + + real(kind=dp), allocatable, dimension(:, :, :, :) :: delta_temp + real(kind=dp), allocatable, dimension(:, :, :, :) :: binding_temp + real(kind=dp), allocatable, dimension(:, :, :, :) :: arpes_mask + real(kind=dp), allocatable, dimension(:, :, :, :) :: transverse_gauss + real(kind=dp), allocatable, dimension(:, :, :) :: fermi_dirac + real(kind=dp), allocatable, dimension(:, :, :) :: vacuum_gauss + real(kind=dp), allocatable, dimension(:) :: gauss_y, gauss_x + real(kind=dp) :: step(1:2), sub_cell_length(1:2), gauss_e, temp_mat(2, 2), current_k(2), final_fd, ekin_temp, z_max, xy_max + real(kind=dp) :: k_prefactor, ref_level, kx_broadening, ky_broadening, qe_contrib, time0, time1 + real(kind=dp) :: temp_contribution, gk_factor, norm_vac, qe_factor, width, argument, total_weighted, qe_norm + integer :: i, N_k, N_spin, n_eigen_init, n_eigen, n_eigen_final, atom, gdx, ierr + integer :: matrix_unit, nsymm_op, x_center, y_center, xdx, ydx, xdx_min, xdx_max, ydx_min, ydx_max, px_max, py_max + integer :: total_ks, xdx_window, ydx_window, ydx_offset, xdx_offset, window_width + character(len=100) :: out_string + character(len=99) :: filename + character(len=10) :: char_e, char_ref + character(len=9) :: ctime ! Temp. time string + character(len=11) :: cdate ! Temp. date string + + time0 = io_time() + if (on_root) write (stdout, '(1x,a78)') '+------------ Starting Constant Binding Energy Map Calculation --------------+' + + if (.not. allocated(fermi_dirac)) then + allocate (fermi_dirac(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - allocation of fermi_dirac failed') + end if + fermi_dirac = 0.0_dp + + if (.not. allocated(transverse_gauss)) then + allocate (transverse_gauss(photo_gk_max_vectors, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - allocation of transverse_gauss failed') + end if + transverse_gauss = 0.0_dp + + if (.not. allocated(arpes_mask)) then + allocate (arpes_mask(photo_gk_max_vectors, nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - allocation of arpes_mask failed') + end if + arpes_mask = 0.0_dp + + if (.not. allocated(vacuum_gauss)) then + allocate (vacuum_gauss(nbands, nspins, num_kpoints_on_node(my_node_id)), stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - allocation of vacuum_gauss failed') + end if + vacuum_gauss = 0.0_dp + + qe_factor = 1.0_dp/(cell_area) + width = kB*photo_temperature + norm_vac = inv_sqrt_two_pi/width + + ! get kinetic energy at efermi for reference + max_e_kinetic = temp_photon_energy - work_function_eff + total_ks = kpoint_grid_dim(1)*kpoint_grid_dim(2) + ref_level = temp_photon_energy - work_function_eff - photo_const_bindenergy_value + do i = 1, 2 + step(i) = 0.5_dp/real(kpoint_grid_dim(i), dp) + sub_cell_length(i) = sqrt(recip_lattice(i, 1)**2 + recip_lattice(i, 2)**2 + recip_lattice(i, 3)**2)*step(i) + end do + ! diagonal distance between MP points in reciprocal space divided by 2*2*sqrt(2*ln(2)) so that + ! the FWHM = 1/2 the step distance between the kpoints + kx_broadening = sub_cell_length(1)/(4.70964009_dp) + ky_broadening = sub_cell_length(2)/(4.70964009_dp) + ! k_broadening = sqrt((2*e_mass*(photo_bindenergy_broadening*0.01_dp*ev_to_j))/(hbar*hbar))*1E-10 + + ! calculate the number of bins to go left and right + ! set to 5 standard deviations (width) of a gaussian function + xdx_window = ceiling(15*kx_broadening/photo_pmat_bin_width) + ydx_window = ceiling(15*ky_broadening/photo_pmat_bin_width) + + call cell_calc_kpoint_r_cart + max_e_kinetic = temp_photon_energy - work_function_eff + xy_max = sqrt((2*e_mass*((max_e_kinetic + 0.5)*ev_to_j))/(hbar*hbar))*1E-10 + xdx_offset = ceiling(xy_max/photo_pmat_bin_width) + ydx_offset = ceiling(xy_max/photo_pmat_bin_width) + + call elec_read_gk_grid_points(photo_gk_max_vectors) + + px_max = 2*xdx_offset + 1 + py_max = 2*ydx_offset + 1 + + ! set up the kx x ky matrix + allocate (kxky_matrix(px_max, py_max), stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - allocation of kxky_matrix failed') + kxky_matrix = 0.0_dp + + if (.not. allocated(gauss_x)) then + allocate (gauss_x(px_max), stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - allocation of gauss_x failed') + end if + gauss_x = 0.0_dp + if (.not. allocated(gauss_y)) then + allocate (gauss_y(py_max), stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - allocation of gauss_y failed') + end if + gauss_y = 0.0_dp + + if (index(photo_model, '3step') > 0) then + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + do n_eigen_init = 1, nbands + argument = (band_energy(n_eigen_init, N_spin, N_k) - efermi)/(kB*photo_temperature) + ! This is a bit of an arbitrary condition, but exp(+-230) ~ 1E(+-100) + ! so this cutoff condition saves us from running into arithmetic + ! issues when computing fermi_dirac due to possible under/over-flow. + if (argument .gt. 230.0_dp) then + fermi_dirac(n_eigen_init, N_spin, N_k) = 0.0_dp + elseif (argument .lt. -230.0_dp) then + fermi_dirac(n_eigen_init, N_spin, N_k) = 1.0_dp + else + fermi_dirac(n_eigen_init, N_spin, N_k) = 1.0_dp/(exp(argument) + 1.0_dp) + end if + ! The vacuum gauss represents the necessary condition: is the final state above E_vacuum? + ! The transverse gauss represents the sufficient condition: after "emission", do we have enough energy for E_ortho > 0? + ! Is the final state energy above the vauum level? + if (band_energy(n_eigen_init, N_spin, N_k) .lt. evacuum_eff) then + vacuum_gauss(n_eigen_init, N_spin, N_k) = gaussian(band_energy(n_eigen_init, N_spin, N_k) + & + scissor_op, width, evacuum_eff)/norm_vac + else + vacuum_gauss(n_eigen_init, N_spin, N_k) = 1.0_dp + end if + ! Is there enough total energy for this kpt/band for E_ortho > 0 after passing through surface potential step + ! (workfunction), evacuum_eff = efermi + work_function_eff + do gdx = 1, photo_gk_max_vectors + ! Is (photon_energy - transverse energy) > (work_function - E_field_lowering) + ! Is the final kinetic energy ortho > 0? + ekin_temp = temp_photon_energy - E_transverse(gdx, n_eigen_init, N_spin, N_k) + if (ekin_temp .le. work_function_eff) then + transverse_gauss(gdx, n_eigen_init, N_spin, N_k) = gaussian(ekin_temp, width, work_function_eff)/norm_vac + else + transverse_gauss(gdx, n_eigen_init, N_spin, N_k) = 1.0_dp + end if + if (theta_arpes(gdx, n_eigen_init, N_spin, N_k) .ge. photo_theta_min .and. & + theta_arpes(gdx, n_eigen_init, N_spin, N_k) .le. photo_theta_max) then + if (phi_arpes(gdx, n_eigen_init, N_spin, N_k) .ge. photo_phi_min .and. & + phi_arpes(gdx, n_eigen_init, N_spin, N_k) .le. photo_phi_max) then + arpes_mask(gdx, n_eigen_init, N_spin, N_k) = 1.0_dp + end if + end if + end do + + end do + end do + end do + + call photo_calculate_delta(delta_temp, .false.) + + do nsymm_op = 1, num_crystal_symmetry_operations + temp_mat = crystal_symmetry_operations(1:2, 1:2, nsymm_op) + do atom = 1, max_atoms + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins ! Loop over spins + do n_eigen_final = 2, nbands + ! if (num_exclude_bands .gt. 1) then + ! if (any(exclude_bands == n_eigen_final)) then + ! cycle + ! end if + ! end if + final_fd = 1 - fermi_dirac(n_eigen_final, N_spin, N_k) + do n_eigen_init = 1, n_eigen_final - 1 + temp_contribution = & + qe_factor*photo_matrix_weights(n_eigen_init, n_eigen_final, N_spin, N_k) & + *delta_temp(n_eigen_init, n_eigen_final, N_spin, N_k)*transmit_prob(n_eigen_final, N_spin, N_k) & + *electrons_per_state*kpoint_weight(N_k)*(I_layer(box_atom(atom), current_photo_energy_index)) & + *vacuum_gauss(n_eigen_final, N_spin, N_k)*fermi_dirac(n_eigen_init, N_spin, N_k)*final_fd & + *(pdos_weights_atoms(n_eigen_init, N_spin, N_k, atom_order(atom)) & + /pdos_weights_k_band(n_eigen_init, N_spin, N_k)) & + *(1.0_dp + field_emission(n_eigen_final, N_spin, N_k)) + do gdx = 1, photo_gk_max_vectors + gk_factor = arpes_mask(gdx, n_eigen_final, N_spin, N_k) & + *gkgrid_weight(gdx, n_eigen_init, N_spin, N_k) & + *electron_esc(gdx, n_eigen_final, N_spin, N_k, atom) & + *transverse_gauss(gdx, n_eigen_init, N_spin, N_k) + current_k = matmul(temp_mat, photo_gkgrid(1:2, gdx, n_eigen_init, N_spin, N_k)) + k_prefactor = kpoint_weight(N_k)*total_ks/num_crystal_symmetry_operations + qe_contrib = k_prefactor*temp_contribution*gk_factor + total_be_contribs = total_be_contribs + qe_contrib + + x_center = nint(current_k(1)/photo_pmat_bin_width) + xdx_offset + xdx_min = max(x_center - xdx_window, 1) + xdx_max = min(x_center + xdx_window, px_max) + do xdx = xdx_min, xdx_max + gauss_x(xdx) = gaussian(current_k(1), kx_broadening, (xdx - xdx_offset)*photo_pmat_bin_width) + end do + y_center = nint(current_k(2)/photo_pmat_bin_width) + ydx_offset + ydx_min = max(y_center - ydx_window, 1) + ydx_max = min(y_center + ydx_window, py_max) + do ydx = ydx_min, ydx_max + gauss_y(ydx) = gaussian(current_k(2), ky_broadening, (ydx - ydx_offset)*photo_pmat_bin_width) + end do + gauss_e = gaussian(E_kinetic(gdx, n_eigen_final, N_spin, N_k), photo_bindenergy_broadening, ref_level) + do ydx = ydx_min, ydx_max + do xdx = xdx_min, xdx_max + kxky_matrix(xdx, ydx) = kxky_matrix(xdx, ydx) + gauss_x(xdx)*gauss_y(ydx)*gauss_e*qe_contrib + end do + end do + end do + end do + end do + end do + end do + end do + end do + + call photo_calculate_delta(delta_temp, .true.) + + do nsymm_op = 1, num_crystal_symmetry_operations + temp_mat = crystal_symmetry_operations(1:2, 1:2, nsymm_op) + + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins ! Loop over spins + do n_eigen_final = 2, nbands + ! if (num_exclude_bands .gt. 1) then + ! if (any(exclude_bands == n_eigen_final)) then + ! cycle + ! end if + ! end if + final_fd = 1 - fermi_dirac(n_eigen_final, N_spin, N_k) + do n_eigen_init = 1, n_eigen_final - 1 + temp_contribution = & + (qe_factor*photo_matrix_weights(n_eigen_init, n_eigen_final, N_spin, N_k) & + *delta_temp(n_eigen_init, n_eigen_final, N_spin, N_k) & + *transmit_prob(n_eigen_final, N_spin, N_k) & + *electrons_per_state*kpoint_weight(N_k) & + *vacuum_gauss(n_eigen_final, N_spin, N_k)*fermi_dirac(n_eigen_init, N_spin, N_k)*final_fd & + *(pdos_weights_atoms(n_eigen_init, N_spin, N_k, atom_order(max_atoms)) & + /pdos_weights_k_band(n_eigen_init, N_spin, N_k))) & + *(1.0_dp + field_emission(n_eigen_final, N_spin, N_k)) + do gdx = 1, photo_gk_max_vectors + gk_factor = arpes_mask(gdx, n_eigen_final, N_spin, N_k) & + *gkgrid_weight(gdx, n_eigen_init, N_spin, N_k) & + *electron_esc(gdx, n_eigen_final, N_spin, N_k, max_atoms + 1) & + *transverse_gauss(gdx, n_eigen_init, N_spin, N_k) + current_k = matmul(temp_mat, photo_gkgrid(1:2, gdx, n_eigen_init, N_spin, N_k)) + k_prefactor = kpoint_weight(N_k)*total_ks/num_crystal_symmetry_operations + qe_contrib = temp_contribution*gk_factor*k_prefactor + total_be_contribs = total_be_contribs + qe_contrib + + x_center = nint(current_k(1)/photo_pmat_bin_width) + xdx_offset + xdx_min = max(x_center - xdx_window, 1) + xdx_max = min(x_center + xdx_window, px_max) + do xdx = xdx_min, xdx_max + gauss_x(xdx) = gaussian(current_k(1), kx_broadening, (xdx - xdx_offset)*photo_pmat_bin_width) + end do + y_center = nint(current_k(2)/photo_pmat_bin_width) + ydx_offset + ydx_min = max(y_center - ydx_window, 1) + ydx_max = min(y_center + ydx_window, py_max) + do ydx = ydx_min, ydx_max + gauss_y(ydx) = gaussian(current_k(2), ky_broadening, (ydx - ydx_offset)*photo_pmat_bin_width) + end do + gauss_e = gaussian(E_kinetic(gdx, n_eigen_final, N_spin, N_k), photo_bindenergy_broadening, ref_level) + do ydx = ydx_min, ydx_max + do xdx = xdx_min, xdx_max + kxky_matrix(xdx, ydx) = kxky_matrix(xdx, ydx) + gauss_x(xdx)*gauss_y(ydx)*gauss_e*qe_contrib + end do + end do + end do + end do + end do + end do + end do + end do + end if + + if (index(photo_model, '1step') > 0) then + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + do n_eigen = 1, nbands + argument = (band_energy(n_eigen, N_spin, N_k) - efermi)/(kB*photo_temperature) + ! This is a bit of an arbitrary condition, but exp(+-230) ~ 1E(+-100) + ! so this cutoff condition saves us from running into arithmetic + ! issues when computing fermi_dirac due to possible under/over-flow. + if (argument .gt. 230.0_dp) then + fermi_dirac(n_eigen, N_spin, N_k) = 0.0_dp + elseif (argument .lt. -230.0_dp) then + fermi_dirac(n_eigen, N_spin, N_k) = 1.0_dp + else + fermi_dirac(n_eigen, N_spin, N_k) = 1.0_dp/(exp(argument) + 1.0_dp) + end if + + if ((band_energy(n_eigen, N_spin, N_k) + temp_photon_energy) .lt. evacuum_eff) then + vacuum_gauss(n_eigen, N_spin, N_k) = gaussian((band_energy(n_eigen, N_spin, N_k) + temp_photon_energy) + & + scissor_op, width, evacuum_eff)/norm_vac + else + vacuum_gauss(n_eigen, N_spin, N_k) = 1.0_dp + end if + + do gdx = 1, photo_gk_max_vectors + ! evacuum_eff = efermi + photo_work_function + ! Is (photon_energy - transverse energy) > (work_function - E_field_lowering) + ! Is the final kinetic energy > 0? + ekin_temp = temp_photon_energy - E_transverse(gdx, n_eigen, N_spin, N_k) + if (ekin_temp .le. work_function_eff) then + transverse_gauss(gdx, n_eigen, N_spin, N_k) = gaussian(ekin_temp, width, work_function_eff)/norm_vac + else + transverse_gauss(gdx, n_eigen, N_spin, N_k) = 1.0_dp + end if + + if (theta_arpes(gdx, n_eigen, N_spin, N_k) .ge. photo_theta_min .and. & + theta_arpes(gdx, n_eigen, N_spin, N_k) .le. photo_theta_max) then + if (phi_arpes(gdx, n_eigen, N_spin, N_k) .ge. photo_phi_min .and. & + phi_arpes(gdx, n_eigen, N_spin, N_k) .le. photo_phi_max) then + arpes_mask(gdx, n_eigen, N_spin, N_k) = 1.0_dp + end if + end if + end do + end do + end do + end do + + do nsymm_op = 1, num_crystal_symmetry_operations + ! make s_inv 2x2 as the inverse of the symmetry operation with A^-1 formula + temp_mat = crystal_symmetry_operations(1:2, 1:2, nsymm_op) + + do atom = 1, max_atoms + 1 + ! do atom = 1, 1 + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + kxkybands: do n_eigen = 1, nbands + temp_contribution = (qe_factor*foptical_matrix_weights(n_eigen, N_spin, N_k) & + *electrons_per_state*kpoint_weight(N_k) & + *I_layer(box_atom(atom), current_photo_energy_index) & + *vacuum_gauss(n_eigen, N_spin, N_k) & + *fermi_dirac(n_eigen, N_spin, N_k) & + *(pdos_weights_atoms(n_eigen, N_spin, N_k, atom_order(atom)) & + /pdos_weights_k_band(n_eigen, N_spin, N_k))) & + *(1.0_dp + field_emission(n_eigen, N_spin, N_k)) + do gdx = 1, photo_gk_max_vectors + ! temp_ekin_upper = E_kinetic(gdx, n_eigen,N_spin,N_k) - 8*photo_bindenergy_broadening + ! temp_ekin_lower = E_kinetic(gdx, n_eigen,N_spin,N_k) + 8*photo_bindenergy_broadening + ! if (temp_ekin_upper .gt. ref_level .or. temp_ekin_lower .lt. ref_level) cycle kxkybands + gk_factor = arpes_mask(gdx, n_eigen, N_spin, N_k) & + *gkgrid_weight(gdx, n_eigen, N_spin, N_k) & + *electron_esc(gdx, n_eigen, N_spin, N_k, atom) & + *transverse_gauss(gdx, n_eigen, N_spin, N_k) + + current_k = matmul(temp_mat, photo_gkgrid(1:2, gdx, n_eigen, N_spin, N_k)) + k_prefactor = kpoint_weight(N_k)*total_ks/num_crystal_symmetry_operations + qe_contrib = temp_contribution*gk_factor*k_prefactor + total_be_contribs = total_be_contribs + qe_contrib + + x_center = nint(current_k(1)/photo_pmat_bin_width) + xdx_offset + xdx_min = max(x_center - xdx_window, 1) + xdx_max = min(x_center + xdx_window, px_max) + do xdx = xdx_min, xdx_max + gauss_x(xdx) = gaussian(current_k(1), kx_broadening, (xdx - xdx_offset)*photo_pmat_bin_width) + end do + y_center = nint(current_k(2)/photo_pmat_bin_width) + ydx_offset + ydx_min = max(y_center - ydx_window, 1) + ydx_max = min(y_center + ydx_window, py_max) + do ydx = ydx_min, ydx_max + gauss_y(ydx) = gaussian(current_k(2), ky_broadening, (ydx - ydx_offset)*photo_pmat_bin_width) + end do + gauss_e = gaussian(E_kinetic(gdx, n_eigen, N_spin, N_k), photo_bindenergy_broadening, ref_level) + do ydx = ydx_min, ydx_max + do xdx = xdx_min, xdx_max + kxky_matrix(xdx, ydx) = kxky_matrix(xdx, ydx) + gauss_x(xdx)*gauss_y(ydx)*gauss_e*qe_contrib + end do + end do + end do + end do kxkybands + end do + end do + end do + end do + end if + + call comms_reduce(kxky_matrix(1, 1), px_max*py_max, 'SUM') + call comms_reduce(total_be_contribs, 1, 'SUM') + total_weighted = sum(kxky_matrix(:, :)) + if (total_weighted .gt. 0.0_dp) then + qe_norm = total_be_contribs/total_weighted + else + qe_norm = 1.0_dp + end if + call comms_bcast(qe_norm, 1) + kxky_matrix = kxky_matrix*qe_norm + + if (on_root) then + matrix_unit = io_file_unit() + write (char_e, '(F7.3)') temp_photon_energy + write (char_ref, '(F7.2)') photo_const_bindenergy_value + filename = trim(seedname)//'_'//trim(photo_model)//'_'//trim(adjustl(char_e))//'_ref_'// & + trim(adjustl(char_ref))//'_const_map.dat' + write (stdout, '(1x,a)') '| Writing out to *SEEDNAME*_'//trim(photo_model)// & + '_'//trim(adjustl(char_e))//'_ref_'//trim(adjustl(char_ref))//'_const_map.dat' + open (unit=matrix_unit, action='write', file=filename) + call io_date(cdate, ctime) + write (matrix_unit, '(a66,a11,a4,a9)') '## OptaDOS Photoemission: Printing Constant Binding Energy Map on ',& + & cdate, ' at ', ctime + write (matrix_unit, '(a13,a)') '## Seedname: ', trim(adjustl(seedname)) + write (matrix_unit, '(a24,a8)') '## Photoemission Model: ', trim(adjustl(photo_model)) + write (matrix_unit, '(a23,f7.3)') '## Photon Energy [eV]: ', temp_photon_energy + write (matrix_unit, '(a21,a15)') '## Optics Geometry : ', trim(adjustl(optics_geom)) + write (matrix_unit, '(a39,3(1x,f10.5))') '## Optics q-dir vector [unnormalised] :', optics_qdir(1:3) + write (matrix_unit, '(a64,2(1x,f7.2))') '## Emission angle theta min, max (w.r.t. surface normal) [deg]: ', & + photo_theta_min, photo_theta_max + write (matrix_unit, '(a54,2(1x,f7.2))') '## Emission angle phi min, max (w.r.t. x-axis) [deg]: ', & + photo_phi_min, photo_phi_max + write (matrix_unit, '(a43,f9.5)') '## Kinetic Energy of Electrons shown [eV]: ', ref_level + write (matrix_unit, '(a43,f9.5)') '## Reference Energy of Map (E-E_F) [eV]: ', photo_const_bindenergy_value + write (matrix_unit, '(a23,f9.5)') '## Momentum bin width: ', photo_pmat_bin_width + write (matrix_unit, '(a19,i10,a3,i10,a2)') '## Matrix Shape: ( ', px_max, ' , ', py_max, ' )' + + write (out_string, '(I0,"(1x,",a,")")') px_max, 'ES25.12E3' + do ydx = 1, py_max + write (matrix_unit, '('//trim(out_string)//')') (kxky_matrix(xdx, ydx), xdx=1, px_max) + end do + close (unit=matrix_unit) + end if + + if (allocated(arpes_mask)) then + deallocate (arpes_mask, stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - failed to deallocate arpes_mask') + end if + if (allocated(binding_temp)) then + deallocate (binding_temp, stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - failed to deallocate binding_temp') + end if + if (allocated(kxky_matrix)) then + deallocate (kxky_matrix, stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - deallocation of kxky_matrix failed') + end if + if (allocated(gauss_x)) then + deallocate (gauss_x, stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - failed to deallocate gauss_x') + end if + if (allocated(gauss_y)) then + deallocate (gauss_y, stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - failed to deallocate gauss_y') + end if + if (allocated(photo_gkgrid)) then + deallocate (photo_gkgrid, stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - failed to deallocate photo_gkgrid') + end if + + time1 = io_time() + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a45,14x,f11.3,a8)') '+ Time to calculate const. binding energy map', time1 - time0, ' (sec) +' + write (stdout, '(1x,a78)') '+----------------------------------------------------------------------------+' + call FLUSH (stdout) + end if + + end subroutine const_binding_energy_map_gkgrid + + subroutine write_qe_tensor + !*=============================================================================== + ! This subroutine writes either the transverse energy or the binding energy + ! after the Gaussian broadening has been applied. + ! orig. Victor Chang, 7 February 2020 + ! edited Felix Mildner, after April 2023 + !=============================================================================== + use od_cell, only: num_kpoints_on_node, cell_calc_kpoint_r_cart + use od_electronic, only: nbands, nspins + use od_comms, only: my_node_id, on_root, num_nodes, comms_send, comms_recv, root_id, comms_reduce, comms_bcast + use od_io, only: io_error, seedname, io_file_unit, io_date, io_time, stdout + use od_parameters, only: photo_model, iprint, devel_flag, optics_geom, optics_qdir + implicit none + + integer :: atom, ierr, matrix_unit + integer :: N_k, N_spin, n_eigen, kpt_total, band_num + character(len=99) :: filename + character(len=100) :: out_string + character(len=10) :: char_e + character(len=9) :: ctime ! Temp. time string + character(len=11) :: cdate ! Temp. date string + real(kind=dp) :: time0, time1 + + time0 = io_time() + + call cell_calc_kpoint_r_cart + kpt_total = sum(num_kpoints_on_node(0:num_nodes - 1)) + if (num_nodes .gt. 1) then + call write_distributed_qe_data(kpt_total) + else + matrix_unit = io_file_unit() + write (char_e, '(F7.3)') temp_photon_energy + if (index(devel_flag, 'final') > 0 .and. index(photo_model, '3step') > 0) then + filename = trim(seedname)//'_'//trim(photo_model)//'_'//trim(adjustl(char_e))//'_qe_tensor_final.dat' + else + filename = trim(seedname)//'_'//trim(photo_model)//'_'//trim(adjustl(char_e))//'_qe_tensor.dat' + end if + open (unit=matrix_unit, action='write', file=filename) + call io_date(cdate, ctime) + write (matrix_unit, '(a53,a11,a4,a9)') '## OptaDOS Photoemission: Printing Full QE tensor on ',& + & cdate, ' at ', ctime + write (matrix_unit, '(a13,a)') '## Seedname: ', trim(adjustl(seedname)) + write (matrix_unit, '(a24,a12)') '## Photoemission Model: ', trim(adjustl(photo_model)) + write (matrix_unit, '(a23,f7.3)') '## Photon Energy [eV]: ', temp_photon_energy + write (matrix_unit, '(a21,a15)') '## Optics Geometry : ', trim(adjustl(optics_geom)) + write (matrix_unit, '(a39,3(1x,f10.5))') '## Optics q-dir vector [unnormalised] :', optics_qdir(1:3) + if (index(devel_flag, 'final') > 0 .and. index(photo_model, '3step') > 0) then + write (matrix_unit, '(a69)') '## Writing the contributions of excitations into the !!FINAL!! states' + end if + write (matrix_unit, '(a61,a,a6)') '## Find band energies and fractional k-point coordinates in: ', trim(seedname), '.bands' + ! Printing out the info on root_node + write (out_string, '(I0,"(1x,",a,")")') nbands, 'ES16.8E3' + + if (index(photo_model, '3step') > 0) then + if (index(devel_flag, 'single') > 0) then + n_eigen = len_trim(devel_flag) + read (devel_flag(n_eigen - 2:n_eigen), *) band_num + write (matrix_unit, '(a42,1x,I3)') '## Writing contributions into final band #', band_num + write (matrix_unit, '(a31,4(1x,I5),1x,1a)') '## (Reduced) QE Matrix Shape: (', nbands, nspins, kpt_total, max_atoms,& + & ')' + do atom = 1, max_atoms + 1 + if (atom .eq. max_atoms + 1) write (matrix_unit, '(a21)') '## Bulk Contribution:' + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + write (matrix_unit, '('//trim(out_string)//')') & + (qe_tsm(n_eigen, band_num, N_spin, N_k, atom), n_eigen=1, nbands) + end do + end do + end do + else if (index(devel_flag, 'final') > 0) then + write (matrix_unit, '(a79)') '## (Reduced) QE Matrix where each row contains the contributions from each band' + write (matrix_unit, '(a39)') '## at a certain k-point, spin, and atom' + write (matrix_unit, '(a31,4(1x,I5),1x,1a)') '## (Reduced) QE Matrix Shape: (', nbands, nspins, kpt_total, max_atoms,& + & ')' + do atom = 1, max_atoms + 1 + if (atom .eq. max_atoms + 1) write (matrix_unit, '(a21)') '## Bulk Contribution:' + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + write (matrix_unit, '('//trim(out_string)//')') & + (sum(qe_tsm(1:nbands, n_eigen, N_spin, N_k, atom)), n_eigen=1, nbands) + end do + end do + end do + else + write (matrix_unit, '(a79)') '## (Reduced) QE Matrix where each row contains the contributions from each band' + write (matrix_unit, '(a39)') '## at a certain k-point, spin, and atom' + write (matrix_unit, '(a31,4(1x,I5),1x,1a)') '## (Reduced) QE Matrix Shape: (', nbands, nspins, kpt_total, max_atoms,& + & ')' + do atom = 1, max_atoms + 1 + if (atom .eq. max_atoms + 1) write (matrix_unit, '(a21)') '## Bulk Contribution:' + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + write (matrix_unit, '('//trim(out_string)//')') & + (sum(qe_tsm(n_eigen, 1:nbands, N_spin, N_k, atom)), n_eigen=1, nbands) + end do + end do + end do + end if + elseif (index(photo_model, '1step') > 0) then + write (matrix_unit, '(a79)') '## (Reduced) QE Matrix where each row contains the contributions from each band' + write (matrix_unit, '(a39)') '## at a certain k-point, spin, and atom' + write (matrix_unit, '(1x,a31,4(1x,I5),1x,1a)') '## (Reduced) QE Matrix Shape: (', nbands, nspins, kpt_total, max_atoms,& + & ')' + do atom = 1, max_atoms + 1 + if (atom .eq. max_atoms + 1) write (matrix_unit, '(a21)') '## Bulk Contribution:' + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + write (matrix_unit, '('//trim(out_string)//')') (qe_osm(n_eigen, N_spin, N_k, atom), n_eigen=1, nbands) + end do + end do + end do + end if + close (unit=matrix_unit) + end if + + time1 = io_time() + if (on_root .and. iprint > 1) then + write (stdout, '(1x,a78)') '+----------------------------------------------------------------------------+' + write (stdout, '(1x,a37,21x,f11.3,a8)') '+ Time to write the qe tensor to file', time1 - time0, ' (sec) +' + end if + + end subroutine write_qe_tensor + + subroutine write_distributed_qe_data(kpt_total) + !* This subroutine writes the distributed qe tensor to a single file. + ! To save on required memory the output file is accessed by each MPI process in turn + ! and writes its values/contents one after the other. + ! F. Mildner, June 2023 + use od_cell, only: num_kpoints_on_node, cell_calc_kpoint_r_cart + use od_electronic, only: nspins, nbands + use od_comms, only: my_node_id, on_root, num_nodes, comms_send, comms_recv, root_id, comms_bcast + use od_io, only: io_error, io_file_unit, io_date, io_time, seedname + use od_parameters, only: photo_model, devel_flag + + implicit none + real(kind=dp), dimension(:, :, :), allocatable :: qe_mat_temp + real(kind=dp), dimension(:, :, :, :), allocatable :: tsm_reduced + real(kind=dp), dimension(:, :, :, :), allocatable :: osm_reduced + integer, intent(in) :: kpt_total + character(len=99) :: filename + character(len=100) :: out_string + character(len=10) :: char_e + character(len=9) :: ctime ! Temp. time string + character(len=11) :: cdate ! Temp. date string + integer:: N_k, N_spin, n_eigen, atom, token, matrix_unit, ierr, inode + + ! On root open file and write header + if (on_root) then + ! Writing header to output file + write (char_e, '(F7.3)') temp_photon_energy + if (index(devel_flag, 'final') > 0 .and. index(photo_model, '3step') > 0) then + filename = trim(seedname)//'_'//trim(photo_model)//'_'//trim(adjustl(char_e))//'_qe_tensor_final.dat' + else + filename = trim(seedname)//'_'//trim(photo_model)//'_'//trim(adjustl(char_e))//'_qe_tensor.dat' + end if + matrix_unit = io_file_unit() + open (unit=matrix_unit, action='write', file=filename) + call io_date(cdate, ctime) + write (matrix_unit, *) '## OptaDOS Photoemission: Printing QE Matrix on ', cdate, ' at ', ctime + write (matrix_unit, *) '## Seedname: ', trim(seedname) + write (matrix_unit, *) '## Photoemission Model: ', trim(photo_model) + write (matrix_unit, *) '## Photon Energy: ', trim(adjustl(char_e)) + write (matrix_unit, *) '## Find band energies and fractional k-point coordinates in: ', trim(seedname), '.bands' + write (matrix_unit, *) '## (Reduced) QE Matrix where each row contains the contributions from each band' + write (matrix_unit, *) '## at a certain k-point, spin, and atom' + write (matrix_unit, '(1x,a31,4(1x,I5),1x,1a)') '## (Reduced) QE Matrix Shape: (', nbands, nspins, kpt_total, & + max_atoms + 1, ')' + allocate (qe_mat_temp(nbands, nspins, num_kpoints_on_node(0)), stat=ierr) + if (ierr /= 0) call io_error('Error: write_distributed_qe_data - failed to allocate qe_mat_temp on root') + token = -1 + end if + write (out_string, '(I0,"(1x,",a,")")') nbands, 'ES16.8E3' + + ! allocate and sum the 3step qe matrix on non-root + if (.not. on_root) then + if (index(photo_model, '3step') > 0) then + allocate (tsm_reduced(nbands, nspins, num_kpoints_on_node(0), max_atoms + 1), stat=ierr) + if (ierr /= 0) call io_error('Error: write_distributed_qe_data - failed to allocate tsm_reduced') + if (index(devel_flag, 'final') > 0) then + tsm_reduced = sum(qe_tsm, dim=1) + else + tsm_reduced = sum(qe_tsm, dim=2) + end if + else if (index(photo_model, '1step') > 0) then + allocate (osm_reduced(nbands, nspins, num_kpoints_on_node(0), max_atoms + 1), stat=ierr) + if (ierr /= 0) call io_error('Error: write_distributed_qe_data - failed to allocate tsm_reduced') + osm_reduced = qe_osm + end if + end if + ! For each atom until max_atoms+1 + do atom = 1, max_atoms + 1 + ! On non root nodes + if (.not. on_root) then + ! - wait for the token + call comms_recv(token, 1, 0) + ! - send the respective qe_matrix for that specific atom + if (index(photo_model, '3step') > 0) then + call comms_send(tsm_reduced(1, 1, 1, atom), nbands*nspins*num_kpoints_on_node(my_node_id), 0) + elseif (index(photo_model, '1step') > 0) then + call comms_send(osm_reduced(1, 1, 1, atom), nbands*nspins*num_kpoints_on_node(my_node_id), 0) + end if + ! - send token back to root node + call comms_send(token, 1, 0) + ! On root node + elseif (on_root) then + do inode = 1, num_nodes - 1 + ! - send to the token to notes in turn + call comms_send(token, 1, inode) + ! - receive the qe_matrix from the other notes and write it to the file + call comms_recv(qe_mat_temp(1, 1, 1), nbands*nspins*num_kpoints_on_node(inode), inode) + ! write out the qe_matrix to the file + do N_k = 1, num_kpoints_on_node(inode) + do N_spin = 1, nspins + write (matrix_unit, '('//trim(out_string)//')') (qe_mat_temp(n_eigen, N_spin, N_k), n_eigen=1, nbands) + end do + end do + ! - receive the token from a node + call comms_recv(token, 1, inode) + end do + ! - write root qe_matrix elements + if (index(photo_model, '3step') > 0) then + if (index(devel_flag, 'final') > 0) then + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + write (matrix_unit, '('//trim(out_string)//')') & + (sum(qe_tsm(1:nbands, n_eigen, N_spin, N_k, atom)), n_eigen=1, nbands) + end do + end do + else + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + write (matrix_unit, '('//trim(out_string)//')') & + (sum(qe_tsm(n_eigen, 1:nbands, N_spin, N_k, atom)), n_eigen=1, nbands) + end do + end do + end if + elseif (index(photo_model, '1step') > 0) then + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + write (matrix_unit, '('//trim(out_string)//')') & + (qe_osm(n_eigen, N_spin, N_k, atom), n_eigen=1, nbands) + end do + end do + end if + ! Write header for bulk contrib using root node + if (atom .eq. max_atoms) write (matrix_unit, '(1x,a21)') '## Bulk Contribution:' + end if + end do + if (on_root) then + close (unit=matrix_unit) + deallocate (qe_mat_temp, stat=ierr) + if (ierr /= 0) call io_error('Error: write_distributed_qe_data - failed to deallocate qe_mat_temp') + elseif (.not. on_root) then + if (index(photo_model, '3step') > 0) then + deallocate (tsm_reduced, stat=ierr) + if (ierr /= 0) call io_error('Error: write_distributed_qe_data - failed to deallocate tsm_reduced') + end if + end if + end subroutine write_distributed_qe_data + + subroutine write_distributed_fem_data(kpt_total) + !*************************************************************** + ! This subroutine writes the distributed free electron matrix element tensor to a single file. + ! To save on required memory the output file is accessed by each MPI process in turn + ! and writes its values/contents one after the other. + ! F. Mildner, June 2023 + + use od_cell, only: num_kpoints_on_node, cell_calc_kpoint_r_cart + use od_electronic, only: nspins, nbands + use od_comms, only: my_node_id, on_root, num_nodes, comms_send, comms_recv, root_id, comms_bcast + use od_io, only: io_error, io_file_unit, io_date, io_time, seedname + use od_parameters, only: photo_model + + implicit none + real(kind=dp), dimension(:, :, :), allocatable :: fem_mat_temp + ! real(kind=dp), dimension(:, :, :, :), allocatable :: tsm_reduced + integer, intent(in) :: kpt_total + character(len=99) :: filename + character(len=100) :: out_string + character(len=10) :: char_e + character(len=9) :: ctime ! Temp. time string + character(len=11) :: cdate ! Temp. date string + integer:: N_k, N_spin, n_eigen, token, matrix_unit, ierr, inode + + ! On root open file and write header + + if (on_root) then + ! Writing header to output file + write (char_e, '(F7.3)') temp_photon_energy + filename = trim(seedname)//'_'//trim(photo_model)//'_'//trim(adjustl(char_e))//'_fem_matrix.dat' + matrix_unit = io_file_unit() + open (unit=matrix_unit, action='write', file=filename) + call io_date(cdate, ctime) + write (matrix_unit, *) '## OptaDOS Photoemission: Printing OME Matrix on ', cdate, ' at ', ctime + write (matrix_unit, *) '## Seedname: ', trim(seedname) + write (matrix_unit, *) '## Photoemission Model: ', trim(photo_model) + write (matrix_unit, *) '## Photon Energy: ', trim(adjustl(char_e)) + write (matrix_unit, *) '## Find band energies and fractional k-point coordinates in: ', trim(seedname), '.bands' + write (matrix_unit, *) '## (Reduced) QE Matrix where each row contains the contributions from each band' + write (matrix_unit, *) '## at a certain k-point, spin, and atom' + write (matrix_unit, '(1x,a31,3(1x,I5),1x,1a)') '## (Reduced) QE Matrix Shape: (', nbands, kpt_total, nspins, ')' + allocate (fem_mat_temp(nbands, num_kpoints_on_node(0), nspins), stat=ierr) + if (ierr /= 0) call io_error('Error: write_distributed_qe_data - failed to allocate fem_mat_temp on root') + token = -1 + end if + write (out_string, '(I0,"(1x,",a,")")') nbands, 'ES16.8E3' + + ! On non root nodes + if (.not. on_root) then + ! - wait for the token + call comms_recv(token, 1, 0) + ! - send the respective qe_matrix for that specific atom + call comms_send(foptical_matrix_weights(1, 1, 1), nbands*nspins*num_kpoints_on_node(my_node_id), 0) + ! - send token back to root node + call comms_send(token, 1, 0) + ! On root node + elseif (on_root) then + do inode = 1, num_nodes - 1 + ! - send to the token to notes in turn + call comms_send(token, 1, inode) + ! - receive the qe_matrix from the other notes and write it to the file + call comms_recv(fem_mat_temp(1, 1, 1), nbands*nspins*num_kpoints_on_node(inode), inode) + ! write out the qe_matrix to the file + do N_spin = 1, nspins + do N_k = 1, num_kpoints_on_node(inode) + write (matrix_unit, '('//trim(out_string)//')') (fem_mat_temp(n_eigen, N_k, N_spin), n_eigen=1, nbands) + end do + end do + ! - receive the token from a node + call comms_recv(token, 1, inode) + end do + ! - write root qe_matrix elements + do N_k = 1, num_kpoints_on_node(my_node_id) + do N_spin = 1, nspins + write (matrix_unit, '('//trim(out_string)//')') (foptical_matrix_weights(n_eigen, N_spin, N_k), n_eigen=1, nbands) + end do + end do + close (unit=matrix_unit) + deallocate (fem_mat_temp, stat=ierr) + if (ierr /= 0) call io_error('Error: write_distributed_qe_data - failed to deallocate fem_mat_temp') + end if + end subroutine write_distributed_fem_data + + subroutine photo_deallocate + !*************************************************************** + ! This subroutine deallocates all the quantities which have not + ! been deallocated yet + + use od_io, only: io_error + use od_electronic, only: foptical_mat + implicit none + integer :: ierr + + if (allocated(phi_arpes)) then + deallocate (phi_arpes, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_deallocate - failed to deallocate phi_arpes') + end if + + if (allocated(theta_arpes)) then + deallocate (theta_arpes, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_deallocate - failed to deallocate theta_arpes') + end if + + if (allocated(theta_internal)) then + deallocate (theta_internal, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_deallocate - failed to deallocate theta_internal') + end if + + if (allocated(refract)) then + deallocate (refract, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_deallocate - failed to deallocate refract') + end if + + if (allocated(absorp)) then + deallocate (absorp, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_deallocate - failed to deallocate absorp') + end if + + if (allocated(electron_esc)) then + deallocate (electron_esc, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_deallocate - failed to deallocate electron_esc') + end if + + if (allocated(layer_qe)) then + deallocate (layer_qe, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_deallocate - failed to deallocate layer_qe') + end if + + if (allocated(imfp_val)) then + deallocate (imfp_val, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_deallocate - failed to deallocate imfp_val') + end if + + if (allocated(reflect)) then + deallocate (reflect, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_deallocate - failed to deallocate reflect') + end if + + if (allocated(photo_matrix_weights)) then + deallocate (photo_matrix_weights, stat=ierr) + if (ierr /= 0) call io_error('Error: calc_photo_optics - failed to deallocate photo_matrix_weights') + end if + + if (allocated(E_transverse)) then + deallocate (E_transverse, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_deallocate - failed to deallocate E_transverse') + end if + + if (allocated(absorp_photo)) then + deallocate (absorp_photo, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_deallocate - failed to deallocate absorp_photo') + end if + + if (allocated(atom_order)) then + deallocate (atom_order, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_deallocate - failed to deallocate atom_order') + end if + + if (allocated(pdos_weights_atoms)) then + deallocate (pdos_weights_atoms, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_deallocate - failed to deallocate pdos_weights_atoms') + end if + + if (allocated(pdos_weights_k_band)) then + deallocate (pdos_weights_k_band, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_deallocate - failed to deallocate pdos_weights_k_band') + end if + + if (allocated(index_energy)) then + deallocate (index_energy, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_deallocate - failed to deallocate index_energy') + end if + + if (allocated(I_layer)) then + deallocate (I_layer, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_deallocate - failed to deallocate I_layer') + end if + + if (allocated(E_kinetic)) then + deallocate (E_kinetic, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_deallocate - failed to deallocate E_kinetic') + end if + + if (allocated(field_emission)) then + deallocate (field_emission, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_deallocate - failed to deallocate field_emission') + end if + + if (allocated(qe_tsm)) then + deallocate (qe_tsm, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_deallocate - failed to deallocate qe_tsm') + end if + + if (allocated(qe_osm)) then + deallocate (qe_osm, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_deallocate - failed to deallocate qe_osm') + end if + + if (allocated(foptical_mat)) then + deallocate (foptical_mat, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_deallocate - failed to deallocate foptical_mat') + end if + + if (allocated(foptical_matrix_weights)) then + deallocate (foptical_matrix_weights, stat=ierr) + if (ierr /= 0) call io_error('Error: photo_deallocate - failed to deallocate foptical_matrix_weights') + end if + + if (allocated(gkgrid_weight)) then + deallocate (gkgrid_weight, stat=ierr) + if (ierr /= 0) call io_error('Error: const_binding_energy_map - failed to deallocate gkgrid_weight') + end if + + end subroutine photo_deallocate + +end module od_photo diff --git a/optados/src/projection_utils.f90 b/optados/src/projection_utils.f90 index 2b73f7d1..ee8332fb 100644 --- a/optados/src/projection_utils.f90 +++ b/optados/src/projection_utils.f90 @@ -588,9 +588,9 @@ subroutine projection_analyse_atom(ctemp, atom_label, species_proj) write (stderr, *) "PDOS string atom ", trim(c_symbol), " matches none of ", adjustl(proj_symbol(:)) elseif (atom_label) then write (stderr, *) "PDOS string atom ", trim(c_symbol)//":"//trim(catom_label), " matches none of ", adjustl(proj_symbol(:)) - endif + end if call io_error('projection_analyse_atom: Failed to match atomic symbol in pdos string') - endif + end if !! Parse if there's a particular species site number. ie. He3 counter = 0 diff --git a/optados/test-suite/checkpoints/Cu100_5L_photo/Cu100_5L-out.cell b/optados/test-suite/checkpoints/Cu100_5L_photo/Cu100_5L-out.cell new file mode 100644 index 00000000..069acfd4 --- /dev/null +++ b/optados/test-suite/checkpoints/Cu100_5L_photo/Cu100_5L-out.cell @@ -0,0 +1,117 @@ +# CELL file written 12:30:40 (GMT+1.0) 17th June 2025 from run Cu100_5L + +%BLOCK lattice_cart + ANG + 2.58217301279307 0.00000000000000 0.00000000000000 + 0.00000000000000 2.58217301279307 0.00000000000000 + 0.00000000000000 0.00000000000000 23.9075199999761 +%ENDBLOCK lattice_cart + +%BLOCK cell_constraints + 1 1 0 + 0 0 0 +%ENDBLOCK cell_constraints + +%BLOCK positions_frac + Cu 0.999999999024619 0.000000000000000 0.685805205163667 + Cu 0.500000001496888 0.500000001496888 0.612581924538433 + Cu 0.000000000000000 0.999999999024619 0.537258237993736 + Cu 0.500000001496888 0.500000001496888 0.461934551867318 + Cu 0.999999999024619 0.000000000000000 0.388711270823805 +%ENDBLOCK positions_frac + +FIX_COM : true + +%BLOCK species_pot + Cu 3|2.2|2.0|1.0|10|12|13|40:41:32(qc=6) +%ENDBLOCK species_pot + +SYMMETRY_TOL : 0.001000 + +%BLOCK symmetry_ops +# Symm. op. 1 E + 1.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 1.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 1.000000000000000 + 0.000000000000000 0.000000000000000 0.000000000000000 +# Symm. op. 2 I + -1.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 -1.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 -1.000000000000000 + 0.999999998049238 0.000000000000000 0.074516475987472 +# Symm. op. 3 4 + 0.000000000000000 1.000000000000000 0.000000000000000 + -1.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 1.000000000000000 + 0.999999999024619 0.000000000975381 0.000000000000000 +# Symm. op. 4 -4 + 0.000000000000000 -1.000000000000000 0.000000000000000 + 1.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 -1.000000000000000 + 0.999999999024619 0.999999999024619 0.074516475987472 +# Symm. op. 5 2 + -1.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 -1.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 1.000000000000000 + 0.999999998049238 0.000000000000000 0.000000000000000 +# Symm. op. 6 m + 1.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 1.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 -1.000000000000000 + 0.000000000000000 0.000000000000000 0.074516475987472 +# Symm. op. 7 4 + 0.000000000000000 -1.000000000000000 0.000000000000000 + 1.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 1.000000000000000 + 0.999999999024619 0.999999999024619 0.000000000000000 +# Symm. op. 8 -4 + 0.000000000000000 1.000000000000000 0.000000000000000 + -1.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 -1.000000000000000 + 0.999999999024619 0.000000000975381 0.074516475987472 +# Symm. op. 9 2 + 1.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 -1.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 -1.000000000000000 + 0.000000000000000 0.000000000000000 0.074516475987472 +# Symm. op. 10 m + -1.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 1.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 1.000000000000000 + 0.999999998049238 0.000000000000000 0.000000000000000 +# Symm. op. 11 2 + 0.000000000000000 -1.000000000000000 0.000000000000000 + -1.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 -1.000000000000000 + 0.999999999024619 0.999999999024619 0.074516475987472 +# Symm. op. 12 m + 0.000000000000000 1.000000000000000 0.000000000000000 + 1.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 1.000000000000000 + 0.999999999024619 0.000000000975381 0.000000000000000 +# Symm. op. 13 2 + -1.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 1.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 -1.000000000000000 + 0.999999998049238 0.000000000000000 0.074516475987472 +# Symm. op. 14 m + 1.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 -1.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 1.000000000000000 + 0.000000000000000 0.000000000000000 0.000000000000000 +# Symm. op. 15 2 + 0.000000000000000 1.000000000000000 0.000000000000000 + 1.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 -1.000000000000000 + 0.999999999024619 0.000000000975381 0.074516475987472 +# Symm. op. 16 m + 0.000000000000000 -1.000000000000000 0.000000000000000 + -1.000000000000000 0.000000000000000 0.000000000000000 + 0.000000000000000 0.000000000000000 1.000000000000000 + 0.999999999024619 0.999999999024619 0.000000000000000 +%ENDBLOCK symmetry_ops + +kpoint_mp_grid : 9 9 1 + +spectral_kpoint_mp_grid : 9 9 1 + diff --git a/optados/test-suite/checkpoints/Cu100_5L_photo/Cu100_5L.bands.bz2 b/optados/test-suite/checkpoints/Cu100_5L_photo/Cu100_5L.bands.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..c44e424deaab26f405bfad963000185d13d63709 GIT binary patch literal 1133 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 O@pmLsg$WOr2Q5H%@L>f2 literal 0 HcmV?d00001 diff --git a/optados/test-suite/checkpoints/Cu100_5L_photo/Cu100_5L.fem_fmt.bz2 b/optados/test-suite/checkpoints/Cu100_5L_photo/Cu100_5L.fem_fmt.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..72ba3930349138ec89ed8abb61e037b5f7430b86 GIT binary patch literal 28569 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�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�rICoF)Qg^QSXshPPbH3$$KF=Nh#xD< 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

I+1yS8$eM;~rD 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

MeCEP*< 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

o+jGd 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

hl4MFJu>@0ex*|@ zKYVOzf1v#8NEhSXY~h{0C)oBlxqsk>+v_exwwF#PKQsBFXWMdr{p|3`-93A4%NGt! zdAC=87kunl-ybdIZ{LgFm^3^2o7-HUN#J{5HSRjxw^u&YOrPJG%ssi`<kp%Z~r5`q_n{&Ut*?AGfVJ zY_gI#s*dO0W;TerCxQ#<4;IC54L$0}kc`(G#g(LNK?9sba~5=zA>r(i5~-gylBChE z;^C!QhL9kvSUg<pMkg; zMR;)>aUSH?yBM}5^(%`cbw zb+*>NM&%&t4t%AtMmR4@HdIaVr{n;C%g~7AYCxVD(VZ^ex|gk$>x_ox0|U@Bw)!WDgbIRimUQbPz9$ zR1^VJL@9w26*K9~41sI9l3`Tq+#^BL3Fs7FNZ?g{ILGUqEMalP^~S_1Z#=PIdBE9D z^%36`-jTSQpo_WD(?uzWk1O^%($&^hUhM4AzpZCB!K*LHjWS??4+EPD35(kZWw={zJ zps8D(r86VWkcWxYY5(()dUo`jyz=~S_FYTA!n{ZtIQ;x|l`v%8xgMN--qAE+J`Eqb z_)*rj56nA1TSga~KG(#e=NCntI;DMIGO;G&R%M1eZID!z#Qy7-|c1dGZ7BY z3m*JgNp4h8opc3YE9#aUW(KE$8!t>^XwFU5?~4Tucer=@R_<`jRPt6%d~kWf4u(ZZ@*T2$YV^>bq__`CW39)-=1jEI+_zV+^>yi)!OR?E-OU?E~boVq9er; z5GY5d_URF)HtxHoDO10#1MQgGhzu`<$QQ% z>5FsL#nqkWWP8;VFiZM*{BmI>L3oeu8RFx~yhCEJ#;xiO9q zftSBf($5k8!Zqld7k+?W<#nJ<$c2HzF5t8ND}SuksxFm8fYQg}cb4amn*8qMu6wy^ zN9gJY{@O_?j82D2+QbRQ={%@7=Th-hT5FnyRayywm zeV1ryd9k#lfEfgheV)mhDhdAH(f{~^^52h_{&~7W;0D?12B<`O3I@gpx1z&dMw@6} z8f*?T*A{d;E9oj_(N0mFBmmR??zPlfUFWwJaetvKb z@u!E`fBp6S`*%~RC*B+N_lb#}n)8I5YP>X(XvU#WlUB;;R#X|};VFW>r^}gYYzJcUNZB2u%QAI*QYC)8?9xA0vVZE+-X>RP6%T)i={=o0w zj_s>$P4(XV(18Kf+(=I7K#8jkE`lc&%TJBmUsB+VdBMd z2&PYCnL|=bM}OL6u{40Lf|6*3okbOlqJp6)vo|bFAwYy1B{k=F&P3ckTk(#+ zw!eayYvk?lmBL+?P_E4T>It5kTL*Hz4LmvJLgOZ17MrHkEjCH*%g<*fEl8 z=&w&HNgO7b)jE}ulow?JljTJ!)xf^GtUwp#m3-~8JCh?bPrqq=csXrR(MOAa`yDso zp_J#SXx6Stf;kzLYa{dbc2A`v6s;R~Ed)uVqE~0!j!=$jD#)mA6^N6lLuB}>mkZQZ zjRvJZxazv|Du6ih{>jFT5q-f$>D!vWxUprbE%57OTWAw(FawQww{64_HCaI6$(tU9*$*y_5r47oTx$jp(_b zl@~enVkBjOwHu5>xe=`vCbMa$x+Wacp;Y6+rGJQmU}NXR_8W4wO(|0jKiU+q_@Wny z>=+{gG=%n{z-;ye+klUzb`RKU3*ZWz&1L`WUi12>;wIB;7to{=)of;Z%6#elTB%K? zbI7V5*eg0!uJeW@;=)}@iBX-!y=NR35ueZ<4jrla;XyCAo%Bq6<9!?}<|kwo5sVFX zewz~HG!Vt`Bfh-ckB&OXVDEZx~Vs(~6+D}kqi-(|qL=d9FQ(EJ_Gil+nU z?NK7$AVW*h)lR9LIi#^Vi7!Z2E3d=Ekz{ECSy$^wbC%FRw!7ETrR;!#+R<6j%nob# z=XKtVo6$>H)62eMhT?F?D?f_3CE@UUD4D_veF1TdY#RQ;9wIT)`zktMqAS=ogtR1) z?E^K*PB~GqDU&kxaH@ASnkUi!Gzkh~^i=tAh9y7nvjt!Jyk{T!f%{cirvh{0^Omyb zqnV+s1Lgf8eQO1EZ^;*T_6eE&S*-6q9cq76z3u+X?+?76+kL_Np9}YQB*%;~(R5K5 zVfxQ_Bjf1Vh3m@ieK{__75~Y_DB1UG*BxzoJ&IK3D9ZM_*Sz7c`E&JNUGCAIpPs$k z`_t1u)~#QN`+HO_eHfYd(V_as(B1F9L2vrbeR2Ep<$wCGWc>NzWw-fB%TsvYh2;MW3+SF-Yq&SQ{-^EJ0#g=yu*RgOTH$gIkCcGh?FYQnBo)t83OC@8CB-;?T zL~7|qUEX`qz-7LPj8Sv{K^A2n@w6GX@1;f!=~m!@293y9zf~H$oQdHXOx19ss17n2 zS~GY!W0Vq4(Oqfn{Ytc{E)`hg|KhYW-m% z1i7!BFEuwr_gD^#!oROby|dY^+b5*A3;{d}s{b9>hua=qQ{{!18afNqzRvCK7}RQ5MR@cwu9)$KgH4g`-FAl8X6y1l)Lq7r5^)754IK&;w&!bqQ zCo4#q^vTTV$(v#hY%yvt3{%Eyl?q#xLp6O1=1NA%uFC^*YHRAqO^)gT<;9YacuFF} z*_OLLkm0s}JKP>N0x?|^RS!7Q)>Jd@c-^M{P*xc;BY%`MpS4ghVC?qZMj)s^S>}NNEx>D7exI28}oQ^046R z4vsV+s@i}?y~;#zwy0AK)6cC~SyPlQrkXxgJDnI^-3FG2Rq-0WLpdYzp7YL}{j;%6LGxIAt zE|y7Gk=-f*0q)-=H8)A&Xh#OWR8k7%MZL0Uyo7Iv^Z$8I+VcHl-&Mz7Iv>10wtVmB zXA^(!(^5x`lUVboMc7~JxCV+{D25pd)B^@w^T^y~&UT!IQG?UbYHACqk)28d2a;0? z7}uIOg%pkuP# zu7~~fx~-R#(aO{MZG{My5aW-7&j!?T@eg(grSVdW~wn{MN6@sR{_dOoN4MFMb;Q;_T)t z@y?s^YmHm}bN`5&aod=LJp1vBU(@eI4Zhr(FO_c?nsw91GxN!Xj{Nc8a$!#jnpg0~ z)OO{{o9P?-4mDwxoZtH0&JUvMXWbi~ul`r@*8iFBH?i-2)W2fh|M}N@nE1DSroscsP0AIT$HRs(r1FNEbQ0n!;B zuIOO;{4o1u%k^J=VDFs$=1NRrP-5j=pFfAwNvsHdB^?6V~BhZs9{X-S{n{ILWCfV1C|JE0khmsi1+Dcg6>2iib@kmnCNC|I5 zCD&nexE``K!L4qz3Dz`nA01vwKukmp*{?%4C@u%4hqFT6as!D!^5W85$@kB;Jj|@w zHhE@K4)h6QdgmrPR!g3j!r`bu0jzr#OEiOZ1I~6RbY|cFr`wkk&eU^r^}dqq$@1vo zojljQu0CTlGy+Li5uebYF^a1R@dFz%G+!o=5)3|+`(2>tkoxO^;hzIW!)sd;7%JLi zVwc%-$VS~oYfbZpNaH-g(oEhB;cd?s`fASE?Vn{lG99}YKlw%74Q3ruNwaf^qtP{? zNI7i(Zn9lpp*5$D;F&5F@L|<9Me75bt2NEq;ZH-|GJ1~%Odh-@h6^juVXQNge=~PD z>Xki1T49{tubRMA)30GC8@IO88`atke^f#zTPn$92u8gSZF{4 zbPqvg&+b?(UCtcQ5H}>R1fIKVlw_WeO7KN9{2>3l@n^#cp0Nwl3k z;W>RAcnc+f{CI0oz;Ci!v40)7^Y<^yQ~ua^WVa%GiyW=4gU3&@IS-{4gTLXLkl)i; zlrEgkqrQLNAChCMnrf1~f6`SGV}Zt2JN;;;^v%)e;DJ_k80*w`WBbo>+bRAA%j)UM zs6rCN%8_OZ4Gi0rz^(OXZp5~J_Vv0?U$nP9Y2ixx)9l;8P8k6!_k9TPrz^1&1g6VD zia^4|_oAFhnx#WT^+dWk)) zs&E!YcKqWH|M_Q3QCm)W@L9;xSMjHc!_TE*|7T&r=hoS^dx)c-rLF(%xD6;g(JOtA zKAnFXM}Hr%uk!TgpAVc7Fz@YLe75Y~XRO2L4?X;7! zO#r8~3J{Hc%*(m-v|kvAlHg*SK&k_eIVgCWd|y;iT0MAq6|p2kh%86fNP-*qi# z;W&gV-v5I)3-OWa29Ve5%ypcd+`EiIVwfgsx}rVMe_3^tG&5ssR+jG5PxJL{GwG6e zs7X>xH+6X&MM2f-SWGLX$baoi#>I2Hi#dY_CcB`V{TO$wh#-bOoP~7j-$py0kG?UV zlC;**Colzc895wb!>ys5R~5!z45(LXrOe-58UAW*#LOG0&fYBHoVgZPxi&)Szh9UU z!dUF{+t$Yz3s`b9w7Xvj+v=s2hJECIg+#6&$63(gV%st&x6#7nS(cgo)Udh~L4ykZ zvBlKX@z08br*B9{>B0~Rr6ZOh^)Ms%iAE+)@pNAVqE&qmOpbDdBBSwJzHbd>Hf|cb z#s5Ky)(Q78Y@}9y;=5#a-f9afV=GKz(=u@Er3|LCVsP48a zCKuc&9o^c%<b47cf}`aegS$Z#HQ65R{d^Dg$?6BK!JZ?v zZFLocTffi#dcnqH=SoUOLYQzaX-GQ@oghG!M6(chT{nc-iGg8(Xm`Q}Gsc_8IGGts zLEj2teeOc2EX5V$+*-m)G>o4@ykZ!gyiEonPll@D@Y0KmC^z?5=&TARfeC_U6G79t zQ6q6XVkC0Ib$zUbi}f@KEx_NQKEbsTm_i1sn5^6|x+zgTj+t3-V0dpXX(f=5{lMyz zWgkWR{COiuwj{3a*UIZtg(~Nb<>B`qzFg`IuI|uKF8cECWGJS477BADSozAQ_q)7v znO;F9Ia?4^-DMku&_<|VWm%I!^`p9*YAZ7F8?ZeAk}acV7i1&8tyM;W@dsjO zY%B~y>6b9I$L1>`2VyExoCJmYj z2B&^-OA`Y2%rR>Q03mB&;j|ah)0fmq{m7OsZ}4=mu^Yq{=5o(67m|GvFX_*GEw1dW zsb?j2dvQ)LtAdE$BW1_arvixkqCk%p-_9@F)S6rq?94U4YbGZ|)nF}MCZlbpSRyBx zXkd8$JUN$PG>+Wl<2-k1p4Ain^x-DNKUzb6y(jkDZ`WG8`Xj|(dTgUv>JT&l9kRqdY!vw z+sHYI>)?{KR;9Ju<9MgEMxShC#nC;k5yLg&Cs9*7rT5iklGoT_jH+~w>_4BpTIKsU zW`7`e{^r+f|D4?atk$(N;bGJi(Y#IMk!onwP5d@V3$Cz3+imkoBfC7Q-r%BWhnG1q zw*Ma48a13e8A9{{36CtWO)%TVo8s>wVt1_v2(H_YGM(Gz?xokO1_b5Unu5o0(k`B>Y72cSd6>w+!(~_+_=B$ zpOd7fOBZ%8PoRznmxDAl4Ots|AYZw2-+dFX0_4G-nyKKDR74bv;TjGI$tz@pp(Y|+8 z%kMkyIMM*8Jz&BNvXGI!Z}=@p;am1pQ;rIi^{*o4aS_yc%BZ#1X$8 zho2q#@^1T0V!Z0S2pN88;D;W1b3eKy;yUHEI9~VHips^d)35pADLXq}j9h(j_jbjb zBk|uhMF-Xh@Jo-~uX)kCqGftF_p`XjS(j*#`s(8~$jRRZyO#g?Tm3rgS3D1W`Id)Q zPkK5VIh}C!&Rz}F_~()PnP*>U+gP|;E6d|cVVvie_s*WF|{wl;rhK-2WJQ5P^UxDZ#y=OPd*QMyXc!o3wJ_EXU!}2w5J(L zgW1QvZ87*E6Q7jX&+@&6u${){N(7)@}G` zVaKhj-nz-lm#O@sy_3Q2W6N|2Eu1Gu=GLFC?zbF$ItRuC=bB5>axixEk zi|5ZB&$YJ)3cRzkuXuA;bO~V{+i%quSJHQM`958Csh#>@B5limGOp=8rD-!10QUM^D*E=| zUz3+4*goz~anBV(fBu@?2dia?^dq_RFRyBQ^}Lh5_mdZ=FWrus>3DNE*!yz7|Do^3 zE}8f2{Bdg%oSL|-N_*u*!hu8qQ>pemn5-)%U1a%a7@<@_;&Dj<8XW#ydoTW@!5xIL%zF~z=rW&g{_p>#y;07W~iC155S% zyA!jY=OQ;x=gRJ1xpa4Lw&Si~%R2ep!$-%Dac^IJ`x1Q@zGyiE`}^REJ3HFul7-pB z_>pg~jMp4a+;FvQ(Pw8DocVFp>=o~RXbpUOc+-a!!#^*HxwWJ#{bSjOpMFcq{-#?o z^N0J_iL@)VR~Fn@inLpnKM#6$I)2CYJ5shRmd_xE|}3*WGOxbN#a&*Nw+^E6znk(@rh)!VDd zE^YJCiTnQMPdAlK3F8)9VR;gdhU{Lb^WUe^E7$7!`)`Hn@4jhHKs;iWl7o-L__pr^K=y2GRTkSN{*L>U(+w3; z9qMq~!?c<`^|RZ_qv4!qq6RrgpmSEmIY(DmYee|cvUw(?( z|0(~6%e1z#8_w+?UOc(<%iRRQaz7X$ZupD)e3d1aYskH4>55XH|u6q13=3aLgeLq_EI~SK*p~w_Ucv@^Ii0H?#BW%pdt#?{ckx!obBHk>w6| zTUY9e>0M&=Xt}LlXpV1hC#*MQ1w5z>wlr^9mRF!}cc-8%_?!q0wY9Kwv*Y`rL-|L< zy$=GR>wNL}z~GA8c736TvnoT(y-2>jOTYz<@K_R>V|Dq^%C*5F#~*Bi6OQ;>C6JRS zu!I9yP7@mY>?!j&erRIsH*%xiCVTjdcbiX|wiJlhql;9jB!As~G#Y37|K-*I9d< z=RI@FE|jGk1yVQZ|iltr^zPymKEgr%xUNKpMe3*J= zX>*px`CUb&6-&jCp)6Z-A!Q5Qqt4Gw$S0Ut2@35hgDoxX_#`*8ii>%{%XVWb_~-fs ztIc-xBB1#Rk|Nl{E#44MOW2YGb#!6^1>w3SBv_mWIkY4Mx-!c@#1A3x46zFlr55q( z>cuO9#ZN3?D-eEWlKw69A_zejlye{_wbv7px5YIk#KJuxRq7z*5t0t%xf3qhN^)|7 z@&trlcXMJePY5HLyA$&LqAb>iuE>4}=_A7u4tvzqZwa#X5-hp3hgbLn&M(X|i>kP= zwCr$@Z~bz2j2F!}uhfn3U}gWI3Om8$A}gpxcGo)Vb$*4~5QJNx)I;1WNw|Oy4hmj+ zlOR;@4%H+^675nS+wXy$I#Lpwoua~z=F1N_#rP_Xc5}A{{SS266_yYnqcS6Ge2|$x-x1B9$i=}s9doQVY_@e zQdr??YaWR7U%ql9y@F4NN3OQ(>@@GT59%B+i!nF5XzL-#+lBEEBMHz@EnH|B%sa32 zz%R?f)R($hJwlk(@ot)7QY$O0>GXOtaSSGBsa4*&yj!9rNds1XP>%{U?;)=Oiud$G zmIj@}>>}KJ27`xomu*=mIMmMzIoG+`W2Hy%b6AdN!j)Zi9+BdHJGjKwHP6b;&E0IA z%vc$iUGGuhC5}-S4rxNl_BaqzJ8kJ9%@85+P!O>UQWzM7w7A)Q?wPC9%+(W`oG?U) z3MQiM@U~&4W`vDN&-@7HIf<0RXlt>$z|DSlo|`$`!Ytvy7RWAokXwSXD-XKsiZ7&4 zRw{9~AksZ6AO+@^`OrLmWQE`1iagj*PGJIisktPul5C4W7DhrZ_s-L1vbW@q$E3kJuYaWIVfizsvmpRWEqYmu_W6m#j`%a%<=K_xn%_2j3_11zYqwb5 zTcnqVr#FtFQt>6uWQ`Ql?XA6vvWm*?Sk%7-xPmmm){eks`x}eJUCm$&R2Poya*SdH zs8zQrX(U?H{rTskquPSg^ewX?D;Z45>LZ4*x|geV*JZo@xyRCx@`SsQ1eOTfdJD<5 zw*Pry(U* zrK(2t1>8{)Xr`!<77Wmd!oBfPuy*Qn9OT}55hY?@j{Jjx0 zBSe+EQD`OhBA^5H(nT7G-f`~~r5Gb81EOM%=*2i^E}uOdkW0nKvWKzy29Uik)X)1% z5lnO{^UBo-#VlV`$xP-1ga57JjOusTy7aZ{(x%TmuDC{Y_QxmI2HFV~W3`O1#@jG` zQ3+!BOx|oQw>}o2dq5Oy8u;rJ4#E0}zql zS*7&E9bqRx%QH{pLRyDF0ppaG#2l^V4#V@9p&->a+@9+|+&@n?vYZ$L0rNZ>i9K_< zHO2&x?IKJI(i`((bdnmWe|lZdq}>3WPv6(urXvSe%sx9wuk4Zf5wl!i=9^I?iabsd zrAT#4G=KuZwXgsa5A!{hQewxk#>!pTMVGIn;=|EIFsuFXH=byeJ34CgS9wgw7_Kp` zI1yO61KW$$1=vZ3M)VAPEZXqoXjJ|4LC?6k`s5pTuNK8k?sa6Qa+k9LlmXH!`FrbW5GA^03fJqxYin#!VO1RP#xLw0%izH-EsRdH{I8Dk4xuoYu4^@`F_SP z4{`1M*QAodJy6@P(EE9R435id>5oS_%_$Stoys?6HQi9sCf~0=vuw3Ki;}_^?n8HX z+LG_aWVNpo-Wt8XAz|evX>XR((18W7uYdouIZXH4mzwdm=MN8V-+axDFVUf ze(_D(+hZ-JDaP$zvslk339kx7oKeenwDDMBoq%-Qg=n37{-1wZf9C_v*Fc-dzqN|t zr6(X-t(7XF3b`3F{X+O$+BQ8&w&O}b;VcP&nzGxJ9T!#lG?X{32`A&rC-K3kLXM<; zA@fZ||H$5}KEM2l4=2KOqtEB4uJd}y4Izo11sRjoy-5)UChsNsUSJAdRzcJyrmt$pZDv62xm&2&@D=?oUeCb zg*T51v!yK%m4G`c(DveQcoIYHy#7Y1L{uJ0#3{kz!8>c|5Dgy~x0w&$#+^A9Q~ z7ud=*(rFj&HJ(0|yOG_k0g9I=^eT=e`7CQJHqeUH)UGYuW((RpTpXuG5rNaVa8+Q~ z+OoBw2$@(L=Kld~aH5T@J6-oDk6ul_V-E&YELPpv6eSJ!Tpsf>iCTr@gp$FKH^3-q zo~hf!fP8U0kiu|2+#^_wWrlUgsz6vRKNcsOVtRwezmFn`=1h+#Qco$7-W(G9Nl-2Q z0QdRTrrFRzjW!QY0-(78)iq{!G5kg8dfHo#g)E;HE}e7y=5##DQF|TFWFzq*@Iq2< zJVx(udV=K0ks!wSa^ZA5{wdW{lAQv+slq9KE%Iq zx;!m7@x^JKWw)rN&WX8h$(goWPQowCGBdkh+V8mZbNbFbEhXo@rPk|C{`39v)WCz^ z#8;lLcEJuNb!xia*}m8{$h)|@nX}W~<63dOsPWT6q*g$D+1|JxSCO@^e|qz>CXc`E zFL$-w*mSPcX3xBw7xcl9___N|)!a;T&uSvn7|cmTNHLn|i%KGu`$}YbOnFRt+Hj*z zQhUr`uXiSHwVjLm_G1+60}5lvjpYKcb9lQ73${CYnCWa_bx6{&H-_i#BZtCl-D ztSt#JLKoh=DN%Hx7LbpgqKezf_vgY4;Yv;q#FWo*-qW1csBFs>WqWAsOv&sbjIuSc znk(7*I-kUg5rMW@bMkx`)0q`KJO!5J*!Wl*KlUQBO$AbZSAiuQcQ4z z-+LZ)Wc<#^JU+9~rajA(&bzg;-?Y`lKPyT;egmGZ2xX3zUjgKdBx673 zQFb5ySy-dIESNqHQjiho(2z}}Ce>r!Vl2M@|5xfHg%sVqXm1Fn{-{LGYUW2Tb%+F0 z&pvIc9bH&>|E{^jPUMOvp=}7;R*-VR#EYqAdz~tu;&wIKV80Ew3f~l|vfJK0fyl7>6o#U`JU&w*9re!@d{1waac6%Iv~CZK zd{f+Rav|M7L`&KXb|&D9I5|r{*_)R~h!|*|^_muT_jBa6lmU$Kxb0%xZh0kG$>(UK zsC>31GWTS0vkhu9Rv){Utf3-G8aFu5B27GQj|C&FK~)Ia0Dze;>ZzmzQ^Mgs%BDJx zHc5vrUbgA=r{gUZ8MBRdKYkwLfW%%12z^;_TZP7Vi|z}}o6tZ=K#IUE^5D0DTg6m@ zNDs)~5vJ6|2;Z?3-NF`A^W#R{FX`BMi0%>^qHGRt1_Jiy)IL%pXAH^=PMy|q%~|*S z=gm2?S@-y$-^3-@cL@U(|HO6fx610K#?E#ql(2-64o z>jxkyaAuC6)#CDtc2F^mI{ehW{hunhCttz0zBv!TGa~r;W z7(kRNGR8EtfmOelnw;z*U=|*ow z4Q6y~4mW1LKSMQ&qxI!MvZ_ zaF3331FaHBl{vBWqB;O{S+rwWF$T~*)s(JxUaWL<*gXo`R~5Zyp0Z>1R((nnyan~X zUHdx82zfRJGc*MhV6p?cK=4?b7Z_=>TLhe`^n7k{70rPy6Oo|WMzWqM!ClxogC<;@o+qy0r!kn0fu#V}o zI)1sG2&<|krM(6;ofu6eC=%Sh=-OJtEbcfak1-ZzGl~ko(eO^O1Q*l~xl{Ak10%-5 z(top>wsJCm;Pr5pUtUCw%t6^mZ_9A95{yj8v8fw#B8%865MBRnXL`a;38aREph7qb z0>JR&VQ>DAXhjO)s6jr=a8bINuG{b4N8LXkIhB@pX3#z5h?-Rx9U5K(78tV8o;dg@ zoTV5JFcl*$4qK%d0jjr`?D)}rVdteSy^P0X7g8Z0tG)xwK%<>8tdZvj(b=g)(@v~l z3XJiF;cvLHd7xb{8=pqvq96JEw6nK3?cTnFlw_t)6*rjMO9{gX+w}!3+4#KOyu*Q> zJf?i-aFCwjM7A@82Cngzux6T>M1finjs}1p3`q|-J>g(es(->Y*Y?D#aO7}73(oiy zo`%!r|GehWU*q9t|H&e4e+Wk}qrAxen7hU2U^D2kvqKMTh-Ga8RJi%^?&|-YvmJ%( zmd4vjfp+RTR`Zda((N-!9gQiknhJfIk2MV9sDMGh8de7Kb^qh^5d(}x0bLkvL0EDk zSA9xzrcKNfS4>Xq`(+TD3)Md%J8!qOH-w?hNg>Q+qW!cZ7uC3$X~*TU&A}!$yv}nH za4P3$C%^^eK7lCKvZN@xm#x+q6_k>~z0SDCmD@i{1}>Q@POAm$R8iAU@6$GI*-~@{ zb64+YigMy6p^m-g5Wzvv5R9^X$-ck*chKIFvh1 z3Z($b%3LT?#hR-j>Ql=~aOF<;h+a+sbM;wTdOx*>qVS%YJR7)1Q*!6q&XS1NFMQ_X z#6p}JZjEb=%LFBt2KID3JyPF)2_C}g(dZ-myG1==w|@)O41t^JU_iHEI$Bllu87_n z&+(#_U|(q1V|F?l=?KzCQH%_#I)K{HKzfS3)aJeF{OX6VF&ApT{x?ZZuJKt*i_eWe zs!4V45MP#m=ELK!S}3nnCJsmL+T!20^%zq#(S9j?MV0Yoa%0%b!oNq_cQEceEV9}V z-cz3K`RCTL>z}<)jwP`dKOC1w){TB}t|@CgO+2$9 z_BxMp^OniGFO%lePP;u^JZv`Wq0ETOJvceezdHA8bk)K;1we@E*^81Y7g2m4j5AN^%e0zEJp=V%A`OyVjDHsF(-wtxEC_T^x z(~Z%0A1pHm5O?zvFRdH21+3vplp3en0GXfQDg(5kG-npTbf9N;KEK!L_Tf(69E0Su z^n2bv@4`H@9tnR<>3p&L(WAfI%@8GMJrJ;118`dyaui+21hxmc3mLQ^Rf{pEu#OfG z+CT;WGBJ%vp*zqD5G*8M-l&xyddNKjwv9ix`(ImByCH?+aVMCm!ioeMd+y$3%#VUg{BtdMw0gnvD&N57=5FV`AFfN!#64r7Od3_ z+IKgs#)(xxcHX@vbAYhDo8J>pQQSuQy(I)J3XF{`8+5TU`%bC7O1wC#52X#Xw=`@l9r0q{b(&1 zl^wl5(cd|-D42I)Z+3ldT_?rqixeBlaTMsw(R_9*)Y!n?Kx3TYfrHjuv?P1Rmwru`e{OpXUJnFKH0eztI4ca$Dr%x8Y7ArDm2 z?&F)9ErLW@kJ&{yeTi$f?_!LuSn)gi LCFfsV-*!o-_~=xyK4)2g8LYUuxG|1C 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