LCOV - code coverage report
Current view: top level - src/94_scfcv - m_outscfcv.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 85.9 % 644 553
Test Date: 2026-11-10 11:05:29 Functions: 100.0 % 1 1
Branches: 50.5 % 1616 816

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_outscfcv
       2                 :             : !! NAME
       3                 :             : !!  m_outscfcv
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !!
       7                 :             : !! COPYRIGHT
       8                 :             : !!  Copyright (C) 2005-2026 ABINIT group (XG)
       9                 :             : !!  This file is distributed under the terms of the
      10                 :             : !!  GNU General Public License, see ~abinit/COPYING
      11                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
      12                 :             : !!
      13                 :             : !! SOURCE
      14                 :             : 
      15                 :             : #if defined HAVE_CONFIG_H
      16                 :             : #include "config.h"
      17                 :             : #endif
      18                 :             : 
      19                 :             : #include "abi_common.h"
      20                 :             : 
      21                 :             : module m_outscfcv
      22                 :             : 
      23                 :             :  use defs_basis
      24                 :             :  use defs_wvltypes
      25                 :             :  use m_abicore
      26                 :             :  use m_sort
      27                 :             :  use m_efield
      28                 :             :  use m_errors
      29                 :             :  use m_xmpi
      30                 :             :  use m_mpinfo
      31                 :             :  use netcdf
      32                 :             :  use m_nctk
      33                 :             :  use m_hdr
      34                 :             :  use m_plowannier
      35                 :             :  use m_splines
      36                 :             :  use m_ebands
      37                 :             :  use m_dtset
      38                 :             :  use m_dtfil
      39                 :             :  use m_rcpaw
      40                 :             : 
      41                 :             :  use defs_datatypes,     only : pseudopotential_type
      42                 :             :  use defs_abitypes,      only : MPI_type
      43                 :             :  use m_time,             only : timab
      44                 :             :  use m_io_tools,         only : open_file
      45                 :             :  use m_fstrings,         only : strcat, endswith
      46                 :             :  use m_geometry,         only : bonds_lgth_angles
      47                 :             :  use m_electronpositron, only : electronpositron_type,electronpositron_calctype
      48                 :             :  use m_oper,             only : oper_type,init_oper,destroy_oper
      49                 :             :  use m_crystal,          only : crystal_t, prt_cif
      50                 :             :  use m_results_gs,       only : results_gs_type
      51                 :             :  use m_ioarr,            only : ioarr, fftdatar_write
      52                 :             :  use m_matlu,            only : copy_matlu,destroy_matlu,init_matlu,matlu_type
      53                 :             :  use m_nucprop,          only : calc_efg,calc_fc
      54                 :             :  use m_outwant,          only : outwant
      55                 :             :  use m_rcpaw,            only : rcpaw_type
      56                 :             :  use m_pawang,           only : pawang_type
      57                 :             :  use m_pawrad,           only : pawrad_type, simp_gen, bound_deriv
      58                 :             :  use m_pawtab,           only : pawtab_type
      59                 :             :  use m_paw_an,           only : paw_an_type
      60                 :             :  use m_paw_ij,           only : paw_ij_type
      61                 :             :  use m_paw_mkrho,        only : denfgr
      62                 :             :  use m_pawfgrtab,        only : pawfgrtab_type
      63                 :             :  use m_pawrhoij,         only : pawrhoij_type, pawrhoij_nullify, pawrhoij_copy, pawrhoij_free
      64                 :             :  use m_pawcprj,          only : pawcprj_type
      65                 :             :  use m_pawfgr,           only : pawfgr_type
      66                 :             :  use m_paw_dmft,         only : paw_dmft_type,init_dmft,destroy_dmft,print_dmft
      67                 :             :  use m_paw_optics,       only : optics_paw,optics_paw_core
      68                 :             :  use m_paw_tools,        only : pawprt
      69                 :             :  use m_numeric_tools,    only : simpson_int
      70                 :             :  use m_epjdos,           only : epjdos_t
      71                 :             :  use m_paral_atom,       only : get_my_atmtab, free_my_atmtab
      72                 :             :  use m_io_kss,           only : outkss
      73                 :             :  use m_multipoles,       only : multipoles_out, out1dm
      74                 :             :  use m_mlwfovlp_qp,      only : mlwfovlp_qp
      75                 :             :  use m_paw_mkaewf,       only : pawmkaewf
      76                 :             :  use m_dens,             only : mag_penalty_e, calcdenmagsph, prtdenmagsph
      77                 :             :  !use m_mlwfovlp,         only : mlwfovlp
      78                 :             :  use m_wfd_wannier,      only : wfd_run_wannier
      79                 :             :  use m_datafordmft,      only : datafordmft
      80                 :             :  use m_mkrho,            only : read_atomden
      81                 :             :  use m_positron,         only : poslifetime, posdoppler
      82                 :             :  use m_optics_vloc,      only : optics_vloc
      83                 :             :  use m_green,            only : green_type,compute_green,&
      84                 :             :                                 fourier_green,print_green,init_green,destroy_green,init_green_tau
      85                 :             :  use m_self,             only : self_type,initialize_self,rw_self,destroy_self,destroy_self,selfreal2imag_self
      86                 :             :  use m_paw_correlations, only : loc_orbmom_cal
      87                 :             :  use m_paw_denpot,       only : paw_relax_core
      88                 :             : 
      89                 :             :  implicit none
      90                 :             : 
      91                 :             :  private
      92                 :             : !!***
      93                 :             : 
      94                 :             :  public :: outscfcv
      95                 :             : !!***
      96                 :             : 
      97                 :             : contains
      98                 :             : !!***
      99                 :             : 
     100                 :             : !!****f* ABINIT/outscfcv
     101                 :             : !! NAME
     102                 :             : !! outscfcv
     103                 :             : !!
     104                 :             : !! FUNCTION
     105                 :             : !! Output routine for the scfcv.F90 routine
     106                 :             : !!
     107                 :             : !! INPUTS
     108                 :             : !!  atindx(natom)=index table for atoms (see gstate.f)
     109                 :             : !!  atindx1(natom)=index table for atoms, inverse of atindx (see gstate.f)
     110                 :             : !!  cg(2,mcg)=planewave coefficients of wavefunctions (see also side effects)
     111                 :             : !!  compch_fft=compensation charge, from FFT grid
     112                 :             : !!  compch_sph=compensation charge, from sphere
     113                 :             : !!  cprj(natom,mcprj*usecprj)=<p_lmn|Cnk> coefficients for each WF |Cnk>
     114                 :             : !!          and each |p_lmn> non-local projector. See also side effects
     115                 :             : !!  dimcprj(natom*usecprj)=array of dimensions of array cprj (not ordered)
     116                 :             : !!  dmatpawu= fixed occupation matrix of correlated orbitals (DFT+U or DMFT only)
     117                 :             : !!  dtfil <type(datafiles_type)>=variables related to files
     118                 :             : !!  dtset <type(dataset_type)>=all input variables for this dataset
     119                 :             : !!  ecut=cut-off energy for plane wave basis sphere (Ha)
     120                 :             : !!  eigen(mband*nkpt*nsppol)=array for holding eigenvalues (hartree)
     121                 :             : !!  elfr(nfft,nspden(+1))=electron localization function, real space.
     122                 :             : !!   (+1) if spin-polarized in order to get total, spin up and spin down elf
     123                 :             : !!  etotal=total energy
     124                 :             : !!  gmet(3,3)=reciprocal space metric tensor in bohr**-2.
     125                 :             : !!  gprimd(3,3)=dimensional reciprocal space primitive translations
     126                 :             : !!  grhor(nfft,nspden,3)= gradient of electron density in electrons/bohr**4, real space
     127                 :             : !!  hdr <type(hdr_type)>=the header of wf, den and pot files
     128                 :             : !!  intgres(nspden,natom)=integrated residuals from constrained DFT. They are also Lagrange parameters, or gradients with respect to constraints.
     129                 :             : !!  kg(3,mpw*mkmem)=reduced planewave coordinates.
     130                 :             : !!  lrhor(nfft,nspden)= Laplacian of electron density in electrons/bohr**5, real space
     131                 :             : !!  mband=maximum number of bands
     132                 :             : !!  mcg=size of wave-functions array (cg) =mpw*my_nspinor*mband*mkmem*nsppol
     133                 :             : !!  mcprj=size of projected wave-functions array (cprj) =nspinor*mband*mkmem*nsppol
     134                 :             : !!  mgfftc=maximum size of 1D FFTs for the PAW coarse grid
     135                 :             : !!  mkmem =number of k points treated by this node.
     136                 :             : !!  mpi_enreg=information about MPI parallelization
     137                 :             : !!  mpsang= 1+maximum angular momentum for nonlocal pseudopotentials
     138                 :             : !!  mpw=maximum dimensioned size of npw.
     139                 :             : !!  my_natom=number of atoms treated by current processor
     140                 :             : !!  natom=number of atoms in cell.
     141                 :             : !!  nattyp(ntypat)= # atoms of each type.
     142                 :             : !!  nfft=(effective) number of FFT grid points (for this processor) (see NOTES at beginning of scfcv)
     143                 :             : !!  ngfft(18)=contain all needed information about 3D FFT (see NOTES at beginning of scfcv)
     144                 :             : !!  nhat(nfft,nspden*usepaw)= compensation charge density  (PAW)
     145                 :             : !!  nkpt=number of k points.
     146                 :             : !!  npwarr(nkpt)=number of planewaves in basis at this k point
     147                 :             : !!  nspden=number of spin-density components
     148                 :             : !!  nsppol=1 for unpolarized, 2 for spin-polarized
     149                 :             : !!  nsym=number of symmetries in space group
     150                 :             : !!  ntypat=number of types of atoms in unit cell.
     151                 :             : !!  n3xccc=dimension of the xccc3d array (0 or nfft).
     152                 :             : !!  occ(mband*nkpt*nsppol)=occupation number for each band (usually 2) for each k.
     153                 :             : !!  paw_an(my_natom) <type(paw_an_type)>=paw arrays given on angular mesh
     154                 :             : !!  pawang <type(pawang_type)>=paw angular mesh and related data
     155                 :             : !!  pawfgr(natom) <type(pawfgr_type)>=fine grid parameters and related data
     156                 :             : !!  pawfgrtab(my_natom) <type(pawfgrtab_type)> tables on PAW fine grid
     157                 :             : !!  pawrad(ntypat*usepaw) <type(pawrad_type)>=paw radial mesh and related data
     158                 :             : !!  pawrhoij(my_natom) <type(pawrhoij_type)>= paw rhoij occupancies and related data
     159                 :             : !!  pawtab(ntypat*usepaw) <type(pawtab_type)>=paw tabulated starting data
     160                 :             : !!  paw_ij(my_natom) <type(paw_ij_type)>=paw arrays given on (i,j) channels
     161                 :             : !!            note:structure factors are given on the coarse grid for PAW
     162                 :             : !!  prtvol=control print volume and debugging output
     163                 :             : !!  psps <type(pseudopotential_type)>=variables related to pseudopotentials
     164                 :             : !!  results_gs <type(results_gs_type)>=results (energy and its components,
     165                 :             : !!     forces and its components, the stress tensor) of a ground-state computation
     166                 :             : !!  rhor(nfft,nspden)=total electron density in electrons/bohr**3, real space.
     167                 :             : !!  rprimd(3,3)=dimensional primitive translations for real space (bohr)
     168                 :             : !!  taur(nfft,nspden)=total kinetic energy density in bohr**(-5), real space.
     169                 :             : !!  ucvol=unit cell volume (bohr**3)
     170                 :             : !!  usecprj=1 if cprj datastructure has been allocated
     171                 :             : !!  vhartr(nfft)=Hartree potential
     172                 :             : !!  vxc(nfft,nspden)=xc potential
     173                 :             : !!  vtrial(nfft,nspden)=the trial potential = vxc + vpsp + vhartr, roughly speaking
     174                 :             : !!  xccc3d(n3xccc)=3D core electron density for XC core correction (bohr^-3)
     175                 :             : !!  xred(3,natom)=reduced dimensionless atomic coordinates
     176                 :             : !!
     177                 :             : !! OUTPUT
     178                 :             : !!  (only writing, printing)
     179                 :             : !!
     180                 :             : !! SIDE EFFECTS
     181                 :             : !!  electronpositron <type(electronpositron_type)>=quantities for the electron-positron annihilation
     182                 :             : !!  If prtwant==3 the following quantitities are updated using the unitary transformation
     183                 :             : !!  defining the QP amplitudes in terms of the KS basis set:
     184                 :             : !!   cg(2,mcg)=planewave coefficients of wavefunctions.
     185                 :             : !!   cprj(natom,mcprj*usecpyj)=<p_lmn|Cnk> coefficients for each WF |Cnk> and each |p_lmn> non-local projector
     186                 :             : !!
     187                 :             : !! NOTES
     188                 :             : !!   The string passed to fftdatar_write (first argument) gives the name used to store the data in the netcdf file
     189                 :             : !!   The function  varname_from_fname defined in the module m_hdr.F90 gives the mapping between the Abinit
     190                 :             : !!   file extension and the netcdf name e.g. foo_VHXC.nc --> vxc
     191                 :             : !!   This function is used in cut3d so that we can immediately select the data to analyze without having
     192                 :             : !!   to prompt the user. Remember to update varname_from_fname if you add a new file or if you change the
     193                 :             : !!   name of the variable.
     194                 :             : !!
     195                 :             : !! SOURCE
     196                 :             : 
     197                 :       20853 : subroutine outscfcv(atindx1,cg,compch_fft,compch_sph,cprj,dimcprj,dmatpawu,dtfil,dtset,&
     198                 :       13902 : & ecut,eigen,electronpositron,elfr,etotal,gmet,gprimd,grhor,hdr,intgres,kg,&
     199                 :             : & lrhor,mband,mcg,mcprj,mgfftc,mkmem,mpi_enreg,mpsang,mpw,my_natom,natom,&
     200                 :        6951 : & nattyp,nfft,ngfft,nhat,nkpt,npwarr,nspden,nsppol,nsym,ntypat,n3xccc,occ,&
     201         [ -  + ]:        6951 : & paw_dmft,pawang,pawfgr,pawfgrtab,pawrad,pawrhoij,pawtab,paw_an,paw_ij,&
     202                 :        6951 : & prtvol,psps,results_gs,rhor,rprimd,&
     203         [ -  + ]:       13902 : & taur,ucvol,usecprj,vhartr,vpsp,vtrial,vxc,wvl_den,xccc3d,xred,rcpaw)
     204                 :             : 
     205                 :             : !Arguments ------------------------------------
     206                 :             : !scalars
     207                 :             :  integer,intent(in) :: mband,mcg,mcprj,mgfftc,mkmem,mpsang,mpw,n3xccc,my_natom,natom,nfft
     208                 :             :  integer,intent(in) :: nkpt,nspden,nsppol,nsym,ntypat,prtvol,usecprj
     209                 :             :  real(dp),intent(in) :: compch_fft,compch_sph,ecut,ucvol
     210                 :             :  real(dp),intent(inout) :: etotal
     211                 :             :  type(electronpositron_type),pointer :: electronpositron
     212                 :             :  type(MPI_type),intent(inout) :: mpi_enreg
     213                 :             :  type(datafiles_type),intent(in) :: dtfil
     214                 :             :  type(dataset_type),intent(in) :: dtset
     215                 :             :  type(hdr_type),intent(inout) :: hdr
     216                 :             :  type(paw_dmft_type), intent(inout)  :: paw_dmft
     217                 :             :  type(pawang_type),intent(in) :: pawang
     218                 :             :  type(pawfgr_type),intent(in) :: pawfgr
     219                 :             :  type(pseudopotential_type),intent(inout) :: psps
     220                 :             :  type(results_gs_type),intent(in) :: results_gs
     221                 :             :  type(wvl_denspot_type), intent(in) :: wvl_den
     222                 :             :  type(rcpaw_type),intent(in),pointer :: rcpaw
     223                 :             : !arrays
     224                 :             :  integer,intent(in) :: atindx1(natom),dimcprj(natom*usecprj)
     225                 :             :  integer,intent(in) :: kg(3,mpw*mkmem),nattyp(ntypat),ngfft(18),npwarr(nkpt)
     226                 :             :  real(dp),intent(in) :: dmatpawu(:,:,:,:),eigen(mband*nkpt*nsppol)
     227                 :             :  real(dp),intent(in) :: gmet(3,3),gprimd(3,3)
     228                 :             :  real(dp),intent(in) :: intgres(:,:) ! (nspden,natom) if constrainedDFT otherwise (nspden,0)
     229                 :             :  real(dp),intent(in) :: occ(mband*nkpt*nsppol)
     230                 :             :  real(dp),intent(in) :: rprimd(3,3),vhartr(nfft),xccc3d(n3xccc)
     231                 :             :  real(dp),intent(in) :: vpsp(nfft)
     232                 :             :  real(dp),intent(inout) :: cg(2,mcg)
     233                 :             :  real(dp),intent(inout) :: nhat(nfft,nspden*psps%usepaw)
     234                 :             :  real(dp),intent(inout),target :: rhor(nfft,nspden),vtrial(nfft,nspden)
     235                 :             :  real(dp),intent(inout) :: vxc(nfft,nspden),xred(3,natom)
     236                 :             :  real(dp),pointer :: elfr(:,:),grhor(:,:,:),lrhor(:,:),taur(:,:)
     237                 :             :  type(pawcprj_type),intent(inout) :: cprj(natom,mcprj*usecprj)
     238                 :             :  type(paw_an_type),intent(inout) :: paw_an(my_natom*psps%usepaw)
     239                 :             :  type(pawfgrtab_type),intent(in) :: pawfgrtab(my_natom*psps%usepaw)
     240                 :             :  type(paw_ij_type),intent(inout) :: paw_ij(my_natom*psps%usepaw)
     241                 :             :  type(pawrad_type),intent(in) :: pawrad(psps%ntypat*psps%usepaw)
     242                 :             :  type(pawrhoij_type),target,intent(inout) :: pawrhoij(my_natom*psps%usepaw)
     243                 :             :  type(pawtab_type),intent(inout) :: pawtab(ntypat*psps%usepaw)
     244                 :             : 
     245                 :             : !Local variables-------------------------------
     246                 :             : !scalars
     247                 :             :  integer,parameter :: master=0,cplex1=1,fform_den=52,rdwr2=2,rdwrpaw0=0
     248                 :             :  integer :: bantot,fform,collect,timrev, accessfil,coordn,option
     249                 :             :  integer :: ii,ierr,ifft,ikpt,ispden,isppol,itypat, me_fft,n1,n2,n3
     250                 :             :  integer :: ifgd, iatom, iatom_tot,nradint, me,my_natom_tmp
     251                 :             :  integer :: n,nn,iln,iln2,l,ll
     252                 :             :  integer :: occopt, opt_moments, prtnabla, pawprtden, ncid, ncerr,nphicor
     253                 :             :  integer :: iband,nocc,comm,comm_fft,tmp_unt,nfft_tot, my_comm_atom, opt_imagonly
     254                 :       13902 :  integer :: indsym(4,dtset%nsym,dtset%natom)
     255                 :             :  real(dp) :: norm,occ_norm,unocc_norm, rate_dum,rate_dum2, yp1, ypn, dr
     256                 :             :  character(len=500) :: msg
     257                 :             :  character(len=fnlen) :: fname
     258                 :             :  type(rcpaw_type),pointer :: rcpaw_dirac=>null()
     259                 :             : !arrays
     260                 :             :  integer :: units(2)
     261                 :        6951 :  integer, allocatable :: isort(:)
     262                 :        6951 :  integer, pointer :: my_atmtab(:)
     263                 :        6951 :  real(dp) :: tsec(2),nt_ntone_norm(nspden),rhomag(2,nspden)
     264                 :        6951 :  real(dp),allocatable :: efg(:,:,:),eigen2(:)
     265                 :        6951 :  real(dp),allocatable :: elfr_down(:,:),elfr_up(:,:),intgden(:,:)
     266                 :        6951 :  real(dp),allocatable :: rhor_paw(:,:),rhor_paw_core(:,:),rhor_paw_val(:,:),vpaw(:,:),vwork(:,:)
     267                 :        6951 :  real(dp),allocatable :: rhor_n_one(:,:),rhor_nt_one(:,:),ps_norms(:,:,:)
     268                 :        6951 :  real(dp), allocatable :: doccde(:)
     269                 :        6951 :  real(dp), allocatable :: vh1spl(:)
     270                 :        6951 :  real(dp), allocatable :: vh1_interp(:)
     271                 :        6951 :  real(dp), allocatable :: vh1_integ(:)
     272                 :        6951 :  real(dp), allocatable :: vh1_corrector(:)
     273                 :        6951 :  real(dp), allocatable :: radii(:)
     274                 :        6951 :  real(dp), contiguous, pointer :: rho_ptr(:,:)
     275   [ +  +  -  +  :       69510 :  type(pawrhoij_type) :: pawrhoij_dum(1)
          -  +  -  +  -  
          +  -  +  -  +  
          +  +  +  -  +  
          -  +  -  +  -  
             +  -  +  - ]
     276                 :             :  !type(pawrhoij_type) :: pawrhoij_dum(0)
     277                 :        6951 :  type(pawrhoij_type),pointer :: pawrhoij_all(:)
     278                 :             :  logical :: remove_inv
     279                 :             :  logical :: paral_atom, paral_fft, my_atmtab_allocated
     280                 :             :  real(dp) :: e_hspinfield
     281                 :             :  real(dp) :: dmatdum(0,0,0,0)
     282                 :             :  real(dp) :: e_fermie, e_fermih
     283                 :        6951 :  type(oper_type) :: dft_occup
     284   [ +  +  +  +  :      361452 :  type(crystal_t) :: crystal
          +  +  +  +  +  
          +  +  +  +  +  
             +  +  +  + ]
     285                 :        6951 :  type(ebands_t) :: ebands
     286                 :        6951 :  type(epjdos_t) :: dos
     287                 :        6951 :  type(plowannier_type) :: wan
     288                 :        6951 :  type(self_type) :: selfr
     289                 :        6951 :  type(self_type), target :: self
     290                 :        6951 :  type(green_type) :: greenr
     291                 :        6951 :  type(matlu_type), allocatable :: opt_selflimit(:)
     292                 :        6951 :  integer,allocatable :: nphicor_arr(:),lcor(:,:)
     293                 :        6951 :  real(dp),allocatable :: energy_cor(:,:),occ_cor(:,:)
     294                 :             : 
     295                 :             : ! *************************************************************************
     296                 :             : 
     297                 :             :  DBG_ENTER("COLL")
     298                 :             : 
     299         [ +  + ]:       20853 :  units = [std_out, ab_out]
     300                 :             : 
     301                 :        6951 :  call timab(1150,1,tsec) ! outscfcv
     302                 :        6951 :  call timab(1151,1,tsec) ! outscfcv(preparation)
     303                 :             : 
     304   [ +  +  -  +  :        6951 :  if ((usecprj==0.or.mcprj==0).and.psps%usepaw==1.and. &
          +  +  +  -  +  
          -  +  -  +  -  
             +  -  -  + ]
     305                 :             :      (dtset%prtwant==2.or.dtset%prtwant==3.or.dtset%prtnabla>0.or.dtset%prtdos==3 &
     306                 :             :      .or.dtset%kssform==3.or.dtset%pawfatbnd>0.or.dtset%pawprtwf>0)) then
     307                 :             :    write (msg,'(5a)')&
     308                 :           0 : &   'cprj datastructure must be allocated',ch10,&
     309                 :           0 : &   'with options prtwant=2,3, prtnabla>0, prtdos>3, kssform==3, pawfatbnd>0, pawprtwf>0',ch10,&
     310                 :           0 : &   'Action: change pawusecp input keyword.'
     311                 :           0 :    ABI_ERROR(msg)
     312                 :             :  end if
     313                 :             : 
     314                 :             :  ! Parameters for MPI-FFT
     315                 :        6951 :  n1 = ngfft(1); n2 = ngfft(2); n3 = ngfft(3); nfft_tot = product(ngfft(1:3))
     316                 :        6951 :  comm_fft = mpi_enreg%comm_fft
     317                 :        6951 :  me_fft = xmpi_comm_rank(comm_fft)
     318                 :        6951 :  paral_fft = (mpi_enreg%paral_kgb==1)
     319                 :             : 
     320                 :        6951 :  comm = mpi_enreg%comm_cell
     321                 :        6951 :  me = xmpi_comm_rank(comm)
     322                 :             : 
     323                 :        6951 :  paral_atom=(my_natom/=natom)
     324                 :        6951 :  my_comm_atom = mpi_enreg%comm_atom
     325                 :        6951 :  nullify(my_atmtab)
     326         [ +  + ]:        6951 :  if (paral_atom) then
     327                 :         558 :    call get_my_atmtab(mpi_enreg%comm_atom, my_atmtab, my_atmtab_allocated, paral_atom,natom,my_natom_ref=my_natom)
     328                 :             :  else
     329   [ -  +  +  -  :       19179 :    ABI_MALLOC(my_atmtab, (natom))
          +  -  +  -  -  
                +  -  + ]
     330   [ +  -  +  +  :       44141 :    my_atmtab = (/ (iatom, iatom=1, natom) /)
                   +  + ]
     331                 :        6393 :    my_atmtab_allocated = .true.
     332                 :             :  end if
     333                 :             : 
     334                 :             :  ! Initialize two objects to facilitate the propagation of info.
     335                 :             :  ! These objects should used more frequently, actually they should
     336                 :             :  ! become basic objects used in abinit.
     337                 :             : 
     338                 :             :  ! Crystalline structure.
     339                 :        6951 :  remove_inv=.false.
     340                 :             :  ! What about Wannier90 DMFT?
     341   [ +  +  +  + ]:        6951 :  if (dtset%nspden==4 .and. dtset%usedmft==1) remove_inv=.true. ! MG: why this?
     342                 :             : 
     343         [ +  + ]:        6951 :  timrev = 2; if (any(dtset%kptopt == [3, 4])) timrev= 1
     344                 :             :  call crystal%init(dtset%amu_orig(:,1),dtset%spgroup,natom,dtset%npsp,ntypat, &
     345                 :             :    dtset%nsym,rprimd,dtset%typat,xred,dtset%ziontypat,dtset%znucl,timrev,&
     346                 :             :    dtset%nspden==2.and.dtset%nsppol==1,remove_inv,hdr%title,&
     347   [ +  +  +  + ]:       13872 :    dtset%symrel,dtset%tnons,dtset%symafm)
     348                 :             : 
     349                 :             :  ! Electron band energies.
     350                 :        6951 :  bantot= dtset%mband*dtset%nkpt*dtset%nsppol
     351   [ -  +  +  -  :      514662 :  ABI_CALLOC(doccde, (bantot))
          +  -  +  -  -  
             +  -  +  +  
                      + ]
     352                 :             :  call ebands%init(bantot,dtset%nelect,dtset%ne_qFD,dtset%nh_qFD,dtset%ivalence,&
     353                 :             :    doccde,eigen,hdr%istwfk,hdr%kptns,hdr%nband,&
     354                 :             :    hdr%nkpt,hdr%npwarr,hdr%nsppol,hdr%nspinor,hdr%tphysel,hdr%tsmear,hdr%occopt,hdr%occ,hdr%wtk,&
     355                 :             :    hdr%cellcharge, hdr%kptopt, hdr%kptrlatt_orig, hdr%nshiftk_orig, hdr%shiftk_orig, &
     356                 :        6951 :    hdr%kptrlatt, hdr%nshiftk, hdr%shiftk)
     357                 :             : 
     358         [ -  + ]:        6951 :  ABI_FREE(doccde)
     359                 :             : 
     360                 :        6951 :  ebands%fermie  = results_gs%energies%e_fermie
     361                 :        6951 :  e_fermie = results_gs%energies%e_fermie
     362                 :        6951 :  ebands%fermih  = results_gs%energies%e_fermih
     363                 :        6951 :  e_fermih = results_gs%energies%e_fermih
     364                 :        6951 :  ebands%entropy = results_gs%energies%entropy_ks
     365                 :             : 
     366                 :             :  ! YAML output
     367         [ +  + ]:        6951 :  if (me == master) then
     368                 :             :    call results_gs%yaml_write(ab_out, cryst=crystal, info="Summary of ground state results",&
     369                 :        5474 :                               occopt=dtset%occopt, with_conv=(dtset%nstep > 0))
     370                 :             :  end if
     371                 :             : 
     372                 :        6951 :  call timab(1151,2,tsec)
     373                 :             : 
     374                 :             : !wannier interface
     375                 :        6951 :  call timab(1152,1,tsec)
     376                 :             : 
     377   [ +  +  +  - ]:        6951 :  if (dtset%prtwant==2 .and. ( dtset%usedmft /= 10 ) ) then
     378                 :             :        call wfd_run_wannier(cryst=crystal, ebands=ebands, hdr=hdr, mpi_enreg=mpi_enreg, &
     379                 :             :          & ngfftc=ngfft, ngfftf=ngfft, dtset=dtset, dtfil=dtfil,  &
     380                 :             :          & pawang=pawang,  pawrad=pawrad, pawtab=pawtab, psps=psps, &
     381                 :          13 :          &  kg=kg, cg=cg, cprj=cprj)
     382                 :             : !    else
     383                 :             : !
     384                 :             : !       call mlwfovlp(crystal, ebands, hdr, atindx1,cg,cprj,dtset,dtfil,eigen,gprimd,kg,&
     385                 :             : !&   mband,mcg,mcprj,mgfftc,mkmem,mpi_enreg,mpw,natom,&
     386                 :             : !&   nattyp,nfft,ngfft,nkpt,npwarr,nsppol,ntypat,occ,&
     387                 :             : !&   pawang,pawrad,pawtab,prtvol,psps,rprimd,ucvol,xred)
     388                 :             : 
     389         [ +  + ]:        6938 :  else if (dtset%prtwant==3) then
     390                 :             : 
     391                 :             : !  Convert cg and eigen to GW quasiparticle wave functions and eigenvalues in mlwfovlp_qp
     392   [ -  +  +  -  :           3 :    ABI_MALLOC(eigen2,(mband*nkpt*nsppol))
          +  -  +  -  -  
                +  -  + ]
     393   [ -  +  +  + ]:         642 :    eigen2=eigen
     394                 :             : 
     395                 :             :    call mlwfovlp_qp(cg,cprj,dtset,dtfil,eigen2,mband,mcg,mcprj,mkmem,mpw,natom,&
     396                 :           1 : &   nkpt,npwarr,nspden,nsppol,ntypat,Hdr,pawtab,rprimd,MPI_enreg)
     397                 :             : 
     398                 :             : !  Call Wannier90
     399                 :             : !   call mlwfovlp(crystal, ebands, hdr, atindx1,cg,cprj,dtset,dtfil,eigen2,gprimd,kg,&
     400                 :             : !&   mband,mcg,mcprj,mgfftc,mkmem,mpi_enreg,mpw,natom,&
     401                 :             : !&   nattyp,nfft,ngfft,nkpt,npwarr,nsppol,ntypat,occ,&
     402                 :             : !&   pawang,pawrad,pawtab,prtvol,psps,rprimd,ucvol,xred)
     403                 :             : 
     404                 :             :    call wfd_run_wannier(cryst=crystal, ebands=ebands, hdr=hdr, mpi_enreg=mpi_enreg, &
     405                 :             :      & ngfftc=ngfft, ngfftf=ngfft, dtset=dtset, dtfil=dtfil,  &
     406                 :             :      & pawang=pawang,  pawrad=pawrad, pawtab=pawtab, psps=psps, &
     407                 :           1 :      &  kg=kg, cg=cg, cprj=cprj)
     408                 :             : 
     409                 :             : 
     410                 :             : !  this is the old implementation, risky due to unpredictable size effects
     411                 :             : !  now eigen is not overwritten, one should use other ways to print the GW corrections
     412                 :             : !  eigen=eigen2
     413         [ -  + ]:           1 :    ABI_FREE(eigen2)
     414                 :             :  end if !prtwant
     415                 :             : 
     416                 :        6951 :  call timab(1152,2,tsec)
     417                 :        6951 :  call timab(1153,1,tsec)
     418                 :             : 
     419                 :        6951 :  occopt=dtset%occopt
     420                 :             : 
     421                 :        6951 :  prtnabla=dtset%prtnabla
     422                 :        6951 :  pawprtden=dtset%prtden-1
     423                 :             : 
     424                 :        6951 :  comm=mpi_enreg%comm_cell; me=xmpi_comm_rank(comm)
     425                 :        6951 :  comm_fft=mpi_enreg%comm_fft
     426                 :        6951 :  paral_atom=(my_natom/=natom)
     427                 :             : 
     428                 :             : !Warnings :
     429                 :             : !- core charge is excluded from the charge density;
     430                 :             : !- the potential is the INPUT vtrial.
     431                 :             : 
     432   [ +  +  +  - ]:        6951 :  if (iwrite_fftdatar(mpi_enreg) .and. dtset%usewvl==0) then
     433                 :             : 
     434                 :             :    ! output the density.
     435         [ +  + ]:        5593 :    if (dtset%prtden/=0) then
     436         [ +  + ]:        3588 :      if (dtset%positron/=1) rho_ptr => rhor
     437         [ +  + ]:        3588 :      if (dtset%positron==1) rho_ptr => electronpositron%rhor_ep
     438                 :             :      call fftdatar_write("density",dtfil%fnameabo_app_den,dtset%iomode,hdr,&
     439                 :        3588 :      crystal,ngfft,cplex1,nfft,nspden,rho_ptr,mpi_enreg,ebands=ebands)
     440                 :             : 
     441         [ +  + ]:        3588 :      if (dtset%positron/=0) then
     442         [ +  + ]:          11 :        if (dtset%positron/=1) rho_ptr => electronpositron%rhor_ep
     443         [ +  + ]:          11 :        if (dtset%positron==1) rho_ptr => rhor
     444         [ +  - ]:          11 :        fname = trim(dtfil%fnameabo_app_den)//'_POSITRON'
     445   [ +  -  +  - ]:          11 :        if (dtset%iomode == IO_MODE_ETSF) fname = strcat(fname, ".nc")
     446                 :             :        call fftdatar_write("positron_density",fname,dtset%iomode,hdr,&
     447                 :          11 :        crystal,ngfft,cplex1,nfft,nspden,rho_ptr,mpi_enreg,ebands=ebands)
     448                 :             :      end if
     449                 :             :    end if
     450                 :             : 
     451   [ -  +  -  - ]:        1358 :  else if (dtset%usewvl == 1 .and. dtset%prtden /= 0) then
     452                 :             :    !if iomode == 2 then set all outputs to netcdf format
     453                 :             :    !if iomode == 3 then set all outputs to ETSF format
     454                 :           0 :    accessfil = 0
     455         [ #  # ]:           0 :    if (dtset%iomode == IO_MODE_ETSF) accessfil = 3
     456         [ #  # ]:           0 :    if (dtset%iomode == IO_MODE_MPI) accessfil = 4
     457                 :           0 :    fform = fform_den
     458                 :             :     ! Write wavelet DEN. Note however that this should be delegate to separated Bigdft routines.
     459                 :             :     ! a lot of stuff written in outscf does not make sense if usewvl==0
     460                 :             :    call ioarr(accessfil,rhor,dtset,etotal,fform,dtfil%fnameabo_app_den, &
     461                 :           0 :    hdr,mpi_enreg,ngfft,cplex1,nfft,pawrhoij_dum,rdwr2,rdwrpaw0,wvl_den)
     462                 :             :  end if ! if master
     463                 :             : 
     464                 :             : !! MS - Printing of PAWDEN parallellised and several possible options included
     465                 :             : !We output the total electron density in the PAW case
     466                 :             : !this requires removing nhat from rhor and making PAW on-site corrections
     467   [ +  +  +  - ]:        6951 :  if (pawprtden>0 .and. psps%usepaw==1) then
     468                 :             : !  pawprtden 1 --> output PAW valence density
     469                 :             : !  "     2 --> output PAW valence+core density
     470                 :             : !  "     3 --> output core, valence and full atomic protodensity
     471                 :             : !  "     4 --> options 1+3
     472                 :             : !  "     5 --> options 2+3
     473                 :             : !  "     6 --> output all individual PAW density contributions
     474         [ +  - ]:           1 :    if (pawprtden/=3) then ! calc PAW valence density
     475   [ -  +  +  -  :           4 :      ABI_MALLOC(rhor_paw,(pawfgr%nfft,nspden))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     476   [ -  +  +  -  :           3 :      ABI_MALLOC(rhor_n_one,(pawfgr%nfft,nspden))
          -  +  +  -  -  
                +  -  + ]
     477   [ -  +  +  -  :           3 :      ABI_MALLOC(rhor_nt_one,(pawfgr%nfft,nspden))
          -  +  +  -  -  
                +  -  + ]
     478                 :             : !    If the communicator used for denfgr is kpt_comm, it is not compatible with paral_atom
     479   [ +  -  -  + ]:           1 :      if (mpi_enreg%paral_kgb==0.and.my_natom/=natom) then
     480                 :           0 :        my_natom_tmp=natom
     481   [ #  #  #  #  :           0 :        ABI_MALLOC(pawrhoij_all,(natom))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
     482                 :           0 :        call pawrhoij_nullify(pawrhoij_all)
     483                 :             :        call pawrhoij_copy(pawrhoij,pawrhoij_all,comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab,&
     484                 :           0 : &       keep_cplex=.false.,keep_qphase=.false.,keep_itypat=.false.,keep_nspden=.false.)
     485                 :             :      else
     486                 :           1 :        my_natom_tmp=my_natom
     487                 :           1 :        pawrhoij_all => pawrhoij
     488                 :             :      end if
     489         [ +  - ]:           1 :      if (pawprtden/=6) then
     490                 :             :        call denfgr(atindx1,gmet,comm_fft,my_natom_tmp,natom,nattyp,ngfft,nhat,dtset%nspinor,nsppol,nspden,&
     491                 :             : &       ntypat,pawfgr,pawrad,pawrhoij_all,pawtab,prtvol,rhor,rhor_paw,rhor_n_one,&
     492                 :             : &       rhor_nt_one,rprimd,dtset%typat,ucvol,xred,&
     493         [ -  + ]:           1 : &       comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab)
     494                 :             :      else
     495                 :             :        call denfgr(atindx1,gmet,comm_fft,my_natom_tmp,natom,nattyp,ngfft,nhat,dtset%nspinor,nsppol,nspden,&
     496                 :             : &       ntypat,pawfgr,pawrad,pawrhoij_all,pawtab,prtvol,rhor,rhor_paw,rhor_n_one,&
     497                 :             : &       rhor_nt_one,rprimd,dtset%typat,ucvol,xred,&
     498                 :             : &       abs_n_tilde_nt_diff=nt_ntone_norm,znucl=dtset%znucl,&
     499         [ #  # ]:           0 : &       comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab)
     500                 :             :      end if
     501   [ +  -  -  + ]:           1 :      if (mpi_enreg%paral_kgb==0.and.my_natom/=natom) then
     502                 :           0 :        call pawrhoij_free(pawrhoij_all)
     503         [ #  # ]:           0 :        ABI_FREE(pawrhoij_all)
     504                 :             :      end if
     505                 :             : 
     506         [ -  + ]:           1 :      if (prtvol>9) then  ! Check normalisation
     507   [ #  #  #  # ]:           0 :        norm = SUM(rhor_paw(:,1))*ucvol/PRODUCT(pawfgr%ngfft(1:3))
     508                 :           0 :        call xmpi_sum(norm,comm_fft,ierr)
     509                 :           0 :        write(msg,'(a,F8.4)') '  PAWDEN - NORM OF DENSITY: ',norm
     510                 :           0 :        call wrtout(std_out, msg)
     511                 :             :      end if
     512                 :             :    end if
     513                 :             : 
     514         [ -  + ]:           1 :    if (pawprtden>1.AND.pawprtden<6) then ! We will need the core density
     515   [ #  #  #  #  :           0 :      ABI_MALLOC(rhor_paw_core,(pawfgr%nfft,nspden))
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     516                 :             :      call read_atomden(mpi_enreg,natom,pawfgr%nfft,pawfgr%ngfft,nspden,ntypat,rhor_paw_core,&
     517                 :           0 : &     dtset%typat,rprimd,xred,prtvol,file_prefix='core   ')
     518                 :             : 
     519         [ #  # ]:           0 :      if (prtvol>9) then  ! Check normalisation
     520   [ #  #  #  # ]:           0 :        norm = SUM(rhor_paw_core(:,1))*ucvol/PRODUCT(pawfgr%ngfft(1:3))
     521                 :           0 :        call xmpi_sum(norm,comm_fft,ierr)
     522                 :           0 :        write(msg,'(a,F8.4)') '  ATMDEN - NORM OF CORE DENSITY: ', norm
     523                 :           0 :        call wrtout(std_out, msg)
     524                 :             :      end if
     525                 :             :    end if
     526                 :             : 
     527         [ #  # ]:           0 :    if (pawprtden>2.AND.pawprtden<6) then ! We will need the valence protodensity
     528   [ #  #  #  #  :           0 :      ABI_MALLOC(rhor_paw_val,(pawfgr%nfft,nspden))
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     529                 :             :      call read_atomden(mpi_enreg,natom,pawfgr%nfft,pawfgr%ngfft,nspden,ntypat,rhor_paw_val,&
     530                 :           0 : &     dtset%typat,rprimd,xred,prtvol,file_prefix='valence')
     531                 :             : 
     532         [ #  # ]:           0 :      if (prtvol>9) then ! Check normalisation
     533   [ #  #  #  # ]:           0 :        norm = SUM(rhor_paw_val(:,1))*ucvol/PRODUCT(pawfgr%ngfft(1:3))
     534                 :           0 :        call xmpi_sum(norm,comm_fft,ierr)
     535                 :           0 :        write(msg,'(a,F8.4)') '  ATMDEN - NORM OF VALENCE PROTODENSITY: ', norm
     536                 :           0 :        call wrtout(std_out, msg)
     537                 :             :      end if
     538                 :             :    end if
     539                 :             : 
     540         [ +  - ]:           1 :    if (iwrite_fftdatar(mpi_enreg)) then
     541         [ +  - ]:           1 :      if (pawprtden/=3) then
     542   [ -  +  -  -  :           1 :        if (pawprtden==2.or.pawprtden==5) rhor_paw = rhor_paw + rhor_paw_core
             -  -  -  - ]
     543                 :             : !      PAWDEN
     544                 :             :        call fftdatar_write("pawrhor",dtfil%fnameabo_app_pawden,dtset%iomode,hdr,&
     545                 :           1 :        crystal,ngfft,cplex1,nfft,nspden,rhor_paw,mpi_enreg,ebands=ebands)
     546                 :             :      end if
     547                 :             : 
     548         [ -  + ]:           1 :      if (pawprtden>2.AND.pawprtden<6) then
     549                 :             :        ! ATMDEN_CORE
     550                 :             :        call fftdatar_write("pawrhor_core",dtfil%fnameabo_app_atmden_core,dtset%iomode,hdr,&
     551                 :           0 :        crystal,ngfft,cplex1,nfft,nspden,rhor_paw_core,mpi_enreg,ebands=ebands)
     552                 :             : 
     553                 :             :        ! valence protodensity. ATMDEN_VAL
     554                 :             :        call fftdatar_write("pawrhor_val",dtfil%fnameabo_app_atmden_val,dtset%iomode,hdr,&
     555                 :           0 :        crystal,ngfft,cplex1,nfft,nspden,rhor_paw_val,mpi_enreg,ebands=ebands)
     556                 :             : 
     557                 :             :        ! full protodensity. ATMDEN_FULL
     558   [ #  #  #  #  :           0 :        rhor_paw_val = rhor_paw_val + rhor_paw_core
                   #  # ]
     559                 :             :        call fftdatar_write("pawrhor_full",dtfil%fnameabo_app_atmden_full,dtset%iomode,hdr,&
     560                 :           0 :        crystal,ngfft,cplex1,nfft,nspden,rhor_paw_val,mpi_enreg,ebands=ebands)
     561                 :             :      end if
     562                 :             : 
     563         [ -  + ]:           1 :      if (pawprtden==6) then ! Print all individual contributions to the density
     564                 :             :        ! N_TILDE - N_HAT
     565                 :             :        ! Use rhor_paw_val as temporary array
     566         [ #  # ]:           0 :        if (.not.allocated(rhor_paw_val))  then
     567   [ #  #  #  #  :           0 :          ABI_MALLOC(rhor_paw_val,(pawfgr%nfft,nspden))
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
     568                 :             :        end if
     569   [ #  #  #  #  :           0 :        rhor_paw_val = rhor - nhat
          #  #  #  #  #  
                #  #  # ]
     570                 :             : 
     571                 :             :        call fftdatar_write("pawrhor_ntilde_minus_nhat",dtfil%fnameabo_app_n_tilde,dtset%iomode,hdr,&
     572                 :           0 :        crystal,ngfft,cplex1,nfft,nspden,rhor_paw_val,mpi_enreg,ebands=ebands)
     573                 :             : 
     574                 :             : !      N_ONSITE
     575                 :             :        call fftdatar_write("pawrhor_n_one",dtfil%fnameabo_app_n_one,dtset%iomode,hdr,&
     576                 :           0 :        crystal,ngfft,cplex1,nfft,nspden,rhor_n_one,mpi_enreg,ebands=ebands)
     577                 :             : 
     578                 :             : !      N_TILDE_ONSITE
     579                 :             :        call fftdatar_write("pawrhor_nt_one",dtfil%fnameabo_app_nt_one,dtset%iomode,hdr,&
     580                 :           0 :        crystal,ngfft,cplex1,nfft,nspden,rhor_nt_one,mpi_enreg,ebands=ebands)
     581                 :             : 
     582                 :             :      end if ! All indivdual density cont.
     583                 :             :    end if ! if master
     584                 :             : 
     585         [ +  - ]:           1 :    ABI_SFREE(rhor_paw)
     586         [ -  + ]:           1 :    ABI_SFREE(rhor_paw_core)
     587         [ -  + ]:           1 :    ABI_SFREE(rhor_paw_val)
     588         [ +  - ]:           1 :    ABI_SFREE(rhor_n_one)
     589         [ +  - ]:           1 :    ABI_SFREE(rhor_nt_one)
     590                 :             : 
     591                 :             :  end if ! if paw+pawprtden
     592                 :             : 
     593                 :        6951 :  call timab(1153,2,tsec)
     594                 :             : 
     595                 :        6951 :  call timab(1155,1,tsec)
     596                 :             : 
     597                 :             :  ! Output of VCLMB file
     598                 :             :  ! The PAW correction has to be computed here (all processors contribute)
     599   [ +  +  +  + ]:        6951 :  if (psps%usepaw > 0 .AND. dtset%prtvclmb>0) then
     600                 :          32 :    nradint = 1000 ! radial integration grid density
     601   [ -  +  +  -  :         128 :    ABI_MALLOC(vpaw,(nfft,nspden))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     602   [ +  +  +  + ]:      938392 :    vpaw(:,:)=zero
     603   [ +  +  +  - ]:          32 :    if (me == master .and. my_natom > 0) then
     604         [ -  + ]:           8 :      if (paw_an(1)%cplex > 1) then
     605                 :           0 :        ABI_WARNING('cplex = 2 : complex hartree potential in PAW spheres. This is not coded yet. Imag part ignored')
     606                 :             :      end if
     607                 :             :    end if
     608                 :             : 
     609         [ +  + ]:          88 :    do ispden=1,nspden
     610                 :             :      ! for points inside spheres, replace with full AE hartree potential.
     611                 :             :      ! In principle the correction could be more subtle (not spherical)
     612         [ +  + ]:         164 :      do iatom=1,my_natom
     613         [ +  + ]:          76 :        iatom_tot=iatom;if (paral_atom) iatom_tot=mpi_enreg%my_atmtab(iatom)
     614                 :          76 :        itypat=dtset%typat(iatom_tot)
     615                 :             : 
     616   [ -  +  +  -  :         228 :        ABI_MALLOC(vh1spl,(paw_an(iatom)%mesh_size))
          +  -  +  -  -  
                +  -  + ]
     617   [ -  +  +  -  :         152 :        ABI_MALLOC(vh1_corrector,(paw_an(iatom)%mesh_size))
             -  +  -  + ]
     618   [ +  +  +  -  :         228 :        ABI_MALLOC(vh1_interp,(pawfgrtab(iatom)%nfgd))
          +  -  +  +  -  
                +  -  + ]
     619   [ +  +  +  -  :         152 :        ABI_MALLOC(radii,(pawfgrtab(iatom)%nfgd))
             -  +  -  + ]
     620   [ +  +  +  -  :         228 :        ABI_MALLOC(isort,(pawfgrtab(iatom)%nfgd))
          +  -  +  +  -  
                +  -  + ]
     621                 :             :        ! vh1 vht1 contain the spherical first moments of the Hartree potentials, so re-divide by Y_00 = sqrt(four_pi)
     622         [ +  + ]:       47040 :        vh1_corrector(:) = (paw_an(iatom)%vh1(:,1,ispden)-paw_an(iatom)%vht1(:,1,ispden)) / sqrt(four_pi)
     623                 :             : 
     624                 :             :        ! get end point derivatives
     625                 :          76 :        call bound_deriv(vh1_corrector, pawrad(itypat), pawrad(itypat)%mesh_size, yp1, ypn)
     626                 :             :        ! spline the vh1 function
     627                 :             :        ! NB for second argument of vh1: only first moment lm_size appears to be used
     628                 :             :        ! NB2: vh1 can in principle be complex - not sure what to do with the imaginary part. Ignored for now.
     629                 :          76 :        call spline(pawrad(itypat)%rad, vh1_corrector, paw_an(iatom)%mesh_size, yp1, ypn, vh1spl)
     630                 :             : 
     631         [ +  + ]:       70184 :        do ifgd = 1, pawfgrtab(iatom)%nfgd
     632                 :             :          ! get radii for this point
     633                 :       70108 :          isort(ifgd) = ifgd
     634         [ +  + ]:      280508 :          radii(ifgd) = sqrt(sum(pawfgrtab(iatom)%rfgd(:,ifgd)**2))
     635                 :             :        end do
     636                 :             : 
     637         [ +  + ]:          76 :        if (pawfgrtab(iatom)%nfgd/=0) then
     638                 :             :        ! spline interpolate the vh1 value for current radii
     639                 :          74 :          call sort_dp(pawfgrtab(iatom)%nfgd, radii, isort, tol12)
     640                 :             :          call splint(pawrad(itypat)%mesh_size, pawrad(itypat)%rad, &
     641                 :          74 : &         vh1_corrector, vh1spl, pawfgrtab(iatom)%nfgd, radii,  vh1_interp, ierr)
     642                 :             :        end if
     643                 :             : 
     644   [ +  +  +  + ]:       70412 :        norm=SUM(vh1_interp)*ucvol/PRODUCT(ngfft(1:3))
     645                 :          76 :        call xmpi_sum(norm,comm_fft,ierr)
     646                 :          76 :        write(msg,'(a,i6,a,E20.10)') ' sum of Hartree correction term on fft grid of atom : ', iatom, ' = ', norm
     647                 :          76 :        call wrtout(std_out, msg)
     648                 :             : 
     649         [ +  + ]:          76 :        if (pawfgrtab(iatom)%nfgd/=0) then
     650                 :             :          vpaw(pawfgrtab(iatom)%ifftsph(isort(1:pawfgrtab(iatom)%nfgd)),ispden) = &
     651                 :             : &         vpaw(pawfgrtab(iatom)%ifftsph(isort(1:pawfgrtab(iatom)%nfgd)),ispden) + &
     652   [ +  -  +  +  :      280506 : &         vh1_interp(1:pawfgrtab(iatom)%nfgd)
          +  +  +  -  +  
                +  +  + ]
     653                 :             :        end if
     654                 :             : 
     655                 :             :        ! get integral of correction term in whole sphere
     656         [ -  + ]:          76 :        ABI_FREE(radii)
     657         [ -  + ]:          76 :        ABI_FREE(vh1_interp)
     658                 :             : 
     659   [ -  +  +  -  :         228 :        ABI_MALLOC(radii,(nradint))
          +  -  +  -  -  
                +  -  + ]
     660   [ -  +  +  -  :         152 :        ABI_MALLOC(vh1_interp,(nradint))
             -  +  -  + ]
     661                 :             : 
     662   [ -  +  +  -  :         152 :        ABI_MALLOC(vh1_integ,(nradint))
             -  +  -  + ]
     663                 :          76 :        dr = pawrad(itypat)%rad(paw_an(iatom)%mesh_size) / dble(nradint)
     664         [ +  + ]:       76076 :        do ifgd = 1, nradint
     665                 :       76076 :          radii(ifgd) = dble(ifgd-1)*dr
     666                 :             :        end do
     667                 :             : 
     668                 :             :        ! spline interpolate the vh1 value for current radii
     669                 :             :        call splint(pawrad(itypat)%mesh_size, pawrad(itypat)%rad, &
     670                 :          76 : &       vh1_corrector, vh1spl, nradint, radii,  vh1_interp, ierr)
     671                 :             : 
     672         [ +  + ]:       76076 :        do ifgd = 1, nradint
     673                 :       76076 :          vh1_interp(ifgd) = vh1_interp(ifgd)*radii(ifgd)**2
     674                 :             :        end do
     675                 :             : 
     676                 :          76 :        call simpson_int(nradint, dr, vh1_interp, vh1_integ)
     677                 :          76 :        write(msg,'(a,i6,a,E20.10)') ' integral of Hartree correction term in sphere of atom: ', iatom, &
     678                 :         152 : &       ' = ', vh1_integ(nradint)*four*pi
     679                 :          76 :        call wrtout(std_out, msg)
     680                 :             : 
     681         [ -  + ]:          76 :        ABI_FREE(vh1spl)
     682         [ -  + ]:          76 :        ABI_FREE(vh1_corrector)
     683         [ -  + ]:          76 :        ABI_FREE(vh1_interp)
     684                 :          76 :        ABI_FREE(vh1_integ)
     685         [ -  + ]:          76 :        ABI_FREE(radii)
     686         [ -  + ]:         360 :        ABI_FREE(isort)
     687                 :             :      end do ! iatom
     688                 :             :    end do !ispden
     689                 :          32 :    call xmpi_sum_master(vpaw,master,mpi_enreg%comm_atom,ierr)
     690         [ +  + ]:          32 :    if (.not.iwrite_fftdatar(mpi_enreg)) then
     691         [ -  + ]:          14 :      ABI_FREE(vpaw)
     692                 :             :    end if
     693                 :             :  end if ! if paw - add all electron vhartree in spheres
     694                 :             : 
     695                 :        6951 :  call timab(1155,2,tsec)
     696                 :             : 
     697         [ +  + ]:        6951 :  if (iwrite_fftdatar(mpi_enreg)) then
     698                 :             : 
     699                 :        5593 :    call timab(1156,1,tsec)
     700                 :             : 
     701                 :             :    ! output the electron localization function ELF
     702         [ +  + ]:        5593 :    if (dtset%prtelf/=0) then
     703                 :             :      call fftdatar_write("elfr",dtfil%fnameabo_app_elf,dtset%iomode,hdr,&
     704         [ -  + ]:           4 :      crystal,ngfft,cplex1,nfft,nspden,elfr,mpi_enreg,ebands=ebands)
     705                 :             : 
     706         [ +  + ]:           4 :      if (nspden==2)then
     707   [ -  +  +  -  :           8 :        ABI_MALLOC(elfr_up,(nfft,nspden))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     708   [ +  +  +  + ]:      108006 :        elfr_up(:,:) = zero
     709         [ +  + ]:       54002 :        do ifft=1,nfft
     710                 :       54002 :          elfr_up(ifft,1) = elfr(ifft,2)
     711                 :             :        end do
     712                 :             : !      ELF_UP
     713                 :             :        call fftdatar_write("elfr_up",dtfil%fnameabo_app_elf_up,dtset%iomode,hdr,&
     714                 :           2 :        crystal,ngfft,cplex1,nfft,nspden,elfr_up,mpi_enreg,ebands=ebands)
     715                 :             : 
     716   [ -  +  +  -  :           6 :        ABI_MALLOC(elfr_down,(nfft,nspden))
          -  +  +  -  -  
                +  -  + ]
     717   [ +  +  +  + ]:      108006 :        elfr_down(:,:) = zero
     718         [ +  + ]:       54002 :        do ifft=1,nfft
     719                 :       54002 :          elfr_down(ifft,1) = elfr(ifft,3)
     720                 :             :        end do
     721                 :             : !      ELF_DOWN'
     722                 :             :        call fftdatar_write("elfr_down",dtfil%fnameabo_app_elf_down,dtset%iomode,hdr,&
     723                 :           2 :        crystal,ngfft,cplex1,nfft,nspden,elfr_down,mpi_enreg,ebands=ebands)
     724                 :             : 
     725         [ -  + ]:           2 :        ABI_FREE(elfr_up)
     726         [ -  + ]:           2 :        ABI_FREE(elfr_down)
     727                 :             :      end if
     728                 :             :    end if
     729                 :             : 
     730                 :        5593 :    call timab(1156,2,tsec)
     731                 :        5593 :    call timab(1157,1,tsec)
     732                 :             : 
     733                 :             : !  We output the gradient of density
     734         [ +  + ]:        5593 :    if (dtset%prtgden/=0) then
     735                 :             : 
     736                 :             :      call fftdatar_write("grhor_1",dtfil%fnameabo_app_gden1,dtset%iomode,hdr,&
     737         [ -  + ]:           3 :      crystal,ngfft,cplex1,nfft,nspden,grhor(:,:,1),mpi_enreg,ebands=ebands)
     738                 :             : 
     739                 :             :      call fftdatar_write("grhor_2",dtfil%fnameabo_app_gden2,dtset%iomode,hdr,&
     740         [ -  + ]:           3 :      crystal,ngfft,cplex1,nfft,nspden,grhor(:,:,2),mpi_enreg,ebands=ebands)
     741                 :             : 
     742                 :             :      call fftdatar_write("grhor_3",dtfil%fnameabo_app_gden3,dtset%iomode,hdr,&
     743         [ -  + ]:           3 :      crystal,ngfft,cplex1,nfft,nspden,grhor(:,:,3),mpi_enreg,ebands=ebands)
     744                 :             :    end if
     745                 :             : 
     746                 :        5593 :    call timab(1157,2,tsec)
     747                 :        5593 :    call timab(1158,1,tsec)
     748                 :             : 
     749                 :             : !  We output the total kinetic energy density KDEN
     750         [ +  + ]:        5593 :    if (dtset%prtkden/=0) then
     751                 :             :      call fftdatar_write("kinedr",dtfil%fnameabo_app_kden,dtset%iomode,hdr,&
     752         [ -  + ]:          45 :      crystal,ngfft,cplex1,nfft,nspden,taur,mpi_enreg,ebands=ebands)
     753                 :             :    end if
     754                 :             : 
     755                 :        5593 :    call timab(1158,2,tsec)
     756                 :        5593 :    call timab(1159,1,tsec)
     757                 :             : 
     758                 :             : 
     759                 :             : !  We output the Laplacian of density
     760         [ +  + ]:        5593 :    if (dtset%prtlden/=0) then
     761                 :             :      call fftdatar_write("laprhor",dtfil%fnameabo_app_lden,dtset%iomode,hdr,&
     762         [ -  + ]:           2 :      crystal,ngfft,cplex1,nfft,nspden,lrhor,mpi_enreg,ebands=ebands)
     763                 :             :    end if
     764                 :             : 
     765                 :        5593 :    call timab(1159,2,tsec)
     766                 :        5593 :    call timab(1160,1,tsec)
     767                 :             : 
     768                 :             : !  POT
     769         [ +  + ]:        5593 :    if (dtset%prtpot>0) then
     770                 :             :      call fftdatar_write("vtrial",dtfil%fnameabo_app_pot,dtset%iomode,hdr,&
     771                 :          58 :                          crystal,ngfft,cplex1,nfft,nspden,vtrial,mpi_enreg,ebands=ebands)
     772                 :             :    end if
     773                 :             : 
     774                 :             : !  EIG
     775   [ -  +  -  - ]:        5593 :    if (dtset%prteig==2 .and. me == master) then
     776         [ #  # ]:           0 :      fname=trim(dtfil%fnameabo_app_eig)//'.nc'
     777                 :             :      call write_eig(eigen,e_fermie,fname,dtset%kptns,dtset%mband,dtset%nband,dtset%nkpt,dtset%nsppol,&
     778                 :           0 :                     results_gs%extfpmd_eshift) ! Optional arguments
     779                 :             :    end if
     780                 :             : 
     781                 :        5593 :    call timab(1160,2,tsec)
     782                 :        5593 :    call timab(1161,1,tsec)
     783                 :             : 
     784         [ +  + ]:        5593 :    if (dtset%prtgeo>0) then
     785                 :          45 :      coordn=dtset%prtgeo
     786                 :          45 :      call bonds_lgth_angles(coordn,dtfil%fnameabo_app_geo,natom,psps%ntypat, rprimd,dtset%typat,xred,dtset%znucl)
     787                 :             :    end if
     788                 :             : 
     789         [ +  + ]:        5593 :    if (dtset%prtcif > 0) then
     790                 :             :      call prt_cif(dtset%brvltt, dtfil%fnameabo_app_cif, natom, dtset%nsym, dtset%ntypat, rprimd, &
     791                 :           2 :                   dtset%spgaxor, dtset%spgroup, dtset%spgorig, dtset%symrel, dtset%tnons, dtset%typat, xred, dtset%znucl)
     792                 :             :    end if
     793                 :             : 
     794                 :        5593 :    call timab(1161,2,tsec)
     795                 :        5593 :    call timab(1162,1,tsec)
     796                 :             : 
     797                 :             : !  STM
     798         [ +  + ]:        5593 :    if (dtset%prtstm/=0) then
     799                 :           3 :      call fftdatar_write("stm",dtfil%fnameabo_app_stm,dtset%iomode,hdr,crystal,ngfft,cplex1,nfft,nspden,rhor,mpi_enreg,ebands=ebands)
     800                 :             :    end if
     801                 :             : 
     802                 :        5593 :    call timab(1162,2,tsec)
     803                 :        5593 :    call timab(1163,1,tsec)
     804                 :             : 
     805         [ +  + ]:        5593 :    if (dtset%prt1dm>0) then
     806                 :          37 :      call out1dm(dtfil%fnameabo_app_1dm,mpi_enreg,natom,nfft,ngfft,nspden,psps%ntypat,rhor,rprimd,dtset%typat,ucvol,vtrial,xred,dtset%znucl)
     807                 :             :    end if
     808                 :             : 
     809                 :        5593 :    call timab(1163,2,tsec)
     810                 :        5593 :    call timab(1164,1,tsec)
     811                 :             : 
     812                 :             : !  VHA
     813         [ +  + ]:        5593 :    if (dtset%prtvha>0) then
     814   [ -  +  +  -  :         148 :      ABI_MALLOC(vwork,(nfft,nspden))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     815         [ +  + ]:          86 :      do ispden=1,nspden
     816         [ +  + ]:      688958 :        vwork(:,ispden)=vhartr(:)
     817                 :             :      end do
     818                 :             : 
     819                 :          37 :      call fftdatar_write("vhartree",dtfil%fnameabo_app_vha,dtset%iomode,hdr,crystal,ngfft,cplex1,nfft,nspden,vwork,mpi_enreg,ebands=ebands)
     820         [ -  + ]:          37 :      ABI_FREE(vwork)
     821                 :             :    end if
     822                 :             : 
     823                 :             : !  VPSP
     824         [ +  + ]:        5593 :    if (dtset%prtvpsp>0) then
     825   [ -  +  +  -  :         132 :      ABI_MALLOC(vwork,(nfft,nspden))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     826         [ +  + ]:          78 :      do ispden=1,nspden
     827         [ +  + ]:      686030 :        vwork(:,ispden)=vpsp(:)
     828                 :             :      end do
     829                 :             : 
     830                 :          33 :      call fftdatar_write("vpsp",dtfil%fnameabo_app_vpsp,dtset%iomode,hdr,crystal,ngfft,cplex1,nfft,nspden,vwork,mpi_enreg,ebands=ebands)
     831                 :             : 
     832         [ -  + ]:          33 :      ABI_FREE(vwork)
     833                 :             :    end if
     834                 :             : 
     835                 :             : ! VCouLoMB
     836         [ +  + ]:        5593 :    if (dtset%prtvclmb>0) then
     837                 :             : 
     838   [ -  +  +  -  :         140 :      ABI_MALLOC(vwork,(nfft,nspden))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     839         [ +  + ]:          82 :      do ispden=1,nspden
     840         [ +  + ]:      687314 :        vwork(:,ispden)=vpsp(:)+vhartr(:)
     841                 :             :      end do
     842         [ +  + ]:          35 :      if (psps%usepaw==1) then
     843         [ +  + ]:          48 :        do ispden=1,nspden
     844         [ +  + ]:      454512 :          vwork(:,ispden)=vwork(:,ispden)+vpaw(:,ispden)
     845                 :             :        end do
     846         [ -  + ]:          18 :        ABI_FREE(vpaw)
     847                 :             :      end if
     848                 :             : 
     849                 :             :      call fftdatar_write("vhartree_vloc",dtfil%fnameabo_app_vclmb,dtset%iomode,hdr,&
     850                 :          35 :                           crystal,ngfft,cplex1,nfft,nspden,vwork,mpi_enreg,ebands=ebands)
     851                 :             : 
     852                 :             : !TODO: find out why this combination of calls with fftdatar_write then out1dm fails on buda with 4 mpi-fft procs (np_spkpt 1).
     853                 :             : !      For the moment comment it out. Only DS2 of mpiio test 27 fails
     854                 :             : !     call out1dm(dtfil%fnameabo_app_vclmb_1dm,mpi_enreg,natom,nfft,ngfft,nspden,psps%ntypat,&
     855                 :             : !&         rhor,rprimd,dtset%typat,ucvol,vwork,xred,dtset%znucl)
     856                 :             : 
     857                 :             : ! TODO: add TEM phase with CE = (2 pi / lambda) (E+E0)/(E(E+2E0)) from p.49 of RE Dunin Borkowski 2004 encyclopedia of nanoscience volume 3 pp 41-99
     858                 :             : !   where E is energy of electron, E0 rest mass, lambda the relativistic wavelength
     859                 :             : !   values of CE at 200 300 and 1000 kV:  7.29e6  6.53e6   5.39e6 rad / V / m
     860                 :             : !   vertical integral of vclmb * c / ngfft(3) / cross sectional area factor (= sin(gamma))
     861                 :             : !      * Bohr_Ang * 1.0e-10* Ha_eV to get to SI
     862                 :             : !      * CE factor above
     863                 :             : !   should be done for each plane perpendicular to the axes...
     864         [ -  + ]:          35 :      ABI_FREE(vwork)
     865                 :             :    end if ! prtvclmb
     866                 :             : 
     867                 :             : 
     868                 :             : !  VHXC
     869         [ +  + ]:        5593 :    if (dtset%prtvhxc>0) then
     870   [ -  +  +  -  :         144 :      ABI_MALLOC(vwork,(nfft,nspden))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     871         [ +  + ]:          84 :      do ispden=1,nspden
     872         [ +  + ]:      694876 :        vwork(:,ispden)=vhartr(:)+vxc(:,ispden)
     873                 :             :      end do
     874                 :             : 
     875                 :             :      call fftdatar_write("vhxc",dtfil%fnameabo_app_vhxc,dtset%iomode,hdr,&
     876                 :          36 :                           crystal,ngfft,cplex1,nfft,nspden,vwork,mpi_enreg,ebands=ebands)
     877         [ -  + ]:          36 :      ABI_FREE(vwork)
     878                 :             :    end if
     879                 :             : 
     880                 :             : !  VXC
     881         [ +  + ]:        5593 :    if (dtset%prtvxc>0) then
     882                 :             :      call fftdatar_write("exchange_correlation_potential",dtfil%fnameabo_app_vxc,dtset%iomode,hdr,&
     883                 :          34 :                          crystal,ngfft,cplex1,nfft,nspden,vxc,mpi_enreg,ebands=ebands)
     884                 :             :    end if
     885                 :             : 
     886                 :        5593 :    call timab(1164,2,tsec)
     887                 :             : 
     888                 :             :  end if ! if iwrite_fftdatar
     889                 :             : 
     890                 :        6951 :  call timab(1165,1,tsec)
     891                 :             : 
     892                 :             : !Generate DOS using the tetrahedron method or using Gaussians
     893                 :             : !FIXME: Should centralize all calculations of DOS here in outscfcv
     894   [ +  +  +  + ]:        6951 :  if (dtset%prtdos>=2.or.dtset%pawfatbnd>0) then
     895                 :          49 :    call dos%init(dtset, psps, pawtab)
     896                 :             : 
     897   [ +  +  +  + ]:          49 :    if (dos%partial_dos_flag>=1 .or. dos%fatbands_flag==1)then
     898                 :             :      ! Generate fractions for partial DOSs if needed partial_dos 1,2,3,4  give different decompositions
     899                 :          45 :      collect = 1 !; if (psps%usepaw==1 .and. dos%partial_dos_flag /= 2) collect = 0
     900   [ +  +  +  +  :          45 :      if ((psps%usepaw==0.or.dtset%pawprtdos/=2) .and. dos%partial_dos_flag>=1) then
                   +  + ]
     901                 :          42 :        call dos%partial_dos_fractions(crystal,dtset,eigen,occ,npwarr,kg,cg,mcg,collect,mpi_enreg)
     902                 :             :      end if
     903                 :             : 
     904   [ +  +  +  - ]:          45 :      if (psps%usepaw==1 .and. dos%partial_dos_flag /= 2) then
     905                 :             :        ! TODO: update partial_dos_fractions_paw for extra atoms - no PAW contribution normally, but check bounds and so on.
     906                 :          24 :        call dos%partial_dos_fractions_paw(cprj,dimcprj,dtset,mcprj,mkmem,mpi_enreg,pawrad,pawtab)
     907                 :             :      end if
     908                 :             : 
     909                 :             :    else
     910   [ +  +  +  +  :         370 :      dos%fractions(:,:,:,1)=one
                   +  + ]
     911                 :             :    end if
     912                 :             : 
     913                 :             : !  Here, print out fatbands for the k-points given in file appended _FATBANDS
     914   [ +  +  +  +  :          49 :    if (me == master .and. dtset%pawfatbnd>0 .and. dos%fatbands_flag==1) then
                   +  - ]
     915                 :           1 :      call dos%prtfatbands(dtset,ebands,dtfil%fnameabo_app_fatbands,dtset%pawfatbnd,pawtab)
     916                 :             :    end if
     917                 :             : 
     918                 :             : !  Here, computation and output of DOS and partial DOS  _DOS
     919   [ +  +  +  + ]:          49 :    if (dos%fatbands_flag == 0 .and. dos%prtdos /= 4) then
     920                 :          46 :      call dos%calcnwrite(dtset,crystal,ebands,dtfil%fnameabo_app_dos,comm)
     921                 :             :    end if
     922                 :             : 
     923                 :             :    ! Write netcdf file with dos% results.
     924         [ +  + ]:          49 :    if (me == master) then
     925   [ +  -  +  - ]:          28 :      fname = trim(dtfil%filnam_ds(4))//'_FATBANDS.nc'
     926         [ -  + ]:          28 :      NCF_CHECK(nctk_open_create(ncid, fname, xmpi_comm_self))
     927                 :          28 :      call dos%ncwrite(crystal, ebands, hdr, dtset, psps, pawtab, ncid)
     928         [ -  + ]:          28 :      NCF_CHECK(nf90_close(ncid))
     929                 :             :    end if
     930                 :             : 
     931                 :             :    !TODO: do not free dos here, but use the fractions below in calcdenmagsph
     932                 :          49 :    call dos%free()
     933                 :             :  end if ! prtdos > 1
     934                 :             : 
     935                 :        6951 :  call timab(1165,2,tsec)
     936                 :        6951 :  call timab(1166,1,tsec)
     937                 :             : 
     938                 :             : !Output of integrated density inside atomic spheres
     939   [ +  +  +  -  :       27804 :  if ((dtset%prtdensph==1.and.dtset%usewvl==0) .or. sum(abs(dtset%hspinfield)) > tol10) then
             -  +  -  - ]
     940   [ -  +  +  -  :       27804 :    ABI_MALLOC(intgden, (nspden, natom))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
     941                 :             : 
     942                 :             :    call calcdenmagsph(mpi_enreg,natom,nfft,ngfft,nspden,&
     943                 :        6951 :                       ntypat,dtset%ratsm,dtset%ratsph,rhor,rprimd,dtset%typat,xred,1,cplex1,dtset%qgbt,dtset%use_gbt,intgden=intgden,rhomag=rhomag)
     944                 :             : 
     945                 :             :    !  for rhomag:
     946                 :             :    !    in collinear case component 1 is total density and 2 is _magnetization_ up-down
     947                 :             :    !    in non collinear case component 1 is total density, and 2:4 are the magnetization vector
     948                 :             : 
     949   [ +  -  +  - ]:        6951 :    if (dtset%prtdensph==1.and.dtset%usewvl==0) then
     950   [ +  +  +  +  :       16482 :      if(all(dtset%constraint_kind(:)==0))then
                   +  + ]
     951                 :        6897 :        call prtdenmagsph(cplex1,intgden,natom,nspden,ntypat,units,1,dtset%qgbt,dtset%ratsm,dtset%ratsph,rhomag,dtset%typat,dtset%znucl,dtset%spinaxis)
     952                 :             :      else
     953                 :          54 :        call prtdenmagsph(cplex1,intgden,natom,nspden,ntypat,units,1,dtset%qgbt,dtset%ratsm,dtset%ratsph,rhomag,dtset%typat,dtset%znucl,dtset%spinaxis,dtset%ziontypat)
     954                 :             :      endif
     955   [ +  +  +  +  :       16482 :      if(any(dtset%constraint_kind(:)/=0))then
                   +  + ]
     956   [ -  +  -  -  :          54 :        call prtdenmagsph(cplex1,intgres,natom,nspden,ntypat,units,21,dtset%qgbt,dtset%ratsm,dtset%ratsph,rhomag,dtset%typat,dtset%znucl,dtset%spinaxis)
          -  -  -  -  -  
                      + ]
     957                 :             :      endif
     958                 :             :    end if !end prtdensph==1 .and. usewvl==0
     959                 :             : 
     960                 :             : !!!!!!!!!!!!!!!!!!!!!!!!if prt_lorbmag value is equal 1 and the calculations are noncollinear then the local orbital magnetic moments are calculated
     961         [ +  + ]:        6951 : if (dtset%prt_lorbmag==1) then
     962                 :             : 
     963   [ -  +  -  - ]:           1 :     if ((dtset%nspinor .ne. 2) .and. (dtset%nspden .ne.4)) then
     964                 :           0 :         write (msg,'(a)')" "
     965                 :           0 :         call wrtout(units, msg)
     966                 :           0 :         write (msg,'(a)')"WARNING*"
     967                 :           0 :         call wrtout(units, msg)
     968                 :           0 :         write (msg,'(a)')"prt_lorbmag=1, To calculate orbital magnetisation, calculations need to be noncollinear"
     969                 :           0 :         call wrtout(units, msg)
     970                 :             :     else
     971         [ +  - ]:           1 :         if (dtset%usepawu .ne. 0)then
     972                 :             :             call loc_orbmom_cal(1,0,dmatdum,0,0,indsym,my_natom,dtset%natom,dtset%natpawu,&
     973                 :             :             &   dtset%nspinor,dtset%nsppol,dtset%nsym,dtset%ntypat,paw_ij,pawang,pawrad,dtset%pawprtvol,&
     974                 :             :             &   pawrhoij,pawtab,dtset%spinat,dtset%symafm,dtset%typat,0,dtset%usepawu,dtset%znucl,&
     975                 :           1 :             &   mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom)
     976                 :             :         else
     977                 :           0 :             write (msg,'(a)')" "
     978                 :           0 :             call wrtout(units, msg)
     979                 :           0 :             write (msg,'(a)')"WARNING*"
     980                 :           0 :             call wrtout(units, msg)
     981                 :           0 :             write (msg,'(a)')"prt_lorbmag=1, To calculate orbital magnetisation LDA+U calculations should be activated"
     982                 :           0 :             call wrtout(units, msg)
     983                 :             :         end if
     984                 :             :      endif
     985                 :             :    end if
     986                 :             : 
     987   [ +  +  +  + ]:       27804 :    if (sum(abs(dtset%hspinfield)) > tol10) then
     988         [ +  + ]:          12 :      if(nspden==2)then
     989                 :           2 :        e_hspinfield = -half*rhomag(1,2)*dtset%hspinfield(3)
     990                 :           2 :        write (msg, "(a,E20.10,a)") " Collinear magnetization ", rhomag(1,2), &
     991                 :           4 :            " (in # of spins, without 1/2 for magnetic moment) "
     992                 :           2 :        call wrtout(units, msg)
     993         [ +  - ]:          10 :      else if(nspden==4)then
     994                 :             :        e_hspinfield = -half * (dtset%hspinfield(1)*rhomag(1,2)& ! x
     995                 :             : &                         +dtset%hspinfield(2)*rhomag(1,3)& ! y
     996                 :          10 : &                         +dtset%hspinfield(3)*rhomag(1,4)) ! z
     997                 :          10 :        write (msg, "(a,3E20.10,a)") " Magnetization vector ", rhomag(1,2:4), &
     998                 :          20 : &            " (in # of spins, without 1/2 for magnetic moment) "
     999                 :          10 :        call wrtout(units, msg)
    1000                 :             :      end if
    1001                 :             : !TODO: this quantity should also be calculated in rhotov, and stored in
    1002                 :             : !    results_gs%energies%e_hspinfield, but for the moment it comes out 0
    1003                 :          12 :      write (msg, "(a,E20.10,a)") " Spin magnetic energy -m.B = ", e_hspinfield, " Ha"
    1004                 :          12 :      call wrtout(units, msg)
    1005                 :             :    end if
    1006                 :             :  end if ! end if prtdensph or magnetic field
    1007                 :             : 
    1008                 :        6951 :  call timab(1166,2,tsec)
    1009                 :        6951 :  call timab(1167,1,tsec)
    1010                 :             : 
    1011         [ +  + ]:        6951 :  if (dtset%magconon /= 0) then
    1012                 :             : !  calculate final value of terms for magnetic constraint: "energy" term, lagrange multiplier term, and atomic contributions
    1013                 :             :    call mag_penalty_e(dtset%magconon,dtset%magcon_lambda,mpi_enreg,&
    1014                 :           5 : & natom,nfft,ngfft,nspden,ntypat,dtset%ratsm,dtset%ratsph,rhor,rprimd,dtset%spinat,dtset%typat,xred,dtset%znucl,dtset%qgbt,dtset%use_gbt,dtset%spinaxis)
    1015                 :             :  end if
    1016                 :             : 
    1017                 :        6951 :  call timab(1167,2,tsec)
    1018                 :        6951 :  call timab(1168,1,tsec)
    1019                 :             : 
    1020                 :             : !If PAW, provide additional outputs
    1021         [ +  + ]:        6951 :  if (psps%usepaw==1) then
    1022                 :             : !  Output of compensation charge
    1023   [ +  +  +  + ]:        1523 :    if (dtset%nstep>0.or.dtfil%ireadwf/=0) then
    1024                 :        1522 :      write(msg, '(4a)' )ch10,' PAW TEST:',ch10,&
    1025                 :        3044 : &     ' ==== Compensation charge inside spheres ============'
    1026   [ +  -  +  + ]:        1522 :      if (compch_sph>-1.d4.and.compch_fft>-1.d4) &
    1027                 :        1502 : &     write(msg, '(3a)' ) trim(msg),ch10,' The following values must be close to each other ...'
    1028         [ +  - ]:        3044 :      if (compch_sph>-1.d4) write(msg, '(3a,f22.15)' ) trim(msg),ch10,&
    1029                 :        3044 : &     ' Compensation charge over spherical meshes = ',compch_sph
    1030         [ +  + ]:        1522 :      if (compch_fft>-1.d4) then
    1031         [ +  + ]:        1502 :        if (pawfgr%usefinegrid==1) then
    1032                 :        1433 :          write(msg, '(3a,f22.15)' ) trim(msg),ch10,&
    1033                 :        2866 : &         ' Compensation charge over fine fft grid    = ',compch_fft
    1034                 :             :        else
    1035                 :          69 :          write(msg, '(3a,f22.15)' ) trim(msg),ch10,&
    1036                 :         138 : &         ' Compensation charge over fft grid         = ',compch_fft
    1037                 :             :        end if
    1038                 :             :      end if
    1039                 :        1522 :      call wrtout(units, msg)
    1040                 :             :    end if
    1041                 :             : !  Output of pseudopotential strength Dij and augmentation occupancies Rhoij
    1042                 :             :    call pawprt(dtset,my_natom,paw_ij,pawrhoij,pawtab,&
    1043                 :             : &   comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab,&
    1044                 :        1523 : &   electronpositron=electronpositron)
    1045                 :             :  end if
    1046                 :             : 
    1047                 :        6951 :  call timab(1168,2,tsec)
    1048                 :        6951 :  call timab(1169,1,tsec)
    1049                 :             : 
    1050                 :             : 
    1051                 :             : !PAW + output for optical conductivity   _OPT and _OPT2
    1052   [ +  +  +  + ]:        6951 :  if (psps%usepaw==1.and.prtnabla>0) then
    1053         [ +  + ]:          28 :    if (prtnabla==1.or.prtnabla==2) then
    1054                 :             :      call optics_paw(atindx1,cg,cprj,dimcprj,dtfil,dtset,eigen,gprimd,hdr,kg,&
    1055                 :             : &     mband,mcg,mcprj,mkmem,mpi_enreg,mpsang,mpw,natom,nkpt,npwarr,nsppol,pawang,&
    1056                 :          26 : &     pawrad,pawrhoij,pawtab,psps%znuclpsp)
    1057                 :             :    end if
    1058         [ +  + ]:          28 :    if (prtnabla==2.or.prtnabla==3) then
    1059         [ +  + ]:           3 :      if(associated(rcpaw)) then
    1060         [ +  - ]:           1 :        if(dtset%nspinor==2) then
    1061         [ -  + ]:           1 :          ABI_MALLOC(rcpaw_dirac,)
    1062                 :             :          call rcpaw_init(rcpaw_dirac,dtset,psps%filpsp,pawrad,pawtab,dtset%ntypat,1,.True.,&
    1063                 :           1 : &                        my_natom,mpi_enreg%comm_atom,mpi_enreg%my_atmtab)
    1064         [ -  + ]:           1 :           option=0;if (dtset%iscf>0.and.dtset%iscf<10) option=1
    1065         [ -  + ]:           1 :          if(dtset%extfpmd_pawsph>0) then
    1066                 :           0 :            ABI_ERROR('Extfpmd pawsph > 0 with nspinor=2 is work in progress for optics')
    1067                 :             :          endif
    1068         [ +  + ]:           2 :          do itypat=1,rcpaw_dirac%ntypat
    1069         [ +  + ]:           6 :            do iln=1,rcpaw_dirac%atm(itypat)%ln_size
    1070                 :           4 :              l=rcpaw_dirac%atm(itypat)%indln(1,iln)
    1071                 :           4 :              n=rcpaw_dirac%atm(itypat)%indln(2,iln)
    1072         [ +  - ]:          10 :              do iln2=1,rcpaw%atm(itypat)%ln_size
    1073                 :           9 :                 ll=rcpaw%atm(itypat)%indln(1,iln2)
    1074                 :           9 :                 nn=rcpaw%atm(itypat)%indln(2,iln2)
    1075         [ +  + ]:           9 :                 if(nn==n.and.ll==l) then
    1076                 :             :                   rcpaw_dirac%atm(itypat)%occ(iln,1)=rcpaw_dirac%atm(itypat)%occ(iln,1)*&
    1077                 :           4 :                     rcpaw%atm(itypat)%occ(iln2,1)/rcpaw%atm(itypat)%max_occ(iln2,1)
    1078                 :           4 :                   exit
    1079                 :             :                 endif
    1080                 :             :              enddo
    1081                 :             :            enddo
    1082                 :             :          enddo
    1083                 :             :          call paw_relax_core(pawtab,pawrad,pawang,pawrhoij,dtset%ntypat,rcpaw_dirac,psps,dtset,&
    1084                 :             : &                            1,dtset%pawnzlm,option,ucvol,paw_an,my_natom,&
    1085                 :           1 : &                            mpi_enreg%my_atmtab,mpi_enreg%comm_atom)
    1086         [ +  + ]:           2 :          do itypat=1,rcpaw%ntypat
    1087   [ +  +  +  + ]:           7 :            rcpaw_dirac%atm(itypat)%eig=rcpaw_dirac%atm(itypat)%eig+rcpaw%atm(itypat)%eigshift
    1088                 :             :          enddo
    1089                 :             :          call optics_paw_core(atindx1,cprj,dimcprj,dtfil,dtset,eigen,psps%filpsp,hdr,&
    1090                 :             : &         mband,mcprj,mkmem,mpi_enreg,mpsang,natom,nkpt,nsppol,pawang,pawrad,pawrhoij,pawtab,&
    1091                 :           1 : &         psps%znuclpsp,rcpaw=rcpaw_dirac)
    1092                 :           1 :           call rcpaw_destroy(rcpaw_dirac)
    1093   [ -  +  -  +  :           1 :           ABI_FREE(rcpaw_dirac)
          -  +  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  +  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  +  -  -  -  
             -  -  -  -  
                      - ]
    1094                 :             :        else
    1095                 :             :          call optics_paw_core(atindx1,cprj,dimcprj,dtfil,dtset,eigen,psps%filpsp,hdr,&
    1096                 :             : &         mband,mcprj,mkmem,mpi_enreg,mpsang,natom,nkpt,nsppol,pawang,pawrad,pawrhoij,pawtab,&
    1097                 :           0 : &         psps%znuclpsp,rcpaw=rcpaw)
    1098                 :             :        endif
    1099                 :             :      else
    1100                 :             :        call optics_paw_core(atindx1,cprj,dimcprj,dtfil,dtset,eigen,psps%filpsp,hdr,&
    1101                 :             : &       mband,mcprj,mkmem,mpi_enreg,mpsang,natom,nkpt,nsppol,pawang,pawrad,pawrhoij,pawtab,&
    1102                 :           2 : &       psps%znuclpsp)
    1103                 :             :      endif
    1104                 :             :    end if
    1105                 :             :  end if
    1106         [ -  + ]:        6951 :  if (prtnabla<0) then
    1107                 :             :    ! TODO: This routine is not tested but it's used in production.
    1108                 :             :    call optics_vloc(cg,dtfil,dtset,eigen,gprimd,hdr,kg,&
    1109                 :           0 : &   mband,mcg,mkmem,mpi_enreg,mpw,nkpt,npwarr,nsppol)
    1110                 :             :  end if
    1111                 :             : 
    1112                 :        6951 :  call timab(1169,2,tsec)
    1113                 :        6951 :  call timab(1170,1,tsec)
    1114                 :             : 
    1115                 :             : !Optionally provide output for AE wavefunctions (only for PAW)
    1116   [ +  +  +  + ]:        6951 :  if (psps%usepaw==1 .and. dtset%pawprtwf>=1) then
    1117   [ -  +  +  -  :           5 :    ABI_MALLOC(ps_norms,(nsppol,nkpt,mband))
          -  +  +  -  -  
          +  +  -  +  -  
          +  -  -  +  -  
                      + ]
    1118                 :             : 
    1119                 :             :    call pawmkaewf(dtset,crystal,ebands,my_natom,mpw,mband,mcg,mcprj,nkpt,mkmem,nsppol,Dtset%nband,&
    1120                 :             : &   Dtset%istwfk,npwarr,Dtset%kptns,Dtset%ngfftdg,kg,dimcprj,pawfgrtab,&
    1121                 :             : &   Pawrad,Pawtab,Hdr,Dtfil,cg,Cprj,&
    1122                 :             : &   MPI_enreg,ierr,pseudo_norms=ps_norms,set_k=dtset%pawprt_k,set_band=dtset%pawprt_b,&
    1123                 :           1 : &   comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab)
    1124                 :             : 
    1125         [ +  - ]:           1 :    if (dtset%pawprt_b==0) then
    1126         [ +  - ]:           1 :      fname = strcat(dtfil%filnam_ds(4), '_PAWSTAT')
    1127         [ -  + ]:           1 :      if (open_file(fname, msg,newunit=tmp_unt,status='unknown',form='formatted') /= 0) then
    1128                 :           0 :        ABI_ERROR(msg)
    1129                 :             :      end if
    1130                 :           1 :      write(tmp_unt,'(5a)') '# This file contains the statistics on the cancellation of',ch10,&
    1131                 :           1 : &     '# the onsite pseudo component of the all-electron wavefunction',ch10,&
    1132                 :           2 : &     '# with the plane wave part'
    1133                 :           1 :      ii = 0
    1134         [ +  + ]:           2 :      do isppol=1,nsppol
    1135                 :           1 :        write(tmp_unt,'(a,i0)') '# isppol = ',isppol
    1136         [ +  + ]:           3 :        do ikpt=1,nkpt
    1137                 :           1 :          write(tmp_unt,'(a,i0)') '# ikpt = ',ikpt
    1138                 :           1 :          write(tmp_unt,'(a)') '#    band      norm'
    1139                 :           1 :          occ_norm = zero; unocc_norm = zero; nocc = 0
    1140         [ +  + ]:           7 :          do iband=1,dtset%nband(ikpt + (isppol-1)*nkpt)
    1141                 :           6 :            ii = ii + 1
    1142                 :           6 :            write(tmp_unt,'(i8,ES16.6)') iband,ps_norms(isppol,ikpt,iband)
    1143         [ -  + ]:           7 :            if (abs(occ(ii)) <= tol16) then
    1144                 :           0 :              unocc_norm = unocc_norm + ps_norms(isppol,ikpt,iband)
    1145                 :             :            else
    1146                 :           6 :              occ_norm = occ_norm + ps_norms(isppol,ikpt,iband)
    1147                 :           6 :              nocc = nocc + 1
    1148                 :             :            end if
    1149                 :             :          end do
    1150         [ -  + ]:           2 :          if(mband/=nocc)then
    1151                 :           0 :            write(tmp_unt,'(2(a,ES16.6))') '# occ average: ',occ_norm/real(nocc),&
    1152                 :           0 : &           ' unocc average: ',unocc_norm/real(mband-nocc)
    1153                 :             :          else
    1154                 :           1 :            write(tmp_unt,'(2(a,ES16.6))') '# occ average: ',occ_norm/real(nocc)
    1155                 :             :          end if
    1156                 :             :        end do
    1157                 :             :      end do
    1158                 :           1 :      close(tmp_unt)
    1159                 :             :    end if
    1160         [ -  + ]:           1 :    ABI_FREE(ps_norms)
    1161                 :             :  end if
    1162                 :             : 
    1163                 :        6951 :  call timab(1170,2,tsec)
    1164                 :        6951 :  call timab(1171,1,tsec)
    1165                 :             : 
    1166         [ -  + ]:        6951 :  if(dtset%plowan_compute>0 .and. dtset%plowan_compute<10) then
    1167                 :           0 :    write(msg,'(2a,i3)') ch10,&
    1168                 :           0 : &   ' ====================================================================================== '
    1169                 :           0 :    call wrtout(units, msg)
    1170                 :           0 :    write(msg,'(2a,i3)') ch10,&
    1171                 :           0 : &   ' == Start computation of Projected Local Orbitals Wannier functions == ',dtset%nbandkss
    1172                 :           0 :    call wrtout(units, msg)
    1173                 :             : 
    1174                 :             : !  ==  compute chipsi
    1175                 :             : 
    1176                 :             :    call init_plowannier(dtset%plowan_bandf,dtset%plowan_bandi,dtset%plowan_compute,&
    1177                 :             : &   dtset%plowan_iatom,dtset%plowan_it,dtset%plowan_lcalc,dtset%plowan_natom,&
    1178                 :             : &   dtset%plowan_nbl,dtset%plowan_nt,dtset%plowan_projcalc,dtset%acell_orig,&
    1179         [ #  # ]:           0 : &   dtset%kptns,sum(dtset%plowan_nbl),dtset%nimage,dtset%nkpt,dtset%nspinor,dtset%nsppol,dtset%wtk,dtset%dmft_t2g,wan)
    1180                 :             :    call compute_coeff_plowannier(crystal,cprj,dimcprj,dtset,eigen,e_fermie,&
    1181                 :           0 : &   mpi_enreg,occ,wan,pawtab,psps,usecprj,dtfil%unpaw,pawrad,dtfil)
    1182         [ #  # ]:           0 :    if (me==master) then
    1183                 :           0 :      call print_plowannier(wan)
    1184                 :             :    endif
    1185                 :           0 :    call destroy_plowannier(wan)
    1186                 :             :  end if
    1187                 :             : 
    1188                 :        6951 :  call timab(1171,2,tsec)
    1189                 :        6951 :  call timab(1172,1,tsec)
    1190                 :             : 
    1191                 :             : !Optionally provide output for the GW part of ABINIT
    1192         [ +  + ]:        6951 :  if (dtset%nbandkss/=0) then
    1193                 :             :    ! Use DMFT to compute wannier function for cRPA calculation.
    1194         [ +  + ]:           6 :    if(dtset%usedmft==1) then
    1195                 :           4 :      write(msg,'(2a,i3)') ch10,&
    1196                 :           8 : &     '  Warning: Chipsi are orthonormalized in the DMFT code because nbandkss is used, with the value ',dtset%nbandkss
    1197                 :           4 :      call wrtout(std_out, msg)
    1198                 :             :      call init_dmft(crystal,dmatpawu(:,:,:,:),dtset,e_fermie,dtfil%filctqmcdatain,dtfil%filselfin, &
    1199                 :           4 :                   & dtfil%filnam_ds(3),dtfil%fnameabo_app,dtfil%ireadctqmcdata,dtfil%ireadself,paw_dmft,pawtab(:))
    1200                 :           4 :      call print_dmft(paw_dmft,dtset%pawprtvol)
    1201                 :             : 
    1202                 :             : !    ==  compute chipsi
    1203                 :           4 :      call init_oper(paw_dmft,dft_occup,opt_ksloc=2)
    1204                 :             : 
    1205                 :             :      call datafordmft(cg(:,:),cprj(:,:),crystal,dft_occup,dimcprj,dtset,eigen(:),dtset%mband,mcg,&
    1206                 :           4 :                     & mpi_enreg,dtset%nspinor,occ(:),paw_dmft,paw_ij,pawtab(:),usecprj,dtset%nbandkss)
    1207                 :             : 
    1208                 :           4 :      opt_imagonly=0
    1209         [ +  - ]:           4 :      if(paw_dmft%dmft_solv>=5) opt_imagonly=1
    1210                 :             : 
    1211                 :             : 
    1212                 :             :      ! Compute k-resolved spectral function in DMFT.
    1213         [ +  - ]:           4 :      if(dtset%dmft_kspectralfunc==1) then
    1214                 :             :       ! Initialize self on real axis
    1215                 :           4 :        call initialize_self(selfr,paw_dmft,wtype='real')
    1216                 :             : 
    1217                 :           4 :        opt_moments = 0
    1218         [ -  + ]:           4 :        if (paw_dmft%dmft_solv == 6 .or. paw_dmft%dmft_solv == 7) opt_moments = 1
    1219                 :             : 
    1220                 :             :       ! Initialize self on imag axis
    1221                 :           4 :        call initialize_self(self,paw_dmft,opt_moments=opt_moments)
    1222                 :             : 
    1223                 :             :       ! Initialize green on real axis
    1224                 :           4 :        call init_green(greenr,paw_dmft,opt_oper_ksloc=3,wtype='real')
    1225                 :             : 
    1226                 :             :       ! Read self energy in imag. Matsubara freq (for double counting and asymptotic value)
    1227                 :           4 :        call rw_self(self,paw_dmft,prtopt=5,opt_rw=1,opt_stop=1)
    1228                 :             : 
    1229   [ -  +  +  -  :          16 :        ABI_MALLOC(opt_selflimit,(paw_dmft%natom))
          +  -  +  -  -  
          +  -  +  +  +  
             +  -  -  + ]
    1230                 :           4 :        call init_matlu(paw_dmft%natom,paw_dmft%nspinor,paw_dmft%nsppol,paw_dmft%lpawu(:),opt_selflimit(:))
    1231                 :             : 
    1232         [ +  - ]:           4 :        if (opt_moments == 0) then
    1233                 :           4 :          call copy_matlu(self%oper(self%nw)%matlu(:),opt_selflimit(:),paw_dmft%natom,opt_re=1)
    1234                 :             :        else
    1235                 :           0 :          call copy_matlu(self%moments(1)%matlu(:),opt_selflimit(:),paw_dmft%natom)
    1236                 :             :        end if ! moments
    1237                 :             : 
    1238                 :             :       ! Read self energy on real axis obtained from Maxent
    1239                 :             :        call rw_self(selfr,paw_dmft,prtopt=5,opt_rw=1,opt_imagonly=opt_imagonly, &
    1240                 :           4 :                   & opt_selflimit=opt_selflimit(:),opt_hdc=self%hdc%matlu(:),opt_maxent=1)
    1241                 :             : 
    1242                 :           4 :        call destroy_matlu(opt_selflimit(:),paw_dmft%natom)
    1243   [ +  -  +  +  :           8 :        ABI_FREE(opt_selflimit)
             -  +  -  + ]
    1244                 :             : 
    1245                 :             :       ! Check: from self on real axis, recompute self on Imaginary axis.
    1246                 :           4 :        call selfreal2imag_self(selfr,self,paw_dmft%filapp,paw_dmft)
    1247                 :             : 
    1248                 :             :       !  paw_dmft%fermie=hdr%fermie ! for tests
    1249                 :           4 :        write(std_out,*) "    Fermi level is",paw_dmft%fermie
    1250                 :             : 
    1251                 :             :        ! For the DFT BS: use opt_self=0 and fermie=fermie_dft
    1252                 :             : 
    1253                 :             :       ! Compute Green's function on real axis
    1254                 :           4 :        call compute_green(greenr,paw_dmft,1,selfr,opt_self=1,opt_nonxsum=0)
    1255                 :             : 
    1256                 :             :       !write(6,*) "compute green done"
    1257         [ +  + ]:           4 :        if(me==master) then
    1258         [ +  - ]:           1 :          if(dtset%kptopt<0) then
    1259                 :             :            ! k-resolved Spectral function
    1260                 :           1 :            call print_green("from_realaxisself",greenr,5,paw_dmft,opt_wt=1)
    1261                 :             :          else
    1262                 :             :            ! DOS Calculation
    1263                 :           0 :            call print_green("from_realaxisself",greenr,4,paw_dmft,opt_wt=1)
    1264                 :             :          endif
    1265                 :             :         !write(6,*) "print green done"
    1266                 :             :        endif
    1267                 :             : 
    1268                 :           4 :        call destroy_green(greenr)
    1269                 :           4 :        call destroy_self(selfr)
    1270                 :           4 :        call destroy_self(self)
    1271                 :             :      endif
    1272                 :           4 :      call destroy_dmft(paw_dmft)
    1273                 :           4 :      call destroy_oper(dft_occup)
    1274                 :             :    end if
    1275                 :             : 
    1276                 :             :    call outkss(crystal,dtfil,dtset,ecut,gmet,gprimd,hdr,&
    1277                 :             : &   dtset%kssform,mband,mcg,mcprj,mgfftc,mkmem,mpi_enreg,mpsang,mpw,natom,natom,&
    1278                 :             : &   nfft,nkpt,npwarr,nspden,nsppol,nsym,psps%ntypat,occ,pawtab,pawfgr,paw_ij,&
    1279                 :           6 : &   prtvol,psps,rprimd,vtrial,xred,cg,usecprj,cprj,eigen,ierr)
    1280         [ -  + ]:           6 :    if (ierr/=0) then
    1281                 :           0 :      ABI_WARNING("outkss returned a non zero status error, check log")
    1282                 :             :    end if
    1283                 :             :  end if
    1284                 :             : 
    1285                 :        6951 :  call timab(1172,2,tsec) ! outscfcv(gw)
    1286                 :             : 
    1287         [ +  + ]:        6951 :  if (electronpositron_calctype(electronpositron)/=0) then
    1288                 :             : 
    1289                 :             : !  Optionally provide output for  positron life time calculation
    1290                 :          17 :    call timab(1173,1,tsec)
    1291                 :             :    call poslifetime(dtset,electronpositron,gprimd,my_natom,&
    1292                 :             : &   mpi_enreg,n3xccc,nfft,ngfft,nhat,1,pawang,&
    1293                 :             : &   pawrad,pawrhoij,pawtab,rate_dum,rate_dum2,&
    1294                 :          17 : &   rhor,ucvol,xccc3d)
    1295                 :          17 :    call timab(1173,2,tsec)
    1296                 :             : 
    1297                 :             : !  Optionally provide output for momentum distribution of annihilation radiation
    1298         [ +  + ]:          17 :    if (dtset%posdoppler>0) then
    1299                 :           3 :      call timab(1174,1,tsec)
    1300                 :             :      call posdoppler(cg,cprj,crystal,dimcprj,dtfil,dtset,electronpositron,psps%filpsp,&
    1301                 :             : &     kg,mcg,mcprj,mpi_enreg,my_natom,n3xccc,nfft,ngfft,nhat,npwarr,&
    1302                 :           3 : &     occ,pawang,pawrad,pawrhoij,pawtab,rhor,xccc3d)
    1303                 :           3 :      call timab(1174,2,tsec)
    1304                 :             :    end if
    1305                 :             :  end if
    1306                 :             : 
    1307                 :             : !Optionally provide output for WanT
    1308         [ +  + ]:        6951 :  if (dtset%prtwant==1) then
    1309                 :           1 :    call timab(1175,1,tsec)
    1310                 :             :    ! WARNING: mpi_enreg not used --> MPI is not supported
    1311                 :           1 :    call outwant(dtset,eigen,cg,kg,npwarr,mband,mcg,nkpt,nsppol,mkmem,mpw,dtset%prtwant)
    1312                 :           1 :    call timab(1175,2,tsec)
    1313                 :             :  end if
    1314                 :             : 
    1315                 :             : !Optionally provide output for electric field gradient calculation
    1316         [ +  + ]:        6951 :  if (dtset%nucefg > 0) then
    1317                 :             : 
    1318         [ -  + ]:           9 :    if(allocated(efg)) then
    1319                 :           0 :      ABI_FREE(efg)
    1320                 :             :    end if
    1321   [ -  +  +  -  :          27 :    ABI_MALLOC(efg,(3,3,natom))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
    1322   [ +  +  +  +  :         542 :    efg=zero
                   +  + ]
    1323                 :           9 :    call timab(1176,1,tsec)
    1324                 :             :    call calc_efg(efg,mpi_enreg,my_natom,natom,nfft,ngfft,nhat,nspden,dtset%nsym,dtset%nucefg,&
    1325                 :             : &   ntypat,paw_an,pawang,pawrad,pawrhoij,pawtab,&
    1326                 :             : &   dtset%ptcharge,dtset%quadmom,rhor,rprimd,dtset%symrel,&
    1327                 :             : &   dtset%tnons,dtset%typat,ucvol,psps%usepaw,xred,psps%zionpsp,&
    1328                 :           9 : &   comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab)
    1329                 :           9 :    call timab(1176,2,tsec)
    1330                 :             :  end if
    1331                 :             : 
    1332                 :             : !Optionally provide output for Fermi-contact term at nuclear positions
    1333         [ +  + ]:        6951 :  if (dtset%nucfc > 0) then
    1334                 :           5 :    call timab(1177,1,tsec)
    1335                 :             :    call calc_fc(my_natom,natom,nspden,ntypat,pawrad,pawrhoij,pawtab,dtset%typat,psps%usepaw,&
    1336                 :           5 : &   comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab)
    1337                 :           5 :    call timab(1177,2,tsec)
    1338                 :             :  end if
    1339                 :             : 
    1340                 :             :  ! Output electron bands.
    1341   [ +  +  +  + ]:        6951 :  if (me == master .and. dtset%tfkinfunc==0) then
    1342                 :        5437 :    call timab(1178,1,tsec)
    1343         [ +  + ]:        5437 :    if (size(dtset%kptbounds, dim=2) > 0) then
    1344                 :         132 :      call ebands%write(dtset%prtebands, dtfil%filnam_ds(4), kptbounds=dtset%kptbounds)
    1345                 :             :    else
    1346                 :        5305 :      call ebands%write(dtset%prtebands, dtfil%filnam_ds(4))
    1347                 :             :    end if
    1348                 :        5437 :    call timab(1178,2,tsec)
    1349                 :             :  end if
    1350                 :             : 
    1351                 :             : !Optionally provide Xcrysden output for the Fermi surface (Only master writes)
    1352         [ +  + ]:        5474 :  if (me == master .and. dtset%prtfsurf == 1) then
    1353                 :           1 :    call timab(1179,1,tsec)
    1354         [ -  + ]:           1 :    if (ebands%write_bxsf(crystal,dtfil%fnameabo_app_bxsf) /= 0) then
    1355                 :           0 :      msg = "Cannot produce BXSF file with Fermi surface, see log file for more info"
    1356                 :           0 :      ABI_WARNING(msg)
    1357                 :           0 :      call wrtout(ab_out, msg)
    1358                 :             :    end if
    1359                 :           1 :    call timab(1179,2,tsec)
    1360                 :             :  end if ! prtfsurf==1
    1361                 :             : 
    1362                 :             : !output nesting factor for Fermi surface (requires ph_nqpath)
    1363   [ +  +  -  + ]:        5474 :  if (me == master .and. dtset%prtnest>0 .and. dtset%ph_nqpath > 0) then
    1364                 :           0 :    call timab(1180,1,tsec)
    1365                 :             :    ierr = ebands%write_nesting(crystal,dtfil%fnameabo_app_nesting,dtset%prtnest,&
    1366                 :           0 :      dtset%tsmear,dtset%fermie_nest,dtset%ph_qpath(:,1:dtset%ph_nqpath),msg)
    1367         [ #  # ]:           0 :    if (ierr /= 0) then
    1368                 :           0 :      ABI_WARNING(msg)
    1369                 :           0 :      call wrtout(ab_out, msg)
    1370                 :             :    end if
    1371                 :           0 :    call timab(1180,2,tsec)
    1372                 :             :  end if ! prtnest=1
    1373                 :             : 
    1374         [ +  + ]:        6951 :  if (dtset%prtdipole == 1) then
    1375                 :           1 :    call timab(1181,1,tsec)
    1376                 :             :    call multipoles_out(rhor,mpi_enreg,natom,nfft,ngfft,dtset%nspden,dtset%ntypat,rprimd,&
    1377                 :           1 :      dtset%typat,ucvol,ab_out,xred,dtset%ziontypat)
    1378                 :           1 :    call timab(1181,2,tsec)
    1379                 :             :  end if
    1380                 :             : 
    1381                 :             :  ! BoltzTraP output files in GENEric format
    1382   [ +  +  +  - ]:        6951 :  if (dtset%prtbltztrp == 1 .and. me==master)then
    1383                 :           1 :    call timab(1182,1,tsec)
    1384                 :           1 :    call ebands%prtbltztrp(crystal, dtfil%filnam_ds(4))
    1385                 :           1 :    call timab(1182,2,tsec)
    1386                 :             :  endif
    1387                 :             : 
    1388                 :             :  ! Band structure interpolation from eigenvalues computed on the k-mesh.
    1389   [ +  +  +  - ]:        6951 :  if (nint(dtset%einterp(1)) /= 0 .and. dtset%kptopt > 0) then
    1390                 :           1 :    call timab(1183,1,tsec)
    1391                 :           1 :    call ebands%interpolate_kpath(dtset, crystal, [0, 0], dtfil%filnam_ds(4), comm)
    1392                 :           1 :    call timab(1183,2,tsec)
    1393                 :             :  end if
    1394                 :             : 
    1395                 :        6951 :  call timab(1154,1,tsec)
    1396                 :             : 
    1397                 :             :  ! Output of the GSR file (except when we are inside mover)
    1398   [ +  +  +  +  :        6951 :  if (me == master .and. dtset%prtgsr == 1 .and. dtset%usewvl == 0) then
                   +  - ]
    1399                 :             :    !.and. (dtset%ionmov /= 0 .or. dtset%optcell /= 0)) then
    1400         [ +  - ]:        4177 :    fname = strcat(dtfil%filnam_ds(4), "_GSR.nc")
    1401                 :             :    ! Write crystal and band structure energies.
    1402         [ -  + ]:        4177 :    NCF_CHECK(nctk_open_create(ncid, fname, xmpi_comm_self))
    1403         [ -  + ]:        4177 :    NCF_CHECK(hdr%ncwrite(ncid, fform_den, spinat=dtset%spinat, nc_define=.True.))
    1404         [ -  + ]:        4177 :    NCF_CHECK(crystal%ncwrite(ncid))
    1405         [ -  + ]:        4177 :    NCF_CHECK(ebands%ncwrite(ncid))
    1406                 :             :    ! Add energy, forces, stresses
    1407         [ -  + ]:        4177 :    NCF_CHECK(results_gs%ncwrite(ncid, dtset%ecut, dtset%pawecutdg))
    1408                 :             : 
    1409                 :             :    ! Add info on GBT.
    1410                 :             :    ncerr = nctk_def_iscalars(ncid, [character(len=nctk_slen) :: &
    1411                 :             :      "use_gbt" &
    1412         [ +  + ]:        8354 :    ], defmode=.True.)
    1413         [ -  + ]:        4177 :    NCF_CHECK(ncerr)
    1414                 :             : 
    1415                 :             :    ncerr = nctk_def_arrays(ncid, [ &
    1416                 :             :      nctkarr_t("qgbt", "dp", "three") &
    1417         [ +  + ]:        8354 :    ])
    1418         [ -  + ]:        4177 :    NCF_CHECK(ncerr)
    1419                 :             : 
    1420         [ -  + ]:        4177 :    NCF_CHECK(nctk_set_datamode(ncid))
    1421                 :             :    ncerr = nctk_write_iscalars(ncid, [character(len=nctk_slen) :: &
    1422                 :             :      "use_gbt"], &
    1423   [ +  +  +  + ]:       12531 :      [dtset%use_gbt])
    1424         [ -  + ]:        4177 :    NCF_CHECK(ncerr)
    1425         [ -  + ]:        4177 :    NCF_CHECK(nf90_put_var(ncid, nctk_idname(ncid, "qgbt"), dtset%qgbt))
    1426                 :             : 
    1427         [ +  - ]:        4177 :    if (allocated(intgden)) then
    1428                 :             :      ! Write integrated density inside atomic spheres and ratsph(ntypat)=radius of spheres around atoms
    1429                 :             :      ncerr = nctk_def_arrays(ncid, [ &
    1430                 :             :        nctkarr_t("intgden", "dp", "number_of_components, number_of_atoms"), &
    1431                 :             :        nctkarr_t("ratsph", "dp", "number_of_atom_species"), &
    1432                 :             :        nctkarr_t("rhomag", "dp", "two, number_of_components") &
    1433         [ +  + ]:       16708 :      ], defmode=.True.)
    1434         [ -  + ]:        4177 :      NCF_CHECK(ncerr)
    1435         [ -  + ]:        4177 :      NCF_CHECK(nctk_set_datamode(ncid))
    1436         [ -  + ]:        4177 :      NCF_CHECK(nf90_put_var(ncid, nctk_idname(ncid, "intgden"), intgden))
    1437         [ -  + ]:        4177 :      NCF_CHECK(nf90_put_var(ncid, nctk_idname(ncid, "ratsph"), dtset%ratsph))
    1438         [ -  + ]:        4177 :      NCF_CHECK(nf90_put_var(ncid, nctk_idname(ncid, "rhomag"), rhomag))
    1439                 :             :    end if
    1440                 :             : 
    1441         [ +  + ]:        4177 :    if(allocated(efg)) then
    1442                 :             :      ! write EFG tensors to GSR if available
    1443                 :             :      ncerr = nctk_def_dims(ncid, [ &
    1444                 :             :        nctkdim_t("ndir",3),&
    1445                 :             :        nctkdim_t("natom",dtset%natom),&
    1446         [ +  + ]:          36 :        nctkdim_t("ntypat",dtset%ntypat)],defmode=.True.)
    1447         [ -  + ]:           9 :      NCF_CHECK(ncerr)
    1448                 :             :      ncerr = nctk_def_arrays(ncid, [&
    1449                 :             :        nctkarr_t("quadmom", "dp", "ntypat"),&
    1450         [ +  + ]:          27 :        nctkarr_t("efg", "dp", "ndir, ndir, natom")])
    1451         [ -  + ]:           9 :      NCF_CHECK(ncerr)
    1452         [ -  + ]:           9 :      NCF_CHECK(nctk_set_datamode(ncid))
    1453         [ -  + ]:           9 :      NCF_CHECK(nf90_put_var(ncid, nctk_idname(ncid, "quadmom"), dtset%quadmom))
    1454         [ -  + ]:           9 :      NCF_CHECK(nf90_put_var(ncid, nctk_idname(ncid, "efg"), efg))
    1455                 :             :    end if
    1456                 :             : 
    1457         [ +  + ]:        4177 :    if(associated(rcpaw)) then
    1458                 :           3 :      nphicor=0
    1459         [ +  + ]:           6 :      do itypat=1,dtset%ntypat
    1460                 :           6 :        nphicor=max(nphicor,rcpaw%atm(itypat)%ln_size)
    1461                 :             :      enddo
    1462   [ -  +  +  -  :           9 :      ABI_MALLOC(nphicor_arr,(dtset%ntypat))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
    1463   [ -  +  +  -  :          12 :      ABI_MALLOC(energy_cor,(nphicor,dtset%ntypat))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
    1464   [ -  +  +  -  :           9 :      ABI_MALLOC(occ_cor,(nphicor,dtset%ntypat))
          -  +  +  -  -  
             +  -  +  -  
                      + ]
    1465   [ -  +  +  -  :          12 :      ABI_MALLOC(lcor,(nphicor,dtset%ntypat))
          -  +  +  -  +  
          -  +  -  -  +  
             -  +  -  + ]
    1466   [ +  +  +  + ]:          15 :      lcor=0
    1467   [ +  +  +  + ]:          15 :      energy_cor=zero
    1468   [ +  +  +  + ]:          15 :      occ_cor=one
    1469         [ +  + ]:           6 :      do itypat=1,dtset%ntypat
    1470                 :           3 :        nphicor_arr(itypat)=rcpaw%atm(itypat)%ln_size
    1471         [ +  + ]:          15 :        do ii=1,rcpaw%atm(itypat)%ln_size
    1472                 :           9 :          lcor(ii,itypat)=rcpaw%atm(itypat)%indln(1,ii)
    1473                 :           9 :          energy_cor(ii,itypat)=rcpaw%atm(itypat)%eig(ii,1)
    1474                 :          12 :          occ_cor(ii,itypat)=rcpaw%atm(itypat)%occ(ii,1)
    1475                 :             :        enddo
    1476                 :             :      enddo
    1477                 :             :      ncerr = nctk_def_dims(ncid, [ &
    1478                 :             :        nctkdim_t("max_number_of_core_states",nphicor),&
    1479         [ +  + ]:           9 :        nctkdim_t("number_of_atom_types",dtset%ntypat)],defmode=.True.)
    1480         [ -  + ]:           3 :      NCF_CHECK(ncerr)
    1481                 :             :      ncerr = nctk_def_arrays(ncid, [&
    1482                 :             :        nctkarr_t("eigenvalues_core", "dp", "max_number_of_core_states,number_of_atom_types"),&
    1483                 :             :        nctkarr_t("occupation_core", "dp", "max_number_of_core_states,number_of_atom_types"),&
    1484                 :             :        nctkarr_t("number_of_core_states", "int", "number_of_atom_types"),&
    1485         [ +  + ]:          15 :        nctkarr_t("l_quantum_number_core", "int","max_number_of_core_states,number_of_atom_types")])
    1486         [ -  + ]:           3 :      NCF_CHECK(ncerr)
    1487         [ -  + ]:           3 :      NCF_CHECK(nctk_set_datamode(ncid))
    1488         [ -  + ]:           3 :      NCF_CHECK(nf90_put_var(ncid, nctk_idname(ncid, "eigenvalues_core"),energy_cor))
    1489         [ -  + ]:           3 :      NCF_CHECK(nf90_put_var(ncid, nctk_idname(ncid, "occupation_core"),occ_cor))
    1490         [ -  + ]:           3 :      NCF_CHECK(nf90_put_var(ncid, nctk_idname(ncid, "number_of_core_states"),nphicor_arr))
    1491         [ -  + ]:           3 :      NCF_CHECK(nf90_put_var(ncid, nctk_idname(ncid,"l_quantum_number_core"),lcor))
    1492         [ -  + ]:           3 :      ABI_FREE(nphicor_arr)
    1493         [ -  + ]:           3 :      ABI_FREE(energy_cor)
    1494         [ -  + ]:           3 :      ABI_FREE(occ_cor)
    1495         [ -  + ]:           3 :      ABI_FREE(lcor)
    1496                 :             :    endif
    1497                 :             : 
    1498         [ -  + ]:        4177 :    NCF_CHECK(nf90_close(ncid))
    1499                 :             :  end if
    1500                 :             : 
    1501                 :        6951 :  call timab(1154,2,tsec)
    1502                 :             : 
    1503         [ +  + ]:        6951 :  ABI_SFREE_PTR(elfr)
    1504         [ +  + ]:        6951 :  ABI_SFREE_PTR(grhor)
    1505         [ +  + ]:        6951 :  ABI_SFREE_PTR(lrhor)
    1506                 :             : 
    1507         [ +  + ]:        6951 :  ABI_SFREE(efg)
    1508         [ +  - ]:        6951 :  ABI_SFREE(intgden)
    1509                 :             : 
    1510                 :        6951 :  call crystal%free()
    1511                 :        6951 :  call ebands%free()
    1512                 :             : 
    1513                 :             :  ! Destroy atom table used for parallelism
    1514                 :        6951 :  call free_my_atmtab(my_atmtab, my_atmtab_allocated)
    1515                 :             : 
    1516                 :        6951 :  call timab(1150,2,tsec) ! outscfcv
    1517                 :             : 
    1518                 :             :  DBG_EXIT("COLL")
    1519                 :             : 
    1520   [ -  +  -  +  :       27804 : end subroutine outscfcv
          -  +  -  -  -  
          -  -  +  -  +  
          -  -  -  -  -  
          +  -  -  -  -  
          -  +  -  -  -  
          -  -  -  -  -  
          -  -  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          -  -  -  -  +  
          -  +  -  -  -  
          -  -  -  -  -  
          -  -  -  +  -  
          -  -  -  -  -  
          -  -  -  -  -  
          +  -  -  -  -  
          -  +  -  +  -  
          -  -  -  -  -  
          -  -  -  -  -  
          +  -  -  -  -  
          -  -  -  -  -  
          -  -  +  -  +  
          -  +  -  +  -  
          +  -  -  -  -  
          -  +  -  +  -  
          -  -  -  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  -  -  -  
          -  -  -  -  -  
          -  -  +  -  -  
          -  -  -  -  -  
          -  -  -  -  +  
          -  -  -  -  -  
          -  -  -  -  -  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  -  
          -  -  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
             +  -  +  -  
                      + ]
    1521                 :             : !!***
    1522                 :             : 
    1523                 :             : end module m_outscfcv
    1524                 :             : !!***
        

Generated by: LCOV version 2.3-1