LCOV - code coverage report
Current view: top level - src/95_drive - m_dfptlw_loop.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 94.4 % 538 508
Test Date: 2026-11-09 20:57:54 Functions: 100.0 % 3 3
Branches: 51.9 % 2650 1376

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_dfptlw_loop
       2                 :             : !! NAME
       3                 :             : !!  m_dfptlw_loop
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !!
       7                 :             : !! COPYRIGHT
       8                 :             : !!  Copyright (C) 2022-2026 ABINIT group (MR)
       9                 :             : !!  This file is distributed under the terms of the
      10                 :             : !!  GNU General Public License, see ~abinit/COPYING
      11                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
      12                 :             : !!
      13                 :             : !! SOURCE
      14                 :             : 
      15                 :             : #if defined HAVE_CONFIG_H
      16                 :             : #include "config.h"
      17                 :             : #endif
      18                 :             : 
      19                 :             : #include "abi_common.h"
      20                 :             : 
      21                 :             : module m_dfptlw_loop
      22                 :             : 
      23                 :             :  use defs_basis
      24                 :             :  use defs_wvltypes
      25                 :             :  use m_errors
      26                 :             :  use m_abicore
      27                 :             :  use m_hdr
      28                 :             :  use m_nctk
      29                 :             :  use m_wffile
      30                 :             :  use m_wfk
      31                 :             :  use m_dtset
      32                 :             :  use m_dtfil
      33                 :             : 
      34                 :             :  use defs_datatypes, only : pseudopotential_type
      35                 :             :  use defs_abitypes, only : MPI_type
      36                 :             :  use m_time,        only : timab
      37                 :             :  use m_io_tools,    only : file_exists,iomode_from_fname,get_unit
      38                 :             :  use m_kg,          only : getmpw,kpgio
      39                 :             :  use m_inwffil,     only : inwffil
      40                 :             :  use m_fft,         only : fourdp
      41                 :             :  use m_ioarr,       only : read_rhor
      42                 :             :  use m_hamiltonian, only : gs_hamiltonian_type
      43                 :             :  use m_pawdij,      only : pawdij, pawdijfr, symdij
      44                 :             :  use m_pawfgr,      only : pawfgr_type
      45                 :             :  use m_pawfgrtab,   only : pawfgrtab_type
      46                 :             :  use m_paw_an,      only : paw_an_type, paw_an_init, paw_an_free, paw_an_nullify, paw_an_reset_flags
      47                 :             :  use m_paw_ij,      only : paw_ij_type, paw_ij_init, paw_ij_free, paw_ij_nullify, paw_ij_reset_flags, paw_ij_print
      48                 :             :  use m_pawang,      only : pawang_type
      49                 :             :  use m_pawrad,      only : pawrad_type
      50                 :             :  use m_pawrhoij,    only : pawrhoij_type, pawrhoij_alloc, pawrhoij_free, pawrhoij_nullify, &
      51                 :             : &                          pawrhoij_io, pawrhoij_inquire_dim
      52                 :             :  use m_paw_nhat,    only : pawmknhat,pawnhatfr
      53                 :             :  use m_paw_denpot,  only : pawdenpot
      54                 :             :  use m_pawtab,      only : pawtab_type
      55                 :             :  use m_rf2,         only : rf2_getidir
      56                 :             :  use m_initylmg,    only : initylmg
      57                 :             :  use m_atm2fft,     only : dfpt_atm2fft
      58                 :             :  use m_dfpt_mkvxc,  only : dfpt_mkvxc, dfpt_mkvxcccdq
      59                 :             :  use m_dfpt_rhotov, only : dfpt_rhotov
      60                 :             :  use m_mkcore,      only : dfpt_mkcore
      61                 :             :  use m_mklocl,      only : dfpt_vlocal, vlocalstr,dfpt_vlocaldq,dfpt_vlocaldqdq,dfpt_vmetdqdq
      62                 :             :  use m_dfptlw_pert, only : dfptlw_pert
      63                 :             :  use m_dfpttd_berrycurv, only : dfpttd_berrycurv
      64                 :             :  use m_dynmat,      only : cart39
      65                 :             :   use m_ebands  ,      only : ebands_t
      66                 :             :  use m_xmpi
      67                 :             : 
      68                 :             :  implicit none
      69                 :             : 
      70                 :             :  private
      71                 :             : !!***
      72                 :             : 
      73                 :             :  public :: dfptlw_loop
      74                 :             : !!***
      75                 :             : ! *************************************************************************
      76                 :             : 
      77                 :             : contains
      78                 :             : !!***
      79                 :             : 
      80                 :             : !!****f* ABINIT/m_dfptlw_loop/dfptlw_loop
      81                 :             : !! NAME
      82                 :             : !! dfptlw_loop
      83                 :             : !!
      84                 :             : !! FUNCTION
      85                 :             : !!  Loop over two perturbations j1, j2 and a q gradient
      86                 :             : !!
      87                 :             : !! INPUTS
      88                 :             : !!  atindx(natom)=index table for atoms (see gstate.f)
      89                 :             : !!  cg(2,mpw*nspinor*mband*mkmem*nsppol) = array for planewave coefficients of wavefunctions
      90                 :             : !!  codvsn=code version
      91                 :             : !!  d3e_pert1(mpert)=array with the i1pert cases to calculate
      92                 :             : !!  d3e_pert2(mpert)=array with the i2pert cases to calculate
      93                 :             : !!  dimffnl= third dimension of ffnl
      94                 :             : !!  dtfil <type(datafiles_type)>=variables related to files
      95                 :             : !!  dtset <type(dataset_type)>=all input variables for this dataset
      96                 :             : !!  ffnl(dtset%mkmem,dtset%mpw,dimffnl,psps%lmnmax,psps%ntypat)= Nonlocal projectors and their derivatives
      97                 :             : !!  gmet(3,3)=reciprocal space metric tensor in bohr**-2
      98                 :             : !!  gprimd(3,3)=dimensional primitive translations for reciprocal space(bohr^-1)
      99                 :             : !!  kg(3,mpw*mkmem)=reduced planewave coordinates
     100                 :             : !!  kxc(nfftf,nkxc)=exchange-correlation kernel
     101                 :             : !!  just_timdisp= it .true. this is a calculation of time-dispersion only
     102                 :             : !!  mband = maximum number of bands
     103                 :             : !!  mgfft = maximum single fft dimension
     104                 :             : !!  mkmem = Number of k points treated by this node.
     105                 :             : !!  mk1mem = Number of k points for first-order WF treated by this node.
     106                 :             : !!  mpert =maximum number of ipert
     107                 :             : !!  mpi_enreg=MPI-parallelisation information
     108                 :             : !!  mpw   = maximum number of planewaves in basis sphere (large number)
     109                 :             : !!  natom = number of atoms in unit cell
     110                 :             : !!  nattyp(ntypat)= # atoms of each type.
     111                 :             : !!  ncorespl(mqgrid_vl,2,ntypat)= spl interpolation of the pseudo core density for all atom types
     112                 :             : !!  nfftf=(effective) number of FFT grid points (for this proc) for the "fine" grid (see NOTES in respfn.F90)
     113                 :             : !!  ngfftf(1:18)=integer array with FFT box dimensions and other for the "fine" grid (see NOTES in respfn.F90)
     114                 :             : !!  nkpt  = number of k points
     115                 :             : !!  nkxc=second dimension of the array kxc, see rhotoxc.f for a description
     116                 :             : !!  nspinor = number of spinorial components of the wavefunctions
     117                 :             : !!  nsppol = number of channels for spin-polarization (1 or 2)
     118                 :             : !!  npwarr(nkpt) = array holding npw for each k point
     119                 :             : !!  nylmgr=second dimension of ylmgr_k
     120                 :             : !!  occ(mband*nkpt*nsppol) = occupation number for each band and k
     121                 :             : !!  pawfgr <type(pawfgr_type)>=fine grid parameters and related data
     122                 :             : !!  pawtab(ntypat*usepaw) <type(pawtab_type)>=paw tabulated starting data
     123                 :             : !!  psps <type(pseudopotential_type)> = variables related to pseudopotentials
     124                 :             : !!  rfpert(3,mpert,3,mpert,3,mpert) = array defining the type of perturbations
     125                 :             : !!       that have to be computed
     126                 :             : !!       1   ->   element has to be computed explicitely
     127                 :             : !!      -1   ->   use symmetry operations to obtain the corresponding element
     128                 :             : !!  rhog(2,nfftf)=array for Fourier transform of GS electron density
     129                 :             : !!  rhor(nfftf,nspden)=array for GS electron density in electrons/bohr**3.
     130                 :             : !!  rmet(3,3)=real space metric tensor in bohr**2
     131                 :             : !!  rprimd(3,3)=dimensional primitive translations (bohr)
     132                 :             : !!  ucvol = unit cell volume (bohr^3)
     133                 :             : !!  useylmgr= if 1 use the derivative of spherical harmonics
     134                 :             : !!  xred(3,natom) = reduced atomic coordinates
     135                 :             : !!  ylm(mpw*mkmem,psps%mpsang*psps%mpsang*psps%useylm)=real spherical harmonics
     136                 :             : !!  ylmgr(mpw*mkmem,nylmgr,psps%mpsang*psps%mpsang*psps%useylm*useylmgr)= k-gradients of real spherical harmonics
     137                 :             : !!
     138                 :             : !! OUTPUT
     139                 :             : !!  blkflg(3,mpert,3,mpert) = flags for each element of the 3DTE
     140                 :             : !!                             (=1 if computed)
     141                 :             : !!  d3etot(2,3,mpert,3,mpert,3,mpert) = third derivatives of the energy tensor
     142                 :             : !!
     143                 :             : !! SIDE EFFECTS
     144                 :             : !!  hdr <type(hdr_type)>=the header of wf, den and pot files
     145                 :             : !!
     146                 :             : !! SOURCE
     147                 :             : 
     148                 :          17 : subroutine dfptlw_loop(atindx,blkflg,cg,codvsn,d3e_pert1,d3e_pert2,d3etot,dimffnl,dtfil,dtset,&
     149                 :          17 : & ffnl,gmet,gprimd,gsqcut,&
     150                 :          17 : & hdr,just_timdisp,kg,kxc,mband,mgfft,mkmem,mk1mem,&
     151                 :          17 : & mpert,mpi_enreg,mpw,natom,nattyp,ncorespl,ngfftf,nfftf,nkpt,nkxc,nspinor,nsppol,&
     152                 :          17 : & npwarr,nylmgr,occ,&
     153                 :          17 : & pawfgr,pawtab,ph1d,&
     154                 :          17 : & psps,rfpert,rhog,rhor,rmet,rprimd,ucvol,useylmgr,xred,ylm,ylmgr)
     155                 :             : 
     156                 :             : 
     157                 :             : !Arguments ------------------------------------
     158                 :             : !scalars
     159                 :             :  integer,intent(in) :: dimffnl,mband,mgfft,mk1mem,mkmem,mpert,mpw,natom,nfftf
     160                 :             :  integer,intent(in) :: nkpt,nkxc,nspinor,nsppol,nylmgr,useylmgr
     161                 :             :  character(len=8),intent(in) :: codvsn
     162                 :             :  logical,intent(in) :: just_timdisp
     163                 :             :  real(dp),intent(in) :: gsqcut,ucvol
     164                 :             :  type(MPI_type),intent(inout) :: mpi_enreg
     165                 :             :  type(datafiles_type),intent(in) :: dtfil
     166                 :             :  type(dataset_type),intent(in) :: dtset
     167                 :             :  type(hdr_type),intent(inout) :: hdr
     168                 :             :  type(pawfgr_type),intent(in) :: pawfgr
     169                 :             :  type(pseudopotential_type),intent(in) :: psps
     170                 :             : 
     171                 :             : !arrays
     172                 :             :  integer,intent(in) :: atindx(natom),d3e_pert1(mpert),d3e_pert2(mpert)
     173                 :             :  integer,intent(in) :: kg(3,mk1mem*mpw)
     174                 :             :  integer,intent(in) :: nattyp(psps%ntypat),ngfftf(18),npwarr(nkpt)
     175                 :             :  integer,intent(in) :: rfpert(3,mpert,3,mpert,3,mpert)
     176                 :             :  integer,intent(inout) :: blkflg(3,mpert,3,mpert,3,mpert)
     177                 :             :  real(dp),intent(in) :: cg(2,mpw*nspinor*mband*mkmem*nsppol),gmet(3,3)
     178                 :             :  real(dp),intent(in) :: ffnl(mkmem,mpw,dimffnl,psps%lmnmax,psps%ntypat)
     179                 :             :  real(dp),intent(in) :: gprimd(3,3),kxc(nfftf,nkxc)
     180                 :             :  real(dp),intent(in) :: ncorespl(psps%mqgrid_vl,2,psps%ntypat)
     181                 :             :  real(dp),intent(in) :: ph1d(2,3*(2*mgfft+1)*natom)
     182                 :             :  real(dp),intent(in) :: rhog(2,nfftf),rhor(nfftf,dtset%nspden),rmet(3,3),rprimd(3,3)
     183                 :             :  real(dp),intent(in) :: xred(3,natom)
     184                 :             :  real(dp),intent(inout) :: occ(mband*nkpt*nsppol)
     185                 :             :  real(dp),intent(inout) :: d3etot(2,3,mpert,3,mpert,3,mpert)
     186                 :             :  real(dp),intent(in) :: ylm(mpw*mkmem,psps%mpsang*psps%mpsang*psps%useylm)
     187                 :             :  real(dp),intent(in) :: ylmgr(mpw*mkmem,nylmgr,psps%mpsang*psps%mpsang*psps%useylm*useylmgr)
     188                 :             :  type(pawtab_type),intent(inout) :: pawtab(psps%ntypat*psps%usepaw)
     189                 :             : 
     190                 :             : !Local variables-------------------------------
     191                 :             : !scalars
     192                 :             :  integer :: alpha,ask_accurate,bantot,beta,comm_cell,cplex
     193                 :             :  integer :: delta,dkdk_index,formeig,gamma
     194                 :             :  integer :: ia1,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert,idir_dkdk
     195                 :             :  integer :: idq,ierr,ii,ikpt,ireadwf,istr,itypat,mcg1,me,mpsang
     196                 :             :  integer :: mpw1, mpw1_mq
     197                 :             :  integer :: n1,n2,n3,ndir,n1dq,n2dq,nhat1grdim,nfftotf,nspden,n3xccc
     198                 :             :  integer :: optgeom,opthartdqdq,optorth,pawread
     199                 :             :  integer :: pert1case,pert2case,pert3case,timrev,usexcnhat
     200                 :             :  integer :: pert1case_mq,pert2case_mq
     201                 :             :  real(dp) :: delad,delag,delbd,delbg,ecut,ecut_eff
     202                 :             :  logical :: finite_q,kramers_deg,samepert
     203                 :             :  character(len=500) :: message
     204                 :             :  character(len=fnlen) :: fiden1i,fiwf1i,fiwf2i,fiwfddk,fiwfdkdk
     205                 :             :  character(len=fnlen) :: fiwf1i_mq,fiwf2i_mq
     206                 :          17 :  type(gs_hamiltonian_type) :: gs_hamkq
     207                 :             :  type(wffile_type) :: wff1,wff2,wfft1,wfft2
     208   [ +  +  +  +  :         187 :  type(wfk_t) :: ddk_f,d2_dkdk_f,d2_dkdk_f2
                   +  + ]
     209                 :          17 :  type(wvl_data) :: wvl
     210                 :          17 :  type(hdr_type) :: hdr_den
     211                 :          17 :  type(ebands_t) :: ebands_kq,ebands_kmq
     212                 :          17 :  type(hdr_type) :: hdr1_pq,hdr1_mq
     213                 :          17 :  type(hdr_type) :: hdr2_pq,hdr2_mq
     214                 :             : !arrays
     215                 :             :  integer,save :: idx(18)=(/1,1,2,2,3,3,3,2,3,1,2,1,2,3,1,3,1,2/)
     216                 :          17 :  integer,allocatable :: kg1(:,:),kg1_mq(:,:)
     217                 :          17 :  integer,allocatable :: npwar1(:),npwar1_mq(:),npwtot1(:),npwtot1_mq(:)
     218                 :             :  real(dp) :: d3etot_td(2),d3etot_td_mq(2)
     219                 :          17 :  real(dp),allocatable :: cg1(:,:),cg2(:,:)
     220                 :          17 :  real(dp),allocatable :: cg1_mq(:,:),cg2_mq(:,:)
     221                 :          17 :  real(dp),allocatable :: d3etot_t4(:,:),d3etot_t5(:,:),d3etot_tgeom(:,:),eigen1(:),eigen2(:)
     222                 :          17 :  real(dp),allocatable :: eigenq(:), doccde_tmp(:)
     223                 :          17 :  real(dp),allocatable :: eigen1_mq(:),eigen2_mq(:)
     224                 :          17 :  real(dp),allocatable :: kpq(:,:),kmq(:,:)
     225                 :          17 :  real(dp),allocatable :: nhat1(:,:)
     226                 :          17 :  real(dp),allocatable :: rho1g1(:,:),rho1r1(:,:)
     227                 :          17 :  real(dp),allocatable :: rho2g1(:,:),rho2r1(:,:)
     228                 :          17 :  real(dp),allocatable :: t4_typeI(:,:,:,:,:,:),t4_typeII(:,:,:,:,:,:,:)
     229                 :          17 :  real(dp),allocatable :: t5_typeI(:,:,:,:,:,:),t5_typeII(:,:,:,:,:,:,:)
     230                 :          17 :  real(dp),allocatable :: tgeom_typeI(:,:,:,:,:,:),tgeom_typeII(:,:,:,:,:,:,:)
     231                 :          17 :  real(dp),allocatable :: vhart1dqdq(:),vpsp1dqdq(:)
     232                 :          17 :  real(dp),allocatable :: vpsp1_i1pertdq(:,:,:),vpsp1_i2pertdq(:,:,:)
     233                 :          17 :  real(dp),allocatable :: vxccc1_i2pertdq(:,:,:)
     234                 :          17 :  real(dp),allocatable :: vpsp1_i1pertdq_geom(:,:,:), vpsp1_i1pertdqdq(:,:,:)
     235                 :          17 :  real(dp),allocatable :: vxc1dqdq(:),work(:)
     236                 :          17 :  real(dp),allocatable :: xccc3d2(:),xccc3d2dq(:)
     237                 :          17 :  type(pawrhoij_type),allocatable :: pawrhoij_read(:)
     238                 :             : 
     239                 :             : 
     240                 :             : ! *************************************************************************
     241                 :             : 
     242                 :             :  DBG_ENTER("COLL")
     243                 :             : 
     244                 :             : !Init parallelism
     245                 :          17 :  comm_cell=mpi_enreg%comm_cell
     246                 :          17 :  me=mpi_enreg%me_kpt
     247                 :             : 
     248                 :             : !Deactivate kramer's degeneracy for calculations that break TRS
     249                 :             : !(finite q in magnetic materials or finite omega)
     250                 :          17 :  kramers_deg=.true.
     251                 :          17 :  timrev = 1
     252         [ +  + ]:          17 :  if (dtset%tim1rev==0) then
     253                 :           2 :    kramers_deg=.false.
     254                 :           2 :    timrev = 0
     255                 :             :  end if
     256                 :             : 
     257                 :             : !Special treatment for timdisp calculations at finite q
     258                 :          17 :  finite_q=.false.
     259   [ +  +  +  + ]:          68 :  if (sum(dtset%qptn(:)**2)>tol8) finite_q=.true.
     260                 :             : 
     261                 :             : !Various initializations
     262                 :          17 :  cplex = 2 - timrev
     263                 :          17 :  nspden = dtset%nspden
     264                 :          17 :  ecut=dtset%ecut
     265                 :          17 :  ecut_eff = ecut*(dtset%dilatmx)**2
     266                 :          17 :  mpsang = psps%mpsang
     267         [ -  + ]:          17 :  optorth=1;if (psps%usepaw==1) optorth=0
     268                 :          17 :  opthartdqdq=1
     269                 :             : 
     270                 :             : !Set up some quantities required to calculate the Berry
     271                 :             : !curvature at finite q
     272   [ -  +  +  -  :          51 :  ABI_MALLOC(npwar1,(dtset%nkpt))
          +  -  +  -  -  
                +  -  + ]
     273   [ -  +  +  -  :          34 :  ABI_MALLOC(npwtot1,(dtset%nkpt))
             -  +  -  + ]
     274   [ -  +  +  -  :          51 :  ABI_MALLOC(kpq,(3,dtset%nkpt))
          +  -  +  -  -  
                +  -  + ]
     275         [ +  + ]:          17 :  if (.not.kramers_deg) then
     276   [ -  +  +  -  :           4 :    ABI_MALLOC(npwar1_mq,(dtset%nkpt))
             -  +  -  + ]
     277   [ -  +  +  -  :           4 :    ABI_MALLOC(npwtot1_mq,(dtset%nkpt))
             -  +  -  + ]
     278   [ -  +  +  -  :           4 :    ABI_MALLOC(kmq,(3,dtset%nkpt))
             -  +  -  + ]
     279                 :             :  end if
     280         [ +  + ]:          17 :  if (finite_q.or..not.kramers_deg) then
     281                 :             : 
     282                 :             :    !Initialize k+q (and k-q) array
     283         [ +  + ]:          26 :    do ikpt=1,dtset%nkpt
     284         [ +  + ]:          98 :      kpq(:,ikpt)=dtset%qptn(:)+dtset%kptns(:,ikpt)
     285                 :             :    end do
     286         [ +  - ]:           2 :    if (.not.kramers_deg) then
     287         [ +  + ]:          26 :      do ikpt=1,nkpt
     288         [ +  + ]:          98 :        kmq(:,ikpt)=-dtset%qptn(:)+dtset%kptns(:,ikpt)
     289                 :             :      end do
     290                 :             :    end if
     291                 :             : 
     292                 :             :    !Compute maximum number of planewaves at k+q (and k-q)
     293                 :           2 :    call getmpw(ecut_eff,dtset%exchn2n3d,gmet,dtset%istwfk,kpq,mpi_enreg,mpw1,dtset%nkpt)
     294         [ +  - ]:           2 :    if (.not.kramers_deg) then
     295                 :           2 :      call getmpw(ecut_eff,dtset%exchn2n3d,gmet,dtset%istwfk,kmq,mpi_enreg,mpw1_mq,dtset%nkpt)
     296                 :             :      !number of plane waves at k+q and k-q should be in principle the same to reconstruct rhor1_pq (?)
     297                 :           2 :      mpw1=max(mpw1,mpw1_mq)
     298                 :           2 :      mpw1_mq=mpw1
     299                 :             :    else
     300                 :           0 :      mpw1_mq=0
     301                 :             :    end if
     302                 :             : 
     303                 :             :    !Set up the basis sphere of planewaves at k+q (and k-q)
     304   [ -  +  +  -  :           6 :    ABI_MALLOC(kg1,(3,mpw1*mk1mem))
          +  -  +  -  -  
                +  -  + ]
     305                 :             :    call kpgio(ecut_eff,dtset%exchn2n3d,gmet,dtset%istwfk,kg1,&
     306                 :             :    &   kpq,mk1mem,dtset%nband,dtset%nkpt,'PERS',mpi_enreg,mpw1,&
     307                 :           2 :    &   npwar1,npwtot1,dtset%nsppol)
     308         [ +  - ]:           2 :    if (.not.kramers_deg) then
     309   [ -  +  +  -  :           6 :      ABI_MALLOC(kg1_mq,(3,mpw1_mq*mk1mem))
          +  -  +  -  -  
                +  -  + ]
     310                 :             :      call kpgio(ecut_eff,dtset%exchn2n3d,gmet,dtset%istwfk,kg1_mq,&
     311                 :             :    & kmq,mk1mem,dtset%nband,dtset%nkpt,'PERS',mpi_enreg,mpw1_mq,&
     312                 :           2 :    & npwar1_mq,npwtot1_mq,dtset%nsppol)
     313                 :             :    end if
     314                 :             : 
     315                 :             : !  Initialize band structure datatype at k+q
     316         [ +  + ]:          26 :    bantot=sum(dtset%nband(1:dtset%nkpt*dtset%nsppol))
     317   [ -  +  +  -  :           6 :    ABI_MALLOC(eigenq,(bantot))
          +  -  +  -  -  
                +  -  + ]
     318   [ -  +  +  -  :           6 :    ABI_MALLOC(doccde_tmp,(dtset%mband*dtset%nkpt*dtset%nsppol))
          +  -  +  -  -  
                +  -  + ]
     319         [ +  + ]:        1010 :    eigenq(:)=zero
     320                 :             :    call ebands_kq%init(bantot,dtset%nelect,dtset%ne_qFD,dtset%nh_qFD,dtset%ivalence,&
     321                 :             : &   doccde_tmp,eigenq,dtset%istwfk,kpq,dtset%nband,dtset%nkpt,npwar1,dtset%nsppol,&
     322                 :             : &   dtset%nspinor,dtset%tphysel,dtset%tsmear,dtset%occopt,occ,dtset%wtk,&
     323                 :             : &   dtset%cellcharge(1), dtset%kptopt, dtset%kptrlatt_orig, dtset%nshiftk_orig, dtset%shiftk_orig, &
     324                 :           2 : &   dtset%kptrlatt, dtset%nshiftk, dtset%shiftk)
     325         [ +  - ]:           2 :    if (.not.kramers_deg) then
     326         [ +  + ]:        1010 :      eigenq(:)=zero
     327                 :             :      call ebands_kmq%init(bantot,dtset%nelect,dtset%ne_qFD,dtset%nh_qFD,dtset%ivalence,&
     328                 :             : &     doccde_tmp,eigenq,dtset%istwfk,kmq,dtset%nband,dtset%nkpt,npwar1_mq,dtset%nsppol,&
     329                 :             : &     dtset%nspinor,dtset%tphysel,dtset%tsmear,dtset%occopt,occ,dtset%wtk,&
     330                 :             : &     dtset%cellcharge(1), dtset%kptopt, dtset%kptrlatt_orig, dtset%nshiftk_orig, dtset%shiftk_orig, &
     331                 :           2 : &     dtset%kptrlatt, dtset%nshiftk, dtset%shiftk)
     332                 :             :    end if
     333         [ -  + ]:           2 :    ABI_FREE(eigenq)
     334         [ -  + ]:           4 :    ABI_FREE(doccde_tmp)
     335                 :             : 
     336                 :             :  else
     337   [ -  +  +  -  :          45 :    ABI_MALLOC(kg1,(3,mpw*mk1mem))
          +  -  +  -  -  
                +  -  + ]
     338   [ +  -  -  +  :        4158 :    kpq=dtset%kptns(:,1:dtset%nkpt)
          -  -  +  +  +  
                      + ]
     339                 :          15 :    mpw1=mpw
     340   [ -  +  +  +  :      658542 :    kg1=kg
                   +  + ]
     341   [ +  -  -  +  :        1062 :    npwar1=npwarr
             -  -  +  + ]
     342                 :             :  end if
     343                 :          17 :  mcg1=mpw1*nspinor*mband*mk1mem*nsppol
     344                 :             : 
     345   [ -  +  +  -  :          51 :  ABI_MALLOC(cg1,(2,mcg1))
          +  -  +  -  -  
                +  -  + ]
     346   [ -  +  +  -  :          34 :  ABI_MALLOC(cg2,(2,mcg1))
             -  +  -  + ]
     347   [ +  -  -  +  :          51 :  ABI_MALLOC(eigen1,(2*dtset%mband*dtset%mband*dtset%nkpt*dtset%nsppol))
          +  -  +  -  +  
             -  -  +  -  
                      + ]
     348   [ -  +  +  -  :          34 :  ABI_MALLOC(eigen2,(2*dtset%mband*dtset%mband*dtset%nkpt*dtset%nsppol))
             -  +  -  + ]
     349         [ +  + ]:          17 :  if (.not.kramers_deg) then
     350   [ -  +  +  -  :           4 :    ABI_MALLOC(cg1_mq,(2,mcg1))
             -  +  -  + ]
     351   [ -  +  +  -  :           4 :    ABI_MALLOC(cg2_mq,(2,mcg1))
             -  +  -  + ]
     352   [ -  +  +  -  :           4 :    ABI_MALLOC(eigen1_mq,(2*dtset%mband*dtset%mband*dtset%nkpt*dtset%nsppol))
             -  +  -  + ]
     353   [ -  +  +  -  :           4 :    ABI_MALLOC(eigen2_mq,(2*dtset%mband*dtset%mband*dtset%nkpt*dtset%nsppol))
             -  +  -  + ]
     354                 :             :  end if
     355   [ -  +  +  -  :          68 :  ABI_MALLOC(rho1r1,(cplex*nfftf,dtset%nspden))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     356   [ -  +  +  -  :          51 :  ABI_MALLOC(rho2r1,(cplex*nfftf,dtset%nspden))
          -  +  +  -  -  
                +  -  + ]
     357   [ -  +  +  -  :          51 :  ABI_MALLOC(rho1g1,(2,nfftf))
          +  -  +  -  -  
                +  -  + ]
     358   [ -  +  +  -  :          34 :  ABI_MALLOC(rho2g1,(2,nfftf))
             -  +  -  + ]
     359                 :             : 
     360                 :          17 :  ask_accurate=1 ; formeig = 1 ; ireadwf = 1
     361                 :          17 :  n1=ngfftf(1) ; n2=ngfftf(2) ; n3=ngfftf(3)
     362                 :          17 :  nfftotf=n1*n2*n3
     363                 :             : 
     364                 :             : !Allocations for type-I terms
     365   [ -  +  +  -  :         119 :  ABI_MALLOC(t4_typeII,(2,3,mpert,3,mpert,3,mpert))
          +  -  -  +  +  
          -  +  -  -  +  
          +  -  +  -  +  
             -  -  +  -  
                      + ]
     366   [ +  +  +  +  :     6485593 :  t4_typeII(:,:,:,:,:,:,:)=zero
          +  +  +  +  +  
             +  +  +  +  
                      + ]
     367   [ +  +  -  + ]:          17 :  if (d3e_pert2(natom+3)==1.or.d3e_pert2(natom+4)==1) then
     368   [ -  +  +  -  :          15 :    ABI_MALLOC(t4_typeI,(2,3,mpert,3,3,3))
          +  -  +  -  +  
          -  +  -  -  +  
                   -  + ]
     369   [ +  +  +  +  :        8234 :    t4_typeI(:,:,:,:,:,:)=zero
          +  +  +  +  +  
                +  +  + ]
     370                 :             :  end if
     371   [ -  +  +  -  :          68 :  ABI_MALLOC(t5_typeII,(2,3,mpert,3,mpert,3,mpert))
          -  +  +  -  -  
          +  +  -  -  +  
                   -  + ]
     372   [ +  +  +  +  :     6485593 :  t5_typeII(:,:,:,:,:,:,:)=zero
          +  +  +  +  +  
             +  +  +  +  
                      + ]
     373   [ +  -  -  + ]:          17 :  if (d3e_pert1(natom+3)==1.or.d3e_pert1(natom+4)==1) then
     374   [ #  #  #  #  :           0 :    ABI_MALLOC(t5_typeI,(2,3,mpert,3,3,3))
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     375   [ -  -  -  -  :          17 :    t5_typeI(:,:,:,:,:,:)=zero
          -  -  -  -  -  
                -  -  - ]
     376                 :             :  end if
     377   [ -  +  +  -  :          68 :  ABI_MALLOC(tgeom_typeII,(2,3,mpert,3,mpert,3,mpert))
          -  +  +  -  -  
          +  +  -  -  +  
                   -  + ]
     378   [ +  +  +  +  :     6485593 :  tgeom_typeII(:,:,:,:,:,:,:)=zero
          +  +  +  +  +  
             +  +  +  +  
                      + ]
     379   [ +  +  +  +  :          55 :  if (any(d3e_pert1(1:natom)==1).and.(d3e_pert2(natom+3)==1.or.d3e_pert2(natom+4)==1)) then
          +  +  +  +  +  
                      - ]
     380   [ -  +  +  -  :          15 :    ABI_MALLOC(tgeom_typeI,(2,3,mpert,3,3,3))
          +  -  +  -  +  
          -  +  -  -  +  
                   -  + ]
     381   [ +  +  +  +  :        8234 :    tgeom_typeI(:,:,:,:,:,:)=zero
          +  +  +  +  +  
                +  +  + ]
     382                 :             :  end if
     383                 :             : 
     384                 :             : 
     385                 :             : !==== Initialize most of the Hamiltonian (and derivative) ====
     386                 :             : !1) Allocate all arrays and initialize quantities that do not depend on k and spin.
     387                 :             : !2) Perform the setup needed for the non-local factors:
     388                 :             : !3) Norm-conserving: Constant kleimann-Bylander energies are copied from psps to gs_hamk.
     389                 :             :  call gs_hamkq%init(psps,pawtab,dtset%nspinor,dtset%nsppol,nspden,dtset%natom,&
     390                 :             : & dtset%typat,xred,dtset%nfft,mgfft,dtset%ngfft,rprimd,dtset%nloalg,ph1d=ph1d,&
     391                 :          17 : & gpu_option=dtset%gpu_option)
     392                 :             : 
     393                 :             : !Specific allocations for strain-gradient perturbation
     394         [ +  + ]:          17 :  if (dtset%lw_flexo==1.or.dtset%lw_flexo==2.or.dtset%lw_flexo==4) then
     395   [ +  -  -  +  :           9 :    ABI_MALLOC(vhart1dqdq,(2*nfftf))
          +  -  +  -  +  
             -  -  +  -  
                      + ]
     396   [ -  +  +  -  :           6 :    ABI_MALLOC(vpsp1dqdq,(2*nfftf))
             -  +  -  + ]
     397   [ -  +  +  -  :           6 :    ABI_MALLOC(vxc1dqdq,(2*nfftf))
             -  +  -  + ]
     398                 :             :  end if
     399                 :             : 
     400                 :             : !Allocate xccc (only for quadrupoles yet)
     401   [ +  +  +  + ]:          17 :  if (dtset%lw_qdrpl==1.and.psps%n1xccc/=0) then
     402   [ -  +  +  -  :           6 :    ABI_MALLOC(xccc3d2,(cplex*nfftf))
          +  -  +  -  -  
                +  -  + ]
     403                 :             :  end if
     404                 :             : 
     405                 :             : !This is necessary to deactivate paw options in the dfpt_rhotov routine
     406         [ -  + ]:          17 :  ABI_MALLOC(pawrhoij_read,(0))
     407                 :          17 :  usexcnhat=0
     408         [ +  + ]:          17 :  n3xccc=0;if(psps%n1xccc/=0)n3xccc=nfftf
     409                 :          17 :  pawread=0
     410                 :          17 :  nhat1grdim=0
     411   [ -  +  +  -  :          68 :  ABI_MALLOC(nhat1,(cplex*dtset%nfft,nspden))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     412   [ +  +  +  + ]:      223617 :  nhat1=zero
     413                 :             : 
     414                 :             : 
     415                 :          17 :  pert1case = 0 ; pert2case = 0 ; pert3case = 0
     416                 :          17 :  pert1case_mq = 0 ; pert2case_mq = 0
     417                 :             : 
     418         [ +  + ]:         259 :  do i1pert = 1, mpert
     419         [ +  + ]:         985 :    do i1dir = 1, 3
     420                 :             : 
     421   [ +  +  +  +  :     2623064 :      if ((maxval(rfpert(i1dir,i1pert,:,:,:,:))==1)) then
          +  +  +  +  +  
                      + ]
     422                 :             : 
     423         [ +  + ]:          55 :        if (i1pert < natom + 10) then
     424                 :          52 :          pert1case = i1dir + (i1pert-1)*3
     425   [ +  -  +  - ]:           3 :        else if (i1pert > natom+11 .and. i1pert <= 2*natom+11) then
     426                 :           3 :          pert1case = i1dir + i1pert*3
     427                 :             :        end if
     428                 :          55 :        call appdig(pert1case,dtfil%fnamewff1,fiwf1i)
     429                 :             : 
     430         [ +  + ]:          55 :        if (finite_q) then
     431                 :             :          call hdr1_pq%init(ebands_kq,codvsn,dtset,pawtab,pert1case,psps,wvl%descr, &
     432                 :           4 :        & comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab )
     433                 :             :        else
     434   [ +  -  +  -  :          51 :          hdr1_pq=hdr
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  -  +  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  -  +  -  
          -  -  -  -  -  
          -  -  -  -  -  
                -  -  - ]
     435                 :             :        end if
     436                 :             : 
     437                 :             :        call inwffil(ask_accurate,cg1,dtset,dtset%ecut,ecut_eff,eigen1,dtset%exchn2n3d,&
     438                 :             :        & formeig,hdr1_pq,ireadwf,dtset%istwfk,kg1,kpq,dtset%localrdwf,&
     439                 :             :        & dtset%mband,mcg1,dtset%mk1mem,mpi_enreg,mpw1,&
     440                 :             :        & dtset%nband,dtset%ngfft,dtset%nkpt,npwar1,&
     441                 :             :        & dtset%nsppol,dtset%nsym,&
     442                 :             :        & occ,optorth,dtset%symafm,dtset%symrel,dtset%tnons,&
     443                 :          55 :        & dtfil%unkg1,wff1,wfft1,dtfil%unwff1,fiwf1i,wvl)
     444                 :             : 
     445         [ +  - ]:          55 :        if (ireadwf==1) then
     446                 :          55 :          call WffClose (wff1,ierr)
     447                 :             :        end if
     448                 :             : 
     449         [ +  + ]:          55 :        if (.not.kramers_deg) then
     450         [ +  - ]:           4 :          if (finite_q) then
     451                 :           4 :            pert1case_mq=pert1case+(2*dtset%natom+11)*3
     452                 :             :          else
     453                 :           0 :            pert1case_mq=pert1case
     454                 :             :          endif
     455                 :           4 :          call appdig(pert1case_mq,dtfil%fnamewff1,fiwf1i_mq)
     456                 :             : 
     457         [ +  - ]:           4 :          if (finite_q) then
     458                 :             :            call hdr1_mq%init(ebands_kmq,codvsn,dtset,pawtab,pert1case_mq,psps,wvl%descr, &
     459                 :           4 :          & comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab )
     460                 :             :          else
     461   [ #  #  #  #  :           0 :            hdr1_mq=hdr
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
     462                 :             :          end if
     463                 :             : 
     464                 :             :          call inwffil(ask_accurate,cg1_mq,dtset,dtset%ecut,ecut_eff,eigen1_mq,dtset%exchn2n3d,&
     465                 :             :          & formeig,hdr1_mq,ireadwf,dtset%istwfk,kg1_mq,kmq,dtset%localrdwf,&
     466                 :             :          & dtset%mband,mcg1,dtset%mk1mem,mpi_enreg,mpw1,&
     467                 :             :          & dtset%nband,dtset%ngfft,dtset%nkpt,npwar1_mq,&
     468                 :             :          & dtset%nsppol,dtset%nsym,&
     469                 :             :          & occ,optorth,dtset%symafm,dtset%symrel,dtset%tnons,&
     470                 :           4 :          & dtfil%unkg1,wff1,wfft1,dtfil%unwff1,fiwf1i_mq,wvl)
     471                 :             : 
     472         [ +  - ]:           4 :          if (ireadwf==1) then
     473                 :           4 :            call WffClose (wff1,ierr)
     474                 :             :          end if
     475                 :             :        end if
     476                 :             : 
     477         [ +  + ]:          55 :        if (.not.just_timdisp) then
     478                 :          43 :          call read_1eig(eigen1,formeig,mband,nkpt,nsppol,fiwf1i)
     479                 :             : 
     480   [ +  +  +  +  :     1377834 :          rho1r1(:,:) = zero; rho1g1(:,:) = zero
             +  +  +  + ]
     481   [ -  +  -  - ]:          43 :          if (dtset%get1den /= 0 .or. dtset%ird1den /= 0) then
     482                 :          43 :            call appdig(pert1case,dtfil%fildens1in,fiden1i)
     483                 :             : 
     484                 :             :            call read_rhor(fiden1i, cplex, dtset%nspden, nfftf, ngfftf, psps%usepaw, mpi_enreg, rho1r1, &
     485                 :          43 :            hdr_den, pawrhoij_read, comm_cell, check_hdr=hdr)
     486                 :          43 :            call hdr_den%free()
     487                 :             :          end if
     488                 :             : 
     489                 :             :          !Perform FFT rhor1 to rhog1
     490   [ -  +  +  -  :         129 :          ABI_MALLOC(work,(cplex*nfftf))
          +  -  +  -  -  
                +  -  + ]
     491         [ +  + ]:      344480 :          work(:)=rho1r1(:,1)
     492                 :          43 :          call fourdp(cplex,rho1g1,work,-1,mpi_enreg,dtset%nfft,1,dtset%ngfft,0)
     493         [ -  + ]:          43 :          ABI_FREE(work)
     494                 :             :        end if
     495                 :             : 
     496                 :             :        !Allocate the first-order gradient local potential
     497         [ +  + ]:          55 :        if (i1pert <= natom+3) then
     498                 :          49 :          n1dq=1
     499   [ +  -  -  +  :         196 :          ABI_MALLOC(vpsp1_i1pertdq,(2*nfftf,dtset%nspden,n1dq))
          +  -  -  +  +  
          -  +  -  +  -  
          -  +  -  +  -  
                      + ]
     500         [ -  + ]:           6 :        else if (i1pert == natom+4) then
     501                 :           0 :          n1dq=2
     502   [ #  #  #  #  :           0 :          ABI_MALLOC(vpsp1_i1pertdq,(2*nfftf,dtset%nspden,n1dq))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
     503                 :             :        else
     504                 :           6 :          n1dq=1
     505                 :             :        end if
     506   [ -  +  +  -  :         165 :        ABI_MALLOC(d3etot_t5,(2,n1dq))
          +  -  +  -  -  
                +  -  + ]
     507                 :             : 
     508         [ +  + ]:         737 :        do i2pert = 1, mpert
     509         [ +  + ]:        2783 :          do i2dir = 1, 3
     510                 :             : 
     511   [ +  +  +  +  :      117016 :            if ((maxval(rfpert(i1dir,i1pert,i2dir,i2pert,:,:))==1)) then
                   +  + ]
     512                 :             : 
     513         [ +  + ]:         242 :              if (i2pert < natom + 10) then
     514                 :         236 :                pert2case = i2dir + (i2pert-1)*3
     515   [ +  -  +  - ]:           6 :              else if (i2pert > natom+11 .and. i2pert <= 2*natom+11) then
     516                 :           6 :                pert2case = i2dir + i2pert*3
     517                 :             :              end if
     518                 :             : 
     519                 :         242 :              call appdig(pert2case,dtfil%fnamewff1,fiwf2i)
     520                 :             : 
     521         [ +  + ]:         242 :              if (finite_q) then
     522                 :             :                call hdr2_pq%init(ebands_kq,codvsn,dtset,pawtab,pert2case,psps,wvl%descr, &
     523                 :           6 :              & comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab )
     524                 :             :              else
     525   [ +  -  +  -  :         236 :                hdr2_pq=hdr
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  -  +  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  -  +  -  
          -  -  -  -  -  
          -  -  -  -  -  
                -  -  - ]
     526                 :             :              end if
     527                 :             : 
     528                 :             :              call inwffil(ask_accurate,cg2,dtset,dtset%ecut,ecut_eff,eigen2,dtset%exchn2n3d,&
     529                 :             :              & formeig,hdr2_pq,ireadwf,dtset%istwfk,kg1,kpq,dtset%localrdwf,&
     530                 :             :              & dtset%mband,mcg1,dtset%mk1mem,mpi_enreg,mpw1,&
     531                 :             :              & dtset%nband,dtset%ngfft,dtset%nkpt,npwar1,&
     532                 :             :              & dtset%nsppol,dtset%nsym,&
     533                 :             :              & occ,optorth,dtset%symafm,dtset%symrel,dtset%tnons,&
     534                 :         242 :              & dtfil%unkg1,wff2,wfft2,dtfil%unwff2,fiwf2i,wvl)
     535                 :             : 
     536         [ +  - ]:         242 :              if (ireadwf==1) then
     537                 :         242 :                call WffClose (wff2,ierr)
     538                 :             :              end if
     539                 :             : 
     540         [ +  + ]:         242 :              if (.not.kramers_deg) then
     541         [ +  - ]:           6 :                if (finite_q) then
     542                 :           6 :                  pert2case_mq=pert2case+(2*dtset%natom+11)*3
     543                 :             :                else
     544                 :           0 :                  pert2case_mq=pert2case
     545                 :             :                end if
     546                 :           6 :                call appdig(pert2case_mq,dtfil%fnamewff1,fiwf2i_mq)
     547                 :             : 
     548         [ +  - ]:           6 :                if (finite_q) then
     549                 :             :                  call hdr2_mq%init(ebands_kmq,codvsn,dtset,pawtab,pert2case_mq,psps,wvl%descr, &
     550                 :           6 :                & comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab )
     551                 :             :                else
     552   [ #  #  #  #  :           0 :                  hdr2_mq=hdr
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
     553                 :             :                end if
     554                 :             : 
     555                 :             :                call inwffil(ask_accurate,cg2_mq,dtset,dtset%ecut,ecut_eff,eigen2_mq,dtset%exchn2n3d,&
     556                 :             :                & formeig,hdr2_mq,ireadwf,dtset%istwfk,kg1_mq,kmq,dtset%localrdwf,&
     557                 :             :                & dtset%mband,mcg1,dtset%mk1mem,mpi_enreg,mpw1,&
     558                 :             :                & dtset%nband,dtset%ngfft,dtset%nkpt,npwar1_mq,&
     559                 :             :                & dtset%nsppol,dtset%nsym,&
     560                 :             :                & occ,optorth,dtset%symafm,dtset%symrel,dtset%tnons,&
     561                 :           6 :                & dtfil%unkg1,wff2,wfft2,dtfil%unwff2,fiwf2i_mq,wvl)
     562                 :             : 
     563         [ +  - ]:           6 :                if (ireadwf==1) then
     564                 :           6 :                  call WffClose (wff2,ierr)
     565                 :             :                end if
     566                 :             :              end if
     567                 :             : 
     568         [ +  + ]:         242 :              if (i1pert==i2pert.and.i1dir==i2dir) then
     569                 :          14 :                samepert=.true.
     570                 :             :              else
     571                 :         228 :                samepert=.false.
     572                 :             :              end if
     573                 :             : 
     574         [ +  + ]:         242 :              if (.not.just_timdisp) then
     575                 :         222 :                call read_1eig(eigen2,formeig,mband,nkpt,nsppol,fiwf2i)
     576                 :             : 
     577   [ +  +  +  +  :     5990380 :                rho2r1(:,:) = zero; rho2g1(:,:) = zero
             +  +  +  + ]
     578   [ -  +  -  - ]:         222 :                if (dtset%get1den /= 0 .or. dtset%ird1den /= 0) then
     579                 :         222 :                  call appdig(pert2case,dtfil%fildens1in,fiden1i)
     580                 :             : 
     581                 :             :                  call read_rhor(fiden1i, cplex, dtset%nspden, nfftf, ngfftf, psps%usepaw, mpi_enreg, rho2r1, &
     582                 :         222 :                  hdr_den, pawrhoij_read, comm_cell, check_hdr=hdr)
     583                 :         222 :                  call hdr_den%free()
     584                 :             :                end if
     585                 :             : 
     586         [ +  + ]:         222 :                if (.not.samepert) then
     587                 :             :                  !Perform FFT rhor1 to rhog1
     588   [ -  +  +  -  :         654 :                  ABI_MALLOC(work,(cplex*nfftf))
          +  -  +  -  -  
                +  -  + ]
     589         [ +  + ]:     1473753 :                  work(:)=rho2r1(:,1)
     590                 :         218 :                  call fourdp(cplex,rho2g1,work,-1,mpi_enreg,dtset%nfft,1,dtset%ngfft,0)
     591         [ -  + ]:         218 :                  ABI_FREE(work)
     592                 :             :                end if !samepert
     593                 :             :              end if
     594                 :             : 
     595                 :             :              !Allocate the first-order gradient local potential
     596         [ +  + ]:         242 :              if (i2pert <= natom+3) then
     597                 :         149 :                n2dq=1
     598   [ +  -  -  +  :         596 :                ABI_MALLOC(vpsp1_i2pertdq,(2*nfftf,dtset%nspden,n2dq))
          +  -  -  +  +  
          -  +  -  +  -  
          -  +  -  +  -  
                      + ]
     599   [ -  +  +  -  :         596 :                ABI_MALLOC(vxccc1_i2pertdq,(2*nfftf,dtset%nspden,n2dq))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     600   [ -  +  +  -  :         447 :                ABI_MALLOC(xccc3d2dq,(2*nfftf))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     601         [ +  + ]:          93 :              else if (i2pert == natom+4) then
     602                 :          81 :                n2dq=2
     603   [ +  -  -  +  :         405 :                ABI_MALLOC(vpsp1_i2pertdq,(2*nfftf,dtset%nspden,n2dq))
          +  -  -  +  +  
          -  +  -  +  -  
          +  -  -  +  -  
                +  -  + ]
     604                 :             :              else
     605                 :          12 :                n2dq=1
     606                 :             :              end if
     607   [ -  +  +  -  :         726 :              ABI_MALLOC(d3etot_t4,(2,n2dq))
          +  -  +  -  -  
                +  -  + ]
     608   [ -  +  +  -  :         484 :              ABI_MALLOC(d3etot_tgeom,(2,n2dq))
             -  +  -  + ]
     609                 :             : 
     610                 :             :              !Calculate the first-order gradient local potential that enters the geometric term
     611   [ +  -  -  +  :        1210 :              ABI_MALLOC(vpsp1_i1pertdq_geom,(2*nfftf,dtset%nspden,3))
          +  -  -  +  +  
          -  +  -  +  -  
          +  -  -  +  -  
                      + ]
     612         [ +  + ]:         242 :              if (.not.just_timdisp) then
     613   [ +  +  +  +  :         222 :                if (i1pert <= natom .and. (i2pert == natom+3.or.i2pert == natom+4)) then
                   +  + ]
     614                 :             : 
     615                 :             :                  !calculate the second of the two first-gradient directions
     616         [ +  + ]:         432 :                  do ii=1,3
     617                 :             :                    call dfpt_vlocaldq(atindx,2,gmet,gsqcut,i1dir,i1pert,mpi_enreg, &
     618                 :             :                    & psps%mqgrid_vl,dtset%natom,nattyp,dtset%nfft,dtset%ngfft,dtset%ntypat,n1,n2,n3, &
     619                 :         546 :                    & ph1d,ii,psps%qgrid_vl,dtset%qptn,ucvol,psps%vlspl,vpsp1_i1pertdq_geom(:,1,ii))
     620                 :             :                  end do
     621                 :             :                end if
     622                 :             :              end if
     623                 :             : 
     624                 :             :              !Allocate the second-gradient array
     625   [ +  -  -  +  :        1210 :              ABI_MALLOC(vpsp1_i1pertdqdq,(2*nfftf,dtset%nspden,n2dq))
          +  -  -  +  +  
          -  -  +  +  -  
          +  -  +  -  -  
                +  -  + ]
     626                 :             : 
     627                 :             :              !Calculate first-order pseudocore charge (still, only for quadrupoles)
     628         [ +  + ]:         242 :              if (.not.just_timdisp) then
     629   [ +  +  +  +  :         222 :                if (i1pert==natom+2.and.i2pert<=natom.and.psps%n1xccc/=0.and.nkxc == 7) then
             +  +  +  + ]
     630         [ -  + ]:           9 :                  if (psps%nc_xccc_gspace==1) then
     631                 :           0 :                    ndir=1
     632                 :             :                    call dfpt_atm2fft(atindx,cplex,gmet,gprimd,gsqcut,i2dir,i2pert,&
     633                 :             :                    & mgfft,psps%mqgrid_vl,dtset%natom,ndir,nfftf,ngfftf,psps%ntypat,&
     634                 :             :                    & ph1d,psps%qgrid_vl,dtset%qptn,dtset%typat,ucvol,psps%usepaw,xred,psps,pawtab,&
     635                 :           0 :                    & atmrhor1=xccc3d2,optn_in=n3xccc/nfftf,optn2_in=1)
     636         [ +  - ]:           9 :                  else if (psps%nc_xccc_gspace==0) then
     637                 :             :                    call dfpt_mkcore(cplex,i2dir,i2pert,dtset%natom,psps%ntypat,n1,psps%n1xccc,&
     638                 :           9 :                    & n2,n3,dtset%qptn,rprimd,dtset%typat,ucvol,psps%xcccrc,psps%xccc1d,xccc3d2,xred)
     639                 :             :                  end if
     640                 :             :                end if
     641                 :             :              end if
     642                 :             : 
     643         [ +  + ]:        2898 :              do i3pert = 1, mpert
     644         [ +  + ]:       10866 :                do i3dir = 1, 3
     645                 :             : 
     646         [ +  + ]:       10624 :                  if (rfpert(i1dir,i1pert,i2dir,i2pert,i3dir,i3pert)==1) then
     647                 :             : 
     648                 :         611 :                    blkflg(i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = 1
     649                 :             : 
     650                 :             :                    !Calculate local potentials for first-order gradient Hamiltonians
     651                 :             :                    !gradient of i1pert:
     652         [ +  + ]:         611 :                    if (.not.just_timdisp) then
     653         [ +  + ]:         591 :                      if (i1pert<=natom) then
     654                 :             :                        !Get q-gradient of first-order local part of the pseudopotential
     655                 :             :                        call dfpt_vlocaldq(atindx,2,gmet,gsqcut,i1dir,i1pert,mpi_enreg, &
     656                 :             :                        & psps%mqgrid_vl,dtset%natom,nattyp,dtset%nfft,dtset%ngfft,dtset%ntypat,n1,n2,n3, &
     657                 :         354 :                        & ph1d,i3dir,psps%qgrid_vl,dtset%qptn,ucvol,psps%vlspl,vpsp1_i1pertdq(:,1,1))
     658                 :             : 
     659   [ +  +  +  + ]:         354 :                        if (i2pert == natom+3.or.i2pert == natom+4) then
     660                 :         324 :                          gamma=i3dir
     661         [ +  + ]:         810 :                          do idq= 1, n2dq
     662         [ +  + ]:         486 :                             if (i2pert==natom+3) then
     663                 :         162 :                               istr=i2dir
     664                 :             :                             else
     665                 :         324 :                               istr=idq*3+i2dir
     666                 :             :                             endif
     667                 :         486 :                             delta=idx(2*istr)
     668                 :             :                             call dfpt_vlocaldqdq(atindx,2,gs_hamkq%gmet,gsqcut,i1dir,i1pert,mpi_enreg, &
     669                 :             :                           & psps%mqgrid_vl,dtset%natom,&
     670                 :             :                           & nattyp,dtset%nfft,dtset%ngfft,dtset%ntypat,n1,n2,n3, &
     671                 :             :                           & ph1d,gamma,delta,psps%qgrid_vl,&
     672                 :         840 :                           & dtset%qptn,ucvol,psps%vlspl,vpsp1_i1pertdqdq(:,1,idq))
     673                 :             :                          end do
     674                 :             :                        end if
     675                 :             : 
     676   [ +  -  -  + ]:         237 :                      else if (i1pert==natom+3.or.i1pert==natom+4) then
     677         [ #  # ]:           0 :                        istr=i1dir; if (i1pert==natom+4) istr=3+i1dir
     678                 :             :                        !Get 2nd q-gradient of first-order local part of the pseudopotential and of the Hartree
     679                 :             :                        !(and XC if GGA) contribution from ground state density
     680                 :             :                        call dfpt_vmetdqdq(2,gmet,gprimd,gsqcut,istr,i1pert,kxc,mpi_enreg, &
     681                 :             :                        & psps%mqgrid_vl,natom,nattyp,dtset%nfft,dtset%ngfft,dtset%ntypat,n1,n2,n3,&
     682                 :             :                        & nkxc,nspden,opthartdqdq,ph1d,i3dir,psps%qgrid_vl,&
     683                 :           0 :                        & dtset%qptn,rhog,rhor,ucvol,psps%vlspl,vhart1dqdq,vpsp1dqdq,vxc1dqdq)
     684         [ #  # ]:           0 :                        vpsp1_i1pertdq(:,1,1)=vhart1dqdq(:)+vpsp1dqdq(:)+vxc1dqdq(:)
     685         [ #  # ]:           0 :                        if (i1pert==natom+4) then
     686                 :             :                          !Here we need to calculate both extradiagonal shear-strains
     687                 :             :                          !because the second gradient of the metric perturbation is
     688                 :             :                          !type-I, i.e., non symmetric with respect to the
     689                 :             :                          !permutation of the strain indexes.
     690                 :           0 :                          istr=6+i1dir
     691                 :             :                          call dfpt_vmetdqdq(2,gmet,gprimd,gsqcut,istr,i1pert,kxc,mpi_enreg, &
     692                 :             :                          & psps%mqgrid_vl,natom,nattyp,dtset%nfft,dtset%ngfft,dtset%ntypat,n1,n2,n3,&
     693                 :             :                          & nkxc,nspden,opthartdqdq,ph1d,i3dir,psps%qgrid_vl,&
     694                 :           0 :                          & dtset%qptn,rhog,rhor,ucvol,psps%vlspl,vhart1dqdq,vpsp1dqdq,vxc1dqdq)
     695         [ #  # ]:           0 :                          vpsp1_i1pertdq(:,1,2)=vhart1dqdq(:)+vpsp1dqdq(:)+vxc1dqdq(:)
     696                 :             :                        end if
     697                 :             :                      end if
     698                 :             : 
     699         [ +  + ]:         591 :                      if (.not.samepert) then
     700                 :             :                        !gradient of i2pert:
     701         [ +  + ]:         584 :                        if (i2pert<=natom) then
     702                 :             :                          !Get q-gradient of first-order local part of the pseudopotential
     703                 :             :                          call dfpt_vlocaldq(atindx,2,gmet,gsqcut,i2dir,i2pert,mpi_enreg, &
     704                 :             :                          & psps%mqgrid_vl,dtset%natom,nattyp,dtset%nfft,dtset%ngfft,dtset%ntypat,n1,n2,n3, &
     705                 :          94 :                          & ph1d,i3dir,psps%qgrid_vl,dtset%qptn,ucvol,psps%vlspl,vpsp1_i2pertdq(:,1,1))
     706   [ +  +  +  + ]:         490 :                        else if (i2pert==natom+3.or.i2pert==natom+4) then
     707         [ +  + ]:         486 :                          istr=i2dir; if (i2pert==natom+4) istr=3+i2dir
     708                 :             :                          !Get 2nd q-gradient of first-order local part of the pseudopotential and of the Hartree
     709                 :             :                          !(and XC if GGA) contribution from ground state density
     710                 :             :                          call dfpt_vmetdqdq(2,gmet,gprimd,gsqcut,istr,i2pert,kxc,mpi_enreg, &
     711                 :             :                          & psps%mqgrid_vl,natom,nattyp,dtset%nfft,dtset%ngfft,dtset%ntypat,n1,n2,n3,&
     712                 :             :                          & nkxc,nspden,opthartdqdq,ph1d,i3dir,psps%qgrid_vl,&
     713                 :         486 :                          & dtset%qptn,rhog,rhor,ucvol,psps%vlspl,vhart1dqdq,vpsp1dqdq,vxc1dqdq)
     714         [ +  + ]:     3280986 :                          vpsp1_i2pertdq(:,1,1)=vhart1dqdq(:)+vpsp1dqdq(:)+vxc1dqdq(:)
     715         [ +  + ]:         486 :                          if (i2pert==natom+4) then
     716                 :             :                            !Here we need to calculate both extradiagonal shear-strains
     717                 :             :                            !because the second gradient of the metric perturbation is
     718                 :             :                            !type-I, i.e., non symmetric with respect to the
     719                 :             :                            !permutation of the strain indexes.
     720                 :         243 :                            istr=6+i2dir
     721                 :             :                            call dfpt_vmetdqdq(2,gmet,gprimd,gsqcut,istr,i2pert,kxc,mpi_enreg, &
     722                 :             :                            & psps%mqgrid_vl,natom,nattyp,dtset%nfft,dtset%ngfft,dtset%ntypat,n1,n2,n3,&
     723                 :             :                            & nkxc,nspden,opthartdqdq,ph1d,i3dir,psps%qgrid_vl,&
     724                 :         243 :                            & dtset%qptn,rhog,rhor,ucvol,psps%vlspl,vhart1dqdq,vpsp1dqdq,vxc1dqdq)
     725         [ +  + ]:     1640493 :                            vpsp1_i2pertdq(:,1,2)=vhart1dqdq(:)+vpsp1dqdq(:)+vxc1dqdq(:)
     726                 :             :                          end if
     727                 :             :                        end if
     728                 :             : 
     729   [ +  +  +  +  :         584 :                        if (i1pert==natom+2.and.i2pert<=natom.and.psps%n1xccc/=0) then
                   +  + ]
     730                 :             :                          !Get the q-gradient of the pseudocore density
     731                 :             :                          call dfpt_vlocaldq(atindx,2,gmet,gsqcut,i2dir,i2pert,mpi_enreg, &
     732                 :             :                          & psps%mqgrid_vl,dtset%natom,nattyp,dtset%nfft,dtset%ngfft,dtset%ntypat,n1,n2,n3, &
     733                 :          27 :                          & ph1d,i3dir,psps%qgrid_vl,dtset%qptn,ucvol,ncorespl,xccc3d2dq,optnc=1)
     734                 :             : 
     735                 :             :                          !Get the q-gradient of the first-order XC potential due to the pseudocore charge
     736                 :             :                          call dfpt_mkvxcccdq(cplex,i3dir,dtset%ixc,gprimd,kxc,mpi_enreg,nfftf,dtset%ngfft,&
     737                 :          27 :                        & nkxc,nspden,dtset%qptn,rprimd,vxccc1_i2pertdq,xccc3d2,xccc3d2dq)
     738                 :             : 
     739                 :             :                          !Add this contribution to the gradient of the local PSP
     740   [ -  +  +  +  :      244716 :                          vpsp1_i2pertdq= vpsp1_i2pertdq + vxccc1_i2pertdq
             +  +  +  + ]
     741                 :             :                        end if
     742                 :             :                      end if !samepert
     743                 :             : 
     744                 :             : 
     745                 :             :                      !Prepare ddk wf file
     746                 :         591 :                      pert3case = i3dir + natom*3
     747                 :         591 :                      call appdig(pert3case,dtfil%fnamewffddk,fiwfddk)
     748                 :             :                      ! Checking the existence of data file
     749         [ +  - ]:         591 :                      if (.not. file_exists(fiwfddk)) then
     750                 :             :                        ! Trick needed to run Abinit test suite in netcdf mode.
     751         [ +  - ]:         591 :                        if (file_exists(nctk_ncify(fiwfddk))) then
     752                 :         591 :                          write(message,"(3a)")"- File: ",trim(fiwfddk),&
     753                 :        1182 :                          " does not exist but found netcdf file with similar name."
     754                 :         591 :                          call wrtout(std_out,message,'COLL')
     755                 :        1182 :                          fiwfddk = nctk_ncify(fiwfddk)
     756                 :             :                        end if
     757         [ -  + ]:         591 :                        if (.not. file_exists(fiwfddk)) then
     758         [ #  # ]:           0 :                          ABI_ERROR('Missing file: '//TRIM(fiwfddk))
     759                 :             :                        end if
     760                 :             :                      end if
     761                 :         591 :                      write(message,'(2a)')'-dfptlw_loop : read the ddk wavefunctions from file: ',trim(fiwfddk)
     762                 :         591 :                      call wrtout(std_out,message,'COLL')
     763                 :             :                      !call wrtout(ab_out,message,'COLL')
     764                 :             :                      !Note that the unit number for these files is 50,51,52 or 53 (dtfil%unddk=50)
     765                 :         591 :                      call ddk_f%open_read(fiwfddk,1,dtset%iomode,dtfil%unddk,mpi_enreg%comm_cell)
     766                 :             : 
     767                 :             :                      !Prepare d2_dkdk wf file
     768                 :             :                      !For i1pert
     769         [ +  + ]:         591 :                      if (i1pert==natom+2) then
     770                 :         237 :                        call rf2_getidir(i1dir,i3dir,idir_dkdk)
     771                 :             :                        !if (idir_dkdk>6) idir_dkdk=idir_dkdk-3
     772                 :         237 :                        dkdk_index=idir_dkdk+(dtset%natom+6)*3
     773                 :         237 :                        call appdig(dkdk_index,dtfil%fnamewffdkdk,fiwfdkdk)
     774                 :             :                        !Check that d2_dkdk file exists and open it
     775         [ +  - ]:         237 :                        if (.not. file_exists(fiwfdkdk)) then
     776                 :             :                          ! Trick needed to run Abinit test suite in netcdf mode.
     777         [ +  - ]:         237 :                          if (file_exists(nctk_ncify(fiwfdkdk))) then
     778                 :         237 :                            write(message,"(3a)")"- File: ",trim(fiwfdkdk),&
     779                 :         474 :                            " does not exist but found netcdf file with similar name."
     780                 :         237 :                            call wrtout(std_out,message,'COLL')
     781                 :         474 :                            fiwfdkdk = nctk_ncify(fiwfdkdk)
     782                 :             :                          end if
     783         [ -  + ]:         237 :                          if (.not. file_exists(fiwfdkdk)) then
     784         [ #  # ]:           0 :                            ABI_ERROR('Missing file: '//TRIM(fiwfdkdk))
     785                 :             :                          end if
     786                 :             :                        end if
     787                 :         237 :                        write(message,'(2a)')'-dfptlw_loop : read the d2_dkdk wavefunctions from file: ',trim(fiwfdkdk)
     788                 :         237 :                        call wrtout(std_out,message,'COLL')
     789                 :             :                        !call wrtout(ab_out,message,'COLL')
     790                 :         237 :                        call d2_dkdk_f%open_read(fiwfdkdk,1,dtset%iomode,dtfil%unddk+1,mpi_enreg%comm_cell)
     791                 :             : 
     792                 :             :                      end if
     793                 :             : 
     794                 :             :                      !Prepare d2_dkdk wf file
     795                 :             :                      !For i2pert
     796   [ +  +  +  + ]:         591 :                      if (i2pert==natom+2.and..not.samepert) then
     797                 :           4 :                        call rf2_getidir(i2dir,i3dir,idir_dkdk)
     798                 :             :                        !if (idir_dkdk>6) idir_dkdk=idir_dkdk-3
     799                 :           4 :                        dkdk_index=idir_dkdk+(dtset%natom+6)*3
     800                 :           4 :                        call appdig(dkdk_index,dtfil%fnamewffdkdk,fiwfdkdk)
     801                 :             :                        !Check that d2_dkdk file exists and open it
     802         [ +  - ]:           4 :                        if (.not. file_exists(fiwfdkdk)) then
     803                 :             :                          ! Trick needed to run Abinit test suite in netcdf mode.
     804         [ +  - ]:           4 :                          if (file_exists(nctk_ncify(fiwfdkdk))) then
     805                 :           4 :                            write(message,"(3a)")"- File: ",trim(fiwfdkdk),&
     806                 :           8 :                            " does not exist but found netcdf file with similar name."
     807                 :           4 :                            call wrtout(std_out,message,'COLL')
     808                 :           8 :                            fiwfdkdk = nctk_ncify(fiwfdkdk)
     809                 :             :                          end if
     810         [ -  + ]:           4 :                          if (.not. file_exists(fiwfdkdk)) then
     811         [ #  # ]:           0 :                            ABI_ERROR('Missing file: '//TRIM(fiwfdkdk))
     812                 :             :                          end if
     813                 :             :                        end if
     814                 :           4 :                        write(message,'(2a)')'-dfptlw_loop : read the d2_dkdk wavefunctions from file: ',trim(fiwfdkdk)
     815                 :           4 :                        call wrtout(std_out,message,'COLL')
     816                 :           4 :                        call d2_dkdk_f2%open_read(fiwfdkdk,1,dtset%iomode,dtfil%unddk+2,mpi_enreg%comm_cell)
     817                 :             :                      end if
     818                 :             : 
     819                 :             :                      !Perform the longwave DFPT part of the 3dte calculation
     820                 :             :                      call dfptlw_pert(cg,cg1,cg2,cplex,d3etot,d3etot_t4,d3etot_t5,d3etot_tgeom,dimffnl,dtset, &
     821                 :             :                      & eigen1,eigen2,ffnl,gmet,gs_hamkq,gsqcut,i1dir,&
     822                 :             :                      & i2dir,i3dir,i1pert,i2pert,i3pert,kg,kxc,mband,mkmem,mk1mem,mpert,mpi_enreg,&
     823                 :             :                      & mpsang,mpw1,natom,n1dq,n2dq,nfftf,ngfftf,nkpt,nkxc,nspden,nspinor,nsppol,npwarr,nylmgr,occ,&
     824                 :             :                      & pawfgr,psps,rho1g1,rho1r1,rho2r1,rmet,rprimd,samepert,ucvol,useylmgr,&
     825                 :             :                      & vpsp1_i1pertdq,vpsp1_i1pertdqdq,vpsp1_i1pertdq_geom,vpsp1_i2pertdq,&
     826                 :         591 :                      & ddk_f,d2_dkdk_f,d2_dkdk_f2,ylm,ylmgr)
     827                 :             : 
     828                 :             :                      !close ddk file
     829                 :         591 :                      call ddk_f%close()
     830                 :             : 
     831                 :             :                      !close d2_dkdk file (i1pert)
     832         [ +  + ]:         591 :                      if (i1pert==natom+2) call d2_dkdk_f%close()
     833                 :             : 
     834                 :             :                      ! Close d2_dkdk file (i2pert)
     835   [ +  +  +  + ]:         591 :                      if (i2pert==natom+2.and..not.samepert) call d2_dkdk_f2%close()
     836                 :             : 
     837                 :             :                      !Save the type-I terms
     838   [ +  +  +  + ]:         591 :                      if (i2pert==natom+3.or.i2pert==natom+4) then
     839                 :         486 :                        gamma=i3dir
     840         [ +  + ]:        1215 :                        do idq=1,n2dq
     841         [ +  + ]:         729 :                          if (i2pert==natom+3) then
     842                 :         243 :                            istr=i2dir
     843                 :             :                          else
     844                 :         486 :                            istr=idq*3+i2dir
     845                 :             :                          endif
     846                 :         729 :                          beta=idx(2*istr-1); delta=idx(2*istr)
     847         [ +  + ]:        2673 :                          t4_typeI(:,i1dir,i1pert,beta,delta,gamma)=d3etot_t4(:,idq)
     848                 :             :                        end do
     849                 :             :                      else
     850         [ +  + ]:         315 :                        t4_typeII(:,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert)=d3etot_t4(:,1)
     851                 :             :                      end if
     852                 :             : 
     853   [ +  -  -  + ]:         591 :                      if (i1pert==natom+3.or.i1pert==natom+4) then
     854                 :           0 :                        gamma=i3dir
     855         [ #  # ]:           0 :                        do idq=1,n1dq
     856         [ #  # ]:           0 :                          if (i1pert==natom+3) then
     857                 :           0 :                            istr=i1dir
     858                 :             :                          else
     859                 :           0 :                            istr=idq*3+i1dir
     860                 :             :                          endif
     861                 :           0 :                          beta=idx(2*istr-1); delta=idx(2*istr)
     862         [ #  # ]:           0 :                          t5_typeI(:,i2dir,i2pert,beta,delta,gamma)=d3etot_t5(:,idq)
     863                 :             :                        end do
     864                 :             :                      else
     865         [ +  + ]:        1773 :                        t5_typeII(:,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert)=d3etot_t5(:,1)
     866                 :             :                      end if
     867                 :             : 
     868                 :             : 
     869   [ +  +  +  +  :         591 :                      if (i1pert<=natom.and.(i2pert==natom+3.or.i2pert==natom+4)) then
                   +  + ]
     870                 :         324 :                        alpha=i1dir
     871                 :         324 :                        gamma=i3dir
     872         [ +  + ]:         810 :                        do idq=1,n2dq
     873         [ +  + ]:         486 :                          if (i2pert==natom+3) then
     874                 :         162 :                            istr=i2dir
     875                 :             :                          else
     876                 :         324 :                            istr=idq*3+i2dir
     877                 :             :                          endif
     878                 :         486 :                          beta=idx(2*istr-1); delta=idx(2*istr)
     879         [ +  + ]:        1458 :                          tgeom_typeI(:,i1dir,i1pert,beta,delta,gamma)=d3etot_tgeom(:,idq)
     880                 :             : 
     881                 :             :                          !Incorporate here the G=0 contribution of the geometric term
     882                 :         486 :                          ia1=0
     883                 :         486 :                          itypat=0
     884         [ +  + ]:         972 :                          do ii=1,dtset%ntypat
     885                 :         486 :                            ia1=ia1+nattyp(ii)
     886   [ -  +  -  + ]:         972 :                            if (atindx(i1pert)<=ia1.and.itypat==0) itypat=ii
     887                 :             :                          end do
     888         [ +  + ]:         486 :                          delad=zero ; if (alpha==delta) delad=one
     889         [ +  + ]:         486 :                          delbd=zero ; if (beta==delta)  delbd=one
     890         [ +  + ]:         486 :                          delag=zero ; if (alpha==gamma) delag=one
     891         [ +  + ]:         486 :                          delbg=zero ; if (beta==gamma)  delbg=one
     892                 :             : 
     893                 :             :                          tgeom_typeI(1,i1dir,i1pert,beta,delta,gamma)= &
     894                 :             :                        & tgeom_typeI(1,i1dir,i1pert,beta,delta,gamma) + &
     895                 :         810 :                        & pi*pi*rhog(1,1)*psps%vlspl(1,2,itypat)*(delag*delbd+delad*delbg)
     896                 :             :                        end do
     897                 :             :                      else
     898         [ +  + ]:         801 :                        tgeom_typeII(:,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert)=d3etot_tgeom(:,1)
     899                 :             :                      end if
     900                 :             :                    end if ! .not.just_timdisp
     901                 :             : 
     902         [ +  + ]:         611 :                    if (i3pert==natom+9) then
     903                 :             : 
     904                 :          20 :                       write(message,'(2a,3(a,i2,a,i1))') ch10,'TIMDISP : ',&
     905                 :          40 :                       ' perts : ',i1pert,'.',i1dir,' / ',i2pert,'.',i2dir,' / ',i3pert,'.',i3dir
     906                 :          20 :                       call wrtout(std_out,message,'COLL')
     907                 :          20 :                       call wrtout(ab_out,message,'COLL')
     908                 :             :                      !Perform the Berry curvature part of the time-disperion 3dte calculation
     909                 :             :                      call dfpttd_berrycurv(cg1,cg2,d3etot_td,dtset,&
     910                 :             :                      & mband,mk1mem,mpi_enreg,&
     911                 :          20 :                      & mpw1,nkpt,nspinor,nsppol,npwar1,occ)
     912         [ +  + ]:          20 :                      if (.not.kramers_deg) then
     913                 :             :                        call dfpttd_berrycurv(cg1_mq,cg2_mq,d3etot_td_mq,dtset,&
     914                 :             :                        & mband,mk1mem,mpi_enreg,&
     915                 :           6 :                        & mpw1,nkpt,nspinor,nsppol,npwar1_mq,occ)
     916                 :             :                      end if
     917                 :             : 
     918                 :             :                      !Add the result to the big array
     919                 :             :                      if (kramers_deg) then
     920                 :          14 :                        d3etot(1,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert)=zero
     921                 :          14 :                        d3etot(2,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert)=-two*d3etot_td(2)
     922                 :             :                      else
     923                 :           6 :                        d3etot(1,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert)=-d3etot_td(1)+d3etot_td_mq(1)
     924                 :           6 :                        d3etot(2,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert)=-d3etot_td(2)-d3etot_td_mq(2)
     925                 :             :                      end if
     926                 :             : 
     927                 :             :                    end if
     928                 :             : 
     929                 :             :                  end if   ! rfpert
     930                 :             :                end do    ! ir3dir
     931                 :             :              end do     ! ir3pert
     932                 :             : 
     933         [ +  + ]:         242 :              if (finite_q) then
     934                 :           6 :                call hdr1_pq%free()
     935                 :           6 :                call hdr2_pq%free()
     936         [ +  - ]:           6 :                if (.not.kramers_deg) then
     937                 :           6 :                  call hdr1_mq%free()
     938                 :           6 :                  call hdr2_mq%free()
     939                 :             :                end if
     940                 :             :              end if
     941                 :             : 
     942         [ +  + ]:         242 :              ABI_SFREE(vpsp1_i2pertdq)
     943         [ +  + ]:         242 :              ABI_SFREE(xccc3d2dq)
     944         [ +  + ]:         242 :              ABI_SFREE(vxccc1_i2pertdq)
     945         [ -  + ]:         242 :              ABI_FREE(vpsp1_i1pertdq_geom)
     946         [ -  + ]:         242 :              ABI_FREE(vpsp1_i1pertdqdq)
     947         [ -  + ]:         242 :              ABI_FREE(d3etot_t4)
     948         [ -  + ]:         242 :              ABI_FREE(d3etot_tgeom)
     949                 :             : 
     950                 :             :            end if   ! rfpert
     951                 :             :          end do    ! i2dir
     952                 :             :        end do     ! i2pert
     953                 :             : 
     954         [ +  + ]:          55 :        ABI_SFREE(vpsp1_i1pertdq)
     955         [ -  + ]:          55 :        ABI_FREE(d3etot_t5)
     956                 :             : 
     957                 :             :      end if   ! rfpert
     958                 :             :    end do    ! i1dir
     959                 :             :  end do     ! i1pert
     960                 :             : 
     961                 :             : !More memory cleaning
     962                 :          17 :  call gs_hamkq%free()
     963         [ -  + ]:          17 :  ABI_FREE(kpq)
     964         [ -  + ]:          17 :  ABI_FREE(kg1)
     965         [ -  + ]:          17 :  ABI_FREE(npwar1)
     966         [ -  + ]:          17 :  ABI_FREE(npwtot1)
     967         [ -  + ]:          17 :  ABI_FREE(cg1)
     968         [ -  + ]:          17 :  ABI_FREE(cg2)
     969         [ -  + ]:          17 :  ABI_FREE(eigen1)
     970         [ -  + ]:          17 :  ABI_FREE(eigen2)
     971         [ -  + ]:          17 :  ABI_FREE(rho1r1)
     972         [ -  + ]:          17 :  ABI_FREE(rho2r1)
     973         [ -  + ]:          17 :  ABI_FREE(rho1g1)
     974         [ -  + ]:          17 :  ABI_FREE(rho2g1)
     975         [ -  + ]:          17 :  ABI_FREE(nhat1)
     976   [ +  -  -  +  :          17 :  ABI_FREE(pawrhoij_read)
          -  -  -  -  -  
          -  -  -  -  -  
             -  -  -  + ]
     977         [ +  + ]:          17 :  ABI_SFREE(xccc3d2)
     978                 :             : 
     979         [ +  + ]:          17 :  if (dtset%lw_flexo==1.or.dtset%lw_flexo==2.or.dtset%lw_flexo==4) then
     980         [ -  + ]:           3 :   ABI_FREE(vhart1dqdq)
     981         [ -  + ]:           3 :   ABI_FREE(vpsp1dqdq)
     982         [ -  + ]:           3 :   ABI_FREE(vxc1dqdq)
     983                 :             :  end if
     984                 :             : 
     985                 :          17 :  call ebands_kq%free()
     986         [ +  + ]:          17 :  if (.not.kramers_deg) then
     987                 :           2 :    call ebands_kmq%free()
     988         [ -  + ]:           2 :    ABI_FREE(cg1_mq)
     989         [ -  + ]:           2 :    ABI_FREE(cg2_mq)
     990         [ -  + ]:           2 :    ABI_FREE(eigen1_mq)
     991         [ -  + ]:           2 :    ABI_FREE(eigen2_mq)
     992         [ -  + ]:           2 :    ABI_FREE(kg1_mq)
     993         [ -  + ]:           2 :    ABI_FREE(npwar1_mq)
     994         [ -  + ]:           2 :    ABI_FREE(npwtot1_mq)
     995         [ -  + ]:           2 :    ABI_FREE(kmq)
     996                 :             :  end if
     997                 :             : !Treatment of T4 and T5 terms that have a q-gradient of a rf Hamiltonian
     998                 :             : !they need to be converted to type-II for strain perturbation
     999   [ +  +  -  + ]:          17 :  if (d3e_pert2(natom+3)==1.or.d3e_pert2(natom+4)==1) then
    1000                 :           3 :    optgeom=0
    1001                 :           3 :    call dfptlw_typeIproc(blkflg,gprimd,optgeom,mpert,natom,rfpert,rprimd,t4_typeI,t4_typeII)
    1002                 :             :  end if
    1003                 :             : 
    1004   [ +  -  -  + ]:          17 :  if (d3e_pert1(natom+3)==1.or.d3e_pert1(natom+4)==1) then
    1005                 :           0 :    optgeom=0
    1006                 :           0 :    call dfptlw_typeIproc(blkflg,gprimd,optgeom,mpert,natom,rfpert,rprimd,t5_typeI,t5_typeII)
    1007                 :             :  end if
    1008                 :             : 
    1009                 :             : !Tgeom has to be converted to type-II
    1010                 :             : !To do it we need to convert the three involve indexes to cartessian. Then,
    1011                 :             : !after type-II conversion the q-gradient index is back converted to reduced.
    1012   [ +  +  +  +  :          55 :  if (any(d3e_pert1(1:natom)==1).and.(d3e_pert2(natom+3)==1.or.d3e_pert2(natom+4)==1)) then
          +  +  +  +  -  
                      + ]
    1013                 :           3 :    optgeom=1
    1014                 :           3 :    call dfptlw_typeIproc(blkflg,gprimd,optgeom,mpert,natom,rfpert,rprimd,tgeom_typeI,tgeom_typeII)
    1015                 :             :  end if
    1016                 :             : 
    1017                 :             : !Incorporate T4, T5 and Tgeom to d3etot
    1018                 :             :   d3etot(:,:,:,:,:,:,:)= d3etot(:,:,:,:,:,:,:) + &
    1019                 :             :                     & t4_typeII(:,:,:,:,:,:,:) + &
    1020                 :             :                     & t5_typeII(:,:,:,:,:,:,:) + &
    1021   [ +  +  +  +  :     6485593 :                  & tgeom_typeII(:,:,:,:,:,:,:)
          +  +  +  +  +  
             +  +  +  +  
                      + ]
    1022                 :             : 
    1023                 :             : !Anounce end of spatial-dispersion calculation
    1024                 :          17 :  write(message, '(a,a,a,a)' ) ch10,ch10,&
    1025                 :          34 : &   ' -- Spatial-dispersion 3rd-order derivatives completed -- ',ch10
    1026                 :          17 :  call wrtout(std_out,message,'COLL')
    1027                 :          17 :  call wrtout(ab_out,message,'COLL')
    1028                 :             : 
    1029                 :             : !Deallocations
    1030         [ -  + ]:          17 :  ABI_FREE(t4_typeII)
    1031         [ -  + ]:          17 :  ABI_FREE(t5_typeII)
    1032         [ -  + ]:          17 :  ABI_FREE(tgeom_typeII)
    1033         [ +  + ]:          17 :  ABI_SFREE(t4_typeI)
    1034         [ -  + ]:          17 :  ABI_SFREE(t5_typeI)
    1035         [ +  + ]:          17 :  ABI_SFREE(tgeom_typeI)
    1036                 :             : 
    1037                 :             :  DBG_EXIT("COLL")
    1038                 :             : 
    1039   [ -  +  -  +  :          17 : end subroutine dfptlw_loop
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  -  +  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          -  +  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  +  
          -  +  -  +  -  
                +  -  + ]
    1040                 :             : !!***
    1041                 :             : 
    1042                 :             : !!****f* ABINIT/m_dfptlw_loop/dfptlw_typeIproc
    1043                 :             : !! NAME
    1044                 :             : !!  dfptlw_typeIproc
    1045                 :             : !!
    1046                 :             : !! FUNCTION
    1047                 :             : !!  Process type-I terms and convert them to type-II in
    1048                 :             : !!  the d3etot mixed (reduced/cartessian) coordinates.
    1049                 :             : !!
    1050                 :             : !! COPYRIGHT
    1051                 :             : !!  Copyright (C) 2022-2026 ABINIT group (MR)
    1052                 :             : !!  This file is distributed under the terms of the
    1053                 :             : !!  GNU General Public License, see ~abinit/COPYING
    1054                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
    1055                 :             : !!
    1056                 :             : !! INPUTS
    1057                 :             : !!  blkflg(3,mpert,3,mpert) = flags for each element of the 3DTE
    1058                 :             : !!  gprimd(3,3)=dimensional primitive translations for reciprocal space(bohr^-1)
    1059                 :             : !!  optgeom= if 1 do special treatment for the geometric term
    1060                 :             : !!  mpert =maximum number of ipert
    1061                 :             : !!  natom = number of atoms in unit cell
    1062                 :             : !!  rfpert(3,mpert,3,mpert,3,mpert) = array defining the type of perturbations
    1063                 :             : !!       that have to be computed
    1064                 :             : !!       1   ->   element has to be computed explicitely
    1065                 :             : !!      -1   ->   use symmetry operations to obtain the corresponding element
    1066                 :             : !!  rprimd(3,3)=dimensional primitive translations (bohr)
    1067                 :             : !!  t_typeI(2,3,mpert,3,3,3)= Input type-I tensor
    1068                 :             : !!
    1069                 :             : !! OUTPUT
    1070                 :             : !!  t_typeII(2,3,mpert,3,mpert,3,mpert)= type-II tensor converted to the mixed
    1071                 :             : !!       coordinates.
    1072                 :             : !!
    1073                 :             : !! SOURCE
    1074                 :             : 
    1075                 :          12 : subroutine dfptlw_typeIproc(blkflg,gprimd,optgeom,mpert,natom,rfpert,rprimd,t_typeI,&
    1076                 :           6 :  & t_typeII)
    1077                 :             : 
    1078                 :             :  use defs_basis
    1079                 :             :  use m_errors
    1080                 :             :  use m_profiling_abi
    1081                 :             :  use m_dynmat,      only : cart39
    1082                 :             : 
    1083                 :             : !Arguments ------------------------------------
    1084                 :             : !scalars
    1085                 :             :  integer,intent(in) :: mpert,natom,optgeom
    1086                 :             : !arrays
    1087                 :             :  integer,intent(in) :: blkflg(3,mpert,3,mpert,3,mpert)
    1088                 :             :  integer,intent(in) :: rfpert(3,mpert,3,mpert,3,mpert)
    1089                 :             :  real(dp),intent(in) :: gprimd(3,3),rprimd(3,3)
    1090                 :             :  real(dp),intent(inout) :: t_typeI(2,3,mpert,3,3,3)
    1091                 :             :  real(dp),intent(inout) :: t_typeII(2,3,mpert,3,mpert,3,mpert)
    1092                 :             : 
    1093                 :             : !Local variables-------------------------------
    1094                 :             : !scalar
    1095                 :             :  integer :: beta,delta,gamma,ii
    1096                 :             :  integer :: i1dir,i1pert,i2dir,i2pert,i3dir,i3pert,istr
    1097                 :             :  real(dp) :: fac
    1098                 :             : !arrays
    1099                 :             :  integer,save :: idx(18)=(/1,1,2,2,3,3,3,2,3,1,2,1,2,3,1,3,1,2/)
    1100                 :             :  integer :: flg1(3),flg2(3)
    1101                 :             :  real(dp) :: vec1(3),vec2(3)
    1102                 :             :  real(dp) :: rprimd_t(3,3),gprimd_t(3,3)
    1103                 :             : 
    1104                 :             : ! *************************************************************************
    1105                 :             : 
    1106                 :             :  DBG_ENTER("COLL")
    1107                 :             : 
    1108         [ +  + ]:           6 :  if (optgeom==1) then
    1109                 :             :    !Transform the metric perturbation direction
    1110                 :             :    !(treat it as an atomic displacement)
    1111         [ +  + ]:          12 :    flg1(:)=1
    1112         [ +  + ]:           9 :    do i1pert=1,natom
    1113         [ +  + ]:          27 :      do i1dir=1,3
    1114         [ +  + ]:          78 :        do gamma=1,3
    1115         [ +  + ]:         180 :          do ii=1,2
    1116         [ +  + ]:         486 :            do delta=1,3
    1117         [ +  + ]:        1296 :              do beta=1,3
    1118                 :        1296 :                vec1(beta)=t_typeI(ii,i1dir,i1pert,beta,delta,gamma)
    1119                 :             :              end do
    1120                 :         324 :              call cart39(flg1,flg2,gprimd,i1pert,natom,rprimd,vec1,vec2)
    1121         [ +  + ]:        1404 :              do beta=1,3
    1122                 :        1296 :                t_typeI(ii,i1dir,i1pert,beta,delta,gamma)=vec2(beta)
    1123                 :             :              end do
    1124                 :             :            end do
    1125                 :             :          end do
    1126                 :             :        end do
    1127                 :             :      end do
    1128                 :             :    end do
    1129                 :             : 
    1130                 :             :    !Transform the second q-gradient direction
    1131                 :             :    !(treat it as an electric field)
    1132         [ +  + ]:           9 :    do i1pert=1,natom
    1133         [ +  + ]:          27 :      do i1dir=1,3
    1134         [ +  + ]:          78 :        do gamma=1,3
    1135         [ +  + ]:         180 :          do ii=1,2
    1136         [ +  + ]:         486 :            do beta=1,3
    1137         [ +  + ]:        1296 :              do delta=1,3
    1138                 :        1296 :                vec1(delta)=t_typeI(ii,i1dir,i1pert,beta,delta,gamma)
    1139                 :             :              end do
    1140                 :         324 :              call cart39(flg1,flg2,gprimd,natom+2,natom,rprimd,vec1,vec2)
    1141         [ +  + ]:        1404 :              do delta=1,3
    1142                 :        1296 :                t_typeI(ii,i1dir,i1pert,beta,delta,gamma)=vec2(delta)
    1143                 :             :              end do
    1144                 :             :            end do
    1145                 :             :          end do
    1146                 :             :        end do
    1147                 :             :      end do
    1148                 :             :    end do
    1149                 :             : 
    1150                 :             :    !Transform the first q-gradient direction
    1151                 :             :    !(treat it as an electric field)
    1152         [ +  + ]:           9 :    do i1pert=1,natom
    1153         [ +  + ]:          27 :      do i1dir=1,3
    1154         [ +  + ]:          60 :        do ii=1,2
    1155         [ +  + ]:         162 :          do beta=1,3
    1156         [ +  + ]:         468 :            do delta=1,3
    1157         [ +  + ]:        1296 :              do gamma=1,3
    1158                 :        1296 :                vec1(gamma)=t_typeI(ii,i1dir,i1pert,beta,delta,gamma)
    1159                 :             :              end do
    1160                 :         324 :              call cart39(flg1,flg2,gprimd,natom+2,natom,rprimd,vec1,vec2)
    1161         [ +  + ]:        1404 :              do gamma=1,3
    1162                 :        1296 :                t_typeI(ii,i1dir,i1pert,beta,delta,gamma)=vec2(gamma)
    1163                 :             :              end do
    1164                 :             :            end do
    1165                 :             :          end do
    1166                 :             :        end do
    1167                 :             :      end do
    1168                 :             :    end do
    1169                 :             : 
    1170                 :             :  end if
    1171                 :             : 
    1172                 :           6 :  fac=two_pi ** 2
    1173                 :           6 :  i3pert= natom+8
    1174   [ +  +  +  + ]:          78 :  rprimd_t=transpose(rprimd)
    1175   [ +  +  +  + ]:          78 :  gprimd_t=transpose(gprimd)
    1176         [ +  + ]:          66 :  do i1pert = 1, mpert
    1177         [ +  + ]:         246 :    do i1dir = 1, 3
    1178   [ +  +  +  +  :      223440 :      if ((maxval(rfpert(i1dir,i1pert,:,:,:,:))==1)) then
          +  +  +  +  +  
                      + ]
    1179         [ +  + ]:         162 :        do i2pert = natom+3, natom+4
    1180         [ +  + ]:         486 :          do i2dir = 1, 3
    1181                 :         324 :            istr=(i2pert-natom-3)*3+i2dir
    1182                 :         324 :            beta=idx(2*istr-1); delta=idx(2*istr)
    1183         [ +  + ]:        1080 :            do ii=1,2
    1184                 :             : 
    1185                 :             :              !Transform into type-II
    1186         [ +  + ]:        2592 :              do i3dir=1,3
    1187                 :        1944 :                gamma=i3dir
    1188                 :             :                t_typeII(ii,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert)= &
    1189                 :             :              & t_typeI(ii,i1dir,i1pert,beta,delta,gamma) + &
    1190                 :             :              & t_typeI(ii,i1dir,i1pert,delta,gamma,beta) - &
    1191                 :        2592 :              & t_typeI(ii,i1dir,i1pert,gamma,beta,delta)
    1192                 :             :              end do ! i3dir
    1193                 :             : 
    1194                 :             :              !Transform i3dir into reduced coordinates
    1195         [ +  + ]:        2592 :              do i3dir=1,3
    1196                 :        1944 :                vec1(i3dir)=t_typeII(ii,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert)
    1197                 :        2592 :                flg1(i3dir)=blkflg(i1dir,i1pert,i2dir,i2pert,i3dir,i3pert)
    1198                 :             :              end do
    1199                 :         648 :              call cart39(flg1,flg2,rprimd_t,natom+2,natom,gprimd_t,vec1,vec2)
    1200         [ +  + ]:        2916 :              do i3dir=1,3
    1201                 :        2592 :                t_typeII(ii,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert)=vec2(i3dir)*fac
    1202                 :             :              end do
    1203                 :             : 
    1204                 :             :            end do ! ii
    1205                 :             :          end do ! i2dir
    1206                 :             :        end do ! i2pert
    1207                 :             :      end if ! rfpert
    1208                 :             :    end do ! i1dir
    1209                 :             :  end do ! i1pert
    1210                 :             : 
    1211                 :             :  DBG_EXIT("COLL")
    1212                 :             : 
    1213                 :           6 : end subroutine dfptlw_typeIproc
    1214                 :             : !!***
    1215                 :             : 
    1216                 :             : !!****f* ABINIT/m_dfptlw_loop/read_1eig
    1217                 :             : !! NAME
    1218                 :             : !!  read_1eig
    1219                 :             : !!
    1220                 :             : !! FUNCTION
    1221                 :             : !!
    1222                 :             : !!  Reads all the first-order energies from a given _1WF file.
    1223                 :             : !!  Data is read by the master and broadcasted.
    1224                 :             : !!
    1225                 :             : !! COPYRIGHT
    1226                 :             : !!  Copyright (C) 2022-2026 ABINIT group (MR)
    1227                 :             : !!  This file is distributed under the terms of the
    1228                 :             : !!  GNU General Public License, see ~abinit/COPYING
    1229                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
    1230                 :             : !!
    1231                 :             : !! INPUTS
    1232                 :             : !! formeig option (format of the eigenvalues and occupations) :
    1233                 :             : !!   0 => ground-state format
    1234                 :             : !!   1 => respfn format
    1235                 :             : !!  mband=maximum number of bands
    1236                 :             : !!  nkpt= number of k points
    1237                 :             : !!  nsppol=1 for unpolarized, 2 for spin-polarized
    1238                 :             : !!  wffnm=name (character data) of file for input wavefunctions.
    1239                 :             : !!
    1240                 :             : !! OUTPUT
    1241                 :             : !!  eigen(2*mband*mband*nkpt*nsppol)=matrix of eigenvalues
    1242                 :             : !!
    1243                 :             : !! SOURCE
    1244                 :             : 
    1245                 :         265 : subroutine read_1eig(eigen,formeig,mband,nkpt,nsppol,wffnm)
    1246                 :             : 
    1247                 :             : !Arguments ------------------------------------
    1248                 :             : !scalars
    1249                 :             :  integer,intent(in) :: formeig,mband,nkpt,nsppol
    1250                 :             :  character(len=*),intent(inout) :: wffnm
    1251                 :             : !arrays
    1252                 :             :  real(dp),intent(out) :: eigen((2*mband)**formeig*mband*nkpt*nsppol)
    1253                 :             : 
    1254                 :             : !Local variables-------------------------------
    1255                 :             : !scalar
    1256                 :             :  integer :: bd2tot,comm,ierr,ik_bz,iomode,isppol,master,my_rank
    1257         [ +  + ]:        1060 :  type(wfk_t) :: Wfk1
    1258                 :         265 :  type(hdr_type) :: hdr1
    1259                 :             :  character(len=500) :: msg
    1260                 :             : !arrays
    1261                 :         265 :  real(dp),allocatable :: eig_buffer(:)
    1262                 :             : 
    1263                 :             : ! *************************************************************************
    1264                 :             : 
    1265                 :             : DBG_ENTER("COLL")
    1266                 :             : 
    1267                 :         265 :  comm = xmpi_world
    1268                 :         265 :  master = 0
    1269                 :         265 :  my_rank = xmpi_comm_rank(comm)
    1270                 :             : 
    1271                 :             :  ! Master opens the 1WF file
    1272         [ +  - ]:         265 :  if (my_rank == master) then
    1273                 :         265 :    iomode = iomode_from_fname(wffnm)
    1274                 :             : 
    1275                 :             :    !Check that atdis file exists and open it
    1276         [ +  - ]:         265 :    if (.not. file_exists(wffnm)) then
    1277                 :             :      ! Trick needed to run Abinit test suite in netcdf mode.
    1278         [ +  - ]:         265 :      if (file_exists(nctk_ncify(wffnm))) then
    1279                 :         265 :        write(msg,"(3a)")"- File: ",trim(wffnm),&
    1280                 :         530 :        " does not exist but found netcdf file with similar name."
    1281                 :         265 :        call wrtout(std_out,msg,'COLL')
    1282   [ +  -  -  + ]:         530 :        wffnm = nctk_ncify(wffnm)
    1283                 :             :      end if
    1284         [ -  + ]:         265 :      if (.not. file_exists(wffnm)) then
    1285         [ #  # ]:           0 :        ABI_ERROR('Missing file: '//TRIM(wffnm))
    1286                 :             :      end if
    1287                 :             :    end if
    1288                 :         265 :    write(msg,'(a,a)')'-open 1wf file :',trim(wffnm)
    1289                 :         265 :    call wrtout(std_out,msg,'COLL')
    1290                 :             : 
    1291                 :         265 :    call wfk1%open_read(wffnm, formeig, iomode, get_unit(), xmpi_comm_self, Hdr_out=hdr1)
    1292                 :             :  end if
    1293                 :             : 
    1294                 :             :  ! Master Broadcasts the header to all procs in comm
    1295                 :         265 :  call hdr1%bcast(master, my_rank, comm)
    1296                 :             : 
    1297                 :             :  !Allocate buffer for MPI communicatio with max dimensions.
    1298   [ -  +  +  -  :         795 :  ABI_MALLOC(eig_buffer, ((2*mband)**formeig*mband*nsppol))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
    1299                 :             : 
    1300                 :         265 :  bd2tot = 0
    1301         [ +  + ]:         530 :  do isppol=1,nsppol
    1302         [ +  + ]:       30658 :    do ik_bz=1,hdr1%nkpt
    1303                 :             : 
    1304                 :             :      !Master reads and broadcasts
    1305         [ +  - ]:       30128 :      if (my_rank == master) then
    1306         [ +  + ]:       90384 :        call Wfk1%read_band_block([1,mband], ik_bz, isppol, xmpio_single, eig_k=eig_buffer)
    1307                 :             :      end if
    1308                 :             : 
    1309                 :       30128 :      call xmpi_bcast(eig_buffer, master, comm, ierr)
    1310                 :             : 
    1311         [ +  + ]:     1049008 :      eigen(1+bd2tot:2*mband**2+bd2tot)=eig_buffer(:)
    1312                 :             : 
    1313                 :             :      !Keep track of total number of bands
    1314                 :       60521 :      bd2tot = bd2tot + 2*mband**2
    1315                 :             :    end do
    1316                 :             :  end do
    1317                 :             : 
    1318         [ +  - ]:         265 :  if (my_rank == master) call Wfk1%close()
    1319                 :         265 :  call hdr1%free()
    1320                 :             : 
    1321         [ -  + ]:         265 :  ABI_FREE(eig_buffer)
    1322                 :             : 
    1323                 :             :  DBG_EXIT("COLL")
    1324                 :             : 
    1325   [ -  +  -  +  :         536 : end subroutine read_1eig
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
                      + ]
    1326                 :             : !!***
    1327                 :             : 
    1328                 :             : end module m_dfptlw_loop
    1329                 :             : !!***
        

Generated by: LCOV version 2.3-1