LCOV - code coverage report
Current view: top level - src/72_response - m_dfpttd_berrycurv.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 95.1 % 41 39
Test Date: 2026-11-10 16:57:26 Functions: 100.0 % 1 1
Branches: 66.1 % 62 41

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_dfpttd_berrycurv
       2                 :             : !! NAME
       3                 :             : !!  m_dfpttd_berrycurv
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !!  FIXME: add description.
       7                 :             : !!
       8                 :             : !! COPYRIGHT
       9                 :             : !!  Copyright (C) 2023 ABINIT group (FIXME: add author)
      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                 :             : !! NOTES
      15                 :             : !!
      16                 :             : !! PARENTS
      17                 :             : !!
      18                 :             : !! CHILDREN
      19                 :             : !!
      20                 :             : !! SOURCE
      21                 :             : 
      22                 :             : #if defined HAVE_CONFIG_H
      23                 :             : #include "config.h"
      24                 :             : #endif
      25                 :             : 
      26                 :             : #include "abi_common.h"
      27                 :             : 
      28                 :             : module m_dfpttd_berrycurv
      29                 :             : 
      30                 :             :  use defs_basis
      31                 :             :  use defs_abitypes
      32                 :             :  use defs_datatypes
      33                 :             :  use m_dtset
      34                 :             :  use m_dtfil
      35                 :             :  use m_errors
      36                 :             :  use m_profiling_abi
      37                 :             :  use m_xmpi
      38                 :             :  use m_mpinfo,     only : proc_distrb_cycle
      39                 :             :  use m_cgtools,    only : dotprod_g
      40                 :             : 
      41                 :             :  implicit none
      42                 :             : 
      43                 :             :  public :: dfpttd_berrycurv
      44                 :             : 
      45                 :             :  private
      46                 :             : 
      47                 :             : ! *************************************************************************
      48                 :             : 
      49                 :             : contains
      50                 :             : !!***
      51                 :             : 
      52                 :             : !!****f* ABINIT/m_dfpttd_berrycurv/dfpttd_berrycurv
      53                 :             : !! NAME
      54                 :             : !!  dfpttd_berrycurv
      55                 :             : !!
      56                 :             : !! FUNCTION
      57                 :             : !! Compute first-order response function contributions to the time-dispersion
      58                 :             : !! 3rd order energy derivatives of the dispersion driver.
      59                 :             : !! The main inputs are :
      60                 :             : !!   - 1st-order WFs for two perturbations i1pert/i1dir,i2pert/i2dir (cg1,cg2)
      61                 :             : !!
      62                 :             : !! INPUTS
      63                 :             : !!  cg1 = first derivative of cg with respect the perturbation i1pert
      64                 :             : !!  cg2 = first derivative of cg with respect the perturbation i2pert
      65                 :             : !!  cplex= if 1, real space 1-order functions on FFT grid are REAL,
      66                 :             : !!          if 2, COMPLEX
      67                 :             : !!  dtset <type(dataset_type)>=all input variables for this dataset
      68                 :             : !!  gsqcut=large sphere cut-off
      69                 :             : !!  mband = maximum number of bands
      70                 :             : !!  mk1mem = maximum number of k points for first-order WF
      71                 :             : !!           which can fit in core memory
      72                 :             : !!  mpert =maximum number of ipert
      73                 :             : !!  mpi_enreg=MPI-parallelisation information
      74                 :             : !!  mpw   = maximum number of planewaves in basis sphere (large number)
      75                 :             : !!  natom = number of atoms in unit cell
      76                 :             : !!  nfft= number of FFT grid points (for this proc)
      77                 :             : !!  ngfft(1:18)=integer array with FFT box dimensions and other
      78                 :             : !!  nkpt = number of k points
      79                 :             : !!  nspden = number of spin-density components
      80                 :             : !!  nspinor = number of spinorial components of the wavefunctions
      81                 :             : !!  nsppol = number of channels for spin-polarization (1 or 2)
      82                 :             : !!  npwarr(nkpt) = array holding npw for each k point
      83                 :             : !!  occ(mband*nkpt*nsppol) = occupation number for each band and k
      84                 :             : !!  ucvol=volume of the unit cell
      85                 :             : !!
      86                 :             : !! OUTPUT
      87                 :             : !!  d3etot(2,3,mpert,3,mpert,3,mpert) = third derivatives of the energy tensor
      88                 :             : !!
      89                 :             : !! SIDE EFFECTS
      90                 :             : !!
      91                 :             : !! NOTES
      92                 :             : !!
      93                 :             : !! PARENTS
      94                 :             : !!
      95                 :             : !! CHILDREN
      96                 :             : !!
      97                 :             : !! SOURCE
      98                 :             : 
      99                 :          26 : subroutine dfpttd_berrycurv(cg1,cg2,d3etot_td,dtset,&
     100                 :             :  & mband,mk1mem,mpi_enreg,mpw,nkpt,nspinor,nsppol, &
     101                 :          26 :  & npwarr,occ)
     102                 :             : 
     103                 :             :  use defs_basis
     104                 :             : 
     105                 :             :  implicit none
     106                 :             : 
     107                 :             : !Arguments ------------------------------------
     108                 :             : !scalars
     109                 :             :  integer, intent(in) :: mband,mk1mem,mpw
     110                 :             :  integer, intent(in) :: nkpt,nspinor,nsppol
     111                 :             :  type(dataset_type),intent(in) :: dtset
     112                 :             :  type(MPI_type),intent(inout) :: mpi_enreg
     113                 :             : 
     114                 :             : !arrays
     115                 :             :  integer,intent(in) ::  npwarr(nkpt)
     116                 :             :  real(dp),intent(in) :: cg1(2,mpw*nspinor*mband*mk1mem*nsppol)
     117                 :             :  real(dp),intent(in) :: cg2(2,mpw*nspinor*mband*mk1mem*nsppol)
     118                 :             :  real(dp),intent(out) :: d3etot_td(2)
     119                 :             :  real(dp),intent(in) :: occ(mband*nkpt*nsppol)
     120                 :             : 
     121                 :             : !Local variables-------------------------------
     122                 :             : !scalars
     123                 :             :  integer :: bandtot,iband,icg,ierr,ikpt,isppol,istwf_k,me
     124                 :             :  integer :: nband_k,npw_k,offset_cgi,size_wf,spaceworld
     125                 :             :  real(dp) :: doti,dotr,wtk_k
     126                 :             : !arrays
     127                 :             :  real(dp) :: d3etot_k(2)
     128                 :          26 :  real(dp),allocatable :: cwavef1(:,:),cwavef2(:,:)
     129                 :          26 :  real(dp),allocatable :: occ_k(:)
     130                 :             : 
     131                 :             : ! *************************************************************************
     132                 :             : 
     133                 :             :  DBG_ENTER("COLL")
     134                 :             : 
     135                 :             : !Init parallelism
     136                 :          26 :  spaceworld=mpi_enreg%comm_cell
     137                 :          26 :  me=mpi_enreg%me_kpt
     138                 :             : 
     139                 :             : !Loop over spins
     140                 :          26 :  d3etot_td=zero
     141                 :          26 :  bandtot = 0
     142                 :          26 :  icg=0
     143         [ +  + ]:          52 :  do isppol = 1, nsppol
     144                 :             : 
     145                 :             : !  Loop over k-points
     146         [ +  + ]:         364 :    do ikpt = 1, nkpt
     147                 :             : 
     148                 :         312 :      nband_k = dtset%nband(ikpt+(isppol-1)*nkpt)
     149                 :         312 :      npw_k = npwarr(ikpt)
     150                 :         312 :      istwf_k = dtset%istwfk(ikpt)
     151                 :             : 
     152         [ -  + ]:         312 :      if (proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,1,mband,isppol,mpi_enreg%me)) then
     153                 :           0 :        bandtot = bandtot + nband_k
     154                 :           0 :        cycle ! Skip the rest of the k-point loop
     155                 :             :      end if
     156                 :             : 
     157   [ -  +  +  -  :         936 :      ABI_MALLOC(occ_k,(nband_k))
          +  -  +  -  -  
                +  -  + ]
     158         [ +  + ]:       13416 :      occ_k(:) = occ(1+bandtot:nband_k+bandtot)
     159                 :         312 :      wtk_k    = dtset%wtk(ikpt)
     160                 :             : 
     161                 :         312 :      d3etot_k=zero
     162                 :         312 :      size_wf= dtset%nspinor*npw_k
     163   [ -  +  +  -  :         936 :      ABI_MALLOC(cwavef1,(2,size_wf))
          +  -  +  -  -  
                +  -  + ]
     164   [ -  +  +  -  :         624 :      ABI_MALLOC(cwavef2,(2,size_wf))
             -  +  -  + ]
     165                 :             : 
     166                 :             :      !Loop over bands
     167         [ +  + ]:       13416 :      do iband=1,nband_k
     168                 :             : 
     169         [ -  + ]:       13104 :        if(mpi_enreg%proc_distrb(ikpt,iband,isppol) /= mpi_enreg%me_kpt) cycle
     170                 :             : 
     171                 :             :        !Select bks wf1
     172                 :       13104 :        offset_cgi = (iband-1)*size_wf+icg
     173   [ +  +  +  + ]:    10286640 :        cwavef1(:,:)= cg1(:,1+offset_cgi:size_wf+offset_cgi)
     174   [ +  +  +  + ]:    10286640 :        cwavef2(:,:)= cg2(:,1+offset_cgi:size_wf+offset_cgi)
     175                 :             : 
     176                 :             :        !Compute the Berry curvature
     177                 :             :        !< u_{i,k}^{\lambda1} | u_{i,k}^{\lambda2} >
     178                 :             :        call dotprod_g(dotr,doti,istwf_k,size_wf,2,cwavef1,cwavef2,&
     179                 :       13104 :       & mpi_enreg%me_g0,mpi_enreg%comm_spinorfft)
     180                 :             : 
     181                 :       13104 :        d3etot_k(1)=d3etot_k(1)+occ_k(iband)*dotr
     182                 :       13416 :        d3etot_k(2)=d3etot_k(2)+occ_k(iband)*doti
     183                 :             : 
     184                 :             :      end do !iband
     185                 :             : 
     186                 :             : !    Scale d3etot_k contributions by the kpt weight
     187         [ +  + ]:         936 :      d3etot_k(:)=d3etot_k(:)*wtk_k
     188                 :             : 
     189                 :             : !    Add the contribution from each k-point.
     190         [ +  + ]:         936 :      d3etot_td= d3etot_td + d3etot_k
     191                 :             : 
     192                 :             : !    Keep track of total number of bands
     193                 :         312 :      bandtot = bandtot + nband_k
     194                 :             : 
     195                 :             : !    Shift arrays memory
     196                 :         312 :      icg=icg+npw_k*dtset%nspinor*nband_k
     197                 :             : 
     198                 :             : !    Deallocations
     199         [ -  + ]:         312 :      ABI_FREE(cwavef1)
     200         [ -  + ]:         312 :      ABI_FREE(cwavef2)
     201         [ -  + ]:         338 :      ABI_FREE(occ_k)
     202                 :             : 
     203                 :             :    end do !ikpt
     204                 :             : 
     205                 :             :  end do !isppol
     206                 :             : 
     207                 :             : !=== MPI communications ==================
     208                 :             :  if (xmpi_paral==1) then
     209                 :          26 :    call xmpi_sum(d3etot_td,spaceworld,ierr)
     210                 :             :  end if
     211                 :             : 
     212                 :             :  DBG_EXIT("COLL")
     213                 :             : 
     214                 :          26 : end subroutine dfpttd_berrycurv
     215                 :             : !!***
     216                 :             : 
     217                 :             : end module m_dfpttd_berrycurv
     218                 :             : !!***
        

Generated by: LCOV version 2.3-1