From cf956c000b22b4890e6ece7d1c7ebdc82f62f979 Mon Sep 17 00:00:00 2001 From: sponce Date: Wed, 1 Jun 2016 14:11:06 +0000 Subject: [PATCH] Automatic documentation of EPW using FORD. git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@12453 c92efa57-630b-4861-b058-cf58834340f0 --- EPW/Ford/index.md | 35 ++++++ EPW/epw.md | 57 ++++++++++ EPW/src/elphon_shuffle_wrap.f90 | 181 +++++++++++++++++++++++--------- EPW/src/epw.f90 | 36 ++++--- 4 files changed, 242 insertions(+), 67 deletions(-) create mode 100644 EPW/Ford/index.md create mode 100644 EPW/epw.md diff --git a/EPW/Ford/index.md b/EPW/Ford/index.md new file mode 100644 index 000000000..d551e1756 --- /dev/null +++ b/EPW/Ford/index.md @@ -0,0 +1,35 @@ +title: EPW overview +author: Samuel Poncé +date: 01-06-2016 + + +
+ + +EPW is an open-source F90/MPI code which calculates properties related to the electron-phonon interaction + using [Density-Functional Perturbation Theory](http://journals.aps.org/rmp/abstract/10.1103/RevModPhys.73.515) +and [Maximally Localized Wannier Functions](http://journals.aps.org/prb/abstract/10.1103/PhysRevB.56.12847). + +EPW is licensed under a [[GNU General Public License]](http://www.gnu.org/licenses/gpl-3.0.en.html) + +EPW is part of the [[Quantum Espresso]](http://www.quantum-espresso.org/) software package. + +## Installation + +The EPW software is only tested and intened to run on Linux (Mac OS might work but not tested). + +* Download the latest version of [[Quantum-ESPRESSO]](http://www.qe-forge.org/gf/project/q-e/frs/?action=FrsReleaseBrowse&frs_package_id=18). + +* Unpack and configure Quantum-ESPRESSO +```bash +tar -xvf espresso-5.4.0.tar.gz && cd espresso-5.4.0 && ./configure +``` + +* Compile EPW (this will also compile pwscf, phonon, and wannier90) +```bash +make -j 4 pwall +make -j 4 ph +make -j 4 epw +``` + +* The executable will be available in espresso-5.4.0/bin/epw.x or espresso-5.4.0/EPW/bin/epw.x diff --git a/EPW/epw.md b/EPW/epw.md new file mode 100644 index 000000000..9559cf1f8 --- /dev/null +++ b/EPW/epw.md @@ -0,0 +1,57 @@ +title: EPW +project_dir: ./src +output_dir: ./doc +project_website: http://epw.org.uk/ +summary: EPW is the short name for "Electron-phonon Wannier". EPW is an open-source F90/MPI code which calculates properties related to the electron-phonon interaction using Density-Functional Perturbation Theory and Maximally Localized Wannier Functions. +authors: Samuel Poncé + Roxana Margine + Carla Verdi + Feliciano Giustino +author_description: The EPW project is mainly developed at the university of Oxford. +github: https://github.com/sponce24 +email: samuel.pon@gmail.com +project_sourceforge: http://qeforge.qe-forge.org/gf/project/q-e/ +predocmark: > +media_dir: ./media +page_dir: ./Ford +docmark_alt: # +predocmark_alt: < +display: public + private +source: false +graph: true +macro: TEST + LOGIC=.true. +extra_mods: json_module: http://jacobwilliams.github.io/json-fortran/ + futility: http://cmacmackin.github.io +license: GNU +extra_filetypes: sh # + +EPW is the short name for "Electron-phonon Wannier". EPW is an open-source F90/MPI + code which calculates properties related to the electron-phonon interaction + using [Density-Functional Perturbation Theory](http://journals.aps.org/rmp/abstract/10.1103/RevModPhys.73.515) +and [Maximally Localized Wannier Functions](http://journals.aps.org/prb/abstract/10.1103/PhysRevB.56.12847). +EPW is developed and maintained by [Samuel Poncé](http://giustino.materials.ox.ac.uk/index.php/Site/SamuelPonc%e9), [Roxana Margine](http://www.binghamton.edu/physics/people/margine.html), [Carla Verdi](http://giustino.materials.ox.ac.uk/index.php/Site/CarlaVerdi), and [Feliciano Giustino](http://giustino.materials.ox.ac.uk/). + +The reference technical manuscript for the latest pubic release is: +[EPW: Electron-phonon coupling, transport and superconducting properties using maximally localized Wannier functions](http://arxiv.org/abs/1604.03525) +by S. Poncé, E. R. Margine, C. Verdi, and F. Giustino. + + +@Note +Since 26 April 2016 EPW is distributed as part of the [Quantum ESPRESSO](http://www.quantum-espresso.org/) suite. + +The code was written by Feliciano Giustino (EPW v1) and Jesse Noffsinger (EPW v2) while + at the University of California, Berkeley. Brad Malone (Harvard) and Cheol-Hwan Park + (Seoul National University) contributed with tests and benchmarks. +Roxana Margine implemented the anisotropic Eliashberg theory while at the University of Oxford (EPW v3). +Samuel Poncé (Oxford) made the code compatible with the latest version of Quantum Espresso v5 +in the latest release EPW v4. Carla Verdi (Oxford) developed the electron-phonon interpolation +for polar materials including Froehlich correction (released within EPW v4). + +EPW is based on the method introduced in F. Giustino et al, [Phys. Rev. B 76, 165108 (2007)](http://journals.aps.org/prb/abstract/10.1103/PhysRevB.76.165108). +An extended description of the first public release has been published in +J. Noffsinger et al, [Comput. Phys. Comm. 181, 2140 (2010)](http://www.sciencedirect.com/science/article/pii/S0010465510003218). The extension of EPW to include the + anisotropic Midgal-Eliashberg theory is based on the method described in + E. R. Margine et al, [Phys. Rev. B 87, 024505 (2013)](http://journals.aps.org/prb/abstract/10.1103/PhysRevB.87.024505). +The latest release of the code is described in S. Poncé et al, [arXiv:1604.03525](http://arxiv.org/abs/1604.03525). diff --git a/EPW/src/elphon_shuffle_wrap.f90 b/EPW/src/elphon_shuffle_wrap.f90 index c5686455c..25c5da6e3 100644 --- a/EPW/src/elphon_shuffle_wrap.f90 +++ b/EPW/src/elphon_shuffle_wrap.f90 @@ -9,14 +9,14 @@ !----------------------------------------------------------------------- SUBROUTINE elphon_shuffle_wrap !----------------------------------------------------------------------- - ! - ! Electron-phonon calculation with Wannier functions: load all phonon q's - ! - ! 09/2009 This subroutine is the main driver of the electron-phonon - ! calculation. It first calculates the electron-phonon matrix elements - ! on the coarse mesh and then passes the data off to ephwann_shuffle - ! to perform the interpolation. - ! + !! + !! Electron-phonon calculation with Wannier functions: load all phonon q's + !! + !! This subroutine is the main driver of the electron-phonon + !! calculation. It first calculates the electron-phonon matrix elements + !! on the coarse mesh and then passes the data off to [[ephwann_shuffle]] + !! to perform the interpolation. + !! !----------------------------------------------------------------------- ! #ifdef __PARA @@ -64,49 +64,130 @@ #ifdef __NAG USE f90_unix_io, ONLY : flush #endif + ! -------------------------------------------------------------- implicit none - - ! - integer :: sym_smallq(48) - ! - real(kind=DP), allocatable :: xqc_irr(:,:), wqlist_irr(:), xqc(:,:), wqlist(:) - ! the qpoints in the irr wedge - ! the corresponding weigths - ! the qpoints in the uniform mesh - ! the corresponding weigths - integer :: nqc_irr, nqc, max, nqxq_tmp, ibnd, ik, ios, & - dummy1, dummy2, ik_start, ik_stop - ! number of qpoints in the irreducible wedge - ! number of qpoints on the uniform grid ! - ! symmetry-related variables - ! - integer :: gmapsym(ngm,48) - ! correspondence G -> S(G) - complex(kind=DP) :: eigv (ngm, 48) - ! e^{ iGv} for 1...nsym (v the fractional translation) - complex(kind=DP) :: cz1( nmodes, nmodes), cz2(nmodes, nmodes) - ! the eigenvectors for the first q in the star - ! the rotated eigenvectors, for the current q in the star - ! - integer :: nq, isq (48), imq - ! degeneracy of the star of q - ! index of q in the star of a given sym.op. - ! index of -q in the star of q (0 if not present) - integer :: sym_sgq(48) - ! the symmetries giving the q point iq in the star - real(kind=DP) :: sxq (3, 48), et_tmp(nbnd, nkstot) - ! list of vectors in the star of q - integer :: i, j, iq, iq_irr, isym, & - iq_first, jsym, ism1, nsq, ipol, jpol, ierr, iunpun - real(kind=DP) xq0(3), aq(3), saq(3), raq(3), ft1, ft2, ft3 -! REAL(DP) :: w2(3*nat) ! dummy here - logical :: sym(48), eqvect_strict, nog, symmo, exst - character (len=256) :: tempfile, dirname,filename + character (len=256) :: tempfile + !! Temporary .eig file + character (len=256) :: dirname + !! Name of the directory + character (len=256) :: filename + !! Name of the file #ifdef __PARA character (len=3) :: filelab + !! Append the number of the core that works on that file #endif - CHARACTER(LEN=6), EXTERNAL :: int_to_char + character(len=6), external :: int_to_char + !! Transfor an int to a character + logical :: sym(48) + !! Logical vectors that says which crystal symmetries exists in our system + logical :: eqvect_strict + !! This function test if two tridimensional vectors are equal + logical :: nog + !! Tell you if G=0 or not in $S(q0)+G=q$ + logical :: symmo + !! Check whether the symmetry belongs to a symmorphic group + logical :: exst + !! Tells if a file exists. + ! + integer :: sym_smallq(48) + !! Set of all symmetries for the small group of one q. + !! This is a subset of total crystal symmetries that remains + !! after the q-point pertubation. + integer :: nqc_irr + !! Number of qpoints in the irreducible wedge + integer :: nqc + !! Number of qpoints on the uniform grid + integer :: maxvalue + !! Temporary integer for max value + integer :: nqxq_tmp + !! Maximum G+q length ? + integer :: ibnd + !! Band index + integer :: ik + !! Total k-point index + integer :: ios + !! Contains the state of the opened file + integer :: dummy1 + !! Dummy variable + integer :: dummy2 + !! Dummy variable + integer :: ik_start + !! Lower bound for the k-point of the coarse grid in parallel + integer :: ik_stop + !! Higher bound for the k-point of the coarse grid in parallel + integer :: gmapsym(ngm,48) + !! Correspondence G -> S(G) + integer :: nq + !! Degeneracy of the star of q + integer :: isq (48) + !! Index of q in the star of a given sym.op. + integer :: imq + !! Index of -q in the star of q (0 if not present) + integer :: sym_sgq(48) + !! The symmetries giving the q point iq in the star + integer :: i + !! Index for the star of q points + integer :: j + !! Cartesian inddex + integer :: iq + !! Q-index + integer :: iq_irr + !! Irreducible q-index + integer :: isym + !! Index of symmetry + integer :: iq_first + !! First q in the star of q + integer :: jsym + !! Symmetry index + integer :: ism1 + !! Inverse of the symmetry + integer :: nsq + !! The number of degeneracy of the small group for this iq in the star + integer :: ipol + !! Polarization index + integer :: jpol + !! Polarization index + integer :: ierr + !! Error index when reading/writing a file + integer :: iunpun + !! Unit of the file + ! + real(kind=DP), allocatable :: xqc_irr(:,:) + !! The qpoints in the irr wedge + real(kind=DP), allocatable :: wqlist_irr(:) + !! The corresponding weigths + real(kind=DP), allocatable :: xqc(:,:) + !! The qpoints in the uniform mesh + real(kind=DP), allocatable :: wqlist(:) + !! The corresponding weigths + real(kind=DP) :: sxq (3, 48) + !! List of vectors in the star of q + real(kind=DP) :: et_tmp(nbnd, nkstot) + !! Temporary array containing the eigenvalues (KS or GW) when read from files + real(kind=DP) :: xq0(3) + !! Current coarse q-point + real(kind=DP) :: aq(3) + !! Store the current q-point for symmetry multiplication + real(kind=DP) :: saq(3) + !! Rotated q-point + real(kind=DP) :: raq(3) + !! Rotate q-point in cartesian coordinate + real(kind=DP) :: ft1 + !! Fractional translation x + real(kind=DP) :: ft2 + !! Fractional translation y + real(kind=DP) :: ft3 + !! Fractional translation z + ! + complex(kind=DP) :: eigv (ngm, 48) + !! $e^{ iGv}$ for 1...nsym (v the fractional translation) + complex(kind=DP) :: cz1( nmodes, nmodes) + !! The eigenvectors for the first q in the star + complex(kind=DP) :: cz2(nmodes, nmodes) + !! The rotated eigenvectors, for the current q in the star + ! + ! --------------------------------------------------------------------- ! CALL start_clock ( 'elphon_wrap' ) ! @@ -139,16 +220,16 @@ #endif ! ! fix for uspp - max = nqxq + maxvalue = nqxq DO iq = 1, nqc_irr nqxq_tmp = INT( ( (sqrt(gcutm) + sqrt(xqc_irr(1,iq)**2 + & xqc_irr(2,iq)**2 + xqc_irr(3,iq)**2) ) & / dq + 4) * cell_factor ) - IF (nqxq_tmp .gt. max) max = nqxq_tmp + IF (nqxq_tmp .gt. maxvalue) maxvalue = nqxq_tmp ENDDO - IF (max .gt. nqxq) then + IF (maxvalue .gt. nqxq) then IF (allocated(qrad)) deallocate(qrad) - allocate (qrad (max, nbetam*(nbetam+1)/2,lmaxq, nsp)) + allocate (qrad (maxvalue, nbetam*(nbetam+1)/2,lmaxq, nsp)) ENDIF IF (nkstot .ne. nk1*nk2*nk3 ) & CALL errore('elphon_shuffle_wrap','nscf run inconsistent with epw input',1) diff --git a/EPW/src/epw.f90 b/EPW/src/epw.f90 index 7d7147c82..36a2311be 100644 --- a/EPW/src/epw.f90 +++ b/EPW/src/epw.f90 @@ -9,17 +9,17 @@ ! Adapted from PH/ph.f90 !----------------------------------------------------------------------- PROGRAM epw - !----------------------------------------------------------------------- - ! - ! This is the main EPW driver which sets the phases on the wavefunctions, - ! calls wannierize and elphon_shuffle_wrap - ! - ! 8/13/08 removed epsil variables, fildyn, ldisp - ! - ! 8/14/08 lnscf is unnecessary, as is nqs,iq_start - ! 8/15/08 recover has been cut - ! 02/2009 in state of v0.2 Barely resembles phonon.f90 - ! + !! author: Samuel Ponce', Roxana Margine, Carla Verdi, Feliciano Giustino + !! version: v4.0 + !! license: GNU + !! summary: EPW main driver + !! + !! This is the main EPW driver which sets the phases on the wavefunctions, + !! calls [[wann_run]] and [[elphon_shuffle_wrap]] + !! + !! @Note + !! 8/14/08 lnscf is unnecessary, as is nqs,iq_start + !! USE io_global, ONLY : stdout #ifdef __PARA USE mp, ONLY : mp_bcast, mp_barrier @@ -31,14 +31,15 @@ USE global_version, ONLY : version_number USE epwcom, ONLY : filukk, eliashberg, ep_coupling USE environment, ONLY : environment_start - ! SP: Move elph from control_ph to el_phon - USE elph2, ONLY : elph + USE elph2, ONLY : elph + ! Flag to perform an electron-phonon calculation. If .true. + ! the code will enter in [[elphon_shuffle_wrap]] ! ! implicit none ! CHARACTER (LEN=12) :: code = 'EPW' - INTEGER :: ierr + !! Name of the program ! version_number = '4.0.0' ! @@ -94,7 +95,7 @@ write(stdout,'(a)') " IF ( ep_coupling ) & WRITE( stdout, '(/5x,"Ultrasoft (Vanderbilt) Pseudopotentials")' ) ! - ! read in the input file + ! Read in the input file ! CALL epw_readin ! @@ -120,9 +121,10 @@ write(stdout,'(a)') " ! CALL setphases_wrap ! - ! Create U(k, k') localization matrix - ! IF (wannierize) THEN + ! + ! Create U(k, k') localization matrix + ! CALL wann_run ELSE !