LCOV - code coverage report
Current view: top level - src/80_rttddft - m_rttddft_tdks.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 89.5 % 392 351
Test Date: 2026-11-12 14:41:44 Functions: 71.4 % 7 5
Branches: 40.1 % 1779 714

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_rttddft_tdks
       2                 :             : !! NAME
       3                 :             : !!  m_rttddft_tdks
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !!  Contains the main object (tdks) to propagate
       7                 :             : !!  the time-dependent Kohn-Sham equations in RT-TDDFT
       8                 :             : !!
       9                 :             : !! COPYRIGHT
      10                 :             : !!  Copyright (C) 2021-2026 ABINIT group (FB)
      11                 :             : !!  This file is distributed under the terms of the
      12                 :             : !!  GNU General Public License, see ~abinit/COPYING
      13                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
      14                 :             : !!
      15                 :             : !! SOURCE
      16                 :             : 
      17                 :             : #if defined HAVE_CONFIG_H
      18                 :             : #include "config.h"
      19                 :             : #endif
      20                 :             : 
      21                 :             : #include "abi_common.h"
      22                 :             : 
      23                 :             : module m_rttddft_tdks
      24                 :             : 
      25                 :             :  use defs_basis
      26                 :             :  use defs_abitypes,      only: MPI_type
      27                 :             :  use defs_datatypes,     only: pseudopotential_type
      28                 :             :  use defs_wvltypes,      only: wvl_data, nullify_wvl_data
      29                 :             :  use libxc_functionals,  only: libxc_functionals_get_hybridparams
      30                 :             :  use m_bandfft_kpt,      only: bandfft_kpt, bandfft_kpt_init1, bandfft_kpt_destroy_array
      31                 :             :  use m_cgprj,            only: ctocprj
      32                 :             :  use m_common,           only: setup1
      33                 :             :  use m_dtfil,            only: datafiles_type
      34                 :             :  use m_dtset,            only: dataset_type
      35                 :             :  use m_ebands,           only: ebands_t, unpack_eneocc
      36                 :             :  use m_energies,         only: energies_type
      37                 :             :  use m_errors,           only: msg_hndl, assert
      38                 :             :  use m_extfpmd,          only: extfpmd_type
      39                 :             :  use m_gemm_nonlop_projectors, only: init_gemm_nonlop, destroy_gemm_nonlop
      40                 :             :  use m_geometry,         only: fixsym
      41                 :             :  use m_hdr,              only: hdr_type
      42                 :             :  use m_initylmg,         only: initylmg
      43                 :             :  use m_invovl,           only: init_invovl, destroy_invovl
      44                 :             :  use m_io_tools,         only: open_file
      45                 :             :  use m_inwffil,          only: inwffil
      46                 :             :  use m_kg,               only: kpgio, getph, getcut
      47                 :             :  use m_mpinfo,           only: proc_distrb_cycle
      48                 :             :  use m_occ,              only: newocc
      49                 :             :  use m_paw_an,           only: paw_an_type, paw_an_init, paw_an_free, &
      50                 :             :                                paw_an_nullify
      51                 :             :  use m_pawang,           only: pawang_type
      52                 :             :  use m_pawcprj,          only: pawcprj_type,pawcprj_free,pawcprj_alloc, &
      53                 :             :                                pawcprj_getdim
      54                 :             :  use m_paw_dmft,         only: init_sc_dmft,destroy_sc_dmft,paw_dmft_type
      55                 :             :  use m_pawfgr,           only: pawfgr_type, pawfgr_init, pawfgr_destroy
      56                 :             :  use m_pawfgrtab,        only: pawfgrtab_type, pawfgrtab_init, pawfgrtab_free
      57                 :             :  use m_paw_init,         only: pawinit,paw_gencond
      58                 :             :  use m_paw_ij,           only: paw_ij_type, paw_ij_init, paw_ij_free, paw_ij_nullify
      59                 :             :  use m_paw_nhat,         only: nhatgrid
      60                 :             :  use m_paw_occupancies,  only: initrhoij
      61                 :             :  use m_pawrad,           only: pawrad_type
      62                 :             :  use m_pawrhoij,         only: pawrhoij_type, pawrhoij_copy, pawrhoij_free
      63                 :             :  use m_paw_sphharm,      only: setsym_ylm
      64                 :             :  use m_pawtab,           only: pawtab_type, pawtab_get_lsize
      65                 :             :  use m_paw_tools,        only: chkpawovlp
      66                 :             :  use m_pawxc,            only: pawxc_get_usekden
      67                 :             :  use m_pspini,           only: pspini
      68                 :             :  use m_profiling_abi,    only: abimem_record
      69                 :             :  use m_rttddft_tdef,     only: tdef_type
      70                 :             :  use m_spacepar,         only: setsym
      71                 :             :  use m_specialmsg,       only: wrtout
      72                 :             :  use m_symtk,            only: symmetrize_xred
      73                 :             :  use m_wffile,           only: wffile_type, WffClose
      74                 :             :  use m_xmpi,             only: xmpi_bcast, xmpi_sum
      75                 :             :  use m_drivexc,          only: xc_need_kden
      76                 :             : 
      77                 :             :  implicit none
      78                 :             : 
      79                 :             :  private
      80                 :             : !!***
      81                 :             : 
      82                 :             : !! NAME
      83                 :             : !! tdks_type: Time Dependent Kohn-Sham type
      84                 :             : !! Object containing the TD KS orbitals and all other
      85                 :             : !! important variables required to run RT-TDDFT
      86                 :             : !!
      87                 :             : !! SOURCE
      88                 :             :  type,public :: tdks_type
      89                 :             : 
      90                 :             :   !scalars
      91                 :             :    integer                          :: bantot      !total number of bands
      92                 :             :    integer                          :: first_step  !start propagation from first_step (for restart)
      93                 :             :    integer                          :: mband_cprj  !nb of band per proc (for cprj)
      94                 :             :    integer                          :: mcg         !nb of WFs (cg) coeffs
      95                 :             :    integer                          :: mcprj       !nb of cprj (projectors applied to WF)
      96                 :             :    integer                          :: nfftf       !nb of FFT grid pts (fine grid)
      97                 :             :    integer                          :: nfft        !nb of FFT grid pts (coarse grid)
      98                 :             :    integer                          :: nhatgrdim   !dimension of nhatgr array
      99                 :             :    integer                          :: ngrvdw      !dimension of grvdw array
     100                 :             :    integer                          :: ntime       !max nb of time steps
     101                 :             :    integer                          :: current_unit!unit nb of the current density file
     102                 :             :    integer                          :: tdener_unit !unit nb of the energy file
     103                 :             :    integer                          :: tdef_unit   !unit nb of the efield file
     104                 :             :    integer                          :: tdrestart_unit !unit nb of the restart file
     105                 :             :    integer                          :: unpaw       !paw data tmp file unit
     106                 :             :    integer                          :: usexcnhat   !use nhat in the computation of the XC term
     107                 :             :    real(dp)                         :: dt          !propagation time step
     108                 :             :    real(dp)                         :: ecore       !core energy
     109                 :             :    real(dp)                         :: etot        !total energy
     110                 :             :    real(dp)                         :: gsqcut      !cut-off on G^2
     111                 :             :    real(dp)                         :: ucvol       !primitive cell volume
     112                 :             :    real(dp)                         :: zion        !total ionic charge
     113                 :             :    logical                          :: gemm_nonlop_use_gemm !use efficient BLAS call
     114                 :             :                                                    !for computing  non local potential
     115                 :             :    type(energies_type)              :: energies    !contains various energy values
     116                 :             :    type(hdr_type)                   :: hdr         !header: contains various info
     117                 :             :    type(paw_dmft_type)              :: paw_dmft    !paw_dmft object (unused but
     118                 :             :                                                    !required by various routines)
     119                 :             :    type(pawfgr_type)                :: pawfgr      !FFT fine grid in PAW sphere
     120                 :             :    type(pawang_type),pointer        :: pawang => NULL() !angular grid in PAW sphere
     121                 :             :    type(tdef_type)                  :: tdef        !Object containing variables related to TD electric field
     122                 :             :    type(wvl_data)                   :: wvl         !wavelets ojects (unused but
     123                 :             :                                                    !required by various routines)
     124                 :             :    character(len=fnlen)             :: fname_current!Name of the TDCURRENT file
     125                 :             :    character(len=fnlen)             :: fname_tdener!Name of the TDENER file
     126                 :             :    character(len=fnlen)             :: fname_tdef  !Name of the TDEFIELD file
     127                 :             :    character(len=fnlen)             :: fname_wfk0  !Name of the input WFK file containing
     128                 :             :                                                    !the intial (t=0) wfs
     129                 :             :    !arrays
     130                 :             :    integer,allocatable              :: atindx(:)   !index table of atom ordered by type
     131                 :             :    integer,allocatable              :: atindx1(:)  !nb of the atom for each index in atindx
     132                 :             :    integer,allocatable              :: dimcprj(:)  !Contains dimension for cprj array
     133                 :             :    integer,allocatable              :: dimcprj_srt(:) !Contains dimension for cprj array ordered by atom type
     134                 :             :    integer,allocatable              :: indsym(:,:,:) !atom indexing for symmetries
     135                 :             :    integer,allocatable              :: irrzon(:,:,:) !irreducible Brillouin zone
     136                 :             :    integer,allocatable              :: kg(:,:)     !red. coord. of G vecs
     137                 :             :    integer,allocatable              :: nattyp(:)   !nb of atoms of different types
     138                 :             :    integer,allocatable              :: npwarr(:)   !number of PW at each k-point
     139                 :             :    integer,allocatable              :: symrec(:,:,:) !sym. operations in recip space
     140                 :             :    real(dp)                         :: gprimd(3,3) !primitive cell vectors in recip space
     141                 :             :    real(dp)                         :: gmet(3,3)   !metric tensor in recip space
     142                 :             :    real(dp)                         :: rprimd(3,3) !prim cell vectors in direct space
     143                 :             :    real(dp)                         :: rmet(3,3)   !metric tensor in direct space
     144                 :             :    real(dp),allocatable             :: cg(:,:)     !WF coefficients in PW basis <k+G|psi_nk>
     145                 :             :    real(dp),allocatable             :: cg0(:,:)    !Initial WF coefficients in PW basis <k+G|psi_nk>
     146                 :             :    real(dp),allocatable             :: current(:,:)!Current density
     147                 :             :    real(dp),allocatable             :: eigen(:)    !eigen-energies
     148                 :             :    real(dp),allocatable             :: eigen0(:)   !Initial eigen-energies (at t=0)
     149                 :             :    real(dp),allocatable             :: grvdw(:,:)  !Gradient of the total energy coming
     150                 :             :                                                    !from VDW dispersion correction             !FB: Needed?
     151                 :             :    real(dp),allocatable             :: nhat(:,:)   !compensation charge density
     152                 :             :    real(dp),allocatable             :: nhatgr(:,:,:) !gradient of nhat
     153                 :             :    real(dp),allocatable             :: occ(:)      !occupation numbers
     154                 :             :    real(dp),allocatable             :: occ0(:)     !Initial occupation numbers
     155                 :             :    real(dp),allocatable             :: phnons(:,:,:) !For symmetries (nonsymmorphic translation phases)
     156                 :             :    real(dp),allocatable             :: ph1d(:,:)   !Structure factor phase: exp(2Pi i G.xred)
     157                 :             :                                                    !on coarse grid
     158                 :             :    real(dp),allocatable             :: ph1df(:,:)  !Structure factor phase: exp(2Pi i G.xred) for G
     159                 :             :                                                    !on fine grid
     160                 :             :    real(dp),allocatable             :: rhog(:,:)   !charge density in recip space
     161                 :             :    real(dp),allocatable             :: rhor(:,:)   !charge density in direct space
     162                 :             :    real(dp),allocatable             :: taug(:,:)   !kin ener density in recip space            !FB: Needed?
     163                 :             :    real(dp),allocatable             :: taur(:,:)   !kin ener density in direct space           !FB: Needed?
     164                 :             :    real(dp),allocatable             :: vhartr(:)   !Hartree part of the potential
     165                 :             :    real(dp),allocatable             :: vpsp(:)     !PSP part of the potential
     166                 :             :    real(dp),allocatable             :: vtrial(:,:) !"Trial" potential
     167                 :             :    real(dp),allocatable             :: vxc(:,:)    !XC part of the potential
     168                 :             :    real(dp),allocatable             :: vxc_hybcomp(:,:) !Hybrid part of the xc potential       !FB:Needed?
     169                 :             :    real(dp),allocatable             :: vxctau(:,:,:) !dV_{XC}/dtau (tau = kin. ener density)
     170                 :             :                                                    !for mGGAs                                  !FB: Needed?
     171                 :             :    real(dp),allocatable             :: xred(:,:,:) !red. coord. of atoms
     172                 :             :    real(dp),allocatable             :: xccc3d(:)   !3D core electron density
     173                 :             :                                                    !for XC core correction
     174                 :             :    real(dp),allocatable             :: xcctau3d(:) !3D core electron kin ener density
     175                 :             :                                                    !for XC core correction
     176                 :             :    real(dp),allocatable             :: ylm(:,:)    !real spherical harmonics for each k+G
     177                 :             :    real(dp),allocatable             :: ylmgr(:,:,:)!real spherical harmonics gradients         !FB: Needed?
     178                 :             :    type(pawcprj_type),  allocatable :: cprj(:,:)   !projectors applied on WF <p_lmn|C_nk>
     179                 :             :    type(pawcprj_type),  allocatable :: cprj0(:,:)  !projectors applied on WF <p_lmn|C_nk>
     180                 :             :    type(paw_an_type),   allocatable :: paw_an(:)   !various arrays on angular mesh
     181                 :             :    type(pawfgrtab_type),allocatable :: pawfgrtab(:) !PAW atomic data on fine grid
     182                 :             :    type(paw_ij_type),   allocatable :: paw_ij(:)   !various arrays on partial waves (i,j channels)
     183                 :             :    type(pawrad_type),   pointer     :: pawrad(:)   => NULL() !radial grid in PAW sphere
     184                 :             :    type(pawrhoij_type), pointer     :: pawrhoij(:) => NULL() !operator rho_ij= <psi|p_i><p_j|psi>
     185                 :             :    type(pawtab_type),   pointer     :: pawtab(:)   => NULL() !tabulated PAW atomic data
     186                 :             : 
     187                 :             :     contains
     188                 :             : 
     189                 :             :     procedure :: init => tdks_init
     190                 :             :     procedure :: free => tdks_free
     191                 :             : 
     192                 :             :  end type tdks_type
     193                 :             : !!***
     194                 :             : 
     195                 :             : contains
     196                 :             : !!***
     197                 :             : 
     198                 :             : !!****f* m_rttddft_tdks/tdks_init
     199                 :             : !!
     200                 :             : !! NAME
     201                 :             : !!  tdks_init
     202                 :             : !!
     203                 :             : !! FUNCTION
     204                 :             : !!  Initialize the tdks object
     205                 :             : !!
     206                 :             : !! INPUTS
     207                 :             : !!  codvsn = code version
     208                 :             : !!  dtfil <type datafiles_type> = infos about file names, file unit numbers
     209                 :             : !!  dtset <type(dataset_type)> = all input variables for this dataset
     210                 :             : !!  mpi_enreg <MPI_type> = MPI-parallelisation information
     211                 :             : !!  pawang <type(pawang_type)> = paw angular mesh and related data
     212                 :             : !!  pawrad(ntypat*usepaw) <type(pawrad_type)> = paw radial mesh and related data
     213                 :             : !!  pawtab(ntypat*usepaw) <type(pawtab_type)> = paw tabulated starting data
     214                 :             : !!  psps <type(pseudopotential_type)> = variables related to pseudopotentials
     215                 :             : !!
     216                 :             : !! OUTPUT
     217                 :             : !!  tdks <class(tdks_type)> = the tdks object to initialize
     218                 :             : !!
     219                 :             : !! SOURCE
     220                 :          50 : subroutine tdks_init(tdks ,codvsn, dtfil, dtset, mpi_enreg, pawang, pawrad, pawtab, psps)
     221                 :             : 
     222                 :             :  !Arguments ------------------------------------
     223                 :             :  !scalars
     224                 :             :  class(tdks_type),           intent(inout)        :: tdks
     225                 :             :  character(len=8),           intent(in)           :: codvsn
     226                 :             :  type(datafiles_type),       intent(in)           :: dtfil
     227                 :             :  type(dataset_type),         intent(inout)        :: dtset
     228                 :             :  type(MPI_type),             intent(inout)        :: mpi_enreg
     229                 :             :  type(pawang_type),          intent(inout),target :: pawang
     230                 :             :  type(pseudopotential_type), intent(inout)        :: psps
     231                 :             :  !arrays
     232                 :             :  type(pawrad_type),          intent(inout),target :: pawrad(psps%ntypat*psps%usepaw)
     233                 :             :  type(pawtab_type),          intent(inout),target :: pawtab(psps%ntypat*psps%usepaw)
     234                 :             : 
     235                 :             :  !Local variables-------------------------------
     236                 :             :  !scalars
     237                 :             :  integer                     :: ierr
     238                 :             :  integer                     :: my_natom
     239                 :             :  integer                     :: ncpgr
     240                 :             :  integer                     :: psp_gencond
     241                 :             :  real(dp)                    :: ecut_eff
     242                 :             :  character(len=500)          :: msg
     243                 :             :  character(len=fnlen)        :: fname_wfk
     244                 :             :  type(extfpmd_type),pointer  :: extfpmd => null()
     245                 :             :  !arrays
     246                 :          50 :  real(dp),allocatable        :: doccde(:)
     247                 :             : 
     248                 :             : ! ***********************************************************************
     249                 :             : 
     250                 :          50 :  my_natom=mpi_enreg%my_natom
     251                 :             : 
     252                 :             :  !1) Various initializations & checks (MPI, PW, FFT, PSP, Symmetry ...)
     253                 :          50 :  call first_setup(codvsn,dtfil,dtset,ecut_eff,mpi_enreg,pawrad,pawtab,psps,psp_gencond,tdks)
     254                 :             : 
     255                 :             :  !2) Deals with restart and setup some basic variables and filenames
     256                 :          50 :  tdks%first_step = 1
     257                 :          50 :  tdks%fname_tdener = dtfil%fnameabo_td_ener
     258                 :          50 :  tdks%fname_wfk0 = dtfil%fnamewffk
     259                 :          50 :  fname_wfk = dtfil%fnamewffk
     260                 :          50 :  tdks%fname_tdef = dtfil%fnameabo_td_ef
     261                 :          50 :  tdks%fname_current = dtfil%fnameabo_td_current
     262         [ +  + ]:          50 :  if (dtset%td_restart > 0) then
     263         [ +  + ]:          20 :    if (mpi_enreg%me == 0) then
     264         [ -  + ]:           6 :       if (open_file('TD_RESTART', msg, newunit=tdks%tdrestart_unit, status='old', form='formatted') /= 0) then
     265                 :           0 :          write(msg,'(a,a,a)') 'Error while trying to open file TD_RESTART needed to restart the calculation.'
     266                 :           0 :          ABI_ERROR(msg)
     267                 :             :       end if
     268                 :           6 :       read(tdks%tdrestart_unit,*) tdks%first_step
     269                 :           6 :       tdks%first_step = tdks%first_step + 1
     270                 :           6 :       read(tdks%tdrestart_unit,*) tdks%fname_wfk0
     271                 :           6 :       read(tdks%tdrestart_unit,*) fname_wfk
     272                 :           6 :       read(tdks%tdrestart_unit,*) tdks%fname_tdener
     273         [ +  + ]:           6 :       if (dtset%td_ef_type /= 0) then
     274                 :           3 :          read(tdks%tdrestart_unit,*) tdks%fname_tdef
     275                 :             :       end if
     276         [ +  + ]:           6 :       if (dtset%prtcurrent /= 0) then
     277                 :           3 :          read(tdks%tdrestart_unit,*) tdks%fname_current
     278                 :             :       end if
     279                 :             :    end if
     280                 :             :    !Send to all procs
     281                 :          20 :    call xmpi_bcast(tdks%first_step,0,mpi_enreg%comm_world,ierr)
     282                 :          20 :    call xmpi_bcast(tdks%fname_tdener,0,mpi_enreg%comm_world,ierr)
     283                 :          20 :    call xmpi_bcast(tdks%fname_wfk0,0,mpi_enreg%comm_world,ierr)
     284                 :          20 :    call xmpi_bcast(fname_wfk,0,mpi_enreg%comm_world,ierr)
     285                 :          20 :    call xmpi_bcast(tdks%fname_tdef,0,mpi_enreg%comm_world,ierr)
     286                 :          20 :    call xmpi_bcast(tdks%fname_current,0,mpi_enreg%comm_world,ierr)
     287                 :             :  else
     288         [ +  + ]:          30 :    if (mpi_enreg%me == 0) then
     289         [ -  + ]:          16 :       if (open_file('TD_RESTART', msg, newunit=tdks%tdrestart_unit, status='replace', form='formatted') /= 0) then
     290                 :           0 :          write(msg,'(a,a,a)') 'Error while trying to open file TD_RESTART.'
     291                 :           0 :          ABI_ERROR(msg)
     292                 :             :       end if
     293                 :             :    end if
     294                 :             :  end if
     295                 :             : 
     296                 :             :  !3) Reads initial KS orbitals from file (calls inwffil)
     297                 :          50 :  call read_wfk(dtfil,dtset,ecut_eff,fname_wfk,mpi_enreg,tdks)
     298                 :             : 
     299                 :             :  !4) Init occupation numbers
     300   [ -  +  +  -  :         150 :  ABI_MALLOC(tdks%occ0,(dtset%mband*dtset%nkpt*dtset%nsppol))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     301         [ +  + ]:        9138 :  tdks%occ0(:)=dtset%occ_orig(:,1)
     302                 :             :  !calc occupation number with metallic occupation using the previously read WF
     303         [ +  + ]:          50 :  if (dtset%occopt>=3.and.dtset%occopt<=9) then  ! allowing for occopt 9
     304   [ -  +  +  -  :          48 :    ABI_MALLOC(doccde,(dtset%mband*dtset%nkpt*dtset%nsppol))
             -  +  -  + ]
     305                 :             :    call newocc(doccde,tdks%eigen0,tdks%energies%entropy_ks,tdks%energies%e_fermie, &
     306                 :             :              & tdks%energies%e_fermih,dtset%ivalence,dtset%spinmagntarget,      &
     307                 :             :              & dtset%mband,dtset%nband,dtset%nelect,dtset%ne_qFD,dtset%nh_qFD,  &
     308                 :             :              & dtset%nkpt,dtset%nspinor,dtset%nsppol,tdks%occ0,dtset%occopt,    &
     309                 :          24 :              & dtset%prtvol,dtset%tphysel,dtset%tsmear,dtset%wtk,extfpmd=extfpmd)
     310         [ -  + ]:          24 :    ABI_FREE(doccde)
     311                 :             :  end if
     312                 :             : 
     313                 :             :  !5) Some further initialization (Mainly for PAW and allocation of arrays for Hamiltonian and densities)
     314                 :          50 :  call second_setup(dtset,mpi_enreg,pawang,pawrad,pawtab,psps,psp_gencond,tdks)
     315                 :             : 
     316                 :             :  !6) TD external elec. field perturbation
     317   [ +  +  -  + ]:          50 :  if (dtset%td_ef_type/=0 .and. psps%useylm/=1) ABI_ERROR("TD Electric field only works with spherical harmonics (useylm=1)")
     318   [ +  +  -  + ]:          50 :  if (dtset%td_ef_type/=0 .and. psps%usepaw/=1) ABI_ERROR("TD Electric field only works with PAW")
     319                 :             :  !Init vector potential and associated constants
     320   [ +  +  -  + ]:          50 :  if (dtset%td_ef_type/=0 .or. dtset%prtcurrent/=0) then
     321   [ -  +  +  -  :          63 :     ABI_MALLOC(tdks%current,(3,dtset%nsppol))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     322   [ +  +  +  + ]:         134 :     tdks%current = zero
     323                 :             :  end if
     324                 :             :  call tdks%tdef%init(dtset%td_ef_type,dtset%td_ef_pol,dtset%td_ef_ezero,dtset%td_ef_tzero, &
     325                 :          50 :                    & dtset%td_ef_lambda,dtset%td_ef_tau,dtset%td_ef_induced_vecpot,dtset%nkpt,dtset%kptns)
     326         [ +  + ]:          50 :  if (dtset%td_restart /=0) then
     327                 :          20 :     call tdks%tdef%restart(mpi_enreg, tdks%tdrestart_unit)
     328                 :             :     call tdks%tdef%update(dtset,mpi_enreg,(tdks%first_step-1)*dtset%dtele,tdks%rprimd,tdks%gprimd,tdks%kg, &
     329                 :          20 :                         & psps%mpsang,tdks%npwarr,tdks%ylm,tdks%ylmgr,tdks%current,update_vecpot_ind=.false.)
     330                 :             :  else
     331                 :             :     call tdks%tdef%update(dtset,mpi_enreg,(tdks%first_step-1)*dtset%dtele,tdks%rprimd,tdks%gprimd,tdks%kg, &
     332                 :          30 :                         & psps%mpsang,tdks%npwarr,tdks%ylm,tdks%ylmgr,tdks%current)
     333                 :             :  end if
     334                 :             : 
     335                 :             :  !7) Keep initial cg and cproj in memory for occupations
     336                 :             :  !Keep initial wavefunction in memory
     337         [ +  + ]:          50 :  if (dtset%td_restart == 0) then
     338   [ -  +  +  -  :          90 :    ABI_MALLOC(tdks%cg0,(2,tdks%mcg))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     339   [ +  +  +  + ]:     3468894 :    tdks%cg0(:,:) = tdks%cg(:,:)
     340                 :             :  end if
     341                 :             :  !and associated cprojs to compute occupations
     342         [ +  + ]:          50 :  if (psps%usepaw ==1) then
     343                 :          30 :     ncpgr=0
     344   [ -  +  +  -  :       12216 :     ABI_MALLOC(tdks%cprj0,(dtset%natom,tdks%mcprj))
          -  +  +  -  +  
          -  +  -  -  +  
          -  +  -  +  +  
                +  +  + ]
     345                 :          30 :     call pawcprj_alloc(tdks%cprj0,ncpgr,tdks%dimcprj)
     346                 :             :     call ctocprj(tdks%atindx,tdks%cg0,1,tdks%cprj0,tdks%gmet,tdks%gprimd,0,0,0,         &
     347                 :             :                & dtset%istwfk,tdks%kg,tdks%tdef%kpa,tdks%mcg,tdks%mcprj,dtset%mgfft,    &
     348                 :             :                & dtset%mkmem,mpi_enreg,psps%mpsang,dtset%mpw,dtset%natom,tdks%nattyp,   &
     349                 :             :                & dtset%nband,dtset%natom,dtset%ngfft,dtset%nkpt,dtset%nloalg,           &
     350                 :             :                & tdks%npwarr,dtset%nspinor,dtset%nsppol,dtset%nsppol,psps%ntypat,       &
     351                 :             :                & dtset%paral_kgb,tdks%ph1d,psps,tdks%rmet,dtset%typat,tdks%ucvol,       &
     352                 :          30 :                & tdks%unpaw,tdks%xred,tdks%ylm,tdks%ylmgr)
     353                 :             :  end if
     354   [ -  +  +  -  :         150 :  ABI_MALLOC(tdks%occ,(dtset%mband*dtset%nkpt*dtset%nsppol))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     355                 :             : 
     356                 :             :  !Keep some additional stuff in memory within the tdks object
     357                 :          50 :  tdks%unpaw  = dtfil%unpaw
     358                 :          50 :  tdks%dt     = dtset%dtele
     359                 :          50 :  tdks%ntime  = dtset%ntime
     360                 :             : 
     361                 :          50 :  tdks%pawang => pawang
     362                 :          50 :  tdks%pawrad => pawrad
     363                 :          50 :  tdks%pawtab => pawtab
     364                 :             : 
     365                 :          50 : end subroutine tdks_init
     366                 :             : !!***
     367                 :             : 
     368                 :             : !!****f* m_rttddft_tdks/tdks_free
     369                 :             : !!
     370                 :             : !! NAME
     371                 :             : !!  tdks_free
     372                 :             : !!
     373                 :             : !! FUNCTION
     374                 :             : !!  Free all the memory associated with the tdks object
     375                 :             : !!
     376                 :             : !! INPUTS
     377                 :             : !!  tdks <class(tdks_type)> = the tdks object to free
     378                 :             : !!  dtset <type(dataset_type)> = all input variables for this dataset
     379                 :             : !!  mpi_enreg <MPI_type> = MPI-parallelisation information
     380                 :             : !!  psps <type(pseudopotential_type)> = variables related to pseudopotentials
     381                 :             : !!
     382                 :             : !! OUTPUT
     383                 :             : !!
     384                 :             : !! SOURCE
     385                 :          49 : subroutine tdks_free(tdks,dtset,mpi_enreg,psps)
     386                 :             : 
     387                 :             :  !Arguments ------------------------------------
     388                 :             :  !scalars
     389                 :             :  class(tdks_type),           intent(inout) :: tdks
     390                 :             :  type(dataset_type),         intent(inout) :: dtset
     391                 :             :  type(MPI_type),             intent(inout) :: mpi_enreg
     392                 :             :  type(pseudopotential_type), intent(inout) :: psps
     393                 :             : 
     394                 :             : ! ***********************************************************************
     395                 :             : 
     396                 :             :    !Destroy hidden save variables
     397                 :          49 :    call bandfft_kpt_destroy_array(bandfft_kpt,mpi_enreg)
     398         [ +  + ]:          49 :    if (psps%usepaw ==1) then
     399                 :          29 :       call destroy_invovl(dtset%nkpt,dtset%gpu_option)
     400                 :             :    end if
     401   [ -  +  -  - ]:          49 :    if(tdks%gemm_nonlop_use_gemm .and. dtset%gpu_option==ABI_GPU_DISABLED) then
     402                 :           0 :       call destroy_gemm_nonlop(dtset%gpu_option)
     403                 :             :    end if
     404                 :             : 
     405                 :             :    !Call type destructors
     406                 :          49 :    call destroy_sc_dmft(tdks%paw_dmft)
     407                 :          49 :    call pawfgr_destroy(tdks%pawfgr)
     408                 :          49 :    call tdks%hdr%free()
     409                 :             : 
     410                 :             :    !Nullify pointers
     411         [ +  - ]:          49 :    if(associated(tdks%pawang)) tdks%pawang => null()
     412         [ +  - ]:          49 :    if(associated(tdks%pawrad)) tdks%pawrad => null()
     413         [ +  - ]:          49 :    if(associated(tdks%pawtab)) tdks%pawtab => null()
     414                 :             : 
     415                 :             :    !Deallocate allocatables
     416         [ +  - ]:          49 :    ABI_SFREE(tdks%atindx)
     417         [ +  - ]:          49 :    ABI_SFREE(tdks%atindx1)
     418         [ +  - ]:          49 :    ABI_SFREE(tdks%cg)
     419         [ +  - ]:          49 :    ABI_SFREE(tdks%cg0)
     420         [ +  + ]:          49 :    ABI_SFREE(tdks%current)
     421         [ +  + ]:          49 :    ABI_SFREE(tdks%dimcprj)
     422         [ +  + ]:          49 :    ABI_SFREE(tdks%dimcprj_srt)
     423         [ +  - ]:          49 :    ABI_SFREE(tdks%eigen)
     424         [ +  - ]:          49 :    ABI_SFREE(tdks%eigen0)
     425         [ +  - ]:          49 :    ABI_SFREE(tdks%grvdw)
     426         [ +  - ]:          49 :    ABI_SFREE(tdks%indsym)
     427         [ +  - ]:          49 :    ABI_SFREE(tdks%irrzon)
     428         [ +  - ]:          49 :    ABI_SFREE(tdks%kg)
     429         [ +  - ]:          49 :    ABI_SFREE(tdks%nattyp)
     430         [ +  - ]:          49 :    ABI_SFREE(tdks%nhat)
     431         [ +  - ]:          49 :    ABI_SFREE(tdks%nhatgr)
     432         [ +  - ]:          49 :    ABI_SFREE(tdks%npwarr)
     433         [ +  - ]:          49 :    ABI_SFREE(tdks%occ)
     434         [ +  - ]:          49 :    ABI_SFREE(tdks%occ0)
     435         [ +  - ]:          49 :    ABI_SFREE(tdks%ph1d)
     436         [ +  - ]:          49 :    ABI_SFREE(tdks%ph1df)
     437         [ +  - ]:          49 :    ABI_SFREE(tdks%phnons)
     438         [ +  - ]:          49 :    ABI_SFREE(tdks%rhog)
     439         [ +  - ]:          49 :    ABI_SFREE(tdks%rhor)
     440         [ +  - ]:          49 :    ABI_SFREE(tdks%symrec)
     441         [ +  - ]:          49 :    ABI_SFREE(tdks%taug)
     442         [ +  - ]:          49 :    ABI_SFREE(tdks%taur)
     443         [ +  - ]:          49 :    ABI_SFREE(tdks%vhartr)
     444         [ +  - ]:          49 :    ABI_SFREE(tdks%vpsp)
     445         [ +  - ]:          49 :    ABI_SFREE(tdks%vtrial)
     446         [ +  - ]:          49 :    ABI_SFREE(tdks%vxc)
     447         [ +  - ]:          49 :    ABI_SFREE(tdks%vxctau)
     448         [ +  - ]:          49 :    ABI_SFREE(tdks%vxc_hybcomp)
     449         [ +  - ]:          49 :    ABI_SFREE(tdks%xred)
     450         [ +  - ]:          49 :    ABI_SFREE(tdks%xccc3d)
     451         [ +  + ]:          49 :    ABI_SFREE(tdks%xcctau3d)
     452         [ +  - ]:          49 :    ABI_SFREE(tdks%ylm)
     453         [ +  - ]:          49 :    ABI_SFREE(tdks%ylmgr)
     454         [ +  - ]:          49 :    ABI_SFREE(tdks%tdef%kpa)
     455                 :             : 
     456         [ +  + ]:          49 :    if(allocated(tdks%cprj)) then
     457                 :          29 :       call pawcprj_free(tdks%cprj)
     458   [ +  -  +  +  :        8093 :       ABI_FREE(tdks%cprj)
          -  +  -  +  -  
                      + ]
     459                 :             :    end if
     460         [ +  + ]:          49 :    if(allocated(tdks%cprj0)) then
     461                 :          29 :       call pawcprj_free(tdks%cprj0)
     462   [ +  -  +  +  :        8093 :       ABI_FREE(tdks%cprj0)
          -  +  -  +  -  
                      + ]
     463                 :             :    end if
     464         [ +  + ]:          49 :    if(allocated(tdks%paw_an)) then
     465                 :          29 :       call paw_an_free(tdks%paw_an)
     466   [ +  -  +  +  :          95 :       ABI_FREE(tdks%paw_an)
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
             +  -  +  -  
                      + ]
     467                 :             :    end if
     468         [ +  + ]:          49 :    if(allocated(tdks%pawfgrtab)) then
     469                 :          29 :       call pawfgrtab_free(tdks%pawfgrtab)
     470   [ +  -  +  +  :          95 :       ABI_FREE(tdks%pawfgrtab)
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
                +  -  + ]
     471                 :             :    end if
     472         [ +  + ]:          49 :    if(allocated(tdks%paw_ij)) then
     473                 :          29 :       call paw_ij_free(tdks%paw_ij)
     474   [ +  -  +  +  :          95 :       ABI_FREE(tdks%paw_ij)
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
             -  +  -  + ]
     475                 :             :    end if
     476         [ +  - ]:          49 :    if(associated(tdks%pawrhoij)) then
     477                 :          49 :       call pawrhoij_free(tdks%pawrhoij)
     478         [ -  + ]:          49 :       ABI_FREE(tdks%pawrhoij)
     479                 :             :    end if
     480                 :             : 
     481                 :          49 : end subroutine tdks_free
     482                 :             : !!***
     483                 :             : 
     484                 :             : !!****f* m_rttddft_tdks/first_setup
     485                 :             : !!
     486                 :             : !! NAME
     487                 :             : !!  first_setup
     488                 :             : !!
     489                 :             : !! FUNCTION
     490                 :             : !!  Intialize many important quantities before running RT-TDDFT
     491                 :             : !!  (PW, FFT, PSP, Symmetry etc.)
     492                 :             : !!
     493                 :             : !! INPUTS
     494                 :             : !!  codvsn = code version
     495                 :             : !!  dtfil <type datafiles_type> = infos about file names, file unit numbers
     496                 :             : !!  dtset <type(dataset_type)> = all input variables for this dataset
     497                 :             : !!  mpi_enreg <MPI_type> = MPI-parallelisation information
     498                 :             : !!  pawrad(ntypat*usepaw) <type(pawrad_type)> = paw radial mesh and related data
     499                 :             : !!  pawtab(ntypat*usepaw) <type(pawtab_type)> = paw tabulated starting data
     500                 :             : !!  psps <type(pseudopotential_type)> = variables related to pseudopotentials
     501                 :             : !!  tdks <type(tdks_type)> = the tdks object to initialize
     502                 :             : !!
     503                 :             : !! OUTPUT
     504                 :             : !!  psp_gencond <integer> = store conditions for generating psp
     505                 :             : !!  ecut_eff <real(dp)> = effective PW cutoff energy
     506                 :             : !!
     507                 :             : !! NOTES
     508                 :             : !! USE OF FFT GRIDS:
     509                 :             : !! =================
     510                 :             : !! In case of PAW:
     511                 :             : !! ---------------
     512                 :             : !!    Two FFT grids are used:
     513                 :             : !!    - A "coarse" FFT grid (defined by ecut)
     514                 :             : !!      for the application of the Hamiltonian on the plane waves basis.
     515                 :             : !!      It is defined by nfft, ngfft, mgfft, ...
     516                 :             : !!      Hamiltonian, wave-functions, density related to WFs (rhor here), ...
     517                 :             : !!      are expressed on this grid.
     518                 :             : !!    - A "fine" FFT grid (defined) by ecutdg)
     519                 :             : !!      for the computation of the density inside PAW spheres.
     520                 :             : !!      It is defined by nfftf, ngfftf, mgfftf, ...
     521                 :             : !!      Total density, potentials, ...
     522                 :             : !!      are expressed on this grid.
     523                 :             : !! In case of norm-conserving:
     524                 :             : !! ---------------------------
     525                 :             : !!    - Only the usual FFT grid (defined by ecut) is used.
     526                 :             : !!      It is defined by nfft, ngfft, mgfft, ...
     527                 :             : !!      For compatibility reasons, (nfftf,ngfftf,mgfftf)
     528                 :             : !!      are set equal to (nfft,ngfft,mgfft) in that case.
     529                 :             : !! In case of wavelets:
     530                 :             : !! --------------------
     531                 :             : !!    - Only the usual FFT grid (defined by wvl_crmult) is used.
     532                 :             : !!      It is defined by nfft, ngfft, mgfft, ... This is strictly not
     533                 :             : !!      an FFT grid since its dimensions are not suited for FFTs. They are
     534                 :             : !!      defined by wvl_setngfft().
     535                 :             : !!      For compatibility reasons, (nfftf,ngfftf,mgfftf)
     536                 :             : !!      are set equal to (nfft,ngfft,mgfft) in that case.
     537                 :             : !!
     538                 :             : !! SOURCE
     539                 :          50 : subroutine first_setup(codvsn,dtfil,dtset,ecut_eff,mpi_enreg,pawrad,pawtab,psps,psp_gencond,tdks)
     540                 :             : 
     541                 :             :  !Arguments ------------------------------------
     542                 :             :  !scalars
     543                 :             :  character(len=8),           intent(in)    :: codvsn
     544                 :             :  integer,                    intent(out)   :: psp_gencond
     545                 :             :  real(dp),                   intent(out)   :: ecut_eff
     546                 :             :  type(datafiles_type),       intent(in)    :: dtfil
     547                 :             :  type(dataset_type),         intent(inout) :: dtset
     548                 :             :  type(pseudopotential_type), intent(inout) :: psps
     549                 :             :  type(MPI_type),             intent(inout) :: mpi_enreg
     550                 :             :  type(tdks_type),            intent(inout) :: tdks
     551                 :             :  !arrays
     552                 :             :  type(pawrad_type),          intent(inout) :: pawrad(psps%ntypat*psps%usepaw)
     553                 :             :  type(pawtab_type),          intent(inout) :: pawtab(psps%ntypat*psps%usepaw)
     554                 :             : 
     555                 :             :  !Local variables-------------------------------
     556                 :             :  !scalars
     557                 :             :  integer,parameter    :: response=0, cplex=1
     558                 :             :  integer              :: comm_psp
     559                 :             :  integer              :: gscase
     560                 :             :  integer              :: iatom, ierr, itypat, indx
     561                 :             :  integer              :: mgfftf, my_natom
     562                 :             :  integer              :: npwmin, nfftot
     563                 :             :  real(dp)             :: gsqcut_eff, gsqcutc_eff
     564                 :             :  real(dp)             :: ecutdg_eff
     565                 :          50 :  type(ebands_t)       :: bstruct
     566                 :             :  !arrays
     567                 :             :  character(len=500)   :: msg
     568                 :          50 :  integer, allocatable :: npwarr_(:)
     569                 :             :  integer              :: ngfft(18)
     570                 :             :  integer              :: ngfftf(18)
     571                 :         100 :  integer              :: npwtot(dtset%nkpt)
     572                 :             : 
     573                 :             : ! ***********************************************************************
     574                 :             : 
     575                 :          50 :  my_natom=mpi_enreg%my_natom
     576                 :             : 
     577                 :             :  !** Init FFT grid(s) sizes (be careful !)
     578                 :             :  !See NOTES in the comments at the beginning of this subroutine.
     579                 :          50 :  tdks%nfft = dtset%nfft
     580                 :             :  call pawfgr_init(tdks%pawfgr,dtset,mgfftf,tdks%nfftf,ecut_eff,ecutdg_eff, &
     581                 :          50 :                 & ngfft,ngfftf)
     582                 :             : 
     583                 :             :  !** Init to zero different energies
     584                 :          50 :  call tdks%energies%init()
     585                 :          50 :  tdks%ecore = zero
     586                 :          50 :  tdks%etot = zero
     587                 :             : 
     588                 :             :  !** various additional setup mostly related to fft grids and the box (rprimd, metric..)
     589                 :             :  call setup1(dtset%acell_orig,tdks%bantot,dtset,ecutdg_eff,ecut_eff,tdks%gmet, &
     590                 :             :            & tdks%gprimd,gsqcut_eff,gsqcutc_eff,ngfftf,ngfft,dtset%nkpt,       &
     591                 :             :            & dtset%nsppol,response,tdks%rmet,dtset%rprim_orig,tdks%rprimd,     &
     592                 :          50 :            & tdks%ucvol,psps%usepaw)
     593                 :             : 
     594                 :             :  !** Set up the basis sphere of planewaves
     595   [ -  +  +  -  :         150 :  ABI_MALLOC(tdks%npwarr,(dtset%nkpt))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     596   [ -  +  +  -  :         150 :  ABI_MALLOC(tdks%kg,(3,dtset%mpw*dtset%mkmem))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     597                 :             :  call kpgio(ecut_eff,dtset%exchn2n3d,tdks%gmet,dtset%istwfk,tdks%kg,dtset%kptns, &
     598                 :             :           & dtset%mkmem,dtset%nband,dtset%nkpt,'PERS',mpi_enreg,dtset%mpw,       &
     599                 :          50 :           & tdks%npwarr,npwtot,dtset%nsppol)
     600                 :             :  call bandfft_kpt_init1(bandfft_kpt,dtset%istwfk,tdks%kg,dtset%mgfft,dtset%mkmem, &
     601                 :             :                       & mpi_enreg,dtset%mpw,dtset%nband,dtset%nkpt,tdks%npwarr,   &
     602                 :          50 :                       & dtset%nsppol)
     603                 :             : 
     604                 :             :  !** Use efficient BLAS calls for computing the non local potential (No GPU yet)
     605   [ -  +  -  - ]:          50 :  if(dtset%use_gemm_nonlop == 1 .and. dtset%gpu_option==ABI_GPU_DISABLED) then
     606                 :             :    ! set global variable
     607                 :           0 :    tdks%gemm_nonlop_use_gemm = .true.
     608                 :           0 :    call init_gemm_nonlop(dtset%gpu_option)
     609                 :             :  else
     610                 :          50 :    tdks%gemm_nonlop_use_gemm = .false.
     611                 :             :  end if
     612                 :             : 
     613                 :             :  !** TODO: uncomment when gemm_nonlop can be used on GPU
     614                 :             :  ! if(dtset%use_gemm_nonlop == 1 .and. dtset%gpu_option/=ABI_GPU_DISABLED) then
     615                 :             :  !   ! set global variable
     616                 :             :  !   tdks%gemm_nonlop_use_gemm_gpu = .true.
     617                 :             :  !   !call init_gemm_nonlop_gpu(dtset%nkpt)
     618                 :             :  ! else
     619                 :             :  !   tdks%gemm_nonlop_use_gemm_gpu = .false.
     620                 :             :  ! end if
     621                 :             : 
     622                 :             :  !** Initialize band structure datatype
     623   [ -  +  +  -  :         150 :  ABI_MALLOC(npwarr_,(dtset%nkpt))
          +  -  +  -  -  
                +  -  + ]
     624         [ +  + ]:         958 :  npwarr_(:)=tdks%npwarr(:)
     625         [ +  + ]:          50 :  if (dtset%paral_kgb/=0) then
     626                 :          32 :    call xmpi_sum(npwarr_,mpi_enreg%comm_bandfft,ierr)
     627                 :             :  end if
     628                 :          50 :  call bstruct%from_dtset(dtset, npwarr_)
     629         [ -  + ]:          50 :  ABI_FREE(npwarr_)
     630                 :          50 :  call unpack_eneocc(dtset%nkpt,dtset%nsppol,bstruct%mband,bstruct%nband,dtset%occ_orig(:,1),bstruct%occ,val=zero)
     631                 :             : 
     632                 :             :  !** Open and read pseudopotential files
     633                 :          50 :  comm_psp=mpi_enreg%comm_cell
     634                 :             :  call pspini(dtset,dtfil,tdks%ecore,psp_gencond,gsqcutc_eff,gsqcut_eff,pawrad, &
     635                 :          50 :            & pawtab,psps,tdks%rprimd,comm_mpi=comm_psp)
     636                 :             : 
     637                 :             :  !In case of isolated computations, ecore must be set to zero
     638                 :             :  !because its contribution is counted in the ewald energy as the ion-ion interaction.
     639         [ -  + ]:          50 :  if (dtset%icoulomb == 1) tdks%ecore = zero
     640                 :             : 
     641                 :             :  !Include core energy?
     642                 :         100 :  select case(dtset%usepotzero)
     643                 :             :  case(0,1)
     644                 :          50 :    tdks%energies%e_corepsp   = tdks%ecore / tdks%ucvol
     645                 :          50 :    tdks%energies%e_corepspdc = zero
     646                 :             :  case(2)
     647                 :             :    ! No need to include the PspCore energy since it is already included in the
     648                 :             :    ! local pseudopotential  (vpsp)
     649                 :           0 :    tdks%energies%e_corepsp   = zero
     650      [ +  -  - ]:          50 :    tdks%energies%e_corepspdc = zero
     651                 :             :  end select
     652                 :             : 
     653                 :             :  !** Initialize PAW atomic occupancies
     654   [ +  +  +  -  :         218 :  ABI_MALLOC(tdks%pawrhoij,(my_natom*psps%usepaw))
          +  -  +  +  -  
          +  -  +  +  +  
                   +  - ]
     655         [ +  + ]:          50 :  if (psps%usepaw == 1) then
     656                 :             :    call initrhoij(dtset%pawcpxocc,dtset%lexexch,dtset%lpawu,my_natom,dtset%natom, &
     657                 :             :                 & dtset%nspden,dtset%nspinor,dtset%nsppol,dtset%ntypat,           &
     658                 :             :                 & tdks%pawrhoij,dtset%pawspnorb,pawtab,cplex,dtset%spinat,        &
     659                 :             :                 & dtset%typat,comm_atom=mpi_enreg%comm_atom,                      &
     660   [ +  -  -  -  :          30 :                 & mpi_atmtab=mpi_enreg%my_atmtab)
          -  -  -  +  -  
          -  -  -  -  -  
          -  -  -  -  -  
                -  -  - ]
     661                 :             :  end if
     662                 :             : 
     663                 :             :  !Nullify wvl_data. It is important to do so irregardless of the value of usewvl
     664                 :             :  !Only needed here because hdr%init requires a wvl object for the wvl%descr input
     665                 :          50 :  call nullify_wvl_data(tdks%wvl)
     666                 :             : 
     667                 :             :  !** Initialize header
     668                 :          50 :  gscase=0
     669                 :             :  call tdks%hdr%init(bstruct,codvsn,dtset,pawtab,gscase,psps,tdks%wvl%descr,&
     670                 :          50 :                     comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab)
     671                 :             : 
     672                 :             :  !Clean band structure datatype
     673                 :          50 :  call bstruct%free()
     674                 :             : 
     675                 :             :  !** PW basis set: test if the problem is ill-defined.
     676         [ +  + ]:         958 :  npwmin=minval(tdks%hdr%npwarr(:))
     677         [ -  + ]:          50 :  if (dtset%mband > npwmin) then
     678                 :             :    ! No way we can solve the problem. Abort now!
     679                 :           0 :    write(msg,"(2(a,i0),4a)") "Number of bands nband= ",dtset%mband, &
     680                 :           0 :    & " > number of planewaves npw= ",npwmin,ch10,                   &
     681                 :           0 :    & "The number of eigenvectors cannot be greater that the size of the Hamiltonian!",&
     682                 :           0 :    & ch10, "Action: decrease nband or, alternatively, increase ecut"
     683         [ #  # ]:           0 :    if (dtset%ionmov/=23) then
     684                 :           0 :       ABI_ERROR(msg)
     685                 :             :    else
     686                 :           0 :       ABI_WARNING(msg)
     687                 :             :    end if
     688                 :             : 
     689         [ -  + ]:          50 :  else if (dtset%mband >= 0.9 * npwmin) then
     690                 :             :    ! Warn the user
     691                 :           0 :    write(msg,"(a,i0,a,f6.1,4a)") "Number of bands nband= ",dtset%mband, &
     692                 :           0 :    & " >= 0.9 * maximum number of planewaves= ",0.9*npwmin,ch10,&
     693                 :           0 :    & "This could lead to some instabilities, you might want to decrease nband or increase ecut!", &
     694                 :           0 :    & ch10,"Assume experienced user. Execution will continue."
     695                 :           0 :    ABI_WARNING(msg)
     696                 :             :  end if
     697                 :             : 
     698                 :             :  !** Initialize symmetry
     699                 :          50 :  nfftot=ngfft(1)*ngfft(2)*ngfft(3)
     700   [ -  +  +  -  :         200 :  ABI_MALLOC(tdks%irrzon,(nfftot**(1-1/dtset%nsym),2,(dtset%nspden/dtset%nsppol)-3*(dtset%nspden/4)))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     701   [ -  +  +  -  :         200 :  ABI_MALLOC(tdks%phnons,(2,nfftot**(1-1/dtset%nsym),(dtset%nspden/dtset%nsppol)-3*(dtset%nspden/4)))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     702   [ -  +  +  -  :         200 :  ABI_MALLOC(tdks%indsym,(4,dtset%nsym,dtset%natom))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     703   [ -  +  +  -  :         150 :  ABI_MALLOC(tdks%symrec,(3,3,dtset%nsym))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     704   [ +  +  +  +  :     1360680 :  tdks%irrzon(:,:,:)=0
                   +  + ]
     705   [ +  +  +  +  :     2040820 :  tdks%phnons(:,:,:)=zero
                   +  + ]
     706   [ +  +  +  +  :      104838 :  tdks%indsym(:,:,:)=0
                   +  + ]
     707   [ +  +  +  +  :       76178 :  tdks%symrec(:,:,:)=0
                   +  + ]
     708                 :             : 
     709                 :             :  !Do symmetry stuff if nsym>1
     710         [ +  - ]:          50 :  if (dtset%nsym>1) then
     711                 :             :    call setsym(tdks%indsym,tdks%irrzon,dtset%iscf,dtset%natom, &
     712                 :             :    & nfftot,ngfft,dtset%nspden,dtset%nsppol,dtset%nsym, &
     713                 :             :    & tdks%phnons,dtset%symafm,tdks%symrec,dtset%symrel, &
     714                 :          50 :    & dtset%tnons,dtset%typat,dtset%xred_orig)
     715                 :             : 
     716                 :             :    !Make sure dtset%iatfix does not break symmetry
     717                 :          50 :    call fixsym(dtset%iatfix,tdks%indsym,dtset%natom,dtset%nsym)
     718                 :             :  else
     719                 :             :    !The symrec array is used by initberry even in case nsym = 1
     720   [ #  #  #  # ]:           0 :    tdks%symrec(:,:,1) = 0
     721                 :           0 :    tdks%symrec(1,1,1) = 1 ; tdks%symrec(2,2,1) = 1 ; tdks%symrec(3,3,1) = 1
     722                 :             :  end if
     723                 :             : 
     724                 :             :  !** Initialize and eventually symmetrize reduced atomic coordinates
     725   [ -  +  +  -  :         200 :  ABI_MALLOC(tdks%xred,(3,dtset%natom,dtset%nimage))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     726   [ +  -  +  -  :         742 :  tdks%xred = dtset%xred_orig
          +  -  -  +  -  
          -  -  -  -  -  
          -  -  +  +  +  
                +  +  + ]
     727                 :             :  !Eventually symmetrize atomic coordinates over space group elements
     728                 :             :  call symmetrize_xred(dtset%natom,dtset%nsym,dtset%symrel,dtset%tnons,tdks%xred, &
     729                 :          50 :                     & indsym=tdks%indsym)
     730                 :             : 
     731                 :             :  !** Create the atindx array
     732                 :             :  !** index table of atoms, in order for them to be used type after type.
     733   [ -  +  +  -  :         150 :  ABI_MALLOC(tdks%atindx,(dtset%natom))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     734   [ -  +  +  -  :         100 :  ABI_MALLOC(tdks%atindx1,(dtset%natom))
          -  +  -  +  -  
                      + ]
     735   [ -  +  +  -  :         150 :  ABI_MALLOC(tdks%nattyp,(psps%ntypat))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     736                 :          50 :  indx=1
     737         [ +  + ]:         100 :  do itypat=1,psps%ntypat
     738                 :          50 :    tdks%nattyp(itypat)=0
     739         [ +  + ]:         248 :    do iatom=1,dtset%natom
     740         [ +  - ]:         198 :       if(dtset%typat(iatom)==itypat)then
     741                 :         148 :          tdks%atindx(iatom)=indx
     742                 :         148 :          tdks%atindx1(indx)=iatom
     743                 :         148 :          indx=indx+1
     744                 :         148 :           tdks%nattyp(itypat)=tdks%nattyp(itypat)+1
     745                 :             :       end if
     746                 :             :    end do
     747                 :             :  end do
     748                 :             : 
     749                 :             :  !** Calculate zion: the total positive charge acting on the valence electrons
     750                 :          50 :  tdks%zion=zero
     751         [ +  + ]:         198 :  do iatom=1,dtset%natom
     752                 :         198 :    tdks%zion=tdks%zion+psps%ziontypat(dtset%typat(iatom))
     753                 :             :  end do
     754                 :             : 
     755   [ -  +  -  +  :         100 : end subroutine first_setup
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
                +  -  + ]
     756                 :             : !!***
     757                 :             : 
     758                 :             : !!****f* m_rttddft_tdks/second_setup
     759                 :             : !!
     760                 :             : !! NAME
     761                 :             : !! second_setup
     762                 :             : !!
     763                 :             : !! FUNCTION
     764                 :             : !! Further important initialization required after reading WFK and computing
     765                 :             : !! occupation numbers in paticular related to PAW
     766                 :             : !!
     767                 :             : !! INPUTS
     768                 :             : !! dtset <type(dataset_type)> = all input variables for this dataset
     769                 :             : !! mpi_enreg <MPI_type> = MPI-parallelisation information
     770                 :             : !! pawang <type(pawang_type)> = paw angular mesh and related data
     771                 :             : !! pawrad(ntypat*usepaw) <type(pawrad_type)> = paw radial mesh and related data
     772                 :             : !! pawtab(ntypat*usepaw) <type(pawtab_type)> = paw tabulated starting data
     773                 :             : !! psps <type(pseudopotential_type)> = variables related to pseudopotentials
     774                 :             : !! psp_gencond <integer> = store conditions for generating psp
     775                 :             : !! tdks <type(tdks_type)> = the tdks object to initialize
     776                 :             : !!
     777                 :             : !! OUTPUT
     778                 :             : !!
     779                 :             : !! SOURCE
     780                 :          50 : subroutine second_setup(dtset, mpi_enreg, pawang, pawrad, pawtab, psps, psp_gencond, tdks)
     781                 :             : 
     782                 :             :  !Arguments ------------------------------------
     783                 :             :  !scalars
     784                 :             :  integer,                    intent(in)    :: psp_gencond
     785                 :             :  type(pawang_type),          intent(inout) :: pawang
     786                 :             :  type(dataset_type),         intent(inout) :: dtset
     787                 :             :  type(pseudopotential_type), intent(inout) :: psps
     788                 :             :  type(MPI_type),             intent(inout) :: mpi_enreg
     789                 :             :  !arrays
     790                 :             :  type(pawrad_type),          intent(inout) :: pawrad(psps%ntypat*psps%usepaw)
     791                 :             :  type(pawtab_type),          intent(inout) :: pawtab(psps%ntypat*psps%usepaw)
     792                 :             :  type(tdks_type),            intent(inout) :: tdks
     793                 :             : 
     794                 :             :  !Local variables-------------------------------
     795                 :             :  !scalars
     796                 :             :  logical             :: call_pawinit
     797                 :             :  integer, parameter  :: cplex = 1
     798                 :             :  integer             :: forces_needed
     799                 :             :  integer             :: gnt_option
     800                 :             :  integer             :: has_dijhat, has_vhartree, has_dijfock
     801                 :             :  integer             :: has_dijnd, has_dijU, has_vxctau
     802                 :             :  integer             :: my_natom, my_nspinor
     803                 :             :  integer             :: ncpgr
     804                 :             :  integer             :: optcut, optgr0, optgr1, optgr2, optrad
     805                 :             :  integer             :: stress_needed
     806                 :             :  integer             :: ylm_option
     807                 :             :  integer             :: use_hybcomp, usevxctau
     808                 :             :  real(dp)            :: boxcut
     809                 :             :  real(dp)            :: gsqcut_shp
     810                 :             :  real(dp)            :: hyb_range_fock
     811                 :             :  real(dp),parameter  :: k0(3)=(/zero,zero,zero/)
     812                 :             :  !arrays
     813                 :          50 :  integer,allocatable :: l_size_atm(:)
     814                 :             : 
     815                 :             : ! ***********************************************************************
     816                 :             : 
     817                 :          50 :  my_natom=mpi_enreg%my_natom
     818                 :          50 :  my_nspinor=max(1,dtset%nspinor/mpi_enreg%nproc_spinor)
     819                 :             : 
     820                 :             :  !FB: @MT needed?
     821         [ +  + ]:          50 :  if (psps%usepaw==1) then
     822                 :             :     call pawrhoij_copy(tdks%hdr%pawrhoij,tdks%pawrhoij,comm_atom=mpi_enreg%comm_atom, &
     823                 :          30 :                      & mpi_atmtab=mpi_enreg%my_atmtab)
     824                 :             :  end if
     825                 :             : 
     826                 :             :  !FB: Needed because paw_dmft is required in mkrho
     827                 :             :  !PAW related operations
     828                 :             :  !Initialize paw_dmft, even if neither dmft not paw are used
     829                 :          50 :  call init_sc_dmft(dtset,psps%mpsang,tdks%paw_dmft,mpi_enreg=mpi_enreg,use_sc_dmft=0)
     830                 :             : 
     831                 :             : 
     832                 :             :  !*** Main PAW initialization ***
     833                 :             : 
     834                 :             :  !** Setup the Ylm for each k point
     835         [ +  + ]:          50 :  if (psps%useylm==1) then
     836   [ -  +  +  -  :         120 :    ABI_MALLOC(tdks%ylm,(dtset%mpw*dtset%mkmem,psps%mpsang*psps%mpsang*psps%useylm))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     837   [ -  +  +  -  :         120 :    ABI_MALLOC(tdks%ylmgr,(dtset%mpw*dtset%mkmem,3,psps%mpsang*psps%mpsang*psps%useylm))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     838                 :          30 :    ylm_option=0
     839                 :             :    call initylmg(tdks%gprimd,tdks%kg,dtset%kptns,dtset%mkmem,mpi_enreg,&
     840                 :             :    & psps%mpsang,dtset%mpw,dtset%nband,dtset%nkpt,&
     841                 :          30 :    & tdks%npwarr,dtset%nsppol,ylm_option,tdks%rprimd,tdks%ylm,tdks%ylmgr)
     842                 :             :  else
     843   [ -  +  -  + ]:          20 :    ABI_MALLOC(tdks%ylm,(0,0))
     844   [ -  +  -  + ]:          20 :    ABI_MALLOC(tdks%ylmgr,(0,0,0))
     845                 :             :  end if
     846                 :             : 
     847                 :          50 :  tdks%mcprj=0;tdks%mband_cprj=0
     848         [ +  + ]:          50 :  if(psps%usepaw==1) then
     849                 :          30 :    gnt_option=1
     850   [ +  -  +  -  :          30 :    if (dtset%pawxcdev==2.or.(dtset%pawxcdev==1.and.dtset%positron/=0)) gnt_option=2
                   -  + ]
     851                 :             : 
     852                 :             :    !** Test if we have to call pawinit
     853                 :             :    ! Some gen-cond have to be added...
     854                 :          30 :    call paw_gencond(dtset,gnt_option,"test",call_pawinit)
     855                 :             : 
     856   [ +  +  -  + ]:          30 :    if (psp_gencond==1.or.call_pawinit) then
     857                 :           2 :       gsqcut_shp=two*abs(dtset%diecut)*dtset%dilatmx**2/pi**2
     858                 :           2 :       hyb_range_fock=zero
     859         [ +  - ]:           2 :       if (dtset%ixc<0) then
     860                 :           2 :          call libxc_functionals_get_hybridparams(hyb_range=hyb_range_fock)
     861                 :             :       end if
     862                 :             :       call pawinit(dtset%effmass_free,gnt_option,gsqcut_shp,hyb_range_fock,  &
     863                 :             :                  & dtset%pawlcutd,dtset%pawlmix,psps%mpsang,dtset%pawnphi,   &
     864                 :             :                  & dtset%nsym,dtset%pawntheta,pawang,pawrad,dtset%pawspnorb, &
     865                 :           2 :                  & pawtab,dtset%pawxcdev,dtset%ixc,dtset%usepotzero)
     866                 :             : 
     867                 :             :       ! Update internal values
     868                 :           2 :       call paw_gencond(dtset,gnt_option,"save",call_pawinit)
     869                 :             :    end if
     870         [ +  + ]:          60 :    psps%n1xccc=maxval(pawtab(1:psps%ntypat)%usetcore)
     871                 :             :    call setsym_ylm(tdks%gprimd,pawang%l_max-1,dtset%nsym,dtset%pawprtvol, &
     872                 :          30 :                  & tdks%rprimd,tdks%symrec,pawang%zarot)
     873                 :             : 
     874                 :             :    !** Initialisation of cprj
     875                 :          30 :    tdks%mband_cprj=dtset%mband
     876         [ +  + ]:          30 :    if (dtset%paral_kgb/=0) tdks%mband_cprj=tdks%mband_cprj/mpi_enreg%nproc_band
     877                 :          30 :    tdks%mcprj=my_nspinor*tdks%mband_cprj*dtset%mkmem*dtset%nsppol
     878   [ -  +  +  -  :       12216 :    ABI_MALLOC(tdks%cprj,(dtset%natom,tdks%mcprj))
          -  +  +  -  +  
          -  +  -  -  +  
          -  +  -  +  +  
             +  +  +  +  
                      - ]
     879                 :          30 :    ncpgr=0
     880                 :             :    !FB: @MT dimcprj_srt needed?
     881   [ -  +  +  -  :          90 :    ABI_MALLOC(tdks%dimcprj,(dtset%natom))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     882   [ -  +  +  -  :          60 :    ABI_MALLOC(tdks%dimcprj_srt,(dtset%natom))
          -  +  -  +  -  
                      + ]
     883                 :             :    call pawcprj_getdim(tdks%dimcprj,dtset%natom,tdks%nattyp,dtset%ntypat, &
     884                 :          30 :                      & dtset%typat,pawtab,'R')
     885                 :             :    call pawcprj_getdim(tdks%dimcprj_srt,dtset%natom,tdks%nattyp,dtset%ntypat,  &
     886                 :          30 :                      & dtset%typat,pawtab,'O')
     887                 :             :    !call pawcprj_alloc(tdks%cprj,ncpgr,dimcprj_srt)
     888                 :          30 :    call pawcprj_alloc(tdks%cprj,ncpgr,tdks%dimcprj)
     889                 :             :    !ABI_FREE(dimcprj_srt)
     890                 :             : 
     891                 :             :    !** Variables/arrays related to the fine FFT grid
     892   [ -  +  +  -  :         158 :    ABI_MALLOC(tdks%pawfgrtab,(my_natom))
          +  -  +  -  -  
          +  -  +  -  +  
             +  +  +  - ]
     893         [ +  - ]:          30 :    if (my_natom>0) then
     894                 :             :      call pawtab_get_lsize(pawtab,l_size_atm,my_natom,dtset%typat, &
     895                 :          30 :                          & mpi_atmtab=mpi_enreg%my_atmtab)
     896                 :             :      call pawfgrtab_init(tdks%pawfgrtab,cplex,l_size_atm,dtset%nspden,dtset%typat, &
     897                 :          30 :                      & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom)
     898         [ -  + ]:          30 :      ABI_FREE(l_size_atm)
     899                 :             :    end if
     900         [ +  + ]:          60 :    tdks%usexcnhat=maxval(pawtab(:)%usexcnhat)
     901                 :             : 
     902                 :             :    !** Variables/arrays related to the PAW spheres
     903   [ -  +  +  -  :         158 :    ABI_MALLOC(tdks%paw_ij,(my_natom))
          +  -  +  -  -  
          +  -  +  -  +  
             +  +  +  - ]
     904   [ -  +  +  -  :         158 :    ABI_MALLOC(tdks%paw_an,(my_natom))
          +  -  +  -  -  
          +  -  +  -  +  
             +  +  +  - ]
     905                 :          30 :    call paw_an_nullify(tdks%paw_an)
     906                 :          30 :    call paw_ij_nullify(tdks%paw_ij)
     907         [ -  + ]:          30 :    has_dijhat=0; if (dtset%iscf==22) has_dijhat=1
     908   [ +  -  -  + ]:          30 :    has_vhartree=0; if (dtset%prtvha > 0 .or. dtset%prtvclmb > 0) has_vhartree=1
     909   [ +  +  +  +  :         302 :    has_dijnd=0;if(any(abs(dtset%nucdipmom)>tol8)) has_dijnd=1
             +  -  -  + ]
     910                 :          30 :    has_dijfock=0
     911         [ +  - ]:          30 :    has_dijU=merge(0,1,dtset%usepawu>0) !Be careful on this!
     912                 :          30 :    has_vxctau=pawxc_get_usekden(dtset%ixc)
     913                 :             :    call paw_an_init(tdks%paw_an,dtset%natom,dtset%ntypat,0,0,dtset%nspden,        &
     914                 :             :                   & cplex,dtset%pawxcdev,dtset%typat,pawang,pawtab,has_vxc=1,     &
     915                 :             :                   & has_vxctau=has_vxctau,has_vxc_ex=1,has_vhartree=has_vhartree, &
     916                 :          30 :                   & comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab)
     917                 :             :    call paw_ij_init(tdks%paw_ij,cplex,dtset%nspinor,dtset%nsppol,dtset%nspden,   &
     918                 :             :                   & dtset%pawspnorb,dtset%natom,dtset%ntypat,dtset%typat,pawtab, &
     919                 :             :                   & has_dij=1,has_dijfock=has_dijfock,has_dijhartree=1,          &
     920                 :             :                   & has_dijnd=has_dijnd,has_dijso=1,has_dijhat=has_dijhat,       &
     921                 :             :                   & has_dijU=has_dijU,has_pawu_occ=1,has_exexch_pot=1,           &
     922                 :             :                   & nucdipmom=dtset%nucdipmom,comm_atom=mpi_enreg%comm_atom,     &
     923                 :          30 :                   & mpi_atmtab=mpi_enreg%my_atmtab)
     924                 :             : 
     925                 :             :    !** Check for non-overlapping spheres
     926                 :             :    call chkpawovlp(dtset%natom,psps%ntypat,dtset%pawovlp,pawtab,tdks%rmet, &
     927                 :          30 :                  & dtset%typat,tdks%xred)
     928                 :             : 
     929                 :             :    !** Identify parts of the rectangular grid where the density has to be calculated
     930                 :          30 :    optcut=0;optgr0=dtset%pawstgylm;optgr1=0;optgr2=0;optrad=1-dtset%pawstgylm
     931                 :          30 :    forces_needed=0 !FB TODO Maybe needs to be changed if Ehrenfest?
     932                 :          30 :    stress_needed=0
     933                 :             :    if ((forces_needed==1) .or.                                                &
     934   [ +  +  +  -  :          30 :      & (dtset%xclevel==2 .and. dtset%pawnhatxc>0 .and. tdks%usexcnhat>0) .or. &
                   -  + ]
     935                 :             :      & (dtset%positron/=0.and.forces_needed==2)) then
     936                 :           0 :      optgr1=dtset%pawstgylm
     937         [ #  # ]:           0 :      if (stress_needed==1) optrad=1; if (dtset%pawprtwf==1) optrad=1
     938                 :             :    end if
     939                 :             :    call nhatgrid(tdks%atindx1,tdks%gmet,my_natom,dtset%natom,                    &
     940                 :             :                & tdks%nattyp,tdks%pawfgr%ngfft,psps%ntypat,optcut,optgr0,optgr1, &
     941                 :             :                & optgr2,optrad,tdks%pawfgrtab,pawtab,tdks%rprimd,dtset%typat,    &
     942                 :             :                & tdks%ucvol,tdks%xred,comm_atom=mpi_enreg%comm_atom,             &
     943                 :             :                & mpi_atmtab=mpi_enreg%my_atmtab,comm_fft=mpi_enreg%comm_fft,     &
     944                 :          30 :                & distribfft=mpi_enreg%distribfft)
     945                 :             : 
     946         [ +  + ]:          30 :    tdks%nhatgrdim=0;if (dtset%xclevel==2) tdks%nhatgrdim=tdks%usexcnhat*dtset%pawnhatxc
     947         [ -  + ]:          30 :    if (tdks%nhatgrdim>0)   then
     948   [ #  #  #  #  :           0 :       ABI_MALLOC(tdks%nhatgr,(cplex*tdks%nfftf,dtset%nspden,3*tdks%nhatgrdim))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
     949                 :             :    else
     950   [ -  +  -  + ]:          30 :       ABI_MALLOC(tdks%nhatgr,(0,0,0))
     951                 :             :    end if
     952                 :             : 
     953   [ -  +  +  -  :         120 :    ABI_MALLOC(tdks%nhat,(tdks%nfftf,dtset%nspden*psps%usepaw))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     954                 :             : 
     955                 :             :    !Required in the PAW case to compute the inverse of the overlap (invovl) operator
     956                 :          60 :    call init_invovl(dtset%nkpt)
     957                 :             :  else
     958   [ -  +  -  + ]:          20 :    ABI_MALLOC(tdks%nhat,(0,0))
     959   [ -  +  -  + ]:          20 :    ABI_MALLOC(tdks%nhatgr,(0,0,0))
     960                 :          20 :    tdks%nhatgrdim=0
     961                 :             :  end if
     962                 :             : 
     963                 :             :  !Allocate various required arrays for calculation of the Hamiltonian
     964                 :             :  !Potentials
     965   [ -  +  +  -  :         150 :  ABI_MALLOC(tdks%vhartr,(tdks%nfftf))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     966         [ +  + ]:      989924 :  tdks%vhartr=zero
     967   [ -  +  +  -  :         100 :  ABI_MALLOC(tdks%vpsp,(tdks%nfftf))
          -  +  -  +  -  
                      + ]
     968         [ +  + ]:      989924 :  tdks%vpsp=zero
     969   [ -  +  +  -  :         200 :  ABI_MALLOC(tdks%vtrial,(tdks%nfftf,dtset%nspden))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     970   [ +  +  +  + ]:      989974 :  tdks%vtrial=zero
     971   [ -  +  +  -  :         150 :  ABI_MALLOC(tdks%vxc,(tdks%nfftf,dtset%nspden))
          -  +  +  -  -  
             +  -  +  -  
                      + ]
     972   [ +  +  +  + ]:      989974 :  tdks%vxc=zero
     973         [ +  - ]:          50 :  if (psps%n1xccc/=0) then
     974   [ -  +  +  -  :         100 :     ABI_MALLOC(tdks%xccc3d,(tdks%nfftf))
          -  +  -  +  -  
                      + ]
     975                 :             :  else
     976   [ #  #  #  # ]:           0 :     ABI_MALLOC(tdks%xccc3d,(0))
     977                 :             :  end if
     978         [ +  + ]:      989924 :  tdks%xccc3d=zero
     979         [ +  + ]:          50 :  if (psps%usepaw==1) then
     980   [ +  -  -  -  :          90 :     ABI_MALLOC(tdks%xcctau3d,(tdks%nfftf*dtset%usekden))
          +  -  -  +  -  
             +  -  +  -  
                      + ]
     981         [ -  + ]:          30 :     tdks%xcctau3d=zero
     982                 :             :  endif
     983                 :             :  !For mGGA
     984         [ +  - ]:          50 :  usevxctau=merge(1,0,xc_need_kden(dtset%ixc))
     985   [ -  +  +  -  :         250 :  ABI_MALLOC(tdks%vxctau,(tdks%nfftf,dtset%nspden,4*usevxctau))
          -  +  +  -  -  
          +  +  -  -  -  
          +  -  -  +  -  
             +  -  +  -  
                      + ]
     986   [ -  +  -  -  :          50 :  tdks%vxctau=zero
                   -  - ]
     987                 :             :  !For hybrid functionals
     988                 :          50 :  use_hybcomp=0
     989         [ -  + ]:          50 :  if(mod(dtset%fockoptmix,100)==11) use_hybcomp=1
     990   [ -  +  +  -  :         200 :  ABI_MALLOC(tdks%vxc_hybcomp,(tdks%pawfgr%nfft,dtset%nspden*use_hybcomp))
          +  -  -  -  +  
          -  -  +  -  +  
             -  +  -  + ]
     991   [ -  +  -  - ]:          50 :  tdks%vxc_hybcomp=zero
     992                 :             :  !For VDW corrected functionals
     993                 :          50 :  tdks%ngrvdw=0
     994         [ -  + ]:          50 :  if ((dtset%vdw_xc>=5.and.dtset%vdw_xc<=7)) then
     995                 :           0 :    tdks%ngrvdw=dtset%natom
     996                 :             :  end if
     997   [ +  -  -  -  :         150 :  ABI_MALLOC(tdks%grvdw,(3,tdks%ngrvdw))
          +  -  -  +  -  
             +  -  +  -  
                      + ]
     998   [ -  +  -  - ]:          50 :  tdks%grvdw=zero
     999                 :             : 
    1000                 :             :  !Compute large sphere G^2 cut-off (gsqcut) and box / sphere ratio
    1001         [ +  + ]:          50 :  if (psps%usepaw==1) then
    1002                 :             :    call getcut(boxcut,dtset%pawecutdg,tdks%gmet,tdks%gsqcut,dtset%iboxcut, &
    1003                 :          30 :              & std_out,k0,tdks%pawfgr%ngfft)
    1004                 :             :  else
    1005                 :             :    call getcut(boxcut,dtset%ecut,tdks%gmet,tdks%gsqcut,dtset%iboxcut, &
    1006                 :          20 :              & std_out,k0,tdks%pawfgr%ngfft)
    1007                 :             :  end if
    1008                 :             : 
    1009                 :             :  !Compute structure factor phases (exp(2Pi i G.xred)) on coarse and fine grid
    1010   [ +  -  -  +  :         150 :  ABI_MALLOC(tdks%ph1d,(2,3*(2*tdks%pawfgr%mgfftc+1)*dtset%natom))
          +  -  +  -  +  
          -  -  +  -  +  
                   -  + ]
    1011   [ +  -  -  +  :         150 :  ABI_MALLOC(tdks%ph1df,(2,3*(2*tdks%pawfgr%mgfft+1)*dtset%natom))
          +  -  +  -  +  
          -  -  +  -  +  
                   -  + ]
    1012                 :             :  call getph(tdks%atindx,dtset%natom,tdks%pawfgr%ngfftc(1),tdks%pawfgr%ngfftc(2), &
    1013                 :          50 :           & tdks%pawfgr%ngfftc(3),tdks%ph1d,tdks%xred)
    1014   [ +  +  +  - ]:          50 :  if (psps%usepaw==1.and.tdks%pawfgr%usefinegrid==1) then
    1015                 :             :    call getph(tdks%atindx,dtset%natom,tdks%pawfgr%ngfft(1),tdks%pawfgr%ngfft(2), &
    1016                 :          30 :             & tdks%pawfgr%ngfft(3),tdks%ph1df,tdks%xred)
    1017                 :             :  else
    1018   [ +  +  +  + ]:       43940 :    tdks%ph1df(:,:)=tdks%ph1d(:,:)
    1019                 :             :  end if
    1020                 :             : 
    1021                 :             :  !Allocate memory for density
    1022   [ -  +  +  -  :         200 :  ABI_MALLOC(tdks%rhor,(tdks%nfftf,dtset%nspden))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
    1023   [ -  +  +  -  :         200 :  ABI_MALLOC(tdks%taur,(tdks%nfftf,dtset%nspden*dtset%usekden))
          +  -  -  -  +  
          -  -  +  -  +  
             -  +  -  + ]
    1024   [ -  +  +  -  :         150 :  ABI_MALLOC(tdks%rhog,(2,tdks%nfftf))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
    1025   [ +  -  -  -  :         150 :  ABI_MALLOC(tdks%taug,(2,tdks%nfftf*dtset%usekden))
          +  -  -  +  -  
             +  -  +  -  
                      + ]
    1026                 :             : 
    1027         [ -  + ]:          50 : end subroutine second_setup
    1028                 :             : !!***
    1029                 :             : 
    1030                 :             : !!****f* m_rttddft_tdks/read_wfk
    1031                 :             : !!
    1032                 :             : !! NAME
    1033                 :             : !! read_wfk
    1034                 :             : !!
    1035                 :             : !! FUNCTION
    1036                 :             : !! Reads initial wavefunctions (KS orbitals) in WFK file (call inwffil)
    1037                 :             : !!
    1038                 :             : !! INPUTS
    1039                 :             : !! dtfil <type datafiles_type> = infos about file names, file unit numbers
    1040                 :             : !! dtset <type(dataset_type)> = all input variables for this dataset
    1041                 :             : !! ecut_eff <real(dp)> = effective PW cutoff energy
    1042                 :             : !! mpi_enreg <MPI_type> = MPI-parallelisation information
    1043                 :             : !! tdks <type(tdks_type)> = the tdks object to initialize
    1044                 :             : !!
    1045                 :             : !! OUTPUT
    1046                 :             : !!
    1047                 :             : !! SOURCE
    1048                 :          50 : subroutine read_wfk(dtfil, dtset, ecut_eff, fname_wfk, mpi_enreg, tdks)
    1049                 :             : 
    1050                 :             :  !Arguments ------------------------------------
    1051                 :             :  !scalars
    1052                 :             :  character(len=fnlen), intent(in)    :: fname_wfk
    1053                 :             :  real(dp),             intent(in)    :: ecut_eff
    1054                 :             :  type(datafiles_type), intent(in)    :: dtfil
    1055                 :             :  type(dataset_type),   intent(inout) :: dtset
    1056                 :             :  type(MPI_type),       intent(inout) :: mpi_enreg
    1057                 :             :  type(tdks_type),      intent(inout) :: tdks
    1058                 :             : 
    1059                 :             :  !Local variables-------------------------------
    1060                 :             :  !scalars
    1061                 :             :  integer,parameter  :: formeig=0
    1062                 :             :  integer            :: ask_accurate
    1063                 :             :  integer            :: band
    1064                 :             :  integer            :: cnt
    1065                 :             :  integer            :: ierr, ikpt
    1066                 :             :  integer            :: my_nspinor
    1067                 :             :  integer            :: optorth
    1068                 :             :  integer            :: spin
    1069                 :             :  type(wffile_type)  :: wff1, wffnow
    1070                 :             :  !arrays
    1071                 :             :  character(len=500) :: msg
    1072                 :             : 
    1073                 :             : ! ***********************************************************************
    1074                 :             : 
    1075                 :             :  !If paral_kgb == 0, it may happen that some processors are idle (no entry in proc_distrb)
    1076                 :             :  !but mkmem == nkpt and this can cause integer overflow in mcg or allocation error.
    1077                 :             :  !Here we count the number of states treated by the proc. if cnt == 0, mcg is then set to 0.
    1078                 :          50 :  cnt = 0
    1079         [ +  + ]:         100 :  do spin=1,dtset%nsppol
    1080         [ +  + ]:        1008 :    do ikpt=1,dtset%nkpt
    1081         [ +  + ]:       10046 :       do band=1,dtset%nband(ikpt + (spin-1) * dtset%nkpt)
    1082         [ +  + ]:        9996 :          if (.not. proc_distrb_cycle(mpi_enreg%proc_distrb, ikpt, band, band, spin, mpi_enreg%me_kpt)) cnt = cnt + 1
    1083                 :             :       end do
    1084                 :             :    end do
    1085                 :             :  end do
    1086                 :             : 
    1087                 :          50 :  my_nspinor=max(1,dtset%nspinor/mpi_enreg%nproc_spinor)
    1088                 :          50 :  tdks%mcg=dtset%mpw*my_nspinor*dtset%mband*dtset%mkmem*dtset%nsppol
    1089         [ -  + ]:          50 :  if (cnt == 0) then
    1090                 :           0 :    tdks%mcg = 0
    1091                 :           0 :    write(msg,"(2(a,i0))")"rank: ",mpi_enreg%me, "does not have wavefunctions to treat. Setting mcg to: ",tdks%mcg
    1092                 :           0 :    ABI_WARNING(msg)
    1093                 :             :  end if
    1094                 :             : 
    1095   [ +  -  +  -  :          50 :  if (dtset%usewvl == 0 .and. dtset%mpw > 0 .and. cnt /= 0)then
                   +  - ]
    1096   [ -  +  -  + ]:          50 :    if (my_nspinor*dtset%mband*dtset%mkmem*dtset%nsppol > floor(real(HUGE(0))/real(dtset%mpw) )) then
    1097                 :             :       ierr = 0
    1098                 :             :       write (msg,'(9a)')&
    1099                 :           0 :      & "Default integer is not wide enough to store the size of the wavefunction array (mcg).",ch10,&
    1100                 :           0 :      & "This usually happens when paral_kgb == 0 and there are not enough procs to distribute kpts and spins",ch10,&
    1101                 :           0 :      & "Action: if paral_kgb == 0, use nprocs = nkpt * nsppol to reduce the memory per node.",ch10,&
    1102                 :           0 :      & "If tdks does not solve the problem, use paral_kgb 1 with nprocs > nkpt * nsppol and use npfft/npband/npspinor",ch10,&
    1103                 :           0 :      & "to decrease the memory requirements. Consider also OpenMP threads."
    1104                 :           0 :       ABI_ERROR_NOSTOP(msg,ierr)
    1105                 :             :       write (msg,'(5(a,i0), 2a)')&
    1106                 :           0 :      & "my_nspinor: ",my_nspinor, ", mpw: ",dtset%mpw, ", mband: ",dtset%mband,&
    1107                 :           0 :      & ", mkmem: ",dtset%mkmem, ", nsppol: ",dtset%nsppol,ch10,&
    1108                 :           0 :      & 'Note: Compiling with large int (int64) requires a full software stack (MPI/FFTW/BLAS...) compiled in int64 mode'
    1109                 :           0 :       ABI_ERROR(msg)
    1110                 :             :    end if
    1111                 :             :  end if
    1112                 :             : 
    1113                 :             :  ! Alloc size for wfk and bands
    1114   [ -  +  +  -  :         150 :  ABI_MALLOC_OR_DIE(tdks%cg,(2,tdks%mcg),ierr)
          +  -  +  -  +  
          -  +  -  -  +  
             +  -  -  + ]
    1115   [ -  +  +  -  :         150 :  ABI_MALLOC(tdks%eigen,(dtset%mband*dtset%nkpt*dtset%nsppol))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
    1116   [ -  +  +  -  :         100 :  ABI_MALLOC(tdks%eigen0,(dtset%mband*dtset%nkpt*dtset%nsppol))
          -  +  -  +  -  
                      + ]
    1117                 :             : 
    1118         [ +  + ]:        9138 :  tdks%eigen(:) = zero
    1119                 :          50 :  ask_accurate=1
    1120                 :             : 
    1121                 :             :  !Actually read the intial KS orbitals here
    1122         [ +  + ]:          50 :  if (dtset%td_restart /= 1) then
    1123                 :          30 :    write(msg,'(3a)') ch10,'-------------------    Reading initial wavefunctions    -------------------',ch10
    1124                 :             :  else
    1125                 :          20 :    write(msg,'(3a)') ch10,'-------------------   Reading wavefunctions for restart  ------------------',ch10
    1126                 :             :  end if
    1127                 :          50 :  call wrtout(ab_out,msg)
    1128         [ +  + ]:          50 :  if (do_write_log) call wrtout(std_out,msg)
    1129                 :          50 :  wff1%unwff=dtfil%unwff1
    1130                 :          50 :  optorth=0   !No need to orthogonalize the wfk
    1131   [ +  +  +  + ]:         650 :  tdks%hdr%rprimd=tdks%rprimd
    1132   [ +  +  +  + ]:     4724594 :  tdks%cg=zero
    1133                 :             :  call inwffil(ask_accurate,tdks%cg,dtset,dtset%ecut,ecut_eff,tdks%eigen,     &
    1134                 :             :             & dtset%exchn2n3d,formeig,tdks%hdr,1,dtset%istwfk,tdks%kg,       &
    1135                 :             :             & dtset%kptns,dtset%localrdwf,dtset%mband,tdks%mcg,dtset%mkmem,  &
    1136                 :             :             & mpi_enreg,dtset%mpw,dtset%nband,tdks%pawfgr%ngfft,dtset%nkpt,  &
    1137                 :             :             & tdks%npwarr,dtset%nsppol,dtset%nsym,dtset%occ_orig,optorth,    &
    1138                 :             :             & dtset%symafm,dtset%symrel,dtset%tnons,dtfil%unkg,wff1,wffnow,  &
    1139                 :          50 :             & dtfil%unwff1,fname_wfk,tdks%wvl)
    1140                 :             : 
    1141                 :             :  !Close file
    1142                 :          50 :  call WffClose(wff1,ierr)
    1143                 :             : 
    1144                 :             :  !Keep initial eigenvalues in memory
    1145         [ +  + ]:        9138 :  tdks%eigen0(:) = tdks%eigen(:)
    1146                 :             : 
    1147                 :             :  !In case of restart also read wfk file containing wave functions at t=0
    1148   [ +  +  +  - ]:          50 :  if (dtset%td_restart == 1 .and. tdks%fname_wfk0 /= fname_wfk) then
    1149                 :          20 :    write(msg,'(3a)') ch10,'-------------------    Reading initial wavefunctions    -------------------',ch10
    1150   [ -  +  +  -  :          60 :    ABI_MALLOC_OR_DIE(tdks%cg0,(2,tdks%mcg),ierr)
          +  -  +  -  +  
          -  +  -  -  +  
             +  -  -  + ]
    1151                 :          20 :    call wrtout(ab_out,msg)
    1152         [ +  + ]:          20 :    if (do_write_log) call wrtout(std_out,msg)
    1153   [ +  +  +  + ]:     1255700 :    tdks%cg0=zero
    1154                 :             :    call inwffil(ask_accurate,tdks%cg0,dtset,dtset%ecut,ecut_eff,tdks%eigen0,   &
    1155                 :             :               & dtset%exchn2n3d,formeig,tdks%hdr,1,dtset%istwfk,tdks%kg,       &
    1156                 :             :               & dtset%kptns,dtset%localrdwf,dtset%mband,tdks%mcg,dtset%mkmem,  &
    1157                 :             :               & mpi_enreg,dtset%mpw,dtset%nband,tdks%pawfgr%ngfft,dtset%nkpt,  &
    1158                 :             :               & tdks%npwarr,dtset%nsppol,dtset%nsym,dtset%occ_orig,optorth,    &
    1159                 :             :               & dtset%symafm,dtset%symrel,dtset%tnons,dtfil%unkg,wff1,wffnow,  &
    1160                 :          20 :               & dtfil%unwff1,tdks%fname_wfk0,tdks%wvl)
    1161                 :             : 
    1162                 :             :    !Close file
    1163                 :          20 :    call WffClose(wff1,ierr)
    1164                 :             : 
    1165                 :             :  end if
    1166                 :             : 
    1167                 :          50 : end subroutine read_wfk
    1168                 :             : !!***
    1169                 :             : 
    1170   [ #  #  #  #  :           0 : end module m_rttddft_tdks
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
    1171                 :             : !!***
        

Generated by: LCOV version 2.3-1