LCOV - code coverage report
Current view: top level - src/95_drive - m_eph_driver.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 75.1 % 341 256
Test Date: 2026-09-20 18:56:22 Functions: 100.0 % 1 1

            Line data    Source code
       1              : !!****m* ABINIT/m_eph_driver
       2              : !! NAME
       3              : !!  m_eph_driver
       4              : !!
       5              : !! FUNCTION
       6              : !!   Driver for EPH calculations
       7              : !!
       8              : !! COPYRIGHT
       9              : !!  Copyright (C) 2009-2026 ABINIT group (MG, MVer, GA)
      10              : !!  This file is distributed under the terms of the
      11              : !!  GNU General Public License, see ~abinit/COPYING
      12              : !!  or http://www.gnu.org/copyleft/gpl.txt .
      13              : !!
      14              : !! SOURCE
      15              : 
      16              : #if defined HAVE_CONFIG_H
      17              : #include "config.h"
      18              : #endif
      19              : 
      20              : #include "abi_common.h"
      21              : 
      22              : module m_eph_driver
      23              : 
      24              :  use defs_basis
      25              :  use m_errors
      26              :  use m_abicore
      27              :  use m_xmpi
      28              :  use m_xomp
      29              :  use m_hdr
      30              :  use m_crystal
      31              :  use m_ebands
      32              :  use m_dtset
      33              :  use m_efmas_defs
      34              :  use m_dtfil
      35              :  use m_ddb
      36              :  use m_ddb_hdr
      37              :  use m_dvdb,            only : dvdb_t
      38              :  use m_ifc
      39              :  use m_phonons
      40              :  use m_nctk
      41              :  use netcdf
      42              : 
      43              :  use defs_datatypes,    only : pseudopotential_type
      44              :  use defs_abitypes,     only : MPI_type
      45              :  use m_io_tools,        only : file_exists, open_file
      46              :  use m_time,            only : cwtime, cwtime_report
      47              :  use m_fstrings,        only : strcat, sjoin, ftoa, itoa
      48              :  use m_fftcore,         only : print_ngfft
      49              :  use m_wfk,             only : wfk_read_ebands
      50              :  use m_rta,             only : rta_driver, ibte_driver
      51              :  use m_mpinfo,          only : destroy_mpi_enreg, initmpi_seq
      52              :  use m_pawang,          only : pawang_type
      53              :  use m_pawrad,          only : pawrad_type
      54              :  use m_pawtab,          only : pawtab_type
      55              :  use m_paw_an,          only : paw_an_type, paw_an_free !, paw_an_nullify, paw_an_init,
      56              :  use m_paw_ij,          only : paw_ij_type, paw_ij_init, paw_ij_free, paw_ij_nullify
      57              :  use m_pawfgrtab,       only : pawfgrtab_type, pawfgrtab_free, pawfgrtab_init
      58              :  use m_pawrhoij,        only : pawrhoij_type, pawrhoij_alloc, pawrhoij_copy, pawrhoij_free, pawrhoij_symrhoij
      59              :  use m_pawfgr,          only : pawfgr_type, pawfgr_init, pawfgr_destroy
      60              :  use m_phgamma,         only : eph_phgamma
      61              :  use m_efmas,           only : efmasdeg_free_array, efmasval_free_array, efmas_ncread
      62              :  use m_gkk,             only : eph_gkk, ncwrite_v1qnu
      63              :  use m_phpi,            only : eph_phpi
      64              :  use m_sigmaph,         only : sigmaph
      65              :  use m_pspini,          only : pspini
      66              :  use m_ephtk,           only : ephtk_update_ebands
      67              :  use m_migdal_eliashberg, only : migdal_eliashberg_iso !, migdal_eliashberg_aniso
      68              :  use m_gstore,          only : gstore_t, gstore_symmetrize
      69              :  use m_gstore_sigmaph,   only : gstore_sigmaph
      70              :  use m_gstore_converters, only : gstore_convert
      71              :  use m_berry_curvature, only : berry_curvature
      72              :  use m_cumulant,        only : cumulant_driver
      73              :  use m_frohlich,        only : frohlich_t, frohlichmodel_zpr, frohlichmodel_polaronmass
      74              :  use m_gwpt,            only : gwpt_run
      75              :  use m_varpeq,          only : varpeq_run, varpeq_plot
      76              :  use m_eph_path,        only : eph_path_run
      77              :  use m_wkk,             only : wkk_run
      78              : 
      79              :  implicit none
      80              : 
      81              :  private
      82              : !!***
      83              : 
      84              :  public :: eph
      85              : !!***
      86              : 
      87              : contains
      88              : !!***
      89              : 
      90              : !!****f* m_eph_driver/eph
      91              : !! NAME
      92              : !!  eph
      93              : !!
      94              : !! FUNCTION
      95              : !! Main routine to compute electron phonon coupling matrix elements and
      96              : !! calculate related properties - superconducting Tc, phonon linewidths, electronic renormalization
      97              : !! due to phonons and temperature effects...
      98              : !!
      99              : !! INPUTS
     100              : !! acell(3)=Length scales of primitive translations (bohr)
     101              : !! codvsn=Code version
     102              : !! dtfil<datafiles_type>=Variables related to files.
     103              : !! dtset<dataset_type>=All input variables for this dataset.
     104              : !! pawang<pawang_type)>=PAW angular mesh and related data.
     105              : !! pawrad(ntypat*usepaw)<pawrad_type>=Paw radial mesh and related data.
     106              : !! pawtab(ntypat*usepaw)<pawtab_type>=Paw tabulated starting data.
     107              : !! psps<pseudopotential_type>=Variables related to pseudopotentials.
     108              : !!   Before entering the first time in the routine, a significant part of Psps has been initialized :
     109              : !!   the integers dimekb,lmnmax,lnmax,mpssang,mpssoang,mpsso,mgrid,ntypat,n1xccc,usepaw,useylm,
     110              : !!   and the arrays dimensioned to npsp. All the remaining components of Psps are to be initialized in
     111              : !!   the call to pspini. The next time the code enters bethe_salpeter, Psps might be identical to the
     112              : !!   one of the previous Dtset, in which case, no reinitialisation is scheduled in pspini.F90.
     113              : !! rprim(3,3)=Dimensionless real space primitive translations.
     114              : !! xred(3,natom)=Reduced atomic coordinates.
     115              : !!
     116              : !! NOTES
     117              : !!
     118              : !! ON THE USE OF FFT GRIDS:
     119              : !! =================
     120              : !! In case of PAW:
     121              : !! ---------------
     122              : !!    Two FFT grids are used:
     123              : !!    - A "coarse" FFT grid (defined by ecut) for the application of the Hamiltonian on the plane waves basis.
     124              : !!      It is defined by nfft, ngfft, mgfft, ...
     125              : !!      Hamiltonian, wave-functions, density related to WFs (rhor here), ... are expressed on this grid.
     126              : !!    - A "fine" FFT grid (defined) by ecutdg) for the computation of the density inside PAW spheres.
     127              : !!      It is defined by nfftf, ngfftf, mgfftf, ... Total density, potentials, ... are expressed on this grid.
     128              : !! In case of norm-conserving:
     129              : !! ---------------------------
     130              : !!    - Only the usual FFT grid (defined by ecut) is used. It is defined by nfft, ngfft, mgfft, ...
     131              : !!      For compatibility reasons, (nfftf,ngfftf,mgfftf) are set equal to (nfft,ngfft,mgfft) in that case.
     132              : !!
     133              : !! SOURCE
     134              : 
     135          109 : subroutine eph(acell, codvsn, dtfil, dtset, pawang, pawrad, pawtab, psps, rprim, xred)
     136              : 
     137              : !Arguments ------------------------------------
     138              : !scalars
     139              :  character(len=8),intent(in) :: codvsn
     140              :  type(datafiles_type),intent(in) :: dtfil
     141              :  type(dataset_type),intent(inout) :: dtset
     142              :  type(pawang_type),intent(inout) :: pawang
     143              :  type(pseudopotential_type),intent(inout) :: psps
     144              : !arrays
     145              :  real(dp),intent(in) :: acell(3),rprim(3,3),xred(3,dtset%natom)
     146              :  type(pawrad_type),intent(inout) :: pawrad(psps%ntypat*psps%usepaw)
     147              :  type(pawtab_type),intent(inout) :: pawtab(psps%ntypat*psps%usepaw)
     148              : 
     149              : !Local variables ------------------------------
     150              : !scalars
     151              :  integer,parameter :: master = 0, selectz0 = 0, nsphere0 = 0, prtsrlr0 = 0
     152              :  integer,parameter :: with_cplex0 = 0, with_cplex1 = 1, with_cplex2 = 2
     153              :  integer :: ii,comm,nprocs,my_rank,psp_gencond,mgfftf,nfftf
     154              :  integer :: iblock_dielt_zeff, iblock_dielt, iblock_quadrupoles, ddb_nqshift, ierr, npert_miss
     155              :  integer :: omp_ncpus, work_size, nks_per_proc, lwsym, qptopt, ncid
     156              :  real(dp):: eff, mempercpu_mb, max_wfsmem_mb, nonscal_mem
     157              :  real(dp) :: ecore,ecut_eff,ecutdg_eff,gsqcutc_eff,gsqcutf_eff
     158              :  real(dp) :: cpu,wall,gflops
     159              :  logical :: use_wfk, use_wfq, use_dvdb, use_sigeph, use_drhodb, use_gstore, gstore_from_file
     160              :  character(len=500) :: msg
     161              :  character(len=fnlen) :: wfk0_path, wfq_path, ddb_filepath, dvdb_filepath, sigeph_filepath, path, drhodb_filepath, gstore_path
     162          109 :  type(hdr_type) :: wfk0_hdr, wfq_hdr
     163        11227 :  type(crystal_t) :: cryst, cryst_ddb
     164          218 :  type(ebands_t) :: ks_ebands, ks_ebands_kq, qp_ebands
     165          109 :  type(ddb_type) :: ddb, ddb_lw
     166         5668 :  type(ddb_hdr_type) :: ddb_hdr
     167        17767 :  type(dvdb_t) :: dvdb, drhodb
     168          654 :  type(ifc_type) :: ifc
     169              :  type(pawfgr_type) :: pawfgr
     170          109 :  type(mpi_type) :: mpi_enreg
     171         1417 :  type(phdos_t) :: phdos
     172          436 :  type(gstore_t) :: gstore
     173          436 :  type(frohlich_t) :: frohlich
     174              : !arrays
     175              :  integer :: ngfftc(18), ngfftf(18), count_wminmax(2), units(2)
     176              :  real(dp),parameter :: k0(3)=zero
     177          218 :  real(dp) :: wminmax(2), dielt(3,3), zeff(3,3,dtset%natom), zeff_raw(3,3,dtset%natom)
     178          218 :  real(dp) :: qdrp_cart(3,3,3,dtset%natom)
     179          218 :  real(dp),allocatable :: ddb_qshifts(:,:), kpt_efmas(:,:)
     180          109 :  type(efmasdeg_type),allocatable :: efmasdeg(:)
     181          109 :  type(efmasval_type),allocatable :: efmasval(:,:)
     182              :  !type(pawfgrtab_type),allocatable :: pawfgrtab(:)
     183              :  !type(paw_ij_type),allocatable :: paw_ij(:)
     184              :  !type(paw_an_type),allocatable :: paw_an(:)
     185              : 
     186              : !************************************************************************
     187              : 
     188              :  ! This part performs the initialization of the basic objects used to perform e-ph calculations:
     189              :  !
     190              :  !     1) Crystal structure `cryst`
     191              :  !     2) Ground state band energies: `ebands`
     192              :  !     3) Interatomic force constants: `ifc`
     193              :  !     4) DVDB database with the dvscf potentials
     194              :  !     5) Pseudos and PAW basic objects.
     195              :  !
     196              :  ! Once we have these objects, we can call specialized routines for e-ph calculations.
     197              :  ! Notes:
     198              :  !
     199              :  !   * Any modification to the basic objects mentioned above should be done here (e.g. change of efermi)
     200              :  !   * This routines shall not allocate big chunks of memory. The CPU-demanding sections should be
     201              :  !     performed in the subdriver that will employ different MPI distribution schemes optimized for that particular task.
     202              : 
     203              :  DBG_ENTER('COLL')
     204              : 
     205          109 :  if (psps%usepaw == 1) then
     206            0 :    ABI_ERROR("PAW not implemented")
     207              :    ABI_UNUSED((/pawang%nsym, pawrad(1)%mesh_size/))
     208              :  end if
     209              : 
     210              :  ! abirules!
     211              :  if (.False.) write(std_out,*)acell,codvsn,rprim,xred
     212              : 
     213          109 :  comm = xmpi_world; nprocs = xmpi_comm_size(comm); my_rank = xmpi_comm_rank(comm)
     214          327 :  units = [std_out, ab_out]
     215              : 
     216              : #ifndef HAVE_MPI_IBCAST
     217              :  do ii=1,5
     218              :    ABI_WARNING("Your MPI library does not provide MPI_IBCAST. Calculations parallelized over perturbations will be slow")
     219              :  end do
     220              : #endif
     221              : 
     222              :  ! Initialize filenames
     223          109 :  wfk0_path = dtfil%fnamewffk
     224          109 :  wfq_path = dtfil%fnamewffq
     225          109 :  ddb_filepath = dtfil%filddbsin
     226              : 
     227              :  ! Use the ddb file as prefix if getdvdb or irddvb are not given in the input.
     228          109 :  dvdb_filepath = dtfil%fildvdbin
     229          109 :  if (dvdb_filepath == ABI_NOFILE) then
     230           41 :    dvdb_filepath = dtfil%filddbsin; ii = len_trim(dvdb_filepath); dvdb_filepath(ii-2:ii+1) = "DVDB"
     231              :  end if
     232              : 
     233          109 :  drhodb_filepath = dtfil%fildrhodbin
     234          109 :  if (drhodb_filepath == ABI_NOFILE) then
     235          106 :    drhodb_filepath = dtfil%filddbsin; ii = len_trim(drhodb_filepath); drhodb_filepath(ii-2:ii+1) = "DRHODB"
     236              :  end if
     237              : 
     238          109 :  sigeph_filepath = dtfil%filsigephin
     239              : 
     240          909 :  use_wfk = all(dtset%eph_task /= [0, 5, -5, 6, +15, -15, -16, 16])
     241          109 :  use_wfq = ((dtset%irdwfq /= 0 .or. dtset%getwfq /= 0 .or. dtset%getwfq_filepath /= ABI_NOFILE) .and. dtset%eph_frohlichm /= 1)
     242              : 
     243              :  ! If eph_task is needed and ird/get variables are not provided, assume WFQ == WFK
     244          109 :  if (any(dtset%eph_task == [2, -2, 3]) .and. .not. use_wfq) then
     245            0 :    wfq_path = wfk0_path
     246            0 :    use_wfq = .True.
     247              :    write(msg, "(4a)")&
     248            0 :      "eph_task requires WFQ but none among (irdwfq, getwfq, getwfq_filepath) is specified in input.", ch10, &
     249            0 :      "Will read WFQ wavefunctions from WFK file:", trim(wfk0_path)
     250            0 :    ABI_COMMENT(msg)
     251              :  end if
     252              : 
     253          109 :  use_dvdb = (dtset%eph_task /= 0 .and. dtset%eph_frohlichm /= 1 .and. abs(dtset%eph_task) /= 7 .and. dtset%eph_task /= 13)
     254          109 :  use_sigeph = (dtset%eph_task == 9)
     255          109 :  use_gstore = (dtset%eph_task == 13)
     256          109 :  use_drhodb = (dtset%eph_task == 17)
     257              : 
     258          109 :  if (my_rank == master) then
     259              :    ! GA: Let ddb object handle the error at reading time
     260              :    !if (.not. file_exists(ddb_filepath)) ABI_ERROR(sjoin("Cannot find DDB file:", ddb_filepath))
     261          109 :    if (use_dvdb .and. .not. file_exists(dvdb_filepath)) ABI_ERROR(sjoin("Cannot find DVDB file:", dvdb_filepath))
     262          109 :    if (use_sigeph .and. .not. file_exists(sigeph_filepath)) ABI_ERROR(sjoin("Cannot find SIGEPH file:", sigeph_filepath))
     263          109 :    if (use_drhodb .and. .not. file_exists(drhodb_filepath)) ABI_ERROR(sjoin("Cannot find DRHODB file:", drhodb_filepath))
     264              : 
     265              :    ! Accept WFK file in Fortran or netcdf format.
     266          109 :    if (use_wfk .and. nctk_try_fort_or_ncfile(wfk0_path, msg) /= 0) then
     267            0 :      ABI_ERROR(sjoin("Cannot find GS WFK file:", wfk0_path, ". Error:", msg))
     268              :    end if
     269              :    ! WFQ file
     270          109 :    if (use_wfq) then
     271            2 :      if (nctk_try_fort_or_ncfile(wfq_path, msg) /= 0) then
     272            0 :        ABI_ERROR(sjoin("Cannot find GS WFQ file:", wfq_path, ". Error:", msg))
     273              :      end if
     274              :    end if
     275              :  end if ! master
     276              : 
     277              :  ! Broadcast filenames (needed because they might have been changed if we are using netcdf files)
     278          109 :  if (use_wfk) then
     279           97 :    call xmpi_bcast(wfk0_path, master, comm, ierr)
     280           97 :    call wrtout(units, sjoin("- Reading GS states from WFK file:", wfk0_path))
     281              :  end if
     282          109 :  if (use_wfq) then
     283            2 :    call xmpi_bcast(wfq_path, master, comm, ierr)
     284            2 :    call wrtout(units, sjoin("- Reading GS states from WFQ file:", wfq_path) )
     285              :  end if
     286          109 :  call wrtout(units, sjoin("- Reading DDB from file:", ddb_filepath))
     287          109 :  if (use_dvdb) call wrtout(units, sjoin("- Reading DVDB from file:", dvdb_filepath))
     288          109 :  if (dtset%eph_frohlichm /= 0) call wrtout(units, sjoin("- Reading EFMAS information from file:", dtfil%fnameabi_efmas))
     289          109 :  call wrtout(units, ch10//ch10)
     290              : 
     291              :  ! autoparal section
     292              :  ! TODO: This just to activate autoparal in AbiPy. Lot of things should be improved.
     293          109 :  if (dtset%max_ncpus /= 0) then
     294            0 :    write(ab_out,'(a)')"--- !Autoparal"
     295            0 :    write(ab_out,"(a)")"# Autoparal section for EPH runs"
     296            0 :    write(ab_out,"(a)")   "info:"
     297            0 :    write(ab_out,"(a,i0)")"    autoparal: ",dtset%autoparal
     298            0 :    write(ab_out,"(a,i0)")"    max_ncpus: ",dtset%max_ncpus
     299            0 :    write(ab_out,"(a,i0)")"    nkpt: ",dtset%nkpt
     300            0 :    write(ab_out,"(a,i0)")"    nsppol: ",dtset%nsppol
     301            0 :    write(ab_out,"(a,i0)")"    nspinor: ",dtset%nspinor
     302            0 :    write(ab_out,"(a,i0)")"    mband: ",dtset%mband
     303            0 :    write(ab_out,"(a,i0)")"    eph_task: ",dtset%eph_task
     304              : 
     305            0 :    work_size = dtset%nkpt * dtset%nsppol
     306              :    ! Non-scalable memory in Mb i.e. memory that is not distributed with MPI.
     307            0 :    nonscal_mem = zero
     308            0 :    max_wfsmem_mb = (two * dp * dtset%mpw * dtset%mband * dtset%nkpt * dtset%nsppol * dtset%nspinor * b2Mb) * 1.1_dp
     309              : 
     310              :    ! List of configurations.
     311              :    ! Assuming an OpenMP implementation with perfect speedup!
     312            0 :    write(ab_out,"(a)")"configurations:"
     313              : 
     314            0 :    do ii=1,dtset%max_ncpus
     315            0 :      nks_per_proc = work_size / ii
     316            0 :      nks_per_proc = nks_per_proc + mod(work_size, ii)
     317            0 :      eff = (one * work_size) / (ii * nks_per_proc)
     318              :      ! Add the non-scalable part and increase by 10% to account for other datastructures.
     319            0 :      mempercpu_mb = (max_wfsmem_mb + nonscal_mem) * 1.1_dp
     320              : 
     321            0 :      do omp_ncpus=1,1 !xomp_get_max_threads()
     322            0 :        write(ab_out,"(a,i0)")"    - tot_ncpus: ",ii * omp_ncpus
     323            0 :        write(ab_out,"(a,i0)")"      mpi_ncpus: ",ii
     324            0 :        write(ab_out,"(a,i0)")"      omp_ncpus: ",omp_ncpus
     325            0 :        write(ab_out,"(a,f12.9)")"      efficiency: ",eff
     326            0 :        write(ab_out,"(a,f12.2)")"      mem_per_cpu: ",mempercpu_mb
     327              :      end do
     328              :    end do
     329            0 :    write(ab_out,'(a)')"..."
     330            0 :    call wrtout(std_out, "Stopping now!")
     331            0 :    call abi_abort('PERS', exit_status=0, print_config=.false.)
     332              :  end if
     333              : 
     334          109 :  call cwtime(cpu, wall, gflops, "start")
     335              : 
     336          109 :  if (use_wfk) then
     337              :    ! Construct crystal and ebands from the GS WFK file.
     338              :    ! TODO: If we want to update the eigenvalues to perform some kind of self-consistency,
     339              :    ! this operation should be done here! Either scissors operator or external file with QP energies.
     340           97 :    ks_ebands = wfk_read_ebands(wfk0_path, comm, out_hdr=wfk0_hdr)
     341           97 :    call wfk0_hdr%vs_dtset(dtset)
     342              : 
     343           97 :    cryst = wfk0_hdr%get_crystal()
     344           97 :    call cryst%print(header="crystal structure from WFK file")
     345              : 
     346              :    ! Here we change the GS bands (Fermi level, scissors operator ...)
     347              :    ! All the modifications to ks_ebands should be done here.
     348           97 :    call ephtk_update_ebands(dtset, ks_ebands, "Ground state energies")
     349              : 
     350           97 :    if (dtfil%filqpdatain /= ABI_NOFILE) then
     351              :      ! Read QP energies from an external file.
     352            0 :      call qp_ebands%read_qpdata(ks_ebands, dtfil%filqpdatain, comm)
     353            0 :      call ephtk_update_ebands(dtset, qp_ebands, "QP energies")
     354              :    else
     355           97 :      call ks_ebands%copy(qp_ebands)
     356              :    end if
     357              : 
     358              :    ! Need to update the WFK header to reflect the changes in ks_ebands.
     359              :    ! because we may need to write the header to ncfile
     360              :    ! NB: eigenvalues are not stored in the header.
     361           97 :    wfk0_hdr%occopt = ks_ebands%occopt
     362           97 :    call get_eneocc_vect(ks_ebands, "occ", wfk0_hdr%occ)
     363           97 :    wfk0_hdr%fermie = ks_ebands%fermie
     364           97 :    wfk0_hdr%nelect = ks_ebands%nelect
     365              :  end if
     366              : 
     367          109 :  if (use_wfq) then
     368              :    ! Read WFQ and construct ebands on the shifted grid.
     369            2 :    ks_ebands_kq = wfk_read_ebands(wfq_path, comm, out_hdr=wfq_hdr)
     370              :    ! GKA TODO: Have to construct a header with the proper set of q-shifted k-points then compare against dtset.
     371              :    !call wfq_hdr%vs_dtset(dtset)
     372            2 :    call wfq_hdr%free()
     373            2 :    call ephtk_update_ebands(dtset, ks_ebands_kq, "Ground state energies (K+Q)")
     374              :  end if
     375              : 
     376          109 :  call cwtime_report(" eph%init", cpu, wall, gflops)
     377              : 
     378              :  ! =======================================
     379              :  ! Output useful info on electronic bands
     380              :  ! =======================================
     381          109 :  call cwtime(cpu, wall, gflops, "start")
     382              : 
     383          109 :  if (my_rank == master) then
     384              :    ! Fermi Surface
     385          109 :    if (dtset%prtfsurf /= 0) then
     386            1 :      path = strcat(dtfil%filnam_ds(4), "_BXSF")
     387            1 :      call wrtout(units, sjoin("- Writing Fermi surface to file:", path))
     388            1 :      if (ks_ebands%write_bxsf(cryst, path) /= 0) then
     389            0 :        msg = "Cannot produce file for Fermi surface, check log file for more info"
     390            0 :        ABI_WARNING(msg)
     391            0 :        call wrtout(ab_out, msg)
     392              :      end if
     393              :    end if
     394              : 
     395              :    ! Nesting factor (requires qpath)
     396          109 :    if (dtset%prtnest /= 0 .and. dtset%ph_nqpath > 0) then
     397            1 :      path = strcat(dtfil%filnam_ds(4), "_NEST")
     398            1 :      call wrtout(ab_out, sjoin("- Writing nesting factor to file:", path))
     399            1 :      if (ks_ebands%write_nesting(cryst, path, dtset%prtnest, &
     400              :          dtset%tsmear, dtset%fermie_nest, dtset%ph_qpath(:,1:dtset%ph_nqpath), msg) /= 0) then
     401            0 :        ABI_WARNING(msg)
     402            0 :        call wrtout(ab_out,msg)
     403              :      end if
     404              :    end if
     405          109 :    if (use_wfk) call ks_ebands%write(dtset%prtebands, dtfil%filnam_ds(4))
     406              :  end if
     407              : 
     408          109 :  call cwtime_report(" eph%ebands_postprocess:", cpu, wall, gflops)
     409              : 
     410              :  ! Read the DDB file.
     411          109 :  if (use_wfk) then
     412           97 :    call ddb%from_file(ddb_filepath, ddb_hdr, cryst_ddb, comm, prtvol=dtset%prtvol)
     413              : 
     414              :    ! DDB cryst comes from DFPT --> no time-reversal if q /= 0
     415              :    ! Change the value so that we use the same as the GS part.
     416           97 :    cryst_ddb%timrev = cryst%timrev
     417           97 :    if (cryst%compare(cryst_ddb, header=" Comparing WFK crystal with DDB crystal") /= 0) then
     418            0 :      ABI_ERROR("Crystal structure from WFK and DDB do not agree! Check messages above!")
     419              :    end if
     420           97 :    call cryst_ddb%free()
     421              :  else
     422              :    ! Get crystal from DDB.
     423              :    ! Warning: We may loose precision in rprimd and xred because DDB in text format does not have enough significant digits.
     424           12 :    call ddb%from_file(ddb_filepath, ddb_hdr, cryst, comm, prtvol=dtset%prtvol)
     425           12 :    call ddb%set_brav(dtset%brav)
     426              :  end if
     427              : 
     428              :  ! Change the bravais lattice if needed
     429          109 :  call ddb%set_brav(dtset%brav)
     430              : 
     431              :  ! MR: a new ddb is necessary for the longwave quantities due to incompability of it with automatic reshapes
     432              :  ! that ddb%val and ddb%flg experience when passed as arguments of some routines
     433              :  ! GA: Should replace with ddb_hdr%with_d3E_lw
     434          109 :  iblock_quadrupoles = 0
     435         8509 :  qdrp_cart = zero
     436          109 :  if (ddb_hdr%has_d3E_lw) then
     437            1 :    lwsym = 1
     438            1 :    call ddb_lw_copy(ddb, ddb_lw, ddb_hdr)
     439              :    ! GA: FIXME Bad interface
     440            1 :    iblock_quadrupoles = ddb_lw%get_quadrupoles(ddb_hdr%ddb_version, lwsym, BLKTYP_d3E_lw, qdrp_cart)
     441            1 :    call ddb_lw%free()
     442              :  end if
     443              : 
     444              :  ! Set the q-shift for the DDB (well we mainly use gamma-centered q-meshes)
     445          109 :  ddb_nqshift = 1
     446          545 :  ABI_CALLOC(ddb_qshifts, (3, ddb_nqshift))
     447          436 :  ddb_qshifts(:,1) = dtset%ddb_shiftq(:)
     448              : 
     449              :  ! Get Dielectric Tensor
     450          109 :  iblock_dielt = ddb%get_dielt(dtset%rfmeth, dielt)
     451              : 
     452              :  ! Get Dielectric Tensor and Effective Charges
     453              :  ! (initialized to one_3D and zero if the derivatives are not available in the DDB file)
     454          109 :  iblock_dielt_zeff = ddb%get_dielt_zeff(cryst, dtset%rfmeth, dtset%chneut, selectz0, dielt, zeff, zeff_raw=zeff_raw)
     455          109 :  if (my_rank == master) then
     456          109 :    if (iblock_dielt_zeff == 0) then
     457           49 :      call wrtout(units, sjoin("- Cannot find dielectric tensor and Born effective charges in DDB file:", ddb_filepath))
     458           49 :      call wrtout(units, " Values initialized with zeros.")
     459              :    else
     460           60 :      call wrtout(units, sjoin("- Found dielectric tensor and Born effective charges in DDB file:", ddb_filepath))
     461              :    end if
     462              :  end if
     463              : 
     464              :  ! The default value is 1. Here we set the flags to zero if Q* is not available.
     465          109 :  if (iblock_quadrupoles == 0) then
     466          108 :    dtset%dipquad = 0
     467          108 :    dtset%quadquad = 0
     468              :  end if
     469              : 
     470          109 :  if (my_rank == master) then
     471          109 :    if (iblock_quadrupoles == 0) then
     472          108 :      call wrtout(units, sjoin("- Cannot find quadrupole tensor in DDB file:", ddb_filepath))
     473          108 :      call wrtout(units, " Values initialized with zeros.")
     474              :    else
     475            1 :      call wrtout(units, sjoin("- Found quadrupole tensor in DDB file:", ddb_filepath))
     476              :    end if
     477              :  end if
     478              : 
     479              :  call ifc%init(cryst, ddb, &
     480              :    dtset%brav, dtset%asr, dtset%symdynmat, dtset%dipdip, dtset%rfmeth, &
     481              :    dtset%ddb_ngqpt, ddb_nqshift, ddb_qshifts, dielt, zeff, &
     482              :    qdrp_cart, nsphere0, dtset%rifcsph, prtsrlr0, dtset%enunit,1, comm, &
     483          109 :    dipquad=dtset%dipquad, quadquad=dtset%quadquad)
     484              : 
     485          109 :  ABI_FREE(ddb_qshifts)
     486          218 :  if (my_rank == master) call ifc%print([std_out])
     487              : 
     488              :  ! Output phonon band structure (requires qpath)
     489          109 :  if (dtset%prtphbands /= 0) call ifc_mkphbs(ifc, cryst, dtset, dtfil%filnam_ds(4), comm)
     490              : 
     491          109 :  if (dtset%prtphdos == 1) then
     492           52 :    call wrtout(std_out, " Computing Phonon DOS. Use prtphdos 0 to disable this part.")
     493           52 :    wminmax = zero
     494           22 :    do
     495              :      call phdos%init(cryst, ifc, dtset%ph_intmeth, dtset%ph_wstep, dtset%ph_smear, dtset%ph_ngqpt, &
     496           74 :                      dtset%ph_nqshift, dtset%ph_qshift, "", wminmax, count_wminmax, comm)
     497          193 :      if (all(count_wminmax == 0)) exit
     498           22 :      wminmax(1) = wminmax(1) - abs(wminmax(1)) * 0.05; wminmax(2) = wminmax(2) + abs(wminmax(2)) * 0.05
     499           22 :      call phdos%free()
     500           22 :      write(msg, "(a, 2f8.5)") "Initial frequency mesh not large enough. Recomputing PHDOS with wmin, wmax: ",wminmax
     501           22 :      call wrtout(std_out, msg)
     502              :    end do
     503              : 
     504           52 :    if (my_rank == master) then
     505           52 :      if (dtset%prtvol > 0) then
     506              :        ! Disabled by default because it's slow and we use netcdf that is much better.
     507           22 :        path = strcat(dtfil%filnam_ds(4), "_PHDOS")
     508           22 :        call wrtout(units, sjoin("- Writing phonon DOS to file:", path))
     509           22 :        call phdos%print(path)
     510              :      end if
     511              : 
     512           52 :      path = strcat(dtfil%filnam_ds(4), "_PHDOS.nc")
     513           52 :      call wrtout(units, sjoin("- Writing phonon DOS to netcdf file:", path))
     514           52 :      NCF_CHECK_MSG(nctk_open_create(ncid, path, xmpi_comm_self), sjoin("Creating PHDOS.nc file:", path))
     515           52 :      NCF_CHECK(cryst%ncwrite(ncid))
     516           52 :      call phdos%ncwrite(ncid)
     517           52 :      NCF_CHECK(nf90_close(ncid))
     518              :    end if
     519           52 :    call phdos%free()
     520              :  end if ! prtphdos
     521              : 
     522          109 :  if (dtset%prtbltztrp == 1 .and. my_rank == master) then
     523            1 :    call ifc%outphbtrap(cryst, dtset%ph_ngqpt, dtset%ph_nqshift, dtset%ph_qshift, dtfil%filnam_ds(4))
     524              :    ! BoltzTraP output files in GENEric format
     525            1 :    call ks_ebands%prtbltztrp(cryst, dtfil%filnam_ds(4))
     526              :  end if
     527              : 
     528              :  ! Output phonon isosurface in Xcrysden format.
     529          109 :  if (dtset%prtphsurf == 1) then
     530            1 :    path = strcat(dtfil%filnam_ds(4), "_PH.bxsf")
     531            1 :    call wrtout(units, sjoin("- Writing phonon frequencies in Xcrysden format to file:", path))
     532            1 :    call ifc%printbxsf(cryst, dtset%ph_ngqpt, dtset%ph_nqshift, dtset%ph_qshift, path, comm)
     533              :  end if
     534              : 
     535          109 :  call cwtime_report(" eph%ifc:", cpu, wall, gflops)
     536              : 
     537              :  ! Initialize the object used to read DeltaVscf
     538          109 :  if (use_dvdb) then
     539           96 :    call dvdb%init(dvdb_filepath, dtset%gpu_option, comm)
     540           96 :    ABI_CHECK(dvdb%has_fields("pot1", msg), sjoin(dvdb_filepath, msg))
     541              : 
     542              :    ! DVDB cryst comes from DPPT --> no time-reversal if q /= 0
     543              :    ! Change the value so that we use the same as the GS part.
     544           96 :    dvdb%cryst%timrev = cryst%timrev
     545           96 :    if (cryst%compare(dvdb%cryst, header=" Comparing WFK crystal with DVDB crystal") /= 0) then
     546            0 :      ABI_ERROR("Crystal structure from WFK and DVDB do not agree! Check messages above!")
     547              :    end if
     548           96 :    dvdb%prtvol = dtset%prtvol
     549           96 :    if (dtset%prtvol > 10) dvdb%debug = .True.
     550              : 
     551              :    ! This to symmetrize the DFPT potentials.
     552           96 :    dvdb%symv1 = dtset%symv1scf
     553              : 
     554              :    ! Copy brav variable
     555           96 :    dvdb%brav = dtset%brav
     556              : 
     557              :    ! Select algorithm for generating the list of R-points and the weights used to compute W(r,R)
     558           96 :    dvdb%rspace_cell = dtset%dvdb_rspace_cell
     559              : 
     560              :    !call dvdb%load_ddb(dtset%prtvol, comm, ddb=ddb)
     561              : 
     562              :    ! Set qdamp from frohl_params
     563           96 :    dvdb%qdamp = dtset%dvdb_qdamp
     564              : 
     565              :    ! Set quadrupoles
     566         7512 :    dvdb%qstar = qdrp_cart; if (iblock_quadrupoles /= 0) dvdb%has_quadrupoles = .True.
     567              : 
     568              :    ! Set dielectric tensor, BECS and associated flags.
     569              :    ! This flag activates automatically the treatment of the long-range term in the Fourier interpolation
     570              :    ! of the DFPT potentials except when dvdb_add_lr == 0
     571           96 :    dvdb%add_lr = dtset%dvdb_add_lr
     572           96 :    if (iblock_dielt /= 0) then
     573          611 :      dvdb%has_dielt = .True.; dvdb%dielt = dielt
     574              :    end if
     575           96 :    if (iblock_dielt_zeff /= 0) then
     576         2585 :      dvdb%has_zeff = .True.; dvdb%zeff = zeff; dvdb%zeff_raw = zeff_raw
     577              :    end if
     578           96 :    if (.not. dvdb%has_dielt .or. .not. (dvdb%has_zeff .or. dvdb%has_quadrupoles)) then
     579           49 :      if (dvdb%add_lr /= 0) then
     580           49 :        dvdb%add_lr = 0
     581           49 :        ABI_WARNING("Setting dvdb_add_lr to 0. Long-range term won't be subtracted in Fourier interpolation.")
     582              :      end if
     583              :    end if
     584              : 
     585           96 :    if (dvdb%add_lr == 2) then
     586            0 :       if (dvdb%has_quadrupoles) then
     587            0 :         call wrtout(std_out, "dvdb_add_lr == 2 --> Quadrupoles are set to zero and won't be used in the interpolation")
     588              :       end if
     589            0 :       dvdb%has_quadrupoles = .False.
     590            0 :       dvdb%qstar = zero
     591              :    end if
     592              : 
     593           96 :    if (my_rank == master) then
     594          192 :      call dvdb%print([std_out], "DVDB FILE", dtset%prtvol)
     595           96 :      call dvdb%list_perts([-1, -1, -1], npert_miss)
     596           96 :      ABI_CHECK(npert_miss == 0, sjoin(itoa(npert_miss), "independent perturbation(s) are missing in the DVDB file!"))
     597              :    end if
     598              :  end if
     599              : 
     600          109 :  if (use_drhodb) then
     601              :    ! Store DRHODB as a DVDB object
     602            3 :    call drhodb%init(drhodb_filepath, dtset%gpu_option, comm)
     603            3 :    ABI_CHECK(drhodb%has_fields("den1", msg), sjoin(drhodb_filepath, msg))
     604              : 
     605              :    ! DVDB cryst comes from DPPT --> no time-reversal if q /= 0
     606              :    ! Change the value so that we use the same as the GS part.
     607            3 :    drhodb%cryst%timrev = cryst%timrev
     608            3 :    if (cryst%compare(drhodb%cryst, header=" Comparing WFK crystal with DRHODB crystal") /= 0) then
     609            0 :      ABI_ERROR("Crystal structure from WFK and DRHODB do not agree! Check messages above!")
     610              :    end if
     611            3 :    if (dtset%prtvol > 10) drhodb%debug = .True.
     612              : 
     613              :    ! This to symmetrize the DFPT densities.
     614            3 :    drhodb%symv1 = dtset%symv1scf
     615              : 
     616              :    ! Copy brav variable
     617            3 :    drhodb%brav = dtset%brav
     618              : 
     619              :    ! Select algorithm for generating the list of R-points and the weights used to compute W(r,R)
     620            3 :    drhodb%rspace_cell = dtset%dvdb_rspace_cell
     621              : 
     622              :    !call drhodb%load_ddb(dtset%prtvol, comm, ddb=ddb)
     623              : 
     624              :    ! Set qdamp, quadrupoles and all long-range terms to 0.
     625            3 :    drhodb%qdamp = 0
     626          243 :    drhodb%qstar = 0
     627            3 :    drhodb%has_quadrupoles = .False.
     628            3 :    drhodb%add_lr = 0
     629           39 :    drhodb%has_dielt = .False.; drhodb%dielt = 0
     630          159 :    drhodb%has_zeff = .False.; drhodb%zeff = 0; drhodb%zeff_raw = 0
     631              : 
     632            3 :    if (my_rank == master) then
     633            6 :      call drhodb%print([std_out], "DRHODB file", 0)
     634            3 :      call drhodb%list_perts([-1, -1, -1], npert_miss)
     635            3 :      ABI_CHECK(npert_miss == 0, sjoin(itoa(npert_miss), "independent perturbation(s) are missing in the DVDB file!"))
     636              :    end if
     637              :  end if
     638              : 
     639              :  call pawfgr_init(pawfgr, dtset, mgfftf, nfftf, ecut_eff, ecutdg_eff, ngfftc, ngfftf, &
     640          109 :                   gsqcutc_eff=gsqcutc_eff, gsqcutf_eff=gsqcutf_eff, gmet=cryst%gmet, k0=k0)
     641              : 
     642          218 :  call print_ngfft([std_out], ngfftc, header='Coarse FFT mesh used for the wavefunctions')
     643          218 :  call print_ngfft([std_out], ngfftf, header='Dense FFT mesh used for densities and potentials')
     644              : 
     645              :  ! Fake MPI_type for the sequential part.
     646          109 :  call initmpi_seq(mpi_enreg)
     647          109 :  call mpi_enreg%distribfft%init_seq('c', ngfftc(2), ngfftc(3), 'all')
     648          109 :  call mpi_enreg%distribfft%init_seq('f', ngfftf(2), ngfftf(3), 'all')
     649              : 
     650              :  ! I am not sure yet the EFMAS file will be needed as soon as eph_frohlichm/=0. To be decided later.
     651          109 :  if (dtset%eph_frohlichm /= 0) then
     652            3 :    NCF_CHECK(nctk_open_read(ncid, dtfil%fnameabi_efmas, xmpi_comm_self))
     653            3 :    call efmas_ncread(efmasdeg, efmasval, kpt_efmas, ncid)
     654            3 :    NCF_CHECK(nf90_close(ncid))
     655              :  end if
     656              : 
     657              :  ! ===========================================
     658              :  ! === Open and read pseudopotential files ===
     659              :  ! ===========================================
     660          109 :  call pspini(dtset, dtfil, ecore, psp_gencond, gsqcutc_eff, gsqcutf_eff, pawrad, pawtab, psps, cryst%rprimd, comm_mpi=comm)
     661              : 
     662              :  ! Release nkpt-based arrays in dtset to decrease memory requirement if dense sampling.
     663              :  ! EPH routines should not access them after this point.
     664          109 :  if (all(dtset%eph_task /= [6, 10])) call dtset%free_nkpt_arrays()
     665              : 
     666              :  ! ====================================================
     667              :  ! === This is the real EPH stuff once all is ready ===
     668              :  ! ====================================================
     669              : 
     670          109 :  select case (dtset%eph_task)
     671              :  case (0)
     672              :    ! This is just to access the DDB post-processing tools for phonons.
     673            5 :    continue
     674              : 
     675              :  case (1)
     676              :    ! Compute phonon linewidths in metals.
     677              :    call eph_phgamma(wfk0_path, dtfil, ngfftc, ngfftf, dtset, cryst, ks_ebands, dvdb, ifc, &
     678            5 :                     pawfgr, pawang, pawrad, pawtab, psps, mpi_enreg, comm)
     679              : 
     680              :  case (2, -2)
     681              :    ! Compute e-ph matrix elements (legacy version)
     682            2 :    ABI_CHECK(dtset%useylm == 0, "useylm != 0 not implemented/tested")
     683              :    call eph_gkk(wfk0_path, wfq_path, dtfil, ngfftc, ngfftf, dtset, cryst, ks_ebands, ks_ebands_kq, dvdb, ifc, &
     684            2 :                 pawfgr, pawang, pawrad, pawtab, psps, mpi_enreg, comm)
     685              : 
     686              :  case (3)
     687              :    ! Compute phonon-electron self-energy.
     688            0 :    ABI_CHECK(dtset%useylm == 0, "useylm != 0 not implemented/tested")
     689              :    call eph_phpi(wfk0_path, wfq_path, dtfil, ngfftc, ngfftf, dtset, cryst, ks_ebands, ks_ebands_kq, dvdb, ifc, &
     690            0 :                  pawfgr, pawang, pawrad, pawtab, psps, mpi_enreg, comm)
     691              : 
     692              :  case (4, -4)
     693              :    ! Compute electron-phonon self-energy (phonon contribution).
     694              :    call sigmaph(wfk0_path, dtfil, ngfftc, ngfftf, dtset, cryst, ks_ebands, dvdb, ifc, wfk0_hdr, &
     695           58 :                 pawfgr, pawang, pawrad, pawtab, psps, mpi_enreg, comm)
     696              : 
     697              :    ! Compute transport properties in the RTA/IBTE only if sigma_erange has been used
     698          155 :    if (dtset%eph_task == -4 .and. any(abs(dtset%sigma_erange) > zero)) then
     699           12 :      if (dtset%ibte_prep > 0) then
     700            1 :        call ibte_driver(dtfil, ngfftc, dtset, ks_ebands, cryst, pawtab, psps, comm) ! Solve IBTE
     701              :      else
     702           11 :        call rta_driver(dtfil, ngfftc, dtset, ks_ebands, cryst, pawtab, psps, comm)  ! Compute RTA
     703              :      end if
     704              :    end if
     705              : 
     706              :  case (24)
     707              :    ! Compute e-ph self-energy from GSTORE.nc file.
     708              :    call gstore_sigmaph(wfk0_path, ngfftc, ngfftf, dtset, dtfil, cryst, ks_ebands, qp_ebands, wfk0_hdr, dvdb, ifc, &
     709            7 :                        pawfgr, pawtab, psps, mpi_enreg, comm)
     710              : 
     711              :  case (5, -5)
     712              :    ! Interpolate the DFPT potential.
     713              :    call dvdb%interpolate_and_write(dtset, dtfil%fnameabo_dvdb, ngfftc, ngfftf, cryst, &
     714            8 :                                    ifc%ngqpt, ifc%nqshft, ifc%qshft, comm)
     715              : 
     716              :  case (6)
     717              :    ! Estimate zero-point renormalization and temperature-dependent electronic structure using the Frohlich model.
     718            2 :    if (my_rank == master) call frohlichmodel_zpr(frohlich, cryst, dtset, efmasdeg, efmasval, ifc)
     719              : 
     720              :  case (7)
     721              :    ! Compute phonon-limited RTA from SIGEPH.nc file.
     722            1 :    call rta_driver(dtfil, ngfftc, dtset, qp_ebands, cryst, pawtab, psps, comm)
     723              : 
     724              :  case (8)
     725              :    ! Solve IBTE from SIGEPH.nc file.
     726            0 :    call ibte_driver(dtfil, ngfftc, dtset, qp_ebands, cryst, pawtab, psps, comm)
     727              : 
     728              :  case (9)
     729              :    ! Compute cumulant from SIGEPH.nc file.
     730            2 :    call cumulant_driver(dtfil, dtset, qp_ebands, cryst, comm)
     731              : 
     732              :  case (10)
     733              :    ! Estimate polaron effective mass in the triply-degenerate VB or CB cubic case
     734            1 :    if (my_rank == master) call frohlichmodel_polaronmass(frohlich, cryst, dtset, efmasdeg, efmasval, ifc)
     735              : 
     736              :  case (11)
     737              :    ! Compute and write e-ph matrix elements to GSTORE.nc file.
     738            5 :    if (dtfil%filgstorein /= ABI_NOFILE) then
     739              :      ! Init gstore from pre-existent file. gstore_gname and read_dw are not relevant here.
     740            0 :      call wrtout(units, sjoin(" Restarting GSTORE computation from:", dtfil%filgstorein))
     741              :      call gstore%from_ncpath(dtfil%filgstorein, with_cplex2, dtset, dtfil, cryst, qp_ebands, ifc, &
     742            0 :                              "atom", dtset%gstore_gname, .False., comm)
     743              :    else
     744            5 :      gstore_path = strcat(dtfil%filnam_ds(4), "_GSTORE.nc")
     745            5 :      call gstore%init(gstore_path, dtset, dtfil, wfk0_hdr, cryst, qp_ebands, ifc, comm)
     746              :    end if
     747              : 
     748              :    call gstore%compute(wfk0_path, ngfftc, ngfftf, dtset, dtfil, cryst, qp_ebands, ifc, dvdb, &
     749            5 :                        pawfgr, pawang, pawrad, pawtab, psps, mpi_enreg, comm)
     750              : 
     751            5 :    gstore_path = gstore%path
     752            5 :    call gstore%free()
     753              : 
     754            5 :    if (len(trim(dtset%gstore_convert)) /= 0) call gstore_convert(gstore_path, dtset, dtfil, cryst, qp_ebands, ifc, comm)
     755              : 
     756              :    ! Wannierize the e-ph matrix elements if the ABIWAN.nc file is provided.
     757            5 :    if (dtfil%filabiwanin /= ABI_NOFILE) then
     758              :      ! Init gstore from pre-existent file. gstore_gname and read_dw are not relevant here.
     759              :      call gstore%from_ncpath(gstore_path, with_cplex2, dtset, dtfil, cryst, qp_ebands, ifc, &
     760            0 :                             "atom", dtset%gstore_gname, .False., comm)
     761            0 :      call gstore%wannierize_and_write_gwan(dvdb, dtfil)
     762            0 :      call gstore%free()
     763              :    end if
     764              : 
     765              :  !case (-11)
     766              :  !  Typical workflow for gstore with Wannierization:
     767              :  !
     768              :  !      1) Wannierize with Abinit and wannier90 in library mode to get the ABIWAN.nc file.
     769              :  !
     770              :  !      2) Pass ABIWAN.nc to the EPH code to compute GSTORE.nc only for the bands included in the wannierization step.
     771              :  !
     772              :  !      3) Call gstore%wannierize_and_write_gwan to compute g(R_e, R_p) and save results to the GWAN.nc file.
     773              :  !
     774              :  !      3) Start new job to compute properties with extra dense k/q-meshes (eph_ngkpt_fine and eph_ngqpt_fine)
     775              :  !
     776              :  !            - Init gstore object with extra dense meshes, possibly filtered and MPI-grid to distribute gvals.
     777              :  !            - Decide if gvals should be precomputed and stored or computed on the fly.
     778              :  !            - Read GWAN.nc file to build gstore%gqk(spin)%wan
     779              :  !            - Pass gstore object to the eph_task routines (what about ks_ebands)?
     780              : 
     781              :  !  call gstore%from_ncpath(gstore_path, with_cplex2, dtset, dtfil, cryst, ks_ebands, ifc, comm)
     782              :  !  call gstore%wannierize(dvdb, dtfil)
     783              :  !  call gstore%free()
     784              :  !  call gstore%init(gstore_path, dtset, dtfil, wfk0_hdr, cryst, ks_ebands, ifc, comm)
     785              :  !  call gstore%free()
     786              : 
     787              :  case (12, -12)
     788              :    ! Migdal-Eliashberg equations (isotropic or anisotropic case).
     789              :    ! Read |g(k,q)|^2 from GSTORE when present. With Wannier input, prepare
     790              :    ! the compact real-space vertex and interpolate it on demand in get_a2fw.
     791              :    call gstore%init_or_from_ncpath(merge(with_cplex1, with_cplex0, dtfil%filgstorein /= ABI_NOFILE), &
     792              :                                    dtset, dtfil, wfk0_hdr, cryst, qp_ebands, ifc, &
     793            0 :                                    "phonon", dtset%gstore_gname, .False., comm, gstore_from_file)
     794            0 :    if (gstore_from_file) then
     795            0 :      call wrtout(units, " Gstore built by reading a pre-existent GSTORE.nc file")
     796              :    else
     797            0 :      call wrtout(units, " Gstore built on the fly via Wannier interpolation (ABIWAN.nc + GWAN.nc)")
     798              :    end if
     799              : 
     800            0 :    if (dtset%eph_task == -12) call migdal_eliashberg_iso(gstore, dtset, dtfil)
     801              :    !if (dtset%eph_task == +12) call migdal_eliashberg_aniso(gstore, dtset, dtfil)
     802            0 :    call gstore%free()
     803              : 
     804              :  case (13)
     805              :    ! Variational polaron equations.
     806              :    call gstore%init_or_from_ncpath(with_cplex2, dtset, dtfil, wfk0_hdr, cryst, qp_ebands, ifc, &
     807            9 :                                    "phonon", dtset%gstore_gname, .False., comm, gstore_from_file)
     808            9 :    if (gstore_from_file) then
     809            9 :      call wrtout(units, sjoin(" Computing variational polaron equations from pre-existent GSTORE file:", dtfil%filgstorein))
     810              :    else
     811            0 :      call wrtout(units, " Gstore built on the fly via Wannier interpolation (ABIWAN.nc + GWAN.nc)")
     812              :    end if
     813            9 :    call varpeq_run(gstore, dtset, dtfil)
     814            9 :    call gstore%free()
     815              : 
     816              :  case (-13)
     817              :    ! Compute polaron wavefunctions and atomic displacements in the supercell and write results to files.
     818            2 :    call varpeq_plot(wfk0_path, ngfftc, dtset, dtfil, cryst, qp_ebands, pawtab, psps, comm)
     819              : 
     820              :  case (14)
     821              :    ! Molecular Berry Curvature.
     822              :    call gstore%init_or_from_ncpath(with_cplex2, dtset, dtfil, wfk0_hdr, cryst, qp_ebands, ifc, &
     823            0 :                                    "atom", dtset%gstore_gname, .False., comm, gstore_from_file)
     824            0 :    call wrtout(units, " Computing Berry curvature")
     825            0 :    if (gstore_from_file) then
     826            0 :      call wrtout(units, " Gstore built by reading a pre-existent GSTORE.nc file")
     827              :    else
     828            0 :      call wrtout(units, " Gstore built on the fly via Wannier interpolation (ABIWAN.nc + GWAN.nc)")
     829              :    end if
     830              : 
     831            0 :    call berry_curvature(gstore, dtset, dtfil)
     832            0 :    call gstore%free()
     833              : 
     834              :  case (15, -15)
     835              :    ! Write average of DFPT potentials to file.
     836            2 :    if (nprocs > 1) then
     837            0 :      ABI_WARNING("eph_task in [15, -15] (average of DFPT potentials) does not support nprocs > 1. Running in sequential.")
     838              :    end if
     839            2 :    dvdb%comm = xmpi_comm_self
     840            2 :    if (my_rank == master) then
     841            2 :      call dvdb%open_read(ngfftf, xmpi_comm_self)
     842            2 :      call dvdb%write_v1qavg(dtset, strcat(dtfil%filnam_ds(4), "_V1QAVG.nc"))
     843              :    end if
     844              : 
     845              :  case (-16, 16)
     846            0 :    if (nprocs > 1) then
     847            0 :      ABI_WARNING("eph_task in [16, -16] (test_phrotation) does not support nprocs > 1. Running in sequential.")
     848              :    end if
     849              : 
     850            0 :    qptopt = qp_ebands%kptopt; if (dtset%qptopt /= 0) qptopt = dtset%qptopt
     851            0 :    call test_phrotation(ifc, cryst, qptopt, dtset%ph_ngqpt, comm)
     852              : 
     853            0 :    dvdb%comm = xmpi_comm_self
     854            0 :    if (my_rank == master) then
     855            0 :      call dvdb%open_read(ngfftf, xmpi_comm_self)
     856              :      ! Compute \delta V_{q,nu)(r) and dump results to netcdf file.
     857            0 :      call ncwrite_v1qnu(dvdb, dtset, ifc, strcat(dtfil%filnam_ds(4), "_V1QNU.nc"))
     858              :    end if
     859              : 
     860              :  case (17)
     861              :    ! Compute e-ph matrix elements with the GWPT formalism.
     862              :    call gwpt_run(wfk0_path, dtfil, ngfftc, ngfftf, dtset, cryst, qp_ebands, dvdb, drhodb, ifc, wfk0_hdr, &
     863            3 :                  pawfgr, pawang, pawrad, pawtab, psps, mpi_enreg, comm)
     864              : 
     865            3 :     if (len(trim(dtset%gstore_convert)) /= 0) then
     866            0 :       gstore_path = strcat(dtfil%filnam_ds(4), "_GSTORE.nc")
     867            0 :       call gstore_convert(gstore_path, dtset, dtfil, cryst, qp_ebands, ifc, comm)
     868              :     end if
     869              : 
     870              :  case (18)
     871              :    ! Compute e-ph matrix elements along path in the BZ.
     872            2 :    call eph_path_run(dtfil, dtset, cryst, ks_ebands, dvdb, ifc, pawfgr, pawang, pawrad, pawtab, psps, comm)
     873              : 
     874              :  case (19)
     875              :    ! Compute matrix elements of W_kk'.
     876              : 
     877            0 :    call wkk_run(wfk0_path, dtfil, ngfftc, ngfftf, dtset, cryst, qp_ebands, wfk0_hdr, pawtab, psps, mpi_enreg, comm)
     878              : 
     879              :  case (20)
     880            0 :    call gstore_convert(dtfil%filgstorein, dtset, dtfil, cryst, qp_ebands, ifc, comm)
     881              : 
     882              :  case default
     883          109 :    ABI_ERROR(sjoin("Unsupported value of eph_task:", itoa(dtset%eph_task)))
     884              :  end select
     885              : 
     886              :  !=====================
     887              :  !==== Free memory ====
     888              :  !=====================
     889          109 :  call cryst%free(); call dvdb%free(); call drhodb%free(); call ddb_hdr%free()
     890          109 :  call ddb%free(); call ifc%free(); call wfk0_hdr%free()
     891          109 :  call ks_ebands%free(); call ks_ebands_kq%free(); call qp_ebands%free()
     892          109 :  call pawfgr_destroy(pawfgr); call destroy_mpi_enreg(mpi_enreg)
     893              : 
     894          109 :  if (allocated(efmasdeg)) call efmasdeg_free_array(efmasdeg)
     895          109 :  if (allocated(efmasval)) call efmasval_free_array(efmasval)
     896          109 :  ABI_SFREE(kpt_efmas)
     897              : 
     898              :  ! Deallocation for PAW.
     899              :  if (dtset%usepaw == 1) then
     900              :    !call pawrhoij_free(pawrhoij)
     901              :    !ABI_FREE(pawrhoij)
     902              :    !call pawfgrtab_free(pawfgrtab)
     903              :    !ABI_FREE(pawfgrtab)
     904              :    !call paw_ij_free(paw_ij)
     905              :    !ABI_FREE(paw_ij)
     906              :    !call paw_an_free(paw_an)
     907              :    !ABI_FREE(paw_an)
     908              :  end if
     909              : 
     910              :  DBG_EXIT('COLL')
     911              : 
     912          545 : end subroutine eph
     913              : !!***
     914              : 
     915              : end module m_eph_driver
     916              : !!***
        

Generated by: LCOV version 2.3-1