TABLE OF CONTENTS
ABINIT/dfpt_scfcv [ Functions ]
NAME
dfpt_scfcv
FUNCTION
Conducts set of passes or overall iterations of preconditioned conjugate gradient algorithm to converge wavefunctions to optimum and optionally to compute mixed derivatives of energy.
COPYRIGHT
Copyright (C) 1999-2018 ABINIT group (XG, DRH, MB, XW, MT, SPr) This file is distributed under the terms of the GNU General Public License, see ~abinit/COPYING or http://www.gnu.org/copyleft/gpl.txt . For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
INPUTS
atindx(natom)=index table for atoms (see gstate.f) cg(2,mpw*nspinor*mband*mkmem*nsppol)=pw coefficients of GS wavefunctions at k. cgq(2,mpw1*nspinor*mband*mkqmem*nsppol)=pw coefficients of GS wavefunctions at k+q. cplex: if 1, real space 1-order functions on FFT grid are REAL, if 2, COMPLEX cprj(natom,nspinor*mband*mkmem*nsppol*usecprj)= wave functions at k projected with non-local projectors: cprj=<p_i|Cnk> cprjq(natom,nspinor*mband*mkqmem*nsppol*usecprj)= wave functions at k+q projected with non-local projectors: cprjq=<p_i|Cnk+q> cpus= cpu time limit in seconds doccde_rbz(mband*nkpt_rbz*nsppol)=derivative of occ_rbz wrt the energy docckqde(mband*nkpt_rbz*nsppol)=derivative of occkq wrt the energy dtfil <type(datafiles_type)>=variables related to files dtset <type(dataset_type)>=all input variables for this dataset eew=2nd derivative of Ewald energy (hartree) efrhar=Contribution from frozen-wavefunction, hartree energy, to the second-derivative of total energy. efrkin=Contribution from frozen-wavefunction, kinetic energy, to the second-derivative of total energy. efrloc=Contribution from frozen-wavefunction, local potential, to the second-derivative of total energy. efrnl=Contribution from frozen-wavefunction, non-local potential, to the second-derivative of total energy. efrx1=Contribution from frozen-wavefunction, xc core correction(1), to the second-derivative of total energy. efrx2=Contribution from frozen-wavefunction, xc core correction(2), to the second-derivative of total energy. eigenq(mband*nkpt_rbz*nsppol)=GS eigenvalues at k+q (hartree) eigen0(mband*nkpt_rbz*nsppol)=GS eigenvalues at k (hartree) eii=2nd derivative of pseudopotential core energy (hartree) evdw=DFT-D semi-empirical part of 2nd-order total energy fermie=fermi energy (Hartree) hdr <type(hdr_type)>=the header of wf, den and pot files idir=direction of the current perturbation indkpt1(nkpt_rbz)=non-symmetrized indices of the k-points indsy1(4,nsym1,natom)=indirect indexing array for atom labels ipert=type of the perturbation irrzon1(nfft**(1-1/nsym1),2,(nspden/nsppol)-3*(nspden/4))=irreducible zone data for RF symmetries istwfk_rbz(nkpt_rbz)=input option parameter that describes the storage of wfs kg(3,mpw*mkmem)=reduced planewave coordinates at k kg1(3,mpw1*mk1mem)=reduced planewave coordinates at k+q, with RF k points kpt_rbz(3,nkpt_rbz)=reduced coordinates of k points. kxc(nfftf,nkxc)=exchange and correlation kernel (see rhotoxc.f) mgfftf=maximum size of 1D FFTs for the "fine" grid (see NOTES in respfn.F90) mkmem =number of k points treated by this node (GS data) mkqmem =number of k+q points which can fit in memory (GS data); 0 if use disk mk1mem =number of k points which can fit in memory (RF data); 0 if use disk mpert=maximum number of ipert mpw=maximum dimensioned size of npw for wfs at k. mpw1=maximum dimensioned size of npw for wfs at k+q (also for 1-order wfs). nattyp(ntypat)= # atoms of each type. nband_rbz(nkpt_rbz*nsppol)=number of bands at each RF k point, for each polarization ncpgr=number of gradients stored in cprj array (cprj=<p_i|Cnk>) nfftf=(effective) number of FFT grid points (for this proc) for the "fine" grid (see NOTES in respfn.F90) ngfftf(1:18)=integer array with FFT box dimensions and other for the "fine" grid (see NOTES in respfn.F90) nkpt=number of k points in the full BZ nkpt_rbz=number of k points in the reduced BZ for this perturbation nkxc=second dimension of the kxc array. mpi_enreg=informations about MPI parallelization my_natom=number of atoms treated by current processor npwarr(nkpt_rbz)=number of planewaves in basis at this GS k point npwar1(nkpt_rbz)=number of planewaves in basis at this RF k+q point nspden=number of spin-density components nspinor=number of spinorial components of the wavefunctions nsym1=number of symmetry elements in space group consistent with perturbation n3xccc=dimension of xccc3d1 ; 0 if no XC core correction is used otherwise, nfftf occkq(mband*nkpt_rbz*nsppol)=occupation number for each band (often 2) at each k+q point of the reduced Brillouin zone. occ_rbz(mband*nkpt_rbz*nsppol)=occupation number for each band (often 2) at each k point of the reduced Brillouin zone. paw_an(natom) <type(paw_an_type)>=paw arrays given on angular mesh for the GS paw_ij(natom*usepaw) <type(paw_ij_type)>=paw arrays given on (i,j) channels for the GS pawang <type(pawang_type)>=paw angular mesh and related data pawang1 <type(pawang_type)>=pawang datastr. containing only symmetries preserving the perturbation pawfgr <type(pawfgr_type)>=fine grid parameters and related data pawfgrtab(natom*usepaw) <type(pawfgrtab_type)>=atomic data given on fine rectangular grid for the GS pawrad(ntypat*usepaw) <type(pawrad_type)>=paw radial mesh and related data pawrhoij(natom) <type(pawrhoij_type)>= paw rhoij occupancies and related data for the GS pawtab(ntypat*usepaw) <type(pawtab_type)>=paw tabulated starting data pertcase=fuill index of the perturbation phnons1(2,nfft**(1-1/nsym1),(nspden/nsppol)-3*(nspden/4))=nonsymmorphic transl. phases, for RF symmetries ph1d(2,3*(2*mgfft+1)*natom)=one-dimensional structure factor information ph1df(2,3*(2*mgfftf+1)*natom)=one-dimensional structure factor information for the "fine" grid prtbbb=if 1, band-by-band decomposition (also dim of d2bbb) psps <type(pseudopotential_type)>=variables related to pseudopotentials qphon(3)=reduced coordinates for the phonon wavelength rhog(2,nfftf)=array for Fourier transform of GS electron density rhor(nfftf,nspden)=array for GS electron density in electrons/bohr**3. rprimd(3,3)=dimensional primitive translations in real space (bohr) symaf1(nsym1)=anti(ferromagnetic) part of symmetry operations symrc1(3,3,nsym1)=symmetry operations in reciprocal space symrl1(3,3,nsym1)=symmetry operations in real space in terms of primitive translations usecprj= 1 if cprj, cprjq arrays are stored in memory useylmgr = 1 if ylmgr array is allocated useylmgr1= 1 if ylmgr1 array is allocated ddk<wfk_t>=ddk file vpsp1(cplex*nfftf)=first-order derivative of the ionic potential vtrial(nfftf,nspden)=GS potential (Hartree). vxc(nfftf,nspden)=Exchange-Correlation GS potential (Hartree) wtk_rbz(nkpt_rbz)=weight for each k point in the reduced Brillouin zone xccc3d1(cplex*n3xccc)=3D change in core charge density, see n3xccc xred(3,natom)=reduced dimensionless atomic coordinates ylm(mpw*mkmem,mpsang*mpsang*useylm)= real spherical harmonics for each G and k point ylm1(mpw1*mk1mem,mpsang*mpsang*useylm)= real spherical harmonics for each G and k+q point ylmgr(mpw*mkmem,3,mpsang*mpsang*useylm*useylmgr)= gradients of real spherical harmonics at k ylmgr1(mpw1*mk1mem,3,mpsang*mpsang*useylm*useylmgr1)= gradients of real spherical harmonics at k+q
OUTPUT
blkflg(3,mpert,3,mpert)=flags for each element of the 2DTE (=1 if computed) cg1_active(2,mpw1*nspinor*mband*mk1mem*nsppol)=pw coefficients of RF wavefunctions at k,q. They are orthogonalized to the active. d2bbb(2,3,3,mpert,mband,mband*prtbbb)=band by band decomposition of some second order derivatives d2lo(2,mpert,3,mpert)=local contributions to the 2DTEs d2nl(2,mpert,3,mpert)=non-local contributions to the 2DTEs d2ovl(2,mpert,3,mpert*usepaw)=1st-order change of WF overlap contributions to the 2DTEs eberry=energy associated with Berry phase edocc=correction to 2nd-order total energy coming from changes of occupation eeig0=0th-order eigenenergies part of 2nd-order total energy ehart01=inhomogeneous 1st-order Hartree part of 2nd-order total energy for strain perturbation only (zero otherwise, and not used) ehart1=1st-order Hartree part of 2nd-order total energy eigen1(2*mband*mband*nkpt_rbz*nsppol)=array for holding eigenvalues (hartree) ek0=0th-order kinetic energy part of 2nd-order total energy. ek1=1st-order kinetic energy part of 2nd-order total energy. eloc0=0th-order local (psp+vxc+Hart) part of 2nd-order total energy elpsp1=1st-order local pseudopot. part of 2nd-order total energy. enl0=0th-order nonlocal pseudopot. part of 2nd-order total energy. enl1=1st-order nonlocal pseudopot. part of 2nd-order total energy. eovl1=1st-order change of wave-functions overlap, part of 2nd-order energy PAW only - Eq(79) and Eq(80) of PRB 78, 035105 (2008) epaw1=1st-order PAW on-site part of 2nd-order total energy. etotal=total energy (sum of 7 contributions) (hartree) exc1=1st-order exchange-correlation part of 2nd-order total energy. gh1c_set(2,mpw1*nspinor*mband*mk1mem*nsppol*dim_eig2rf)= set of <G|H^{(1)}|nK> gh0c1_set(2,mpw1*nspinor*mband*mk1mem*nsppol*dim_eig2rf)= set of <G|H^{(0)}|\Psi^{(1)}> The wavefunction is orthogonal to the active space (for metals). It is not coherent with cg1. resid(mband*nkpt_rbz*nsppol)=residuals for each band over all k points of the reduced Brillouin zone, and spins residm=maximum value from resid array (except for nbdbuf highest bands) conv_retcode=return code, 0 if convergence was achieved.
SIDE EFFECTS
cg1(2,mpw1*nspinor*mband*mk1mem*nsppol)=updated wavefunctions (ortho. to occ. states); initialized= if 0 the initialization of the RF run is not yet finished mpi_enreg=informations about MPI parallelization rhog1(2,nfftf)=array for Fourier transform of RF electron density rhor1(cplex*nfftf,nspden)=array for RF electron density in electrons/bohr**3. === if psps%usepaw==1 pawrhoij1(natom) <type(pawrhoij_type)>= 1st-order paw rhoij occupancies and related data
PARENTS
dfpt_looppert
CHILDREN
ab7_mixing_deallocate,ab7_mixing_new,ab7_mixing_use_disk_cache,appdig calcdensph,destroy_efield,dfpt_etot,dfpt_newvtr,dfpt_nselt,dfpt_nstdy dfpt_nstpaw,dfpt_rhofermi,dfpt_rhotov,dfpt_vtorho,dfptff_bec,dfptff_die dfptff_ebp,dfptff_edie,dfptff_initberry,fftdatar_write_from_hdr,fourdp getcut,hdr_update,metric,newfermie1,paw_an_free,paw_an_init paw_an_nullify,paw_an_reset_flags,paw_ij_free,paw_ij_init paw_ij_nullify,paw_ij_reset_flags,pawcprj_alloc,pawcprj_free pawcprj_getdim,pawdenpot,pawdij,pawdijfr,pawmknhat,pawnhatfr pawrhoij_alloc,pawrhoij_free,qmatrix,rf2_getidirs,scprqt,status,symdij timab,wfk_close,wrtout,xmpi_barrier,xmpi_isum,xmpi_sum,xmpi_wait
SOURCE
188 #if defined HAVE_CONFIG_H 189 #include "config.h" 190 #endif 191 192 #include "abi_common.h" 193 194 subroutine dfpt_scfcv(atindx,blkflg,cg,cgq,cg1,cg1_active,cplex,cprj,cprjq,cpus,& 195 & dielt,dim_eig2rf,doccde_rbz,docckqde,dtfil,dtset,& 196 & d2bbb,d2lo,d2nl,d2ovl,eberry,edocc,eeig0,eew,efrhar,efrkin,efrloc,efrnl,efrx1,efrx2,& 197 & ehart01,ehart1,eigenq,eigen0,eigen1,eii,ek0,ek1,eloc0,elpsp1,& 198 & enl0,enl1,eovl1,epaw1,etotal,evdw,exc1,fermie,gh0c1_set,gh1c_set,hdr,idir,indkpt1,& 199 & indsy1,initialized,ipert,irrzon1,istwfk_rbz,& 200 & kg,kg1,kpt_rbz,kxc,mgfftf,mkmem,mkqmem,mk1mem,& 201 & mpert,mpi_enreg,mpw,mpw1,mpw1_mq,my_natom,nattyp,nband_rbz,ncpgr,& 202 & nfftf,ngfftf,nhat,nkpt,nkpt_rbz,nkxc,npwarr,npwar1,nspden,& 203 & nsym1,n3xccc,occkq,occ_rbz,& 204 & paw_an,paw_ij,pawang,pawang1,pawfgr,pawfgrtab,pawrad,pawrhoij,pawrhoij1,pawtab,& 205 & pertcase,phnons1,ph1d,ph1df,& 206 & prtbbb,psps,qphon,resid,residm,rhog,rhog1,& 207 & rhor,rhor1,rprimd,symaf1,symrc1,symrl1,& 208 & usecprj,useylmgr,useylmgr1,ddk_f,vpsp1,vtrial,vxc,& 209 & wtk_rbz,xccc3d1,xred,ylm,ylm1,ylmgr,ylmgr1,zeff,conv_retcode,& 210 & kramers_deg,& 211 & cg_mq,cg1_mq,cg1_active_mq,docckde_mq,eigen_mq,eigen1_mq,gh0c1_set_mq,gh1c_set_mq,& 212 & kg1_mq,npwar1_mq,occk_mq,resid_mq,residm_mq,rhog1_pq,rhog1_mq,rhor1_pq,rhor1_mq) 213 214 use defs_basis 215 use defs_datatypes 216 use defs_abitypes 217 use m_ab7_mixing 218 use m_efield 219 use m_errors 220 use m_profiling_abi 221 use m_wfk 222 use m_xmpi 223 use m_nctk 224 use m_hdr 225 #ifdef HAVE_NETCDF 226 use netcdf 227 #endif 228 229 use m_cgtools, only : mean_fftr 230 use m_fstrings, only : int2char4, sjoin 231 use m_geometry, only : metric 232 use m_time, only : abi_wtime, sec2str 233 use m_io_tools, only : open_file 234 use m_exit, only : get_start_time, have_timelimit_in, get_timelimit, enable_timelimit_in 235 use m_mpinfo, only : iwrite_fftdatar 236 use m_kg, only : getcut 237 use m_ioarr, only : ioarr, fftdatar_write_from_hdr, fort_denpot_skip 238 use m_pawang, only : pawang_type 239 use m_pawrad, only : pawrad_type 240 use m_pawtab, only : pawtab_type 241 use m_paw_an, only : paw_an_type, paw_an_init, paw_an_free, paw_an_nullify, paw_an_reset_flags 242 use m_paw_ij, only : paw_ij_type, paw_ij_init, paw_ij_free, paw_ij_nullify, paw_ij_reset_flags 243 use m_pawfgrtab,only : pawfgrtab_type 244 use m_pawrhoij, only : pawrhoij_type, pawrhoij_alloc, pawrhoij_free, pawrhoij_io, pawrhoij_get_nspden 245 use m_pawcprj, only : pawcprj_type, pawcprj_alloc, pawcprj_free, pawcprj_getdim 246 use m_pawdij, only : pawdij, pawdijfr, symdij 247 use m_pawfgr, only : pawfgr_type 248 use m_rf2, only : rf2_getidirs 249 250 !This section has been created automatically by the script Abilint (TD). 251 !Do not modify the following lines by hand. 252 #undef ABI_FUNC 253 #define ABI_FUNC 'dfpt_scfcv' 254 use interfaces_14_hidewrite 255 use interfaces_18_timing 256 use interfaces_32_util 257 use interfaces_53_ffts 258 use interfaces_54_abiutil 259 use interfaces_65_paw 260 use interfaces_67_common 261 use interfaces_72_response, except_this_one => dfpt_scfcv 262 !End of the abilint section 263 264 implicit none 265 266 !Arguments ------------------------------------ 267 type(dataset_type),intent(in) :: dtset 268 type(pseudopotential_type),intent(in) :: psps 269 integer,intent(in) :: cplex,dim_eig2rf,idir,ipert,mgfftf,mk1mem,mkmem,mkqmem 270 integer,intent(in) :: mpert,mpw,mpw1,my_natom,n3xccc,ncpgr,nfftf 271 integer,intent(in) :: mpw1_mq !-q duplicate 272 integer,intent(in) :: nkpt,nkpt_rbz,nkxc,nspden 273 integer,intent(in) :: nsym1,pertcase,prtbbb,usecprj,useylmgr,useylmgr1 274 logical,intent(in) :: kramers_deg 275 integer,intent(inout) :: initialized 276 ! nfft**(1-1/nsym1) is 1 if nsym1==1, and nfft otherwise 277 integer,intent(in) :: atindx(dtset%natom) 278 integer,intent(out) :: blkflg(3,mpert,3,mpert) 279 integer,intent(in) :: indkpt1(nkpt_rbz),indsy1(4,nsym1,dtset%natom) 280 integer,intent(in) :: irrzon1(dtset%nfft**(1-1/nsym1),2,(dtset%nspden/dtset%nsppol)-3*(dtset%nspden/4)) 281 integer,intent(in) :: istwfk_rbz(nkpt_rbz) 282 integer,intent(in) :: kg(3,mpw*mkmem),kg1(3,mpw1*mk1mem),nattyp(psps%ntypat) 283 integer,intent(in) :: nband_rbz(nkpt_rbz*dtset%nsppol) 284 integer,intent(in) :: npwar1(nkpt_rbz),npwarr(nkpt_rbz) 285 integer,optional,intent(in) :: npwar1_mq(nkpt_rbz) !-q duplicate 286 integer,optional,intent(in) :: kg1_mq(3,mpw1_mq*mk1mem)! 287 integer,intent(in) :: symaf1(nsym1),symrc1(3,3,nsym1),symrl1(3,3,nsym1) 288 integer,intent(out) :: conv_retcode 289 real(dp),intent(in) :: cpus,eew,efrhar,efrkin,efrloc,efrnl,efrx1,efrx2,eii 290 real(dp),intent(out) :: eberry,edocc,eeig0,ehart01,ehart1,ek0,ek1,eloc0,elpsp1,enl0 291 real(dp),intent(out) :: enl1,eovl1,epaw1,etotal,evdw,exc1,residm 292 real(dp),optional,intent(out) :: residm_mq !-q duplicate 293 real(dp),intent(inout) :: fermie 294 real(dp),intent(in) :: qphon(3) 295 ! nfft**(1-1/nsym1) is 1 if nsym1==1, and nfft otherwise 296 integer,intent(in) :: ngfftf(18) 297 real(dp),intent(in) :: cg(2,mpw*dtset%nspinor*dtset%mband*mkmem*dtset%nsppol) 298 real(dp),intent(inout) :: cg1(2,mpw1*dtset%nspinor*dtset%mband*mk1mem*dtset%nsppol) 299 real(dp),intent(out) :: cg1_active(2,mpw1*dtset%nspinor*dtset%mband*mk1mem*dtset%nsppol*dim_eig2rf) 300 real(dp),intent(out) :: gh1c_set(2,mpw1*dtset%nspinor*dtset%mband*mk1mem*dtset%nsppol*dim_eig2rf) 301 real(dp),intent(out) :: gh0c1_set(2,mpw1*dtset%nspinor*dtset%mband*mk1mem*dtset%nsppol*dim_eig2rf) 302 real(dp),intent(in) :: cgq(2,mpw1*dtset%nspinor*dtset%mband*mkqmem*dtset%nsppol) 303 real(dp),optional,intent(inout) :: cg1_mq(2,mpw1_mq*dtset%nspinor*dtset%mband*mk1mem*dtset%nsppol) !start -q duplicates 304 real(dp),optional,intent(out) :: cg1_active_mq(2,mpw1_mq*dtset%nspinor*dtset%mband*mk1mem*dtset%nsppol*dim_eig2rf)! 305 real(dp),optional,intent(out) :: gh1c_set_mq(2,mpw1_mq*dtset%nspinor*dtset%mband*mk1mem*dtset%nsppol*dim_eig2rf) ! 306 real(dp),optional,intent(out) :: gh0c1_set_mq(2,mpw1_mq*dtset%nspinor*dtset%mband*mk1mem*dtset%nsppol*dim_eig2rf) ! 307 real(dp),optional,intent(in) :: cg_mq(2,mpw1_mq*dtset%nspinor*dtset%mband*mkqmem*dtset%nsppol) ! 308 real(dp),optional,intent(in) :: eigen_mq(dtset%mband*nkpt_rbz*dtset%nsppol) ! 309 real(dp),optional,intent(in) :: docckde_mq(dtset%mband*nkpt_rbz*dtset%nsppol) ! 310 real(dp),optional,intent(out) :: eigen1_mq(2*dtset%mband*dtset%mband*nkpt_rbz*dtset%nsppol) ! 311 real(dp),optional,intent(in) :: occk_mq(dtset%mband*nkpt_rbz*dtset%nsppol) ! 312 real(dp),optional,intent(out) :: resid_mq(dtset%mband*nkpt_rbz*nspden) !end 313 real(dp),intent(out) :: d2bbb(2,3,3,mpert,dtset%mband,dtset%mband*prtbbb) 314 real(dp),intent(out) :: d2lo(2,3,mpert,3,mpert),d2nl(2,3,mpert,3,mpert) 315 real(dp),intent(out) :: d2ovl(2,3,mpert,3,mpert*psps%usepaw) 316 real(dp),intent(in) :: dielt(3,3) 317 real(dp),intent(in) :: doccde_rbz(dtset%mband*nkpt_rbz*dtset%nsppol) 318 real(dp),intent(in) :: docckqde(dtset%mband*nkpt_rbz*dtset%nsppol) 319 real(dp),intent(in) :: eigen0(dtset%mband*nkpt_rbz*dtset%nsppol) 320 real(dp),intent(out) :: eigen1(2*dtset%mband*dtset%mband*nkpt_rbz*dtset%nsppol) 321 real(dp),intent(in) :: eigenq(dtset%mband*nkpt_rbz*dtset%nsppol) 322 real(dp),intent(in) :: kpt_rbz(3,nkpt_rbz),kxc(nfftf,nkxc) 323 real(dp),intent(in) :: nhat(nfftf,dtset%nspden) 324 real(dp),intent(in) :: occ_rbz(dtset%mband*nkpt_rbz*dtset%nsppol) 325 real(dp),intent(in) :: occkq(dtset%mband*nkpt_rbz*dtset%nsppol) 326 real(dp),intent(in) :: ph1d(2,3*(2*dtset%mgfft+1)*dtset%natom),ph1df(2,3*(2*mgfftf+1)*dtset%natom) 327 real(dp),intent(in) :: phnons1(2,dtset%nfft**(1-1/nsym1),(dtset%nspden/dtset%nsppol)-3*(dtset%nspden/4)) 328 real(dp),intent(out) :: resid(dtset%mband*nkpt_rbz*nspden) 329 real(dp),intent(in) :: rhog(2,nfftf),rhor(nfftf,nspden),rprimd(3,3) 330 real(dp),intent(inout) :: rhog1(2,nfftf),rhor1(cplex*nfftf,nspden),xred(3,dtset%natom) 331 real(dp),optional,intent(inout) :: rhog1_pq(2,nfftf),rhor1_pq(cplex*nfftf,nspden) !+q/-q duplicates 332 real(dp),optional,intent(inout) :: rhog1_mq(2,nfftf),rhor1_mq(cplex*nfftf,nspden) ! 333 real(dp),target,intent(in) :: vtrial(nfftf,nspden) 334 real(dp),intent(in) :: vpsp1(cplex*nfftf),vxc(nfftf,nspden) 335 real(dp),intent(in) :: wtk_rbz(nkpt_rbz),xccc3d1(cplex*n3xccc) 336 real(dp),intent(in) :: ylm(mpw*mkmem,psps%mpsang*psps%mpsang*psps%useylm) 337 real(dp),intent(in) :: ylm1(mpw1*mk1mem,psps%mpsang*psps%mpsang*psps%useylm) 338 real(dp),intent(in) :: ylmgr(mpw*mkmem,3,psps%mpsang*psps%mpsang*psps%useylm*useylmgr) 339 real(dp),intent(in) :: ylmgr1(mpw1*mk1mem,3+6*((ipert-dtset%natom)/10),psps%mpsang*psps%mpsang*psps%useylm*useylmgr1) 340 real(dp),intent(in) :: zeff(3,3,dtset%natom) 341 type(pawcprj_type),intent(in) :: cprj(dtset%natom,dtset%nspinor*dtset%mband*mkmem*dtset%nsppol*usecprj) 342 type(pawcprj_type),intent(in) :: cprjq(dtset%natom,dtset%nspinor*dtset%mband*mkqmem*dtset%nsppol*usecprj) 343 type(datafiles_type),intent(in) :: dtfil 344 type(hdr_type),intent(inout) :: hdr 345 type(pawang_type),intent(in) :: pawang,pawang1 346 type(pawfgr_type),intent(in) :: pawfgr 347 type(paw_an_type),intent(in) :: paw_an(my_natom*psps%usepaw) 348 type(paw_ij_type),intent(in) :: paw_ij(my_natom*psps%usepaw) 349 type(pawfgrtab_type),intent(inout) :: pawfgrtab(my_natom*psps%usepaw) 350 type(pawrad_type),intent(in) :: pawrad(psps%ntypat*psps%usepaw) 351 type(pawrhoij_type),intent(in) :: pawrhoij(my_natom*psps%usepaw) 352 type(pawrhoij_type),intent(inout) :: pawrhoij1(my_natom*psps%usepaw) 353 type(pawtab_type), intent(in) :: pawtab(psps%ntypat*psps%usepaw) 354 type(MPI_type),intent(inout) :: mpi_enreg 355 type(wfk_t),intent(inout) :: ddk_f(4) 356 357 !Local variables------------------------------- 358 !scalars 359 integer,parameter :: level=12,response=1 360 integer :: afford,bantot_rbz,choice,cplex_rhoij,dbl_nnsclo 361 integer :: has_dijfr,iatom,ider,idir_dum,idir_paw1,ierr,iexit,errid,denpot 362 integer :: iprcel,iscf10_mod,iscf_mod,ispden,ispmix 363 integer :: istep,itypat,izero,lmn2_size,me,mgfftdiel,mvdum 364 integer :: nfftdiel,nfftmix,nfftotf,nhat1grdim,npawmix,npwdiel,nspden_rhoij,nstep,nzlmopt 365 integer :: optene,optfr,option,optres,prtfor,quit,quit_sum,qzero 366 integer :: my_quit,quitsum_request,timelimit_exit,varid,ncerr,ncid 367 integer ABI_ASYNC :: quitsum_async 368 integer :: rdwrpaw,spaceComm,sz1,sz2,usexcnhat,Z_kappa 369 integer :: dbl_nnsclo_mq,ifft !-q duplicate for dbl_nnsclo 370 !integer :: pqmq ! pqmq = indicator for potential mixing 371 logical :: need_fermie1,paral_atom,use_nhat_gga 372 real(dp) :: wtime_step,now,prev 373 real(dp) :: born,born_bar,boxcut,deltae,diffor,diel_q,dum,ecut,ecutf,elast 374 real(dp) :: epawdc1_dum,evar,fe1fixed,fermie1,gsqcut,qphon_norm,maxfor,renorm,res2,res3,residm2 375 real(dp) :: ucvol,vxcavg,elmag1 376 real(dp) :: res2_mq,fe1fixed_mq,elast_mq 377 real(dp) :: eberry_mq,edocc_mq,eeig0_mq,ehart01_mq,ehart1_mq,ek0_mq,ek1_mq,eloc0_mq,elpsp1_mq,enl0_mq 378 real(dp) :: enl1_mq,eovl1_mq,epaw1_mq,exc1_mq,fermie1_mq,deltae_mq,elmag1_mq 379 character(len=500) :: msg 380 character(len=fnlen) :: fi1o 381 !character(len=fnlen) :: fi1o_vtk 382 integer :: prtopt 383 type(ab7_mixing_object) :: mix 384 type(efield_type) :: dtefield 385 !arrays 386 integer :: ngfftmix(18) 387 integer,allocatable :: dimcprj(:),pwindall(:,:,:) 388 integer,pointer :: my_atmtab(:) 389 real(dp) :: dielar(7) 390 real(dp) :: favg(3),gmet(3,3),gprimd(3,3),q_cart(3),qphon2(3),qred2cart(3,3) 391 real(dp) :: rmet(3,3),tollist(12),tsec(2) 392 real(dp) :: zeff_red(3),zeff_bar(3,3) 393 real(dp) :: intgden(dtset%nspden,dtset%natom),dentot(dtset%nspden) 394 !real(dp) :: zdmc_red(3),zdmc_bar(3,3),mean_rhor1(1) !dynamic magnetic charges and mean density 395 real(dp),allocatable :: dielinv(:,:,:,:,:) 396 real(dp),allocatable :: fcart(:,:),nhat1(:,:),nhat1gr(:,:,:),nhatfermi(:,:),nvresid1(:,:),nvresid2(:,:) 397 real(dp),allocatable :: qmat(:,:,:,:,:,:),resid2(:),rhog2(:,:),rhor2(:,:),rhorfermi(:,:) 398 real(dp),allocatable :: susmat(:,:,:,:,:),vhartr1(:),vxc1(:,:) 399 real(dp),allocatable :: vhartr1_tmp(:,:) 400 real(dp),allocatable,target :: vtrial1(:,:),vtrial2(:,:) 401 real(dp),allocatable :: vtrial1_pq(:,:),vtrial1_mq(:,:),rhorfermi_mq(:,:) 402 real(dp),allocatable :: nvresid1_mq(:,:),vxc1_mq(:,:),vhartr1_mq(:) 403 real(dp),pointer :: vtrial1_tmp(:,:) 404 type(pawcprj_type),allocatable :: cprj1(:,:) 405 type(paw_an_type),allocatable :: paw_an1(:) 406 type(paw_ij_type),allocatable :: paw_ij1(:) 407 type(pawrhoij_type),allocatable :: pawrhoijfermi(:) 408 409 ! ********************************************************************* 410 411 DBG_ENTER("COLL") 412 413 call timab(120,1,tsec) 414 call timab(154,1,tsec) 415 416 call status(0,dtfil%filstat,iexit,level,'init ') 417 418 ! intel 18 really needs this to be initialized 419 maxfor = zero 420 421 ! enable time limit handler if not done in callers. 422 if (enable_timelimit_in(ABI_FUNC) == ABI_FUNC) then 423 write(std_out,*)"Enabling timelimit check in function: ",trim(ABI_FUNC)," with timelimit: ",trim(sec2str(get_timelimit())) 424 end if 425 426 !Parallelism data 427 spaceComm=mpi_enreg%comm_cell 428 me=mpi_enreg%me_kpt 429 paral_atom=(my_natom/=dtset%natom) 430 my_atmtab=>mpi_enreg%my_atmtab 431 432 _IBM6("XLF in dfpt_scfcv") 433 434 !Save some variables from dataset definition 435 ecut=dtset%ecut 436 ecutf=ecut;if (psps%usepaw==1) ecutf=dtset%pawecutdg 437 iprcel=dtset%iprcel 438 tollist(1)=dtset%tolmxf;tollist(2)=dtset%tolwfr 439 tollist(3)=dtset%toldff;tollist(4)=dtset%toldfe 440 tollist(6)=dtset%tolvrs;tollist(7)=dtset%tolrff 441 nfftotf=product(ngfftf(1:3)) 442 nstep=dtset%nstep 443 iscf_mod=dtset%iscf 444 iscf10_mod=mod(iscf_mod,10) 445 446 qzero=0; if(qphon(1)**2+qphon(2)**2+qphon(3)**2 < tol14) qzero=1 447 448 need_fermie1=((qzero==1.and.dtset%frzfermi==0.and.nstep>0).and.& 449 & (dtset%occopt>=3.and.dtset%occopt<=8).and. & 450 & (ipert<=dtset%natom.or.ipert==dtset%natom+3.or.ipert==dtset%natom+4.or.ipert==dtset%natom+5)) 451 452 !The value of iscf must be modified if ddk perturbation, see dfpt_looppert.f 453 if (ipert==dtset%natom+1.or.ipert==dtset%natom+10.or.ipert==dtset%natom+11) iscf_mod=-3 454 455 !Compute different geometric tensor, as well as ucvol, from rprimd 456 call metric(gmet,gprimd,-1,rmet,rprimd,ucvol) 457 458 !Compute large sphere cut-off gsqcut 459 qphon2(:)=zero;if (psps%usepaw==1) qphon2(:)=qphon(:) 460 call getcut(boxcut,ecutf,gmet,gsqcut,dtset%iboxcut,std_out,qphon2,ngfftf) 461 462 !Some variables need to be initialized/nullify at start 463 quit=0 ; dbl_nnsclo=0 ; elast=zero; conv_retcode = -1 464 optres=merge(0,1,abs(iscf_mod)<10) 465 usexcnhat=0 466 !This might be taken away later 467 edocc=zero ; eeig0=zero ; ehart01=zero ; ehart1=zero ; ek0=zero ; ek1=zero 468 eloc0=zero ; elpsp1=zero ; enl0=zero ; enl1=zero ; eovl1=zero; exc1=zero 469 deltae=zero ; fermie1=zero ; epaw1=zero ; eberry=zero ; elmag1=zero 470 elast_mq=zero 471 dbl_nnsclo_mq=0 472 !This might be taken away later 473 edocc_mq=zero ; eeig0_mq=zero ; ehart01_mq=zero ; ehart1_mq=zero ; ek0_mq=zero ; ek1_mq=zero 474 eloc0_mq=zero ; elpsp1_mq=zero ; enl0_mq=zero ; enl1_mq=zero ; eovl1_mq=zero; exc1_mq=zero 475 deltae_mq=zero ; fermie1_mq=zero ; epaw1_mq=zero ; eberry_mq=zero ; elmag1_mq=zero 476 res2_mq=zero 477 478 !Examine tolerance criteria, and eventually print a line to the output 479 !file (with choice=1, the only non-dummy arguments of scprqt are 480 !nstep, tollist and iscf - still, diffor,res2,prtfor,fcart are here initialized to 0) 481 choice=1 ; prtfor=0 ; diffor=zero ; res2=zero 482 ABI_ALLOCATE(fcart,(3,dtset%natom)) 483 484 call scprqt(choice,cpus,deltae,diffor,dtset,eigen0,& 485 & etotal,favg,fcart,fermie,dtfil%fnametmp_eig,dtfil%filnam_ds(1),& 486 & 1,iscf_mod,istep,kpt_rbz,maxfor,& 487 & mvdum,mpi_enreg,nband_rbz,nkpt_rbz,& 488 & nstep,occ_rbz,0,prtfor,0,& 489 & quit,res2,resid,residm,response,& 490 & tollist,psps%usepaw,vxcavg,wtk_rbz,xred,conv_retcode) 491 492 !Allocations/initializations for PAW only 493 if(psps%usepaw==1) then 494 usexcnhat=maxval(pawtab(:)%usexcnhat) 495 use_nhat_gga=(dtset%xclevel==2.and.dtset%pawnhatxc>0.and.usexcnhat>0) 496 ! 1st-order compensation density 497 ABI_ALLOCATE(nhat1,(cplex*nfftf,dtset%nspden)) 498 nhat1=zero 499 ! Projections of 1-st order WF on nl projectors 500 ABI_DATATYPE_ALLOCATE(cprj1,(dtset%natom,dtset%nspinor*dtset%mband*mk1mem*dtset%nsppol*usecprj)) 501 if (usecprj==1.and.mk1mem/=0) then 502 !cprj ordered by atom-type 503 ABI_ALLOCATE(dimcprj,(dtset%natom)) 504 call pawcprj_getdim(dimcprj,dtset%natom,nattyp,dtset%ntypat,dtset%typat,pawtab,'O') 505 call pawcprj_alloc(cprj1,0,dimcprj) 506 ABI_DEALLOCATE(dimcprj) 507 end if 508 ! 1st-order arrays/variables related to the PAW spheres 509 ABI_DATATYPE_ALLOCATE(paw_an1,(my_natom)) 510 ABI_DATATYPE_ALLOCATE(paw_ij1,(my_natom)) 511 call paw_an_nullify(paw_an1) 512 call paw_ij_nullify(paw_ij1) 513 514 has_dijfr=0;if (ipert/=dtset%natom+1.and.ipert/=dtset%natom+10) has_dijfr=1 515 call paw_an_init(paw_an1,dtset%natom,dtset%ntypat,0,dtset%nspden,& 516 & cplex,dtset%pawxcdev,dtset%typat,pawang,pawtab,has_vxc=1,& 517 & comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab) 518 519 call paw_ij_init(paw_ij1,cplex,dtset%nspinor,dtset%nsppol,dtset%nspden,0,dtset%natom,& 520 & dtset%ntypat,dtset%typat,pawtab,& 521 & has_dij=1,has_dijhartree=1,has_dijfr=has_dijfr,& 522 & mpi_atmtab=mpi_enreg%my_atmtab, comm_atom=mpi_enreg%comm_atom) 523 else 524 ABI_ALLOCATE(nhat1,(0,0)) 525 ABI_DATATYPE_ALLOCATE(cprj1,(0,0)) 526 ABI_DATATYPE_ALLOCATE(paw_an1,(0)) 527 ABI_DATATYPE_ALLOCATE(paw_ij1,(0)) 528 end if ! PAW 529 530 !Various allocations (potentials) 531 ABI_ALLOCATE(vhartr1,(cplex*nfftf)) 532 ABI_ALLOCATE(vtrial1,(cplex*nfftf,nspden)) 533 if(.not.kramers_deg) then 534 ABI_ALLOCATE(vhartr1_mq,(cplex*nfftf)) 535 ABI_ALLOCATE(vtrial1_pq,(cplex*nfftf,nspden)) 536 ABI_ALLOCATE(vtrial1_mq,(cplex*nfftf,nspden)) 537 end if 538 ! TODO: for non collinear case this should always be nspden, in NCPP case as well!!! 539 ABI_ALLOCATE(vxc1,(cplex*nfftf,nspden*(1-usexcnhat))) ! Not always needed 540 vtrial1_tmp => vtrial1 ! this is to avoid errors when vtrial1_tmp is unused 541 542 if (.not.kramers_deg) then 543 ABI_ALLOCATE(vxc1_mq,(cplex*nfftf,nspden*(1-usexcnhat))) 544 end if 545 546 !Several parameters and arrays for the SCF mixing: 547 !These arrays are needed only in the self-consistent case 548 if (iscf_mod>0.or.iscf_mod==-3) then 549 ABI_ALLOCATE(nvresid1,(cplex*nfftf,dtset%nspden)) 550 if (nstep==0) nvresid1=zero 551 if ((dtset%getddb .ne. 0 .or. dtset%irdddb .ne.0) .and. qzero .ne. 1) then 552 ABI_ALLOCATE(nvresid2,(cplex*nfftf,dtset%nspden)) 553 if (nstep==0) nvresid2=zero 554 end if 555 if (.not.kramers_deg) then 556 ABI_ALLOCATE(nvresid1_mq,(cplex*nfftf,dtset%nspden)) 557 if (nstep==0) nvresid1_mq=zero 558 end if 559 else 560 ABI_ALLOCATE(nvresid1,(0,0)) 561 if(.not.kramers_deg) then 562 ABI_ALLOCATE(nvresid1_mq,(0,0)) 563 end if 564 end if 565 if(nstep>0 .and. iscf_mod>0) then 566 dielar(1)=dtset%diecut;dielar(2)=dtset%dielng 567 dielar(3)=dtset%diemac;dielar(4)=dtset%diemix 568 dielar(5)=dtset%diegap;dielar(6)=dtset%dielam 569 dielar(7)=dtset%diemix;if (dtset%iscf>=10) dielar(7)=dtset%diemixmag 570 ! Additional allocation for mixing within PAW 571 npawmix=0 572 if(psps%usepaw==1) then 573 do iatom=1,my_natom 574 itypat=pawrhoij1(iatom)%itypat 575 lmn2_size=pawtab(itypat)%lmn2_size 576 pawrhoij1(iatom)%use_rhoijres=1 577 sz1=pawrhoij1(iatom)%cplex*lmn2_size;sz2=pawrhoij1(iatom)%nspden 578 ABI_ALLOCATE(pawrhoij1(iatom)%rhoijres,(sz1,sz2)) 579 do ispden=1,pawrhoij1(iatom)%nspden 580 pawrhoij1(iatom)%rhoijres(:,ispden)=zero 581 end do 582 ABI_ALLOCATE(pawrhoij1(iatom)%kpawmix,(pawtab(itypat)%lmnmix_sz)) 583 pawrhoij1(iatom)%lmnmix_sz=pawtab(itypat)%lmnmix_sz 584 pawrhoij1(iatom)%kpawmix=pawtab(itypat)%kmix 585 npawmix=npawmix+pawrhoij1(iatom)%nspden*pawtab(itypat)%lmnmix_sz*pawrhoij1(iatom)%cplex 586 end do 587 end if 588 denpot = AB7_MIXING_POTENTIAL 589 if (dtset%iscf > 10) denpot = AB7_MIXING_DENSITY 590 if (psps%usepaw==1.and.dtset%pawmixdg==0) then 591 ispmix=AB7_MIXING_FOURRIER_SPACE;nfftmix=dtset%nfft;ngfftmix(:)=dtset%ngfft(:) 592 else 593 ispmix=AB7_MIXING_REAL_SPACE;nfftmix=nfftf;ngfftmix(:)=ngfftf(:) 594 end if 595 if (iscf10_mod == 5 .or. iscf10_mod == 6) then 596 call ab7_mixing_new(mix, iscf10_mod, denpot, cplex, & 597 & nfftf, dtset%nspden, npawmix, errid, msg, dtset%npulayit) 598 else 599 call ab7_mixing_new(mix, iscf10_mod, denpot, max(cplex, ispmix), & 600 & nfftmix, dtset%nspden, npawmix, errid, msg, dtset%npulayit) 601 end if 602 if (errid /= AB7_NO_ERROR) then 603 MSG_ERROR(msg) 604 end if 605 if (dtset%mffmem == 0) then 606 call ab7_mixing_use_disk_cache(mix, dtfil%fnametmp_fft) 607 end if 608 end if ! iscf, nstep 609 610 !Here, allocate arrays for computation of susceptibility and dielectric matrix or for TDDFT 611 if( (nstep>0 .and. iscf_mod>0) .or. iscf_mod==-1 ) then 612 ! Here, for TDDFT, artificially set iprcel . Also set a variable to reduce the memory needs. 613 afford=1 614 if(iscf_mod==-1) then 615 iprcel=21 616 afford=0 617 end if 618 npwdiel=1 619 mgfftdiel=1 620 nfftdiel=1 621 ! Now, performs allocation 622 ! CAUTION : the dimensions are still those of GS, except for phnonsdiel 623 ABI_ALLOCATE(dielinv,(2,npwdiel*afford,nspden,npwdiel,nspden)) 624 ABI_ALLOCATE(susmat,(2,npwdiel*afford,nspden,npwdiel,nspden)) 625 end if 626 627 !Initialize Berry-phase related stuffs 628 if (dtset%berryopt== 4.or.dtset%berryopt== 6.or.dtset%berryopt== 7.or.& 629 & dtset%berryopt==14.or.dtset%berryopt==16.or.dtset%berryopt==17) then 630 ABI_ALLOCATE(pwindall,(max(mpw,mpw1)*mkmem,8,3)) 631 call dfptff_initberry(dtefield,dtset,gmet,kg,kg1,dtset%mband,mkmem,mpi_enreg,& 632 & mpw,mpw1,nkpt,npwarr,npwar1,dtset%nsppol,occ_rbz,pwindall,rprimd) 633 ! calculate inverse of the overlap matrix 634 ABI_ALLOCATE(qmat,(2,dtefield%mband_occ,dtefield%mband_occ,nkpt,2,3)) 635 call qmatrix(cg,dtefield,qmat,mpw,mpw1,mkmem,dtset%mband,npwarr,nkpt,dtset%nspinor,dtset%nsppol,pwindall) 636 else 637 ABI_ALLOCATE(pwindall,(0,0,0)) 638 ABI_ALLOCATE(qmat,(0,0,0,0,0,0)) 639 end if 640 641 call timab(154,2,tsec) 642 643 !###################################################################### 644 !PERFORM ELECTRONIC ITERATIONS 645 !###################################################################### 646 647 !Offer option of computing 2nd-order total energy with existing 648 !wavefunctions when nstep<=0, else do nstep iterations 649 !Note that for non-self-consistent calculations, this loop will be exited 650 !after the first call to dfpt_vtorho 651 652 !Pass through the first routines even when nstep==0 653 !write(std_out,*) 'dfpt_scfcv, nstep=', max(1,nstep) 654 655 quitsum_request = xmpi_request_null; timelimit_exit = 0 656 657 do istep=1,max(1,nstep) 658 659 ! Handle time limit condition. 660 if (istep == 1) prev = abi_wtime() 661 if (istep > 1) then 662 now = abi_wtime() 663 wtime_step = now - prev 664 prev = now 665 call wrtout(std_out,sjoin("dfpt_scfcv: previous iteration took ",sec2str(wtime_step))) 666 667 if (have_timelimit_in(ABI_FUNC)) then 668 if (istep > 2) then 669 call xmpi_wait(quitsum_request,ierr) 670 if (quitsum_async > 0) then 671 write(msg,"(3a)")"Approaching time limit ",trim(sec2str(get_timelimit())),". Will exit istep loop in dfpt_scfcv." 672 MSG_COMMENT(msg) 673 call wrtout(ab_out, msg, "COLL") 674 timelimit_exit = 1 675 exit 676 end if 677 end if 678 679 my_quit = 0; if (now - get_start_time() + 2.15 * wtime_step > get_timelimit()) my_quit = 1 680 call xmpi_isum(my_quit,quitsum_async,spacecomm,quitsum_request,ierr) 681 end if 682 end if 683 684 ! ###################################################################### 685 ! The following steps are done once 686 ! ---------------------------------------------------------------------- 687 if (istep==1)then 688 689 ! PAW only: compute frozen part of 1st-order compensation density 690 ! and frozen part of psp strengths Dij 691 ! ---------------------------------------------------------------------- 692 if (psps%usepaw==1) then 693 optfr=0 694 idir_paw1 = idir 695 if (ipert==dtset%natom+11) then 696 call rf2_getidirs(idir,idir_dum,idir_paw1) 697 end if 698 call pawdijfr(cplex,gprimd,idir_paw1,ipert,my_natom,dtset%natom,nfftf,ngfftf,nspden,& 699 & psps%ntypat,optfr,paw_ij1,pawang,pawfgrtab,pawrad,pawtab,qphon,& 700 & rprimd,ucvol,vpsp1,vtrial,vxc,xred,& 701 & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom) 702 703 if ((iscf_mod>=0.or.usexcnhat==0).and.(dtset%pawstgylm/=0)) then 704 ider=0;if ((ipert<=dtset%natom).and.(use_nhat_gga)) ider=1 705 call pawnhatfr(ider,idir_paw1,ipert,my_natom,dtset%natom,nspden,psps%ntypat,& 706 & pawang,pawfgrtab,pawrhoij,pawtab,rprimd,& 707 & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom) 708 end if 709 end if 710 ! PAW only: we sometimes have to compute 1st-order compensation density 711 ! and eventually add it to density from 1st-order WFs 712 ! ---------------------------------------------------------------------- 713 nhat1grdim=0 714 ABI_ALLOCATE(nhat1gr,(0,0,0)) 715 if (psps%usepaw==1.and.ipert/=dtset%natom+1.and.ipert/=dtset%natom+10) then 716 call timab(564,1,tsec) 717 nhat1grdim=0;if (dtset%xclevel==2) nhat1grdim=usexcnhat*dtset%pawnhatxc 718 ider=2*nhat1grdim;izero=0 719 if (nhat1grdim>0) then 720 ABI_DEALLOCATE(nhat1gr) 721 ABI_ALLOCATE(nhat1gr,(cplex*nfftf,dtset%nspden,3*nhat1grdim)) 722 end if 723 call pawmknhat(dum,cplex,ider,idir_paw1,ipert,izero,gprimd,my_natom,dtset%natom,& 724 & nfftf,ngfftf,nhat1grdim,nspden,psps%ntypat,pawang,pawfgrtab,nhat1gr,nhat1,& 725 & pawrhoij1,pawrhoij,pawtab,qphon,rprimd,ucvol,dtset%usewvl,xred,& 726 & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom) 727 if (dtfil%ireadwf/=0.and.dtset%get1den==0.and.dtset%ird1den==0.and.initialized==0) then 728 rhor1(:,:)=rhor1(:,:)+nhat1(:,:) 729 call fourdp(cplex,rhog1,rhor1(:,1),-1,mpi_enreg,nfftf,ngfftf,dtset%paral_kgb,0) 730 end if 731 call timab(564,2,tsec) 732 end if 733 ! Set initial guess for 1st-order potential 734 ! ---------------------------------------------------------------------- 735 call status(istep,dtfil%filstat,iexit,level,'get vtrial1 ') 736 option=1;optene=0;if (iscf_mod==-2) optene=1 737 call dfpt_rhotov(cplex,ehart01,ehart1,elpsp1,exc1,elmag1,gsqcut,idir,ipert,& 738 & dtset%ixc,kxc,mpi_enreg,dtset%natom,nfftf,ngfftf,nhat,nhat1,nhat1gr,nhat1grdim,& 739 & nkxc,nspden,n3xccc,optene,option,dtset%paral_kgb,dtset%qptn,& 740 & rhog,rhog1,rhor,rhor1,rprimd,ucvol,psps%usepaw,usexcnhat,vhartr1,vpsp1,& 741 & nvresid1,res2,vtrial1,vxc,vxc1,xccc3d1,dtset%ixcrot) 742 743 if(.not.kramers_deg) then 744 vtrial1_pq=vtrial1 !save trial potential at +q 745 !rhor1_mq=rhor1 746 !rhog1_mq=rhog1 747 !get initial guess for vtrial1 at -q 748 do ifft=1,nfftf 749 vtrial1_mq(2*ifft-1,1)=+vtrial1(2*ifft-1,1) 750 vtrial1_mq(2*ifft-1,2)=+vtrial1(2*ifft-1,2) 751 vtrial1_mq(2*ifft ,1)=-vtrial1(2*ifft ,1) 752 vtrial1_mq(2*ifft ,2)=-vtrial1(2*ifft ,2) 753 vtrial1_mq(2*ifft-1,3)= vtrial1(2*ifft ,4) !Re[V^12] 754 vtrial1_mq(2*ifft ,3)= vtrial1(2*ifft-1,4) !Im[V^12],see definition of v(:,4) cplex=2 case 755 vtrial1_mq(2*ifft ,4)= vtrial1(2*ifft-1,3) !Re[V^21]=Re[V^12] 756 vtrial1_mq(2*ifft-1,4)= vtrial1(2*ifft ,3) !Re[V^21]=Re[V^12] 757 end do 758 end if 759 760 ! For Q=0 and metallic occupation, initialize quantities needed to 761 ! compute the first-order Fermi energy 762 ! ---------------------------------------------------------------------- 763 if (need_fermie1) then 764 ABI_ALLOCATE(rhorfermi,(cplex*nfftf,nspden)) 765 if(.not.kramers_deg) then 766 ABI_ALLOCATE(rhorfermi_mq,(cplex*nfftf,nspden)) 767 end if 768 if (psps%usepaw==1.and.usexcnhat==0) then 769 ABI_ALLOCATE(nhatfermi,(cplex*nfftf,nspden)) 770 else 771 ABI_ALLOCATE(nhatfermi,(0,0)) 772 end if 773 ABI_DATATYPE_ALLOCATE(pawrhoijfermi,(my_natom*psps%usepaw)) 774 if (psps%usepaw==1) then 775 cplex_rhoij=max(cplex,dtset%pawcpxocc) 776 nspden_rhoij=pawrhoij_get_nspden(dtset%nspden,dtset%nspinor,dtset%pawspnorb) 777 call pawrhoij_alloc(pawrhoijfermi,cplex_rhoij,nspden_rhoij,dtset%nspinor,& 778 & dtset%nsppol,dtset%typat,pawtab=pawtab,mpi_atmtab=mpi_enreg%my_atmtab,& 779 & comm_atom=mpi_enreg%comm_atom) 780 end if 781 782 call dfpt_rhofermi(cg,cgq,cplex,cprj,cprjq,& 783 & doccde_rbz,docckqde,dtfil,dtset,eigenq,eigen0,eigen1,fe1fixed,gmet,gprimd,idir,& 784 & indsy1,ipert,irrzon1,istwfk_rbz,kg,kg1,kpt_rbz,dtset%mband,mkmem,mkqmem,mk1mem,mpi_enreg,& 785 & mpw,mpw1,my_natom,dtset%natom,nband_rbz,ncpgr,nfftf,ngfftf,nhatfermi,nkpt_rbz,npwarr,npwar1,& 786 & nspden,dtset%nsppol,nsym1,occkq,occ_rbz,& 787 & paw_ij,pawang,pawang1,pawfgr,pawfgrtab,pawrad,pawrhoijfermi,pawtab,& 788 & phnons1,ph1d,dtset%prtvol,psps,rhorfermi,rmet,rprimd,symaf1,symrc1,symrl1,& 789 & ucvol,usecprj,useylmgr1,vtrial,vxc,wtk_rbz,xred,ylm,ylm1,ylmgr1) 790 if (.not.kramers_deg) then 791 call dfpt_rhofermi(cg,cg_mq,cplex,cprj,cprjq,& 792 & doccde_rbz,docckde_mq,dtfil,dtset,eigen_mq,eigen0,eigen1_mq,fe1fixed_mq,gmet,gprimd,idir,& 793 & indsy1,ipert,irrzon1,istwfk_rbz,kg,kg1_mq,kpt_rbz,dtset%mband,mkmem,mkqmem,mk1mem,mpi_enreg,& 794 & mpw,mpw1_mq,my_natom,dtset%natom,nband_rbz,ncpgr,nfftf,ngfftf,nhatfermi,nkpt_rbz,npwarr,npwar1_mq,& 795 & nspden,dtset%nsppol,nsym1,occk_mq,occ_rbz,& 796 & paw_ij,pawang,pawang1,pawfgr,pawfgrtab,pawrad,pawrhoijfermi,pawtab,& 797 & phnons1,ph1d,dtset%prtvol,psps,rhorfermi_mq,rmet,rprimd,symaf1,symrc1,symrl1,& 798 & ucvol,usecprj,useylmgr1,vtrial,vxc,wtk_rbz,xred,ylm,ylm1,ylmgr1) 799 end if 800 ! call calcdensph(gmet,mpi_enreg,dtset%natom,nfftf,ngfftf,nspden,& 801 !& dtset%ntypat,ab_out,dtset%ratsph,rhorfermi,rprimd,dtset%typat,ucvol,xred,& 802 !& -1,cplex) !dbg 803 804 end if 805 806 end if ! End the condition of istep==1 807 808 ! ###################################################################### 809 ! The following steps are done at every iteration 810 ! ---------------------------------------------------------------------- 811 812 if (psps%usepaw==1)then 813 ! Computation of "on-site" 2nd-order energy, first-order potentials, first-order densities 814 nzlmopt=0;if (istep==2.and.dtset%pawnzlm>0) nzlmopt=-1 815 if (istep>2) nzlmopt=dtset%pawnzlm 816 call paw_an_reset_flags(paw_an1) ! Force the recomputation of on-site potentials 817 call paw_ij_reset_flags(paw_ij1,self_consistent=.true.) ! Force the recomputation of Dij 818 option=0;if (dtset%iscf>0.and.dtset%iscf<10.and.nstep>0) option=1 819 call status(istep,dtfil%filstat,iexit,level,'call pawdenpot') 820 call pawdenpot(dum,epaw1,epawdc1_dum,ipert,dtset%ixc,my_natom,dtset%natom,& 821 & dtset%nspden,psps%ntypat,dtset%nucdipmom,nzlmopt,option,paw_an1,paw_an,paw_ij1,pawang,& 822 & dtset%pawprtvol,pawrad,pawrhoij1,dtset%pawspnorb,pawtab,dtset%pawxcdev,& 823 & dtset%spnorbscl,dtset%xclevel,dtset%xc_denpos,ucvol,psps%znuclpsp, & 824 & comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab) 825 826 ! First-order Dij computation 827 call status(istep,dtfil%filstat,iexit,level,'call pawdij ') 828 call timab(561,1,tsec) 829 if (has_dijfr>0) then 830 !vpsp1 contribution to Dij already stored in frozen part of Dij 831 ABI_ALLOCATE(vtrial1_tmp,(cplex*nfftf,nspden)) 832 vtrial1_tmp=vtrial1 833 do ispden=1,min(dtset%nspden,2) 834 vtrial1_tmp(:,ispden)=vtrial1_tmp(:,ispden)-vpsp1(:) 835 end do 836 else 837 vtrial1_tmp => vtrial1 838 end if 839 call pawdij(cplex,dtset%enunit,gprimd,ipert,my_natom,dtset%natom,& 840 & nfftf,nfftotf,dtset%nspden,psps%ntypat,paw_an1,paw_ij1,pawang,& 841 & pawfgrtab,dtset%pawprtvol,pawrad,pawrhoij1,dtset%pawspnorb,pawtab,& 842 & dtset%pawxcdev,qphon,dtset%spnorbscl,ucvol,dtset%charge,vtrial1_tmp,vxc1,xred,& 843 & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom) 844 if (has_dijfr>0) then 845 ABI_DEALLOCATE(vtrial1_tmp) 846 end if 847 848 call status(istep,dtfil%filstat,iexit,level,'call symdij ') 849 call symdij(gprimd,indsy1,ipert,my_natom,dtset%natom,nsym1,psps%ntypat,0,& 850 & paw_ij1,pawang1,dtset%pawprtvol,pawtab,rprimd,symaf1,symrc1, & 851 & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom,& 852 & qphon=qphon) 853 call timab(561,2,tsec) 854 end if ! end usepaw section 855 856 ! ###################################################################### 857 ! The following steps are done only when nstep>0 858 ! ---------------------------------------------------------------------- 859 call status(istep,dtfil%filstat,iexit,level,'loop istep ') 860 861 if(iscf_mod>0.and.nstep>0)then 862 write(msg, '(a,a,i4)' )ch10,' ITER STEP NUMBER ',istep 863 call wrtout(std_out,msg,'COLL') 864 end if 865 866 ! For Q=0 and metallic occupation, calculate the first-order Fermi energy 867 if (need_fermie1) then 868 call newfermie1(cplex,fermie1,fe1fixed,ipert,istep,dtset%ixc,my_natom,dtset%natom,& 869 & nfftf,nfftotf,nhatfermi,nspden,dtset%ntypat,dtset%occopt,paw_an,paw_an1,paw_ij1,pawang,& 870 & dtset%pawnzlm,pawrad,pawrhoij1,pawrhoijfermi,pawtab,dtset%pawxcdev,& 871 & dtset%prtvol,rhorfermi,ucvol,psps%usepaw,usexcnhat,vtrial1,vxc1,dtset%xclevel,& 872 & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom) 873 if (.not.kramers_deg) then 874 !fermie1_mq is updated as well at "-q" 875 call newfermie1(cplex,fermie1_mq,fe1fixed_mq,ipert,istep,dtset%ixc,my_natom,dtset%natom,& 876 & nfftf,nfftotf,nhatfermi,nspden,dtset%ntypat,dtset%occopt,paw_an,paw_an1,paw_ij1,pawang,& 877 & dtset%pawnzlm,pawrad,pawrhoij1,pawrhoijfermi,pawtab,dtset%pawxcdev,& 878 & dtset%prtvol,rhorfermi_mq,ucvol,psps%usepaw,usexcnhat,vtrial1_mq,vxc1_mq,dtset%xclevel,& 879 & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom) 880 end if 881 end if 882 883 ! No need to continue and call dfpt_vtorho, when nstep==0 884 if(nstep==0) exit 885 886 ! #######################e1magh############################################### 887 ! Compute the 1st-order density rho1 from the 1st-order trial potential 888 ! ---------------------------------------------------------------------- 889 890 call dfpt_vtorho(cg,cgq,cg1,cg1_active,cplex,cprj,cprjq,cprj1,& 891 & dbl_nnsclo,dim_eig2rf,doccde_rbz,docckqde,dtefield,dtfil,dtset,dtset%qptn,edocc,& 892 & eeig0,eigenq,eigen0,eigen1,ek0,ek1,eloc0,enl0,enl1,fermie1,gh0c1_set,gh1c_set,& 893 & gmet,gprimd,idir,indsy1,ipert,irrzon1,istwfk_rbz,kg,kg1,kpt_rbz,dtset%mband,& 894 & mkmem,mkqmem,mk1mem,mpi_enreg,mpw,mpw1,my_natom,dtset%natom,nband_rbz,ncpgr,nfftf,& 895 & nhat1,nkpt_rbz,npwarr,npwar1,res2,nspden,dtset%nsppol,nsym1,dtset%ntypat,nvresid1,& 896 & occkq,occ_rbz,optres,paw_ij,paw_ij1,pawang,pawang1,pawfgr,pawfgrtab,pawrhoij,& 897 & pawrhoij1,pawtab,phnons1,ph1d,dtset%prtvol,psps,pwindall,qmat,resid,residm,rhog1,& 898 & rhor1,rmet,rprimd,symaf1,symrc1,symrl1,ucvol,usecprj,useylmgr1,ddk_f,& 899 & vtrial,vtrial1,wtk_rbz,xred,ylm,ylm1,ylmgr1) 900 if (.not.kramers_deg) then 901 rhor1_pq=rhor1 !at this stage rhor1_pq contains only one term of the 1st order density at +q 902 rhog1_pq=rhog1 !same for rhog1_pq 903 !get the second term related to 1st order wf at -q 904 call dfpt_vtorho(cg,cg_mq,cg1_mq,cg1_active_mq,cplex,cprj,cprjq,cprj1,& 905 & dbl_nnsclo_mq,dim_eig2rf,doccde_rbz,docckde_mq,dtefield,dtfil,dtset,-dtset%qptn,edocc_mq,& 906 & eeig0_mq,eigen_mq,eigen0,eigen1_mq,ek0_mq,ek1_mq,eloc0_mq,enl0_mq,enl1_mq,fermie1_mq,gh0c1_set_mq,gh1c_set_mq,& 907 & gmet,gprimd,idir,indsy1,ipert,irrzon1,istwfk_rbz,kg,kg1_mq,kpt_rbz,dtset%mband,& 908 & mkmem,mkqmem,mk1mem,mpi_enreg,mpw,mpw1_mq,my_natom,dtset%natom,nband_rbz,ncpgr,nfftf,& 909 & nhat1,nkpt_rbz,npwarr,npwar1_mq,res2_mq,nspden,dtset%nsppol,nsym1,dtset%ntypat,nvresid1_mq,& 910 & occk_mq,occ_rbz,optres,paw_ij,paw_ij1,pawang,pawang1,pawfgr,pawfgrtab,pawrhoij,& 911 & pawrhoij1,pawtab,phnons1,ph1d,dtset%prtvol,psps,pwindall,qmat,resid_mq,residm_mq,rhog1_mq,& 912 & rhor1_mq,rmet,rprimd,symaf1,symrc1,symrl1,ucvol,usecprj,useylmgr1,ddk_f,& 913 & vtrial,vtrial1_mq,wtk_rbz,xred,ylm,ylm1,ylmgr1) 914 !reconstruct the +q and -q densities, this might bug if fft parallelization is used, todo... 915 do ifft=1,nfftf 916 rhor1_pq(2*ifft-1,:) = half*(rhor1(2*ifft-1,:)+rhor1_mq(2*ifft-1,:)) 917 rhor1_pq(2*ifft ,:) = half*(rhor1(2*ifft ,:)-rhor1_mq(2*ifft ,:)) 918 rhor1_mq(2*ifft-1,:) = rhor1_pq(2*ifft-1,:) 919 rhor1_mq(2*ifft ,:) =-rhor1_pq(2*ifft ,:) 920 end do 921 rhor1=rhor1_pq 922 call fourdp(cplex,rhog1,rhor1(:,1),-1,mpi_enreg,nfftf,ngfftf,dtset%paral_kgb,0) 923 call fourdp(cplex,rhog1_mq,rhor1_mq(:,1),-1,mpi_enreg,nfftf,ngfftf,dtset%paral_kgb,0) 924 end if 925 926 if (dtset%berryopt== 4.or.dtset%berryopt== 6.or.dtset%berryopt== 7.or.& 927 & dtset%berryopt==14.or.dtset%berryopt==16.or.dtset%berryopt==17) then 928 929 ! calculate \Omega E \cdot P term 930 if (ipert<=dtset%natom) then 931 ! phonon perturbation 932 call dfptff_ebp(cg,cg1,dtefield,eberry,dtset%mband,mkmem,& 933 & mpw,mpw1,nkpt,npwarr,npwar1,dtset%nsppol,dtset%nspinor,pwindall,qmat) 934 else if (ipert==dtset%natom+2) then 935 ! electric field perturbation 936 call dfptff_edie(cg,cg1,dtefield,eberry,idir,dtset%mband,mkmem,& 937 & mpw,mpw1,nkpt,npwarr,npwar1,dtset%nsppol,dtset%nspinor,pwindall,qmat,rprimd) 938 end if 939 end if 940 941 ! SPr: don't remove the following comments for debugging 942 ! call calcdensph(gmet,mpi_enreg,dtset%natom,nfftf,ngfftf,nspden,& 943 !& dtset%ntypat,ab_out,dtset%ratsph,rhor1,rprimd,dtset%typat,ucvol,xred,& 944 !& idir+1,cplex) 945 ! write(*,*) ' n ( 1,2)',intgden(1,1),' ',intgden(1,2) 946 ! write(*,*) ' mx( 1,2)',intgden(2,1),' ',intgden(2,2) 947 ! write(*,*) ' my( 1,2)',intgden(3,1),' ',intgden(3,2) 948 ! write(*,*) ' mz( 1,2)',intgden(4,1),' ',intgden(4,2) 949 ! call dfpt_etot(dtset%berryopt,deltae,eberry,edocc,eeig0,eew,efrhar,efrkin,& 950 !& efrloc,efrnl,efrx1,efrx2,ehart1,ek0,ek1,eii,elast,eloc0,elpsp1,& 951 !& enl0,enl1,epaw1,etotal,evar,evdw,exc1,elmag1,ipert,dtset%natom,optene) 952 ! write(*,*) 'SPr: ek1=',ek1,' exc1=',exc1,' elmag1=',elmag 953 ! if (ipert==dtset%natom+5) then 954 ! !calculate 1st order magnetic potential contribution to the energy 955 ! call dfpt_e1mag(e1mag,rhor1,rhog1); 956 ! endif 957 958 ! ###################################################################### 959 ! Skip out of step loop if non-SCF (completed) 960 ! ---------------------------------------------------------------------- 961 962 ! Indeed, nstep loops have been done inside dfpt_vtorho 963 if (iscf_mod<=0 .and. iscf_mod/=-3) exit 964 965 ! ###################################################################### 966 ! In case of density mixing , compute the total 2nd-order energy, 967 ! check the exit criterion, then mix the 1st-order density 968 ! ---------------------------------------------------------------------- 969 970 if (iscf_mod>=10) then 971 optene = 1 ! use double counting scheme 972 call dfpt_etot(dtset%berryopt,deltae,eberry,edocc,eeig0,eew,efrhar,efrkin,& 973 & efrloc,efrnl,efrx1,efrx2,ehart1,ek0,ek1,eii,elast,eloc0,elpsp1,& 974 & enl0,enl1,epaw1,etotal,evar,evdw,exc1,ipert,dtset%natom,optene) 975 call timab(152,1,tsec) 976 choice=2 977 call scprqt(choice,cpus,deltae,diffor,dtset,eigen0,& 978 & etotal,favg,fcart,fermie,dtfil%fnametmp_eig,dtfil%filnam_ds(1),& 979 & 1,iscf_mod,istep,kpt_rbz,maxfor,& 980 & mvdum,mpi_enreg,nband_rbz,nkpt_rbz,& 981 & nstep,occ_rbz,0,prtfor,0,& 982 & quit,res2,resid,residm,response,& 983 & tollist,psps%usepaw,vxcavg,wtk_rbz,xred,conv_retcode) 984 call timab(152,2,tsec) 985 986 if (istep==nstep) quit=1 987 ! If criteria in scprqt say to quit, then exit the loop over istep 988 quit_sum=quit 989 call xmpi_sum(quit_sum,spaceComm,ierr) 990 991 if (quit_sum>0) exit 992 call status(istep,dtfil%filstat,iexit,level,'call newrho ') 993 ! INSERT HERE CALL TO NEWRHO3 : to be implemented 994 if (psps%usepaw==1) then 995 MSG_BUG("newrho3 not implemented: use potential mixing!") 996 end if 997 initialized=1 998 end if 999 1000 ! ###################################################################### 1001 ! Compute the new 1st-order potential from the 1st-order density 1002 ! ---------------------------------------------------------------------- 1003 1004 if (ipert<dtset%natom+10) then 1005 optene=1 1006 call status(istep,dtfil%filstat,iexit,level,'call dfpt_rhotov ') 1007 call dfpt_rhotov(cplex,ehart01,ehart1,elpsp1,exc1,elmag1,gsqcut,idir,ipert,& 1008 & dtset%ixc,kxc,mpi_enreg,dtset%natom,nfftf,ngfftf,nhat,nhat1,nhat1gr,nhat1grdim,nkxc,& 1009 & nspden,n3xccc,optene,optres,dtset%paral_kgb,dtset%qptn,rhog,rhog1,rhor,rhor1,& 1010 & rprimd,ucvol,psps%usepaw,usexcnhat,vhartr1,vpsp1,nvresid1,res2,vtrial1,vxc,vxc1,xccc3d1,dtset%ixcrot) 1011 end if 1012 1013 ! ###################################################################### 1014 ! In case of potential mixing , compute the total 2nd-order energy, 1015 ! check the exit criterion, then mix the 1st-order potential 1016 ! ---------------------------------------------------------------------- 1017 1018 if (iscf_mod<10) then 1019 1020 ! PAW: has to compute here the "on-site" 2nd-order energy 1021 if (psps%usepaw==1) then 1022 nzlmopt=0;if (istep==1.and.dtset%pawnzlm>0) nzlmopt=-1 1023 if (istep>1) nzlmopt=dtset%pawnzlm 1024 call paw_an_reset_flags(paw_an1) ! Force the recomputation of on-site potentials 1025 option=2 1026 call pawdenpot(dum,epaw1,epawdc1_dum,ipert,dtset%ixc,my_natom,dtset%natom,dtset%nspden,& 1027 & psps%ntypat,dtset%nucdipmom,nzlmopt,option,paw_an1,paw_an,paw_ij1,pawang,dtset%pawprtvol,& 1028 & pawrad,pawrhoij1,dtset%pawspnorb,pawtab,dtset%pawxcdev,dtset%spnorbscl,& 1029 & dtset%xclevel,dtset%xc_denpos,ucvol,psps%znuclpsp,& 1030 & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom) 1031 end if 1032 1033 optene = 0 ! use direct scheme 1034 call dfpt_etot(dtset%berryopt,deltae,eberry,edocc,eeig0,eew,efrhar,efrkin,& 1035 & efrloc,efrnl,efrx1,efrx2,ehart1,ek0,ek1,eii,elast,eloc0,elpsp1,& 1036 !& enl0,enl1,epaw1,etotal,evar,evdw,exc1,elmag1,ipert,dtset%natom,optene) 1037 ! !debug: compute the d2E/d-qd+q energy, should be equal to the one from previous line 1038 ! if(.not.kramers_deg) then 1039 ! call dfpt_etot(dtset%berryopt,deltae_mq,eberry_mq,edocc_mq,eeig0_mq,eew,efrhar,efrkin,& 1040 !& efrloc,efrnl,efrx1,efrx2,ehart1_mq,ek0_mq,ek1_mq,eii,elast_mq,eloc0_mq,elpsp1_mq,& 1041 !& enl0_mq,enl1_mq,epaw1_mq,etotal_mq,evar_mq,evdw,exc1_mq,elmag1_mq,ipert,dtset%natom,optene) 1042 ! end if 1043 & enl0,enl1,epaw1,etotal,evar,evdw,exc1,ipert,dtset%natom,optene) 1044 1045 call timab(152,1,tsec) 1046 choice=2 1047 call status(istep,dtfil%filstat,iexit,level,'print info ') 1048 call scprqt(choice,cpus,deltae,diffor,dtset,eigen0,& 1049 & etotal,favg,fcart,fermie,dtfil%fnametmp_eig,dtfil%filnam_ds(1),& 1050 & 1,iscf_mod,istep,kpt_rbz,maxfor,& 1051 & mvdum,mpi_enreg,nband_rbz,nkpt_rbz,& 1052 & nstep,occ_rbz,0,prtfor,0,& 1053 & quit,res2,resid,residm,response,& 1054 & tollist,psps%usepaw,vxcavg,wtk_rbz,xred,conv_retcode) 1055 ! !debug: print the information about residuals at "-q" 1056 ! if(.not.kramers_deg) then 1057 ! call scprqt(choice,cpus,deltae_mq,diffor,dtset,eigen0,& 1058 !& etotal_mq,favg,fcart,fermie,dtfil%fnametmp_eig,dtfil%filnam_ds(1),& 1059 !& 1,iscf_mod,istep,kpt_rbz,maxfor,& 1060 !& mvdum,mpi_enreg,nband_rbz,nkpt_rbz,& 1061 !& nstep,occ_rbz,0,prtfor,0,& 1062 !& quit,res2_mq,resid_mq,residm_mq,response,& 1063 !& tollist,psps%usepaw,vxcavg,wtk_rbz,xred,conv_retcode) 1064 ! endif 1065 call timab(152,2,tsec) 1066 1067 ! If criteria in scprqt say to quit, then exit the loop over istep 1068 quit_sum=quit 1069 call xmpi_sum(quit_sum,spaceComm,ierr) 1070 if (quit_sum>0) exit 1071 1072 ! TODO 1073 ! Better error handling is the SCF cycle goes bananas: 1074 ! Write a BIG warning in the output file and save the wavefunctions. 1075 ! so that we can restart. 1076 if(iscf_mod/=-3)then 1077 ! Note that nvresid1 and vtrial1 are called vresid and vtrial inside this routine 1078 call dfpt_newvtr(cplex,dbl_nnsclo,dielar,dtset,etotal,pawfgr%fintocoa,& 1079 & initialized,iscf_mod,ispmix,istep,mix,pawfgr%coatofin,& 1080 & mpi_enreg,my_natom,nfftf,nfftmix,ngfftf,ngfftmix,npawmix,pawrhoij1,& 1081 & qphon,rhor1,rprimd,psps%usepaw,nvresid1,vtrial1) 1082 if (.not.kramers_deg) then 1083 !same problem as with density reconstruction, TODO proper fft parallelization... 1084 do ifft=1,nfftf 1085 vtrial1_mq(2*ifft-1,1)=+vtrial1(2*ifft-1,1) 1086 vtrial1_mq(2*ifft-1,2)=+vtrial1(2*ifft-1,2) 1087 vtrial1_mq(2*ifft ,1)=-vtrial1(2*ifft ,1) 1088 vtrial1_mq(2*ifft ,2)=-vtrial1(2*ifft ,2) 1089 vtrial1_mq(2*ifft-1,3)= vtrial1(2*ifft ,4) !Re[V^12] 1090 vtrial1_mq(2*ifft ,3)= vtrial1(2*ifft-1,4) !Im[V^12],see definition of v(:,4) cplex=2 case 1091 vtrial1_mq(2*ifft ,4)= vtrial1(2*ifft-1,3) !Re[V^21]=Re[V^12] 1092 vtrial1_mq(2*ifft-1,4)= vtrial1(2*ifft ,3) !Re[V^21]=Re[V^12] 1093 end do 1094 end if 1095 initialized=1 1096 end if 1097 end if 1098 1099 ! ###################################################################### 1100 ! END MINIMIZATION ITERATIONS 1101 ! Note that there are different "exit" instructions within the loop 1102 ! ###################################################################### 1103 end do ! istep 1104 1105 ! Avoid pending requests if itime == ntime. 1106 call xmpi_wait(quitsum_request,ierr) 1107 if (timelimit_exit == 1) istep = istep - 1 1108 1109 !SP : Here read the _DDB file and extract the Born effective charge and 1110 ! dielectric constant. 1111 ! The idea is to supress the divergence due to a residual Born effective charge 1112 ! by renormalizing the v_hart1. For this, the difference between the ionic 1113 ! Z_kappa and the Born effective charge divided by the dielectric constant is used. 1114 ! --------------------------------------------------------------------------------- 1115 if ((dtset%getddb .ne. 0 .or. dtset%irdddb .ne.0) .and. qzero .ne. 1) then 1116 ABI_ALLOCATE(rhor2,(cplex*nfftf,nspden)) 1117 ABI_ALLOCATE(resid2,(dtset%mband*nkpt_rbz*nspden)) 1118 ABI_ALLOCATE(rhog2,(2,nfftf)) 1119 ABI_ALLOCATE(vtrial2,(cplex*nfftf,nspden)) 1120 1121 Z_kappa = nint(psps%ziontypat(dtset%typat(ipert))) ! Charge ionic from the psp 1122 qred2cart = two_pi*gprimd 1123 q_cart = MATMUL(qred2cart,qphon) 1124 q_cart = q_cart/SQRT(dot_product(q_cart,q_cart)) 1125 diel_q = dot_product(MATMUL(dielt,q_cart),q_cart) 1126 zeff_bar = SUM(zeff(:,:,:),DIM=3)/dtset%natom 1127 zeff_red = MATMUL(zeff_bar(:,:),rprimd(:,idir))/two_pi 1128 qphon_norm = SQRT(dot_product(qphon,qphon)) 1129 q_cart = MATMUL(qred2cart,qphon) 1130 born_bar = dot_product(q_cart,zeff_red(:)) 1131 zeff_red = MATMUL(zeff(:,:,ipert),rprimd(:,idir))/two_pi 1132 born = dot_product(q_cart,zeff_red(:)) 1133 1134 ! To avoid problem of divergence (0/0) we add a small value to qphon 1135 qphon2 = qphon + tol6 1136 renorm = (1-(qphon2(idir)*Z_kappa-(born-born_bar)/diel_q)/(qphon2(idir)*Z_kappa-born/diel_q)) 1137 1138 vtrial2(:,1) = vtrial1(:,1) -renorm*vhartr1 1139 1140 call dfpt_vtorho(cg,cgq,cg1,cg1_active,cplex,cprj,cprjq,cprj1,& 1141 & dbl_nnsclo,dim_eig2rf,doccde_rbz,docckqde,dtefield,dtfil,dtset,dtset%qptn,edocc,& 1142 & eeig0,eigenq,eigen0,eigen1,ek0,ek1,eloc0,enl0,enl1,fermie1,gh0c1_set,gh1c_set,& 1143 & gmet,gprimd,idir,indsy1,ipert,irrzon1,istwfk_rbz,kg,kg1,kpt_rbz,dtset%mband,& 1144 & mkmem,mkqmem,mk1mem,mpi_enreg,mpw,mpw1,my_natom,dtset%natom,nband_rbz,ncpgr,nfftf,& 1145 & nhat1,nkpt_rbz,npwarr,npwar1,res3,nspden,dtset%nsppol,nsym1,dtset%ntypat,nvresid2,& 1146 & occkq,occ_rbz,optres,paw_ij,paw_ij1,pawang,pawang1,pawfgr,pawfgrtab,pawrhoij,& 1147 & pawrhoij1,pawtab,phnons1,ph1d,dtset%prtvol,psps,pwindall,qmat,resid2,residm2,rhog2,& 1148 & rhor2,rmet,rprimd,symaf1,symrc1,symrl1,ucvol,usecprj,useylmgr1,ddk_f,& 1149 & vtrial,vtrial2,wtk_rbz,xred,ylm,ylm1,ylmgr1,1) 1150 1151 write(msg,'(a)') ' '//NEW_LINE('A')//'& 1152 & ---------------------------------' 1153 call wrtout(ab_out,msg,'COLL') 1154 write(msg,'(a,a)')' The charge sum rule is activated'//NEW_LINE('A')//'& 1155 & ---------------------------------' 1156 call wrtout(ab_out,msg,'COLL') 1157 write(msg,'(a,i4)') ' Z_ion (psp):',Z_kappa 1158 call wrtout(ab_out,msg,'COLL') 1159 write(msg,'(a,f12.8)') ' Residual Born effective charge: ',born 1160 call wrtout(ab_out,msg,'COLL') 1161 write(msg,'(a,f12.8)') ' Renormalisation: ',renorm 1162 call wrtout(ab_out,msg,'COLL') 1163 if (renorm > 0.01 ) then 1164 write(msg,'(a,a)')' WARNING: The renormalisation seems large (> 0.01).'//NEW_LINE('A')//'& 1165 & You might consider increasing the k-point grid.' 1166 MSG_WARNING(msg) 1167 call wrtout(ab_out,msg,'COLL') 1168 end if 1169 write(msg,'(a)') ' ' 1170 call wrtout(ab_out,msg,'COLL') 1171 1172 ABI_DEALLOCATE(nvresid2) 1173 ABI_DEALLOCATE(rhor2) 1174 ABI_DEALLOCATE(resid2) 1175 ABI_DEALLOCATE(rhog2) 1176 ABI_DEALLOCATE(vtrial2) 1177 end if 1178 1179 if (iscf_mod>0.or.iscf_mod==-3) then 1180 ABI_DEALLOCATE(nvresid1) 1181 if (.not.kramers_deg) then 1182 ABI_DEALLOCATE(nvresid1_mq) 1183 end if 1184 end if 1185 1186 !###################################################################### 1187 !Additional steps after SC iterations 1188 !---------------------------------------------------------------------- 1189 1190 call timab(160,1,tsec) 1191 1192 !Compute Dynamic magnetic charges (dmc) in case of rfphon, 1193 !and magnetic susceptibility in case of rfmagn from first order density 1194 !(results to be comapred to dmc from d2e) 1195 !SPr deb 1196 !if (ipert<=dtset%natom.and.dtset%nspden>=2) then 1197 ! 1198 ! mpi_comm_sphgrid=mpi_enreg%comm_fft 1199 ! call mean_fftr(rhor1(:,1),mean_rhor1,nfftf,nfftotf,1,mpi_comm_sphgrid) 1200 ! write(*,*) ' Mean 1st order density: ', mean_rhor1 1201 ! call mean_fftr(rhor1(:,2),mean_rhor1,nfftf,nfftotf,1,mpi_comm_sphgrid) 1202 ! if (dtset%nspden==2) then 1203 ! write(*,*) ' 1st order m_z : ', mean_rhor1 1204 ! else !nspden==4 1205 ! write(*,*) ' 1st order m_x : ', mean_rhor1 1206 ! call mean_fftr(rhor1(:,3),mean_rhor1,nfftf,nfftotf,1,mpi_comm_sphgrid) 1207 ! write(*,*) ' 1st order m_y : ', mean_rhor1 1208 ! call mean_fftr(rhor1(:,4),mean_rhor1,nfftf,nfftotf,1,mpi_comm_sphgrid) 1209 ! write(*,*) ' 1st order m_z : ', mean_rhor1 1210 ! endif 1211 ! 1212 !endif 1213 1214 1215 !Eventually close the dot file, before calling dfpt_nstdy 1216 if ((ipert==dtset%natom+2.and.sum((dtset%qptn(1:3))**2)<=1.0d-7.and.& 1217 & (dtset%berryopt/=4 .and.dtset%berryopt/= 6.and.dtset%berryopt/= 7.and.& 1218 & dtset%berryopt/=14.and.dtset%berryopt/=16.and.dtset%berryopt/=17)).or.& 1219 & ipert==dtset%natom+10.or.ipert==dtset%natom+11) then 1220 call wfk_close(ddk_f(1)) 1221 end if 1222 if ((ipert==dtset%natom+10 .and. idir>3) .or. ipert==dtset%natom+11) then 1223 call wfk_close(ddk_f(2)) 1224 end if 1225 if (ipert==dtset%natom+11) then 1226 call wfk_close(ddk_f(3)) 1227 if(idir>3) call wfk_close(ddk_f(4)) 1228 end if 1229 1230 !Deallocate the no more needed arrays 1231 if (iscf_mod>0.and.nstep>0) then 1232 call ab7_mixing_deallocate(mix) 1233 end if 1234 if( (nstep>0 .and. iscf_mod>0) .or. iscf_mod==-1 ) then 1235 ABI_DEALLOCATE(dielinv) 1236 ABI_DEALLOCATE(susmat) 1237 end if 1238 if(allocated(rhorfermi)) then 1239 ABI_DEALLOCATE(rhorfermi) 1240 end if 1241 if(allocated(rhorfermi_mq)) then 1242 ABI_DEALLOCATE(rhorfermi_mq) 1243 end if 1244 if(allocated(nhatfermi)) then 1245 ABI_DEALLOCATE(nhatfermi) 1246 end if 1247 if(allocated(pawrhoijfermi)) then 1248 call pawrhoij_free(pawrhoijfermi) 1249 ABI_DATATYPE_DEALLOCATE(pawrhoijfermi) 1250 end if 1251 if(psps%usepaw==1) then 1252 if (mk1mem/=0.and.usecprj==1) then 1253 call pawcprj_free(cprj1) 1254 end if 1255 do iatom=1,my_natom 1256 if (pawfgrtab(iatom)%nhatfr_allocated>0) then 1257 ABI_DEALLOCATE(pawfgrtab(iatom)%nhatfr) 1258 end if 1259 pawfgrtab(iatom)%nhatfr_allocated=0 1260 end do 1261 if (nstep>0.and.iscf_mod>0) then 1262 do iatom=1,my_natom 1263 pawrhoij1(iatom)%lmnmix_sz=0 1264 pawrhoij1(iatom)%use_rhoijres=0 1265 ABI_DEALLOCATE(pawrhoij1(iatom)%kpawmix) 1266 ABI_DEALLOCATE(pawrhoij1(iatom)%rhoijres) 1267 end do 1268 end if 1269 end if ! PAW 1270 ABI_DATATYPE_DEALLOCATE(cprj1) 1271 ABI_DEALLOCATE(nhat1gr) 1272 1273 call timab(160,2,tsec) 1274 call timab(150,1,tsec) 1275 1276 if (psps%usepaw==0.and.dtset%userie/=919.and. & 1277 & (ipert==dtset%natom+3.or.ipert==dtset%natom+4)) then 1278 call status(0,dtfil%filstat,iexit,level,'enter dfpt_nselt ') 1279 call dfpt_nselt(blkflg,cg,cg1,cplex,& 1280 & d2bbb,d2lo,d2nl,ecut,dtset%ecutsm,dtset%effmass_free,& 1281 & gmet,gprimd,gsqcut,idir,& 1282 & ipert,istwfk_rbz,kg,kg1,kpt_rbz,kxc,dtset%mband,mgfftf,& 1283 & mkmem,mk1mem,mpert,mpi_enreg,psps%mpsang,mpw,mpw1,& 1284 & dtset%natom,nband_rbz,nfftf,ngfftf,& 1285 & nkpt_rbz,nkxc,dtset%nloalg,& 1286 & npwarr,npwar1,nspden,dtset%nspinor,dtset%nsppol,& 1287 & nsym1,dtset%ntypat,occ_rbz,& 1288 & dtset%paral_kgb,ph1d,dtset%prtbbb,psps,dtset%qptn,rhog,& 1289 & rhor,rhor1,rmet,rprimd,symrc1,dtset%typat,ucvol,& 1290 & wtk_rbz,xred,ylm,ylm1,ylmgr,ylmgr1) 1291 end if 1292 1293 !Use of NSTPAW3 for NCPP (instead of DFPT_NSELT/DFPT_NSTDY) can be forced with userie=919 1294 !MT oct. 2015: this works perfectly on all automatic tests 1295 if(ipert<=dtset%natom+4)then 1296 if (psps%usepaw==1.or.dtset%userie==919) then 1297 call status(0,dtfil%filstat,iexit,level,'enter dfpt_nstpaw ') 1298 call dfpt_nstpaw(blkflg,cg,cgq,cg1,cplex,cprj,cprjq,docckqde,doccde_rbz,dtfil,dtset,d2lo,d2nl,d2ovl,& 1299 & eigenq,eigen0,eigen1,eovl1,gmet,gprimd,gsqcut,idir,indkpt1,indsy1,ipert,irrzon1,istwfk_rbz,& 1300 & kg,kg1,kpt_rbz,kxc,mgfftf,mkmem,mkqmem,mk1mem,mpert,mpi_enreg,mpw,mpw1,nattyp,nband_rbz,ncpgr,& 1301 & nfftf,ngfftf,nhat,nhat1,nkpt_rbz,nkxc,npwarr,npwar1,nspden,dtset%nspinor,dtset%nsppol,& 1302 & nsym1,n3xccc,occkq,occ_rbz,paw_an,paw_an1,paw_ij,paw_ij1,pawang,pawang1,pawfgr,pawfgrtab,pawrad,& 1303 & pawrhoij,pawrhoij1,pawtab,phnons1,ph1d,ph1df,psps,rhog,rhor,rhor1,rmet,rprimd,symaf1,symrc1,& 1304 & symrl1,ucvol,usecprj,psps%usepaw,usexcnhat,useylmgr1,vhartr1,vpsp1,vtrial,vtrial1,vxc,wtk_rbz,& 1305 & xccc3d1,xred,ylm,ylm1,ylmgr1) 1306 else 1307 call status(0,dtfil%filstat,iexit,level,'enter dfpt_nstdy ') 1308 if (dtset%nspden==4) then 1309 call dfpt_nstdy(atindx,blkflg,cg,cg1,cplex,dtfil,dtset,d2bbb,d2lo,d2nl,eigen0,eigen1,gmet,& 1310 & gsqcut,idir,indkpt1,indsy1,ipert,istwfk_rbz,kg,kg1,kpt_rbz,kxc,mkmem,mk1mem,mpert,mpi_enreg,& 1311 & mpw,mpw1,nattyp,nband_rbz,nfftf,ngfftf,nkpt,nkpt_rbz,nkxc,npwarr,npwar1,nspden,& 1312 & dtset%nsppol,nsym1,occ_rbz,ph1d,psps,rhor1,rmet,rprimd,symrc1,ucvol,& 1313 & wtk_rbz,xred,ylm,ylm1,rhor=rhor,vxc=vxc) 1314 else 1315 call dfpt_nstdy(atindx,blkflg,cg,cg1,cplex,dtfil,dtset,d2bbb,d2lo,d2nl,eigen0,eigen1,gmet,& 1316 & gsqcut,idir,indkpt1,indsy1,ipert,istwfk_rbz,kg,kg1,kpt_rbz,kxc,mkmem,mk1mem,mpert,mpi_enreg,& 1317 & mpw,mpw1,nattyp,nband_rbz,nfftf,ngfftf,nkpt,nkpt_rbz,nkxc,npwarr,npwar1,nspden,& 1318 & dtset%nsppol,nsym1,occ_rbz,ph1d,psps,rhor1,rmet,rprimd,symrc1,ucvol,& 1319 & wtk_rbz,xred,ylm,ylm1) 1320 end if 1321 end if 1322 end if 1323 1324 call timab(150,2,tsec) 1325 call timab(160,1,tsec) 1326 1327 !calculate Born effective charge and store it in d2lo 1328 if ((dtset%berryopt== 4.or.dtset%berryopt== 6.or.dtset%berryopt== 7.or.& 1329 & dtset%berryopt==14.or.dtset%berryopt==16.or.dtset%berryopt==17).and.& 1330 & ipert<=dtset%natom) then 1331 call dfptff_bec(cg,cg1,dtefield,dtset%natom,d2lo,idir,ipert,dtset%mband,mkmem,& 1332 & mpw,mpw1,mpert,nkpt,npwarr,npwar1,dtset%nsppol,dtset%nspinor,pwindall,qmat,rprimd) 1333 blkflg(:,dtset%natom+2,:,1:dtset%natom)=1 1334 end if 1335 1336 !calculate dielectric tensor and store it in d2lo 1337 if ((dtset%berryopt== 4.or.dtset%berryopt== 6.or.dtset%berryopt== 7.or.& 1338 & dtset%berryopt==14.or.dtset%berryopt==16.or.dtset%berryopt==17).and.& 1339 & ipert==dtset%natom+2) then 1340 call dfptff_die(cg,cg1,dtefield,d2lo,idir,ipert,dtset%mband,mkmem,& 1341 & mpw,mpw1,mpert,nkpt,npwarr,npwar1,dtset%nsppol,dtset%nspinor,pwindall,qmat,rprimd) 1342 blkflg(:,dtset%natom+2,:,dtset%natom+2)=1 1343 end if 1344 1345 !If SCF convergence was not reached (for nstep>0), 1346 !print a warning to the output file (non-dummy arguments: nstep, 1347 !residm, diffor - infos from tollist have been saved inside ) 1348 !Set also the value of conv_retcode 1349 choice=3 1350 call scprqt(choice,cpus,deltae,diffor,dtset,eigen0,& 1351 & etotal,favg,fcart,fermie,dtfil%fnametmp_eig,dtfil%filnam_ds(1),& 1352 & 1,iscf_mod,istep,kpt_rbz,maxfor,& 1353 & mvdum,mpi_enreg,nband_rbz,nkpt_rbz,& 1354 & nstep,occ_rbz,0,prtfor,0,& 1355 & quit,res2,resid,residm,response,& 1356 & tollist,psps%usepaw,vxcavg,wtk_rbz,xred,conv_retcode) 1357 1358 !Update the content of the header (evolving variables) 1359 bantot_rbz = sum(nband_rbz(1:nkpt_rbz*dtset%nsppol)) 1360 call hdr_update(hdr,bantot_rbz,etotal,fermie,& 1361 & residm,rprimd,occ_rbz,pawrhoij1,xred,dtset%amu_orig(:,1),& 1362 & comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab ) 1363 1364 !Optionally provide output of charge density and/or potential in real space, 1365 !as well as analysis of geometrical factors (bond lengths and bond angles). 1366 !Warnings : 1367 !- core charge is excluded from the charge density; 1368 !- the potential is the INPUT vtrial. 1369 1370 if(ipert==dtset%natom+5.or.ipert<=dtset%natom)then 1371 prtopt=1 1372 if(ipert==dtset%natom+5) then 1373 prtopt=idir+1; 1374 call calcdensph(gmet,mpi_enreg,dtset%natom,nfftf,ngfftf,nspden,& 1375 & dtset%ntypat,ab_out,dtset%ratsph,rhor1,rprimd,dtset%typat,ucvol,xred,& 1376 & prtopt,cplex,intgden=intgden,dentot=dentot) 1377 !debug: write out the vtk first-order density components 1378 ! call appdig(pertcase,dtfil%fnameabo_den,fi1o_vtk) 1379 ! call printmagvtk(mpi_enreg,cplex,nspden,nfftf,ngfftf,rhor1,rprimd,adjustl(adjustr(fi1o_vtk)//"_PQ")) 1380 ! call printmagvtk(mpi_enreg,cplex,nspden,nfftf,ngfftf,rhor1,rprimd,adjustl(adjustr(fi1o_vtk)//"_MQ")) 1381 !SPr: add calculation of the contributions to susceptibility from all attomic spheres 1382 end if 1383 end if 1384 1385 if (iwrite_fftdatar(mpi_enreg)) then 1386 if (dtset%prtden>0) then 1387 rdwrpaw=0 1388 call appdig(pertcase,dtfil%fnameabo_den,fi1o) 1389 ! TODO: should we write pawrhoij1 or pawrhoij. Note that ioarr writes hdr%pawrhoij 1390 call fftdatar_write_from_hdr("first_order_density",fi1o,dtset%iomode,hdr,& 1391 ngfftf,cplex,nfftf,dtset%nspden,rhor1,mpi_enreg) 1392 end if 1393 1394 ! first order potentials are always written because the eph code requires them 1395 ! the files are small (much much smaller that 1WFK, actually we should avoid writing 1WFK) 1396 rdwrpaw=0 1397 call appdig(pertcase,dtfil%fnameabo_pot,fi1o) 1398 ! TODO: should we write pawrhoij1 or pawrhoij. Note that ioarr writes hdr%pawrhoij 1399 call fftdatar_write_from_hdr("first_order_potential",fi1o,dtset%iomode,hdr,& 1400 ngfftf,cplex,nfftf,dtset%nspden,vtrial1,mpi_enreg) 1401 1402 ! output files for perturbed potential components: vhartr1,vpsp1,vxc 1403 ! NB: only 1 spin for these 1404 if (dtset%prtvha > 0) then 1405 rdwrpaw=0 1406 ABI_ALLOCATE(vhartr1_tmp, (cplex*nfftf, dtset%nspden)) 1407 vhartr1_tmp = zero 1408 vhartr1_tmp(:,1) = vhartr1(:) 1409 call appdig(pertcase,dtfil%fnameabo_vha,fi1o) 1410 ! TODO: should we write pawrhoij1 or pawrhoij. Note that ioarr writes hdr%pawrhoij 1411 call fftdatar_write_from_hdr("first_order_vhartree",fi1o,dtset%iomode,hdr,& 1412 ngfftf,cplex,nfftf,dtset%nspden,vhartr1_tmp,mpi_enreg) 1413 ABI_DEALLOCATE(vhartr1_tmp) 1414 end if 1415 1416 1417 ! vpsp1 needs to be copied to a temp array - intent(inout) in fftdatar_write_from_hdr though I do not know why 1418 ! if (dtset%prtvpsp > 0) then 1419 ! rdwrpaw=0 1420 ! call appdig(pertcase,dtfil%fnameabo_vpsp,fi1o) 1421 ! ! TODO: should we write pawrhoij1 or pawrhoij. Note that ioarr writes hdr%pawrhoij 1422 ! call fftdatar_write_from_hdr("first_order_vpsp",fi1o,dtset%iomode,hdr,& 1423 ! ngfftf,cplex,nfftf,1,vpsp1,mpi_enreg) 1424 ! end if 1425 1426 if (dtset%prtvxc > 0) then 1427 rdwrpaw=0 1428 call appdig(pertcase,dtfil%fnameabo_vxc,fi1o) 1429 ! TODO: should we write pawrhoij1 or pawrhoij. Note that ioarr writes hdr%pawrhoij 1430 call fftdatar_write_from_hdr("first_order_vxc",fi1o,dtset%iomode,hdr,& 1431 ngfftf,cplex,nfftf,dtset%nspden,vxc1,mpi_enreg) 1432 end if 1433 1434 1435 ! Add rhog1(G=0) to file 1436 if (mpi_enreg%me_g0 == 1) then 1437 if (dtset%iomode == IO_MODE_ETSF) then 1438 #ifdef HAVE_NETCDF 1439 NCF_CHECK(nctk_open_modify(ncid, nctk_ncify(fi1o), xmpi_comm_self)) 1440 ncerr = nctk_def_one_array(ncid, nctkarr_t('rhog1_g0', "dp", "two"), varid=varid) 1441 NCF_CHECK(ncerr) 1442 NCF_CHECK(nctk_set_datamode(ncid)) 1443 NCF_CHECK(nf90_put_var(ncid, varid, rhog1(:,1))) 1444 NCF_CHECK(nf90_close(ncid)) 1445 #endif 1446 else 1447 ! Handle Fortran files. 1448 if (open_file(fi1o, msg, newunit=ncid, form='unformatted', status='old', action="readwrite") /= 0) then 1449 MSG_ERROR(msg) 1450 end if 1451 if (fort_denpot_skip(ncid, msg) /= 0) MSG_ERROR(msg) 1452 write(ncid) rhog1(:,1) 1453 close(ncid) 1454 end if 1455 end if 1456 1457 end if ! iwrite_fftdatar(mpi_enreg) 1458 1459 !All procs waiting here... 1460 if(mpi_enreg%paral_kgb==1)then 1461 call timab(61,1,tsec) 1462 call xmpi_barrier(spaceComm) 1463 call timab(61,2,tsec) 1464 end if 1465 1466 !Deallocate arrays 1467 ABI_DEALLOCATE(fcart) 1468 ABI_DEALLOCATE(vtrial1) 1469 if (.not.kramers_deg) then 1470 ABI_DEALLOCATE(vhartr1_mq) 1471 ABI_DEALLOCATE(vxc1_mq) 1472 ABI_DEALLOCATE(vtrial1_pq) 1473 ABI_DEALLOCATE(vtrial1_mq) 1474 end if 1475 ABI_DEALLOCATE(vhartr1) 1476 ABI_DEALLOCATE(vxc1) 1477 ABI_DEALLOCATE(pwindall) 1478 ABI_DEALLOCATE(qmat) 1479 if (dtset%berryopt== 4.or.dtset%berryopt== 6.or.dtset%berryopt== 7.or.& 1480 & dtset%berryopt==14.or.dtset%berryopt==16.or.dtset%berryopt==17) then 1481 call destroy_efield(dtefield) 1482 if(allocated(mpi_enreg%kpt_loc2ibz_sp)) then 1483 ABI_DEALLOCATE(mpi_enreg%kpt_loc2ibz_sp) 1484 end if 1485 end if 1486 1487 if(psps%usepaw==1) then 1488 call paw_an_free(paw_an1) 1489 call paw_ij_free(paw_ij1) 1490 end if 1491 ABI_DATATYPE_DEALLOCATE(paw_an1) 1492 ABI_DATATYPE_DEALLOCATE(paw_ij1) 1493 ABI_DEALLOCATE(nhat1) 1494 1495 call status(0,dtfil%filstat,iexit,level,'exit') 1496 1497 call timab(160,2,tsec) 1498 call timab(120,2,tsec) 1499 1500 DBG_EXIT("COLL") 1501 1502 end subroutine dfpt_scfcv