LCOV - code coverage report
Current view: top level - src/67_common - m_conducti.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 82.3 % 1461 1202
Test Date: 2026-11-06 11:53:17 Functions: 100.0 % 4 4
Branches: 48.7 % 3442 1676

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_conducti
       2                 :             : !! NAME
       3                 :             : !!  m_conducti
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !! This program computes the elements of the optical frequency dependent
       7                 :             : !! conductivity tensor and the conductivity along the three principal axes
       8                 :             : !! from the Kubo-Greenwood formula.
       9                 :             : !!
      10                 :             : !! COPYRIGHT
      11                 :             : !!  Copyright (C) 2002-2026 ABINIT group (VRecoules, PGhosh, SMazevet, SM, SVinko, NBrouwer)
      12                 :             : !!  This file is distributed under the terms of the
      13                 :             : !!  GNU General Public License, see ~abinit/COPYING
      14                 :             : !!  or http://www.gnu.org/copyleft/gpl.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_conducti
      25                 :             : 
      26                 :             :  use defs_basis
      27                 :             :  use m_errors
      28                 :             :  use m_abicore
      29                 :             :  use m_xmpi
      30                 :             :  use m_wfk
      31                 :             :  use m_hdr
      32                 :             :  use m_nctk
      33                 :             :  use netcdf
      34                 :             : 
      35                 :             :  use defs_abitypes,  only : MPI_type
      36                 :             :  use m_io_tools,     only : open_file, close_unit, get_unit
      37                 :             :  use m_fstrings,     only : sjoin
      38                 :             :  use m_matrix,       only : matr3inv
      39                 :             :  use m_hide_lapack,  only : jacobi
      40                 :             :  use m_occ,          only : getnel
      41                 :             :  use m_geometry,     only : metric
      42                 :             :  use m_splines,      only : splint,spline
      43                 :             :  use m_mpinfo,       only : distrb2,init_mpi_enreg,destroy_mpi_enreg,proc_distrb_cycle,initmpi_band
      44                 :             : 
      45                 :             :  implicit none
      46                 :             : 
      47                 :             :  private
      48                 :             : !!***
      49                 :             : 
      50                 :             :  public :: conducti_paw
      51                 :             :  public :: conducti_paw_core
      52                 :             :  public :: conducti_nc
      53                 :             : 
      54                 :             : !I/O parameters
      55                 :             : !Set to true to use netcdf-MPIIO when available
      56                 :             :  logical,parameter :: use_netcdf_mpiio=.true.
      57                 :             : 
      58                 :             : !!***
      59                 :             : 
      60                 :             : contains
      61                 :             : !!***
      62                 :             : 
      63                 :             : !!****f* m_conducti/conducti_paw
      64                 :             : !! NAME
      65                 :             : !! conducti_paw
      66                 :             : !!
      67                 :             : !! FUNCTION
      68                 :             : !! This program computes the elements of the optical frequency dependent
      69                 :             : !! conductivity tensor and the conductivity along the three principal axes
      70                 :             : !! from the Kubo-Greenwood formula for PAW formalism
      71                 :             : !!
      72                 :             : !! INPUTS
      73                 :             : !!  filnam=generic name for input data
      74                 :             : !!  filnam_out=generic name for output data
      75                 :             : !!  [varocc]=if true, read arbitrary occupations from a file
      76                 :             : !!
      77                 :             : !! OUTPUT
      78                 :             : !!  Only printing
      79                 :             : !!
      80                 :             : !! NOTES
      81                 :             : !!  bantot
      82                 :             : !!  doccde(mband*nkpt_rbz*nsppol)=derivative of occ_rbz wrt the energy.
      83                 :             : !!  dom=frequency range
      84                 :             : !!  eigen0(mband*nkpt_rbz*nsppol)=GS eigenvalues at k (hartree).
      85                 :             : !!  eigen11(2,nkpt,mband,mband,nsppol)=first-order eigenvalues (hartree)
      86                 :             : !!  in direction x
      87                 :             : !!  eigen12(2,nkpt,mband,mband,nsppol)=first-order eigenvalues (hartree)
      88                 :             : !!  in direction y
      89                 :             : !!  eigen13(2,nkpt,mband,mband,nsppol)=first-order eigenvalues (hartree)
      90                 :             : !!  in direction z
      91                 :             : !!  ecut=kinetic energy planewave cutoff (hartree).
      92                 :             : !!  fermie= fermi energy (Hartree)
      93                 :             : !!  gmet(3,3)=reciprocal space metric ($\textrm{bohr}^{2}$).
      94                 :             : !!  gprimd(3,3)=dimensional primitive translations for reciprocal space(bohr^-1).
      95                 :             : !!  kin11= Onsager kinetic coeficient=optical conductivity
      96                 :             : !!  kin12= Onsager kinetic coeficient
      97                 :             : !!  kin21= Onsager kinetic coeficient
      98                 :             : !!  kin22= Onsager kinetic coeficient
      99                 :             : !!  Kth=thermal conductivity
     100                 :             : !!  mom=number of frequency for conductivity computation
     101                 :             : !!  mband=maximum number of bands.
     102                 :             : !!  natom = number of atoms in the unit cell.
     103                 :             : !!  nband(nkpt*nsppol)=number of bands at each RF k point for each spin.
     104                 :             : !!  nkpt=number of k points in the IBZ for this perturbation
     105                 :             : !!  ngfft(3)=integer fft box dimensions.
     106                 :             : !!  nspinor=number of spinorial components of the wavefunctions.
     107                 :             : !!  nsppol=1 for unpolarized, 2 for spin-polarized.
     108                 :             : !!  ntypat = number of atom types.
     109                 :             : !!  occ(mband*nkpt*nsppol)=occupation number for each band and k.
     110                 :             : !!  occopt==option for occupancies
     111                 :             : !!  rmet(3,3)=real space metric ($\textrm{bohr}^{2}$).sigx(mom,nphicor))
     112                 :             : !!  rprimd(3,3)=real space primitive translations.
     113                 :             : !!  of primitive translations.
     114                 :             : !!  Sth=thermopower
     115                 :             : !!  tsmear=smearing width (or temperature) in Hartree
     116                 :             : !!  ucvol=unit cell volume in ($\textrm{bohr}^{3}$).
     117                 :             : !!  wind=frequency windows for computations of sigma
     118                 :             : !!  wtk(nkpt)=weight assigned to each k point.
     119                 :             : !!  znucl(natom)=atomic number of atoms
     120                 :             : !!  np_sum=noziere-pines sumrule
     121                 :             : !!
     122                 :             : !! SOURCE
     123                 :             : 
     124                 :           2 :  subroutine conducti_paw(filnam,filnam_out,varocc)
     125                 :             : 
     126                 :             : !Arguments -----------------------------------
     127                 :             : !scalars
     128                 :             :  character(len=fnlen),intent(in) :: filnam,filnam_out
     129                 :             :  integer, optional, intent(in) :: varocc
     130                 :             : 
     131                 :             : !Local variables-------------------------------
     132                 :             : !scalars
     133                 :             :  integer,parameter :: master=0
     134                 :             :  integer :: bsize,bd_stride,dimid,iomode,bantot,bdtot_index,ncid,varid,nb_per_proc,etiq
     135                 :             :  integer :: comm,fform1,headform,iband,ijband,ierr,ikpt,master_band,idum,iproc,num_tasks_max
     136                 :             :  integer :: iom,isppol,jband,l1,l2,mband,me,mpierr,mom
     137                 :             :  integer :: natom,nband_k,nkpt,nproc,nspinor,nsppol,ntypat,broad_mode
     138                 :             :  integer :: occopt,iunt,opt_unt,occ_unt,iocc,my_iband,pnp_size,add_drude
     139                 :             :  integer :: lij_unt,sig_unt,sigd_unt,kth_unt,ocond_unt,occunit,occnpt,au_units
     140                 :             :  logical :: nc_unlimited,mykpt,myband,iomode_estf_mpiio,read_half_dipoles,omega0
     141                 :             :  real(dp) :: dirac,del,deltae,deltae_min,deltae_min_tmp,dhdk2_g,diff_eig,diff_occ
     142                 :             :  real(dp) :: dosdeltae,ecut,entropy,fermie,fermih,kin_fact,maxocc,docc_deig
     143                 :             :  real(dp) :: np_sum,np_sum_k1,np_sum_2,omin,omax,dom,oml,sig,socc,socc_k,fact_omega0
     144                 :             :  real(dp) :: Tatm,tphysel,tsmear,ucvol,eig_in_max,eig_in_min,phi
     145                 :             :  character(len=fnlen) :: filnam1,filnam_gen,occfile
     146                 :             :  character(len=500) :: msg
     147                 :             :  character(len=100) :: line
     148                 :           2 :  type(hdr_type) :: hdr
     149                 :           2 :  type(MPI_type) :: mpi_enreg
     150                 :             : !arrays
     151                 :             :  integer :: nc_count_5(5),nc_count_6(6),nc_start_5(5),nc_start_6(6),nc_stride_5(5),nc_stride_6(6)
     152                 :             :  integer :: dummy(0,0,0)
     153                 :           2 :  integer,allocatable :: nband(:),num_tasks(:)
     154                 :             :  real(dp) :: dhdk2_r(3,3),gmet(3,3),gprimd(3,3),rmet(3,3),rprimd(3,3)
     155                 :           2 :  real(dp),allocatable :: cond_nd(:,:,:),cond_nd_k(:,:,:)
     156                 :           2 :  real(dp),allocatable :: doccde(:),doccde_k(:),eig0_k(:),eigen0(:),eig0nc(:,:,:)
     157                 :           2 :  real(dp),allocatable :: occ(:),occ_k(:),wtk(:),oml1(:),occ_in(:),eig_in(:),occ_tmp(:),ypp(:)
     158                 :           2 :  real(dp),allocatable :: kin11(:,:),kin12(:),kin21(:),kin22(:)
     159                 :           2 :  real(dp),allocatable :: kin11_k(:),kin12_k(:),kin21_k(:),kin22_k(:),Kth(:),Stp(:)
     160                 :           2 :  real(dp),allocatable :: psinablapsi(:,:,:),sig_abs(:)
     161                 :             : 
     162                 :             : ! *********************************************************************************
     163                 :             : 
     164                 :             : ! ---------------------------------------------------------------------------------
     165                 :             : ! Read input data
     166                 :             : 
     167                 :             : !Global MPI communicator
     168                 :           2 :  comm = xmpi_world
     169                 :           2 :  nproc = xmpi_comm_size(comm)
     170                 :           2 :  me = xmpi_comm_rank(comm)
     171                 :             : 
     172                 :             : !Read input parameters file
     173         [ +  - ]:           2 :  if (me==master) then
     174         [ -  + ]:           2 :    if (open_file(filnam,msg,newunit=iunt,form='formatted',action="read",status="old")/=0) then
     175                 :           0 :      ABI_ERROR(msg)
     176                 :             :    end if
     177                 :           2 :    rewind(iunt)
     178                 :           2 :    read(iunt,*)
     179                 :           2 :    read(iunt,'(a)') filnam_gen ! Generic name for the files
     180         [ +  - ]:           2 :    filnam1=trim(filnam_gen)//'_OPT'
     181                 :             : !  Read frequency range
     182                 :           2 :    read(iunt,*) dom,omin,omax,mom
     183         [ +  - ]:           2 :    read(iunt,end=13,fmt='(a)') line
     184         [ -  + ]:           2 :    read(line,end=11,fmt=*) broad_mode,au_units,phi,add_drude
     185                 :           0 :    goto 14
     186         [ -  + ]:           2 : 11 read(line,end=13,fmt=*) broad_mode,au_units
     187                 :           0 :    phi=zero; add_drude=0
     188                 :           0 :    goto 14
     189                 :           2 : 13 broad_mode=1 ; au_units=0; phi=zero; add_drude=0
     190                 :             : 14 continue
     191                 :             : !  In case of varocc read filename of occupation datafile
     192         [ -  + ]:           2 :    if (present(varocc)) then
     193         [ #  # ]:           0 :      if (me==master) then
     194                 :           0 :        write(std_out,*) 'Warning, this undocumented feature is highly experimental'
     195                 :           0 :        write(std_out,*) 'and of limited physical validity, proceed with extreme caution!!!'
     196                 :             :      end if
     197                 :           0 :      read(iunt,*) occfile !filename of the non-eq distribution function
     198                 :             :    end if
     199                 :           2 :    close(iunt)
     200                 :             :  end if
     201                 :           2 :  phi=phi*pi/180.0_dp
     202                 :             : 
     203                 :             : !Send data to all procs
     204                 :           2 :  call xmpi_bcast(dom,master,comm,mpierr)
     205                 :           2 :  call xmpi_bcast(omin,master,comm,mpierr)
     206                 :           2 :  call xmpi_bcast(omax,master,comm,mpierr)
     207                 :           2 :  call xmpi_bcast(mom,master,comm,mpierr)
     208                 :           2 :  call xmpi_bcast(broad_mode,master,comm,mpierr)
     209                 :           2 :  call xmpi_bcast(au_units,master,comm,mpierr)
     210                 :           2 :  call xmpi_bcast(phi,master,comm,mpierr)
     211                 :           2 :  call xmpi_bcast(add_drude,master,comm,mpierr)
     212                 :             : 
     213                 :             : 
     214                 :             : ! ---------------------------------------------------------------------------------
     215                 :             : ! Read OPT file
     216                 :             : 
     217                 :             : !Check for FORTRAN/.nc OPT file and set iomode to IO_MODE_FORTRAN_MASTER/IO_MODE_ETSF
     218         [ +  - ]:           2 :  if (me==master) then
     219                 :           2 :    call nctk_fort_or_ncfile(filnam1,iomode,msg)
     220         [ -  + ]:           2 :    if (iomode/=IO_MODE_ETSF) iomode=IO_MODE_FORTRAN_MASTER
     221                 :             :  end if
     222                 :           2 :  call xmpi_bcast(filnam1,master,comm,mpierr)
     223                 :           2 :  call xmpi_bcast(iomode,master,comm,mpierr)
     224                 :             : 
     225                 :             :  !Open OPT file and read HEADER
     226         [ +  - ]:           2 :  if (me==master) then
     227         [ +  - ]:           2 :    if (iomode==IO_MODE_ETSF) then
     228         [ -  + ]:           2 :      NCF_CHECK(nctk_open_read(ncid,filnam1,xmpi_comm_self))
     229                 :           2 :      call hdr%ncread(ncid,fform1)
     230                 :             :    else
     231         [ #  # ]:           0 :      if (open_file(filnam1,msg,newunit=opt_unt,form="unformatted",status="old")/=0) then
     232                 :           0 :        ABI_ERROR(msg)
     233                 :             :      end if
     234                 :           0 :      call hdr%fort_read(opt_unt,fform1,rewind=.true.)
     235                 :             :    end if
     236         [ -  + ]:           2 :    ABI_CHECK(fform1/=0,sjoin("Error while reading ",filnam1))
     237         [ -  + ]:           2 :    ABI_CHECK(fform1==610.or.fform1==620,"Conducti requires an OPT file with fform=610 or 620!")
     238                 :             :  end if
     239                 :           2 :  call hdr%bcast(master,me,comm)
     240                 :           2 :  call xmpi_bcast(fform1,master,comm,mpierr)
     241                 :             : 
     242                 :             : !Extract info from the header
     243                 :           2 :  headform=hdr%headform
     244                 :           2 :  bantot=hdr%bantot
     245                 :           2 :  ecut=hdr%ecut_eff
     246                 :           2 :  natom=hdr%natom
     247                 :           2 :  nkpt=hdr%nkpt
     248                 :           2 :  nspinor=hdr%nspinor
     249                 :           2 :  nsppol=hdr%nsppol
     250                 :           2 :  ntypat=hdr%ntypat
     251                 :           2 :  occopt=hdr%occopt
     252   [ +  +  +  + ]:          26 :  rprimd(:,:)=hdr%rprimd(:,:)
     253                 :           2 :  fermie=hdr%fermie
     254                 :           2 :  tsmear=hdr%tsmear
     255   [ -  +  +  -  :           6 :  ABI_MALLOC(nband,(nkpt*nsppol))
          +  -  +  -  -  
                +  -  + ]
     256   [ -  +  +  -  :           6 :  ABI_MALLOC(occ,(bantot))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     257   [ -  +  +  -  :           6 :  ABI_MALLOC(wtk,(nkpt))
          +  -  +  -  -  
                +  -  + ]
     258         [ +  + ]:           4 :  nband(1:nkpt*nsppol)=hdr%nband(1:nkpt*nsppol)
     259         [ +  + ]:          32 :  occ(1:bantot)=hdr%occ(1:bantot)
     260         [ +  + ]:           4 :  wtk(1:nkpt)=hdr%wtk(1:nkpt)
     261         [ +  + ]:           4 :  mband=maxval(nband(:))  ! Get mband, as the maximum value of nband(nkpt)
     262                 :           2 :  call metric(gmet,gprimd,-1,rmet,rprimd,ucvol) ! Get metrics of simulation cell
     263                 :             : 
     264                 :             : !Read eigenvalues
     265   [ -  +  +  -  :           6 :  ABI_MALLOC(eigen0,(mband*nkpt*nsppol))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     266         [ +  - ]:           2 :  if (me==master) then
     267         [ +  - ]:           2 :    if (iomode==IO_MODE_ETSF) then
     268                 :           2 :      varid=nctk_idname(ncid,"eigenvalues")
     269   [ -  +  +  -  :          10 :      ABI_MALLOC(eig0nc,(mband,nkpt,nsppol))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                +  -  + ]
     270         [ -  + ]:           2 :      NCF_CHECK(nf90_get_var(ncid,varid,eig0nc))
     271   [ +  +  +  -  :           4 :      eigen0 = reshape(eig0nc,[mband*nkpt*nsppol])
                   +  - ]
     272         [ -  + ]:           2 :      ABI_FREE(eig0nc)
     273                 :             :      !Close file here because the rest will possibly be read with collective I/O
     274         [ -  + ]:           2 :      NCF_CHECK(nf90_close(ncid))
     275                 :             :    else
     276                 :           0 :      read(opt_unt)(eigen0(iband),iband=1,mband*nkpt*nsppol)
     277                 :             :    end if
     278                 :             :  end if
     279                 :           2 :  call xmpi_bcast(eigen0,master,comm,mpierr)
     280                 :             : 
     281                 :             : !In case of varocc, use arbitrary occupations
     282                 :             : !Read occfile and overwrite occ by interpolating the data in the input file
     283         [ -  + ]:           2 :  if (present(varocc)) then
     284         [ #  # ]:           0 :    if (me==master) then
     285   [ #  #  #  #  :           0 :      ABI_MALLOC(occ_tmp,(bantot))
             #  #  #  # ]
     286         [ #  # ]:           0 :      if (open_file(occfile,msg,newunit=occ_unt,form='formatted')/=0) then
     287                 :           0 :        ABI_ERROR(msg)
     288                 :             :      end if
     289                 :             : !    Get units used in occfile (1=Ha, 2= eV)
     290                 :           0 :      read(occ_unt,*) occunit
     291                 :           0 :      read(occ_unt,*) occnpt
     292   [ #  #  #  #  :           0 :      ABI_MALLOC(occ_in,(occnpt))
          #  #  #  #  #  
                #  #  # ]
     293   [ #  #  #  #  :           0 :      ABI_MALLOC(eig_in,(occnpt))
             #  #  #  # ]
     294         [ #  # ]:           0 :      do iocc=1,occnpt
     295                 :           0 :        read(occ_unt,*) eig_in(iocc),occ_in(iocc)
     296         [ #  # ]:           0 :        if (occunit==2) then !Convert units from eV to Hartree
     297                 :           0 :          eig_in(iocc)=eig_in(iocc)/Ha_eV
     298                 :             :          occ_in(iocc)=occ_in(iocc)
     299                 :             :        end if
     300                 :             :      end do
     301                 :           0 :      close(occ_unt)
     302                 :             : !    Interpolation
     303   [ #  #  #  #  :           0 :      ABI_MALLOC(ypp,(occnpt))
          #  #  #  #  #  
                #  #  # ]
     304                 :           0 :      call spline(eig_in,occ_in,occnpt,zero,zero,ypp)
     305                 :             : !    Interpolate neccessary values
     306   [ #  #  #  #  :           0 :      eig_in_max=maxval(eig_in)
             #  #  #  # ]
     307   [ #  #  #  #  :           0 :      eig_in_min=minval(eig_in)
             #  #  #  # ]
     308         [ #  # ]:           0 :      do iocc=1,bantot
     309                 :             : !      Check for Extrapolation and set them to physically sound values
     310         [ #  # ]:           0 :        if (eigen0(iocc)<eig_in_min) then
     311                 :           0 :          occ_tmp(iocc)=one
     312         [ #  # ]:           0 :        else if (eigen0(iocc)>eig_in_max) then
     313                 :           0 :          occ_tmp(iocc)=zero
     314                 :             :        else
     315                 :           0 :          call splint(occnpt,eig_in,occ_in,ypp,1,eigen0(iocc),occ_tmp(iocc),ierr)
     316                 :             :        end if
     317                 :             :      end do
     318   [ #  #  #  #  :           0 :      occ=occ_tmp
             #  #  #  # ]
     319                 :             : !    Clean up
     320         [ #  # ]:           0 :      ABI_FREE(ypp)
     321         [ #  # ]:           0 :      ABI_FREE(occ_tmp)
     322         [ #  # ]:           0 :      ABI_FREE(occ_in)
     323         [ #  # ]:           0 :      ABI_FREE(eig_in)
     324                 :             :    end if
     325                 :           0 :    call xmpi_bcast(occ,master,comm,mpierr)
     326                 :           0 :    occopt=2
     327                 :             :  end if ! varocc?
     328                 :             : 
     329                 :             : !---------------------------------------------------------------------------------
     330                 :             : ! Prepare kpt/band parallelization
     331                 :             : 
     332                 :           2 :  call init_mpi_enreg(mpi_enreg)
     333                 :           2 :  mpi_enreg%comm_kpt=comm
     334                 :           2 :  mpi_enreg%me_kpt=me
     335                 :           2 :  mpi_enreg%nproc_spkpt=nproc
     336                 :           2 :  mpi_enreg%paralbd=1
     337   [ -  +  +  -  :          10 :  ABI_MALLOC(mpi_enreg%proc_distrb,(nkpt,mband,nsppol))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                +  -  + ]
     338   [ -  +  +  -  :           6 :  ABI_MALLOC(mpi_enreg%my_kpttab,(nkpt))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     339                 :           2 :  call distrb2(mband,nb_per_proc,nband,nkpt,nproc,nsppol,mpi_enreg)
     340                 :           2 :  call initmpi_band(nkpt,mpi_enreg,nband,nkpt,nsppol)
     341                 :             : 
     342                 :             : !---------------------------------------------------------------------------------
     343                 :             : !Print some data
     344                 :             : 
     345                 :           2 :  Tatm=tsmear*Ha_K
     346         [ +  - ]:           2 :  if (me==master) then
     347                 :           2 :    write(std_out,*)
     348                 :           2 :    write(std_out,'(a)' )' Input data:'
     349                 :           2 :    write(std_out,'(a,i8,3f10.5,a)')' npts,omin,omax,width      =',mom,omin,omax,dom,' Ha'
     350                 :           2 :    write(std_out,*)
     351                 :           2 :    write(std_out,'(a,3f10.5,a)' )' rprimd(bohr)      =',rprimd(1:3,1)
     352                 :           2 :    write(std_out,'(a,3f10.5,a)' )'                    ',rprimd(1:3,2)
     353                 :           2 :    write(std_out,'(a,3f10.5,a)' )'                    ',rprimd(1:3,3)
     354                 :           2 :    write(std_out,'(a,i8)')       ' natom             =',natom
     355                 :           2 :    write(std_out,'(a,3i8)')      ' nkpt,mband,nsppol        =',nkpt,mband,nsppol
     356                 :           2 :    write(std_out, '(a, f10.5,a)' ) ' ecut              =',ecut,' Ha'
     357                 :           2 :    write(std_out,'(a,f10.5,a,f10.5,a)' )' fermie            =',fermie,' Ha',fermie*Ha_eV,' eV'
     358                 :           2 :    write(std_out,'(a,f12.5,a,f12.5,a)') ' Temp              =',tsmear,' Ha ',Tatm,' Kelvin'
     359                 :             :  end if
     360                 :             : 
     361                 :             : ! ---------------------------------------------------------------------------------
     362                 :             : ! Compute derivative of occupations wrt the energy
     363                 :             : 
     364   [ -  +  +  -  :           6 :  ABI_MALLOC(doccde,(mband*nkpt*nsppol))
          +  -  +  -  -  
                +  -  + ]
     365         [ -  + ]:           2 :  if (occopt<=2) then
     366         [ #  # ]:           0 :    if (me==master) then
     367                 :           0 :      write(std_out,'(a,i4)')  ' occopt            =',occopt
     368                 :             :    end if
     369         [ #  # ]:           0 :    doccde=zero
     370                 :             :  else
     371                 :           2 :    tphysel=zero
     372                 :           2 :    maxocc=two/(nsppol*nspinor)
     373                 :             :    call getnel(doccde,dosdeltae,eigen0,entropy,fermie,fermih,maxocc,mband,nband,&
     374                 :           2 : &   socc,nkpt,nsppol,occ,occopt,1,tphysel,tsmear,12,wtk)
     375                 :           2 :    entropy=tsmear*entropy
     376         [ +  - ]:           2 :    if (me==master) then
     377                 :           2 :      write(std_out, '(a,es22.12)') ' tsmear*entropy (Ha)           =',entropy
     378                 :             :    end if
     379                 :           2 :    entropy=entropy/socc
     380         [ +  - ]:           2 :    if (me==master) then
     381                 :           2 :      write(std_out, '(a,es22.12)') ' tsmear*entropy (Ha/e)         =',entropy
     382                 :             :    end if
     383                 :             :  endif
     384                 :             : 
     385                 :             : !---------------------------------------------------------------------------------
     386                 :             : ! Determine the frequency range and allocate frequency-dependent arrays
     387                 :             : 
     388                 :           2 :  del=(omax-omin)/(mom-1)
     389   [ -  +  +  -  :           6 :  ABI_MALLOC(oml1,(mom))
          +  -  +  -  -  
                +  -  + ]
     390         [ +  + ]:        2002 :  do iom=1,mom
     391                 :        2002 :    oml1(iom)=omin+dble(iom-1)*del
     392                 :             :  end do
     393                 :             : 
     394   [ -  +  +  -  :           8 :  ABI_MALLOC(kin11,(mom,nsppol))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     395   [ -  +  +  -  :           4 :  ABI_MALLOC(kin12,(mom))
          -  +  -  +  -  
                      + ]
     396   [ -  +  +  -  :           4 :  ABI_MALLOC(kin21,(mom))
          -  +  -  +  -  
                      + ]
     397   [ -  +  +  -  :           4 :  ABI_MALLOC(kin22,(mom))
          -  +  -  +  -  
                      + ]
     398   [ -  +  +  -  :           6 :  ABI_MALLOC(cond_nd,(3,3,mom))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     399   [ -  +  +  -  :           4 :  ABI_MALLOC(sig_abs,(mom))
             -  +  -  + ]
     400   [ -  +  +  -  :           4 :  ABI_MALLOC(Kth,(mom))
             -  +  -  + ]
     401   [ -  +  +  -  :           4 :  ABI_MALLOC(Stp,(mom))
             -  +  -  + ]
     402   [ +  +  +  + ]:        2004 :  kin11   = zero
     403         [ +  + ]:        2002 :  kin12   = zero
     404         [ +  + ]:        2002 :  kin21   = zero
     405         [ +  + ]:        2002 :  kin22   = zero
     406   [ +  +  +  +  :       26002 :  cond_nd = zero
                   +  + ]
     407         [ +  + ]:        2002 :  sig_abs = zero
     408         [ +  + ]:        2002 :  Kth     = zero
     409         [ +  + ]:        2002 :  Stp     = zero
     410                 :             : 
     411                 :             : !---------------------------------------------------------------------------------
     412                 :             : !Prepare valence-valence dipoles reading
     413                 :             : 
     414   [ +  -  -  + ]:           2 :  iomode_estf_mpiio=(iomode==IO_MODE_ETSF.and.nctk_has_mpiio.and.use_netcdf_mpiio)
     415                 :             : 
     416                 :             :  !In case of netCDF access to OPT file, prepare collective I/O
     417         [ +  - ]:           2 :  if (iomode == IO_MODE_ETSF) then
     418         [ +  - ]:           2 :    if (iomode_estf_mpiio) then
     419         [ -  + ]:           2 :      NCF_CHECK(nctk_open_read(ncid,filnam1,comm))
     420                 :           2 :      varid=nctk_idname(ncid,"dipole_valence_valence")
     421         [ -  + ]:           2 :      if (nproc>1) then
     422         [ #  # ]:           0 :        NCF_CHECK(nctk_set_collective(ncid,varid))
     423   [ #  #  #  #  :           0 :        ABI_MALLOC(num_tasks,(nproc))
          #  #  #  #  #  
                #  #  # ]
     424         [ #  # ]:           0 :        do iproc=1,nproc
     425   [ #  #  #  #  :           0 :          num_tasks(iproc)=count(mpi_enreg%proc_distrb==iproc-1)
             #  #  #  # ]
     426                 :             :        enddo
     427         [ #  # ]:           0 :        num_tasks_max=maxval(num_tasks)
     428                 :             :      end if
     429                 :           2 :      nc_unlimited=(nf90_inq_dimid(ncid,"unlimited_bands",dimid)==NF90_NOERR)
     430                 :           2 :      read_half_dipoles=(nf90_inq_dimid(ncid,"max_number_of_state_pairs",dimid)==NF90_NOERR)
     431                 :             :    else
     432         [ #  # ]:           0 :      if (me==master) then
     433         [ #  # ]:           0 :        NCF_CHECK(nctk_open_read(ncid,filnam1,xmpi_comm_self))
     434                 :           0 :        varid=nctk_idname(ncid,"dipole_valence_valence")
     435                 :             :        !if (nctk_has_mpiio.and.(.not.use_netcdf_mpiio)) then
     436                 :             :        !  NCF_CHECK(nctk_set_collective(ncid,varid))
     437                 :             :        !end if
     438                 :           0 :        nc_unlimited=(nf90_inq_dimid(ncid,"unlimited_bands",dimid)==NF90_NOERR)
     439                 :           0 :        read_half_dipoles=(nf90_inq_dimid(ncid,"max_number_of_state_pairs",dimid)==NF90_NOERR)
     440                 :             :      end if
     441                 :           0 :      call xmpi_bcast(nc_unlimited,master,comm,ierr)
     442                 :           0 :      call xmpi_bcast(read_half_dipoles,master,comm,ierr)
     443                 :             :    end if
     444   [ -  +  -  - ]:           2 :    if (nc_unlimited.and.read_half_dipoles) then
     445                 :           0 :      msg="The OPT file has a wrong format!"
     446                 :           0 :      ABI_BUG(msg)
     447                 :             :    end if
     448                 :             :  else
     449                 :           0 :    read_half_dipoles=(fform1==620)
     450                 :             :  end if
     451                 :             : 
     452         [ +  - ]:           2 :  if (iomode_estf_mpiio) then
     453                 :             :    !If MPI-IO, store only ib elements for each jb
     454   [ -  +  +  -  :           6 :    ABI_MALLOC(psinablapsi,(2,3,mband))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     455                 :             :  else
     456                 :             :    !If not, store all pairs (or half)
     457         [ #  # ]:           0 :    if (read_half_dipoles) then ! only ib>=jb
     458   [ #  #  #  #  :           0 :      ABI_MALLOC(psinablapsi,(2,3,(mband*(mband+1))/2))
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     459                 :             :    else
     460   [ #  #  #  #  :           0 :      ABI_MALLOC(psinablapsi,(2,3,mband*mband))
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     461                 :             :    end if
     462                 :             :  end if
     463         [ +  + ]:           8 :  pnp_size=size(psinablapsi)
     464                 :             : 
     465                 :             : !---------------------------------------------------------------------------------
     466                 :             : ! Compute conductivity
     467                 :             : 
     468   [ -  +  +  -  :           6 :  ABI_MALLOC(kin11_k,(mom))
          +  -  +  -  -  
                +  -  + ]
     469   [ -  +  +  -  :           4 :  ABI_MALLOC(kin12_k,(mom))
             -  +  -  + ]
     470   [ -  +  +  -  :           4 :  ABI_MALLOC(kin21_k,(mom))
             -  +  -  + ]
     471   [ -  +  +  -  :           4 :  ABI_MALLOC(kin22_k,(mom))
             -  +  -  + ]
     472   [ -  +  +  -  :           6 :  ABI_MALLOC(cond_nd_k,(3,3,mom))
          +  -  +  -  -  
                +  -  + ]
     473                 :             : 
     474                 :           2 :  np_sum  = zero
     475                 :           2 :  socc    = zero
     476                 :           2 :  deltae  = zero
     477                 :           2 :  deltae_min = 1.d99
     478                 :             : 
     479                 :             : !LOOP OVER SPINS/K
     480                 :           2 :  bdtot_index = 0
     481         [ +  + ]:           4 :  do isppol=1,nsppol
     482         [ +  + ]:           6 :    do ikpt=1,nkpt
     483                 :           2 :      etiq=ikpt+(isppol-1)*nkpt
     484                 :           2 :      nband_k=nband(ikpt+(isppol-1)*nkpt)
     485                 :           2 :      mykpt=.not.(proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,1,nband_k,isppol,me))
     486         [ +  + ]:          32 :      master_band=minval(mpi_enreg%proc_distrb(ikpt,1:nband_k,isppol))
     487                 :             : 
     488                 :             : !    In case of non MPI-IO, has to read all (n,m) dipoles for this k-point
     489                 :             : !      Master node reads and send to relevant processor
     490   [ -  +  -  - ]:           2 :      if (.not.iomode_estf_mpiio.and.me==master) then
     491         [ #  # ]:           0 :        if (iomode==IO_MODE_ETSF) then
     492   [ #  #  #  #  :           0 :          psinablapsi=zero
                   #  # ]
     493         [ #  # ]:           0 :          if (nc_unlimited) then
     494   [ #  #  #  # ]:           0 :            nc_start_6=[1,1,1,ikpt,isppol,1] ; nc_count_6=[2,3,mband,1,1,mband] ; nc_stride_6=[1,1,1,1,1,1]
     495         [ #  # ]:           0 :            NCF_CHECK(nf90_get_var(ncid,varid,psinablapsi,start=nc_start_6,stride=nc_stride_6,count=nc_count_6))
     496         [ #  # ]:           0 :          else if (.not.read_half_dipoles) then
     497   [ #  #  #  # ]:           0 :            nc_start_6=[1,1,1,1,ikpt,isppol] ; nc_count_6=[2,3,mband,mband,1,1] ; nc_stride_6=[1,1,1,1,1,1]
     498         [ #  # ]:           0 :            NCF_CHECK(nf90_get_var(ncid,varid,psinablapsi,start=nc_start_6,stride=nc_stride_6,count=nc_count_6))
     499                 :             :          else
     500   [ #  #  #  # ]:           0 :            nc_start_5=[1,1,1,ikpt,isppol] ; nc_count_5=[2,3,(mband*(mband+1))/2,1,1] ; nc_stride_5=[1,1,1,1,1]
     501         [ #  # ]:           0 :            NCF_CHECK(nf90_get_var(ncid,varid,psinablapsi,start=nc_start_5,stride=nc_stride_5,count=nc_count_5))
     502                 :             :          end if
     503                 :             :        else
     504   [ #  #  #  #  :           0 :          psinablapsi=zero
                   #  # ]
     505         [ #  # ]:           0 :          bsize=nband_k**2;if (read_half_dipoles) bsize=(nband_k*(nband_k+1))/2
     506   [ #  #  #  # ]:           0 :          read(opt_unt)(psinablapsi(1:2,1,ijband),ijband=1,bsize)
     507   [ #  #  #  # ]:           0 :          read(opt_unt)(psinablapsi(1:2,2,ijband),ijband=1,bsize)
     508   [ #  #  #  # ]:           0 :          read(opt_unt)(psinablapsi(1:2,3,ijband),ijband=1,bsize)
     509                 :             :        end if
     510         [ #  # ]:           0 :        if (.not.mykpt) then
     511                 :           0 :          call xmpi_exch(psinablapsi,pnp_size,master,psinablapsi,master_band,comm,etiq,ierr)
     512                 :             :        end if
     513                 :             :      end if
     514                 :             : 
     515                 :             : !    Select k-points for current proc
     516         [ +  - ]:           2 :      if (mykpt) then
     517                 :             : 
     518   [ -  +  +  -  :           6 :        ABI_MALLOC(eig0_k,(nband_k))
          +  -  +  -  -  
                +  -  + ]
     519   [ -  +  +  -  :           4 :        ABI_MALLOC(occ_k,(nband_k))
             -  +  -  + ]
     520   [ -  +  +  -  :           4 :        ABI_MALLOC(doccde_k,(nband_k))
             -  +  -  + ]
     521                 :             : 
     522   [ +  +  +  +  :       26002 :        cond_nd_k = zero
                   +  + ]
     523         [ +  + ]:        2002 :        kin11_k   = zero
     524         [ +  + ]:        2002 :        kin12_k   = zero
     525         [ +  + ]:        2002 :        kin21_k   = zero
     526         [ +  + ]:        2002 :        kin22_k   = zero
     527                 :           2 :        np_sum_k1 = zero
     528                 :           2 :        socc_k    = zero
     529                 :             : 
     530                 :             : !      k-dependent data
     531         [ +  + ]:          32 :        eig0_k(:)=eigen0(1+bdtot_index:nband_k+bdtot_index)
     532         [ +  + ]:          32 :        occ_k(:)=occ(1+bdtot_index:nband_k+bdtot_index)
     533         [ +  + ]:          32 :        doccde_k(:)=doccde(1+bdtot_index:nband_k+bdtot_index)
     534                 :             : 
     535                 :             : !      In case of non MPI-IO, receive all (n,m) dipoles from master proc
     536                 :             : !        Then broadcast them to all band processors
     537         [ -  + ]:           2 :        if (.not.iomode_estf_mpiio) then
     538   [ #  #  #  # ]:           0 :          if (me/=master.and.me==master_band) then
     539                 :           0 :            call xmpi_exch(psinablapsi,pnp_size,master,psinablapsi,me,comm,etiq,ierr)
     540                 :             :          end if
     541                 :           0 :          call xmpi_bcast(psinablapsi,master,mpi_enreg%comm_band,mpierr)
     542                 :             :        end if
     543                 :             : 
     544                 :             : !      LOOP OVER BANDS n
     545         [ +  + ]:          32 :        do iband=1,nband_k
     546                 :             : 
     547                 :             :          !If MPI-IO, store only ib elements for each jb
     548                 :             :          !If not, store all (ib,jb) pairs
     549         [ -  + ]:          30 :          my_iband=merge(1,iband,iomode_estf_mpiio)
     550                 :             : 
     551                 :             : !        Select bands for current proc
     552                 :          30 :          myband=(mpi_enreg%proc_distrb(ikpt,iband,isppol)==me)
     553         [ +  - ]:          32 :          if (myband) then
     554                 :             : 
     555                 :             : !          In case of MPI-IO, read valence-valence dipoles for band n
     556         [ +  - ]:          30 :            if (iomode_estf_mpiio) then
     557         [ -  + ]:          30 :              if (nc_unlimited) then
     558   [ #  #  #  # ]:           0 :                nc_start_6=[1,1,iband,ikpt,isppol,1] ; nc_count_6=[2,3,1,1,1,mband] ; nc_stride_6=[1,1,1,1,1,1]
     559         [ #  # ]:           0 :                NCF_CHECK(nf90_get_var(ncid,varid,psinablapsi,start=nc_start_6,stride=nc_stride_6,count=nc_count_6))
     560         [ -  + ]:          30 :              else if (.not.read_half_dipoles) then
     561   [ #  #  #  # ]:           0 :                nc_start_6=[1,1,1,iband,ikpt,isppol] ; nc_count_6=[2,3,mband,1,1,1] ; nc_stride_6=[1,1,1,1,1,1]
     562         [ #  # ]:           0 :                NCF_CHECK(nf90_get_var(ncid,varid,psinablapsi,start=nc_start_6,stride=nc_stride_6,count=nc_count_6))
     563                 :             :              else
     564   [ +  +  +  + ]:         330 :                nc_start_5=[1,1,(iband*(iband-1))/2+1,ikpt,isppol] ; nc_count_5=[2,3,iband,1,1] ; nc_stride_5=[1,1,1,1,1]
     565         [ -  + ]:          30 :                NCF_CHECK(nf90_get_var(ncid,varid,psinablapsi,start=nc_start_5,stride=nc_stride_5,count=nc_count_5))
     566                 :             :              end if
     567                 :             :            end if
     568                 :             : 
     569                 :             : !          LOOP OVER BANDS m
     570         [ +  + ]:         295 :            do jband=1,iband
     571                 :         265 :              diff_occ = occ_k(iband)-occ_k(jband)
     572                 :         265 :              diff_eig = eig0_k(iband)-eig0_k(jband)
     573                 :             : 
     574                 :         265 :              dhdk2_r = zero
     575                 :         265 :              dhdk2_g = zero
     576                 :             : 
     577         [ +  - ]:         265 :              if (read_half_dipoles) then
     578                 :         265 :                ijband=(my_iband*(my_iband-1))/2+jband
     579                 :             :              else
     580                 :             :                !psinablapsi size is mband for netCDF I/O, nband_k for Fortran I/O
     581         [ #  # ]:           0 :                bd_stride=merge(mband,nband_k,iomode==IO_MODE_ETSF)
     582                 :           0 :                ijband=(my_iband-1)*bd_stride+jband
     583                 :             :              end if
     584                 :             : 
     585         [ +  + ]:        1060 :              do l2=1,3
     586         [ +  + ]:        3445 :                do l1=1,3
     587                 :             :                  dhdk2_r(l1,l2)=dhdk2_r(l1,l2)+(&
     588                 :             : &                  psinablapsi(1,l1,ijband)*psinablapsi(1,l2,ijband)&
     589                 :        3180 : &                 +psinablapsi(2,l1,ijband)*psinablapsi(2,l2,ijband))
     590                 :             :                end do
     591                 :             :              end do
     592         [ +  + ]:        1060 :              do l1=1,3
     593                 :             :                dhdk2_g=dhdk2_g &
     594                 :             : &                +(psinablapsi(1,l1,ijband)*psinablapsi(1,l1,ijband) &
     595                 :        1060 : &                 +psinablapsi(2,l1,ijband)*psinablapsi(2,l1,ijband))*third ! Average over directions
     596                 :             :              end do
     597                 :             : 
     598                 :             : 
     599                 :             :              !Minimal validity limit
     600                 :         265 :              deltae_min_tmp=dabs(diff_eig)
     601   [ +  +  +  + ]:         265 :              if ((deltae_min_tmp>=tol5).and.(deltae_min_tmp<=deltae_min)) deltae_min=deltae_min_tmp
     602                 :             : 
     603                 :             :              !Conductivity for each omega - Apply KG formula
     604                 :         265 :              kin_fact=(eig0_k(iband)+eig0_k(jband))*half-(fermie+entropy)
     605                 :         265 :              omega0=dabs(diff_occ)<tol12
     606         [ +  + ]:         265 :              fact_omega0=merge(two,one,omega0)
     607                 :             :              !Evaluate sumrule
     608                 :             :              if (.not.omega0) then
     609                 :         213 :                docc_deig=dabs(diff_occ/diff_eig)
     610         [ -  + ]:          52 :              else if(add_drude==1) then
     611                 :           0 :                docc_deig=dabs(doccde_k(iband))
     612                 :             :              else
     613                 :             :                docc_deig=zero
     614                 :             :              endif
     615                 :         265 :              np_sum_k1=np_sum_k1 + two*dhdk2_g*docc_deig/fact_omega0
     616                 :             :              !
     617         [ +  + ]:      265295 :              do iom=1,mom
     618                 :      265000 :                oml=oml1(iom)
     619         [ +  + ]:      265000 :                if (.not.omega0) then
     620                 :      213000 :                  docc_deig=dabs(diff_occ/oml)
     621         [ -  + ]:       52000 :                else if(add_drude==1) then
     622                 :           0 :                  docc_deig=dabs(doccde_k(iband))
     623                 :             :                else
     624                 :             :                  docc_deig=zero
     625                 :             :                endif
     626         [ -  + ]:      265000 :                if(broad_mode==0) then
     627                 :             :                  dirac=dexp(-((abs(diff_eig)-oml)/(sqrt(two)*dom))**2)/(dom*dsqrt(pi*two))-& ! Take into account (n,m) and (m,n)
     628                 :           0 : &                      dexp(-((abs(diff_eig)+oml)/(sqrt(two)*dom))**2)/(dom*dsqrt(pi*two))
     629                 :             :                else
     630                 :      265000 :                  dirac=dom/((abs(diff_eig)-oml)**2+dom**2)/pi-dom/((abs(diff_eig)+oml)**2+dom**2)/pi
     631                 :             :                endif
     632                 :      265000 :                sig=dhdk2_g*docc_deig*dirac*pi/(ucvol)
     633                 :      265000 :                kin11_k(iom)=kin11_k(iom)+sig
     634                 :      265000 :                kin12_k(iom)=kin12_k(iom)-sig*kin_fact
     635                 :      265000 :                kin21_k(iom)=kin21_k(iom)-sig*kin_fact
     636                 :      265000 :                kin22_k(iom)=kin22_k(iom)+sig*kin_fact**2
     637         [ +  + ]:     1060265 :                do l2=1,3
     638         [ +  + ]:     3445000 :                  do l1=1,3
     639                 :     3180000 :                    cond_nd_k(l1,l2,iom)=cond_nd_k(l1,l2,iom)+dhdk2_r(l1,l2)*docc_deig*dirac*pi/ucvol
     640                 :             :                  end do
     641                 :             :                end do
     642                 :             :              end do
     643                 :             : 
     644                 :             :            end do !jband
     645                 :             : 
     646                 :          30 :            socc_k=socc_k+occ_k(iband)
     647                 :             : 
     648                 :             :          end if ! my band?
     649                 :             :        end do ! iband
     650                 :             : 
     651                 :             : !      Accumulate k-point contribution
     652         [ +  + ]:        2002 :        do iom=1,mom
     653                 :        2000 :          kin11(iom,isppol)=kin11(iom,isppol)+wtk(ikpt)*kin11_k(iom)
     654                 :        2000 :          kin12(iom)=kin12(iom)+wtk(ikpt)*kin12_k(iom)
     655                 :        2000 :          kin21(iom)=kin21(iom)+wtk(ikpt)*kin21_k(iom)
     656                 :        2000 :          kin22(iom)=kin22(iom)+wtk(ikpt)*kin22_k(iom)
     657   [ +  +  +  + ]:       26002 :          cond_nd(:,:,iom)=cond_nd(:,:,iom)+wtk(ikpt)*cond_nd_k(:,:,iom)
     658                 :             :        end do
     659                 :           2 :        np_sum=np_sum+wtk(ikpt)*np_sum_k1
     660                 :           2 :        socc=socc+wtk(ikpt)*socc_k
     661                 :             : 
     662                 :             : !      Validity limit
     663                 :           2 :        deltae=deltae+(eig0_k(nband_k)-fermie)
     664                 :             : 
     665                 :           2 :        ABI_FREE(eig0_k)
     666         [ -  + ]:           2 :        ABI_FREE(occ_k)
     667         [ -  + ]:           2 :        ABI_FREE(doccde_k)
     668                 :             : 
     669                 :             : !    End loop over kpt/spin
     670                 :             :      end if ! My kpt?
     671                 :           4 :      bdtot_index=bdtot_index+nband_k
     672                 :             :    end do ! ikpt
     673                 :             :  end do ! isppol
     674                 :             : 
     675         [ +  - ]:           2 :  if (iomode == IO_MODE_ETSF) then
     676   [ +  -  -  + ]:           2 :    if(iomode_estf_mpiio.and.nproc>1) then
     677         [ #  # ]:           0 :      do idum=num_tasks(me+1)+1,num_tasks_max
     678         [ #  # ]:           0 :         if (nc_unlimited) then
     679                 :           0 :           nc_start_6=[1,1,1,1,1,1] ; nc_count_6=[0,0,0,0,0,0] ; nc_stride_6=[1,1,1,1,1,1]
     680         [ #  # ]:           0 :           NCF_CHECK(nf90_get_var(ncid,varid,dummy,start=nc_start_6,stride=nc_stride_6,count=nc_count_6))
     681         [ #  # ]:           0 :         else if (.not.read_half_dipoles) then
     682                 :           0 :           nc_start_6=[1,1,1,1,1,1] ; nc_count_6=[0,0,0,0,0,0] ; nc_stride_6=[1,1,1,1,1,1]
     683         [ #  # ]:           0 :           NCF_CHECK(nf90_get_var(ncid,varid,dummy,start=nc_start_6,stride=nc_stride_6,count=nc_count_6))
     684                 :             :         else
     685                 :           0 :           nc_start_5=[1,1,1,1,1] ; nc_count_5=[0,0,0,0,0] ; nc_stride_5=[1,1,1,1,1]
     686         [ #  # ]:           0 :           NCF_CHECK(nf90_get_var(ncid,varid,dummy,start=nc_start_5,stride=nc_stride_5,count=nc_count_5))
     687                 :             :         end if
     688                 :             :      enddo
     689                 :           0 :      ABI_FREE(num_tasks)
     690                 :             :    endif
     691                 :             :  endif
     692                 :             : 
     693                 :             : !Accumulate kpt/band contributions over processors
     694                 :           2 :  call xmpi_sum(kin11,comm,mpierr)
     695                 :           2 :  call xmpi_sum(kin12,comm,mpierr)
     696                 :           2 :  call xmpi_sum(kin21,comm,mpierr)
     697                 :           2 :  call xmpi_sum(kin22,comm,mpierr)
     698                 :           2 :  call xmpi_sum(np_sum,comm,mpierr)
     699                 :           2 :  call xmpi_sum(socc,comm,mpierr)
     700                 :           2 :  call xmpi_sum(deltae,comm,mpierr)
     701                 :           2 :  call xmpi_min(deltae_min,comm,mpierr)
     702                 :           2 :  call xmpi_sum(cond_nd,comm,mpierr)
     703                 :           2 :  deltae=deltae/mpi_enreg%nproc_band
     704                 :             : 
     705         [ -  + ]:           2 :  ABI_FREE(psinablapsi)
     706                 :             : 
     707                 :             : !---------------------------------------------------------------------------------
     708                 :             : ! Output results
     709                 :             : 
     710                 :             : !Print file headers (only master node)
     711         [ +  - ]:           2 :  if (me==master) then
     712                 :             : !  Standard output
     713                 :             :    write(std_out,'(a,f10.5,a,f10.5,a)')&
     714                 :           2 : &   ' Emax-Efermi       =',deltae/dble(nkpt*nsppol),' Ha', &
     715                 :           4 : &                          deltae/dble(nkpt*nsppol)*Ha_eV,' eV'
     716                 :             :    write(std_out,'(a,f10.5,a,f10.5,a)')&
     717                 :           2 : &   ' DeltaE min        =',deltae_min,' Ha',deltae_min*Ha_eV,' eV'
     718                 :             : 
     719                 :             : !  _Lij file
     720         [ -  + ]:           2 :    if (open_file(trim(filnam_out)//'_Lij',msg, newunit=lij_unt, form='formatted', action="write") /= 0) then
     721                 :           0 :      ABI_ERROR(msg)
     722                 :             :    end if
     723                 :           2 :    write(lij_unt,'(a)')' # omega(ua) L11 L12 L22'
     724                 :             : 
     725                 :             : !  _sig_up_dn file
     726         [ -  + ]:           2 :    if(nsppol==2) then
     727         [ #  # ]:           0 :      if (open_file(trim(filnam_out)//'_sig_up_dn', msg, newunit=sig_unt, form='formatted', action="write") /= 0) then
     728                 :           0 :        ABI_ERROR(msg)
     729                 :             :      end if
     730         [ #  # ]:           0 :      if(au_units>0) then
     731                 :           0 :        write(sig_unt,'(2a)')' # omega(ua) cond(ua)  ',&
     732                 :           0 : &                           '      cond(ua) UP      cond(ua) DN'
     733                 :             :      else
     734                 :           0 :        write(sig_unt,'(2a)')' # hbar*omega(eV)      cond(ohm.cm)-1',&
     735                 :           0 : &                           '      cond(ohm.cm)-1 UP      cond(ohm.cm)-1 DN'
     736                 :             :      endif
     737                 :             :    end if
     738                 :             : 
     739                 :             : ! sig_dir file
     740         [ -  + ]:           2 :   if (open_file(trim(filnam_out)//'_sig_tensor', msg, newunit=sigd_unt,form='formatted', action="write") /= 0) then
     741                 :           0 :      ABI_ERROR(msg)
     742                 :             :   end if
     743         [ -  + ]:           2 :   if(au_units>0) then
     744                 :           0 :     write(sigd_unt,'(a)')' # omega(ua) cond_xx(ua) cond_yy(ua) cond_zz(ua) cond_xy(ua) cond_xz(ua) cond_yz(ua)'
     745                 :             :   else
     746                 :             :     write(sigd_unt,'(a)')' # hbar*omega(eV) cond_xx(ohm.cm)-1 cond_yy(ohm.cm)-1 cond_zz(ohm.cm)-1 &
     747                 :           2 : &           cond_xy(ohm.cm)-1 cond_xz(ohm.cm)-1 cond_yz(ohm.cm)-1'
     748                 :             :   endif
     749                 :             : 
     750                 :             : !  _Kth file
     751         [ -  + ]:           2 :    if (open_file(trim(filnam_out)//'_Kth', msg, newunit=kth_unt, form='formatted', action="write") /=0) then
     752                 :           0 :      ABI_ERROR(msg)
     753                 :             :    end if
     754                 :             :    write(kth_unt,'(a)')&
     755                 :           2 : &   " #Thermal conductivity following B. Holst et al Phys. Rev. B 83 (2011) 235120"
     756         [ -  + ]:           2 :    if(au_units>0) then
     757                 :           0 :      write(kth_unt,'(a)')' # omega(ua)  thermal cond(ua) thermopower(ua)'
     758                 :             :    else
     759                 :           2 :      write(kth_unt,'(a)')' # hbar*omega(eV)  thermal cond (W/m/K)   thermopower(microohm/K)'
     760                 :             :    endif
     761                 :             : 
     762                 :             : !  Output file
     763         [ -  + ]:           2 :    if (open_file(trim(filnam_out)//'.out', msg, newunit=ocond_unt, form='formatted', action="write") /= 0) then
     764                 :           0 :      ABI_ERROR(msg)
     765                 :             :    end if
     766                 :           2 :    write(ocond_unt,'(a)' )'#Conducti output file:'
     767                 :           2 :    write(ocond_unt,'(a)' )'#Contains all results produced by conducti utility'
     768                 :           2 :    write(ocond_unt,'(a)' )'#  '
     769                 :           2 :    write(ocond_unt,'(a,i8,3f10.5,a)')'# npts,omin,omax,width     =' ,mom,omin,omax,dom,' Ha'
     770                 :           2 :    write(ocond_unt,'(a,3f10.5,a)' )'# rprimd(bohr)      =',rprimd(1:3,1)
     771                 :           2 :    write(ocond_unt,'(a,3f10.5,a)' )'#                    ',rprimd(1:3,2)
     772                 :           2 :    write(ocond_unt,'(a,3f10.5,a)' )'#                    ',rprimd(1:3,3)
     773                 :           2 :    write(ocond_unt,'(a,i8)' )      '# natom             =',natom
     774                 :           2 :    write(ocond_unt,'(a,3i8)' )     '# nkpt,mband,nsppol        =',nkpt,mband,nsppol
     775                 :           2 :    write(ocond_unt,'(a, f10.5,a)' )'# ecut                  =',ecut,' Ha'
     776                 :           2 :    write(ocond_unt,'(a,f10.5,a,f10.5,a)' )'# fermie            =',fermie,' Ha ',fermie*Ha_eV,' eV'
     777                 :             : 
     778                 :           2 :    write(ocond_unt,'(a,f12.5,a,f12.5,a)') '# Temp              =',tsmear,' Ha ',Tatm,' Kelvin'
     779                 :           2 :    write(ocond_unt,'(a,f15.5)' )'# Number of electrons           = ',socc
     780                 :           2 :    write(ocond_unt,'(a,f15.5)' )'# sumrule           = ',np_sum/socc
     781                 :             :    write(ocond_unt,'(a,f10.5,a,f10.5,a)' )&
     782                 :           2 : &   '# Emax-Efermi       =',deltae/dble(nkpt*nsppol),' Ha',deltae/dble(nkpt*nsppol)*Ha_eV,' eV'
     783                 :           2 :    write(ocond_unt,'(a)' )'# '
     784         [ -  + ]:           2 :    if(au_units>0) then
     785                 :           0 :      write(ocond_unt,'(a)')'# omega(ua)       cond(ua)             thermal cond(ua)       thermopower(ua)'
     786                 :             :    else
     787                 :           2 :      write(ocond_unt,'(a)')'# hbar*omega(eV) cond(ohm.cm)-1 thermal cond(W/m/K)   thermopower(microvolt/K) '
     788                 :             :    endif
     789                 :             : 
     790                 :             :  end if ! me==master?
     791                 :             : 
     792                 :             : !Compute (and print) thermal conductivity and thermopower
     793         [ +  + ]:        2002 :  do iom=1,mom
     794                 :        2000 :    oml=oml1(iom)
     795                 :             : 
     796         [ +  + ]:        4000 :    do isppol=1,nsppol
     797         [ -  + ]:        2000 :      if (dabs(kin11(iom,isppol))<tol19) kin11(iom,isppol)=zero
     798                 :        4000 :      sig_abs(iom)=sig_abs(iom)+kin11(iom,isppol)
     799                 :             :    end do
     800                 :             : 
     801                 :        2000 :    Kth(iom)=kin22(iom)/tsmear
     802                 :        2000 :    Stp(iom)=zero
     803         [ +  - ]:        2000 :    if (sig_abs(iom)/=zero)  then
     804                 :        2000 :      Kth(iom)=Kth(iom)-(kin12(iom)*kin21(iom)/sig_abs(iom))/tsmear
     805                 :        2000 :      Stp(iom)=kin12(iom)/(sig_abs(iom)*tsmear)
     806                 :             :    else
     807                 :           0 :      Kth(iom)=Kth(iom-1)
     808                 :           0 :      Stp(iom)=Stp(iom-1)
     809                 :             :    endif
     810         [ -  + ]:        2000 :    if (dabs(Kth(iom))<tol19) Kth(iom)=zero
     811         [ -  + ]:        2000 :    if (dabs(Stp(iom))<tol19) Stp(iom)=zero
     812         [ -  + ]:        2000 :    if (abs(kin12(iom))<10.0_dp**(-80)) kin12(iom)=zero
     813         [ -  + ]:        2000 :    if (abs(kin21(iom))<10.0_dp**(-80)) kin21(iom)=zero
     814         [ -  + ]:        2002 :    if (abs(kin22(iom))<10.0_dp**(-80)) kin22(iom)=zero
     815                 :             :  end do
     816                 :             : 
     817                 :             :  !Compute the imaginary part of the conductivity (principal value)
     818                 :             : !  +derived optical properties.
     819         [ +  - ]:           2 :  if (me==master) then
     820                 :           2 :    call msig(sig_abs,mom,oml1,filnam_out,phi,au_units)
     821                 :             :  end if
     822                 :             : 
     823                 :             :  ! Units
     824         [ +  - ]:           2 :  if (me==master) then
     825         [ +  + ]:        2002 :    do iom=1,mom
     826                 :        2000 :      oml=oml1(iom)
     827                 :        2002 :       write(lij_unt,'(f12.5,3es22.12)') oml,sig_abs(iom),kin12(iom),kin22(iom)
     828                 :             :    enddo
     829                 :             :  endif
     830                 :             : 
     831                 :           2 :  np_sum_2=zero
     832         [ +  + ]:        2000 :  do iom=1,mom-1
     833                 :        2000 :    np_sum_2=np_sum_2+(sig_abs(iom)+sig_abs(iom+1))*(oml1(iom+1)-oml1(iom))/2.0_dp
     834                 :             :  enddo
     835                 :           2 :  np_sum_2=2.0_dp*np_sum_2*ucvol/pi
     836   [ +  -  +  + ]:        2002 :  if(au_units==0) oml1=oml1*Ha_eV
     837   [ +  -  +  +  :       26002 :  if(au_units==0) cond_nd=cond_nd*Ohmcm
             +  +  +  + ]
     838   [ +  -  +  + ]:        2002 :  if(au_units==0) sig_abs=sig_abs*Ohmcm
     839   [ +  -  +  +  :        2004 :  if(au_units==0) kin11=kin11*Ohmcm
                   +  + ]
     840   [ +  -  +  + ]:        2002 :  if(au_units==0) Kth=Kth*3.4057d9/Ha_K
     841   [ +  -  +  + ]:        2002 :  if(au_units==0) Stp=Stp*Ha_J/(Ha_K*e_CB)*10.0_dp**6
     842                 :             : 
     843                 :             : 
     844         [ +  - ]:           2 :  if (me==master) then
     845                 :           2 :    write(std_out,'(a,f15.5)' )'# Number of electrons           = ',socc
     846                 :           2 :    write(std_out,'(a,f15.5)' )'# sumrule           = ',np_sum/socc
     847                 :           2 :    write(std_out,'(a,f15.5)' )'# sumrule (integration) = ',np_sum_2/socc
     848         [ +  + ]:        2002 :    do iom=1,mom
     849                 :        2000 :      oml=oml1(iom)
     850                 :        2000 :      write(sigd_unt,'(f12.5,6es22.12)') oml,cond_nd(1,1,iom),cond_nd(2,2,iom),cond_nd(3,3,iom),&
     851                 :        4000 : &      cond_nd(1,2,iom),cond_nd(1,3,iom),cond_nd(2,3,iom)
     852         [ -  + ]:        2000 :      if (nsppol==2) then
     853                 :           0 :        write(sig_unt,'(f12.5,3es22.12)') oml,sig_abs(iom), &
     854                 :           0 : &        kin11(iom,1),kin11(iom,2)
     855                 :             :      end if
     856                 :        2000 :      write(kth_unt,'(f12.5,3es22.12)') oml,Kth(iom),Stp(iom)
     857                 :        2002 :      write(ocond_unt,'(1f12.5,3es22.12)') oml,sig_abs(iom),Kth(iom),Stp(iom)
     858                 :             :    enddo
     859                 :             :  end if
     860                 :             : 
     861                 :             : 
     862                 :             : !---------------------------------------------------------------------------------
     863                 :             : ! End
     864                 :             : 
     865                 :             : !Close all files
     866         [ +  - ]:           2 :  if (me==master) then
     867                 :           2 :    write(std_out,'(2a)')ch10,'OUTPUT'
     868                 :           2 :    write(std_out,'(a)')trim(filnam_out)//'_Lij : Onsager kinetic coefficients'
     869                 :           2 :    write(std_out,'(a)')trim(filnam_out)//'_eps : Optical conductivity and dielectric function'
     870                 :           2 :    write(std_out,'(a)')trim(filnam_out)//'_sig_tensor : Optical conductivity tensor'
     871                 :           2 :    write(std_out,'(a)')trim(filnam_out)//'_Kth : Thermal conductivity and thermopower'
     872                 :           2 :    write(std_out,'(a)')trim(filnam_out)//'_abs : n, k, reflectivity, absorption'
     873                 :           2 :    close(lij_unt)
     874         [ -  + ]:           2 :    if(nsppol==2) close(sig_unt)
     875                 :           2 :    close(kth_unt)
     876                 :           2 :    close(ocond_unt)
     877                 :           2 :    close(sigd_unt)
     878                 :             :  end if
     879         [ +  - ]:           2 :  if (iomode == IO_MODE_ETSF) then
     880   [ -  +  -  - ]:           2 :    if (iomode_estf_mpiio.or.me==master) then
     881         [ -  + ]:           2 :      NCF_CHECK(nf90_close(ncid))
     882                 :             :    end if
     883         [ #  # ]:           0 :  else if (me==master) then
     884                 :           0 :    ierr=close_unit(opt_unt,msg)
     885         [ #  # ]:           0 :    ABI_CHECK(ierr==0,sjoin("Error while closing ",filnam1))
     886                 :             :  end if
     887                 :             : 
     888                 :             : !Release memory space
     889         [ -  + ]:           2 :  ABI_FREE(kin11)
     890         [ -  + ]:           2 :  ABI_FREE(kin22)
     891         [ -  + ]:           2 :  ABI_FREE(kin12)
     892         [ -  + ]:           2 :  ABI_FREE(kin21)
     893         [ -  + ]:           2 :  ABI_FREE(kin11_k)
     894         [ -  + ]:           2 :  ABI_FREE(kin22_k)
     895         [ -  + ]:           2 :  ABI_FREE(kin12_k)
     896         [ -  + ]:           2 :  ABI_FREE(kin21_k)
     897         [ -  + ]:           2 :  ABI_FREE(Stp)
     898         [ -  + ]:           2 :  ABI_FREE(Kth)
     899         [ -  + ]:           2 :  ABI_FREE(cond_nd)
     900         [ -  + ]:           2 :  ABI_FREE(cond_nd_k)
     901         [ -  + ]:           2 :  ABI_FREE(sig_abs)
     902         [ -  + ]:           2 :  ABI_FREE(eigen0)
     903         [ -  + ]:           2 :  ABI_FREE(nband)
     904         [ -  + ]:           2 :  ABI_FREE(oml1)
     905         [ -  + ]:           2 :  ABI_FREE(occ)
     906         [ -  + ]:           2 :  ABI_FREE(doccde)
     907         [ -  + ]:           2 :  ABI_FREE(wtk)
     908                 :           2 :  call hdr%free()
     909                 :           2 :  call destroy_mpi_enreg(mpi_enreg)
     910                 :             : 
     911   [ -  +  -  +  :           4 : end subroutine conducti_paw
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  +  
             -  +  -  + ]
     912                 :             : !!***
     913                 :             : 
     914                 :             : !----------------------------------------------------------------------
     915                 :             : 
     916                 :             : !!****f* m_conducti/conducti_paw_core
     917                 :             : !! NAME
     918                 :             : !! conducti_paw_core
     919                 :             : !!
     920                 :             : !! FUNCTION
     921                 :             : !! This program computes the elements of the optical frequency dependent
     922                 :             : !! conductivity tensor and the conductivity along the three principal axes
     923                 :             : !! from the Kubo-Greenwood formula for PAW formalism
     924                 :             : !!
     925                 :             : !! INPUTS
     926                 :             : !!  filnam=generic name for input data
     927                 :             : !!  filnam_out=generic name for output data
     928                 :             : !!  [with_absorption]=optiona lflag to activate the computation of absorption (_sigX file) (default=TRUE)
     929                 :             : !!  [with_emissivity]=optiona lflag to activate the computation of emissivity (_emisX file) (default=FALSE)
     930                 :             : !!
     931                 :             : !! OUTPUT
     932                 :             : !!  Only printing
     933                 :             : !!
     934                 :             : !! NOTES
     935                 :             : !!  bantot
     936                 :             : !!  dom=frequency range
     937                 :             : !!  eigen0(mband*nkpt_rbz*nsppol)=GS eigenvalues at k (hartree).
     938                 :             : !!  ecut=kinetic energy planewave cutoff (hartree).
     939                 :             : !!  fermie= fermi energy (Hartree)
     940                 :             : !!  mom=number of frequency for conductivity computation
     941                 :             : !!  mband=maximum number of bands.
     942                 :             : !!  natom = number of atoms in the unit cell.
     943                 :             : !!  nband(nkpt*nsppol)=number of bands at each RF k point for each spin.
     944                 :             : !!  nkpt=number of k points in the IBZ for this perturbation
     945                 :             : !!  ngfft(3)=integer fft box dimensions.
     946                 :             : !!  nspinor=number of spinorial components of the wavefunctions.
     947                 :             : !!  nsppol=1 for unpolarized, 2 for spin-polarized.
     948                 :             : !!  ntypat = number of atom types.
     949                 :             : !!  occ(mband*nkpt*nsppol)=occupation number for each band and k.
     950                 :             : !!  occopt==option for occupancies
     951                 :             : !!  psinablapsi2(2,3,mband,nphicor,natom)Matrix elements = <Phi_core|Nabla|Phi_i>
     952                 :             : !!  rmet(3,3)=real space metric ($\textrm{bohr}^{2}$).sigx(mom,nphicor))
     953                 :             : !!  rprimd(3,3)=real space primitive translations.
     954                 :             : !!  of primitive translations.
     955                 :             : !!  ucvol=unit cell volume in ($\textrm{bohr}^{3}$).
     956                 :             : !!  wind=frequency window for computations of sigma
     957                 :             : !!  wtk(nkpt)=weight assigned to each k point.
     958                 :             : !!
     959                 :             : !! SOURCE
     960                 :             : 
     961                 :           3 :  subroutine conducti_paw_core(filnam,filnam_out,with_absorption,with_emissivity)
     962                 :             : 
     963                 :             : !Arguments -----------------------------------
     964                 :             : !scalars
     965                 :             :  character(len=fnlen),intent(in) :: filnam,filnam_out
     966                 :             :  logical,intent(in),optional :: with_absorption,with_emissivity
     967                 :             : !Local variables-------------------------------
     968                 :             : !scalars
     969                 :             :  integer,parameter :: master=0
     970                 :             :  integer :: iomode,atnbr,bantot,bdtot_index,comm,my_iband,input_atm,itask,num_tasks_max,au_units
     971                 :             :  integer :: fform2,headform,iatom,iband,icor,ierr,ikpt,iatom_atnbr,itypat,itypat_atnbr
     972                 :             :  integer :: iom,isppol,l1,mband,me,mom,mpierr,j2,etiq,pnp_size,iproc,broad_mode,absx_unt
     973                 :             :  integer :: natom,nband_k,nkpt,nphicor,nproc,nspinor,nsppol,ntypat,nphicor_max,natom_atnbr
     974                 :             :  integer :: occopt,iunt,opt2_unt,ncid,varid,master_band,nb_per_proc,idum
     975                 :             :  integer :: sigx1_unt,sigx1_up_unt,sigx1_dn_unt,ems_unt,ems_up_unt,ems_dn_unt
     976                 :             :  logical :: iomode_estf_mpiio,myband,mykpt,need_absorption,need_emissivity
     977                 :             :  real(dp) :: del_sig,del_emis,deltae,diff_occ,ecut,fermie
     978                 :             :  real(dp) :: omin,omax,omin_sig,omax_sig,omin_emis,omax_emis
     979                 :             :  real(dp) :: oml,dom,dom_ctr,dom_max,dom_tan1,dom_tan2,docc_deig
     980                 :             :  real(dp) :: Tatm,tsmear,ucvol,dirac,diff_eig
     981                 :             :  character(len=fnlen) :: filnam2,filnam_gen
     982                 :             :  character(len=500) :: msg
     983                 :             :  character(len=100) :: line
     984                 :             :  character(len=20) :: str_atm
     985                 :           3 :  type(hdr_type) :: hdr
     986                 :           3 :  type(MPI_type) :: mpi_enreg
     987                 :             : !arrays
     988                 :             :  integer :: nc_count(6),nc_start(6),nc_stride(6)
     989                 :           3 :  integer,allocatable :: nband(:),ncor(:,:),lcor(:,:),kappacor(:,:),typat(:),num_tasks(:)
     990                 :             :  real(dp) :: gmet(3,3),gprimd(3,3),rmet(3,3),rprimd(3,3),dummy(0,0,0,0,0)
     991                 :           3 :  real(dp),allocatable :: dom_var1(:,:),dhdk2_g(:)
     992                 :           3 :  real(dp),allocatable :: eig0_k(:),eigen0(:),eig0nc(:,:,:)
     993                 :           3 :  real(dp),allocatable :: energy_cor(:,:),edge(:),nphicor_arr(:),occ_cor(:,:),maxocc_cor(:,:)
     994                 :           3 :  real(dp),allocatable :: occ(:),occ_k(:),wtk(:)
     995                 :           3 :  real(dp),allocatable :: oml_edge(:,:),oml_emis(:,:)
     996                 :           3 :  real(dp),allocatable :: psinablapsi2(:,:,:,:)
     997                 :           3 :  real(dp),allocatable :: sigx1(:,:,:,:),sigx1_av(:,:,:),sigx1_k(:,:,:)
     998                 :           3 :  real(dp),allocatable :: sum_spin_sigx1(:,:,:),sum_spin_sigx1_av(:,:)
     999                 :           3 :  real(dp),allocatable :: emisx(:,:,:,:),emisx_av(:,:,:),emisx_k(:,:,:)
    1000                 :           3 :  real(dp),allocatable :: sum_spin_emisx(:,:,:),sum_spin_emisx_av(:,:)
    1001                 :             : 
    1002                 :             : ! *********************************************************************************
    1003                 :             : !optional flags
    1004         [ +  - ]:           3 :  need_absorption=.true. ;if (present(with_absorption)) need_absorption=with_absorption
    1005         [ +  + ]:           3 :  need_emissivity=.false.;if (present(with_emissivity)) need_emissivity=with_emissivity
    1006         [ +  - ]:           3 :  if ((.not.need_absorption).and.(.not.need_emissivity)) return
    1007                 :             : 
    1008                 :             : ! ---------------------------------------------------------------------------------
    1009                 :             : ! Read input data
    1010                 :             : 
    1011                 :             : !Global MPI communicators
    1012                 :           3 :  comm = xmpi_world
    1013                 :           3 :  nproc = xmpi_comm_size(comm)
    1014                 :           3 :  me = xmpi_comm_rank(comm)
    1015                 :             : 
    1016                 :             : !Read input parameters file
    1017         [ +  - ]:           3 :  if (me==master) then
    1018         [ -  + ]:           3 :    if (open_file(filnam,msg,newunit=iunt,form='formatted',action="read",status="old")/=0) then
    1019                 :           0 :      ABI_ERROR(msg)
    1020                 :             :    end if
    1021                 :           3 :    rewind(iunt)
    1022                 :           3 :    read(iunt,*)
    1023                 :           3 :    read(iunt,'(a)')filnam_gen ! Generic name for the files
    1024         [ +  - ]:           3 :    filnam2=trim(filnam_gen)//'_OPT2'
    1025                 :             : !  Read frequency range
    1026         [ +  - ]:           3 :    if (need_absorption) then
    1027                 :           3 :      read(iunt,fmt='(a)') line
    1028         [ +  + ]:           3 :      read(line,end=11,fmt=*) dom,omin,omax,mom,input_atm,dom_max,dom_ctr
    1029                 :           2 :      goto 12
    1030                 :           1 : 11   read(line,fmt=*) dom,omin,omax,mom,input_atm ; dom_max=zero ; dom_ctr=zero
    1031                 :             : 12   continue
    1032         [ #  # ]:           0 :    else if (need_emissivity) then
    1033                 :           0 :      read(iunt,*) dom,omin,omax,mom,input_atm
    1034                 :           0 :      dom_max=zero;dom_ctr=zero
    1035                 :             :    end if
    1036         [ +  + ]:           3 :    read(iunt,end=13,err=13,fmt=*) broad_mode,au_units
    1037                 :           1 :    goto 14
    1038                 :           2 : 13 broad_mode=1 ; au_units=0
    1039                 :             : 14 continue
    1040                 :           3 :    close(iunt)
    1041   [ +  +  -  + ]:           3 :    if (abs(dom_max)>tol10.and.dom_max<dom) then
    1042                 :           0 :      msg = 'dom_max must be higher than dom!'
    1043                 :           0 :      ABI_ERROR(msg)
    1044                 :             :    end if
    1045                 :             :  end if
    1046                 :             : 
    1047                 :             : !Send data to all procs
    1048                 :           3 :  call xmpi_bcast(dom,master,comm,mpierr)
    1049                 :           3 :  call xmpi_bcast(omin,master,comm,mpierr)
    1050                 :           3 :  call xmpi_bcast(omax,master,comm,mpierr)
    1051                 :           3 :  call xmpi_bcast(mom,master,comm,mpierr)
    1052                 :           3 :  call xmpi_bcast(input_atm,master,comm,mpierr)
    1053                 :           3 :  call xmpi_bcast(dom_max,master,comm,mpierr)
    1054                 :           3 :  call xmpi_bcast(dom_ctr,master,comm,mpierr)
    1055                 :           3 :  call xmpi_bcast(broad_mode,master,comm,mpierr)
    1056                 :           3 :  call xmpi_bcast(au_units,master,comm,mpierr)
    1057                 :             : 
    1058                 :             : 
    1059                 :             : ! ---------------------------------------------------------------------------------
    1060                 :             : ! Read OPT2 file
    1061                 :             : 
    1062                 :             : !Check for FORTRAN/.nc OPT2 file and set iomode to IO_MODE_FORTRAN_MASTER/IO_MODE_ETSF
    1063         [ +  - ]:           3 :  if (me==master) then
    1064                 :           3 :    call nctk_fort_or_ncfile(filnam2,iomode,msg)
    1065         [ -  + ]:           3 :    if (iomode/=IO_MODE_ETSF) iomode=IO_MODE_FORTRAN_MASTER
    1066                 :             :  end if
    1067                 :           3 :  call xmpi_bcast(filnam2,master,comm,mpierr)
    1068                 :           3 :  call xmpi_bcast(iomode,master,comm,mpierr)
    1069                 :             : 
    1070                 :             : !Open OPT2 file and read HEADER
    1071         [ +  - ]:           3 :  if (me==master) then
    1072         [ +  - ]:           3 :    if (iomode==IO_MODE_ETSF) then
    1073         [ -  + ]:           3 :      NCF_CHECK(nctk_open_read(ncid,filnam2,xmpi_comm_self))
    1074                 :           3 :      call hdr%ncread(ncid,fform2)
    1075                 :             :    else
    1076         [ #  # ]:           0 :      if (open_file(filnam2,msg,newunit=opt2_unt,form="unformatted",status="old")/=0) then
    1077                 :           0 :        ABI_ERROR(msg)
    1078                 :             :      end if
    1079                 :           0 :      call hdr%fort_read(opt2_unt,fform2,rewind=.true.)
    1080                 :             :    end if
    1081         [ -  + ]:           3 :    ABI_CHECK(fform2/=0,sjoin("Error while reading ",filnam2))
    1082         [ -  + ]:           3 :    ABI_CHECK(fform2==611.or.fform2==612.or.fform2==613,"OPT2 file format should be fform=611/612/613!")
    1083                 :             :  end if
    1084                 :           3 :  call hdr%bcast(master,me,comm)
    1085                 :           3 :  call xmpi_bcast(fform2,master,comm,mpierr)
    1086                 :             : 
    1087                 :             : !Extract info from the header
    1088                 :           3 :  headform=hdr%headform
    1089                 :           3 :  bantot=hdr%bantot
    1090                 :           3 :  ecut=hdr%ecut_eff
    1091                 :           3 :  natom=hdr%natom
    1092                 :           3 :  nkpt=hdr%nkpt
    1093                 :           3 :  nspinor=hdr%nspinor
    1094                 :           3 :  nsppol=hdr%nsppol
    1095                 :           3 :  ntypat=hdr%ntypat
    1096   [ -  +  +  -  :           9 :  ABI_MALLOC(typat,(natom))
          +  -  +  -  -  
                +  -  + ]
    1097   [ +  -  -  +  :          15 :  typat = hdr%typat
          -  -  -  -  +  
                      + ]
    1098                 :             :  occopt=hdr%occopt
    1099   [ +  +  +  + ]:          39 :  rprimd(:,:)=hdr%rprimd(:,:)
    1100                 :           3 :  fermie=hdr%fermie
    1101                 :           3 :  tsmear=hdr%tsmear
    1102   [ -  +  +  -  :           9 :  ABI_MALLOC(nband,(nkpt*nsppol))
          +  -  +  -  -  
                +  -  + ]
    1103   [ -  +  +  -  :           9 :  ABI_MALLOC(occ,(bantot))
          +  -  +  -  -  
                +  -  + ]
    1104   [ -  +  +  -  :           9 :  ABI_MALLOC(wtk,(nkpt))
          +  -  +  -  -  
                +  -  + ]
    1105         [ +  + ]:          53 :  occ(1:bantot)=hdr%occ(1:bantot)
    1106         [ +  + ]:           6 :  wtk(1:nkpt)=hdr%wtk(1:nkpt)
    1107         [ +  + ]:           6 :  nband(1:nkpt*nsppol)=hdr%nband(1:nkpt*nsppol)
    1108         [ +  + ]:           6 :  mband=maxval(nband(:))  ! Get mband, as the maximum value of nband(nkpt)
    1109                 :           3 :  call metric(gmet,gprimd,-1,rmet,rprimd,ucvol) ! Get metrics of simulation cell
    1110                 :           3 :  itypat_atnbr=typat(input_atm)
    1111                 :           3 :  natom_atnbr=0
    1112         [ +  + ]:          12 :  do iatom=1,natom
    1113         [ +  - ]:           9 :    if(typat(iatom)==itypat_atnbr) natom_atnbr=natom_atnbr+1
    1114         [ +  + ]:          12 :    if(iatom==input_atm) atnbr=natom_atnbr
    1115                 :             :  enddo
    1116                 :             : 
    1117                 :             : !Read eigenvalues
    1118   [ -  +  +  -  :           9 :  ABI_MALLOC(eigen0,(mband*nkpt*nsppol))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
    1119         [ +  - ]:           3 :  if (me==master) then
    1120         [ +  - ]:           3 :    if (iomode==IO_MODE_ETSF) then
    1121                 :           3 :      varid=nctk_idname(ncid,"eigenvalues")
    1122   [ -  +  +  -  :          15 :      ABI_MALLOC(eig0nc,(mband,nkpt,nsppol))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                +  -  + ]
    1123         [ -  + ]:           3 :      NCF_CHECK(nf90_get_var(ncid,varid,eig0nc))
    1124   [ +  +  +  -  :           6 :      eigen0 = reshape(eig0nc,[mband*nkpt*nsppol])
                   +  - ]
    1125         [ -  + ]:           3 :      ABI_FREE(eig0nc)
    1126                 :             :    else
    1127                 :           0 :      read(opt2_unt)(eigen0(iband),iband=1,mband*nkpt*nsppol)
    1128                 :             :    end if
    1129                 :             :  end if
    1130                 :           3 :  call xmpi_bcast(eigen0,master,comm,mpierr)
    1131                 :             : 
    1132                 :             : !Read core states
    1133         [ +  - ]:           3 :  if (me==master) then
    1134         [ +  - ]:           3 :    if (iomode==IO_MODE_ETSF) then
    1135         [ -  + ]:           3 :      NCF_CHECK(nctk_get_dim(ncid,"max_number_of_core_states",nphicor_max))
    1136                 :             :    else
    1137                 :           0 :      read(opt2_unt) nphicor_max
    1138                 :             :    end if
    1139                 :             :   end if
    1140                 :           3 :  call xmpi_bcast(nphicor_max,master,comm,mpierr)
    1141                 :             : 
    1142   [ -  +  +  -  :          12 :  ABI_MALLOC(ncor,(nphicor_max,ntypat))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
    1143   [ -  +  +  -  :          12 :  ABI_MALLOC(occ_cor,(nphicor_max,ntypat))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
    1144   [ -  +  +  -  :           9 :  ABI_MALLOC(maxocc_cor,(nphicor_max,ntypat))
          -  +  +  -  -  
             +  -  +  -  
                      + ]
    1145   [ -  +  +  -  :           9 :  ABI_MALLOC(lcor,(nphicor_max,ntypat))
          -  +  +  -  -  
             +  -  +  -  
                      + ]
    1146   [ -  +  +  -  :           9 :  ABI_MALLOC(kappacor,(nphicor_max,ntypat))
          -  +  +  -  -  
             +  -  +  -  
                      + ]
    1147   [ -  +  +  -  :           9 :  ABI_MALLOC(energy_cor,(nphicor_max,ntypat))
          -  +  +  -  -  
             +  -  +  -  
                      + ]
    1148                 :             : 
    1149         [ +  - ]:           3 :  if (me==master) then
    1150   [ -  +  +  -  :           9 :    ABI_MALLOC(nphicor_arr,(ntypat))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
    1151         [ +  - ]:           3 :    if (iomode==IO_MODE_ETSF) then
    1152                 :           3 :      varid=nctk_idname(ncid,"n_quantum_number_core")
    1153         [ -  + ]:           3 :      NCF_CHECK(nf90_get_var(ncid,varid,ncor))
    1154                 :           3 :      varid=nctk_idname(ncid,"l_quantum_number_core")
    1155         [ -  + ]:           3 :      NCF_CHECK(nf90_get_var(ncid,varid,lcor))
    1156                 :           3 :      varid=nctk_idname(ncid,"kappa_core")
    1157         [ -  + ]:           3 :      NCF_CHECK(nf90_get_var(ncid,varid,kappacor))
    1158                 :           3 :      varid=nctk_idname(ncid,"eigenvalues_core")
    1159         [ -  + ]:           3 :      NCF_CHECK(nf90_get_var(ncid,varid,energy_cor))
    1160                 :           3 :      varid=nctk_idname(ncid,"occupation_core")
    1161         [ -  + ]:           3 :      NCF_CHECK(nf90_get_var(ncid,varid,occ_cor))
    1162                 :           3 :      varid=nctk_idname(ncid,"max_occupation_core")
    1163         [ -  + ]:           3 :      NCF_CHECK(nf90_get_var(ncid,varid,maxocc_cor))
    1164                 :           3 :      varid=nctk_idname(ncid,"number_of_core_states")
    1165         [ -  + ]:           3 :      NCF_CHECK(nf90_get_var(ncid,varid,nphicor_arr))
    1166                 :             : !Close here netcdf file here because the rest has to be read with collective I/O
    1167         [ -  + ]:           3 :      NCF_CHECK(nf90_close(ncid))
    1168                 :             :    else
    1169         [ #  # ]:           0 :      do itypat=1,ntypat
    1170                 :           0 :        read(unit=opt2_unt) nphicor_arr(itypat)
    1171         [ #  # ]:           0 :        do icor=1,nphicor_max
    1172                 :           0 :          read(unit=opt2_unt,fmt='(a)') line
    1173                 :           0 :          read(line,end=23,fmt=*) ncor(icor,itypat),lcor(icor,itypat),kappacor(icor,itypat),occ_cor(icor,itypat),maxocc_cor(icor,itypat),&
    1174         [ #  # ]:           0 :           energy_cor(icor,itypat)
    1175                 :           0 :          goto 24
    1176                 :           0 : 23       read(line,fmt=*) ncor(icor,itypat),lcor(icor,itypat),energy_cor(icor,itypat)
    1177                 :           0 :          kappacor(icor,itypat)=0
    1178                 :           0 :          occ_cor(icor,itypat)=one
    1179                 :           0 :          maxocc_cor(icor,itypat)=one
    1180                 :           0 : 24       continue
    1181                 :             :        enddo
    1182                 :             :      end do
    1183                 :             :    end if
    1184                 :           3 :    nphicor=nphicor_arr(itypat_atnbr)
    1185                 :           3 :    ABI_FREE(nphicor_arr)
    1186                 :             :  end if ! master
    1187                 :           3 :  call xmpi_bcast(ncor,master,comm,mpierr)
    1188                 :           3 :  call xmpi_bcast(lcor,master,comm,mpierr)
    1189                 :           3 :  call xmpi_bcast(kappacor,master,comm,mpierr)
    1190                 :           3 :  call xmpi_bcast(energy_cor,master,comm,mpierr)
    1191                 :           3 :  call xmpi_bcast(occ_cor,master,comm,mpierr)
    1192                 :           3 :  call xmpi_bcast(maxocc_cor,master,comm,mpierr)
    1193                 :           3 :  call xmpi_bcast(nphicor,master,comm,mpierr)
    1194                 :             : 
    1195   [ -  +  +  -  :           9 :  ABI_MALLOC(edge,(nphicor))
          +  -  +  -  -  
                +  -  + ]
    1196         [ +  + ]:          14 :  edge(1:nphicor)=fermie-energy_cor(1:nphicor,itypat_atnbr)
    1197                 :             : !---------------------------------------------------------------------------------
    1198                 :             : ! Prepare kpt/band parallelization
    1199                 :             : 
    1200                 :           3 :  call init_mpi_enreg(mpi_enreg)
    1201                 :           3 :  mpi_enreg%comm_kpt=comm
    1202                 :           3 :  mpi_enreg%me_kpt=me
    1203                 :           3 :  mpi_enreg%nproc_spkpt=nproc
    1204                 :           3 :  mpi_enreg%paralbd=1
    1205   [ -  +  +  -  :          15 :  ABI_MALLOC(mpi_enreg%proc_distrb,(nkpt,mband,nsppol))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                +  -  + ]
    1206   [ -  +  +  -  :           9 :  ABI_MALLOC(mpi_enreg%my_kpttab,(nkpt))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
    1207                 :           3 :  call distrb2(mband,nb_per_proc,nband,nkpt,nproc,nsppol,mpi_enreg)
    1208                 :           3 :  call initmpi_band(nkpt,mpi_enreg,nband,nkpt,nsppol)
    1209                 :             : !---------------------------------------------------------------------------------
    1210                 :             : !Print some data
    1211                 :           3 :  Tatm=tsmear*Ha_K
    1212         [ +  - ]:           3 :  if (me==master) then
    1213                 :           3 :    write(std_out,*)
    1214                 :           3 :    write(std_out,'(a)')'--------------------------------------------'
    1215                 :           3 :    write(std_out,'(a,i4)') 'selected atom for X ray emission',input_atm
    1216                 :           3 :    write(std_out,'(a)')'--------------------------------------------'
    1217         [ +  - ]:           3 :    if (need_absorption) then
    1218         [ +  + ]:           3 :      if (abs(dom_max)>tol10) then
    1219                 :           1 :        write(std_out,'(a)')'************************ ARCTAN SMEARING'
    1220                 :           1 :        write(std_out,'(a,i8,3f10.5,a)')' npts,omin,omax,width      =',mom,omin,omax,dom,' Ha'
    1221                 :           1 :        write(std_out,'(a,2f10.5,a)')' dom_max,center       =',dom_max,dom_ctr,' Ha'
    1222                 :             :      else
    1223                 :           2 :        write(std_out,'(a)')'************************ FIXED SMEARING'
    1224                 :           2 :        write(std_out,'(a,i8,3f10.5,a)')' npts,omin,omax,width      =',mom,omin,omax,dom,' Ha'
    1225                 :             :      endif
    1226                 :             :    end if
    1227                 :           3 :    write(std_out,*)
    1228                 :           3 :    write(std_out,'(a,3f10.5,a)' )' rprimd(bohr)      =',rprimd(1,1:3)
    1229                 :           3 :    write(std_out,'(a,3f10.5,a)' )'                    ',rprimd(2,1:3)
    1230                 :           3 :    write(std_out,'(a,3f10.5,a)' )'                    ',rprimd(3,1:3)
    1231                 :           3 :    write(std_out,'(a,i8)')       ' natom             =',natom
    1232                 :           3 :    write(std_out,'(a,3i8)')      ' nkpt,mband,nsppol        =',nkpt,mband,nsppol
    1233                 :           3 :    write(std_out, '(a, f10.5,a)' ) ' ecut              =',ecut,' Ha'
    1234                 :           3 :    write(std_out,'(a,f10.5,a,f10.5,a)' )' fermie            =',fermie,' Ha',fermie*Ha_eV,' eV'
    1235                 :           3 :    write(std_out,'(a,f12.5,a,f12.5,a)') ' Temp              =',tsmear,' Ha ',Tatm,' Kelvin'
    1236                 :           3 :    write(std_out,*)
    1237                 :           3 :    write(std_out,*)
    1238                 :           3 :    write(std_out,'(a)')'--------------------------------------------'
    1239                 :           3 :    write(std_out,'(a,i4)') ' Number of core orbitals nc=',nphicor
    1240         [ +  + ]:          14 :    do icor=1,nphicor
    1241         [ +  + ]:          14 :      if (kappacor(icor,itypat_atnbr)==0) then
    1242                 :           3 :        write(std_out,'(a,2i4,5f15.5)') ' n, l, occ, Energy(Ha), Edge(Ha), Energy(eV), Edge(eV): ', &
    1243                 :           3 :          ncor(icor,itypat_atnbr),lcor(icor,itypat_atnbr),occ_cor(icor,itypat_atnbr),&
    1244                 :           3 : &        energy_cor(icor,itypat_atnbr),edge(icor),&
    1245                 :           6 : &        energy_cor(icor,itypat_atnbr)*Ha_eV,edge(icor)*Ha_eV
    1246                 :             :      else
    1247         [ +  + ]:           8 :        if (kappacor(icor,itypat_atnbr)>0) then
    1248                 :           2 :          j2=2*lcor(icor,itypat_atnbr)-1
    1249                 :           2 :          write(std_out,'(a,i4,i4,a,i4,5f15.5)') ' n, j, l, occ, Energy(Ha), Edge(Ha), Energy(eV), Edge(eV): ',&
    1250                 :           2 : &          ncor(icor,itypat_atnbr),j2,' / 2',lcor(icor,itypat_atnbr),occ_cor(icor,itypat_atnbr),&
    1251                 :           2 : &          energy_cor(icor,itypat_atnbr),edge(icor),&
    1252                 :           4 : &          energy_cor(icor,itypat_atnbr)*Ha_eV,edge(icor)*Ha_eV
    1253                 :             :        else
    1254         [ +  + ]:           6 :          if (kappacor(icor,itypat_atnbr)<-1) then
    1255                 :           2 :            j2=2*lcor(icor,itypat_atnbr)+1
    1256                 :           2 :            write(std_out,'(a,i4,i4,a,i4,5f15.5)') ' n, j, l, occ, Energy(Ha), Edge(Ha), Energy(eV), Edge(eV): ',&
    1257                 :           2 : &            ncor(icor,itypat_atnbr),j2,'/2',lcor(icor,itypat_atnbr),occ_cor(icor,itypat_atnbr),&
    1258                 :           2 : &            energy_cor(icor,itypat_atnbr),edge(icor),&
    1259                 :           4 : &            energy_cor(icor,itypat_atnbr)*Ha_eV,edge(icor)*Ha_eV
    1260                 :             :          else
    1261                 :           4 :            write(std_out,'(a,i4,a,i4,5f15.5)') ' n, j, l, occ, Energy(Ha), Edge(Ha), Energy(eV), Edge(eV): ',&
    1262                 :           4 : &            ncor(icor,itypat_atnbr),'   1/2',lcor(icor,itypat_atnbr),occ_cor(icor,itypat_atnbr),&
    1263                 :           4 : &            energy_cor(icor,itypat_atnbr),edge(icor),&
    1264                 :           8 : &            energy_cor(icor,itypat_atnbr)*Ha_eV,edge(icor)*Ha_eV
    1265                 :             :          end if
    1266                 :             :        end if
    1267                 :             :      end if
    1268                 :             :    end do
    1269                 :           3 :    write(std_out,'(a)')'--------------------------------------------'
    1270                 :             :  end if ! master
    1271                 :             : 
    1272                 :             : !---------------------------------------------------------------------------------
    1273                 :             : ! Determine the frequency range and allocate frequency-dependent arrays
    1274         [ +  - ]:           3 :  if (need_absorption) then
    1275   [ -  +  +  -  :          12 :    ABI_MALLOC(oml_edge,(nphicor,mom))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
    1276   [ -  +  +  -  :           9 :    ABI_MALLOC(dom_var1,(nphicor,mom))
          -  +  +  -  -  
                +  -  + ]
    1277                 :           3 :    omax_sig=omax ; omin_sig=omin
    1278                 :           3 :    del_sig=(omax_sig-omin_sig)/(mom-1)
    1279         [ +  + ]:        3003 :    do iom=1,mom
    1280         [ +  + ]:       14003 :      do icor=1,nphicor
    1281                 :       11000 :        oml_edge(icor,iom)=-energy_cor(icor,itypat_atnbr)+ dble(iom-1)*del_sig + omin_sig -one
    1282   [ +  +  +  + ]:       14000 :        if ((oml_edge(icor,iom)<=edge(icor)).or.(abs(dom_max)<=tol10)) then
    1283                 :        8048 :          dom_var1(icor,iom)= dom
    1284                 :             :        else
    1285                 :        2952 :          dom_tan1= (oml_edge(icor,iom)-edge(icor))/dom_ctr
    1286                 :        2952 :          dom_tan2=dom_tan1-one/dom_tan1**2
    1287                 :        2952 :          dom_var1(icor,iom)=dom+dom_max*(half+piinv*datan(dom_tan2))
    1288                 :             :        endif
    1289                 :             :      enddo
    1290                 :             :    enddo
    1291   [ -  +  +  -  :          18 :    ABI_MALLOC(sigx1,(nphicor,mom,natom_atnbr,nsppol))
          -  +  +  -  -  
          +  +  -  -  +  
          +  -  +  -  +  
          -  -  +  -  +  
                   -  + ]
    1292   [ +  +  +  +  :       41015 :    sigx1=zero
             +  +  +  + ]
    1293                 :             :  end if
    1294                 :             : 
    1295         [ +  + ]:           3 :  if (need_emissivity) then
    1296   [ -  +  +  -  :           4 :    ABI_MALLOC(oml_emis,(nphicor,mom))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
    1297   [ +  -  -  +  :          12 :    omin_emis=minval(eigen0)
             -  -  +  + ]
    1298   [ +  -  -  +  :          12 :    omax_emis=maxval(eigen0)
             -  -  +  + ]
    1299                 :           1 :    del_emis=(omax_emis-omin_emis)/(mom-1)
    1300         [ +  + ]:        1001 :    do iom=1,mom
    1301         [ +  + ]:        4001 :      do icor=1,nphicor
    1302                 :        4000 :        oml_emis(icor,iom)=omin_emis+dble(iom-1)*del_emis!-energy_cor(icor,itypat_atnbr)
    1303                 :             :      enddo
    1304                 :             :    end do
    1305   [ -  +  +  -  :           6 :    ABI_MALLOC(emisx,(nphicor,mom,natom_atnbr,nsppol))
          -  +  +  -  -  
          +  +  -  -  +  
          +  -  +  -  +  
          -  -  +  -  +  
                   -  + ]
    1306   [ +  +  +  +  :       16006 :    emisx=zero
             +  +  +  + ]
    1307                 :             :  end if
    1308                 :             : 
    1309                 :             : !---------------------------------------------------------------------------------
    1310                 :             : ! Prepare core-valence dipoles reading
    1311                 :             : 
    1312   [ +  -  -  + ]:           3 :  iomode_estf_mpiio=(iomode==IO_MODE_ETSF.and.nctk_has_mpiio.and.use_netcdf_mpiio)
    1313                 :             : 
    1314                 :             :  !In case of netCDF access to OPT file, prepare collective I/O
    1315         [ -  + ]:           3 :  if (iomode == IO_MODE_ETSF) then
    1316         [ +  - ]:           3 :    if (iomode_estf_mpiio) then
    1317         [ -  + ]:           3 :      NCF_CHECK(nctk_open_read(ncid,filnam2,comm))
    1318                 :           3 :      varid=nctk_idname(ncid,"dipole_core_valence")
    1319         [ +  - ]:           3 :      if (nproc>1) then
    1320         [ #  # ]:           0 :        NCF_CHECK(nctk_set_collective(ncid,varid))
    1321   [ #  #  #  #  :           0 :        ABI_MALLOC(num_tasks,(nproc))
          #  #  #  #  #  
                #  #  # ]
    1322         [ #  # ]:           0 :        do iproc=1,nproc
    1323   [ #  #  #  #  :           0 :          num_tasks(iproc)=count(mpi_enreg%proc_distrb==iproc-1)
             #  #  #  # ]
    1324                 :             :        enddo
    1325         [ #  # ]:           0 :        num_tasks_max=maxval(num_tasks)
    1326                 :             :      end if
    1327         [ #  # ]:           0 :    else if (me==master) then
    1328         [ #  # ]:           0 :      NCF_CHECK(nctk_open_read(ncid,filnam2,xmpi_comm_self))
    1329                 :           0 :      varid=nctk_idname(ncid,"dipole_core_valence")
    1330                 :             :      !if (nctk_has_mpiio.and.(.not.use_netcdf_mpiio)) then
    1331                 :             :      !  NCF_CHECK(nctk_set_collective(ncid,varid))
    1332                 :             :      !end if
    1333                 :             :    end if
    1334                 :             :  end if
    1335                 :             : 
    1336         [ +  - ]:           3 :  if (iomode_estf_mpiio) then
    1337                 :             :    !If MPI-IO, store only elements for one band
    1338   [ -  +  +  -  :          12 :    ABI_MALLOC(psinablapsi2,(3,nphicor_max,natom,1))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
    1339                 :             :  else
    1340                 :             :    !If not, store the elements for all bands
    1341   [ #  #  #  #  :           0 :    ABI_MALLOC(psinablapsi2,(3,nphicor_max,natom,mband))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
    1342                 :             :  end if
    1343         [ +  + ]:          15 :  pnp_size=size(psinablapsi2)
    1344                 :             : !---------------------------------------------------------------------------------
    1345                 :             : ! Compute X absorption coefficient and/or X emissivity
    1346                 :             : 
    1347         [ +  - ]:           3 :  if (need_absorption) then
    1348   [ -  +  +  -  :          15 :    ABI_MALLOC(sigx1_k,(nphicor,mom,natom_atnbr))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                      + ]
    1349                 :             :  end if
    1350         [ +  + ]:           3 :  if (need_emissivity) then
    1351   [ -  +  +  -  :           5 :    ABI_MALLOC(emisx_k,(nphicor,mom,natom_atnbr))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                      + ]
    1352                 :             :  end if
    1353   [ -  +  +  -  :           9 :  ABI_MALLOC(dhdk2_g,(nphicor))
          +  -  +  -  -  
                +  -  + ]
    1354                 :             : 
    1355                 :           3 :  deltae  = zero
    1356                 :             : 
    1357                 :             : !LOOP OVER SPINS/K
    1358                 :           3 :  bdtot_index = 0
    1359                 :           3 :  itask=0
    1360         [ +  + ]:           6 :  do isppol=1,nsppol
    1361         [ +  + ]:           9 :    do ikpt=1,nkpt
    1362                 :           3 :      etiq=ikpt+(isppol-1)*nkpt
    1363                 :           3 :      nband_k=nband(ikpt+(isppol-1)*nkpt)
    1364                 :           3 :      mykpt=.not.(proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,1,nband_k,isppol,me))
    1365         [ +  + ]:          53 :      master_band=minval(mpi_enreg%proc_distrb(ikpt,1:nband_k,isppol))
    1366                 :             : !    In case of non MPI-IO, has to read all (n,m) dipoles for this k-point
    1367                 :             : !      Master node reads and send to relevant processor
    1368   [ -  +  -  - ]:           3 :      if (.not.iomode_estf_mpiio.and.me==master) then
    1369         [ #  # ]:           0 :        if (iomode==IO_MODE_ETSF) then
    1370         [ #  # ]:           0 :          nc_start=[1,1,1,1,ikpt,isppol];nc_stride=[1,1,1,1,1,1]
    1371         [ #  # ]:           0 :          nc_count=[3,nphicor_max,natom,mband,1,1]
    1372         [ #  # ]:           0 :          NCF_CHECK(nf90_get_var(ncid,varid,psinablapsi2,start=nc_start,stride=nc_stride,count=nc_count))
    1373                 :             :        else
    1374   [ #  #  #  #  :           0 :          psinablapsi2=zero
             #  #  #  # ]
    1375         [ #  # ]:           0 :          if (fform2==612) then ! New OPT2 file format
    1376                 :           0 :            read(opt2_unt) (((psinablapsi2(1,icor,iatom,iband),icor=1,nphicor_max),iatom=1,natom),iband=1,nband_k)
    1377                 :           0 :            read(opt2_unt) (((psinablapsi2(2,icor,iatom,iband),icor=1,nphicor_max),iatom=1,natom),iband=1,nband_k)
    1378                 :           0 :            read(opt2_unt) (((psinablapsi2(3,icor,iatom,iband),icor=1,nphicor_max),iatom=1,natom),iband=1,nband_k)
    1379         [ #  # ]:           0 :          else if (fform2==613) then ! Large OPT2 file format
    1380         [ #  # ]:           0 :            do iband=1,nband_k
    1381                 :           0 :              read(opt2_unt) ((psinablapsi2(1,icor,iatom,iband),icor=1,nphicor_max),iatom=1,natom)
    1382                 :           0 :              read(opt2_unt) ((psinablapsi2(2,icor,iatom,iband),icor=1,nphicor_max),iatom=1,natom)
    1383                 :           0 :              read(opt2_unt) ((psinablapsi2(3,icor,iatom,iband),icor=1,nphicor_max),iatom=1,natom)
    1384                 :             :            end do
    1385                 :             :          else
    1386                 :             :            !The old writing was not efficient (indexes order is bad)
    1387         [ #  # ]:           0 :            do iatom=1,natom
    1388   [ #  #  #  # ]:           0 :              read(opt2_unt) ((psinablapsi2(1,icor,iatom,iband),iband=1,nband_k),icor=1,nphicor_max)
    1389   [ #  #  #  # ]:           0 :              read(opt2_unt) ((psinablapsi2(2,icor,iatom,iband),iband=1,nband_k),icor=1,nphicor_max)
    1390   [ #  #  #  # ]:           0 :              read(opt2_unt) ((psinablapsi2(3,icor,iatom,iband),iband=1,nband_k),icor=1,nphicor_max)
    1391                 :             :            end do
    1392                 :             :          end if
    1393                 :             :        end if
    1394         [ #  # ]:           0 :        if (.not.mykpt) then
    1395                 :           0 :          call xmpi_exch(psinablapsi2,pnp_size,master,psinablapsi2,master_band,comm,etiq,ierr)
    1396                 :             :        end if
    1397                 :             :      end if
    1398                 :             : !!    Select k-points for current proc
    1399         [ +  - ]:           3 :      if (mykpt) then
    1400                 :             : 
    1401   [ -  +  +  -  :           9 :        ABI_MALLOC(eig0_k,(nband_k))
          +  -  +  -  -  
                +  -  + ]
    1402   [ -  +  +  -  :           6 :        ABI_MALLOC(occ_k,(nband_k))
             -  +  -  + ]
    1403                 :             : 
    1404   [ +  -  +  +  :       41012 :        if (need_absorption) sigx1_k=zero
             +  +  +  + ]
    1405   [ +  +  +  +  :       16007 :        if (need_emissivity) emisx_k=zero
             +  +  +  + ]
    1406                 :             : 
    1407                 :             : !      k-dependent data
    1408         [ +  + ]:          53 :        eig0_k(:)=eigen0(1+bdtot_index:nband_k+bdtot_index)
    1409         [ +  + ]:          53 :        occ_k(:)=occ(1+bdtot_index:nband_k+bdtot_index)
    1410                 :             : 
    1411                 :             : !      In case of non MPI-IO, receive all (n,m) dipoles from master proc
    1412                 :             : !        Then broadcast them to all band processors
    1413         [ -  + ]:           3 :        if (.not.iomode_estf_mpiio) then
    1414   [ #  #  #  # ]:           0 :          if (me/=master.and.me==master_band) then
    1415                 :           0 :            call xmpi_exch(psinablapsi2,pnp_size,master,psinablapsi2,me,comm,etiq,ierr)
    1416                 :             :          end if
    1417                 :           0 :          call xmpi_bcast(psinablapsi2,master,mpi_enreg%comm_band,mpierr)
    1418                 :             :        end if
    1419                 :             : 
    1420                 :             : !      LOOP OVER BANDS
    1421                 :             : 
    1422         [ +  + ]:          53 :        do iband=1,nband_k
    1423                 :             : 
    1424                 :             :          !If MPI-IO, store only ib elements for each iband
    1425                 :             :          !If not, store all elements
    1426         [ -  + ]:          50 :          my_iband=merge(1,iband,iomode_estf_mpiio)
    1427         [ +  + ]:         240 :          dhdk2_g   = zero
    1428                 :             : 
    1429                 :             : !        Select bands for current proc
    1430                 :          50 :          myband=(mpi_enreg%proc_distrb(ikpt,iband,isppol)==me)
    1431         [ +  - ]:          53 :          if (myband) then
    1432                 :             : 
    1433                 :             : !          In case of MPI-IO, read core-valence dipoles for band n
    1434         [ +  - ]:          50 :            if (iomode_estf_mpiio) then
    1435                 :          50 :              itask=itask+1
    1436         [ +  + ]:         350 :              nc_start=[1,1,1,iband,ikpt,isppol];nc_stride=[1,1,1,1,1,1]
    1437         [ +  + ]:         350 :              nc_count=[3,nphicor_max,natom,1,1,1]
    1438         [ -  + ]:          50 :              NCF_CHECK(nf90_get_var(ncid,varid,psinablapsi2,start=nc_start,stride=nc_stride,count=nc_count))
    1439                 :             :            end if
    1440                 :             : 
    1441                 :             : !          LOOP OVER ATOMS
    1442                 :          50 :            iatom_atnbr=0
    1443         [ +  + ]:         190 :            do iatom=1,natom
    1444         [ +  - ]:         190 :              if(typat(iatom)==itypat_atnbr) then
    1445                 :         140 :                iatom_atnbr=iatom_atnbr+1
    1446         [ +  + ]:         660 :                dhdk2_g = zero
    1447         [ +  + ]:         660 :                do icor=1,nphicor
    1448         [ +  + ]:        2220 :                  do l1=1,3
    1449                 :        2080 :                    dhdk2_g(icor)=dhdk2_g(icor)+psinablapsi2(l1,icor,iatom,my_iband)*third
    1450                 :             :                  end do
    1451                 :             :                end do
    1452         [ +  + ]:      140140 :                do iom=1,mom
    1453         [ +  + ]:      660140 :                  do icor=1,nphicor
    1454                 :      520000 :                    diff_occ =occ_cor(icor,itypat_atnbr)/maxocc_cor(icor,itypat_atnbr)-occ_k(iband)/two*nsppol*nspinor
    1455                 :      520000 :                    diff_occ = diff_occ*two/nspinor/nsppol
    1456                 :      520000 :                    diff_eig=eig0_k(iband)-energy_cor(icor,itypat_atnbr)
    1457                 :      520000 :                    oml=oml_edge(icor,iom)
    1458         [ +  - ]:      520000 :                    if(need_absorption) then
    1459                 :      520000 :                      docc_deig=abs(diff_occ/oml)
    1460         [ +  - ]:      520000 :                      if(broad_mode==1) then
    1461                 :      520000 :                        dirac=dom_var1(icor,iom)/((diff_eig-oml)**2+(dom_var1(icor,iom))**2)/pi
    1462                 :             :                      else
    1463                 :           0 :                        dirac=dexp(-((diff_eig-oml)/(sqrt(two)*dom))**2)/(dom*dsqrt(two*pi))
    1464                 :             :                      endif
    1465         [ -  + ]:      520000 :                      if(dirac<1d-20) dirac=zero
    1466                 :      520000 :                      sigx1_k(icor,iom,iatom_atnbr)=sigx1_k(icor,iom,iatom_atnbr)+dhdk2_g(icor)*docc_deig*dirac*pi/ucvol
    1467                 :             :                    endif
    1468         [ +  + ]:      660000 :                    if (need_emissivity) then
    1469                 :      120000 :                      docc_deig=abs(occ_k(iband)/oml)
    1470         [ +  - ]:      120000 :                      if(broad_mode==1) then
    1471                 :      120000 :                        dirac=dom/((diff_eig-oml)**2+dom**2)/pi
    1472                 :             :                      else
    1473                 :           0 :                        dirac=dexp(-((diff_eig-oml)/(dom*sqrt(two)))**2)/(dom*dsqrt(two*pi))
    1474                 :             :                      endif
    1475         [ -  + ]:      120000 :                      if(dirac<1d-20) dirac=zero
    1476                 :      120000 :                      emisx_k(icor,iom,iatom_atnbr)=emisx_k(icor,iom,iatom_atnbr)+dhdk2_g(icor)*docc_deig*dirac*pi/ucvol
    1477                 :             :                    endif
    1478                 :             :                 end do
    1479                 :             :                end do
    1480                 :             :              endif
    1481                 :             :            end do ! iatom
    1482                 :             :          end if ! my band?
    1483                 :             :        end do ! iband
    1484                 :             : 
    1485                 :             : !      Accumulate k-point contribution
    1486         [ +  - ]:           3 :        if (need_absorption) then
    1487                 :             :          sigx1(1:nphicor,1:mom,1:natom_atnbr,isppol)=sigx1(1:nphicor,1:mom,1:natom_atnbr,isppol) &
    1488   [ +  +  +  +  :       41012 : &                                              +wtk(ikpt)*sigx1_k(1:nphicor,1:mom,1:natom_atnbr)
                   +  + ]
    1489                 :             :        end if
    1490         [ +  + ]:           3 :        if (need_emissivity) then
    1491                 :             :          emisx(1:nphicor,1:mom,1:natom_atnbr,isppol)=emisx(1:nphicor,1:mom,1:natom_atnbr,isppol) &
    1492   [ +  +  +  +  :       16005 : &                                              +wtk(ikpt)*emisx_k(1:nphicor,1:mom,1:natom_atnbr)
                   +  + ]
    1493                 :             :        end if
    1494                 :             : 
    1495                 :             : !      Validity limit
    1496                 :           3 :        deltae=deltae+eig0_k(nband_k)
    1497                 :             : 
    1498                 :           3 :        ABI_FREE(eig0_k)
    1499         [ -  + ]:           3 :        ABI_FREE(occ_k)
    1500                 :             : !    End loop over kpt/spin
    1501                 :             :      end if ! My kpt?
    1502                 :           6 :      bdtot_index=bdtot_index+nband_k
    1503                 :             :    end do ! ikpt
    1504                 :             :  end do ! isppol
    1505                 :             : 
    1506         [ +  - ]:           3 :  if (iomode == IO_MODE_ETSF) then
    1507   [ +  -  -  + ]:           3 :    if(iomode_estf_mpiio.and.nproc>1) then
    1508         [ #  # ]:           0 :      do idum=num_tasks(me+1)+1,num_tasks_max
    1509                 :           0 :        nc_start=[1,1,1,1,1,1];nc_stride=[1,1,1,1,1,1]
    1510                 :           0 :        nc_count=[0,0,0,0,0,0]
    1511         [ #  # ]:           0 :        NCF_CHECK(nf90_get_var(ncid,varid,dummy,start=nc_start,stride=nc_stride,count=nc_count))
    1512                 :             :      enddo
    1513                 :           0 :      ABI_FREE(num_tasks)
    1514                 :             :    endif
    1515                 :             :  endif
    1516                 :             : 
    1517                 :             : !Accumulate kpt/band contributions over processors
    1518         [ +  - ]:           3 :  if (need_absorption) then
    1519                 :           3 :    call xmpi_sum(sigx1,comm,mpierr)
    1520                 :             :  end if
    1521         [ +  + ]:           3 :  if (need_emissivity) then
    1522                 :           1 :    call xmpi_sum(emisx,comm,mpierr)
    1523                 :             :  end if
    1524                 :           3 :  call xmpi_sum(deltae,comm,mpierr)
    1525                 :           3 :  deltae=deltae/mpi_enreg%nproc_band
    1526                 :             : 
    1527                 :             : 
    1528                 :             : !Release some memory
    1529         [ -  + ]:           3 :  ABI_FREE(dhdk2_g)
    1530         [ -  + ]:           3 :  ABI_FREE(psinablapsi2)
    1531         [ +  - ]:           3 :  if (need_absorption) then
    1532         [ -  + ]:           3 :    ABI_FREE(sigx1_k)
    1533                 :             :  end if
    1534         [ +  + ]:           3 :  if (need_emissivity) then
    1535         [ -  + ]:           1 :    ABI_FREE(emisx_k)
    1536                 :             :  end if
    1537                 :             : 
    1538                 :             :  !Close core-valence dipoles file
    1539         [ +  - ]:           3 :  if (iomode == IO_MODE_ETSF) then
    1540   [ -  +  -  - ]:           3 :    if (iomode_estf_mpiio.or.me==master) then
    1541         [ -  + ]:           3 :      NCF_CHECK(nf90_close(ncid))
    1542                 :             :    end if
    1543         [ #  # ]:           0 :  else if (me==master) then
    1544                 :           0 :    ierr=close_unit(opt2_unt,msg)
    1545         [ #  # ]:           0 :    ABI_CHECK(ierr==0,sjoin("Error while closing ",filnam2))
    1546                 :             :  end if
    1547                 :             : 
    1548                 :             : !---------------------------------------------------------------------------------
    1549                 :             : ! Post-processing
    1550                 :             : 
    1551         [ +  - ]:           3 :  if (need_absorption) then
    1552   [ +  +  +  +  :       41015 :    sigx1=sigx1*dble(natom_atnbr)
             +  +  +  + ]
    1553   [ -  +  +  -  :          15 :    ABI_MALLOC(sigx1_av,(nphicor,mom,nsppol))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                      + ]
    1554   [ +  +  +  +  :       14006 :    sigx1_av=zero
                   +  + ]
    1555                 :             :  endif
    1556         [ +  + ]:           3 :  if (need_emissivity) then
    1557                 :             :    ! Filter low values
    1558         [ +  + ]:           2 :    do isppol=1,nsppol
    1559         [ +  + ]:           6 :      do iatom_atnbr=1,natom_atnbr
    1560         [ +  + ]:        4005 :        do iom=1,mom
    1561         [ +  + ]:       16004 :          do icor=1,nphicor
    1562         [ -  + ]:       16000 :            if (emisx(icor,iom,iatom_atnbr,isppol)<=tol16) emisx(icor,iom,iatom_atnbr,isppol)=zero
    1563                 :             :          end do
    1564                 :             :        end do
    1565                 :             :      end do
    1566                 :             :    end do
    1567   [ +  +  +  +  :       16006 :    emisx=emisx*dble(natom_atnbr)
             +  +  +  + ]
    1568   [ -  +  +  -  :           5 :    ABI_MALLOC(emisx_av,(nphicor,mom,nsppol))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                      + ]
    1569   [ +  +  +  +  :        4002 :    emisx_av=zero
                   +  + ]
    1570                 :             :  endif
    1571                 :             : 
    1572         [ +  + ]:           6 :  do isppol=1,nsppol
    1573         [ +  + ]:          15 :    do iatom_atnbr=1,natom_atnbr
    1574         [ +  + ]:        9012 :      do iom=1,mom
    1575         [ +  + ]:       41009 :        do icor=1,nphicor
    1576         [ +  - ]:       32000 :          if(need_absorption) sigx1_av(icor,iom,isppol)=sigx1_av(icor,iom,isppol)+sigx1(icor,iom,iatom_atnbr,isppol)/dble(natom_atnbr)
    1577         [ +  + ]:       41000 :          if(need_emissivity) emisx_av(icor,iom,isppol)=emisx_av(icor,iom,isppol)+emisx(icor,iom,iatom_atnbr,isppol)/dble(natom_atnbr)
    1578                 :             :        end do
    1579                 :             :      end do
    1580                 :             :    end do
    1581                 :             :  end do
    1582                 :             : 
    1583                 :             : !  Spin treatment
    1584         [ -  + ]:           3 :  if(nsppol==2) then
    1585         [ #  # ]:           0 :    if(need_absorption) then
    1586   [ #  #  #  #  :           0 :      ABI_MALLOC(sum_spin_sigx1,(nphicor,mom,natom_atnbr))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
    1587   [ #  #  #  #  :           0 :      ABI_MALLOC(sum_spin_sigx1_av,(nphicor,mom))
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
    1588   [ #  #  #  #  :           0 :      sum_spin_sigx1=zero ; sum_spin_sigx1_av=zero
          #  #  #  #  #  
                      # ]
    1589                 :             :    endif
    1590         [ #  # ]:           0 :    if(need_emissivity) then
    1591   [ #  #  #  #  :           0 :      ABI_MALLOC(sum_spin_emisx,(nphicor,mom,natom_atnbr))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
    1592   [ #  #  #  #  :           0 :      ABI_MALLOC(sum_spin_emisx_av,(nphicor,mom))
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
    1593   [ #  #  #  #  :           0 :      sum_spin_emisx=zero ; sum_spin_emisx_av=zero
          #  #  #  #  #  
                      # ]
    1594                 :             :    endif
    1595         [ #  # ]:           0 :    do isppol=1,nsppol
    1596         [ #  # ]:           0 :      do iatom_atnbr=1,natom_atnbr
    1597         [ #  # ]:           0 :        do iom=1,mom
    1598         [ #  # ]:           0 :          do icor=1,nphicor
    1599         [ #  # ]:           0 :            if(need_absorption) sum_spin_sigx1(icor,iom,iatom_atnbr)=sum_spin_sigx1(icor,iom,iatom_atnbr) &
    1600                 :           0 : & +sigx1(icor,iom,iatom_atnbr,isppol)/dble(natom_atnbr)
    1601         [ #  # ]:           0 :            if(need_emissivity) sum_spin_emisx(icor,iom,iatom_atnbr)=sum_spin_emisx(icor,iom,iatom_atnbr) &
    1602                 :           0 : & +emisx(icor,iom,iatom_atnbr,isppol)/dble(natom_atnbr)
    1603                 :             :          end do
    1604                 :             :        end do
    1605                 :             :      end do
    1606                 :             :    end do
    1607         [ #  # ]:           0 :    do isppol=1,nsppol
    1608         [ #  # ]:           0 :      do iom=1,mom
    1609         [ #  # ]:           0 :        do icor=1,nphicor
    1610         [ #  # ]:           0 :          if(need_absorption) sum_spin_sigx1_av(icor,iom)=sum_spin_sigx1_av(icor,iom)+sigx1_av(icor,iom,isppol)
    1611         [ #  # ]:           0 :          if(need_emissivity) sum_spin_emisx_av(icor,iom)=sum_spin_emisx_av(icor,iom)+emisx_av(icor,iom,isppol)
    1612                 :             :        end do
    1613                 :             :      end do
    1614                 :             :    end do
    1615                 :             :  endif
    1616                 :             : 
    1617                 :             :  ! Units
    1618         [ +  - ]:           3 :  if(au_units==0) then
    1619   [ +  +  +  + ]:       14003 :    oml_edge=oml_edge*Ha_eV
    1620         [ +  - ]:           3 :    if(need_absorption) then
    1621   [ +  +  +  +  :       14006 :      sigx1_av=sigx1_av*Ohmcm
                   +  + ]
    1622   [ +  +  +  +  :       41015 :      sigx1=sigx1*Ohmcm
             +  +  +  + ]
    1623         [ -  + ]:           3 :      if(nsppol==2) then
    1624   [ #  #  #  # ]:           0 :        sum_spin_sigx1_av=sum_spin_sigx1_av*Ohmcm
    1625   [ #  #  #  #  :           0 :        sum_spin_sigx1=sum_spin_sigx1*Ohmcm
                   #  # ]
    1626                 :             :      endif
    1627                 :             :    endif
    1628         [ +  + ]:           3 :    if(need_emissivity) then
    1629   [ +  +  +  +  :        4002 :      emisx_av=emisx_av*Ohmcm
                   +  + ]
    1630   [ +  +  +  +  :       16006 :      emisx=emisx*Ohmcm
             +  +  +  + ]
    1631         [ -  + ]:           1 :      if(nsppol==2) then
    1632   [ #  #  #  # ]:           0 :        sum_spin_emisx_av=sum_spin_emisx_av*Ohmcm
    1633   [ #  #  #  #  :           0 :        sum_spin_emisx=sum_spin_emisx*Ohmcm
                   #  # ]
    1634                 :             :      endif
    1635                 :             :    endif
    1636                 :             :  endif
    1637                 :             : 
    1638                 :             : !---------------------------------------------------------------------------------
    1639                 :             : ! Output results
    1640                 :           3 :  write(str_atm,*) input_atm
    1641                 :           3 :  str_atm=adjustl(str_atm)
    1642                 :             :  str_atm=trim(str_atm)
    1643                 :             : 
    1644                 :             : !Only master node outputs results in files (only master node)
    1645         [ +  - ]:           3 :  if (me==master) then
    1646                 :             : 
    1647                 :             : !  Standard output
    1648         [ +  - ]:           3 :    if (need_absorption) then
    1649                 :           3 :      write(std_out,*) 'Absorption: valence state orbital energies: omin,omax',omin_sig,omax_sig
    1650                 :             :    end if
    1651         [ +  + ]:           3 :    if (need_emissivity) then
    1652                 :           1 :      write(std_out,*) 'Emissivity: valence state orbital energies: omin,omax',omin_emis,omax_emis
    1653                 :             :    end if
    1654         [ +  - ]:           3 :    if (need_absorption) then
    1655                 :             :      write(std_out,'(a,f10.5,a,f10.5,a)')&
    1656                 :           3 : &   ' Emax       =',deltae/dble(nkpt*nsppol),' Ha',deltae/dble(nkpt*nsppol)*Ha_eV,' eV'
    1657                 :             :    end if
    1658                 :             : 
    1659                 :             : !  _sigX file
    1660                 :             :    if (need_absorption) then
    1661         [ -  + ]:           3 :      if (open_file(trim(filnam_out)//'_sigX_at'//str_atm,msg,newunit=sigx1_unt,form='formatted',action="write")/=0) then
    1662                 :           0 :        ABI_ERROR(msg)
    1663                 :             :      end if
    1664         [ +  + ]:           3 :      if (abs(dom_max)>tol10) then
    1665                 :           1 :        write(sigx1_unt,'(a)')'#***************************************************** ARCTAN SMEARING ********'
    1666                 :           1 :        write(sigx1_unt,'(a,i8,3f10.5,a)')'# npts,omin,omax,width      =',mom,omin,omax,dom,' Ha'
    1667                 :           1 :        write(sigx1_unt,'(a,2f10.5,a)')'# dom_max,center        =',dom_max,dom_ctr,' Ha'
    1668                 :             :      else
    1669                 :           2 :        write(sigx1_unt,'(a)')'#***************************************************** FIXED SMEARING ********'
    1670                 :           2 :        write(sigx1_unt,'(a,i8,3f10.5,a)')'# npts,omin,omax,width      =',mom,omin,omax,dom,' Ha'
    1671                 :             :      endif
    1672                 :           3 :      write(sigx1_unt,'(a,3f10.5,a)' )'# rprimd(bohr)      =',rprimd(1:3,1)
    1673                 :           3 :      write(sigx1_unt,'(a,3f10.5,a)' )'#                    ',rprimd(1:3,2)
    1674                 :           3 :      write(sigx1_unt,'(a,3f10.5,a)' )'#                    ',rprimd(1:3,3)
    1675                 :           3 :      write(sigx1_unt,'(a,i8)' )      '# natom             =',natom
    1676                 :           3 :      write(sigx1_unt,'(a,3i8)' )     '# nkpt,mband,nsppol        =',nkpt,mband,nsppol
    1677                 :           3 :      write(sigx1_unt,'(a, f10.5,a)' )'# ecut                  =',ecut,' Ha'
    1678                 :           3 :      write(sigx1_unt,'(a,f10.5,a,f10.5,a)' )'# fermie            =',fermie,' Ha ',fermie*Ha_eV,' eV'
    1679                 :           3 :      write(sigx1_unt,'(a,f12.5,a,f12.5,a)') '# Temp              =',tsmear,' Ha ',Tatm,' Kelvin'
    1680                 :           3 :      write(sigx1_unt,'(a)')'#----------------------------------------------------------------------------'
    1681                 :           3 :      write(sigx1_unt,'(a,i4)') '# Number of core orbitals nc=',nphicor
    1682         [ +  + ]:          14 :      do icor=1,nphicor
    1683         [ +  + ]:          14 :        if (kappacor(icor,itypat_atnbr)==0) then
    1684                 :           3 :          write(sigx1_unt,'(a,2i4,4f15.5)') '# n, l, Energy(Ha), Edge(Ha), Energy(eV), Edge(eV): ', &
    1685                 :           3 :            ncor(icor,itypat_atnbr),lcor(icor,itypat_atnbr),energy_cor(icor,itypat_atnbr),edge(icor),&
    1686                 :           6 : &            energy_cor(icor,itypat_atnbr)*Ha_eV,edge(icor)*Ha_eV
    1687                 :             :        else
    1688         [ +  + ]:           8 :          if (kappacor(icor,itypat_atnbr)>0) then
    1689                 :           2 :            j2=2*lcor(icor,itypat_atnbr)-1
    1690                 :           2 :            write(sigx1_unt,'(a,i4,i4,a,i4,4f15.5)') '# n, j, l, Energy(Ha), Edge(Ha), Energy(eV), Edge(eV): ',&
    1691                 :           2 : &            ncor(icor,itypat_atnbr),j2,' /2',lcor(icor,itypat_atnbr),energy_cor(icor,itypat_atnbr),edge(icor),&
    1692                 :           4 : &            energy_cor(icor,itypat_atnbr)*Ha_eV,edge(icor)*Ha_eV
    1693                 :             :          else
    1694         [ +  + ]:           6 :            if (kappacor(icor,itypat_atnbr)<-1) then
    1695                 :           2 :              j2=2*lcor(icor,itypat_atnbr)+1
    1696                 :           2 :              write(sigx1_unt,'(a,i4,i4,a,i4,4f15.5)') '# n, j, l, Energy(Ha), Edge(Ha), Energy(eV), Edge(eV): ',&
    1697                 :           2 : &   ncor(icor,itypat_atnbr),j2,'/2',lcor(icor,itypat_atnbr),energy_cor(icor,itypat_atnbr),edge(icor),&
    1698                 :           4 : &              energy_cor(icor,itypat_atnbr)*Ha_eV,edge(icor)*Ha_eV
    1699                 :             :            else
    1700                 :           4 :              write(sigx1_unt,'(a,i4,a,i4,4f15.5)') '# n, j, l, Energy(Ha), Edge(Ha), Energy(eV), Edge(eV): ',&
    1701                 :           4 : &              ncor(icor,itypat_atnbr),'1/2',lcor(icor,itypat_atnbr),energy_cor(icor,itypat_atnbr),edge(icor),&
    1702                 :           8 : &              energy_cor(icor,itypat_atnbr)*Ha_eV,edge(icor)*Ha_eV
    1703                 :             :            end if
    1704                 :             :          end if
    1705                 :             :        end if
    1706                 :             :      end do
    1707                 :           3 :      write(sigx1_unt,'(a)')'#----------------------------------------------------------------------------'
    1708                 :             :      write(sigx1_unt,'(a,f10.5,a,f10.5,a)')&
    1709                 :           3 : &     '# Emax       =',deltae/dble(nkpt*nsppol),' Ha',deltae/dble(nkpt*nsppol)*Ha_eV,' eV'
    1710                 :           3 :      write(sigx1_unt,'(a)')'#----------------------------------------------------------------------------'
    1711         [ -  + ]:           3 :      if(au_units>0) then
    1712                 :           0 :        write(sigx1_unt,'(a)')'#  om(au),sig1_av(au),sig1(au)  for each orbital'
    1713                 :             :      else
    1714                 :           3 :        write(sigx1_unt,'(a)')'#  om(eV),sig1_av(Ohm.cm)-1,sig1(Ohm.cm)-1  for each orbital'
    1715                 :             :      endif
    1716         [ +  + ]:        3003 :      do iom=1,mom
    1717         [ +  - ]:        3003 :        if(nsppol==1) then
    1718                 :             :          write(sigx1_unt,'(100(1x,e15.8))') &
    1719   [ +  -  +  + ]:       14000 : &        (oml_edge(icor,iom),sigx1_av(icor,iom,1),sigx1(icor,iom,atnbr,1),icor=1,nphicor)
    1720                 :             :        else
    1721                 :             :          write(sigx1_unt,'(100(1x,e15.8))') &
    1722   [ #  #  #  # ]:           0 : &        (oml_edge(icor,iom),sum_spin_sigx1_av(icor,iom),sum_spin_sigx1(icor,iom,atnbr),icor=1,nphicor)
    1723                 :             :        endif
    1724                 :             :      end do
    1725                 :           3 :      close(sigx1_unt)
    1726                 :             :      ! absX file
    1727         [ +  - ]:           3 :      if(au_units==0) then
    1728         [ -  + ]:           3 :        if(open_file(trim(filnam_out)//'_absX_at'//str_atm,msg,newunit=absx_unt,form='formatted',action="write")/=0) then
    1729                 :           0 :          ABI_ERROR(msg)
    1730                 :             :        end if
    1731                 :           3 :        write(absx_unt,'(a)') '# om(eV), abso X average (cm-1), abso X(cm-1)'
    1732         [ +  + ]:        3003 :        do iom=1,mom
    1733         [ +  - ]:        3003 :          if(nsppol==1) then
    1734                 :             :            write(absx_unt,'(100(1x,e15.8))') &
    1735                 :       11000 : &          (oml_edge(icor,iom),sigx1_av(icor,iom,1)/(Speed_Light_SI*eps0),&
    1736   [ +  -  +  + ]:       14000 : &          sigx1(icor,iom,atnbr,1)/(Speed_Light_SI*eps0),icor=1,nphicor)
    1737                 :             :          else
    1738                 :             :            write(absx_unt,'(100(1x,e15.8))') &
    1739                 :           0 : &          (oml_edge(icor,iom),sum_spin_sigx1_av(icor,iom)/(Speed_Light_SI*eps0),&
    1740   [ #  #  #  # ]:           0 : &          sum_spin_sigx1(icor,iom,atnbr)/(Speed_Light_SI*eps0),icor=1,nphicor)
    1741                 :             :          endif
    1742                 :             :        end do
    1743                 :           3 :        close(absx_unt)
    1744                 :             :      endif
    1745                 :             :    end if
    1746                 :             : 
    1747                 :             : !    _s_sigX
    1748         [ -  + ]:           3 :    if (need_absorption.and.nsppol==2) then
    1749         [ #  # ]:           0 :      if (open_file(trim(filnam_out)//'_sigX_up_at'//str_atm,msg,newunit=sigx1_up_unt,form='formatted',action="write")/=0) then
    1750                 :           0 :        ABI_ERROR(msg)
    1751                 :             :      end if
    1752         [ #  # ]:           0 :      if (open_file(trim(filnam_out)//'_sigX_dn_at'//str_atm,msg,newunit=sigx1_dn_unt,form='formatted',action="write")/=0) then
    1753                 :           0 :        ABI_ERROR(msg)
    1754                 :             :      end if
    1755         [ #  # ]:           0 :      do iom=1,mom
    1756                 :             :        write(sigx1_up_unt,'(100(1x,e15.8))') &
    1757   [ #  #  #  # ]:           0 : &      (oml_edge(icor,iom),sigx1_av(icor,iom,1),sigx1(icor,iom,atnbr,1),icor=1,nphicor)
    1758                 :             :        write(sigx1_dn_unt,'(100(1x,e15.8))') &
    1759   [ #  #  #  # ]:           0 : &      (oml_edge(icor,iom),sigx1_av(icor,iom,2),sigx1(icor,iom,atnbr,2),icor=1,nphicor)
    1760                 :             :      end do
    1761                 :           0 :      close(sigx1_up_unt)
    1762                 :           0 :      close(sigx1_dn_unt)
    1763                 :             :    end if
    1764                 :             : 
    1765                 :             : !  _emisX file
    1766         [ +  + ]:           3 :    if (need_emissivity) then
    1767         [ -  + ]:           1 :      if (open_file(trim(filnam_out)//'_emisX_at'//str_atm,msg,newunit=ems_unt,form='formatted',action="write")/=0) then
    1768                 :           0 :        ABI_ERROR(msg)
    1769                 :             :      end if
    1770         [ -  + ]:           1 :      if(au_units>0) then
    1771                 :           0 :        write(ems_unt,'(a)')'#  om(au),sig1_av(au),sig1(au)  for each orbital'
    1772                 :             :      else
    1773                 :           1 :        write(ems_unt,'(a)')'#  om(eV),sig1_av(Ohm.cm)-1,sig1(Ohm.cm)-1  for each orbital'
    1774                 :             :      endif
    1775         [ +  + ]:        1001 :      do iom=1,mom
    1776         [ +  - ]:        1001 :        if(nsppol==1) then
    1777                 :             :          write(ems_unt,'(3(3(1x,e15.8),2x))') &
    1778   [ +  -  +  + ]:        4000 : &        (oml_edge(icor,iom),emisx_av(icor,iom,1),emisx(icor,iom,atnbr,1),icor=1,nphicor)
    1779                 :             :        else
    1780                 :             :          write(ems_unt,'(3(3(1x,e15.8),2x))') &
    1781   [ #  #  #  # ]:           0 : &        (oml_edge(icor,iom),sum_spin_emisx_av(icor,iom)/dble(natom_atnbr),sum_spin_emisx(icor,iom,atnbr),icor=1,nphicor)
    1782                 :             :        endif
    1783                 :             :      end do
    1784                 :           1 :     close(ems_unt)
    1785                 :             :   end if
    1786                 :             : 
    1787                 :             : !    _s_emisX
    1788         [ -  + ]:           1 :    if (need_emissivity.and.nsppol==2) then
    1789         [ #  # ]:           0 :      if (open_file(trim(filnam_out)//'_emisX_up_at'//str_atm,msg,newunit=ems_up_unt,form='formatted',action="write")/=0) then
    1790                 :           0 :        ABI_ERROR(msg)
    1791                 :             :      end if
    1792         [ #  # ]:           0 :      if (open_file(trim(filnam_out)//'_emisX_dn_at'//str_atm,msg,newunit=ems_dn_unt,form='formatted',action="write")/=0) then
    1793                 :           0 :        ABI_ERROR(msg)
    1794                 :             :      end if
    1795         [ #  # ]:           0 :      do iom=1,mom
    1796                 :             :        write(ems_up_unt,'(3(3(1x,e15.8),2x))') &
    1797   [ #  #  #  # ]:           0 : &        (oml_edge(icor,iom),emisx_av(icor,iom,1)/dble(natom_atnbr),emisx(icor,iom,atnbr,1),icor=1,nphicor)
    1798                 :             :        write(ems_dn_unt,'(3(3(1x,e15.8),2x))') &
    1799   [ #  #  #  # ]:           0 :          (oml_edge(icor,iom),emisx_av(icor,iom,2)/dble(natom_atnbr),emisx(icor,iom,atnbr,2),icor=1,nphicor)
    1800                 :             :      end do
    1801                 :           0 :      close(ems_up_unt)
    1802                 :           0 :      close(ems_dn_unt)
    1803                 :             :    end if
    1804                 :             : 
    1805                 :             :  endif ! master node
    1806                 :             : 
    1807                 :             : !---------------------------------------------------------------------------------
    1808                 :             : ! End
    1809                 :             : 
    1810                 :             : !Release memory space
    1811         [ +  - ]:           3 :  if (need_absorption) then
    1812         [ -  + ]:           3 :    ABI_FREE(sigx1)
    1813         [ -  + ]:           3 :    ABI_FREE(sigx1_av)
    1814         [ -  + ]:           3 :    if (nsppol==2) then
    1815         [ #  # ]:           0 :      ABI_FREE(sum_spin_sigx1)
    1816         [ #  # ]:           0 :      ABI_FREE(sum_spin_sigx1_av)
    1817                 :             :    end if
    1818         [ -  + ]:           3 :    ABI_FREE(dom_var1)
    1819         [ -  + ]:           3 :    ABI_FREE(oml_edge)
    1820                 :             :  end if
    1821         [ +  + ]:           3 :  if (need_emissivity) then
    1822         [ -  + ]:           1 :    ABI_FREE(emisx)
    1823         [ -  + ]:           1 :    ABI_FREE(emisx_av)
    1824         [ -  + ]:           1 :    if (nsppol==2) then
    1825         [ #  # ]:           0 :      ABI_FREE(sum_spin_emisx)
    1826         [ #  # ]:           0 :      ABI_FREE(sum_spin_emisx_av)
    1827                 :             :    end if
    1828         [ -  + ]:           1 :    ABI_FREE(oml_emis)
    1829                 :             :  end if
    1830                 :           3 :  ABI_FREE(typat)
    1831         [ -  + ]:           3 :  ABI_FREE(ncor)
    1832         [ -  + ]:           3 :  ABI_FREE(lcor)
    1833         [ -  + ]:           3 :  ABI_FREE(kappacor)
    1834         [ -  + ]:           3 :  ABI_FREE(energy_cor)
    1835         [ -  + ]:           3 :  ABI_FREE(edge)
    1836         [ -  + ]:           3 :  ABI_FREE(eigen0)
    1837         [ -  + ]:           3 :  ABI_FREE(nband)
    1838         [ -  + ]:           3 :  ABI_FREE(occ)
    1839         [ -  + ]:           3 :  ABI_FREE(occ_cor)
    1840         [ -  + ]:           3 :  ABI_FREE(maxocc_cor)
    1841         [ -  + ]:           3 :  ABI_FREE(wtk)
    1842                 :           3 :  call hdr%free()
    1843                 :           3 :  call destroy_mpi_enreg(mpi_enreg)
    1844                 :             : 
    1845   [ -  +  -  +  :           6 : end subroutine conducti_paw_core
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
                   -  + ]
    1846                 :             : !!***
    1847                 :             : 
    1848                 :             : !----------------------------------------------------------------------
    1849                 :             : 
    1850                 :             : !!****f* m_conducti/conducti_nc
    1851                 :             : !! NAME
    1852                 :             : !! conducti_nc
    1853                 :             : !!
    1854                 :             : !! FUNCTION
    1855                 :             : !! This program computes the elements of the optical frequency dependent
    1856                 :             : !! conductivity tensor and the conductivity along the three principal axes
    1857                 :             : !! from the Kubo-Greenwood formula.
    1858                 :             : !!
    1859                 :             : !! INPUTS
    1860                 :             : !!  (main routine)
    1861                 :             : !!
    1862                 :             : !! OUTPUT
    1863                 :             : !!  (main routine)
    1864                 :             : !!
    1865                 :             : !! NOTES
    1866                 :             : !!  bantot
    1867                 :             : !!  doccde(mband*nkpt_rbz*nsppol)=derivative of occ_rbz wrt the energy.
    1868                 :             : !!  dom=frequency range
    1869                 :             : !!  eigen0(mband*nkpt_rbz*nsppol)=GS eigenvalues at k (hartree).
    1870                 :             : !!  eigen11(2*mband*mband*nkpt_rbz*nsppol)=first-order eigenvalues (hartree)
    1871                 :             : !!  in reciprocal direction 100
    1872                 :             : !!  eigen12(2*mband*mband*nkpt_rbz*nsppol)=first-order eigenvalues (hartree)
    1873                 :             : !!  in reciprocal direction 010
    1874                 :             : !!  eigen13(2*mband*mband*nkpt_rbz*nsppol)=first-order eigenvalues (hartree)
    1875                 :             : !!  in reciprocal direction 001
    1876                 :             : !!  ecut=kinetic energy planewave cutoff (hartree).
    1877                 :             : !!  entropy= entropy associated with the smearing (adimensional)
    1878                 :             : !!  fermie= fermi energy (Hartree)
    1879                 :             : !!  gmet(3,3)=reciprocal space metric ($\textrm{bohr}^{2}$).
    1880                 :             : !!  gmet_inv(3,3)=inverse of reciprocal space metric ($\textrm{bohr}^{2}$).
    1881                 :             : !!  gprimd(3,3)=dimensional primitive translations for reciprocal space(bohr^-1).
    1882                 :             : !!  kin11= Onsager kinetic coeficient=optical conductivity
    1883                 :             : !!  kin12= Onsager kinetic coeficient
    1884                 :             : !!  kin21= Onsager kinetic coeficient
    1885                 :             : !!  kin22= Onsager kinetic coeficient
    1886                 :             : !!  Kth=thermal conductivity
    1887                 :             : !!  mom=number of frequency for conductivity computation
    1888                 :             : !!  mband=maximum number of bands.
    1889                 :             : !!  natom = number of atoms in the unit cell.
    1890                 :             : !!  nband(nkpt*nsppol)=number of bands at each RF k point for each spin.
    1891                 :             : !!  nelect=number of electrons per unit cell
    1892                 :             : !!  nkpt=number of k points in the IBZ for this perturbation
    1893                 :             : !!  ngfft(3)=integer fft box dimensions.
    1894                 :             : !!  nspinor=number of spinorial components of the wavefunctions.
    1895                 :             : !!  nsppol=1 for unpolarized, 2 for spin-polarized.
    1896                 :             : !!  ntypat = number of atom types.
    1897                 :             : !!  occ(mband*nkpt*nsppol)=occupation number for each band and k.
    1898                 :             : !!  occopt==option for occupancies
    1899                 :             : !!  rmet(3,3)=real space metric ($\textrm{bohr}^{2}$).
    1900                 :             : !!  rprimd(3,3)=real space primitive translations.
    1901                 :             : !!  of primitive translations.
    1902                 :             : !!  Sth=thermopower
    1903                 :             : !!  tsmear=smearing width (or temperature) in Hartree
    1904                 :             : !!  ucvol=unit cell volume in ($\textrm{bohr}^{3}$).
    1905                 :             : !!  wind=frequency windows for computations of sigma
    1906                 :             : !!  wtk(nkpt)=weight assigned to each k point.
    1907                 :             : !!  znucl(natom)=atomic number of atoms
    1908                 :             : !!  np_sum=noziere-pines sumrule
    1909                 :             : !!  cond_kg(mom)=kubo-greenwood conductivity
    1910                 :             : !!
    1911                 :             : !! SOURCE
    1912                 :             : 
    1913                 :             : 
    1914                 :           1 : subroutine conducti_nc(filnam,filnam_out)
    1915                 :             : 
    1916                 :             : !Arguments -----------------------------------
    1917                 :             : !scalars
    1918                 :             :  character(len=fnlen),intent(in) :: filnam,filnam_out
    1919                 :             : 
    1920                 :             : !Local variables-------------------------------
    1921                 :             : !scalars
    1922                 :             :  integer,parameter :: formeig0=0,formeig1=1
    1923                 :             :  integer :: bantot,bd2tot_index,bdtot0_index,bdtot_index
    1924                 :             :  integer :: headform,iband,ii,jj,ikpt,iunt
    1925                 :             :  integer :: index_1,iom,isppol,jband,l1,l2,mband,mom,natom,nband1
    1926                 :             :  integer :: nrot,iomode
    1927                 :             :  integer :: nband_k,nkpt,nlign,nrest,nspinor,nsppol,ntypat
    1928                 :             :  integer :: occopt,comm
    1929                 :             :  integer :: tens_unt,lij_unt,sig_unt,kth_unt,ocond_unt
    1930                 :             :  real(dp) :: deltae,dosdeltae,diff_occ,dom,ecut,entropy,fermie,maxocc
    1931                 :             :  real(dp) :: nelect,np_sum,np_sum_k1,np_sum_k2,omin,oml,socc,socc_k,sig
    1932                 :             :  real(dp) :: tphysel,tsmear,ucvol,wind,Tatm
    1933                 :             :  character(len=fnlen) :: filnam0,filnam1,filnam2,filnam3
    1934                 :             :  character(len=500) :: msg
    1935                 :           1 :  type(hdr_type) :: hdr
    1936   [ +  +  +  +  :          14 :  type(wfk_t) :: gswfk,ddk1,ddk2,ddk3
             +  +  +  + ]
    1937                 :             : !arrays
    1938                 :           1 :  integer,allocatable :: nband(:)
    1939                 :             :  real(dp) :: gmet(3,3),gmet_inv(3,3),gprimd(3,3),gprimd_inv(3,3),rmet(3,3),rprimd(3,3)
    1940                 :           2 :  real(dp),allocatable :: cond_kg(:,:,:),cond_kg_cart(:,:,:),cond_nd(:,:,:),dhdk2_r(:,:,:,:),dhdk2_g(:,:)
    1941                 :           3 :  real(dp),allocatable :: doccde(:),doccde_k(:),cond_kg_xx(:),cond_kg_yy(:),cond_kg_zz(:),trace(:)
    1942                 :           1 :  real(dp),allocatable :: eig0_k(:),eig0tmp(:),eig1_k(:,:),eigen0(:),eigen11(:)
    1943                 :           1 :  real(dp),allocatable :: eigen12(:),eigtmp(:)
    1944                 :           2 :  real(dp),allocatable :: eigen13(:),occ(:),occ_k(:),wtk(:),cond_tot(:),oml1(:)
    1945                 :           1 :  real(dp),allocatable :: kin11(:),kin12(:),kin21(:),kin22(:)
    1946                 :           1 :  real(dp),allocatable :: kin11_k(:),kin12_k(:),kin21_k(:),kin22_k(:),Kth(:),Stp(:)
    1947                 :             :  real(dp) :: cond_kg_w(3,3),z(3,3)
    1948                 :             :  real(dp) :: eig_cond(3)
    1949                 :             : 
    1950                 :             : ! *********************************************************************************
    1951                 :             : 
    1952                 :             : !Read data file
    1953         [ -  + ]:           1 :  if (open_file(filnam,msg,newunit=iunt,form='formatted',status="old")/=0) then
    1954                 :           0 :    ABI_ERROR(msg)
    1955                 :             :  end if
    1956                 :             : 
    1957                 :           1 :  rewind(iunt)
    1958                 :           1 :  read(iunt,*)
    1959                 :           1 :  read(iunt,'(a)')filnam1       ! first ddk file
    1960                 :           1 :  read(iunt,'(a)')filnam2       ! second ddk file
    1961                 :           1 :  read(iunt,'(a)')filnam3       ! third ddk file
    1962                 :           1 :  read(iunt,'(a)')filnam0       ! ground-state data
    1963                 :             : 
    1964                 :             : !Open the GS Wavefunction file and the 3 DDK files.
    1965                 :             : ! TODO: one should perform basic consistency tests for the GS WFK and the DDK files, e.g.
    1966                 :             : ! k-points and their order, spins, number of bands could differ in the four files.
    1967                 :             : ! Note indeed that we are assuming the same numer of bands in all the files.
    1968                 :           1 :  comm = xmpi_comm_self
    1969                 :           1 :  call nctk_fort_or_ncfile(filnam0, iomode, msg)
    1970         [ -  + ]:           1 :  if (len_trim(msg) /= 0) ABI_ERROR(msg)
    1971                 :           1 :  call gswfk%open_read(filnam0, formeig0, iomode, get_unit(), comm)
    1972                 :             : 
    1973                 :           1 :  call nctk_fort_or_ncfile(filnam1, iomode, msg)
    1974         [ -  + ]:           1 :  if (len_trim(msg) /= 0) ABI_ERROR(msg)
    1975                 :           1 :  call ddk1%open_read(filnam1, formeig1, iomode, get_unit(), comm, hdr_out=hdr)
    1976                 :             : 
    1977                 :           1 :  call nctk_fort_or_ncfile(filnam2, iomode, msg)
    1978         [ -  + ]:           1 :  if (len_trim(msg) /= 0) ABI_ERROR(msg)
    1979                 :           1 :  call ddk2%open_read(filnam2, formeig1, iomode, get_unit(), comm)
    1980                 :             : 
    1981                 :           1 :  call nctk_fort_or_ncfile(filnam3, iomode, msg)
    1982         [ -  + ]:           1 :  if (len_trim(msg) /= 0) ABI_ERROR(msg)
    1983                 :           1 :  call ddk3%open_read(filnam3, formeig1, iomode, get_unit(), comm)
    1984                 :             : 
    1985         [ -  + ]:           1 :  if (ddk1%compare(ddk2) /= 0) then
    1986                 :           0 :    ABI_ERROR("ddk1 and ddk2 are not consistent. see above messages")
    1987                 :             :  end if
    1988         [ -  + ]:           1 :  if (ddk1%compare(ddk3) /= 0) then
    1989                 :           0 :    ABI_ERROR("ddk1 and ddk3 are not consistent. see above messages")
    1990                 :             :  end if
    1991                 :             : 
    1992                 :             : !Extract params from the header of the first ddk file (might have been the GS file ?)
    1993                 :             : 
    1994                 :             : !Extract info from the header
    1995                 :           1 :  headform=hdr%headform
    1996                 :           1 :  bantot=hdr%bantot
    1997                 :           1 :  ecut=hdr%ecut_eff
    1998                 :           1 :  natom=hdr%natom
    1999                 :           1 :  nkpt=hdr%nkpt
    2000                 :           1 :  nspinor=hdr%nspinor
    2001                 :           1 :  nsppol=hdr%nsppol
    2002                 :           1 :  ntypat=hdr%ntypat
    2003                 :           1 :  occopt=hdr%occopt
    2004   [ +  +  +  + ]:          13 :  rprimd(:,:)=hdr%rprimd(:,:)
    2005   [ -  +  +  -  :           3 :  ABI_MALLOC(nband,(nkpt*nsppol))
          +  -  +  -  -  
                +  -  + ]
    2006   [ -  +  +  -  :           3 :  ABI_MALLOC(occ,(bantot))
          +  -  +  -  -  
                +  -  + ]
    2007                 :           1 :  fermie=hdr%fermie
    2008         [ +  + ]:          21 :  occ(1:bantot)=hdr%occ(1:bantot)
    2009         [ +  + ]:           2 :  nband(1:nkpt*nsppol)=hdr%nband(1:nkpt*nsppol)
    2010                 :             : 
    2011                 :             : !Get mband, as the maximum value of nband(nkpt)
    2012         [ +  + ]:           2 :  mband=maxval(nband(:))
    2013                 :             : 
    2014                 :           1 :  write(std_out,*)
    2015                 :           1 :  write(std_out,'(a,3f10.5,a)' )' rprimd(bohr)      =',rprimd(1:3,1)
    2016                 :           1 :  write(std_out,'(a,3f10.5,a)' )'                    ',rprimd(1:3,2)
    2017                 :           1 :  write(std_out,'(a,3f10.5,a)' )'                    ',rprimd(1:3,3)
    2018                 :           1 :  write(std_out,'(a,i8)')       ' natom             =',natom
    2019                 :           1 :  write(std_out,'(a,2i8)')      ' nkpt,mband        =',nkpt,mband
    2020                 :           1 :  write(std_out,'(a, f10.5,a)' ) ' ecut              =',ecut,' Ha'
    2021                 :           1 :  write(std_out,'(a,f10.5,a,f10.5,a)' )' fermie            =',fermie,' Ha',fermie*Ha_eV,' eV'
    2022                 :             : 
    2023                 :             : !Prepare the reading of ddk Wff files
    2024   [ +  -  -  +  :           3 :  ABI_MALLOC(eigtmp,(2*mband*mband))
          +  -  +  -  +  
             -  -  +  -  
                      + ]
    2025   [ -  +  +  -  :           3 :  ABI_MALLOC(eig0tmp,(mband))
          +  -  +  -  -  
                +  -  + ]
    2026                 :             : 
    2027                 :             : !Read the eigenvalues of ground-state and ddk files
    2028   [ -  +  +  -  :           3 :  ABI_MALLOC(eigen0,(mband*nkpt*nsppol))
          +  -  +  -  -  
                +  -  + ]
    2029   [ +  -  -  +  :           3 :  ABI_MALLOC(eigen11,(2*mband*mband*nkpt*nsppol))
          +  -  +  -  +  
             -  -  +  -  
                      + ]
    2030   [ -  +  +  -  :           2 :  ABI_MALLOC(eigen12,(2*mband*mband*nkpt*nsppol))
             -  +  -  + ]
    2031   [ -  +  +  -  :           2 :  ABI_MALLOC(eigen13,(2*mband*mband*nkpt*nsppol))
             -  +  -  + ]
    2032                 :           1 :  bdtot0_index=0 ; bdtot_index=0
    2033         [ +  + ]:           2 :  do isppol=1,nsppol
    2034         [ +  + ]:           3 :    do ikpt=1,nkpt
    2035                 :           1 :      nband1=nband(ikpt+(isppol-1)*nkpt)
    2036                 :           1 :      call gswfk%read_eigk(ikpt,isppol,xmpio_single,eig0tmp)
    2037         [ +  + ]:          21 :      eigen0(1+bdtot0_index:nband1+bdtot0_index)=eig0tmp(1:nband1)
    2038                 :             : 
    2039                 :           1 :      call ddk1%read_eigk(ikpt,isppol,xmpio_single,eigtmp)
    2040         [ +  + ]:         801 :      eigen11(1+bdtot_index:2*nband1**2+bdtot_index)=eigtmp(1:2*nband1**2)
    2041                 :             : 
    2042                 :           1 :      call ddk2%read_eigk(ikpt,isppol,xmpio_single,eigtmp)
    2043         [ +  + ]:         801 :      eigen12(1+bdtot_index:2*nband1**2+bdtot_index)=eigtmp(1:2*nband1**2)
    2044                 :             : 
    2045                 :           1 :      call ddk3%read_eigk(ikpt,isppol,xmpio_single,eigtmp)
    2046         [ +  + ]:         801 :      eigen13(1+bdtot_index:2*nband1**2+bdtot_index)=eigtmp(1:2*nband1**2)
    2047                 :             : 
    2048                 :           1 :      bdtot0_index=bdtot0_index+nband1
    2049                 :           2 :      bdtot_index=bdtot_index+2*nband1**2
    2050                 :             :    end do
    2051                 :             :  end do
    2052                 :             : 
    2053                 :             : !Close files
    2054                 :           1 :  call gswfk%close()
    2055                 :           1 :  call ddk1%close()
    2056                 :           1 :  call ddk2%close()
    2057                 :           1 :  call ddk3%close()
    2058                 :             : 
    2059         [ -  + ]:           1 :  ABI_FREE(eigtmp)
    2060         [ -  + ]:           1 :  ABI_FREE(eig0tmp)
    2061                 :             : 
    2062                 :             : !---------------------------------------------------------------------------------
    2063                 :             : !Gmet inversion
    2064                 :           1 :  call metric(gmet,gprimd,-1,rmet,rprimd,ucvol)
    2065                 :           1 :  call matr3inv(gmet,gmet_inv)
    2066                 :           1 :  call matr3inv(gprimd,gprimd_inv)
    2067                 :             : 
    2068                 :             : !---------------------------------------------------------------------------------
    2069                 :             : !Derivative of occupation wrt the energy.
    2070                 :             : 
    2071   [ -  +  +  -  :           2 :  ABI_MALLOC(doccde,(mband*nkpt*nsppol))
             -  +  -  + ]
    2072   [ -  +  +  -  :           3 :  ABI_MALLOC(wtk,(nkpt))
          +  -  +  -  -  
                +  -  + ]
    2073                 :             : 
    2074                 :           1 :  read(iunt,*)tsmear
    2075                 :           1 :  Tatm=tsmear*Ha_K
    2076                 :           1 :  write(std_out,'(a,f12.5,a,f12.5,a)') ' Temp              =',tsmear,' Ha ',Tatm,' Kelvin'
    2077                 :             : !
    2078                 :           1 :  nlign=nkpt/6
    2079                 :           1 :  nrest=nkpt-6*nlign
    2080                 :           1 :  index_1=0
    2081         [ -  + ]:           1 :  do ii=1,nlign
    2082                 :           0 :    read(iunt,*)wtk(1+index_1:6+index_1)
    2083                 :           1 :    index_1=index_1+6
    2084                 :             :  end do
    2085         [ +  - ]:           1 :  if (nrest/=0) then
    2086                 :           1 :    read(iunt,*)wtk(6*nlign+1:nkpt)
    2087                 :             :  end if
    2088                 :             : !
    2089         [ -  + ]:           1 :  if (occopt==1) then
    2090                 :           0 :    write(std_out,'(a,i4)')  ' occopt            =',occopt
    2091         [ #  # ]:           0 :    doccde=zero
    2092                 :             :  else
    2093                 :           1 :    tphysel=zero
    2094                 :           1 :    maxocc=two/(nsppol*nspinor)
    2095                 :           1 :    dosdeltae=zero
    2096                 :             : !  CP: using 1 and nband(0) as dummy value, because function
    2097                 :             : !  not implemented for occopt==9; adding fermih=fermie in the list of arguments as well
    2098                 :             :    call getnel(doccde,dosdeltae,eigen0,entropy,fermie,fermie,maxocc,mband,nband,&
    2099                 :           1 : &   nelect,nkpt,nsppol,occ,occopt,1,tphysel,tsmear,11,wtk,1,nband(1))
    2100                 :             :  end if
    2101                 :             : 
    2102                 :             : !---------------------------------------------------------------------------------
    2103                 :             : !Size of the frequency range
    2104                 :             : 
    2105                 :           1 :  read(iunt,*)dom,wind
    2106                 :           1 :  close(iunt)
    2107                 :           1 :  mom=int(wind/dom)
    2108   [ -  +  +  -  :           3 :  ABI_MALLOC(oml1,(mom))
          +  -  +  -  -  
                +  -  + ]
    2109         [ +  + ]:         273 :  do iom=1,mom
    2110                 :         273 :    oml1(iom)=tol10*1000._dp+dble(iom)*dom
    2111                 :             :  end do
    2112                 :             : 
    2113   [ -  +  +  -  :           4 :  ABI_MALLOC(cond_nd,(mom,3,3))
          +  -  +  -  +  
             -  -  +  -  
                      + ]
    2114   [ -  +  +  -  :           2 :  ABI_MALLOC(cond_kg,(mom,3,3))
             -  +  -  + ]
    2115   [ -  +  +  -  :           2 :  ABI_MALLOC(cond_kg_cart,(mom,3,3))
             -  +  -  + ]
    2116   [ -  +  +  -  :           2 :  ABI_MALLOC(cond_kg_xx,(mom))
             -  +  -  + ]
    2117   [ -  +  +  -  :           2 :  ABI_MALLOC(cond_kg_yy,(mom))
             -  +  -  + ]
    2118   [ -  +  +  -  :           2 :  ABI_MALLOC(trace,(mom))
             -  +  -  + ]
    2119   [ -  +  +  -  :           2 :  ABI_MALLOC(cond_kg_zz,(mom))
             -  +  -  + ]
    2120   [ -  +  +  -  :           2 :  ABI_MALLOC(cond_tot,(mom))
             -  +  -  + ]
    2121   [ -  +  +  -  :           2 :  ABI_MALLOC(kin11,(mom))
             -  +  -  + ]
    2122   [ -  +  +  -  :           2 :  ABI_MALLOC(kin12,(mom))
             -  +  -  + ]
    2123   [ -  +  +  -  :           2 :  ABI_MALLOC(kin21,(mom))
             -  +  -  + ]
    2124   [ -  +  +  -  :           2 :  ABI_MALLOC(kin22,(mom))
             -  +  -  + ]
    2125   [ -  +  +  -  :           2 :  ABI_MALLOC(kin11_k,(mom))
             -  +  -  + ]
    2126   [ -  +  +  -  :           2 :  ABI_MALLOC(kin12_k,(mom))
             -  +  -  + ]
    2127   [ -  +  +  -  :           2 :  ABI_MALLOC(kin21_k,(mom))
             -  +  -  + ]
    2128   [ -  +  +  -  :           2 :  ABI_MALLOC(kin22_k,(mom))
             -  +  -  + ]
    2129   [ -  +  +  -  :           2 :  ABI_MALLOC(Kth,(mom))
             -  +  -  + ]
    2130   [ -  +  +  -  :           2 :  ABI_MALLOC(Stp,(mom))
             -  +  -  + ]
    2131                 :           1 :  write(std_out,'(a,i8,2f10.5,a)')' mom,wind,dom      =',mom,wind,dom,' Ha'
    2132                 :             : 
    2133                 :             : !---------------------------------------------------------------------------------
    2134                 :             : 
    2135         [ +  + ]:         273 :  kin11   = zero
    2136         [ +  + ]:         273 :  kin12   = zero
    2137         [ +  + ]:         273 :  kin21   = zero
    2138         [ +  + ]:         273 :  kin22   = zero
    2139                 :           1 :  np_sum  = zero
    2140                 :           1 :  socc    = zero
    2141   [ +  +  +  +  :        2461 :  cond_kg = zero
                   +  + ]
    2142                 :             : 
    2143                 :             : !LOOP OVER SPINS
    2144         [ +  + ]:           2 :  do isppol=1,nsppol
    2145                 :             : !
    2146                 :           1 :    bdtot_index = 0
    2147                 :           1 :    bd2tot_index = 0
    2148                 :             : 
    2149                 :           1 :    deltae  = zero
    2150                 :             : !
    2151                 :             : !  BIG FAT k POINT LOOP
    2152                 :             : !
    2153         [ +  + ]:           2 :    do ikpt=1,nkpt
    2154                 :             : 
    2155                 :           1 :      nband_k=nband(ikpt+(isppol-1)*nkpt)
    2156                 :             : 
    2157   [ -  +  +  -  :           3 :      ABI_MALLOC(eig0_k,(nband_k))
          +  -  +  -  -  
                +  -  + ]
    2158   [ +  -  -  +  :           4 :      ABI_MALLOC(eig1_k,(2*nband_k**2,3))
          +  -  +  -  +  
          -  +  -  -  +  
                   -  + ]
    2159   [ -  +  +  -  :           2 :      ABI_MALLOC(occ_k,(nband_k))
             -  +  -  + ]
    2160   [ -  +  +  -  :           2 :      ABI_MALLOC(doccde_k,(nband_k))
             -  +  -  + ]
    2161   [ -  +  +  -  :           4 :      ABI_MALLOC(dhdk2_r,(3,3,nband_k,nband_k))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
    2162   [ -  +  +  -  :           4 :      ABI_MALLOC(dhdk2_g,(nband_k,nband_k))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
    2163                 :             : 
    2164   [ +  +  +  +  :        2461 :      cond_nd   = zero
                   +  + ]
    2165         [ +  + ]:         273 :      kin11_k   = zero
    2166         [ +  + ]:         273 :      kin12_k   = zero
    2167         [ +  + ]:         273 :      kin21_k   = zero
    2168         [ +  + ]:         273 :      kin22_k   = zero
    2169                 :          21 :      np_sum_k1 = zero
    2170                 :          21 :      np_sum_k2 = zero
    2171                 :          21 :      socc_k    = zero
    2172   [ +  +  +  +  :        5221 :      dhdk2_r   = zero
             +  +  +  + ]
    2173   [ +  +  +  + ]:         421 :      dhdk2_g   = zero
    2174                 :             : 
    2175                 :             : !    eigenvalue for k-point
    2176         [ +  + ]:          21 :      eig0_k(:)=eigen0(1+bdtot_index:nband_k+bdtot_index)
    2177                 :             : !    first derivative eigenvalues for k-point
    2178         [ +  + ]:         801 :      eig1_k(:,1)=eigen11(1+bd2tot_index:2*nband_k**2+bd2tot_index)
    2179         [ +  + ]:         801 :      eig1_k(:,2)=eigen12(1+bd2tot_index:2*nband_k**2+bd2tot_index)
    2180         [ +  + ]:         801 :      eig1_k(:,3)=eigen13(1+bd2tot_index:2*nband_k**2+bd2tot_index)
    2181                 :             : !    occupation numbers for k-point
    2182         [ +  + ]:          21 :      occ_k(:)=occ(1+bdtot_index:nband_k+bdtot_index)
    2183                 :             : !    derivative of occupation number for k-point
    2184         [ +  + ]:          21 :      doccde_k(:)=doccde(1+bdtot_index:nband_k+bdtot_index)
    2185                 :             : 
    2186                 :             : !    LOOP OVER BAND
    2187         [ +  + ]:          21 :      do iband=1,nband_k
    2188         [ +  + ]:         420 :        do jband=1,nband_k
    2189                 :             : !
    2190                 :             : !        TODO : replace with BLAS calls
    2191         [ +  + ]:        1600 :          do l1=1,3
    2192         [ +  + ]:        5200 :            do l2=1,3
    2193         [ +  + ]:       15600 :              do ii=1,3
    2194         [ +  + ]:       46800 :                do jj=1,3
    2195                 :             :                  dhdk2_r(l1,l2,iband,jband)=dhdk2_r(l1,l2,iband,jband)+(rprimd(l1,ii)&
    2196                 :             : &                 *eig1_k(2*iband-1+(jband-1)*2*nband_k,ii)*&
    2197                 :             : &                 rprimd(l2,jj)*eig1_k(2*iband-1+(jband-1)*2*nband_k,jj)&
    2198                 :             : &                 +rprimd(l1,ii)*eig1_k(2*iband  +(jband-1)*2*nband_k,ii)*&
    2199                 :       43200 : &                 rprimd(l2,jj)*eig1_k(2*iband+(jband-1)*2*nband_k,jj))
    2200                 :             :                end do
    2201                 :             :              end do
    2202                 :             :            end do
    2203                 :             :          end do
    2204                 :             : 
    2205         [ +  + ]:        1600 :          do l1=1,3
    2206         [ +  + ]:        5200 :            do l2=1,3
    2207                 :        4800 :              dhdk2_r(l1,l2,iband,jband)=dhdk2_r(l1,l2,iband,jband)/two_pi/two_pi
    2208                 :             :            end do
    2209                 :             :          end do
    2210                 :             : 
    2211                 :             : !        TODO: replace with BLAS calls
    2212         [ +  + ]:        1600 :          do l1=1,3
    2213         [ +  + ]:        5200 :            do l2=1,3
    2214                 :             :              dhdk2_g(iband,jband)=dhdk2_g(iband,jband)+gmet_inv(l1,l2)*( &
    2215                 :             : &             eig1_k(2*iband-1+(jband-1)*2*nband_k,l1)*&
    2216                 :             : &             eig1_k(2*iband-1+(jband-1)*2*nband_k,l2) &
    2217                 :             : &            +eig1_k(2*iband  +(jband-1)*2*nband_k,l1)*&
    2218                 :        4800 : &             eig1_k(2*iband  +(jband-1)*2*nband_k,l2))
    2219                 :             :            end do
    2220                 :             :          end do
    2221                 :         400 :          dhdk2_g(iband,jband)=dhdk2_g(iband,jband)/two_pi/two_pi
    2222                 :             : 
    2223                 :         400 :          diff_occ = occ_k(iband)-occ_k(jband)
    2224                 :             : !        if (dabs(diff_occ)>=tol8) then
    2225                 :             : 
    2226                 :             : !        Conductivity for each omega
    2227                 :         400 :          omin = zero
    2228         [ +  + ]:      109200 :          do iom=1,mom
    2229                 :      108800 :            oml=oml1(iom)
    2230         [ +  + ]:      108800 :            if (jband>iband) then
    2231                 :             :              sig= dhdk2_g(iband,jband)&
    2232                 :             : &             *(diff_occ)/oml*(dexp(-((eig0_k(jband)-eig0_k(iband)-oml)/dom)**2)&
    2233                 :       51680 : &             -dexp(-((eig0_k(iband)-eig0_k(jband)-oml)/dom)**2))
    2234                 :       51680 :              kin11_k(iom)=kin11_k(iom)+sig
    2235                 :       51680 :              kin12_k(iom)=kin12_k(iom)-sig*(eig0_k(jband)-fermie)
    2236                 :       51680 :              kin21_k(iom)=kin21_k(iom)-sig*(eig0_k(iband)-fermie)
    2237                 :             :              kin22_k(iom)=kin22_k(iom) + &
    2238                 :       51680 : &             sig*(eig0_k(iband)-fermie)*(eig0_k(jband)-fermie)
    2239                 :             :            end if
    2240         [ +  + ]:      435600 :            do l1=1,3
    2241         [ +  + ]:     1414400 :              do l2=1,3
    2242                 :             :                cond_nd(iom,l1,l2)=cond_nd(iom,l1,l2) +dhdk2_r(l1,l2,iband,jband)&
    2243                 :     1305600 : &               *(diff_occ)/oml*dexp(-((eig0_k(jband)-eig0_k(iband)-oml)/dom)**2)
    2244                 :             :              end do
    2245                 :             :            end do
    2246                 :             : 
    2247                 :             :          end do
    2248                 :             : 
    2249                 :             : !        Sumrule start
    2250         [ +  + ]:         420 :          if (dabs(eig0_k(iband)-eig0_k(jband))>=tol10) then
    2251                 :             :            np_sum_k1=np_sum_k1 -dhdk2_g(iband,jband)&
    2252                 :         380 : &           *(diff_occ)/(eig0_k(iband)-eig0_k(jband))
    2253                 :             :          else
    2254                 :          20 :            np_sum_k2=np_sum_k2 - doccde_k(iband)*dhdk2_g(iband,jband)
    2255                 :             :          end if
    2256                 :             : 
    2257                 :             : 
    2258                 :             : !        end loop over band
    2259                 :             :        end do
    2260                 :          21 :        socc_k=socc_k+occ_k(iband)
    2261                 :             :      end do
    2262                 :             : 
    2263         [ +  + ]:         273 :      do iom=1,mom
    2264                 :         272 :        kin11(iom)=kin11(iom)+wtk(ikpt)*kin11_k(iom)
    2265                 :         272 :        kin12(iom)=kin12(iom)+wtk(ikpt)*kin12_k(iom)
    2266                 :         272 :        kin21(iom)=kin21(iom)+wtk(ikpt)*kin21_k(iom)
    2267                 :         272 :        kin22(iom)=kin22(iom)+wtk(ikpt)*kin22_k(iom)
    2268         [ +  + ]:        1089 :        do l1=1,3
    2269         [ +  + ]:        3536 :          do l2=1,3
    2270                 :        3264 :            cond_kg(iom,l1,l2)=cond_kg(iom,l1,l2)+wtk(ikpt)*cond_nd(iom,l1,l2)
    2271                 :             :          end do
    2272                 :             :        end do
    2273                 :             :      end do
    2274                 :             : 
    2275                 :           1 :      np_sum=np_sum + wtk(ikpt)*(np_sum_k1+np_sum_k2)
    2276                 :           1 :      socc=socc+wtk(ikpt)*socc_k
    2277                 :             : 
    2278                 :             : !    Validity limit
    2279                 :           1 :      deltae=deltae+(eig0_k(nband_k)-fermie)
    2280                 :             : 
    2281                 :           1 :      bd2tot_index=bd2tot_index+2*nband_k**2
    2282                 :           1 :      bdtot_index=bdtot_index+nband_k
    2283                 :           1 :      ABI_FREE(eig0_k)
    2284         [ -  + ]:           1 :      ABI_FREE(eig1_k)
    2285         [ -  + ]:           1 :      ABI_FREE(occ_k)
    2286         [ -  + ]:           1 :      ABI_FREE(doccde_k)
    2287         [ -  + ]:           1 :      ABI_FREE(dhdk2_r)
    2288         [ -  + ]:           2 :      ABI_FREE(dhdk2_g)
    2289                 :             : !    End loop over k
    2290                 :             :    end do
    2291                 :             : 
    2292                 :           1 :    write(std_out,'(a,3f10.5)')' sumrule           =',np_sum/socc/three,socc
    2293                 :             :    write(std_out,'(a,f10.5,a,f10.5,a)')&
    2294                 :           2 : &   ' Emax-Efermi       =',deltae/dble(nkpt),' Ha',deltae/dble(nkpt)*Ha_eV,' eV'
    2295                 :             : 
    2296                 :             : !End loop over spins
    2297                 :             :  end do
    2298                 :             : 
    2299   [ +  +  +  +  :        2461 :  cond_kg=cond_kg*two_pi*third/(dom*ucvol)*half/dsqrt(pi)
                   +  + ]
    2300                 :             : 
    2301                 :             : 
    2302                 :             : !Check that new output file does NOT exist
    2303                 :             : !Keep this line : prevent silly (compiler ?) bug on HP 8000
    2304                 :           1 :  write(std_out,*)' conducti : call isfile '
    2305                 :             : !
    2306         [ -  + ]:           1 :  if (open_file(trim(filnam_out)//'_tens',msg,newunit=tens_unt,form='formatted',action="write")/=0) then
    2307                 :           0 :    ABI_ERROR(msg)
    2308                 :             :  end if
    2309         [ -  + ]:           1 :  if (open_file(trim(filnam_out)//'_Lij',msg,newunit=lij_unt,form='formatted',action="write")/=0) then
    2310                 :           0 :    ABI_ERROR(msg)
    2311                 :             :  end if
    2312                 :           1 :  write(lij_unt,'(a)')' # omega(ua) L12 L21 L22 L22'
    2313                 :             : 
    2314         [ -  + ]:           1 :  if (open_file(trim(filnam_out)//'_sig',msg,newunit=sig_unt,form='formatted',action="write")/=0) then
    2315                 :           0 :    ABI_ERROR(msg)
    2316                 :             :  end if
    2317                 :           1 :  write(sig_unt,'(a)')' # omega(ua) hbar*omega(eV)    cond(ua)             cond(ohm.cm)-1'
    2318                 :             : 
    2319         [ -  + ]:           1 :  if (open_file(trim(filnam_out)//'_Kth',msg,newunit=kth_unt,form='formatted',action="write")/=0) then
    2320                 :           0 :    ABI_ERROR(msg)
    2321                 :             :  end if
    2322                 :             :  write(kth_unt,'(a)')&
    2323                 :           1 : & ' #omega(ua) hbar*omega(eV)  thermal cond(ua)   Kth(W/m/K)   thermopower(ua)   Stp(microohm/K)'
    2324                 :             : 
    2325         [ -  + ]:           1 :  if (open_file(trim(filnam_out)//'.out',msg,newunit=ocond_unt,form='formatted',action="write")/=0) then
    2326                 :           0 :    ABI_ERROR(msg)
    2327                 :             :  end if
    2328                 :           1 :  write(ocond_unt,'(a)' )' Conducti output file:'
    2329                 :           1 :  write(ocond_unt,'(a)' )' Contains all results produced by conducti utility'
    2330                 :           1 :  write(ocond_unt,'(a)' )' '
    2331                 :           1 :  write(ocond_unt,'(a)')' # omega(ua)       cond(ua)             thermal cond(ua)       thermopower(ua)'
    2332                 :             : 
    2333                 :             : !Keep this line : prevent silly (compiler ?) bug on HP 8000
    2334                 :           1 :  write(std_out,*)' conducti : after call isfile '
    2335                 :             : 
    2336                 :             : !Compute thermal conductivity and thermopower
    2337         [ +  + ]:         273 :  do iom=1,mom
    2338                 :         272 :    oml=oml1(iom)
    2339                 :         272 :    kin11(iom)=kin11(iom)*two_pi*third/(dom*ucvol)*half/dsqrt(pi)
    2340                 :         272 :    kin21(iom)=kin21(iom)*two_pi*third/(dom*ucvol)*half/dsqrt(pi)
    2341                 :         272 :    kin12(iom)=kin12(iom)*two_pi*third/(dom*ucvol)*half/dsqrt(pi)
    2342                 :         272 :    kin22(iom)=kin22(iom)*two_pi*third/(dom*ucvol)*half/dsqrt(pi)
    2343         [ +  + ]:         272 :    if (dabs(kin11(iom))<10.0d-20) kin11(iom)=zero
    2344                 :         272 :    Kth(iom)=kin22(iom)
    2345                 :         272 :    Stp(iom)=zero
    2346         [ +  + ]:         272 :    if(kin11(iom)/=zero)  then
    2347                 :         107 :      Kth(iom)=Kth(iom)-(kin12(iom)*kin21(iom)/kin11(iom))
    2348                 :         107 :      Stp(iom)=kin12(iom)/(kin11(iom)*Tatm)
    2349                 :             :    end if
    2350         [ +  + ]:         272 :    if (dabs(Kth(iom))<10.0d-20) Kth(iom)=zero
    2351         [ +  + ]:         272 :    if (dabs(Stp(iom))<10.0d-20) Stp(iom)=zero
    2352         [ +  + ]:         272 :    if (dabs(kin12(iom))<10.0d-20) kin12(iom)=zero
    2353         [ +  + ]:         272 :    if (dabs(kin21(iom))<10.0d-20) kin21(iom)=zero
    2354         [ +  + ]:         272 :    if (dabs(kin22(iom))<10.0d-20) kin22(iom)=zero
    2355                 :             : 
    2356                 :         272 :    write(lij_unt,'(f12.5,4es22.12)')oml,kin12(iom),kin21(iom),kin22(iom),kin22(iom)/Tatm*3.4057d9
    2357                 :         272 :    write(sig_unt,'(2f12.5,2es22.12)') oml,oml*Ha_eV,kin11(iom),kin11(iom)*Ohmcm
    2358                 :         272 :    write(kth_unt,'(2f12.5,4es22.12)') oml,oml*Ha_eV,Kth(iom),Kth(iom)*3.4057d9/Tatm,Stp(iom),Stp(iom)*3.6753d-2
    2359                 :         273 :    write(ocond_unt,'(1f12.5,3es22.12)') oml,kin11(iom),Kth(iom),Stp(iom)
    2360                 :             :  end do
    2361                 :             : 
    2362                 :           1 :  write(tens_unt,'(a)' )' Conductivity file '
    2363                 :           1 :  write(tens_unt,'(a)' )' ----------------- '
    2364                 :           1 :  write(tens_unt,'(a)' )' Contain first the full conductivity tensor, for the desired set of energies,'
    2365                 :           1 :  write(tens_unt,'(a)' )' then, the three principal values, for the desired set of energies'
    2366                 :           1 :  write(tens_unt,'(a)' )' (note that eigenvalues are not directly associated with xx,yy,zz)'
    2367                 :           1 :  write(tens_unt,'(a)' )' '
    2368                 :             : 
    2369                 :           1 :  write(ocond_unt,'(a)' )' '
    2370                 :           1 :  write(ocond_unt,'(a)' )' full conductivity tensor, for the desired set of energies'
    2371                 :           1 :  write(ocond_unt,'(a)' )' then, the three principal values, for the desired set of energies:'
    2372                 :             : 
    2373         [ +  + ]:         273 :  do iom=1,mom
    2374                 :         272 :    oml=oml1(iom)*Ha_eV
    2375                 :         272 :    write(tens_unt, '(a,es16.6,a)' ) ' energy (in eV) =',oml,', conductivity tensor (in Ohm.cm-1) follows :'
    2376                 :         272 :    write(ocond_unt, '(a,es16.6,a)' ) ' energy (in eV) =',oml,', conductivity tensor (in Ohm.cm-1) follows :'
    2377         [ +  + ]:        1089 :    do l1=1,3
    2378   [ +  -  +  + ]:        3264 :      write(tens_unt,"(3f25.15)") (cond_kg(iom,l1,l2)*Ohmcm,l2=1,3)
    2379   [ +  -  +  + ]:        3536 :      write(ocond_unt,"(3f25.15)") (cond_kg(iom,l1,l2)*Ohmcm,l2=1,3)
    2380                 :             :    end do
    2381                 :             :  end do
    2382                 :             : 
    2383                 :             : !Diagonalizing the conductivity matrix for sigma_xx,sigma_yy,sigma_zz
    2384         [ +  + ]:         273 :  cond_kg_xx=0d0
    2385         [ +  + ]:         273 :  cond_kg_yy=0d0
    2386         [ +  + ]:         273 :  cond_kg_zz=0d0
    2387                 :             : !trace=0d0 ! Used for checking with the original version of the code
    2388         [ +  + ]:         273 :  do iom=1,mom
    2389                 :         272 :    oml=oml1(iom)*Ha_eV
    2390                 :         272 :    cond_kg_w=0d0
    2391         [ +  + ]:        1088 :    do l1=1,3
    2392         [ +  + ]:        3536 :      do l2=1,3
    2393                 :        3264 :        cond_kg_w(l1,l2)=cond_kg(iom,l1,l2)
    2394                 :             :      end do
    2395                 :             :    end do
    2396                 :         272 :    call jacobi(cond_kg_w,3,3,eig_cond,z,nrot)
    2397                 :             : 
    2398                 :             : !  When the value is too small, set it to zero before printing
    2399         [ +  + ]:         272 :    if(abs(eig_cond(1))<tol10)eig_cond(1)=zero
    2400         [ +  + ]:         272 :    if(abs(eig_cond(2))<tol10)eig_cond(2)=zero
    2401         [ +  + ]:         272 :    if(abs(eig_cond(3))<tol10)eig_cond(3)=zero
    2402                 :             : 
    2403                 :         272 :    cond_kg_xx(iom)=eig_cond(1)
    2404                 :         272 :    cond_kg_yy(iom)=eig_cond(2)
    2405                 :         273 :    cond_kg_zz(iom)=eig_cond(3)
    2406                 :             : !  trace(iom)=cond_kg_xx(iom)+cond_kg_yy(iom)+cond_kg_zz(iom)
    2407                 :             :  end do
    2408                 :             : 
    2409                 :             : !DEBUG Keep this line : prevent silly (compiler ?) bug on HP 8000
    2410                 :             : !write(std_out,*)' conducti : after open '
    2411                 :             : !ENDDEBUG
    2412                 :             : 
    2413                 :           1 :  write(tens_unt,'(a,a)')ch10,' Now, print principal values of the conductivity tensor.'
    2414                 :           1 :  write(tens_unt,'(a)')' '
    2415                 :           1 :  write(tens_unt,'(a)')' #omega(ua)   cond_1(ua)     cond_2(ua) cond_3(ua)  cond_tot(ua)'
    2416                 :             : 
    2417                 :           1 :  write(ocond_unt,'(a)')' '
    2418                 :           1 :  write(ocond_unt,'(a,a)')ch10,' Now, print principal values of the conductivity tensor.'
    2419                 :           1 :  write(ocond_unt,'(a)')' '
    2420                 :           1 :  write(ocond_unt,'(a)')' #omega(ua)   cond_1(ua)     cond_2(ua) cond_3(ua)  cond_tot(ua)'
    2421                 :             : 
    2422                 :             : 
    2423         [ +  + ]:         273 :  do iom=1,mom
    2424                 :         272 :    cond_tot(iom)=cond_kg_xx(iom)+cond_kg_yy(iom)+cond_kg_zz(iom)
    2425                 :         272 :    write(tens_unt,'(f12.5,4es22.12)')oml1(iom),cond_kg_xx(iom),cond_kg_yy(iom),cond_kg_zz(iom),cond_tot(iom)
    2426                 :         273 :    write(ocond_unt,'(f12.5,4es22.12)')oml1(iom),cond_kg_xx(iom),cond_kg_yy(iom),cond_kg_zz(iom),cond_tot(iom)
    2427                 :             :  end do
    2428                 :             : 
    2429                 :           1 :  write(tens_unt,*)
    2430                 :           1 :  write(tens_unt,'(a)')' #hbar*omega(eV)    cond_1(ohm.cm)-1    cond_2(ohm.cm)-1    cond_3(ohm.cm)-1    cond_t(ohm.cm)-1'
    2431                 :           1 :  write(ocond_unt,*)
    2432                 :           1 :  write(ocond_unt,'(a)')' #hbar*omega(eV)    cond_1(ohm.cm)-1    cond_2(ohm.cm)-1    cond_3(ohm.cm)-1    cond_t(ohm.cm)-1'
    2433                 :             : 
    2434         [ +  + ]:         273 :  do iom=1,mom
    2435                 :         272 :    oml=oml1(iom)*Ha_eV
    2436                 :         272 :    cond_tot(iom)=cond_tot(iom)*Ohmcm
    2437                 :         272 :    cond_kg_xx(iom)=cond_kg_xx(iom)*Ohmcm
    2438                 :         272 :    cond_kg_yy(iom)=cond_kg_yy(iom)*Ohmcm
    2439                 :         272 :    cond_kg_zz(iom)=cond_kg_zz(iom)*Ohmcm
    2440                 :         272 :    write(tens_unt,'(f12.5,4es22.12)')oml,cond_kg_xx(iom),cond_kg_yy(iom),cond_kg_zz(iom),cond_tot(iom)
    2441                 :         273 :    write(ocond_unt,'(f12.5,4es22.12)')oml,cond_kg_xx(iom),cond_kg_yy(iom),cond_kg_zz(iom),cond_tot(iom)
    2442                 :             :  end do
    2443                 :             : 
    2444                 :             : !Calculate the imaginary part of the conductivity (principal value)
    2445                 :             : !+derived optical properties.
    2446                 :           1 :  call msig(kin11,mom,oml1,filnam_out,zero,0)
    2447                 :             : 
    2448                 :           1 :  close(tens_unt)
    2449                 :           1 :  close(lij_unt)
    2450                 :           1 :  close(sig_unt)
    2451                 :           1 :  close(kth_unt)
    2452                 :           1 :  close(ocond_unt)
    2453                 :             : 
    2454         [ -  + ]:           1 :  ABI_FREE(nband)
    2455         [ -  + ]:           1 :  ABI_FREE(oml1)
    2456         [ -  + ]:           1 :  ABI_FREE(occ)
    2457         [ -  + ]:           1 :  ABI_FREE(eigen11)
    2458         [ -  + ]:           1 :  ABI_FREE(eigen12)
    2459         [ -  + ]:           1 :  ABI_FREE(eigen13)
    2460         [ -  + ]:           1 :  ABI_FREE(eigen0)
    2461         [ -  + ]:           1 :  ABI_FREE(doccde)
    2462         [ -  + ]:           1 :  ABI_FREE(wtk)
    2463         [ -  + ]:           1 :  ABI_FREE(cond_nd)
    2464         [ -  + ]:           1 :  ABI_FREE(cond_kg)
    2465         [ -  + ]:           1 :  ABI_FREE(cond_kg_cart)
    2466         [ -  + ]:           1 :  ABI_FREE(cond_kg_xx)
    2467         [ -  + ]:           1 :  ABI_FREE(cond_kg_yy)
    2468         [ -  + ]:           1 :  ABI_FREE(trace)
    2469         [ -  + ]:           1 :  ABI_FREE(cond_kg_zz)
    2470         [ -  + ]:           1 :  ABI_FREE(cond_tot)
    2471         [ -  + ]:           1 :  ABI_FREE(kin11)
    2472         [ -  + ]:           1 :  ABI_FREE(kin22)
    2473         [ -  + ]:           1 :  ABI_FREE(kin12)
    2474         [ -  + ]:           1 :  ABI_FREE(kin21)
    2475         [ -  + ]:           1 :  ABI_FREE(kin11_k)
    2476         [ -  + ]:           1 :  ABI_FREE(kin22_k)
    2477         [ -  + ]:           1 :  ABI_FREE(kin12_k)
    2478         [ -  + ]:           1 :  ABI_FREE(kin21_k)
    2479         [ -  + ]:           1 :  ABI_FREE(Stp)
    2480         [ -  + ]:           1 :  ABI_FREE(Kth)
    2481                 :           1 :  call hdr%free()
    2482                 :             : 
    2483   [ -  +  -  +  :           5 :  end subroutine conducti_nc
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
             +  -  +  -  
                      + ]
    2484                 :             : !!***
    2485                 :             : 
    2486                 :             : !----------------------------------------------------------------------
    2487                 :             : 
    2488                 :             : !!****f* m_conducti/msig
    2489                 :             : !! NAME
    2490                 :             : !! msig
    2491                 :             : !!
    2492                 :             : !! FUNCTION
    2493                 :             : !! This program computes the elements of the optical frequency dependent
    2494                 :             : !! conductivity tensor and the conductivity along the three principal axes
    2495                 :             : !! from the Kubo-Greenwood formula for PAW formalism
    2496                 :             : !!
    2497                 :             : !! INPUTS
    2498                 :             : !!  fcti(npti)=  conductivity, as calculated in conducti
    2499                 :             : !!  npti= number of points to calculate conductivity
    2500                 :             : !!  xi(npti)= energies where the conductivity is calculated
    2501                 :             : !!
    2502                 :             : !! OUTPUT
    2503                 :             : !!   no output, only files
    2504                 :             : !!
    2505                 :             : !! NOTES
    2506                 :             : !!     this program calculates the imaginary part of the conductivity (principal value)
    2507                 :             : !!     +derived optical properties.
    2508                 :             : !!
    2509                 :             : !! SOURCE
    2510                 :             : 
    2511                 :           3 : subroutine msig(fcti,npti,xi,filnam_out_sig,phi,au_units)
    2512                 :             : 
    2513                 :             : !Arguments -----------------------------------
    2514                 :             : !scalars
    2515                 :             :  integer,intent(in) :: npti, au_units
    2516                 :             : !arrays
    2517                 :             :  real(dp),intent(in) :: fcti(npti),xi(npti)
    2518                 :             :  character(len=fnlen),intent(in) :: filnam_out_sig
    2519                 :             :  real(dp),intent(in) :: phi
    2520                 :             : 
    2521                 :             : !Local variables-------------------------------
    2522                 :             : !scalars
    2523                 :             :  integer :: ii,ip,eps_unt,abs_unt
    2524                 :             :  real(dp),parameter :: del=0.001_dp
    2525                 :             :  real(dp) :: dx,eps1,eps2,komega,pole,refl_s,refl_p,sigma2,xsum,ff,ffp,ffpp,abso,sigma1
    2526                 :             :  character(len=500) :: msg
    2527                 :             : !arrays
    2528                 :           3 :  real(dp),allocatable :: fct(:)
    2529                 :             :  real(dp) :: xx1,xx2,xx,nomega
    2530                 :             :  complex(dp) :: epsc,cos_phi,sin_phi,sqroot,crefl_s,crefl_p
    2531                 :             : ! *********************************************************************************
    2532                 :             : 
    2533                 :             : 
    2534                 :           3 :  write(std_out,'(2a)')ch10,'Calculate the principal value and related optical properties'
    2535                 :           3 :  write(std_out,'(a)')'Use default value for delta interval: del=1e-3'
    2536                 :             : 
    2537         [ -  + ]:           3 :  if (open_file(trim(filnam_out_sig)//'_eps',msg,newunit=eps_unt,status='replace',action="write")/=0) then
    2538                 :           0 :    ABI_ERROR(msg)
    2539                 :             :  end if
    2540         [ +  - ]:           3 :  if(au_units==0) then
    2541                 :           3 :    write(eps_unt,'(a)')'#energy (eV),sigma_1(Ohm-1cm-1),sigma_2(Ohm-1cm-1),epsilon_1(cgs),epsilon_2(cgs)'
    2542                 :             :  else
    2543                 :           0 :    write(eps_unt,'(a)')'#energy (Ha),sigma_1(au),sigma_2(au),epsilon_1(au),epsilon_2(au)'
    2544                 :             :  endif
    2545                 :             : 
    2546         [ -  + ]:           3 :  if (open_file(trim(filnam_out_sig)//'_abs',msg,newunit=abs_unt,status='replace',action="write")/=0) then
    2547                 :           0 :    ABI_ERROR(msg)
    2548                 :             :  end if
    2549         [ +  - ]:           3 :  if(au_units==0) then
    2550                 :           3 :    write(abs_unt,'(a)')'#energy(eV),nomega,komega,refl. s,refl. p,abso.(cm-1)'
    2551                 :             :  else
    2552                 :           0 :    write(abs_unt,'(a)')'#energy(Ha),nomega,komega,refl. s,refl. p,abso.(au)'
    2553                 :             :  endif
    2554                 :             : 
    2555   [ -  +  +  -  :           9 :  ABI_MALLOC(fct,(npti))
          +  -  +  -  -  
                +  -  + ]
    2556                 :             : 
    2557                 :             : !loop on the initial energy grid
    2558         [ +  + ]:        2275 :  do ip=1,npti
    2559                 :             :    !!! Taylor expansion up to second order of fcti at xx=xi(ii) for each ii
    2560                 :             :    !!! Then, in each discretization interval, the integral can be performed analytically
    2561                 :        2272 :    pole=xi(ip)
    2562                 :        2272 :    dx=(xi(npti)-xi(1))/dble(npti-1)
    2563                 :        2272 :    xsum=zero
    2564         [ +  + ]:     2076256 :    do ii=1,npti
    2565                 :     2073984 :      xx=xi(ii)
    2566                 :     2076256 :      fct(ii)=fcti(ii)*pole/(xx+pole)
    2567                 :             :    enddo
    2568         [ +  + ]:     2076256 :    do ii=1,npti
    2569                 :     2073984 :      xx=xi(ii)
    2570                 :     2073984 :      ff=fct(ii)
    2571                 :     2073984 :      ffp=zero
    2572                 :     2073984 :      ffpp=zero
    2573         [ +  + ]:     2073984 :      if(ii<=npti-3) then
    2574                 :     2067168 :        ffp=(four*fct(ii+1)-three*fct(ii)-fct(ii+2))/dx/two
    2575                 :             :        ffpp=(-fct(ii+3)+four*fct(ii+2)-five*fct(ii+1)+&
    2576                 :     2067168 : &          two*fct(ii))/dx/dx
    2577                 :             :      endif
    2578                 :     2073984 :      xx2=xx+half*dx
    2579                 :     2073984 :      xx1=zero
    2580         [ +  + ]:     2073984 :      if(ii>1) xx1=xx-half*dx
    2581                 :             :      xsum=xsum+ff*log(abs((xx2-pole)/(xx1-pole)))+ffp*(xx2-xx1+(pole-xx)*log(abs((xx2-pole)/(xx1-pole))))+&
    2582                 :     2076256 : & half*ffpp*((xx-pole)**2*log(abs((xx2-pole)/(xx1-pole)))+(xx2**2-xx1**2+(two*pole-four*xx)*(xx2-xx1))/two)
    2583                 :             :    enddo
    2584         [ +  + ]:        2272 :    if(pole<tol3) xsum=zero
    2585                 :             : 
    2586                 :             : !  Calculate the derivated optical quantities and output the value
    2587                 :        2272 :    sigma2=(-two/pi)*xsum
    2588                 :        2272 :    eps1=one-(four_pi*sigma2/(pole))
    2589                 :        2272 :    eps2=four*fcti(ip)*pi/(pole)
    2590                 :             : 
    2591                 :             : !  A special treatment of the case where eps2 is very small compared to eps1 is needed
    2592         [ +  + ]:        2272 :    if(eps2**2 > eps1**2 * tol12)then
    2593                 :        1172 :      nomega=sqrt(half*(eps1 + sqrt(eps1**2 + eps2**2)))
    2594                 :        1172 :      komega=sqrt(half*(-eps1 + sqrt(eps1**2 + eps2**2)))
    2595                 :        1172 :      abso=four_pi*fcti(ip)/(nomega*Speed_Light)
    2596         [ +  + ]:        1100 :    else if(eps1>zero)then
    2597                 :         921 :      nomega=sqrt(half*(eps1 + sqrt(eps1**2 + eps2**2)))
    2598                 :         921 :      komega=half*abs(eps2/sqrt(eps1))
    2599                 :         921 :      abso=four_pi*fcti(ip)/(nomega*Speed_Light)
    2600         [ +  - ]:         179 :    else if(eps1<zero)then
    2601                 :         179 :      nomega=half*abs(eps2/sqrt(-eps1))
    2602                 :         179 :      komega=sqrt(half*(-eps1 + sqrt(eps1**2 + eps2**2)))
    2603                 :         179 :      abso=two*sqrt(-eps1)*pole/(Speed_Light)
    2604                 :             :    end if
    2605                 :             : 
    2606                 :        2272 :    epsc=cmplx(eps1,eps2,kind=dp)
    2607                 :        2272 :    cos_phi=cmplx(cos(phi),kind=dp)
    2608                 :        2272 :    sin_phi=cmplx(sin(phi),kind=dp)
    2609                 :        2272 :    sqroot=sqrt(epsc-sin_phi*sin_phi)
    2610                 :        2272 :    crefl_s=(cos_phi-sqroot)/(cos_phi+sqroot)
    2611                 :        2272 :    crefl_p=(epsc*cos_phi-sqroot)/(epsc*cos_phi+sqroot)
    2612                 :             : 
    2613                 :        2272 :    refl_s=real(crefl_s*conjg(crefl_s))
    2614                 :        2272 :    refl_p=real(crefl_p*conjg(crefl_p))
    2615                 :             : 
    2616                 :        2272 :    sigma1=fcti(ip)
    2617         [ +  - ]:        2272 :    if(au_units==0) then
    2618                 :        2272 :      pole=pole*Ha_eV
    2619                 :        2272 :      sigma1=sigma1*Ohmcm
    2620                 :        2272 :      sigma2=sigma2*Ohmcm
    2621                 :        2272 :      abso=abso*Ohmcm*Speed_Light/(Speed_Light_SI*four_pi*eps0)
    2622                 :             :    endif
    2623                 :        2272 :    write(eps_unt,'(5e18.10)') pole,sigma1,sigma2,eps1,eps2
    2624                 :        2275 :    write(abs_unt,'(6e18.10)') pole,nomega,komega,refl_s,refl_p,abso
    2625                 :             : 
    2626                 :             :  end do
    2627                 :             : 
    2628                 :           3 :  close(eps_unt)
    2629                 :           3 :  close(abs_unt)
    2630                 :             : 
    2631         [ -  + ]:           3 :  ABI_FREE(fct)
    2632                 :             : 
    2633                 :           3 : end subroutine msig
    2634                 :             : !!***
    2635                 :             : 
    2636                 :             : end module m_conducti
    2637                 :             : !!***
        

Generated by: LCOV version 2.3-1