LCOV - code coverage report
Current view: top level - src/71_bse - m_hexc.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 86.4 % 469 405
Test Date: 2026-11-11 12:21:01 Functions: 66.7 % 15 10
Branches: 53.9 % 1092 589

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_hexc
       2                 :             : !! NAME
       3                 :             : !! m_hexc
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !! Module for excitonic hamiltonian for Haydock
       7                 :             : !!
       8                 :             : !! COPYRIGHT
       9                 :             : !!  Copyright (C) 2014-2026 ABINIT group (M.Giantomassi, Y. Gillet)
      10                 :             : !!  This file is distributed under the terms of the
      11                 :             : !!  GNU General Public License, see ~abinit/COPYING
      12                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
      13                 :             : !!
      14                 :             : !! SOURCE
      15                 :             : 
      16                 :             : #if defined HAVE_CONFIG_H
      17                 :             : #include "config.h"
      18                 :             : #endif
      19                 :             : 
      20                 :             : #include "abi_common.h"
      21                 :             : 
      22                 :             : MODULE m_hexc
      23                 :             : 
      24                 :             :  use defs_basis
      25                 :             :  use m_abicore
      26                 :             :  use m_bs_defs
      27                 :             :  use m_xmpi
      28                 :             :  use m_errors
      29                 :             :  use m_haydock_io
      30                 :             :  use m_linalg_interfaces
      31                 :             :  use netcdf
      32                 :             :  use m_nctk
      33                 :             : 
      34                 :             :  use m_time,              only : timab
      35                 :             :  use m_fstrings,          only : indent, strcat, sjoin, itoa
      36                 :             :  use defs_datatypes,      only : pseudopotential_type
      37                 :             :  use m_hide_blas,         only : xdotc, xgemv
      38                 :             :  use m_numeric_tools,     only : print_arr, symmetrize, hermitianize, wrap2_pmhalf
      39                 :             :  use m_crystal,           only : crystal_t
      40                 :             :  use m_bz_mesh,           only : kmesh_t, findqg0
      41                 :             :  use m_double_grid,       only : double_grid_t, get_kpt_from_indices_coarse, compute_corresp
      42                 :             :  use m_wfd,               only : wfdgw_t
      43                 :             :  use m_bse_io,            only : exc_read_rcblock, exc_write_optme, exc_ham_ncwrite
      44                 :             :  use m_pawtab,            only : pawtab_type
      45                 :             :  use m_vcoul,             only : vcoul_t
      46                 :             :  use m_bseinterp,         only : interpolator_t
      47                 :             :  use m_ebands,            only : ebands_t
      48                 :             : 
      49                 :             :  implicit none
      50                 :             : 
      51                 :             :  private
      52                 :             : !!***
      53                 :             : 
      54                 :             : !!****t* m_haydock/hexc_t
      55                 :             : !! NAME
      56                 :             : !! hexc_t
      57                 :             : !!
      58                 :             : !! FUNCTION
      59                 :             : !!  Store the excitonic hamiltonian and other related information
      60                 :             : !!
      61                 :             : !! SOURCE
      62                 :             : 
      63                 :             :  type, public :: hexc_t
      64                 :             : 
      65                 :             :    !scalars
      66                 :             :    integer :: comm
      67                 :             :    ! MPI communicator
      68                 :             : 
      69                 :             :    integer :: hsize_coarse
      70                 :             :    ! Size of the coarse hamiltonian
      71                 :             : 
      72                 :             :    integer :: hsize
      73                 :             :    ! Size of the hamiltonian and the kets
      74                 :             :    ! (= hsize_coarse without interpolation, = hsize_dense with interpolation)
      75                 :             : 
      76                 :             :    integer :: nbz
      77                 :             :    ! Number of kpoints for the full problem
      78                 :             :    ! (= nbz_coarse without interpolation, = nbz_dense with interpolation)
      79                 :             : 
      80                 :             :    integer :: my_t1
      81                 :             :    ! Lower limit of MPI paral
      82                 :             : 
      83                 :             :    integer :: my_t2
      84                 :             :    ! Upper limit of MPI paral
      85                 :             : 
      86                 :             :    integer :: my_nt
      87                 :             :    ! Number of transitions treat by node
      88                 :             :    ! = my_t2 - my_t1 + 1
      89                 :             : 
      90                 :             :    integer :: nbnd_coarse
      91                 :             :    ! Product of number of bands conduction X valence
      92                 :             : 
      93                 :             :    ! Pointers to data that are already in memory
      94                 :             :    type(excparam),pointer :: bsp => null()
      95                 :             :    ! parameters for BS
      96                 :             : 
      97                 :             :    type(excfiles),pointer :: bs_files => null()
      98                 :             :    ! files for BSE
      99                 :             : 
     100                 :             :    type(crystal_t),pointer :: crystal => null()
     101                 :             :    ! crystal info
     102                 :             : 
     103                 :             :    type(kmesh_t),pointer :: kmesh_coarse => null()
     104                 :             :    ! kmesh of the coarse mesh
     105                 :             : 
     106                 :             :    type(kmesh_t),pointer :: kmesh => null()
     107                 :             :    ! kmesh of the full problem
     108                 :             : 
     109                 :             :    type(ebands_t),pointer :: ks_bst => null()
     110                 :             :    type(ebands_t),pointer :: qp_bst => null()
     111                 :             :    ! band structures of the full problem
     112                 :             : 
     113                 :             :    type(wfdgw_t),pointer :: wfd_coarse => null()
     114                 :             :    ! Wfd of the coarse problem
     115                 :             : 
     116                 :             :    type(wfdgw_t),pointer :: wfd => null()
     117                 :             :    ! wfd of the full problem
     118                 :             : 
     119                 :             :    !arrays
     120                 :             :    complex(dp),allocatable :: hreso(:,:)
     121                 :             :    ! Resonant part of the hamiltonian
     122                 :             : 
     123                 :             :    complex(dp),allocatable :: hcoup(:,:)
     124                 :             :    ! Coupling part of the hamiltonian
     125                 :             : 
     126                 :             :    complex(dp),allocatable :: diag_coarse(:)
     127                 :             :    ! Diagonal part of the hamiltonian with transition energies
     128                 :             : 
     129                 :             :  contains
     130                 :             :    procedure :: init => hexc_init           ! Construct the object
     131                 :             :    procedure :: free => hexc_free           ! Free memory
     132                 :             :    procedure :: build_hinterp => hexc_build_hinterp  ! Interpolate the Hamiltonian and store it in memory
     133                 :             :    procedure :: matmul_tda => hexc_matmul_tda     ! Matrix-vector multiplication (TDA)
     134                 :             :    procedure :: matmul_full => hexc_matmul_full    ! Matrix-vector multiplication (TDA + Coupling)
     135                 :             :    procedure :: matmul_elphon => hexc_matmul_elphon  ! Matrix-vector multiplication (TDA + elphon)
     136                 :             :  end type hexc_t
     137                 :             : !!***
     138                 :             : 
     139                 :             : !----------------------------------------------------------------------
     140                 :             : 
     141                 :             : !!****t* m_hexc/hexc_interp_t
     142                 :             : !! NAME
     143                 :             : !! hexc_interp_t
     144                 :             : !!
     145                 :             : !! FUNCTION
     146                 :             : !!  Store information about interpolation of excitonic hamiltonian
     147                 :             : !!
     148                 :             : !! SOURCE
     149                 :             : 
     150                 :             :  type,public :: hexc_interp_t
     151                 :             : 
     152                 :             :    !scalars
     153                 :             :    integer :: hsize_dense
     154                 :             :    ! Size of the dense hamiltonian
     155                 :             : 
     156                 :             :    real(dp) :: m3_width
     157                 :             :    ! Width of the region where M3 is applied instead of M1
     158                 :             : 
     159                 :             :    type(interpolator_t) :: interpolator
     160                 :             :    ! Interpolator containing overlaps and interpolation info
     161                 :             : 
     162                 :             :    ! Pointers to datatypes that are already in memory
     163                 :             :    type(kmesh_t),pointer :: kmesh_dense => null()
     164                 :             :    ! kmesh of the dense mesh
     165                 :             : 
     166                 :             :    type(vcoul_t),pointer :: vcp_dense => null()
     167                 :             :    ! coulomb interaction on the dense mesh
     168                 :             : 
     169                 :             :    !arrays
     170                 :             :    integer,allocatable :: kdense2div(:)
     171                 :             :    ! kdense2div(nbz_dense)
     172                 :             :    ! Index of kpoint -> Index of division
     173                 :             : 
     174                 :             :    integer,allocatable :: div2kdense(:,:)
     175                 :             :    ! div2kdense(nbz_coarse,ndiv)
     176                 :             :    ! Index of kpoint coarse + Index of division -> Index of kdense
     177                 :             : 
     178                 :             :    complex(dp),allocatable :: diag_dense(:)
     179                 :             :    ! diag_dense(hsize_dense)
     180                 :             :    ! Diagonal part of the dense hamiltonian
     181                 :             : 
     182                 :             :    complex(dp),allocatable :: hinterp(:,:)
     183                 :             :    ! hinterp(hsize_dense,hsize_dense)
     184                 :             :    ! Interpolated hamiltonian
     185                 :             : 
     186                 :             :    complex(dp),allocatable :: all_hmat(:,:)
     187                 :             :    ! all_hmat,(hsize,hsize))
     188                 :             :    ! Coarse excitonic matrix in a format suitable for interpolation in k-space
     189                 :             : 
     190                 :             :    complex(dp),allocatable :: all_acoeffs(:,:)
     191                 :             :    ! all_acoeffs(hsize,hsize))
     192                 :             :    ! a coefficients in a format suitable for interpolation in k-space
     193                 :             : 
     194                 :             :    complex(dp),allocatable :: all_bcoeffs(:,:)
     195                 :             :    ! all_bcoeffs(hsize,hsize))
     196                 :             :    ! b coefficients in a format suitable for interpolation in k-space
     197                 :             : 
     198                 :             :    complex(dp),allocatable :: all_ccoeffs(:,:)
     199                 :             :    ! all_ccoeffs(hsize,hsize))
     200                 :             :    ! c coefficients in a format suitable for interpolation in k-space
     201                 :             : 
     202                 :             :  contains
     203                 :             :    procedure :: init => hexc_interp_init    ! Construct the object for interpolated ham
     204                 :             :    procedure :: free => hexc_interp_free    ! Free memory for interpolated ham
     205                 :             :  end type hexc_interp_t
     206                 :             : !!***
     207                 :             : 
     208                 :             : !----------------------------------------------------------------------
     209                 :             : 
     210                 :             : CONTAINS  !=======================================================================
     211                 :             : !!***
     212                 :             : 
     213                 :             : !!****f* m_hexc/hexc_init
     214                 :             : !! NAME
     215                 :             : !! hexc_init
     216                 :             : !!
     217                 :             : !! FUNCTION
     218                 :             : !! Construct the hexc object
     219                 :             : !!
     220                 :             : !! INPUTS
     221                 :             : !! BSp<excparam>=Parameters of BS
     222                 :             : !! BS_files<excparam>=Files for BS
     223                 :             : !! Cryst<crystal_t>=Info on the crystalline structure
     224                 :             : !! Kmesh_coarse<kmesh_t>=Kmesh info
     225                 :             : !! Wfd_coarse<wfdgw_t>=Wavefunction descriptor
     226                 :             : !! KS_BSt<ebands_t>=Kohn-Sham band structure
     227                 :             : !! QP_BSt<ebands_t>=Quasi-Particle band structure
     228                 :             : !! comm=communicator
     229                 :             : !!
     230                 :             : !! OUTPUT
     231                 :             : !! hexc<hexc_t>=Excitonic Hamiltonian
     232                 :             : !!
     233                 :             : !! SOURCE
     234                 :             : 
     235                 :          23 : subroutine hexc_init(hexc, BSp, BS_files, Cryst, Kmesh_coarse, Wfd_coarse, KS_BSt, QP_BSt, comm)
     236                 :             : 
     237                 :             : !Arguments ---------------------------
     238                 :             : !scalars
     239                 :             :  class(hexc_t),intent(inout) :: hexc
     240                 :             :  integer,intent(in) :: comm
     241                 :             :  type(excparam),intent(in),target :: BSp
     242                 :             :  type(excfiles),intent(in),target :: BS_files
     243                 :             :  type(crystal_t),intent(in),target :: Cryst
     244                 :             :  type(kmesh_t),intent(in),target :: Kmesh_coarse
     245                 :             :  type(wfdgw_t),intent(in),target :: Wfd_coarse
     246                 :             :  type(ebands_t),intent(in),target :: KS_BSt, QP_BSt
     247                 :             : 
     248                 :             : !Local variables ---------------------
     249                 :             : !scalars
     250                 :             :  integer :: ierr,ncid,ncerr, max_r, max_c, hsize, spin, spad, itt ! For diagonal !
     251                 :             :  logical :: is_resonant, diago_is_real, use_mpio=.FALSE.
     252                 :             :  character(len=fnlen) :: hreso_fname, hcoup_fname
     253                 :             :  !character(len=500) :: msg
     254                 :             : !arrays
     255                 :          23 :  complex(dp),allocatable :: test(:,:)
     256                 :             : !*****************************************************************************
     257                 :             : 
     258                 :          23 :  hexc%bsp => BSp
     259                 :          23 :  hexc%bs_files => BS_files
     260                 :          23 :  hexc%crystal => Cryst
     261                 :          23 :  hexc%kmesh_coarse => Kmesh_coarse
     262                 :             : 
     263                 :          23 :  hexc%comm = comm
     264         [ +  + ]:          46 :  hsize = SUM(BSp%nreh)
     265                 :             : 
     266                 :          23 :  hexc%ks_bst => KS_BSt
     267                 :          23 :  hexc%qp_bst => QP_BSt
     268                 :          23 :  hexc%wfd => Wfd_coarse
     269                 :          23 :  hexc%wfd_coarse => Wfd_coarse
     270                 :          23 :  hexc%kmesh => Kmesh_coarse
     271                 :          23 :  hexc%hsize_coarse = hsize
     272                 :          23 :  hexc%hsize = hsize
     273                 :          23 :  hexc%nbz = Kmesh_coarse%nbz
     274                 :             : 
     275                 :          23 :  hexc%nbnd_coarse = BSp%maxnbndv*BSp%maxnbndc
     276                 :             : 
     277                 :             :  ! Divide the columns of the Hamiltonian among the nodes.
     278                 :          23 :  call xmpi_split_work(hsize,comm,hexc%my_t1,hexc%my_t2)
     279                 :             : 
     280                 :          23 :  hexc%my_nt = hexc%my_t2 - hexc%my_t1 + 1
     281         [ -  + ]:          23 :  ABI_CHECK(hexc%my_nt>0,"found processor with 0 rows")
     282                 :             : 
     283   [ -  +  +  -  :          92 :  ABI_MALLOC_OR_DIE(hexc%hreso,(hsize,hexc%my_t1:hexc%my_t2), ierr)
          -  +  +  -  +  
          -  +  -  +  -  
          +  -  -  +  +  
                -  -  + ]
     284                 :             : 
     285                 :             :  ! Read the resonant block from file.
     286         [ +  + ]:          23 :  if (BS_files%in_hreso /= BSE_NOFILE) then
     287                 :           5 :    hreso_fname = BS_files%in_hreso
     288                 :             :  else
     289                 :          18 :    hreso_fname = BS_files%out_hreso
     290                 :             :  end if
     291                 :             : 
     292                 :          23 :  is_resonant=.TRUE.; diago_is_real=(.not.BSp%have_complex_ene)
     293                 :             :  call exc_read_rcblock(hreso_fname,Bsp,is_resonant,diago_is_real,BSp%nsppol,BSp%nreh,hsize,&
     294                 :          23 : &   hexc%my_t1,hexc%my_t2,hexc%hreso,use_mpio,comm)
     295                 :             : 
     296                 :             :  !BEGIN DEBUG
     297         [ -  + ]:          23 :  if (use_mpio) then
     298                 :           0 :    ABI_WARNING("Testing MPI-IO routines")
     299   [ #  #  #  #  :           0 :    ABI_MALLOC_OR_DIE(test,(hsize,hexc%my_t1:hexc%my_t2), ierr)
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
     300                 :           0 :    diago_is_real=(.not.BSp%have_complex_ene)
     301                 :             :    call exc_read_rcblock(hreso_fname,Bsp,is_resonant,diago_is_real,Bsp%nsppol,Bsp%nreh,hsize,&
     302                 :           0 :                          hexc%my_t1,hexc%my_t2,test,.FALSE.,comm)
     303   [ #  #  #  #  :           0 :    test = test-hexc%hreso
                   #  # ]
     304   [ #  #  #  #  :           0 :    write(std_out,*)"DEBUG: Diff MPI-IO - Fortran ",MAXVAL(ABS(test))
          #  #  #  #  #  
                #  #  # ]
     305                 :           0 :    max_r=20; max_c=10
     306                 :           0 :    write(std_out,*)" **** Testing resonant block **** "
     307         [ #  # ]:           0 :    call print_arr([std_out], test,max_r=max_r,max_c=max_c)
     308         [ #  # ]:           0 :    if (BSp%nsppol==2) then
     309                 :           0 :      write(std_out,*)" **** D down down ****"
     310         [ #  # ]:           0 :      call print_arr([std_out], test(hsize/2+1:,hsize/2+1:),max_r=max_r,max_c=max_c)
     311                 :           0 :      write(std_out,*)" **** V up down ****"
     312         [ #  # ]:           0 :      call print_arr([std_out], test(1:hsize/2,hsize/2+1:),max_r=max_r,max_c=max_c)
     313                 :           0 :      write(std_out,*)" **** V down up ****"
     314         [ #  # ]:           0 :      call print_arr([std_out], test(hsize/2+1:,1:hsize/2),max_r=max_r,max_c=max_c)
     315                 :             :    end if
     316         [ #  # ]:           0 :    ABI_FREE(test)
     317                 :             :  end if
     318                 :             :  !END DEBUG
     319                 :             : 
     320                 :             :  !
     321                 :             :  ! Read coupling block.
     322         [ -  + ]:          23 :  if (BSp%use_coupling>0) then
     323         [ #  # ]:           0 :    ABI_CHECK(.not. Bsp%use_interp,"interpolation with coupling not coded!")
     324         [ #  # ]:           0 :    if (BS_files%in_hcoup /= BSE_NOFILE) then
     325                 :           0 :      hcoup_fname = BS_files%in_hcoup
     326                 :             :    else
     327                 :           0 :      hcoup_fname = BS_files%out_hcoup
     328                 :             :    end if
     329                 :             : 
     330   [ #  #  #  #  :           0 :    ABI_MALLOC_OR_DIE(hexc%hcoup,(hsize,hexc%my_t1:hexc%my_t2), ierr)
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
     331                 :           0 :    is_resonant=.FALSE.; diago_is_real=.FALSE.
     332                 :             :    call exc_read_rcblock(hcoup_fname,Bsp,is_resonant,diago_is_real,BSp%nsppol,BSp%nreh,hsize,&
     333                 :           0 :                          hexc%my_t1,hexc%my_t2,hexc%hcoup,use_mpio,comm)
     334                 :             :    !call symmetrize(hcoup,"ALL")
     335                 :             : 
     336         [ #  # ]:           0 :    if (use_mpio) then
     337                 :           0 :      ABI_WARNING("Testing MPI-IO routines")
     338   [ #  #  #  #  :           0 :      ABI_MALLOC_OR_DIE(test,(hsize,hexc%my_t1:hexc%my_t2), ierr)
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
     339                 :           0 :      diago_is_real=.FALSE.
     340                 :           0 :      call exc_read_rcblock(hcoup_fname,Bsp,is_resonant,diago_is_real,BSp%nsppol,Bsp%nreh,hsize,hexc%my_t1,hexc%my_t2,test,.FALSE.,comm)
     341   [ #  #  #  #  :           0 :      test = test-hexc%hcoup
                   #  # ]
     342   [ #  #  #  #  :           0 :      write(std_out,*)"DEBUG: Diff MPI-IO - Fortran ",MAXVAL(ABS(test))
          #  #  #  #  #  
                #  #  # ]
     343                 :           0 :      max_r=20; max_c=10
     344                 :           0 :      write(std_out,*)" **** Testing coupling block **** "
     345         [ #  # ]:           0 :      call print_arr([std_out], test,max_r=max_r,max_c=max_c)
     346         [ #  # ]:           0 :      if (BSp%nsppol==2) then
     347                 :           0 :        write(std_out,*)" **** D down down ****"
     348         [ #  # ]:           0 :        call print_arr([std_out], test(hsize/2+1:,hsize/2+1:),max_r=max_r,max_c=max_c)
     349                 :           0 :        write(std_out,*)" **** V up down ****"
     350         [ #  # ]:           0 :        call print_arr([std_out], test(1:hsize/2,hsize/2+1:),max_r=max_r,max_c=max_c)
     351                 :           0 :        write(std_out,*)" **** V down up ****"
     352         [ #  # ]:           0 :        call print_arr([std_out], test(hsize/2+1:,1:hsize/2),max_r=max_r,max_c=max_c)
     353                 :             :      end if
     354         [ #  # ]:           0 :      ABI_FREE(test)
     355                 :             :    end if
     356                 :             :  end if
     357                 :             : 
     358   [ +  -  +  + ]:          23 :  if(BSp%prt_ncham .or. BSp%use_interp) then
     359                 :             :    ! I want to store the diagonal part for future use (printing or interpolation) !
     360   [ -  +  +  -  :          12 :    ABI_MALLOC(hexc%diag_coarse,(hexc%hsize_coarse))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     361                 :           4 :    spad=0
     362         [ +  + ]:           8 :    do spin=1,BSp%nsppol
     363         [ -  + ]:           4 :      if(spin==2) spad=BSp%nreh(1)
     364         [ +  + ]:         392 :      do itt=1,BSp%nreh(spin) ! 1 is for spin 1
     365                 :         388 :        hexc%diag_coarse(spad+itt) = Bsp%Trans(itt,spin)%en
     366                 :             :      end do
     367                 :             :    end do
     368                 :             : 
     369         [ -  + ]:           4 :    if (BSp%prt_ncham) then
     370                 :           0 :      ncerr = nctk_open_create(ncid, trim(hexc%BS_files%out_basename)//"_HEXC.nc", xmpi_comm_self)
     371         [ #  # ]:           0 :      NCF_CHECK_MSG(ncerr, "Creating HEXC file")
     372                 :             :      call exc_ham_ncwrite(ncid, hexc%Kmesh_coarse, hexc%BSp, hexc%hsize_coarse, hexc%BSp%nreh, &
     373                 :           0 : &         hexc%BSp%vcks2t,hexc%hreso,hexc%diag_coarse)
     374         [ #  # ]:           0 :      NCF_CHECK(nf90_close(ncid))
     375                 :             :    end if
     376                 :             :  end if
     377                 :             : 
     378         [ -  + ]:          23 : end subroutine hexc_init
     379                 :             : !!***
     380                 :             : 
     381                 :             : !-------------------------------------------------------------------
     382                 :             : 
     383                 :             : !!****f* m_hexc/hexc_interp_init
     384                 :             : !! NAME
     385                 :             : !! hexc_interp_init
     386                 :             : !!
     387                 :             : !! FUNCTION
     388                 :             : !! Construct the hexc_interp object
     389                 :             : !!
     390                 :             : !! INPUTS
     391                 :             : !! hexc<hexc_t>=Excitonic hamiltonian
     392                 :             : !! Kmesh_dense<kmesh_t>=Kmesh info
     393                 :             : !! Vcp_dense<vcoul_t>=Dense mesh info about coulomb
     394                 :             : !! double_grid<double_grid_t>=Link between dense and coarse mesh
     395                 :             : !! Wfd_dense<wfdgw_t>=Wavefunction descriptor
     396                 :             : !! KS_BSt_dense<ebands_t>=Kohn-Sham band structure
     397                 :             : !! QP_BSt_dense<ebands_t>=Quasi-Particle band structure
     398                 :             : !! Psps <type(pseudopotential_type)>=variables related to pseudopotentials.
     399                 :             : !! Pawtab(Cryst%ntypat*usepaw)<pawtab_type>=PAW tabulated starting data.
     400                 :             : !! comm=communicator
     401                 :             : !!
     402                 :             : !! OUTPUT
     403                 :             : !! hexc_i<hexc_interp_t>=Interpolated excitonic hamiltonian
     404                 :             : !!
     405                 :             : !! SIDE EFFECTS
     406                 :             : !! hexc
     407                 :             : !!   Will be modified so that the size of the problem is full interpolated hamiltonian
     408                 :             : !! Wfd, Wfd_dense
     409                 :             : !!   The memory might be modified by computing wavefunctions
     410                 :             : !!
     411                 :             : !! SOURCE
     412                 :             : 
     413                 :           4 : subroutine hexc_interp_init(hexc_i, hexc, m3_width, method, Kmesh_dense, Vcp_dense, &
     414                 :           4 :                             double_grid, Wfd_dense, KS_BSt_dense, QP_BSt_dense, Psps, Pawtab)
     415                 :             : 
     416                 :             : !Arguments ---------------------------
     417                 :             : !scalars
     418                 :             :  class(hexc_interp_t),intent(inout) :: hexc_i
     419                 :             :  integer,intent(in) :: method
     420                 :             :  real(dp),intent(in) :: m3_width
     421                 :             :  type(hexc_t),intent(inout) :: hexc
     422                 :             :  type(double_grid_t),intent(in),target :: double_grid
     423                 :             :  type(wfdgw_t),intent(inout),target :: Wfd_dense !, Wfd
     424                 :             :  type(kmesh_t),intent(in),target :: Kmesh_dense
     425                 :             :  type(pseudopotential_type),intent(in) :: Psps
     426                 :             :  type(vcoul_t),intent(in),target :: Vcp_dense
     427                 :             :  type(ebands_t),intent(in),target :: KS_BSt_dense, QP_BSt_dense
     428                 :             : !arrays
     429                 :             :  type(pawtab_type),intent(in) :: Pawtab(hexc%crystal%ntypat*hexc%Wfd_coarse%usepaw)
     430                 :             : 
     431                 :             : !Local variables ---------------------
     432                 :             : !scalars
     433                 :             :  integer,parameter :: spin1 = 1
     434                 :             :  integer :: nsppol,ierr,ii,itt,nproc, my_rank,hsize
     435                 :             :  real(dp),parameter :: threshold = 0.1_dp
     436                 :           4 :  type(excparam) :: BSp
     437                 :             :  logical :: is_resonant, diago_is_real, use_mpio
     438                 :             : !arrays
     439                 :             :  character(len=fnlen) :: tmpfname, hreso_fname
     440                 :             : !*****************************************************************************
     441                 :             : 
     442   [ +  -  +  -  :           4 :  BSp = hexc%bsp
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
             +  -  +  - ]
     443         [ -  + ]:           4 :  ABI_CHECK(BSp%nsppol == 1,"nsppol > 1 not implemented yet")
     444                 :             : 
     445                 :           4 :  hsize = hexc%hsize_coarse
     446                 :             : 
     447                 :           4 :  nproc  = xmpi_comm_size(hexc%comm); my_rank= xmpi_comm_rank(hexc%comm)
     448                 :           4 :  nsppol = hexc%Bsp%nsppol
     449                 :             : 
     450         [ -  + ]:           4 :  ABI_CHECK(nproc == 1,"Parallelization not available in interpolation")
     451                 :             : 
     452                 :           4 :  hexc_i%m3_width = m3_width
     453                 :             : 
     454                 :           4 :  hexc_i%kmesh_dense => Kmesh_dense
     455                 :           4 :  hexc_i%vcp_dense => Vcp_dense
     456         [ +  + ]:           8 :  hexc_i%hsize_dense = SUM(BSp%nreh_interp)
     457                 :           4 :  hexc%hsize = hexc_i%hsize_dense
     458                 :           4 :  hexc%nbz = Kmesh_dense%nbz
     459                 :             : 
     460                 :           4 :  hexc%ks_bst => KS_BSt_dense
     461                 :           4 :  hexc%qp_bst => QP_BSt_dense
     462                 :           4 :  hexc%wfd => Wfd_dense
     463                 :           4 :  hexc%kmesh => Kmesh_dense
     464                 :             : 
     465                 :             :  ! No parallelization !
     466                 :           4 :  hexc%my_t1 = 1
     467                 :           4 :  hexc%my_t2 = hexc_i%hsize_dense
     468                 :             : 
     469                 :             :  ! Initialize the interpolator
     470                 :             :  call hexc_i%interpolator%init(double_grid, Wfd_dense, hexc%Wfd_coarse, Kmesh_dense, &
     471                 :           4 :     hexc%Kmesh_coarse, hexc%BSp, hexc%crystal, Psps, Pawtab, method)
     472                 :             : 
     473         [ +  - ]:           4 :  if (BSp%sum_overlaps) call hexc_i%interpolator%normalize()
     474                 :             : 
     475   [ -  +  +  -  :          12 :  ABI_MALLOC(hexc_i%kdense2div,(double_grid%nbz_dense))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     476   [ -  +  +  -  :          16 :  ABI_MALLOC(hexc_i%div2kdense,(double_grid%nbz_coarse,double_grid%ndiv))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     477                 :             : 
     478                 :           4 :  call compute_corresp(double_grid,hexc_i%div2kdense,hexc_i%kdense2div)
     479                 :             : 
     480         [ +  + ]:           4 :  if (any(BSp%interp_mode == [2,3])) then
     481                 :             :    ! Read a, b, c coefficient matrices from file.
     482                 :             :    ! For the time being, we read the full matrix in a temporary array, and
     483                 :             :    ! then we store the data in a form suitable for the interpolation.
     484                 :           2 :    is_resonant=.TRUE.; diago_is_real=(.not.BSp%have_complex_ene); use_mpio=.FALSE.
     485                 :             : 
     486         [ +  - ]:           2 :    if (hexc%bs_files%in_hreso /= BSE_NOFILE) then
     487                 :           2 :      hreso_fname = hexc%bs_files%in_hreso
     488                 :             :    else
     489                 :           0 :      hreso_fname = hexc%bs_files%out_hreso
     490                 :             :    end if
     491                 :             : 
     492                 :           2 :    tmpfname = hreso_fname; ii = LEN_TRIM(hreso_fname)
     493                 :             : 
     494                 :             :    ! TODO: Write new IO routines to read MPI-distributed data in a format suitable for the interpolation
     495                 :           2 :    tmpfname(ii-2:ii+1) = 'ABSR'
     496   [ -  +  +  -  :           8 :    ABI_MALLOC_OR_DIE(hexc_i%all_acoeffs,(hsize,hsize), ierr)
          -  +  +  -  +  
          -  +  -  +  -  
          +  -  -  +  +  
                -  -  + ]
     497                 :             :    call exc_read_rcblock(tmpfname,Bsp,is_resonant,diago_is_real,nsppol,BSp%nreh,hsize,1,hsize,&
     498                 :           2 :                          hexc_i%all_acoeffs,use_mpio,hexc%comm)
     499                 :             : 
     500                 :           2 :    tmpfname(ii-2:ii+1) = 'BBSR'
     501   [ -  +  +  -  :           6 :    ABI_MALLOC_OR_DIE(hexc_i%all_bcoeffs,(hsize,hsize), ierr)
          -  +  +  -  +  
          -  +  -  -  +  
             +  -  -  + ]
     502                 :             :    call exc_read_rcblock(tmpfname,Bsp,is_resonant,diago_is_real,nsppol,BSp%nreh,hsize,1,hsize,&
     503                 :           2 :                          hexc_i%all_bcoeffs,use_mpio,hexc%comm)
     504                 :             : 
     505                 :           2 :    tmpfname(ii-2:ii+1) = 'CBSR'
     506   [ -  +  +  -  :           6 :    ABI_MALLOC_OR_DIE(hexc_i%all_ccoeffs,(hsize,hsize), ierr)
          -  +  +  -  +  
          -  +  -  -  +  
             +  -  -  + ]
     507                 :             :    call exc_read_rcblock(tmpfname,Bsp,is_resonant,diago_is_real,nsppol,BSp%nreh,hsize,1,hsize,&
     508                 :           2 :                          hexc_i%all_ccoeffs,use_mpio,hexc%comm)
     509                 :             :  end if
     510                 :             : 
     511                 :             :  ! Compute overlaps & compute all hmat
     512   [ -  +  +  -  :          16 :  ABI_MALLOC_OR_DIE(hexc_i%all_hmat,(hsize,hsize), ierr)
          -  +  +  -  +  
          -  +  -  +  -  
          +  -  -  +  +  
                -  -  + ]
     513                 :             : 
     514   [ +  +  +  + ]:       37252 :  hexc_i%all_hmat(:,:) = hexc%hreso(:,:)
     515                 :             : 
     516         [ +  + ]:         388 :  do itt=1,hsize
     517                 :         388 :    hexc_i%all_hmat(itt,itt) = hexc_i%all_hmat(itt,itt) - hexc%diag_coarse(itt)
     518                 :             :  end do
     519                 :             : 
     520                 :             :  ! I don't need the diag_coarse any more
     521         [ -  + ]:           4 :  ABI_FREE(hexc%diag_coarse)
     522                 :             : 
     523                 :             :  ! Compute diagonal part of the dense Ham
     524   [ -  +  +  -  :          12 :  ABI_MALLOC(hexc_i%diag_dense,(hexc_i%hsize_dense))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     525         [ +  + ]:        3076 :  do itt=1,BSp%nreh_interp(spin1) ! 1 is for spin 1
     526                 :        3076 :    hexc_i%diag_dense(itt) = Bsp%Trans_interp(itt,spin1)%en
     527                 :             :  end do
     528                 :             : 
     529   [ +  -  +  -  :           4 : end subroutine hexc_interp_init
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
                   +  - ]
     530                 :             : !!***
     531                 :             : 
     532                 :             : !-------------------------------------------------------------------
     533                 :             : 
     534                 :             : !!****f* m_hexc/hexc_build_hinterp
     535                 :             : !! NAME
     536                 :             : !! hexc_build_hinterp
     537                 :             : !!
     538                 :             : !! FUNCTION
     539                 :             : !! Pre-compute interpolated hamiltonian and store it in memory
     540                 :             : !!
     541                 :             : !! SIDE EFFECTS
     542                 :             : !! hexc, hexc_i
     543                 :             : !!   Pre-compute info to save CPU time when computing matmul
     544                 :             : !!
     545                 :             : !! SOURCE
     546                 :             : 
     547                 :           2 : subroutine hexc_build_hinterp(hexc, hexc_i)
     548                 :             : 
     549                 :             : !Arguments ---------------------------
     550                 :             :  class(hexc_t),intent(inout) :: hexc
     551                 :             :  class(hexc_interp_t),intent(inout) :: hexc_i
     552                 :             : 
     553                 :             : !Local variables ---------------------
     554                 :             :  integer :: ierr,ncerr,ncid
     555                 :             :  character(len=500) :: msg
     556                 :             : !*****************************************************************************
     557                 :             : 
     558                 :           2 :  write(msg,"(a,f8.1,a)")"Memory needed for hinterp = ",one*(hexc_i%hsize_dense**2)*2*dp*b2Mb," Mb"
     559                 :           2 :  call wrtout(std_out,msg,"COLL")
     560                 :             : 
     561   [ -  +  +  -  :           8 :  ABI_MALLOC_OR_DIE(hexc_i%hinterp,(hexc_i%hsize_dense,hexc_i%hsize_dense), ierr)
          -  +  +  -  +  
          -  +  -  +  -  
          +  -  -  +  +  
                -  -  + ]
     562                 :             : 
     563                 :             :  call hexc_compute_hinterp(hexc%BSp, hexc%hsize_coarse, hexc_i%hsize_dense, hexc_i%all_hmat, &
     564                 :             :    hexc_i%interpolator%double_grid,hexc%nbnd_coarse, hexc_i%interpolator, &
     565                 :             :    hexc_i%kdense2div, hexc_i%all_acoeffs,hexc_i%all_bcoeffs, hexc_i%all_ccoeffs, &
     566                 :           2 :    hexc_i%Kmesh_dense, hexc_i%Vcp_dense, hexc%crystal%gmet, hexc_i%hinterp, hexc_i%m3_width)
     567                 :             : 
     568         [ +  - ]:           2 :  ABI_SFREE(hexc_i%all_acoeffs)
     569         [ +  - ]:           2 :  ABI_SFREE(hexc_i%all_bcoeffs)
     570         [ +  - ]:           2 :  ABI_SFREE(hexc_i%all_ccoeffs)
     571                 :             : 
     572                 :             : 
     573         [ -  + ]:           2 :  if (hexc%BSp%prt_ncham) then
     574                 :           0 :    ABI_COMMENT("Printing HEXC_I.nc file")
     575                 :           0 :    ncerr = nctk_open_create(ncid, trim(hexc%BS_files%out_basename)//"_HEXC_I.nc", xmpi_comm_self)
     576         [ #  # ]:           0 :    NCF_CHECK_MSG(ncerr, "Creating HEXC_I file")
     577                 :             :    call exc_ham_ncwrite(ncid, hexc_i%Kmesh_dense, hexc%BSp, hexc_i%hsize_dense, hexc%BSp%nreh_interp, &
     578                 :           0 :                         hexc%BSp%vcks2t_interp, hexc_i%hinterp, hexc_i%diag_dense)
     579         [ #  # ]:           0 :    NCF_CHECK(nf90_close(ncid))
     580                 :             :  end if
     581                 :             : 
     582                 :           2 : end subroutine hexc_build_hinterp
     583                 :             : !!***
     584                 :             : 
     585                 :             : !-------------------------------------------------------------------
     586                 :             : 
     587                 :             : !!****f* m_hexc/hexc_compute_subhinterp
     588                 :             : !! NAME
     589                 :             : !! hexc_compute_subhinterp
     590                 :             : !!
     591                 :             : !! FUNCTION
     592                 :             : !! Compute the interpolation for work_coeffs in dense mesh
     593                 :             : !!
     594                 :             : !! INPUTS
     595                 :             : !! BSp<excparam>=Parameters for BS run
     596                 :             : !! grid<double_grid_t>=Double grid info
     597                 :             : !! nbnd_coarse=Number of bands (= nbndv * nbndc)
     598                 :             : !! interpolator<interpolator_t>=Interpolation info
     599                 :             : !! kdense2div=Mapping between dense point and coarse point
     600                 :             : !! work_coeffs=Coefficients to be interpolated
     601                 :             : !! ikp_dense=Current kpoint
     602                 :             : !! overlaps=Wavefunction overlaps
     603                 :             : !!
     604                 :             : !! OUTPUT
     605                 :             : !! Cmat(nbnd_coarse) = Interpolated coefficients
     606                 :             : !!
     607                 :             : !! SOURCE
     608                 :             : 
     609                 :     1397760 : subroutine hexc_compute_subhinterp(BSp,grid,nbnd_coarse,&
     610                 :     1397760 :   interpolator,kdense2div,work_coeffs,Cmat,ikp_dense,overlaps)
     611                 :             : 
     612                 :             : !Arguments ------------------------------------
     613                 :             : !scalars
     614                 :             :  type(excparam),intent(in) :: BSp
     615                 :             :  integer,intent(in) :: nbnd_coarse
     616                 :             :  integer,intent(in) :: ikp_dense
     617                 :             :  type(double_grid_t),intent(in) :: grid
     618                 :             :  type(interpolator_t),target,intent(inout) :: interpolator
     619                 :             : !arrays
     620                 :             :  integer,intent(in) :: kdense2div(grid%nbz_dense)
     621                 :             :  complex(gwp),intent(in) :: overlaps(interpolator%mband_coarse,interpolator%mband_dense,interpolator%nvert)
     622                 :             :  complex(dp),intent(in) :: work_coeffs(nbnd_coarse,interpolator%nvert)
     623                 :             :  complex(dp),intent(out) :: Cmat(nbnd_coarse)
     624                 :             : 
     625                 :             : !Local variables ------------------------------
     626                 :             : !scalars
     627                 :             :  integer,parameter :: spin1=1,spin2=1
     628                 :             :  integer :: iv1,ic1
     629                 :             :  integer :: icp,ivp,idivp,ibndp_coarse,ibndp_coarse1,ineighbourp
     630                 :             :  integer :: indwithnb
     631                 :             :  integer :: lumo2,lomo2,humo2,homo2
     632                 :             :  complex(dp) :: tmp_val, tmp2, tmp4
     633                 :             : !arrays
     634                 :     1397760 :  complex(dp),contiguous, pointer :: btemp(:),ctemp(:)
     635                 :             : !*********************************************************************
     636                 :             : 
     637                 :     1397760 :  btemp => interpolator%btemp
     638                 :     1397760 :  ctemp => interpolator%ctemp
     639                 :             : 
     640         [ +  + ]:   135582720 :  btemp = czero
     641         [ +  + ]:   135582720 :  ctemp = czero
     642                 :             : 
     643                 :     1397760 :  lumo2 = BSp%lumo_spin(spin2)
     644                 :     1397760 :  lomo2 = BSp%lomo_spin(spin2)
     645                 :     1397760 :  humo2 = BSp%humo_spin(spin2)
     646                 :     1397760 :  homo2 = BSp%homo_spin(spin2)
     647                 :             : 
     648         [ +  + ]:    18170880 :  Cmat = czero
     649                 :             : 
     650                 :     1397760 :  idivp = kdense2div(ikp_dense)
     651                 :             : 
     652         [ +  + ]:    12579840 :  do ineighbourp = 1,interpolator%nvert
     653                 :             : 
     654                 :             :    btemp(((ineighbourp-1)*nbnd_coarse+1):(ineighbourp*nbnd_coarse)) = &
     655         [ +  + ]:   146764800 :            interpolator%interp_factors(ineighbourp,idivp)*work_coeffs(:,ineighbourp)
     656                 :             : 
     657                 :             :  end do !ineighbourp
     658                 :             : 
     659                 :             :  ! Loop over the (c', v') part of the right transition
     660         [ +  + ]:     5591040 :  do ivp = lomo2,homo2
     661         [ +  + ]:    22364160 :    do icp = lumo2,humo2
     662                 :             : 
     663                 :    16773120 :      ibndp_coarse = (ivp-lomo2)*BSp%maxnbndc+(icp-lumo2+1)
     664                 :             :      ! Now we now it_dense, and itp_dense
     665                 :             : 
     666         [ +  + ]:   150958080 :      do ineighbourp = 1,interpolator%nvert
     667         [ +  + ]:   553512960 :        do iv1 = lomo2, homo2
     668                 :             :          ! BSp%lumo_spin(spin2),BSp%humo_spin(spin2)
     669                 :   402554880 :          tmp4 = overlaps(iv1,ivp,ineighbourp)
     670                 :             : 
     671         [ +  + ]:  2146959360 :          do ic1 = lumo2,humo2
     672                 :  1610219520 :            tmp2 = GWPC_CONJG(overlaps(ic1,icp,ineighbourp))
     673                 :             :            ! BSp%lomo_spin(spin2),BSp%homo_spin(spin2)
     674                 :             : 
     675                 :  1610219520 :            ibndp_coarse1 = (iv1-lomo2)*BSp%maxnbndc+(ic1-lumo2+1)
     676                 :  1610219520 :            indwithnb = (ineighbourp-1)*nbnd_coarse+ibndp_coarse1
     677                 :             : 
     678                 :  2012774400 :            ctemp(indwithnb) = tmp4 * tmp2
     679                 :             :          end do ! iv1
     680                 :             :        end do ! ic1
     681                 :             :      end do ! ineighbourp
     682                 :             : 
     683                 :    16773120 :      tmp_val = xdotc(interpolator%nvert*nbnd_coarse,ctemp,1,btemp,1)
     684                 :             :      !tmp_val = DOT_PRODUCT(ctemp,btemp)
     685                 :             : 
     686                 :    20966400 :      Cmat(ibndp_coarse) = tmp_val
     687                 :             :    end do !ivp
     688                 :             :  end do !icp
     689                 :             : 
     690                 :     1397760 :  nullify(btemp)
     691                 :     1397760 :  nullify(ctemp)
     692                 :             : 
     693                 :     1397760 : end subroutine hexc_compute_subhinterp
     694                 :             : !!***
     695                 :             : 
     696                 :             : !----------------------------------------------------------------------
     697                 :             : 
     698                 :             : !!****f* m_hexc/hexc_compute_hinterp
     699                 :             : !! NAME
     700                 :             : !! hexc_compute_hinterp
     701                 :             : !!
     702                 :             : !! FUNCTION
     703                 :             : !! Compute interpolated matrix elements for methods 2 and 3
     704                 :             : !!
     705                 :             : !! INPUTS
     706                 :             : !! BSp<type(excparam)=The parameter for the Bethe-Salpeter run.
     707                 :             : !! hsize_coarse=Size of the coarse Hamiltonian
     708                 :             : !! hsize_dense=Size of the dense Hamiltonian
     709                 :             : !! hmat(hsize_coarse,hsize_coarse,8)=Excitonic matrix
     710                 :             : !! grid<double_grid_t> = Correspondence between coarse and dense k-mesh.
     711                 :             : !! nbnd_coarse = Total number of bands
     712                 :             : !! interpolator<interpolator_t> = Interpolator
     713                 :             : !! kdense2div = Mapping kdense2div
     714                 :             : !! acoeffs, bcoeffs, ccoeffs = decomposition "W = a/q^2 + b/q + c"
     715                 :             : !! Kmesh_dense<type(kmesh_t)>=The list of k-points in the BZ, IBZ and symmetry tables.
     716                 :             : !! Vcp_dense<vcoul_t>=Coulomb interation in G-space on the dense Q-mesh
     717                 :             : !! gmet(3,3)=Metric tensor in G-space
     718                 :             : !!
     719                 :             : !! OUTPUT
     720                 :             : !!   hinterp = Interpolated hamiltonian
     721                 :             : !!
     722                 :             : !! SOURCE
     723                 :             : 
     724                 :           2 : subroutine hexc_compute_hinterp(BSp,hsize_coarse,hsize_dense,hmat,grid,nbnd_coarse,&
     725                 :           2 : &  interpolator,kdense2div,acoeffs,bcoeffs,ccoeffs,Kmesh_dense,Vcp_dense,gmet,hinterp,&
     726                 :             : &  m3_width)
     727                 :             : 
     728                 :             : !Arguments ------------------------------------
     729                 :             : !scalars
     730                 :             :  integer,intent(in) :: hsize_coarse,hsize_dense,nbnd_coarse !,ntrans
     731                 :             :  real(dp),intent(in) :: m3_width
     732                 :             :  type(excparam),intent(in) :: BSp
     733                 :             :  type(double_grid_t),intent(in) :: grid
     734                 :             :  type(vcoul_t),intent(in) :: Vcp_dense
     735                 :             :  type(kmesh_t),intent(in) :: Kmesh_dense
     736                 :             :  type(interpolator_t),target,intent(inout) :: interpolator
     737                 :             : !arrays
     738                 :             :  integer,intent(in) :: kdense2div(grid%nbz_dense)
     739                 :             :  real(dp),intent(in) :: gmet(3,3)
     740                 :             :  complex(dp),intent(in) :: hmat(hsize_coarse,hsize_coarse)
     741                 :             :  complex(dp),intent(in) :: acoeffs(hsize_coarse,hsize_coarse)
     742                 :             :  complex(dp),intent(in) :: bcoeffs(hsize_coarse,hsize_coarse)
     743                 :             :  complex(dp),intent(in) :: ccoeffs(hsize_coarse,hsize_coarse)
     744                 :             :  complex(dp),intent(out) :: hinterp(hsize_dense,hsize_dense)
     745                 :             : 
     746                 :             : !Local variables ------------------------------
     747                 :             : !scalars
     748                 :             :  integer,parameter :: spin1=1, spin2=1
     749                 :             :  integer :: ic,iv,iv1,ic1,ik_dense,ik_coarse,it_coarse,it_dense,idiv,ibnd_coarse,ibnd_coarse1,ineighbour
     750                 :             :  integer :: icp,ivp,ikp_dense,ikp_coarse,itp_coarse,itp_dense,idivp,ibndp_coarse,ibndp_coarse1,ineighbourp,itp_coarse1
     751                 :             :  integer :: itc,it_dense1,indwithnb, corresp_ind, limitnbz, inb,ierr
     752                 :             :  real(dp) :: factor,vc_sqrt_qbz,qnorm
     753                 :             :  complex(dp) :: term
     754                 :             :  logical :: newway, use_herm
     755                 :             : !arrays
     756                 :             :  real(dp) :: kmkp(3),q2(3),shift(3),qinred(3),tsec(2)
     757                 :           2 :  complex(dp),allocatable :: Cmat(:,:,:) !Temp matrices for optimized version
     758                 :           2 :  complex(dp),allocatable :: tmp_Cmat(:)
     759                 :           2 :  complex(dp),allocatable :: work_coeffs(:,:)
     760                 :           2 :  integer,allocatable :: band2it(:)
     761                 :           2 :  complex(dp),contiguous, pointer :: btemp(:),ctemp(:)
     762                 :             : !************************************************************************
     763                 :             : 
     764                 :           2 :  call timab(696,1,tsec)
     765                 :             : 
     766                 :           2 :  newway = .True.
     767                 :           2 :  use_herm = .True.
     768                 :             : 
     769         [ +  - ]:           2 :  if (any(BSp%interp_mode == [2,3])) then
     770   [ +  -  -  + ]:           2 :    if (Vcp_dense%mode /= 'CRYSTAL' .and. Vcp_dense%mode /= 'AUXILIARY_FUNCTION') then
     771                 :           0 :      ABI_ERROR('Vcp_dense%mode not implemented yet !')
     772                 :             :    end if
     773                 :             :  end if
     774                 :             : 
     775         [ -  + ]:           2 :  if (BSp%nsppol > 1) then
     776                 :           0 :    ABI_ERROR("nsppol > 1 not yet implemented")
     777                 :             :  end if
     778                 :             : 
     779                 :           2 :  factor = one/grid%ndiv
     780                 :             : 
     781   [ +  +  +  + ]:     1181186 :  hinterp = czero; term = czero
     782                 :             : 
     783   [ -  +  +  -  :          10 :  ABI_MALLOC_OR_DIE(Cmat,(nbnd_coarse,nbnd_coarse,interpolator%nvert), ierr)
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  +  -  -  
                +  -  + ]
     784   [ +  +  +  +  :        2514 :  Cmat = czero
                   +  + ]
     785                 :             : 
     786   [ -  +  +  -  :           6 :  ABI_MALLOC(band2it,(nbnd_coarse))
          +  -  +  -  -  
                +  -  + ]
     787                 :           2 :  call interpolator%alloc_work(nbnd_coarse*interpolator%nvert)
     788                 :             : 
     789                 :           2 :  btemp => interpolator%btemp
     790                 :           2 :  ctemp => interpolator%ctemp
     791                 :             : 
     792                 :             :  if(newway) then
     793   [ -  +  +  -  :           6 :    ABI_MALLOC(tmp_Cmat,(nbnd_coarse))
          +  -  +  -  -  
                +  -  + ]
     794   [ -  +  +  -  :           8 :    ABI_MALLOC(work_coeffs,(nbnd_coarse,interpolator%nvert))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     795                 :             :  end if
     796                 :             : 
     797         [ +  + ]:         130 :  do ik_dense = 1,grid%nbz_dense
     798                 :         128 :    write(std_out,*) "Kdense = ",ik_dense,"/",grid%nbz_dense
     799                 :         128 :    ik_coarse = grid%dense_to_coarse(ik_dense)
     800                 :             :    if(use_herm) then
     801                 :             :      limitnbz = ik_dense
     802                 :             :    else
     803                 :             :      limitnbz = grid%nbz_dense
     804                 :             :    end if
     805                 :             : 
     806         [ +  + ]:        4290 :    do ikp_dense = 1,limitnbz
     807                 :        4160 :      ikp_coarse = grid%dense_to_coarse(ikp_dense)
     808                 :             : 
     809         [ +  + ]:       16640 :      do iv1 = BSp%lomo_spin(spin2),BSp%homo_spin(spin2)
     810         [ +  + ]:       66560 :        do ic1 = BSp%lumo_spin(spin2),BSp%humo_spin(spin2)
     811                 :       49920 :          itp_coarse1 = BSp%vcks2t(iv1,ic1,ikp_coarse,spin2)
     812                 :       49920 :          ibndp_coarse1 = (iv1-BSp%lomo_spin(spin2))*BSp%maxnbndc+(ic1-BSp%lumo_spin(spin2)+1)
     813                 :             : 
     814                 :       62400 :          band2it(ibndp_coarse1) = itp_coarse1
     815                 :             :        end do
     816                 :             :      end do
     817                 :             : 
     818                 :             : 
     819         [ +  - ]:        4160 :      if (any(BSp%interp_mode == [2,3])) then
     820                 :             :        ! Check if we are along the diagonal
     821         [ +  + ]:       16640 :        kmkp = Kmesh_dense%bz(:,ik_dense) - Kmesh_dense%bz(:,ikp_dense)
     822                 :             : 
     823         [ +  + ]:       16640 :        call wrap2_pmhalf(kmkp(:),q2(:),shift(:))
     824   [ +  +  +  +  :      104000 :        qinred = MATMUL(grid%kptrlatt_coarse,q2)
             +  +  +  + ]
     825                 :             : 
     826                 :             :        ! We are outside the diagonal
     827   [ +  +  +  -  :       16640 :        if (BSp%interp_mode==3 .and. ANY((ABS(qinred)-tol7) > m3_width)) cycle
             +  +  +  - ]
     828                 :             : 
     829   [ +  +  +  +  :       66560 :        qnorm = two_pi*SQRT(DOT_PRODUCT(q2,MATMUL(gmet,q2)))
                   +  + ]
     830                 :             : 
     831   [ +  +  +  +  :        5696 :        if(ALL(ABS(q2(:)) < 1.e-3)) then
                   +  + ]
     832                 :         128 :          vc_sqrt_qbz = SQRT(Vcp_dense%i_sz)
     833                 :             :        else
     834                 :        4032 :          vc_sqrt_qbz = SQRT(four_pi/qnorm**2)
     835                 :             :        end if
     836                 :             : 
     837                 :             :        !!DEBUG CHK !
     838                 :             :        !!COMPUTE Qpoint
     839                 :             :        !call findqg0(iq_bz,g0,kmkp,Qmesh_dense%nbz,Qmesh_dense%bz,BSp%mG0)
     840                 :             : 
     841                 :             :        !! * Get iq_ibz, and symmetries from iq_bz
     842                 :             :        !call qmesh_dense%get_BZ_item(Qmesh_dense,iq_bz,qbz,iq_ibz,isym_q,itim_q)
     843                 :             : 
     844                 :             :        !if(iq_ibz > 1 .and. ABS(vc_sqrt_qbz - Vcp_dense%vc_sqrt(1,iq_ibz)) > 1.e-3) then
     845                 :             :        !   write(*,*) "vc_sqrt_qbz = ",vc_sqrt_qbz
     846                 :             :        !   write(*,*) "Vcp_dense%vc_sqrt(1,iq_ibz) = ",Vcp_dense%vc_sqrt(1,iq_ibz)
     847                 :             :        !   ABI_ERROR("vcp are not the same !")
     848                 :             :        !else if(iq_ibz == 1 .and. ABS(vc_sqrt_qbz - SQRT(Vcp_dense%i_sz)) > 1.e-3) then
     849                 :             :        !   write(*,*) "vc_sqrt_qbz = ",vc_sqrt_qbz
     850                 :             :        !   write(*,*) "SQRT(Vcp_dense%i_sz) = ",SQRT(Vcp_dense%i_sz)
     851                 :             :        !   ABI_ERROR("vcp are not the same !")
     852                 :             :        !end if
     853                 :             :        !!END DEBUG CHK !
     854                 :             :      end if
     855                 :             : 
     856                 :             :      if(newway) then
     857                 :             : 
     858   [ +  +  +  +  :     5229120 :        Cmat = czero
                   +  + ]
     859                 :             : 
     860   [ +  +  +  + ]:      436800 :        work_coeffs = czero
     861                 :             : 
     862         [ +  + ]:       37440 :        do ineighbour = 1,interpolator%nvert
     863                 :             : 
     864                 :             :          ! Loop over the (c, v) part of the left transition
     865         [ +  + ]:      137280 :          do iv = BSp%lomo_spin(spin1),BSp%homo_spin(spin1)
     866         [ +  + ]:      532480 :            do ic = BSp%lumo_spin(spin1),BSp%humo_spin(spin1)
     867                 :             : 
     868                 :      399360 :              it_dense = BSp%vcks2t_interp(iv,ic,ik_dense,spin1)
     869                 :      399360 :              it_coarse = BSp%vcks2t(iv,ic,ik_coarse,spin1)
     870                 :      399360 :              ibnd_coarse = (iv-BSp%lomo_spin(spin1))*BSp%maxnbndc+(ic-BSp%lumo_spin(spin1)+1)
     871                 :             : 
     872                 :      399360 :              itc = interpolator%corresp(it_coarse,ineighbour,spin1)
     873                 :             : 
     874   [ +  +  -  + ]:      399360 :              if (any(BSp%interp_mode == [1,3,4])) then
     875                 :             : 
     876                 :             :                !work_coeffs(:,:) = hmat(itc,band2it(:),:)
     877         [ +  + ]:     1797120 :                do inb = 1,interpolator%nvert
     878   [ +  -  +  +  :    40135680 :                  work_coeffs(:,inb) = hmat(itc,interpolator%corresp(band2it(:),inb,spin2))
                   +  + ]
     879                 :             :                end do
     880                 :             : 
     881                 :             :                call hexc_compute_subhinterp(BSp,grid,nbnd_coarse,&
     882                 :             : &        interpolator,kdense2div,&
     883                 :             : &        work_coeffs,tmp_Cmat,ikp_dense,&
     884                 :      199680 : &        interpolator%overlaps(:,:,:,ikp_dense,spin2))
     885                 :             : 
     886         [ -  + ]:      199680 :                if(any(BSp%interp_mode == [1,4])) then
     887         [ #  # ]:           0 :                  Cmat(ibnd_coarse,:,ineighbour) = tmp_Cmat
     888         [ +  - ]:      199680 :                else if (BSp%interp_mode == 3) then
     889         [ +  + ]:     2595840 :                  Cmat(ibnd_coarse,:,ineighbour) = -tmp_Cmat
     890                 :             :                end if
     891                 :             :              end if
     892                 :             : 
     893                 :             : 
     894         [ +  - ]:      399360 :              if (any(BSp%interp_mode == [2,3])) then
     895                 :             :                !work_coeffs(:,:) = acoeffs(itc,band2it(:),:)
     896         [ +  + ]:     3594240 :                do inb = 1,interpolator%nvert
     897   [ +  -  +  +  :    80271360 :                  work_coeffs(:,inb) = acoeffs(itc,interpolator%corresp(band2it(:),inb,spin2))
                   +  + ]
     898                 :             :                end do
     899                 :             : 
     900                 :             :                call hexc_compute_subhinterp(BSp,grid,nbnd_coarse,&
     901                 :             : &        interpolator,kdense2div,&
     902                 :             : &        work_coeffs,tmp_Cmat,ikp_dense,&
     903                 :      399360 : &        interpolator%overlaps(:,:,:,ikp_dense,spin2))
     904                 :             : 
     905         [ +  + ]:     5191680 :                tmp_Cmat = tmp_Cmat * (vc_sqrt_qbz**2)
     906         [ +  + ]:     5191680 :                Cmat(ibnd_coarse,:,ineighbour) = Cmat(ibnd_coarse,:,ineighbour) + tmp_Cmat
     907                 :             :              end if
     908                 :             : 
     909                 :             : 
     910         [ +  - ]:      399360 :              if (any(BSp%interp_mode == [2,3])) then
     911                 :             :                !work_coeffs(:,:) = bcoeffs(itc,band2it(:),:)
     912         [ +  + ]:     3594240 :                do inb = 1,interpolator%nvert
     913   [ +  -  +  +  :    80271360 :                  work_coeffs(:,inb) = bcoeffs(itc,interpolator%corresp(band2it(:),inb,spin2))
                   +  + ]
     914                 :             :                end do
     915                 :             : 
     916                 :             :                call hexc_compute_subhinterp(BSp,grid,nbnd_coarse,&
     917                 :             : &        interpolator,kdense2div,&
     918                 :             : &        work_coeffs,tmp_Cmat,ikp_dense,&
     919                 :      399360 : &        interpolator%overlaps(:,:,:,ikp_dense,spin2))
     920                 :             : 
     921         [ +  + ]:     5191680 :                tmp_Cmat = tmp_Cmat * (vc_sqrt_qbz)
     922         [ +  + ]:     5191680 :                Cmat(ibnd_coarse,:,ineighbour) = Cmat(ibnd_coarse,:,ineighbour) + tmp_Cmat
     923                 :             :              end if
     924                 :             : 
     925                 :             : 
     926         [ +  - ]:      499200 :              if (any(BSp%interp_mode == [2,3])) then
     927                 :             :                !work_coeffs(:,:) = ccoeffs(itc,band2it(:),:)
     928         [ +  + ]:     3594240 :                do inb = 1,interpolator%nvert
     929   [ +  -  +  +  :    80271360 :                  work_coeffs(:,inb) = ccoeffs(itc,interpolator%corresp(band2it(:),inb,spin2))
                   +  + ]
     930                 :             :                end do
     931                 :             : 
     932                 :             :                call hexc_compute_subhinterp(BSp,grid,nbnd_coarse,&
     933                 :             : &        interpolator,kdense2div,&
     934                 :             : &        work_coeffs,tmp_Cmat,ikp_dense,&
     935                 :      399360 : &        interpolator%overlaps(:,:,:,ikp_dense,spin2))
     936                 :             : 
     937         [ +  + ]:     5191680 :                Cmat(ibnd_coarse,:,ineighbour) = Cmat(ibnd_coarse,:,ineighbour) + tmp_Cmat
     938                 :             :              end if
     939                 :             :            end do ! ic
     940                 :             :          end do ! iv
     941                 :             :        end do ! ineighbour
     942                 :             : 
     943                 :             :      else
     944                 :             :        ! Loop over the (c, v) part of the left transition
     945                 :             :        do iv = BSp%lomo_spin(spin1),BSp%homo_spin(spin1)
     946                 :             :          do ic = BSp%lumo_spin(spin1),BSp%humo_spin(spin1)
     947                 :             : 
     948                 :             :            it_dense = BSp%vcks2t_interp(iv,ic,ik_dense,spin1)
     949                 :             :            it_coarse = BSp%vcks2t(iv,ic,ik_coarse,spin1)
     950                 :             :            ibnd_coarse = (iv-BSp%lomo_spin(spin1))*BSp%maxnbndc+(ic-BSp%lumo_spin(spin1)+1)
     951                 :             : 
     952                 :             :            ! Loop over the (c', v') part of the right transition
     953                 :             :            do ivp = BSp%lomo_spin(spin2),BSp%homo_spin(spin2)
     954                 :             :              do icp = BSp%lumo_spin(spin2),BSp%humo_spin(spin2)
     955                 :             : 
     956                 :             :                itp_dense = BSp%vcks2t_interp(ivp,icp,ikp_dense,spin2)
     957                 :             :                itp_coarse = BSp%vcks2t(ivp,icp,ikp_coarse,spin2)
     958                 :             :                ibndp_coarse = (ivp-Bsp%lomo_spin(spin2))*BSp%maxnbndc+(icp-BSp%lumo_spin(spin2)+1)
     959                 :             :                ! Now we now it_dense, and itp_dense
     960                 :             : 
     961                 :             :                idivp = kdense2div(ikp_dense)
     962                 :             : 
     963                 :             :                btemp = czero; ctemp = czero
     964                 :             : 
     965                 :             :                ! MG TODO: This way of looping is not optimal
     966                 :             :                do ineighbour = 1,interpolator%nvert
     967                 :             :                  itc = interpolator%corresp(it_coarse,ineighbour,spin1)
     968                 :             : 
     969                 :             :                  do ineighbourp = 1,interpolator%nvert
     970                 :             : 
     971                 :             :                    do iv1 = BSp%lomo_spin(spin2),BSp%homo_spin(spin2)
     972                 :             :                      do ic1 = BSp%lumo_spin(spin2),BSp%humo_spin(spin2)
     973                 :             : 
     974                 :             :                        ibndp_coarse1 = (iv1-BSp%lomo_spin(spin2))*BSp%maxnbndc+(ic1-BSp%lumo_spin(spin2)+1)
     975                 :             :                        indwithnb = (ineighbourp-1)*nbnd_coarse+ibndp_coarse1
     976                 :             :                        itp_coarse1 = BSp%vcks2t(iv1,ic1,ikp_coarse,spin2)
     977                 :             :                        corresp_ind = interpolator%corresp(itp_coarse1,ineighbourp,spin2)
     978                 :             : 
     979                 :             :                        select case (BSp%interp_mode)
     980                 :             :                        case (1,4)
     981                 :             :                          interpolator%btemp(indwithnb) = hmat(itc,corresp_ind)
     982                 :             :                        case (2)
     983                 :             :                          interpolator%btemp(indwithnb) = acoeffs(itc,corresp_ind)*(vc_sqrt_qbz**2) &
     984                 :             : &                                         + bcoeffs(itc,corresp_ind)*(vc_sqrt_qbz) &
     985                 :             : &                                         + ccoeffs(itc,corresp_ind)
     986                 :             :                        case (3)
     987                 :             :                          ! Diff between divergence and hmat
     988                 :             :                          interpolator%btemp(indwithnb) = acoeffs(itc,corresp_ind)*(vc_sqrt_qbz**2) &
     989                 :             : &                                         + bcoeffs(itc,corresp_ind)*(vc_sqrt_qbz) &
     990                 :             : &                                         + ccoeffs(itc,corresp_ind) &
     991                 :             : &                                         - hmat(itc,corresp_ind)
     992                 :             :                        case default
     993                 :             :                          ABI_ERROR("Wrong Bsp%interp_mode")
     994                 :             :                        end select
     995                 :             : 
     996                 :             :                        ctemp(indwithnb) = &
     997                 :             : &                        interpolator%overlaps(iv1,ivp,ineighbourp,ikp_dense,spin2) &
     998                 :             : &                        * GWPC_CONJG(interpolator%overlaps(ic1,icp,ineighbourp,ikp_dense,spin2)) &
     999                 :             : &                        *interpolator%interp_factors(ineighbourp,idivp)
    1000                 :             :                      end do ! ic1
    1001                 :             :                    end do !iv1
    1002                 :             : 
    1003                 :             :                  end do !ineighbourp
    1004                 :             :                  Cmat(ibnd_coarse,ibndp_coarse,ineighbour) = xdotc(interpolator%nvert*nbnd_coarse,&
    1005                 :             : &                                   ctemp,1,btemp,1)
    1006                 :             :                end do !ineighbour
    1007                 :             : 
    1008                 :             :              end do !icp
    1009                 :             :            end do !ivp
    1010                 :             : 
    1011                 :             :          end do !ic
    1012                 :             :        end do !iv
    1013                 :             : 
    1014                 :             :      end if
    1015                 :             : 
    1016         [ +  + ]:       16768 :      do iv = BSp%lomo_spin(spin1),BSp%homo_spin(spin1)
    1017         [ +  + ]:       66560 :        do ic = BSp%lumo_spin(spin1),BSp%humo_spin(spin1)
    1018                 :       49920 :          it_dense = BSp%vcks2t_interp(iv,ic,ik_dense,spin1)
    1019                 :       49920 :          it_coarse = BSp%vcks2t(iv,ic,ik_coarse,spin1)
    1020                 :       49920 :          ibnd_coarse = (iv-BSp%lomo_spin(spin1))*BSp%maxnbndc+(ic-BSp%lumo_spin(spin1)+1)
    1021                 :             : 
    1022                 :       49920 :          idiv = kdense2div(ik_dense)
    1023                 :             : 
    1024         [ +  + ]:      212160 :          do ivp = BSp%lomo_spin(spin2),BSp%homo_spin(spin2)
    1025         [ +  + ]:      798720 :            do icp = BSp%lumo_spin(spin2),BSp%humo_spin(spin2)
    1026                 :      599040 :              itp_dense = BSp%vcks2t_interp(ivp,icp,ikp_dense,spin2)
    1027                 :      599040 :              itp_coarse = BSp%vcks2t(ivp,icp,ikp_coarse,spin2)
    1028                 :      599040 :              ibndp_coarse = (ivp-Bsp%lomo_spin(spin2))*BSp%maxnbndc+(icp-BSp%lumo_spin(spin2)+1)
    1029                 :             : 
    1030                 :             :              ! Hermicity
    1031                 :             :              if(use_herm .and. it_dense < itp_dense) then
    1032                 :             :                continue
    1033                 :             :              end if
    1034                 :             : 
    1035                 :             :              !btemp = czero; ctemp = czero
    1036                 :             : 
    1037         [ +  + ]:     5391360 :              do ineighbour = 1,interpolator%nvert
    1038         [ +  + ]:    19768320 :                do iv1 = BSp%lomo_spin(spin1),BSp%homo_spin(spin1)
    1039         [ +  + ]:    76677120 :                  do ic1 = BSp%lumo_spin(spin1),BSp%humo_spin(spin1)
    1040                 :    57507840 :                    ibnd_coarse1 = (iv1-BSp%lomo_spin(spin1))*BSp%maxnbndc+(ic1-BSp%lumo_spin(spin1)+1)
    1041                 :    57507840 :                    it_dense1 = BSp%vcks2t_interp(iv1,ic1,ik_dense,spin1)
    1042                 :    57507840 :                    indwithnb = (ineighbour-1)*nbnd_coarse+ibnd_coarse1
    1043                 :             : 
    1044                 :    57507840 :                    btemp(indwithnb) = Cmat(ibnd_coarse1,ibndp_coarse,ineighbour)
    1045                 :             : 
    1046                 :             :                    ctemp(indwithnb) = GWPC_CONJG(interpolator%overlaps(iv1,iv,ineighbour,ik_dense,spin1)) &
    1047                 :             : &                                    *interpolator%overlaps(ic1,ic,ineighbour,ik_dense,spin1) &
    1048                 :    71884800 : &                                    *interpolator%interp_factors(ineighbour,idiv)
    1049                 :             :                  end do !ic1
    1050                 :             :                end do !iv1
    1051                 :             :              end do !ineighbour
    1052                 :             : 
    1053                 :             :              ! Save interpolated value.
    1054                 :      748800 :              hinterp(it_dense,itp_dense) = xdotc(interpolator%nvert*nbnd_coarse,ctemp,1,btemp,1)
    1055                 :             :              !DOT_PRODUCT(ctemp,btemp)
    1056                 :             : 
    1057                 :             :            end do !icp
    1058                 :             :          end do !ivp
    1059                 :             : 
    1060                 :             :        end do !ic
    1061                 :             :      end do !iv
    1062                 :             : 
    1063                 :             :    end do !ikp
    1064                 :             :  end do !ik
    1065                 :             : 
    1066                 :             :  ! Enforce hermiticity
    1067                 :             :  if(use_herm) then
    1068         [ +  + ]:        1538 :    do itp_dense = 1,BSp%nreh_interp(spin2)
    1069         [ +  + ]:      592130 :      do it_dense = itp_dense,BSp%nreh_interp(spin1)
    1070         [ +  + ]:      592128 :        if(it_dense == itp_dense) then
    1071                 :        1536 :          hinterp(itp_dense,it_dense) = DBLE(hinterp(it_dense,itp_dense))
    1072                 :             :        else
    1073                 :      589056 :          hinterp(itp_dense,it_dense) = CONJG(hinterp(it_dense,itp_dense))
    1074                 :             :        end if
    1075                 :             :      end do
    1076                 :             :    end do
    1077                 :             :  end if
    1078                 :             : 
    1079         [ -  + ]:           2 :  ABI_FREE(Cmat)
    1080         [ -  + ]:           2 :  ABI_FREE(band2it)
    1081                 :             : 
    1082         [ +  - ]:           2 :  ABI_SFREE(tmp_Cmat)
    1083         [ +  - ]:           2 :  ABI_SFREE(work_coeffs)
    1084                 :             : 
    1085                 :           2 :  nullify(ctemp)
    1086                 :           2 :  nullify(btemp)
    1087                 :           2 :  call interpolator%int_free()
    1088                 :             : 
    1089   [ +  +  +  + ]:     1181186 :  hinterp = hinterp*factor
    1090                 :             : 
    1091                 :           2 :  call timab(696,2,tsec)
    1092                 :             : 
    1093                 :           2 : end subroutine hexc_compute_hinterp
    1094                 :             : !!***
    1095                 :             : 
    1096                 :             : !----------------------------------------------------------------------
    1097                 :             : 
    1098                 :             : !!****f* m_hexc/hexc_free
    1099                 :             : !! NAME
    1100                 :             : !! hexc_free
    1101                 :             : !!
    1102                 :             : !! FUNCTION
    1103                 :             : !! Destroy the interpolator object in memory
    1104                 :             : !!
    1105                 :             : !! SOURCE
    1106                 :             : 
    1107                 :          23 : subroutine hexc_free(hexc)
    1108                 :             : 
    1109                 :             : !Arguments ---------------------------
    1110                 :             :  class(hexc_t),intent(inout) :: hexc
    1111                 :             : !*****************************************************************************
    1112                 :             : 
    1113         [ +  - ]:          23 :  if (associated(hexc%bsp)) then
    1114                 :          23 :    nullify(hexc%bsp)
    1115                 :             :  end if
    1116                 :             : 
    1117         [ +  - ]:          23 :  if (associated(hexc%crystal)) then
    1118                 :          23 :    nullify(hexc%crystal)
    1119                 :             :  end if
    1120                 :             : 
    1121         [ +  - ]:          23 :  if (associated(hexc%kmesh_coarse)) then
    1122                 :          23 :    nullify(hexc%kmesh_coarse)
    1123                 :             :  end if
    1124                 :             : 
    1125         [ +  - ]:          23 :  ABI_SFREE(hexc%hreso)
    1126         [ -  + ]:          23 :  ABI_SFREE(hexc%hcoup)
    1127         [ -  + ]:          23 :  ABI_SFREE(hexc%diag_coarse)
    1128                 :             : 
    1129                 :          23 : end subroutine hexc_free
    1130                 :             : !!***
    1131                 :             : 
    1132                 :             : !-------------------------------------------------------------------
    1133                 :             : 
    1134                 :             : !!****f* m_hexc/hexc_interp_free
    1135                 :             : !! NAME
    1136                 :             : !! hexc_interp_free
    1137                 :             : !!
    1138                 :             : !! FUNCTION
    1139                 :             : !!  Free dynamic memory.
    1140                 :             : !!
    1141                 :             : !! SOURCE
    1142                 :             : 
    1143                 :          23 : subroutine hexc_interp_free(hexc_i)
    1144                 :             : 
    1145                 :             : !Arguments ---------------------------
    1146                 :             :  class(hexc_interp_t),intent(inout) :: hexc_i
    1147                 :             : !*****************************************************************************
    1148                 :             : 
    1149         [ +  + ]:          23 :  ABI_SFREE(hexc_i%kdense2div)
    1150         [ +  + ]:          23 :  ABI_SFREE(hexc_i%div2kdense)
    1151         [ +  + ]:          23 :  ABI_SFREE(hexc_i%diag_dense)
    1152         [ +  + ]:          23 :  ABI_SFREE(hexc_i%hinterp)
    1153         [ +  + ]:          23 :  ABI_SFREE(hexc_i%all_hmat)
    1154         [ -  + ]:          23 :  ABI_SFREE(hexc_i%all_acoeffs)
    1155         [ -  + ]:          23 :  ABI_SFREE(hexc_i%all_bcoeffs)
    1156         [ -  + ]:          23 :  ABI_SFREE(hexc_i%all_ccoeffs)
    1157                 :             : 
    1158         [ +  + ]:          23 :  if (associated(hexc_i%kmesh_dense)) then
    1159                 :           4 :    nullify(hexc_i%kmesh_dense)
    1160                 :             :  end if
    1161                 :             : 
    1162         [ +  + ]:          23 :  if (associated(hexc_i%vcp_dense)) then
    1163                 :           4 :    nullify(hexc_i%vcp_dense)
    1164                 :             :  end if
    1165                 :             : 
    1166                 :          23 :  call hexc_i%interpolator%free()
    1167                 :             : 
    1168                 :          23 : end subroutine hexc_interp_free
    1169                 :             : !!***
    1170                 :             : 
    1171                 :             : !----------------------------------------------------------------------
    1172                 :             : 
    1173                 :             : !!****f* m_hexc/hexc_interp_matmul
    1174                 :             : !! NAME
    1175                 :             : !! hexc_interp_matmul
    1176                 :             : !!
    1177                 :             : !! FUNCTION
    1178                 :             : !! Compute matrix-vector product Hmat * phi by interpolating coarse Hmat
    1179                 :             : !!
    1180                 :             : !! INPUTS
    1181                 :             : !!  BSp<type(excparam)>=Parameters defining the BS calculation
    1182                 :             : !!  hsize_coarse = Size of the coarse hamiltonian
    1183                 :             : !!  hsize_dense = Size of the dense hamiltonian
    1184                 :             : !!  hmat(hsize_coarse,hsize_coarse,8) = coarse hamiltonian
    1185                 :             : !!  phi(hsize_dense) = ket on which apply the matrix
    1186                 :             : !!  grid <double_grid_t> = Correspondence between coarse and dense k-mesh.
    1187                 :             : !!  nbnd_coarse = Total number of bands
    1188                 :             : !!  interpolator<interpolator_t> = Interpolator
    1189                 :             : !!  div2kdense = Mapping from coarse and division -> dense mesh
    1190                 :             : !!  kdense2div = Mapping from dense mesh -> division
    1191                 :             : !!
    1192                 :             : !! OUTPUT
    1193                 :             : !!  hphi(hsize_dense) = Interp(hmat)*phi
    1194                 :             : !!
    1195                 :             : !! SOURCE
    1196                 :             : 
    1197                 :        3259 : subroutine hexc_interp_matmul(BSp,hsize_coarse,hsize_dense,hmat,phi,hphi,grid,&
    1198                 :        3259 :                               nbnd_coarse,interpolator,div2kdense,kdense2div)
    1199                 :             : 
    1200                 :             : !Arguments ------------------------------------
    1201                 :             : !scalars
    1202                 :             :  integer,intent(in) :: hsize_coarse,hsize_dense,nbnd_coarse !,ntrans
    1203                 :             :  type(excparam),intent(in) :: BSp
    1204                 :             :  type(double_grid_t),intent(in) :: grid
    1205                 :             :  type(interpolator_t),intent(in) :: interpolator
    1206                 :             : !arrays
    1207                 :             :  integer,intent(in) :: div2kdense(grid%nbz_coarse,grid%ndiv), kdense2div(grid%nbz_dense)
    1208                 :             :  complex(dp),intent(in) :: phi(hsize_dense)
    1209                 :             :  complex(dp),intent(in) :: hmat(hsize_coarse,hsize_coarse)
    1210                 :             :  complex(dp),intent(inout) :: hphi(hsize_dense)
    1211                 :             : 
    1212                 :             : !Local variables ------------------------------
    1213                 :             : !scalars
    1214                 :             :  integer :: itt,ik_dense,ik_coarse,it_coarse, ic,iv,iv1,ic1, ibnd_coarse
    1215                 :             :  integer :: ibnd_coarse1, ineighbour,idense,ikpt
    1216                 :             :  integer :: my_k1,my_k2,ind_with_nb,is, is1
    1217                 :             :  real(dp) :: factor
    1218                 :             :  complex(dp) :: tmp
    1219                 :             :  logical,parameter :: use_blas=.True.
    1220                 :             : !arrays
    1221                 :        6518 :  integer :: allindices(nbnd_coarse)
    1222                 :        6518 :  complex(dp) :: allp(hsize_coarse,interpolator%nvert), test(hsize_coarse)
    1223                 :        6518 :  complex(dp) :: ophi(grid%nbz_dense,interpolator%nvert,nbnd_coarse)
    1224                 :        3259 :  complex(dp),allocatable :: b(:), c(:),A(:,:), tmp_array(:), tmp_array2(:,:)
    1225                 :             : !************************************************************************
    1226                 :             : 
    1227                 :        3259 :  factor = one/grid%ndiv
    1228                 :             :  !hphi = czero
    1229                 :             : 
    1230                 :             :  ! Outer index : k point in the dense zone
    1231                 :             :  ! Sum over vc
    1232                 :             :  ! Index of result : k point in the dense zone, v2,c2,neighbour
    1233                 :             : 
    1234                 :             :  ! Parallelization on nbz in the coarse mesh !
    1235                 :        3259 :  my_k1 = 1
    1236                 :        3259 :  my_k2 = grid%nbz_coarse
    1237                 :             : 
    1238   [ -  +  +  -  :       13036 :  ABI_MALLOC(A,(interpolator%nvert*nbnd_coarse,nbnd_coarse))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
    1239   [ -  +  +  -  :        9777 :  ABI_MALLOC(b,(nbnd_coarse))
          +  -  +  -  -  
                +  -  + ]
    1240   [ -  +  +  -  :        9777 :  ABI_MALLOC(c,(interpolator%nvert*nbnd_coarse))
          +  -  +  -  -  
                +  +  - ]
    1241                 :             : 
    1242   [ +  +  +  +  :    14673866 :  c = czero; ophi = czero
             +  +  +  + ]
    1243                 :             : 
    1244         [ +  + ]:      211835 :  do ik_dense = 1,grid%nbz_dense
    1245                 :             :    ! if( ik_dense is not in my set of k-points)
    1246                 :             :    !   ! continue
    1247                 :             :    !
    1248         [ +  + ]:      417152 :    do is1 = 1, BSp%nsppol
    1249         [ +  + ]:     1042880 :      do iv1 = BSp%lomo_spin(is1),Bsp%homo_spin(is1)
    1250         [ +  + ]:     3337216 :        do ic1 = BSp%lumo_spin(is1),Bsp%humo_spin(is1)
    1251                 :     2502912 :          ibnd_coarse = (iv1-BSp%lomo_spin(is1))*BSp%maxnbndc+(ic1-BSp%lumo_spin(is1)+1)
    1252                 :     2502912 :          itt = BSp%vcks2t_interp(iv1,ic1,ik_dense,is1)
    1253                 :     3128640 :          allindices(ibnd_coarse) = itt
    1254                 :             :        end do !ic1
    1255                 :             :      end do !iv1
    1256                 :             :    end do !is1
    1257                 :             : 
    1258         [ +  + ]:     2711488 :    b(:) = phi(allindices(:))
    1259                 :             : 
    1260         [ +  + ]:      417152 :    do is = 1, BSp%nsppol
    1261         [ +  + ]:     1042880 :      do iv = BSp%lomo_spin(is),Bsp%homo_spin(is)
    1262         [ +  + ]:     3337216 :        do ic = BSp%lumo_spin(is),Bsp%humo_spin(is)
    1263                 :     2502912 :          ibnd_coarse = (iv-BSp%lomo_spin(is))*BSp%maxnbndc+(ic-BSp%lumo_spin(is)+1)
    1264                 :     2502912 :          idense = Bsp%vcks2t_interp(iv,ic,ik_dense,is)
    1265                 :             : 
    1266         [ +  + ]:    17313600 :          do ineighbour = 1,interpolator%nvert
    1267                 :    14184960 :            ind_with_nb = (ineighbour-1)*(nbnd_coarse)+ibnd_coarse
    1268                 :             : 
    1269                 :             :            !A(ind_with_nb,:) = overlaps(allindices(:),ibnd_coarse,ineighbour)
    1270                 :             : 
    1271                 :             :            ! Should be optimized !!!
    1272         [ +  + ]:    59242752 :            do iv1 = BSp%lomo_spin(is),Bsp%homo_spin(is)
    1273         [ +  + ]:   226959360 :              do ic1 = BSp%lumo_spin(is),Bsp%humo_spin(is)
    1274                 :   170219520 :                ibnd_coarse1 = (iv1-BSp%lomo_spin(is))*BSp%maxnbndc+(ic1-BSp%lumo_spin(is)+1)
    1275                 :             :                A(ind_with_nb,ibnd_coarse1) = GWPC_CONJG(interpolator%overlaps(iv,iv1,ineighbour,ik_dense,is)) &
    1276                 :   212774400 : &                                          *interpolator%overlaps(ic,ic1,ineighbour,ik_dense,is)
    1277                 :             :              end do !ic1
    1278                 :             :            end do !iv1
    1279                 :             :          end do !ineighbour
    1280                 :             :        end do !ic
    1281                 :             :      end do !iv
    1282                 :             :    end do !is
    1283                 :             : 
    1284                 :             :    if(use_blas) then
    1285                 :      208576 :      call xgemv('N',interpolator%nvert*nbnd_coarse,nbnd_coarse,cone,A,interpolator%nvert*nbnd_coarse,b,1,czero,c,1)
    1286                 :             :    else
    1287                 :             :      c = MATMUL(A,b)
    1288                 :             :    end if
    1289                 :             : 
    1290         [ +  + ]:      420411 :    do is = 1, BSp%nsppol
    1291         [ +  + ]:     1042880 :      do iv = BSp%lomo_spin(is),BSp%homo_spin(is)
    1292         [ +  + ]:     3337216 :        do ic = BSp%lumo_spin(is),BSp%humo_spin(is)
    1293                 :     2502912 :          ibnd_coarse = (iv-BSp%lomo_spin(is))*BSp%maxnbndc+(ic-BSp%lumo_spin(is)+1)
    1294         [ +  + ]:    17313600 :          do ineighbour = 1,interpolator%nvert
    1295                 :    14184960 :            ind_with_nb = (ineighbour-1)*(nbnd_coarse)+ibnd_coarse
    1296                 :    16687872 :            ophi(ik_dense,ineighbour,ibnd_coarse) = c(ind_with_nb)
    1297                 :             :          end do !ineighbour
    1298                 :             :        end do !ic
    1299                 :             :      end do !iv
    1300                 :             :    end do !is
    1301                 :             : 
    1302                 :             :  end do !ik_dense
    1303                 :             : 
    1304         [ -  + ]:        3259 :  ABI_FREE(A)
    1305         [ -  + ]:        3259 :  ABI_FREE(b)
    1306         [ -  + ]:        3259 :  ABI_FREE(c)
    1307                 :             : 
    1308                 :             :  !call xmpi_sum_(ophi,comm,ierr)
    1309                 :             : 
    1310                 :             :  ! Outer index : k,v,c in the coarse zone, ineighbour
    1311                 :             :  ! Sum over all k-dense relative to one coarse point
    1312                 :             :  ! Index of result : k,v,c in the coarse zone, ineighbour
    1313                 :             : 
    1314   [ -  +  +  -  :        9777 :  ABI_MALLOC(b,(grid%ndiv))
          +  -  +  -  -  
                +  -  + ]
    1315   [ -  +  +  -  :        6518 :  ABI_MALLOC(c,(grid%ndiv))
             -  +  +  - ]
    1316                 :             : 
    1317   [ +  +  +  + ]:     1794849 :  allp = czero
    1318                 :             : 
    1319         [ +  + ]:        6518 :  do is = 1, BSp%nsppol
    1320         [ +  + ]:       24988 :    do ineighbour = 1,interpolator%nvert
    1321                 :             : 
    1322         [ +  + ]:     1794849 :      do it_coarse = 1, BSp%nreh(is)
    1323                 :             :        ibnd_coarse = (Bsp%trans(it_coarse,is)%v-BSp%lomo_spin(is))*BSp%maxnbndc+&
    1324                 :     1773120 :                      (BSp%Trans(it_coarse,is)%c-BSp%lumo_spin(is)+1)
    1325                 :     1773120 :        ik_coarse = BSp%trans(it_coarse,is)%k
    1326                 :             :        !b(:) = interp_factors(it_coarse,ineighbour,:)
    1327         [ +  + ]:    15958080 :        b(:) = interpolator%interp_factors(ineighbour,:)
    1328                 :             :        !c(:) = ophi(indices(it_coarse,:),ineighbour,ibnd_coarse)
    1329         [ +  + ]:    15958080 :        c(:) = ophi(div2kdense(ik_coarse,:),ineighbour,ibnd_coarse)
    1330         [ +  + ]:    15958080 :        tmp = DOT_PRODUCT(b,c)
    1331                 :     1791590 :        allp(it_coarse,ineighbour) = tmp
    1332                 :             :      end do
    1333                 :             : 
    1334                 :             :    end do
    1335                 :             :  end do
    1336                 :             : 
    1337                 :             :  !call xmpi_sum_(allp,comm,ierr)
    1338                 :             : 
    1339         [ -  + ]:        3259 :  ABI_FREE(b)
    1340         [ -  + ]:        3259 :  ABI_FREE(c)
    1341                 :             : 
    1342   [ -  +  +  -  :        9777 :  ABI_MALLOC(tmp_array,(hsize_coarse))
          +  -  +  -  -  
                +  -  + ]
    1343   [ -  +  +  -  :       13036 :  ABI_MALLOC(tmp_array2,(hsize_coarse,hsize_coarse))
          -  +  +  -  +  
          -  +  -  -  +  
                   +  - ]
    1344         [ +  + ]:      316123 :  tmp_array(:) = czero
    1345   [ +  +  +  + ]:    30351067 :  tmp_array2(:,:) = czero
    1346                 :             : 
    1347         [ +  + ]:      316123 :  test = czero
    1348                 :             : 
    1349                 :             :  ! Second step : Multiplication by hmat
    1350         [ +  + ]:       21729 :  do ineighbour = 1,interpolator%nvert
    1351   [ +  -  +  +  :   173802700 :    tmp_array2 = factor*hmat(:,interpolator%corresp(:,ineighbour,1)) ! 1 is for spin
          +  -  -  +  -  
             -  +  +  +  
                      + ]
    1352                 :        3259 :    if(use_blas) then
    1353                 :             :      !call xgemv('N',hsize_coarse,hsize_coarse,cone,factor*(hmat(:,:,ineighbour)),hsize_coarse,allp(:,ineighbour),1,czero,tmp_array,1)
    1354                 :             :      !tmp_array2 = hmat(:,:,ineighbour)
    1355                 :             :      !tmp_array2 = factor*tmp_array2
    1356                 :       18470 :      call xgemv('N',hsize_coarse,hsize_coarse,cone,tmp_array2,hsize_coarse,allp(:,ineighbour),1,czero,tmp_array,1)
    1357         [ +  + ]:     1791590 :      test = test + tmp_array
    1358                 :             :    else
    1359                 :             :      !test = test+MATMUL(factor*(hmat(:,interpolator%corresp(:,ineighbour,1))),allp(:,ineighbour))
    1360                 :             :      test = test+MATMUL(tmp_array2,allp(:,ineighbour))
    1361                 :             :    end if
    1362                 :             :  end do
    1363                 :             : 
    1364         [ -  + ]:        3259 :  ABI_FREE(tmp_array)
    1365         [ -  + ]:        3259 :  ABI_FREE(tmp_array2)
    1366                 :             : 
    1367                 :             :  ! Outer index : ineighbour
    1368                 :             :  ! Sum over all v c
    1369                 :             :  ! Index of result : ineighbour, k_dense, v,c
    1370   [ -  +  +  -  :       13036 :  ABI_MALLOC(A,(nbnd_coarse,nbnd_coarse))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
    1371   [ -  +  +  -  :        6518 :  ABI_MALLOC(b,(nbnd_coarse))
             -  +  -  + ]
    1372   [ -  +  +  -  :        6518 :  ABI_MALLOC(c,(nbnd_coarse))
             -  +  +  - ]
    1373         [ +  + ]:       42367 :  c = czero
    1374                 :             : 
    1375         [ +  + ]:       21729 :  do ineighbour = 1,interpolator%nvert
    1376         [ +  + ]:     1203809 :    do ik_dense = 1,grid%nbz_dense
    1377                 :             : 
    1378         [ +  + ]:     2364160 :      do is1 = 1, Bsp%nsppol
    1379         [ +  + ]:     5910400 :        do iv1 = Bsp%lomo_spin(is1),Bsp%homo_spin(is1)
    1380         [ +  + ]:    18913280 :          do ic1 = BSp%lumo_spin(is1), Bsp%humo_spin(is1)
    1381                 :    14184960 :            ibnd_coarse = (iv1-BSp%lomo_spin(is1))*BSp%maxnbndc+(ic1-BSp%lumo_spin(is1)+1)
    1382                 :             : 
    1383                 :    14184960 :            ik_coarse = grid%dense_to_coarse(ik_dense)
    1384                 :    14184960 :            itt = BSp%vcks2t(iv1,ic1,ik_coarse,is1)
    1385                 :    17731200 :            b(ibnd_coarse) = test(interpolator%corresp(itt,ineighbour,is1))
    1386                 :             :          end do ! ic1
    1387                 :             :        end do ! iv1
    1388                 :             :      end do ! is1
    1389                 :             : 
    1390         [ +  + ]:     2364160 :      do is = 1, BSp%nsppol
    1391         [ +  + ]:     5910400 :        do iv = BSp%lomo_spin(is),Bsp%homo_spin(is)
    1392         [ +  + ]:    18913280 :          do ic = BSp%lumo_spin(is),BSp%humo_spin(is)
    1393                 :    14184960 :            ibnd_coarse = (iv-BSp%lomo_spin(is))*Bsp%maxnbndc+(ic-BSp%lumo_spin(is)+1)
    1394                 :    14184960 :            idense = BSp%vcks2t_interp(iv,ic,ik_dense,is)
    1395                 :             : 
    1396                 :             :            !A(ibnd_coarse,:) = CONJG(overlaps(idense,:,ineighbour))
    1397                 :             : 
    1398                 :             :            ! Should be optimized !!!
    1399         [ +  + ]:    60286080 :            do iv1 = BSp%lomo_spin(is),Bsp%homo_spin(is)
    1400         [ +  + ]:   226959360 :              do ic1 = BSp%lumo_spin(is),Bsp%humo_spin(is)
    1401                 :   170219520 :                ibnd_coarse1 = (iv1-BSp%lomo_spin(is))*BSp%maxnbndc+(ic1-BSp%lumo_spin(is)+1)
    1402                 :             :                A(ibnd_coarse,ibnd_coarse1) = (interpolator%overlaps(iv1,iv,ineighbour,ik_dense,is)) &
    1403                 :   212774400 :                                             *GWPC_CONJG(interpolator%overlaps(ic1,ic,ineighbour,ik_dense,is))
    1404                 :             :              end do !ic1
    1405                 :             :            end do !iv1
    1406                 :             :          end do ! ic
    1407                 :             :        end do !iv
    1408                 :             :      end do !is
    1409                 :             : 
    1410                 :             :      if(use_blas) then
    1411                 :     1182080 :        call xgemv('N',nbnd_coarse,nbnd_coarse,cone,A,nbnd_coarse,b,1,czero,c,1)
    1412                 :             :      else
    1413                 :             :        c = MATMUL(A,b)
    1414                 :             :      end if
    1415                 :             : 
    1416         [ +  + ]:     2382630 :      do is = 1, BSp%nsppol
    1417         [ +  + ]:     5910400 :        do iv = BSp%lomo_spin(is),Bsp%homo_spin(is)
    1418         [ +  + ]:    18913280 :          do ic = BSp%lumo_spin(is),BSp%humo_spin(is)
    1419                 :    14184960 :            ibnd_coarse = (iv-BSp%lomo_spin(is))*BSp%maxnbndc+(ic-BSp%lumo_spin(is)+1)
    1420                 :    14184960 :            idense = Bsp%vcks2t_interp(iv,ic,ik_dense,is)
    1421                 :             :            !ophi(ik_dense,ineighbour,ibnd_coarse) = c(idense)
    1422                 :    17731200 :            ophi(ik_dense,ineighbour,ibnd_coarse) = c(ibnd_coarse)
    1423                 :             :          end do
    1424                 :             :        end do
    1425                 :             :      end do
    1426                 :             : 
    1427                 :             :    end do ! ik_dense
    1428                 :             :  end do ! ineighbour
    1429                 :             : 
    1430                 :             :  !call xmpi_sum_(ophi,comm,ierr)
    1431                 :             : 
    1432         [ -  + ]:        3259 :  ABI_FREE(A)
    1433         [ -  + ]:        3259 :  ABI_FREE(b)
    1434         [ -  + ]:        3259 :  ABI_FREE(c)
    1435                 :             : 
    1436                 :             :  ! Outer indices : it_dense
    1437                 :             :  ! Sum over neighbours
    1438                 :             :  ! Index of result : it_dense (ik,ic,iv dense)
    1439                 :             : 
    1440   [ -  +  +  -  :        9777 :  ABI_MALLOC(b,(interpolator%nvert))
          +  -  +  -  -  
                +  -  + ]
    1441   [ -  +  +  -  :        6518 :  ABI_MALLOC(c,(interpolator%nvert))
             -  +  +  - ]
    1442                 :             : 
    1443         [ +  + ]:        6518 :  do is = 1, BSp%nsppol
    1444         [ +  + ]:     2509430 :    do itt = 1,BSp%nreh_interp(is)
    1445                 :             :     ! From itt -> ik_ibz,ic,iv
    1446                 :     2502912 :     ik_dense = BSp%Trans_interp(itt,is)%k
    1447                 :     2502912 :     ic = BSp%Trans_interp(itt,is)%c
    1448                 :     2502912 :     iv = BSp%Trans_interp(itt,is)%v
    1449                 :             : 
    1450                 :             :     ! From ik_ibz in the dense mesh -> indices_dense
    1451                 :     2502912 :     ik_coarse = grid%dense_to_coarse(ik_dense)
    1452                 :     2502912 :     it_coarse = BSp%vcks2t(iv,ic,ik_coarse,is)
    1453                 :             : 
    1454                 :     2502912 :     ibnd_coarse = (iv-BSp%lomo_spin(is))*BSp%maxnbndc+(ic-BSp%lumo_spin(is)+1)
    1455                 :             : 
    1456                 :     2502912 :     ikpt = kdense2div(ik_dense)
    1457                 :             :     !ikpt = -1
    1458                 :             :     !do ix = 1,grid%ndiv
    1459                 :             :     !  if (indices(it_coarse,ix) == ik_dense) then
    1460                 :             :     !    ikpt = ix
    1461                 :             :     !    exit
    1462                 :             :     !  end if
    1463                 :             :     !end do
    1464                 :             :     !ABI_CHECK(ikpt/=-1,"Cannot find ik_dense")
    1465                 :             : 
    1466                 :             :     !b = interp_factors(it_coarse,:,ikpt)
    1467   [ +  -  -  +  :    19190784 :     b = interpolator%interp_factors(:,ikpt)
             -  -  +  + ]
    1468   [ +  -  -  +  :    19190784 :     c =  ophi(ik_dense,:,ibnd_coarse)
             -  -  +  + ]
    1469                 :             : 
    1470                 :     2506171 :     hphi(itt) = hphi(itt) + xdotc(interpolator%nvert, b, 1, c, 1)
    1471                 :             :    end do
    1472                 :             :  end do
    1473                 :             : 
    1474         [ -  + ]:        3259 :  ABI_FREE(b)
    1475         [ -  + ]:        3259 :  ABI_FREE(c)
    1476                 :             : 
    1477                 :        3259 : end subroutine hexc_interp_matmul
    1478                 :             : !!***
    1479                 :             : 
    1480                 :             : !-------------------------------------------------------------------
    1481                 :             : 
    1482                 :             : !!****f* m_hexc/hexc_matmul_tda
    1483                 :             : !! NAME
    1484                 :             : !! hexc_matmul_tda
    1485                 :             : !!
    1486                 :             : !! FUNCTION
    1487                 :             : !! Compute H_exc |\psi>
    1488                 :             : !!
    1489                 :             : !! INPUTS
    1490                 :             : !! hexc_i<hexc_interp_t> = Interpolated excitonic hamiltonian
    1491                 :             : !! phi = Input ket
    1492                 :             : !!
    1493                 :             : !! OUTPUT
    1494                 :             : !! hphi = hreso * phi
    1495                 :             : !!
    1496                 :             : !! SOURCE
    1497                 :             : 
    1498                 :        9793 : subroutine hexc_matmul_tda(hexc, hexc_i, phi, hphi)
    1499                 :             : 
    1500                 :             : !Arguments ---------------------------
    1501                 :             :  class(hexc_t),intent(in) :: hexc
    1502                 :             :  type(hexc_interp_t),intent(in) :: hexc_i
    1503                 :             :  complex(dp),intent(in) :: phi(hexc%hsize)
    1504                 :             :  complex(dp),intent(out) :: hphi(hexc%hsize)
    1505                 :             : 
    1506                 :             : !Local variables ---------------------
    1507                 :             :  integer :: ierr
    1508                 :             :  real(dp) :: tsec(2)
    1509                 :             : !*****************************************************************************
    1510                 :             : 
    1511                 :        9793 :  call timab(697,1,tsec)
    1512                 :             : 
    1513         [ +  + ]:        9793 :  if (hexc%BSp%use_interp) then
    1514         [ +  + ]:     3352840 :    hphi = hexc_i%diag_dense * phi
    1515                 :             : 
    1516         [ +  + ]:        4360 :    if (any(hexc%BSp%interp_mode == [2,3,4])) then
    1517                 :             :      ! hphi = hphi + MATMUL(hinterp,phi)
    1518                 :        2211 :      call xgemv('N',hexc_i%hsize_dense,hexc_i%hsize_dense,cone,hexc_i%hinterp,hexc_i%hsize_dense,phi,1,cone,hphi,1)
    1519         [ +  + ]:        2211 :      if (any(hexc%BSp%interp_mode == [2,4])) then
    1520                 :        1101 :        call timab(697,2,tsec)
    1521                 :        1101 :        return ! We are done
    1522                 :             :      end if
    1523                 :             :    end if
    1524                 :             : 
    1525                 :             :    call hexc_interp_matmul(hexc%bsp, hexc%hsize_coarse, hexc_i%hsize_dense, hexc_i%all_hmat, phi, hphi, &
    1526                 :        3259 :      hexc_i%interpolator%double_grid,hexc%nbnd_coarse, hexc_i%interpolator, hexc_i%div2kdense, hexc_i%kdense2div)
    1527                 :             : 
    1528                 :             :  else ! No interpolation
    1529                 :        5433 :    call xgemv('N',hexc%hsize,hexc%my_nt,cone,hexc%hreso,hexc%hsize,phi,1,czero,hphi,1)
    1530                 :        5433 :    call xmpi_sum(hphi,hexc%comm,ierr)
    1531                 :             :  end if
    1532                 :             : 
    1533                 :        8692 :  call timab(697,2,tsec)
    1534                 :             : 
    1535                 :             : end subroutine hexc_matmul_tda
    1536                 :             : !!***
    1537                 :             : 
    1538                 :             : !-------------------------------------------------------------------
    1539                 :             : 
    1540                 :             : !!****f* m_hexc/hexc_matmul_elphon
    1541                 :             : !! NAME
    1542                 :             : !! hexc_matmul_elphon
    1543                 :             : !!
    1544                 :             : !! FUNCTION
    1545                 :             : !! Compute H | \psi > + E_{elphon} | \psi >
    1546                 :             : !!
    1547                 :             : !! INPUTS
    1548                 :             : !! hexc<hexc_t> = Excitonic hamiltonian
    1549                 :             : !! phi = Input ket
    1550                 :             : !! ep_renorm = vector with electron-phonon renorms
    1551                 :             : !! op = 'N' for H | psi >, 'C' for H^\dagger | psi >
    1552                 :             : !!
    1553                 :             : !! OUTPUT
    1554                 :             : !! hphi = hreso * phi + ep_renorm * phi
    1555                 :             : !!
    1556                 :             : !! SOURCE
    1557                 :             : 
    1558                 :        6432 : subroutine hexc_matmul_elphon(hexc, phi, hphi, op, ep_renorm)
    1559                 :             : 
    1560                 :             : !Arguments ---------------------------
    1561                 :             :  class(hexc_t),intent(in) :: hexc
    1562                 :             :  character,intent(in) :: op
    1563                 :             :  complex(dp),intent(in) :: phi(hexc%my_nt)
    1564                 :             :  complex(dp),intent(out) :: hphi(hexc%hsize)
    1565                 :             :  complex(dp),intent(in) :: ep_renorm(hexc%hsize)
    1566                 :             : 
    1567                 :             : !Local variables ---------------------
    1568                 :             :  integer :: ierr
    1569                 :             :  real(dp) :: tsec(2)
    1570                 :             : !*****************************************************************************
    1571                 :             : 
    1572                 :        6432 :  call timab(697,1,tsec)
    1573                 :             : 
    1574         [ -  + ]:        6432 :  if(hexc%BSp%use_interp) then
    1575                 :           0 :    ABI_ERROR('Not yet implemented with interpolation !')
    1576                 :             :  else ! No interpolation
    1577                 :             :    ! As our matrix is hermitian (hreso), we should always use 'N' here (it is stored column-wise !)
    1578                 :        6432 :    call xgemv('N',hexc%hsize,hexc%my_nt,cone,hexc%hreso,hexc%hsize,phi,1,czero,hphi,1)
    1579                 :             : 
    1580                 :             :    !!! ep_renorm is stored on each cpu
    1581         [ +  + ]:        6432 :    if (op == 'N') then
    1582         [ +  + ]:      311952 :      hphi(hexc%my_t1:hexc%my_t2) = hphi(hexc%my_t1:hexc%my_t2) + ep_renorm(hexc%my_t1:hexc%my_t2) * phi
    1583         [ +  - ]:        3216 :    else if(op == 'C') then
    1584         [ +  + ]:      311952 :      hphi(hexc%my_t1:hexc%my_t2) = hphi(hexc%my_t1:hexc%my_t2) + CONJG(ep_renorm(hexc%my_t1:hexc%my_t2)) * phi
    1585                 :             :    end if
    1586                 :        6432 :    call xmpi_sum(hphi,hexc%comm,ierr)
    1587                 :             :  end if
    1588                 :             : 
    1589                 :        6432 :  call timab(697,2,tsec)
    1590                 :             : 
    1591                 :        6432 : end subroutine hexc_matmul_elphon
    1592                 :             : !!***
    1593                 :             : 
    1594                 :             : !-------------------------------------------------------------------
    1595                 :             : 
    1596                 :             : !!****f* m_hexc/hexc_matmul_full
    1597                 :             : !! NAME
    1598                 :             : !! hexc_matmul_full
    1599                 :             : !!
    1600                 :             : !! FUNCTION
    1601                 :             : !! Compute H | \psi >
    1602                 :             : !!
    1603                 :             : !! INPUTS
    1604                 :             : !! hexc<hexc_t> = Excitonic hamiltonian
    1605                 :             : !! hexc_i<hexc_interp_t> = Interpolated hamiltonian
    1606                 :             : !! phi = Input ket
    1607                 :             : !! parity = -1 or +1 parameter
    1608                 :             : !!
    1609                 :             : !! OUTPUT
    1610                 :             : !! hphi = hreso * phi + parity * hcoup * CONJ(phi)
    1611                 :             : !!
    1612                 :             : !! SOURCE
    1613                 :             : 
    1614                 :           0 : subroutine hexc_matmul_full(hexc, hexc_i, phi, hphi, parity)
    1615                 :             : 
    1616                 :             : !Arguments ---------------------------
    1617                 :             :  class(hexc_t),intent(in) :: hexc
    1618                 :             :  type(hexc_interp_t),intent(in) :: hexc_i
    1619                 :             :  complex(dp),intent(in) :: phi(hexc%hsize)
    1620                 :             :  complex(dp),intent(out) :: hphi(hexc%hsize)
    1621                 :             :  integer,intent(in) :: parity
    1622                 :             : 
    1623                 :             : !Local variables ---------------------
    1624                 :             :  real(dp) :: tsec(2)
    1625                 :             : !*****************************************************************************
    1626                 :             : 
    1627                 :           0 :  call timab(697,1,tsec)
    1628                 :             : 
    1629                 :             :  ABI_UNUSED(hexc_i%hsize_dense)
    1630                 :             : 
    1631         [ #  # ]:           0 :  if(hexc%BSp%use_interp) then
    1632                 :           0 :    ABI_ERROR("Coupling is not yet implemented with interpolation")
    1633                 :             :  else
    1634                 :             :    ! No interpolation
    1635   [ #  #  #  #  :           0 :    hphi = MATMUL(hexc%hreso,phi) + parity * MATMUL(hexc%hcoup,CONJG(phi))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    1636                 :             :  end if
    1637                 :             : 
    1638                 :           0 :  call timab(697,2,tsec)
    1639                 :             : 
    1640                 :           0 : end subroutine hexc_matmul_full
    1641                 :             : !!***
    1642                 :             : 
    1643                 :             : !-------------------------------------------------------------------
    1644                 :             : 
    1645   [ #  #  #  #  :           0 : end module m_hexc
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
    1646                 :             : !!***
        

Generated by: LCOV version 2.3-1