LCOV - code coverage report
Current view: top level - src/72_response - m_d2frnl.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 98.0 % 555 544
Test Date: 2026-11-09 11:14:24 Functions: 100.0 % 1 1
Branches: 66.5 % 1678 1116

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_d2frnl
       2                 :             : !! NAME
       3                 :             : !!  m_d2frnl
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !!
       7                 :             : !!
       8                 :             : !! COPYRIGHT
       9                 :             : !!  Copyright (C) 1998-2026 ABINIT group (DCA, XG, GM, AR, MB, MT, AM)
      10                 :             : !!  This file is distributed under the terms of the
      11                 :             : !!  GNU General Public License, see ~abinit/COPYING
      12                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
      13                 :             : !!
      14                 :             : !! SOURCE
      15                 :             : 
      16                 :             : #if defined HAVE_CONFIG_H
      17                 :             : #include "config.h"
      18                 :             : #endif
      19                 :             : 
      20                 :             : #include "abi_common.h"
      21                 :             : 
      22                 :             : ! nvtx related macro definition
      23                 :             : #include "nvtx_macros.h"
      24                 :             : 
      25                 :             : module m_d2frnl
      26                 :             : 
      27                 :             :  use defs_basis
      28                 :             :  use m_abicore
      29                 :             :  use m_xmpi
      30                 :             :  use m_mpinfo
      31                 :             :  use m_errors
      32                 :             :  use m_cgtools
      33                 :             :  use m_nctk
      34                 :             :  use m_hamiltonian
      35                 :             :  use m_efmas_defs
      36                 :             :  use m_wfk
      37                 :             :  use m_dtset
      38                 :             :  use m_dtfil
      39                 :             : 
      40                 :             : 
      41                 :             :  use defs_datatypes, only : pseudopotential_type
      42                 :             :  use defs_abitypes, only : MPI_type
      43                 :             :  use m_time,     only : timab
      44                 :             :  use m_geometry, only : metric, strconv
      45                 :             :  use m_efmas,    only : check_degeneracies
      46                 :             :  use m_io_tools, only : file_exists
      47                 :             :  use m_hdr,      only : hdr_skip
      48                 :             :  use m_pawang,   only : pawang_type
      49                 :             :  use m_pawrad,   only : pawrad_type
      50                 :             :  use m_pawtab,   only : pawtab_type,pawtab_get_lsize
      51                 :             :  use m_pawfgrtab,only : pawfgrtab_type, pawfgrtab_init, pawfgrtab_free
      52                 :             :  use m_paw_ij,   only : paw_ij_type, paw_ij_init, paw_ij_free, paw_ij_nullify, paw_ij_reset_flags
      53                 :             :  use m_pawrhoij, only : pawrhoij_type, pawrhoij_copy, pawrhoij_free, pawrhoij_gather, &
      54                 :             :                         pawrhoij_nullify, pawrhoij_symrhoij
      55                 :             :  use m_pawcprj,  only : pawcprj_type, pawcprj_alloc, pawcprj_get, pawcprj_copy, pawcprj_free
      56                 :             :  use m_pawdij,   only : pawdijfr
      57                 :             :  use m_paw_dfpt, only : pawgrnl
      58                 :             :  use m_kg,       only : mkkin, mkkpg
      59                 :             :  use m_mkffnl,   only : mkffnl
      60                 :             :  use m_nonlop,   only : nonlop
      61                 :             :  use m_paw_occupancies, only : pawaccrhoij
      62                 :             :  use m_gemm_nonlop_projectors, only : set_gemm_nonlop_ikpt, gemm_nonlop_use_gemm
      63                 :             : 
      64                 :             : #if defined(HAVE_GPU_MARKERS)
      65                 :             :  use m_nvtx_data
      66                 :             : #endif
      67                 :             : 
      68                 :             :  implicit none
      69                 :             : 
      70                 :             :  private
      71                 :             : !!***
      72                 :             : 
      73                 :             :  public :: d2frnl
      74                 :             : !!***
      75                 :             : 
      76                 :             : contains
      77                 :             : !!***
      78                 :             : 
      79                 :             : !!****f* ABINIT/d2frnl
      80                 :             : !! NAME
      81                 :             : !! d2frnl
      82                 :             : !!
      83                 :             : !! FUNCTION
      84                 :             : !! Compute the frozen-wavefunction non-local contribution for response functions
      85                 :             : !! (strain and/or phonon)
      86                 :             : !!
      87                 :             : !! INPUTS
      88                 :             : !!  cg(2,mpw*nspinor*mband*mkmem*nsppol)=<G|Cnk>=Fourier coefficients of WF
      89                 :             : !!  dtfil <type(datafiles_type)>=variables related to files
      90                 :             : !!  dtset <type(dataset_type)>=all input variables for this dataset
      91                 :             : !!  dyfr_cplex=1 if dyfrnl is real, 2 if it is complex
      92                 :             : !!  dyfr_nondiag=1 if dyfrnl is non diagonal with respect to atoms; 0 otherwise
      93                 :             : !!  eigen(mband*nkpt*nsppol)=array for holding eigenvalues (hartree)
      94                 :             : !!  gsqcut=Fourier cutoff on G^2 for "large sphere" of radius double that of the basis sphere
      95                 :             : !!  has_allddk= True if all ddk file are present on disk
      96                 :             : !!  indsym(4,nsym,natom)=indirect indexing array for atom labels
      97                 :             : !!  kg(3,mpw*mkmem)=work array for coordinates of G vectors in basis
      98                 :             : !!   primitive translations
      99                 :             : !!  mgfftf=maximum size of 1D FFTs for the fine FFT grid (PAW)
     100                 :             : !!  mpi_enreg=information about MPI parallelization
     101                 :             : !!  mpsang= 1+maximum angular momentum for nonlocal pseudopotentials
     102                 :             : !!  my_natom=number of atoms treated by current processor
     103                 :             : !!  natom=number of atoms in unit cell
     104                 :             : !!  nfftf= -PAW ONLY- number of FFT grid points for the fine grid
     105                 :             : !!         (nfftf=nfft for norm-conserving potential runs)
     106                 :             : !!  ngfft(18)=contain all needed information about 3D FFT,
     107                 :             : !!     see ~abinit/doc/variables/vargs.htm#ngfft
     108                 :             : !!  ngfftf(18)= -PAW ONLY- contain all needed information about 3D FFT for the fine grid
     109                 :             : !!              (ngs_rbzfftf=ngfft for norm-conserving potential runs)
     110                 :             : !!  npwarr(nkpt)=number of planewaves at each k point, and boundary
     111                 :             : !!  ntypat=integer specification of atom type (1, 2, ...)
     112                 :             : !!  occ(mband*nkpt*nsppol)=occupation numbers of bands (usually 2) at each k point
     113                 :             : !!  rfphon=1   if non local contribution of dynamical matrix have to be computed
     114                 :             : !!  rfstrs!=0  if non local contribution of elastic tensor have to be computed
     115                 :             : !!  paw_ij(my_natom*usepaw) <type(paw_ij_type)>=paw arrays given on (i,j) channels
     116                 :             : !!  pawang <type(pawang_type)>=paw angular mesh and related data
     117                 :             : !!  pawbec= flag for the computation of Born Effective Charge within PAW ; set to 1 if yes
     118                 :             : !!  pawpiezo= flag for the computation of piezoelectric tensor  within PAW ; set to 1 if yes
     119                 :             : !!  pawrad(ntypat*usepaw) <type(pawrad_type)>=paw radial mesh and related data
     120                 :             : !!  pawtab(ntypat) <type(pawtab_type)>=paw tabulated starting data
     121                 :             : !!  ph1d(2,3*(2*mgfft+1)*natom)=phase information related to structure factor
     122                 :             : !!  ph1df(2,3*(2*mgfftf+1)*natom)=phase information related to structure factor on the fine FFT grid (PAW)
     123                 :             : !!  psps <type(pseudopotential_type)>=variables related to pseudopotentials
     124                 :             : !!  rprimd(3,3)=dimensional real space primitive translations (bohr)
     125                 :             : !!  symrec(3,3,nsym)=symmetries in reciprocal space (dimensionless)
     126                 :             : !!  vtrial(nfftf,nspden)=total potential (Hartree+XC+loc)
     127                 :             : !!  vxc(nfftf,nspden)=XC potential
     128                 :             : !!  xred(3,natom)=reduced coordinates of atoms (dimensionless)
     129                 :             : !!  ylm(mpw*mkmem,mpsang*mpsang*useylm)= real spherical harmonics for each G and k point
     130                 :             : !!  ylmgr(mpw*mkmem,9,mpsang*mpsang*useylm)= gradients of real spherical harmonics for each G and k point
     131                 :             : !!
     132                 :             : !! OUTPUT
     133                 :             : !!  becfrnl(3,natom,3*pawbec)=NL frozen contribution to Born Effective Charges (PAW only)
     134                 :             : !!                            (3,natom) = derivative wr to the displ. of one atom in one direction
     135                 :             : !!                            (3)       = derivative wr to electric field in one direction
     136                 :             : !!  piezofrnl(3,6*pawpiezo)=NL frozen contribution to piezoelectric tensor (PAW only)
     137                 :             : !!  dyfrnl(dyfr_cplex,3,3,natom,1+(natom-1)*dyfr_nondiag)=
     138                 :             : !!         non-symmetrized non-local contribution to the dynamical matrix
     139                 :             : !!         If NCPP, it depends on one atom
     140                 :             : !!         If PAW,  it depends on two atoms
     141                 :             : !!  eltfrnl(6+3*natom,6)=non-symmetrized non-local contribution to the
     142                 :             : !!                    elastic tensor
     143                 :             : !!
     144                 :             : !! SIDE EFFECTS
     145                 :             : !!  ===== if psps%usepaw==1
     146                 :             : !!  pawfgrtab(my_natom*usepaw) <type(pawfgrtab_type)>=atomic data given on fine rectangular grid
     147                 :             : !!                          pawfgrtab(:)%gylmgr2 are deallocated here
     148                 :             : !!  pawrhoij(my_natom) <type(pawrhoij_type)>= paw rhoij occupancies and related data
     149                 :             : !!    (gradients of rhoij for each atom with respect to atomic positions are computed here)
     150                 :             : !!
     151                 :             : !! SOURCE
     152                 :             : 
     153                 :         488 : subroutine d2frnl(becfrnl,cg,dtfil,dtset,dyfrnl,dyfr_cplex,dyfr_nondiag,efmasdeg,efmasval,eigen,eltfrnl,&
     154                 :         488 : &          gsqcut,has_allddk,indsym,kg,mband_mem_rbz,mkmem_rbz,mgfftf,mpi_enreg,mpsang,my_natom,natom,nfftf,ngfft,ngfftf,npwarr,&
     155                 :         488 : &          occ,paw_ij,pawang,pawbec,pawfgrtab,pawpiezo,pawrad,pawrhoij,pawtab,ph1d,ph1df,piezofrnl,psps,&
     156                 :         488 : &          rprimd,rfphon,rfstrs,symrec,vtrial,vxc,xred,ylm,ylmgr)
     157                 :             : 
     158                 :             : !Arguments ------------------------------------
     159                 :             : !scalars
     160                 :             :  integer,intent(in) :: dyfr_cplex,dyfr_nondiag,mgfftf,mpsang,my_natom,natom
     161                 :             :  integer,intent(in) :: nfftf,pawbec,pawpiezo,rfphon,rfstrs
     162                 :             :  integer,intent(in) :: mkmem_rbz,mband_mem_rbz
     163                 :             :  real(dp),intent(in) :: gsqcut
     164                 :             :  type(MPI_type),intent(in) :: mpi_enreg
     165                 :             :  type(datafiles_type),intent(in) :: dtfil
     166                 :             :  type(dataset_type),intent(in) :: dtset
     167                 :             :  type(pawang_type),intent(in) :: pawang
     168                 :             :  type(pseudopotential_type),intent(in) :: psps
     169                 :             : !arrays
     170                 :             :  integer,intent(in) :: indsym(4,dtset%nsym,natom),kg(3,dtset%mpw*mkmem_rbz)
     171                 :             :  integer,intent(in) :: ngfft(18),ngfftf(18),npwarr(dtset%nkpt)
     172                 :             :  integer,intent(in) :: symrec(3,3,dtset%nsym)
     173                 :             :  real(dp),intent(in) :: cg(2,dtset%mpw*dtset%nspinor*mband_mem_rbz*mkmem_rbz*dtset%nsppol)
     174                 :             :  real(dp),intent(in) :: eigen(dtset%mband*dtset%nkpt*dtset%nsppol)
     175                 :             :  real(dp),intent(in) :: occ(dtset%mband*dtset%nkpt*dtset%nsppol)
     176                 :             :  real(dp),intent(in) :: ph1d(2,3*(2*dtset%mgfft+1)*natom)
     177                 :             :  real(dp),intent(in) :: ph1df(2,3*(2*mgfftf+1)*natom),rprimd(3,3)
     178                 :             :  real(dp),intent(in) :: vxc(nfftf,dtset%nspden),xred(3,natom)
     179                 :             :  real(dp),intent(in) :: ylm(dtset%mpw*mkmem_rbz,mpsang*mpsang*psps%useylm)
     180                 :             :  real(dp),intent(in) :: ylmgr(dtset%mpw*mkmem_rbz,9,mpsang*mpsang*psps%useylm)
     181                 :             :  real(dp),intent(in),target :: vtrial(nfftf,dtset%nspden)
     182                 :             :  real(dp),intent(out) :: becfrnl(3,natom,3*pawbec),piezofrnl(6,3*pawpiezo)
     183                 :             :  real(dp),intent(out) :: dyfrnl(dyfr_cplex,3,3,natom,1+(natom-1)*dyfr_nondiag)
     184                 :             :  real(dp),intent(out) :: eltfrnl(6+3*natom,6)
     185                 :             :  logical,intent(inout):: has_allddk
     186                 :             :  type(efmasdeg_type),allocatable,intent(out):: efmasdeg(:)
     187                 :             :  type(efmasval_type),allocatable,intent(out):: efmasval(:,:)
     188                 :             :  type(paw_ij_type),intent(in) :: paw_ij(my_natom)
     189                 :             :  type(pawfgrtab_type),intent(inout) :: pawfgrtab(my_natom*psps%usepaw)
     190                 :             :  type(pawrad_type),intent(in) :: pawrad(psps%ntypat)
     191                 :             :  type(pawrhoij_type),intent(inout),target :: pawrhoij(my_natom*psps%usepaw)
     192                 :             :  type(pawtab_type),intent(in) :: pawtab(psps%ntypat)
     193                 :             : 
     194                 :             : !Local variables-------------------------------
     195                 :             : !scalars
     196                 :             :  integer,parameter :: formeig1=1,usecprj=0
     197                 :             :  integer :: bandmin,bandmax,bdtot_index,bufdim
     198                 :             :  integer :: choice_bec2,choice_bec54,choice_efmas,choice_phon,choice_strs,choice_piez3,choice_piez55
     199                 :             :  integer :: cplex,cplx,cpopt,cpopt_bec,ddkcase,deg_dim
     200                 :             :  integer :: dimffnl,dimffnl_str,dimnhat,ia,iatom,iashift,iband,jband,ibg,icg,icplx,ideg,ider,idir
     201                 :             :  integer :: ider_str,idir_ffnl,idir_str,ielt,ieltx,ierr,ii,ikg,ikpt,ilm,ipw,iq,iq0
     202                 :             :  integer :: ispinor,isppol,istwf_k,isub,itypat,jj,jsub,klmn,master,me,mu
     203                 :             :  integer :: my_comm_atom,n1,n2,n3,nband_k,ncpgr,nfftot,ngrhoij,nkpg,nnlout_bec1,nnlout_bec2,nnlout_efmas
     204                 :             :  integer :: nnlout_piez1,nnlout_piez2,nnlout_phon,nnlout_strs,npw_,npw_k,nsp,nsploop,nu
     205                 :             :  integer :: optgr,optgr2,option,option_rhoij,optstr,optstr2,paw_opt,paw_opt_1,paw_opt_3,paw_opt_efmas
     206                 :             :  integer :: shift_rhoij,signs,signs_field,spaceworld,sz2,sz3,tim_nonlop
     207                 :             :  integer :: iband_, iband_me, jband_me, nband_me
     208                 :             :  real(dp) :: arg,enl,enlk,ucvol,wtk_k
     209                 :             :  logical :: has_ddk_file,need_becfr,need_efmas,need_piezofr,paral_atom,t_test
     210                 :             :  logical :: use_timerev,use_zeromag
     211                 :             :  character(len=500) :: msg
     212                 :         488 :  type(gs_hamiltonian_type) :: gs_ham
     213                 :             : !arrays
     214                 :             :  integer :: ik_ddk(3),ddkfil(3)
     215                 :         976 :  integer :: bands_treated_now(dtset%mband), band_procs(dtset%mband)
     216                 :             :  integer :: ndat,idat
     217                 :         488 :  integer,allocatable :: dimlmn(:),kg_k(:,:),l_size_atm(:)
     218                 :         488 :  integer,pointer :: my_atmtab(:)
     219                 :             :  real(dp) :: dotprod(2),dummy(0),gmet(3,3),gprimd(3,3),grhoij(3),kpoint(3),nonlop_dum(1,1)
     220                 :             :  real(dp) :: rmet(3,3),tsec(2)
     221                 :         488 :  complex(dp), allocatable :: ch2c_tmp(:)
     222                 :         488 :  real(dp),allocatable :: becfrnl_tmp(:,:,:),becfrnlk(:,:,:),becij(:,:,:,:,:),cg_left(:,:)
     223                 :         488 :  real(dp),allocatable :: occ_k(:),eig_k(:)
     224                 :         976 :  real(dp),allocatable :: cwavef(:,:),ddk(:,:,:),ddkinpw(:,:,:),dyfrnlk(:,:)
     225                 :         488 :  real(dp),allocatable :: elt_work(:,:),eltfrnlk(:,:),enlout_bec1(:),enlout_bec2(:),enlout_efmas(:)
     226                 :         488 :  real(dp),allocatable :: enlout_piez1(:),enlout_piez2(:),enlout_phon(:),enlout_strs(:)
     227                 :         488 :  real(dp),allocatable :: gh2c(:,:),gs2c(:,:)
     228                 :         488 :  real(dp),allocatable :: kpg_k(:,:),mpibuf(:),nhat_dum(:,:),piezofrnlk(:,:),ph3d(:,:,:)
     229                 :         488 :  real(dp),allocatable :: svectout(:,:),ylm_k(:,:),ylmgr_k(:,:,:)
     230                 :         488 :  real(dp),allocatable,target :: ffnl(:,:,:,:),ffnl_str(:,:,:,:,:)
     231                 :             :  character(len=fnlen) :: fiwfddk(3)
     232                 :         488 :  type(paw_ij_type),allocatable :: paw_ij_tmp(:)
     233                 :         488 :  type(pawcprj_type),allocatable,target :: cwaveprj(:,:)
     234                 :         488 :  type(pawfgrtab_type),allocatable :: pawfgrtab_tmp(:)
     235                 :         488 :  type(pawrhoij_type),pointer :: pawrhoij_tot(:)
     236   [ +  +  +  +  :       47824 :  type(wfk_t) :: ddkfiles(3)
          +  +  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  +  -  
             +  -  +  - ]
     237                 :             : ! *************************************************************************
     238                 :             : 
     239                 :             :  DBG_ENTER("COLL")
     240                 :             : 
     241                 :         488 :  call timab(159,1,tsec)
     242                 :             :  ABI_NVTX_START_RANGE(NVTX_D2FRNL)
     243                 :             : 
     244                 :         488 :  write(msg,'(3a)')ch10,' ==> Calculation of the frozen part of the second order derivatives, this can take some time...',ch10
     245                 :         488 :  call wrtout(std_out,msg,'COLL')
     246                 :             : 
     247                 :             : !Set up parallelism
     248                 :         488 :  spaceworld=mpi_enreg%comm_cell
     249                 :         488 :  me=mpi_enreg%me_kpt
     250                 :         488 :  master=0
     251                 :         488 :  paral_atom=(my_natom/=natom)
     252                 :         488 :  my_comm_atom=mpi_enreg%comm_atom
     253                 :         488 :  my_atmtab=>mpi_enreg%my_atmtab
     254                 :         488 :  ndat = dtset%bandpp
     255                 :             : 
     256                 :             : !Compute gmet, gprimd and ucvol from rprimd
     257                 :         488 :  call metric(gmet,gprimd,-1,rmet,rprimd,ucvol)
     258                 :             : 
     259                 :             : !If needed, check for ddk files (used for effective charges)
     260   [ +  +  -  + ]:         488 :  if (pawbec==1.or.pawpiezo==1) then
     261                 :          52 :    ddkfil(:)=0
     262         [ +  + ]:         208 :    do ii=1,3
     263                 :         156 :      ddkcase=ii+natom*3
     264                 :         156 :      call appdig(ddkcase,dtfil%fnamewffddk,fiwfddk(ii))
     265                 :         156 :      t_test = file_exists(fiwfddk(ii))
     266                 :             :      ! Trick needed to run Abinit test suite in netcdf mode.
     267   [ -  +  +  + ]:         156 :      if (.not. t_test .and. file_exists(nctk_ncify(fiwfddk(ii)))) then
     268                 :          81 :        t_test = .True.; fiwfddk(ii) = nctk_ncify(fiwfddk(ii))
     269         [ +  - ]:          81 :        write(msg,"(3a)")"- File: ",trim(fiwfddk(ii))," does not exist but found netcdf file with similar name."
     270                 :         237 :        call wrtout(std_out,msg,'COLL')
     271                 :             :      end if
     272                 :         133 :      if (t_test) ddkfil(ii)=20+ii ! Note the use of unit numbers 21, 22 and 23
     273                 :             :    end do
     274   [ +  +  +  + ]:         127 :    has_ddk_file=(any(ddkfil(:)>0))
     275   [ +  +  +  + ]:         133 :    has_allddk  =(all(ddkfil(:)>0))
     276                 :             :  else
     277                 :         436 :    has_ddk_file=.FALSE.
     278                 :         436 :    has_allddk  =.FALSE.
     279                 :             :  end if
     280                 :             : 
     281   [ +  +  -  +  :         488 :  if(pawbec==1.or.pawpiezo==1.and.has_ddk_file) then
                   -  - ]
     282         [ +  + ]:          52 :    if(.not.has_allddk) then
     283                 :          25 :      write(msg,'(5a)')ch10,&
     284                 :          25 : &     ' WARNING: All ddk perturbations are needed to compute',ch10,&
     285                 :          50 : &     ' the frozen part of Born effective charges and/or piezoelectric tensor.',ch10
     286                 :          25 :      call wrtout(std_out,msg,'COLL')
     287                 :             :    else
     288                 :          27 :      write(msg,'(5a)')ch10,&
     289                 :          27 : &     ' All ddk perturbations are available.',ch10,&
     290                 :          54 : &     ' The frozen part of Born effective charges and/or piezoelectric tensor will be computed',ch10
     291                 :          27 :      call wrtout(std_out,msg,'COLL')
     292                 :             :    end if
     293                 :             :  end if
     294                 :             : 
     295   [ +  +  +  + ]:         488 :  need_becfr=(pawbec==1.and.has_ddk_file)
     296   [ +  +  +  + ]:         488 :  need_piezofr=(pawpiezo==1.and.has_ddk_file)
     297                 :             : 
     298                 :             : !Initialization of frozen non local array
     299         [ +  + ]:         488 :  if(rfphon==1) then
     300   [ +  +  +  +  :       32659 :    dyfrnl(:,:,:,:,:)=zero
          +  +  +  +  +  
                      + ]
     301   [ -  +  +  -  :        1353 :    ABI_MALLOC(dyfrnlk,(6,natom))
          +  -  +  -  -  
                +  -  + ]
     302                 :             :  end if
     303         [ +  + ]:         488 :  if(rfstrs/=0)then
     304   [ +  +  +  + ]:        3283 :    eltfrnl(:,:)=zero;enl=zero
     305   [ +  -  -  +  :         185 :    ABI_MALLOC(eltfrnlk,(6+3*natom,6))
          +  -  +  -  +  
          -  +  -  -  +  
                   -  + ]
     306                 :             :  end if
     307         [ +  + ]:         488 :  if (need_becfr) then
     308   [ +  +  +  +  :         948 :    becfrnl(:,:,:)=zero
                   +  + ]
     309   [ -  +  +  -  :         108 :    ABI_MALLOC(becfrnlk,(3,natom,3))
          +  -  +  -  +  
             -  -  +  -  
                      + ]
     310                 :             :  end if
     311         [ +  + ]:         488 :  if (need_piezofr) then
     312   [ +  +  +  + ]:         396 :    piezofrnl(:,:)=zero
     313         [ -  + ]:          18 :    ABI_MALLOC(piezofrnlk,(6,3))
     314                 :             :  end if
     315                 :         488 :  need_efmas=dtset%efmas>0
     316   [ +  +  +  -  :         488 :  if(need_efmas.and.(rfphon==1.or.rfstrs/=0.or.need_becfr.or.need_piezofr)) then
             +  -  -  + ]
     317                 :           0 :    write(msg,'(5a)')ch10,&
     318                 :           0 : &   ' ERROR: Efmas calculation is incompatible with phonons, elastic tensor, Born effective charges,',ch10,&
     319                 :           0 : &   ' and piezoelectric tensor calculations. Please revise your input.',ch10
     320                 :           0 :    ABI_ERROR(msg)
     321                 :             :  end if
     322                 :             : 
     323   [ -  +  +  -  :        1464 :  ABI_MALLOC(eig_k,(ndat))
          +  -  +  -  -  
                +  -  + ]
     324   [ -  +  +  -  :         976 :  ABI_MALLOC(occ_k,(ndat))
             -  +  -  + ]
     325                 :             : 
     326                 :             : !Common initialization
     327                 :         488 :  bdtot_index=0;ibg=0;icg=0
     328         [ +  + ]:         488 :  nsploop=dtset%nsppol;if (dtset%nspden==4) nsploop=4
     329                 :         488 :  n1=ngfft(1) ; n2=ngfft(2) ; n3=ngfft(3)
     330                 :         488 :  nfftot=ngfftf(1)*ngfftf(2)*ngfftf(3)
     331                 :             : 
     332                 :             : !Common data for "nonlop" routine
     333                 :         488 :  tim_nonlop=6
     334         [ +  + ]:         976 :  signs=1 ; signs_field = 2 ; eig_k=zero ; idir=0
     335                 :             : ! ffnl are in cartesian coordinates for EFMAS (idir==4),
     336                 :             : ! in contrast to reduced coordinates for the other responses (idir==0).
     337         [ +  + ]:         488 :  idir_ffnl=0 ; if(need_efmas) idir_ffnl=4
     338                 :         488 :  choice_phon=0;choice_strs=0
     339         [ +  + ]:         488 :  if(rfphon==1)then
     340                 :         451 :    shift_rhoij=0
     341                 :         451 :    choice_phon=4
     342                 :         451 :    nnlout_phon=max(1,6*natom)
     343   [ -  +  +  -  :        1353 :    ABI_MALLOC(enlout_phon,(nnlout_phon*ndat))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     344                 :             :  end if
     345         [ +  + ]:         488 :  if(rfstrs/=0)then
     346                 :          37 :    shift_rhoij=6
     347                 :          37 :    choice_strs=6
     348                 :          37 :    nnlout_strs=6*(3*natom+6)
     349   [ -  +  +  -  :         111 :    ABI_MALLOC(enlout_strs,(nnlout_strs*ndat))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     350                 :             :  end if
     351         [ +  + ]:         488 :  if (psps%usepaw==0) then
     352                 :         430 :    paw_opt=0 ; cpopt=-1
     353                 :             :  else
     354                 :          58 :    paw_opt=2 ; cpopt=1+2*usecprj
     355                 :             :  end if
     356         [ +  + ]:         488 :  if(need_piezofr)then
     357                 :          18 :    choice_piez3  =  3
     358                 :          18 :    choice_piez55 = 55
     359                 :          18 :    nnlout_piez1  =  6
     360                 :          18 :    nnlout_piez2  = 36
     361                 :          18 :    paw_opt_1     = 1
     362                 :          18 :    paw_opt_3     = 3
     363   [ -  +  +  -  :          54 :    ABI_MALLOC(enlout_piez1,(nnlout_piez1*ndat))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     364   [ -  +  +  -  :          54 :    ABI_MALLOC(enlout_piez2,(nnlout_piez2*ndat))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     365                 :             :  end if
     366         [ +  + ]:         488 :  if (need_becfr) then
     367                 :          27 :    choice_bec2=2 ; choice_bec54=54
     368                 :          27 :    nnlout_bec1=max(1,3*natom) ; nnlout_bec2=max(1,18*natom);
     369                 :          27 :    paw_opt_1=1 ; paw_opt_3=3 ; cpopt_bec=-1
     370   [ -  +  +  -  :          81 :    ABI_MALLOC(enlout_bec1,(nnlout_bec1*ndat))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     371   [ -  +  +  -  :          81 :    ABI_MALLOC(enlout_bec2,(nnlout_bec2*ndat))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     372                 :             :  else
     373                 :         461 :    choice_bec2=0 ; choice_bec54=0
     374                 :         461 :    nnlout_bec1=0
     375                 :             :  end if
     376         [ +  + ]:         488 :  if(need_efmas) then
     377   [ -  +  -  + ]:          17 :    ABI_MALLOC(enlout_efmas,(0))
     378   [ -  +  +  -  :          75 :    ABI_MALLOC(efmasdeg,(dtset%nkpt))
          +  -  +  -  -  
          +  -  +  -  +  
             +  +  +  - ]
     379   [ -  +  +  -  :         430 :    ABI_MALLOC(efmasval,(dtset%mband,dtset%nkpt))
          -  +  +  -  +  
          -  +  -  -  +  
          -  +  -  +  +  
             +  +  +  +  
                      - ]
     380                 :             :  end if
     381                 :             : 
     382                 :             : !Initialize Hamiltonian (k-independent terms)
     383                 :             :  call gs_ham%init(psps,pawtab,dtset%nspinor,dtset%nsppol,dtset%nspden,natom,&
     384                 :             : & dtset%typat,xred,dtset%nfft,dtset%mgfft,dtset%ngfft,rprimd,dtset%nloalg,&
     385                 :             : & paw_ij=paw_ij,comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab,mpi_spintab=mpi_enreg%my_isppoltab,&
     386                 :         488 : & usecprj=usecprj,ph1d=ph1d,nucdipmom=dtset%nucdipmom,gpu_option=dtset%gpu_option)
     387                 :             : 
     388                 :             : !===== PAW specific section
     389         [ +  + ]:         488 :  if (psps%usepaw==1) then
     390                 :             : 
     391                 :             : !  Define several sizes & flags
     392                 :          58 :    ncpgr=0;ngrhoij=0
     393         [ +  + ]:          58 :    if(rfphon==1)then
     394                 :          45 :      ncpgr=3;ngrhoij=3
     395                 :             :    end if
     396   [ +  +  +  + ]:          58 :    if(rfphon==1.or.need_becfr)then
     397                 :          52 :      ncpgr=6;ngrhoij=6
     398                 :             :    end if
     399   [ +  +  +  - ]:          58 :    if(rfstrs/=0.and.rfphon==1)then
     400                 :          12 :      ncpgr=9;ngrhoij=9
     401                 :             :    end if
     402   [ +  +  +  + ]:          58 :    if(rfstrs/=0.or.need_piezofr)then
     403                 :          22 :      ncpgr=9;ngrhoij=9
     404                 :             :    end if
     405                 :             : 
     406                 :             : !  If PAW and Born Eff. Charges, one has to compute some additional data:
     407                 :             : !  For each atom and for electric field direction k:
     408                 :             : !  becij(k)=<Phi_i|r_k-R_k|Phi_j>-<tPhi_i|r_k-R_k|tPhi_j> + sij.R_k
     409         [ +  + ]:          58 :    if (need_becfr.or.need_piezofr) then
     410   [ -  +  +  -  :         162 :      ABI_MALLOC(becij,(gs_ham%dimekb1,gs_ham%dimekb2,dtset%nspinor**2,1,3))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  +  -  -  
                +  -  + ]
     411   [ +  +  +  +  :       11868 :      becij=zero
          +  +  +  +  +  
                      + ]
     412   [ +  +  +  -  :         123 :      ABI_MALLOC(paw_ij_tmp,(my_natom))
          +  -  +  +  -  
             +  -  +  +  
                      + ]
     413   [ +  +  +  -  :         123 :      ABI_MALLOC(pawfgrtab_tmp,(my_natom))
          +  -  +  +  -  
             +  -  +  +  
                      + ]
     414                 :          27 :      call paw_ij_nullify(paw_ij_tmp)
     415                 :          27 :      cplex=1;nsp=1 ! Force nsppol/nspden to 1 because Dij^(1) due to electric field is spin-independent
     416                 :             :      call paw_ij_init(paw_ij_tmp,cplex,dtset%nspinor,nsp,nsp,dtset%pawspnorb,natom,psps%ntypat,&
     417                 :          27 : &     dtset%typat,pawtab,has_dijfr=1,comm_atom=my_comm_atom,mpi_atmtab=my_atmtab )
     418                 :          27 :      call pawtab_get_lsize(pawtab,l_size_atm,my_natom,dtset%typat,mpi_atmtab=my_atmtab)
     419                 :             :      call pawfgrtab_init(pawfgrtab_tmp,1,l_size_atm,dtset%nspden,dtset%typat,&
     420                 :          27 : &     mpi_atmtab=my_atmtab,comm_atom=my_comm_atom)
     421         [ -  + ]:          27 :      ABI_FREE(l_size_atm)
     422         [ +  + ]:         108 :      do ii=1,3 ! Loop over direction of electric field
     423                 :          81 :        call paw_ij_reset_flags(paw_ij_tmp,all=.True.)
     424                 :             :        call pawdijfr(gprimd,ii,natom+2,my_natom,natom,nfftf,ngfftf,nsp,nsp,psps%ntypat,&
     425                 :             : &       0,paw_ij_tmp,pawang,pawfgrtab_tmp,pawrad,pawtab,cplex,&
     426                 :             : &       (/zero,zero,zero/),rprimd,ucvol,vtrial,vtrial,vxc,xred,&
     427                 :          81 : &       comm_atom=my_comm_atom, mpi_atmtab=my_atmtab ) ! vtrial not used here
     428         [ +  + ]:         189 :        do isppol=1,dtset%nspinor**2
     429                 :         162 :          call pawdij2e1kb(paw_ij_tmp(:),nsp,my_comm_atom,e1kbfr=becij(:,:,:,:,ii),mpi_atmtab=my_atmtab)
     430                 :             :        end do
     431                 :             :      end do
     432                 :          27 :      call paw_ij_free(paw_ij_tmp)
     433                 :          27 :      call pawfgrtab_free(pawfgrtab_tmp)
     434   [ +  -  +  +  :          69 :      ABI_FREE(paw_ij_tmp)
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
             -  +  -  + ]
     435   [ +  -  +  +  :          69 :      ABI_FREE(pawfgrtab_tmp)
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
                +  -  + ]
     436                 :             :    end if
     437                 :             : 
     438                 :             : !  PAW occupancies: need to communicate when paral atom is activated
     439         [ +  + ]:          58 :    if (paral_atom) then
     440   [ -  +  +  -  :         170 :      ABI_MALLOC(pawrhoij_tot,(natom))
          +  -  +  -  -  
             +  -  +  +  
                      + ]
     441                 :          26 :      call pawrhoij_nullify(pawrhoij_tot)
     442                 :          26 :      call pawrhoij_gather(pawrhoij,pawrhoij_tot,-1,my_comm_atom)
     443                 :             :    else
     444                 :          32 :      pawrhoij_tot => pawrhoij
     445                 :             :    end if
     446                 :             : 
     447                 :             : !  Projected WF (cprj) and PAW occupancies (& gradients)
     448   [ -  +  +  -  :         464 :    ABI_MALLOC(cwaveprj,(natom,dtset%nspinor*ndat))
          -  +  +  -  +  
          -  +  -  -  +  
          -  +  -  +  +  
                +  +  + ]
     449                 :          58 :    call pawcprj_alloc(cwaveprj,ncpgr,gs_ham%dimcprj)
     450         [ +  + ]:         220 :    do iatom=1,natom
     451                 :         162 :      sz2=pawrhoij_tot(iatom)%cplex_rhoij*pawrhoij_tot(iatom)%qphase*pawrhoij_tot(iatom)%lmn2_size
     452                 :         162 :      sz3=pawrhoij_tot(iatom)%nspden
     453   [ +  +  +  -  :         810 :      ABI_MALLOC(pawrhoij_tot(iatom)%grhoij,(ngrhoij,sz2,sz3))
          -  +  +  -  -  
          +  +  -  +  -  
          +  +  -  +  -  
                +  -  + ]
     454                 :         162 :      pawrhoij_tot(iatom)%ngrhoij=ngrhoij
     455   [ +  +  +  +  :       66114 :      pawrhoij_tot(iatom)%grhoij=zero
                   +  + ]
     456                 :             :    end do
     457                 :          58 :    use_timerev=(dtset%kptopt>0.and.dtset%kptopt<3)
     458   [ +  +  -  + ]:         112 :    use_zeromag=(pawrhoij_tot(1)%nspden==4.and.dtset%nspden==1)
     459                 :             : 
     460                 :             :  else
     461   [ -  +  -  + ]:         430 :    ABI_MALLOC(cwaveprj,(0,0))
     462                 :             :  end if !PAW
     463                 :             : 
     464                 :             : !If needed, manage ddk files
     465                 :             : !Open ddk WF file(s) in sequential mode
     466         [ +  + ]:         488 :  if (need_becfr.or.need_piezofr) then
     467         [ +  + ]:         108 :    do ii=1,3 ! Loop over elect. field directions
     468         [ +  - ]:         108 :      if (ddkfil(ii)/=0) then
     469         [ +  - ]:          81 :        write(msg, '(a,a)') '-open ddk wf file :',trim(fiwfddk(ii))
     470         [ +  + ]:         243 :        call wrtout([std_out, ab_out], msg)
     471                 :          81 :        call ddkfiles(ii)%open_read(fiwfddk(ii),formeig1,dtset%iomode,ddkfil(ii), xmpi_comm_self)
     472                 :             :      end if
     473                 :             :    end do
     474                 :             :  end if
     475                 :             : 
     476                 :             : !LOOP OVER SPINS
     477         [ +  + ]:        1012 :  do isppol=1,dtset%nsppol
     478                 :             : 
     479                 :             : !  Continue to initialize the Hamiltonian (PAW DIJ coefficients)
     480                 :         524 :    call gs_ham%load_spin(isppol,with_nonlocal=.true.)
     481                 :             : 
     482                 :             : !  Rewind (k+G) data if needed
     483                 :         524 :    ikg=0
     484                 :             : 
     485                 :             : !  Loop over k points
     486         [ +  + ]:       43579 :    do ikpt=1,dtset%nkpt
     487                 :       42567 :      nband_k=dtset%nband(ikpt+(isppol-1)*dtset%nkpt)
     488                 :       42567 :      nband_me = proc_distrb_nband(mpi_enreg%proc_distrb,ikpt,nband_k,isppol,me)
     489                 :             :      call proc_distrb_band(band_procs,mpi_enreg%proc_distrb,ikpt,isppol,dtset%mband,&
     490                 :       42567 : &      mpi_enreg%me_band,mpi_enreg%me_kpt,mpi_enreg%comm_band)
     491                 :             : 
     492                 :       42567 :      istwf_k=dtset%istwfk(ikpt)
     493                 :       42567 :      npw_k=npwarr(ikpt)
     494                 :       42567 :      wtk_k=dtset%wtk(ikpt)
     495         [ +  + ]:      170268 :      kpoint(:)=dtset%kptns(:,ikpt)
     496                 :             : 
     497                 :             : !    Skip this k-point if not the proper processor
     498         [ +  + ]:       42567 :      if(proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,1,nband_k,isppol,me)) then
     499                 :       10944 :        bdtot_index=bdtot_index+nband_k
     500                 :       10944 :        cycle
     501                 :             :      end if
     502                 :             :      ABI_NVTX_START_RANGE(NVTX_D2FRNL_KPT)
     503                 :             : 
     504                 :             : !    If needed, manage ddk files
     505         [ +  + ]:       31623 :      if (need_becfr.or.need_piezofr) then
     506         [ +  + ]:        3712 :        do ii=1,3 ! Loop over elect. field directions
     507         [ +  - ]:        3712 :          if (ddkfil(ii)/=0)then
     508                 :             : !        Number of k points to skip in the full set of k pointsp
     509                 :        2784 :            ik_ddk(ii) = ddkfiles(ii)%findk(kpoint)
     510         [ -  + ]:        2784 :            ABI_CHECK(ik_ddk(ii) /= -1, "Cannot find k-point in DDK")
     511                 :        2784 :            npw_ = ddkfiles(ii)%hdr%npwarr(ik_ddk(ii))
     512         [ -  + ]:        2784 :            if (npw_/=npw_k) then
     513                 :             :              write(msg, '(a,i0,a,i0,a,i0,a,a,i0,a,a,i0)')&
     514                 :           0 :              'For isppol = ',isppol,', ikpt = ',ikpt,' and idir = ',ii,ch10,&
     515                 :           0 :              'the number of plane waves in the ddk file is equal to', npw_,ch10,&
     516                 :           0 :              'while it should be ',npw_k
     517                 :           0 :              ABI_ERROR(msg)
     518                 :             :            end if
     519                 :             : 
     520                 :             :          end if
     521                 :             :        end do
     522                 :             :      end if
     523                 :             : 
     524   [ -  +  +  -  :       94869 :      ABI_MALLOC(cwavef,(2,npw_k*dtset%nspinor*ndat))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     525         [ +  + ]:       31623 :      if (need_becfr.or.need_piezofr) then
     526   [ -  +  +  -  :        1856 :        ABI_MALLOC(svectout,(2,npw_k*dtset%nspinor*ndat))
          -  +  -  +  -  
                      + ]
     527                 :             :      end if
     528         [ +  + ]:       31623 :      if (need_efmas) then
     529   [ -  +  +  -  :          72 :        ABI_MALLOC(cg_left,(2,npw_k*dtset%nspinor))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     530   [ -  +  +  -  :          48 :        ABI_MALLOC(gh2c,(2,npw_k*dtset%nspinor))
          -  +  -  +  -  
                      + ]
     531   [ -  +  +  -  :          48 :        ABI_MALLOC(gs2c,(2,npw_k*dtset%nspinor))
          -  +  -  +  -  
                      + ]
     532                 :             :      end if
     533                 :             : 
     534   [ -  +  +  -  :      126492 :      ABI_MALLOC(ylm_k,(npw_k,mpsang*mpsang*psps%useylm))
          +  +  +  -  +  
          -  +  +  -  +  
             -  +  -  + ]
     535   [ +  +  +  +  :       31623 :      if(rfstrs/=0.or.need_becfr.or.need_piezofr.or.need_efmas)then
                   +  + ]
     536   [ -  +  +  -  :       26272 :        ABI_MALLOC(ylmgr_k,(npw_k,9,mpsang*mpsang*psps%useylm))
          +  +  +  -  +  
          -  +  +  -  +  
             -  +  -  + ]
     537                 :             :      else
     538   [ -  +  -  + ]:       25055 :        ABI_MALLOC(ylmgr_k,(0,0,0))
     539                 :             :      end if
     540                 :             : 
     541   [ -  +  +  -  :       94869 :      ABI_MALLOC(kg_k,(3,npw_k))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     542   [ +  +  +  + ]:    19068583 :      kg_k(:,:) = 0
     543                 :             : !$OMP PARALLEL DO
     544         [ +  + ]:     4790863 :      do ipw=1,npw_k
     545                 :     4759240 :        kg_k(1,ipw)=kg(1,ipw+ikg)
     546                 :     4759240 :        kg_k(2,ipw)=kg(2,ipw+ikg)
     547                 :     4790863 :        kg_k(3,ipw)=kg(3,ipw+ikg)
     548                 :             :      end do
     549         [ +  + ]:       31623 :      if (psps%useylm==1) then
     550                 :             : !SOMP PARALLEL DO COLLAPSE(2)
     551         [ +  + ]:       57480 :        do ilm=1,mpsang*mpsang
     552         [ +  + ]:     6751372 :          do ipw=1,npw_k
     553                 :     6745718 :            ylm_k(ipw,ilm)=ylm(ipw+ikg,ilm)
     554                 :             :          end do
     555                 :             :        end do
     556   [ +  +  +  +  :        5654 :        if(rfstrs/=0.or.need_becfr.or.need_piezofr.or.need_efmas)then
                   +  + ]
     557                 :             : !SOMP PARALLEL DO COLLAPSE(3)
     558         [ +  + ]:        9410 :          do ilm=1,mpsang*mpsang
     559         [ +  + ]:       85594 :            do ii=1,9
     560         [ +  + ]:     8434829 :              do ipw=1,npw_k
     561                 :     8426835 :                ylmgr_k(ipw,ii,ilm)=ylmgr(ipw+ikg,ii,ilm)
     562                 :             :              end do
     563                 :             :            end do
     564                 :             :          end do
     565                 :             :        end if
     566                 :             :      end if
     567                 :             : 
     568         [ -  + ]:       31623 :      cplex=2;if (istwf_k>1) cplex=1
     569                 :             : 
     570                 :             : !    Compute (k+G) vectors (only if useylm=1)
     571                 :       31623 :      nkpg=0
     572   [ +  +  +  +  :       31623 :      if (rfstrs/=0.or.need_efmas.or.pawpiezo==1) nkpg=3*dtset%nloalg(3)
                   +  + ]
     573   [ -  +  +  -  :      126492 :      ABI_MALLOC(kpg_k,(npw_k,nkpg))
          +  +  +  -  +  
          -  +  +  -  +  
             -  +  -  + ]
     574         [ +  + ]:       31623 :      if (nkpg>0) then
     575                 :         586 :        call mkkpg(kg_k,kpg_k,kpoint,nkpg,npw_k)
     576                 :             :      end if
     577                 :             : 
     578                 :             :      !EFMAS: Compute second order derivatives w/r to k for all direction for this k-point.
     579         [ +  + ]:       31623 :      if (need_efmas) then
     580   [ -  +  +  -  :          96 :        ABI_MALLOC(ddkinpw,(npw_k,3,3))
          +  -  +  -  +  
          -  -  +  -  +  
                   -  + ]
     581         [ +  + ]:          96 :        do mu=1,3
     582         [ +  + ]:         312 :          do nu=1,3
     583                 :             : !           call d2kpg(ddkinpw(:,mu,nu),dtset%ecut,dtset%ecutsm,dtset%effmass_free,gmet,mu,nu,kg_k,kpoint,npw_k)
     584                 :         288 :            call mkkin(dtset%ecut,dtset%ecutsm,dtset%effmass_free,gmet,kg_k,ddkinpw(:,mu,nu),kpoint,npw_k,mu,nu)
     585                 :             :          end do
     586                 :             :        end do
     587                 :             :      end if
     588                 :             : 
     589                 :             : !    Compute nonlocal form factors ffnl at all (k+G):
     590                 :       31623 :      ider=0;dimffnl=1;
     591         [ +  + ]:       31623 :      if(need_becfr) then
     592                 :         928 :        ider=1;dimffnl=4
     593                 :             :      end if
     594   [ +  +  +  + ]:       31623 :      if(rfstrs/=0.or.need_piezofr.or.need_efmas)then
     595                 :        6136 :        ider=2;dimffnl=3+7*psps%useylm
     596                 :             :      end if
     597   [ -  +  +  -  :      189738 :      ABI_MALLOC(ffnl,(npw_k,dimffnl,psps%lmnmax,psps%ntypat))
          -  +  +  -  -  
          +  +  -  -  +  
          +  -  +  -  +  
          -  -  +  -  +  
                   -  + ]
     598                 :             :      call mkffnl(psps%dimekb,dimffnl,psps%ekb,ffnl,psps%ffspl,&
     599                 :             : &     gmet,gprimd,ider,idir_ffnl,psps%indlmn,kg_k,kpg_k,kpoint,psps%lmnmax,&
     600                 :             : &     psps%lnmax,psps%mpsang,psps%mqgrid_ff,nkpg,npw_k,&
     601                 :       31623 : &     psps%ntypat,psps%pspso,psps%qgrid_ff,rmet,psps%usepaw,psps%useylm,ylm_k,ylmgr_k)
     602                 :             : #ifdef HAVE_OPENMP_OFFLOAD
     603                 :             :      !$OMP TARGET ENTER DATA MAP(to:ffnl) IF(dtset%gpu_option==ABI_GPU_OPENMP)
     604                 :             : #endif
     605                 :             : 
     606                 :             : !    For piezoelectric tensor need additional ffnl derivatives
     607         [ +  + ]:       31623 :      if(need_piezofr)then
     608                 :         496 :        ider_str=1 ; dimffnl_str=2
     609   [ -  +  +  -  :        3472 :        ABI_MALLOC(ffnl_str,(npw_k,dimffnl_str,psps%lmnmax,psps%ntypat,6))
          +  -  -  +  +  
          -  -  +  +  -  
          +  -  +  -  +  
          -  -  +  -  +  
                   -  + ]
     610         [ +  + ]:        3472 :        do mu=1,6 !loop over strain
     611                 :        2976 :          idir_str=-mu
     612                 :             :          call mkffnl(psps%dimekb,dimffnl_str,psps%ekb,ffnl_str(:,:,:,:,mu),&
     613                 :             : &         psps%ffspl,gmet,gprimd,ider_str,idir_str,psps%indlmn,kg_k,kpg_k,&
     614                 :             : &         kpoint,psps%lmnmax,psps%lnmax,psps%mpsang,psps%mqgrid_ff,nkpg,npw_k,&
     615                 :        3472 : &         psps%ntypat,psps%pspso,psps%qgrid_ff,rmet,psps%usepaw,psps%useylm,ylm_k,ylmgr_k)
     616                 :             :        end do
     617                 :             : #ifdef HAVE_OPENMP_OFFLOAD
     618                 :             :        !$OMP TARGET ENTER DATA MAP(to:ffnl_str) IF(dtset%gpu_option==ABI_GPU_OPENMP)
     619                 :             : #endif
     620                 :             :      end if
     621                 :             : 
     622                 :             : !    Load k-dependent part in the Hamiltonian datastructure
     623   [ -  +  +  -  :      126492 :      ABI_MALLOC(ph3d,(2,npw_k,gs_ham%matblk))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     624                 :             :      call gs_ham%load_k(kpt_k=kpoint,npw_k=npw_k,istwf_k=istwf_k,&
     625                 :       31623 : &     kg_k=kg_k,kpg_k=kpg_k,ffnl_k=ffnl,ph3d_k=ph3d,compute_ph3d=.true.)
     626                 :             : #ifdef HAVE_OPENMP_OFFLOAD
     627                 :             :      !$OMP TARGET ENTER DATA MAP(to:ph3d) IF(dtset%gpu_option==ABI_GPU_OPENMP)
     628                 :             : #endif
     629                 :             : 
     630                 :             : 
     631                 :             :      ! Setup gemm_nonlop
     632         [ -  + ]:       31623 :      if (gemm_nonlop_use_gemm) then
     633                 :             :        call set_gemm_nonlop_ikpt(ikpt,gs_ham%npw_fft_k,gs_ham%istwf_k,gs_ham%indlmn,&
     634                 :           0 :        &    gs_ham%ntypat,gs_ham%nattyp,gs_ham%gpu_option)
     635                 :             :      end if ! gemm_nonlop_use_gemm
     636                 :             : 
     637                 :             : 
     638                 :             : 
     639                 :             : !    Initialize contributions from current k point
     640   [ +  +  +  +  :      340799 :      if(rfphon==1) dyfrnlk(:,:)=zero
                   +  + ]
     641         [ +  + ]:       31623 :      if(rfstrs/=0)then
     642   [ +  +  +  + ]:      386576 :        enlk=zero;eltfrnlk(:,:)=zero
     643                 :             :      end if
     644   [ +  +  +  +  :       57447 :      if (need_becfr) becfrnlk(:,:,:)=zero
             +  +  +  + ]
     645   [ +  +  +  +  :       42039 :      if (need_piezofr) piezofrnlk(:,:)=zero
                   +  + ]
     646         [ +  + ]:       31623 :      if(need_efmas) then
     647                 :             :        call check_degeneracies(efmasdeg(ikpt),dtset%efmas_bands(:,ikpt),nband_k,eigen(bdtot_index+1:bdtot_index+nband_k), &
     648                 :          24 : &       dtset%efmas_deg_tol)
     649         [ +  + ]:         208 :        do ideg=1,efmasdeg(ikpt)%ndegs
     650   [ +  +  +  + ]:         208 :          if( efmasdeg(ikpt)%deg_range(1) <= ideg .and. ideg <= efmasdeg(ikpt)%deg_range(2) ) then
     651                 :          42 :            deg_dim=efmasdeg(ikpt)%degs_bounds(2,ideg) - efmasdeg(ikpt)%degs_bounds(1,ideg) + 1
     652   [ -  +  +  -  :         168 :            ABI_MALLOC(efmasval(ideg,ikpt)%ch2c,(3,3,deg_dim,deg_dim))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     653   [ -  +  +  -  :         126 :            ABI_MALLOC(efmasval(ideg,ikpt)%eig2_diag,(3,3,deg_dim,deg_dim))
          -  +  +  -  -  
             +  -  +  -  
                      + ]
     654   [ +  +  +  +  :        2734 :            efmasval(ideg,ikpt)%ch2c=zero
             +  +  +  + ]
     655   [ +  +  +  +  :        2734 :            efmasval(ideg,ikpt)%eig2_diag=zero
             +  +  +  + ]
     656                 :             :          else
     657   [ -  +  -  + ]:         142 :            ABI_MALLOC(efmasval(ideg,ikpt)%ch2c,(0,0,0,0))
     658   [ -  +  -  + ]:         142 :            ABI_MALLOC(efmasval(ideg,ikpt)%eig2_diag,(0,0,0,0))
     659                 :             :          end if
     660                 :             :        end do
     661                 :             :      end if
     662                 :             : 
     663                 :             : !    Loop over bands
     664                 :       31623 :      iband_me = 0
     665   [ -  +  -  -  :      210795 :      do iband=1,nband_k,ndat
             -  +  +  + ]
     666                 :             : 
     667         [ +  + ]:      179172 :        if (proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,iband,iband,isppol,me)) cycle
     668                 :      179028 :        iband_me = iband_me + ndat
     669                 :             : 
     670         [ +  + ]:      358056 :        occ_k(1:ndat)=occ(iband+bdtot_index:iband+bdtot_index+ndat-1)
     671                 :             :        cwavef(:,1:npw_k*dtset%nspinor*ndat) = cg(:,1+(iband_me-ndat)*npw_k*dtset%nspinor+icg: &
     672   [ +  +  +  + ]:   122288841 : &                                                iband_me   *npw_k*dtset%nspinor+icg)
     673                 :             : 
     674                 :             : !      Compute non-local contributions from n,k
     675   [ +  +  +  + ]:      193972 :        if (psps%usepaw==1) eig_k(1:ndat)=eigen(iband+bdtot_index:iband+bdtot_index+ndat-1)
     676                 :             : 
     677                 :             : !      === Dynamical matrix
     678         [ +  + ]:      179028 :        if(rfphon==1) then
     679                 :             :          call nonlop(choice_phon,cpopt,cwaveprj,enlout_phon,gs_ham,idir,eig_k,mpi_enreg,ndat,&
     680                 :      162050 : &         nnlout_phon,paw_opt,signs,nonlop_dum,tim_nonlop,cwavef,cwavef)
     681                 :             : !        Accumulate non-local contributions from n,k
     682         [ +  + ]:      324100 :          do idat=1,ndat
     683                 :             :            dyfrnlk(:,:) = dyfrnlk(:,:) &
     684   [ +  +  +  +  :     2490222 : &             + occ_k(idat) * reshape(enlout_phon(1+(idat-1)*nnlout_phon:idat*nnlout_phon),(/6,natom/))
                   +  + ]
     685                 :             :          end do
     686                 :             :        end if
     687                 :             : 
     688                 :             : !      === Elastic tensor
     689         [ +  + ]:      179028 :        if(rfstrs/=0) then
     690                 :             :          call nonlop(choice_strs,cpopt,cwaveprj,enlout_strs,gs_ham,idir,(/eig_k/),mpi_enreg,ndat,&
     691   [ -  +  +  +  :       70296 : &           nnlout_strs,paw_opt,signs,nonlop_dum,tim_nonlop,cwavef,cwavef)
             +  -  +  + ]
     692                 :             : !        Accumulate non-local contribut ions from n,k
     693         [ +  + ]:       46864 :          do idat=1,ndat
     694                 :             :            eltfrnlk(:,:) = eltfrnlk(:,:) &
     695   [ +  +  +  +  :     1699088 : &             + occ_k(idat) * reshape(enlout_strs(1+(idat-1)*nnlout_strs:idat*nnlout_strs),(/3*natom+6,6/))
                   +  + ]
     696                 :             :          end do
     697                 :             :        end if !endo if strs
     698                 :             : 
     699                 :             : !      PAW: accumulate gradients of rhoij
     700                 :             :        !EFMAS: Bug with efmas currently; to be looked into...
     701   [ +  +  +  + ]:      179028 :        if (psps%usepaw==1.and.(.not.need_efmas)) then
     702         [ +  + ]:       29536 :          do idat=1,ndat
     703                 :             :            call pawaccrhoij(gs_ham%atindx,cplex,cwaveprj(:,1+(idat-1)*dtset%nspinor:idat*dtset%nspinor),cwaveprj(:,1+(idat-1)*dtset%nspinor:idat*dtset%nspinor),0,isppol,natom,&
     704         [ -  + ]:       29536 : &           natom,dtset%nspinor,occ_k(idat),3,pawrhoij_tot,use_timerev,use_zeromag,wtk_k)
     705                 :             :          end do
     706                 :             :        end if
     707                 :             : 
     708                 :             : !      PAW: Compute frozen contribution to piezo electric tensor
     709         [ +  + ]:      179028 :        if (need_piezofr) then
     710         [ +  + ]:       10304 :          do ii=1,3 ! Loop over elect. field directions
     711                 :             :            call nonlop(choice_piez3,cpopt,cwaveprj,enlout_piez1,gs_ham,0,(/zero/),mpi_enreg,ndat,&
     712                 :        7728 : &              nnlout_piez1,paw_opt_1,signs,nonlop_dum,tim_nonlop,cwavef,cwavef,enl=becij(:,:,:,:,ii))
     713         [ +  + ]:       18032 :            do idat=1,ndat
     714                 :             :              piezofrnlk(:,ii) = piezofrnlk(:,ii) &
     715         [ +  + ]:       61824 : &               + occ_k(idat) * enlout_piez1(1+(idat-1)*nnlout_piez1:idat*nnlout_piez1)
     716                 :             :            end do
     717                 :             :          end do !end do ii
     718                 :             :        end if
     719                 :             : 
     720                 :             : !      PAW: Compute frozen contribution to Born Effective Charges
     721         [ +  + ]:      179028 :        if (need_becfr) then
     722         [ +  + ]:       17920 :          do ii=1,3 ! Loop over elect. field directions
     723                 :             :            call nonlop(choice_bec2,cpopt,cwaveprj,enlout_bec1,gs_ham,0,(/zero/),mpi_enreg,ndat,&
     724                 :       13440 : &              nnlout_bec1,paw_opt_1,signs,nonlop_dum,tim_nonlop,cwavef,cwavef,enl=becij(:,:,:,:,ii))
     725         [ +  + ]:       31360 :            do idat=1,ndat
     726                 :             :              becfrnlk(:,:,ii) = becfrnlk(:,:,ii) &
     727   [ +  +  +  +  :      168960 : &                 + occ_k(idat) * reshape(enlout_bec1(1+(idat-1)*nnlout_bec1:idat*nnlout_bec1),(/3,natom/))
                   +  + ]
     728                 :             :            end do
     729                 :             :          end do !end do ii
     730                 :             :        end if
     731                 :             : 
     732         [ +  + ]:      179028 :        if (need_becfr.or.need_piezofr) then
     733         [ +  + ]:       17920 :          do ii=1,3 ! Loop over elect. field directions
     734                 :             : !          Not able to compute if ipert=(Elect. field) and no ddk WF file
     735         [ -  + ]:       13440 :            if (ddkfil(ii)==0) cycle
     736                 :             : !            Read ddk wave function
     737   [ -  +  +  -  :       53760 :            ABI_MALLOC(ddk,(2,npw_k*dtset%nspinor,ndat))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     738                 :             :            if (ddkfil(ii)/=0) then
     739         [ +  + ]:       26880 :              do idat=1,ndat
     740                 :       13440 :                call ddkfiles(ii)%read_bks(iband+(idat-1), ik_ddk(ii), isppol, xmpio_single, cg_bks=ddk(:,:,idat))
     741                 :             :   !            Multiply ddk by +i
     742         [ +  + ]:     1739136 :                do jj=1,npw_k*dtset%nspinor
     743                 :     1712256 :                  arg=ddk(1,jj,idat)
     744                 :     1725696 :                  ddk(1,jj,idat)=-ddk(2,jj,idat);ddk(2,jj,idat)=arg
     745                 :             :                end do
     746                 :             :              end do
     747                 :             :            else
     748                 :             :              ddk=zero
     749                 :             :            end if
     750                 :             : 
     751         [ +  - ]:       13440 :            if(need_becfr)then
     752         [ +  + ]:       53760 :              do mu=1,3 !loop over atom direction
     753         [ +  + ]:      140160 :                do iatom=1,natom !Loop over atom
     754                 :       86400 :                  ia=gs_ham%atindx(iatom)
     755                 :             :                  call nonlop(choice_bec2,cpopt_bec,cwaveprj,enlout_bec1,gs_ham,mu,(/zero/),&
     756                 :             : &                    mpi_enreg,ndat,nnlout_bec1,paw_opt_3,signs_field,svectout,tim_nonlop,&
     757                 :       86400 : &                    cwavef,cwavef,iatom_only=iatom)
     758         [ +  + ]:      213120 :                  do idat=1,ndat
     759                 :             :                    call dotprod_g(dotprod(1),dotprod(2),istwf_k,npw_k*dtset%nspinor,2,&
     760                 :             : &                      svectout(:,1+(idat-1)*npw_k*dtset%nspinor:idat*npw_k*dtset%nspinor),ddk(:,:,idat),&
     761                 :       86400 : &                      mpi_enreg%me_g0,mpi_enreg%comm_spinorfft)
     762                 :      172800 :                    becfrnlk(mu,ia,ii)=becfrnlk(mu,ia,ii)+occ_k(idat)*dotprod(1)
     763                 :             :                  end do
     764                 :             :                end do
     765                 :             :              end do
     766                 :             :            end if
     767                 :             : 
     768         [ +  + ]:       13440 :            if(need_piezofr)then
     769         [ +  + ]:       54096 :              do mu=1,6 !loop over strain
     770                 :       46368 :                call gs_ham%load_k(ffnl_k=ffnl_str(:,:,:,:,mu))
     771                 :             :                call nonlop(choice_piez3,cpopt,cwaveprj,enlout_piez1,gs_ham,mu,(/zero/),mpi_enreg,ndat,&
     772                 :       46368 : &                  nnlout_piez1,paw_opt_3,signs_field,svectout,tim_nonlop,cwavef,svectout)
     773         [ +  + ]:      100464 :                do idat=1,ndat
     774                 :             :                  call dotprod_g(dotprod(1),dotprod(2),istwf_k,npw_k*dtset%nspinor,2,&
     775                 :             : &                    svectout(:,1+(idat-1)*npw_k*dtset%nspinor:idat*npw_k*dtset%nspinor),ddk(:,:,idat),&
     776                 :       46368 : &                    mpi_enreg%me_g0,mpi_enreg%comm_spinorfft)
     777                 :       92736 :                  piezofrnlk(mu,ii)=piezofrnlk(mu,ii)+occ_k(idat)*dotprod(1)
     778                 :             :                end do
     779                 :             :              end do
     780                 :        7728 :              call gs_ham%load_k(ffnl_k=ffnl)
     781                 :             :            end if
     782                 :             : 
     783         [ -  + ]:       17920 :            ABI_FREE(ddk)
     784                 :             :          end do ! End loop ddk file
     785                 :             :        end if
     786                 :             : 
     787         [ +  + ]:        4480 :        if(need_piezofr)then
     788         [ +  + ]:       95312 :          enlout_piez2 = zero
     789                 :             :          call nonlop(choice_piez55,cpopt,cwaveprj,enlout_piez2,gs_ham,0,(/zero/),mpi_enreg,ndat,&
     790                 :        2576 : &         nnlout_piez2,paw_opt_3,signs,nonlop_dum,tim_nonlop,cwavef,cwavef)
     791                 :             : !         Multiply enlout by +i
     792                 :        2576 :          iashift = 1
     793         [ +  + ]:        5152 :          do idat=1,ndat
     794         [ +  + ]:       20608 :            do mu=1,6     ! strain
     795         [ +  + ]:       64400 :              do nu=1,3   ! k
     796                 :       46368 :                piezofrnlk(mu,nu)=piezofrnlk(mu,nu)-occ_k(idat)*(enlout_piez2(iashift+1)) ! Real part
     797                 :             :   !            piezofrnlk(mu,nu)=piezofrnlk(mu,nu)+occ_k(idat)*(enlout_piez2(iashift  ))! Imaginary part
     798                 :       61824 :                iashift = iashift + 2
     799                 :             :              end do
     800                 :             :            end do
     801                 :             :          end do
     802                 :             :        end if
     803                 :             : 
     804         [ +  + ]:      179028 :        if(need_becfr)then
     805                 :             :          call nonlop(choice_bec54,cpopt,cwaveprj,enlout_bec2,gs_ham,0,(/zero/),mpi_enreg,ndat,&
     806                 :        4480 : &         nnlout_bec2,paw_opt_3,signs,nonlop_dum,tim_nonlop,cwavef,cwavef)
     807                 :             : !        Multiply enlout by +i
     808                 :        4480 :          iashift = 1
     809         [ +  + ]:        8960 :          do idat=1,ndat
     810         [ +  + ]:       18560 :            do iatom=1,natom ! atm
     811         [ +  + ]:       42880 :              do mu=1,3     ! atm pos.
     812         [ +  + ]:      124800 :                do nu=1,3   ! k
     813                 :       86400 :                  becfrnlk(mu,iatom,nu)=becfrnlk(mu,iatom,nu)-occ_k(idat)*(enlout_bec2(iashift+1)) ! Real part
     814                 :             : !                 becfrnlk(mu,iatom,nu)=becfrnlk(mu,iatom,nu)+occ_k(idat)*(enlout_bec2(iashift  ))! Imaginary part
     815                 :      115200 :                  iashift = iashift + 2
     816                 :             :                end do
     817                 :             :              end do
     818                 :             :            end do
     819                 :             :          end do
     820                 :             :        end if
     821                 :             : 
     822         [ +  + ]:      210651 :        if(need_efmas) then
     823                 :         338 :          bandmin=efmasdeg(ikpt)%degs_bounds(1, efmasdeg(ikpt)%deg_range(1) )
     824                 :         338 :          bandmax=efmasdeg(ikpt)%degs_bounds(2, efmasdeg(ikpt)%deg_range(2) )
     825                 :             : 
     826                 :         338 :          choice_efmas=8; signs=2
     827                 :         338 :          cpopt=-1  !To prevent re-use of stored dgxdt, which are not for all direction required for EFMAS.
     828         [ +  + ]:         338 :          paw_opt_efmas=0; if(psps%usepaw/=0) paw_opt_efmas=4 !To get both gh2c and gs2c
     829                 :         338 :          nnlout_efmas=0; tim_nonlop=0 ! No tim_nonlop for efmas, currently.
     830                 :             : 
     831         [ +  + ]:         676 :          do idat=1,ndat
     832                 :             : ! find list of iband which are running now:
     833         [ +  + ]:        5604 :            bands_treated_now = 0
     834                 :         338 :            bands_treated_now(iband+idat-1) = 1
     835                 :         338 :            call xmpi_sum(bands_treated_now,mpi_enreg%comm_band,ierr)
     836                 :             : 
     837                 :             : ! for all iband running right now
     838         [ +  + ]:        1905 :            do iband_ = bandmin, bandmax
     839         [ +  + ]:        1229 :              if (bands_treated_now(iband_) == 0) cycle
     840                 :             : 
     841         [ +  + ]:         654 :              do mu=1,3
     842         [ +  + ]:        2177 :                do nu=1,3
     843                 :             : ! if I have iband_ prepare things
     844         [ +  - ]:         711 :                  if (iband_ == iband+idat-1) then
     845                 :         711 :                    idir=3*(mu-1)+nu !xx=1, xy=2, xz=3, yx=4, yy=5, yz=6, zx=7, zy=8, zz=9, (xyz,xyz)=(mu,nu)
     846   [ +  +  +  +  :     2450529 :                    gh2c=zero; gs2c=zero
             +  +  +  + ]
     847                 :             :                    call nonlop(choice_efmas,cpopt,cwaveprj,enlout_efmas,gs_ham,idir,(/eig_k/),mpi_enreg,&
     848   [ -  +  +  +  :        2133 :                    1,nnlout_efmas,paw_opt_efmas,signs,gs2c,tim_nonlop,cwavef(:,1+(idat-1)*npw_k*dtset%nspinor:idat*npw_k*dtset%nspinor),gh2c)
             +  -  +  + ]
     849                 :             : !DEBUG
     850                 :             : !                  gh2c=zero; gs2c=zero
     851                 :             : !ENDDEBUG
     852         [ +  + ]:        1692 :                    do ispinor=1,dtset%nspinor
     853                 :         981 :                      ii = 1+(ispinor-1)*npw_k
     854         [ +  + ]:        3654 :                      do icplx=1,2
     855                 :             :                        gh2c(icplx,ii:ispinor*npw_k) = gh2c(icplx,ii:ispinor*npw_k) +  &
     856         [ +  + ]:      819549 : &                       ddkinpw(1:npw_k,mu,nu)*cwavef(icplx,ii+(idat-1)*npw_k:ispinor*npw_k+(idat-1)*npw_k)
     857                 :             :                      end do
     858                 :             :                    end do
     859   [ -  +  +  +  :     1226331 :                    gh2c = gh2c - eig_k(idat)*gs2c
                   +  + ]
     860                 :             : !DEBUG
     861                 :             : !                  gh2c=zero; gs2c=zero
     862                 :             : !ENDDEBUG
     863                 :             :                  end if
     864                 :         711 :                  ideg = efmasdeg(ikpt)%ideg(iband+idat-1)
     865   [ -  +  +  -  :        2133 :                  ABI_MALLOC( ch2c_tmp, (size(efmasval(ideg,ikpt)%ch2c, dim=3)) )
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     866                 :             : 
     867                 :             : ! share gh2c
     868                 :         711 :                  call xmpi_bcast(gh2c, band_procs(iband+idat-1), mpi_enreg%comm_band,ierr)
     869                 :             : 
     870                 :         711 :                  jband_me = 0
     871         [ +  + ]:        5661 :                  do jband=1,efmasdeg(ikpt)%degs_bounds(2,ideg)
     872                 :             : ! jband treated on current proc?
     873         [ -  + ]:        4950 :                    if (proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,jband,jband,isppol,me)) cycle
     874                 :             : ! if so, indexing of the bands in my cg array
     875                 :        4950 :                    jband_me = jband_me + 1
     876                 :             : ! if we do not need to treat it for efmas, skip
     877         [ +  + ]:        4950 :                    if (jband < efmasdeg(ikpt)%degs_bounds(1,ideg)) cycle
     878                 :             : 
     879   [ +  +  +  + ]:     2881710 :                    cg_left(:,1:npw_k*dtset%nspinor) = cg(:,1+(jband_me-1)*npw_k*dtset%nspinor+icg:jband_me*npw_k*dtset%nspinor+icg)
     880                 :        1809 :                    dotprod=0
     881                 :             :                    call dotprod_g(dotprod(1),dotprod(2),istwf_k,npw_k*dtset%nspinor,2,cg_left,gh2c,mpi_enreg%me_g0,&
     882                 :        1809 :                      mpi_enreg%comm_spinorfft)
     883                 :        1809 :                    isub = iband-efmasdeg(ikpt)%degs_bounds(1,ideg)+1
     884                 :        1809 :                    jsub = jband-efmasdeg(ikpt)%degs_bounds(1,ideg)+1
     885                 :             : 
     886                 :        5661 :                    ch2c_tmp(jsub)=cmplx(dotprod(1),dotprod(2),kind=dp)
     887                 :             :                  end do ! jband
     888                 :             :                  !mpi_sum ch2c_tmp to get all jband contribs
     889                 :         711 :                  call xmpi_sum(ch2c_tmp,mpi_enreg%comm_band,ierr)
     890         [ +  + ]:        2520 :                  efmasval(ideg,ikpt)%ch2c(mu,nu,:,isub)=ch2c_tmp(:)
     891         [ -  + ]:        2370 :                  ABI_FREE( ch2c_tmp )
     892                 :             :                end do ! nu
     893                 :             :              end do ! mu
     894                 :             :            end do ! iband_
     895                 :             :          end do ! idat
     896                 :             :        end if ! need_efmas
     897                 :             : 
     898                 :             :      end do ! End of loop on bands
     899                 :             : 
     900         [ +  + ]:       31623 :      if(rfphon==1) then
     901         [ +  + ]:       71711 :        do iatom=1,natom
     902         [ +  + ]:       44168 :          ia=iatom;if (dyfr_nondiag==0) ia=1
     903                 :       44168 :          dyfrnl(1,1,1,iatom,ia)=dyfrnl(1,1,1,iatom,ia)+wtk_k*dyfrnlk(1,iatom)
     904                 :       44168 :          dyfrnl(1,2,2,iatom,ia)=dyfrnl(1,2,2,iatom,ia)+wtk_k*dyfrnlk(2,iatom)
     905                 :       44168 :          dyfrnl(1,3,3,iatom,ia)=dyfrnl(1,3,3,iatom,ia)+wtk_k*dyfrnlk(3,iatom)
     906                 :       44168 :          dyfrnl(1,2,3,iatom,ia)=dyfrnl(1,2,3,iatom,ia)+wtk_k*dyfrnlk(4,iatom)
     907                 :       44168 :          dyfrnl(1,1,3,iatom,ia)=dyfrnl(1,1,3,iatom,ia)+wtk_k*dyfrnlk(5,iatom)
     908                 :       71711 :          dyfrnl(1,1,2,iatom,ia)=dyfrnl(1,1,2,iatom,ia)+wtk_k*dyfrnlk(6,iatom)
     909                 :             :        end do
     910                 :             :      end if ! end if rfphon
     911         [ +  + ]:       31623 :      if(rfstrs/=0) then
     912   [ +  +  +  + ]:      386576 :        eltfrnl(:,:)=eltfrnl(:,:)+dtset%wtk(ikpt)*eltfrnlk(:,:)
     913                 :             :      end if
     914         [ +  + ]:       31623 :      if(need_becfr) then
     915   [ +  +  +  +  :       26752 :        becfrnl(:,:,:)=becfrnl(:,:,:)+dtset%wtk(ikpt)*becfrnlk(:,:,:)
                   +  + ]
     916                 :             :      end if
     917         [ +  + ]:       31623 :      if(need_piezofr) then
     918   [ +  +  +  + ]:       10912 :        piezofrnl(:,:)=piezofrnl(:,:)+dtset%wtk(ikpt)*piezofrnlk(:,:)
     919                 :             :      end if
     920                 :             : !    Increment indexes
     921                 :       31623 :      bdtot_index=bdtot_index+nband_k
     922         [ +  - ]:       31623 :      if (mkmem_rbz/=0) then
     923                 :       31623 :        ibg=ibg+nband_k*dtset%nspinor
     924                 :       31623 :        icg=icg+npw_k*dtset%nspinor*nband_me
     925                 :       31623 :        ikg=ikg+npw_k
     926                 :             :      end if
     927                 :             : 
     928                 :             : #ifdef HAVE_OPENMP_OFFLOAD
     929                 :             :      !$OMP TARGET EXIT DATA MAP(delete:ffnl,ph3d) IF(dtset%gpu_option==ABI_GPU_OPENMP)
     930                 :             : #endif
     931         [ -  + ]:       31623 :      ABI_FREE(ffnl)
     932         [ -  + ]:       31623 :      ABI_FREE(kpg_k)
     933         [ -  + ]:       31623 :      ABI_FREE(ph3d)
     934         [ -  + ]:       31623 :      ABI_FREE(ylm_k)
     935         [ -  + ]:       31623 :      ABI_FREE(ylmgr_k)
     936         [ -  + ]:       31623 :      ABI_FREE(cwavef)
     937         [ -  + ]:       31623 :      ABI_FREE(kg_k)
     938         [ +  + ]:       31623 :      if (need_becfr.or.need_piezofr) then
     939         [ -  + ]:         928 :        ABI_FREE(svectout)
     940                 :             :      end if
     941         [ +  + ]:         928 :      if (need_piezofr) then
     942                 :             : #ifdef HAVE_OPENMP_OFFLOAD
     943                 :             :        !$OMP TARGET EXIT DATA MAP(delete:ffnl_str) IF(dtset%gpu_option==ABI_GPU_OPENMP)
     944                 :             : #endif
     945         [ -  + ]:         496 :        ABI_FREE(ffnl_str)
     946                 :             :      end if
     947         [ +  + ]:       32147 :      if (need_efmas) then
     948         [ -  + ]:          24 :        ABI_FREE(ddkinpw)
     949         [ -  + ]:          24 :        ABI_FREE(cg_left)
     950         [ -  + ]:          24 :        ABI_FREE(gh2c)
     951         [ -  + ]:          24 :        ABI_FREE(gs2c)
     952                 :             :      end if
     953                 :             : 
     954                 :             :      ABI_NVTX_END_RANGE()
     955                 :             :    end do ! End loops on isppol and ikpt
     956                 :             :  end do
     957         [ +  + ]:         488 :  if(rfphon==1) then
     958         [ -  + ]:         451 :    ABI_FREE(dyfrnlk)
     959         [ -  + ]:         451 :    ABI_FREE(enlout_phon)
     960                 :             :  end if
     961         [ +  + ]:         488 :  if(rfstrs/=0) then
     962         [ -  + ]:          37 :    ABI_FREE(eltfrnlk)
     963         [ -  + ]:          37 :    ABI_FREE(enlout_strs)
     964                 :             :  end if
     965         [ +  + ]:         488 :  if (need_becfr)  then
     966         [ -  + ]:          27 :    ABI_FREE(becfrnlk)
     967         [ -  + ]:          27 :    ABI_FREE(enlout_bec1)
     968         [ -  + ]:          27 :    ABI_FREE(enlout_bec2)
     969                 :             :  end if
     970         [ +  + ]:         488 :  if(need_piezofr)then
     971         [ -  + ]:          18 :    ABI_FREE(enlout_piez1)
     972         [ -  + ]:          18 :    ABI_FREE(enlout_piez2)
     973         [ -  + ]:          18 :    ABI_FREE(piezofrnlk)
     974                 :             :  end if
     975         [ +  + ]:         488 :  if(need_efmas) then
     976         [ -  + ]:          17 :    ABI_FREE(enlout_efmas)
     977                 :             :  end if
     978         [ +  + ]:         488 :  if (psps%usepaw==1) then
     979         [ +  + ]:          58 :    if (need_becfr.or.need_piezofr)  then
     980         [ -  + ]:          27 :      ABI_FREE(becij)
     981                 :             :    end if
     982                 :          58 :    call pawcprj_free(cwaveprj)
     983                 :             :  end if
     984   [ +  -  +  +  :         658 :  ABI_FREE(cwaveprj)
          -  +  -  +  -  
                      + ]
     985                 :             : 
     986                 :             : !Fill in lower triangle of matrixes
     987         [ +  + ]:         488 :  if (rfphon==1) then
     988         [ +  + ]:        1393 :    do iatom=1,natom
     989         [ +  + ]:         942 :      ia=iatom;if (dyfr_nondiag==0) ia=1
     990                 :         942 :      dyfrnl(1,3,2,iatom,ia)=dyfrnl(1,2,3,iatom,ia)
     991                 :         942 :      dyfrnl(1,3,1,iatom,ia)=dyfrnl(1,1,3,iatom,ia)
     992                 :        1393 :      dyfrnl(1,2,1,iatom,ia)=dyfrnl(1,1,2,iatom,ia)
     993                 :             :    end do
     994                 :             :  end if
     995         [ +  + ]:         488 :  if(rfstrs/=0)then
     996         [ +  + ]:         222 :    do jj=2,6
     997         [ +  + ]:         777 :      do ii=1,jj-1
     998                 :         740 :        eltfrnl(jj,ii)=eltfrnl(ii,jj)
     999                 :             :      end do
    1000                 :             :    end do
    1001                 :             :  end if
    1002                 :             : 
    1003                 :             : !Parallel case: accumulate (n,k) contributions
    1004                 :             :  if (xmpi_paral==1) then
    1005                 :         488 :    call timab(48,1,tsec)
    1006                 :             : !  Accumulate dyfrnl
    1007         [ +  + ]:         488 :    if(rfphon==1)then
    1008                 :         451 :      call xmpi_sum(dyfrnl,spaceworld,ierr)
    1009                 :             :    end if
    1010                 :             : !  Accumulate eltfrnl.
    1011         [ +  + ]:         488 :    if(rfstrs/=0)then
    1012                 :          37 :      call xmpi_sum(eltfrnl,spaceworld,ierr)
    1013                 :             :    end if
    1014                 :             : !  Accumulate becfrnl
    1015         [ +  + ]:         488 :    if (need_becfr) then
    1016                 :          27 :      call xmpi_sum(becfrnl,spaceworld,ierr)
    1017                 :             :    end if
    1018                 :             : !  Accumulate piezofrnl
    1019         [ +  + ]:         488 :    if (need_piezofr) then
    1020                 :          18 :      call xmpi_sum(piezofrnl,spaceworld,ierr)
    1021                 :             :    end if
    1022                 :             : 
    1023                 :             : !  PAW: accumulate gradients of rhoij
    1024         [ +  + ]:         488 :    if (psps%usepaw==1) then
    1025   [ -  +  +  -  :         174 :      ABI_MALLOC(dimlmn,(natom))
          +  -  +  -  -  
                +  -  + ]
    1026         [ +  + ]:         220 :      dimlmn(1:natom)=pawrhoij_tot(1:natom)%cplex_rhoij*pawrhoij_tot(1:natom)%qphase*pawrhoij_tot(1:natom)%lmn2_size
    1027         [ +  + ]:         220 :      bufdim=ncpgr*sum(dimlmn)*nsploop
    1028   [ +  +  +  -  :         174 :      ABI_MALLOC(mpibuf,(bufdim))
          +  -  +  +  -  
             +  -  +  -  
                      + ]
    1029         [ +  + ]:       52216 :      ii=0;mpibuf=zero
    1030         [ +  + ]:         220 :      do iatom=1,natom
    1031         [ +  + ]:         392 :        do isppol=1,nsploop
    1032         [ +  + ]:        1492 :          do mu=1,ncpgr
    1033         [ +  + ]:       53316 :            mpibuf(ii+1:ii+dimlmn(iatom))=pawrhoij_tot(iatom)%grhoij(mu,1:dimlmn(iatom),isppol)
    1034                 :        1330 :            ii=ii+dimlmn(iatom)
    1035                 :             :          end do
    1036                 :             :        end do
    1037                 :             :      end do
    1038                 :          58 :      call xmpi_sum(mpibuf,spaceworld,ierr)
    1039                 :          58 :      ii=0
    1040         [ +  + ]:         220 :      do iatom=1,natom
    1041         [ +  + ]:         392 :        do isppol=1,nsploop
    1042         [ +  + ]:        1492 :          do mu=1,ncpgr
    1043         [ +  + ]:       53316 :            pawrhoij_tot(iatom)%grhoij(mu,1:dimlmn(iatom),isppol)=mpibuf(ii+1:ii+dimlmn(iatom))
    1044                 :        1330 :            ii=ii+dimlmn(iatom)
    1045                 :             :          end do
    1046                 :             :        end do
    1047                 :             :      end do
    1048         [ -  + ]:          58 :      ABI_FREE(mpibuf)
    1049         [ -  + ]:         116 :      ABI_FREE(dimlmn)
    1050                 :             :    end if
    1051                 :         488 :    call timab(48,2,tsec)
    1052                 :             :  end if
    1053                 :             : 
    1054                 :             : !====== PAW: Additional steps
    1055         [ +  + ]:         488 :  if (psps%usepaw==1) then
    1056                 :             : 
    1057                 :             : !  Symmetrize rhoij gradients and transfer to cartesian (reciprocal space) coord.
    1058                 :             : !  This symetrization is necessary in the antiferromagnetic case...
    1059   [ +  +  +  + ]:          58 :    if (rfphon==1.and.rfstrs==0) then
    1060                 :          33 :      option_rhoij=2;option=0
    1061                 :             :      call pawrhoij_symrhoij(pawrhoij_tot,pawrhoij_tot,option_rhoij,gprimd,indsym,0,natom,dtset%nsym,&
    1062                 :             : &     psps%ntypat,option,pawang,dtset%pawprtvol,pawtab,rprimd,dtset%symafm,symrec,dtset%typat,&
    1063                 :          33 : &     comm_atom=my_comm_atom, mpi_atmtab=my_atmtab)
    1064   [ +  +  -  + ]:          25 :    else if (rfphon==1.and.rfstrs==1) then
    1065                 :           0 :      option_rhoij=23;option=0
    1066                 :             :      call pawrhoij_symrhoij(pawrhoij_tot,pawrhoij_tot,option_rhoij,gprimd,indsym,0,natom,dtset%nsym,&
    1067                 :             : &     psps%ntypat,option,pawang,dtset%pawprtvol,pawtab,rprimd,dtset%symafm,symrec,dtset%typat,&
    1068                 :           0 : &     comm_atom=my_comm_atom, mpi_atmtab=my_atmtab)
    1069                 :             :    end if
    1070                 :             : 
    1071                 :             : !  Translate coordinates
    1072         [ -  + ]:          58 :    ABI_CHECK(nsploop/=4,'d2frnl: should we mix mx/my/mz when translating coordinates?')
    1073         [ +  + ]:         220 :    do iatom=1,natom
    1074                 :         162 :      cplx=pawrhoij_tot(iatom)%cplex_rhoij
    1075         [ +  + ]:         382 :      do iq=1,pawrhoij_tot(iatom)%qphase
    1076         [ -  + ]:         162 :        iq0=0;if (iq==2) iq0=cplx*pawrhoij_tot(iatom)%lmn2_size
    1077         [ +  + ]:         496 :        do isppol=1,nsploop
    1078         [ +  + ]:        8778 :          do klmn=1,pawrhoij_tot(iatom)%lmn2_size
    1079         [ +  + ]:       17788 :            do ii=1,cplx
    1080   [ +  +  -  + ]:        9172 :              if(rfphon==1.or.rfstrs/=0)then
    1081         [ +  + ]:       26168 :                grhoij(1:3)=pawrhoij_tot(iatom)%grhoij(shift_rhoij+1:shift_rhoij+3,iq0+cplx*(klmn-1)+ii,isppol)
    1082         [ +  + ]:       26168 :                do mu=1,3
    1083                 :             :                  pawrhoij_tot(iatom)%grhoij(shift_rhoij+mu,iq0+cplx*(klmn-1)+ii,isppol)=gprimd(mu,1)*grhoij(1)&
    1084                 :       28798 : &                  +gprimd(mu,2)*grhoij(2)+gprimd(mu,3)*grhoij(3)
    1085                 :             :                end do
    1086                 :             :              end if
    1087         [ +  + ]:       17616 :              if(rfstrs/=0)then
    1088                 :             :                call strconv(pawrhoij_tot(iatom)%grhoij(1:6,iq0+cplx*(klmn-1)+ii,isppol),gprimd,&
    1089                 :        1512 : &                           pawrhoij_tot(iatom)%grhoij(1:6,iq0+cplx*(klmn-1)+ii,isppol))
    1090                 :             :              end if
    1091                 :             :            end do
    1092                 :             :          end do
    1093                 :             :        end do
    1094                 :             :      end do
    1095                 :             :    end do
    1096                 :             : 
    1097                 :             : !  In case of elastic tensor computation, add diagonal contribution:
    1098                 :             : !     -delta_{alphabeta} rhoi_{ij} to drhoij/d_eps
    1099         [ +  + ]:          58 :    if(rfstrs/=0)then
    1100         [ +  + ]:          54 :      do iatom=1,natom
    1101                 :          42 :        cplx=pawrhoij_tot(iatom)%cplex_rhoij
    1102         [ +  + ]:          96 :        do iq=1,pawrhoij_tot(iatom)%qphase
    1103         [ -  + ]:          42 :          iq0=0;if (iq==2) iq0=cplx*pawrhoij_tot(iatom)%lmn2_size
    1104         [ +  + ]:         126 :          do isppol=1,nsploop
    1105         [ +  + ]:         748 :            do nu=1,pawrhoij_tot(iatom)%nrhoijsel
    1106                 :         664 :              klmn=pawrhoij_tot(iatom)%rhoijselect(nu)
    1107         [ +  + ]:        1370 :              do ii=1,cplx
    1108                 :             :                pawrhoij_tot(iatom)%grhoij(1:3,iq0+cplx*(klmn-1)+ii,isppol)= &
    1109                 :             : &               pawrhoij_tot(iatom)%grhoij(1:3,iq0+cplx*(klmn-1)+ii,isppol)&
    1110         [ +  + ]:        3320 : &               -pawrhoij_tot(iatom)%rhoijp(iq0+cplx*(nu-1)+ii,isppol)
    1111                 :             :              end do
    1112                 :             :            end do
    1113                 :             :          end do
    1114                 :             :        end do
    1115                 :             :      end do
    1116                 :             :    end if
    1117                 :             : 
    1118                 :             : !  Add gradients due to Dij derivatives to dynamical matrix/stress tensor
    1119                 :          58 :    dimnhat=0;optgr=0;optgr2=0;optstr=0;optstr2=0
    1120         [ +  + ]:          58 :    if (rfphon==1) optgr2=1
    1121         [ +  + ]:          58 :    if (rfstrs/=0) optstr2=1
    1122         [ -  + ]:          58 :    ABI_MALLOC(nhat_dum,(1,0))
    1123                 :             :    call pawgrnl(gs_ham%atindx1,dimnhat,dyfrnl,dyfr_cplex,eltfrnl,dummy,gsqcut,mgfftf,my_natom,natom,&
    1124                 :             : &   gs_ham%nattyp,nfftf,ngfftf,nhat_dum,dummy,dtset%nspden,dtset%nsym,psps%ntypat,optgr,optgr2,optstr,optstr2,&
    1125                 :             : &   pawang,pawfgrtab,pawrhoij_tot,pawtab,ph1df,psps,dtset%qptn,rprimd,symrec,dtset%typat,ucvol,vtrial,vxc,xred,&
    1126                 :          58 : &   mpi_atmtab=my_atmtab,comm_atom=my_comm_atom)
    1127         [ -  + ]:          58 :    ABI_FREE(nhat_dum)
    1128                 :             :  end if !PAW
    1129                 :             : 
    1130                 :             : !The indexing array atindx is used to reestablish the correct order of atoms
    1131         [ +  + ]:         488 :  if (rfstrs/=0)then
    1132   [ +  -  -  +  :         148 :    ABI_MALLOC(elt_work,(6+3*natom,6))
          +  -  +  -  +  
          -  +  -  -  +  
                   -  + ]
    1133   [ +  +  +  + ]:        1591 :    elt_work(1:6,1:6)=eltfrnl(1:6,1:6)
    1134         [ +  + ]:         131 :    do ia=1,natom
    1135                 :          94 :      ielt=7+3*(ia-1)
    1136                 :          94 :      ieltx=7+3*(gs_ham%atindx(ia)-1)
    1137   [ +  +  +  + ]:        2387 :      elt_work(ielt:ielt+2,1:6)=eltfrnl(ieltx:ieltx+2,1:6)
    1138                 :             :    end do
    1139   [ +  +  +  + ]:        3283 :    eltfrnl(:,:)=elt_work(:,:)
    1140         [ -  + ]:          37 :    ABI_FREE(elt_work)
    1141                 :             :  end if
    1142                 :             : 
    1143                 :             : !Born Effective Charges and PAW:
    1144                 :             : !1-Re-order atoms -- 2-Add diagonal contribution from rhoij
    1145                 :             : !3-Multiply by -1 because that the effective charges
    1146                 :             :  !  are minus the second derivatives of the energy
    1147         [ +  + ]:         488 :  if (need_becfr) then
    1148   [ -  +  +  -  :         108 :    ABI_MALLOC(becfrnl_tmp,(3,natom,3))
          +  -  +  -  +  
             -  -  +  -  
                      + ]
    1149   [ +  -  +  -  :         975 :    becfrnl_tmp=-becfrnl
          -  +  -  -  +  
             +  +  +  +  
                      + ]
    1150         [ +  + ]:          97 :    do ia=1,natom         ! Atom (sorted by type)
    1151                 :          70 :      iatom=gs_ham%atindx1(ia)   ! Atom (not sorted)
    1152                 :          70 :      itypat=dtset%typat(iatom)
    1153         [ +  + ]:         307 :      do ii=1,3           ! Direction of electric field
    1154         [ +  + ]:         910 :        do jj=1,3         ! Direction of atom
    1155                 :         840 :          becfrnl(jj,iatom,ii)=becfrnl_tmp(jj,ia,ii)
    1156                 :             :        end do
    1157                 :             :      end do
    1158                 :             :    end do
    1159         [ -  + ]:          27 :    ABI_FREE(becfrnl_tmp)
    1160                 :             :  end if
    1161                 :             : 
    1162                 :             : !Piezoelectric Tensor
    1163                 :             : !-Multiply by -1 because that the piezoelectric tensor
    1164                 :             : !  are minus the second derivatives of the energy
    1165         [ +  + ]:         488 :  if (need_piezofr) then
    1166   [ +  +  +  + ]:         396 :    piezofrnl=-piezofrnl
    1167                 :             :  end if
    1168                 :             : 
    1169         [ -  + ]:         488 :  ABI_FREE(eig_k)
    1170         [ -  + ]:         488 :  ABI_FREE(occ_k)
    1171                 :             : 
    1172                 :             : !Close the ddk files
    1173         [ +  + ]:        1952 :  do ii=1,3
    1174                 :        1952 :    call ddkfiles(ii)%close()
    1175                 :             :  end do
    1176                 :             : 
    1177                 :             : !Release now useless memory
    1178         [ +  + ]:         488 :  if (psps%usepaw==1) then
    1179         [ +  + ]:         220 :    do iatom=1,natom
    1180         [ -  + ]:         162 :      ABI_FREE(pawrhoij_tot(iatom)%grhoij)
    1181                 :         220 :      pawrhoij_tot(iatom)%ngrhoij=0
    1182                 :             :    end do
    1183         [ +  + ]:          58 :    if (paral_atom) then
    1184                 :          26 :      call pawrhoij_free(pawrhoij_tot)
    1185         [ -  + ]:          26 :      ABI_FREE(pawrhoij_tot)
    1186                 :             :    end if
    1187                 :             :  end if
    1188                 :         488 :  call gs_ham%free()
    1189                 :             : 
    1190                 :             :  ABI_NVTX_END_RANGE()
    1191                 :         488 :  call timab(159,2,tsec)
    1192                 :             : 
    1193                 :         488 :  write(msg,'(3a)')ch10,' ==> Calculation of the frozen part of the second order derivative done',ch10
    1194                 :         488 :  call wrtout(std_out,msg,'COLL')
    1195                 :             : 
    1196                 :             :  DBG_EXIT("COLL")
    1197                 :             : 
    1198   [ -  +  -  +  :        1464 : end subroutine d2frnl
          -  +  -  +  -  
          +  -  +  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  +  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  -  
          -  -  -  -  -  
          +  -  +  -  +  
             -  +  -  + ]
    1199                 :             : !!***
    1200                 :             : 
    1201                 :             : end module m_d2frnl
    1202                 :             : !!***
        

Generated by: LCOV version 2.3-1