LCOV - code coverage report
Current view: top level - src/72_response - m_dfpt_fef.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 99.7 % 1278 1274
Test Date: 2026-09-20 18:56:22 Functions: 100.0 % 8 8

            Line data    Source code
       1              : !!****m* ABINIT/m_dfpt_fef
       2              : !! NAME
       3              : !!  m_dfpt_fef
       4              : !!
       5              : !! FUNCTION
       6              : !!  Response calculations in finite electric field.
       7              : !!
       8              : !! COPYRIGHT
       9              : !!  Copyright (C) 2004-2026 ABINIT group (XW).
      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_dfpt_fef
      23              : 
      24              :  use defs_basis
      25              :  use m_abicore
      26              :  use m_errors
      27              :  use m_efield
      28              :  use m_dtset
      29              : 
      30              :  use defs_abitypes, only : MPI_type
      31              :  use m_kg,        only : kpgio
      32              :  use m_cgtools,   only : overlap_g
      33              :  use m_xmpi
      34              :  use m_mpinfo
      35              : 
      36              :  implicit none
      37              : 
      38              :  private
      39              : !!***
      40              : 
      41              :  public :: dfptff_initberry
      42              :  public :: dfptff_gradberry
      43              :  public :: dfptff_gbefd
      44              :  public :: dfptff_edie
      45              :  public :: dfptff_ebp
      46              :  public :: dfptff_die
      47              :  public :: dfptff_bec
      48              :  public :: qmatrix
      49              : !!***
      50              : 
      51              : contains
      52              : !!***
      53              : 
      54              : !!****f* ABINIT/dfptff_initberry
      55              : !! NAME
      56              : !! dfptff_initberry
      57              : !!
      58              : !! FUNCTION
      59              : !! Initialization of response calculations in finite electric field.
      60              : !!
      61              : !! INPUTS
      62              : !! dtset <type(dataset_type)> = all input variables in this dataset
      63              : !! gmet(3,3) = reciprocal space metric tensor in bohr**-2
      64              : !! kg(3,mpw*mkmem_rbz) = reduced (integer) coordinates of G vecs in basis sphere
      65              : !! kg1(3,mpw1*mkmem_rbz) = reduced (integer) coordinates of G vecs for response wfs
      66              : !! mband =  maximum number of bands
      67              : !! mkmem_rbz = maximum number of k-points in core memory
      68              : !! mpw = maximum number of plane waves
      69              : !! mpw1 = maximum number of plane waves for response wavefunctions
      70              : !! nkpt = number of k points
      71              : !! npwarr(nkpt) = number of planewaves in basis and boundary at this k point
      72              : !! npwar1(nkpt) = number of planewaves in basis and boundary for response wfs
      73              : !! nsppol = 1 for unpolarized, 2 for spin-polarized
      74              : !! occ(mband*nkpt*nsppol) = occup number for each band at each k point
      75              : !! rprimd(3,3) = dimensional primitive vectors
      76              : !!
      77              : !! OUTPUT
      78              : !! dtefield=variables related to response Berry-phase calculation
      79              : !! pwindall(max(mpw,mpw1)*mkmem_rbz,8,3) = array used to compute the overlap matrices
      80              : !! pwindall(:,1,:) <- <u^(0)_i|u^(0)_i+1>
      81              : !! pwindall(:,2,:) <- <u^(0)_i|u^(0)_i-1>
      82              : !! pwindall(:,3,:) <- <u^(1)_i|u^(1)_i+1>
      83              : !! pwindall(:,4,:) <- <u^(1)_i|u^(1)_i-1>
      84              : !! pwindall(:,5,:) <- <u^(1)_i|u^(0)_i+n+1>
      85              : !! pwindall(:,6,:) <- <u^(1)_i|u^(0)_i+n-1>
      86              : !! pwindall(:,7,:) <- <u^(0)_i|u^(1)_i-n+1>
      87              : !! pwindall(:,8,:) <- <u^(0)_i|u^(1)_i-n-1>
      88              : !!
      89              : !! NOTES
      90              : !!      this duplicates in part initberry for the init of the dtefield - should be made
      91              : !!      into a common constructor in m_dtefield or somethin
      92              : !!
      93              : !! SOURCE
      94              : 
      95            9 : subroutine dfptff_initberry(dtefield,dtset,gmet,kg,kg1,mband,mkmem_rbz,mpi_enreg,&
      96            9 : &                mpw,mpw1,nkpt,npwarr,npwar1,nsppol,occ,pwindall,rprimd)
      97              : 
      98              : !Arguments ----------------------------------------
      99              : !scalars
     100              :  integer,intent(in) :: mband,mkmem_rbz,mpw,mpw1,nkpt,nsppol
     101              :  type(MPI_type),intent(inout) :: mpi_enreg
     102              :  type(dataset_type),intent(in) :: dtset
     103              :  type(efield_type),intent(inout) :: dtefield !vz_i needs efield2
     104              : !arrays
     105              :  integer,intent(in) :: kg(3,mpw*mkmem_rbz),kg1(3,mpw1*mkmem_rbz),npwar1(nkpt)
     106              :  integer,intent(in) :: npwarr(nkpt)
     107              :  integer,intent(out) :: pwindall(max(mpw,mpw1)*mkmem_rbz,8,3)
     108              :  real(dp),intent(in) :: gmet(3,3),occ(mband*nkpt*nsppol),rprimd(3,3)
     109              : 
     110              : !Local variables ----------------------------------
     111              : !scalars
     112              :  integer :: flag,iband,icg,idir,ifor,ikg,ikg1,ikpt,ikpt1,ikpt2,ikstr
     113              :  integer :: index,ipw,isppol,istr,iunmark,jpw,nband_k,mband_occ_k,nkstr,npw_k
     114              :  integer :: npw_k1,orig
     115              :  real(dp) :: ecut_eff,occ_val
     116              :  character(len=500) :: message
     117              : !arrays
     118              :  integer :: dg(3)
     119            9 :  integer,allocatable :: kg_tmp(:,:),kpt_mark(:),npwarr_tmp(:),npwtot(:)
     120              :  real(dp) :: diffk(3),dk(3)
     121            9 :  real(dp),allocatable :: kpt1(:,:)
     122              : 
     123              : ! *************************************************************************
     124              : 
     125              : !-----------------------------------------------------------
     126              : !---------------- initilize dtefield //---------------------
     127              : !-----------------------------------------------------------
     128              : 
     129              : !Initialization of efield_type variables
     130           36 :  dtefield%efield_dot(:) = zero
     131          117 :  dtefield%dkvecs(:,:) = zero
     132            9 :  dtefield%maxnstr = 0    ; dtefield%maxnkstr  = 0
     133           63 :  dtefield%nstr(:) = 0    ; dtefield%nkstr(:) = 0
     134           36 :  ABI_MALLOC(dtefield%ikpt_dk,(nkpt,9,3))
     135           36 :  ABI_MALLOC(dtefield%cgindex,(nkpt,nsppol*2))
     136           27 :  ABI_MALLOC(dtefield%kgindex,(nkpt))
     137         2223 :  dtefield%ikpt_dk(:,:,:) = 0
     138          171 :  dtefield%cgindex(:,:) = 0
     139            9 :  dtefield%mband_occ = 0
     140           27 :  ABI_MALLOC(dtefield%nband_occ,(nsppol))
     141           18 :  dtefield%nband_occ = 0
     142        74556 :  pwindall(:,:,:) = 0
     143              : 
     144              : !Compute the number of occupied bands and check that--------
     145              : !it is the same for each k-point----------------------------
     146              : 
     147            9 :  occ_val = two/(dtset%nsppol*one)
     148              : 
     149            9 :  index = 0
     150           18 :  do isppol = 1, nsppol
     151           90 :    do ikpt = 1, nkpt
     152              : 
     153           72 :      mband_occ_k = 0
     154           72 :      nband_k = dtset%nband(ikpt)
     155              : 
     156          360 :      do iband = 1, nband_k
     157          288 :        index = index + 1
     158          360 :        if (abs(occ(index) - occ_val) < tol8) mband_occ_k = mband_occ_k + 1
     159              :      end do
     160              : 
     161           81 :      if (ikpt > 1) then
     162           63 :        if (dtefield%nband_occ(isppol) /= mband_occ_k) then
     163            0 :          message = ' The number of valence bands is not the same for every k-point for present spin'
     164            0 :          ABI_ERROR(message)
     165              :        end if
     166              :      else
     167            9 :        dtefield%mband_occ = max(dtefield%mband_occ,mband_occ_k)
     168            9 :        dtefield%nband_occ(isppol) = mband_occ_k
     169              :      end if
     170              : 
     171              :    end do
     172              :  end do
     173              : 
     174              : !DEBUG
     175              : !write(std_out,*)'dfptff_initberry:nkpt',nkpt
     176              : !ENDDEBUG
     177              : 
     178              : !Compute the location of zero-order wavefunction --------------
     179              :  icg = 0
     180           18 :  do isppol = 1, nsppol
     181           90 :    do ikpt = 1, nkpt
     182              : 
     183           72 :      dtefield%cgindex(ikpt,isppol) = icg
     184           72 :      nband_k = dtset%nband(ikpt)
     185           72 :      npw_k = npwarr(ikpt)
     186              :      icg = icg + dtset%nspinor*npw_k*&
     187           81 : &       proc_distrb_nband(mpi_enreg%proc_distrb,ikpt,nband_k,1,mpi_enreg%me_band)
     188              : 
     189              :    end do
     190              :  end do
     191              : 
     192              : !Compute the location of kg --------------
     193            9 :  ikg = 0
     194           81 :  do ikpt = 1, nkpt
     195              : 
     196           72 :    dtefield%kgindex(ikpt) = ikg
     197           72 :    npw_k = npwarr(ikpt)
     198           81 :    ikg = ikg + npw_k
     199              : 
     200              :  end do
     201              : 
     202              : !Compute the location of first-order wavefunction -------------------
     203              :  icg = 0
     204           18 :  do isppol = 1, nsppol
     205           90 :    do ikpt = 1, nkpt
     206              : 
     207           72 :      dtefield%cgindex(ikpt,isppol+nsppol) = icg
     208           72 :      nband_k = dtset%nband(ikpt)
     209           72 :      npw_k = npwar1(ikpt)
     210              :      icg = icg + dtset%nspinor*npw_k* &
     211           81 : &       proc_distrb_nband(mpi_enreg%proc_distrb,ikpt,nband_k,1,mpi_enreg%me_band)
     212              : 
     213              :    end do
     214              :  end do
     215              : 
     216              : !Compute the reciprocal lattice coordinates of the electric field-----
     217              : 
     218           36 :  dtefield%efield_dot(1) = dot_product(dtset%efield(:),rprimd(:,1))
     219           36 :  dtefield%efield_dot(2) = dot_product(dtset%efield(:),rprimd(:,2))
     220           36 :  dtefield%efield_dot(3) = dot_product(dtset%efield(:),rprimd(:,3))
     221              : 
     222            9 :  write(message,'(a,a,a,a,3(2x,f16.9),a)')ch10,&
     223            9 : & ' initberry: Reciprocal lattice coordinates of the electric field',ch10,&
     224           18 : & '  efield_dot(1:3) = ',dtefield%efield_dot(1:3),ch10
     225            9 :  call wrtout(std_out,message,'COLL')
     226              : 
     227              : !find the related k points to every k point in full BZ-----------------
     228              : !TODO: import hash tables for k-points, to make lookup fast and check for missing
     229              : ! matches
     230              : 
     231              : !loop over three reciprocal directions
     232           36 :  do idir = 1, 3
     233              : 
     234           27 :    if (dtset%rfdir(idir) == 1) then
     235              : 
     236              : !    Compute dk(:), the vector between a k-point and its nearest
     237              : !    neighbour along the direction idir
     238              : 
     239           27 :      dk(:) = zero
     240           27 :      dk(idir) = 1000_dp   ! initialize with a big number
     241          216 :      do ikpt = 2, nkpt
     242          756 :        diffk(:) = abs(dtset%kptns(:,ikpt) - dtset%kptns(:,1))
     243          189 :        if ((diffk(1) < dk(1)+tol8).and.(diffk(2) < dk(2)+tol8).and.&
     244           54 : &       (diffk(3) < dk(3)+tol8)) dk(:) = diffk(:)
     245              :      end do
     246          108 :      dtefield%dkvecs(:,idir) = dk(:)
     247              : 
     248              : !    For each k point, find k_prim such that k_prim= k + dk mod(G)
     249              : !    where G is a vector of the reciprocal lattice
     250              : 
     251          243 :      do ikpt = 1, nkpt
     252              : 
     253              : !      First: k + dk
     254          972 :        do ikpt1 = 1, nkpt
     255         3888 :          diffk(:) = abs(dtset%kptns(:,ikpt1) - dtset%kptns(:,ikpt) - dk(:))
     256         3888 :          if(sum(abs(diffk(:) - nint(diffk(:)))) < 3*tol8) then
     257          216 :            dtefield%ikpt_dk(ikpt,1,idir) = ikpt1
     258          216 :            exit
     259              :          end if
     260              :        end do
     261              : 
     262              : !      Second: k - dk
     263          972 :        do ikpt1 = 1, nkpt
     264         3888 :          diffk(:) = abs(dtset%kptns(:,ikpt1) - dtset%kptns(:,ikpt) + dk(:))
     265         3888 :          if(sum(abs(diffk(:) - nint(diffk(:)))) < 3*tol8) then
     266          216 :            dtefield%ikpt_dk(ikpt,2,idir) = ikpt1
     267          216 :            exit
     268              :          end if
     269              :        end do
     270              : 
     271              : !      new
     272              : !      3rd: k + (n+1)dk
     273              : 
     274          972 :        do ikpt1 = 1, nkpt
     275         3888 :          diffk(:) = abs(dtset%kptns(:,ikpt1) - dtset%kptns(:,ikpt) - dk(:) - dtset%qptn(:))
     276         3888 :          if(sum(abs(diffk(:) - nint(diffk(:)))) < 3*tol8) then
     277          216 :            dtefield%ikpt_dk(ikpt,3,idir) = ikpt1
     278          216 :            exit
     279              :          end if
     280              :        end do
     281              : 
     282              : !      6th: k - (n+1)dk
     283              : 
     284          972 :        do ikpt1 = 1, nkpt
     285         3888 :          diffk(:) = abs(dtset%kptns(:,ikpt1) - dtset%kptns(:,ikpt) + dk(:) + dtset%qptn(:))
     286         3888 :          if(sum(abs(diffk(:) - nint(diffk(:)))) < 3*tol8) then
     287          216 :            dtefield%ikpt_dk(ikpt,6,idir) = ikpt1
     288          216 :            exit
     289              :          end if
     290              :        end do
     291              : 
     292              : !      4th: k + (n-1)dk
     293              : 
     294          972 :        do ikpt1 = 1, nkpt
     295         3888 :          diffk(:) = abs(dtset%kptns(:,ikpt1) - dtset%kptns(:,ikpt) + dk(:) - dtset%qptn(:))
     296         3888 :          if(sum(abs(diffk(:) - nint(diffk(:)))) < 3*tol8) then
     297          216 :            dtefield%ikpt_dk(ikpt,4,idir) = ikpt1
     298          216 :            exit
     299              :          end if
     300              :        end do
     301              : 
     302              : !      5th: k - (n-1)dk
     303              : 
     304          972 :        do ikpt1 = 1, nkpt
     305         3888 :          diffk(:) = abs(dtset%kptns(:,ikpt1) - dtset%kptns(:,ikpt) - dk(:) + dtset%qptn(:))
     306         3888 :          if(sum(abs(diffk(:) - nint(diffk(:)))) < 3*tol8) then
     307          216 :            dtefield%ikpt_dk(ikpt,5,idir) = ikpt1
     308          216 :            exit
     309              :          end if
     310              :        end do
     311              : 
     312              : !      7th: k+n dk
     313              : 
     314          972 :        do ikpt1 = 1, nkpt
     315         3888 :          diffk(:) = abs(dtset%kptns(:,ikpt1) - dtset%kptns(:,ikpt) - dtset%qptn(:))
     316         3888 :          if(sum(abs(diffk(:) - nint(diffk(:)))) < 3*tol8) then
     317          216 :            dtefield%ikpt_dk(ikpt,7,idir) = ikpt1
     318          216 :            exit
     319              :          end if
     320              :        end do
     321              : 
     322              : !      8th: k-n dk
     323              : 
     324          972 :        do ikpt1 = 1, nkpt
     325         3888 :          diffk(:) = abs(dtset%kptns(:,ikpt1) - dtset%kptns(:,ikpt) + dtset%qptn(:))
     326         3888 :          if(sum(abs(diffk(:) - nint(diffk(:)))) < 3*tol8) then
     327          216 :            dtefield%ikpt_dk(ikpt,8,idir) = ikpt1
     328          216 :            exit
     329              :          end if
     330              :        end do
     331              : 
     332              : !      9th: -k
     333              : 
     334          999 :        do ikpt1 = 1, nkpt
     335         3888 :          diffk(:) = abs(dtset%kptns(:,ikpt1) + dtset%kptns(:,ikpt))
     336         3888 :          if(sum(diffk(:))  < 3*tol8) then
     337          216 :            dtefield%ikpt_dk(ikpt,9,idir) = ikpt1
     338          216 :            exit
     339              :          end if
     340              :        end do
     341              : 
     342              :      end do     ! ikpt
     343              : 
     344              : 
     345              : 
     346              : !    Find the string length, starting from k point 1
     347              : !    (all strings must have the same number of points)
     348              : 
     349           27 :      nkstr = 1
     350           27 :      ikpt1 = 1
     351           54 :      do ikpt = 1, nkpt
     352           54 :        ikpt1 = dtefield%ikpt_dk(ikpt1,1,idir)
     353           54 :        if (ikpt1 == 1) exit
     354           54 :        nkstr = nkstr + 1
     355              :      end do
     356              : 
     357              : !    Check that the string length is a divisor of nkpt
     358           27 :      if(mod(nkpt,nkstr) /= 0) then
     359            0 :        write(message,'(a,i0,a,i0)')' The string length = ',nkstr,', is not a divisor of nkpt =',nkpt
     360            0 :        ABI_BUG(message)
     361              :      end if
     362           27 :      dtefield%nkstr(idir) = nkstr
     363           27 :      dtefield%nstr(idir)  = nkpt/nkstr
     364              : 
     365              :    end if      ! dtset%rfdir(idir) == 1
     366              : 
     367              :    write(message,'(a,i1,a,i3,a,i3)')&
     368           27 : &   '  dfptff_initberry: for direction ',idir,', nkstr = ',dtefield%nkstr(idir),&
     369           54 : &   ', nstr = ',dtefield%nstr(idir)
     370           36 :    call wrtout(std_out,message,'COLL')
     371              : 
     372              :  end do     ! close loop over idir
     373              : 
     374           36 :  dtefield%maxnstr  = maxval(dtefield%nstr(:))
     375           36 :  dtefield%maxnkstr = maxval(dtefield%nkstr(:))
     376           45 :  ABI_MALLOC(dtefield%idxkstr,(dtefield%maxnkstr,dtefield%maxnstr,3))
     377          360 :  dtefield%idxkstr(:,:,:) = 0
     378              : 
     379              : 
     380              : !Build the different strings------------------------------------------
     381              : 
     382           18 :  ABI_MALLOC(kpt_mark,(nkpt))
     383           36 :  do idir = 1, 3
     384              : 
     385           36 :    if (dtset%rfdir(idir) == 1) then
     386              : 
     387          243 :      iunmark = 1
     388          243 :      kpt_mark(:) = 0
     389          135 :      do istr = 1, dtefield%nstr(idir)
     390              : 
     391          234 :        do while(kpt_mark(iunmark) /= 0)
     392          126 :          iunmark = iunmark + 1
     393              :        end do
     394          108 :        dtefield%idxkstr(1,istr,idir) = iunmark
     395          108 :        kpt_mark(iunmark) = 1
     396          243 :        do ikstr = 2, dtefield%nkstr(idir)
     397          108 :          ikpt1 = dtefield%idxkstr(ikstr-1,istr,idir)
     398          108 :          ikpt2 = dtefield%ikpt_dk(ikpt1,1,idir)
     399          108 :          dtefield%idxkstr(ikstr,istr,idir) = ikpt2
     400          216 :          kpt_mark(ikpt2) = 1
     401              :        end do
     402              : 
     403              :      end do    ! istr
     404              : 
     405              :    end if         ! rfdir(idir) == 1
     406              : 
     407              :  end do           ! close loop over idir
     408              : 
     409            9 :  ABI_FREE(kpt_mark)
     410              : 
     411              : 
     412              : !Build the array pwindall that is needed to compute the different overlap matrices
     413              : !at k +- dk
     414              : 
     415           27 :  ABI_MALLOC(kg_tmp,(3,max(mpw,mpw1)*mkmem_rbz))
     416           27 :  ABI_MALLOC(kpt1,(3,nkpt))
     417           18 :  ABI_MALLOC(npwarr_tmp,(nkpt))
     418           18 :  ABI_MALLOC(npwtot,(nkpt))
     419            9 :  ecut_eff = dtset%ecut*(dtset%dilatmx)**2
     420              : 
     421           36 :  do idir = 1, 3
     422              : 
     423           36 :    if (dtset%rfdir(idir) == 1) then
     424              : 
     425          108 :      dk(:) = dtefield%dkvecs(:,idir)
     426              : 
     427           81 :      do ifor = 1, 2
     428              : 
     429          135 :        if (ifor == 2) dk(:) = -1_dp*dk(:)
     430              : 
     431              : !      Build the array kpt1 = kptns + dk
     432              : !      all k-poins of kpt1 must be in the same BZ as those of kptns
     433         1782 :        kpt1(:,:) = zero
     434          486 :        do ikpt = 1, nkpt
     435          432 :          ikpt1 = dtefield%ikpt_dk(ikpt,ifor,idir)
     436         1782 :          kpt1(:,ikpt) = dtset%kptns(:,ikpt1)
     437              :        end do  ! close loop over ikpt
     438              : 
     439              : !      Set up the basis sphere of plane waves at kpt1
     440        74358 :        kg_tmp(:,:) = 0
     441              :        call kpgio(ecut_eff,dtset%exchn2n3d,gmet,dtset%istwfk,kg_tmp,&
     442              : &       kpt1,mkmem_rbz,dtset%nband,nkpt,'PERS',mpi_enreg,mpw,&
     443           54 : &       npwarr_tmp,npwtot,dtset%nsppol)
     444              : 
     445           54 :        ikg = 0 ; ikg1 = 0
     446          513 :        do ikpt = 1, nkpt
     447              : 
     448          432 :          nband_k = dtset%nband(ikpt)
     449          432 :          ikpt1 = dtefield%ikpt_dk(ikpt,ifor,idir)
     450              : 
     451              : 
     452              :          dg(:) = nint(dtset%kptns(:,ikpt) + dk(:) + tol10 - &
     453         1728 : &         dtset%kptns(:,ikpt1))
     454              : 
     455          432 :          flag = 0; orig = 1
     456          432 :          if (dg(1)*dg(1) + dg(2)*dg(2) + dg(3)*dg(3) > 0) flag = 1
     457              : 
     458          432 :          ikpt1 = dtefield%ikpt_dk(ikpt,ifor,idir)
     459          432 :          npw_k  = npwarr(ikpt)
     460          432 :          npw_k1 = npwarr_tmp(ikpt)
     461              : 
     462        18360 :          do ipw = 1, npw_k
     463       275328 :            do jpw = orig, npw_k1
     464              :              if ((kg(1,ikg + ipw) == kg_tmp(1,ikg1 + jpw) - dg(1)).and. &
     465       271440 :              (kg(2,ikg + ipw) == kg_tmp(2,ikg1 + jpw) - dg(2)).and. &
     466         3456 :              (kg(3,ikg + ipw) == kg_tmp(3,ikg1 + jpw) - dg(3))) then
     467        14472 :                pwindall((ikpt-1)*max(mpw,mpw1) + ipw,ifor,idir) = jpw
     468        25164 :                if (flag == 0) orig = jpw
     469              :                exit
     470              :              end if
     471              :            end do
     472              :          end do
     473              : 
     474          432 :          ikg  = ikg + npw_k
     475          486 :          ikg1 = ikg1 + npw_k1
     476              : 
     477              :        end do    ! close loop over ikpt
     478              : 
     479              :      end do    ! close loop over ifor
     480              : 
     481              :    end if      ! rfdir(idir) == 1
     482              : 
     483              :  end do        ! close loop over idir
     484              : 
     485              : !------------------------------------------------------------------------------
     486              : !<u_q|u_q>
     487              : !at k +- dk
     488              : 
     489           36 :  do idir = 1, 3
     490              : 
     491           36 :    if (dtset%rfdir(idir) == 1) then
     492              : 
     493          108 :      dk(:) = dtefield%dkvecs(:,idir)
     494              : 
     495           81 :      do ifor = 1, 2
     496              : 
     497          135 :        if (ifor == 2) dk(:) = -1_dp*dk(:)
     498              : 
     499              : !      Build the array kpt1 = kptns + qptn + dk
     500              : !      all k-poins of kpt1 must be in the same BZ as those of kptns
     501         1782 :        kpt1(:,:) = zero
     502          486 :        do ikpt = 1, nkpt
     503          432 :          ikpt1 = dtefield%ikpt_dk(ikpt,ifor,idir)
     504         1782 :          kpt1(:,ikpt) = dtset%kptns(:,ikpt1)+dtset%qptn(:)
     505              :        end do  ! close loop over ikpt
     506              : 
     507              : !      Set UP THE BASIS SPHERE OF PLANE waves at kpt1
     508        74358 :        kg_tmp(:,:) = 0
     509              :        call kpgio(ecut_eff,dtset%exchn2n3d,gmet,dtset%istwfk,kg_tmp,&
     510              : &       kpt1,mkmem_rbz,dtset%nband,nkpt,'PERS',mpi_enreg,mpw1,&
     511           54 : &       npwarr_tmp,npwtot,dtset%nsppol)
     512              : 
     513              : 
     514           54 :        ikg = 0 ; ikg1 = 0
     515          513 :        do ikpt = 1, nkpt
     516              : 
     517          432 :          nband_k = dtset%nband(ikpt)
     518          432 :          ikpt1 = dtefield%ikpt_dk(ikpt,ifor,idir)
     519              : 
     520          432 :          if (proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,1,nband_k,1,mpi_enreg%me)) cycle
     521              : 
     522              :          dg(:) = nint(dtset%kptns(:,ikpt) + dk(:) + tol10 - &
     523         1728 : &         dtset%kptns(:,ikpt1))
     524              : 
     525          432 :          flag = 0; orig = 1
     526          432 :          if (dg(1)*dg(1) + dg(2)*dg(2) + dg(3)*dg(3) > 0) flag = 1
     527              : 
     528          432 :          ikpt1 = dtefield%ikpt_dk(ikpt,ifor,idir)
     529          432 :          npw_k  = npwar1(ikpt)
     530          432 :          npw_k1 = npwarr_tmp(ikpt)
     531              : 
     532        18360 :          do ipw = 1, npw_k
     533       275328 :            do jpw = orig, npw_k1
     534              :              if ((kg1(1,ikg + ipw) == kg_tmp(1,ikg1 + jpw) - dg(1)).and. &
     535       271440 :              (kg1(2,ikg + ipw) == kg_tmp(2,ikg1 + jpw) - dg(2)).and. &
     536         3456 :              (kg1(3,ikg + ipw) == kg_tmp(3,ikg1 + jpw) - dg(3))) then
     537        14472 :                pwindall((ikpt-1)*max(mpw,mpw1) +ipw,ifor+2,idir) = jpw
     538        25164 :                if (flag == 0) orig = jpw
     539              :                exit
     540              :              end if
     541              :            end do
     542              :          end do
     543              : 
     544          432 :          ikg  = ikg + npw_k
     545          486 :          ikg1 = ikg1 + npw_k1
     546              : 
     547              :        end do    ! close loop over ikpt
     548              :      end do    ! close loop over ifor
     549              :    end if      ! rfdir(idir) == 1
     550              :  end do        ! close loop over idir
     551              : 
     552              : 
     553              : !---------------------------------------------------------------------------
     554              : 
     555           36 :  do idir = 1, 3
     556              : 
     557           36 :    if (dtset%rfdir(idir) == 1) then
     558              : 
     559          108 :      dk(:) = dtset%qptn(:) + dtefield%dkvecs(:,idir)
     560              : 
     561           81 :      do ifor = 1, 2
     562              : 
     563          135 :        if (ifor == 2) dk(:) = dtset%qptn(:) - dtefield%dkvecs(:,idir)
     564              : 
     565              : !      Build the array kpt1 = kptns + qptn + dk
     566              : !      all k-poins of kpt1 must be in the same BZ as those of kptns
     567         1782 :        kpt1(:,:) = zero
     568          486 :        do ikpt = 1, nkpt
     569          432 :          ikpt1 = dtefield%ikpt_dk(ikpt,ifor+2,idir)
     570         1782 :          kpt1(:,ikpt) = dtset%kptns(:,ikpt1)
     571              :        end do  ! close loop over ikpt
     572              : 
     573              : !      Set UP THE BASIS SPHERE OF PLANE waves at kpt1
     574        74358 :        kg_tmp(:,:) = 0
     575              :        call kpgio(ecut_eff,dtset%exchn2n3d,gmet,dtset%istwfk,kg_tmp,&
     576              : &       kpt1,mkmem_rbz,dtset%nband,nkpt,'PERS',mpi_enreg,mpw,&
     577           54 : &       npwarr_tmp,npwtot,dtset%nsppol)
     578              : 
     579           54 :        ikg = 0 ; ikg1 = 0
     580          513 :        do ikpt = 1, nkpt
     581              : 
     582          432 :          nband_k = dtset%nband(ikpt)
     583          432 :          ikpt1 = dtefield%ikpt_dk(ikpt,ifor+2,idir)
     584              : 
     585          432 :          if (proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,1,nband_k,1,mpi_enreg%me)) cycle
     586              : 
     587              :          dg(:) = nint(dtset%kptns(:,ikpt) + dk(:) + tol10 - &
     588         1728 : &         dtset%kptns(:,ikpt1))
     589              : 
     590          432 :          flag = 0; orig = 1
     591          432 :          if (dg(1)*dg(1) + dg(2)*dg(2) + dg(3)*dg(3) > 0) flag = 1
     592              : 
     593          432 :          ikpt1 = dtefield%ikpt_dk(ikpt,ifor+2,idir)
     594          432 :          npw_k  = npwar1(ikpt)
     595          432 :          npw_k1 = npwarr_tmp(ikpt)
     596              : 
     597        18360 :          do ipw = 1, npw_k
     598       275328 :            do jpw = orig, npw_k1
     599              :              if ((kg1(1,ikg + ipw) == kg_tmp(1,ikg1 + jpw) - dg(1)).and. &
     600       271440 :              (kg1(2,ikg + ipw) == kg_tmp(2,ikg1 + jpw) - dg(2)).and. &
     601         3456 :              (kg1(3,ikg + ipw) == kg_tmp(3,ikg1 + jpw) - dg(3))) then
     602        14472 :                pwindall((ikpt-1)*max(mpw,mpw1)+ipw,ifor+4,idir) = jpw
     603        25164 :                if (flag == 0) orig = jpw
     604              :                exit
     605              :              end if
     606              :            end do
     607              :          end do
     608          432 :          ikg  = ikg + npw_k
     609          486 :          ikg1 = ikg1 + npw_k1
     610              : 
     611              :        end do    ! close loop over ikpt
     612              :      end do    ! close loop over ifor
     613              :    end if      ! rfdir(idir) == 1
     614              :  end do        ! close loop over idir===============================================================
     615              : 
     616              : 
     617              : !Build the array pwind3 that is needed to compute the overlap matrices===============================
     618              : 
     619           36 :  do idir = 1, 3
     620              : 
     621           36 :    if (dtset%rfdir(idir) == 1) then
     622              : 
     623          108 :      dk(:) = - dtset%qptn(:) + dtefield%dkvecs(:,idir)
     624              : 
     625           81 :      do ifor = 1, 2
     626              : 
     627          135 :        if (ifor == 2) dk(:) = - dtset%qptn(:) -  dtefield%dkvecs(:,idir)
     628              : 
     629              : !      Build the array kpt1 = kptns + qptn + dk
     630              : !      all k-poins of kpt1 must be in the same BZ as those of kptns
     631         1782 :        kpt1(:,:) = zero
     632          486 :        do ikpt = 1, nkpt
     633          432 :          ikpt1 = dtefield%ikpt_dk(ikpt,ifor+4,idir)
     634         1782 :          kpt1(:,ikpt) = dtset%kptns(:,ikpt1)+ dtset%qptn(:)
     635              :        end do  ! close loop over ikpt
     636              : 
     637              : !      Set UP THE BASIS SPHERE OF PLANE waves at kpt1
     638        74358 :        kg_tmp(:,:) = 0
     639              :        call kpgio(ecut_eff,dtset%exchn2n3d,gmet,dtset%istwfk,kg_tmp,&
     640              : &       kpt1,mkmem_rbz,dtset%nband,nkpt,'PERS',mpi_enreg,mpw1,&
     641           54 : &       npwarr_tmp,npwtot,dtset%nsppol)
     642              : 
     643           54 :        ikg = 0 ; ikg1 = 0
     644          513 :        do ikpt = 1, nkpt
     645              : 
     646          432 :          nband_k = dtset%nband(ikpt)
     647          432 :          ikpt1 = dtefield%ikpt_dk(ikpt,ifor+4,idir)
     648              : 
     649          432 :          if (proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,1,nband_k,1,mpi_enreg%me)) cycle
     650              : 
     651              :          dg(:) = nint(dtset%kptns(:,ikpt) + dk(:) + tol10 - &
     652         1728 : &         dtset%kptns(:,ikpt1))
     653              : 
     654          432 :          flag = 0; orig = 1
     655          432 :          if (dg(1)*dg(1) + dg(2)*dg(2) + dg(3)*dg(3) > 0) flag = 1
     656              : 
     657          432 :          ikpt1 = dtefield%ikpt_dk(ikpt,ifor+4,idir)
     658          432 :          npw_k  = npwarr(ikpt)
     659          432 :          npw_k1 = npwarr_tmp(ikpt)
     660              : 
     661        18360 :          do ipw = 1, npw_k
     662       275328 :            do jpw = orig, npw_k1
     663              :              if ((kg(1,ikg + ipw) == kg_tmp(1,ikg1 + jpw) - dg(1)).and. &
     664       271440 :              (kg(2,ikg + ipw) == kg_tmp(2,ikg1 + jpw) - dg(2)).and. &
     665         3456 :              (kg(3,ikg + ipw) == kg_tmp(3,ikg1 + jpw) - dg(3))) then
     666        14472 :                pwindall((ikpt-1)*max(mpw,mpw1) + ipw,ifor+6,idir) = jpw
     667        25164 :                if (flag == 0) orig = jpw
     668              :                exit
     669              :              end if
     670              :            end do
     671              :          end do
     672          432 :          ikg  = ikg + npw_k
     673          486 :          ikg1 = ikg1 + npw_k1
     674              : 
     675              :        end do    ! close loop over ikpt
     676              :      end do    ! close loop over ifor
     677              :    end if      ! rfdir(idir) == 1
     678              :  end do        ! close loop over idir====================================================================
     679              : 
     680            9 :  ABI_FREE(kg_tmp)
     681            9 :  ABI_FREE(kpt1)
     682            9 :  ABI_FREE(npwarr_tmp)
     683            9 :  ABI_FREE(npwtot)
     684              : 
     685            9 : end subroutine dfptff_initberry
     686              : !!***
     687              : 
     688              : !!****f* ABINIT/dfptff_gradberry
     689              : !! NAME
     690              : !! dfptff_gradberry
     691              : !!
     692              : !! FUNCTION
     693              : !! Calculation of the gradient of Berry-phase term in finite electric field.
     694              : !!
     695              : !! COPYRIGHT
     696              : !! Copyright (C) 2004-2026 ABINIT group (XW).
     697              : !! This file is distributed under the terms of the
     698              : !! GNU General Public License, see ~abinit/COPYING
     699              : !! or http://www.gnu.org/copyleft/gpl.txt .
     700              : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
     701              : !!
     702              : !! INPUTS
     703              : !! cg(2,mpw*nspinor*mband*mkmem_rbz*nsppol) = planewave coefficients of wavefunctions
     704              : !! cg1(2,mpw1*nspinor*mband*mk1mem*nsppol) = pw coefficients of
     705              : !! RF wavefunctions at k,q.
     706              : !! dtefield = variables related to finite electric field calculation
     707              : !! ikpt = the index of the current k point
     708              : !! isppol=1 for unpolarized, 2 for spin-polarized
     709              : !! mband =  maximum number of bands
     710              : !! mkmem_rbz = maximum number of k-points in core memory
     711              : !! mpw = maximum number of plane waves
     712              : !! mpw1 = maximum number of plane waves for response wavefunctions
     713              : !! nkpt = number of k points
     714              : !! npwarr(nkpt) = number of planewaves in basis and boundary at this k point
     715              : !! npwar1(nkpt) = number of planewaves in basis and boundary for response wfs
     716              : !! nspinor = 1 for scalar wfs, 2 for spinor wfs
     717              : !! nsppol = 1 for unpolarized, 2 for spin-polarized
     718              : !! qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3) =
     719              : !! inverse of the overlap matrix
     720              : !! pwindall(max(mpw,mpw1)*mkmem_rbz,8,3) = array used to compute the overlap matrices
     721              : !! pwindall(:,1,:) <- <u^(0)_i|u^(0)_i+1>
     722              : !! pwindall(:,2,:) <- <u^(0)_i|u^(0)_i-1>
     723              : !! pwindall(:,3,:) <- <u^(1)_i|u^(1)_i+1>
     724              : !! pwindall(:,4,:) <- <u^(1)_i|u^(1)_i-1>
     725              : !! pwindall(:,5,:) <- <u^(1)_i|u^(0)_i+n+1>
     726              : !! pwindall(:,6,:) <- <u^(1)_i|u^(0)_i+n-1>
     727              : !! pwindall(:,7,:) <- <u^(0)_i|u^(1)_i-n+1>
     728              : !! pwindall(:,8,:) <- <u^(0)_i|u^(1)_i-n-1>
     729              : !!
     730              : !! OUTPUT
     731              : !! grad_berry(2,mpw1,dtefield%mband_occ) = the gradient of the Berry phase term
     732              : !!
     733              : !! SOURCE
     734              : 
     735          488 : subroutine dfptff_gradberry(cg,cg1,dtefield,grad_berry,ikpt,isppol,&
     736              : &                     mband,mband_mem,mpw,mpw1,mkmem_rbz,mk1mem,&
     737              : &                     mpi_enreg,nkpt,&
     738          488 : &                     npwarr,npwar1,nspinor,nsppol,qmat,pwindall)
     739              : 
     740              : !Arguments ----------------------------------------
     741              : !scalars
     742              :  integer,intent(in) :: ikpt,isppol,mband,mk1mem,mkmem_rbz,mpw,mpw1,nkpt,nspinor
     743              :  integer,intent(in) :: mband_mem
     744              :  integer,intent(in) :: nsppol
     745              :  type(efield_type),intent(in) :: dtefield
     746              :  type(MPI_type),intent(in) :: mpi_enreg
     747              : !arrays
     748              :  integer,intent(in) :: npwar1(nkpt),npwarr(nkpt)
     749              :  integer,intent(in) :: pwindall(max(mpw,mpw1)*mkmem_rbz,8,3)
     750              :  real(dp),intent(in) :: cg(2,mpw*nspinor*mband_mem*mkmem_rbz*nsppol)
     751              :  real(dp),intent(in) :: cg1(2,mpw1*nspinor*mband_mem*mk1mem*nsppol)
     752              :  real(dp),intent(in) :: qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3)
     753              : !TODO MJV: grad_berry should also be dimensioned with mband_mem
     754              :  real(dp),intent(out) :: grad_berry(2,mpw1,dtefield%mband_occ)
     755              : 
     756              : !Local variables -------------------------
     757              : !scalars
     758              :  integer :: iband,icg,icg1,idir,ikpt1
     759              :  integer :: iband_me, jband_me, me_band, ierr
     760              :  integer :: ikpt1m,ikptn,ikptnm,ikptnp1,ipw,jband,jpw,kband
     761              :  integer :: mpw_tmp,npw_k1,npw_k2,pwmax,pwmin
     762              :  real(dp) :: doti,dotr,fac,wfi,wfr
     763              : !arrays
     764          976 :  integer :: band_procs(mband)
     765          488 :  integer,allocatable :: pwind_tmp(:)
     766              :  real(dp) :: z1(2),z2(2)
     767          488 :  real(dp),allocatable :: Amat(:,:,:),Bmat(:,:,:),s1mat(:,:,:),vect1(:,:)
     768              :  real(dp),allocatable :: vect2(:,:)
     769              : 
     770              : ! *************************************************************************
     771              : 
     772          488 :  mpw_tmp=max(mpw,mpw1)
     773         1464 :  ABI_MALLOC(vect1,(2,0:mpw_tmp))
     774          976 :  ABI_MALLOC(vect2,(2,0:mpw_tmp))
     775         1952 :  ABI_MALLOC(s1mat,(2,dtefield%mband_occ,dtefield%mband_occ))
     776         1464 :  ABI_MALLOC(pwind_tmp,(mpw_tmp))
     777         1464 :  ABI_MALLOC(Amat,(2,dtefield%mband_occ,dtefield%mband_occ))
     778         1464 :  ABI_MALLOC(Bmat,(2,dtefield%mband_occ,dtefield%mband_occ))
     779         2928 :  vect1(:,0) = zero ; vect2(:,0) = zero
     780        25864 :  s1mat(:,:,:)=zero
     781       254248 :  grad_berry(:,:,:) = zero
     782              : 
     783          488 :  me_band = mpi_enreg%me_band
     784          488 :  call proc_distrb_band(band_procs,mpi_enreg%proc_distrb,ikpt,isppol,mband,me_band,mpi_enreg%me_kpt,mpi_enreg%comm_band)
     785              : 
     786         1952 :  do idir=1,3
     787              :    fac = dtefield%efield_dot(idir)*dble(nkpt)/&
     788         1464 : &   (dble(dtefield%nstr(idir))*four_pi)
     789              : 
     790              : !  prepare
     791         1464 :    ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
     792         1464 :    icg1 = dtefield%cgindex(ikpt1,isppol+nsppol)
     793         1464 :    npw_k1 = npwar1(ikpt)
     794         1464 :    npw_k2 = npwar1(ikpt1)
     795        62220 :    pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,3,idir)
     796              : 
     797              : !TODO: this algorithm is very inefficient: the looping is in the wrong order.
     798              : !  should be possible to store a temp vector and make it into a BLAS call...
     799              : !  basically boils down to an internal sum over iband
     800              : !     grad_berry(ipw,jband) = fac * wf(ipw,:) * qmat(:,jband)
     801        62220 :    do ipw = 1, npw_k1
     802        60756 :      jpw = pwind_tmp(ipw)
     803              : 
     804        62220 :      if (jpw > 0) then
     805              :        iband_me = 0
     806       245220 :        do iband = 1, dtefield%mband_occ
     807       196176 :          if (band_procs(iband) /= me_band) cycle
     808       196176 :          iband_me = iband_me + 1
     809       196176 :          wfr = cg1(1,icg1 + (iband_me - 1)*npw_k2*nspinor + jpw)
     810       196176 :          wfi = cg1(2,icg1 + (iband_me - 1)*npw_k2*nspinor + jpw)
     811              : 
     812      1029924 :          do  jband = 1, dtefield%mband_occ
     813              : 
     814              :            grad_berry(1,ipw,jband) = &
     815              : &           grad_berry(1,ipw,jband) + &
     816       784704 : &           fac*qmat(1,iband,jband,ikpt,1,idir)*wfr - fac*qmat(2,iband,jband,ikpt,1,idir)*wfi
     817              : 
     818              :            grad_berry(2,ipw,jband) = &
     819              : &           grad_berry(2,ipw,jband) + &
     820       980880 : &           fac*qmat(1,iband,jband,ikpt,1,idir)*wfi + fac*qmat(2,iband,jband,ikpt,1,idir)*wfr
     821              : 
     822              :          end do
     823              :        end do
     824              :      end if
     825              : 
     826              :    end do
     827              : 
     828              : !  compute <u^(0)_{k_j+n}|u^(1)_{k_j+1,q}> matrix----------------------------------------------------
     829              : 
     830              : !  prepare to calculate overlap matrix
     831         1464 :    ikptn = dtefield%ikpt_dk(ikpt,7,idir)
     832         1464 :    ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
     833         1464 :    icg = dtefield%cgindex(ikptn,isppol)
     834         1464 :    icg1 = dtefield%cgindex(ikpt1,isppol+nsppol)
     835         1464 :    npw_k1 = npwarr(ikptn)
     836              :    npw_k2 = npwar1(ikpt1)
     837        62220 :    pwind_tmp(1:npw_k1) = pwindall((ikptn-1)*mpw_tmp+1:(ikptn-1)*mpw_tmp+npw_k1,7,idir)
     838              : 
     839              : 
     840         7320 :    vect1(:,0) = zero ; vect2(:,0) = zero
     841         7320 :    do jband = 1, dtefield%mband_occ
     842              :      vect2(:,1:npw_k2) = &
     843       734928 : &     cg1(:,icg1 + 1 + (jband-1)*npw_k2*nspinor:icg1 + jband*npw_k2*nspinor)
     844        32208 :      if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
     845              : 
     846        30744 :      do iband = 1, dtefield%mband_occ
     847              : 
     848        23424 :        pwmin = (iband-1)*npw_k1*nspinor
     849        23424 :        pwmax = pwmin + npw_k1*nspinor
     850              :        vect1(:,1:npw_k1) = &
     851      2939712 : &       cg(:,icg + 1 + pwmin:icg + pwmax)
     852       128832 :        if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
     853              :        call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
     854        23424 : &       vect1,vect2)
     855        23424 :        s1mat(1,iband,jband) = dotr
     856        29280 :        s1mat(2,iband,jband) = doti
     857              : 
     858              :      end do    ! iband
     859              :    end do    !jband
     860              : 
     861              : !  compute <u^(0)_{-k_j+1}|u^(1)_{-k_j+n},q> matrix--------------------
     862              : 
     863              : !  prepare to calculate overlap matrix
     864         1464 :    ikptn = dtefield%ikpt_dk(ikpt,7,idir)
     865         1464 :    ikptnm= dtefield%ikpt_dk(ikptn,9,idir)
     866         1464 :    ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
     867         1464 :    ikpt1m= dtefield%ikpt_dk(ikpt1,9,idir)
     868              : 
     869         1464 :    icg = dtefield%cgindex(ikpt1m,isppol)
     870         1464 :    icg1 = dtefield%cgindex(ikptnm,isppol+nsppol)
     871         1464 :    npw_k1 = npwarr(ikpt1m)
     872         1464 :    npw_k2 = npwar1(ikptnm)
     873        62220 :    pwind_tmp(1:npw_k1) = pwindall((ikpt1m-1)*mpw_tmp+1:(ikpt1m-1)*mpw_tmp+npw_k1,7,idir)
     874              : 
     875         8784 :    vect1(:,0) = zero ; vect2(:,0) = zero
     876         7320 :    do jband = 1, dtefield%mband_occ
     877              :      vect2(:,1:npw_k2) = &
     878       734928 : &     cg1(:,icg1 + 1 + (jband-1)*npw_k2*nspinor:icg1 + jband*npw_k2*nspinor)
     879        32208 :      if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
     880              : 
     881        30744 :      do iband = 1, dtefield%mband_occ
     882              : 
     883        23424 :        pwmin = (iband-1)*npw_k1*nspinor
     884        23424 :        pwmax = pwmin + npw_k1*nspinor
     885              :        vect1(:,1:npw_k1) = &
     886      2939712 : &       cg(:,icg + 1 + pwmin:icg + pwmax)
     887       128832 :        if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
     888              :        call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
     889        23424 : &       vect1,vect2)
     890              : 
     891        23424 :        s1mat(1,jband,iband) = s1mat(1,jband,iband) + dotr
     892        29280 :        s1mat(2,jband,iband) = s1mat(2,jband,iband) + doti
     893              : 
     894              :      end do    ! iband
     895              :    end do    !jband
     896              : 
     897        77592 :    Amat(:,:,:)=zero
     898              : 
     899              : !  calculate Amat
     900         7320 :    do iband=1, dtefield%mband_occ
     901        30744 :      do jband=1, dtefield%mband_occ
     902       122976 :        do kband=1, dtefield%mband_occ
     903              :          Amat(1,iband,jband) = Amat(1,iband,jband) + s1mat(1,iband,kband)*&
     904              : &         qmat(1,kband,jband,ikpt,1,idir)&
     905        93696 : &         - s1mat(2,iband,kband)*qmat(2,kband,jband,ikpt,1,idir)
     906              :          Amat(2,iband,jband) = Amat(2,iband,jband) + s1mat(1,iband,kband)*&
     907              : &         qmat(2,kband,jband,ikpt,1,idir)&
     908       117120 : &         + s1mat(2,iband,kband)*qmat(1,kband,jband,ikpt,1,idir)
     909              :        end do
     910              :      end do
     911              :    end do
     912              : 
     913        77592 :    Bmat(:,:,:)=zero
     914              : 
     915              : !  calculate Bmat
     916         1464 :    ikptn = dtefield%ikpt_dk(ikpt,7,idir)
     917         7320 :    do iband=1, dtefield%mband_occ
     918        30744 :      do jband=1, dtefield%mband_occ
     919       122976 :        do kband=1, dtefield%mband_occ
     920              :          Bmat(1,jband,kband) = Bmat(1,jband,kband) + Amat(1,iband,kband)*&
     921              : &         qmat(1,jband,iband,ikptn,1,idir)&
     922        93696 : &         - Amat(2,iband,kband)*qmat(2,jband,iband,ikptn,1,idir)
     923              :          Bmat(2,jband,kband) = Bmat(2,jband,kband) + Amat(1,iband,kband)*&
     924              : &         qmat(2,jband,iband,ikptn,1,idir)&
     925       117120 : &         + Amat(2,iband,kband)*qmat(1,jband,iband,ikptn,1,idir)
     926              :        end do
     927              :      end do
     928              :    end do
     929              : 
     930              : !  calc. the second term of gradient------------------------------
     931              : 
     932              : !  preparation
     933              : 
     934         1464 :    ikptnp1 = dtefield%ikpt_dk(ikpt,3,idir)
     935         1464 :    icg = dtefield%cgindex(ikptnp1,isppol)
     936         1464 :    npw_k1 = npwar1(ikpt)
     937         1464 :    npw_k2 = npwarr(ikptnp1)
     938        62220 :    pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,5,idir)
     939              : 
     940              :    z1(:) = zero
     941              :    z2(:) = zero
     942              : 
     943        62220 :    do ipw = 1, npw_k1
     944              : 
     945        60756 :      jpw = pwind_tmp(ipw)
     946              : 
     947        62220 :      if (jpw > 0) then
     948              : 
     949              :        iband_me = 0
     950       245220 :        do iband = 1, dtefield%mband_occ
     951       196176 :          if (band_procs(iband) /= me_band) cycle
     952       196176 :          iband_me = iband_me + 1
     953       196176 :          wfr = cg(1,icg + (iband_me - 1)*npw_k2*nspinor + jpw)
     954       196176 :          wfi = cg(2,icg + (iband_me - 1)*npw_k2*nspinor + jpw)
     955              : 
     956      1029924 :          do jband=1, dtefield%mband_occ
     957              : 
     958              :            grad_berry(1,ipw,jband) = grad_berry(1,ipw,jband) &
     959       784704 : &           - fac*(Bmat(1,iband,jband)*wfr - Bmat(2,iband,jband)*wfi)
     960              :            grad_berry(2,ipw,jband) = grad_berry(2,ipw,jband) &
     961       980880 : &           - fac*(Bmat(1,iband,jband)*wfi + Bmat(2,iband,jband)*wfr)
     962              : 
     963              :          end do
     964              :        end do
     965              :      end if
     966              :    end do
     967              : 
     968              : !  Second part of gradient of Berry phase++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     969              : 
     970         8784 :    vect1(:,0) = zero ; vect2(:,0) = zero
     971              : 
     972              : !  prepare
     973         1464 :    ikpt1 = dtefield%ikpt_dk(ikpt,2,idir)
     974         1464 :    icg1 = dtefield%cgindex(ikpt1,isppol+nsppol)
     975              :    npw_k1 = npwar1(ikpt)
     976         1464 :    npw_k2 = npwar1(ikpt1)
     977        62220 :    pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,4,idir)
     978              : 
     979              : !  write(std_out,*)'dfpt_cgwf:pwind_tmp',pwind_tmp
     980              : !  stop
     981              : 
     982        62220 :    do ipw = 1, npw_k1
     983              : 
     984        60756 :      jpw = pwind_tmp(ipw)
     985              : 
     986        62220 :      if (jpw > 0) then
     987              :        iband_me = 0
     988       245220 :        do iband = 1, dtefield%mband_occ
     989       196176 :          if (band_procs(iband) /= me_band) cycle
     990       196176 :          iband_me = iband_me + 1
     991       196176 :          wfr = cg1(1,icg1 + (iband_me - 1)*npw_k2*nspinor + jpw)
     992       196176 :          wfi = cg1(2,icg1 + (iband_me - 1)*npw_k2*nspinor + jpw)
     993              : 
     994      1029924 :          do  jband = 1, dtefield%mband_occ
     995              : 
     996              :            grad_berry(1,ipw,jband) = &
     997              : &           grad_berry(1,ipw,jband) - &
     998       784704 : &           fac*qmat(1,iband,jband,ikpt,2,idir)*wfr + fac*qmat(2,iband,jband,ikpt,2,idir)*wfi
     999              : 
    1000              :            grad_berry(2,ipw,jband) = &
    1001              : &           grad_berry(2,ipw,jband) - &
    1002       980880 : &           fac*qmat(1,iband,jband,ikpt,2,idir)*wfi - fac*qmat(2,iband,jband,ikpt,2,idir)*wfr
    1003              : 
    1004              :          end do
    1005              :        end do
    1006              :      end if
    1007              :    end do
    1008              : 
    1009              : 
    1010              : !  compute <u^(0)_{k_j+n}|u^(1)_{k_j-1,q}> matrix----------------------------------------------------
    1011              : 
    1012              : !  prepare to calculate overlap matrix
    1013         1464 :    ikptn = dtefield%ikpt_dk(ikpt,7,idir)
    1014         1464 :    ikpt1 = dtefield%ikpt_dk(ikpt,2,idir)
    1015         1464 :    icg = dtefield%cgindex(ikptn,isppol)
    1016         1464 :    icg1 = dtefield%cgindex(ikpt1,isppol+nsppol)
    1017         1464 :    npw_k1 = npwarr(ikptn)
    1018              :    npw_k2 = npwar1(ikpt1)
    1019        62220 :    pwind_tmp(1:npw_k1) =pwindall((ikptn-1)*mpw_tmp+1:(ikptn-1)*mpw_tmp+npw_k1,8,idir)
    1020              : 
    1021         8784 :    vect1(:,0) = zero ; vect2(:,0) = zero
    1022              :    jband_me = 0
    1023         7320 :    do jband = 1, dtefield%mband_occ
    1024         5856 :      if (band_procs(jband) == me_band) then
    1025         5856 :        jband_me = jband_me + 1
    1026              :        vect2(:,1:npw_k2) = &
    1027       734928 : &       cg1(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
    1028        32208 :        if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
    1029              :      end if
    1030         5856 :      call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
    1031              : 
    1032         5856 :      iband_me = 0
    1033        30744 :      do iband = 1, dtefield%mband_occ
    1034        23424 :        if (band_procs(iband) /= mpi_enreg%me_band) cycle
    1035        23424 :        iband_me = iband_me + 1
    1036        23424 :        pwmin = (iband-1)*npw_k1*nspinor
    1037        23424 :        pwmax = pwmin + npw_k1*nspinor
    1038              :        vect1(:,1:npw_k1) = &
    1039      2939712 : &       cg(:,icg + 1 + pwmin:icg + pwmax)
    1040       128832 :        if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
    1041              :        call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
    1042        23424 : &       vect1,vect2)
    1043        23424 :        s1mat(1,iband,jband) = dotr
    1044        29280 :        s1mat(2,iband,jband) = doti
    1045              : 
    1046              :      end do    ! iband
    1047              :    end do    !jband
    1048              : 
    1049              : !  compute <u^(0)_{-k_j-1}|u^(1)_{-k_j+n,q}> matrix-----------------------------------------------------
    1050              : 
    1051              : !  prepare to calculate overlap matrix
    1052         1464 :    ikptn = dtefield%ikpt_dk(ikpt,7,idir)
    1053         1464 :    ikptnm= dtefield%ikpt_dk(ikptn,9,idir)
    1054         1464 :    ikpt1 = dtefield%ikpt_dk(ikpt,2,idir)
    1055         1464 :    ikpt1m= dtefield%ikpt_dk(ikpt1,9,idir)
    1056         1464 :    icg = dtefield%cgindex(ikpt1m,isppol)
    1057         1464 :    icg1 = dtefield%cgindex(ikptnm,isppol+nsppol)
    1058         1464 :    npw_k1 = npwarr(ikpt1m)
    1059         1464 :    npw_k2 = npwar1(ikptnm)
    1060        62220 :    pwind_tmp(1:npw_k1) =pwindall((ikpt1m-1)*mpw_tmp+1:(ikpt1m-1)*mpw_tmp+npw_k1,8,idir)
    1061              : 
    1062              : 
    1063              : 
    1064         7320 :    vect1(:,0) = zero ; vect2(:,0) = zero
    1065              :    jband_me = 0
    1066         7320 :    do jband = 1, dtefield%mband_occ
    1067         5856 :      if (band_procs(jband) == me_band) then
    1068         5856 :        jband_me = jband_me + 1
    1069              :        vect2(:,1:npw_k2) = &
    1070       734928 : &       cg1(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
    1071        32208 :        if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
    1072              :      end if
    1073         5856 :      call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
    1074              : 
    1075         5856 :      iband_me = 0
    1076        30744 :      do iband = 1, dtefield%mband_occ
    1077        23424 :        if (band_procs(iband) /= mpi_enreg%me_band) cycle
    1078        23424 :        iband_me = iband_me + 1
    1079        23424 :        pwmin = (iband_me-1)*npw_k1*nspinor
    1080        23424 :        pwmax = pwmin + npw_k1*nspinor
    1081              :        vect1(:,1:npw_k1) = &
    1082      2939712 : &         cg(:,icg + 1 + pwmin:icg + pwmax)
    1083       128832 :        if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
    1084              :        call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
    1085        23424 : &       vect1,vect2)
    1086        23424 :        s1mat(1,jband,iband) = s1mat(1,jband,iband) + dotr
    1087        29280 :        s1mat(2,jband,iband) = s1mat(2,jband,iband) + doti
    1088              : 
    1089              :      end do    ! iband
    1090              :    end do    !jband
    1091              : ! accumulate all iband values on each proc
    1092         1464 :    call xmpi_sum(s1mat,mpi_enreg%comm_band,ierr)
    1093              : 
    1094        77592 :    Amat(:,:,:)=zero
    1095              : 
    1096              : !  calculate Amat: s1mat is complete so sum over all bands here
    1097              : ! TODO: could reduce one loop over bands
    1098              : ! TODO: replace this with a BLAS call: A = s1*q in complex numbers
    1099         7320 :    do iband=1, dtefield%mband_occ
    1100        30744 :      do jband=1, dtefield%mband_occ
    1101       122976 :        do kband=1, dtefield%mband_occ
    1102              :          Amat(1,iband,jband) = Amat(1,iband,jband) + s1mat(1,iband,kband)*&
    1103              : &         qmat(1,kband,jband,ikpt,2,idir)&
    1104        93696 : &         - s1mat(2,iband,kband)*qmat(2,kband,jband,ikpt,2,idir)
    1105              :          Amat(2,iband,jband) = Amat(2,iband,jband) + s1mat(1,iband,kband)*&
    1106              : &         qmat(2,kband,jband,ikpt,2,idir)&
    1107       117120 : &         + s1mat(2,iband,kband)*qmat(1,kband,jband,ikpt,2,idir)
    1108              :        end do
    1109              :      end do
    1110              :    end do
    1111              : 
    1112        77592 :    Bmat(:,:,:)=zero
    1113              : 
    1114              : !  calculate Bmat: as above, all matrices A B q are band-complete at this stage
    1115              : ! TODO: could reduce one loop over bands
    1116              : ! TODO: replace this with a BLAS call: B = q*A in complex numbers
    1117         1464 :    ikptn = dtefield%ikpt_dk(ikpt,7,idir)
    1118         7320 :    do iband=1, dtefield%mband_occ
    1119        30744 :      do jband=1, dtefield%mband_occ
    1120       122976 :        do kband=1, dtefield%mband_occ
    1121              :          Bmat(1,jband,kband) = Bmat(1,jband,kband) + Amat(1,iband,kband)*&
    1122              : &         qmat(1,jband,iband,ikptn,2,idir)&
    1123        93696 : &         - Amat(2,iband,kband)*qmat(2,jband,iband,ikptn,2,idir)
    1124              :          Bmat(2,jband,kband) = Bmat(2,jband,kband) + Amat(1,iband,kband)*&
    1125              : &         qmat(2,jband,iband,ikptn,2,idir)&
    1126       117120 :          + Amat(2,iband,kband)*qmat(1,jband,iband,ikptn,2,idir)
    1127              :        end do
    1128              :      end do
    1129              :    end do
    1130              : 
    1131              : !  calc. the second term of gradient------------------------------
    1132              : 
    1133              : !  preparation
    1134              : 
    1135         1464 :    ikptnp1 = dtefield%ikpt_dk(ikpt,4,idir)
    1136         1464 :    icg = dtefield%cgindex(ikptnp1,isppol)
    1137         1464 :    npw_k1 = npwar1(ikpt)
    1138         1464 :    npw_k2 = npwarr(ikptnp1)
    1139        62220 :    pwind_tmp(1:npw_k1) =pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,6,idir)
    1140              : 
    1141              :    z1(:) = zero
    1142              :    z2(:) = zero
    1143        64172 :    do ipw = 1, npw_k1
    1144        60756 :      jpw = pwind_tmp(ipw)
    1145        62220 :      if (jpw > 0) then
    1146              :        iband_me = 0
    1147       245220 :        do iband = 1, dtefield%mband_occ
    1148       196176 :          if (band_procs(iband) /= me_band) cycle
    1149       196176 :          iband_me = iband_me + 1
    1150       196176 :          wfr = cg(1,icg + (iband_me - 1)*npw_k2*nspinor + jpw)
    1151       196176 :          wfi = cg(2,icg + (iband_me - 1)*npw_k2*nspinor + jpw)
    1152              : 
    1153      1029924 :          do jband=1, dtefield%mband_occ
    1154       784704 :            grad_berry(1,ipw,jband) = grad_berry(1,ipw,jband) + fac*(Bmat(1,iband,jband)*wfr - Bmat(2,iband,jband)*wfi)
    1155       980880 :            grad_berry(2,ipw,jband) = grad_berry(2,ipw,jband) + fac*(Bmat(1,iband,jband)*wfi + Bmat(2,iband,jband)*wfr)
    1156              :          end do
    1157              :        end do
    1158              :      end if
    1159              :    end do
    1160              : 
    1161              :  end do !idir
    1162              : 
    1163          488 :  call xmpi_sum(grad_berry,mpi_enreg%comm_band,ierr) ! sum over iband for all previous loops
    1164              : 
    1165          488 :  ABI_FREE(vect1)
    1166          488 :  ABI_FREE(vect2)
    1167          488 :  ABI_FREE(s1mat)
    1168          488 :  ABI_FREE(Amat)
    1169          488 :  ABI_FREE(Bmat)
    1170          488 :  ABI_FREE(pwind_tmp)
    1171              : 
    1172          488 : end subroutine dfptff_gradberry
    1173              : !!***
    1174              : 
    1175              : !!****f* ABINIT/dfptff_gbefd
    1176              : !! NAME
    1177              : !! dfptff_gbefd
    1178              : !!
    1179              : !! FUNCTION
    1180              : !! calculate the gradient of the second order \Omega E \cdot P
    1181              : !! term, Eq.(23) in PRB 75, 115116(2007) [[cite:Wang2007]].
    1182              : !!
    1183              : !! INPUTS
    1184              : !! cg(2,mpw*nspinor*mband*mkmem_rbz*nsppol) = planewave coefficients of wavefunctions
    1185              : !! cg1(2,mpw1*nspinor*mband*mk1mem*nsppol) = pw coefficients of
    1186              : !! RF wavefunctions at k,q.
    1187              : !! dtefield = variables related to response Berry-phase calculation
    1188              : !! ikpt = the index of the current k point
    1189              : !! isppol = the index of the spin component
    1190              : !! mband =  maximum number of bands
    1191              : !! mband_mem =  maximum number of bands on this cpu
    1192              : !! mkmem_rbz = maximum number of k-points in core memory
    1193              : !! mpi_enreg = parallel distribution datastructure
    1194              : !! mpw = maximum number of plane waves
    1195              : !! mpw1 = maximum number of plane waves for response wavefunctions
    1196              : !! nkpt = number of k points
    1197              : !! npwarr(nkpt) = number of planewaves in basis and boundary at this k point
    1198              : !! npwar1(nkpt) = number of planewaves in basis and boundary for response wfs
    1199              : !! nspinor = 1 for scalar wfs, 2 for spinor wfs
    1200              : !! nsppol = 1 for unpolarized, 2 for spin-polarized
    1201              : !! qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3) =
    1202              : !! inverse of the overlap matrix
    1203              : !! pwindall(max(mpw,mpw1)*mkmem_rbz,8,3) = array used to compute the overlap matrices
    1204              : !! pwindall(:,1,:) <- <u^(0)_i|u^(0)_i+1>
    1205              : !! pwindall(:,2,:) <- <u^(0)_i|u^(0)_i-1>
    1206              : !! pwindall(:,3,:) <- <u^(1)_i|u^(1)_i+1>
    1207              : !! pwindall(:,4,:) <- <u^(1)_i|u^(1)_i-1>
    1208              : !! pwindall(:,5,:) <- <u^(1)_i|u^(0)_i+n+1>
    1209              : !! pwindall(:,6,:) <- <u^(1)_i|u^(0)_i+n-1>
    1210              : !! pwindall(:,7,:) <- <u^(0)_i|u^(1)_i-n+1>
    1211              : !! pwindall(:,8,:) <- <u^(0)_i|u^(1)_i-n-1>
    1212              : !!
    1213              : !! OUTPUT
    1214              : !! grad_berry = the gradient of the Berry phase term
    1215              : !!
    1216              : !! SOURCE
    1217              : 
    1218          288 : subroutine dfptff_gbefd(cg,cg1,dtefield,grad_berry,idir_efield,ikpt,isppol,&
    1219              : &                 mband,mband_mem,mpw,mpw1,mkmem_rbz,mk1mem,&
    1220          288 : &                 mpi_enreg,nkpt,npwarr,npwar1,nspinor,nsppol,qmat,pwindall,rprimd)
    1221              : 
    1222              : !Arguments ----------------------------------------
    1223              : !scalars
    1224              :  integer,intent(in) :: idir_efield,ikpt,isppol,mband,mk1mem,mkmem_rbz,mpw,mpw1,nkpt
    1225              :  integer,intent(in) :: mband_mem
    1226              :  integer,intent(in) :: nspinor,nsppol
    1227              :  type(efield_type),intent(in) :: dtefield
    1228              :  type(MPI_type),intent(in) :: mpi_enreg
    1229              : !arrays
    1230              :  integer,intent(in) :: npwar1(nkpt),npwarr(nkpt)
    1231              :  integer,intent(in) :: pwindall(max(mpw,mpw1)*mkmem_rbz,8,3)
    1232              :  real(dp),intent(in) :: cg(2,mpw*nspinor*mband_mem*mkmem_rbz*nsppol)
    1233              :  real(dp),intent(in) :: cg1(2,mpw1*nspinor*mband_mem*mk1mem*nsppol)
    1234              :  real(dp),intent(in) :: qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3)
    1235              :  real(dp),intent(in) :: rprimd(3,3)
    1236              : !TODO MJV: this array is still npw*nband, and should be parallelized as well at some point...
    1237              :  real(dp),intent(out) :: grad_berry(2,mpw1,dtefield%mband_occ)
    1238              : 
    1239              : !Local variables -------------------------
    1240              : !scalars
    1241              :  integer :: iband,icg,icg1,idir,ikpt1
    1242              :  integer :: iband_me, jband_me, ierr
    1243              :  integer :: ikptn,ikptnp1,ipw,jband,jpw,kband
    1244              :  integer :: mpw_tmp,npw_k1,npw_k2,pwmax,pwmin
    1245              :  real(dp) :: doti,dotr,fac,wfi,wfr
    1246              : !arrays
    1247          288 :  integer,allocatable :: pwind_tmp(:)
    1248          576 :  integer :: band_procs(mband)
    1249              :  real(dp) :: z1(2),z2(2)
    1250          288 :  real(dp),allocatable :: Amat(:,:,:),Bmat(:,:,:),s1mat(:,:,:),vect1(:,:)
    1251              :  real(dp),allocatable :: vect2(:,:)
    1252              : 
    1253              : ! *************************************************************************
    1254              : 
    1255          288 :  mpw_tmp=max(mpw,mpw1)
    1256          864 :  ABI_MALLOC(vect1,(2,0:mpw_tmp))
    1257          576 :  ABI_MALLOC(vect2,(2,0:mpw_tmp))
    1258         1152 :  ABI_MALLOC(s1mat,(2,dtefield%mband_occ,dtefield%mband_occ))
    1259          864 :  ABI_MALLOC(pwind_tmp,(mpw_tmp))
    1260          864 :  ABI_MALLOC(Amat,(2,dtefield%mband_occ,dtefield%mband_occ))
    1261          864 :  ABI_MALLOC(Bmat,(2,dtefield%mband_occ,dtefield%mband_occ))
    1262         1440 :  vect1(:,0) = zero ; vect2(:,0) = zero
    1263        15264 :  s1mat(:,:,:)=zero
    1264       150048 :  grad_berry(:,:,:) = zero
    1265              : 
    1266              :  call proc_distrb_band(band_procs,mpi_enreg%proc_distrb,ikpt,isppol,mband,&
    1267          288 : & mpi_enreg%me_band,mpi_enreg%me_kpt,mpi_enreg%comm_band)
    1268              : 
    1269         1152 :  do idir=1,3
    1270              :    fac = dtefield%efield_dot(idir)*dble(nkpt)/&
    1271          864 : &   (dble(dtefield%nstr(idir))*four_pi)
    1272              : 
    1273              : !  prepare
    1274          864 :    ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
    1275          864 :    icg1 = dtefield%cgindex(ikpt1,isppol+nsppol)
    1276          864 :    npw_k1 = npwar1(ikpt)
    1277          864 :    npw_k2 = npwar1(ikpt1)
    1278        36720 :    pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,3,idir)
    1279              : 
    1280        36720 :    do ipw = 1, npw_k1
    1281        35856 :      jpw = pwind_tmp(ipw)
    1282        36720 :      if (jpw > 0) then
    1283        28944 :        iband_me = 0
    1284       144720 :        do iband = 1, dtefield%mband_occ
    1285       115776 :          if (proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,iband,iband,isppol,mpi_enreg%me_band)) cycle
    1286       115776 :          iband_me = iband_me + 1
    1287       115776 :          wfr = cg1(1,icg1 + (iband_me - 1)*npw_k2*nspinor + jpw)
    1288       115776 :          wfi = cg1(2,icg1 + (iband_me - 1)*npw_k2*nspinor + jpw)
    1289              : 
    1290       607824 :          do  jband = 1, dtefield%mband_occ
    1291              :            grad_berry(1,ipw,jband) = &
    1292              : &           grad_berry(1,ipw,jband) + &
    1293       463104 : &           fac*qmat(1,iband,jband,ikpt,1,idir)*wfr - fac*qmat(2,iband,jband,ikpt,1,idir)*wfi
    1294              : 
    1295              :            grad_berry(2,ipw,jband) = &
    1296              : &           grad_berry(2,ipw,jband) + &
    1297       578880 : &           fac*qmat(1,iband,jband,ikpt,1,idir)*wfi + fac*qmat(2,iband,jband,ikpt,1,idir)*wfr
    1298              :          end do
    1299              :        end do
    1300              :      end if
    1301              :    end do
    1302              : ! accumulate full sum over iband below at the end
    1303              : 
    1304              : !  compute <u^(0)_{k_j}|u^(1)_{k_j+1}> matrix----------------------------------------------------
    1305              : 
    1306              : !  prepare to calculate overlap matrix
    1307          864 :    ikptn = ikpt
    1308          864 :    ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
    1309          864 :    icg = dtefield%cgindex(ikptn,isppol)
    1310          864 :    icg1 = dtefield%cgindex(ikpt1,isppol+nsppol)
    1311          864 :    npw_k1 = npwarr(ikptn)
    1312              :    npw_k2 = npwar1(ikpt1)
    1313        36720 :    pwind_tmp(1:npw_k1) = pwindall((ikptn-1)*mpw_tmp+1:(ikptn-1)*mpw_tmp+npw_k1,7,idir)
    1314              : 
    1315         4320 :    vect1(:,0) = zero ; vect2(:,0) = zero
    1316              :    jband_me = 0
    1317         4320 :    do jband = 1, dtefield%mband_occ
    1318         3456 :      if (band_procs(jband) == mpi_enreg%me_band) then
    1319         3456 :        jband_me = jband_me + 1
    1320              :        vect2(:,1:npw_k2) = &
    1321       433728 : &        cg1(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
    1322              :      end if
    1323         3456 :      call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
    1324              : 
    1325        19008 :      if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
    1326         3456 :      iband_me = 0
    1327        21600 :      do iband = 1, dtefield%mband_occ
    1328        13824 :        if (band_procs(iband) /= mpi_enreg%me_band) cycle
    1329        13824 :        iband_me = iband_me + 1
    1330        13824 :        pwmin = (iband_me-1)*npw_k1*nspinor
    1331        13824 :        pwmax = pwmin + npw_k1*nspinor
    1332      1734912 :        vect1(:,1:npw_k1) = cg(:,icg + 1 + pwmin:icg + pwmax)
    1333        76032 :        if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
    1334        13824 :        call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,vect1,vect2)
    1335        13824 :        s1mat(1,iband,jband) = dotr
    1336        17280 :        s1mat(2,iband,jband) = doti
    1337              :      end do    ! iband
    1338              :    end do    !jband
    1339              : 
    1340              : !  compute <u^(1)_{k_j}|u^(0)_{k_j+1}> matrix-----------------------------------------------------
    1341              : 
    1342              : !  prepare to calculate overlap matrix
    1343          864 :    ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
    1344          864 :    icg = dtefield%cgindex(ikpt,isppol+nsppol)
    1345          864 :    icg1 = dtefield%cgindex(ikpt1,isppol)
    1346          864 :    npw_k1 = npwar1(ikpt)
    1347          864 :    npw_k2 = npwarr(ikpt1)
    1348        36720 :    pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,5,idir)
    1349              : 
    1350         4320 :    vect1(:,0) = zero ; vect2(:,0) = zero
    1351              :    jband_me = 0
    1352         4320 :    do jband = 1, dtefield%mband_occ
    1353         3456 :      if (band_procs(jband) == mpi_enreg%me_band) then
    1354         3456 :        jband_me = jband_me + 1
    1355              :        vect2(:,1:npw_k2) = &
    1356       433728 : &        cg(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
    1357        19008 :        if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
    1358              :      end if
    1359         3456 :      call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
    1360              : 
    1361         3456 :      iband_me = 0
    1362        18144 :      do iband = 1, dtefield%mband_occ
    1363        13824 :        if (band_procs(iband) /= mpi_enreg%me_band) cycle
    1364        13824 :        iband_me = iband_me + 1
    1365        13824 :        pwmin = (iband_me-1)*npw_k1*nspinor
    1366        13824 :        pwmax = pwmin + npw_k1*nspinor
    1367              :        vect1(:,1:npw_k1) = &
    1368      1734912 : &       cg1(:,icg + 1 + pwmin:icg + pwmax)
    1369        76032 :        if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
    1370        13824 :        call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,vect1,vect2)
    1371        13824 :        s1mat(1,jband,iband) = s1mat(1,jband,iband) + dotr
    1372        17280 :        s1mat(2,jband,iband) = s1mat(2,jband,iband) + doti
    1373              :      end do    ! iband
    1374              :    end do    !jband
    1375              : ! accumulate all iband values on each proc
    1376          864 :    call xmpi_sum(s1mat,mpi_enreg%comm_band,ierr)
    1377              : 
    1378        45792 :    Amat(:,:,:)=zero
    1379              : 
    1380              : !  calculate Amat
    1381         4320 :    do iband=1, dtefield%mband_occ
    1382        18144 :      do jband=1, dtefield%mband_occ
    1383        72576 :        do kband=1, dtefield%mband_occ
    1384              :          Amat(1,iband,jband) = Amat(1,iband,jband) + s1mat(1,iband,kband)*qmat(1,kband,jband,ikpt,1,idir)&
    1385        55296 : &         - s1mat(2,iband,kband)*qmat(2,kband,jband,ikpt,1,idir)
    1386              :          Amat(2,iband,jband) = Amat(2,iband,jband) + s1mat(1,iband,kband)*qmat(2,kband,jband,ikpt,1,idir)&
    1387        69120 : &         + s1mat(2,iband,kband)*qmat(1,kband,jband,ikpt,1,idir)
    1388              :        end do
    1389              :      end do
    1390              :    end do
    1391              : 
    1392        45792 :    Bmat(:,:,:)=zero
    1393              : 
    1394              : !  calculate Bmat
    1395          864 :    ikptn = dtefield%ikpt_dk(ikpt,7,idir)
    1396         4320 :    do iband=1, dtefield%mband_occ
    1397        18144 :      do jband=1, dtefield%mband_occ
    1398        72576 :        do kband=1, dtefield%mband_occ
    1399              :          Bmat(1,jband,kband) = Bmat(1,jband,kband) + Amat(1,iband,kband)*qmat(1,jband,iband,ikptn,1,idir)&
    1400        55296 : &         - Amat(2,iband,kband)*qmat(2,jband,iband,ikptn,1,idir)
    1401              :          Bmat(2,jband,kband) = Bmat(2,jband,kband) + Amat(1,iband,kband)*qmat(2,jband,iband,ikptn,1,idir)&
    1402        69120 : &         + Amat(2,iband,kband)*qmat(1,jband,iband,ikptn,1,idir)
    1403              :        end do
    1404              :      end do
    1405              :    end do
    1406              : 
    1407              : !  calc. the second term of gradient------------------------------
    1408              : 
    1409              : !  preparation
    1410              : 
    1411          864 :    ikptnp1 = dtefield%ikpt_dk(ikpt,3,idir)
    1412          864 :    icg = dtefield%cgindex(ikptnp1,isppol)
    1413              :    npw_k1 = npwar1(ikpt)
    1414          864 :    npw_k2 = npwarr(ikptnp1)
    1415        36720 :    pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,5,idir)
    1416              : 
    1417              :    z1(:) = zero
    1418              :    z2(:) = zero
    1419              : 
    1420        36720 :    do ipw = 1, npw_k1
    1421        35856 :      jpw = pwind_tmp(ipw)
    1422        36720 :      if (jpw > 0) then
    1423        28944 :        iband_me = 0
    1424       144720 :        do iband = 1, dtefield%mband_occ
    1425       115776 :          if (band_procs(iband) /= mpi_enreg%me_band) cycle
    1426       115776 :          iband_me = iband_me + 1
    1427       115776 :          wfr = cg(1,icg + (iband_me - 1)*npw_k2*nspinor + jpw)
    1428       115776 :          wfi = cg(2,icg + (iband_me - 1)*npw_k2*nspinor + jpw)
    1429              : 
    1430       607824 :          do jband=1, dtefield%mband_occ
    1431       463104 :            grad_berry(1,ipw,jband) = grad_berry(1,ipw,jband) - fac*(Bmat(1,iband,jband)*wfr - Bmat(2,iband,jband)*wfi)
    1432       578880 :            grad_berry(2,ipw,jband) = grad_berry(2,ipw,jband) - fac*(Bmat(1,iband,jband)*wfi + Bmat(2,iband,jband)*wfr)
    1433              :          end do
    1434              :        end do
    1435              :      end if
    1436              :    end do
    1437              : 
    1438              : !  Second part of gradient of Berry phase++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    1439              : 
    1440         4320 :    vect1(:,0) = zero ; vect2(:,0) = zero
    1441              : 
    1442              : !  prepare
    1443          864 :    ikpt1 = dtefield%ikpt_dk(ikpt,2,idir)
    1444          864 :    icg1 = dtefield%cgindex(ikpt1,isppol+nsppol)
    1445              :    npw_k1 = npwar1(ikpt)
    1446          864 :    npw_k2 = npwar1(ikpt1)
    1447        36720 :    pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,4,idir)
    1448              : 
    1449        36720 :    do ipw = 1, npw_k1
    1450        35856 :      jpw = pwind_tmp(ipw)
    1451        36720 :      if (jpw > 0) then
    1452        28944 :        iband_me = 0
    1453       144720 :        do iband = 1, dtefield%mband_occ
    1454       115776 :          if (band_procs(iband) /= mpi_enreg%me_band) cycle
    1455       115776 :          iband_me = iband_me + 1
    1456       115776 :          wfr = cg1(1,icg1 + (iband_me - 1)*npw_k2*nspinor + jpw)
    1457       115776 :          wfi = cg1(2,icg1 + (iband_me - 1)*npw_k2*nspinor + jpw)
    1458              : 
    1459       607824 :          do  jband = 1, dtefield%mband_occ
    1460              :            grad_berry(1,ipw,jband) = &
    1461              : &           grad_berry(1,ipw,jband) - &
    1462       463104 : &           fac*qmat(1,iband,jband,ikpt,2,idir)*wfr + fac*qmat(2,iband,jband,ikpt,2,idir)*wfi
    1463              : 
    1464              :            grad_berry(2,ipw,jband) = &
    1465              : &           grad_berry(2,ipw,jband) - &
    1466       578880 : &           fac*qmat(1,iband,jband,ikpt,2,idir)*wfi - fac*qmat(2,iband,jband,ikpt,2,idir)*wfr
    1467              :          end do
    1468              :        end do
    1469              :      end if
    1470              :    end do
    1471              : 
    1472              : !  compute <u^(0)_{k_j}|u^(1)_{k_j-1}> matrix----------------------------------------------------
    1473              : 
    1474              : !  prepare to calculate overlap matrix
    1475          864 :    ikptn = ikpt
    1476          864 :    ikpt1 = dtefield%ikpt_dk(ikpt,2,idir)
    1477          864 :    icg = dtefield%cgindex(ikptn,isppol)
    1478          864 :    icg1 = dtefield%cgindex(ikpt1,isppol+nsppol)
    1479          864 :    npw_k1 = npwarr(ikptn)
    1480              :    npw_k2 = npwar1(ikpt1)
    1481        36720 :    pwind_tmp(1:npw_k1) =pwindall((ikptn-1)*mpw_tmp+1:(ikptn-1)*mpw_tmp+npw_k1,8,idir)
    1482              : 
    1483         4320 :    vect1(:,0) = zero ; vect2(:,0) = zero
    1484              :    jband_me = 0
    1485         4320 :    do jband = 1, dtefield%mband_occ
    1486         3456 :      if (band_procs(jband) == mpi_enreg%me_band) then
    1487         3456 :        jband_me = jband_me + 1
    1488              :        vect2(:,1:npw_k2) = &
    1489       433728 : &        cg1(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
    1490        19008 :        if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
    1491              :      end if
    1492         3456 :      call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
    1493              : 
    1494              : 
    1495         3456 :      iband_me = 0
    1496        18144 :      do iband = 1, dtefield%mband_occ
    1497        13824 :        if (band_procs(iband) /= mpi_enreg%me_band) cycle
    1498        13824 :        iband_me = iband_me + 1
    1499        13824 :        pwmin = (iband_me-1)*npw_k1*nspinor
    1500        13824 :        pwmax = pwmin + npw_k1*nspinor
    1501              :        vect1(:,1:npw_k1) = &
    1502      1734912 : &       cg(:,icg + 1 + pwmin:icg + pwmax)
    1503        76032 :        if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
    1504              :        call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
    1505        13824 : &       vect1,vect2)
    1506        13824 :        s1mat(1,iband,jband) = dotr
    1507        17280 :        s1mat(2,iband,jband) = doti
    1508              :      end do    ! iband
    1509              :    end do    !jband
    1510              : 
    1511              : !  compute <u^(1)_{k_j}|u^(0)_{k_j-1}> matrix-----------------------------------------------------
    1512              : 
    1513              : !  prepare to calculate overlap matrix
    1514          864 :    ikpt1 = dtefield%ikpt_dk(ikpt,2,idir)
    1515          864 :    icg = dtefield%cgindex(ikpt,isppol+nsppol)
    1516          864 :    icg1 = dtefield%cgindex(ikpt1,isppol)
    1517              :    npw_k1 = npwarr(ikpt)
    1518          864 :    npw_k2 = npwar1(ikpt1)
    1519        36720 :    pwind_tmp(1:npw_k1) =pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,6,idir)
    1520              : 
    1521         4320 :    vect1(:,0) = zero ; vect2(:,0) = zero
    1522              :    jband_me = 0
    1523         4320 :    do jband = 1, dtefield%mband_occ
    1524         3456 :      if (band_procs(jband) == mpi_enreg%me_band) then
    1525         3456 :        jband_me = jband_me + 1
    1526              :        vect2(:,1:npw_k2) = &
    1527       433728 : &        cg(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
    1528        19008 :        if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
    1529              :      end if
    1530         3456 :      call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
    1531              : 
    1532        18144 :      do iband = 1, dtefield%mband_occ
    1533        13824 :        pwmin = (iband-1)*npw_k1*nspinor
    1534        13824 :        pwmax = pwmin + npw_k1*nspinor
    1535              :        vect1(:,1:npw_k1) = &
    1536      1734912 : &       cg1(:,icg + 1 + pwmin:icg + pwmax)
    1537        76032 :        if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
    1538              :        call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
    1539        13824 : &       vect1,vect2)
    1540        13824 :        s1mat(1,jband,iband) = s1mat(1,jband,iband) + dotr
    1541        17280 :        s1mat(2,jband,iband) = s1mat(2,jband,iband) + doti
    1542              :      end do    ! iband
    1543              :    end do    !jband
    1544              : 
    1545        45792 :    Amat(:,:,:)=zero
    1546              : 
    1547              : !  calculate Amat
    1548         4320 :    do iband=1, dtefield%mband_occ
    1549        18144 :      do jband=1, dtefield%mband_occ
    1550        72576 :        do kband=1, dtefield%mband_occ
    1551              :          Amat(1,iband,jband) = Amat(1,iband,jband) + s1mat(1,iband,kband)*qmat(1,kband,jband,ikpt,2,idir)&
    1552        55296 : &         - s1mat(2,iband,kband)*qmat(2,kband,jband,ikpt,2,idir)
    1553              :          Amat(2,iband,jband) = Amat(2,iband,jband) + s1mat(1,iband,kband)*qmat(2,kband,jband,ikpt,2,idir)&
    1554        69120 : &         + s1mat(2,iband,kband)*qmat(1,kband,jband,ikpt,2,idir)
    1555              :        end do
    1556              :      end do
    1557              :    end do
    1558              : 
    1559        45792 :    Bmat(:,:,:)=zero
    1560              : 
    1561              : !  calculate Bmat
    1562          864 :    ikptn = dtefield%ikpt_dk(ikpt,7,idir)
    1563         4320 :    do iband=1, dtefield%mband_occ
    1564        18144 :      do jband=1, dtefield%mband_occ
    1565        72576 :        do kband=1, dtefield%mband_occ
    1566              :          Bmat(1,jband,kband) = Bmat(1,jband,kband) + Amat(1,iband,kband)*qmat(1,jband,iband,ikptn,2,idir)&
    1567        55296 : &         - Amat(2,iband,kband)*qmat(2,jband,iband,ikptn,2,idir)
    1568              :          Bmat(2,jband,kband) = Bmat(2,jband,kband) + Amat(1,iband,kband)*qmat(2,jband,iband,ikptn,2,idir)&
    1569        69120 :          + Amat(2,iband,kband)*qmat(1,jband,iband,ikptn,2,idir)
    1570              :        end do
    1571              :      end do
    1572              :    end do
    1573              : 
    1574              : !  calc. the second term of gradient------------------------------
    1575              : 
    1576              : !  preparation
    1577              : 
    1578          864 :    ikptnp1 = dtefield%ikpt_dk(ikpt,4,idir)
    1579          864 :    icg = dtefield%cgindex(ikptnp1,isppol)
    1580          864 :    npw_k1 = npwar1(ikpt)
    1581          864 :    npw_k2 = npwarr(ikptnp1)
    1582        36720 :    pwind_tmp(1:npw_k1) =pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,6,idir)
    1583              :    z1(:) = zero
    1584              :    z2(:) = zero
    1585        37872 :    do ipw = 1, npw_k1
    1586        35856 :      jpw = pwind_tmp(ipw)
    1587        36720 :      if (jpw > 0) then
    1588       144720 :        do iband = 1, dtefield%mband_occ
    1589       115776 :          wfr = cg(1,icg + (iband - 1)*npw_k2*nspinor + jpw)
    1590       115776 :          wfi = cg(2,icg + (iband - 1)*npw_k2*nspinor + jpw)
    1591       607824 :          do jband=1, dtefield%mband_occ
    1592       463104 :            grad_berry(1,ipw,jband) = grad_berry(1,ipw,jband) + fac*(Bmat(1,iband,jband)*wfr - Bmat(2,iband,jband)*wfi)
    1593       578880 :            grad_berry(2,ipw,jband) = grad_berry(2,ipw,jband) + fac*(Bmat(1,iband,jband)*wfi + Bmat(2,iband,jband)*wfr)
    1594              :          end do
    1595              :        end do
    1596              :      end if
    1597              :    end do
    1598              : 
    1599              :  end do !idir
    1600              : 
    1601              : !!----------------------------------------third part of gradient------------------------------------------------------
    1602         1152 :  do idir=1,3
    1603              :    fac = rprimd(idir_efield,idir)*dble(nkpt)/&
    1604          864 : &   (dble(dtefield%nstr(idir))*four_pi)
    1605              : 
    1606              : !  prepare
    1607          864 :    ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
    1608          864 :    icg1 = dtefield%cgindex(ikpt1,isppol)
    1609          864 :    npw_k1 = npwar1(ikpt)
    1610          864 :    npw_k2 = npwarr(ikpt1)
    1611        36720 :    pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,5,idir)
    1612        36720 :    do ipw = 1, npw_k1
    1613        35856 :      jpw = pwind_tmp(ipw)
    1614        36720 :      if (jpw > 0) then
    1615       144720 :        do iband = 1, dtefield%mband_occ
    1616       115776 :          wfr = cg(1,icg1 + (iband - 1)*npw_k2*nspinor + jpw)
    1617       115776 :          wfi = cg(2,icg1 + (iband - 1)*npw_k2*nspinor + jpw)
    1618       607824 :          do  jband = 1, dtefield%mband_occ
    1619              :            grad_berry(1,ipw,jband) = &
    1620              : &           grad_berry(1,ipw,jband) + &
    1621       463104 : &           fac*qmat(1,iband,jband,ikpt,1,idir)*wfr - fac*qmat(2,iband,jband,ikpt,1,idir)*wfi
    1622              :            grad_berry(2,ipw,jband) = &
    1623              : &           grad_berry(2,ipw,jband) + &
    1624       578880 : &           fac*qmat(1,iband,jband,ikpt,1,idir)*wfi + fac*qmat(2,iband,jband,ikpt,1,idir)*wfr
    1625              :          end do
    1626              :        end do
    1627              :      end if
    1628              :    end do
    1629              : 
    1630              : !  prepare
    1631          864 :    ikpt1 = dtefield%ikpt_dk(ikpt,2,idir)
    1632          864 :    icg1 = dtefield%cgindex(ikpt1,isppol)
    1633              :    npw_k1 = npwar1(ikpt)
    1634          864 :    npw_k2 = npwarr(ikpt1)
    1635        36720 :    pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,6,idir)
    1636              : 
    1637        37008 :    do ipw = 1, npw_k1
    1638        35856 :      jpw = pwind_tmp(ipw)
    1639        36720 :      if (jpw > 0) then
    1640       144720 :        do iband = 1, dtefield%mband_occ
    1641       115776 :          wfr = cg(1,icg1 + (iband - 1)*npw_k2*nspinor + jpw)
    1642       115776 :          wfi = cg(2,icg1 + (iband - 1)*npw_k2*nspinor + jpw)
    1643       607824 :          do  jband = 1, dtefield%mband_occ
    1644              :            grad_berry(1,ipw,jband) = &
    1645              : &           grad_berry(1,ipw,jband) - &
    1646       463104 : &           fac*qmat(1,iband,jband,ikpt,2,idir)*wfr + fac*qmat(2,iband,jband,ikpt,2,idir)*wfi
    1647              : 
    1648              :            grad_berry(2,ipw,jband) = &
    1649              : &           grad_berry(2,ipw,jband) - &
    1650       578880 : &           fac*qmat(1,iband,jband,ikpt,2,idir)*wfi - fac*qmat(2,iband,jband,ikpt,2,idir)*wfr
    1651              : 
    1652              :          end do
    1653              :        end do
    1654              :      end if
    1655              :    end do
    1656              : 
    1657              :  end do !idir
    1658              : 
    1659              : ! accumulate full sum over iband in each jband entry
    1660          288 :  call xmpi_sum(grad_berry,mpi_enreg%comm_band,ierr)
    1661              : 
    1662          288 :  ABI_FREE(vect1)
    1663          288 :  ABI_FREE(vect2)
    1664          288 :  ABI_FREE(s1mat)
    1665          288 :  ABI_FREE(Amat)
    1666          288 :  ABI_FREE(Bmat)
    1667          288 :  ABI_FREE(pwind_tmp)
    1668              : 
    1669          288 : end subroutine dfptff_gbefd
    1670              : !!***
    1671              : 
    1672              : !!****f* ABINIT/dfptff_edie
    1673              : !! NAME
    1674              : !! dfptff_edie
    1675              : !!
    1676              : !! FUNCTION
    1677              : !! calculate the second order energy from the contribution of \Omega E \cdot P
    1678              : !! term, Eq.(6) in PRB 75, 115116(2007) [[cite:Wang2007]].
    1679              : !!
    1680              : !! INPUTS
    1681              : !! cg(2,mpw*nspinor*mband*mkmem_rbz*nsppol) = planewave coefficients of wavefunctions
    1682              : !! cg1(2,mpw1*nspinor*mband*mk1mem*nsppol) = pw coefficients of
    1683              : !! RF wavefunctions at k,q.
    1684              : !! dtefield = variables related to response Berry-phase calculation
    1685              : !! ikpt = the index of the current k point
    1686              : !! isppol = the index of the spin component
    1687              : !! mband =  maximum number of bands
    1688              : !! mkmem_rbz = maximum number of k-points in core memory
    1689              : !! mpw = maximum number of plane waves
    1690              : !! mpw1 = maximum number of plane waves for response wavefunctions
    1691              : !! nkpt = number of k points
    1692              : !! npwarr(nkpt) = number of planewaves in basis and boundary at this k point
    1693              : !! npwar1(nkpt) = number of planewaves in basis and boundary for response wfs
    1694              : !! nspinor = 1 for scalar wfs, 2 for spinor wfs
    1695              : !! nsppol = 1 for unpolarized, 2 for spin-polarized
    1696              : !! qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3) =
    1697              : !! inverse of the overlap matrix
    1698              : !! pwindall(max(mpw,mpw1)*mkmem_rbz,8,3) = array used to compute the overlap matrices
    1699              : !! pwindall(:,1,:) <- <u^(0)_i|u^(0)_i+1>
    1700              : !! pwindall(:,2,:) <- <u^(0)_i|u^(0)_i-1>
    1701              : !! pwindall(:,3,:) <- <u^(1)_i|u^(1)_i+1>
    1702              : !! pwindall(:,4,:) <- <u^(1)_i|u^(1)_i-1>
    1703              : !! pwindall(:,5,:) <- <u^(1)_i|u^(0)_i+n+1>
    1704              : !! pwindall(:,6,:) <- <u^(1)_i|u^(0)_i+n-1>
    1705              : !! pwindall(:,7,:) <- <u^(0)_i|u^(1)_i-n+1>
    1706              : !! pwindall(:,8,:) <- <u^(0)_i|u^(1)_i-n-1>
    1707              : !!
    1708              : !! OUTPUT
    1709              : !! eberry = the energy of the Berry phase term
    1710              : !!
    1711              : !! SOURCE
    1712              : 
    1713           36 : subroutine dfptff_edie(cg,cg1,dtefield,eberry,idir_efield,mband,mband_mem,mkmem_rbz,&
    1714           36 : &                mpi_enreg,mpw,mpw1,nkpt,npwarr,npwar1,nsppol,nspinor,pwindall,qmat,rprimd)
    1715              : 
    1716              : !Arguments ----------------------------------------
    1717              : !scalars
    1718              :  integer,intent(in) :: idir_efield,mband,mkmem_rbz,mpw,mpw1,nkpt,nspinor,nsppol
    1719              :  integer,intent(in) :: mband_mem
    1720              :  real(dp),intent(out) :: eberry
    1721              :  type(efield_type),intent(in) :: dtefield
    1722              :  type(MPI_type),intent(in) :: mpi_enreg
    1723              : !arrays
    1724              :  integer,intent(in) :: npwar1(nkpt),npwarr(nkpt)
    1725              :  integer,intent(in) :: pwindall(max(mpw,mpw1)*mkmem_rbz,8,3)
    1726              :  real(dp),intent(in) :: cg(2,mpw*mband_mem*mkmem_rbz*nspinor*nsppol)
    1727              :  real(dp),intent(in) :: cg1(2,mpw1*mband_mem*mkmem_rbz*nspinor*nsppol)
    1728              :  real(dp),intent(in) :: qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3)
    1729              :  real(dp),intent(in) :: rprimd(3,3)
    1730              : 
    1731              : !Local variables ----------------------------------
    1732              : !scalars
    1733              :  integer :: iband,icg,icg1,idir
    1734              :  integer :: jband_me, iband_me, me_band, ierr
    1735              :  integer :: ikpt,ikpt1,ikptn,ikptnm
    1736              :  integer :: jband,kband,mpw_tmp,npw_k1,npw_k2,pwmax,pwmin
    1737              :  real(dp) :: doti,dotr,e0,fac
    1738              : !arrays
    1739           36 :  integer,allocatable :: pwind_tmp(:)
    1740           72 :  integer :: band_procs(mband)
    1741              :  real(dp) :: z1(2)
    1742           36 :  real(dp),allocatable :: Amat(:,:,:),umat(:,:,:,:),vect1(:,:),vect2(:,:)
    1743              : 
    1744              : ! *************************************************************************
    1745              : 
    1746              : !calculate 4 matrices -----------------------------
    1747           36 :  mpw_tmp=max(mpw,mpw1)
    1748          180 :  ABI_MALLOC(umat,(2,dtefield%mband_occ,dtefield%mband_occ,4))
    1749          108 :  ABI_MALLOC(vect1,(2,0:mpw_tmp))
    1750           72 :  ABI_MALLOC(vect2,(2,0:mpw_tmp))
    1751          108 :  ABI_MALLOC(pwind_tmp,(mpw_tmp))
    1752          144 :  ABI_MALLOC(Amat,(2,dtefield%mband_occ,dtefield%mband_occ))
    1753          216 :  vect1(:,0) = zero ; vect2(:,0) = zero
    1754           36 :  eberry=zero
    1755              : 
    1756           36 :  me_band = mpi_enreg%me_band
    1757              : 
    1758          324 :  do ikpt=1,nkpt
    1759              : 
    1760              :    call proc_distrb_band(band_procs,mpi_enreg%proc_distrb,ikpt,1,mband,&
    1761          288 : &       me_band,mpi_enreg%me_kpt,mpi_enreg%comm_band)
    1762              : 
    1763         1188 :    do idir=1,3
    1764              :      fac = dtefield%efield_dot(idir)/&
    1765          864 : &     (dble(dtefield%nstr(idir))*four_pi)
    1766              : 
    1767              : !    compute <u^(1)_{k_j,q}|u^(1)_{k_j+1,q}> matrix----------------------------------------------------
    1768              : 
    1769              : !    prepare to calculate overlap matrix
    1770          864 :      ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
    1771          864 :      icg = dtefield%cgindex(ikpt,1+nsppol)
    1772          864 :      icg1 = dtefield%cgindex(ikpt1,1+nsppol)
    1773          864 :      npw_k1 = npwar1(ikpt)
    1774          864 :      npw_k2 = npwar1(ikpt1)
    1775        36720 :      pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,3,idir)
    1776         4320 :      vect1(:,0) = zero ; vect2(:,0) = zero
    1777              :      jband_me = 0
    1778         4320 :      do jband = 1, dtefield%mband_occ
    1779         3456 :        if (band_procs(jband) == me_band) then
    1780         3456 :          jband_me = jband_me + 1
    1781              :          vect2(:,1:npw_k2) = &
    1782       433728 : &         cg1(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
    1783        19008 :          if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
    1784              :        end if
    1785         3456 :        call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
    1786              : 
    1787         3456 :        iband_me = 0
    1788        18144 :        do iband = 1, dtefield%mband_occ
    1789        13824 :          if (band_procs(iband) /= me_band) cycle
    1790        13824 :          iband_me = iband_me + 1
    1791        13824 :          pwmin = (iband_me-1)*npw_k1*nspinor
    1792        13824 :          pwmax = pwmin + npw_k1*nspinor
    1793              :          vect1(:,1:npw_k1) = &
    1794      1734912 : &         cg1(:,icg + 1 + pwmin:icg + pwmax)
    1795        76032 :          if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
    1796              :          call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
    1797        13824 : &         vect1,vect2)
    1798        13824 :          umat(1,iband,jband,1) = dotr
    1799        17280 :          umat(2,iband,jband,1) = doti
    1800              :        end do    ! iband
    1801              :      end do    !jband
    1802              : 
    1803              : !    compute <u^(0)_{k_j}|u^(1)_{k_j-n+1,q}> matrix----------------------------------------------------
    1804              : 
    1805              : !    prepare to calculate overlap matrix
    1806          864 :      ikpt1 = dtefield%ikpt_dk(ikpt,5,idir)
    1807          864 :      icg = dtefield%cgindex(ikpt,1)
    1808          864 :      icg1 = dtefield%cgindex(ikpt1,1+nsppol)
    1809          864 :      npw_k1 = npwarr(ikpt)
    1810          864 :      npw_k2 = npwar1(ikpt1)
    1811        36720 :      pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,7,idir)
    1812              : 
    1813         4320 :      vect1(:,0) = zero ; vect2(:,0) = zero
    1814              :      jband_me = 0
    1815         4320 :      do jband = 1, dtefield%mband_occ
    1816         3456 :        if (band_procs(jband) == me_band) then
    1817         3456 :          jband_me = jband_me + 1
    1818              :          vect2(:,1:npw_k2) = &
    1819       433728 : &         cg1(:,icg1 + 1 + (jband-1)*npw_k2*nspinor:icg1 + jband*npw_k2*nspinor)
    1820        19008 :          if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
    1821              :        end if
    1822         3456 :        call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
    1823              : 
    1824         3456 :        iband_me = 0
    1825        18144 :        do iband = 1, dtefield%mband_occ
    1826        13824 :          if (band_procs(iband) /= me_band) cycle
    1827        13824 :          iband_me = iband_me + 1
    1828        13824 :          pwmin = (iband_me-1)*npw_k1*nspinor
    1829        13824 :          pwmax = pwmin + npw_k1*nspinor
    1830              :          vect1(:,1:npw_k1) = &
    1831      1734912 : &         cg(:,icg + 1 + pwmin:icg + pwmax)
    1832        76032 :          if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
    1833              :          call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
    1834        13824 : &         vect1,vect2)
    1835        13824 :          umat(1,iband,jband,2) = dotr
    1836        17280 :          umat(2,iband,jband,2) = doti
    1837              :        end do    ! iband
    1838              :      end do    !jband
    1839              : 
    1840              : !    compute <u^(1)_{k_j-n,q}|u^(0)_{k_j+1}> matrix----------------------------------------------------
    1841              : 
    1842              : !    prepare to calculate overlap matrix
    1843          864 :      ikptn  = dtefield%ikpt_dk(ikpt,8,idir)
    1844          864 :      ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
    1845          864 :      icg = dtefield%cgindex(ikptn,1+nsppol)
    1846          864 :      icg1 = dtefield%cgindex(ikpt1,1)
    1847          864 :      npw_k1 = npwar1(ikptn)
    1848          864 :      npw_k2 = npwarr(ikpt1)
    1849        36720 :      pwind_tmp(1:npw_k1) = pwindall((ikptn-1)*mpw_tmp+1:(ikptn-1)*mpw_tmp+npw_k1,5,idir)
    1850              : 
    1851         4320 :      vect1(:,0) = zero ; vect2(:,0) = zero
    1852              :      jband_me = 0
    1853         4320 :      do jband = 1, dtefield%mband_occ
    1854         3456 :        if (band_procs(jband) == me_band) then
    1855         3456 :          jband_me = jband_me + 1
    1856              :          vect2(:,1:npw_k2) = &
    1857       433728 : &         cg(:,icg1 + 1 + (jband-1)*npw_k2*nspinor:icg1 + jband*npw_k2*nspinor)
    1858        19008 :          if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
    1859              :        end if
    1860         3456 :        call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
    1861              : 
    1862         3456 :        iband_me = 0
    1863        18144 :        do iband = 1, dtefield%mband_occ
    1864        13824 :          if (band_procs(iband) /= me_band) cycle
    1865        13824 :          iband_me = iband_me + 1
    1866        13824 :          pwmin = (iband_me-1)*npw_k1*nspinor
    1867        13824 :          pwmax = pwmin + npw_k1*nspinor
    1868              :          vect1(:,1:npw_k1) = &
    1869      1734912 : &         cg1(:,icg + 1 + pwmin:icg + pwmax)
    1870        76032 :          if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
    1871              :          call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
    1872        13824 : &         vect1,vect2)
    1873        13824 :          umat(1,iband,jband,3) = dotr
    1874        17280 :          umat(2,iband,jband,3) = doti
    1875              :        end do    ! iband
    1876              :      end do    !jband
    1877              : 
    1878              : !    compute <u^(0)_{-k_j-n+1}|u^(1)_{-k_j,q}> matrix----------------------------------------------------
    1879              : 
    1880              : !    prepare to calculate overlap matrix
    1881          864 :      ikptn = dtefield%ikpt_dk(ikpt,5,idir)
    1882          864 :      ikptnm = dtefield%ikpt_dk(ikptn,9,idir)
    1883          864 :      ikpt1 = dtefield%ikpt_dk(ikpt,9,idir)
    1884          864 :      icg = dtefield%cgindex(ikptnm,1)
    1885          864 :      icg1 = dtefield%cgindex(ikpt1,1+nsppol)
    1886          864 :      npw_k1 = npwarr(ikptnm)
    1887          864 :      npw_k2 = npwar1(ikpt1)
    1888        36720 :      pwind_tmp(1:npw_k1) = pwindall((ikptnm-1)*mpw_tmp+1:(ikptnm-1)*mpw_tmp+npw_k1,7,idir)
    1889         4320 :      vect1(:,0) = zero ; vect2(:,0) = zero
    1890              :      jband_me = 0
    1891         4320 :      do jband = 1, dtefield%mband_occ
    1892         3456 :        if (band_procs(jband) == me_band) then
    1893         3456 :          jband_me = jband_me + 1
    1894              :          vect2(:,1:npw_k2) = &
    1895       433728 : &         cg1(:,icg1 + 1 + (jband-1)*npw_k2*nspinor:icg1 + jband*npw_k2*nspinor)
    1896        19008 :          if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
    1897              :        end if
    1898         3456 :        call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
    1899              : 
    1900         3456 :        iband_me = 0
    1901        18144 :        do iband = 1, dtefield%mband_occ
    1902        13824 :          if (band_procs(iband) /= me_band) cycle
    1903        13824 :          iband_me = iband_me + 1
    1904        13824 :          pwmin = (iband_me-1)*npw_k1*nspinor
    1905        13824 :          pwmax = pwmin + npw_k1*nspinor
    1906              :          vect1(:,1:npw_k1) = &
    1907      1734912 : &         cg(:,icg + 1 + pwmin:icg + pwmax)
    1908        76032 :          if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
    1909              :          call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
    1910        13824 : &         vect1,vect2)
    1911        13824 :          umat(1,iband,jband,4) = dotr
    1912        17280 :          umat(2,iband,jband,4) = doti
    1913              :        end do    ! iband
    1914              :      end do    !jband
    1915              : 
    1916              : ! sum up over all iband and all procs
    1917          864 :      call xmpi_sum(umat,mpi_enreg%comm_band,ierr)
    1918              : 
    1919              : !    sum over the whole------------------------------------------------------------
    1920              : 
    1921          864 :      e0=zero
    1922         4320 :      do iband=1,dtefield%mband_occ
    1923        18144 :        do jband=1,dtefield%mband_occ
    1924              :          e0 = e0 + 2_dp*(umat(1,iband,jband,1)*qmat(2,jband,iband,ikpt,1,idir)&
    1925        17280 : &         +       umat(2,iband,jband,1)*qmat(1,jband,iband,ikpt,1,idir))
    1926              :        end do
    1927              :      end do
    1928          864 :      eberry = eberry - e0*fac
    1929          864 :      e0=zero
    1930          864 :      ikptn=dtefield%ikpt_dk(ikpt,8,idir)
    1931        45792 :      Amat(:,:,:)=zero
    1932              : !    calculate Amat
    1933         4320 :      do iband=1, dtefield%mband_occ
    1934        18144 :        do jband=1, dtefield%mband_occ
    1935        72576 :          do kband=1, dtefield%mband_occ
    1936              :            Amat(1,iband,jband) = Amat(1,iband,jband) + (umat(1,iband,kband,3))*qmat(1,kband,jband,ikpt,1,idir)&
    1937        55296 : &           - (umat(2,iband,kband,3))*qmat(2,kband,jband,ikpt,1,idir)
    1938              :            Amat(2,iband,jband) = Amat(2,iband,jband) + (umat(1,iband,kband,3))*qmat(2,kband,jband,ikpt,1,idir)&
    1939        69120 : &           + (umat(2,iband,kband,3))*qmat(1,kband,jband,ikpt,1,idir)
    1940              :          end do
    1941              :        end do
    1942              :      end do
    1943              : 
    1944         4320 :      do iband=1, dtefield%mband_occ
    1945        18144 :        do jband=1, dtefield%mband_occ
    1946        72576 :          do kband=1, dtefield%mband_occ
    1947              :            z1(1) = (umat(1,jband,iband,4)+umat(1,iband,jband,2))*qmat(1,jband,kband,ikptn,1,idir)&
    1948        55296 : &           - (umat(2,jband,iband,4)+umat(2,iband,jband,2))*qmat(2,jband,kband,ikptn,1,idir)
    1949              :            z1(2) = (umat(1,jband,iband,4)+umat(1,iband,jband,2))*qmat(2,jband,kband,ikptn,1,idir)&
    1950        55296 : &           + (umat(2,jband,iband,4)+umat(2,iband,jband,2))*qmat(1,jband,kband,ikptn,1,idir)
    1951              : 
    1952        69120 :            e0 = e0 - 4_dp*(z1(1)*Amat(2,kband,iband)+z1(2)*Amat(1,kband,iband))
    1953              :          end do
    1954              :        end do
    1955              :      end do
    1956              : 
    1957          864 :      eberry = eberry - e0*fac
    1958              : 
    1959              : !    !---------------------------------last part---------------------------------------------
    1960              : 
    1961              :      fac = rprimd(idir_efield,idir)/&
    1962          864 : &     (dble(dtefield%nstr(idir))*two_pi)
    1963              : 
    1964              : !    compute <u^(1)_{k_j-n,q}|u^(0)_{k_j+1}> matrix----------------------------------------------------
    1965              : 
    1966              : !    prepare to calculate overlap matrix
    1967          864 :      ikptn  = dtefield%ikpt_dk(ikpt,8,idir)
    1968          864 :      ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
    1969          864 :      icg = dtefield%cgindex(ikptn,1+nsppol)
    1970          864 :      icg1 = dtefield%cgindex(ikpt1,1)
    1971          864 :      npw_k1 = npwar1(ikptn)
    1972          864 :      npw_k2 = npwarr(ikpt1)
    1973        36720 :      pwind_tmp(1:npw_k1) = pwindall((ikptn-1)*mpw_tmp+1:(ikptn-1)*mpw_tmp+npw_k1,5,idir)
    1974              : 
    1975         4320 :      vect1(:,0) = zero ; vect2(:,0) = zero
    1976              :      jband_me = 0
    1977         4320 :      do jband = 1, dtefield%mband_occ
    1978         3456 :        if (band_procs(jband) == me_band) then
    1979         3456 :          jband_me = jband_me + 1
    1980              :          vect2(:,1:npw_k2) = &
    1981       433728 : &         cg(:,icg1 + 1 + (jband-1)*npw_k2*nspinor:icg1 + jband*npw_k2*nspinor)
    1982        19008 :          if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
    1983              :        end if
    1984         3456 :        call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
    1985              : 
    1986         3456 :        iband_me = 0
    1987        18144 :        do iband = 1, dtefield%mband_occ
    1988        13824 :          if (band_procs(iband) /= me_band) cycle
    1989        13824 :          iband_me = iband_me + 1
    1990        13824 :          pwmin = (iband_me-1)*npw_k1*nspinor
    1991        13824 :          pwmax = pwmin + npw_k1*nspinor
    1992              :          vect1(:,1:npw_k1) = &
    1993      1734912 : &         cg1(:,icg + 1 + pwmin:icg + pwmax)
    1994        76032 :          if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
    1995              :          call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
    1996        13824 : &         vect1,vect2)
    1997        13824 :          umat(1,iband,jband,1) = dotr
    1998        17280 :          umat(2,iband,jband,1) = doti
    1999              :        end do    ! iband
    2000              :      end do    !jband
    2001              : 
    2002              : !    compute <u^(0)_{k_j}|u^(1)_{k_j-n+1,q}> matrix----------------------------------------------------
    2003              : 
    2004              : !    prepare to calculate overlap matrix
    2005          864 :      ikpt1 = dtefield%ikpt_dk(ikpt,5,idir)
    2006          864 :      icg = dtefield%cgindex(ikpt,1)
    2007          864 :      icg1 = dtefield%cgindex(ikpt1,1+nsppol)
    2008          864 :      npw_k1 = npwarr(ikpt)
    2009          864 :      npw_k2 = npwar1(ikpt1)
    2010        36720 :      pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,7,idir)
    2011         4320 :      vect1(:,0) = zero ; vect2(:,0) = zero
    2012              :      jband_me = 0
    2013         4320 :      do jband = 1, dtefield%mband_occ
    2014         3456 :        if (band_procs(jband) == me_band) then
    2015         3456 :          jband_me = jband_me + 1
    2016              :          vect2(:,1:npw_k2) = &
    2017       433728 : &         cg1(:,icg1 + 1 + (jband-1)*npw_k2*nspinor:icg1 + jband*npw_k2*nspinor)
    2018        19008 :          if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
    2019              :        end if
    2020         3456 :        call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
    2021              : 
    2022         3456 :        iband_me = 0
    2023        18144 :        do iband = 1, dtefield%mband_occ
    2024        13824 :          if (band_procs(iband) /= me_band) cycle
    2025        13824 :          iband_me = iband_me + 1
    2026        13824 :          pwmin = (iband_me-1)*npw_k1*nspinor
    2027        13824 :          pwmax = pwmin + npw_k1*nspinor
    2028              :          vect1(:,1:npw_k1) = &
    2029      1734912 : &         cg(:,icg + 1 + pwmin:icg + pwmax)
    2030        76032 :          if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
    2031              :          call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
    2032        13824 : &         vect1,vect2)
    2033        13824 :          umat(1,iband,jband,1) = umat(1,iband,jband,1) + dotr
    2034        17280 :          umat(2,iband,jband,1) = umat(2,iband,jband,1) + doti
    2035              :        end do    ! iband
    2036              :      end do    !jband
    2037              : 
    2038              : ! sum up over all iband and all procs
    2039          864 :      call xmpi_sum(umat,mpi_enreg%comm_band,ierr)
    2040              : 
    2041          864 :      e0=zero
    2042              : 
    2043         4320 :      do iband=1,dtefield%mband_occ
    2044        18144 :        do jband=1,dtefield%mband_occ
    2045              :          e0 = e0 +    (umat(1,iband,jband,1)*qmat(2,jband,iband,ikpt,1,idir)&
    2046        17280 : &         +       umat(2,iband,jband,1)*qmat(1,jband,iband,ikpt,1,idir))
    2047              :        end do
    2048              :      end do
    2049              : 
    2050         2880 :      eberry = eberry - e0*fac
    2051              : 
    2052              :    end do !end idir
    2053              :  end do !end ikpt
    2054              : 
    2055           36 :  ABI_FREE(umat)
    2056           36 :  ABI_FREE(vect1)
    2057           36 :  ABI_FREE(vect2)
    2058           36 :  ABI_FREE(pwind_tmp)
    2059           36 :  ABI_FREE(Amat)
    2060              : 
    2061           36 : end subroutine dfptff_edie
    2062              : !!***
    2063              : 
    2064              : !!****f* ABINIT/dfptff_ebp
    2065              : !! NAME
    2066              : !! dfptff_ebp
    2067              : !!
    2068              : !! FUNCTION
    2069              : !! calculation of the energy from the term \Omega E \cdot P
    2070              : !!
    2071              : !! INPUTS
    2072              : !! cg(2,mpw*nspinor*mband*mkmem_rbz*nsppol) = planewave coefficients of wavefunctions
    2073              : !! cg1(2,mpw1*nspinor*mband*mk1mem*nsppol) = pw coefficients of
    2074              : !! RF wavefunctions at k,q.
    2075              : !! dtefield = variables related to response Berry-phase calculation
    2076              : !! ikpt = the index of the current k point
    2077              : !! isppol = the index of the spin component
    2078              : !! mband =  maximum number of bands
    2079              : !! mkmem_rbz = maximum number of k-points in core memory
    2080              : !! mpw = maximum number of plane waves
    2081              : !! mpw1 = maximum number of plane waves for response wavefunctions
    2082              : !! nkpt = number of k points
    2083              : !! npwarr(nkpt) = number of planewaves in basis and boundary at this k point
    2084              : !! npwar1(nkpt) = number of planewaves in basis and boundary for response wfs
    2085              : !! nspinor = 1 for scalar wfs, 2 for spinor wfs
    2086              : !! nsppol = 1 for unpolarized, 2 for spin-polarized
    2087              : !! qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3) =
    2088              : !! inverse of the overlap matrix
    2089              : !! pwindall(max(mpw,mpw1)*mkmem_rbz,8,3) = array used to compute the overlap matrices
    2090              : !! pwindall(:,1,:) <- <u^(0)_i|u^(0)_i+1>
    2091              : !! pwindall(:,2,:) <- <u^(0)_i|u^(0)_i-1>
    2092              : !! pwindall(:,3,:) <- <u^(1)_i|u^(1)_i+1>
    2093              : !! pwindall(:,4,:) <- <u^(1)_i|u^(1)_i-1>
    2094              : !! pwindall(:,5,:) <- <u^(1)_i|u^(0)_i+n+1>
    2095              : !! pwindall(:,6,:) <- <u^(1)_i|u^(0)_i+n-1>
    2096              : !! pwindall(:,7,:) <- <u^(0)_i|u^(1)_i-n+1>
    2097              : !! pwindall(:,8,:) <- <u^(0)_i|u^(1)_i-n-1>
    2098              : !!
    2099              : !! OUTPUT
    2100              : !! grad_berry(2,mpw1,dtefield%mband_occ) = the gradient of the Berry phase term
    2101              : !!
    2102              : !! SOURCE
    2103              : 
    2104           61 : subroutine dfptff_ebp(cg,cg1,dtefield,eberry,mband,mband_mem,mkmem_rbz,&
    2105           61 : &               mpi_enreg,mpw,mpw1,nkpt,npwarr,npwar1,nsppol,nspinor,pwindall,qmat)
    2106              : 
    2107              : !Arguments ----------------------------------------
    2108              : !scalars
    2109              :  integer,intent(in) :: mband,mkmem_rbz,mpw,mpw1,nkpt,nspinor,nsppol
    2110              :  integer,intent(in) :: mband_mem
    2111              :  real(dp),intent(out) :: eberry
    2112              :  type(efield_type),intent(in) :: dtefield
    2113              :  type(MPI_type),intent(in) :: mpi_enreg
    2114              : !arrays
    2115              :  integer,intent(in) :: npwar1(nkpt),npwarr(nkpt)
    2116              :  integer,intent(in) :: pwindall(max(mpw,mpw1)*mkmem_rbz,8,3)
    2117              :  real(dp),intent(in) :: cg(2,mpw*mband_mem*mkmem_rbz*nspinor*nsppol)
    2118              :  real(dp),intent(in) :: cg1(2,mpw1*mband_mem*mkmem_rbz*nspinor*nsppol)
    2119              :  real(dp),intent(in) :: qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3)
    2120              : 
    2121              : !Local variables ----------------------------------
    2122              : !scalars
    2123              :  integer :: iband,icg,icg1,idir
    2124              :  integer :: jband_me, iband_me, me_band, ierr
    2125              :  integer :: ikpt,ikpt1,ikptn,ikptnm
    2126              :  integer :: jband,kband,mpw_tmp,npw_k1,npw_k2,pwmax,pwmin
    2127              :  real(dp) :: doti,dotr,e0,fac
    2128              : !arrays
    2129          122 :  integer :: band_procs(mband)
    2130           61 :  integer,allocatable :: pwind_tmp(:)
    2131              :  real(dp) :: z1(2)
    2132           61 :  real(dp),allocatable :: Amat(:,:,:),umat(:,:,:,:),vect1(:,:),vect2(:,:)
    2133              : 
    2134              : ! *************************************************************************
    2135              : 
    2136              : !calculate 4 matrices -----------------------------
    2137           61 :  mpw_tmp=max(mpw,mpw1)
    2138          305 :  ABI_MALLOC(umat,(2,dtefield%mband_occ,dtefield%mband_occ,4))
    2139          183 :  ABI_MALLOC(vect1,(2,0:mpw_tmp))
    2140          122 :  ABI_MALLOC(vect2,(2,0:mpw_tmp))
    2141          183 :  ABI_MALLOC(pwind_tmp,(mpw_tmp))
    2142          244 :  ABI_MALLOC(Amat,(2,dtefield%mband_occ,dtefield%mband_occ))
    2143          366 :  vect1(:,0) = zero ; vect2(:,0) = zero
    2144           61 :  eberry=zero
    2145              : 
    2146           61 :  me_band = mpi_enreg%me_band
    2147              : 
    2148              : !TODO no info on sppol here - I default to isppol 1
    2149          549 :  do ikpt=1,nkpt
    2150              :    call proc_distrb_band(band_procs,mpi_enreg%proc_distrb,ikpt,1,mband,&
    2151          488 : &       me_band,mpi_enreg%me_kpt,mpi_enreg%comm_band)
    2152              : 
    2153              : 
    2154         2013 :    do idir=1,3
    2155              : 
    2156              :      fac = dtefield%efield_dot(idir)/&
    2157         1464 : &     (dble(dtefield%nstr(idir))*four_pi)
    2158              : 
    2159              : !    compute <u^(1)_{k_j,q}|u^(1)_{k_j+1,q}> matrix---------
    2160              : 
    2161              : !    prepare to calculate overlap matrix
    2162         1464 :      ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
    2163         1464 :      icg = dtefield%cgindex(ikpt,1+nsppol)
    2164         1464 :      icg1 = dtefield%cgindex(ikpt1,1+nsppol)
    2165         1464 :      npw_k1 = npwar1(ikpt)
    2166         1464 :      npw_k2 = npwar1(ikpt1)
    2167        62220 :      pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,3,idir)
    2168         7320 :      vect1(:,0) = zero ; vect2(:,0) = zero
    2169              :      jband_me = 0
    2170         7320 :      do jband = 1, dtefield%mband_occ
    2171         5856 :        if (band_procs(jband) == me_band) then
    2172         5856 :          jband_me = jband_me + 1
    2173       734928 :          vect2(:,1:npw_k2) = cg1(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
    2174        32208 :          if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
    2175              :        end if
    2176         5856 :        call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
    2177              : 
    2178              : 
    2179         5856 :        iband_me = 0
    2180        30744 :        do iband = 1, dtefield%mband_occ
    2181        23424 :          if (band_procs(iband) /= me_band) cycle
    2182        23424 :          iband_me = iband_me + 1
    2183              : 
    2184        23424 :          pwmin = (iband_me-1)*npw_k1*nspinor
    2185        23424 :          pwmax = pwmin + npw_k1*nspinor
    2186              :          vect1(:,1:npw_k1) = &
    2187      2939712 : &         cg1(:,icg + 1 + pwmin:icg + pwmax)
    2188       128832 :          if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
    2189              :          call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
    2190        23424 : &         vect1,vect2)
    2191        23424 :          umat(1,iband,jband,1) = dotr
    2192        29280 :          umat(2,iband,jband,1) = doti
    2193              : 
    2194              :        end do    ! iband
    2195              :      end do    !jband
    2196              : 
    2197              : !    compute <u^(0)_{k_j}|u^(1)_{k_j-n+1,q}> matrix----------------------------------------------------
    2198              : 
    2199              : !    prepare to calculate overlap matrix
    2200         1464 :      ikpt1 = dtefield%ikpt_dk(ikpt,5,idir)
    2201         1464 :      icg = dtefield%cgindex(ikpt,1)
    2202         1464 :      icg1 = dtefield%cgindex(ikpt1,1+nsppol)
    2203         1464 :      npw_k1 = npwarr(ikpt)
    2204         1464 :      npw_k2 = npwar1(ikpt1)
    2205        62220 :      pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,7,idir)
    2206              : 
    2207         7320 :      vect1(:,0) = zero ; vect2(:,0) = zero
    2208              :      jband_me = 0
    2209         7320 :      do jband = 1, dtefield%mband_occ
    2210         5856 :        if (band_procs(jband) == me_band) then
    2211         5856 :          jband_me = jband_me + 1
    2212              :          vect2(:,1:npw_k2) = &
    2213       734928 : &         cg1(:,icg1 + 1 + (jband-1)*npw_k2*nspinor:icg1 + jband*npw_k2*nspinor)
    2214        32208 :          if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
    2215              :        end if
    2216         5856 :        call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
    2217              : 
    2218         5856 :        iband_me = 0
    2219        30744 :        do iband = 1, dtefield%mband_occ
    2220        23424 :          if (band_procs(iband) /= me_band) cycle
    2221        23424 :          iband_me = iband_me + 1
    2222              : 
    2223        23424 :          pwmin = (iband_me-1)*npw_k1*nspinor
    2224        23424 :          pwmax = pwmin + npw_k1*nspinor
    2225              :          vect1(:,1:npw_k1) = &
    2226      2939712 : &         cg(:,icg + 1 + pwmin:icg + pwmax)
    2227       128832 :          if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
    2228              :          call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
    2229        23424 : &         vect1,vect2)
    2230        23424 :          umat(1,iband,jband,2) = dotr
    2231        29280 :          umat(2,iband,jband,2) = doti
    2232              : 
    2233              :        end do    ! iband
    2234              :      end do    !jband
    2235              : 
    2236              : !    compute <u^(1)_{k_j-n,q}|u^(0)_{k_j+1}> matrix----------------------------------------------------
    2237              : 
    2238              : !    prepare to calculate overlap matrix
    2239         1464 :      ikptn  = dtefield%ikpt_dk(ikpt,8,idir)
    2240         1464 :      ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
    2241         1464 :      icg = dtefield%cgindex(ikptn,1+nsppol)
    2242         1464 :      icg1 = dtefield%cgindex(ikpt1,1)
    2243         1464 :      npw_k1 = npwar1(ikptn)
    2244         1464 :      npw_k2 = npwarr(ikpt1)
    2245        62220 :      pwind_tmp(1:npw_k1) = pwindall((ikptn-1)*mpw_tmp+1:(ikptn-1)*mpw_tmp+npw_k1,5,idir)
    2246              : 
    2247         7320 :      vect1(:,0) = zero ; vect2(:,0) = zero
    2248              :      jband_me = 0
    2249         7320 :      do jband = 1, dtefield%mband_occ
    2250         5856 :        if (band_procs(jband) == me_band) then
    2251         5856 :          jband_me = jband_me + 1
    2252              :          vect2(:,1:npw_k2) = &
    2253       734928 : &         cg(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
    2254        32208 :          if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
    2255              :        end if
    2256         5856 :        call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
    2257              : 
    2258         5856 :        iband_me = 0
    2259        30744 :        do iband = 1, dtefield%mband_occ
    2260        23424 :          if (band_procs(iband) /= me_band) cycle
    2261        23424 :          iband_me = iband_me + 1
    2262              : 
    2263        23424 :          pwmin = (iband_me-1)*npw_k1*nspinor
    2264        23424 :          pwmax = pwmin + npw_k1*nspinor
    2265              :          vect1(:,1:npw_k1) = &
    2266      2939712 : &         cg1(:,icg + 1 + pwmin:icg + pwmax)
    2267       128832 :          if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
    2268              :          call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
    2269        23424 : &         vect1,vect2)
    2270        23424 :          umat(1,iband,jband,3) = dotr
    2271        29280 :          umat(2,iband,jband,3) = doti
    2272              : 
    2273              :        end do    ! iband
    2274              :      end do    !jband
    2275              : 
    2276              : !    compute <u^(0)_{-k_j-n+1}|u^(1)_{-k_j,q}> matrix----------------------------------------------------
    2277              : 
    2278              : !    prepare to calculate overlap matrix
    2279         1464 :      ikptn = dtefield%ikpt_dk(ikpt,5,idir)
    2280         1464 :      ikptnm = dtefield%ikpt_dk(ikptn,9,idir)
    2281         1464 :      ikpt1 = dtefield%ikpt_dk(ikpt,9,idir)
    2282         1464 :      icg = dtefield%cgindex(ikptnm,1)
    2283         1464 :      icg1 = dtefield%cgindex(ikpt1,1+nsppol)
    2284         1464 :      npw_k1 = npwarr(ikptnm)
    2285         1464 :      npw_k2 = npwar1(ikpt1)
    2286        62220 :      pwind_tmp(1:npw_k1) = pwindall((ikptnm-1)*mpw_tmp+1:(ikptnm-1)*mpw_tmp+npw_k1,7,idir)
    2287              : 
    2288         7320 :      vect1(:,0) = zero ; vect2(:,0) = zero
    2289              :      jband_me = 0
    2290         7320 :      do jband = 1, dtefield%mband_occ
    2291         5856 :        if (band_procs(jband) == me_band) then
    2292         5856 :          jband_me = jband_me + 1
    2293              :          vect2(:,1:npw_k2) = &
    2294       734928 : &         cg1(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
    2295        32208 :          if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
    2296              :        end if
    2297         5856 :        call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
    2298              : 
    2299         5856 :        iband_me = 0
    2300        30744 :        do iband = 1, dtefield%mband_occ
    2301        23424 :          if (band_procs(iband) /= me_band) cycle
    2302        23424 :          iband_me = iband_me + 1
    2303              : 
    2304        23424 :          pwmin = (iband_me-1)*npw_k1*nspinor
    2305        23424 :          pwmax = pwmin + npw_k1*nspinor
    2306              :          vect1(:,1:npw_k1) = &
    2307      2939712 : &         cg(:,icg + 1 + pwmin:icg + pwmax)
    2308       128832 :          if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
    2309              :          call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
    2310        23424 : &         vect1,vect2)
    2311        23424 :          umat(1,iband,jband,4) = dotr
    2312        29280 :          umat(2,iband,jband,4) = doti
    2313              : 
    2314              :        end do    ! iband
    2315              :      end do    !jband
    2316              : 
    2317              : ! recompose full umat on each proc, summing over iband
    2318         1464 :      call xmpi_sum(umat,mpi_enreg%comm_band,ierr)
    2319              : 
    2320              : !    sum over the whole------------------------------------------------------------
    2321              : 
    2322         1464 :      e0=zero
    2323         7320 :      do iband=1,dtefield%mband_occ
    2324        30744 :        do jband=1,dtefield%mband_occ
    2325              :          e0 = e0 + 4_dp*(umat(1,iband,jband,1)*qmat(2,jband,iband,ikpt,1,idir)&
    2326        29280 : &         +              umat(2,iband,jband,1)*qmat(1,jband,iband,ikpt,1,idir))
    2327              : 
    2328              :        end do
    2329              :      end do
    2330              : 
    2331         1464 :      eberry = eberry - e0*fac
    2332              : 
    2333         1464 :      e0=zero
    2334              : 
    2335         1464 :      ikptn=dtefield%ikpt_dk(ikpt,8,idir)
    2336              : 
    2337        77592 :      Amat(:,:,:)=zero
    2338              : 
    2339              : !    calculate Amat
    2340         7320 :      do iband=1, dtefield%mband_occ
    2341        30744 :        do jband=1, dtefield%mband_occ
    2342       122976 :          do kband=1, dtefield%mband_occ
    2343              :            Amat(1,iband,jband) = Amat(1,iband,jband) + (umat(1,iband,kband,3))*&
    2344              : &           qmat(1,kband,jband,ikpt,1,idir)&
    2345        93696 : &           - (umat(2,iband,kband,3))*qmat(2,kband,jband,ikpt,1,idir)
    2346              :            Amat(2,iband,jband) = Amat(2,iband,jband) + (umat(1,iband,kband,3))*&
    2347              : &           qmat(2,kband,jband,ikpt,1,idir)&
    2348       117120 : &           + (umat(2,iband,kband,3))*qmat(1,kband,jband,ikpt,1,idir)
    2349              :          end do
    2350              :        end do
    2351              :      end do
    2352              : 
    2353         7320 :      do iband=1, dtefield%mband_occ
    2354        30744 :        do jband=1, dtefield%mband_occ
    2355       122976 :          do kband=1, dtefield%mband_occ
    2356              : 
    2357              :            z1(1) = (umat(1,jband,iband,4)+umat(1,iband,jband,2))*&
    2358              : &           qmat(1,jband,kband,ikptn,1,idir)&
    2359              : &           -    (umat(2,jband,iband,4)+umat(2,iband,jband,2))*&
    2360        93696 : &           qmat(2,jband,kband,ikptn,1,idir)
    2361              :            z1(2) = (umat(1,jband,iband,4)+umat(1,iband,jband,2))*&
    2362              : &           qmat(2,jband,kband,ikptn,1,idir)&
    2363              : &           +    (umat(2,jband,iband,4)+umat(2,iband,jband,2))*&
    2364        93696 : &           qmat(1,jband,kband,ikptn,1,idir)
    2365              : 
    2366       117120 :            e0 = e0 - 4_dp*(z1(1)*Amat(2,kband,iband)+z1(2)*Amat(1,kband,iband))
    2367              : 
    2368              :          end do
    2369              :        end do
    2370              :      end do
    2371              : 
    2372         3416 :      eberry = eberry - e0*fac
    2373              : 
    2374              :    end do !end idir
    2375              :  end do !end ikpt
    2376              : 
    2377           61 :  ABI_FREE(umat)
    2378           61 :  ABI_FREE(vect1)
    2379           61 :  ABI_FREE(vect2)
    2380           61 :  ABI_FREE(pwind_tmp)
    2381           61 :  ABI_FREE(Amat)
    2382              : 
    2383           61 : end subroutine dfptff_ebp
    2384              : !!***
    2385              : 
    2386              : !!****f* ABINIT/dfptff_die
    2387              : !! NAME
    2388              : !! dfptff_die
    2389              : !!
    2390              : !! FUNCTION
    2391              : !! calculate electric susceptibility tensor in Eq.(28) in PRB 75, 115116(2007) [[cite:Wang2007]].
    2392              : !!
    2393              : !! INPUTS
    2394              : !! cg(2,mpw*nspinor*mband*mkmem_rbz*nsppol) = planewave coefficients of wavefunctions
    2395              : !! cg1(2,mpw1*nspinor*mband*mk1mem*nsppol) = pw coefficients of
    2396              : !! RF wavefunctions at k,q.
    2397              : !! dtefield = variables related to response Berry-phase calculation
    2398              : !! idirpert = the current coloumn of the dielectric permittivity tensor
    2399              : !! mband =  maximum number of bands
    2400              : !! mkmem_rbz = maximum number of k-points in core memory
    2401              : !! mpw = maximum number of plane waves
    2402              : !! mpw1 = maximum number of plane waves for response wavefunctions
    2403              : !! nkpt = number of k points
    2404              : !! npwarr(nkpt) = number of planewaves in basis and boundary at this k point
    2405              : !! npwar1(nkpt) = number of planewaves in basis and boundary for response wfs
    2406              : !! nspinor = 1 for scalar wfs, 2 for spinor wfs
    2407              : !! nsppol = 1 for unpolarized, 2 for spin-polarized
    2408              : !! qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3) =
    2409              : !! inverse of the overlap matrix
    2410              : !! pwindall(max(mpw,mpw1)*mkmem_rbz,8,3) = array used to compute the overlap matrices
    2411              : !! pwindall(:,1,:) <- <u^(0)_i|u^(0)_i+1>
    2412              : !! pwindall(:,2,:) <- <u^(0)_i|u^(0)_i-1>
    2413              : !! pwindall(:,3,:) <- <u^(1)_i|u^(1)_i+1>
    2414              : !! pwindall(:,4,:) <- <u^(1)_i|u^(1)_i-1>
    2415              : !! pwindall(:,5,:) <- <u^(1)_i|u^(0)_i+n+1>
    2416              : !! pwindall(:,6,:) <- <u^(1)_i|u^(0)_i+n-1>
    2417              : !! pwindall(:,7,:) <- <u^(0)_i|u^(1)_i-n+1>
    2418              : !! pwindall(:,8,:) <- <u^(0)_i|u^(1)_i-n-1>
    2419              : !! rprimd(3,3)=dimensional primitive translations in real space (bohr)
    2420              : !!
    2421              : !! OUTPUT
    2422              : !! diet = electric susceptibility tensor
    2423              : !!
    2424              : !! SOURCE
    2425              : 
    2426            3 : subroutine dfptff_die(cg,cg1,dtefield,d2lo,idirpert,ipert,mband,mband_mem,mkmem_rbz,&
    2427            3 : &               mpi_enreg,mpw,mpw1,mpert,nkpt,npwarr,npwar1,nsppol,nspinor,pwindall,qmat,rprimd)
    2428              : 
    2429              : !Arguments ----------------------------------------
    2430              : !scalars
    2431              :  integer,intent(in) :: idirpert,ipert,mband,mkmem_rbz,mpert,mpw,mpw1,nkpt,nspinor
    2432              :  integer,intent(in) :: mband_mem
    2433              :  integer,intent(in) :: nsppol
    2434              :  type(efield_type),intent(in) :: dtefield
    2435              :  type(MPI_type),intent(in) :: mpi_enreg
    2436              : !arrays
    2437              :  integer,intent(in) :: npwar1(nkpt),npwarr(nkpt)
    2438              :  integer,intent(in) :: pwindall(max(mpw,mpw1)*mkmem_rbz,8,3)
    2439              :  real(dp),intent(in) :: cg(2,mpw*mband_mem*mkmem_rbz*nspinor*nsppol)
    2440              :  real(dp),intent(in) :: cg1(2,mpw1*mband_mem*mkmem_rbz*nspinor*nsppol)
    2441              :  real(dp),intent(in) :: qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3)
    2442              :  real(dp),intent(in) :: rprimd(3,3)
    2443              :  real(dp),intent(inout) :: d2lo(2,3,mpert,3,mpert) !vz_i
    2444              : 
    2445              : !Local variables ----------------------------------
    2446              : !scalars
    2447              :  integer :: ialpha,iband,icg,icg1,idir,ikpt,ikpt1,jband,mpw_tmp,npw_k1
    2448              :  integer :: jband_me, iband_me, me_band, ierr
    2449              :  integer :: npw_k2,pwmax,pwmin
    2450              :  real(dp) :: doti,dotr,e0,fac
    2451              : !arrays
    2452            6 :  integer :: band_procs(mband)
    2453            3 :  integer,allocatable :: pwind_tmp(:)
    2454              :  real(dp) :: edir(3)
    2455            3 :  real(dp),allocatable :: s1mat(:,:,:),vect1(:,:),vect2(:,:)
    2456              : 
    2457              : ! *************************************************************************
    2458              : 
    2459              : !calculate s1 matrices -----------------------------
    2460            3 :  mpw_tmp=max(mpw,mpw1)
    2461           12 :  ABI_MALLOC(s1mat,(2,dtefield%mband_occ,dtefield%mband_occ))
    2462            9 :  ABI_MALLOC(vect1,(2,0:mpw_tmp))
    2463            6 :  ABI_MALLOC(vect2,(2,0:mpw_tmp))
    2464            9 :  ABI_MALLOC(pwind_tmp,(mpw_tmp))
    2465           18 :  vect1(:,0) = zero ; vect2(:,0) = zero
    2466              : 
    2467            3 :  edir(:)=zero
    2468              : 
    2469            3 :  me_band = mpi_enreg%me_band
    2470              : 
    2471              : !TODO no info on sppol here - I default to isppol 1
    2472           27 :  do ikpt=1,nkpt
    2473              :    call proc_distrb_band(band_procs,mpi_enreg%proc_distrb,ikpt,1,mband,&
    2474           24 : &       me_band,mpi_enreg%me_kpt,mpi_enreg%comm_band)
    2475           99 :    do idir=1,3
    2476              : !    compute <u^(0)_{k_j}|u^(1)_{k_j+1,q}> matrix--- q=0 ----------------------------------------
    2477              : 
    2478              : !    prepare to calculate overlap matrix
    2479           72 :      ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
    2480           72 :      icg = dtefield%cgindex(ikpt,1)
    2481           72 :      icg1 = dtefield%cgindex(ikpt1,1+nsppol)
    2482           72 :      npw_k1 = npwarr(ikpt)
    2483           72 :      npw_k2 = npwar1(ikpt1)
    2484         3060 :      pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,7,idir)
    2485              : 
    2486          360 :      vect1(:,0) = zero ; vect2(:,0) = zero
    2487              :      jband_me = 0
    2488          360 :      do jband = 1, dtefield%mband_occ
    2489          288 :        if (band_procs(jband) == me_band) then
    2490          288 :          jband_me = jband_me + 1
    2491              :          vect2(:,1:npw_k2) = &
    2492        36144 : &         cg1(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
    2493         1584 :          if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
    2494              :        end if
    2495          288 :        call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
    2496              : 
    2497          288 :        iband_me = 0
    2498         1512 :        do iband = 1, dtefield%mband_occ
    2499         1152 :          if (band_procs(iband) /= me_band) cycle
    2500         1152 :          iband_me = iband_me + 1
    2501         1152 :          pwmin = (iband_me-1)*npw_k1*nspinor
    2502         1152 :          pwmax = pwmin + npw_k1*nspinor
    2503              :          vect1(:,1:npw_k1) = &
    2504       144576 : &         cg(:,icg + 1 + pwmin:icg + pwmax)
    2505         6336 :          if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
    2506              :          call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
    2507         1152 : &         vect1,vect2)
    2508         1152 :          s1mat(1,iband,jband) = dotr
    2509         1440 :          s1mat(2,iband,jband) = doti
    2510              :        end do    ! iband
    2511              :      end do    !jband
    2512              : 
    2513              : !    compute <u^(1)_{k_j,q}|u^(0)_{k_j+1}> matrix-- q=0 -------------------------------------
    2514              : 
    2515              : !    prepare to calculate overlap matrix
    2516           72 :      ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
    2517           72 :      icg = dtefield%cgindex(ikpt,1+nsppol)
    2518           72 :      icg1 = dtefield%cgindex(ikpt1,1)
    2519           72 :      npw_k1 = npwar1(ikpt)
    2520           72 :      npw_k2 = npwarr(ikpt1)
    2521         3060 :      pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,5,idir)
    2522          360 :      vect1(:,0) = zero ; vect2(:,0) = zero
    2523              :      jband_me = 0
    2524          360 :      do jband = 1, dtefield%mband_occ
    2525          288 :        if (band_procs(jband) == me_band) then
    2526          288 :          jband_me = jband_me + 1
    2527              :          vect2(:,1:npw_k2) = &
    2528        36144 : &         cg(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
    2529         1584 :          if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
    2530              :        end if
    2531          288 :        call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
    2532              : 
    2533          288 :        iband_me = 0
    2534         1512 :        do iband = 1, dtefield%mband_occ
    2535         1152 :          if (band_procs(iband) /= me_band) cycle
    2536         1152 :          iband_me = iband_me + 1
    2537         1152 :          pwmin = (iband_me-1)*npw_k1*nspinor
    2538         1152 :          pwmax = pwmin + npw_k1*nspinor
    2539              :          vect1(:,1:npw_k1) = &
    2540       144576 : &         cg1(:,icg + 1 + pwmin:icg + pwmax)
    2541         6336 :          if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
    2542              :          call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
    2543         1152 : &         vect1,vect2)
    2544         1152 :          s1mat(1,iband,jband) = s1mat(1,iband,jband) + dotr
    2545         1440 :          s1mat(2,iband,jband) = s1mat(2,iband,jband) + doti
    2546              :        end do    ! iband
    2547              :      end do    !jband
    2548              : 
    2549              : ! recompose full s1mat on each proc, summing over iband
    2550           72 :      call xmpi_sum(s1mat,mpi_enreg%comm_band,ierr)
    2551              : 
    2552              : !    sum over the whole------------------------------------------------------------
    2553              : 
    2554           72 :      e0=zero
    2555              : 
    2556          360 :      do iband=1,dtefield%mband_occ
    2557         1512 :        do jband=1,dtefield%mband_occ
    2558              :          e0 = e0 + (s1mat(1,iband,jband)*qmat(2,jband,iband,ikpt,1,idir)&
    2559         1440 : &         +    s1mat(2,iband,jband)*qmat(1,jband,iband,ikpt,1,idir))
    2560              : 
    2561              :        end do
    2562              :      end do
    2563              : 
    2564          384 :      do ialpha=1,3
    2565              :        fac = rprimd(ialpha,idir)/&
    2566          216 : &       (dble(dtefield%nstr(idir))*pi)
    2567          288 :        edir(ialpha)=edir(ialpha)+ e0*fac
    2568              :      end do
    2569              : 
    2570              :    end do !idir
    2571              :  end do !ikpt
    2572              : 
    2573           12 :  d2lo(1,1:3,ipert,idirpert,ipert)=edir(:)
    2574              : 
    2575            3 :  ABI_FREE(s1mat)
    2576            3 :  ABI_FREE(vect1)
    2577            3 :  ABI_FREE(vect2)
    2578            3 :  ABI_FREE(pwind_tmp)
    2579              : 
    2580            3 : end subroutine dfptff_die
    2581              : !!***
    2582              : 
    2583              : !!****f* ABINIT/dfptff_bec
    2584              : !! NAME
    2585              : !! dfptff_bec
    2586              : !!
    2587              : !! FUNCTION
    2588              : !! calculate Born effective charge tensor in Eq.(33) in PRB 75, 115116(2007) [[cite:Wang2007]].
    2589              : !!
    2590              : !! INPUTS
    2591              : !! cg(2,mpw*nspinor*mband_mem*mkmem_rbz*nsppol) = planewave coefficients of wavefunctions
    2592              : !! cg1(2,mpw1*nspinor*mband_mem*mk1mem*nsppol) = pw coefficients of
    2593              : !! RF wavefunctions at k,q.
    2594              : !! dtefield = variables related to response Berry-phase calculation
    2595              : !! idirpert = the current coloumn of the dielectric permittivity tensor
    2596              : !! mband =  maximum number of bands
    2597              : !! mband_mem =  maximum number of bands on this cpu
    2598              : !! mkmem_rbz = maximum number of k-points in core memory
    2599              : !! mpw = maximum number of plane waves
    2600              : !! mpw1 = maximum number of plane waves for response wavefunctions
    2601              : !! nkpt = number of k points
    2602              : !! npwarr(nkpt) = number of planewaves in basis and boundary at this k point
    2603              : !! npwar1(nkpt) = number of planewaves in basis and boundary for response wfs
    2604              : !! nspinor = 1 for scalar wfs, 2 for spinor wfs
    2605              : !! nsppol = 1 for unpolarized, 2 for spin-polarized
    2606              : !! qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3) =
    2607              : !! inverse of the overlap matrix
    2608              : !! pwindall(max(mpw,mpw1)*mkmem_rbz,8,3) = array used to compute the overlap matrices
    2609              : !! pwindall(:,1,:) <- <u^(0)_i|u^(0)_i+1>
    2610              : !! pwindall(:,2,:) <- <u^(0)_i|u^(0)_i-1>
    2611              : !! pwindall(:,3,:) <- <u^(1)_i|u^(1)_i+1>
    2612              : !! pwindall(:,4,:) <- <u^(1)_i|u^(1)_i-1>
    2613              : !! pwindall(:,5,:) <- <u^(1)_i|u^(0)_i+n+1>
    2614              : !! pwindall(:,6,:) <- <u^(1)_i|u^(0)_i+n-1>
    2615              : !! pwindall(:,7,:) <- <u^(0)_i|u^(1)_i-n+1>
    2616              : !! pwindall(:,8,:) <- <u^(0)_i|u^(1)_i-n-1>
    2617              : !! rprimd(3,3)=dimensional primitive translations in real space (bohr)
    2618              : !!
    2619              : !! OUTPUT
    2620              : !! d2lo(1,1:3,natom+5,1:3,1:natom) = Born effective charge tensor
    2621              : !!
    2622              : !! SOURCE
    2623              : 
    2624            6 : subroutine dfptff_bec(cg,cg1,dtefield,natom,d2lo,idirpert,ipert,mband,mband_mem,mkmem_rbz,&
    2625            6 : &               mpi_enreg,mpw,mpw1,mpert,nkpt,npwarr,npwar1,nsppol,nspinor,pwindall,qmat,rprimd)
    2626              : 
    2627              : !Arguments ----------------------------------------
    2628              : !scalars
    2629              :  integer,intent(in) :: idirpert,ipert,mband,mkmem_rbz,mpert,mpw,mpw1,natom,nkpt
    2630              :  integer,intent(in) :: mband_mem
    2631              :  integer,intent(in) :: nspinor,nsppol
    2632              :  type(efield_type),intent(in) :: dtefield
    2633              :  type(MPI_type),intent(in) :: mpi_enreg
    2634              : !arrays
    2635              :  integer,intent(in) :: npwar1(nkpt),npwarr(nkpt)
    2636              :  integer,intent(in) :: pwindall(max(mpw,mpw1)*mkmem_rbz,8,3)
    2637              :  real(dp),intent(in) :: cg(2,mpw*mband_mem*mkmem_rbz*nspinor*nsppol)
    2638              :  real(dp),intent(in) :: cg1(2,mpw1*mband_mem*mkmem_rbz*nspinor*nsppol)
    2639              :  real(dp),intent(in) :: qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3)
    2640              :  real(dp),intent(in) :: rprimd(3,3)
    2641              :  real(dp),intent(inout) :: d2lo(2,3,mpert,3,mpert) !vz_i
    2642              : 
    2643              : !Local variables ----------------------------------
    2644              : !scalars
    2645              :  integer :: ialpha,iband,icg,icg1,idir,ikpt,ikpt1,jband,mpw_tmp,npw_k1
    2646              :  integer :: npw_k2,pwmax,pwmin
    2647              :  integer :: me_band,ierr, iband_me, jband_me
    2648              :  real(dp) :: doti,dotr,e0,fac
    2649              : !arrays
    2650            6 :  integer,allocatable :: pwind_tmp(:)
    2651           12 :  integer :: band_procs(mband)
    2652              :  real(dp) :: edir(3)
    2653            6 :  real(dp),allocatable :: s1mat(:,:,:),vect1(:,:),vect2(:,:)
    2654              : 
    2655              : ! *************************************************************************
    2656              : 
    2657              : !calculate s1 matrices -----------------------------
    2658            6 :  mpw_tmp=max(mpw,mpw1)
    2659           24 :  ABI_MALLOC(s1mat,(2,dtefield%mband_occ,dtefield%mband_occ))
    2660           18 :  ABI_MALLOC(vect1,(2,0:mpw_tmp))
    2661           12 :  ABI_MALLOC(vect2,(2,0:mpw_tmp))
    2662           18 :  ABI_MALLOC(pwind_tmp,(mpw_tmp))
    2663           36 :  vect1(:,0) = zero ; vect2(:,0) = zero
    2664              : 
    2665            6 :  me_band = mpi_enreg%me_band
    2666              : 
    2667            6 :  edir(:)=zero
    2668              : 
    2669              : !TODO MJV: where is the loop over sppol? proc_distrb_band_procs chooses isppol 1 below
    2670           54 :  do ikpt=1,nkpt
    2671              :    call proc_distrb_band(band_procs,mpi_enreg%proc_distrb,ikpt,1,mband,&
    2672           48 : &       me_band,mpi_enreg%me_kpt,mpi_enreg%comm_band)
    2673              : 
    2674          198 :    do idir=1,3
    2675              : 
    2676              : !    compute <u^(0)_{k_j}|u^(1)_{k_j+1,q}> matrix--- q=0 ----------------------------------------
    2677              : 
    2678              : !    prepare to calculate overlap matrix
    2679          144 :      ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
    2680          144 :      icg = dtefield%cgindex(ikpt,1)
    2681          144 :      icg1 = dtefield%cgindex(ikpt1,1+nsppol)
    2682          144 :      npw_k1 = npwarr(ikpt)
    2683          144 :      npw_k2 = npwar1(ikpt1)
    2684         6120 :      pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,7,idir)
    2685          720 :      vect1(:,0) = zero ; vect2(:,0) = zero
    2686          144 :      jband_me = 0
    2687         7632 :      s1mat = zero
    2688          720 :      do jband = 1, dtefield%mband_occ
    2689          576 :        if (band_procs(jband) == me_band) then
    2690          576 :          jband_me = jband_me + 1
    2691              :          vect2(:,1:npw_k2) = &
    2692        72288 : &          cg1(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
    2693              :        end if
    2694          576 :        call xmpi_bcast(vect2,band_procs(jband), mpi_enreg%comm_band,ierr)
    2695              : 
    2696              : ! now everyone has vect2 for present jband
    2697         3168 :        if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
    2698              : 
    2699              :        iband_me = 0
    2700         3600 :        do iband = 1, dtefield%mband_occ
    2701         2304 :          if (band_procs(iband) /= me_band) cycle
    2702         2304 :          iband_me = iband_me + 1
    2703              : 
    2704         2304 :          pwmin = (iband_me-1)*npw_k1*nspinor
    2705         2304 :          pwmax = pwmin + npw_k1*nspinor
    2706              :          vect1(:,1:npw_k1) = &
    2707       289152 : &         cg(:,icg + 1 + pwmin:icg + pwmax)
    2708        12672 :          if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
    2709              :          call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
    2710         2304 : &         vect1,vect2)
    2711         2304 :          s1mat(1,iband,jband) = dotr
    2712         2880 :          s1mat(2,iband,jband) = doti
    2713              :        end do    ! iband
    2714              :      end do    !jband
    2715              : !    for the moment s1mat is only filled for iband on current cpu
    2716              : 
    2717              : 
    2718              : !    compute <u^(1)_{k_j,q}|u^(0)_{k_j+1}> matrix-- q=0 -------------------------------------
    2719              : 
    2720              : !    prepare to calculate overlap matrix
    2721          144 :      ikpt1 = dtefield%ikpt_dk(ikpt,1,idir)
    2722          144 :      icg = dtefield%cgindex(ikpt,1+nsppol)
    2723          144 :      icg1 = dtefield%cgindex(ikpt1,1)
    2724          144 :      npw_k1 = npwar1(ikpt)
    2725          144 :      npw_k2 = npwarr(ikpt1)
    2726         6120 :      pwind_tmp(1:npw_k1) = pwindall((ikpt-1)*mpw_tmp+1:(ikpt-1)*mpw_tmp+npw_k1,5,idir)
    2727          720 :      vect1(:,0) = zero ; vect2(:,0) = zero
    2728              :      jband_me = 0
    2729          720 :      do jband = 1, dtefield%mband_occ
    2730          576 :        if (band_procs(jband) == me_band) then
    2731          576 :          jband_me = jband_me + 1
    2732              :          vect2(:,1:npw_k2) = &
    2733        72288 : &          cg(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
    2734              :        end if
    2735          576 :        call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
    2736              : 
    2737         3168 :        if (npw_k2 < mpw_tmp) vect2(:,npw_k2+1:mpw_tmp) = zero
    2738              :        iband_me = 0
    2739         3600 :        do iband = 1, dtefield%mband_occ
    2740         2304 :          if (band_procs(iband) /= me_band) cycle
    2741         2304 :          iband_me = iband_me + 1
    2742              : 
    2743         2304 :          pwmin = (iband_me-1)*npw_k1*nspinor
    2744         2304 :          pwmax = pwmin + npw_k1*nspinor
    2745              :          vect1(:,1:npw_k1) = &
    2746       289152 : &          cg1(:,icg + 1 + pwmin:icg + pwmax)
    2747        12672 :          if (npw_k1 < mpw_tmp) vect1(:,npw_k1+1:mpw_tmp) = zero
    2748              :          call overlap_g(doti,dotr,mpw_tmp,npw_k1,npw_k2,nspinor,pwind_tmp,&
    2749         2304 : &          vect1,vect2)
    2750              : 
    2751         2304 :          s1mat(1,iband,jband) = s1mat(1,iband,jband) + dotr
    2752         2880 :          s1mat(2,iband,jband) = s1mat(2,iband,jband) + doti
    2753              :        end do    ! iband
    2754              :      end do    !jband
    2755              : 
    2756              : ! recompose full s1mat on each proc
    2757          144 :      call xmpi_sum(s1mat,mpi_enreg%comm_band,ierr)
    2758              : 
    2759              : !    sum over the whole------------------------------------------------------------
    2760              : 
    2761          144 :      e0=zero
    2762              : 
    2763          720 :      do iband=1,dtefield%mband_occ
    2764         3024 :        do jband=1,dtefield%mband_occ
    2765              :          e0 = e0 + (s1mat(1,iband,jband)*qmat(2,jband,iband,ikpt,1,idir)&
    2766         2880 : &         +    s1mat(2,iband,jband)*qmat(1,jband,iband,ikpt,1,idir))
    2767              :        end do
    2768              :      end do
    2769              : 
    2770          768 :      do ialpha=1,3
    2771              :        fac = rprimd(ialpha,idir)/&
    2772          432 : &       (dble(dtefield%nstr(idir))*pi)
    2773              : 
    2774          576 :        edir(ialpha)=edir(ialpha)+ e0*fac
    2775              :      end do
    2776              : 
    2777              :    end do ! idir
    2778              :  end do ! ikpt
    2779              : 
    2780           24 :  d2lo(1,1:3,natom+2,idirpert,ipert)=edir(:)
    2781              : 
    2782            6 :  ABI_FREE(s1mat)
    2783            6 :  ABI_FREE(vect1)
    2784            6 :  ABI_FREE(vect2)
    2785            6 :  ABI_FREE(pwind_tmp)
    2786              : 
    2787            6 : end subroutine dfptff_bec
    2788              : !!***
    2789              : 
    2790              : !!****f* ABINIT/qmatrix
    2791              : !! NAME
    2792              : !! qmatrix
    2793              : !!
    2794              : !! FUNCTION
    2795              : !! calculation of the inverse of the overlap matrix
    2796              : !!
    2797              : !! INPUTS
    2798              : !! cg(2,mpw*nspinor*mband_mem*mkmem_rbz*nsppol) = planewave coefficients of wavefunctions
    2799              : !! RF wavefunctions at k,q.
    2800              : !! dtefield = variables related to response Berry-phase calculation
    2801              : !! ikpt = the index of the current k point
    2802              : !! mband =  maximum number of bands
    2803              : !! mband_mem =  maximum number of bands on this cpu
    2804              : !! mkmem_rbz = maximum number of k-points in core memory
    2805              : !! mpw = maximum number of plane waves
    2806              : !! mpw1 = maximum number of plane waves for response wavefunctions
    2807              : !! nkpt = number of k points
    2808              : !! npwarr(nkpt) = number of planewaves in basis and boundary at this k point
    2809              : !! npwar1(nkpt) = number of planewaves in basis and boundary for response wfs
    2810              : !! nspinor = 1 for scalar wfs, 2 for spinor wfs
    2811              : !! nsppol = 1 for unpolarized, 2 for spin-polarized
    2812              : !! pwindall(max(mpw,mpw1)*mkmem_rbz,8,3) = array used to compute the overlap matrices
    2813              : !!
    2814              : !! OUTPUT
    2815              : !! qmat(2,dtefield%nband_occ,dtefield%nband_occ,nkpt,2,3) = inverse of the overlap matrix
    2816              : !!
    2817              : !! SOURCE
    2818              : 
    2819            9 : subroutine qmatrix(cg,dtefield,qmat,mpi_enreg,mpw,mpw1,mkmem_rbz,mband,mband_mem,npwarr,nkpt,nspinor,nsppol,pwindall)
    2820              : 
    2821              :  use m_hide_lapack, only : dzgedi, dzgefa
    2822              : 
    2823              : !Arguments ----------------------------------------
    2824              : !scalars
    2825              :  integer,intent(in) :: mband,mkmem_rbz,mpw,mpw1,nkpt,nspinor,nsppol
    2826              :  integer,intent(in) :: mband_mem
    2827              :  type(efield_type),intent(in) :: dtefield
    2828              :  type(MPI_type),intent(in) :: mpi_enreg
    2829              : !arrays
    2830              :  integer,intent(in) :: npwarr(nkpt),pwindall(max(mpw,mpw1)*mkmem_rbz,8,3)
    2831              :  real(dp),intent(in) :: cg(2,mpw*nspinor*mband_mem*mkmem_rbz*nsppol)
    2832              :  real(dp),intent(out) :: qmat(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3)
    2833              : 
    2834              : !Local variables -------------------------
    2835              : !scalars
    2836              :  integer :: iband,icg,icg1,idir,ifor,ikpt,ikpt2,info,jband,job
    2837              :  integer :: iband_me, jband_me, me_band, ierr
    2838              :  integer :: npw_k1,npw_k2,pwmax,pwmin
    2839              :  integer :: isppol
    2840              :  real(dp) :: doti,dotr
    2841              : !arrays
    2842            9 :  integer,allocatable :: ipvt(:),pwind_k(:)
    2843              :  real(dp) :: det(2,2)
    2844           18 :  integer :: band_procs(mband)
    2845            9 :  real(dp),allocatable :: sinv(:,:,:),smat_k(:,:,:),vect1(:,:),vect2(:,:)
    2846            9 :  real(dp),allocatable :: zgwork(:,:)
    2847              : 
    2848              : ! *************************************************************************
    2849              : 
    2850           27 :  ABI_MALLOC(ipvt,(dtefield%mband_occ))
    2851           36 :  ABI_MALLOC(sinv,(2,dtefield%mband_occ,dtefield%mband_occ))
    2852           27 :  ABI_MALLOC(zgwork,(2,dtefield%mband_occ))
    2853           27 :  ABI_MALLOC(vect1,(2,0:mpw))
    2854           18 :  ABI_MALLOC(vect2,(2,0:mpw))
    2855           27 :  ABI_MALLOC(smat_k,(2,dtefield%mband_occ,dtefield%mband_occ))
    2856           27 :  ABI_MALLOC(pwind_k,(max(mpw,mpw1)))
    2857           54 :  vect1(:,0) = zero ; vect2(:,0) = zero
    2858              : 
    2859            9 :  job = 11
    2860              : 
    2861            9 :  me_band = mpi_enreg%me_band
    2862              : 
    2863              : !loop over k points
    2864           18 :  do isppol = 1, nsppol
    2865           90 :    do ikpt = 1, nkpt
    2866           72 :      call proc_distrb_band(band_procs,mpi_enreg%proc_distrb,ikpt,isppol,mband,me_band,mpi_enreg%me_kpt,mpi_enreg%comm_band)
    2867              : 
    2868           72 :      npw_k1 = npwarr(ikpt)
    2869           72 :      icg  = dtefield%cgindex(ikpt,1)
    2870          297 :      do idir = 1, 3
    2871          720 :        do ifor = 1, 2
    2872              : 
    2873          432 :          ikpt2 = dtefield%ikpt_dk(ikpt,ifor,idir)
    2874          432 :          npw_k2 = npwarr(ikpt2)
    2875          432 :          icg1 = dtefield%cgindex(ikpt2,1)
    2876        18360 :          pwind_k(1:npw_k1) = pwindall((ikpt-1)*max(mpw,mpw1)+1:(ikpt-1)*max(mpw,mpw1)+npw_k1,ifor,idir)
    2877              : 
    2878        22896 :          smat_k = zero
    2879          432 :          jband_me = 0
    2880         2160 :          do jband = 1, dtefield%nband_occ(isppol)
    2881         1728 :            if (band_procs(jband) == me_band) then
    2882         1728 :              jband_me = jband_me + 1
    2883       216864 :              vect2(:,1:npw_k2) = cg(:,icg1 + 1 + (jband_me-1)*npw_k2*nspinor:icg1 + jband_me*npw_k2*nspinor)
    2884              :            end if
    2885         1728 :            call xmpi_bcast(vect2,band_procs(jband),mpi_enreg%comm_band,ierr)
    2886              : 
    2887         9504 :            if (npw_k2 < mpw) vect2(:,npw_k2+1:mpw) = zero
    2888              : 
    2889         1728 :            iband_me = 0
    2890        10800 :            do iband = 1, dtefield%nband_occ(isppol)
    2891         6912 :              if (band_procs(iband) /= me_band) cycle
    2892         6912 :              iband_me = iband_me + 1
    2893              : 
    2894         6912 :              pwmin = (iband_me-1)*npw_k1*nspinor
    2895         6912 :              pwmax = pwmin + npw_k1*nspinor
    2896       867456 :              vect1(:,1:npw_k1) = cg(:,icg + 1 + pwmin:icg + pwmax)
    2897        38016 :              if (npw_k1 < mpw) vect1(:,npw_k1+1:mpw) = zero
    2898         6912 :              call overlap_g(doti,dotr,mpw,npw_k1,npw_k2,nspinor,pwind_k,vect1,vect2)
    2899         6912 :              smat_k(1,iband,jband) = dotr
    2900         8640 :              smat_k(2,iband,jband) = doti
    2901              :            end do    ! iband
    2902              :          end do    !jband
    2903              : 
    2904              : ! recompose full s1mat on each proc
    2905          432 :          call xmpi_sum(smat_k,mpi_enreg%comm_band,ierr)
    2906              : 
    2907        22896 :          sinv(:,:,:) = smat_k(:,:,:)
    2908              : 
    2909          432 :          call dzgefa(sinv,dtefield%mband_occ,dtefield%nband_occ(isppol),ipvt,info)
    2910          432 :          call dzgedi(sinv,dtefield%mband_occ,dtefield%nband_occ(isppol),ipvt,det,zgwork,job)
    2911              : 
    2912        23544 :          qmat(:,:,:,ikpt,ifor,idir) = sinv(:,:,:)
    2913              :        end do
    2914              :      end do
    2915              :    end do  !end loop over k
    2916              :  end do
    2917              : 
    2918            9 :  ABI_FREE(ipvt)
    2919            9 :  ABI_FREE(sinv)
    2920            9 :  ABI_FREE(zgwork)
    2921            9 :  ABI_FREE(vect1)
    2922            9 :  ABI_FREE(vect2)
    2923            9 :  ABI_FREE(smat_k)
    2924            9 :  ABI_FREE(pwind_k)
    2925              : 
    2926            9 : end subroutine qmatrix
    2927              : !!***
    2928              : 
    2929              : end module m_dfpt_fef
    2930              : !!***
        

Generated by: LCOV version 2.3-1