LCOV - code coverage report
Current view: top level - src/77_ddb - m_elphon.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 64.7 % 2060 1333
Test Date: 2026-11-06 11:53:17 Functions: 77.8 % 18 14
Branches: 37.1 % 5106 1895

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_elphon
       2                 :             : !! NAME
       3                 :             : !! m_elphon
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !! This routine extracts the electron phonon coupling matrix
       7                 :             : !! elements and calculates related properties - Tc, phonon linewidths...
       8                 :             : !!
       9                 :             : !! COPYRIGHT
      10                 :             : !! Copyright (C) 2004-2026 ABINIT group (MVer, BXu, MG, JPC)
      11                 :             : !! This file is distributed under the terms of the
      12                 :             : !! GNU General Public Licence, see ~abinit/COPYING
      13                 :             : !! or http://www.gnu.org/copyleft/gpl.txt .
      14                 :             : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
      15                 :             : !!
      16                 :             : !! SOURCE
      17                 :             : 
      18                 :             : #if defined HAVE_CONFIG_H
      19                 :             : #include "config.h"
      20                 :             : #endif
      21                 :             : 
      22                 :             : #include "abi_common.h"
      23                 :             : 
      24                 :             : module m_elphon
      25                 :             : 
      26                 :             :  use defs_basis
      27                 :             :  use defs_elphon
      28                 :             :  use m_abicore
      29                 :             :  use m_krank
      30                 :             :  use m_errors
      31                 :             :  use m_xmpi
      32                 :             :  use m_hdr
      33                 :             :  use m_ebands
      34                 :             : 
      35                 :             :  use m_fstrings,        only : int2char4
      36                 :             :  use m_io_tools,        only : open_file, is_open, get_unit
      37                 :             :  use m_time,            only : timein
      38                 :             :  use m_numeric_tools,   only : wrap2_pmhalf, simpson, simpson_int
      39                 :             :  use m_pptools,         only : printvtk
      40                 :             :  use m_dynmat,          only : ftgam_init, ftgam
      41                 :             :  use m_geometry,        only : phdispl_cart2red
      42                 :             :  use m_kpts,            only : getkgrid, smpbz
      43                 :             :  use m_crystal,         only : crystal_t
      44                 :             :  use m_ifc,             only : ifc_type
      45                 :             :  use m_nesting,         only : mknesting, bfactor
      46                 :             :  use m_anaddb_dataset,  only : anaddb_dataset_type
      47                 :             :  use m_eliashberg_1d,   only : eliashberg_1d
      48                 :             :  use m_iogkk,           only : read_el_veloc,  read_gkk
      49                 :             :  use m_bz_mesh,         only : make_path
      50                 :             :  use m_epweights,       only : d2c_weights, ep_el_weights, ep_fs_weights
      51                 :             :  use m_a2ftr,           only : mka2f_tr, mka2f_tr_lova, get_tau_k
      52                 :             :  use m_symkpt,          only : symkpt
      53                 :             : 
      54                 :             :  implicit none
      55                 :             : 
      56                 :             :  private
      57                 :             : !!***
      58                 :             : 
      59                 :             :  public :: elphon
      60                 :             : 
      61                 :             : contains
      62                 :             : 
      63                 :             : !!****f* m_elphon/elphon
      64                 :             : !!
      65                 :             : !! NAME
      66                 :             : !! elphon
      67                 :             : !!
      68                 :             : !! FUNCTION
      69                 :             : !! This routine extracts the electron phonon coupling matrix
      70                 :             : !! elements and calculates related properties - Tc, phonon linewidths...
      71                 :             : !!
      72                 :             : !! INPUTS
      73                 :             : !!   anaddb_dtset=dataset with input variables
      74                 :             : !!     anaddb_dtset%a2fsmear = smearing for alpha2F function
      75                 :             : !!     anaddb_dtset%brav = type of Bravais lattice
      76                 :             : !!     anaddb_dtset%elphsmear = smearing width for gaussian integration
      77                 :             : !!           or buffer in energy for calculations with tetrahedra (telphint=0)
      78                 :             : !!     anaddb_dtset%elph_fermie = input value of Fermi energy
      79                 :             : !!           0 means use value from wfk file
      80                 :             : !!     anaddb_dtset%enunit = governs the units to be used for the output of
      81                 :             : !!           the phonon frequencies and e-ph quantities
      82                 :             : !!     anaddb_dtset%gkk2write= flag to write out gkk2 matrix elements to disk
      83                 :             : !!     anaddb_dtset%gkk_rptwrite= flag to write out real space gkk_rpt matrix elements to disk
      84                 :             : !!     anaddb_dtset%gkqwrite= flag to write out gkq matrix elements to disk
      85                 :             : !!     anaddb_dtset%ep_b_min= first band taken into account in FS integration (if telphint==2)
      86                 :             : !!     anaddb_dtset%ep_b_max= last band taken into account in FS integration (if telphint==2)
      87                 :             : !!     anaddb_dtset%prtfsurf = integer flag for the output of the Fermi surface (XCrysden file format)
      88                 :             : !!     anaddb_dtset%prtnest = integer flag for the calculation of the nesting function
      89                 :             : !!     anaddb_dtset%ifcflag = flag for IFC matrices in anaddb calling routine
      90                 :             : !!           the IFCs are presumed to be known!
      91                 :             : !!     anaddb_dtset%ifltransport= flag for transport properties (no=0: yes_LOVA=1; yes_nonLOVA=2 )
      92                 :             : !!     anaddb_dtset%kptrlatt=kpoint grid generating vectors, as in abinit
      93                 :             : !!     anaddb_dtset%kptrlatt_fine=kpoint grid generating vectors, for fine grid used in FS integration
      94                 :             : !!     anaddb_dtset%mustar = parameter for Coulombic pseudo-potential in McMillan T_c calculation
      95                 :             : !!     anaddb_dtset%ngqpt(3)=integers defining the number of points in the qpt sampling
      96                 :             : !!     anaddb_dtset%nqpath=number of vertices in the path in reciprocal space, for band structure
      97                 :             : !!           and phonon linewidth output
      98                 :             : !!     anaddb_dtset%nqshft= number of shift vectors for defining the sampling of q points
      99                 :             : !!     anaddb_dtset%ntemper = number of temperature points to calculate, from tempermin to
     100                 :             : !!           tempermin+ntemper*temperinc
     101                 :             : !!     anaddb_dtset%qpath=vertices in the path in reciprocal space, for band structure
     102                 :             : !!           and phonon linewidth output
     103                 :             : !!     anaddb_dtset%q1shft(3,4) =qpoint shifts considered
     104                 :             : !!     anaddb_dtset%telphint = flag for integration over the FS with 0=tetrahedra 1=gaussians
     105                 :             : !!     anaddb_dtset%tempermin = minimum temperature at which resistivity etc are calculated (in K)
     106                 :             : !!     anaddb_dtset%temperinc = interval temperature grid on which resistivity etc are calculated (in K)
     107                 :             : !!     anaddb_dtset%ep_keepbands = flag to keep gamma matrix dependence on electronic bands
     108                 :             : !! Cryst<crystal_t>=data type gathering info on the crystalline structure.
     109                 :             : !! Ifc<ifc_type>=Object containing the interatomic force constants.
     110                 :             : !!     atmfrc  = inter-atomic force constants from anaddb
     111                 :             : !!     rpt(3,nprt) =canonical positions of R points in the unit cell
     112                 :             : !!     nrpt =number of real space points used to integrate IFC (for interpolation of dynamical matrices)
     113                 :             : !!     wghatm(natom,natom,nrpt) =Weight for the pair of atoms and the R vector
     114                 :             : !! anaddb_dtset%prefix_outdata=character strings giving file names
     115                 :             : !! comm=MPI communicator.
     116                 :             : !!
     117                 :             : !! OUTPUT
     118                 :             : !!
     119                 :             : !! NOTES
     120                 :             : !!  inspired to a large extent by epcouple.f from the DecAFT package by J. Kay Dewhurst
     121                 :             : !!  most inputs taken from mkifc.f
     122                 :             : !!  in anaddb anaddb_dtset%ifcflag must be 1 such that the IFC are calculated in atmfrc prior to calling elphon
     123                 :             : !!
     124                 :             : !!  brav not taken into account propely in all of the code. (MG?)
     125                 :             : !!
     126                 :             : !!  could choose to make a full 3 dimensional kpt array (:,:,:). Easier for many operations
     127                 :             : !!
     128                 :             : !! SOURCE
     129                 :             : 
     130                 :          15 : subroutine elphon(anaddb_dtset,Cryst,Ifc,comm)
     131                 :             : 
     132                 :             : !Arguments ------------------------------------
     133                 :             : !scalars
     134                 :             :  type(anaddb_dataset_type),intent(inout) :: anaddb_dtset
     135                 :             :  type(crystal_t),intent(in) :: Cryst
     136                 :             :  type(ifc_type),intent(inout) :: Ifc
     137                 :             :  integer,intent(in) :: comm
     138                 :             : 
     139                 :             : !Local variables-------------------------------
     140                 :             : !scalars
     141                 :             :  integer,parameter :: timrev2=2,space_group0=0,master=0
     142                 :             :  integer :: ikpt_fine,ierr,unitgkk, unit_epts,iband,ibandp,ii
     143                 :             :  integer :: ikpt,jkpt,kkpt, ik1,ik2,ik3,nk1, nk2, nk3
     144                 :             :  integer :: iqpt,isppol,n1wf,nband,natom,onegkksize
     145                 :             :  integer :: timrev,unitfskgrid,qtor,idir,iFSkpq,symrankkpt,ikpt_irr
     146                 :             :  integer :: ep_prt_wtk ! eventually to be made into an input variable
     147                 :             :  integer :: fform,ie,ie1,ie2,i_start,i_end
     148                 :             :  integer :: ssp,s1,s2,tmp_nenergy, top_vb,nproc,me
     149                 :             :  integer :: nkpt_tmp
     150                 :             :  real(dp) :: max_occ,realdp_ex,res !,ss
     151                 :             :  real(dp) :: tcpu, twall, tcpui, twalli
     152                 :             :  real(dp) :: e1, e2, btocm3,diff, omega_max
     153                 :             :  real(dp) :: e_vb_max, e_cb_min, etemp_vb
     154                 :             :  logical :: make_gkk2,use_afm,use_tr
     155                 :             :  character(len=500) :: message
     156                 :             :  character(len=fnlen) :: fname,elph_base_name,ddkfilename,gkk_fname
     157                 :             :  character(len=fnlen) :: nestname
     158                 :          15 :  type(elph_tr_type) :: elph_tr_ds
     159                 :          15 :  type(elph_type) :: elph_ds
     160                 :          15 :  type(hdr_type) :: hdr,hdr1
     161                 :          15 :  type(ebands_t) :: Bst
     162                 :             : !arrays
     163                 :             :  integer :: s1ofssp(4), s2ofssp(4)
     164                 :             :  integer :: qptrlatt(3,3),kptrlatt_fine(3,3)
     165                 :          15 :  integer,allocatable :: indkpt1(:)
     166                 :          15 :  integer,allocatable :: FSfullpqtofull(:,:)
     167                 :          15 :  integer,allocatable :: qpttoqpt(:,:,:)
     168                 :          15 :  integer,allocatable :: pair2red(:,:), red2pair(:,:), bz2ibz_smap(:,:)
     169                 :             :  !real(dp) :: acell_in(3),rprim_in(3,3),rprim(3,3),acell(3),
     170                 :             :  real(dp) :: kpt(3),shiftk(3)
     171                 :          15 :  real(dp),allocatable :: wtk_fullbz(:),wtk_folded(:)
     172                 :          15 :  real(dp),allocatable :: a2f_1d(:),dos_phon(:)
     173                 :          15 :  real(dp),allocatable :: eigenGS(:,:,:),eigenGS_fine(:,:,:)
     174                 :          15 :  real(dp),allocatable :: gam_qpt(:,:,:),gam_rpt(:,:,:)
     175                 :          15 :  real(dp),allocatable :: v_surf(:,:,:,:,:,:)
     176                 :          15 :  real(dp),allocatable :: tmp_veloc_sq1(:,:), tmp_veloc_sq2(:,:)
     177                 :          15 :  real(dp),allocatable :: coskr(:,:), sinkr(:,:)
     178                 :             : ! *************************************************************************
     179                 :             : 
     180         [ +  + ]:        1230 :  write(message, '(a,a,(80a),a,a,a,a)' ) ch10,('=',ii=1,80),ch10,ch10,&
     181         [ +  - ]:        1245 : & ' Properties based on electron-phonon coupling ',ch10
     182                 :          15 :  call wrtout(std_out,message,'COLL')
     183                 :          15 :  call wrtout(ab_out,message,'COLL')
     184                 :             : 
     185                 :          15 :  call timein(tcpui,twalli)
     186                 :             :  write(message, '(a,f11.3,a,f11.3,a)' )&
     187                 :          15 : & '-begin elphon at tcpu',tcpui,'  and twall',twalli,' sec'
     188                 :          15 :  call wrtout(std_out,message,'COLL')
     189                 :             : 
     190                 :          15 :  nproc = xmpi_comm_size(comm); me = xmpi_comm_rank(comm)
     191                 :             : 
     192                 :          15 :  write(message, '(a,i0,a,i0)' )'- running on ', nproc,'  cpus me = ', me
     193                 :          15 :  call wrtout(std_out,message,'PERS')
     194                 :          15 :  write(std_out,*) message
     195                 :             : 
     196                 :             : !==================================
     197                 :             : !Initialization of some variables
     198                 :             : !==================================
     199                 :             : 
     200         [ +  - ]:          15 :  if (master == me) then
     201                 :          15 :    gkk_fname = anaddb_dtset%filename_gkk
     202         [ -  + ]:          15 :    ABI_CHECK(len_trim(gkk_fname) > 0, "gkk_fname is not defined")
     203         [ -  + ]:          15 :    if (open_file(gkk_fname,message,newunit=unitgkk,form="unformatted",status="old",action="read") /=0) then
     204                 :           0 :      ABI_ERROR(message)
     205                 :             :    end if
     206                 :             :  end if
     207                 :             : 
     208         [ +  - ]:          15 :  elph_base_name=trim(anaddb_dtset%prefix_outdata)//"_ep"
     209                 :          15 :  ddkfilename=trim(anaddb_dtset%filename_ddk)
     210         [ -  + ]:          15 :  ABI_CHECK(len_trim(ddkfilename) > 0, "ddkfilename is not defined")
     211                 :             : 
     212                 :             : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     213                 :             : 
     214                 :          15 :  natom = Cryst%natom
     215                 :          15 :  elph_ds%mustar       = anaddb_dtset%mustar        ! input mustar
     216                 :          15 :  elph_ds%nbranch      = 3*natom                    ! number of phonon modes = 3 * natom
     217                 :          15 :  elph_ds%natom        = natom                      !
     218                 :          15 :  elph_ds%ep_keepbands = anaddb_dtset%ep_keepbands  ! flag to sum over bands
     219                 :          15 :  elph_ds%a2fsmear     = anaddb_dtset%a2fsmear      ! smearing for Eliashberg functions
     220                 :          15 :  elph_ds%elphsmear    = anaddb_dtset%elphsmear     ! smearing for Eliashberg functions
     221                 :          15 :  elph_ds%ep_b_min     = anaddb_dtset%ep_b_min
     222                 :          15 :  elph_ds%ep_b_max     = anaddb_dtset%ep_b_max
     223                 :          15 :  elph_ds%telphint     = anaddb_dtset%telphint
     224   [ +  +  +  + ]:         195 :  elph_ds%kptrlatt     = anaddb_dtset%kptrlatt
     225   [ +  +  +  + ]:         195 :  elph_ds%kptrlatt_fine= anaddb_dtset%kptrlatt_fine
     226                 :          15 :  elph_ds%tempermin    = anaddb_dtset%tempermin
     227                 :          15 :  elph_ds%temperinc    = anaddb_dtset%temperinc
     228                 :          15 :  elph_ds%ntemper      = anaddb_dtset%ntemper
     229                 :          15 :  elph_ds%use_k_fine   = anaddb_dtset%use_k_fine
     230                 :          15 :  elph_ds%ep_int_gkk   = anaddb_dtset%ep_int_gkk
     231                 :          15 :  elph_ds%ep_nspline   = anaddb_dtset%ep_nspline
     232                 :          15 :  elph_ds%ep_scalprod  = anaddb_dtset%ep_scalprod
     233                 :          15 :  elph_ds%prtbltztrp   = anaddb_dtset%prtbltztrp
     234                 :             : 
     235                 :          15 :  elph_ds%tuniformgrid = 1
     236                 :          15 :  elph_ds%na2f         = 400                        ! maximum number of Matsubara frequencies.
     237                 :          15 :  elph_ds%ep_lova      = 0                          ! 1 for lova and 0 for general
     238                 :          15 :  elph_ds%nenergy      = 8
     239                 :          15 :  btocm3 = 1.4818474347690475d-25
     240                 :             : 
     241                 :             : !The nenergy needs to be 1) large enough to converge the integral, 2) greater
     242                 :             : !than the max phonon energy.
     243                 :             : !elph_ds%nenergy      = INT(8*(anaddb_dtset%tempermin+anaddb_dtset%ntemper*anaddb_dtset%temperinc)/ &
     244                 :             : !&                              (anaddb_dtset%tempermin+anaddb_dtset%temperinc))  ! number of energy levels
     245                 :             : 
     246                 :          15 :  write(message,'(a,i6)')' The initial number of energy levels above/below Ef is set to be :',elph_ds%nenergy
     247                 :          15 :  call wrtout(std_out,message,'COLL')
     248                 :             : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     249                 :             : 
     250                 :             : !The precise number used depends on the value of Tc:
     251                 :             : !they span $w_n = (2n+1) \pi T_c$  where $abs(w_n) < w_{cutoff}$
     252                 :             : !ie $|n| < n_{cutoff} = ( \frac{w_{cutoff}}{\pi T_c} ) / 2$
     253                 :             : 
     254                 :             : !save gkk data for full kpoints to file on disk
     255                 :             : 
     256                 :          15 :  elph_ds%gkqwrite     = anaddb_dtset%gkqwrite
     257                 :          15 :  elph_ds%gkk_rptwrite = anaddb_dtset%gkk_rptwrite
     258                 :          15 :  elph_ds%gkk2write    = anaddb_dtset%gkk2write
     259                 :             : 
     260                 :             : !This should never be turned off: symmetrization of elphon matrix elements in complete_gkk. See get_all_gkq
     261                 :          15 :  elph_ds%symgkq=anaddb_dtset%symgkq
     262                 :             : 
     263                 :          15 :  elph_ds%elph_base_name = trim(elph_base_name)
     264                 :             : 
     265                 :             :  !MG: @Matthieu: Why this? Now we should always use the value of rprim and acell reported in IFC
     266                 :             :  !rprim_in  = Ifc%rprim
     267                 :             :  !acell_in = Ifc%acell
     268                 :             : 
     269                 :             : !normalize input rprim and acell.
     270                 :             :  !do ii=1,3
     271                 :             :  !  ss = sqrt(rprim_in(1,ii)**2+rprim_in(2,ii)**2+rprim_in(3,ii)**2)
     272                 :             :  !  rprim(:,ii) = rprim_in(:,ii)/ss
     273                 :             :  !  acell(ii) = acell_in(ii) * ss
     274                 :             :  !end do
     275                 :             : 
     276                 :             : !make dimension-ful rprimd and gprimd for transformation of derivatives to cartesian coordinates.
     277                 :             :  !call mkrdim(acell,rprim,rprimd)
     278                 :             :  !call matr3inv(rprimd,gprimd)
     279                 :             : 
     280                 :             :  !rprimd = cryst%rprimd
     281                 :             :  !gprimd = cryst%gprimd
     282                 :             : 
     283                 :             : !===================
     284                 :             : !Check some inputs
     285                 :             : !===================
     286         [ -  + ]:          15 :  if (Cryst%nsym==1) then
     287                 :           0 :    write (message,'(7a)')ch10,&
     288                 :           0 : &   ' elphon: COMMENT- ',ch10,&
     289                 :           0 : &   ' Symmetries are not used! ',ch10,&
     290                 :           0 : &   ' Full matrix elements must be supplied for all perturbations and qpoints!',ch10
     291                 :           0 :    call wrtout(std_out,message,'COLL')
     292                 :           0 :    call wrtout(ab_out,message,'COLL')
     293   [ #  #  #  #  :           0 :    if ( ANY( ABS(Cryst%tnons(:,1)) > tol10) ) then
                   #  # ]
     294                 :           0 :      ABI_ERROR('nsym==1 but the symmetry is not the identity')
     295                 :             :    end if
     296                 :             :  end if
     297                 :             : 
     298         [ -  + ]:          15 :  if (anaddb_dtset%ifcflag/=1) then
     299                 :             :    write(message,'(a,i0)')&
     300                 :           0 : &   ' ifcflag should be set to 1 since the IFC matrices are supposed to exist but ifcflag= ',anaddb_dtset%ifcflag
     301                 :           0 :    ABI_ERROR(message)
     302                 :             :  end if
     303                 :             : 
     304                 :          15 :  call timein(tcpu,twall)
     305                 :             :  write(message, '(a,f11.3,a,f11.3,a)' )&
     306                 :          15 : & '-elphon begin setup after tcpu',tcpu-tcpui,'  and twall',twall-twalli,' sec'
     307                 :          15 :  call wrtout(std_out,message,'COLL')
     308                 :          15 :  tcpui = tcpu
     309                 :          15 :  twalli = twall
     310                 :             : 
     311                 :             : !=================================
     312                 :             : !Set up the full grid of qpoints
     313                 :             : !=================================
     314                 :             : !use time reversal symmetry always when possible for kpoint reduction,
     315                 :             : !and suppose it has been used in WF generation
     316                 :             : !not used for the moment: values are always taken from input files.
     317                 :          15 :  timrev = 1
     318                 :          15 :  call ep_setupqpt(elph_ds,cryst,anaddb_dtset,qptrlatt,timrev)
     319                 :             : 
     320                 :             : !====================================
     321                 :             : !Read the GS header of the GKK file
     322                 :             : !this will give the phon grid of k
     323                 :             : !and the Fermi surface integration weights
     324                 :             : !====================================
     325                 :          15 :  call wrtout (std_out,' elphon: reading and checking the GS header of the GKK file','COLL')
     326                 :             : 
     327         [ +  - ]:          15 :  if (master == me) then
     328                 :          15 :    call rchkGSheader(hdr,natom,nband,unitgkk)
     329                 :             :  end if
     330                 :             : 
     331                 :             : !the following is for the non master nodes
     332                 :          15 :  call hdr%bcast(master, me, comm)
     333                 :          15 :  call xmpi_bcast(nband, master,comm,ierr)
     334                 :          15 :  elph_ds%nband = nband
     335                 :             : 
     336                 :          15 :  elph_ds%nsppol =hdr%nsppol
     337                 :          15 :  elph_ds%nspinor=hdr%nspinor
     338                 :             : 
     339                 :             : !in spinor or spin polarized case, orbitals have occupation <= 1 instead of 2
     340                 :          15 :  max_occ = one
     341         [ -  + ]:          15 :  if (hdr%nspinor == 2) max_occ = half ! this accounts for the doubling of the num of bands, even though spin channels are not well defined
     342         [ +  + ]:          15 :  if (elph_ds%nsppol > 1) max_occ = one
     343                 :          15 :  write (std_out,*) ' max_occ factor  ', max_occ
     344                 :             : 
     345                 :          15 :  elph_ds%occ_factor = one
     346   [ +  -  +  + ]:          15 :  if (hdr%nspinor == 1 .and. hdr%nsppol == 1) then
     347                 :             :    elph_ds%occ_factor = one
     348         [ -  + ]:           1 :  else if (hdr%nspinor == 2) then
     349                 :           0 :    elph_ds%occ_factor = two
     350                 :             :  else if (hdr%nsppol == 2) then
     351                 :             :    elph_ds%occ_factor = one
     352                 :             :  end if
     353                 :             : 
     354                 :             : !==================================================
     355                 :             : !Read GS eigenvalues for each irreducible kpt and
     356                 :             : !number of 1WF files contributing to the GKK file
     357                 :             : !==================================================
     358                 :             : 
     359   [ -  +  +  -  :          75 :  ABI_MALLOC(eigenGS,(nband,hdr%nkpt,elph_ds%nsppol))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                +  -  + ]
     360                 :             : 
     361         [ +  - ]:          15 :  if (master == me) then
     362         [ +  + ]:          31 :    do isppol=1,elph_ds%nsppol
     363         [ +  + ]:        1351 :      do ikpt=1,hdr%nkpt
     364                 :        1336 :        read(unitgkk) eigenGS(:,ikpt,isppol)
     365                 :             :      end do
     366                 :             :    end do
     367                 :             : 
     368                 :             : !  read number of 1WF files contributing to the GKK file
     369                 :          15 :    read(unitgkk) n1wf
     370                 :          15 :    write(message,'(a,i0)')' elphon : number of perturbations in the gkk file = ',n1wf
     371                 :          15 :    call wrtout(std_out,message,'COLL')
     372                 :             :  end if
     373                 :          15 :  call xmpi_bcast(n1wf, master, comm, ierr)
     374                 :          15 :  call xmpi_bcast(eigenGS, master, comm, ierr)
     375                 :             : 
     376                 :             : !==================================================
     377                 :             : !Set elph_ds%fermie: either comes from anaddb input file or from wfk file
     378                 :             : !==================================================
     379                 :          15 :  elph_ds%fermie = hdr%fermie
     380                 :             :  !elph_ds%nelect = hdr_get_nelect_byocc(Hdr)
     381                 :          15 :  elph_ds%nelect = Hdr%nelect
     382         [ +  + ]:          15 :  if (abs(anaddb_dtset%elph_fermie) > tol10) then
     383                 :           2 :    elph_ds%fermie = anaddb_dtset%elph_fermie
     384                 :           2 :    write(message,'(a,E20.12)')' Fermi level set by the user at :',elph_ds%fermie
     385                 :           2 :    call wrtout(std_out,message,'COLL')
     386                 :           2 :    call Bst%from_hdr(Hdr,nband,eigenGS)
     387         [ +  + ]:          13 :  else if (abs(anaddb_dtset%ep_extrael) > tol10) then
     388         [ -  + ]:           1 :    if (abs(anaddb_dtset%ep_extrael) > 1.0d2) then
     389                 :           0 :      write(message,'(a,E20.12)')' Doping set by the user is (negative for el doping) :',&
     390                 :           0 : &     anaddb_dtset%ep_extrael
     391                 :           0 :      call wrtout(std_out,message,'COLL')
     392                 :           0 :      anaddb_dtset%ep_extrael = anaddb_dtset%ep_extrael*cryst%ucvol*btocm3*(-1.0d0)
     393                 :             :    end if
     394                 :           1 :    write(message,'(a,E20.12)')' Additional electrons per unit cell set by the user at :',&
     395                 :           2 : &   anaddb_dtset%ep_extrael
     396                 :           1 :    call wrtout(std_out,message,'COLL')
     397                 :           1 :    elph_ds%nelect = elph_ds%nelect + anaddb_dtset%ep_extrael
     398                 :           1 :    call bst%from_hdr(Hdr,nband,eigenGS,nelect=elph_ds%nelect)
     399                 :             : 
     400                 :             : !  set Bst to use FD occupations:
     401                 :           1 :    Bst%occopt = 3
     402                 :             : !   Bst%tsmear = 0.00001_dp ! is this small etol9 Bst%tsmeatol90001_dp ! last used
     403                 :           1 :    Bst%tsmear = tol9 ! is this small etol9 Bst%tsmeatol90001_dp ! last used
     404                 :             : !  Calculate occupation numbers.
     405                 :           1 :    call Bst%update_occ(-99.99_dp)
     406                 :           1 :    write(message,'(a,E20.12)')' Fermi level is now calculated to be :',Bst%fermie
     407                 :           1 :    call wrtout(std_out,message,'COLL')
     408                 :           1 :    elph_ds%fermie = BSt%fermie
     409                 :             :  else
     410                 :          12 :    call bst%from_hdr(Hdr,nband,eigenGS)
     411                 :             :  end if
     412                 :          15 :  call wrtout(std_out,message,'COLL')
     413                 :             : 
     414                 :             : !====================================================================
     415                 :             : !Setup of the phon k-grid :
     416                 :             : !1) get bands near Ef
     417                 :             : !====================================================================
     418                 :             :  call get_fs_bands(eigenGS,hdr,elph_ds%fermie,anaddb_dtset%ep_b_min, anaddb_dtset%ep_b_max,&
     419                 :          15 : & elph_ds%minFSband,elph_ds%maxFSband,elph_ds%k_phon%nkptirr)
     420                 :             : 
     421                 :          15 :  elph_ds%nFSband = elph_ds%maxFSband - elph_ds%minFSband + 1
     422                 :             : 
     423         [ +  + ]:          15 :  if (anaddb_dtset%ep_prt_yambo==1) then
     424                 :           1 :    elph_ds%nFSband = nband
     425                 :           1 :    elph_ds%minFSband = 1
     426                 :           1 :    elph_ds%maxFSband = nband
     427                 :             :  end if
     428                 :             : 
     429                 :             : !Modify the band gap by sissor shift of the CB
     430         [ -  + ]:          15 :  if (abs(anaddb_dtset%band_gap) < 10.0d0) then
     431                 :           0 :    anaddb_dtset%band_gap = anaddb_dtset%band_gap*0.036749309 ! eV2Ha
     432         [ #  # ]:           0 :    do isppol=1,elph_ds%nsppol
     433                 :             : 
     434                 :             : !First find where the gap is
     435                 :           0 :      etemp_vb = 999.0d0
     436                 :           0 :      top_vb = elph_ds%minFSband
     437         [ #  # ]:           0 :      do iband = elph_ds%minFSband, elph_ds%maxFSband
     438   [ #  #  #  #  :           0 :        e_vb_max = maxval(eigenGS(iband,:,isppol))
             #  #  #  # ]
     439         [ #  # ]:           0 :        if (dabs(e_vb_max-elph_ds%fermie) < etemp_vb) then
     440                 :           0 :          etemp_vb = dabs(e_vb_max-elph_ds%fermie)
     441                 :           0 :          top_vb = iband
     442                 :             :        end if
     443                 :             :      end do
     444         [ #  # ]:           0 :      do iband = top_vb, elph_ds%maxFSband
     445   [ #  #  #  #  :           0 :        e_vb_max = maxval(eigenGS(iband,:,isppol))
             #  #  #  # ]
     446   [ #  #  #  #  :           0 :        if (dabs(e_vb_max-maxval(eigenGS(top_vb,:,isppol))) < tol6) then
          #  #  #  #  #  
                      # ]
     447                 :           0 :          etemp_vb = dabs(e_vb_max-elph_ds%fermie)
     448                 :           0 :          top_vb = iband
     449                 :             :        end if
     450                 :             :      end do
     451   [ #  #  #  #  :           0 :      e_vb_max = maxval(eigenGS(top_vb,:,isppol))
             #  #  #  # ]
     452   [ #  #  #  #  :           0 :      e_cb_min = minval(eigenGS(top_vb+1,:,isppol))
             #  #  #  # ]
     453                 :           0 :      write(message,'(a,E20.12,2x,E20.12)')' elphon : original fermi energy = ', elph_ds%fermie
     454                 :           0 :      call wrtout(std_out,message,'COLL')
     455                 :           0 :      write(message,'(a,E20.12,2x,E20.12)')' elphon : top of VB, bottom of CB = ',e_vb_max, e_cb_min
     456                 :           0 :      call wrtout(std_out,message,'COLL')
     457                 :             : 
     458         [ #  # ]:           0 :      do iband = top_vb+1, elph_ds%maxFSband
     459         [ #  # ]:           0 :        eigenGS(iband,:,isppol) = eigenGS(iband,:,isppol) + (anaddb_dtset%band_gap-(e_cb_min-e_vb_max))
     460                 :             :      end do
     461                 :             :    end do !nsppol
     462                 :             : 
     463                 :             : !! recalculate Fermi level
     464                 :             :    !elph_ds%nelect = hdr_get_nelect_byocc(Hdr)
     465                 :           0 :    elph_ds%nelect = Hdr%nelect
     466         [ #  # ]:           0 :    if (abs(anaddb_dtset%elph_fermie) > tol10) then
     467                 :           0 :      elph_ds%fermie = anaddb_dtset%elph_fermie
     468                 :           0 :      write(message,'(a,E20.12)')' Fermi level set by the user at :',elph_ds%fermie
     469                 :           0 :      call wrtout(std_out,message,'COLL')
     470                 :           0 :      call bst%from_hdr(Hdr,nband,eigenGS)
     471         [ #  # ]:           0 :    else if (abs(anaddb_dtset%ep_extrael) > tol10) then
     472                 :           0 :      write(message,'(a,E20.12)')' Additional electrons per unit cell set by the user at :',anaddb_dtset%ep_extrael
     473                 :           0 :      call wrtout(std_out,message,'COLL')
     474                 :           0 :      elph_ds%nelect = elph_ds%nelect + anaddb_dtset%ep_extrael
     475                 :           0 :      call bst%from_hdr(Hdr,nband,eigenGS,nelect=elph_ds%nelect)
     476                 :             : 
     477                 :             : !    set Bst to use FD occupations:
     478                 :           0 :      Bst%occopt = 3
     479                 :             : !     Bst%tsmear = 0.00001_dp ! is this small etol9 Bst%tsmeatol90001_dp ! last used
     480                 :           0 :      Bst%tsmear = tol9 ! is this small etol9 Bst%tsmeatol90001_dp ! last used
     481                 :             : !    Calculate occupation numbers.
     482                 :           0 :      call Bst%update_occ(-99.99_dp)
     483                 :           0 :      write(message,'(a,E20.12)')' Fermi level is now calculated to be :',Bst%fermie
     484                 :           0 :      call wrtout(std_out,message,'COLL')
     485                 :           0 :      elph_ds%fermie = BSt%fermie
     486                 :             :    else
     487                 :           0 :      call bst%from_hdr(Hdr,nband,eigenGS)
     488                 :             :    end if
     489                 :           0 :    call wrtout(std_out,message,'COLL')
     490                 :             :  end if !modify band_gap
     491                 :             : 
     492         [ +  + ]:          15 :  if (elph_ds%ep_keepbands == 0) then !we are summing over bands
     493                 :          10 :    elph_ds%ngkkband = 1
     494         [ +  - ]:           5 :  else if (elph_ds%ep_keepbands == 1) then
     495                 :             : !  keep the band dependency btw elph_ds%minFSband and elph_ds%maxFSband
     496                 :           5 :    elph_ds%ngkkband = elph_ds%nFSband
     497                 :             :  else
     498                 :           0 :    write(message,'(a,i0)')' ep_keepbands must be 0 or 1 while it is: ',elph_ds%ep_keepbands
     499                 :           0 :    ABI_BUG(message)
     500                 :             :  end if
     501                 :             : 
     502                 :          15 :  write(message,'(a,i0,2x,i0)')' elphon : minFSband, maxFSband = ',elph_ds%minFSband,elph_ds%maxFSband
     503                 :          15 :  call wrtout(std_out,message,'COLL')
     504                 :             : 
     505                 :             : 
     506   [ -  +  +  -  :          45 :  ABI_MALLOC(elph_ds%k_phon%kptirr,(3,elph_ds%k_phon%nkptirr))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     507   [ -  +  +  -  :          45 :  ABI_MALLOC(elph_ds%k_phon%irredtoGS,(elph_ds%k_phon%nkptirr))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     508                 :             : 
     509                 :             : !====================================================================
     510                 :             : !2) order irred k-points
     511                 :             : !====================================================================
     512         [ +  - ]:          15 :  if (master == me) then
     513                 :          15 :    call order_fs_kpts(hdr%kptns, hdr%nkpt, elph_ds%k_phon%kptirr,elph_ds%k_phon%nkptirr,elph_ds%k_phon%irredtoGS)
     514                 :             :  end if
     515                 :          15 :  call xmpi_bcast(elph_ds%k_phon%nkptirr, master, comm, ierr)
     516                 :          15 :  call xmpi_bcast(elph_ds%k_phon%kptirr, master, comm, ierr)
     517                 :          15 :  call xmpi_bcast(elph_ds%k_phon%irredtoGS, master, comm, ierr)
     518                 :             : 
     519                 :             : !==========================================
     520                 :             : !3) reconstruct full kgrid from irred kpoints,
     521                 :             : !==========================================
     522                 :          15 :  call mkFSkgrid (elph_ds%k_phon, Cryst%nsym, Cryst%symrec, timrev)
     523                 :             : 
     524                 :             : ! check that kptrlatt is coherent with kpt found here
     525                 :          15 :  nkpt_tmp = elph_ds%kptrlatt(1,1)*elph_ds%kptrlatt(2,2)*elph_ds%kptrlatt(3,3)
     526   [ +  +  +  +  :         195 :  if (sum(abs(elph_ds%kptrlatt(:,:))) /= nkpt_tmp) then
                   +  + ]
     527                 :           5 :    ABI_WARNING(' the input kptrlatt is not diagonal... ')
     528                 :             :  end if
     529   [ -  +  -  - ]:          15 :  if (anaddb_dtset%ifltransport > 1 .and. nkpt_tmp /= elph_ds%k_phon%nkpt) then
     530                 :             :    write(message,'(a,i0,a,i0)')&
     531                 :           0 : &   ' the input kptrlatt is inconsistent  ', nkpt_tmp, " /= ", elph_ds%k_phon%nkpt
     532                 :           0 :    ABI_ERROR(message)
     533                 :             :  end if
     534                 :             : 
     535         [ -  + ]:          15 :  if (anaddb_dtset%ifltransport==3 ) then
     536                 :             : !====================================================================
     537                 :             : ! The real irred kpt, now only used by get_tau_k
     538                 :             : !====================================================================
     539                 :             : 
     540   [ #  #  #  #  :           0 :    ABI_MALLOC(indkpt1,(elph_ds%k_phon%nkpt))
          #  #  #  #  #  
                #  #  # ]
     541   [ #  #  #  #  :           0 :    ABI_MALLOC(wtk_fullbz,(elph_ds%k_phon%nkpt))
          #  #  #  #  #  
                #  #  # ]
     542   [ #  #  #  #  :           0 :    ABI_MALLOC(wtk_folded,(elph_ds%k_phon%nkpt))
             #  #  #  # ]
     543   [ #  #  #  #  :           0 :    ABI_MALLOC(bz2ibz_smap, (6, elph_ds%k_phon%nkpt))
          #  #  #  #  #  
                #  #  # ]
     544                 :             : 
     545         [ #  # ]:           0 :    wtk_fullbz(:) = one/dble(elph_ds%k_phon%nkpt) !weights normalized to unity
     546                 :             :    call symkpt(0,cryst%gmet,indkpt1,0,elph_ds%k_phon%kpt,elph_ds%k_phon%nkpt,elph_ds%k_phon%new_nkptirr,&
     547                 :           0 : &   Cryst%nsym,Cryst%symrec,timrev,wtk_fullbz,wtk_folded, bz2ibz_smap, xmpi_comm_self)
     548                 :             : 
     549         [ #  # ]:           0 :    ABI_FREE(bz2ibz_smap)
     550                 :             : 
     551                 :           0 :    write (message,'(2a,i0)')ch10,' Number of irreducible k-points = ',elph_ds%k_phon%new_nkptirr
     552                 :           0 :    call wrtout(std_out,message,'COLL')
     553                 :             : 
     554   [ #  #  #  #  :           0 :    ABI_MALLOC(elph_ds%k_phon%new_kptirr,(3,elph_ds%k_phon%new_nkptirr))
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     555   [ #  #  #  #  :           0 :    ABI_MALLOC(elph_ds%k_phon%new_wtkirr,(elph_ds%k_phon%new_nkptirr))
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     556   [ #  #  #  #  :           0 :    ABI_MALLOC(elph_ds%k_phon%new_irredtoGS,(elph_ds%k_phon%new_nkptirr))
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     557                 :             : 
     558                 :           0 :    ikpt_irr = 0
     559         [ #  # ]:           0 :    do ikpt=1,elph_ds%k_phon%nkpt
     560         [ #  # ]:           0 :      if (wtk_folded(ikpt) /= zero) then
     561                 :           0 :        ikpt_irr = ikpt_irr + 1
     562         [ #  # ]:           0 :        elph_ds%k_phon%new_kptirr(:,ikpt_irr) = elph_ds%k_phon%kpt(:,ikpt)
     563                 :           0 :        elph_ds%k_phon%new_wtkirr(ikpt_irr) = wtk_folded(ikpt)
     564                 :           0 :        elph_ds%k_phon%new_irredtoGS(ikpt_irr) = ikpt
     565                 :             :      end if
     566                 :             :    end do
     567         [ #  # ]:           0 :    if (ikpt_irr .ne. elph_ds%k_phon%new_nkptirr) then
     568                 :           0 :      write (message,'(a)')' The number of irred nkpt does not match! '
     569                 :           0 :      ABI_ERROR(message)
     570                 :             :    end if
     571                 :             : 
     572         [ #  # ]:           0 :    ABI_FREE(indkpt1)
     573         [ #  # ]:           0 :    ABI_FREE(wtk_fullbz)
     574         [ #  # ]:           0 :    ABI_FREE(wtk_folded)
     575                 :             :  end if
     576                 :             : 
     577                 :             : !====================================================================
     578                 :             : !4) setup weights for integration (gaussian or tetrahedron method)
     579                 :             : !====================================================================
     580                 :          15 :  elph_ds%k_phon%nband = elph_ds%nFSband
     581                 :          15 :  elph_ds%k_phon%nsppol = elph_ds%nsppol
     582                 :          15 :  elph_ds%k_phon%nsym = Cryst%nsym
     583   [ -  +  +  -  :          75 :  ABI_MALLOC(elph_ds%k_phon%wtk,(elph_ds%nFSband,elph_ds%k_phon%nkpt,elph_ds%k_phon%nsppol))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                +  -  + ]
     584                 :             : 
     585                 :             :  call ep_fs_weights(anaddb_dtset%ep_b_min, anaddb_dtset%ep_b_max, eigenGS, anaddb_dtset%elphsmear, &
     586                 :             : & elph_ds%fermie, cryst%gprimd, elph_ds%k_phon%irredtoGS, elph_ds%kptrlatt, max_occ, elph_ds%minFSband, nband, elph_ds%nFSband, &
     587                 :          15 : & elph_ds%nsppol, anaddb_dtset%telphint, elph_ds%k_phon)
     588                 :             : 
     589                 :             : !distribute k-points among processors, if any
     590                 :          15 :  call elph_k_procs(nproc, elph_ds%k_phon)
     591                 :             : 
     592                 :             : !=====================================================
     593                 :             : !get kpt info from the fine grid part
     594                 :             : !=====================================================
     595         [ -  + ]:          15 :  if (anaddb_dtset%use_k_fine == 1) then
     596                 :             : 
     597         [ #  # ]:           0 :    if (abs(anaddb_dtset%band_gap) < 10.0d0) then
     598                 :           0 :      write (message,'(a)')' Not coded yet when use_k_fine and band_gap are both used'
     599                 :           0 :      ABI_ERROR(message)
     600                 :             :    end if
     601                 :             : 
     602         [ #  # ]:           0 :    if (master == me) then
     603         [ #  # ]:           0 :      if (open_file("densergrid_GKK",message,newunit=unitfskgrid,form="unformatted",status="old") /=0) then
     604                 :           0 :        ABI_ERROR(message)
     605                 :             :      end if
     606                 :             :      !read the header of file
     607                 :           0 :      call hdr1%fort_read(unitfskgrid, fform)
     608         [ #  # ]:           0 :      ABI_CHECK(fform/=0,'denser grid GKK header was mis-read. fform == 0')
     609                 :             :    end if
     610                 :           0 :    call hdr1%bcast(master,me,comm)
     611                 :             : 
     612   [ #  #  #  #  :           0 :    ABI_MALLOC(eigenGS_fine,(nband,hdr1%nkpt,elph_ds%nsppol))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
     613                 :             : 
     614         [ #  # ]:           0 :    if (master == me) then
     615         [ #  # ]:           0 :      do isppol=1,elph_ds%nsppol
     616         [ #  # ]:           0 :        do ikpt=1,hdr1%nkpt
     617                 :           0 :          read(unitfskgrid) eigenGS_fine(:,ikpt,isppol)
     618                 :             :        end do
     619                 :             :      end do
     620                 :           0 :      close(unitfskgrid)
     621                 :             :    end if
     622                 :           0 :    call xmpi_bcast(eigenGS_fine, master, comm, ierr)
     623                 :             : 
     624                 :             : !  Reinit the structure storing the eigevalues.
     625                 :             : !  Be careful. This part has not been tested.
     626                 :           0 :    call Bst%free()
     627                 :           0 :    call bst%from_hdr(hdr1,nband,eigenGS_fine)
     628                 :             : 
     629                 :           0 :    elph_ds%k_fine%nkptirr = hdr1%nkpt
     630   [ #  #  #  #  :           0 :    ABI_MALLOC(elph_ds%k_fine%kptirr,(3,elph_ds%k_fine%nkptirr))
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     631   [ #  #  #  #  :           0 :    ABI_MALLOC(elph_ds%k_fine%irredtoGS,(elph_ds%k_fine%nkptirr))
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     632                 :             : 
     633                 :             :    call order_fs_kpts(hdr1%kptns, hdr1%nkpt, elph_ds%k_fine%kptirr,&
     634                 :           0 : &   elph_ds%k_fine%nkptirr,elph_ds%k_fine%irredtoGS)
     635                 :             : 
     636                 :           0 :    call hdr1%free()
     637                 :             : 
     638                 :           0 :    call mkFSkgrid (elph_ds%k_fine, Cryst%nsym, Cryst%symrec, timrev)
     639                 :             : 
     640                 :           0 :    elph_ds%k_fine%nband = elph_ds%nFSband
     641                 :           0 :    elph_ds%k_fine%nsppol = elph_ds%nsppol
     642                 :           0 :    elph_ds%k_fine%nsym = Cryst%nsym
     643                 :             : 
     644   [ #  #  #  #  :           0 :    ABI_MALLOC(elph_ds%k_fine%wtk,(elph_ds%nFSband,elph_ds%k_fine%nkpt,elph_ds%nsppol))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
     645                 :             : 
     646   [ #  #  #  # ]:           0 :    kptrlatt_fine = elph_ds%kptrlatt_fine
     647                 :             : 
     648                 :             :    call ep_fs_weights(anaddb_dtset%ep_b_min, anaddb_dtset%ep_b_max, &
     649                 :             : &   eigenGS_fine, anaddb_dtset%elphsmear, &
     650                 :             : &   elph_ds%fermie, cryst%gprimd, elph_ds%k_fine%irredtoGS, kptrlatt_fine, &
     651                 :             : &   max_occ, elph_ds%minFSband, nband, elph_ds%nFSband, &
     652                 :           0 : &   elph_ds%nsppol, anaddb_dtset%telphint, elph_ds%k_fine)
     653                 :             : 
     654                 :             :  else ! not using k_fine
     655                 :          15 :    elph_ds%k_fine%nband = elph_ds%k_phon%nband
     656                 :          15 :    elph_ds%k_fine%nsppol = elph_ds%k_phon%nsppol
     657                 :          15 :    elph_ds%k_fine%nsym = elph_ds%k_phon%nsym
     658                 :             : 
     659                 :          15 :    elph_ds%k_fine%nkpt = elph_ds%k_phon%nkpt
     660                 :          15 :    elph_ds%k_fine%nkptirr = elph_ds%k_phon%nkptirr
     661                 :             : 
     662                 :          15 :    elph_ds%k_fine%my_nkpt = elph_ds%k_phon%my_nkpt
     663                 :             : 
     664   [ -  +  +  -  :          45 :    ABI_MALLOC(elph_ds%k_fine%my_kpt,(elph_ds%k_fine%nkpt))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     665   [ +  -  -  +  :        1342 :    elph_ds%k_fine%my_kpt = elph_ds%k_phon%my_kpt
          -  -  -  -  +  
                      + ]
     666                 :             : 
     667   [ -  +  +  -  :          45 :    ABI_MALLOC(elph_ds%k_fine%my_ikpt,(elph_ds%k_fine%my_nkpt))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     668   [ +  -  -  +  :        1342 :    elph_ds%k_fine%my_ikpt = elph_ds%k_phon%my_ikpt
          -  -  -  -  +  
                      + ]
     669                 :             : 
     670   [ -  +  +  -  :          45 :    ABI_MALLOC(elph_ds%k_fine%kptirr,(3,elph_ds%k_fine%nkptirr))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     671   [ +  -  +  -  :        5278 :    elph_ds%k_fine%kptirr = elph_ds%k_phon%kptirr
          -  +  -  -  -  
          -  -  -  +  +  
                   +  + ]
     672   [ -  +  +  -  :          45 :    ABI_MALLOC(elph_ds%k_fine%wtkirr,(elph_ds%k_fine%nkptirr))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     673   [ +  -  -  +  :        1342 :    elph_ds%k_fine%wtkirr = elph_ds%k_phon%wtkirr
          -  -  -  -  +  
                      + ]
     674                 :             : 
     675   [ -  +  +  -  :          75 :    ABI_MALLOC(elph_ds%k_fine%wtk,(elph_ds%nFSband,elph_ds%k_fine%nkpt,elph_ds%k_fine%nsppol))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                +  -  + ]
     676   [ +  -  +  -  :        9734 :    elph_ds%k_fine%wtk = elph_ds%k_phon%wtk
          +  -  -  +  -  
          -  -  -  -  -  
          -  -  +  +  +  
                +  +  + ]
     677   [ -  +  +  -  :          45 :    ABI_MALLOC(elph_ds%k_fine%kpt,(3,elph_ds%k_fine%nkpt))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     678   [ +  -  +  -  :        5278 :    elph_ds%k_fine%kpt = elph_ds%k_phon%kpt
          -  +  -  -  -  
          -  -  -  +  +  
                   +  + ]
     679                 :             : 
     680   [ -  +  -  +  :          15 :    elph_ds%k_fine%krank = elph_ds%k_phon%krank%copy()
                   -  + ]
     681                 :             : 
     682   [ -  +  +  -  :          45 :    ABI_MALLOC(elph_ds%k_fine%irr2full,(elph_ds%k_fine%nkptirr))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     683   [ +  -  -  +  :        1342 :    elph_ds%k_fine%irr2full = elph_ds%k_phon%irr2full
          -  -  -  -  +  
                      + ]
     684   [ -  +  +  -  :          45 :    ABI_MALLOC(elph_ds%k_fine%full2irr,(3,elph_ds%k_fine%nkpt))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     685   [ +  -  +  -  :        5278 :    elph_ds%k_fine%full2irr = elph_ds%k_phon%full2irr
          -  +  -  -  -  
          -  -  -  +  +  
                   +  + ]
     686   [ -  +  +  -  :          60 :    ABI_MALLOC(elph_ds%k_fine%full2full,(2,elph_ds%k_fine%nsym,elph_ds%k_fine%nkpt))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     687   [ +  -  +  -  :      179326 :    elph_ds%k_fine%full2full = elph_ds%k_phon%full2full
          +  -  -  +  -  
          -  -  -  -  -  
          -  -  +  +  +  
                +  +  + ]
     688                 :             : 
     689   [ -  +  +  -  :          45 :    ABI_MALLOC(elph_ds%k_fine%irredtoGS,(elph_ds%k_fine%nkptirr))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     690   [ +  -  -  +  :        1342 :    elph_ds%k_fine%irredtoGS = elph_ds%k_phon%irredtoGS
          -  -  -  -  +  
                      + ]
     691                 :             : 
     692                 :             : !  call elph_k_copy(elph_ds%k_phon, elph_ds%k_fine)
     693                 :             : 
     694   [ +  +  +  + ]:         195 :    kptrlatt_fine = elph_ds%kptrlatt
     695                 :             : 
     696   [ -  +  +  -  :          75 :    ABI_MALLOC(eigenGS_fine,(nband,elph_ds%k_fine%nkptirr,elph_ds%nsppol))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                +  -  + ]
     697                 :             : 
     698   [ +  -  +  -  :       14598 :    eigenGS_fine = eigenGS
          +  -  -  +  -  
          -  -  -  -  -  
          -  -  +  +  +  
                +  +  + ]
     699                 :             :  end if ! k_fine or not
     700                 :             : 
     701         [ +  - ]:          15 :  if (elph_ds%kptrlatt_fine(1,1) == 0) then ! when there is not input for kptrlatt_fine
     702   [ +  +  +  + ]:         195 :    elph_ds%kptrlatt_fine = kptrlatt_fine
     703                 :             :  end if
     704                 :             : 
     705                 :          15 :  call timein(tcpu,twall)
     706                 :             :  write(message, '(a,f11.3,a,f11.3,a)' )&
     707                 :          15 : & '-elphon k and q grids have been setup after tcpu',tcpu-tcpui,'  and twall',twall-twalli,' sec'
     708                 :          15 :  call wrtout(std_out,message,'COLL')
     709                 :          15 :  tcpui = tcpu
     710                 :          15 :  twalli = twall
     711                 :             : 
     712                 :             : !====================================================================
     713                 :             : !5) calculate DOS at Ef
     714                 :             : !====================================================================
     715   [ -  +  +  -  :          45 :  ABI_MALLOC(elph_ds%n0,(elph_ds%nsppol))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     716                 :             : 
     717                 :             : !SPPOL sum over spin channels to get total DOS
     718                 :             : !channels decoupled => use separate values for DOS_up(Ef) resp down
     719         [ +  + ]:          31 :  do isppol=1,elph_ds%nsppol
     720   [ +  +  +  + ]:        9719 :    elph_ds%n0(isppol) = sum(elph_ds%k_fine%wtk(:,:,isppol))/elph_ds%k_fine%nkpt
     721                 :             :  end do
     722                 :             : 
     723         [ +  + ]:          15 :  if (elph_ds%nsppol == 1) then
     724                 :          14 :    write (std_out,*) ' elphon : the estimated DOS(E_Fermi) = ', elph_ds%n0(1), ' states/Ha/spin '
     725   [ +  +  +  +  :        9636 :    write (std_out,*) ' elphon : the total FS weight and # of kpoints = ',sum(elph_ds%k_fine%wtk),elph_ds%k_fine%nkpt
                   +  + ]
     726         [ +  - ]:           1 :  else if (elph_ds%nsppol == 2) then
     727                 :           1 :    write (std_out,*) ' elphon : the spin up   DOS(E_Fermi) = ', elph_ds%n0(1), ' states/Ha/spin '
     728                 :           1 :    write (std_out,*) ' elphon : the spin down DOS(E_Fermi) = ', elph_ds%n0(2), ' states/Ha/spin '
     729                 :           1 :    write (std_out,*) ' elphon : total DOS(E_Fermi) = ', elph_ds%n0(1)+elph_ds%n0(2), ' states/Ha '
     730                 :           1 :    write (std_out,*) ' elphon : the spin up   FS weight and # of kpoints = ',&
     731   [ +  +  +  + ]:          42 : &   sum(elph_ds%k_fine%wtk(:,:,1)),elph_ds%k_fine%nkpt
     732                 :           1 :    write (std_out,*) ' elphon : the spin down FS weight and # of kpoints = ',&
     733   [ +  +  +  + ]:          42 : &   sum(elph_ds%k_fine%wtk(:,:,2)),elph_ds%k_fine%nkpt
     734                 :             :  else
     735                 :           0 :    write (message,'(a,i0)') 'bad value for nsppol ', elph_ds%nsppol
     736                 :           0 :    ABI_ERROR(message)
     737                 :             :  end if
     738                 :             : 
     739   [ -  +  +  -  :          75 :  ABI_MALLOC(elph_ds%gkk_intweight,(elph_ds%ngkkband,elph_ds%k_phon%nkpt,elph_ds%nsppol))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                +  -  + ]
     740                 :             : 
     741         [ +  + ]:          15 :  if (elph_ds%ep_keepbands == 0) then
     742                 :             : !  use trivial integration weights  for single band,
     743                 :             : !  since average over bands is done in normsq_gkk
     744   [ +  +  +  + ]:         917 :    elph_ds%gkk_intweight(1,:,:) = one
     745                 :             : 
     746         [ +  - ]:           5 :  else if (elph_ds%ep_keepbands == 1) then
     747                 :             : !  use elph_ds%k_fine%wtk since average over bands is not done in normsq_gkk
     748         [ -  + ]:           5 :    if (elph_ds%use_k_fine == 1) then
     749                 :           0 :      call d2c_weights(elph_ds)
     750                 :             :    end if
     751   [ +  +  +  +  :        3202 :    elph_ds%gkk_intweight(:,:,:) = elph_ds%k_phon%wtk(:,:,:)
                   +  + ]
     752                 :             :  else
     753                 :           0 :    write(message,'(a,i0)')' ep_keepbands must be 0 or 1 while it is : ',elph_ds%ep_keepbands
     754                 :           0 :    ABI_ERROR(message)
     755                 :             :  end if
     756                 :             : 
     757                 :          15 :  ep_prt_wtk = 0
     758                 :             :  if (ep_prt_wtk == 1) then
     759                 :             :    do iband=1, elph_ds%ngkkband
     760                 :             :      do ikpt_fine=1, elph_ds%k_fine%nkpt
     761                 :             :        write (300,*) ikpt_fine, elph_ds%gkk_intweight(iband,ikpt_fine,1)
     762                 :             :      end do
     763                 :             :    end do
     764                 :             :  end if
     765                 :             : 
     766                 :             : 
     767                 :          15 :  call timein(tcpu,twall)
     768                 :             :  write(message, '(a,f11.3,a,f11.3,a)' )&
     769                 :          15 : & '-elphon weights and DOS setup after tcpu',tcpu-tcpui,'  and twall',twall-twalli,' sec'
     770                 :          15 :  call wrtout(std_out,message,'COLL')
     771                 :          15 :  tcpui = tcpu
     772                 :          15 :  twalli = twall
     773                 :             : 
     774                 :             : !Output of the Fermi Surface
     775   [ -  +  -  - ]:          15 :  if (anaddb_dtset%prtfsurf == 1 .and. master == me) then
     776         [ #  # ]:           0 :    fname=trim(elph_ds%elph_base_name) // '_BXSF'
     777         [ #  # ]:           0 :    if (bst%write_bxsf(Cryst, fname) /= 0) then
     778                 :           0 :      ABI_WARNING("Cannot produce file for Fermi surface, check log file for more info")
     779                 :             :    end if
     780                 :             :  end if
     781                 :             : 
     782                 :             : !=========================================================
     783                 :             : !Get equivalence between a kpt_phon pair and a qpt in qpt_full
     784                 :             : !only works if the qpt grid is complete (identical to
     785                 :             : !the kpt one, with a basic shift of (0,0,0)
     786                 :             : !=========================================================
     787                 :             : 
     788                 :             : !mapping of k + q onto k' for k and k' in full BZ
     789   [ -  +  +  -  :          60 :  ABI_MALLOC(FSfullpqtofull,(elph_ds%k_phon%nkpt,elph_ds%nqpt_full))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     790                 :             : 
     791                 :             : !qpttoqpt(itim,isym,iqpt) = qpoint index which transforms to iqpt under isym and with time reversal itim.
     792   [ -  +  +  -  :          60 :  ABI_MALLOC(qpttoqpt,(2,Cryst%nsym,elph_ds%nqpt_full))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     793                 :             : 
     794                 :          15 :  call wrtout(std_out,'elphon: calling mkqptequiv to set up the FS qpoint set',"COLL")
     795                 :             : 
     796                 :             :  call mkqptequiv (FSfullpqtofull,Cryst,elph_ds%k_phon%kpt,elph_ds%k_phon%nkpt,&
     797                 :          15 : & elph_ds%nqpt_full,qpttoqpt,elph_ds%qpt_full)
     798                 :             : 
     799                 :             : !==========================================
     800                 :             : !Set up dataset for phonon interpolations
     801                 :             : !==========================================
     802                 :             : 
     803                 :             : !transfer ifltransport flag to structure
     804                 :          15 :  elph_tr_ds%ifltransport=anaddb_dtset%ifltransport
     805                 :             : !transfer name of files file for ddk
     806                 :          15 :  elph_tr_ds%ddkfilename=ddkfilename
     807                 :             : 
     808                 :             : !reduce qpt_full to correct zone
     809         [ +  + ]:         135 :  do iqpt=1,elph_ds%nqpt_full
     810                 :         120 :    call wrap2_pmhalf(elph_ds%qpt_full(1,iqpt),kpt(1),res)
     811                 :         120 :    call wrap2_pmhalf(elph_ds%qpt_full(2,iqpt),kpt(2),res)
     812                 :         120 :    call wrap2_pmhalf(elph_ds%qpt_full(3,iqpt),kpt(3),res)
     813         [ +  + ]:         495 :    elph_ds%qpt_full(:,iqpt)=kpt
     814                 :             :  end do
     815                 :             : 
     816                 :             : !test density of k+q grid: the following should be close to n0 squared
     817                 :             : !FIXME: generalize for sppol
     818                 :          15 :  res = zero
     819         [ +  + ]:        1327 :  do ikpt_fine = 1, elph_ds%k_phon%nkpt
     820         [ +  + ]:       11823 :    do iqpt = 1, elph_ds%nqpt_full
     821         [ +  + ]:       41984 :      kpt = elph_ds%k_phon%kpt(:,ikpt_fine) + elph_ds%qpt_full(:,iqpt)
     822                 :       10496 :      symrankkpt = elph_ds%k_phon%krank%get_rank (kpt)
     823                 :       10496 :      iFSkpq = elph_ds%k_phon%krank%invrank(symrankkpt)
     824         [ +  + ]:       41056 :      do iband = 1, elph_ds%ngkkband
     825         [ +  + ]:      195072 :        do ibandp = 1, elph_ds%ngkkband
     826                 :      184576 :          res = res + elph_ds%gkk_intweight(iband,ikpt_fine,1)*elph_ds%gkk_intweight(ibandp,iFSkpq,1)
     827                 :             :        end do
     828                 :             :      end do
     829                 :             :    end do
     830                 :             :  end do
     831                 :          15 :  res = res / elph_ds%k_phon%nkpt/elph_ds%k_phon%nkpt
     832                 :          15 :  write (std_out,*) 'elphon: integrated value of intweight for given k and q grid : ', res, res / elph_ds%n0(1)**2
     833                 :             : 
     834                 :          15 :  res = zero
     835         [ +  + ]:        1327 :  do ikpt_fine = 1, elph_ds%k_phon%nkpt
     836         [ +  + ]:      182575 :    do iqpt = 1, elph_ds%k_phon%nkpt
     837         [ +  + ]:      724992 :      kpt = elph_ds%k_phon%kpt(:,ikpt_fine) + elph_ds%k_phon%kpt(:,iqpt)
     838                 :      181248 :      symrankkpt = elph_ds%k_phon%krank%get_rank (kpt)
     839                 :      181248 :      iFSkpq = elph_ds%k_phon%krank%invrank(symrankkpt)
     840         [ +  + ]:      675680 :      do iband = 1, elph_ds%ngkkband
     841         [ +  + ]:     3151872 :        do ibandp = 1, elph_ds%ngkkband
     842                 :     2970624 :          res = res + elph_ds%gkk_intweight(iband,ikpt_fine,1)*elph_ds%gkk_intweight(ibandp,iFSkpq,1)
     843                 :             :        end do
     844                 :             :      end do
     845                 :             :    end do
     846                 :             :  end do
     847                 :          15 :  res = res / elph_ds%k_phon%nkpt/elph_ds%k_phon%nkpt
     848                 :          15 :  write (std_out,*) 'elphon: integrated value of intweight for double k grid : ', res, res / elph_ds%n0(1)**2
     849                 :             : 
     850                 :             : !===================================================
     851                 :             : !Allocate all important arrays for FS integrations
     852                 :             : !===================================================
     853                 :             : 
     854                 :             : !Record sizes for matrices on disk: complex and real versions (for real and recip space resp!)
     855                 :             :  onegkksize = 2*elph_ds%nbranch*elph_ds%nbranch*&
     856                 :             : & elph_ds%ngkkband*elph_ds%ngkkband*&
     857                 :          15 : & elph_ds%nsppol*kind(realdp_ex)
     858                 :             : 
     859                 :          15 :  elph_tr_ds%onegkksize=onegkksize
     860                 :             : 
     861                 :             :  write (message,'(4a)')&
     862                 :          15 : & ' elphon : preliminary setup completed ',ch10,&
     863                 :          30 : & '          calling get_all_gkq to read in all the e-ph matrix elements',ch10
     864                 :          15 :  call wrtout(std_out,message,'COLL')
     865                 :             : 
     866                 :             : !flag to do scalar product in gkq before interpolation:
     867                 :             : !should also used in interpolate_gkk and mkph_linwid
     868         [ +  + ]:          15 :  if (elph_ds%ep_scalprod==0) then
     869                 :          11 :    write (std_out,*) ' elphon: will NOT perform scalar product with phonon'
     870                 :          11 :    write (std_out,*) '  displacement vectors in read_gkk. ep_scalprod==0'
     871         [ +  - ]:           4 :  else if (elph_ds%ep_scalprod==1) then
     872                 :           4 :    write (std_out,*) ' elphon: will perform scalar product with phonon'
     873                 :           4 :    write (std_out,*) '  displacement vectors in read_gkk. ep_scalprod==1'
     874                 :             :  else
     875                 :           0 :    ABI_ERROR('illegal value for ep_scalprod')
     876                 :             :  end if
     877                 :             : 
     878                 :          15 :  call timein(tcpu,twall)
     879                 :             :  write(message, '(a,f11.3,a,f11.3,a)' )&
     880                 :          15 : & '-elphon begin gkq construction after tcpu',tcpu-tcpui,'  and twall',twall-twalli,' sec'
     881                 :          15 :  call wrtout(std_out,message,'COLL')
     882                 :          15 :  tcpui = tcpu
     883                 :          15 :  twalli = twall
     884                 :             : 
     885                 :             :  call get_all_gkq (elph_ds,Cryst,ifc,Bst,FSfullpqtofull,nband,n1wf,onegkksize,&
     886                 :          15 : & qpttoqpt,anaddb_dtset%ep_prt_yambo,unitgkk,elph_tr_ds%ifltransport)
     887                 :             : 
     888         [ +  - ]:          15 :  if (master == me) then
     889                 :          15 :    close (unitgkk)
     890                 :             :  end if
     891                 :             : 
     892                 :          15 :  call timein(tcpu,twall)
     893                 :             :  write(message, '(a,f11.3,a,f11.3,a)' )&
     894                 :          15 : & '-elphon end gkq construction after tcpu',tcpu-tcpui,'  and twall',twall-twalli,' sec'
     895                 :          15 :  call wrtout(std_out,message,'COLL')
     896                 :          15 :  tcpui = tcpu
     897                 :          15 :  twalli = twall
     898                 :             : 
     899         [ +  + ]:          15 :  if (elph_tr_ds%ifltransport==1 .or. elph_tr_ds%ifltransport==2 .or. elph_tr_ds%ifltransport==3)then
     900                 :             : 
     901                 :             : !  check inputs
     902                 :             : !  TODO: should be done at earlier stage of initialization and checking
     903         [ -  + ]:           5 :    if (elph_ds%ngkkband /= elph_ds%nFSband) then
     904                 :           0 :      write (message,'(a)') 'need to keep electron band dependency in memory for transport calculations'
     905                 :           0 :      ABI_ERROR(message)
     906                 :             :    end if
     907                 :             : 
     908                 :             : !  bxu, moved the allocation from get_veloc_tr to elphon
     909         [ -  + ]:           5 :    if (anaddb_dtset%use_k_fine == 1) then
     910   [ #  #  #  #  :           0 :      ABI_MALLOC(elph_tr_ds%el_veloc,(elph_ds%k_fine%nkpt,nband,3,elph_ds%nsppol))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     911                 :             :    else
     912   [ -  +  +  -  :          30 :      ABI_MALLOC(elph_tr_ds%el_veloc,(elph_ds%k_phon%nkpt,nband,3,elph_ds%nsppol))
          -  +  +  -  +  
          -  -  +  +  -  
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     913                 :             :    end if
     914   [ -  +  +  -  :          15 :    ABI_MALLOC(elph_tr_ds%FSelecveloc_sq,(3,elph_ds%nsppol))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     915                 :             : 
     916                 :             : !  this only needs to be read in once - the fermi level average is later done many times with get_veloc_tr
     917         [ +  - ]:           5 :    if (me == master) then
     918         [ -  + ]:           5 :      if (anaddb_dtset%use_k_fine == 1) then
     919                 :           0 :        call read_el_veloc(nband,elph_ds%k_fine%nkpt,elph_ds%k_fine%kpt,elph_ds%nsppol,elph_tr_ds)
     920                 :             :      else
     921                 :           5 :        call read_el_veloc(nband,elph_ds%k_phon%nkpt,elph_ds%k_phon%kpt,elph_ds%nsppol,elph_tr_ds)
     922                 :             :      end if
     923                 :             :    end if
     924                 :           5 :    call xmpi_bcast (elph_tr_ds%el_veloc, master, comm, ierr)
     925                 :             : 
     926                 :           5 :    call get_veloc_tr(elph_ds,elph_tr_ds)
     927                 :             :  end if
     928                 :             : 
     929                 :             : !Output of the Fermi velocities
     930                 :             : !to be used for Mayavi visualization
     931   [ -  +  -  - ]:          15 :  if (anaddb_dtset%prtfsurf == 1 .and. master == me) then
     932         [ #  # ]:           0 :    fname = trim(elph_ds%elph_base_name) // '_VTK'
     933                 :             : 
     934                 :             : !  FIXME
     935                 :             : !  shiftk is defined neither in the anaddb nor in the hdr data type
     936                 :             : !  an incorrect FS will be produced in case of a shifted k-grid used during the GS calculation
     937                 :             : !  check if we are using a unshifthed kgrid, obviously doesnt work in case
     938                 :             : !  of multiple shifts containg a zero translation but in this case prtbxsf should work
     939         [ #  # ]:           0 :    shiftk=one
     940         [ #  # ]:           0 :    do ii=1,hdr%nkpt
     941   [ #  #  #  #  :           0 :      if (all(hdr%kptns(:,ii) == zero)) shiftk=zero
                   #  # ]
     942                 :             :    end do
     943                 :             : 
     944   [ #  #  #  # ]:           0 :    use_afm=(hdr%nsppol==1.and.hdr%nspden==2)
     945                 :             : !  MG FIXME warning time reversal is always assumed to be present.
     946                 :             : !  the header should report this information.
     947                 :             : 
     948                 :           0 :    use_tr=(timrev==1)
     949                 :             : 
     950                 :           0 :    nk1 = elph_ds%kptrlatt_fine(1,1)
     951                 :           0 :    nk2 = elph_ds%kptrlatt_fine(2,2)
     952                 :           0 :    nk3 = elph_ds%kptrlatt_fine(3,3)
     953                 :             : 
     954   [ #  #  #  #  :           0 :    ABI_MALLOC(v_surf,(nband,nk1+1,nk2+1,nk3+1,3,elph_ds%nsppol))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     955   [ #  #  #  #  :           0 :    v_surf = zero
          #  #  #  #  #  
                #  #  # ]
     956         [ #  # ]:           0 :    do isppol=1,elph_ds%nsppol
     957         [ #  # ]:           0 :      do iband=1,nband
     958         [ #  # ]:           0 :        do ikpt = 1, nk1+1
     959         [ #  # ]:           0 :          do jkpt = 1, nk2+1
     960         [ #  # ]:           0 :            do kkpt = 1, nk3+1
     961                 :           0 :              ik1 = ikpt
     962                 :           0 :              ik2 = jkpt
     963                 :           0 :              ik3 = kkpt
     964         [ #  # ]:           0 :              if (ikpt > nk1) ik1 = ikpt - nk1
     965         [ #  # ]:           0 :              if (jkpt > nk2) ik2 = jkpt - nk2
     966         [ #  # ]:           0 :              if (kkpt > nk3) ik3 = kkpt - nk3
     967                 :           0 :              ikpt_fine = (ik1-1)*nk2*nk3 + (ik2-1)*nk3 + ik3
     968                 :             : !            v_surf(iband,ikpt,jkpt,kkpt,:,isppol)=elph_tr_ds%el_veloc(ikpt_fine,iband,:,isppol)*elph_ds%k_fine%wtk(iband,ikpt_fine,isppol)
     969         [ #  # ]:           0 :              v_surf(iband,ikpt,jkpt,kkpt,:,isppol)=elph_tr_ds%el_veloc(ikpt_fine,iband,:,isppol)
     970                 :             :            end do
     971                 :             :          end do
     972                 :             :        end do
     973                 :             :      end do
     974                 :             :    end do
     975                 :             : 
     976                 :             :    call printvtk(eigenGS,v_surf,zero,elph_ds%fermie,Cryst%gprimd,&
     977                 :             : &   elph_ds%kptrlatt_fine,nband,hdr%nkpt,hdr%kptns,&
     978                 :           0 : &   Cryst%nsym,use_afm,Cryst%symrec,Cryst%symafm,use_tr,elph_ds%nsppol,shiftk,1,fname,ierr)
     979                 :             : 
     980         [ #  # ]:           0 :    ABI_FREE(v_surf)
     981                 :             : 
     982                 :             :  end if !anaddb_dtset%prtfsurf
     983                 :             : 
     984                 :             : !============================================================================
     985                 :             : !Evaluate lambda and omega_log using the weighted sum over the irred q-points
     986                 :             : !found in the GKK file. All the data we need are stored in elph_ds%qgrid_data
     987                 :             : !============================================================================
     988                 :             : 
     989         [ +  - ]:          15 :  if (master == me) then
     990         [ +  - ]:          15 :    fname=trim(elph_ds%elph_base_name) // '_QPTS'
     991                 :          15 :    call outelph(elph_ds,anaddb_dtset%enunit,fname)
     992                 :             :  end if
     993                 :             : 
     994                 :             : !========================================================
     995                 :             : !Get FS averaged gamma matrices and Fourier transform to real space
     996                 :             : !========================================================
     997                 :             : 
     998   [ -  +  +  -  :          60 :  ABI_MALLOC(coskr, (elph_ds%nqpt_full,Ifc%nrpt))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     999   [ -  +  +  -  :          45 :  ABI_MALLOC(sinkr, (elph_ds%nqpt_full,Ifc%nrpt))
          -  +  +  -  -  
                +  -  + ]
    1000                 :          15 :  call ftgam_init(ifc%gprim, elph_ds%nqpt_full,Ifc%nrpt, elph_ds%qpt_full, Ifc%rpt, coskr, sinkr)
    1001                 :             : 
    1002                 :          15 :  call timein(tcpu,twall)
    1003                 :             :  write(message, '(a,f11.3,a,f11.3,a)' )&
    1004                 :          15 : & '-elphon begin integration of gkq after tcpu',tcpu-tcpui,'  and twall',twall-twalli,' sec'
    1005                 :          15 :  call wrtout(std_out,message,'COLL')
    1006                 :          15 :  tcpui = tcpu
    1007                 :          15 :  twalli = twall
    1008                 :             : 
    1009                 :          15 :  call integrate_gamma(elph_ds,FSfullpqtofull)
    1010                 :             : 
    1011         [ +  + ]:          15 :  if (elph_ds%symgkq ==1) then
    1012                 :             : !  complete the gamma_qpt here instead of the gkk previously
    1013                 :             :    call complete_gamma(Cryst,elph_ds%nbranch,elph_ds%nsppol,elph_ds%nqptirred,elph_ds%nqpt_full,&
    1014                 :          14 : &   elph_ds%ep_scalprod,elph_ds%qirredtofull,qpttoqpt,elph_ds%gamma_qpt)
    1015                 :             :  end if
    1016                 :             : 
    1017                 :             : !Now FT to real space too
    1018                 :             : !NOTE: gprim (not gprimd) is used for all FT interpolations,
    1019                 :             : !to be consistent with the dimensions of the rpt, which come from anaddb.
    1020   [ -  +  +  -  :          75 :  ABI_MALLOC(elph_ds%gamma_rpt, (2,elph_ds%nbranch**2,elph_ds%nsppol,Ifc%nrpt))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                +  -  + ]
    1021   [ +  +  +  +  :       15409 :  elph_ds%gamma_rpt = zero
             +  +  +  + ]
    1022                 :             : 
    1023                 :          15 :  qtor = 1 ! q --> r
    1024         [ +  + ]:          31 :  do isppol=1,elph_ds%nsppol
    1025                 :             :    call ftgam(Ifc%wghatm,elph_ds%gamma_qpt(:,:,isppol,:),elph_ds%gamma_rpt(:,:,isppol,:),natom,&
    1026   [ +  +  +  -  :        3055 : &   elph_ds%nqpt_full,Ifc%nrpt,qtor, coskr, sinkr)
          +  +  +  +  +  
          +  +  +  +  -  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
                   +  + ]
    1027                 :             :  end do
    1028                 :             : 
    1029                 :          15 :  call timein(tcpu,twall)
    1030                 :             :  write(message, '(a,f11.3,a,f11.3,a)' )&
    1031                 :          15 : & '-elphon end integration and completion of gkq after tcpu',tcpu-tcpui,'  and twall',twall-twalli,' sec'
    1032                 :          15 :  call wrtout(std_out,message,'COLL')
    1033                 :          15 :  tcpui = tcpu
    1034                 :          15 :  twalli = twall
    1035                 :             : 
    1036                 :             : 
    1037                 :             : !==========================================================
    1038                 :             : !calculate transport matrix elements, integrated over FS
    1039                 :             : !==========================================================
    1040                 :             : 
    1041         [ +  + ]:          15 :  if (elph_tr_ds%ifltransport == 1)then ! LOVA
    1042                 :             : 
    1043                 :           5 :    call integrate_gamma_tr_lova(elph_ds,FSfullpqtofull,elph_tr_ds)
    1044                 :             : 
    1045                 :             :    call complete_gamma_tr(cryst,elph_ds%ep_scalprod,elph_ds%nbranch,elph_ds%nqptirred,&
    1046                 :           5 : &   elph_ds%nqpt_full,elph_ds%nsppol,elph_tr_ds%gamma_qpt_trout,elph_ds%qirredtofull,qpttoqpt)
    1047                 :             : 
    1048                 :             :    call complete_gamma_tr(cryst,elph_ds%ep_scalprod,elph_ds%nbranch,elph_ds%nqptirred,&
    1049                 :           5 : &   elph_ds%nqpt_full,elph_ds%nsppol,elph_tr_ds%gamma_qpt_trin,elph_ds%qirredtofull,qpttoqpt)
    1050                 :             : 
    1051   [ -  +  +  -  :          25 :    ABI_MALLOC(elph_tr_ds%gamma_rpt_trout,(2,9,elph_ds%nbranch**2,elph_ds%nsppol,Ifc%nrpt))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                +  -  + ]
    1052   [ +  +  +  +  :       85407 :    elph_tr_ds%gamma_rpt_trout = zero
          +  +  +  +  +  
                      + ]
    1053                 :             : 
    1054   [ -  +  +  -  :          20 :    ABI_MALLOC(elph_tr_ds%gamma_rpt_trin,(2,9,elph_ds%nbranch**2,elph_ds%nsppol,Ifc%nrpt))
          -  +  +  -  -  
          +  +  -  -  +  
             -  +  -  + ]
    1055   [ +  +  +  +  :       85407 :    elph_tr_ds%gamma_rpt_trin = zero
          +  +  +  +  +  
                      + ]
    1056                 :             : 
    1057                 :             : !  Now FT to real space too
    1058                 :           5 :    qtor = 1 ! q --> r
    1059         [ +  + ]:          10 :    do isppol=1,elph_ds%nsppol
    1060         [ +  + ]:          55 :      do idir=1,9
    1061                 :             :        call ftgam(Ifc%wghatm,elph_tr_ds%gamma_qpt_trout(:,idir,:,isppol,:),&
    1062                 :             : &       elph_tr_ds%gamma_rpt_trout(:,idir,:,isppol,:),natom,&
    1063   [ +  -  +  -  :      221499 : &       elph_ds%nqpt_full,Ifc%nrpt,qtor, coskr, sinkr)
          +  +  +  +  +  
          +  +  -  +  -  
          +  +  +  +  +  
          +  +  -  +  +  
          +  +  +  +  +  
          -  +  +  +  +  
                   +  + ]
    1064                 :             : 
    1065                 :             :        call ftgam(Ifc%wghatm,elph_tr_ds%gamma_qpt_trin(:,idir,:,isppol,:),&
    1066                 :             : &       elph_tr_ds%gamma_rpt_trin(:,idir,:,isppol,:),natom,&
    1067   [ +  -  +  -  :      221504 : &       elph_ds%nqpt_full,Ifc%nrpt,qtor, coskr, sinkr)
          +  +  +  +  +  
          +  +  -  +  -  
          +  +  +  +  +  
          +  +  -  +  +  
          +  +  +  +  +  
          -  +  +  +  +  
                   +  + ]
    1068                 :             :      end do
    1069                 :             :    end do
    1070                 :             : 
    1071         [ +  - ]:          10 :  else if (elph_tr_ds%ifltransport==2) then ! non-LOVA case
    1072                 :             : 
    1073                 :             : !  Get Ef, DOS(Ef), veloc(Ef) for looped temperatures
    1074                 :           0 :    call get_nv_fs_temp(elph_ds,BSt,eigenGS_fine,cryst%gprimd,max_occ,elph_tr_ds)
    1075                 :             : 
    1076                 :             : !  Get DOS(E), veloc(E) for looped energy levels
    1077                 :           0 :    call get_nv_fs_en(cryst,ifc,elph_ds,eigenGS_fine,max_occ,elph_tr_ds,omega_max)
    1078                 :             : 
    1079                 :             : !  Save the E, N(E), v^2(E), dE
    1080         [ #  # ]:           0 :    if (master == me) then
    1081         [ #  # ]:           0 :      fname = trim(elph_ds%elph_base_name) // '_EPTS'
    1082         [ #  # ]:           0 :      if (open_file(fname,message,newunit=unit_epts,status="unknown") /=0) then
    1083                 :           0 :        ABI_ERROR(message)
    1084                 :             :      end if
    1085         [ #  # ]:           0 :      do isppol = 1, elph_ds%nsppol
    1086                 :           0 :        write(unit_epts,"(a,i6)") '# E, N(E), v^2(E), dE for spin channel ', isppol
    1087         [ #  # ]:           0 :        do ie1 = 1, elph_ds%nenergy
    1088                 :           0 :          write(unit_epts,"(4E20.12)") elph_tr_ds%en_all(isppol,ie1), elph_tr_ds%dos_n(ie1,isppol),&
    1089                 :           0 : &         elph_tr_ds%veloc_sq(1,isppol,ie1), elph_tr_ds%de_all(isppol,ie1)
    1090                 :             :        end do
    1091                 :             :      end do
    1092                 :           0 :      close(unit=unit_epts)
    1093                 :             :    end if
    1094                 :             : 
    1095   [ #  #  #  #  :           0 :    ABI_MALLOC(tmp_veloc_sq1,(3,elph_ds%nsppol))
          #  #  #  #  #  
                #  #  # ]
    1096   [ #  #  #  #  :           0 :    ABI_MALLOC(tmp_veloc_sq2,(3,elph_ds%nsppol))
             #  #  #  # ]
    1097   [ #  #  #  #  :           0 :    ABI_MALLOC(elph_tr_ds%tmp_gkk_intweight1,(elph_ds%ngkkband,elph_ds%k_phon%nkpt,elph_ds%nsppol))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
    1098   [ #  #  #  #  :           0 :    ABI_MALLOC(elph_tr_ds%tmp_gkk_intweight2,(elph_ds%ngkkband,elph_ds%k_phon%nkpt,elph_ds%nsppol))
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
    1099   [ #  #  #  #  :           0 :    ABI_MALLOC(elph_tr_ds%tmp_velocwtk1,(elph_ds%ngkkband,elph_ds%k_phon%nkpt,3,elph_ds%nsppol))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    1100   [ #  #  #  #  :           0 :    ABI_MALLOC(elph_tr_ds%tmp_velocwtk2,(elph_ds%ngkkband,elph_ds%k_phon%nkpt,3,elph_ds%nsppol))
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
    1101   [ #  #  #  #  :           0 :    ABI_MALLOC(elph_tr_ds%tmp_vvelocwtk1,(elph_ds%ngkkband,elph_ds%k_phon%nkpt,3,3,elph_ds%nsppol))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    1102   [ #  #  #  #  :           0 :    ABI_MALLOC(elph_tr_ds%tmp_vvelocwtk2,(elph_ds%ngkkband,elph_ds%k_phon%nkpt,3,3,elph_ds%nsppol))
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
    1103                 :             : 
    1104   [ #  #  #  # ]:           0 :    tmp_veloc_sq1 = zero
    1105   [ #  #  #  # ]:           0 :    tmp_veloc_sq2 = zero
    1106   [ #  #  #  #  :           0 :    elph_tr_ds%tmp_gkk_intweight1 = zero
                   #  # ]
    1107   [ #  #  #  #  :           0 :    elph_tr_ds%tmp_gkk_intweight2 = zero
                   #  # ]
    1108   [ #  #  #  #  :           0 :    elph_tr_ds%tmp_velocwtk1 = zero
             #  #  #  # ]
    1109   [ #  #  #  #  :           0 :    elph_tr_ds%tmp_velocwtk2 = zero
             #  #  #  # ]
    1110   [ #  #  #  #  :           0 :    elph_tr_ds%tmp_vvelocwtk1 = zero
          #  #  #  #  #  
                      # ]
    1111   [ #  #  #  #  :           0 :    elph_tr_ds%tmp_vvelocwtk2 = zero
          #  #  #  #  #  
                      # ]
    1112                 :             : 
    1113         [ #  # ]:           0 :    if (elph_ds%ep_lova .eq. 1) then
    1114                 :             :      tmp_nenergy = 1
    1115         [ #  # ]:           0 :    else if (elph_ds%ep_lova .eq. 0) then
    1116                 :           0 :      tmp_nenergy = elph_ds%nenergy
    1117                 :             :    else
    1118                 :           0 :      write(message,'(a,i0)')' ep_lova must be 0 or 1 while it is : ', elph_ds%ep_lova
    1119                 :           0 :      ABI_ERROR(message)
    1120                 :             :    end if
    1121                 :             : 
    1122                 :             : !  This only works for ONE temperature!! for test only
    1123         [ #  # ]:           0 :    elph_ds%n0(:) = elph_tr_ds%dos_n0(1,:)
    1124                 :             : 
    1125                 :             : !  bxu, no need for complete sets of ie1 and ie2
    1126                 :             : !  Only save those within the range of omega_max from Ef
    1127   [ #  #  #  #  :           0 :    ABI_MALLOC(pair2red,(tmp_nenergy,tmp_nenergy))
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
    1128   [ #  #  #  # ]:           0 :    pair2red = 0
    1129                 :             : 
    1130                 :           0 :    elph_ds%n_pair = 0
    1131         [ #  # ]:           0 :    do ie1=1,tmp_nenergy
    1132                 :           0 :      e1 = elph_tr_ds%en_all(1,ie1)
    1133                 :           0 :      e2 = e1 - omega_max
    1134         [ #  # ]:           0 :      if (e2 .lt. elph_tr_ds%en_all(1,1)) then
    1135                 :             :        i_start = 1
    1136                 :             :      else
    1137                 :           0 :        i_start = 1
    1138                 :           0 :        diff = dabs(e2-elph_tr_ds%en_all(1,1))
    1139         [ #  # ]:           0 :        do ie2 = 2, tmp_nenergy
    1140         [ #  # ]:           0 :          if (dabs(e2-elph_tr_ds%en_all(1,ie2)) .lt. diff) then
    1141                 :           0 :            diff = dabs(e2-elph_tr_ds%en_all(1,ie2))
    1142                 :           0 :            i_start = ie2
    1143                 :             :          end if
    1144                 :             :        end do
    1145                 :             :      end if
    1146                 :           0 :      e2 = e1 + omega_max
    1147         [ #  # ]:           0 :      if (e2 .gt. elph_tr_ds%en_all(1,tmp_nenergy)) then
    1148                 :             :        i_end = tmp_nenergy
    1149                 :             :      else
    1150                 :           0 :        i_end = 1
    1151                 :           0 :        diff = dabs(e2-elph_tr_ds%en_all(1,1))
    1152         [ #  # ]:           0 :        do ie2 = 2, tmp_nenergy
    1153         [ #  # ]:           0 :          if (dabs(e2-elph_tr_ds%en_all(1,ie2)) .lt. diff) then
    1154                 :           0 :            diff = dabs(e2-elph_tr_ds%en_all(1,ie2))
    1155                 :           0 :            i_end = ie2
    1156                 :             :          end if
    1157                 :             :        end do
    1158                 :             :      end if
    1159         [ #  # ]:           0 :      do ie2 = i_start, i_end
    1160                 :           0 :        elph_ds%n_pair = elph_ds%n_pair + 1
    1161                 :           0 :        pair2red(ie1,ie2) = elph_ds%n_pair
    1162                 :             :      end do
    1163                 :             :    end do
    1164                 :             : 
    1165                 :             : !  symmetrize paire2red
    1166                 :           0 :    elph_ds%n_pair = 0
    1167         [ #  # ]:           0 :    do ie1 = 1, tmp_nenergy
    1168         [ #  # ]:           0 :      do ie2 = 1, tmp_nenergy
    1169   [ #  #  #  # ]:           0 :        if (pair2red(ie1,ie2) .ne. 0 .or. pair2red(ie2,ie1) .ne. 0) then
    1170                 :           0 :          elph_ds%n_pair = elph_ds%n_pair + 1
    1171                 :           0 :          pair2red(ie1,ie2) = elph_ds%n_pair
    1172                 :             :        end if
    1173                 :             :      end do
    1174                 :             :    end do
    1175                 :             : 
    1176                 :           0 :    write(message,'(a,i3,a)')' There are  ', elph_ds%n_pair, '  energy pairs. '
    1177                 :           0 :    call wrtout(std_out,message,'COLL')
    1178                 :             : 
    1179   [ #  #  #  #  :           0 :    ABI_MALLOC(red2pair,(2,elph_ds%n_pair))
          #  #  #  #  #  
                #  #  # ]
    1180   [ #  #  #  # ]:           0 :    red2pair = 0
    1181                 :           0 :    elph_ds%n_pair = 0
    1182         [ #  # ]:           0 :    do ie1 = 1, tmp_nenergy
    1183         [ #  # ]:           0 :      do ie2 = 1, tmp_nenergy
    1184   [ #  #  #  # ]:           0 :        if (pair2red(ie1,ie2) .ne. 0 .or. pair2red(ie2,ie1) .ne. 0) then
    1185                 :           0 :          elph_ds%n_pair = elph_ds%n_pair + 1
    1186                 :           0 :          red2pair(1,elph_ds%n_pair) = ie1
    1187                 :           0 :          red2pair(2,elph_ds%n_pair) = ie2
    1188                 :             :        end if
    1189                 :             :      end do
    1190                 :             :    end do
    1191                 :             : 
    1192                 :             : !  moved from integrate_gamma_tr to here
    1193   [ #  #  #  #  :           0 :    ABI_MALLOC(elph_tr_ds%gamma_qpt_tr,(2,9,elph_ds%nbranch**2,elph_ds%nsppol,elph_ds%nqpt_full))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
    1194   [ #  #  #  #  :           0 :    ABI_MALLOC(elph_tr_ds%gamma_rpt_tr,(2,9,elph_ds%nbranch**2,elph_ds%nsppol,Ifc%nrpt,4,elph_ds%n_pair))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
    1195   [ #  #  #  #  :           0 :    elph_tr_ds%gamma_rpt_tr = zero
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    1196                 :             : 
    1197                 :           0 :    s1ofssp = (/1,1,-1,-1/)
    1198                 :           0 :    s2ofssp = (/1,-1,1,-1/)
    1199                 :             : 
    1200                 :             : !  Get gamma
    1201   [ #  #  #  #  :           0 :    ABI_MALLOC(gam_qpt,(2,3*natom*3*natom,elph_ds%nqpt_full))
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
    1202   [ #  #  #  #  :           0 :    ABI_MALLOC(gam_rpt,(2,3*natom*3*natom,Ifc%nrpt))
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
    1203         [ #  # ]:           0 :    do ie=1,elph_ds%n_pair
    1204                 :           0 :      ie1 = red2pair(1,ie)
    1205                 :           0 :      ie2 = red2pair(2,ie)
    1206                 :             : 
    1207   [ #  #  #  # ]:           0 :      tmp_veloc_sq1(:,:)=elph_tr_ds%veloc_sq(:,:,ie1)
    1208   [ #  #  #  #  :           0 :      elph_tr_ds%tmp_gkk_intweight1(:,:,:) = elph_tr_ds%tmp_gkk_intweight(:,:,:,ie1)
                   #  # ]
    1209   [ #  #  #  #  :           0 :      elph_tr_ds%tmp_velocwtk1(:,:,:,:) = elph_tr_ds%tmp_velocwtk(:,:,:,:,ie1)
             #  #  #  # ]
    1210   [ #  #  #  #  :           0 :      elph_tr_ds%tmp_vvelocwtk1(:,:,:,:,:) = elph_tr_ds%tmp_vvelocwtk(:,:,:,:,:,ie1)
          #  #  #  #  #  
                      # ]
    1211                 :             : 
    1212   [ #  #  #  # ]:           0 :      tmp_veloc_sq2(:,:)=elph_tr_ds%veloc_sq(:,:,ie2)
    1213   [ #  #  #  #  :           0 :      elph_tr_ds%tmp_gkk_intweight2(:,:,:) = elph_tr_ds%tmp_gkk_intweight(:,:,:,ie2)
                   #  # ]
    1214   [ #  #  #  #  :           0 :      elph_tr_ds%tmp_velocwtk2(:,:,:,:) = elph_tr_ds%tmp_velocwtk(:,:,:,:,ie2)
             #  #  #  # ]
    1215   [ #  #  #  #  :           0 :      elph_tr_ds%tmp_vvelocwtk2(:,:,:,:,:) = elph_tr_ds%tmp_vvelocwtk(:,:,:,:,:,ie2)
          #  #  #  #  #  
                      # ]
    1216                 :             : 
    1217         [ #  # ]:           0 :      do ssp=1,4  ! (s,s'=+/-1, condense the indices)
    1218                 :           0 :        s1=s1ofssp(ssp)
    1219                 :           0 :        s2=s2ofssp(ssp)
    1220   [ #  #  #  #  :           0 :        elph_tr_ds%gamma_qpt_tr = zero
          #  #  #  #  #  
                      # ]
    1221                 :             : 
    1222                 :             :        call integrate_gamma_tr(elph_ds,FSfullpqtofull,s1,s2, &
    1223                 :           0 : &       tmp_veloc_sq1,tmp_veloc_sq2,elph_tr_ds)
    1224                 :             : 
    1225                 :             :        call complete_gamma_tr(cryst,elph_ds%ep_scalprod,elph_ds%nbranch,elph_ds%nqptirred,&
    1226                 :           0 : &       elph_ds%nqpt_full,elph_ds%nsppol,elph_tr_ds%gamma_qpt_tr,elph_ds%qirredtofull,qpttoqpt)
    1227                 :             : 
    1228                 :             : !      Now FT to real space too
    1229                 :           0 :        qtor = 1 ! q --> r
    1230         [ #  # ]:           0 :        do isppol=1,elph_ds%nsppol
    1231         [ #  # ]:           0 :          do idir=1,9
    1232   [ #  #  #  #  :           0 :            gam_qpt(:,:,:)=elph_tr_ds%gamma_qpt_tr(:,idir,:,isppol,:)
                   #  # ]
    1233                 :             :            call ftgam(Ifc%wghatm,elph_tr_ds%gamma_qpt_tr(:,idir,:,isppol,:),&
    1234                 :             : &           elph_tr_ds%gamma_rpt_tr(:,idir,:,isppol,:,ssp,ie),natom,&
    1235   [ #  #  #  #  :           0 : &           elph_ds%nqpt_full,Ifc%nrpt,qtor,coskr, sinkr)
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
    1236   [ #  #  #  #  :           0 :            elph_tr_ds%gamma_rpt_tr(:,idir,:,isppol,:,ssp,ie)=gam_rpt(:,:,:)
                   #  # ]
    1237                 :             :          end do
    1238                 :             :        end do
    1239                 :             : 
    1240                 :             :      end do !ss
    1241                 :             :    end do !ie
    1242                 :             : 
    1243         [ #  # ]:           0 :    ABI_FREE(gam_qpt)
    1244         [ #  # ]:           0 :    ABI_FREE(gam_rpt)
    1245         [ #  # ]:           0 :    ABI_FREE(tmp_veloc_sq1)
    1246         [ #  # ]:           0 :    ABI_FREE(tmp_veloc_sq2)
    1247                 :             :  end if ! ifltransport
    1248                 :             : 
    1249         [ -  + ]:          15 :  ABI_FREE(qpttoqpt)
    1250         [ -  + ]:          15 :  ABI_FREE(FSfullpqtofull)
    1251                 :             : 
    1252                 :             : 
    1253                 :             : !==============================================================
    1254                 :             : !Calculate phonon linewidths, interpolating on chosen qpoints
    1255                 :             : !==============================================================
    1256                 :             : 
    1257                 :          15 :  call mkph_linwid(Cryst,ifc,elph_ds,anaddb_dtset%nqpath,anaddb_dtset%qpath)
    1258                 :             : 
    1259                 :             : !==============================================================
    1260                 :             : !the nesting factor calculation
    1261                 :             : !FIXME: this could go higher up, before the call to get_all_gkq
    1262                 :             : !you only need the kpt and weight info
    1263                 :             : !==============================================================
    1264         [ +  + ]:          15 :  if (any(anaddb_dtset%prtnest==[1,2])) then
    1265                 :             : 
    1266         [ +  - ]:           3 :    nestname = trim(elph_ds%elph_base_name) // "_NEST"
    1267                 :             :    call mknesting(elph_ds%k_phon%nkpt,elph_ds%k_phon%kpt,elph_ds%kptrlatt,elph_ds%nFSband,elph_ds%k_phon%nsppol,&
    1268                 :             : &   elph_ds%k_phon%wtk,anaddb_dtset%nqpath,anaddb_dtset%qpath,elph_ds%nqpt_full, &
    1269                 :           3 : &   elph_ds%qpt_full,nestname,cryst%gprimd,cryst%gmet,anaddb_dtset%prtnest,qptrlatt)
    1270                 :             :  end if
    1271                 :             : 
    1272                 :             : !======================================================
    1273                 :             : !Calculate alpha^2 F integrating over fine kpt_phon grid
    1274                 :             : !======================================================
    1275                 :             : 
    1276   [ -  +  +  -  :          45 :  ABI_MALLOC(a2f_1d,(elph_ds%na2f))
          +  -  +  -  -  
                +  -  + ]
    1277   [ -  +  +  -  :          30 :  ABI_MALLOC(dos_phon,(elph_ds%na2f))
             -  +  -  + ]
    1278                 :             : 
    1279                 :          15 :  call mka2f(Cryst,Ifc,a2f_1d,dos_phon,elph_ds,elph_ds%kptrlatt_fine,elph_ds%mustar)
    1280                 :             : 
    1281                 :             : !calculate transport spectral function and coefficients
    1282         [ +  + ]:          15 :  if (elph_tr_ds%ifltransport==1 )then ! LOVA
    1283                 :             : 
    1284                 :           5 :    call mka2f_tr_lova(cryst,ifc,elph_ds,elph_ds%ntemper,elph_ds%tempermin,elph_ds%temperinc,elph_tr_ds)
    1285                 :             : 
    1286         [ -  + ]:          10 :  else if (elph_tr_ds%ifltransport==2 )then ! non LOVA
    1287                 :             : 
    1288                 :           0 :    call mka2f_tr(cryst,ifc,elph_ds,elph_ds%ntemper,elph_ds%tempermin,elph_ds%temperinc,pair2red,elph_tr_ds)
    1289                 :             : 
    1290         [ #  # ]:           0 :    ABI_FREE(pair2red)
    1291         [ #  # ]:           0 :    ABI_FREE(red2pair)
    1292                 :             : 
    1293         [ +  - ]:          10 :  else if (elph_tr_ds%ifltransport==3 )then ! get k-dependent tau
    1294                 :             : 
    1295                 :           0 :    call get_tau_k(Cryst,ifc,Bst,elph_ds,elph_tr_ds,eigenGS,max_occ)
    1296                 :             :    !call trans_rta(elph_ds,elph_tr_ds,cryst%gprimd,eigenGS,max_occ,cryst%ucvol)
    1297                 :             :  end if ! ifltransport
    1298                 :             : 
    1299         [ -  + ]:          15 :  ABI_FREE(eigenGS)
    1300         [ -  + ]:          15 :  ABI_FREE(eigenGS_fine)
    1301                 :             : 
    1302                 :             : 
    1303                 :             : !evaluate a2F only using the input Q-grid (without using interpolated matrices)
    1304                 :             : !SCOPE: test the validity of the Fourier interpolation
    1305                 :          15 :  call wrtout(std_out,' elphon : calling mka2fQgrid',"COLL")
    1306                 :             : 
    1307         [ +  - ]:          15 :  fname=trim(elph_ds%elph_base_name) // '_A2F_QGRID'
    1308                 :          15 :  call mka2fQgrid(elph_ds,fname)
    1309                 :             : 
    1310                 :             : !=============================================
    1311                 :             : !Eliashberg equation in 1-D (isotropic case)
    1312                 :             : !=============================================
    1313                 :             : 
    1314                 :          15 :  call eliashberg_1d(a2f_1d,elph_ds,anaddb_dtset%mustar)
    1315                 :             : 
    1316         [ -  + ]:          15 :  ABI_FREE(a2f_1d)
    1317         [ -  + ]:          15 :  ABI_FREE(dos_phon)
    1318                 :             : 
    1319                 :             : !MJV: 20070805 should exit here. None of the rest is tested or used yet to my knowledge
    1320                 :             : 
    1321                 :             : !========================================================================
    1322                 :             : !Now gkk contains the matrix elements of dH(1)/dxi i=1,2,3
    1323                 :             : !for kpoints on the FS but qpoints only in the given grid {Q}.
    1324                 :             : !
    1325                 :             : !1.) Need to complete the gkk elements for q and k\prime=k+q not
    1326                 :             : !in the set of {k+Q} by Fourier interpolation on the Q.
    1327                 :             : !
    1328                 :             : !2.) Need to complete the dynamical matrices and phonon freqs for
    1329                 :             : !all q between points on the FS.
    1330                 :             : !
    1331                 :             : !3.) With the eigenvectors e_ph of the dyn mats, do the scalar product
    1332                 :             : !e_ph . gkk, which implies the gkk are turned to the eigenbasis of
    1333                 :             : !the phonons. Before the (non eigen-) modes are ordered
    1334                 :             : !atom1 xred1 atom1 xred2 atom1 xred3
    1335                 :             : !atom2 xred1 atom2 xred2 atom2 xred3 ...
    1336                 :             : !=======================================================================
    1337                 :             : 
    1338                 :          15 :  make_gkk2=.false.
    1339                 :             : 
    1340                 :             :  if (.not. make_gkk2) then
    1341                 :          15 :    call wrtout(std_out,' elphon : skipping full g(k,k") interpolation ',"COLL")
    1342                 :             :  else
    1343                 :             : 
    1344                 :             : !  ==========================================================
    1345                 :             : !  FT of recip space gkk matrices to real space (gkk_rpt)
    1346                 :             : !  NOTE: could be made into FFT, couldnt it? If shifts are
    1347                 :             : !  used with a homogeneous grid
    1348                 :             : !  ==========================================================
    1349                 :             :    write (message,'(2a,i0)')ch10,&
    1350                 :             : &   ' elphon : Fourier transform (q --> r) of the gkk matrices using nrpt = ',Ifc%nrpt
    1351                 :             :    call wrtout(std_out,message,'COLL')
    1352                 :             : 
    1353                 :             :    call get_all_gkr(elph_ds,ifc%gprim,natom,Ifc%nrpt,onegkksize,Ifc%rpt,elph_ds%qpt_full,Ifc%wghatm)
    1354                 :             : 
    1355                 :             : !  =========================================================
    1356                 :             : !  complete gkk2 for all qpts between points
    1357                 :             : !  on full kpt grid (interpolation from real space values)
    1358                 :             : !  =========================================================
    1359                 :             : 
    1360                 :             :    write(message,'(2a)')ch10,&
    1361                 :             : &   ' elphon : Calling get_all_gkk2 to calculate gkk2 for q points over the full k grid'
    1362                 :             :    call wrtout(std_out,message,'COLL')
    1363                 :             : 
    1364                 :             :    call get_all_gkk2(cryst,ifc,elph_ds,elph_ds%k_phon%kptirr,elph_ds%k_phon%kpt)
    1365                 :             :  end if
    1366                 :             : 
    1367                 :             : !=====================================================
    1368                 :             : !Here should be the anisotropic Eliashberg equations.
    1369                 :             : !=====================================================
    1370                 :             : 
    1371                 :             : !clean and deallocate junk
    1372                 :          15 :  call Bst%free()
    1373                 :          15 :  call elph_ds_clean(elph_ds)
    1374                 :          15 :  call elph_tr_ds_clean(elph_tr_ds)
    1375                 :          15 :  call hdr%free()
    1376                 :             : 
    1377         [ -  + ]:          15 :  ABI_FREE(coskr)
    1378         [ -  + ]:          15 :  ABI_FREE(sinkr)
    1379                 :             : 
    1380         [ +  + ]:          15 :  if (is_open(elph_ds%unitgkq)) close(elph_ds%unitgkq)
    1381                 :             : 
    1382   [ -  +  -  +  :         135 : end subroutine elphon
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
                      + ]
    1383                 :             : !!***
    1384                 :             : 
    1385                 :             : !!****f* m_elphon/outelph
    1386                 :             : !! NAME
    1387                 :             : !! outelph
    1388                 :             : !!
    1389                 :             : !! FUNCTION
    1390                 :             : !!  Output to stdout and file the data for electron phonon coupling,
    1391                 :             : !!  on the q-points which were really calculated by abinit (no interpolation yet)
    1392                 :             : !!
    1393                 :             : !! INPUTS
    1394                 :             : !!  elph_ds  the elph_type structured variable
    1395                 :             : !!  enunit   from the anaddb dataset 0 ==> Hartree and cm-1;
    1396                 :             : !!                                   1 ==> meV and Thz;
    1397                 :             : !!
    1398                 :             : !! OUTPUT
    1399                 :             : !!  only write
    1400                 :             : !!
    1401                 :             : !! SOURCE
    1402                 :             : 
    1403                 :          15 : subroutine outelph(elph_ds,enunit,fname)
    1404                 :             : 
    1405                 :             : !Arguments ------------------------------------
    1406                 :             : !scalars
    1407                 :             :  integer,intent(in) :: enunit
    1408                 :             :  character(len=fnlen),intent(in) :: fname
    1409                 :             :  type(elph_type),intent(in) :: elph_ds
    1410                 :             : 
    1411                 :             : !Local variables-------------------------------
    1412                 :             : !scalars
    1413                 :             :  integer :: ibranch,ii,iqfull,iqirr,isppol,jj,nfile,qmax,qnest_max,qnest_min
    1414                 :             :  integer :: nbranch,nsppol,nqptirred
    1415                 :             :  real(dp) :: lambda_q_max,lambda_qbranch_max,lambda_tot,nest_max,nest_min
    1416                 :             :  real(dp) :: omegalog_q,omegalog_qgrid,tc_macmill
    1417                 :             :  character(len=500) :: msg
    1418                 :          15 :  type(krank_t) :: krank
    1419                 :             : !arrays
    1420                 :             :  integer :: qbranch_max(2)
    1421                 :          15 :  real(dp),allocatable :: lambda_q(:,:),nestfactor(:),qirred(:,:)
    1422                 :             : ! *************************************************************************
    1423                 :             : 
    1424   [ +  -  -  +  :          15 :  if ( ALL (enunit /= (/0,1,2/)) )  then
                   -  + ]
    1425                 :           0 :    write(msg,'(a,i0)')' enunit should be 0 or 1 or 2 while it is ',enunit
    1426                 :           0 :    ABI_BUG(msg)
    1427                 :             :  end if
    1428                 :             : 
    1429                 :          15 :  nbranch   = elph_ds%nbranch
    1430                 :          15 :  nsppol    = elph_ds%nsppol
    1431                 :          15 :  nqptirred = elph_ds%nqptirred
    1432                 :             : 
    1433                 :             : !==========================================================
    1434                 :             : !write header
    1435                 :             : !==========================================================
    1436         [ -  + ]:          15 :  if (open_file(fname,msg,newunit=nfile,form="formatted",status="unknown") /= 0) then
    1437                 :           0 :    ABI_ERROR(msg)
    1438                 :             :  end if
    1439                 :             : 
    1440         [ +  + ]:        1230 :  write(msg,'(2a,80a,4a,80a)')ch10,' ',('=',ii=1,80),ch10,&
    1441                 :          15 : & ' Values of the parameters that define the electron-phonon calculation',ch10,&
    1442   [ +  -  +  -  :        2445 : & ' ',('=',ii=1,80)
                   +  + ]
    1443                 :          15 :  call wrtout(nfile,msg,'COLL')
    1444                 :             : 
    1445                 :             :  write(msg,'(a,i10,a,i10,a,i10)')&
    1446                 :          15 : & ' nkpt_phon    = ',elph_ds%k_phon%nkpt,   ' nkpt_phonirred = ',elph_ds%k_phon%nkptirr,&
    1447                 :          30 : & ' nqpt      = ',elph_ds%nqpt_full
    1448                 :          15 :  call wrtout(nfile,msg,'COLL')
    1449                 :             : 
    1450         [ +  + ]:          15 :  if (nsppol==1) then
    1451                 :          14 :    write(msg,'(2a,f10.7,a,f10.6,a,f10.7)')ch10,&
    1452                 :          14 : &   ' Fermi DOS = ',elph_ds%n0(1),       ' Fermi level = ',elph_ds%fermie,&
    1453                 :          28 : &   ' mustar    = ',elph_ds%mustar
    1454                 :          14 :    call wrtout(nfile,msg,'COLL')
    1455         [ +  - ]:           1 :  else if (nsppol==2) then
    1456                 :           1 :    write(msg,'(2a,f10.7,f10.7,a,f10.6,a,f10.7)')ch10,&
    1457                 :           1 : &   ' Fermi DOS (up/dn) = ',elph_ds%n0(1),elph_ds%n0(2),       ' Fermi level = ',elph_ds%fermie,&
    1458                 :           2 : &   ' mustar    = ',elph_ds%mustar
    1459                 :           1 :    call wrtout(nfile,msg,'COLL')
    1460                 :             :  else
    1461                 :           0 :    ABI_BUG("bad value for nsppol")
    1462                 :             :  end if
    1463                 :             : 
    1464                 :          15 :  write(msg,'(2a,i10,a,i10,a,i10)')ch10,&
    1465                 :          15 : & ' minFSband = ',elph_ds%minFSband,' maxFSband   = ',elph_ds%maxFSband,&
    1466                 :          30 : & ' ngkkband  = ',elph_ds%ngkkband
    1467                 :          15 :  call wrtout(nfile,msg,'COLL')
    1468                 :             : 
    1469   [ +  -  +  + ]:        1215 :  write(msg,'(80a,a)')('=',ii=1,80),ch10
    1470                 :          15 :  call wrtout(nfile,msg,'COLL')
    1471                 :             : 
    1472                 :             : !==========================================================
    1473                 :             : !evaluate lambda and omega_log as a weighted sum over the q grid
    1474                 :             : !NOTE: in this part of the code atomic units are used
    1475                 :             : !==========================================================
    1476                 :             : 
    1477   [ -  +  +  -  :          60 :  ABI_MALLOC(lambda_q,(nqptirred,nsppol))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
    1478   [ +  +  +  + ]:          82 :  lambda_q=zero
    1479                 :          15 :  lambda_tot=zero ; lambda_q_max=zero
    1480                 :          15 :  qmax=0          ; lambda_qbranch_max=zero
    1481         [ +  + ]:          45 :  qbranch_max(:)=1; omegalog_qgrid=zero
    1482                 :             : 
    1483         [ +  + ]:          63 :  do iqirr=1,nqptirred
    1484                 :          48 :    omegalog_q=zero
    1485                 :             : 
    1486         [ +  + ]:         114 :    do isppol=1,nsppol
    1487         [ +  + ]:         240 :      do ibranch=1,nbranch
    1488                 :             : !      find Max lambda(q,n)
    1489         [ +  + ]:         189 :        if (elph_ds%qgrid_data(iqirr,ibranch,isppol,3) > lambda_qbranch_max) then
    1490                 :          43 :          lambda_qbranch_max=elph_ds%qgrid_data(iqirr,ibranch,isppol,3)
    1491                 :          43 :          qbranch_max(1)=iqirr
    1492                 :          43 :          qbranch_max(2)=ibranch
    1493                 :             :        end if
    1494                 :         189 :        lambda_q(iqirr,isppol)=lambda_q(iqirr,isppol)+elph_ds%qgrid_data(iqirr,ibranch,isppol,3)
    1495         [ +  + ]:         189 :        if (abs(elph_ds%qgrid_data(iqirr,ibranch,isppol,1)) <= tol10) cycle
    1496                 :         240 :        omegalog_q=omegalog_q + elph_ds%qgrid_data(iqirr,ibranch,isppol,3)*log(abs(elph_ds%qgrid_data(iqirr,ibranch,isppol,1)))
    1497                 :             :      end do
    1498                 :             : 
    1499                 :          51 :      lambda_tot=lambda_tot+elph_ds%wtq(elph_ds%qirredtofull(iqirr))*lambda_q(iqirr,isppol)
    1500                 :          51 :      omegalog_qgrid=omegalog_qgrid+elph_ds%wtq(elph_ds%qirredtofull(iqirr))*omegalog_q
    1501                 :             : 
    1502                 :             : 
    1503                 :             : !    find Max lambda(q)
    1504         [ +  + ]:          99 :      if (lambda_q(iqirr,isppol) > lambda_q_max) then
    1505                 :          29 :        lambda_q_max=lambda_q(iqirr,isppol)
    1506                 :          29 :        qmax=iqirr
    1507                 :             :      end if
    1508                 :             :    end do
    1509                 :             : 
    1510                 :             :  end do !iqirr
    1511                 :             : 
    1512                 :          15 :  omegalog_qgrid=exp(omegalog_qgrid/lambda_tot)
    1513                 :             : 
    1514                 :             :  write (msg,'(3a,2(a,es16.8))')                                                                              &
    1515                 :          15 : & ' Values of Lambda, Omega_log and Tc obtained using the weighted sum over the input Q-grid',ch10,ch10,&
    1516                 :          30 : & ' Isotropic Lambda = ',lambda_tot,'  Input mustar     = ',elph_ds%mustar
    1517                 :          15 :  call wrtout(nfile,msg,'COLL')
    1518                 :             : 
    1519         [ +  - ]:          15 :  if (enunit==0) then !use hartree and cm-1
    1520                 :          15 :    write (msg,'(2a,es16.8,a,es16.8,a)')ch10,&
    1521                 :          30 : &   ' Omega_log        = ',omegalog_qgrid,' (Ha) ',omegalog_qgrid*Ha_cmm1,' (cm-1)'
    1522                 :          15 :    call wrtout(nfile,msg,'COLL')
    1523         [ #  # ]:           0 :  else if (enunit==1) then !mev Thz
    1524                 :           0 :    write (msg,'(2a,es16.8,a,es16.8,a)')ch10,&
    1525                 :           0 : &   ' Omega_log        = ',omegalog_qgrid*Ha_eV/1000._dp,' (meV) ',omegalog_qgrid*Ha_THz,' (THz)'
    1526                 :           0 :    call wrtout(nfile,msg,'COLL')
    1527                 :             :  else !hartree,cm-1,mev,Thz,kelvin
    1528                 :           0 :    write (msg,'(2a,es16.8,a,es16.8,3a,es16.8,a,es16.8,3a,es16.8,a)')ch10,                              &
    1529                 :           0 : &   ' Omega_log        = ',omegalog_qgrid,' (Ha)  ',omegalog_qgrid*Ha_cmm1,' (cm-1)',ch10,             &
    1530                 :           0 : &   '                  = ',omegalog_qgrid*Ha_eV/1000._dp,' (meV) ',omegalog_qgrid*Ha_THz,' (THz)',ch10,&
    1531                 :           0 : &   '                  = ',omegalog_qgrid*Ha_K,' (K) '
    1532                 :           0 :    call wrtout(nfile,msg,'COLL')
    1533                 :             :  end if
    1534                 :             : 
    1535                 :             :  tc_macmill = omegalog_qgrid/1.2_dp&
    1536                 :          15 : & *exp((-1.04_dp*(one+lambda_tot)) / (lambda_tot-elph_ds%mustar*(one+0.62_dp*lambda_tot)))
    1537                 :             : 
    1538         [ +  - ]:          15 :  if (enunit==0) then !use hartree and cm-1
    1539                 :          15 :    write (msg,'(2a,es16.8,a,es16.8,2a)')ch10,&
    1540                 :          30 : &   ' MacMillan Tc     = ',tc_macmill,' (Ha) ',tc_macmill*Ha_cmm1,' (cm-1) ',ch10
    1541                 :          15 :    call wrtout(nfile,msg,'COLL')
    1542         [ #  # ]:           0 :  else if (enunit==1) then !use mev and Thz
    1543                 :           0 :    write (msg,'(2a,es16.8,a,es16.8,2a)')ch10,&
    1544                 :           0 : &   ' MacMillan Tc     = ',tc_macmill*Ha_eV/1000._dp,' (meV) ',tc_macmill*Ha_THz,' (THz) ',ch10
    1545                 :           0 :    call wrtout(nfile,msg,'COLL')
    1546                 :             :  else !use hartree,cm-1,mev,Thz,kelvin
    1547                 :           0 :    write (msg,'(2a,es16.8,a,es16.8,3a,es16.8,a,es16.8,3a,es16.8,2a)')ch10,                 &
    1548                 :           0 : &   ' MacMillan Tc     = ',tc_macmill,' (Ha)  ',tc_macmill*Ha_cmm1,' (cm-1) ',ch10,            &
    1549                 :           0 : &   '                  = ',tc_macmill*Ha_eV/1000._dp,' (meV) ',tc_macmill*Ha_THz,' (THz) ',ch10,&
    1550                 :           0 : &   '                  = ',tc_macmill*Ha_K,' (K) ',ch10
    1551                 :           0 :    call wrtout(nfile,msg,'COLL')
    1552                 :             :  end if
    1553                 :             : 
    1554                 :             : !==========================================================
    1555                 :             : !output lambda(q) values for each q point in the irred grid
    1556                 :             : !==========================================================
    1557                 :             : 
    1558                 :          15 :  write(msg,'(2a)')' Irreducible q-points and corresponding Lambda(q)',ch10
    1559                 :          15 :  call wrtout(nfile,msg,'COLL')
    1560                 :             : 
    1561         [ +  + ]:          31 :  do isppol=1,nsppol
    1562                 :          16 :    write(msg,'(a,i3,2a)')'  === isppol ', isppol,' === ',ch10
    1563                 :          16 :    call wrtout(nfile,msg,'COLL')
    1564                 :             : !
    1565         [ +  + ]:          82 :    do iqirr=1,nqptirred
    1566                 :          51 :      iqfull=elph_ds%qirredtofull(iqirr)
    1567                 :             :      write(msg,'(i5,a,3(es16.8,1x),a,es16.8,a)')&
    1568                 :          51 : &     iqfull,') ',elph_ds%qpt_full(:,iqfull),'(',lambda_q(iqirr,isppol),'  )'
    1569                 :          67 :      call wrtout(nfile,msg,'COLL')
    1570                 :             :    end do
    1571                 :             : !
    1572                 :             :  end do
    1573                 :             : 
    1574                 :             : !use same indexing as that used for the full q-grid
    1575                 :          15 :  qmax=elph_ds%qirredtofull(qmax)
    1576                 :          15 :  qbranch_max(1)=elph_ds%qirredtofull(qbranch_max(1))
    1577                 :             : 
    1578                 :          15 :  write (msg,'(2a,es16.8,a,i6,3a,es16.8,a,i6,a,i4)')ch10,            &
    1579                 :          15 : & ' Max lambda(q)      = ',lambda_q_max,      ' at qpt ',qmax,')',ch10, &
    1580                 :          15 : & ' Max lambda(q,n)    = ',lambda_qbranch_max,' at qpt ',qbranch_max(1),&
    1581                 :          30 : & ') and Mode number ',qbranch_max(2)
    1582                 :          15 :  call wrtout(nfile,msg,'COLL')
    1583                 :             : 
    1584                 :             : !==========================================================
    1585                 :             : !evaluation of the nesting-factor over the irreducible q grid.
    1586                 :             : !==========================================================
    1587                 :             : 
    1588                 :             : !fill irreducile q-grid
    1589   [ -  +  +  -  :          45 :  ABI_MALLOC(qirred,(3,nqptirred))
          +  -  +  -  -  
                +  -  + ]
    1590   [ +  +  +  + ]:         207 :  qirred(:,:)=zero
    1591                 :             : 
    1592         [ +  + ]:          63 :  do iqirr=1,nqptirred
    1593         [ +  + ]:         207 :    qirred(:,iqirr)=elph_ds%qpt_full(:,elph_ds%qirredtofull(iqirr))
    1594                 :             :  end do
    1595                 :             : 
    1596                 :          15 :  call krank%init(elph_ds%k_phon%nkpt, elph_ds%k_phon%kpt)
    1597                 :             : 
    1598   [ -  +  +  -  :          45 :  ABI_MALLOC(nestfactor,(nqptirred))
          +  -  +  -  -  
                +  -  + ]
    1599                 :             : 
    1600                 :             : !NOTE: weights are not normalised, the normalisation factor in reintroduced in bfactor
    1601                 :             :  call bfactor(elph_ds%k_phon%nkpt,elph_ds%k_phon%kpt,nqptirred,qirred,krank,&
    1602                 :          15 : & elph_ds%k_phon%nkpt,elph_ds%k_phon%wtk,elph_ds%nFSband,nestfactor)
    1603                 :             : 
    1604         [ -  + ]:          15 :  ABI_FREE(qirred)
    1605                 :          15 :  call krank%free()
    1606                 :             : 
    1607                 :             : 
    1608                 :             : !find Max and min of the nesting factor
    1609                 :             : !NOTE maxloc and minloc are arrays so they cannot be used in the formatted output
    1610                 :             : !anyway the size of nestfactor is not so huge!!!
    1611   [ +  -  -  +  :         141 :  nest_max=maxval(nestfactor); nest_min=minval(nestfactor)
          -  -  +  +  +  
          -  -  +  -  -  
                   +  + ]
    1612                 :             : 
    1613                 :          15 :  qnest_max=0
    1614         [ +  - ]:          15 :  do iqirr=1,nqptirred
    1615         [ +  - ]:          15 :    if (nestfactor(iqirr)==nest_max) then
    1616                 :          15 :      qnest_max=iqirr
    1617                 :          15 :      exit
    1618                 :             :    end if
    1619                 :             :  end do
    1620                 :             : 
    1621                 :          15 :  qnest_min=0
    1622         [ +  - ]:          34 :  do iqirr=1,nqptirred
    1623         [ +  + ]:          34 :    if (nestfactor(iqirr)==nest_min) then
    1624                 :          15 :      qnest_min=iqirr
    1625                 :          15 :      exit
    1626                 :             :    end if
    1627                 :             :  end do
    1628                 :             : 
    1629   [ +  -  -  +  :         141 :  write (std_out,*) maxloc(nestfactor),minloc(nestfactor)
          -  -  +  +  -  
          +  +  +  +  -  
          -  +  -  -  +  
             +  +  +  +  
                      + ]
    1630                 :          15 :  write(msg,'(a,(a,es16.8,a,i6,a),a,(a,es16.8,a,i6,a))')ch10,  &
    1631                 :          15 : & ' Max nesting factor = ',nest_max,' at qpt ',qnest_max,') ',ch10,&
    1632                 :          30 : & ' min nesting factor = ',nest_min,' at qpt ',qnest_min,') '
    1633                 :          15 :  call wrtout(nfile,msg,'COLL')
    1634                 :             : 
    1635                 :             : !==========================================================
    1636                 :             : !Write ph-linewidths and lambda(q,n) obtained before the
    1637                 :             : !Fourier interpolation
    1638                 :             : !==========================================================
    1639                 :             : 
    1640                 :          15 :  write (msg,'(2a)')ch10,&
    1641                 :          30 : & ' Phonon frequencies, linewidths and e-ph coefficients for each irreducible q point '
    1642                 :          15 :  call wrtout(nfile,msg,'COLL')
    1643                 :             : 
    1644         [ +  + ]:          31 :  do isppol=1,nsppol
    1645                 :          16 :    write (msg,'(a,i3,a)') '========= quantities for isppol = ', isppol, ' ================='
    1646                 :          16 :    call wrtout(nfile,msg,'COLL')
    1647         [ +  + ]:          82 :    do iqirr=1,nqptirred
    1648                 :             : !    same numbering as that used for irred q points
    1649                 :          51 :      iqfull=elph_ds%qirredtofull(iqirr)
    1650                 :             : !    write(std_out,*) 'iqfull = ', iqfull
    1651                 :          51 :      write(msg,'(64a,i6,a,3(es16.8),3a,es16.8,a,es16.8,2a,es16.8,a,f8.3,65a)')ch10,&
    1652         [ +  + ]:        3162 : &     ' ',('=',jj=1,60),ch10,&
    1653                 :          51 : &     ' qpt ',iqfull,') ',elph_ds%qpt_full(:,iqfull),ch10,ch10,&
    1654                 :          51 : &     ' Weight    = ',elph_ds%wtq(iqfull),'    Lambda(q,isppol) = ',lambda_q(iqirr,isppol),ch10,&
    1655                 :          51 : &     ' Nest fact = ',nestfactor(iqirr),'    (',100*nestfactor(iqirr)/nest_max,' % of max_value )',ch10,&
    1656   [ +  -  +  -  :        6273 : &     ' ',('=',jj=1,60),ch10,' Mode number    Frequency       Linewidth        Lambda(q,n)'
                   +  + ]
    1657                 :          51 :      call wrtout(nfile,msg,'COLL')
    1658                 :             : 
    1659                 :             : !    use units according to enunit
    1660         [ +  - ]:          51 :      if (enunit==0 .or. enunit==2) then !hartree and cm-1
    1661         [ +  + ]:        3162 :        write(msg,'(63a)')' ',('-',jj=1,60),ch10,&
    1662         [ +  - ]:        3213 :        '                  (Ha)             (Ha)'
    1663                 :          51 :        call wrtout(nfile,msg,'COLL')
    1664         [ +  + ]:         240 :        do ibranch=1,nbranch
    1665                 :             : !        branch index, frequency, linewidth, lamda(q,n) (hartree units)
    1666   [ +  -  +  + ]:         756 :          write(msg,'(i6,5x,3(es16.8,1x))' )ibranch,(elph_ds%qgrid_data(iqirr,ibranch,isppol,jj),jj=1,3)
    1667                 :         240 :          call wrtout(nfile,msg,'COLL')
    1668                 :             :        end do
    1669         [ +  + ]:        3162 :        write(msg,'(63a)')' ',('-',jj=1,60),ch10,&
    1670         [ +  - ]:        3213 : &       '                 (cm-1)           (cm-1)'
    1671                 :          51 :        call wrtout(nfile,msg,'COLL')
    1672         [ +  + ]:         240 :        do ibranch=1,nbranch
    1673                 :             : !        branch index, frequency, linewidth (in cm-1)
    1674   [ +  -  +  + ]:         567 :          write(msg,'(i6,5x,2(es16.8,1x))' )ibranch,(Ha_cmm1*elph_ds%qgrid_data(iqirr,ibranch,isppol,jj),jj=1,2)
    1675                 :         240 :          call wrtout(nfile,msg,'COLL')
    1676                 :             :        end do
    1677                 :             :      end if !hartree and cm-1
    1678                 :             : 
    1679         [ -  + ]:          51 :      if (enunit==2 .or. enunit==1) then !write also meV Thz and Kelvin
    1680         [ #  # ]:           0 :        write(msg,'(63a)')' ',('-',jj=1,60),ch10,&
    1681         [ #  # ]:           0 : &       '                 (meV)             (meV)'
    1682                 :           0 :        call wrtout(nfile,msg,'COLL')
    1683         [ #  # ]:           0 :        if (enunit == 1 ) then !write also lambda values
    1684         [ #  # ]:           0 :          do ibranch=1,nbranch
    1685                 :             : !          branch index, frequency, linewidth, lamda(q,n) (mev units)
    1686         [ #  # ]:           0 :            write(msg,'(i6,5x,3(es16.8,1x))' )ibranch,((Ha_eV/1000._dp)*elph_ds%qgrid_data(iqirr,ibranch,isppol,jj),jj=1,2),&
    1687         [ #  # ]:           0 : &           elph_ds%qgrid_data(iqirr,ibranch,isppol,3)
    1688                 :           0 :            call wrtout(nfile,msg,'COLL')
    1689                 :             :          end do
    1690                 :             :        else !do not write lambda values
    1691         [ #  # ]:           0 :          do ibranch=1,nbranch
    1692                 :             : !          branch index, frequency, linewidth (in meV)
    1693   [ #  #  #  # ]:           0 :            write(msg,'(i6,5x,2(es16.8,1x))' )ibranch,((Ha_eV/1000._dp)*elph_ds%qgrid_data(iqirr,ibranch,isppol,jj),jj=1,2)
    1694                 :           0 :            call wrtout(nfile,msg,'COLL')
    1695                 :             :          end do
    1696                 :             :        end if
    1697                 :             : 
    1698         [ #  # ]:           0 :        write(msg,'(63a)')' ',('-',jj=1,60),ch10,&
    1699         [ #  # ]:           0 : &       '                 (Thz)             (Thz)'
    1700                 :           0 :        call wrtout(nfile,msg,'COLL')
    1701         [ #  # ]:           0 :        do ibranch=1,nbranch
    1702                 :             : !        branch index, frequency, linewidth (in Thz)
    1703   [ #  #  #  # ]:           0 :          write(msg,'(i6,5x,2(es16.8,1x))' )ibranch,(Ha_THz*elph_ds%qgrid_data(iqirr,ibranch,isppol,jj),jj=1,2)
    1704                 :           0 :          call wrtout(nfile,msg,'COLL')
    1705                 :             :        end do
    1706                 :             : 
    1707         [ #  # ]:           0 :        if (enunit == 2 ) then !kelvin
    1708         [ #  # ]:           0 :          write(msg,'(63a)')' ',('-',jj=1,60),ch10,&
    1709         [ #  # ]:           0 : &         '                  (K)               (K)'
    1710                 :           0 :          call wrtout(nfile,msg,'COLL')
    1711         [ #  # ]:           0 :          do ibranch=1,nbranch
    1712                 :             : !          branch index, frequency, linewidth (in Kelvin)
    1713   [ #  #  #  # ]:           0 :            write(msg,'(i6,5x,2(es16.8,1x))' )ibranch,(Ha_K*elph_ds%qgrid_data(iqirr,ibranch,isppol,jj),jj=1,2)
    1714                 :           0 :            call wrtout(nfile,msg,'COLL')
    1715                 :             :          end do
    1716                 :             :        end if !kelvin
    1717                 :             : 
    1718                 :             :      end if  !end write also meV Thz and Kelvin
    1719                 :             : 
    1720   [ +  -  +  + ]:        3111 :      write(msg,'(62a)')' ',('=',jj=1,60),ch10
    1721                 :          67 :      call wrtout(nfile,msg,'COLL')
    1722                 :             : 
    1723                 :             :    end do !nqptirred
    1724                 :             :  end do !nsppol
    1725                 :             : 
    1726         [ -  + ]:          15 :  ABI_FREE(nestfactor)
    1727         [ -  + ]:          15 :  ABI_FREE(lambda_q)
    1728                 :             : 
    1729                 :          15 :  close (nfile)
    1730                 :             : 
    1731   [ -  +  -  +  :          15 : end subroutine outelph
                   -  + ]
    1732                 :             : !!***
    1733                 :             : 
    1734                 :             : !!****f* m_elphon/rchkGSheader
    1735                 :             : !!
    1736                 :             : !! NAME
    1737                 :             : !! rchkGSheader
    1738                 :             : !!
    1739                 :             : !! FUNCTION
    1740                 :             : !! This routine reads the GS header information in the GKK file and checks it
    1741                 :             : !!
    1742                 :             : !! INPUTS
    1743                 :             : !!  natom = number of atoms from DDB, for check
    1744                 :             : !!  kptirr_phon = coordinates of the irreducible kpoints close to the FS
    1745                 :             : !!
    1746                 :             : !! OUTPUT
    1747                 :             : !!  hdr = header information
    1748                 :             : !!  nband = number of bands for rest of calculation
    1749                 :             : !!          should be the same for all kpts
    1750                 :             : !!
    1751                 :             : !! SOURCE
    1752                 :             : 
    1753                 :          15 : subroutine rchkGSheader (hdr,natom,nband,unitgkk)
    1754                 :             : 
    1755                 :             : !Arguments ------------------------------------
    1756                 :             : !scalars
    1757                 :             :  integer,intent(in) :: natom,unitgkk
    1758                 :             :  integer,intent(out) :: nband
    1759                 :             :  type(hdr_type),intent(inout) :: hdr
    1760                 :             : 
    1761                 :             : !Local variables-------------------------------
    1762                 :             : !scalars
    1763                 :             :  integer :: fform
    1764                 :             :  character(len=500) :: message
    1765                 :             : ! *************************************************************************
    1766                 :             : !
    1767                 :             : !read in general header of _GKK file
    1768                 :             : !this is where we get nkpt, ngkpt(:,:)... which are also read in
    1769                 :             : !rdddb9 and inprep8. Probably should do some checking to avoid
    1770                 :             : !using ddb files from other configurations
    1771                 :             : !
    1772                 :          15 :  rewind(unitgkk)
    1773                 :          15 :  call hdr%fort_read(unitgkk, fform)
    1774         [ -  + ]:          15 :  ABI_CHECK(fform/=0," GKK header mis-read. fform == 0")
    1775                 :             : 
    1776         [ -  + ]:          15 :  if (hdr%natom /= natom) then
    1777                 :           0 :    ABI_ERROR('natom in gkk file is different from anaddb input')
    1778                 :             :  end if
    1779                 :             : 
    1780   [ +  +  +  -  :        1335 :  if (any(hdr%nband(:) /= hdr%nband(1))) then
                   -  + ]
    1781                 :             :    write(message,'(3a)')&
    1782                 :           0 : &   'Use the same number of bands for all kpts: ',ch10,&
    1783                 :           0 : &   'could have spurious effects if efermi is too close to the last band '
    1784                 :           0 :    ABI_ERROR(message)
    1785                 :             :  end if
    1786                 :             : 
    1787                 :          15 :  call hdr%echo(fform, 4, unit=std_out)
    1788                 :             : 
    1789                 :          15 :  nband=hdr%nband(1)
    1790                 :             : 
    1791                 :          15 : end subroutine rchkGSheader
    1792                 :             : !!***
    1793                 :             : 
    1794                 :             : !!****f* m_elphon/mkfskgrid
    1795                 :             : !!
    1796                 :             : !! NAME
    1797                 :             : !! mkfskgrid
    1798                 :             : !!
    1799                 :             : !! FUNCTION
    1800                 :             : !! This routine sets up the full FS kpt grid by symmetry
    1801                 :             : !!
    1802                 :             : !! INPUTS
    1803                 :             : !!  nsym    = number of symmetries for the full system
    1804                 :             : !!  symrec  = reciprocal space symmetries (those for the kpts)
    1805                 :             : !!  timrev  = 1 if time reversal symmetry is to be used
    1806                 :             : !!
    1807                 :             : !! OUTPUT
    1808                 :             : !!  elph_k datastructure:
    1809                 :             : !!  elph_k%nkpt           = full number of kpoints close to the FS
    1810                 :             : !!  elph_k%kpt            = full set of kpoints close to the FS
    1811                 :             : !!  elph_k%wtkirr         = weights of the irreducible kpoints
    1812                 :             : !!  elph_k%kphon_irr2full = indices of irred kpoints in full array
    1813                 :             : !!
    1814                 :             : !! NOTES
    1815                 :             : !!  WARNING: supposes kpt grid has full symmetry!! Not always true!!!
    1816                 :             : !!    but should be for Monkhorst-Pack, efficient grids.
    1817                 :             : !!    otherwise you get an error message in interpolate_gkk because
    1818                 :             : !!    an FS kpt can not be found in the gkk file.
    1819                 :             : !!
    1820                 :             : !! SOURCE
    1821                 :             : 
    1822                 :          15 : subroutine mkFSkgrid (elph_k, nsym, symrec, timrev)
    1823                 :             : 
    1824                 :             :  use m_sort
    1825                 :             : 
    1826                 :             : !Arguments ------------------------------------
    1827                 :             : !scalars
    1828                 :             :  integer,intent(in) :: nsym,timrev
    1829                 :             :  type(elph_kgrid_type),intent(inout) :: elph_k
    1830                 :             : !arrays
    1831                 :             :  integer,intent(in) :: symrec(3,3,nsym)
    1832                 :             : 
    1833                 :             : !Local variables-------------------------------
    1834                 :             : !scalars
    1835                 :             :  integer :: ikpt1,ikpt2,isym,itim,new,symrankkpt
    1836                 :             :  real(dp) :: timsign, res
    1837                 :             :  character(len=500) :: message
    1838                 :             : 
    1839                 :             : !arrays
    1840                 :             :  real(dp) :: kpt(3),redkpt(3)
    1841                 :          15 :  integer, allocatable :: sortindexing(:), rankallk(:), tmpkphon_full2irr(:,:)
    1842                 :          15 :  real(dp), allocatable :: tmpkpt(:,:)
    1843                 :             : ! *************************************************************************
    1844                 :             : 
    1845         [ -  + ]:          15 :  if(timrev /= 1 .and. timrev /= 0)then
    1846                 :           0 :    write (message,'(a,i0)')' timrev must be 1 or 0 but found timrev= ',timrev
    1847                 :           0 :    ABI_BUG(message)
    1848                 :             :  end if
    1849                 :             : 
    1850   [ +  -  -  +  :          45 :  ABI_MALLOC(tmpkphon_full2irr,(3,2*elph_k%nkptirr*nsym))
          +  -  +  -  +  
             -  -  +  -  
                      + ]
    1851   [ +  +  +  + ]:      474639 :  tmpkphon_full2irr = -1
    1852                 :             : 
    1853   [ -  +  +  -  :          45 :  ABI_MALLOC(tmpkpt,(3,2*elph_k%nkptirr*nsym))
          +  -  +  -  -  
                +  -  + ]
    1854                 :             : 
    1855   [ -  +  +  -  :          45 :  ABI_MALLOC(elph_k%wtkirr,(elph_k%nkptirr))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
    1856         [ +  + ]:        1327 :  elph_k%wtkirr(:) = zero
    1857                 :             : 
    1858                 :             : !first allocation for irred kpoints - will be destroyed below
    1859                 :          15 :  call elph_k%krank%init(elph_k%nkptirr, elph_k%kptirr)
    1860   [ -  +  +  -  :          45 :  ABI_MALLOC(rankallk,(elph_k%krank%max_rank))
          +  -  +  -  -  
                +  -  + ]
    1861                 :             : 
    1862                 :             : !elph_k%krank%invrank is used as a placeholder in the following loop
    1863         [ +  + ]:        2583 :  rankallk = -1
    1864         [ +  + ]:        1742 :  elph_k%krank%invrank = -1
    1865                 :             : 
    1866                 :             : !replicate all irred kpts by symmetry to get the full k grid.
    1867                 :          15 :  elph_k%nkpt=0 !zero k-points found so far
    1868         [ +  + ]:         651 :  do isym=1,nsym
    1869         [ +  + ]:        1923 :    do itim=0,1
    1870                 :        1272 :      timsign = one-two*itim
    1871         [ +  + ]:      120564 :      do ikpt1=1,elph_k%nkptirr
    1872                 :             : !      generate symmetrics of kpt ikpt1
    1873                 :             :        kpt(:) = timsign*(symrec(:,1,isym)*elph_k%kptirr(1,ikpt1) + &
    1874                 :             : &       symrec(:,2,isym)*elph_k%kptirr(2,ikpt1) + &
    1875         [ +  + ]:      474624 : &       symrec(:,3,isym)*elph_k%kptirr(3,ikpt1))
    1876                 :             : 
    1877                 :      118656 :        symrankkpt = elph_k%krank%get_rank (kpt)
    1878                 :             : 
    1879                 :             : !      is the kpt on the full grid (may have lower symmetry than full spgroup)
    1880                 :             : !      is kpt among the full FS kpts found already?
    1881         [ +  + ]:      119928 :        if (elph_k%krank%invrank(symrankkpt) == -1) then
    1882                 :        1312 :          elph_k%wtkirr(ikpt1)=elph_k%wtkirr(ikpt1)+1
    1883                 :        1312 :          elph_k%nkpt=elph_k%nkpt+1
    1884                 :             : 
    1885                 :        1312 :          call wrap2_pmhalf(kpt(1),redkpt(1),res)
    1886                 :        1312 :          call wrap2_pmhalf(kpt(2),redkpt(2),res)
    1887                 :        1312 :          call wrap2_pmhalf(kpt(3),redkpt(3),res)
    1888         [ +  + ]:        5248 :          tmpkpt(:,elph_k%nkpt) = redkpt
    1889                 :        1312 :          tmpkphon_full2irr(1,elph_k%nkpt) = ikpt1
    1890                 :             : !        save sym that sends irred kpt ikpt1 onto full kpt
    1891                 :        1312 :          tmpkphon_full2irr(2,elph_k%nkpt) = isym
    1892                 :        1312 :          tmpkphon_full2irr(3,elph_k%nkpt) = itim
    1893                 :             : 
    1894                 :        1312 :          elph_k%krank%invrank(symrankkpt) = elph_k%nkpt
    1895                 :        1312 :          rankallk(elph_k%nkpt) = symrankkpt
    1896                 :             :        end if
    1897                 :             : 
    1898                 :             :      end do !end loop over irred k points
    1899                 :             :    end do !end loop over timrev
    1900                 :             :  end do !end loop over symmetry
    1901                 :             : 
    1902                 :          15 :  write(message,'(a,i0)')'mkfskgrid: after first evaluation, elph_k%nkpt= ', elph_k%nkpt
    1903                 :          15 :  call wrtout(std_out,message,"COLL")
    1904                 :             : 
    1905         [ +  + ]:        1327 :  elph_k%wtkirr(:) = elph_k%wtkirr(:) / elph_k%nkpt
    1906                 :             : 
    1907                 :             : !copy the kpoints and full --> irred kpt map
    1908                 :             : !reorder the kpts to get rank increasing monotonically with a sort
    1909                 :             : !also reorder tmpkphon_full2irr
    1910   [ -  +  +  -  :          45 :  ABI_MALLOC(elph_k%kpt,(3,elph_k%nkpt))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
    1911   [ -  +  +  -  :          45 :  ABI_MALLOC(elph_k%full2irr,(3,elph_k%nkpt))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
    1912   [ -  +  +  -  :          45 :  ABI_MALLOC(sortindexing,(elph_k%nkpt))
          +  -  +  -  -  
                +  -  + ]
    1913                 :             : 
    1914         [ +  + ]:        1327 :  do ikpt1=1,elph_k%nkpt
    1915                 :        1327 :    sortindexing(ikpt1)=ikpt1
    1916                 :             :  end do
    1917                 :          15 :  call sort_int(elph_k%nkpt, rankallk, sortindexing)
    1918         [ +  + ]:        1327 :  do ikpt1=1,elph_k%nkpt
    1919   [ +  -  -  + ]:        1312 :    if (sortindexing(ikpt1) < 1 .or. sortindexing(ikpt1) > elph_k%nkpt) then
    1920                 :           0 :      ABI_BUG('sorted k ranks are out of bounds: 1 to nkpt')
    1921                 :             :    end if
    1922         [ +  + ]:        5248 :    elph_k%kpt(:,ikpt1) = tmpkpt(:,sortindexing(ikpt1))
    1923         [ +  + ]:        5263 :    elph_k%full2irr(:,ikpt1) = tmpkphon_full2irr(:,sortindexing(ikpt1))
    1924                 :             :  end do
    1925                 :             : 
    1926         [ -  + ]:          15 :  ABI_FREE(sortindexing)
    1927         [ -  + ]:          15 :  ABI_FREE(rankallk)
    1928         [ -  + ]:          15 :  ABI_FREE(tmpkphon_full2irr)
    1929         [ -  + ]:          15 :  ABI_FREE(tmpkpt)
    1930                 :          15 :  call elph_k%krank%free()
    1931                 :             : 
    1932                 :             : !make proper full rank arrays
    1933                 :          15 :  call elph_k%krank%init(elph_k%nkpt, elph_k%kpt)
    1934                 :             : 
    1935                 :             : !find correspondence table between irred FS kpoints and a full one
    1936   [ -  +  +  -  :          45 :  ABI_MALLOC(elph_k%irr2full,(elph_k%nkptirr))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
    1937         [ +  + ]:        1327 :  elph_k%irr2full(:) = 0
    1938                 :             : 
    1939         [ +  + ]:        1327 :  do ikpt1=1,elph_k%nkptirr
    1940                 :        1312 :    symrankkpt = elph_k%krank%get_rank (elph_k%kptirr(:,ikpt1))
    1941                 :        1327 :    elph_k%irr2full(ikpt1) = elph_k%krank%invrank(symrankkpt)
    1942                 :             :  end do
    1943                 :             : 
    1944                 :             : !find correspondence table between FS kpoints under symmetry
    1945   [ -  +  +  -  :          60 :  ABI_MALLOC(elph_k%full2full,(2,nsym,elph_k%nkpt))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
    1946   [ +  +  +  +  :      179311 :  elph_k%full2full(:,:,:) = -999
                   +  + ]
    1947                 :             : 
    1948         [ +  + ]:        1327 :  do ikpt1=1,elph_k%nkpt
    1949                 :             : !  generate symmetrics of kpt ikpt1
    1950         [ +  + ]:       60655 :    do isym=1,nsym
    1951         [ +  + ]:      179296 :      do itim=0,timrev
    1952                 :      118656 :        timsign = one-two*itim
    1953                 :             :        kpt(:) = timsign*(symrec(:,1,isym)*elph_k%kpt(1,ikpt1) + &
    1954                 :             : &       symrec(:,2,isym)*elph_k%kpt(2,ikpt1) + &
    1955         [ +  + ]:      474624 : &       symrec(:,3,isym)*elph_k%kpt(3,ikpt1))
    1956                 :             : 
    1957                 :             : !      which kpt is it among the full FS kpts
    1958                 :      118656 :        symrankkpt = elph_k%krank%get_rank (kpt)
    1959                 :      118656 :        ikpt2 = elph_k%krank%invrank(symrankkpt)
    1960                 :      118656 :        new=1
    1961         [ -  + ]:      118656 :        if (ikpt2 /= -1) then
    1962                 :      118656 :          elph_k%full2full(itim+1,isym,ikpt2) = ikpt1
    1963                 :             :          new = 0
    1964                 :             :        end if
    1965                 :             : 
    1966                 :       59328 :        if (new == 1) then
    1967                 :           0 :          write(std_out,*) ' mkfskgrid Error: FS kpt ',ikpt1,' has no symmetric under sym', isym,' with itim ',itim
    1968                 :           0 :          write(std_out,*) ' redkpt = ', redkpt
    1969                 :           0 :          write(std_out,*) ' symrankkpt,ikpt2 = ', symrankkpt,ikpt2
    1970                 :           0 :          ABI_ERROR("Fatal error, cannot continue")
    1971                 :             :        end if
    1972                 :             :      end do
    1973                 :             :    end do
    1974                 :             :  end do
    1975                 :             : 
    1976                 :             : !got nkpt, tmpkpt, kphon_full2irr, kphon_full2full, and wtkirr
    1977                 :             : 
    1978                 :          15 : end subroutine mkFSkgrid
    1979                 :             : !!***
    1980                 :             : 
    1981                 :             : !!****f* m_elphon/mka2f
    1982                 :             : !!
    1983                 :             : !! NAME
    1984                 :             : !! mka2f
    1985                 :             : !!
    1986                 :             : !! FUNCTION
    1987                 :             : !!  calculate the FS averaged alpha^2F function
    1988                 :             : !!
    1989                 :             : !! INPUTS
    1990                 :             : !! Cryst<crystal_t>=data type gathering info on the crystalline structure.
    1991                 :             : !! Ifc<ifc_type>=Object containing the interatomic force constants.
    1992                 :             : !!  elph_ds
    1993                 :             : !!    elph_ds%gkk2 = gkk2 matrix elements on full FS grid for each phonon mode
    1994                 :             : !!    elph_ds%nbranch = number of phonon branches = 3*natom
    1995                 :             : !!    elph_ds%nFSband = number of bands included in the FS integration
    1996                 :             : !!    elph_ds%k_phon%nkpt = number of kpts included in the FS integration
    1997                 :             : !!    elph_ds%k_phon%kpt = coordinates of all FS kpoints
    1998                 :             : !!    elph_ds%k_phon%wtk = integration weights on the FS
    1999                 :             : !!    elph_ds%n0 = DOS at the Fermi level calculated from the k_phon integration weights (event. 2 spin pol)
    2000                 :             : !!  mustar = coulomb pseudopotential parameter
    2001                 :             : !!  natom = number of atoms
    2002                 :             : !!
    2003                 :             : !! OUTPUT
    2004                 :             : !!  a2f_1d = 1D alpha
    2005                 :             : !!  dos_phon = density of states for phonons
    2006                 :             : !!  elph_ds
    2007                 :             : !!
    2008                 :             : !! NOTES
    2009                 :             : !!   copied from ftiaf9.f
    2010                 :             : !!
    2011                 :             : !! SOURCE
    2012                 :             : 
    2013                 :          30 : subroutine mka2f(Cryst,ifc,a2f_1d,dos_phon,elph_ds,kptrlatt,mustar)
    2014                 :             : 
    2015                 :             :  use m_special_funcs,  only : fermi_dirac, bose_einstein
    2016                 :             :  use m_epweights,      only : d2c_wtq, ep_ph_weights
    2017                 :             : 
    2018                 :             : !Arguments ------------------------------------
    2019                 :             : !scalars
    2020                 :             :  real(dp),intent(in) :: mustar
    2021                 :             :  type(ifc_type),intent(in) :: ifc
    2022                 :             :  type(crystal_t),intent(in) :: Cryst
    2023                 :             :  type(elph_type),target,intent(inout) :: elph_ds
    2024                 :             : !arrays
    2025                 :             :  integer, intent(in) :: kptrlatt(3,3)
    2026                 :             :  real(dp),intent(out) :: a2f_1d(elph_ds%na2f),dos_phon(elph_ds%na2f)
    2027                 :             : 
    2028                 :             : !Local variables -------------------------
    2029                 :             : !scalars
    2030                 :             :  integer :: natom,iFSqpt,ibranch,iomega,nbranch,na2f,nsppol,nkpt,nrpt
    2031                 :             :  integer :: isppol,jbranch,unit_a2f,unit_phdos,ep_scalprod
    2032                 :             :  integer :: itemp, ntemp = 100
    2033                 :             :  real(dp) :: temp
    2034                 :             :  real(dp) :: a2fprefactor,avgelphg,avglambda,avgomlog,diagerr
    2035                 :             :  real(dp) :: lambda_2,lambda_3,lambda_4,lambda_5
    2036                 :             :  real(dp) :: spinfact
    2037                 :          30 :  real(dp) :: lambda_iso(elph_ds%nsppol)
    2038                 :             :  real(dp) :: lqn,omega
    2039                 :          30 :  real(dp) :: omegalog(elph_ds%nsppol)
    2040                 :             :  real(dp) :: omlog_qn
    2041                 :             :  real(dp) :: tc_macmill,a2fsmear,domega,omega_min,omega_max
    2042                 :             :  real(dp) :: gaussval, gaussprefactor, gaussfactor, gaussmaxval, xx
    2043                 :             :  character(len=500) :: msg
    2044                 :             :  character(len=fnlen) :: fname,base_name
    2045                 :             : !arrays
    2046                 :          30 :  real(dp) :: displ_cart(2,elph_ds%nbranch,elph_ds%nbranch)
    2047                 :          30 :  real(dp) :: displ_red(2,elph_ds%nbranch,elph_ds%nbranch)
    2048                 :          30 :  real(dp) :: eigval(elph_ds%nbranch)
    2049                 :          30 :  real(dp) :: gam_now(2,elph_ds%nbranch*elph_ds%nbranch)
    2050                 :          30 :  real(dp) :: imeigval(elph_ds%nbranch)
    2051                 :             : ! real(dp) :: pheigvec(2*elph_ds%nbranch*elph_ds%nbranch),phfrq(elph_ds%nbranch)
    2052                 :          30 :  real(dp) :: tmp_a2f(elph_ds%na2f)
    2053                 :          30 :  real(dp) :: tmp_gam1(2,elph_ds%nbranch,elph_ds%nbranch)
    2054                 :          30 :  real(dp) :: tmp_gam2(2,elph_ds%nbranch,elph_ds%nbranch)
    2055                 :          30 :  real(dp) :: tmp_phondos(elph_ds%na2f),n0(elph_ds%nsppol)
    2056                 :             :  real(dp),pointer :: kpt(:,:)
    2057                 :          15 :  real(dp),allocatable :: phfrq(:,:)
    2058                 :          15 :  real(dp),allocatable :: pheigvec(:,:)
    2059                 :          15 :  real(dp),allocatable :: tmp_wtq(:,:,:)
    2060                 :          15 :  real(dp),allocatable :: a2f1mom(:),a2f2mom(:),a2f3mom(:),a2f4mom(:)
    2061                 :          15 :  real(dp),allocatable :: a2f_1mom(:),a2flogmom(:)
    2062                 :          15 :  real(dp),allocatable :: a2flogmom_int(:)
    2063                 :          15 :  real(dp),allocatable :: coskr(:,:)
    2064                 :          15 :  real(dp),allocatable :: sinkr(:,:)
    2065                 :          15 :  real(dp),allocatable :: linewidth_of_t(:)
    2066                 :          15 :  real(dp),allocatable :: linewidth_integrand(:,:)
    2067                 :             : 
    2068                 :             : ! *********************************************************************
    2069                 :             : !calculate a2f for frequencies between 0 and elph_ds%omega_max
    2070                 :             : 
    2071                 :             :  DBG_ENTER("COLL")
    2072                 :             : 
    2073                 :             : !might need kptrlatt for finer interpolation later
    2074                 :             :  ABI_UNUSED(kptrlatt(1,1))
    2075                 :             : 
    2076                 :             :  ! nrpt = number of real-space points for FT interpolation
    2077                 :          15 :  nrpt = Ifc%nrpt
    2078                 :          15 :  natom = Cryst%natom
    2079                 :             : 
    2080                 :          15 :  nbranch   =  elph_ds%nbranch
    2081                 :          15 :  na2f      =  elph_ds%na2f
    2082                 :          15 :  nsppol    =  elph_ds%nsppol
    2083                 :          15 :  base_name =  elph_ds%elph_base_name
    2084                 :          15 :  a2fsmear  =  elph_ds%a2fsmear
    2085                 :          15 :  nkpt      =  elph_ds%k_phon%nkpt
    2086                 :          15 :  kpt       => elph_ds%k_phon%kpt
    2087                 :             : 
    2088                 :          15 :  ep_scalprod = elph_ds%ep_scalprod
    2089         [ +  + ]:          31 :  n0        = elph_ds%n0
    2090                 :             : 
    2091                 :             : !spinfact should be 1 for a normal non sppol calculation without spinorbit
    2092                 :             : !for spinors it should also be 1 as bands are twice as numerous but n0 has been divided by 2
    2093                 :             : !for sppol 2 it should be 0.5 as we have 2 spin channels to sum
    2094                 :          15 :  spinfact = one/elph_ds%nsppol !/elph_ds%nspinor
    2095                 :             : 
    2096                 :             : !maximum value of frequency (a grid has to be chosen for the representation of alpha^2 F)
    2097                 :             : !WARNING! supposes this value has been set in mkelph_linwid.
    2098                 :          15 :  domega = (elph_ds%omega_max-elph_ds%omega_min)/(na2f-one)
    2099                 :          15 :  elph_ds%domega  = domega  ! MG Why do we need to store domega in elph_ds?
    2100                 :          15 :  omega_min       = elph_ds%omega_min
    2101                 :          15 :  omega_max       = elph_ds%omega_max
    2102                 :             : 
    2103                 :          15 :  gaussprefactor = sqrt(piinv) / a2fsmear
    2104                 :          15 :  gaussfactor = one / a2fsmear
    2105                 :          15 :  gaussmaxval = sqrt(-log(1.d-100))
    2106                 :             : 
    2107                 :             :  ! only open the file for the first sppol
    2108         [ +  - ]:          15 :  fname = trim(base_name) // '_A2F'
    2109         [ -  + ]:          15 :  if (open_file(fname,msg,newunit=unit_a2f,status="unknown") /= 0) then
    2110                 :           0 :    ABI_ERROR(msg)
    2111                 :             :  end if
    2112                 :             : 
    2113                 :             :  !write (std_out,*) ' a2f function integrated over the FS'
    2114                 :             : 
    2115                 :             : !output the a2f_1d header
    2116                 :          15 :  write (unit_a2f,'(a)')                 '#'
    2117                 :          15 :  write (unit_a2f,'(a)')                 '# ABINIT package : a2f file'
    2118                 :          15 :  write (unit_a2f,'(a)')                 '#'
    2119                 :          15 :  write (unit_a2f,'(a)')                 '# a2f function integrated over the FS. omega in a.u.'
    2120                 :          15 :  write (unit_a2f,'(a,I10)')             '#  number of kpoints integrated over : ',nkpt
    2121                 :          15 :  write (unit_a2f,'(a,I10)')             '#  number of energy points : ',na2f
    2122                 :          15 :  write (unit_a2f,'(a,E16.6,a,E16.6,a)') '#  between omega_min = ',omega_min,' Ha and omega_max = ',omega_max,' Ha'
    2123                 :          15 :  write (unit_a2f,'(a,E16.6)')           '#  and the smearing width for gaussians is ',a2fsmear
    2124                 :             : 
    2125                 :             :  ! Open file for PH DOS
    2126         [ +  - ]:          15 :  fname = trim(base_name) // '_PDS'
    2127         [ -  + ]:          15 :  if (open_file(fname,msg,newunit=unit_phdos,status="replace") /= 0) then
    2128                 :           0 :    ABI_ERROR(msg)
    2129                 :             :  end if
    2130                 :             : 
    2131                 :             :  ! output the phonon DOS header
    2132                 :          15 :  write (unit_phdos,'(a)')                '#'
    2133                 :          15 :  write (unit_phdos,'(a)')                '# ABINIT package : phonon DOS file'
    2134                 :          15 :  write (unit_phdos,'(a)')                '#'
    2135                 :          15 :  write (unit_phdos,'(a)')                '# Phonon DOS integrated over the FS. omega in a.u. EXPERIMENTAL!!!'
    2136                 :          15 :  write (unit_phdos,'(a,I10)')            '# number of kpoints integrated over : ',nkpt
    2137                 :          15 :  write (unit_phdos,'(a,I10)')            '# number of energy points : ',na2f
    2138                 :          15 :  write (unit_phdos,'(a,E16.6,a,E16.6,a)')'# between omega_min = ',omega_min,' Ha and omega_max = ',omega_max,' Ha'
    2139                 :          15 :  write (unit_phdos,'(a,i4,a,E16.6)')     '# The DOS at Fermi level for spin ', 1, ' is ', n0(1)
    2140         [ +  + ]:          15 :  if (nsppol==2) then
    2141                 :           1 :    write (unit_phdos,'(a,i4,a,E16.6)')   '# The DOS at Fermi level for spin ', 2, ' is ', n0(2)
    2142                 :             :  end if
    2143                 :          15 :  write (unit_phdos,'(a,E16.6)')          '# and the smearing width for gaussians is ',a2fsmear
    2144                 :          15 :  write (unit_phdos,'(a)') '#'
    2145                 :             : 
    2146                 :             : !Get the integration weights, using tetrahedron method or gaussian
    2147   [ -  +  +  -  :          75 :  ABI_MALLOC(tmp_wtq,(nbranch,elph_ds%k_fine%nkpt,na2f+1))
          -  +  +  -  +  
          -  -  +  +  -  
          +  -  +  -  -  
                +  -  + ]
    2148   [ -  +  +  -  :          75 :  ABI_MALLOC(elph_ds%k_fine%wtq,(nbranch,elph_ds%k_fine%nkpt,na2f))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                +  -  + ]
    2149   [ -  +  +  -  :          75 :  ABI_MALLOC(elph_ds%k_phon%wtq,(nbranch,nkpt,na2f))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                +  -  + ]
    2150                 :             : 
    2151   [ -  +  +  -  :          60 :  ABI_MALLOC(phfrq,(nbranch,elph_ds%k_fine%nkpt))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
    2152   [ +  -  -  +  :          75 :  ABI_MALLOC(pheigvec,(2*nbranch*nbranch,elph_ds%k_fine%nkpt))
          +  -  -  +  +  
          -  +  -  +  -  
             -  +  -  + ]
    2153                 :             : 
    2154         [ +  + ]:        1327 :  do iFSqpt=1,elph_ds%k_fine%nkpt
    2155                 :        1327 :    call ifc%fourq(cryst,elph_ds%k_fine%kpt(:,iFSqpt),phfrq(:,iFSqpt),displ_cart,out_eigvec=pheigvec(:,iFSqpt))
    2156                 :             :  end do
    2157                 :             : 
    2158                 :          15 :  omega_min = omega_min - domega
    2159                 :             : 
    2160                 :             :  call ep_ph_weights(phfrq,elph_ds%a2fsmear,omega_min,omega_max,na2f+1,Cryst%gprimd,elph_ds%kptrlatt_fine, &
    2161                 :          15 : & elph_ds%nbranch,elph_ds%telphint,elph_ds%k_fine,tmp_wtq)
    2162                 :             : !call ep_ph_weights(phfrq,elph_ds%a2fsmear,omega_min,omega_max,na2f+1,Cryst%gprimd,elph_ds%kptrlatt_fine, &
    2163                 :             : !& elph_ds%nbranch,1,elph_ds%k_fine,tmp_wtq)
    2164                 :          15 :  omega_min = omega_min + domega
    2165                 :             : 
    2166         [ +  + ]:        6015 :  do iomega = 1, na2f
    2167   [ +  +  +  + ]:     2278015 :    elph_ds%k_fine%wtq(:,:,iomega) = tmp_wtq(:,:,iomega+1)
    2168                 :             :  end do
    2169         [ -  + ]:          15 :  ABI_FREE(tmp_wtq)
    2170                 :             : 
    2171         [ -  + ]:          15 :  if (elph_ds%use_k_fine == 1) then
    2172                 :           0 :    call d2c_wtq(elph_ds)
    2173                 :             :  end if
    2174                 :             : 
    2175   [ -  +  +  -  :          60 :  ABI_MALLOC(coskr, (nkpt,nrpt))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
    2176   [ -  +  +  -  :          45 :  ABI_MALLOC(sinkr, (nkpt,nrpt))
          -  +  +  -  -  
                +  -  + ]
    2177         [ -  + ]:          15 :  call ftgam_init(Ifc%gprim, nkpt, nrpt, kpt, Ifc%rpt, coskr, sinkr)
    2178                 :             : 
    2179         [ -  + ]:          15 :  ABI_FREE(phfrq)
    2180         [ -  + ]:          15 :  ABI_FREE(pheigvec)
    2181                 :             : 
    2182         [ +  + ]:          31 :  do isppol=1,nsppol
    2183                 :          16 :    write (std_out,*) '##############################################'
    2184                 :          16 :    write (std_out,*) 'mka2f : Treating spin polarization ', isppol
    2185                 :          16 :    write (std_out,*) '##############################################'
    2186                 :             : 
    2187                 :             : !  Average of electron phonon coupling over the whole BZ
    2188                 :          16 :    avgelphg = zero
    2189                 :             : !  MG20060607 Do the same for lambda and omega_log
    2190                 :          16 :    avglambda = zero
    2191                 :          16 :    avgomlog = zero
    2192                 :             : 
    2193         [ +  + ]:        6416 :    a2f_1d(:) = zero
    2194         [ +  + ]:        6416 :    dos_phon(:) = zero
    2195                 :             : 
    2196                 :             : !  reduce the dimenstion from fine to phon for phfrq and pheigvec
    2197   [ -  +  +  -  :          64 :    ABI_MALLOC(phfrq,(nbranch,elph_ds%k_phon%nkpt))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
    2198   [ +  -  -  +  :          64 :    ABI_MALLOC(pheigvec,(2*nbranch*nbranch,elph_ds%k_phon%nkpt))
          +  -  -  +  +  
          -  +  -  +  -  
             -  +  -  + ]
    2199                 :             : 
    2200                 :             : !  loop over qpoint in full kpt grid (presumably dense)
    2201                 :             : !  MG TODO : This loop can be performed using the IBZ and appropriated weights.
    2202         [ +  + ]:        1336 :    do iFSqpt=1,nkpt
    2203                 :             : !
    2204                 :             : !    This reduced version of ftgkk supposes the kpoints have been integrated
    2205                 :             : !    in integrate_gamma. Do FT from real-space gamma grid to 1 qpt.
    2206                 :             : 
    2207         [ -  + ]:        1320 :      if (elph_ds%ep_int_gkk == 1) then
    2208   [ #  #  #  # ]:           0 :        gam_now(:,:) = elph_ds%gamma_qpt(:,:,isppol,iFSqpt)
    2209                 :             :      else
    2210                 :             :        call ftgam(Ifc%wghatm,gam_now,elph_ds%gamma_rpt(:,:,isppol,:),natom,1,nrpt,0, &
    2211   [ +  +  +  -  :       70232 : &       coskr(iFSqpt,:), sinkr(iFSqpt,:))
          +  +  +  +  +  
          +  +  -  +  -  
          +  +  +  -  +  
          -  +  +  +  +  
          +  +  +  +  +  
             +  +  -  +  
                      - ]
    2212                 :             :      end if
    2213                 :             : 
    2214         [ -  + ]:        1320 :      call ifc%fourq(cryst,kpt(:,iFSqpt),phfrq(:,iFSqpt),displ_cart,out_eigvec=pheigvec)
    2215                 :             : 
    2216                 :             : !    Diagonalize gamma matrix at qpoint (complex matrix).
    2217                 :             : 
    2218                 :             : !    if ep_scalprod==0 we have to dot in the displacement vectors here
    2219         [ +  + ]:        1320 :      if (ep_scalprod==0) then
    2220                 :             : 
    2221                 :        1112 :        call phdispl_cart2red(natom,Cryst%gprimd,displ_cart,displ_red)
    2222                 :             : 
    2223         [ +  + ]:        4448 :        tmp_gam2 = reshape (gam_now, (/2,nbranch,nbranch/))
    2224                 :        1112 :        call gam_mult_displ(nbranch, displ_red, tmp_gam2, tmp_gam1)
    2225                 :             : 
    2226         [ +  + ]:        4448 :        do jbranch=1,nbranch
    2227                 :        3336 :          eigval(jbranch) = tmp_gam1(1, jbranch, jbranch)
    2228                 :        3336 :          imeigval(jbranch) = tmp_gam1(2, jbranch, jbranch)
    2229                 :             : 
    2230         [ -  + ]:        4448 :          if (abs(imeigval(jbranch)) > tol8) then
    2231                 :           0 :            write (msg,'(a,i0,a,es16.8)')" imaginary values  branch = ",jbranch,' imeigval = ',imeigval(jbranch)
    2232                 :           0 :            ABI_WARNING(msg)
    2233                 :             :          end if
    2234                 :             : 
    2235                 :             :        end do
    2236                 :             : 
    2237                 :             : !      if ep_scalprod==1 we have to diagonalize the matrix we interpolated.
    2238         [ +  - ]:         208 :      else if (ep_scalprod == 1) then
    2239                 :             : 
    2240                 :             : !      MJV NOTE : gam_now is being recast as a (3*natom)**2 matrix here
    2241                 :             :        call ZGEMM ( 'N', 'N', 3*natom, 3*natom, 3*natom, cone, gam_now, 3*natom,&
    2242                 :         208 : &       pheigvec, 3*natom, czero, tmp_gam1, 3*natom)
    2243                 :             : 
    2244                 :             :        call ZGEMM ( 'C', 'N', 3*natom, 3*natom, 3*natom, cone, pheigvec, 3*natom,&
    2245                 :         208 : &       tmp_gam1, 3*natom, czero, tmp_gam2, 3*natom)
    2246                 :             : 
    2247                 :         208 :        diagerr = zero
    2248         [ +  + ]:        1264 :        do ibranch=1,nbranch
    2249                 :        1056 :          eigval(ibranch) = tmp_gam2(1,ibranch,ibranch)
    2250         [ +  + ]:        3408 :          do jbranch=1,ibranch-1
    2251                 :        3408 :            diagerr = diagerr + abs(tmp_gam2(1,jbranch,ibranch))
    2252                 :             :          end do
    2253         [ +  + ]:        3616 :          do jbranch=ibranch+1,nbranch
    2254                 :        3408 :            diagerr = diagerr + abs(tmp_gam2(1,jbranch,ibranch))
    2255                 :             :          end do
    2256                 :             :        end do
    2257                 :             : 
    2258         [ +  + ]:         208 :        if (diagerr > tol12) then
    2259                 :         168 :          write(msg,'(a,es15.8)') 'mka2f: residual in diagonalization of gamma with phon eigenvectors: ', diagerr
    2260                 :         168 :          ABI_WARNING(msg)
    2261                 :             :        end if
    2262                 :             : 
    2263                 :             :      else
    2264                 :           0 :        write (msg,'(a,i0)')' Wrong value for ep_scalprod = ',ep_scalprod
    2265                 :           0 :        ABI_BUG(msg)
    2266                 :             :      end if
    2267                 :             : 
    2268                 :             : !    MG20060603MG
    2269                 :             : !    there was a bug in the calculation of the phonon DOS
    2270                 :             : !    since frequencies with small e-ph interaction were skipped inside the loop
    2271                 :             : !    In this new version all the frequencies (both positive and negative) are taken into account.
    2272                 :             : !    IDEA: it could be useful to calculate the PH-dos and the a2f
    2273                 :             : !    using several smearing values to perform a convergence study
    2274                 :             : !    Now the case ep_scalprod=1 is treated in the right way although it is not default anymore
    2275                 :             : !    FIXME to be checked
    2276                 :             : !    ENDMG
    2277                 :             : 
    2278                 :             : !    Add all contributions from the phonon modes at this qpoint to a2f and the phonon dos.
    2279         [ +  + ]:        5728 :      do ibranch=1,nbranch
    2280                 :             : 
    2281                 :             : !      if (abs(phfrq(ibranch,iFSqpt)) < tol10) then
    2282         [ +  + ]:        4392 :        if (abs(phfrq(ibranch,iFSqpt)) < tol7) then
    2283                 :             :          a2fprefactor= zero
    2284                 :             :          lqn         = zero
    2285                 :             :          omlog_qn    = zero
    2286                 :             :        else
    2287                 :        4344 :          a2fprefactor = eigval(ibranch)/(two_pi*abs(phfrq(ibranch,iFSqpt))*n0(isppol))
    2288                 :        4344 :          lqn          = eigval(ibranch)/(pi*phfrq(ibranch,iFSqpt)**2*n0(isppol))
    2289                 :        4344 :          omlog_qn     = lqn*log(abs(phfrq(ibranch,iFSqpt)))
    2290                 :             :        end if
    2291                 :             : 
    2292                 :             : !      Add contribution to average elphon coupling
    2293                 :             : !      MANY ISSUES WITH FINITE T SUMS. THIS IS DEFINITELY
    2294                 :             : !      NOT A CORRECT FORMULATION YET.
    2295                 :             : 
    2296                 :             : !      Added avglambda and avgomglog to calculate lamda and omega_log using the sum over the kpt-grid.
    2297                 :             : !      If the k-grid is dense enough, these values should be better than the corresponding quantities
    2298                 :             : !      evaluated through the integration over omega that depends on the a2fsmear
    2299                 :             : 
    2300                 :        4392 :        avgelphg = avgelphg + eigval(ibranch)
    2301                 :        4392 :        avglambda = avglambda + lqn
    2302                 :        4392 :        avgomlog= avgomlog + omlog_qn
    2303                 :             : !      ENDMG
    2304                 :             : 
    2305                 :        4392 :        omega = omega_min
    2306         [ +  + ]:     1761192 :        tmp_a2f(:) = zero
    2307         [ +  + ]:     1761192 :        tmp_phondos(:) = zero
    2308         [ +  + ]:     1761192 :        do iomega=1,na2f
    2309                 :     1756800 :          xx = (omega-phfrq(ibranch,iFSqpt))*gaussfactor
    2310                 :     1756800 :          omega = omega + domega
    2311         [ +  + ]:     1756800 :          if (abs(xx) > gaussmaxval) cycle
    2312                 :             : 
    2313                 :      475202 :          gaussval = gaussprefactor*exp(-xx*xx)
    2314                 :      475202 :          tmp_a2f(iomega) = tmp_a2f(iomega) + gaussval*a2fprefactor
    2315                 :     1761192 :          tmp_phondos(iomega) = tmp_phondos(iomega) + gaussval
    2316                 :             :        end do
    2317                 :             : 
    2318                 :             : !      tmp_a2f(:) = zero
    2319                 :             : !      tmp_phondos(:) = zero
    2320                 :             : !      do iomega=1,na2f
    2321                 :             : !      tmp_a2f(iomega) = tmp_a2f(iomega) + a2fprefactor*elph_ds%k_phon%wtq(ibranch,iFSqpt,iomega)
    2322                 :             : !      tmp_phondos(iomega) = tmp_phondos(iomega) + elph_ds%k_phon%wtq(ibranch,iFSqpt,iomega)
    2323                 :             : !      end do
    2324                 :             : 
    2325         [ +  + ]:     1761192 :        a2f_1d(:) = a2f_1d(:) + tmp_a2f(:)
    2326         [ +  + ]:     1762512 :        dos_phon(:) = dos_phon(:) + tmp_phondos(:)
    2327                 :             : 
    2328                 :             :      end do ! ibranch
    2329                 :             :    end do  ! iFSqpt do
    2330                 :             : 
    2331                 :             : 
    2332                 :             : !  second 1 / nkpt factor for the integration weights
    2333         [ +  + ]:        6416 :    a2f_1d(:) = a2f_1d(:) / nkpt
    2334         [ +  + ]:        6416 :    dos_phon(:) = dos_phon(:) / nkpt
    2335                 :             : 
    2336                 :             : !  MG
    2337                 :          16 :    avglambda = avglambda/nkpt
    2338                 :          16 :    avgomlog= avgomlog/nkpt
    2339                 :          16 :    avgomlog = exp (avgomlog/avglambda)
    2340                 :          16 :    write(std_out,*) ' from mka2f: for spin ', isppol
    2341                 :          16 :    write(std_out,*) ' w/o interpolation lambda = ',avglambda,' omega_log= ',avgomlog
    2342                 :             : !  ENDMG
    2343                 :             : 
    2344                 :          16 :    write (std_out,'(a,I4,a,E16.6)') '# The DOS at Fermi level for spin ',isppol,' is ',n0(isppol)
    2345                 :             : 
    2346                 :          16 :    write (unit_a2f,'(a,I4,a,E16.6)') '# The DOS at Fermi level for spin ',isppol,' is ',n0(isppol)
    2347                 :          16 :    write (unit_a2f,'(a)') '#'
    2348                 :             : 
    2349                 :          16 :    omega = omega_min
    2350         [ +  + ]:        6416 :    do iomega=1,na2f
    2351                 :        6400 :      write (unit_a2f,*) omega, a2f_1d(iomega)
    2352                 :        6416 :      omega=omega + domega
    2353                 :             :    end do
    2354                 :          16 :    write (unit_a2f,*)
    2355                 :             : !
    2356                 :             : !  output the phonon DOS, but only for the first sppol case
    2357         [ +  + ]:          16 :    if (isppol == 1) then
    2358                 :          15 :      omega = omega_min
    2359         [ +  + ]:        6015 :      do iomega=1,na2f
    2360                 :        6000 :        write (unit_phdos,*) omega, dos_phon(iomega)
    2361                 :        6015 :        omega=omega + domega
    2362                 :             :      end do
    2363                 :             :    end if
    2364                 :             : !
    2365                 :             : !  Do isotropic calculation of lambda and output lambda, Tc(MacMillan)
    2366                 :             : !
    2367   [ -  +  +  -  :          48 :    ABI_MALLOC(a2f_1mom,(na2f))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
    2368   [ -  +  +  -  :          32 :    ABI_MALLOC(a2f1mom,(na2f))
          -  +  -  +  -  
                      + ]
    2369   [ -  +  +  -  :          32 :    ABI_MALLOC(a2f2mom,(na2f))
          -  +  -  +  -  
                      + ]
    2370   [ -  +  +  -  :          32 :    ABI_MALLOC(a2f3mom,(na2f))
          -  +  -  +  -  
                      + ]
    2371   [ -  +  +  -  :          32 :    ABI_MALLOC(a2f4mom,(na2f))
          -  +  -  +  -  
                      + ]
    2372   [ -  +  +  -  :          64 :    ABI_MALLOC(linewidth_integrand,(na2f,ntemp))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
    2373   [ -  +  +  -  :          48 :    ABI_MALLOC(linewidth_of_t,(ntemp))
          +  -  +  -  -  
                +  -  + ]
    2374                 :             : 
    2375         [ +  + ]:        6416 :    a2f_1mom=zero
    2376   [ +  +  +  + ]:       12816 :    a2f1mom=zero;  a2f2mom=zero
    2377   [ +  +  +  + ]:       12816 :    a2f3mom=zero;  a2f4mom=zero
    2378   [ +  +  +  + ]:      641616 :    linewidth_integrand = zero
    2379                 :             : 
    2380                 :          16 :    omega = omega_min
    2381         [ +  + ]:        6416 :    do iomega=1,na2f
    2382         [ +  + ]:        6400 :      if (abs(omega) > tol10) then
    2383                 :        6393 :        a2f_1mom(iomega) =    two*spinfact*a2f_1d(iomega)/abs(omega)   ! first inverse moment of alpha2F
    2384                 :        6393 :        a2f1mom(iomega)  =    two*spinfact*a2f_1d(iomega)*abs(omega)   ! first positive moment of alpha2F
    2385                 :        6393 :        a2f2mom(iomega)  =     a2f1mom(iomega)*abs(omega)  ! second positive moment of alpha2F
    2386                 :        6393 :        a2f3mom(iomega)  =     a2f2mom(iomega)*abs(omega)  ! third positive moment of alpha2F
    2387                 :        6393 :        a2f4mom(iomega)  =     a2f3mom(iomega)*abs(omega)  ! fourth positive moment of alpha2F
    2388                 :             : !
    2389                 :             : !  electron lifetimes eq 4.48 in [[cite:Grimvall1981]] electron phonon coupling in Metals (with T dependency). Also 5.69-5.72, 5.125, section 3.4
    2390                 :             : !  phonon lifetimes eq 19 in Savrasov PhysRevB.54.16487 [[cite:Savrasov1996]] (T=0)
    2391                 :             : !  a first T dependent expression in Allen PRB 6 2577 [[cite:Allen1972]] eq 10. Not sure about the units though
    2392                 :             : !
    2393         [ +  + ]:      645693 :        do itemp = 1, ntemp
    2394                 :      639300 :          temp = (itemp-1)*10._dp*kb_HaK
    2395                 :      645693 :          linewidth_integrand(iomega, itemp) = a2f_1d(iomega) * (fermi_dirac(omega,zero,temp) + bose_einstein(omega,temp))
    2396                 :             :        end do
    2397                 :             :      end if
    2398                 :        6416 :      omega=omega + domega
    2399                 :             :    end do
    2400                 :             : !
    2401                 :             : !  From Allen PRL 59 1460 [[cite:Allen1987]]
    2402                 :             : !  \lambda <\omega^n> = 2 \int_0^{\infty} d\omega [\alpha^2F / \omega] \omega^n
    2403                 :             : !
    2404                 :          16 :    lambda_iso(isppol) = simpson(domega,a2f_1mom)
    2405                 :          16 :    lambda_2 = simpson(domega,a2f1mom)
    2406                 :          16 :    lambda_3 = simpson(domega,a2f2mom)
    2407                 :          16 :    lambda_4 = simpson(domega,a2f3mom)
    2408                 :          16 :    lambda_5 = simpson(domega,a2f4mom)
    2409         [ +  + ]:        1616 :    do itemp = 1, ntemp
    2410                 :        1600 :      linewidth_of_t(itemp) = simpson(domega,linewidth_integrand(:,itemp))
    2411                 :             : ! print out gamma(T) here
    2412                 :        1600 :      temp = (itemp-1)*10._dp*kb_HaK
    2413                 :        1616 :      write (std_out,*) 'mka2f: T, average linewidth', temp, linewidth_of_t(itemp)
    2414                 :             :    end do
    2415                 :             : 
    2416                 :             : 
    2417         [ -  + ]:          16 :    ABI_FREE(phfrq)
    2418         [ -  + ]:          16 :    ABI_FREE(pheigvec)
    2419         [ -  + ]:          16 :    ABI_FREE(a2f_1mom)
    2420         [ -  + ]:          16 :    ABI_FREE(a2f1mom)
    2421         [ -  + ]:          16 :    ABI_FREE(a2f2mom)
    2422         [ -  + ]:          16 :    ABI_FREE(a2f3mom)
    2423         [ -  + ]:          16 :    ABI_FREE(a2f4mom)
    2424         [ -  + ]:          16 :    ABI_FREE(linewidth_integrand)
    2425         [ -  + ]:          16 :    ABI_FREE(linewidth_of_t)
    2426                 :             : 
    2427                 :          16 :    write (std_out,*) 'mka2f: elphon coupling lambdas for spin = ', isppol
    2428                 :          16 :    write (std_out,*) 'mka2f: isotropic lambda', lambda_iso(isppol)
    2429                 :          16 :    write (std_out,*) 'mka2f: positive moments of alpha2F:'
    2430                 :          16 :    write (std_out,*) 'lambda <omega^2> = ', lambda_2
    2431                 :          16 :    write (std_out,*) 'lambda <omega^3> = ', lambda_3
    2432                 :          16 :    write (std_out,*) 'lambda <omega^4> = ', lambda_4
    2433                 :          16 :    write (std_out,*) 'lambda <omega^5> = ', lambda_5
    2434                 :             : !
    2435                 :             : !  Get log moment of alpha^2F
    2436   [ -  +  +  -  :          48 :    ABI_MALLOC(a2flogmom,(na2f))
          +  -  +  -  -  
                +  -  + ]
    2437   [ -  +  +  -  :          32 :    ABI_MALLOC(a2flogmom_int,(na2f))
             -  +  -  + ]
    2438                 :          16 :    omega = omega_min
    2439         [ +  + ]:        6416 :    a2flogmom(:) = zero
    2440         [ +  + ]:        6416 :    do iomega=1,na2f
    2441         [ +  + ]:        6400 :      if (abs(omega) > tol10) then
    2442                 :        6393 :        a2flogmom(iomega) = a2f_1d(iomega)*log(abs(omega))/abs(omega)
    2443                 :             :      end if
    2444                 :        6416 :      omega=omega + domega
    2445                 :             :    end do
    2446                 :          16 :    call simpson_int(na2f,domega,a2flogmom,a2flogmom_int)
    2447                 :             : 
    2448                 :             : !  NOTE: omegalog actually stores the log moment of a2F, which is the quantity to sum over spins, instead of
    2449                 :             : !  exp(moment/lambda) which is an actual frequency
    2450                 :          16 :    omegalog(isppol) = two*spinfact*a2flogmom_int(na2f)
    2451                 :             : 
    2452         [ -  + ]:          16 :    ABI_FREE(a2flogmom)
    2453                 :          16 :    ABI_FREE(a2flogmom_int)
    2454                 :             : 
    2455         [ +  + ]:          16 :    if (nsppol > 1) then
    2456                 :           2 :      write (msg, '(3a)' ) ch10,&
    2457                 :           4 : &     ' Warning : some of the following quantities should be integrated over spin', ch10
    2458                 :           2 :      call wrtout(std_out,msg,'COLL')
    2459                 :           2 :      call wrtout(ab_out,msg,'COLL')
    2460                 :             :    end if
    2461                 :             : 
    2462                 :          16 :    write (msg, '(3a)' ) ch10,&
    2463                 :          32 : &   ' Superconductivity : isotropic evaluation of parameters from electron-phonon coupling.',ch10
    2464                 :          16 :    call wrtout(std_out,msg,'COLL')
    2465                 :          16 :    call wrtout(ab_out,msg,'COLL')
    2466                 :             : 
    2467         [ +  + ]:          16 :    if (elph_ds%nsppol > 1) then
    2468                 :           2 :      write (msg, '(a,i6,a,es16.6)' )' mka2f: isotropic lambda for spin ', isppol, ' = ', lambda_iso(isppol)
    2469                 :           2 :      call wrtout(std_out,msg,'COLL')
    2470                 :           2 :      call wrtout(ab_out,msg,'COLL')
    2471                 :             :    end if
    2472                 :             : 
    2473                 :          16 :    write (msg, '(a,es16.6)' )' mka2f: lambda <omega^2> = ', lambda_2
    2474                 :          16 :    call wrtout(std_out,msg,'COLL')
    2475                 :          16 :    call wrtout(ab_out,msg,'COLL')
    2476                 :             : 
    2477                 :          16 :    write (msg, '(a,es16.6)' )' mka2f: lambda <omega^3> = ', lambda_3
    2478                 :          16 :    call wrtout(std_out,msg,'COLL')
    2479                 :          16 :    call wrtout(ab_out,msg,'COLL')
    2480                 :             : 
    2481                 :          16 :    write (msg, '(a,es16.6)' )' mka2f: lambda <omega^4> = ', lambda_4
    2482                 :          16 :    call wrtout(std_out,msg,'COLL')
    2483                 :          16 :    call wrtout(ab_out,msg,'COLL')
    2484                 :             : 
    2485                 :          16 :    write (msg, '(a,es16.6)' )' mka2f: lambda <omega^5> = ', lambda_5
    2486                 :          16 :    call wrtout(std_out,msg,'COLL')
    2487                 :          16 :    call wrtout(ab_out,msg,'COLL')
    2488                 :             : 
    2489         [ +  + ]:          31 :    if (elph_ds%nsppol > 1) then
    2490                 :           2 :      write (msg, '(a,i6,a,es16.6,a,es16.6,a)' )' mka2f: omegalog for spin ', isppol, ' = ',&
    2491                 :           4 : &     exp(omegalog(isppol)/lambda_iso(isppol)), ' (Ha) ', exp(omegalog(isppol)/lambda_iso(isppol))/kb_HaK, ' (Kelvin) '
    2492                 :           2 :      call wrtout(std_out,msg,'COLL')
    2493                 :           2 :      call wrtout(ab_out,msg,'COLL')
    2494                 :             :    end if
    2495                 :             : 
    2496                 :             :  end do ! isppol
    2497                 :             : 
    2498                 :             : 
    2499                 :             : 
    2500                 :             : !also print out spin-summed quantities
    2501         [ +  + ]:          31 :  lambda_2 = sum(lambda_iso(1:elph_ds%nsppol))
    2502                 :          15 :  write (msg, '(a,es16.6)' )' mka2f: isotropic lambda = ', lambda_2
    2503                 :          15 :  call wrtout(std_out,msg,'COLL')
    2504                 :          15 :  call wrtout(ab_out,msg,'COLL')
    2505                 :             : 
    2506         [ +  + ]:          31 :  omega = exp( sum(omegalog(1:elph_ds%nsppol))/lambda_2 )
    2507                 :          15 :  write (msg, '(a,es16.6,a,es16.6,a)' )' mka2f: omegalog  = ', omega, ' (Ha) ', omega/kb_HaK, ' (Kelvin) '
    2508                 :          15 :  call wrtout(std_out,msg,'COLL')
    2509                 :          15 :  call wrtout(ab_out,msg,'COLL')
    2510                 :             : 
    2511                 :          15 :  write (msg, '(a,es16.6)' )' mka2f: input mustar = ', mustar
    2512                 :          15 :  call wrtout(std_out,msg,'COLL')
    2513                 :          15 :  call wrtout(ab_out,msg,'COLL')
    2514                 :             : 
    2515                 :          15 :  tc_macmill = omega/1.2_dp * exp((-1.04_dp*(one+lambda_2)) / (lambda_2-mustar*(one+0.62_dp*lambda_2)))
    2516                 :          15 :  write ( msg, '(a,es16.6,a,es16.6,a)')'-mka2f: MacMillan Tc = ', tc_macmill, ' (Ha) ', tc_macmill/kb_HaK, ' (Kelvin) '
    2517                 :          15 :  call wrtout(std_out,msg,'COLL')
    2518                 :          15 :  call wrtout(ab_out,msg,'COLL')
    2519                 :             : 
    2520                 :          15 :  close(unit=unit_a2f)
    2521                 :          15 :  close(unit=unit_phdos)
    2522                 :             : 
    2523         [ -  + ]:          15 :  ABI_FREE(elph_ds%k_fine%wtq)
    2524         [ -  + ]:          15 :  ABI_FREE(elph_ds%k_phon%wtq)
    2525                 :             : 
    2526         [ -  + ]:          15 :  ABI_FREE(coskr)
    2527         [ -  + ]:          15 :  ABI_FREE(sinkr)
    2528                 :             : 
    2529                 :             :  DBG_EXIT("COLL")
    2530                 :             : 
    2531   [ -  +  -  +  :          15 : end subroutine mka2f
          -  +  -  +  -  
                      + ]
    2532                 :             : !!***
    2533                 :             : 
    2534                 :             : !!****f* m_elphon/mka2fQgrid
    2535                 :             : !! NAME
    2536                 :             : !! mka2fQgrid
    2537                 :             : !!
    2538                 :             : !! FUNCTION
    2539                 :             : !!  Calculate the Eliashberg function only using the phonon linewidths evaluated
    2540                 :             : !!  in the irreducible q-points of the coarse q-grid.
    2541                 :             : !!  The obtained results are useful to check the validity of the Fourier interpolation
    2542                 :             : !!
    2543                 :             : !! INPUTS
    2544                 :             : !!  elph_ds = electron-phonon dataset
    2545                 :             : !!  nunit = integer number for the output file
    2546                 :             : !!
    2547                 :             : !! OUTPUT
    2548                 :             : !!  Only write
    2549                 :             : !!
    2550                 :             : !! SIDE EFFECTS
    2551                 :             : !!
    2552                 :             : !! SOURCE
    2553                 :             : 
    2554                 :          15 : subroutine mka2fQgrid(elph_ds,fname)
    2555                 :             : 
    2556                 :             : !Arguments ------------------------------------
    2557                 :             : !scalars
    2558                 :             :  character(len=fnlen),intent(in) :: fname
    2559                 :             :  type(elph_type),intent(in) :: elph_ds
    2560                 :             : 
    2561                 :             : !Local variables -------------------------
    2562                 :             : !scalars
    2563                 :             :  integer :: ibranch,iomega,iost,ismear,isppol,nsmear,nunit,qptirred
    2564                 :             :  real(dp) :: a2f_factor,estep,gaussfactor,gaussprefactor,gaussval,lambda_iso
    2565                 :             :  real(dp) :: omega,omegalog,omegastep,smear,tc_macmill,weight,xx
    2566                 :             :  character(len=500) :: msg
    2567                 :             : !arrays
    2568                 :          15 :  real(dp),allocatable :: a2f_1d(:),a2f_1mom(:),a2f_1mom_int(:),a2flogmom(:)
    2569                 :          15 :  real(dp),allocatable :: a2flogmom_int(:),eli_smear(:,:,:),tmpa2f(:)
    2570                 :             : 
    2571                 :             : ! *********************************************************************
    2572                 :             : 
    2573                 :             : !grid for the representation of alpha^2F (same as mka2f)
    2574                 :             : !WARNING : supposing that the maximum and minimum value of frequency
    2575                 :             : !have been defined in mkelph_linwid.
    2576                 :             : 
    2577                 :          15 :  omegastep = (elph_ds%omega_max-elph_ds%omega_min)/(elph_ds%na2f-one)
    2578                 :             : 
    2579                 :          15 :  nunit = get_unit()
    2580                 :          15 :  open (unit=nunit,file=fname,form='formatted',status='unknown',iostat=iost)
    2581         [ -  + ]:          15 :  if (iost /= 0) then
    2582         [ #  # ]:           0 :    ABI_ERROR("Opening file: " //trim(fname))
    2583                 :             :  end if
    2584                 :             : 
    2585                 :             :  write (msg,'(3a)')&
    2586                 :          15 : & '# Eliashberg function evaluated using only the irred q-points ',ch10,'#'
    2587                 :          15 :  call wrtout(nunit,msg,'COLL')
    2588                 :             : 
    2589                 :             :  write (msg,'(a,i5,2a,es16.8,2a,es16.8,2a,es16.8,2a)')&
    2590                 :          15 : & '# number of frequencies = ',elph_ds%na2f,ch10,         &
    2591                 :          15 : & '# omega_min = ',elph_ds%omega_min,ch10,                &
    2592                 :          15 : & '# omega_max = ',elph_ds%omega_max,ch10,                &
    2593                 :          30 : & '# step = ',omegastep,ch10,'#'
    2594                 :          15 :  call wrtout(nunit,msg,'COLL')
    2595                 :             : 
    2596                 :             : 
    2597                 :          15 :  nsmear=5
    2598                 :          15 :  estep=0.00002_dp !0.54422767 meV
    2599                 :             : 
    2600                 :             :  write (msg,'(a,i5,3a,f10.6,3a,f10.6,3a)')                &
    2601                 :          15 : & '# Using ',nsmear,' values for the gaussian smearing ',ch10,&
    2602                 :          15 : & '# starint from ',elph_ds%a2fsmear,' (Ha)',ch10,            &
    2603                 :          30 : & '# energy step of ',estep,' (Ha)',ch10,'#'
    2604                 :          15 :  call wrtout(nunit,msg,'COLL')
    2605                 :             : 
    2606                 :             : !e-ph quantities will be calculated for nsmear gaussian smearing values
    2607                 :             : !starting from elph_ds%a2fsmearwith an energy step of estep Hartree
    2608                 :             : 
    2609                 :          15 :  write (msg,'(3a)')'#      Smear(Ha) Lambda_Iso  isppol  <ln w> (K)    Tc_McMill (K) ',ch10,'#'
    2610                 :          15 :  call wrtout(nunit,msg,'COLL')
    2611                 :             : 
    2612   [ -  +  +  -  :          45 :  ABI_MALLOC(a2f_1mom,(elph_ds%na2f))
          +  -  +  -  -  
                +  -  + ]
    2613   [ -  +  +  -  :          30 :  ABI_MALLOC(a2f_1mom_int,(elph_ds%na2f))
             -  +  -  + ]
    2614   [ -  +  +  -  :          30 :  ABI_MALLOC(a2flogmom,(elph_ds%na2f))
             -  +  -  + ]
    2615   [ -  +  +  -  :          30 :  ABI_MALLOC(a2flogmom_int,(elph_ds%na2f))
             -  +  -  + ]
    2616   [ -  +  +  -  :          30 :  ABI_MALLOC(a2f_1d,(elph_ds%na2f))
             -  +  -  + ]
    2617   [ -  +  +  -  :          30 :  ABI_MALLOC(tmpa2f,(elph_ds%na2f))
             -  +  -  + ]
    2618   [ -  +  +  -  :          60 :  ABI_MALLOC(eli_smear,(nsmear,elph_ds%nsppol,elph_ds%na2f))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
    2619   [ +  +  +  +  :       44415 :  eli_smear(:,:,:)=zero
                   +  + ]
    2620                 :             : 
    2621         [ +  + ]:          90 :  do ismear=0,nsmear-1
    2622                 :             : 
    2623                 :          75 :    smear = elph_ds%a2fsmear+ismear*estep
    2624                 :          75 :    gaussprefactor = sqrt(piinv) / smear
    2625                 :          75 :    gaussfactor = one / smear
    2626                 :             : 
    2627         [ +  + ]:         170 :    do isppol=1,elph_ds%nsppol  ! spin pol channels
    2628                 :             : 
    2629         [ +  + ]:       32080 :      a2f_1d(:) = zero
    2630         [ +  + ]:       32080 :      tmpa2f(:) = zero
    2631                 :             : 
    2632         [ +  + ]:         335 :      do qptirred=1,elph_ds%nqptirred ! sum over irred qpoints
    2633         [ +  + ]:        1280 :        do ibranch=1,elph_ds%nbranch
    2634                 :             : 
    2635         [ +  + ]:         945 :          if (abs(elph_ds%qgrid_data(qptirred,ibranch,isppol,1)) < tol10) cycle
    2636                 :         705 :          omega = elph_ds%omega_min
    2637                 :             : !        MG the weights in elph_ds%wtq(qptirred) are relative to the full grid qpt_full,
    2638                 :             : !        we need the mapping qirredtofull
    2639                 :         705 :          weight=elph_ds%wtq(elph_ds%qirredtofull(qptirred))
    2640                 :         705 :          a2f_factor=weight*elph_ds%qgrid_data(qptirred,ibranch,isppol,2)/abs(elph_ds%qgrid_data(qptirred,ibranch,isppol,1))
    2641                 :             : 
    2642         [ +  + ]:      282960 :          do iomega=1,elph_ds%na2f
    2643                 :      282000 :            xx = (omega-elph_ds%qgrid_data(qptirred,ibranch,isppol,1))*gaussfactor
    2644                 :      282000 :            gaussval = gaussprefactor*exp(-xx*xx)
    2645                 :      282000 :            tmpa2f(iomega) = tmpa2f(iomega) + gaussval*a2f_factor
    2646                 :      282945 :            omega = omega+omegastep
    2647                 :             :          end do
    2648                 :             : 
    2649                 :             :        end do !end ibranch do
    2650                 :             :      end do !end qptirred
    2651                 :             : 
    2652         [ +  + ]:       32080 :      a2f_1d(:)= tmpa2f(:)/(2*pi*elph_ds%n0(isppol))
    2653         [ +  + ]:       32080 :      eli_smear(ismear+1,isppol,:)=a2f_1d(:) !save values
    2654                 :             : 
    2655                 :             : !    Do isotropic calculation of lambda and output lambda, Tc(MacMillan)
    2656         [ +  + ]:       32080 :      a2f_1mom(:) = zero
    2657                 :          80 :      omega = elph_ds%omega_min
    2658                 :             : 
    2659         [ +  + ]:       32080 :      do iomega=1,elph_ds%na2f
    2660         [ +  + ]:       32000 :        if (abs(omega) > tol10) a2f_1mom(iomega) = two*a2f_1d(iomega)/abs(omega)
    2661                 :       32080 :        omega=omega+omegastep
    2662                 :             :      end do
    2663                 :             : 
    2664                 :          80 :      call simpson_int(elph_ds%na2f,omegastep,a2f_1mom,a2f_1mom_int)
    2665                 :          80 :      lambda_iso = a2f_1mom_int(elph_ds%na2f)
    2666                 :             : 
    2667                 :             : !    Get log moment of alpha^2F
    2668         [ +  + ]:       32080 :      a2flogmom(:) = zero
    2669                 :          80 :      omega = elph_ds%omega_min
    2670         [ +  + ]:       32080 :      do iomega=1,elph_ds%na2f
    2671         [ +  + ]:       32000 :        if (abs(omega) > tol10) then
    2672                 :       31965 :          a2flogmom(iomega) = (two/lambda_iso)*a2f_1d(iomega)*log(abs(omega))/abs(omega)
    2673                 :             :        end if
    2674                 :       32080 :        omega=omega+omegastep
    2675                 :             :      end do
    2676                 :             : 
    2677                 :          80 :      call simpson_int(elph_ds%na2f,omegastep,a2flogmom,a2flogmom_int)
    2678                 :          80 :      omegalog = exp(a2flogmom_int(elph_ds%na2f))
    2679                 :             : 
    2680                 :             :      tc_macmill = (omegalog/1.2_dp) * &
    2681                 :          80 : &     exp((-1.04_dp*(one+lambda_iso)) / (lambda_iso-elph_ds%mustar*(one+0.62_dp*lambda_iso)))
    2682                 :             : 
    2683                 :             : !    write data
    2684                 :             :      write(msg,'(a,5x,f10.6,f10.6,i5,2x,f12.7,2x,f12.6,2x,es16.8)')&
    2685                 :          80 : &     '# ',smear,lambda_iso,isppol,omegalog/kb_HaK,tc_macmill/kb_HaK
    2686                 :         155 :      call wrtout(nunit,msg,'COLL')
    2687                 :             : 
    2688                 :             :    end do !end isppol
    2689                 :             : 
    2690                 :             :  end do !ismear
    2691                 :             : 
    2692         [ -  + ]:          15 :  ABI_FREE(a2f_1mom)
    2693         [ -  + ]:          15 :  ABI_FREE(a2f_1mom_int)
    2694         [ -  + ]:          15 :  ABI_FREE(a2flogmom)
    2695         [ -  + ]:          15 :  ABI_FREE(a2flogmom_int)
    2696                 :             : 
    2697                 :             : !write to file
    2698                 :          15 :  write(msg,'(4a)')'#',ch10,'# Eliashberg function calculated for different gaussian smearing values',ch10
    2699                 :          15 :  call wrtout(nunit,msg,'COLL')
    2700                 :             : 
    2701         [ +  + ]:          31 :  do isppol=1,elph_ds%nsppol
    2702                 :          16 :    omega = elph_ds%omega_min
    2703                 :          16 :    write(nunit,'(a,i5)') '# smeared alpha2F for isppol = ',isppol
    2704         [ +  + ]:        6416 :    do iomega=1,elph_ds%na2f
    2705                 :        6400 :      write(nunit,'(6(f17.12,1x))')omega,eli_smear(:,isppol,iomega)
    2706                 :        6416 :      omega=omega+omegastep
    2707                 :             :    end do
    2708                 :          31 :    write(nunit,*)
    2709                 :             :  end do
    2710                 :             : 
    2711         [ -  + ]:          15 :  ABI_FREE(eli_smear)
    2712         [ -  + ]:          15 :  ABI_FREE(a2f_1d)
    2713         [ -  + ]:          15 :  ABI_FREE(tmpa2f)
    2714                 :             : 
    2715                 :          15 :  close (nunit)
    2716                 :             : 
    2717                 :          15 : end subroutine mka2fQgrid
    2718                 :             : !!***
    2719                 :             : 
    2720                 :             : !!****f* m_elphon/order_fs_kpts
    2721                 :             : !!
    2722                 :             : !! NAME
    2723                 :             : !! order_fs_kpts
    2724                 :             : !!
    2725                 :             : !! FUNCTION
    2726                 :             : !! This routine re-orders the kpoints on the standard grid which belong
    2727                 :             : !!  to the Fermi surface: put them in increasing z, then y,  then x
    2728                 :             : !!
    2729                 :             : !! INPUTS
    2730                 :             : !!   nkptirr = number of irreducible FS kpoints
    2731                 :             : !!   nkpt = input nkpt from header
    2732                 :             : !!   kptns = input kpt from header
    2733                 :             : !!
    2734                 :             : !! OUTPUT
    2735                 :             : !!   FSirredtoGS = mapping of irreducible kpoints to GS set
    2736                 :             : !!   kptirr = irreducible FS kpoint coordinates
    2737                 :             : !!
    2738                 :             : !! SOURCE
    2739                 :             : 
    2740                 :          15 : subroutine order_fs_kpts(kptns, nkpt, kptirr,nkptirr,FSirredtoGS)
    2741                 :             : 
    2742                 :             : !Arguments ------------------------------------
    2743                 :             : !scalars
    2744                 :             :  integer,intent(in) :: nkptirr
    2745                 :             :  integer,intent(in) :: nkpt
    2746                 :             : 
    2747                 :             : !arrays
    2748                 :             :  integer,intent(out) :: FSirredtoGS(nkptirr)
    2749                 :             :  real(dp),intent(in) :: kptns(3,nkpt)
    2750                 :             :  real(dp),intent(out) :: kptirr(3,nkptirr)
    2751                 :             : 
    2752                 :             : !Local variables-------------------------------
    2753                 :             : !scalars
    2754                 :             :  integer :: irank,ikpt,jkpt,kkpt,new, ik
    2755                 :             :  real(dp) :: res
    2756                 :          15 :  type(krank_t) :: krank
    2757                 :             : !arrays
    2758                 :          30 :  integer :: kptirrank(nkptirr)
    2759                 :             : ! *************************************************************************
    2760                 :             : 
    2761                 :             :  ! rank is used to order kpoints
    2762                 :          15 :  call krank%init(nkpt, kptns)
    2763                 :             : 
    2764                 :          15 :  ik=1
    2765         [ +  + ]:        1327 :  do ikpt=1,nkpt
    2766                 :        1312 :    irank = krank%get_rank(kptns(:,ikpt))
    2767                 :             : !  add kpt to FS kpts, in order, increasing z, then y, then x !
    2768                 :        1312 :    new = 1
    2769                 :             : !  look for position to insert kpt ikpt among irredkpts already found
    2770         [ +  + ]:       91280 :    do jkpt=1,ik-1
    2771         [ -  + ]:       91280 :      if (kptirrank(jkpt) > irank) then
    2772                 :             : !      shift all the others up
    2773         [ #  # ]:           0 :        do kkpt=ik-1,jkpt,-1
    2774         [ #  # ]:           0 :          kptirr(:,kkpt+1) = kptirr(:,kkpt)
    2775                 :           0 :          kptirrank(kkpt+1) = kptirrank(kkpt)
    2776                 :           0 :          FSirredtoGS(kkpt+1) = FSirredtoGS(kkpt)
    2777                 :             :        end do
    2778                 :             : !      insert kpoint ikpt
    2779                 :           0 :        call wrap2_pmhalf(kptns(1,ikpt),kptirr(1,jkpt),res)
    2780                 :           0 :        call wrap2_pmhalf(kptns(2,ikpt),kptirr(2,jkpt),res)
    2781                 :           0 :        call wrap2_pmhalf(kptns(3,ikpt),kptirr(3,jkpt),res)
    2782                 :             : 
    2783                 :           0 :        kptirrank(jkpt) = irank
    2784                 :           0 :        FSirredtoGS(jkpt) = ikpt
    2785                 :             :        new=0
    2786                 :             :        exit
    2787                 :             :      end if
    2788                 :             :    end do
    2789                 :             : !  ikpt not counted yet and higher rank than all previous
    2790                 :             :    if (new == 1) then
    2791                 :        1312 :      call wrap2_pmhalf(kptns(1,ikpt),kptirr(1,ikpt),res)
    2792                 :        1312 :      call wrap2_pmhalf(kptns(2,ikpt),kptirr(2,ikpt),res)
    2793                 :        1312 :      call wrap2_pmhalf(kptns(3,ikpt),kptirr(3,ikpt),res)
    2794                 :        1312 :      kptirrank(ik) = irank
    2795                 :        1312 :      FSirredtoGS(ik) = ikpt
    2796                 :             :    end if
    2797                 :        1327 :    ik=ik+1
    2798                 :             :  end do
    2799                 :             : 
    2800                 :          15 :  call krank%free()
    2801                 :             : 
    2802   [ -  +  -  +  :          15 : end subroutine order_fs_kpts
                   -  + ]
    2803                 :             : !!***
    2804                 :             : 
    2805                 :             : !!****f* m_elphon/ep_setupqpt
    2806                 :             : !!
    2807                 :             : !! NAME
    2808                 :             : !! ep_setupqpt
    2809                 :             : !!
    2810                 :             : !! FUNCTION
    2811                 :             : !!  set up qpoint grid for elphon.
    2812                 :             : !!  2 modes, either uniform grid from anaddb input nqpt
    2813                 :             : !!  or take qpt from anaddb input (explicitly listed)
    2814                 :             : !!
    2815                 :             : !! INPUTS
    2816                 :             : !!   crystal>crystal_t>=data type gathering info on the crystalline structure.
    2817                 :             : !!   anaddb_dtset=dataset with input variables
    2818                 :             : !!     %qgrid_type gives type of q grid 1=uniform 2=take from input
    2819                 :             : !!     %ep_nqpt    number of auxiliary qpoints
    2820                 :             : !!     %ep_qptlist list of qpoints,
    2821                 :             : !!
    2822                 :             : !! OUTPUT
    2823                 :             : !!
    2824                 :             : !! NOTES
    2825                 :             : !!
    2826                 :             : !! SOURCE
    2827                 :             : 
    2828                 :          15 : subroutine ep_setupqpt (elph_ds,crystal,anaddb_dtset,qptrlatt,timrev)
    2829                 :             : 
    2830                 :             : !Arguments -------------------------------
    2831                 :             : !scalars
    2832                 :             :  integer, intent(in) :: timrev
    2833                 :             :  type(crystal_t),intent(in) :: crystal
    2834                 :             :  type(anaddb_dataset_type), intent(in) :: anaddb_dtset
    2835                 :             :  type(elph_type), intent(inout) :: elph_ds
    2836                 :             : !arrays
    2837                 :             :  integer, intent(out) :: qptrlatt(3,3)
    2838                 :             : 
    2839                 :             : !Local variables -------------------------
    2840                 :             : !scalars
    2841                 :             :  integer :: nqshft,option,iqpt, nqpt1
    2842                 :             :  integer :: iscf,mqpt,iout,berryopt,nqpt_computed
    2843                 :             :  real(dp) :: qptrlen, res
    2844                 :             :  character(len=500) :: message
    2845                 :             : !arrays
    2846                 :             :  integer :: vacuum(3)
    2847                 :          15 :  integer,allocatable :: indqpt1(:)
    2848                 :             :  real(dp) :: kpt(3)
    2849                 :          15 :  integer, allocatable :: bz2ibz_smap(:,:)
    2850                 :          15 :  real(dp),allocatable :: wtq_folded(:)
    2851                 :          15 :  real(dp), allocatable :: wtq(:),qpt_full(:,:),tmpshifts(:,:)
    2852                 :             : 
    2853                 :             : ! *********************************************************************
    2854                 :             : 
    2855                 :             : !default is to expect a uniform grid
    2856                 :          15 :  elph_ds%tuniformgrid = 1
    2857                 :             : 
    2858                 :             : !if we use the normal grid way of generating the qpoints:
    2859         [ +  - ]:          15 :  if (anaddb_dtset%qgrid_type==1) then
    2860                 :             : !  qpoint lattice vectors (inverse, like kptrlatt)
    2861                 :          15 :    qptrlatt(:,:)=0
    2862                 :          15 :    qptrlatt(1,1)=anaddb_dtset%ngqpt(1)
    2863                 :          15 :    qptrlatt(2,2)=anaddb_dtset%ngqpt(2)
    2864                 :          15 :    qptrlatt(3,3)=anaddb_dtset%ngqpt(3)
    2865                 :             : 
    2866         [ -  + ]:          15 :    if (anaddb_dtset%nqshft /= 1) then
    2867                 :             : !    try to reduce the qpoint grid to a single qshift, otherwise stop
    2868                 :             : !    dummy args for call to getkgrid
    2869                 :           0 :      vacuum(:) = 0
    2870                 :           0 :      iscf = 3
    2871                 :             : 
    2872                 :           0 :      mqpt = anaddb_dtset%ngqpt(1)*anaddb_dtset%ngqpt(2)*anaddb_dtset%ngqpt(3)*anaddb_dtset%nqshft
    2873   [ #  #  #  #  :           0 :      ABI_MALLOC(qpt_full,(3,mqpt))
          #  #  #  #  #  
                #  #  # ]
    2874   [ #  #  #  #  :           0 :      ABI_MALLOC(wtq,(mqpt))
          #  #  #  #  #  
                #  #  # ]
    2875         [ #  # ]:           0 :      ABI_MALLOC(tmpshifts,(3,MAX_NSHIFTK))
    2876                 :             : 
    2877         [ #  # ]:           0 :      wtq(:) = one
    2878                 :             : 
    2879   [ #  #  #  # ]:           0 :      tmpshifts(:,:) = zero
    2880   [ #  #  #  # ]:           0 :      tmpshifts(:,1:4) = anaddb_dtset%q1shft(:,:)
    2881                 :             : 
    2882                 :             :      iout=6
    2883                 :             : 
    2884                 :           0 :      berryopt = 1
    2885                 :             : 
    2886                 :             : !    just call with identity, to get full set of kpts in qpt_full, but
    2887                 :             : !    reduce qshfts
    2888                 :             : 
    2889                 :           0 :      nqshft=anaddb_dtset%nqshft
    2890                 :             :      call getkgrid(0,0,iscf,qpt_full,3,qptrlatt,qptrlen, &
    2891                 :             : &     1,mqpt,nqpt_computed,nqshft,1,crystal%rprimd,tmpshifts,crystal%symafm, &
    2892                 :           0 : &     crystal%symrel,vacuum,wtq)
    2893         [ #  # ]:           0 :      ABI_FREE(qpt_full)
    2894         [ #  # ]:           0 :      ABI_FREE(wtq)
    2895         [ #  # ]:           0 :      ABI_FREE(tmpshifts)
    2896                 :             : 
    2897                 :             :      if (anaddb_dtset%nqshft /= 1) then
    2898                 :             :        write (message,'(a,i0)')&
    2899                 :           0 : &       ' multiple qpt shifts not treated yet (should be possible), nqshft= ', anaddb_dtset%nqshft
    2900                 :           0 :        ABI_ERROR(message)
    2901                 :             :      end if
    2902                 :             :    end if  ! end multiple shifted qgrid
    2903                 :             : 
    2904                 :             : 
    2905                 :          15 :    write(message,'(a,9(i0,1x))')' elphon : enter smpbz with  qptrlatt = ',qptrlatt
    2906                 :          15 :    call wrtout(std_out,message,'COLL')
    2907                 :             : 
    2908                 :          15 :    option=1
    2909                 :             : !  mqpt=anaddb_dtset%ngqpt(1)*anaddb_dtset%ngqpt(2)*anaddb_dtset%ngqpt(3)*anaddb_dtset%nqshft
    2910                 :             :    mqpt= qptrlatt(1,1)*qptrlatt(2,2)*qptrlatt(3,3) &
    2911                 :             : &   +qptrlatt(1,2)*qptrlatt(2,3)*qptrlatt(3,1) &
    2912                 :             : &   +qptrlatt(1,3)*qptrlatt(2,1)*qptrlatt(3,2) &
    2913                 :             : &   -qptrlatt(1,2)*qptrlatt(2,1)*qptrlatt(3,3) &
    2914                 :             : &   -qptrlatt(1,3)*qptrlatt(2,2)*qptrlatt(3,1) &
    2915                 :          15 : &   -qptrlatt(1,1)*qptrlatt(2,3)*qptrlatt(3,2)
    2916                 :             : 
    2917   [ -  +  +  -  :          45 :    ABI_MALLOC(qpt_full,(3,mqpt))
          +  -  +  -  -  
                +  -  + ]
    2918                 :          15 :    iout = 6
    2919                 :          15 :    call smpbz(anaddb_dtset%brav,iout,qptrlatt,mqpt,elph_ds%nqpt_full,anaddb_dtset%nqshft,option,anaddb_dtset%q1shft,qpt_full)
    2920                 :             : 
    2921                 :             : 
    2922                 :             : !  save the q-grid for future reference
    2923   [ -  +  +  -  :          45 :    ABI_MALLOC(elph_ds%qpt_full,(3,elph_ds%nqpt_full))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
    2924                 :             : 
    2925                 :             : !  reduce qpt_full to correct zone
    2926         [ +  + ]:         135 :    do iqpt=1,elph_ds%nqpt_full
    2927                 :         120 :      call wrap2_pmhalf(qpt_full(1,iqpt),kpt(1),res)
    2928                 :         120 :      call wrap2_pmhalf(qpt_full(2,iqpt),kpt(2),res)
    2929                 :         120 :      call wrap2_pmhalf(qpt_full(3,iqpt),kpt(3),res)
    2930         [ +  + ]:         480 :      qpt_full(:,iqpt) = kpt
    2931         [ +  + ]:         495 :      elph_ds%qpt_full(:,iqpt)=kpt
    2932                 :             :    end do
    2933         [ -  + ]:          15 :    ABI_FREE(qpt_full)
    2934                 :             : 
    2935         [ #  # ]:           0 :  else if (anaddb_dtset%qgrid_type==2) then ! use explicit list of qpoints from anaddb input
    2936                 :           0 :    qptrlatt(:,:)=0
    2937                 :           0 :    qptrlatt(1,1)=1
    2938                 :           0 :    qptrlatt(2,2)=1
    2939                 :           0 :    qptrlatt(3,3)=1
    2940                 :             : 
    2941                 :           0 :    elph_ds%nqpt_full=anaddb_dtset%ep_nqpt
    2942   [ #  #  #  #  :           0 :    ABI_MALLOC(elph_ds%qpt_full,(3,elph_ds%nqpt_full))
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    2943                 :             : 
    2944   [ #  #  #  #  :           0 :    elph_ds%qpt_full = anaddb_dtset%ep_qptlist
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
    2945                 :             : 
    2946                 :           0 :    elph_ds%tuniformgrid = 0
    2947                 :             :  end if ! type of qgrid for elphon
    2948                 :             : 
    2949                 :             : !=================================================================
    2950                 :             : !Calculate weights, needed to estimate lambda using the weighted
    2951                 :             : !sum of the uninterpolated e-ph matrix elements
    2952                 :             : !=================================================================
    2953                 :          15 :  call wrtout(std_out,' setqgrid : calling symkpt to find irred q points',"COLL")
    2954                 :             : 
    2955   [ -  +  +  -  :          45 :  ABI_MALLOC(indqpt1,(elph_ds%nqpt_full))
          +  -  +  -  -  
                +  -  + ]
    2956   [ -  +  +  -  :          45 :  ABI_MALLOC(wtq_folded,(elph_ds%nqpt_full))
          +  -  +  -  -  
                +  -  + ]
    2957   [ -  +  +  -  :          30 :  ABI_MALLOC(wtq,(elph_ds%nqpt_full))
             -  +  -  + ]
    2958   [ -  +  +  -  :          45 :  ABI_MALLOC(bz2ibz_smap, (6, elph_ds%nqpt_full))
          +  -  +  -  -  
                +  -  + ]
    2959                 :             : 
    2960         [ +  + ]:         135 :  wtq(:) = one/dble(elph_ds%nqpt_full) !weights normalized to unity
    2961                 :             : 
    2962                 :             : !
    2963                 :             : !NOTE: this reduction of irred qpt may not be identical to that in GKK file
    2964                 :             : !which would be more practical to use.
    2965                 :             : !
    2966                 :          15 :  iout=0 !do not write to ab_out
    2967                 :             : !should we save indqpt1 for use inside elph_ds?
    2968                 :             :  call symkpt(0,crystal%gmet,indqpt1,iout,elph_ds%qpt_full,elph_ds%nqpt_full,nqpt1,crystal%nsym,crystal%symrec,&
    2969                 :          15 : & timrev,wtq,wtq_folded, bz2ibz_smap, xmpi_comm_self)
    2970                 :             : 
    2971         [ -  + ]:          15 :  ABI_FREE(bz2ibz_smap)
    2972                 :             : 
    2973                 :          15 :  write (message,'(2a,i0)')ch10,' Number of irreducible q-points = ',nqpt1
    2974                 :          15 :  call wrtout(std_out,message,'COLL')
    2975                 :          15 :  elph_ds%nqptirred=nqpt1
    2976                 :             : 
    2977                 :          15 :  call wrtout(std_out,' === Irreducible q points with weights ==== ','COLL')
    2978                 :             : 
    2979         [ +  + ]:         135 :  do iqpt=1,elph_ds%nqpt_full
    2980         [ +  + ]:         135 :    if (wtq_folded(iqpt) /= zero) then
    2981                 :          48 :      write (message,'(1x,i4,a2,4es16.8)')iqpt,') ',elph_ds%qpt_full(:,iqpt),wtq_folded(iqpt)
    2982                 :          48 :      call wrtout(std_out,message,'COLL')
    2983                 :             :    end if
    2984                 :             :  end do
    2985                 :             : 
    2986                 :          15 :  call wrtout(std_out,ch10,'COLL')
    2987                 :             : 
    2988   [ -  +  +  -  :          45 :  ABI_MALLOC(elph_ds%wtq,(elph_ds%nqpt_full))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
    2989                 :             : 
    2990         [ +  + ]:         135 :  elph_ds%wtq(:)=wtq_folded(:)
    2991                 :             : !MEMO indqpt could be useful to test the qgrid read by abinit
    2992         [ -  + ]:          15 :  ABI_FREE(indqpt1)
    2993         [ -  + ]:          15 :  ABI_FREE(wtq_folded)
    2994         [ -  + ]:          15 :  ABI_FREE(wtq)
    2995                 :             : 
    2996                 :          15 : end subroutine ep_setupqpt
    2997                 :             : !!***
    2998                 :             : 
    2999                 :             : !!****f* ABINIT/mkph_linwid
    3000                 :             : !!
    3001                 :             : !! NAME
    3002                 :             : !! mkph_linwid
    3003                 :             : !!
    3004                 :             : !! FUNCTION
    3005                 :             : !!  Calculate the phonon linewidths on a trajectory in q space
    3006                 :             : !!
    3007                 :             : !! INPUTS
    3008                 :             : !!  Cryst<crystal_t>=Info on the unit cell and symmetries.
    3009                 :             : !!  Ifc<ifc_type>=Object containing the interatomic force constants.
    3010                 :             : !!  elph_ds = datastructure with phonon matrix elements
    3011                 :             : !!  nqpath = dimension of qpath_vertices
    3012                 :             : !!  qpath_vertices = vertices of reciprocal space trajectory
    3013                 :             : !!
    3014                 :             : !! OUTPUT
    3015                 :             : !!
    3016                 :             : !! SIDE EFFECTS
    3017                 :             : !!
    3018                 :             : !! SOURCE
    3019                 :             : 
    3020                 :          15 : subroutine mkph_linwid(Cryst,ifc,elph_ds,nqpath,qpath_vertices)
    3021                 :             : 
    3022                 :             : !Arguments ------------------------------------
    3023                 :             : !scalars
    3024                 :             :  integer,intent(in) :: nqpath
    3025                 :             :  type(crystal_t),intent(in) :: Cryst
    3026                 :             :  type(ifc_type),intent(in) :: ifc
    3027                 :             :  type(elph_type),intent(inout) :: elph_ds
    3028                 :             : !arrays
    3029                 :             :  real(dp),intent(in) :: qpath_vertices(3,nqpath)
    3030                 :             : 
    3031                 :             : !Local variables-------------------------------
    3032                 :             : !scalars
    3033                 :             :  integer :: ibranch,natom,ii,indx,ipoint,nbranch,nqbz,nsppol,nrpt
    3034                 :             :  integer :: isppol,jbranch,qtor,unit_bs,unit_lambda,unit_lwd,npt_tot
    3035                 :             :  real(dp) :: diagerr,res
    3036                 :             :  character(len=500) :: msg
    3037                 :             :  character(len=fnlen) :: fname,base_name
    3038                 :             : !arrays
    3039                 :          30 :  integer :: ndiv(nqpath-1)
    3040                 :          15 :  integer, allocatable :: indxprtqpt(:)
    3041                 :             :  complex(dp),parameter :: c0=dcmplx(0._dp,0._dp),c1=dcmplx(1._dp,0._dp)
    3042                 :          30 :  real(dp) :: displ_cart(2,3*Cryst%natom,3*Cryst%natom)
    3043                 :          30 :  real(dp) :: displ_red(2,3*Cryst%natom,3*Cryst%natom)
    3044                 :          30 :  real(dp) :: eigval(3*Cryst%natom)
    3045                 :          30 :  real(dp) :: gam_now(2,(3*Cryst%natom)**2)
    3046                 :          30 :  real(dp) :: imeigval(3*Cryst%natom)
    3047                 :          30 :  real(dp) :: lambda(3*Cryst%natom)
    3048                 :          30 :  real(dp) :: pheigvec(2*3*Cryst%natom*3*Cryst%natom),phfrq_tmp(3*Cryst%natom)
    3049                 :             :  real(dp) :: qpt(3),redkpt(3)
    3050                 :          30 :  real(dp) :: tmpgam1(2,3*Cryst%natom,3*Cryst%natom)
    3051                 :          30 :  real(dp) :: tmpgam2(2,3*Cryst%natom,3*Cryst%natom)
    3052                 :          15 :  real(dp), allocatable :: coskr(:,:), sinkr(:,:),finepath(:,:)
    3053                 :             : 
    3054                 :             : ! *********************************************************************
    3055                 :             : 
    3056                 :             :  DBG_ENTER("COLL")
    3057                 :             : 
    3058                 :          15 :  natom     = Cryst%natom
    3059                 :          15 :  nbranch   = elph_ds%nbranch
    3060                 :          15 :  nsppol    = elph_ds%nsppol
    3061                 :          15 :  base_name = elph_ds%elph_base_name
    3062                 :          15 :  nrpt = ifc%nrpt
    3063                 :             : 
    3064                 :             : !===================================================================
    3065                 :             : !Definition of the q path along which ph linwid will be interpolated
    3066                 :             : !===================================================================
    3067                 :          15 :  call make_path(nqpath,qpath_vertices,Cryst%gmet,'G',20,ndiv,npt_tot,finepath)
    3068   [ -  +  +  -  :          45 :  ABI_MALLOC(indxprtqpt,(npt_tot))
          +  -  +  -  -  
                +  -  + ]
    3069         [ +  + ]:        3564 :  indxprtqpt = 0
    3070                 :             : 
    3071                 :             : !==========================================================
    3072                 :             : !Open _LWD file and write header
    3073                 :             : !==========================================================
    3074         [ +  - ]:          15 :  fname=trim(base_name) // '_LWD'
    3075         [ -  + ]:          15 :  if (open_file(fname,msg,newunit=unit_lwd,status="unknown") /= 0) then
    3076                 :           0 :    ABI_ERROR(msg)
    3077                 :             :  end if
    3078                 :             : 
    3079                 :          15 :  write (unit_lwd,'(a)')       '#'
    3080                 :          15 :  write (unit_lwd,'(a)')       '# ABINIT package : Phonon linewidth file'
    3081                 :          15 :  write (unit_lwd,'(a)')       '#'
    3082                 :          15 :  write (unit_lwd,'(a,i10,a)') '#  Phonon linewidths calculated on ',npt_tot,' points along the qpath'
    3083                 :          15 :  write (unit_lwd,'(a)')       '#  Description of the Q-path :'
    3084                 :          15 :  write (unit_lwd, '(a,i10)')  '#  Number of line segments = ',nqpath-1
    3085                 :          15 :  write (unit_lwd,'(a)')       '#  Vertices of the Q-path and corresponding index = '
    3086                 :             : 
    3087                 :          15 :  indx=1
    3088                 :          15 :  indxprtqpt(1) = 1
    3089                 :          15 :  indxprtqpt(npt_tot) = 1
    3090                 :             : 
    3091         [ +  + ]:         135 :  do ii=1,nqpath
    3092                 :         120 :    write (unit_lwd,'(a,3(e16.6,1x),i8)')'#  ',qpath_vertices(:,ii),indx
    3093         [ +  + ]:         135 :    if (ii<nqpath) then
    3094                 :         105 :      indx=indx+ndiv(ii)
    3095                 :         105 :      indxprtqpt(indx) = 1
    3096                 :             :    end if
    3097                 :             :  end do
    3098                 :             : 
    3099                 :          15 :  write (unit_lwd,'(a)')'#'
    3100                 :             : 
    3101                 :             : !==========================================================
    3102                 :             : !Open _BST file and write header
    3103                 :             : !==========================================================
    3104         [ +  - ]:          15 :  fname=trim(base_name) // '_BST'
    3105         [ -  + ]:          15 :  if (open_file(fname,msg,newunit=unit_bs,status="unknown") /= 0) then
    3106                 :           0 :    ABI_ERROR(msg)
    3107                 :             :  end if
    3108                 :             : 
    3109                 :          15 :  write (unit_bs, '(a)')      '#'
    3110                 :          15 :  write (unit_bs, '(a)')      '# ABINIT package : Phonon band structure file'
    3111                 :          15 :  write (unit_bs, '(a)')      '#'
    3112                 :          15 :  write (unit_bs, '(a,i10,a)')'# Phonon BS calculated on ', npt_tot,' points along the qpath'
    3113                 :          15 :  write (unit_bs, '(a,i10)')  '# Number of line segments = ', nqpath-1
    3114                 :          15 :  indx=1
    3115         [ +  + ]:         135 :  do ii=1,nqpath
    3116                 :         120 :    write (unit_bs,'(a,3(E16.6,1x),i8)')'#  ',qpath_vertices(:,ii),indx
    3117         [ +  + ]:         135 :    if (ii<nqpath) indx=indx+ndiv(ii)
    3118                 :             :  end do
    3119                 :          15 :  write (unit_bs,'(a)')'#'
    3120                 :             : 
    3121                 :             : !MG20060606
    3122                 :             : !==========================================================
    3123                 :             : !open _LAMBDA file and write header
    3124                 :             : !contains \omega(q,n) and \lambda(q,n) and can be plotted using xmgrace
    3125                 :             : !==========================================================
    3126         [ +  - ]:          15 :  fname=trim(base_name) // '_LAMBDA'
    3127         [ -  + ]:          15 :  if (open_file(fname,msg,newunit=unit_lambda,status="unknown") /= 0) then
    3128                 :           0 :    ABI_ERROR(msg)
    3129                 :             :  end if
    3130                 :             : 
    3131                 :          15 :  write (unit_lambda,'(a)')      '#'
    3132                 :          15 :  write (unit_lambda,'(a)')      '# ABINIT package : Lambda file'
    3133                 :          15 :  write (unit_lambda,'(a)')      '#'
    3134                 :          15 :  write (unit_lambda,'(a,i10,a)')'#  Lambda(q,nu) calculated on ',npt_tot,' Q-points'
    3135                 :          15 :  write (unit_lambda,'(a)')      '# Description of the Q-path :'
    3136                 :          15 :  write (unit_lambda,'(a,i10)')  '# Number of line segments = ',nqpath-1
    3137                 :          15 :  write (unit_lambda,'(a)')      '# Vertices of the Q-path and corresponding index = '
    3138                 :             : 
    3139                 :          15 :  indx=1
    3140         [ +  + ]:         135 :  do ii=1,nqpath
    3141                 :         120 :    write (unit_lambda,'(a,3(E16.6,1x),i8)')'#  ',qpath_vertices(:,ii),indx
    3142         [ +  + ]:         135 :    if (ii<nqpath) indx=indx+ndiv(ii)
    3143                 :             :  end do
    3144                 :          15 :  write (unit_lambda,'(a)')'#'
    3145                 :          15 :  write (unit_lambda,'(a)')'# index frequency lambda(q,n) frequency lambda(q,n) .... lambda_tot'
    3146                 :          15 :  write (unit_lambda,'(a)')'#'
    3147                 :             : 
    3148                 :             : !real space to q space
    3149                 :          15 :  qtor=0
    3150                 :             : 
    3151                 :             : !initialize the maximum phonon frequency
    3152                 :          15 :  elph_ds%omega_min = zero
    3153                 :          15 :  elph_ds%omega_max = zero
    3154                 :             : 
    3155   [ -  +  +  -  :          60 :  ABI_MALLOC(coskr, (npt_tot,nrpt))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
    3156   [ -  +  +  -  :          45 :  ABI_MALLOC(sinkr, (npt_tot,nrpt))
          -  +  +  -  -  
                +  -  + ]
    3157                 :          15 :  call ftgam_init(ifc%gprim, npt_tot, nrpt, finepath, ifc%rpt, coskr, sinkr)
    3158                 :             : 
    3159         [ +  + ]:          75 :  write (std_out,*) ' mkph_linwid : shape(elph_ds%gamma_qpt) = ',shape(elph_ds%gamma_qpt)
    3160                 :          15 :  nqbz =  SIZE(elph_ds%gamma_qpt,DIM=4)
    3161                 :          15 :  write(std_out,*) " nqbz =  SIZE(elph_ds%gamma_qpt,DIM=4) = ",nqbz
    3162                 :             : !
    3163                 :             : !Big do loop over spin polarizations
    3164                 :             : !could put in locally, so phonon stuff is not done twice...
    3165                 :             : !
    3166         [ +  + ]:          31 :  do isppol=1,nsppol
    3167                 :          16 :    indx=1
    3168                 :             : 
    3169                 :             : !  Output to the main output file
    3170                 :          16 :    write(msg,'(a,a)')ch10,&
    3171                 :          32 : &   ' Output of the linewidths for the first point of each segment. Linewidths are given in Hartree.'
    3172                 :          16 :    call wrtout(std_out,msg,'COLL')
    3173                 :          16 :    call wrtout(ab_out,msg,'COLL')
    3174                 :             : 
    3175                 :          16 :    write (std_out,*) ' mkph_linwid : elph_ds%ep_scalprod = ', elph_ds%ep_scalprod
    3176                 :             : 
    3177                 :             :    qtor = 0
    3178                 :             : 
    3179                 :             : !  Interpolation along specified path in q space
    3180         [ +  + ]:        3781 :    do ipoint=1,npt_tot
    3181                 :             : 
    3182                 :             : !    Get qpoint along the path from qpath_vertices
    3183         [ +  + ]:       15060 :      qpt(:) = finepath(:,ipoint)
    3184                 :             : 
    3185                 :        3765 :      call wrap2_pmhalf(qpt(1),redkpt(1),res)
    3186                 :        3765 :      call wrap2_pmhalf(qpt(2),redkpt(2),res)
    3187                 :        3765 :      call wrap2_pmhalf(qpt(3),redkpt(3),res)
    3188                 :        3765 :      qpt(:) = redkpt(:)
    3189                 :             : !
    3190                 :             : !    This reduced version of ftgkk supposes the kpoints have been integrated
    3191                 :             : !    in integrate_gamma. Do FT from real-space gamma grid to 1 qpt.
    3192                 :             :      call ftgam(ifc%wghatm,gam_now,elph_ds%gamma_rpt(:,:,isppol,:),natom,1,ifc%nrpt,qtor, &
    3193   [ +  +  +  -  :      617967 : &     coskr(ipoint,:), sinkr(ipoint,:))
          +  +  +  +  +  
          +  +  -  +  -  
          +  +  +  -  +  
          -  +  +  +  +  
          +  +  +  +  +  
             +  +  -  +  
                      - ]
    3194                 :             : !
    3195                 :             : !    get phonon freqs and eigenvectors anyway
    3196                 :             : !
    3197                 :        3765 :      call ifc%fourq(cryst,qpt,phfrq_tmp,displ_cart,out_eigvec=pheigvec)
    3198                 :             : !
    3199                 :             : !    additional frequency factor for some cases
    3200                 :             : !
    3201                 :             : !    If the matrices do not contain the scalar product with the displ_cart vectors yet do it now
    3202         [ +  + ]:        3765 :      if (elph_ds%ep_scalprod == 0) then
    3203                 :             : 
    3204                 :        2592 :        call phdispl_cart2red(natom,Cryst%gprimd,displ_cart,displ_red)
    3205                 :             : 
    3206         [ +  + ]:       10368 :        tmpgam2 = reshape (gam_now, (/2,nbranch,nbranch/))
    3207                 :        2592 :        call gam_mult_displ(nbranch, displ_red, tmpgam2, tmpgam1)
    3208                 :             : 
    3209         [ +  + ]:       10368 :        do jbranch=1,nbranch
    3210                 :        7776 :          eigval(jbranch) = tmpgam1(1, jbranch, jbranch)
    3211                 :        7776 :          imeigval(jbranch) = tmpgam1(2, jbranch, jbranch)
    3212                 :             : 
    3213         [ -  + ]:       10368 :          if (abs(imeigval(jbranch)) > tol8) then
    3214                 :           0 :            write (msg,'(a,i0,a,es16.8)')' imaginary values for branch = ',jbranch,' imeigval = ',imeigval(jbranch)
    3215                 :           0 :            ABI_WARNING(msg)
    3216                 :             :          end if
    3217                 :             :        end do
    3218                 :             : 
    3219         [ +  - ]:        1173 :      else if (elph_ds%ep_scalprod == 1) then
    3220                 :             : !
    3221                 :             : !      Diagonalize gamma matrix at qpoint (complex matrix).
    3222                 :             : !      MJV NOTE: gam_now is recast implicitly here to matrix
    3223                 :             :        call ZGEMM ( 'N', 'N', 3*natom, 3*natom, 3*natom, c1, gam_now, 3*natom,&
    3224                 :        1173 : &       pheigvec, 3*natom, c0, tmpgam1, 3*natom)
    3225                 :             : 
    3226                 :             :        call ZGEMM ( 'C', 'N', 3*natom, 3*natom, 3*natom, c1, pheigvec, 3*natom,&
    3227                 :        1173 : &       tmpgam1, 3*natom, c0, tmpgam2, 3*natom)
    3228                 :             : 
    3229                 :        1173 :        diagerr = zero
    3230         [ +  + ]:        7563 :        do ibranch=1,nbranch
    3231                 :             : 
    3232                 :        6390 :          eigval(ibranch) = tmpgam2(1,ibranch,ibranch)
    3233                 :             : 
    3234         [ +  + ]:       21393 :          do jbranch=1,ibranch-1
    3235                 :       21393 :            diagerr = diagerr + abs(tmpgam2(1,jbranch,ibranch))+abs(tmpgam2(2,jbranch,ibranch))
    3236                 :             :          end do
    3237         [ +  + ]:       21393 :          do jbranch=ibranch+1,nbranch
    3238                 :       21393 :            diagerr = diagerr + abs(tmpgam2(1,jbranch,ibranch))+abs(tmpgam2(2,jbranch,ibranch))
    3239                 :             :          end do
    3240                 :        7563 :          diagerr = diagerr + abs(tmpgam2(2,ibranch,ibranch))
    3241                 :             :        end do
    3242                 :             : 
    3243         [ +  + ]:        1173 :        if (diagerr > tol12) then
    3244                 :        1018 :          write (msg,'(a,es14.6)')' Numerical error in diagonalization of gamma with phon eigenvectors: ', diagerr
    3245                 :        1018 :          ABI_WARNING(msg)
    3246                 :             :        end if
    3247                 :             : 
    3248                 :             :      else
    3249                 :           0 :        write (msg,'(a,i0)')' Wrong value for elph_ds%ep_scalprod = ',elph_ds%ep_scalprod
    3250                 :           0 :        ABI_BUG(msg)
    3251                 :             :      end if ! end elph_ds%ep_scalprod if
    3252                 :             : !
    3253                 :             : !    ==========================================================
    3254                 :             : !    write data to files for each q point
    3255                 :             : !    ==========================================================
    3256                 :        3765 :      write (unit_lwd,'(i5)', advance='no') indx
    3257         [ +  + ]:       17931 :      do ii=1, nbranch
    3258                 :       17931 :        write (unit_lwd,'(E16.5)',advance='no') eigval(ii)
    3259                 :             :      end do
    3260                 :        3765 :      write (unit_lwd,*)
    3261                 :             : 
    3262                 :             : !    only print phonon BS for isppol 1: independent of electron spins
    3263         [ +  + ]:        3765 :      if (isppol==1) then
    3264                 :        3549 :        write (unit_bs,'(i5)', advance='no') indx
    3265         [ +  + ]:       17067 :        do ii=1, nbranch
    3266                 :       17067 :          write (unit_bs,'(E16.5)',advance='no') phfrq_tmp(ii)
    3267                 :             :        end do
    3268                 :        3549 :        write (unit_bs,*)
    3269                 :             :      end if
    3270                 :             : 
    3271                 :        3765 :      write (unit_lambda,'(i5)', advance='no') indx
    3272         [ +  + ]:       17931 :      do ii=1,nbranch
    3273                 :       14166 :        lambda(ii)=zero
    3274         [ +  + ]:       14166 :        if (abs(phfrq_tmp(ii)) > tol10) lambda(ii)=eigval(ii)/(pi*elph_ds%n0(isppol)*phfrq_tmp(ii)**2)
    3275                 :       17931 :        write (unit_lambda,'(es16.8)',advance='no')phfrq_tmp(ii),lambda(ii)
    3276                 :             :      end do
    3277         [ +  + ]:       17931 :      write (unit_lambda,'(es16.8)',advance='no') sum(lambda)
    3278                 :        3765 :      write (unit_lambda,*)
    3279                 :             : 
    3280                 :             : !    MG NOTE: I wrote a piece of code to output all these quantities using units
    3281                 :             : !    chosen by the user, maybe in version 5.2?
    3282                 :             : !    In this version the output of lambda(q,\nu) has been added
    3283                 :             : 
    3284                 :             : !    Output to the main output file, for first point in segment
    3285         [ +  + ]:        3765 :      if(indxprtqpt(ipoint)==1)then
    3286                 :         127 :        write(msg,'(a,a,3es16.6,a,i4,a,a)')ch10,&
    3287                 :         127 : &       ' Q point =',qpt(:),'   isppol = ',isppol,ch10,&
    3288                 :         254 : &       ' Mode number    Frequency (Ha)  Linewidth (Ha)  Lambda(q,n)'
    3289                 :         127 :        call wrtout(std_out,msg,'COLL')
    3290                 :         127 :        call wrtout(ab_out,msg,'COLL')
    3291         [ +  + ]:         616 :        do ii=1,nbranch
    3292                 :         489 :          write(msg,'(i8,es20.6,2es16.6)' )ii,phfrq_tmp(ii),eigval(ii),lambda(ii)
    3293                 :         489 :          call wrtout(std_out,msg,'COLL')
    3294                 :         616 :          call wrtout(ab_out,msg,'COLL')
    3295                 :             :        end do
    3296                 :             :      end if
    3297                 :             : 
    3298                 :             : !    find max/min phonon frequency along path chosen
    3299                 :             : !    presumed to be representative of full BZ to within 10 percent
    3300                 :        3765 :      elph_ds%omega_min = min(elph_ds%omega_min,1.1_dp*phfrq_tmp(1))
    3301                 :        3765 :      elph_ds%omega_max = max(elph_ds%omega_max,1.1_dp*phfrq_tmp(nbranch))
    3302                 :             : 
    3303                 :        3781 :      indx = indx+1
    3304                 :             :    end do !  end ipoint do
    3305                 :             : 
    3306                 :             : !  add blank lines to output files between sppol
    3307                 :          16 :    write(msg,'(a)' ) ''
    3308                 :          16 :    call wrtout(unit_lwd,msg,'COLL')
    3309                 :          16 :    call wrtout(unit_lambda,msg,'COLL')
    3310                 :          16 :    call wrtout(std_out,msg,'COLL')
    3311                 :          31 :    call wrtout(ab_out,msg,'COLL')
    3312                 :             :  end do ! isppol
    3313                 :             : 
    3314         [ -  + ]:          15 :  ABI_FREE(coskr)
    3315         [ -  + ]:          15 :  ABI_FREE(sinkr)
    3316                 :             : 
    3317                 :          15 :  close(unit=unit_lwd)
    3318                 :          15 :  close(unit=unit_bs)
    3319                 :          15 :  close(unit=unit_lambda)
    3320                 :             : 
    3321         [ -  + ]:          15 :  ABI_FREE(finepath)
    3322                 :          15 :  ABI_FREE(indxprtqpt)
    3323                 :             : 
    3324                 :          15 :  write(std_out,*) ' elph_linwid : omega_min, omega_max = ',elph_ds%omega_min, elph_ds%omega_max
    3325                 :             : 
    3326                 :             :  DBG_EXIT("COLL")
    3327                 :             : 
    3328                 :          15 : end subroutine mkph_linwid
    3329                 :             : !!***
    3330                 :             : 
    3331                 :             : !!****f* ABINIT/get_fs_bands
    3332                 :             : !!
    3333                 :             : !! NAME
    3334                 :             : !! get_fs_bands
    3335                 :             : !!
    3336                 :             : !! FUNCTION
    3337                 :             : !! This routine determines the bands which contribute to the Fermi surface
    3338                 :             : !!
    3339                 :             : !! INPUTS
    3340                 :             : !!  eigenGS = ground state eigenvalues
    3341                 :             : !!  hdr = header from input GS file
    3342                 :             : !!  ep_b_min, ep_b_max=A non-zero value is used to impose certain bands.
    3343                 :             : !!  fermie=Fermi level.
    3344                 :             : !!  eigenGS(hdr%nband(1),hdr%nkpt,hdr%nsppol)=Energies.
    3345                 :             : !!
    3346                 :             : !! OUTPUT
    3347                 :             : !!  minFSband,maxFSband=Minimun and maximum index for the bands that cross the Fermi level
    3348                 :             : !!  nkptirr=Number of irreducible points for which there exist at least one band that crosses the Fermi level.
    3349                 :             : !!
    3350                 :             : !! TODO
    3351                 :             : !!  1) Indeces and dimensions should should be spin dependent.
    3352                 :             : !!  2) In the present status of the code, all the k-points in the IBZ are used!
    3353                 :             : !!
    3354                 :             : !! SOURCE
    3355                 :             : 
    3356                 :          15 : subroutine get_fs_bands(eigenGS,hdr,fermie,ep_b_min,ep_b_max,minFSband,maxFSband,nkptirr)
    3357                 :             : 
    3358                 :             : !Arguments ------------------------------------
    3359                 :             : !scalars
    3360                 :             :  integer, intent(in) :: ep_b_min, ep_b_max
    3361                 :             :  integer,intent(out) :: minFSband,maxFSband,nkptirr
    3362                 :             :  real(dp),intent(in) :: fermie
    3363                 :             :  type(hdr_type),intent(in) :: hdr
    3364                 :             : !arrays
    3365                 :             :  real(dp),intent(in) :: eigenGS(hdr%nband(1),hdr%nkpt,hdr%nsppol)
    3366                 :             : 
    3367                 :             : !Local variables-------------------------------
    3368                 :             : !scalars
    3369                 :             :  integer :: iband,ikpt,isppol,nband
    3370                 :             :  real(dp) :: epsFS,gausstol,gaussig
    3371                 :             :  character(len=500) :: message
    3372                 :          30 :  integer :: kpt_phonflag(hdr%nkpt)
    3373                 :             : ! *************************************************************************
    3374                 :             : 
    3375                 :             : !supposes nband is equal for all kpts
    3376                 :          15 :  nband = hdr%nband(1)
    3377                 :             : 
    3378                 :             : !gausstol = minimum weight value for integration weights on FS
    3379                 :             : !should be set to reproduce DOS at Ef (Ref. PRB 34, 5065 [[cite:Lam1986]] p. 5067)
    3380                 :          15 :  gausstol = 1.0d-10
    3381                 :             : 
    3382                 :             : !use same band indices in both spin channels
    3383                 :          15 :  maxFSband=1
    3384                 :          15 :  minFSband=nband
    3385                 :             : 
    3386                 :             : !window of states around fermi Energy is contained in +/- epsFS
    3387                 :             : !should be adjusted to take into account a minimal but sufficient
    3388                 :             : !fraction of the kpoints: see the loop below.
    3389                 :             : !The 1000 is purely empirical!!!
    3390                 :             : !Should also take into account the density of kpoints.
    3391                 :             : !gaussig = width of gaussian energy window around fermi energy
    3392                 :             : !needed to get a good fraction of kpoints contributing to the FS
    3393                 :             : 
    3394   [ +  +  +  +  :       29166 :  gaussig = (maxval(eigenGS)-minval(eigenGS))/1000.0_dp
          +  +  +  +  +  
          -  -  +  -  -  
          +  +  +  +  +  
          +  +  +  +  -  
             -  +  -  - ]
    3395                 :             : 
    3396                 :          15 :  write (message,'(a,f11.8,2a)')' get_fs_bands : initial energy window = ',gaussig,ch10,&
    3397                 :          30 : & ' The window energy will be increased until the full k-grid is inside the range'
    3398                 :          15 :  call wrtout(std_out,message,'COLL')
    3399                 :             : 
    3400                 :             : !NOTE: could loop back to here and change gaussig until we have
    3401                 :             : !a certain fraction of the kpoints in the FS region...
    3402                 :          15 :  nkptirr = 0
    3403                 :             : 
    3404                 :             : !Do not use restricted fermi surface: include all kpts -> one
    3405         [ +  + ]:        1155 :  do while (nkptirr < hdr%nkpt)
    3406                 :        1140 :    gaussig = gaussig*1.05_dp
    3407                 :             : 
    3408                 :             : !  we must take into account kpoints with states within epsFS:
    3409                 :        1140 :    epsFS = gaussig*sqrt(log(one/(gaussig*sqrt(pi)*gausstol)))
    3410                 :             : 
    3411                 :             : !  check if there are eigenvalues close to the Fermi surface
    3412                 :             : !  (less than epsFS from it)
    3413         [ +  + ]:      106564 :    kpt_phonflag(:) = 0
    3414                 :             : 
    3415                 :             : !  do for each sppol channel
    3416         [ +  + ]:        2308 :    do isppol=1,hdr%nsppol
    3417         [ +  + ]:      107956 :      do ikpt=1,hdr%nkpt
    3418         [ +  + ]:     1162848 :        do iband=1,nband
    3419         [ +  + ]:     1161680 :          if (abs(eigenGS(iband,ikpt,isppol) - fermie) < epsFS) then
    3420                 :      135941 :            kpt_phonflag(ikpt) = 1
    3421         [ +  + ]:      135941 :            if (iband > maxFSband) maxFSband = iband
    3422         [ +  + ]:      135941 :            if (iband < minFSband) minFSband = iband
    3423                 :             :          end if
    3424                 :             :        end do
    3425                 :             :      end do
    3426                 :             :    end do ! isppol
    3427                 :             : 
    3428                 :             : !  if user imposed certain bands for e-p, make sure they are kept
    3429   [ +  +  -  + ]:        1140 :    if (ep_b_min /= 0 .and. ep_b_min < minFSband) then
    3430                 :           0 :      minFSband = ep_b_min
    3431                 :             :    end if
    3432   [ +  +  +  + ]:        1140 :    if (ep_b_max /= 0 .and. ep_b_max > maxFSband) then
    3433                 :           1 :      maxFSband = ep_b_max
    3434                 :             :    end if
    3435                 :             : 
    3436                 :             : !  number of irreducible kpoints (by all sym) contributing to the Fermi surface (to be completed by symops).
    3437         [ +  + ]:      106579 :    nkptirr = sum(kpt_phonflag(:))
    3438                 :             :  end do
    3439                 :             : 
    3440                 :          15 :  write(std_out,*) ' Energy window around Fermi level= ',epsFS,' nkptirr= ',nkptirr
    3441                 :             : 
    3442                 :          15 : end subroutine get_fs_bands
    3443                 :             : !!***
    3444                 :             : 
    3445                 :             : !!****f* ABINIT/get_all_gkk2
    3446                 :             : !! NAME
    3447                 :             : !! get_all_gkk2
    3448                 :             : !!
    3449                 :             : !! FUNCTION
    3450                 :             : !! This routine determines where to store gkk2 matrix elements (disk or RAM)
    3451                 :             : !! and calls interpolate_gkk to calculate them.
    3452                 :             : !! This is the most time consuming step.
    3453                 :             : !!
    3454                 :             : !! INPUTS
    3455                 :             : !!   acell = lengths of unit cell vectors
    3456                 :             : !!   amu = masses of atoms
    3457                 :             : !!   atmfrc = atomic force constants
    3458                 :             : !!   dielt = dielectric tensor
    3459                 :             : !!   dipdip = dipole-dipole contribution flag
    3460                 :             : !!   dyewq0 =
    3461                 :             : !!   elph_ds = datastructure for elphon data and dimensions
    3462                 :             : !!   kptirr_phon = irreducible set of fermi-surface kpoints
    3463                 :             : !!   kpt_phon = full set of fermi-surface kpoints
    3464                 :             : !!   ftwghtgkk = weights for FT of matrix elements
    3465                 :             : !!   gmet = metric in reciprocal space
    3466                 :             : !!   indsym = indirect mapping of atoms under symops
    3467                 :             : !!   mpert = maximum number of perturbations
    3468                 :             : !!   msym = maximum number of symmetries (usually nsym)
    3469                 :             : !!   nsym = number of symmetries
    3470                 :             : !!   ntypat = number of types of atoms
    3471                 :             : !!   onegkksize = size of one gkk record, in bytes
    3472                 :             : !!   rmet = real-space metric
    3473                 :             : !!   rprim = unit cell lattice vectors (dimensionless)
    3474                 :             : !!   rprimd = real-space unit-cell lattice vectors
    3475                 :             : !!   rpt = points in real space for FT, in canonical coordinates
    3476                 :             : !!   symrel = symmetry operations in reduced real space
    3477                 :             : !!   trans = Atomic translations : xred = rcan + trans
    3478                 :             : !!   typat = array of types of atoms
    3479                 :             : !!   ucvol = unit cell volume
    3480                 :             : !!   xred = reduced coordinates of atoms
    3481                 :             : !!   zeff = Born effective charges
    3482                 :             : !!
    3483                 :             : !! OUTPUT
    3484                 :             : !!   elph_ds = calculated |gkk|^2 are in elph_ds%gkk2
    3485                 :             : !!
    3486                 :             : !! SOURCE
    3487                 :             : 
    3488                 :             : subroutine get_all_gkk2(crystal,ifc,elph_ds,kptirr_phon,kpt_phon)
    3489                 :             : 
    3490                 :             : !Arguments ------------------------------------
    3491                 :             : !scalars
    3492                 :             :  type(crystal_t),intent(in) :: crystal
    3493                 :             :  type(ifc_type),intent(in) :: ifc
    3494                 :             :  type(elph_type),intent(inout) :: elph_ds
    3495                 :             : !arrays
    3496                 :             :  real(dp),intent(in) :: kpt_phon(3,elph_ds%k_phon%nkpt)
    3497                 :             :  real(dp),intent(in) :: kptirr_phon(3,elph_ds%k_phon%nkptirr)
    3498                 :             : 
    3499                 :             : !Local variables-------------------------------
    3500                 :             : !scalars
    3501                 :             :  integer :: iost,onediaggkksize,sz1,sz2,sz3,sz4
    3502                 :             :  real(dp) :: realdp_ex
    3503                 :             :  !character(len=500) :: msg
    3504                 :             : ! *************************************************************************
    3505                 :             : 
    3506                 :             :  if (elph_ds%nsppol /= 1) then
    3507                 :             :    ABI_ERROR('get_all_gkk2: nsppol>1 not coded yet!')
    3508                 :             :  end if
    3509                 :             : 
    3510                 :             :  onediaggkksize = elph_ds%nbranch*elph_ds%k_phon%nkpt*kind(realdp_ex)
    3511                 :             : 
    3512                 :             :  elph_ds%unit_gkk2 = 37
    3513                 :             :  if (elph_ds%gkk2write == 0) then
    3514                 :             :    write(std_out,*) 'get_all_gkk2 : keep gkk2 in memory. Size = ',&
    3515                 :             : &   4.0*dble(elph_ds%k_phon%nkpt)*dble(onediaggkksize)/&
    3516                 :             : &   1024.0_dp/1024.0_dp, " Mb"
    3517                 :             :    sz1=elph_ds%nbranch
    3518                 :             :    sz2=elph_ds%ngkkband
    3519                 :             :    sz3=elph_ds%ngkkband
    3520                 :             :    sz4=elph_ds%k_phon%nkpt
    3521                 :             :    ABI_MALLOC(elph_ds%gkk2,(sz1,sz2,sz3,sz4,elph_ds%k_phon%nkpt,1))
    3522                 :             :    elph_ds%gkk2(:,:,:,:,:,:) = zero
    3523                 :             : 
    3524                 :             :  else if (elph_ds%gkk2write == 1) then
    3525                 :             :    write(std_out,*) 'get_all_gkk2 : About to open gkk2 file : '
    3526                 :             :    write(std_out,*) elph_ds%unit_gkk2,onediaggkksize
    3527                 :             :    open (unit=elph_ds%unit_gkk2,file='gkk2file',access='direct',&
    3528                 :             : &   recl=onediaggkksize,form='unformatted',status='new',iostat=iost)
    3529                 :             :    if (iost /= 0) then
    3530                 :             :      ABI_ERROR('error opening gkk2file as new')
    3531                 :             :    end if
    3532                 :             : !  rewind (elph_ds%unit_gkk2)
    3533                 :             :    write(std_out,*) 'get_all_gkk2 : disk file with gkk^2 created'
    3534                 :             :    write(std_out,*) '  calculate from real space gkk and phonon modes'
    3535                 :             :    write(std_out,*) '  gkk2write = 1 is forced: can take a lot of time! '
    3536                 :             :    write(std_out,*) ' size = ', 4.0*dble(onediaggkksize)*dble(elph_ds%k_phon%nkpt)/&
    3537                 :             : &   1024.0_dp/1024.0_dp, ' Mb'
    3538                 :             :  else
    3539                 :             :    ABI_ERROR('bad value of gkk2write')
    3540                 :             :  end if
    3541                 :             : 
    3542                 :             : !here do the actual calculation of |g_kk|^2
    3543                 :             :  ABI_ERROR("MGNOTE: interpolate_gkk is broken")
    3544                 :             :  ABI_UNUSED(kptirr_phon(1,1))
    3545                 :             :  call interpolate_gkk (crystal,ifc,elph_ds,kpt_phon)
    3546                 :             : 
    3547                 :             :  !MG: This was the old coding in version 7.6.2:
    3548                 :             : 
    3549                 :             : ! call interpolate_gkk (elph_ds,kptirr_phon,kpt_phon,natom,nrpt,phon_ds,rcan,wghatm)
    3550                 :             : !
    3551                 :             : ! and interpolate_gkk had the prototype:
    3552                 :             : !
    3553                 :             : !subroutine interpolate_gkk(elph_ds,kpt_phon,gprim,natom,nrpt,phon_ds,rpt,wghatm)
    3554                 :             : 
    3555                 :             : ! hence we were associating kpt_phon to gprim!
    3556                 :             : 
    3557                 :             : end subroutine get_all_gkk2
    3558                 :             : !!***
    3559                 :             : 
    3560                 :             : !!****f* ABINIT/interpolate_gkk
    3561                 :             : !! NAME
    3562                 :             : !! interpolate_gkk
    3563                 :             : !!
    3564                 :             : !! FUNCTION
    3565                 :             : !! This routine interpolates the gkk matrices for all q vectors
    3566                 :             : !! between points on the full kpt_phon grid.
    3567                 :             : !!
    3568                 :             : !! INPUTS
    3569                 :             : !!   elph_ds = elphon datastructure with data and dimensions
    3570                 :             : !!   kpt_phon = coordinates of all kpoints close to the FS
    3571                 :             : !!
    3572                 :             : !! OUTPUT
    3573                 :             : !!   elph_ds = modified gkq
    3574                 :             : !!
    3575                 :             : !! NOTES
    3576                 :             : !!  inspired to some extent by epcouple.f from the DecAFT package by J. Kay Dewhurst
    3577                 :             : !!  most inputs taken from mkifc.f
    3578                 :             : !!  in anaddb set ifcflag 1 such that the IFC are calculated in atmfrc prior to calling elphon
    3579                 :             : !!
    3580                 :             : !! SOURCE
    3581                 :             : 
    3582                 :             : subroutine interpolate_gkk(crystal,ifc,elph_ds,kpt_phon)
    3583                 :             : 
    3584                 :             : !Arguments ------------------------------------
    3585                 :             : !scalars
    3586                 :             :  type(crystal_t),intent(in) :: crystal
    3587                 :             :  type(ifc_type),intent(in) :: ifc
    3588                 :             :  type(elph_type),intent(inout) :: elph_ds
    3589                 :             : !arrays
    3590                 :             :  real(dp),intent(in) :: kpt_phon(3,elph_ds%k_phon%nkpt)
    3591                 :             : 
    3592                 :             : !Local variables-------------------------------
    3593                 :             :   ! output variables for dfpt_phfrq
    3594                 :             : ! variables for zhpev
    3595                 :             : ! variables for phonon interpolation
    3596                 :             : !scalars
    3597                 :             :  integer :: i1,i2,ikpt_phon2,iFSqpt,ib1,ib2,ier,ii
    3598                 :             :  integer :: iost,isppol,qtor,natom
    3599                 :             :  integer :: sz1,sz2,sz3,sz4,unit_gkkp
    3600                 :             :  real(dp) :: qphnrm,res
    3601                 :             :  !character(len=500) :: msg
    3602                 :             : !arrays
    3603                 :             :  real(dp) :: gprim(3,3)
    3604                 :             :  real(dp) :: displ(2,elph_ds%nbranch,elph_ds%nbranch),eigval(3*crystal%natom)
    3605                 :             :  real(dp) :: eigvec(3*3*crystal%natom*3*crystal%natom)
    3606                 :             :  real(dp) :: pheigvec(2*elph_ds%nbranch*elph_ds%nbranch)
    3607                 :             :  real(dp) :: phfrq_tmp(elph_ds%nbranch),qphon(3),redkpt(3)
    3608                 :             :  real(dp),allocatable :: gkk2_diag_tmp(:,:,:,:),gkk2_tmp(:,:,:,:,:,:,:), matrx(:,:),zhpev1(:,:), zhpev2(:)
    3609                 :             : ! *************************************************************************
    3610                 :             : 
    3611                 :             : !NOTE: mjv 18/5/2008 reverted to old style of ftgkk with all kpt done together.
    3612                 :             : !may want to modify this later to use the new cleaner format with 1 FT at a
    3613                 :             : !time.
    3614                 :             : !
    3615                 :             :  write(std_out,*) 'interpolate_gkk : enter'
    3616                 :             : 
    3617                 :             :  natom = crystal%natom
    3618                 :             :  gprim = ifc%gprim
    3619                 :             : 
    3620                 :             :  if (elph_ds%nsppol /= 1) then
    3621                 :             :    ABI_ERROR("interpolate_gkk not coded with nsppol>1 yet")
    3622                 :             :  end if
    3623                 :             :  isppol = 1
    3624                 :             : 
    3625                 :             : 
    3626                 :             : !------------------------------------------------------
    3627                 :             : !complete dynamical matrices for all qpts between points
    3628                 :             : !on full kpt grid (interpolation from IFC)
    3629                 :             : !------------------------------------------------------
    3630                 :             : 
    3631                 :             :  sz1=elph_ds%ngkkband;sz2=elph_ds%nbranch
    3632                 :             :  sz3=elph_ds%k_phon%nkpt;sz4=elph_ds%nFSband
    3633                 :             : !allocate (gkk_tmp(2,sz1,sz1,sz2,sz2,1,1))
    3634                 :             : !DEBUG
    3635                 :             : !allocate (gkk_tmp_full(2,sz1,sz1,sz2,elph_ds%nFSband,sz3))
    3636                 :             : !allocate (gkk_tmp_full(2,s2,sz4,sz4,sz3))
    3637                 :             : !ENDDEBUG
    3638                 :             :  ABI_MALLOC(gkk2_tmp,(2,sz1,sz1,sz2,sz2,sz3,1))
    3639                 :             :  ABI_MALLOC(gkk2_diag_tmp,(sz1,sz1,sz2,sz3))
    3640                 :             :  ABI_MALLOC(zhpev1,(2,2*3*natom-1))
    3641                 :             :  ABI_MALLOC(zhpev2,(3*3*natom-2))
    3642                 :             :  ABI_MALLOC(matrx,(2,(3*natom*(3*natom+1))/2))
    3643                 :             : 
    3644                 :             :  qphnrm = one
    3645                 :             : !in this part use the inverse Fourier transform to get 1 (arbitrary) qpt at a
    3646                 :             : !time
    3647                 :             :  ii = 0
    3648                 :             :  qtor = 0
    3649                 :             :  unit_gkkp = 150
    3650                 :             :  open (unit=unit_gkkp,file='gkkp_file_ascii',form='formatted',status='unknown',iostat=iost)
    3651                 :             :  if (iost /= 0) then
    3652                 :             :    ABI_ERROR("error opening gkkpfile as new")
    3653                 :             :  end if
    3654                 :             : 
    3655                 :             : !loop over all FS pairs.
    3656                 :             : !do ikpt1=1,elph_ds%k_phon%nkptirr
    3657                 :             : !do iFSqpt=1,elph_ds%k_phon%nkpt
    3658                 :             : 
    3659                 :             : !
    3660                 :             : !this should run through the sparse mesh of 2x2x2 kpoints
    3661                 :             : !
    3662                 :             :  do iFSqpt=1,elph_ds%k_phon%nkpt
    3663                 :             :    res = 2.0_dp*(kpt_phon(1,iFSqpt)+one)
    3664                 :             :    if (abs(res-int(res)) > tol10) cycle
    3665                 :             :    res = 2.0_dp*(kpt_phon(2,iFSqpt)+one)
    3666                 :             :    if (abs(res-int(res)) > tol10) cycle
    3667                 :             :    res = 2.0_dp*(kpt_phon(3,iFSqpt)+one)
    3668                 :             :    if (abs(res-int(res)) > tol10) cycle
    3669                 :             : 
    3670                 :             : !  do ikpt1=1,1
    3671                 :             : !
    3672                 :             : !  NOTE: should be very easy to parallelize!
    3673                 :             : !
    3674                 :             : !  write(std_out,*) ' interpolate_gkk : ikpt1 = ',ikpt1, ' / ', elph_ds%k_phon%nkptirr
    3675                 :             :    write(std_out,*) ' interpolate_gkk : ikpt1 = ',iFSqpt, ' / ', elph_ds%k_phon%nkpt
    3676                 :             : 
    3677                 :             : !  DEBUG
    3678                 :             : !  write(std_out,*) ' interpolate_gkk : Warning debug version'
    3679                 :             : !  cycle
    3680                 :             : !  ENDDEBUG
    3681                 :             : 
    3682                 :             :    gkk2_tmp(:,:,:,:,:,:,:) = zero
    3683                 :             : 
    3684                 :             : !  qphon = 1 - 2    ie.  1 = 2+qphon
    3685                 :             :    qphon(:) = kpt_phon(:,iFSqpt)
    3686                 :             : 
    3687                 :             : !  shouldnt be necessary here, but oh well
    3688                 :             :    call wrap2_pmhalf(qphon(1),redkpt(1),res)
    3689                 :             :    call wrap2_pmhalf(qphon(2),redkpt(2),res)
    3690                 :             :    call wrap2_pmhalf(qphon(3),redkpt(3),res)
    3691                 :             : 
    3692                 :             :    qphon(:) = redkpt(:)
    3693                 :             :    redkpt(1) = qphon(1)*gprim(1,1)+qphon(2)*gprim(1,2)+qphon(3)*gprim(1,3)
    3694                 :             :    redkpt(2) = qphon(1)*gprim(2,1)+qphon(2)*gprim(2,2)+qphon(3)*gprim(2,3)
    3695                 :             :    redkpt(3) = qphon(1)*gprim(3,1)+qphon(2)*gprim(3,2)+qphon(3)*gprim(3,3)
    3696                 :             :    write (unit_gkkp,*) 'qp= ', redkpt
    3697                 :             : 
    3698                 :             :    call ifc%fourq(crystal,qphon,phfrq_tmp,displ,out_eigvec=pheigvec)
    3699                 :             :    write (unit_gkkp,*) phfrq_tmp(:)*Ha_cmm1
    3700                 :             : 
    3701                 :             :    ii = ii+1
    3702                 :             : !  if(ii > 0 .and. ii < 1000) write(std_out,'(a,i5,3E16.6,2x)') &
    3703                 :             : !  &   ' wrote phfrq_tmp for time ', ii, phfrq_tmp
    3704                 :             : !  end if
    3705                 :             : 
    3706                 :             : !  phonon eigenvectors are in eigvec
    3707                 :             : !  real and imaginary parts
    3708                 :             : !  phonon displacements = eigvec/sqrt(M_i) are in displ
    3709                 :             : !  real and imaginary parts
    3710                 :             : 
    3711                 :             : !  DEBUG
    3712                 :             : !  test: uniform phonon frequency
    3713                 :             : !  phfrq_tmp(:) = 0.0001_dp
    3714                 :             : !  ENDDEBUG
    3715                 :             : 
    3716                 :             : !  FT gamma matrices for all kpt_phon points, and
    3717                 :             : !  for qpoint = qphon(:) = kpt_phon(ikpt_phon)
    3718                 :             : 
    3719                 :             :    call ftgkk(ifc%wghatm,gkk2_tmp,elph_ds%gkk_rpt,elph_ds%gkqwrite,&
    3720                 :             : &   elph_ds%gkk_rptwrite,gprim,1,&
    3721                 :             : &   natom,elph_ds%k_phon%nkpt,elph_ds%ngkkband,elph_ds%k_phon%nkpt,1,ifc%nrpt,elph_ds%nsppol,&
    3722                 :             : &   qtor,ifc%rpt,qphon,elph_ds%unit_gkk_rpt,elph_ds%unitgkq)
    3723                 :             : 
    3724                 :             : !  NOTE: Normally the eigenvectors of the gkk2_tmp should be the same as eigvec
    3725                 :             : 
    3726                 :             : !  Diagonalize gamma matrices at qpoint (complex matrix) for all kpt_phon.
    3727                 :             : !  Copied from dfpt_phfrq
    3728                 :             :    do ikpt_phon2=1,elph_ds%k_phon%nkpt
    3729                 :             :      res = 8.0_dp*(kpt_phon(1,ikpt_phon2)+one)
    3730                 :             :      if (abs(res-int(res)) > tol10) cycle
    3731                 :             :      res = 8.0_dp*(kpt_phon(2,ikpt_phon2)+one)
    3732                 :             :      if (abs(res-int(res)) > tol10) cycle
    3733                 :             :      res = 8.0_dp*(kpt_phon(3,ikpt_phon2)+one)
    3734                 :             :      if (abs(res-int(res)) > tol10) cycle
    3735                 :             : 
    3736                 :             :      write (unit_gkkp,*) 'kp= ', kpt_phon(:,ikpt_phon2)
    3737                 :             : 
    3738                 :             :      do ib1=1,elph_ds%ngkkband
    3739                 :             :        do ib2=1,elph_ds%ngkkband
    3740                 :             :          ier=0
    3741                 :             :          ii=1
    3742                 :             :          do i2=1,3*natom
    3743                 :             :            do i1=1,i2
    3744                 :             :              matrx(1,ii)=gkk2_tmp(1,ib1,ib2,i1,i2,ikpt_phon2,1)
    3745                 :             :              matrx(2,ii)=gkk2_tmp(2,ib1,ib2,i1,i2,ikpt_phon2,1)
    3746                 :             :              ii=ii+1
    3747                 :             :            end do
    3748                 :             :          end do
    3749                 :             :          call ZHPEV ('N','U',3*natom,matrx,eigval,eigvec,3*natom,zhpev1,&
    3750                 :             : &         zhpev2,ier)
    3751                 :             : 
    3752                 :             :          gkk2_diag_tmp(ib2,ib1,:,ikpt_phon2) = eigval(:)
    3753                 :             :          do i1=1,3*natom
    3754                 :             :            write (unit_gkkp,*) elph_ds%minFSband-1+ib1,elph_ds%minFSband-1+ib2,i1,&
    3755                 :             : &           eigval(i1)
    3756                 :             :          end do
    3757                 :             :        end do
    3758                 :             :      end do
    3759                 :             :    end do
    3760                 :             : 
    3761                 :             :    if (elph_ds%gkk2write == 1) then
    3762                 :             :      write(std_out,*) 'WARNING COMMENTED WRITE TO BINARY FILE!!!'
    3763                 :             : !    write (elph_ds%unit_gkk2,REC=iFSqpt) gkk2_diag_tmp(:,:,:,:)
    3764                 :             :      write(std_out,'(a,i4,4(2E16.6,2x))') ' gkk2 loop ', &
    3765                 :             : &     iFSqpt,gkk2_diag_tmp(1,1,:,1:2),gkk2_diag_tmp(1,1,:,elph_ds%k_phon%nkpt-1:elph_ds%k_phon%nkpt)
    3766                 :             : !    &    ikpt1,gkk2_tmp(:,1,1,1,1,1:2),gkk2_tmp(:,1,1,elph_ds%k_phon%nkpt-1:elph_ds%k_phon%nkpt)
    3767                 :             :    else if (elph_ds%gkk2write == 0) then
    3768                 :             :      elph_ds%gkk2(:,:,:,:,iFSqpt,isppol) = gkk2_diag_tmp(:,:,:,:)
    3769                 :             : !    elph_ds%gkk2(:,:,:,:,ikpt1) = gkk2_tmp
    3770                 :             :      write(std_out,*) ' interpolate_gkk : gkk2(b=1,b=1,:,kpt=1,iFSqpt) = '
    3771                 :             :      write(std_out,*) gkk2_diag_tmp(1,1,:,1)
    3772                 :             :    end if
    3773                 :             : 
    3774                 :             :  end do
    3775                 :             : !end do on iFSqpt
    3776                 :             : 
    3777                 :             :  ABI_FREE(matrx)
    3778                 :             :  ABI_FREE(zhpev1)
    3779                 :             :  ABI_FREE(zhpev2)
    3780                 :             : 
    3781                 :             : end subroutine interpolate_gkk
    3782                 :             : !!***
    3783                 :             : 
    3784                 :             : !!****f* ABINIT/get_all_gkq
    3785                 :             : !!
    3786                 :             : !! NAME
    3787                 :             : !! get_all_gkq
    3788                 :             : !!
    3789                 :             : !! FUNCTION
    3790                 :             : !! This routine determines what to do with the initial qspace
    3791                 :             : !!   matrix elements of the electron phonon coupling (to disk or in memory),
    3792                 :             : !!   then reads those given in the gkk file and completes them
    3793                 :             : !!   (for kpts, then perturbations)
    3794                 :             : !!   01/2010: removed completion on qpoints here (MJV)
    3795                 :             : !!
    3796                 :             : !! INPUTS
    3797                 :             : !!   elph_ds = elphon datastructure with data and dimensions
    3798                 :             : !!   Cryst<crystal_t>=Info on the unit cell and on its symmetries.
    3799                 :             : !!   Ifc<ifc_type>=Object containing the interatomic force constants.
    3800                 :             : !!   Bst<ebands_t>=GS energies, occupancies and Fermi level.
    3801                 :             : !!   FSfullpqtofull = mapping of k+q to another k
    3802                 :             : !!   kphon_full2full = mapping of FS kpoints under symops
    3803                 :             : !!   kpt_phon = fermi surface kpoints
    3804                 :             : !!   %k_phon%wtk = integration weights for bands and kpoints near the FS
    3805                 :             : !!   gkk_flag = flag to
    3806                 :             : !!   nband = number of bands
    3807                 :             : !!   n1wf = number of file headers from perturbation calculations
    3808                 :             : !!      which are present in the initial gkk input file.
    3809                 :             : !!   onegkksize = size of one record of the new gkk output file, in bytes
    3810                 :             : !!   qpttoqpt = mapping of qpoints onto each other under symmetries
    3811                 :             : !!   unitgkk = fortran unit for initial gkk input file
    3812                 :             : !!   xred = reduced coordinates of atoms
    3813                 :             : !!
    3814                 :             : !! OUTPUT
    3815                 :             : !!   elph_ds%gkq = recip space elphon matrix elements.
    3816                 :             : !!
    3817                 :             : !! SOURCE
    3818                 :             : 
    3819                 :          15 : subroutine get_all_gkq (elph_ds,Cryst,ifc,Bst,FSfullpqtofull,nband,n1wf,onegkksize,&
    3820                 :          15 : &    qpttoqpt,ep_prt_yambo,unitgkk,ifltransport)
    3821                 :             : 
    3822                 :             : !Arguments ------------------------------------
    3823                 :             : !scalars
    3824                 :             :  integer,intent(in) :: n1wf,nband,onegkksize,unitgkk,ep_prt_yambo,ifltransport
    3825                 :             :  type(crystal_t),intent(in) :: Cryst
    3826                 :             :  type(ifc_type),intent(in) :: ifc
    3827                 :             :  type(ebands_t),intent(in) :: Bst
    3828                 :             :  type(elph_type),intent(inout) :: elph_ds
    3829                 :             : !arrays
    3830                 :             :  integer,intent(in) :: FSfullpqtofull(elph_ds%k_phon%nkpt,elph_ds%nqpt_full)
    3831                 :             :  integer,intent(in) :: qpttoqpt(2,Cryst%nsym,elph_ds%nqpt_full)
    3832                 :             : 
    3833                 :             : !Local variables-------------------------------
    3834                 :             : !scalars
    3835                 :             :  integer :: iost,ierr,me,sz2,sz3,sz4,sz5,sz6
    3836                 :             :  character(len=10) :: procnum
    3837                 :             :  character(len=500) :: message
    3838                 :             :  character(len=fnlen) :: fname
    3839                 :             : !arrays
    3840                 :          15 :  integer,allocatable :: gkk_flag(:,:,:,:,:)
    3841                 :             : ! *************************************************************************
    3842                 :             : 
    3843                 :             : !attribute file unit number
    3844                 :          15 :  elph_ds%unitgkq = get_unit()
    3845                 :             : 
    3846                 :             : !============================================
    3847                 :             : !save gkk for all qpts in memory or to disk
    3848                 :             : !============================================
    3849                 :             : 
    3850                 :             : !DEBUG
    3851                 :             : !write(std_out,*) ' 4 bytes / ??'
    3852                 :             : !write(std_out,*) ' kind(real) = ', kind(one)
    3853                 :             : !write(std_out,*) ' elph_ds%ngkkband = ', elph_ds%ngkkband, '^2'
    3854                 :             : !write(std_out,*) ' elph_ds%nbranch = ', elph_ds%nbranch, '^2'
    3855                 :             : !write(std_out,*) ' elph_ds%k_phon%nkpt = ', elph_ds%k_phon%nkpt
    3856                 :             : !write(std_out,*) ' elph_ds%nsppol = ', elph_ds%nsppol
    3857                 :             : !write(std_out,*) ' elph_ds%nqptirred ', elph_ds%nqptirred
    3858                 :             : !ENDDEBUG
    3859                 :             : 
    3860                 :             :  write(message,'(a,f14.4,a)')&
    3861                 :          15 : & ' get_all_gkq : gkq file/array size = ',&
    3862                 :          30 :  4.0*dble(onegkksize)*dble(elph_ds%k_phon%my_nkpt)*dble(elph_ds%nqptirred)/1024.0_dp/1024.0_dp/1024.0_dp,' Gb'
    3863                 :          15 :  call wrtout(std_out,message,'COLL')
    3864                 :             : 
    3865         [ +  + ]:          15 :  if (elph_ds%gkqwrite == 0) then !calculate gkk(q) keeping all in memory
    3866                 :             : 
    3867                 :          14 :    call wrtout(std_out,' get_all_gkq : keep gkk(q) in memory ','COLL')
    3868                 :             : 
    3869                 :          14 :    sz2=elph_ds%ngkkband*elph_ds%ngkkband
    3870                 :          14 :    sz3=elph_ds%nbranch*elph_ds%nbranch
    3871                 :          14 :    sz4=elph_ds%k_phon%my_nkpt
    3872                 :          14 :    sz5=elph_ds%nsppol
    3873         [ -  + ]:          14 :    if (ifltransport == 3) then
    3874                 :           0 :      sz6=elph_ds%nqpt_full
    3875                 :             :    else
    3876                 :          14 :      sz6=elph_ds%nqptirred
    3877                 :             :    end if
    3878   [ -  +  +  -  :          98 :    ABI_MALLOC_OR_DIE(elph_ds%gkk_qpt,(2,sz2,sz3,sz4,sz5,sz6), ierr)
          -  +  +  -  -  
          +  +  -  -  +  
          +  -  -  +  +  
          -  +  -  +  -  
          +  -  +  -  -  
             +  +  -  -  
                      + ]
    3879                 :             : 
    3880   [ +  +  +  +  :     4588187 :    elph_ds%gkk_qpt = zero
          +  +  +  +  +  
                +  +  + ]
    3881                 :             : 
    3882         [ +  - ]:           1 :  else if (elph_ds%gkqwrite == 1) then !calculate gkk(q) and write to file
    3883                 :           1 :    me = xmpi_comm_rank(xmpi_world)
    3884                 :           1 :    call int2char4(me,procnum)
    3885         [ -  + ]:           1 :    ABI_CHECK((procnum(1:1)/='#'),'Bug: string length too short!')
    3886         [ +  - ]:           1 :    fname=trim(elph_ds%elph_base_name) // "_P" // trim(procnum) // '_GKKQ'
    3887                 :             : 
    3888                 :             :    iost=open_file(file=fname,iomsg=message,newunit=elph_ds%unitgkq,access='direct',&
    3889                 :           1 : &   recl=onegkksize,form='unformatted')
    3890         [ -  + ]:           1 :    if (iost /= 0) then
    3891                 :           0 :      write (message,'(2a)')' get_all_gkq : ERROR- opening file ',trim(fname)
    3892                 :           0 :      ABI_ERROR(message)
    3893                 :             :    end if
    3894                 :             : 
    3895                 :             :    write (message,'(5a)')&
    3896                 :           1 : &   ' get_all_gkq : gkq matrix elements  will be written to file : ',trim(fname),ch10,&
    3897                 :           2 : &   ' Nothing is in files yet',ch10
    3898                 :           1 :    call wrtout(std_out,message,'COLL')
    3899                 :             : 
    3900                 :             :  else
    3901                 :           0 :    write(message,'(a,i0)')' gkqwrite must be 0 or 1 while it is : ',elph_ds%gkqwrite
    3902                 :           0 :    ABI_BUG(message)
    3903                 :             :  end if !if gkqwrite
    3904                 :             : 
    3905                 :             : !=====================================================
    3906                 :             : !read in g_kk matrix elements for all bands, kpoints,
    3907                 :             : !and calculated qpoints
    3908                 :             : !=====================================================
    3909                 :          15 :  call wrtout(std_out,' get_all_gkq : calling read_gkk to read in the g_kk matrix elements',"COLL")
    3910                 :             : 
    3911                 :          15 :  sz2=elph_ds%nbranch;sz3=elph_ds%k_phon%my_nkpt
    3912                 :          15 :  sz4=elph_ds%nsppol;sz5=elph_ds%nqpt_full
    3913   [ -  +  +  -  :         105 :  ABI_MALLOC_OR_DIE(gkk_flag,(sz2,sz2,sz3,sz4,sz5), ierr)
          -  +  +  -  -  
          +  +  -  -  +  
          +  -  -  +  +  
          -  +  -  +  -  
          +  -  -  +  -  
                      + ]
    3914                 :             : 
    3915                 :          15 :  call read_gkk(elph_ds,Cryst,ifc,Bst,FSfullpqtofull,gkk_flag,n1wf,nband,ep_prt_yambo,unitgkk)
    3916                 :             : 
    3917                 :             : !if (elph_ds%symgkq ==1) then
    3918                 :             : !MJV 01/2010 removed the completion on qpt here: it should be done after FS integration
    3919                 :             : !so that everything is lighter in memory etc... (only irred qpt)
    3920                 :             : ! if (0==1) then
    3921         [ -  + ]:          15 :  if (ifltransport == 3) then !  bxu, complete gkk is necessary
    3922                 :             : 
    3923                 :             : !  ==============================================================
    3924                 :             : !  complete gkk matrices for other qpoints on the full grid qpt_full
    3925                 :             : !  inspired and cannibalized from symdm9.f
    3926                 :             : !  FIXME: should add the possibility to copy over to other qpoints,
    3927                 :             : !  without full symmetrization, for testing purposes.
    3928                 :             : !  ==============================================================
    3929                 :             : 
    3930                 :           0 :    write(message,'(4a)')ch10,&
    3931                 :           0 : &   ' get_all_gkq : calling complete_gkk to complete ',ch10,&
    3932                 :           0 : &   ' gkk matrices for other qpoints on the full grid'
    3933                 :           0 :    call wrtout(std_out,message,'COLL')
    3934                 :             : 
    3935                 :             :    call complete_gkk(elph_ds,gkk_flag,Cryst%gprimd,Cryst%indsym,&
    3936                 :           0 : &   Cryst%natom,Cryst%nsym,qpttoqpt,Cryst%rprimd,Cryst%symrec,Cryst%symrel)
    3937                 :             : 
    3938                 :           0 :    call wrtout(std_out,' get_all_gkq : out of complete_gkk','COLL')
    3939                 :             : 
    3940                 :             :  end if !symgkq
    3941                 :             : 
    3942                 :             : !TODO Do we need gkk_flag in elphon?
    3943         [ -  + ]:          15 :  ABI_FREE(gkk_flag)
    3944                 :             : 
    3945                 :          15 : end subroutine get_all_gkq
    3946                 :             : !!***
    3947                 :             : 
    3948                 :             : !!****f* ABINIT/get_all_gkr
    3949                 :             : !! NAME
    3950                 :             : !! get_all_gkr
    3951                 :             : !!
    3952                 :             : !! FUNCTION
    3953                 :             : !! This routine determines what to do with the rspace
    3954                 :             : !! matrix elements of the el phon coupling (to disk or in memory),
    3955                 :             : !! then reads those given in the gkq file and Fourier Transforms them
    3956                 :             : !!
    3957                 :             : !! INPUTS
    3958                 :             : !!   elph_ds = elphon datastructure with data and dimensions
    3959                 :             : !!   gprim = reciprocal space lattice vectors
    3960                 :             : !!   natom = number of atoms
    3961                 :             : !!   nrpt = number of real-space points used for FT
    3962                 :             : !!   onegkksize = size of one record of the new gkk output file, in bytes
    3963                 :             : !!   rpt = positions of real-space points for FT
    3964                 :             : !!   qpt_full = qpoint coordinates
    3965                 :             : !!   wghatm = weights for real-space rpt in FT
    3966                 :             : !!
    3967                 :             : !! OUTPUT
    3968                 :             : !!   elph_ds%gkr = real space elphon matrix elements.
    3969                 :             : !!
    3970                 :             : !! SOURCE
    3971                 :             : 
    3972                 :             : subroutine get_all_gkr (elph_ds,gprim,natom,nrpt,onegkksize,rpt,qpt_full,wghatm)
    3973                 :             : 
    3974                 :             : !Arguments ------------------------------------
    3975                 :             : !scalars
    3976                 :             :  integer,intent(in) :: natom,nrpt,onegkksize
    3977                 :             :  type(elph_type),intent(inout) :: elph_ds
    3978                 :             : !arrays
    3979                 :             :  real(dp),intent(in) :: gprim(3,3),rpt(3,nrpt),qpt_full(3,elph_ds%nqpt_full)
    3980                 :             :  real(dp),intent(in) :: wghatm(natom,natom,nrpt)
    3981                 :             : 
    3982                 :             : !Local variables-------------------------------
    3983                 :             : !scalars
    3984                 :             :  integer :: ikpt_phon0,iost,qtor,sz2,sz3,sz4,sz5
    3985                 :             : ! *************************************************************************
    3986                 :             : 
    3987                 :             : !
    3988                 :             : !WARNING : disk file used for large arrays gkk_rpt and
    3989                 :             : !(eventually) gkk2
    3990                 :             : !
    3991                 :             : !allocate (gkk_rpt(2,elph_ds%nbranch,elph_ds%nFSband,elph_ds%nFSband,&
    3992                 :             : !&  elph_ds%k_phon%nkpt,nrpt))
    3993                 :             :  elph_ds%unit_gkk_rpt = 36
    3994                 :             : !see if the gkk_rpt should be written to a file (only available option now)
    3995                 :             :  if (elph_ds%gkk_rptwrite == 1) then
    3996                 :             : !  file is not present : we need to do the FT
    3997                 :             :    open (unit=elph_ds%unit_gkk_rpt,file='gkk_rpt_file',access='direct',&
    3998                 :             : &   recl=onegkksize,form='unformatted',&
    3999                 :             : &   status='new',iostat=iost)
    4000                 :             :    if (iost /= 0) then
    4001                 :             :      ABI_ERROR('get_all_gkr : error opening gkk_rpt_file as new')
    4002                 :             :    end if
    4003                 :             :    write(std_out,*) ' get_all_gkr : will write real space gkk to a disk file.'
    4004                 :             :    write(std_out,*) ' size = ', 4.0*dble(onegkksize)*dble(nrpt)/&
    4005                 :             : &   1024.0_dp/1024.0_dp, ' Mb'
    4006                 :             : 
    4007                 :             : !  else if (elph_ds%gkk_rptwrite  == 0) then
    4008                 :             :  else
    4009                 :             :    write(std_out,*) ' get_all_gkr : will keep real space gkk in memory.'
    4010                 :             :    write(std_out,*) ' size = ', 4.0*dble(onegkksize)*dble(nrpt)/&
    4011                 :             : &   1024.0_dp/1024.0_dp, ' Mb'
    4012                 :             :    sz2=elph_ds%ngkkband*elph_ds%ngkkband
    4013                 :             :    sz3=elph_ds%nbranch*elph_ds%nbranch
    4014                 :             :    sz4=elph_ds%k_phon%nkpt
    4015                 :             :    sz5=elph_ds%nsppol
    4016                 :             :    ABI_MALLOC(elph_ds%gkk_rpt,(2,sz2,sz3,sz4,sz5,nrpt))
    4017                 :             : !  write(std_out,*) ' get_all_gkr: invalid value for gkk_rptwrite'
    4018                 :             : !  stop
    4019                 :             :  end if
    4020                 :             :  write(std_out,*) '    about to FT the recip space gkk to real space '
    4021                 :             :  qtor = 1
    4022                 :             : 
    4023                 :             : !
    4024                 :             : !NOTE: should be very easy to parallelize!
    4025                 :             : !
    4026                 :             :  ikpt_phon0 = 1
    4027                 :             :  call ftgkk (wghatm,elph_ds%gkk_qpt,elph_ds%gkk_rpt,&
    4028                 :             : & elph_ds%gkqwrite,elph_ds%gkk_rptwrite,gprim,1,natom,&
    4029                 :             : & elph_ds%k_phon%nkpt,elph_ds%ngkkband,elph_ds%k_phon%nkpt,elph_ds%nqpt_full,&
    4030                 :             : & nrpt,elph_ds%nsppol,qtor,rpt,qpt_full,elph_ds%unit_gkk_rpt,elph_ds%unitgkq)
    4031                 :             : 
    4032                 :             : !call ftgkk (elph_ds,gprim,ikpt_phon0,natom,nrpt,qtor,rpt,qpt_full,wghatm)
    4033                 :             :  write(std_out,*) ' get_all_gkr : done with FT of gkk to real space'
    4034                 :             : 
    4035                 :             : !No longer need the gkk_qpt?
    4036                 :             : !if (elph_ds%gkqwrite == 0) deallocate (elph_ds%gkk_qpt)
    4037                 :             : 
    4038                 :             : !!DEBUG
    4039                 :             : !Test the FT of the gkk elements.
    4040                 :             : !call test_ftgkk(elph_ds,gprim,natom,nrpt,rpt,qpt_full,wghatm)
    4041                 :             : !!ENDDEBUG
    4042                 :             : 
    4043                 :             : !DEBUG
    4044                 :             : !do irpt=1,nrpt
    4045                 :             : !do ipert1=1,elph_ds%nbranch
    4046                 :             : !write(std_out,'(6(F16.5,1x))') elph_ds%gkk_rpt(:,ipert1,1,1,1,irpt)
    4047                 :             : !end do
    4048                 :             : !end do
    4049                 :             : !ENDDEBUG
    4050                 :             : 
    4051                 :             : end subroutine get_all_gkr
    4052                 :             : !!***
    4053                 :             : 
    4054                 :             : !!****f* ABINIT/complete_gkk
    4055                 :             : !!
    4056                 :             : !! NAME
    4057                 :             : !! complete_gkk
    4058                 :             : !!
    4059                 :             : !! FUNCTION
    4060                 :             : !! Use the set of special q points calculated by the Monkhorst &
    4061                 :             : !! Pack Technique.
    4062                 :             : !! Check if all the information for the q points are present in
    4063                 :             : !! the DDB to determine the elphon interaction matrices
    4064                 :             : !! Generate the gkk matrices of the set of q points which
    4065                 :             : !! samples homogeneously the entire Brillouin zone.
    4066                 :             : !!
    4067                 :             : !! INPUTS
    4068                 :             : !! elph_ds = datastructure for elphon information (mainly
    4069                 :             : !!      matrix elements and dimensions)
    4070                 :             : !!   elph_ds%k_phon%full2full = kpt_phon index mapping under symops
    4071                 :             : !! gkk_flag = flag for existence of matrix element
    4072                 :             : !! gprimd(3,3)=dimensionful primitive translations in reciprocal space
    4073                 :             : !! indsym = map of atoms by inverses of symrels
    4074                 :             : !! natom=number of atoms in unit cell
    4075                 :             : !! nsym=number of space group symmetries
    4076                 :             : !! qpttoqpt = qpoint index mapping under symops
    4077                 :             : !! rprimd(3,3)=dimensionful primitive translations in real space
    4078                 :             : !! symrec(3,3,nsym)=3x3 matrices of the group symmetries (recip space)
    4079                 :             : !! symrel(3,3,nsym)=3x3 matrices of the group symmetries (real space)
    4080                 :             : !! tnons(3,nsym)=nonsymmorphic translations associated to symrel
    4081                 :             : !!
    4082                 :             : !! OUTPUT
    4083                 :             : !! elph_ds%gkk_qpt = gkk matrices for all qpts on a full mesh
    4084                 :             : !!
    4085                 :             : !! SOURCE
    4086                 :             : 
    4087                 :           0 : subroutine complete_gkk(elph_ds,gkk_flag,gprimd,indsym,natom,nsym,qpttoqpt,rprimd,symrec,symrel)
    4088                 :             : 
    4089                 :             : !Arguments ------------------------------------
    4090                 :             : !scalars
    4091                 :             :  integer,intent(in) :: natom,nsym
    4092                 :             :  type(elph_type),intent(inout) :: elph_ds
    4093                 :             : !arrays
    4094                 :             :  integer,intent(in) :: indsym(4,nsym,natom)
    4095                 :             :  integer,intent(in) :: qpttoqpt(2,nsym,elph_ds%nqpt_full),symrec(3,3,nsym)
    4096                 :             :  integer,intent(in) :: symrel(3,3,nsym)
    4097                 :             :  integer,intent(inout) :: gkk_flag(elph_ds%nbranch,elph_ds%nbranch,elph_ds%k_phon%my_nkpt,elph_ds%nsppol,elph_ds%nqpt_full)
    4098                 :             :  real(dp),intent(in) :: gprimd(3,3)
    4099                 :             :  real(dp),intent(in) :: rprimd(3,3)
    4100                 :             : 
    4101                 :             : !Local variables-------------------------------
    4102                 :             : !scalars
    4103                 :             :  integer :: ikpt_phon,ib1,ibranch,ieqqpt,ii, ierr,comm
    4104                 :             :  integer :: iqpt,isppol,isym
    4105                 :             :  integer :: itim,jbranch,jj,kk,ll
    4106                 :             :  integer :: neqqpt,symikpt_phon
    4107                 :             :  integer :: iatom,ancestor_iatom
    4108                 :             :  integer :: ik_this_proc, me,sz1,sz2
    4109                 :             : 
    4110                 :             :  real(dp),parameter :: tol=2.d-8
    4111                 :             : !arrays
    4112                 :           0 :  integer :: symmetrized_qpt(elph_ds%nqpt_full)
    4113                 :             :  real(dp) :: ss(3,3)
    4114                 :           0 :  real(dp) :: tmp_mat(2,elph_ds%nbranch,elph_ds%nbranch)
    4115                 :           0 :  real(dp) :: tmp_mat2(2,elph_ds%nbranch,elph_ds%nbranch)
    4116                 :           0 :  real(dp),allocatable :: gkk_qpt_new(:,:,:,:,:),gkk_qpt_tmp(:,:,:,:,:)
    4117                 :             : 
    4118                 :           0 :  real(dp) :: ss_allatoms(2,elph_ds%nbranch,elph_ds%nbranch)
    4119                 :             :  complex(dp) :: c_one, c_zero
    4120                 :             : ! *********************************************************************
    4121                 :             : 
    4122                 :           0 :  c_one = dcmplx(one,zero)
    4123                 :           0 :  c_zero = dcmplx(zero,zero)
    4124                 :             : 
    4125                 :             : !Generation of the gkk matrices relative to the q points
    4126                 :             : !of the set which samples the entire Brillouin zone
    4127                 :             : 
    4128                 :           0 :  comm = xmpi_world
    4129                 :           0 :  me = xmpi_comm_rank(comm)
    4130                 :             : 
    4131         [ #  # ]:           0 :  symmetrized_qpt(:) = -1
    4132                 :             : 
    4133                 :             : !FIXME bxu, why set it to 1?
    4134                 :             : !isppol=1
    4135                 :             : 
    4136                 :           0 :  sz1=elph_ds%ngkkband*elph_ds%ngkkband
    4137                 :           0 :  sz2=elph_ds%nbranch*elph_ds%nbranch
    4138                 :             : 
    4139                 :             : !these arrays are not parallelized, to enable symmetrization: syms swap k-points.
    4140   [ #  #  #  #  :           0 :  ABI_MALLOC(gkk_qpt_new,(2,sz1,sz2,elph_ds%k_phon%nkpt,elph_ds%nsppol))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    4141   [ #  #  #  #  :           0 :  ABI_MALLOC(gkk_qpt_tmp,(2,sz1,sz2,elph_ds%k_phon%nkpt,elph_ds%nsppol))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
    4142                 :             : 
    4143         [ #  # ]:           0 :  do iqpt=1,elph_ds%nqpt_full
    4144                 :             : 
    4145                 :             : !  Already symmetrized?
    4146         [ #  # ]:           0 :    if (symmetrized_qpt(iqpt) == 1) cycle
    4147                 :             : 
    4148   [ #  #  #  #  :           0 :    gkk_qpt_new(:,:,:,:,:) = zero
          #  #  #  #  #  
                      # ]
    4149                 :             : !   gkk_qpt_tmp(:,:,:,:,:) = zero
    4150                 :             : 
    4151                 :             : !  loop over qpoints equivalent to iqpt
    4152                 :           0 :    neqqpt=0
    4153                 :             : !  do not use time reversal symmetry to complete the qpoints:
    4154                 :             : !  do not know what happens to the gamma matrices
    4155                 :             : !  itim=1
    4156                 :             : 
    4157         [ #  # ]:           0 :    do itim=1,2
    4158         [ #  # ]:           0 :      do isym=1,nsym
    4159                 :             : !      ieqqpt is sent onto iqpt by itim/isym
    4160                 :           0 :        ieqqpt = qpttoqpt(itim,isym,iqpt)
    4161   [ #  #  #  #  :           0 :        gkk_qpt_tmp(:,:,:,:,:) = zero
          #  #  #  #  #  
                      # ]
    4162                 :             : 
    4163                 :             : 
    4164         [ #  # ]:           0 :        if (gkk_flag(1,1,1,1,ieqqpt) == -1) cycle
    4165                 :             : !      if we have information on this qpt
    4166                 :             : !      iqpt is equivalent to ieqqpt: get it from file or memory
    4167         [ #  # ]:           0 :        do ik_this_proc =1,elph_ds%k_phon%my_nkpt
    4168                 :           0 :          ikpt_phon = elph_ds%k_phon%my_ikpt(ik_this_proc)
    4169                 :             : 
    4170         [ #  # ]:           0 :          if (elph_ds%gkqwrite == 0) then
    4171   [ #  #  #  #  :           0 :            gkk_qpt_tmp(:,:,:,ikpt_phon,:) = elph_ds%gkk_qpt(:,:,:,ik_this_proc,:,ieqqpt)
             #  #  #  # ]
    4172         [ #  # ]:           0 :          else if (elph_ds%gkqwrite == 1) then
    4173                 :           0 :            read(elph_ds%unitgkq,REC=((ieqqpt-1)*elph_ds%k_phon%my_nkpt+ik_this_proc)) gkk_qpt_tmp(:,:,:,ikpt_phon,:)
    4174                 :             :          end if
    4175                 :             :        end do
    4176                 :             : 
    4177                 :             : !      condense everything
    4178                 :           0 :        call xmpi_sum (gkk_qpt_tmp, comm, ierr)
    4179                 :             : 
    4180                 :           0 :        neqqpt=neqqpt+1
    4181                 :             : 
    4182         [ #  # ]:           0 :        if (elph_ds%ep_scalprod==1) then
    4183         [ #  # ]:           0 :          do ii=1,3
    4184         [ #  # ]:           0 :            do jj=1,3
    4185                 :           0 :              ss(ii,jj)=0.0_dp
    4186         [ #  # ]:           0 :              do kk=1,3
    4187         [ #  # ]:           0 :                do ll=1,3
    4188                 :           0 :                  ss(ii,jj)=ss(ii,jj)+rprimd(ii,kk)*symrel(kk,ll,isym)*gprimd(ll,jj)
    4189                 :             :                end do
    4190                 :             :              end do
    4191                 :             :            end do
    4192                 :             :          end do
    4193                 :             :        else
    4194         [ #  # ]:           0 :          do ii=1,3
    4195         [ #  # ]:           0 :            do jj=1,3
    4196                 :           0 :              ss(ii,jj) = symrec(jj,ii,isym)
    4197                 :             :            end do
    4198                 :             :          end do
    4199                 :             :        end if
    4200                 :             : 
    4201   [ #  #  #  #  :           0 :        ss_allatoms(:,:,:) = zero
                   #  # ]
    4202         [ #  # ]:           0 :        do iatom=1,natom
    4203                 :           0 :          ancestor_iatom = indsym(4,isym,iatom)
    4204                 :             : !        do jatom=1,natom
    4205                 :             : !        ancestor_jatom = indsym(4,isym,jatom)
    4206                 :             :          ss_allatoms(1,(ancestor_iatom-1)*3+1:(ancestor_iatom-1)*3+3,&
    4207   [ #  #  #  # ]:           0 : &         (iatom-1)*3+1:         (iatom-1)*3+3) = ss(1:3,1:3)
    4208                 :             : !        end do
    4209                 :             :        end do
    4210                 :             : 
    4211                 :             : 
    4212                 :             : !      NOTE   ssinv(ii,jj)=ssinv(ii,jj)+gprimd(ii,kk)*rprimd(jj,ll)*symrec(ll,kk,isym)
    4213                 :             : 
    4214         [ #  # ]:           0 :        do isppol=1,elph_ds%nsppol
    4215         [ #  # ]:           0 :          do ikpt_phon=1,elph_ds%k_phon%nkpt
    4216                 :             : !          symikpt_phon is sent onto ikpt_phon by itim/isym
    4217                 :           0 :            symikpt_phon=elph_ds%k_phon%full2full(itim,isym,ikpt_phon)
    4218                 :             : 
    4219                 :             : !          Do each element band1, band2 separately...
    4220         [ #  # ]:           0 :            do ib1=1,elph_ds%ngkkband*elph_ds%ngkkband
    4221                 :             : 
    4222                 :             : !            multiply by the ss matrices
    4223   [ #  #  #  #  :           0 :              tmp_mat2(:,:,:) = zero
                   #  # ]
    4224                 :             :              tmp_mat(:,:,:) = reshape(gkk_qpt_tmp(:,ib1,:,ikpt_phon,isppol),&
    4225         [ #  # ]:           0 : &             (/2,elph_ds%nbranch,elph_ds%nbranch/))
    4226                 :             :              call ZGEMM ('N','N',elph_ds%nbranch,elph_ds%nbranch,elph_ds%nbranch,&
    4227                 :             : &             c_one,ss_allatoms,elph_ds%nbranch,tmp_mat,elph_ds%nbranch,c_zero,&
    4228                 :           0 : &             tmp_mat2,elph_ds%nbranch)
    4229                 :             :              call ZGEMM ('N','T',elph_ds%nbranch,elph_ds%nbranch,elph_ds%nbranch,&
    4230                 :             : &             c_one,tmp_mat2,elph_ds%nbranch,ss_allatoms,elph_ds%nbranch,c_zero,&
    4231                 :           0 : &             tmp_mat,elph_ds%nbranch)
    4232                 :             : 
    4233                 :             : !            add to gkk_qpt_new
    4234         [ #  # ]:           0 :              do ibranch =1,elph_ds%nbranch
    4235         [ #  # ]:           0 :                do jbranch =1,elph_ds%nbranch
    4236                 :             :                  gkk_qpt_new(:,ib1,(jbranch-1)*elph_ds%nbranch+ibranch,symikpt_phon,isppol) = &
    4237                 :             : &                 gkk_qpt_new(:,ib1,(jbranch-1)*elph_ds%nbranch+ibranch,symikpt_phon,isppol) + &
    4238         [ #  # ]:           0 : &                 tmp_mat(:,jbranch,ibranch)
    4239                 :             :                end do
    4240                 :             :              end do
    4241                 :             : 
    4242                 :             :            end do ! end ib1 do
    4243                 :             :          end do ! end ikpt_phon do
    4244                 :             :        end do ! end isppol do
    4245                 :             : 
    4246                 :             :      end do ! end isym do
    4247                 :             :    end do ! itim
    4248                 :             : 
    4249         [ #  # ]:           0 :    if (neqqpt > 1) then
    4250                 :           0 :      write(std_out,*) ' found several equiv qpts and am symmetrizing them ', neqqpt
    4251                 :             :    end if
    4252                 :             : 
    4253                 :             : !  divide by number of equivalent qpts found
    4254   [ #  #  #  #  :           0 :    gkk_qpt_new(:,:,:,:,:) = gkk_qpt_new(:,:,:,:,:)/neqqpt
          #  #  #  #  #  
                      # ]
    4255                 :             : 
    4256                 :             : !  copy the symmetrized version into all the equivalent qpoints, appropriately transformed
    4257                 :             : !  See above
    4258                 :             : !  itim=1
    4259         [ #  # ]:           0 :    do itim=1,2
    4260         [ #  # ]:           0 :      do isym=1,nsym
    4261                 :             : !      ieqqpt is sent onto iqpt by itim/isym
    4262                 :           0 :        ieqqpt = qpttoqpt(itim,isym,iqpt)
    4263                 :             : 
    4264         [ #  # ]:           0 :        if (symmetrized_qpt(ieqqpt) /= -1) cycle
    4265   [ #  #  #  #  :           0 :        gkk_qpt_tmp(:,:,:,:,:) = zero
          #  #  #  #  #  
                      # ]
    4266                 :             : 
    4267                 :             : !      use symrec matrices to get inverse transform from isym^{-1}
    4268         [ #  # ]:           0 :        if (elph_ds%ep_scalprod==1) then
    4269         [ #  # ]:           0 :          do ii=1,3
    4270         [ #  # ]:           0 :            do jj=1,3
    4271                 :           0 :              ss(ii,jj)=0.0_dp
    4272         [ #  # ]:           0 :              do kk=1,3
    4273         [ #  # ]:           0 :                do ll=1,3
    4274                 :             : !                Use inverse of symop matrix here to get back to ieqqpt (inv+transpose is in symrec and in gprimd)
    4275                 :           0 :                  ss(ii,jj)=ss(ii,jj)+rprimd(ii,kk)*symrec(ll,kk,isym)*gprimd(ll,jj)
    4276                 :             :                end do
    4277                 :             :              end do
    4278                 :             :            end do
    4279                 :             :          end do
    4280                 :             :        else
    4281         [ #  # ]:           0 :          do ii=1,3
    4282         [ #  # ]:           0 :            do jj=1,3
    4283                 :           0 :              ss(ii,jj) = symrel(ii,jj,isym)
    4284                 :             :            end do
    4285                 :             :          end do
    4286                 :             :        end if
    4287                 :             : 
    4288   [ #  #  #  #  :           0 :        ss_allatoms(:,:,:) = zero
                   #  # ]
    4289         [ #  # ]:           0 :        do iatom=1,natom
    4290                 :           0 :          ancestor_iatom = indsym(4,isym,iatom)
    4291                 :             : !        do jatom=1,natom
    4292                 :             : !        ancestor_jatom = indsym(4,isym,jatom)
    4293                 :             :          ss_allatoms(1,(ancestor_iatom-1)*3+1:(ancestor_iatom-1)*3+3,&
    4294   [ #  #  #  # ]:           0 : &         (iatom-1)*3+1:          (iatom-1)*3+3) = ss(1:3,1:3)
    4295                 :             : !        end do
    4296                 :             :        end do
    4297                 :             : 
    4298                 :             : !      ! Use inverse of symop matrix here to get back to ieqqpt
    4299                 :             : !      ssinv(ii,jj)=ssinv(ii,jj)+gprimd(ii,kk)*rprimd(jj,ll)*symrel(kk,ll,isym)
    4300                 :             : 
    4301         [ #  # ]:           0 :        do isppol=1,elph_ds%nsppol
    4302         [ #  # ]:           0 :          do ikpt_phon=1,elph_ds%k_phon%nkpt
    4303                 :             : !          symikpt_phon is sent onto ikpt_phon by itim/isym
    4304                 :           0 :            symikpt_phon=elph_ds%k_phon%full2full(itim,isym,ikpt_phon)
    4305                 :             : 
    4306         [ #  # ]:           0 :            do ib1=1,elph_ds%ngkkband*elph_ds%ngkkband
    4307                 :             : 
    4308                 :             : !            multiply by the ss^{-1} matrices
    4309   [ #  #  #  #  :           0 :              tmp_mat2(:,:,:) = zero
                   #  # ]
    4310                 :             :              tmp_mat(:,:,:) = reshape(gkk_qpt_new(:,ib1,:,ikpt_phon,isppol),&
    4311         [ #  # ]:           0 : &             (/2,elph_ds%nbranch,elph_ds%nbranch/))
    4312                 :             :              call ZGEMM ('N','N',elph_ds%nbranch,elph_ds%nbranch,elph_ds%nbranch,&
    4313                 :             : &             c_one,ss_allatoms,elph_ds%nbranch,tmp_mat,elph_ds%nbranch,c_zero,&
    4314                 :           0 : &             tmp_mat2,elph_ds%nbranch)
    4315                 :             :              call ZGEMM ('N','T',elph_ds%nbranch,elph_ds%nbranch,elph_ds%nbranch,&
    4316                 :             : &             c_one,tmp_mat2,elph_ds%nbranch,ss_allatoms,elph_ds%nbranch,c_zero,&
    4317                 :           0 : &             tmp_mat,elph_ds%nbranch)
    4318                 :             : 
    4319         [ #  # ]:           0 :              do ibranch =1,elph_ds%nbranch
    4320         [ #  # ]:           0 :                do jbranch =1,elph_ds%nbranch
    4321                 :             :                  gkk_qpt_tmp(:,ib1,(jbranch-1)*elph_ds%nbranch+ibranch,symikpt_phon,isppol) =&
    4322         [ #  # ]:           0 : &                 tmp_mat(:,jbranch,ibranch)
    4323                 :             :                end do
    4324                 :             :              end do
    4325                 :             : 
    4326         [ #  # ]:           0 :              do ik_this_proc =1,elph_ds%k_phon%my_nkpt
    4327         [ #  # ]:           0 :                if (elph_ds%k_phon%my_ikpt(ik_this_proc) == symikpt_phon) then
    4328   [ #  #  #  #  :           0 :                  if (gkk_flag (1,1,ik_this_proc,isppol,ieqqpt) == -1) gkk_flag (:,:,ik_this_proc,isppol,ieqqpt) = 0
                   #  # ]
    4329                 :             :                  exit
    4330                 :             :                end if
    4331                 :             :              end do
    4332                 :             : !             if (gkk_flag (1,1,symikpt_phon,isppol,ieqqpt) == -1) then
    4333                 :             : !               gkk_flag (:,:,symikpt_phon,isppol,ieqqpt) = 0
    4334                 :             : !             end if
    4335                 :             : 
    4336                 :             :            end do ! end ib1 do
    4337                 :             :          end do ! end ikpt_phon do
    4338                 :             :        end do ! end isppol do
    4339                 :             : 
    4340                 :             : 
    4341                 :             : !      save symmetrized matrices for qpt ieqqpt
    4342         [ #  # ]:           0 :        do ik_this_proc =1,elph_ds%k_phon%my_nkpt
    4343                 :           0 :          ikpt_phon = elph_ds%k_phon%my_ikpt(ik_this_proc)
    4344                 :             : 
    4345         [ #  # ]:           0 :          if (elph_ds%gkqwrite == 0) then
    4346   [ #  #  #  #  :           0 :            elph_ds%gkk_qpt(:,:,:,ik_this_proc,:,ieqqpt) = gkk_qpt_tmp(:,:,:,ikpt_phon,:)
             #  #  #  # ]
    4347         [ #  # ]:           0 :          else if (elph_ds%gkqwrite == 1) then
    4348                 :           0 :            write(elph_ds%unitgkq,REC=((ieqqpt-1)*elph_ds%k_phon%my_nkpt+ik_this_proc)) gkk_qpt_tmp(:,:,:,ikpt_phon,:)
    4349                 :             :          end if
    4350                 :             :        end do
    4351                 :             : 
    4352                 :           0 :        symmetrized_qpt(ieqqpt) = 1
    4353                 :             : 
    4354                 :             :      end do ! end isym do
    4355                 :             :    end do ! end itim do
    4356                 :             : 
    4357                 :             :  end do
    4358                 :             : !end iqpt do
    4359                 :             : 
    4360         [ #  # ]:           0 :  ABI_FREE(gkk_qpt_new)
    4361         [ #  # ]:           0 :  ABI_FREE(gkk_qpt_tmp)
    4362                 :             : 
    4363                 :           0 : end subroutine complete_gkk
    4364                 :             : !!***
    4365                 :             : 
    4366                 :             : !!****f* ABINIT/get_nv_fs_en
    4367                 :             : !! NAME
    4368                 :             : !!  get_nv_fs_en
    4369                 :             : !!
    4370                 :             : !! FUNCTION
    4371                 :             : !! This routine finds the energy grids for the integration on epsilon
    4372                 :             : !! and epsilon prime. It then calculates the DOS and FS averaged velocity_sq at
    4373                 :             : !! these energies. Metals and semiconductors are treated differently, to deal
    4374                 :             : !! correctly with the gap.
    4375                 :             : !!
    4376                 :             : !! INPUTS
    4377                 :             : !! crystal<crystal_t>=data type gathering info on the crystalline structure.
    4378                 :             : !! Ifc<ifc_type>=Object containing the interatomic force constants.
    4379                 :             : !!  elph_ds
    4380                 :             : !!    elph_ds%nband = number of bands in ABINIT
    4381                 :             : !!    elph_ds%k_fine%nkptirr = Number of irreducible points for which there exist at least one band that crosses the Fermi level.
    4382                 :             : !!    elph_ds%nbranch = number of phonon branches = 3*natom
    4383                 :             : !!    elph_ds%k_phon%nkpt = number of k points
    4384                 :             : !!    elph_ds%k_fine%irredtoGS = mapping of elph k-points to ground state grid
    4385                 :             : !!    elph_ds%minFSband = lowest band included in the FS integration
    4386                 :             : !!    elph_ds%nFSband = number of bands included in the FS integration
    4387                 :             : !!    elph_ds%fermie = fermi energy
    4388                 :             : !!    elph_ds%tempermin = minimum temperature at which resistivity etc are calculated (in K)
    4389                 :             : !!    elph_ds%temperinc = interval temperature grid on which resistivity etc are calculated (in K)
    4390                 :             : !!    elph_ds%ep_b_min= first band taken into account in FS integration (if telphint==2)
    4391                 :             : !!    elph_ds%ep_b_max= last band taken into account in FS integration (if telphint==2)
    4392                 :             : !!    elph_ds%telphint = flag for integration over the FS with 0=tetrahedra 1=gaussians
    4393                 :             : !!    elph_ds%elphsmear = smearing width for gaussian integration
    4394                 :             : !!           or buffer in energy for calculations with tetrahedra (telphint=0)
    4395                 :             : !!
    4396                 :             : !!  elph_tr_ds
    4397                 :             : !!    elph_tr_ds%el_veloc = electronic velocities from the fine k-grid
    4398                 :             : !!
    4399                 :             : !!  eigenGS = Ground State eigenvalues
    4400                 :             : !!  kptrlatt_fine = k-point grid vectors (if divided by determinant of present matrix)
    4401                 :             : !!  max_occ = maximal occupancy for a band
    4402                 :             : !!
    4403                 :             : !! OUTPUT
    4404                 :             : !!  elph_ds%nenergy = number of energy points for integration on epsilon
    4405                 :             : !!  elph_tr_ds%en_all = energy points
    4406                 :             : !!  elph_tr_ds%de_all = differences between energy points
    4407                 :             : !!  elph_tr_ds%dos_n = DOS at selected energy points
    4408                 :             : !!  elph_tr_ds%veloc_sq = FS averaged velocity square at selected energy points
    4409                 :             : !!  elph_tr_ds%tmp_gkk_intweight = integration weights at coarse k grid
    4410                 :             : !!  elph_tr_ds%tmp_velocwtk = velocity times integration weights at coarse k grid
    4411                 :             : !!  elph_tr_ds%tmp_vvelocwtk = velocity square times integration weights at coarse k grid
    4412                 :             : !!
    4413                 :             : !! SOURCE
    4414                 :             : 
    4415                 :           0 : subroutine get_nv_fs_en(crystal,ifc,elph_ds,eigenGS,max_occ,elph_tr_ds,omega_max)
    4416                 :             : 
    4417                 :             : !Arguments ------------------------------------
    4418                 :             : !Scalars
    4419                 :             :  real(dp), intent(in)  :: max_occ
    4420                 :             :  real(dp), intent(out) :: omega_max
    4421                 :             :  type(ifc_type),intent(in) :: ifc
    4422                 :             :  type(crystal_t),intent(in) :: crystal
    4423                 :             :  type(elph_type),intent(inout) :: elph_ds
    4424                 :             :  type(elph_tr_type),intent(inout) :: elph_tr_ds
    4425                 :             : !Arrays
    4426                 :             : 
    4427                 :             :  real(dp), intent(in)  :: eigenGS(elph_ds%nband,elph_ds%k_fine%nkptirr,elph_ds%nsppol)
    4428                 :             : 
    4429                 :             : !Local variables-------------------------------
    4430                 :             : !scalars
    4431                 :             :  integer ::  iFSqpt,isppol,ie1,ierr
    4432                 :             :  integer ::  i_metal,low_T
    4433                 :             :  integer ::  in_nenergy, out_nenergy
    4434                 :             :  integer ::  n_edge1, n_edge2, edge
    4435                 :             :  integer ::  ie_all, ne_all
    4436                 :             :  integer ::  sz1, sz2, sz3, sz4
    4437                 :             :   real(dp) :: e_vb_max, e_cb_min,ucvol
    4438                 :             :  real(dp) :: e1,max_e,fine_range
    4439                 :             :  real(dp) :: enemin,enemax
    4440                 :             :  real(dp) :: Temp,e_tiny,de0
    4441                 :             :  real(dp) :: eff_mass1, eff_mass2, tmp_dos
    4442                 :             :  character(len=500) :: message
    4443                 :             : !arrays
    4444                 :             :  real(dp) :: gprimd(3,3), kpt_2nd(3), e_cb_2nd(2), en1(2)
    4445                 :           0 :  real(dp),allocatable :: dos_e1(:,:),tmp_wtk(:,:,:,:), phfrq(:,:), displ(:,:,:,:)
    4446                 :             : ! *************************************************************************
    4447                 :             : 
    4448   [ #  #  #  # ]:           0 :  gprimd = crystal%gprimd
    4449                 :           0 :  ucvol = crystal%ucvol
    4450                 :             : 
    4451                 :           0 :  Temp             = elph_ds%tempermin+elph_ds%temperinc
    4452                 :           0 :  elph_ds%delta_e  = kb_HaK*Temp ! about 1000 cm^-1/100, no need to be omega_max
    4453                 :           0 :  max_e            = elph_ds%nenergy*kb_HaK*Temp
    4454                 :           0 :  e_tiny           = kb_HaK*0.00001_dp ! this is the min. delta_e
    4455                 :           0 :  de0              = kb_HaK*Temp ! Kb*T
    4456                 :             : 
    4457                 :           0 :  in_nenergy = elph_ds%nenergy
    4458                 :             : 
    4459   [ #  #  #  #  :           0 :  ABI_MALLOC(tmp_wtk,(elph_ds%nFSband,elph_ds%k_fine%nkpt,elph_ds%nsppol,4))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
    4460   [ #  #  #  #  :           0 :  ABI_MALLOC(dos_e1,(elph_ds%nsppol,3))
          #  #  #  #  #  
                #  #  # ]
    4461                 :             : 
    4462   [ #  #  #  #  :           0 :  ABI_MALLOC(phfrq,(elph_ds%nbranch, elph_ds%k_phon%nkpt))
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
    4463   [ #  #  #  #  :           0 :  ABI_MALLOC(displ,(2, elph_ds%nbranch, elph_ds%nbranch, elph_ds%k_phon%nkpt))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
    4464                 :             : 
    4465         [ #  # ]:           0 :  do iFSqpt=1,elph_ds%k_phon%nkpt
    4466                 :           0 :    call ifc%fourq(crystal,elph_ds%k_phon%kpt(:,iFSqpt),phfrq(:,iFSqpt),displ(:,:,:,iFSqpt))
    4467                 :             :  end do
    4468                 :             : 
    4469   [ #  #  #  #  :           0 :  omega_max = maxval(phfrq)*1.1_dp
          #  #  #  #  #  
                #  #  # ]
    4470         [ #  # ]:           0 :  ABI_FREE(phfrq)
    4471         [ #  # ]:           0 :  ABI_FREE(displ)
    4472                 :             : 
    4473                 :           0 :  write(message,'(a,E20.12)')' The max phonon energy is  ', omega_max
    4474                 :           0 :  call wrtout(std_out,message,'COLL')
    4475                 :             : 
    4476                 :           0 :  enemin = elph_ds%fermie - max_e*2
    4477                 :           0 :  enemax = elph_ds%fermie + max_e
    4478                 :             :  call ep_el_weights(elph_ds%ep_b_min, elph_ds%ep_b_max, eigenGS, elph_ds%elphsmear, &
    4479                 :             : & enemin, enemax, 4, gprimd, elph_ds%k_fine%irredtoGS, elph_ds%kptrlatt_fine, max_occ, &
    4480                 :             : & elph_ds%minFSband, elph_ds%nband, elph_ds%nFSband, &
    4481                 :           0 : & elph_ds%nsppol, elph_ds%telphint, elph_ds%k_fine, tmp_wtk)
    4482                 :             : 
    4483         [ #  # ]:           0 :  do isppol=1,elph_ds%nsppol
    4484   [ #  #  #  # ]:           0 :    dos_e1(isppol,1) = sum(tmp_wtk(:,:,isppol,2))/elph_ds%k_fine%nkpt
    4485   [ #  #  #  # ]:           0 :    dos_e1(isppol,2) = sum(tmp_wtk(:,:,isppol,3))/elph_ds%k_fine%nkpt
    4486   [ #  #  #  # ]:           0 :    dos_e1(isppol,3) = sum(tmp_wtk(:,:,isppol,4))/elph_ds%k_fine%nkpt
    4487                 :             : 
    4488                 :             : !  ! BXU, only treat metallic case at this moment, as variational method may not
    4489                 :             : !  ! apply to insulators
    4490                 :             : !  i_metal = -1
    4491                 :           0 :    i_metal = 1
    4492                 :             : !  if (dos_e1(isppol,1) .gt. 0.1_dp .and. dos_e1(isppol,2) .gt. 0.1_dp .and. &
    4493                 :             : !  &   dos_e1(isppol,3) .gt. 0.1_dp) then ! metal
    4494                 :             : !  i_metal = 1
    4495                 :           0 :    if (i_metal == 1) then
    4496                 :           0 :      write(message,'(a)')' This is a metal.'
    4497                 :           0 :      call wrtout(std_out,message,'COLL')
    4498                 :             : 
    4499                 :           0 :      fine_range = 1.5_dp
    4500                 :           0 :      e1 = elph_ds%fermie + omega_max*fine_range
    4501                 :           0 :      out_nenergy = 0
    4502                 :           0 :      low_T = 1
    4503         [ #  # ]:           0 :      if (omega_max*fine_range .lt. max_e) then
    4504                 :           0 :        low_T = 0
    4505                 :           0 :        de0 = omega_max*fine_range/in_nenergy ! energy spacing within Ef +/- omega_max
    4506         [ #  # ]:           0 :        do while ((e1-elph_ds%fermie) .lt. max_e)
    4507                 :           0 :          e1 = e1 + elph_ds%delta_e
    4508                 :           0 :          out_nenergy = out_nenergy + 1
    4509                 :             :        end do
    4510                 :             :      end if
    4511                 :             : 
    4512                 :             :      if (low_T == 0) max_e = e1 - elph_ds%fermie
    4513                 :           0 :      elph_ds%nenergy = in_nenergy*2 + 1 + out_nenergy*2
    4514                 :             : 
    4515                 :             :    else ! semiconductor/insulator, need careful consideration later
    4516                 :             :      i_metal = 0
    4517                 :             : !    between CB min and the next k point, use free electron to replace
    4518                 :             : !    The weights will be proportional to the DOS, relative to the weights
    4519                 :             : !    calculated with ep_fs_weights, tetrahedron method prefered
    4520                 :             : 
    4521                 :             : !    output VB and CB edges for semiconductor/insulator
    4522                 :             :      e_vb_max = maxval(eigenGS(elph_ds%minFSband+elph_ds%nFSband/2-1,:,isppol))
    4523                 :             :      e_cb_min = minval(eigenGS(elph_ds%minFSband+elph_ds%nFSband/2,:,isppol))
    4524                 :             :      e_cb_2nd(1) = eigenGS(elph_ds%minFSband+elph_ds%nFSband/2,2,isppol)
    4525                 :             :      e_cb_2nd(2) = eigenGS(elph_ds%minFSband+elph_ds%nFSband/2+1,2,isppol)
    4526                 :             :      write(message,'(a,E20.12,2x,E20.12)')' elphon : top of VB, bottom of CB = ',&
    4527                 :             : &     e_vb_max, e_cb_min
    4528                 :             :      call wrtout(std_out,message,'COLL')
    4529                 :             :      write(message,'(a,E20.12)')' elphon : energy at the neighbor kpt = ',e_cb_2nd(1)
    4530                 :             :      call wrtout(std_out,message,'COLL')
    4531                 :             : 
    4532                 :             :      n_edge1 = 4 ! at the very edge
    4533                 :             :      n_edge2 = 8  ! sparse to the end of free-electron part
    4534                 :             : 
    4535                 :             :      kpt_2nd(:) = gprimd(:,1)*elph_ds%k_fine%kptirr(1,2) + &
    4536                 :             : &     gprimd(:,2)*elph_ds%k_fine%kptirr(2,2) + &
    4537                 :             : &     gprimd(:,3)*elph_ds%k_fine%kptirr(3,2)
    4538                 :             :      write(message,'(a,3E20.12)')' The neighbor k point is:  ', elph_ds%k_fine%kptirr(:,2)
    4539                 :             :      call wrtout(std_out,message,'COLL')
    4540                 :             : 
    4541                 :             :      if (dabs(elph_ds%fermie-e_cb_min) .lt. dabs(elph_ds%fermie-e_vb_max)) then
    4542                 :             :        e1 = e_cb_2nd(1)
    4543                 :             :      else
    4544                 :             :        e1 = e_vb_max
    4545                 :             :      end if
    4546                 :             :      call ep_fs_weights(elph_ds%ep_b_min, elph_ds%ep_b_max, eigenGS, elph_ds%elphsmear, &
    4547                 :             : &     e1, gprimd, elph_ds%k_fine%irredtoGS, elph_ds%kptrlatt_fine, max_occ, &
    4548                 :             : &     elph_ds%minFSband, elph_ds%nband, elph_ds%nFSband, &
    4549                 :             : &     elph_ds%nsppol, elph_ds%telphint, elph_ds%k_fine)
    4550                 :             : 
    4551                 :             :      elph_ds%n0(isppol) = sum(elph_ds%k_fine%wtk(:,:,isppol))/elph_ds%k_fine%nkpt
    4552                 :             : 
    4553                 :             :      eff_mass1 = (kpt_2nd(1)*kpt_2nd(1) + kpt_2nd(2)*kpt_2nd(2) + kpt_2nd(3)*kpt_2nd(3)) / &
    4554                 :             : &     (2.0_dp*(e_cb_2nd(1)-e_cb_min))
    4555                 :             :      write(message,'(a,E20.12)')' The eff. mass from band1 is: ', eff_mass1
    4556                 :             :      call wrtout(std_out,message,'COLL')
    4557                 :             :      eff_mass2 = (kpt_2nd(1)*kpt_2nd(1) + kpt_2nd(2)*kpt_2nd(2) + kpt_2nd(3)*kpt_2nd(3)) / &
    4558                 :             : &     (2.0_dp*(e_cb_2nd(2)-e_cb_min))
    4559                 :             :      write(message,'(a,E20.12)')' The eff. mass from band2 is: ', eff_mass2
    4560                 :             :      call wrtout(std_out,message,'COLL')
    4561                 :             : 
    4562                 :             : !    bxu, but the eff. mass estimated in this way is too small
    4563                 :             : !    The following is obtained by roughly fitting to the DOS of 48x48x48
    4564                 :             :      eff_mass1 = 0.91036
    4565                 :             :      write(message,'(a,E20.12)')' The eff. mass we are using is: ', eff_mass1
    4566                 :             :      call wrtout(std_out,message,'COLL')
    4567                 :             : 
    4568                 :             :      tmp_dos = (ucvol/2.0_dp/pi**2.0_dp)*(2.0_dp*eff_mass1)**1.5_dp*(e1-e_cb_min)**0.5_dp + &
    4569                 :             : &     2.0_dp*(ucvol/2.0_dp/pi**2.0_dp)*(2.0_dp*eff_mass2)**1.5_dp*(e1-e_cb_min)**0.5_dp
    4570                 :             :      write(message,'(a,E20.12)')' The fake DOS at kpt1 =   ', tmp_dos
    4571                 :             :      call wrtout(std_out,message,'COLL')
    4572                 :             :      write(message,'(a,E20.12)')' The calculated DOS at kpt1 =   ', elph_ds%n0(isppol)
    4573                 :             :      call wrtout(std_out,message,'COLL')
    4574                 :             : 
    4575                 :             : 
    4576                 :             :      e1 = elph_ds%fermie - max_e
    4577                 :             :      ie_all = 1
    4578                 :             :      ne_all = 0
    4579                 :             :      edge = 0
    4580                 :             : 
    4581                 :             :      call ep_fs_weights(elph_ds%ep_b_min, elph_ds%ep_b_max, eigenGS, elph_ds%elphsmear, &
    4582                 :             : &     e1, gprimd, elph_ds%k_fine%irredtoGS, elph_ds%kptrlatt_fine, max_occ, &
    4583                 :             : &     elph_ds%minFSband, elph_ds%nband, elph_ds%nFSband, &
    4584                 :             : &     elph_ds%nsppol, elph_ds%telphint, elph_ds%k_fine)
    4585                 :             : 
    4586                 :             :      elph_ds%n0(isppol) = sum(elph_ds%k_fine%wtk(:,:,isppol))/elph_ds%k_fine%nkpt
    4587                 :             :      do while ((e1-elph_ds%fermie) .lt. max_e)
    4588                 :             :        if (e1 .lt. e_cb_min .and. elph_ds%n0(isppol) .lt. tol9) then
    4589                 :             :          e1 = e_cb_2nd(1)
    4590                 :             :          edge = 1
    4591                 :             :          e1 = e1 + de0
    4592                 :             :        end if
    4593                 :             : 
    4594                 :             :        if (e1 .lt. e_cb_2nd(1)) then
    4595                 :             :          e1 = e_cb_2nd(1)
    4596                 :             :          edge = 1
    4597                 :             :          e1 = e1 + de0
    4598                 :             :        end if
    4599                 :             : 
    4600                 :             :        if (e1 .gt. e_cb_2nd(1)) then
    4601                 :             :          call ep_fs_weights(elph_ds%ep_b_min, elph_ds%ep_b_max, eigenGS, elph_ds%elphsmear, &
    4602                 :             : &         e1, gprimd, elph_ds%k_fine%irredtoGS, elph_ds%kptrlatt_fine, max_occ, &
    4603                 :             : &         elph_ds%minFSband, elph_ds%nband, elph_ds%nFSband, &
    4604                 :             : &         elph_ds%nsppol, elph_ds%telphint, elph_ds%k_fine)
    4605                 :             : 
    4606                 :             :          elph_ds%n0(isppol) = sum(elph_ds%k_fine%wtk(:,:,isppol))/elph_ds%k_fine%nkpt
    4607                 :             : 
    4608                 :             :          e1 = e1 + de0
    4609                 :             :          ie_all = ie_all + 1
    4610                 :             :        end if
    4611                 :             :      end do ! e_all
    4612                 :             :      ne_all = ie_all - 1 + (n_edge1 + n_edge2 - 1)*edge ! energy levels in the free-electron range
    4613                 :             :      write(message,'(a,i3,a,i3,a)')' For spin', isppol, '  there are ', &
    4614                 :             : &     ne_all, '  energy levels considered '
    4615                 :             :      call wrtout(std_out,message,'COLL')
    4616                 :             : 
    4617                 :             :      elph_ds%nenergy = ne_all
    4618                 :             :    end if ! metal or insulator
    4619                 :             :  end do ! isppol
    4620                 :             : 
    4621         [ #  # ]:           0 :  ABI_FREE(tmp_wtk)
    4622                 :             : 
    4623         [ #  # ]:           0 :  if (elph_ds%nenergy .lt. 2) then
    4624                 :           0 :    ABI_ERROR('There are too few energy levels for non-LOVA')
    4625                 :             :  end if
    4626                 :             : 
    4627                 :           0 :  sz1=elph_ds%ngkkband;sz2=elph_ds%k_phon%nkpt
    4628                 :           0 :  sz3=elph_ds%nsppol;sz4=elph_ds%nenergy+1
    4629   [ #  #  #  #  :           0 :  ABI_MALLOC(elph_tr_ds%dos_n,(sz4,sz3))
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
    4630   [ #  #  #  #  :           0 :  ABI_MALLOC(elph_tr_ds%veloc_sq,(3,sz3,sz4))
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
    4631   [ #  #  #  #  :           0 :  ABI_MALLOC(elph_tr_ds%en_all,(sz3,sz4))
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    4632   [ #  #  #  #  :           0 :  ABI_MALLOC(elph_tr_ds%de_all,(sz3,sz4+1))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
    4633   [ #  #  #  #  :           0 :  ABI_MALLOC(elph_tr_ds%tmp_gkk_intweight,(sz1,sz2,sz3,sz4))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
    4634   [ #  #  #  #  :           0 :  ABI_MALLOC(elph_tr_ds%tmp_velocwtk,(sz1,sz2,3,sz3,sz4))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
    4635   [ #  #  #  #  :           0 :  ABI_MALLOC(elph_tr_ds%tmp_vvelocwtk,(sz1,sz2,3,3,sz3,sz4))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
    4636                 :             : 
    4637   [ #  #  #  # ]:           0 :  elph_tr_ds%dos_n = zero
    4638   [ #  #  #  #  :           0 :  elph_tr_ds%veloc_sq = zero
                   #  # ]
    4639   [ #  #  #  #  :           0 :  elph_tr_ds%tmp_gkk_intweight = zero
             #  #  #  # ]
    4640   [ #  #  #  #  :           0 :  elph_tr_ds%tmp_velocwtk = zero
          #  #  #  #  #  
                      # ]
    4641   [ #  #  #  #  :           0 :  elph_tr_ds%tmp_vvelocwtk = zero
          #  #  #  #  #  
                #  #  # ]
    4642                 :             : 
    4643   [ #  #  #  #  :           0 :  ABI_MALLOC_OR_DIE(elph_ds%k_phon%velocwtk,(elph_ds%nFSband,elph_ds%k_phon%nkpt,3,elph_ds%nsppol), ierr)
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
    4644                 :             : 
    4645   [ #  #  #  #  :           0 :  ABI_MALLOC_OR_DIE(elph_ds%k_phon%vvelocwtk,(elph_ds%nFSband,elph_ds%k_phon%nkpt,3,3,elph_ds%nsppol), ierr)
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
    4646                 :             : 
    4647   [ #  #  #  #  :           0 :  elph_ds%k_phon%velocwtk = zero
             #  #  #  # ]
    4648   [ #  #  #  #  :           0 :  elph_ds%k_phon%vvelocwtk = zero
          #  #  #  #  #  
                      # ]
    4649                 :             : 
    4650                 :             : !metal
    4651                 :             :  if (i_metal .eq. 1) then
    4652                 :           0 :    e1 = elph_ds%fermie - max_e
    4653         [ #  # ]:           0 :    en1(:) = elph_ds%fermie - max_e
    4654         [ #  # ]:           0 :    if (low_T .eq. 1) then
    4655                 :           0 :      enemin = elph_ds%fermie - max_e - elph_ds%delta_e
    4656                 :           0 :      enemax = elph_ds%fermie + max_e
    4657                 :             : 
    4658   [ #  #  #  #  :           0 :      ABI_MALLOC(tmp_wtk,(elph_ds%nFSband,elph_ds%k_fine%nkpt,elph_ds%nsppol,elph_ds%nenergy+1))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
    4659                 :             :      call ep_el_weights(elph_ds%ep_b_min, elph_ds%ep_b_max, eigenGS, elph_ds%elphsmear, &
    4660                 :             : &     enemin, enemax, elph_ds%nenergy+1, gprimd, elph_ds%k_fine%irredtoGS, elph_ds%kptrlatt_fine, max_occ, &
    4661                 :             : &     elph_ds%minFSband, elph_ds%nband, elph_ds%nFSband, &
    4662                 :           0 : &     elph_ds%nsppol, elph_ds%telphint, elph_ds%k_fine, tmp_wtk)
    4663                 :             : 
    4664         [ #  # ]:           0 :      do isppol=1,elph_ds%nsppol
    4665         [ #  # ]:           0 :        do ie1 = 1, elph_ds%nenergy
    4666                 :           0 :          elph_tr_ds%en_all(isppol,ie1) = en1(isppol)
    4667                 :           0 :          elph_tr_ds%de_all(isppol,ie1) = elph_ds%delta_e
    4668                 :             : 
    4669   [ #  #  #  # ]:           0 :          elph_ds%k_fine%wtk(:,:,isppol) = tmp_wtk(:,:,isppol,ie1+1)
    4670   [ #  #  #  # ]:           0 :          elph_ds%n0(isppol) = sum(elph_ds%k_fine%wtk(:,:,isppol))/elph_ds%k_fine%nkpt ! for get_veloc_tr
    4671   [ #  #  #  # ]:           0 :          elph_tr_ds%dos_n(ie1,isppol) = sum(elph_ds%k_fine%wtk(:,:,isppol))/elph_ds%k_fine%nkpt
    4672                 :             : 
    4673                 :           0 :          call get_veloc_tr(elph_ds,elph_tr_ds)
    4674         [ #  # ]:           0 :          elph_tr_ds%veloc_sq(:,isppol,ie1)=elph_tr_ds%FSelecveloc_sq(:,isppol)
    4675                 :             : 
    4676                 :           0 :          call d2c_weights(elph_ds,elph_tr_ds)
    4677                 :             : 
    4678   [ #  #  #  # ]:           0 :          elph_tr_ds%tmp_gkk_intweight(:,:,isppol,ie1) = elph_ds%k_phon%wtk(:,:,isppol)
    4679   [ #  #  #  #  :           0 :          elph_tr_ds%tmp_velocwtk(:,:,:,isppol,ie1) = elph_ds%k_phon%velocwtk(:,:,:,isppol)
                   #  # ]
    4680   [ #  #  #  #  :           0 :          elph_tr_ds%tmp_vvelocwtk(:,:,:,:,isppol,ie1) = elph_ds%k_phon%vvelocwtk(:,:,:,:,isppol)
             #  #  #  # ]
    4681                 :           0 :          en1(isppol) = en1(isppol) + elph_ds%delta_e
    4682                 :             :        end do
    4683                 :             :      end do
    4684         [ #  # ]:           0 :      ABI_FREE(tmp_wtk)
    4685                 :             : 
    4686                 :             :    else ! low_T = 0
    4687                 :           0 :      enemin = e1 - elph_ds%delta_e
    4688                 :           0 :      enemax = e1 + (out_nenergy-1)*elph_ds%delta_e
    4689                 :             : 
    4690   [ #  #  #  #  :           0 :      ABI_MALLOC(tmp_wtk,(elph_ds%nFSband,elph_ds%k_fine%nkpt,elph_ds%nsppol,out_nenergy+1))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    4691                 :             :      call ep_el_weights(elph_ds%ep_b_min, elph_ds%ep_b_max, eigenGS, elph_ds%elphsmear, &
    4692                 :             : &     enemin, enemax, out_nenergy+1, gprimd, elph_ds%k_fine%irredtoGS, elph_ds%kptrlatt_fine, max_occ, &
    4693                 :             : &     elph_ds%minFSband, elph_ds%nband, elph_ds%nFSband, &
    4694                 :           0 : &     elph_ds%nsppol, elph_ds%telphint, elph_ds%k_fine, tmp_wtk)
    4695         [ #  # ]:           0 :      do isppol=1,elph_ds%nsppol
    4696         [ #  # ]:           0 :        do ie1 = 1, out_nenergy
    4697                 :           0 :          elph_tr_ds%en_all(isppol,ie1) = en1(isppol)
    4698                 :           0 :          elph_tr_ds%de_all(isppol,ie1) = elph_ds%delta_e
    4699                 :             : 
    4700   [ #  #  #  # ]:           0 :          elph_ds%k_fine%wtk(:,:,isppol) = tmp_wtk(:,:,isppol,ie1+1)
    4701   [ #  #  #  # ]:           0 :          elph_ds%n0(isppol) = sum(elph_ds%k_fine%wtk(:,:,isppol))/elph_ds%k_fine%nkpt ! for get_veloc_tr
    4702   [ #  #  #  # ]:           0 :          elph_tr_ds%dos_n(ie1,isppol) = sum(elph_ds%k_fine%wtk(:,:,isppol))/elph_ds%k_fine%nkpt
    4703                 :             : 
    4704                 :           0 :          call get_veloc_tr(elph_ds,elph_tr_ds)
    4705         [ #  # ]:           0 :          elph_tr_ds%veloc_sq(:,isppol,ie1)=elph_tr_ds%FSelecveloc_sq(:,isppol)
    4706                 :             : 
    4707                 :           0 :          call d2c_weights(elph_ds,elph_tr_ds)
    4708                 :             : 
    4709   [ #  #  #  # ]:           0 :          elph_tr_ds%tmp_gkk_intweight(:,:,isppol,ie1) = elph_ds%k_phon%wtk(:,:,isppol)
    4710   [ #  #  #  #  :           0 :          elph_tr_ds%tmp_velocwtk(:,:,:,isppol,ie1) = elph_ds%k_phon%velocwtk(:,:,:,isppol)
                   #  # ]
    4711   [ #  #  #  #  :           0 :          elph_tr_ds%tmp_vvelocwtk(:,:,:,:,isppol,ie1) = elph_ds%k_phon%vvelocwtk(:,:,:,:,isppol)
             #  #  #  # ]
    4712                 :             : 
    4713                 :           0 :          en1(isppol) = en1(isppol) + elph_ds%delta_e
    4714                 :             :        end do
    4715                 :             :      end do
    4716         [ #  # ]:           0 :      ABI_FREE(tmp_wtk)
    4717                 :             : 
    4718                 :           0 :      e1 = en1(1)
    4719                 :           0 :      enemin = e1 - de0
    4720                 :           0 :      enemax = e1 + in_nenergy*2*de0
    4721                 :             : 
    4722   [ #  #  #  #  :           0 :      ABI_MALLOC(tmp_wtk,(elph_ds%nFSband,elph_ds%k_fine%nkpt,elph_ds%nsppol,in_nenergy*2+2))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
    4723                 :             :      call ep_el_weights(elph_ds%ep_b_min, elph_ds%ep_b_max, eigenGS, elph_ds%elphsmear, &
    4724                 :             : &     enemin, enemax, in_nenergy*2+2, gprimd, elph_ds%k_fine%irredtoGS, elph_ds%kptrlatt_fine, max_occ, &
    4725                 :             : &     elph_ds%minFSband, elph_ds%nband, elph_ds%nFSband, &
    4726                 :           0 : &     elph_ds%nsppol, elph_ds%telphint, elph_ds%k_fine, tmp_wtk)
    4727                 :             : 
    4728         [ #  # ]:           0 :      do isppol=1,elph_ds%nsppol
    4729         [ #  # ]:           0 :        do ie1 = out_nenergy+1, out_nenergy+in_nenergy*2+1
    4730                 :           0 :          elph_tr_ds%en_all(isppol,ie1) = en1(isppol)
    4731                 :           0 :          elph_tr_ds%de_all(isppol,ie1) = de0
    4732                 :             : 
    4733   [ #  #  #  # ]:           0 :          elph_ds%k_fine%wtk(:,:,isppol) = tmp_wtk(:,:,isppol,ie1-out_nenergy+1)
    4734   [ #  #  #  # ]:           0 :          elph_ds%n0(isppol) = sum(elph_ds%k_fine%wtk(:,:,isppol))/elph_ds%k_fine%nkpt ! for get_veloc_tr
    4735   [ #  #  #  # ]:           0 :          elph_tr_ds%dos_n(ie1,isppol) = sum(elph_ds%k_fine%wtk(:,:,isppol))/elph_ds%k_fine%nkpt
    4736                 :             : 
    4737                 :           0 :          call get_veloc_tr(elph_ds,elph_tr_ds)
    4738         [ #  # ]:           0 :          elph_tr_ds%veloc_sq(:,isppol,ie1)=elph_tr_ds%FSelecveloc_sq(:,isppol)
    4739                 :             : 
    4740                 :           0 :          call d2c_weights(elph_ds,elph_tr_ds)
    4741                 :             : 
    4742   [ #  #  #  # ]:           0 :          elph_tr_ds%tmp_gkk_intweight(:,:,isppol,ie1) = elph_ds%k_phon%wtk(:,:,isppol)
    4743   [ #  #  #  #  :           0 :          elph_tr_ds%tmp_velocwtk(:,:,:,isppol,ie1) = elph_ds%k_phon%velocwtk(:,:,:,isppol)
                   #  # ]
    4744   [ #  #  #  #  :           0 :          elph_tr_ds%tmp_vvelocwtk(:,:,:,:,isppol,ie1) = elph_ds%k_phon%vvelocwtk(:,:,:,:,isppol)
             #  #  #  # ]
    4745                 :             : 
    4746                 :           0 :          en1(isppol) = en1(isppol) + de0
    4747                 :             :        end do
    4748                 :             :      end do
    4749         [ #  # ]:           0 :      ABI_FREE(tmp_wtk)
    4750                 :             : 
    4751                 :           0 :      e1 = en1(1)
    4752                 :           0 :      enemin = e1 - elph_ds%delta_e
    4753                 :           0 :      enemax = e1 + (out_nenergy-1)*elph_ds%delta_e
    4754                 :             : 
    4755   [ #  #  #  #  :           0 :      ABI_MALLOC(tmp_wtk,(elph_ds%nFSband,elph_ds%k_fine%nkpt,elph_ds%nsppol,out_nenergy+1))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    4756                 :             :      call ep_el_weights(elph_ds%ep_b_min, elph_ds%ep_b_max, eigenGS, elph_ds%elphsmear, &
    4757                 :             : &     enemin, enemax, out_nenergy+1, gprimd, elph_ds%k_fine%irredtoGS, elph_ds%kptrlatt_fine, max_occ, &
    4758                 :             : &     elph_ds%minFSband, elph_ds%nband, elph_ds%nFSband, &
    4759                 :           0 : &     elph_ds%nsppol, elph_ds%telphint, elph_ds%k_fine, tmp_wtk)
    4760                 :             : 
    4761         [ #  # ]:           0 :      en1(:) = en1(:) - de0 + elph_ds%delta_e ! adjust to make the points symmetric around Ef
    4762         [ #  # ]:           0 :      do isppol=1,elph_ds%nsppol
    4763         [ #  # ]:           0 :        do ie1 = out_nenergy+in_nenergy*2+2, in_nenergy*2+1+out_nenergy*2
    4764                 :           0 :          elph_tr_ds%en_all(isppol,ie1) = en1(isppol)
    4765                 :           0 :          elph_tr_ds%de_all(isppol,ie1) = elph_ds%delta_e
    4766                 :             : 
    4767   [ #  #  #  # ]:           0 :          elph_ds%k_fine%wtk(:,:,isppol) = tmp_wtk(:,:,isppol,ie1-out_nenergy-in_nenergy*2)
    4768   [ #  #  #  # ]:           0 :          elph_ds%n0(isppol) = sum(elph_ds%k_fine%wtk(:,:,isppol))/elph_ds%k_fine%nkpt ! for get_veloc_tr
    4769   [ #  #  #  # ]:           0 :          elph_tr_ds%dos_n(ie1,isppol) = sum(elph_ds%k_fine%wtk(:,:,isppol))/elph_ds%k_fine%nkpt
    4770                 :             : 
    4771                 :           0 :          call get_veloc_tr(elph_ds,elph_tr_ds)
    4772         [ #  # ]:           0 :          elph_tr_ds%veloc_sq(:,isppol,ie1)=elph_tr_ds%FSelecveloc_sq(:,isppol)
    4773                 :             : 
    4774                 :           0 :          call d2c_weights(elph_ds,elph_tr_ds)
    4775                 :             : 
    4776   [ #  #  #  # ]:           0 :          elph_tr_ds%tmp_gkk_intweight(:,:,isppol,ie1) = elph_ds%k_phon%wtk(:,:,isppol)
    4777   [ #  #  #  #  :           0 :          elph_tr_ds%tmp_velocwtk(:,:,:,isppol,ie1) = elph_ds%k_phon%velocwtk(:,:,:,isppol)
                   #  # ]
    4778   [ #  #  #  #  :           0 :          elph_tr_ds%tmp_vvelocwtk(:,:,:,:,isppol,ie1) = elph_ds%k_phon%vvelocwtk(:,:,:,:,isppol)
             #  #  #  # ]
    4779                 :             : 
    4780                 :           0 :          en1(isppol) = en1(isppol) + elph_ds%delta_e
    4781                 :             :        end do
    4782                 :             :      end do
    4783         [ #  # ]:           0 :      ABI_FREE(tmp_wtk)
    4784                 :             :    end if
    4785                 :             : 
    4786                 :             : !semiconductor
    4787                 :             :  else if (i_metal .eq. 0) then
    4788                 :             :    e1 = elph_ds%fermie - max_e
    4789                 :             :    ie_all = 1
    4790                 :             : 
    4791                 :             :    call ep_fs_weights(elph_ds%ep_b_min, elph_ds%ep_b_max, eigenGS, elph_ds%elphsmear, &
    4792                 :             : &   e1, gprimd, elph_ds%k_fine%irredtoGS, elph_ds%kptrlatt_fine, max_occ, &
    4793                 :             : &   elph_ds%minFSband, elph_ds%nband, elph_ds%nFSband, &
    4794                 :             : &   elph_ds%nsppol, elph_ds%telphint, elph_ds%k_fine)
    4795                 :             : 
    4796                 :             :    elph_ds%n0(isppol) = sum(elph_ds%k_fine%wtk(:,:,isppol))/elph_ds%k_fine%nkpt
    4797                 :             :    do while ((e1-elph_ds%fermie) .lt. max_e)
    4798                 :             :      if (e1 .lt. e_cb_min .and. elph_ds%n0(isppol) .lt. tol9) then
    4799                 :             :        e1 = e_cb_min
    4800                 :             :      end if
    4801                 :             : 
    4802                 :             :      if (ie_all .ge. n_edge1+n_edge2) then
    4803                 :             :        if (ie_all .eq. n_edge1+n_edge2) e1 = e1 + de0
    4804                 :             :        call ep_fs_weights(elph_ds%ep_b_min, elph_ds%ep_b_max, eigenGS, elph_ds%elphsmear, &
    4805                 :             : &       e1, gprimd, elph_ds%k_fine%irredtoGS, elph_ds%kptrlatt_fine, max_occ, &
    4806                 :             : &       elph_ds%minFSband, elph_ds%nband, elph_ds%nFSband, &
    4807                 :             : &       elph_ds%nsppol, elph_ds%telphint, elph_ds%k_fine)
    4808                 :             : 
    4809                 :             :        elph_tr_ds%tmp_gkk_intweight(:,:,isppol,ie_all) = elph_ds%k_fine%wtk(:,:,isppol)
    4810                 :             :        elph_tr_ds%dos_n(ie_all,isppol) = sum(elph_ds%k_fine%wtk(:,:,isppol))/elph_ds%k_fine%nkpt
    4811                 :             :        elph_ds%n0(isppol) = sum(elph_ds%k_fine%wtk(:,:,isppol))/elph_ds%k_fine%nkpt ! for get_veloc_tr
    4812                 :             : 
    4813                 :             :        elph_tr_ds%en_all(isppol,ie_all) = e1
    4814                 :             :        call get_veloc_tr(elph_ds,elph_tr_ds)
    4815                 :             :        elph_tr_ds%veloc_sq(:,isppol,ie_all)=elph_tr_ds%FSelecveloc_sq(:,isppol)
    4816                 :             : !      bxu
    4817                 :             : !      veloc_sq(1,isppol,ie_all) is "1" good and general??
    4818                 :             : 
    4819                 :             :        elph_tr_ds%de_all(isppol,ie_all) = de0
    4820                 :             :        e1 = e1 + elph_tr_ds%de_all(isppol,ie_all)
    4821                 :             :        ie_all = ie_all + 1
    4822                 :             :      else ! divided according to the 1/DOS (evenly)
    4823                 :             :        if (ie_all .lt. n_edge1) then
    4824                 :             :          elph_tr_ds%en_all(isppol,ie_all) = e_cb_min + &
    4825                 :             : &         (e_tiny**(-0.5_dp) - ie_all*(e_tiny**(-0.5_dp)-(e_cb_2nd(1)-e_cb_min)**(-0.5_dp))/ &
    4826                 :             : &         dble(n_edge1))**(-2.0_dp)
    4827                 :             :          if (ie_all .gt. 1) then
    4828                 :             :            elph_tr_ds%de_all(isppol,ie_all) = elph_tr_ds%en_all(isppol,ie_all) - elph_tr_ds%en_all(isppol,ie_all-1)
    4829                 :             :          else
    4830                 :             :            elph_tr_ds%de_all(isppol,ie_all) = elph_tr_ds%en_all(isppol,ie_all) - e_cb_min - e_tiny
    4831                 :             :          end if
    4832                 :             :          e1 = elph_tr_ds%en_all(isppol,ie_all)
    4833                 :             :        else
    4834                 :             :          elph_tr_ds%en_all(isppol,ie_all) = e_cb_min + &
    4835                 :             : &         ((ie_all-n_edge1+1)/dble(n_edge2))**2.0_dp*(e_cb_2nd(1)-e_cb_min)
    4836                 :             :          if (ie_all .gt. 1) then
    4837                 :             :            elph_tr_ds%de_all(isppol,ie_all) = elph_tr_ds%en_all(isppol,ie_all) - elph_tr_ds%en_all(isppol,ie_all-1)
    4838                 :             :          else
    4839                 :             :            elph_tr_ds%de_all(isppol,ie_all) = (e_cb_2nd(1)-e_cb_min)/(dble(n_edge2)**2.0_dp)
    4840                 :             :          end if
    4841                 :             :          e1 = elph_tr_ds%en_all(isppol,ie_all)
    4842                 :             :        end if
    4843                 :             : 
    4844                 :             :        call ep_fs_weights(elph_ds%ep_b_min, elph_ds%ep_b_max, eigenGS, elph_ds%elphsmear, &
    4845                 :             : &       e1, gprimd, elph_ds%k_fine%irredtoGS, elph_ds%kptrlatt_fine, max_occ, &
    4846                 :             : &       elph_ds%minFSband, elph_ds%nband, elph_ds%nFSband, &
    4847                 :             : &       elph_ds%nsppol, elph_ds%telphint, elph_ds%k_fine)
    4848                 :             : 
    4849                 :             :        elph_ds%n0(isppol) = sum(elph_ds%k_fine%wtk(:,:,isppol))/elph_ds%k_fine%nkpt ! for get_veloc_tr
    4850                 :             : 
    4851                 :             :        tmp_dos = (ucvol/2.0_dp/pi**2.0_dp)*(2.0_dp*eff_mass1)**1.5_dp*(e1-e_cb_min)**0.5_dp + &
    4852                 :             : &       2.0_dp*(ucvol/2.0_dp/pi**2.0_dp)*(2.0_dp*eff_mass2)**1.5_dp*(e1-e_cb_min)**0.5_dp
    4853                 :             :        elph_tr_ds%dos_n(ie_all,isppol) = tmp_dos
    4854                 :             :        elph_tr_ds%tmp_gkk_intweight(:,:,isppol,ie_all) = elph_ds%k_fine%wtk(:,:,isppol)*tmp_dos/elph_ds%n0(isppol)
    4855                 :             : 
    4856                 :             :        call get_veloc_tr(elph_ds,elph_tr_ds)
    4857                 :             :        elph_tr_ds%veloc_sq(:,isppol,ie_all)=elph_tr_ds%FSelecveloc_sq(:,isppol)
    4858                 :             : 
    4859                 :             :        if (ie_all .eq. (n_edge1+n_edge2)) e1 = e_cb_2nd(1) + de0
    4860                 :             :        ie_all = ie_all + 1
    4861                 :             :      end if
    4862                 :             :    end do ! ie_all
    4863                 :             :  else
    4864                 :             :    ABI_BUG('check i_metal!')
    4865                 :             :  end if ! metal or insulator
    4866                 :             : 
    4867         [ #  # ]:           0 :  ABI_FREE(dos_e1)
    4868                 :             : 
    4869                 :           0 : end subroutine get_nv_fs_en
    4870                 :             : !!***
    4871                 :             : 
    4872                 :             : !!****f* ABINIT/get_nv_fs_temp
    4873                 :             : !! NAME
    4874                 :             : !!  get_nv_fs_temp
    4875                 :             : !!
    4876                 :             : !! FUNCTION
    4877                 :             : !! This routine calculates the fermi energy, FD smeared DOS(Ef) and
    4878                 :             : !! Veloc_sq(Ef) at looped temperatures.
    4879                 :             : !!
    4880                 :             : !! INPUTS
    4881                 :             : !!  elph_ds
    4882                 :             : !!    elph_ds%nband = number of bands in ABINIT
    4883                 :             : !!    elph_ds%k_fine%nkptirr = Number of irreducible points for which there exist at least one band that crosses the Fermi level.
    4884                 :             : !!    elph_ds%nFSband = number of bands included in the FS integration
    4885                 :             : !!    elph_ds%k_fine%nkpt = number of k points for fine k-grid
    4886                 :             : !!    elph_ds%k_phon%nkpt = number of k points for coarse k-grid
    4887                 :             : !!    elph_ds%tempermin = minimum temperature at which resistivity etc are calculated (in K)
    4888                 :             : !!    elph_ds%temperinc = interval temperature grid on which resistivity etc are calculated (in K)
    4889                 :             : !!    elph_ds%ep_b_min= first band taken into account in FS integration (if telphint==2)
    4890                 :             : !!    elph_ds%ep_b_max= last band taken into account in FS integration (if telphint==2)
    4891                 :             : !!    elph_ds%telphint = flag for integration over the FS with 0=tetrahedra 1=gaussians
    4892                 :             : !!    elph_ds%elphsmear = smearing width for gaussian integration
    4893                 :             : !!           or buffer in energy for calculations with tetrahedra (telphint=0)
    4894                 :             : !!
    4895                 :             : !!  eigenGS = Ground State eigenvalues
    4896                 :             : !!  gprimd = reciprocal lattice vectors (dimensionful)
    4897                 :             : !!  kptrlatt_fine = k-point grid vectors (if divided by determinant of present matrix)
    4898                 :             : !!  max_occ = maximal occupancy for a band
    4899                 :             : !!
    4900                 :             : !! OUTPUT
    4901                 :             : !!  elph_ds%fermie=Fermi level at input temperature
    4902                 :             : !!  elph_tr_ds%dos_n0=DOS(Ef) at looped temperatures
    4903                 :             : !!  elph_tr_ds%veloc_sq0=FS averaged velocity at Ef at looped temperatures
    4904                 :             : !!
    4905                 :             : !! SOURCE
    4906                 :             : 
    4907                 :           0 : subroutine get_nv_fs_temp(elph_ds,BSt,eigenGS,gprimd,max_occ,elph_tr_ds)
    4908                 :             : 
    4909                 :             : !Arguments ------------------------------------
    4910                 :             :  type(elph_type),intent(inout) :: elph_ds
    4911                 :             :  type(ebands_t),intent(inout)   :: BSt
    4912                 :             :  type(elph_tr_type),intent(inout) :: elph_tr_ds
    4913                 :             : 
    4914                 :             : !Scalars
    4915                 :             :  real(dp), intent(in) :: max_occ
    4916                 :             : 
    4917                 :             : ! arrays
    4918                 :             :  real(dp), intent(in) :: gprimd(3,3)
    4919                 :             :  real(dp), intent(in) :: eigenGS(elph_ds%nband,elph_ds%k_fine%nkptirr,elph_ds%nsppol)
    4920                 :             : 
    4921                 :             : !Local variables-------------------------------
    4922                 :             : 
    4923                 :             :  integer :: isppol!, ie1
    4924                 :             :  integer :: itemp, tmp_nenergy
    4925                 :             : 
    4926                 :             :  character(len=500) :: message
    4927                 :             : 
    4928                 :             :  real(dp) :: Temp, tmp_elphsmear, tmp_delta_e
    4929                 :             : ! real(dp) :: xtr, e1
    4930                 :             : ! real(dp),allocatable :: tmp_wtk(:,:)
    4931                 :             : ! *************************************************************************
    4932                 :             : 
    4933   [ #  #  #  #  :           0 :  ABI_MALLOC(elph_tr_ds%dos_n0,(elph_ds%ntemper,elph_ds%nsppol))
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
    4934   [ #  #  #  #  :           0 :  ABI_MALLOC(elph_tr_ds%veloc_sq0,(elph_ds%ntemper,3,elph_ds%nsppol))
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
    4935                 :             : !if (elph_ds%use_k_fine == 1) then
    4936                 :             : !ABI_MALLOC(tmp_wtk,(elph_ds%nFSband,elph_ds%k_fine%nkpt))
    4937                 :             : !else
    4938                 :             : !ABI_MALLOC(tmp_wtk,(elph_ds%nFSband,elph_ds%k_phon%nkpt))
    4939                 :             : !end if
    4940                 :             : 
    4941   [ #  #  #  # ]:           0 :  elph_tr_ds%dos_n0 = zero
    4942   [ #  #  #  #  :           0 :  elph_tr_ds%veloc_sq0 = zero
                   #  # ]
    4943                 :             : 
    4944                 :             :  tmp_nenergy = 8
    4945         [ #  # ]:           0 :  do itemp=1,elph_ds%ntemper  ! runs over temperature in K
    4946                 :           0 :    Temp=elph_ds%tempermin + elph_ds%temperinc*dble(itemp)
    4947                 :           0 :    tmp_delta_e = kb_HaK*Temp
    4948                 :           0 :    Bst%occopt = 3
    4949                 :           0 :    Bst%tsmear = Temp*kb_HaK
    4950                 :           0 :    tmp_elphsmear = Temp*kb_HaK
    4951                 :           0 :    call Bst%update_occ(-99.99_dp)
    4952                 :           0 :    write(message,'(a,f12.6,a,E20.12)')'At T=',Temp,' Fermi level is:',Bst%fermie
    4953                 :           0 :    call wrtout(std_out,message,'COLL')
    4954         [ #  # ]:           0 :    if (abs(elph_ds%fermie) < tol10) then
    4955                 :           0 :      elph_ds%fermie = BSt%fermie
    4956                 :             :    end if
    4957                 :             : 
    4958                 :             : !  FD smeared DOS and veloc
    4959                 :             : 
    4960                 :             :    call ep_fs_weights(elph_ds%ep_b_min, elph_ds%ep_b_max, eigenGS, tmp_elphsmear, &
    4961                 :             : &   elph_ds%fermie, gprimd, elph_ds%k_fine%irredtoGS, elph_ds%kptrlatt_fine,&
    4962                 :             : &   max_occ, elph_ds%minFSband, elph_ds%nband, elph_ds%nFSband, &
    4963                 :           0 : &   elph_ds%nsppol, elph_ds%telphint, elph_ds%k_fine)
    4964                 :             : 
    4965         [ #  # ]:           0 :    do isppol=1,elph_ds%nsppol
    4966   [ #  #  #  # ]:           0 :      elph_ds%n0(isppol) = sum(elph_ds%k_fine%wtk(:,:,isppol))/elph_ds%k_fine%nkpt
    4967                 :           0 :      write(message,'(a,f12.6,a,f12.6)')'At T=',Temp,' The DOS at Ef is:', elph_ds%n0(isppol)
    4968                 :           0 :      call wrtout(std_out,message,'COLL')
    4969                 :             : 
    4970                 :             : !    For the non-LOVA case, N(Ef) is not that important (canceled out eventually).
    4971                 :             : !    Should not be important for metal, comment out for now
    4972                 :             : !    tmp_wtk = zero
    4973                 :             : !    do ie1=-tmp_nenergy,tmp_nenergy ! use ie1 here, hope there is no confusion
    4974                 :             : !    e1=Bst%fermie+ie1*tmp_delta_e
    4975                 :             : !    xtr=(e1-Bst%fermie)/(2.0_dp*kb_HaK*Temp)
    4976                 :             : !
    4977                 :             : !    call ep_fs_weights(elph_ds%ep_b_min, elph_ds%ep_b_max, eigenGS, elph_ds%elphsmear, &
    4978                 :             : !    &       e1, gprimd, elph_ds%k_fine%irredtoGS, elph_ds%kptrlatt_fine, &
    4979                 :             : !    &       max_occ, elph_ds%minFSband, elph_ds%nband, elph_ds%nFSband, &
    4980                 :             : !    &       elph_ds%nsppol, elph_ds%telphint, elph_ds%k_fine)
    4981                 :             : !
    4982                 :             : !    tmp_wtk(:,:) = tmp_wtk(:,:) + elph_ds%k_fine%wtk(:,:,isppol)* &
    4983                 :             : !    &       tmp_delta_e/(4.0d0*kb_HaK*Temp)/(COSH(xtr)**2.0d0)
    4984                 :             : !    end do ! ie1
    4985                 :             : 
    4986                 :             : !    elph_ds%k_fine%wtk(:,:,isppol) = tmp_wtk(:,:)
    4987   [ #  #  #  # ]:           0 :      elph_tr_ds%dos_n0(itemp,isppol) = sum(elph_ds%k_fine%wtk(:,:,isppol))/elph_ds%k_fine%nkpt
    4988                 :             : !    elph_ds%n0(isppol) = sum(elph_ds%k_fine%wtk(:,:,isppol))/elph_ds%k_fine%nkpt ! for get_veloc_tr
    4989                 :             : !    write(message,'(a,f12.6,a,f12.6)')'At T=',Temp,' The eff. DOS at Ef is:', elph_tr_ds%dos_n0(itemp,isppol)
    4990                 :             : !    call wrtout(std_out,message,'COLL')
    4991                 :             :    end do ! isppol
    4992                 :           0 :    call get_veloc_tr(elph_ds,elph_tr_ds)
    4993   [ #  #  #  #  :           0 :    elph_tr_ds%veloc_sq0(itemp,:,:) = elph_tr_ds%FSelecveloc_sq(:,:)
          #  #  #  #  #  
                      # ]
    4994                 :             : 
    4995                 :             :  end do ! temperature
    4996                 :             : 
    4997                 :           0 : end subroutine get_nv_fs_temp
    4998                 :             : !!***
    4999                 :             : 
    5000                 :             : !!****f* ABINIT/get_veloc_tr
    5001                 :             : !!
    5002                 :             : !! NAME
    5003                 :             : !! get_veloc_tr
    5004                 :             : !!
    5005                 :             : !! FUNCTION
    5006                 :             : !!  calculate the (in) and (out) velocity factors for transport
    5007                 :             : !!
    5008                 :             : !! INPUTS
    5009                 :             : !!  elph_ds
    5010                 :             : !!    elph_ds%nFSband = number of bands included in the FS integration
    5011                 :             : !!    elph_ds%k_fine%nkpt = number of kpts included in the FS integration
    5012                 :             : !!    elph_ds%nFSband = number of bands included in the FS integration
    5013                 :             : !!    elph_ds%minFSband = index of the lowest FS band
    5014                 :             : !!    elph_ds%nqpt_full  = number of Q pts
    5015                 :             : !!    elph_ds%nqptirred  = number of irreducible Q pts
    5016                 :             : !!  to index the GS electronic states :
    5017                 :             : !!  kphon_full2irr = mapping of full FS kpts to irreducible ones
    5018                 :             : !!   FSfullpqtofull = mapping of k + q to k
    5019                 :             : !!   FSirredtoGS = mapping of irreducible kpoints to GS set
    5020                 :             : !!
    5021                 :             : !! OUTPUT
    5022                 :             : !! elph_tr_ds%FSelecveloc_sq = avergae FS electronic velocity
    5023                 :             : !!
    5024                 :             : !! SOURCE
    5025                 :             : 
    5026                 :           5 : subroutine get_veloc_tr(elph_ds,elph_tr_ds)
    5027                 :             : 
    5028                 :             : !Arguments ------------------------------------
    5029                 :             : !arrays
    5030                 :             :   type(elph_type),intent(in) :: elph_ds
    5031                 :             :   type(elph_tr_type),intent(inout) :: elph_tr_ds
    5032                 :             : 
    5033                 :             : !Local variables-------------------------------
    5034                 :             :   !scalars
    5035                 :             :   integer :: ikpt_fine
    5036                 :             :   integer :: ib1,fib1,isppol, ii
    5037                 :             :   real(dp) :: eta2
    5038                 :             :   !arrays
    5039                 :             :   real(dp) :: elvelock(3)
    5040                 :             : 
    5041                 :             : ! *********************************************************************
    5042                 :             : 
    5043         [ -  + ]:           5 :  ABI_CHECK(allocated(elph_tr_ds%FSelecveloc_sq),"FSele not associated")
    5044                 :             : 
    5045                 :             : 
    5046                 :             : !precalculate the Fermi speed modulus squared
    5047   [ +  +  +  + ]:          25 :  elph_tr_ds%FSelecveloc_sq = zero
    5048         [ +  + ]:          10 :  do isppol=1,elph_ds%nsppol
    5049         [ +  + ]:         429 :    do ikpt_fine=1,elph_ds%k_fine%nkpt
    5050         [ +  + ]:        3197 :      do ib1=1,elph_ds%nFSband
    5051                 :        2768 :        fib1=ib1+elph_ds%minFSband-1
    5052         [ +  + ]:       11072 :        elvelock(:)=elph_tr_ds%el_veloc(ikpt_fine,fib1,:,isppol)
    5053         [ +  + ]:       11496 :        do ii=1, 3
    5054                 :        8304 :          eta2=elvelock(ii)*elvelock(ii)
    5055                 :             :          elph_tr_ds%FSelecveloc_sq(ii, isppol)=elph_tr_ds%FSelecveloc_sq(ii, isppol)&
    5056                 :       11072 : &         +eta2*elph_ds%k_fine%wtk(ib1,ikpt_fine,isppol)
    5057                 :             :        end do
    5058                 :             :      end do
    5059                 :             :    end do
    5060         [ +  + ]:          25 :    elph_tr_ds%FSelecveloc_sq(:,isppol) = elph_tr_ds%FSelecveloc_sq(:,isppol)/elph_ds%k_fine%nkpt/elph_ds%n0(isppol)
    5061                 :             : !  for factor 1/elph_ds%n0(isppol) see eq 12 of Allen prb 17 3725 [[cite:Allen1978]] : sum of v**2 over all k gives n0 times FSelecveloc_sq
    5062                 :             :  end do ! end isppol
    5063                 :           5 :  write (std_out,*) '  get_veloc_tr: FSelecveloc_sq ', elph_tr_ds%FSelecveloc_sq
    5064                 :             : 
    5065                 :           5 :  write (std_out,*) 'out of get_veloc_tr'
    5066                 :             : 
    5067                 :           5 : end subroutine get_veloc_tr
    5068                 :             : !!***
    5069                 :             : 
    5070                 :             : !!****f* ABINIT/integrate_gamma
    5071                 :             : !!
    5072                 :             : !! NAME
    5073                 :             : !! integrate_gamma
    5074                 :             : !!
    5075                 :             : !! FUNCTION
    5076                 :             : !! This routine integrates the electron phonon coupling matrix
    5077                 :             : !! over the kpoints on the fermi surface. A dependency on qpoint
    5078                 :             : !! remains for gamma_qpt
    5079                 :             : !!
    5080                 :             : !! INPUTS
    5081                 :             : !!   elph_ds = elphon datastructure with data and dimensions
    5082                 :             : !!      elph_ds%qpt_full = qpoint coordinates
    5083                 :             : !!      elph_ds%nqptirred = number of irred qpoints
    5084                 :             : !!      elph_ds%qirredtofull = indexing of the GKK qpoints found
    5085                 :             : !!   FSfullpqtofull = mapping of k+q to k
    5086                 :             : !!
    5087                 :             : !! OUTPUT
    5088                 :             : !!   elph_ds = modified elph_ds%gamma_qpt and created elph_ds%gamma_rpt
    5089                 :             : !!
    5090                 :             : !! SOURCE
    5091                 :             : 
    5092                 :          15 : subroutine integrate_gamma(elph_ds,FSfullpqtofull)
    5093                 :             : 
    5094                 :             : !Arguments ------------------------------------
    5095                 :             : !scalars
    5096                 :             :  type(elph_type),intent(inout) :: elph_ds
    5097                 :             : !arrays
    5098                 :             :  integer,intent(in) :: FSfullpqtofull(elph_ds%k_phon%nkpt,elph_ds%nqpt_full)
    5099                 :             : 
    5100                 :             : !Local variables-------------------------------
    5101                 :             : !scalars
    5102                 :             :  integer :: comm,ikpt_phon,ikpt_phonq,ib1,ib2,ibeff,iqpt,iqpt_fullbz,isppol,ierr
    5103                 :             :  integer :: irec, symrankkpt_phon,nbranch,nsppol,ngkkband, ik_this_proc
    5104                 :             :  character(len=500) :: message
    5105                 :             :  character(len=fnlen) :: fname
    5106                 :             : !arrays
    5107                 :          15 :  real(dp),allocatable :: tmp_gkk(:,:,:,:)
    5108                 :             : ! *************************************************************************
    5109                 :             : 
    5110                 :          15 :  comm = xmpi_world
    5111                 :             : 
    5112                 :          15 :  write (message,'(3a)')ch10,' entering integrate_gamma ',ch10
    5113                 :          15 :  call wrtout(std_out,message,'COLL')
    5114                 :             : 
    5115                 :          15 :  nsppol   = elph_ds%nsppol
    5116                 :          15 :  nbranch  = elph_ds%nbranch
    5117                 :          15 :  ngkkband = elph_ds%ngkkband
    5118                 :             : 
    5119   [ -  +  +  -  :          75 :  ABI_MALLOC(elph_ds%gamma_qpt,(2,nbranch**2,nsppol,elph_ds%nqpt_full))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                +  -  + ]
    5120   [ +  +  +  +  :        5663 :  elph_ds%gamma_qpt = zero
             +  +  +  + ]
    5121                 :             : 
    5122   [ -  +  +  -  :          75 :  ABI_MALLOC(tmp_gkk ,(2,ngkkband**2,nbranch**2,nsppol))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                +  -  + ]
    5123                 :             : 
    5124         [ +  + ]:          15 :  if (elph_ds%gkqwrite == 0) then
    5125                 :          14 :    call wrtout(std_out,' integrate_gamma : keeping gamma matrices in memory','COLL')
    5126         [ +  - ]:           1 :  else if (elph_ds%gkqwrite == 1) then
    5127         [ +  - ]:           1 :    fname=trim(elph_ds%elph_base_name) // '_GKKQ'
    5128                 :           1 :    write (message,'(2a)')' integrate_gamma : reading gamma matrices from file ',trim(fname)
    5129                 :           1 :    call wrtout(std_out,message,'COLL')
    5130                 :             :  else
    5131                 :           0 :    write (message,'(a,i0)')' Wrong value for gkqwrite = ',elph_ds%gkqwrite
    5132                 :           0 :    ABI_BUG(message)
    5133                 :             :  end if
    5134                 :             : 
    5135                 :             : 
    5136                 :             : 
    5137         [ +  + ]:          63 :  do iqpt=1,elph_ds%nqptirred
    5138                 :          48 :    iqpt_fullbz = elph_ds%qirredtofull(iqpt)
    5139                 :          48 :    symrankkpt_phon = elph_ds%k_phon%krank%get_rank (elph_ds%k_phon%kpt(:,iqpt_fullbz))
    5140                 :          48 :    write (std_out,*) ' iqpt_fullbz in qpt grid only,  rank ', iqpt_fullbz, symrankkpt_phon
    5141                 :             : 
    5142         [ +  + ]:        4143 :    do ik_this_proc =1,elph_ds%k_phon%my_nkpt
    5143                 :        4080 :      ikpt_phon = elph_ds%k_phon%my_ikpt(ik_this_proc)
    5144                 :             : 
    5145         [ +  + ]:        4080 :      if (elph_ds%gkqwrite == 0) then
    5146   [ +  -  +  -  :     4595856 :        tmp_gkk = elph_ds%gkk_qpt(:,:,:,ik_this_proc,:,iqpt)
          +  -  +  -  -  
          +  -  -  +  +  
          +  +  +  +  +  
                      + ]
    5147         [ +  - ]:         192 :      else if (elph_ds%gkqwrite == 1) then
    5148                 :         192 :        irec = (iqpt-1)*elph_ds%k_phon%my_nkpt+ik_this_proc
    5149         [ +  + ]:         192 :        if (ikpt_phon == 1) then
    5150                 :           3 :          write (std_out,*) ' integrate_gamma  read record ', irec
    5151                 :             :        end if
    5152                 :         192 :        read (elph_ds%unitgkq,REC=irec) tmp_gkk(:,:,:,:)
    5153                 :             :      end if
    5154                 :             : 
    5155         [ +  + ]:        8232 :      do isppol=1,nsppol
    5156                 :        4104 :        ikpt_phonq = FSfullpqtofull(ikpt_phon,iqpt_fullbz)
    5157                 :             : !
    5158         [ +  + ]:       20264 :        do ib1=1,ngkkband
    5159         [ +  + ]:       82904 :          do ib2=1,ngkkband
    5160                 :       66720 :            ibeff = ib2+(ib1-1)*ngkkband
    5161                 :             :            elph_ds%gamma_qpt(:,:,isppol,iqpt_fullbz) = elph_ds%gamma_qpt(:,:,isppol,iqpt_fullbz) + &
    5162                 :             : &           tmp_gkk(:,ibeff,:,isppol)&
    5163   [ +  +  +  + ]:     4617392 : &           *elph_ds%gkk_intweight(ib1,ikpt_phon,isppol)*elph_ds%gkk_intweight(ib2,ikpt_phonq,isppol)
    5164                 :             : !          NOTE: if ngkkband==1 we are using trivial weights since average
    5165                 :             : !          over bands was done in normsq_gkk (nmsq_gam_sumFS or nmsq_pure_gkk)
    5166                 :             :          end do ! ib2
    5167                 :             :        end do ! ib1
    5168                 :             :      end do ! isppol
    5169                 :             :    end do ! ikpt_phon
    5170                 :             :  end do ! iqpt
    5171                 :             : 
    5172                 :          15 :  call xmpi_sum (elph_ds%gamma_qpt, comm, ierr)
    5173                 :             : 
    5174         [ -  + ]:          15 :  ABI_FREE(tmp_gkk)
    5175                 :             : 
    5176                 :             : !need prefactor of 1/nkpt for each integration over 1 kpoint index. NOT INCLUDED IN elph_ds%gkk_intweight
    5177         [ +  + ]:          63 :  do iqpt=1,elph_ds%nqptirred
    5178                 :          48 :    iqpt_fullbz = elph_ds%qirredtofull(iqpt)
    5179                 :             : !  elph_ds%gamma_qpt(:,:,:,iqpt_fullbz) = elph_ds%gamma_qpt(:,:,:,iqpt_fullbz) / elph_ds%k_phon%nkpt / n0(1) / n0(1)
    5180                 :             : !  elph_ds%gamma_qpt(:,:,:,iqpt_fullbz) = elph_ds%gamma_qpt(:,:,:,iqpt_fullbz) / elph_ds%k_phon%nkpt / elph_ds%k_phon%nkpt
    5181   [ +  +  +  +  :        2463 :    elph_ds%gamma_qpt(:,:,:,iqpt_fullbz) = elph_ds%gamma_qpt(:,:,:,iqpt_fullbz) * elph_ds%occ_factor / elph_ds%k_phon%nkpt
                   +  + ]
    5182                 :             :  end do
    5183                 :             : 
    5184                 :          15 :  call wrtout(std_out,' integrate_gamma: gamma matrices have been calculated for recip space and irred qpoints ',"COLL")
    5185                 :             : 
    5186         [ -  + ]:          30 : end subroutine integrate_gamma
    5187                 :             : !!***
    5188                 :             : 
    5189                 :             : !!****f* ABINIT/integrate_gamma_tr
    5190                 :             : !!
    5191                 :             : !! NAME
    5192                 :             : !! integrate_gamma_tr
    5193                 :             : !!
    5194                 :             : !! FUNCTION
    5195                 :             : !! This routine integrates the TRANSPORT electron phonon coupling matrices
    5196                 :             : !! over the kpoints on the fermi surface. A dependency on qpoint
    5197                 :             : !! remains for gamma_qpt_in/out
    5198                 :             : !! Copied from integrate_gamma
    5199                 :             : !!
    5200                 :             : !! INPUTS
    5201                 :             : !!   elph_ds = elphon datastructure with data and dimensions
    5202                 :             : !!      elph_ds%qpt_full = qpoint coordinates
    5203                 :             : !!   FSfullpqtofull = mapping of k+q to k
    5204                 :             : !!   veloc_sq1 = mean square electronic velocity on constant energy surface
    5205                 :             : !!   veloc_sq2 = mean square electronic velocity on constant energy surface
    5206                 :             : !!
    5207                 :             : !! OUTPUT
    5208                 :             : !!   elph_tr_ds%gamma_qpt_tr and created elph_tr_ds%gamma_rpt_tr
    5209                 :             : !!
    5210                 :             : !! SOURCE
    5211                 :             : 
    5212                 :           0 : subroutine integrate_gamma_tr(elph_ds,FSfullpqtofull,s1,s2, veloc_sq1,veloc_sq2,elph_tr_ds)
    5213                 :             : 
    5214                 :             : !Arguments ------------------------------------
    5215                 :             : !scalars
    5216                 :             :  integer,intent(in) :: s1,s2
    5217                 :             :  type(elph_tr_type), intent(inout) :: elph_tr_ds
    5218                 :             :  type(elph_type),intent(in) :: elph_ds
    5219                 :             : !arrays
    5220                 :             :  integer,intent(in) :: FSfullpqtofull(elph_ds%k_phon%nkpt,elph_ds%nqpt_full)
    5221                 :             :  real(dp),intent(in) :: veloc_sq1(3,elph_ds%nsppol), veloc_sq2(3,elph_ds%nsppol)
    5222                 :             : 
    5223                 :             : !Local variables-------------------------------
    5224                 :             : !scalars
    5225                 :             :  integer :: ikpt_phon,ikpt_phonq,ib1,ib2,ibeff,ierr,iqpt,iqpt_fullbz,isppol
    5226                 :             :  integer :: itensor, icomp, jcomp,comm
    5227                 :             :  integer :: fib1, fib2
    5228                 :             :  integer :: ik_this_proc
    5229                 :             : ! integer :: ikpttemp
    5230                 :             :  character(len=500) :: message
    5231                 :             :  real(dp) :: wtk, wtkpq, interm
    5232                 :             :  real(dp) :: veloc1_i, veloc1_j, veloc2_i, veloc2_j
    5233                 :             : !arrays
    5234                 :             :  real(dp) :: elvelock(3), elvelockpq(3), velocwtk(3), velocwtkpq(3), vvelocwtk(3,3), vvelocwtkpq(3,3)
    5235                 :           0 :  real(dp),allocatable :: tmp_gkk(:,:,:,:)
    5236                 :             : ! *************************************************************************
    5237                 :             : 
    5238                 :           0 :  comm = xmpi_world
    5239                 :             : 
    5240                 :             : !information
    5241         [ #  # ]:           0 :  if (elph_ds%gkqwrite == 0) then
    5242                 :           0 :    write (message,'(a)')' integrate_gamma_tr : keeping gamma matrices in memory'
    5243                 :           0 :    call wrtout(std_out,message,'COLL')
    5244         [ #  # ]:           0 :  else if (elph_ds%gkqwrite == 1) then
    5245                 :           0 :    write (message,'(a)')' integrate_gamma_tr : reading gamma matrices from disk'
    5246                 :           0 :    call wrtout(std_out,message,'COLL')
    5247                 :             :  else
    5248                 :           0 :    write (message,'(3a,i3)')' integrate_gamma_tr : BUG-',ch10,&
    5249                 :           0 : &   ' Wrong value for gkqwrite = ',elph_ds%gkqwrite
    5250                 :           0 :    ABI_BUG(message)
    5251                 :             :  end if
    5252                 :             : 
    5253                 :             : !allocate temp variables
    5254   [ #  #  #  #  :           0 :  ABI_MALLOC_OR_DIE(tmp_gkk,(2,elph_ds%ngkkband**2,elph_ds%nbranch**2,elph_ds%nsppol), ierr)
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
    5255                 :             : 
    5256         [ #  # ]:           0 :  do iqpt=1,elph_ds%nqptirred
    5257                 :           0 :    iqpt_fullbz = elph_ds%qirredtofull(iqpt)
    5258                 :             : !  write(std_out,*)'iqpt, iqptfullbz  ',iqpt, iqpt_fullbz
    5259                 :             : 
    5260         [ #  # ]:           0 :    do ik_this_proc =1,elph_ds%k_phon%my_nkpt
    5261                 :           0 :      ikpt_phon = elph_ds%k_phon%my_ikpt(ik_this_proc)
    5262                 :             : 
    5263         [ #  # ]:           0 :      if (elph_ds%gkqwrite == 0) then
    5264   [ #  #  #  #  :           0 :        tmp_gkk = elph_ds%gkk_qpt(:,:,:,ik_this_proc,:,iqpt)
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
    5265         [ #  # ]:           0 :      else if (elph_ds%gkqwrite == 1) then
    5266                 :           0 :        read(elph_ds%unitgkq,REC=((iqpt-1)*elph_ds%k_phon%my_nkpt+ik_this_proc)) tmp_gkk
    5267                 :             :      end if
    5268                 :             : 
    5269                 :           0 :      ikpt_phonq = FSfullpqtofull(ikpt_phon,iqpt_fullbz)
    5270                 :             : 
    5271         [ #  # ]:           0 :      do isppol=1,elph_ds%nsppol
    5272         [ #  # ]:           0 :        do ib1=1,elph_ds%ngkkband !FS bands
    5273                 :           0 :          fib1=ib1+elph_ds%minFSband-1 ! full bands
    5274         [ #  # ]:           0 :          elvelock(:)=elph_tr_ds%el_veloc(ikpt_phon,fib1,:,isppol)
    5275                 :           0 :          wtk=elph_tr_ds%tmp_gkk_intweight1(ib1,ikpt_phon,isppol)
    5276         [ #  # ]:           0 :          velocwtk(:)=elph_tr_ds%tmp_velocwtk1(ib1,ikpt_phon,:,isppol)
    5277   [ #  #  #  # ]:           0 :          vvelocwtk(:,:)=elph_tr_ds%tmp_vvelocwtk1(ib1,ikpt_phon,:,:,isppol)
    5278                 :             : 
    5279         [ #  # ]:           0 :          do ib2=1,elph_ds%ngkkband ! FS bands
    5280                 :           0 :            ibeff=ib2+(ib1-1)*elph_ds%ngkkband ! full bands
    5281                 :           0 :            fib2=ib2+elph_ds%minFSband-1
    5282         [ #  # ]:           0 :            elvelockpq(:)= elph_tr_ds%el_veloc(ikpt_phonq,fib2,:,isppol)
    5283                 :           0 :            wtkpq=elph_tr_ds%tmp_gkk_intweight2(ib2,ikpt_phonq,isppol)
    5284         [ #  # ]:           0 :            velocwtkpq(:)=elph_tr_ds%tmp_velocwtk2(ib2,ikpt_phonq,:,isppol)
    5285   [ #  #  #  # ]:           0 :            vvelocwtkpq(:,:)=elph_tr_ds%tmp_vvelocwtk2(ib2,ikpt_phonq,:,:,isppol)
    5286                 :             : 
    5287                 :             : !          MJV 31/03/2009: Note that the following is valid for any geometry, not just cubic!
    5288                 :             : !          see eq 5 and 6 of prb 36 4103 (Al-Lehaibi et al 1987) [[cite:Al-Lehaibi1987]],
    5289                 :             : !          see also Allen PRB 17 3725 [[cite:Allen1978]]
    5290                 :             : !          generalization to tensorial quantities is simple, by keeping the directional
    5291                 :             : !          references of velock and velockpq as indices.
    5292         [ #  # ]:           0 :            do icomp = 1, 3
    5293         [ #  # ]:           0 :              do jcomp = 1, 3
    5294                 :           0 :                itensor = (icomp-1)*3+jcomp
    5295                 :             : !              FIXME: could use symmetry i <-> j
    5296                 :             : 
    5297                 :           0 :                veloc1_i = sqrt(veloc_sq1(icomp,isppol))
    5298                 :           0 :                veloc1_j = sqrt(veloc_sq1(jcomp,isppol))
    5299                 :           0 :                veloc2_i = sqrt(veloc_sq2(icomp,isppol))
    5300                 :           0 :                veloc2_j = sqrt(veloc_sq2(jcomp,isppol))
    5301         [ #  # ]:           0 :                if (elph_ds%use_k_fine == 1) then
    5302                 :             :                  interm = vvelocwtk(icomp,jcomp)*wtkpq/veloc1_i/veloc1_j + &
    5303                 :             : &                 s1*s2*vvelocwtkpq(icomp,jcomp)*wtk/veloc2_i/veloc2_j - &
    5304                 :             : &                 s1*velocwtk(jcomp)*velocwtkpq(icomp)/veloc1_j/veloc2_i - &
    5305                 :           0 : &                 s2*velocwtk(icomp)*velocwtkpq(jcomp)/veloc1_i/veloc2_j
    5306                 :             : 
    5307                 :             :                  elph_tr_ds%gamma_qpt_tr(:,itensor,:,isppol,iqpt_fullbz) = &
    5308                 :             : &                 elph_tr_ds%gamma_qpt_tr(:,itensor,:,isppol,iqpt_fullbz) + &
    5309   [ #  #  #  # ]:           0 : &                 tmp_gkk(:,ibeff,:,isppol)*interm
    5310                 :             :                else
    5311                 :             :                  elph_tr_ds%gamma_qpt_tr(:,itensor,:,isppol,iqpt_fullbz) = &
    5312                 :             : &                 elph_tr_ds%gamma_qpt_tr(:,itensor,:,isppol,iqpt_fullbz) + &
    5313                 :             : &                 tmp_gkk(:,ibeff,:,isppol) &
    5314                 :             : &                 *(elvelock(icomp)/veloc1_i - s1*elvelockpq(icomp)/veloc2_i) &
    5315                 :             : &                 *(elvelock(jcomp)/veloc1_j - s2*elvelockpq(jcomp)/veloc2_j) &
    5316   [ #  #  #  # ]:           0 : &                 *wtk*wtkpq
    5317                 :             :                end if
    5318                 :             :              end do
    5319                 :             :            end do
    5320                 :             : 
    5321                 :             :          end do
    5322                 :             :        end do
    5323                 :             :      end do ! isppol
    5324                 :             : 
    5325                 :             :    end do ! ik
    5326                 :             :  end do ! iq
    5327                 :             : 
    5328                 :           0 :  call xmpi_sum (elph_tr_ds%gamma_qpt_tr, comm, ierr)
    5329                 :             : 
    5330         [ #  # ]:           0 :  ABI_FREE(tmp_gkk)
    5331                 :             : 
    5332                 :             : 
    5333                 :             : !need prefactor of 1/nkpt for each integration over 1 kpoint index.
    5334                 :             : !NOT INCLUDED IN elph_ds%gkk_intweight
    5335                 :             : !Add a factor of 1/2 for the cross terms of (v-v')(v-v')
    5336   [ #  #  #  #  :           0 :  elph_tr_ds%gamma_qpt_tr = elph_tr_ds%gamma_qpt_tr* elph_ds%occ_factor*0.5_dp / elph_ds%k_phon%nkpt
          #  #  #  #  #  
                      # ]
    5337                 :             : 
    5338                 :           0 :  write (message,'(2a)')' integrate_gamma_tr : transport gamma matrices are calculated ',&
    5339                 :           0 : & ' in recip space and for irred qpoints'
    5340                 :             : !call wrtout(std_out,message,'COLL')
    5341                 :             : 
    5342                 :           0 : end subroutine integrate_gamma_tr
    5343                 :             : !!***
    5344                 :             : 
    5345                 :             : !!****f* ABINIT/integrate_gamma_tr_lova
    5346                 :             : !!
    5347                 :             : !! NAME
    5348                 :             : !! integrate_gamma_tr_lova
    5349                 :             : !!
    5350                 :             : !! FUNCTION
    5351                 :             : !! This routine integrates the TRANSPORT electron phonon coupling matrices
    5352                 :             : !! over the kpoints on the fermi surface. A dependency on qpoint
    5353                 :             : !! remains for gamma_qpt_in/out
    5354                 :             : !! Copied from integrate_gamma
    5355                 :             : !!
    5356                 :             : !! INPUTS
    5357                 :             : !!   elph_ds = elphon datastructure with data and dimensions
    5358                 :             : !!      elph_ds%qpt_full = qpoint coordinates
    5359                 :             : !!   FSfullpqtofull = mapping of k+q to k
    5360                 :             : !!
    5361                 :             : !! OUTPUT
    5362                 :             : !!   elph_tr_ds%gamma_qpt_trout
    5363                 :             : !!   elph_tr_ds%gamma_qpt_trin
    5364                 :             : !!
    5365                 :             : !! SOURCE
    5366                 :             : 
    5367                 :           5 : subroutine integrate_gamma_tr_lova(elph_ds,FSfullpqtofull,elph_tr_ds)
    5368                 :             : 
    5369                 :             : !Arguments ------------------------------------
    5370                 :             : !scalars
    5371                 :             :  type(elph_tr_type), intent(inout) :: elph_tr_ds
    5372                 :             :  type(elph_type),intent(in) :: elph_ds
    5373                 :             : !arrays
    5374                 :             :  integer,intent(in) :: FSfullpqtofull(elph_ds%k_phon%nkpt,elph_ds%nqpt_full)
    5375                 :             : 
    5376                 :             : !Local variables-------------------------------
    5377                 :             : !scalars
    5378                 :             :  integer :: ikpt_phon,ikpt_phonq,ib1,ib2,ibeff,ierr,iqpt,iqpt_fullbz,isppol
    5379                 :             :  integer :: itensor, icomp, jcomp,comm
    5380                 :             :  integer :: fib1, fib2
    5381                 :             :  integer :: ik_this_proc
    5382                 :             :  real(dp) :: etain, etaout
    5383                 :             :  character(len=500) :: message
    5384                 :             : !arrays
    5385                 :             :  real(dp) :: elvelock(3), elvelockpq(3)
    5386                 :           5 :  real(dp),allocatable :: tmp_gkk(:,:,:,:)
    5387                 :             : ! *************************************************************************
    5388                 :             : 
    5389                 :           5 :  comm = xmpi_world
    5390                 :             : 
    5391                 :           5 :  ib1=elph_ds%nbranch*elph_ds%nbranch ; ib2=elph_ds%nqpt_full
    5392   [ -  +  +  -  :          25 :  ABI_MALLOC_OR_DIE(elph_tr_ds%gamma_qpt_trin,(2,9,ib1,elph_ds%nsppol,ib2), ierr)
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  +  -  +  
          -  -  +  +  -  
                   -  + ]
    5393   [ +  +  +  +  :       28309 :  elph_tr_ds%gamma_qpt_trin = zero
          +  +  +  +  +  
                      + ]
    5394                 :             : 
    5395   [ -  +  +  -  :          25 :  ABI_MALLOC_OR_DIE(elph_tr_ds%gamma_qpt_trout,(2,9,ib1,elph_ds%nsppol,ib2), ierr)
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  +  -  +  
          -  -  +  +  -  
                   -  + ]
    5396   [ +  +  +  +  :       28309 :  elph_tr_ds%gamma_qpt_trout = zero
          +  +  +  +  +  
                      + ]
    5397                 :             : 
    5398                 :             : !information
    5399         [ +  - ]:           5 :  if (elph_ds%gkqwrite == 0) then
    5400                 :           5 :    write (message,'(a)')' integrate_gamma_tr : keeping gamma matrices in memory'
    5401                 :           5 :    call wrtout(std_out,message,'COLL')
    5402         [ #  # ]:           0 :  else if (elph_ds%gkqwrite == 1) then
    5403                 :           0 :    write (message,'(a)')' integrate_gamma_tr : reading gamma matrices from disk'
    5404                 :           0 :    call wrtout(std_out,message,'COLL')
    5405                 :             :  else
    5406                 :           0 :    write (message,'(3a,i3)')' integrate_gamma_tr : BUG-',ch10,&
    5407                 :           0 : &   ' Wrong value for gkqwrite = ',elph_ds%gkqwrite
    5408                 :           0 :    ABI_ERROR(message)
    5409                 :             :  end if
    5410                 :             : 
    5411                 :             : !allocate temp variables
    5412   [ -  +  +  -  :          25 :  ABI_MALLOC_OR_DIE(tmp_gkk,(2,elph_ds%ngkkband**2,elph_ds%nbranch**2,elph_ds%nsppol), ierr)
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  +  -  -  
                +  -  + ]
    5413                 :             : 
    5414         [ +  + ]:          23 :  do iqpt=1,elph_ds%nqptirred
    5415                 :          18 :    iqpt_fullbz = elph_ds%qirredtofull(iqpt)
    5416                 :          18 :    write(std_out,*)'iqpt, iqptfullbz  ',iqpt, iqpt_fullbz
    5417                 :             : 
    5418         [ +  + ]:        1439 :    do ik_this_proc =1,elph_ds%k_phon%my_nkpt
    5419                 :        1416 :      ikpt_phon = elph_ds%k_phon%my_ikpt(ik_this_proc)
    5420                 :             : 
    5421         [ +  - ]:        1416 :      if (elph_ds%gkqwrite == 0) then
    5422   [ +  -  +  -  :     4498560 :        tmp_gkk = elph_ds%gkk_qpt(:,:,:,ik_this_proc,:,iqpt)
          +  -  +  -  -  
          +  -  -  +  +  
          +  +  +  +  +  
                      + ]
    5423         [ #  # ]:           0 :      else if (elph_ds%gkqwrite == 1) then
    5424                 :           0 :        read(elph_ds%unitgkq,REC=((iqpt-1)*elph_ds%k_phon%my_nkpt+ik_this_proc)) tmp_gkk
    5425                 :             :      end if
    5426                 :             : 
    5427                 :        1416 :      ikpt_phonq = FSfullpqtofull(ikpt_phon,iqpt_fullbz)
    5428                 :             : 
    5429         [ +  + ]:        2850 :      do isppol=1,elph_ds%nsppol
    5430         [ +  + ]:       12224 :        do ib1=1,elph_ds%ngkkband
    5431                 :        9392 :          fib1=ib1+elph_ds%minFSband-1
    5432         [ +  + ]:       37568 :          elvelock(:)=elph_tr_ds%el_veloc(ikpt_phon,fib1,:,isppol)
    5433                 :             : 
    5434         [ +  + ]:       74840 :          do ib2=1,elph_ds%ngkkband
    5435                 :       64032 :            ibeff=ib2+(ib1-1)*elph_ds%ngkkband
    5436                 :       64032 :            fib2=ib2+elph_ds%minFSband-1
    5437         [ +  + ]:      256128 :            elvelockpq(:)= elph_tr_ds%el_veloc(ikpt_phonq,fib2,:,isppol)
    5438                 :             : 
    5439                 :             : 
    5440                 :             : !          MJV 31/03/2009: Note that the following is valid for any geometry, not just cubic!
    5441                 :             : !          see eq 5 and 6 of prb 36 4103 (Al-Lehaibi et al 1987) [[cite:Al-Lehaibi1987]]
    5442                 :             : !          see also Allen PRB 17 3725 [[cite:Allen1978]]
    5443                 :             : !          generalization to tensorial quantities is simple, by keeping the directional
    5444                 :             : !          references of velock and velockpq as indices.
    5445         [ +  + ]:      265520 :            do icomp = 1, 3
    5446         [ +  + ]:      832416 :              do jcomp = 1, 3
    5447                 :      576288 :                itensor = (icomp-1)*3+jcomp
    5448                 :             : !              FIXME: could use symmetry i <-> j
    5449                 :             : 
    5450                 :      576288 :                etain  = elvelock(icomp)*elvelockpq(jcomp)
    5451                 :      576288 :                etaout = elvelock(icomp)*elvelock(jcomp)
    5452                 :             : 
    5453                 :             : 
    5454                 :             :                elph_tr_ds%gamma_qpt_trin(:,itensor,:,isppol,iqpt_fullbz) = &
    5455                 :             : &               elph_tr_ds%gamma_qpt_trin(:,itensor,:,isppol,iqpt_fullbz) + &
    5456                 :             : &               tmp_gkk(:,ibeff,:,isppol) &
    5457                 :             : &               *etain &
    5458   [ +  +  +  + ]:    40770432 : &               *elph_ds%gkk_intweight(ib1,ikpt_phon,isppol)*elph_ds%gkk_intweight(ib2,ikpt_phonq,isppol)
    5459                 :             : 
    5460                 :             :                elph_tr_ds%gamma_qpt_trout(:,itensor,:,isppol,iqpt_fullbz) = &
    5461                 :             : &               elph_tr_ds%gamma_qpt_trout(:,itensor,:,isppol,iqpt_fullbz) + &
    5462                 :             : &               tmp_gkk(:,ibeff,:,isppol) &
    5463                 :             : &               *etaout &
    5464   [ +  +  +  + ]:    40962528 : &               *elph_ds%gkk_intweight(ib1,ikpt_phon,isppol)*elph_ds%gkk_intweight(ib2,ikpt_phonq,isppol)
    5465                 :             : 
    5466                 :             :              end do
    5467                 :             :            end do
    5468                 :             :          end do
    5469                 :             :        end do
    5470                 :             : 
    5471                 :             :      end do ! isppol
    5472                 :             :    end do ! ik
    5473                 :             : 
    5474                 :             :  end do ! iq
    5475                 :             : 
    5476         [ -  + ]:           5 :  ABI_FREE(tmp_gkk)
    5477                 :             : 
    5478                 :           5 :  call xmpi_sum (elph_tr_ds%gamma_qpt_trout, comm, ierr)
    5479                 :           5 :  call xmpi_sum (elph_tr_ds%gamma_qpt_trin, comm, ierr)
    5480                 :             : 
    5481                 :             : 
    5482                 :             : !
    5483                 :             : !normalize tensor with 1/sqrt(v_x**2 * v_y**2)
    5484                 :             : !
    5485                 :             : !move the veloc into mka2f_tr_lova, where T dependence is dealt with
    5486                 :             : !This will cause some slight difference to the results
    5487                 :             :  if (.true.) then
    5488         [ +  + ]:          10 :    do isppol=1, elph_ds%nsppol
    5489         [ +  + ]:          25 :      do icomp = 1, 3
    5490         [ +  + ]:          65 :        do jcomp = 1, 3
    5491                 :          45 :          itensor = (icomp-1)*3+jcomp
    5492   [ +  +  +  + ]:          60 :          if(abs(elph_tr_ds%FSelecveloc_sq(icomp,isppol))>tol14**2 .and. abs(elph_tr_ds%FSelecveloc_sq(jcomp,isppol))>tol14**2)then
    5493                 :             :            elph_tr_ds%gamma_qpt_trin(:,itensor,:,isppol,:) = elph_tr_ds%gamma_qpt_trin(:,itensor,:,isppol,:) / &
    5494   [ +  +  +  +  :       20637 : &           sqrt(elph_tr_ds%FSelecveloc_sq(icomp,isppol)*elph_tr_ds%FSelecveloc_sq(jcomp,isppol))
                   +  + ]
    5495                 :             :            elph_tr_ds%gamma_qpt_trout(:,itensor,:,isppol,:) = elph_tr_ds%gamma_qpt_trout(:,itensor,:,isppol,:) / &
    5496   [ +  +  +  +  :       20637 : &           sqrt(elph_tr_ds%FSelecveloc_sq(icomp,isppol)*elph_tr_ds%FSelecveloc_sq(jcomp,isppol))
                   +  + ]
    5497                 :             :          else
    5498                 :             : !          XG120528 Fixed problem with zero velocity
    5499   [ +  +  +  +  :        6984 :            elph_tr_ds%gamma_qpt_trin(:,itensor,:,isppol,:)=zero
                   +  + ]
    5500   [ +  +  +  +  :        6984 :            elph_tr_ds%gamma_qpt_trout(:,itensor,:,isppol,:)=zero
                   +  + ]
    5501                 :             :          end if
    5502                 :             :        end do
    5503                 :             :      end do
    5504                 :             :    end do ! isppol
    5505                 :             :  end if
    5506                 :             : 
    5507                 :             : !need prefactor of 1/nkpt for each integration over 1 kpoint index.
    5508                 :             : !NOT INCLUDED IN elph_ds%gkk_intweight
    5509   [ +  +  +  +  :       28309 :  elph_tr_ds%gamma_qpt_trout = elph_tr_ds%gamma_qpt_trout* elph_ds%occ_factor / elph_ds%k_phon%nkpt
          +  +  +  +  +  
                      + ]
    5510   [ +  +  +  +  :       28309 :  elph_tr_ds%gamma_qpt_trin  = elph_tr_ds%gamma_qpt_trin * elph_ds%occ_factor / elph_ds%k_phon%nkpt
          +  +  +  +  +  
                      + ]
    5511                 :             : 
    5512                 :           5 :  write (message,'(2a)')' integrate_gamma_tr : transport gamma matrices are calculated ',&
    5513                 :          10 : & ' in recip space and for irred qpoints'
    5514                 :           5 :  call wrtout(std_out,message,'COLL')
    5515                 :             : 
    5516                 :             : !DEBUG
    5517                 :             : !write(std_out,*)' integrate_gamma_tr_lova: end  elph_tr_ds%gamma_qpt_trin(1,9,1,1,1)=',elph_tr_ds%gamma_qpt_trin(1,9,1,1,1)
    5518                 :             : !ENDDEBUG
    5519                 :             : 
    5520                 :           5 : end subroutine integrate_gamma_tr_lova
    5521                 :             : !!***
    5522                 :             : 
    5523                 :             : !!****f* ABINIT/ftgkk
    5524                 :             : !!
    5525                 :             : !! NAME
    5526                 :             : !! ftgkk
    5527                 :             : !!
    5528                 :             : !! FUNCTION
    5529                 :             : !! If qtor=1 (q->r):
    5530                 :             : !! Generates the Fourier transform of the recip space gkk matrices
    5531                 :             : !! to obtain the real space ones.
    5532                 :             : !! If qtor=0 (r->q):
    5533                 :             : !! Generates the Fourier transform of the real space gkk matrices
    5534                 :             : !! to obtain the reciprocal space ones.
    5535                 :             : !!
    5536                 :             : !! INPUTS
    5537                 :             : !! gkqwrite = flag to write recip space matrix elements to disk
    5538                 :             : !! gkrwrite = flag to write real space matrix elements to disk
    5539                 :             : !! gprim(3,3)= Normalized coordinates in reciprocal space
    5540                 :             : !! ikpt_phon0 = starting kpt number for forward FT.
    5541                 :             : !! natom= Number of atoms in the unit cell
    5542                 :             : !! nkpt_phon= Number of kpoints used for the FS
    5543                 :             : !! ngkkband = number of bands kept in gkq and gkr matrix elements (=1 or nband)
    5544                 :             : !! nkpt_used= number of FS kpoints used, starting at ikpt_phon0
    5545                 :             : !! nqpt= Number of q points in the Brillouin zone
    5546                 :             : !!           if qtor=0 this number is read in the input file
    5547                 :             : !! nrpt= Number of R points in the Big Box
    5548                 :             : !! qtor= ( q to r : see above )
    5549                 :             : !! rpt(3,nprt)= Canonical coordinates of the R points in the unit cell
    5550                 :             : !!           These coordinates are normalized (=> * acell(3)!!)
    5551                 :             : !! qpt_full(3,nqpt)= Reduced coordinates of the q vectors in reciprocal space
    5552                 :             : !!           if qtor=0 these vectors are read in the input file
    5553                 :             : !! unit_gkk_rpt = fortran unit for writing real-space matrix elements
    5554                 :             : !! unitgkq = fortran unit for writing reciprocal-space matrix elements
    5555                 :             : !! wghatm(natom,natom,nrpt)
    5556                 :             : !!         = Weights associated to a pair of atoms and to a R vector
    5557                 :             : !!
    5558                 :             : !! OUTPUT
    5559                 :             : !!  (see side effects)
    5560                 :             : !!
    5561                 :             : !! SIDE EFFECTS
    5562                 :             : !! Input/output
    5563                 :             : !! gkk_qpt(2,3*natom,nFSband,nFSband,nkpt_used,nqpt)
    5564                 :             : !!  = gkk matrices in recip space coming from the Derivative Data Base
    5565                 :             : !! gkk_rpt(2,3*natom,nFSband,nFSband,nkpt_phon,nqpt)
    5566                 :             : !!  = gkk matrices in real space stored in file unit_gkk_rpt
    5567                 :             : !!
    5568                 :             : !! NOTES
    5569                 :             : !!   copied from ftiaf9.f
    5570                 :             : !!   recip to real space: real space is forced to disk file unit_gkk_rpt
    5571                 :             : !!                        recip space depends on gkqwrite and unitgkq
    5572                 :             : !!   real to recip space: real space is forced to disk file unit_gkk_rpt
    5573                 :             : !!                        recip space is necessarily in memory in gkk_qpt
    5574                 :             : !!
    5575                 :             : !!    real space elements are complex, but could be reduced, as (-r) = (+r)*
    5576                 :             : !!
    5577                 :             : !! SOURCE
    5578                 :             : 
    5579                 :             : subroutine ftgkk (wghatm,gkk_qpt,gkk_rpt,gkqwrite,gkrwrite,gprim,ikpt_phon0,&
    5580                 :             : &                  natom,nkpt_phon,ngkkband,nkpt_used,nqpt,nrpt,nsppol,&
    5581                 :             : &                  qtor,rpt,qpt_full,unit_gkk_rpt,unitgkq)
    5582                 :             : 
    5583                 :             : !Arguments -------------------------------
    5584                 :             : !scalars
    5585                 :             :  integer,intent(in) :: gkqwrite,gkrwrite,ikpt_phon0,nkpt_phon,natom,ngkkband
    5586                 :             :  integer,intent(in) :: nkpt_used,nqpt,nrpt,nsppol,qtor,unit_gkk_rpt,unitgkq
    5587                 :             : !arrays
    5588                 :             :  real(dp),intent(in) :: gprim(3,3),rpt(3,nrpt),qpt_full(3,nqpt)
    5589                 :             :  real(dp),intent(in) :: wghatm(natom,natom,nrpt)
    5590                 :             :  real(dp),intent(inout) :: gkk_qpt(2,ngkkband*ngkkband,3*natom*3*natom,nkpt_used,nsppol,nqpt)
    5591                 :             :  real(dp),intent(inout) :: gkk_rpt(2,ngkkband*ngkkband,3*natom*3*natom,nkpt_used,nsppol,nrpt)
    5592                 :             : 
    5593                 :             : !Local variables -------------------------
    5594                 :             : !scalars
    5595                 :             :  integer :: ikpt_phon,iatom,ib1,ieffkpt_phon,ip,iqpt,irpt,isppol
    5596                 :             :  integer :: jatom
    5597                 :             :  real(dp) :: im,kr,re
    5598                 :             :  character(len=500) :: message
    5599                 :             : !arrays
    5600                 :             :  real(dp) :: coskr(nqpt,nrpt),ftwght(2,3*natom*3*natom)
    5601                 :             :  real(dp) :: gkk_qpt_tmp(2,ngkkband*ngkkband,3*natom*3*natom,nkpt_used,nsppol)
    5602                 :             :  real(dp) :: gkk_rpt_tmp(2,ngkkband*ngkkband,3*natom*3*natom,nkpt_phon,nsppol)
    5603                 :             :  real(dp) :: kk(3),sinkr(nqpt,nrpt)
    5604                 :             : 
    5605                 :             : ! *********************************************************************
    5606                 :             : 
    5607                 :             : !rewind (unit_gkk_rpt)
    5608                 :             : 
    5609                 :             : !prepare the phase factors
    5610                 :             :  do iqpt=1,nqpt
    5611                 :             : !  Calculation of the k coordinates in Normalized Reciprocal
    5612                 :             : !  coordinates
    5613                 :             :    kk(1)=   qpt_full(1,iqpt)*gprim(1,1)+&
    5614                 :             : &   qpt_full(2,iqpt)*gprim(1,2)+&
    5615                 :             : &   qpt_full(3,iqpt)*gprim(1,3)
    5616                 :             :    kk(2)=   qpt_full(1,iqpt)*gprim(2,1)+&
    5617                 :             : &   qpt_full(2,iqpt)*gprim(2,2)+&
    5618                 :             : &   qpt_full(3,iqpt)*gprim(2,3)
    5619                 :             :    kk(3)=   qpt_full(1,iqpt)*gprim(3,1)+&
    5620                 :             : &   qpt_full(2,iqpt)*gprim(3,2)+&
    5621                 :             : &   qpt_full(3,iqpt)*gprim(3,3)
    5622                 :             :    do irpt=1,nrpt
    5623                 :             : !    Product of k and r
    5624                 :             :      kr =        kk(1)*rpt(1,irpt)+&
    5625                 :             : &     kk(2)*rpt(2,irpt)+&
    5626                 :             : &     kk(3)*rpt(3,irpt)
    5627                 :             :      coskr(iqpt,irpt)=cos(two_pi*kr)
    5628                 :             :      sinkr(iqpt,irpt)=sin(two_pi*kr)
    5629                 :             : !    DEBUG
    5630                 :             : !    if (iqpt < 1000 .and. (irpt == 101 .or. irpt == 901)) then
    5631                 :             : !    write(std_out,*) iqpt,irpt,kk,rpt(:,irpt),coskr(iqpt,irpt), sinkr(iqpt,irpt)
    5632                 :             : !    end if
    5633                 :             : !    ENDDEBUG
    5634                 :             :    end do
    5635                 :             :  end do
    5636                 :             : 
    5637                 :             : 
    5638                 :             : 
    5639                 :             : !Recip to real space
    5640                 :             :  if (qtor==1) then
    5641                 :             : !
    5642                 :             :    if (nkpt_used /= nkpt_phon) write(std_out,*) 'ftgkk: strange usage of nkpt_used for back FT!'
    5643                 :             :    do irpt=1,nrpt
    5644                 :             : !    DEBUG
    5645                 :             : !    write(std_out,*) ' ftgkk : G->R irpt = ',irpt,' / ',nrpt
    5646                 :             : !    ENDDEBUG
    5647                 :             :      gkk_rpt_tmp(:,:,:,:,:) = zero
    5648                 :             : 
    5649                 :             :      do iqpt=1,nqpt
    5650                 :             : 
    5651                 :             : !      write(std_out,*) iqpt
    5652                 :             : 
    5653                 :             :        if (gkqwrite == 0) then
    5654                 :             :          gkk_qpt_tmp(:,:,:,:,:) = gkk_qpt(:,:,:,:,:,iqpt)
    5655                 :             :        else
    5656                 :             :          do ikpt_phon=1, nkpt_phon
    5657                 :             :            read(unitgkq,REC=((iqpt-1)*nkpt_phon+ikpt_phon)) gkk_qpt_tmp(:,:,:,ikpt_phon,:)
    5658                 :             :          end do
    5659                 :             :        end if
    5660                 :             : !      Get the phase factor with normalization!
    5661                 :             :        re=coskr(iqpt,irpt)/nqpt
    5662                 :             :        im=sinkr(iqpt,irpt)/nqpt
    5663                 :             :        do isppol=1,nsppol
    5664                 :             :          do ikpt_phon=1,nkpt_used
    5665                 :             : !          DEBUG
    5666                 :             : !          write(std_out,*) ' ftgkk : G->R ikpt_phon = ',ikpt_phon,' / ',nkpt_used
    5667                 :             : !          ENDDEBUG
    5668                 :             :            do ip=1,3*natom*3*natom
    5669                 :             : !            Real and imaginary part of the real-space gkk matrices -> exp(-i k.r)
    5670                 :             :              do ib1=1,ngkkband*ngkkband
    5671                 :             :                gkk_rpt_tmp(1,ib1,ip,ikpt_phon,isppol) = gkk_rpt_tmp(1,ib1,ip,ikpt_phon,isppol)&
    5672                 :             : &               +re*gkk_qpt_tmp(1,ib1,ip,ikpt_phon,isppol) &
    5673                 :             : &               +im*gkk_qpt_tmp(2,ib1,ip,ikpt_phon,isppol)
    5674                 :             :                gkk_rpt_tmp(2,ib1,ip,ikpt_phon,isppol) = gkk_rpt_tmp(2,ib1,ip,ikpt_phon,isppol)&
    5675                 :             : &               +re*gkk_qpt_tmp(2,ib1,ip,ikpt_phon,isppol) &
    5676                 :             : &               -im*gkk_qpt_tmp(1,ib1,ip,ikpt_phon,isppol)
    5677                 :             :              end do
    5678                 :             :            end do
    5679                 :             :          end do
    5680                 :             :        end do
    5681                 :             :      end do
    5682                 :             :      if (gkrwrite == 0) then
    5683                 :             :        gkk_rpt(:,:,:,:,:,irpt) = gkk_rpt_tmp(:,:,:,:,:)
    5684                 :             :      else
    5685                 :             :        write (unit_gkk_rpt,REC=irpt) gkk_rpt_tmp
    5686                 :             :      end if
    5687                 :             :    end do
    5688                 :             : 
    5689                 :             : !  Real space to recip space
    5690                 :             :  else if (qtor==0) then
    5691                 :             : 
    5692                 :             : !  write(std_out,*) 'ftgkk : shape(gkk_qpt) = ', shape(gkk_qpt)
    5693                 :             :    gkk_qpt(:,:,:,:,:,:)=zero
    5694                 :             : 
    5695                 :             : !  rewind (unit_gkk_rpt)
    5696                 :             :    do irpt=1,nrpt
    5697                 :             :      if (gkrwrite == 0) then
    5698                 :             :        gkk_rpt_tmp(:,:,:,:,:) = gkk_rpt(:,:,:,:,:,irpt)
    5699                 :             :      else
    5700                 :             :        read(unit_gkk_rpt,REC=irpt) gkk_rpt_tmp
    5701                 :             :      end if
    5702                 :             : 
    5703                 :             : 
    5704                 :             :      do iqpt=1,nqpt
    5705                 :             : 
    5706                 :             : !      Avoid recalculating weights nkpt_used*9 times
    5707                 :             :        do iatom=1,natom
    5708                 :             :          do jatom=1,natom
    5709                 :             :            ip = 3*((iatom-1)*natom+jatom-1)
    5710                 :             : !          copy same weight for all 3 directions
    5711                 :             :            ftwght(1,ip+1:ip+3)=coskr(iqpt,irpt)*wghatm(iatom,jatom,irpt)
    5712                 :             :            ftwght(2,ip+1:ip+3)=sinkr(iqpt,irpt)*wghatm(iatom,jatom,irpt)
    5713                 :             :          end do
    5714                 :             :        end do
    5715                 :             : 
    5716                 :             : 
    5717                 :             : 
    5718                 :             :        do ip=1,3*natom*3*natom
    5719                 :             : !        Get phase factor
    5720                 :             :          re = ftwght(1,ip)
    5721                 :             :          im = ftwght(2,ip)
    5722                 :             : 
    5723                 :             :          do isppol=1,nsppol
    5724                 :             :            do ikpt_phon=1,nkpt_used
    5725                 :             : 
    5726                 :             : 
    5727                 :             : !            DEBUG
    5728                 :             : !            write(std_out,*) ' ftgkk : R->G ikpt_phon = ',ikpt_phon,' / ',nkpt_used
    5729                 :             : !            ENDDEBUG
    5730                 :             : !            effective FS kpt in real space array is ikpt_phon+ikpt_phon0-1 to allow for offset
    5731                 :             :              ieffkpt_phon = ikpt_phon+ikpt_phon0-1
    5732                 :             : !            write(std_out,*) 'ftgkk :ikpt_phon,iqpt,ieffkpt_phon ', ikpt_phon,iqpt,ieffkpt_phon
    5733                 :             : 
    5734                 :             :              do ib1=1,ngkkband*ngkkband
    5735                 :             : !              Real and imaginary part of the gamma matrices
    5736                 :             :                gkk_qpt(1,ib1,ip,ikpt_phon,isppol,iqpt)=&
    5737                 :             : &               gkk_qpt(1,ib1,ip,ikpt_phon,isppol,iqpt)&
    5738                 :             : &               +re*gkk_rpt_tmp(1,ib1,ip,ieffkpt_phon,isppol)&
    5739                 :             : &               -im*gkk_rpt_tmp(2,ib1,ip,ieffkpt_phon,isppol)
    5740                 :             : !              !DEBUG
    5741                 :             :                gkk_qpt(2,ib1,ip,ikpt_phon,isppol,iqpt)=&
    5742                 :             : &               gkk_qpt(2,ib1,ip,ikpt_phon,isppol,iqpt)&
    5743                 :             : &               +im*gkk_rpt_tmp(1,ib1,ip,ieffkpt_phon,isppol)&
    5744                 :             : &               +re*gkk_rpt_tmp(2,ib1,ip,ieffkpt_phon,isppol)
    5745                 :             : !              !ENDDEBUG
    5746                 :             : 
    5747                 :             : !              if (iqpt < 100 .and. irpt < 100 .and. &
    5748                 :             : !              &   tmpgkkrim(irpt)**2+tmpgkkrre(irpt)**2 > tol6) then
    5749                 :             : !              write(std_out,'(2I4,2E16.8,x,2E16.8)') &
    5750                 :             : !              &   iqpt,irpt,re,im,tmpgkkrre(irpt),tmpgkkrim(irpt)
    5751                 :             : !              end if
    5752                 :             : 
    5753                 :             :              end do
    5754                 :             :            end do
    5755                 :             : !          end ikpt_phon
    5756                 :             :          end do
    5757                 :             : !        end isppol
    5758                 :             : !        write(std_out,'(a)') ' ftgkk :gkk_qpt :'
    5759                 :             : !        write(std_out,'(4E16.5)') gkk_qpt(:,1,1,,ikpt_phon,1:nqpt)
    5760                 :             :        end do
    5761                 :             : !      end ip
    5762                 :             :      end do
    5763                 :             : !    end iqpt
    5764                 :             :    end do
    5765                 :             : !  end irpt
    5766                 :             : 
    5767                 :             : 
    5768                 :             : !  There is no other space to Fourier transform from ??
    5769                 :             :  else
    5770                 :             :    write(message,'(a,a,a,i0,a)' )&
    5771                 :             : &   'The only allowed values for qtor are 0 or 1, while',ch10,&
    5772                 :             : &   'qtor=',qtor,' has been required.'
    5773                 :             :    ABI_BUG(message)
    5774                 :             :  end if
    5775                 :             : 
    5776                 :             : end subroutine ftgkk
    5777                 :             : !!***
    5778                 :             : 
    5779                 :             : end module m_elphon
    5780                 :             : !!***
        

Generated by: LCOV version 2.3-1