TABLE OF CONTENTS
- ABINIT/m_electronpositron
- ABINIT/rhohxcpositron
- m_electronpositron/destroy_electronpositron
- m_electronpositron/electronpositron_calctype
- m_electronpositron/electronpositron_type
- m_electronpositron/exchange_electronpositron
- m_electronpositron/init_electronpositron
ABINIT/m_electronpositron [ Modules ]
NAME
m_electronpositron
FUNCTION
This module provides the definition of the electronpositron_type used used to store data for the electron-positron two-component DFT as methods to operate on it.
COPYRIGHT
Copyright (C) 2008-2024 ABINIT group (MT, GJ) This file is distributed under the terms of the GNU General Public License, see ~abinit/COPYING or http://www.gnu.org/copyleft/gpl.txt .
SOURCE
18 #if defined HAVE_CONFIG_H 19 #include "config.h" 20 #endif 21 #include "abi_common.h" 22 23 MODULE m_electronpositron 24 25 use defs_basis 26 use m_abicore 27 use m_errors 28 use m_energies 29 use m_xmpi 30 use m_cgtools 31 use m_dtset 32 33 use defs_abitypes, only : MPI_type 34 use m_pawtab, only : pawtab_type 35 use m_paw_an, only : paw_an_type 36 use m_pawrhoij, only : pawrhoij_type, pawrhoij_alloc, pawrhoij_free, pawrhoij_copy 37 use m_pawcprj, only : pawcprj_type, pawcprj_alloc, pawcprj_free, pawcprj_copy 38 use m_mpinfo, only : proc_distrb_cycle 39 use m_xcpositron, only : xcpositron 40 use m_drivexc, only : mkdenpos 41 use m_xctk, only : xcden 42 use m_fft, only : fourdp 43 44 implicit none 45 46 private 47 48 ! public constants 49 integer,public,parameter :: EP_NOTHING =-1 50 integer,public,parameter :: EP_ELECTRON = 0 51 integer,public,parameter :: EP_POSITRON = 1
ABINIT/rhohxcpositron [ Functions ]
NAME
rhohxcpositron
FUNCTION
Calculate the electrons/positron correlation term for the positron
INPUTS
gprimd(3,3)=dimensional reciprocal space primitive translations mpi_enreg=information about MPI parallelization nfft=(effective) number of FFT grid points (for this processor) ngfft(18)=contain all needed information about 3D FFT, see ~abinit/doc/variables/vargs.htm#ngfft nhat(nfft,nspden*usepaw)= -PAW only- compensation density nkxc=second dimension of the array kxc, see rhotoxc.f for a description nspden=number of spin density components n3xccc=dimension of the xccc3d array (0 or nfft). paral_kgb=flag for (k,band,FFT) parallelism rhor(nfft,nspden)=array for electron density in electrons/bohr**3. ucvol = unit cell volume (Bohr**3) usexcnhat= -PAW only- flag controling use of compensation density in Vxc usepaw=flag for PAW xccc3d(n3xccc)=3D core electron density for XC core correction (bohr^-3) xc_denpos= lowest allowed density (usually for the computation of the XC functionals)
OUTPUT
electronpositron%e_xc=electron-positron XC energy electronpositron%e_xcdc=Double-counting electron-positron XC energy strsxc(6)= contribution of xc to stress tensor (hartree/bohr^3), vhartr(nfft)=Hartree potential (returned if option/=0 and option/=10) vxcapn=XC electron-positron XC potential for the positron vxcavg=unit cell average of Vxc = (1/ucvol) Int [Vxc(r) d^3 r]. kxcapn(nfft,nkxc)=electron-positron XC kernel (returned only if nkxc/=0)
SIDE EFFECTS
electronpositron <type(electronpositron_type)>=quantities for the electron-positron annihilation
SOURCE
788 subroutine rhohxcpositron(electronpositron,gprimd,kxcapn,mpi_enreg,nfft,ngfft,nhat,nkxc,nspden,n3xccc,& 789 & paral_kgb,rhor,strsxc,ucvol,usexcnhat,usepaw,vhartr,vxcapn,vxcavg,xccc3d,xc_denpos) 790 791 !Arguments ------------------------------------ 792 !scalars 793 integer,intent(in) :: nfft,nkxc,nspden,n3xccc,paral_kgb,usexcnhat,usepaw 794 real(dp),intent(in) :: ucvol,xc_denpos 795 real(dp),intent(out) :: vxcavg 796 type(electronpositron_type),pointer :: electronpositron 797 !arrays 798 integer,intent(in) :: ngfft(18) 799 real(dp),intent(in) :: gprimd(3,3) 800 real(dp),intent(in) :: nhat(nfft,nspden*usepaw),rhor(nfft,nspden),xccc3d(n3xccc) 801 real(dp),intent(out) :: kxcapn(nfft,nkxc),strsxc(6),vhartr(nfft),vxcapn(nfft,nspden) 802 type(MPI_type),intent(in) :: mpi_enreg 803 804 !Local variables------------------------------- 805 !scalars 806 integer :: cplex,ierr,ifft,ishift,iwarn,iwarnp,nfftot,ngr,ngrad,nspden_ep 807 real(dp) :: exc,excdc,strdiag 808 character(len=500) :: message 809 !arrays 810 real(dp),parameter :: qphon(3)=(/0._dp,0._dp,0._dp/) 811 real(dp) :: vxcavg_tmp(1) 812 real(dp),allocatable :: fxcapn(:),grho2apn(:),rhoe(:,:,:),rhop(:,:),rhotote(:),vxc_ep(:),vxcgr_ep(:) 813 814 ! ************************************************************************* 815 816 if (electronpositron_calctype(electronpositron)/=1) then 817 message = 'Only electronpositron%calctype=1 allowed !' 818 ABI_BUG(message) 819 end if 820 821 if (nkxc>3) then 822 message = 'nkxc>3 (Kxc for GGA) not yet implemented !' 823 ABI_ERROR(message) 824 end if 825 826 !Hartree potential of the positron is zero 827 vhartr=zero 828 829 !Some allocations/inits 830 ngrad=1;if (electronpositron%ixcpositron==3.or.electronpositron%ixcpositron==31) ngrad=2 831 ngr=0;if (ngrad==2) ngr=nfft 832 ABI_MALLOC(fxcapn,(nfft)) 833 ABI_MALLOC(grho2apn,(ngr)) 834 nspden_ep=1;cplex=1;ishift=0 835 iwarn=0;iwarnp=1 836 837 !Compute total electronic density 838 ABI_MALLOC(rhotote,(nfft)) 839 rhotote(:)=electronpositron%rhor_ep(:,1) 840 if (n3xccc>0) rhotote(:)=rhotote(:)+xccc3d(:) 841 if (usepaw==1.and.usexcnhat==0) rhotote(:)=rhotote(:)-electronpositron%nhat_ep(:,1) 842 843 !Extra total electron/positron densities; compute gradients for GGA 844 ABI_MALLOC(rhoe,(nfft,nspden_ep,ngrad**2)) 845 ABI_MALLOC(rhop,(nfft,nspden_ep)) 846 call xcden(cplex,gprimd,ishift,mpi_enreg,nfft,ngfft,ngrad,nspden_ep,qphon,rhotote,rhoe) 847 if (ngrad==2) grho2apn(:)=rhoe(:,1,2)**2+rhoe(:,1,3)**2+rhoe(:,1,4)**2 848 rhop(:,1)=rhor(:,1);if (usepaw==1.and.usexcnhat==0) rhop(:,1)=rhop(:,1)-nhat(:,1) 849 ABI_FREE(rhotote) 850 851 !Make the densities positive 852 call mkdenpos(iwarn ,nfft,nspden_ep,1,rhoe(:,1,1),xc_denpos) 853 if (.not.electronpositron%posdensity0_limit) then 854 call mkdenpos(iwarnp,nfft,nspden_ep,1,rhop,xc_denpos) 855 end if 856 857 !Compute electron-positron Vxc_pos, Vxc_el, Fxc, Kxc, ... 858 ABI_MALLOC(vxc_ep,(nfft)) 859 ABI_MALLOC(vxcgr_ep,(ngr)) 860 if (nkxc==0) then 861 call xcpositron(fxcapn,grho2apn,electronpositron%ixcpositron,ngr,nfft,electronpositron%posdensity0_limit,& 862 & rhoe(:,1,1),rhop(:,1),vxc_ep,vxcgr_ep,vxcapn) 863 else 864 call xcpositron(fxcapn,grho2apn,electronpositron%ixcpositron,ngr,nfft,electronpositron%posdensity0_limit,& 865 & rhoe(:,1,1),rhop(:,1),vxc_ep,vxcgr_ep,vxcapn,dvxce=kxcapn) 866 end if 867 ABI_FREE(rhoe) 868 ABI_FREE(vxc_ep) 869 ABI_FREE(vxcgr_ep) 870 ABI_FREE(grho2apn) 871 872 !Store Vxc and Kxc according to spin components 873 if (nspden>=2) vxcapn(:,2)=vxcapn(:,1) 874 if (nspden==4) vxcapn(:,3:4)=zero 875 if (nkxc==3) then 876 kxcapn(:,1)=two*kxcapn(:,1) 877 kxcapn(:,2)=kxcapn(:,1) 878 kxcapn(:,3)=kxcapn(:,1) 879 end if 880 881 !Compute XC energies and contribution to stress tensor 882 electronpositron%e_xc =zero 883 electronpositron%e_xcdc=zero 884 strdiag=zero 885 nfftot=PRODUCT(ngfft(1:3)) 886 do ifft=1,nfft 887 electronpositron%e_xc =electronpositron%e_xc +fxcapn(ifft) 888 electronpositron%e_xcdc=electronpositron%e_xcdc+vxcapn(ifft,1)*rhor(ifft,1) 889 ! strdiag=strdiag+fxcapn(ifft) ! Already stored in rhotoxc ! 890 strdiag=strdiag-vxcapn(ifft,1)*rhop(ifft,1) 891 end do 892 if (usepaw==1.and.usexcnhat==0) then 893 do ifft=1,nfft 894 electronpositron%e_xcdc=electronpositron%e_xcdc-vxcapn(ifft,1)*nhat(ifft,1) 895 end do 896 end if 897 electronpositron%e_xc =electronpositron%e_xc *ucvol/dble(nfftot) 898 electronpositron%e_xcdc=electronpositron%e_xcdc*ucvol/dble(nfftot) 899 strdiag=strdiag/dble(nfftot) 900 ABI_FREE(fxcapn) 901 ABI_FREE(rhop) 902 903 !Reduction in case of parallelism 904 if(mpi_enreg%paral_kgb==1)then 905 if(paral_kgb/=0)then 906 exc=electronpositron%e_xc;excdc=electronpositron%e_xcdc 907 call xmpi_sum(exc ,mpi_enreg%comm_fft,ierr) 908 call xmpi_sum(excdc,mpi_enreg%comm_fft,ierr) 909 electronpositron%e_xc=exc;electronpositron%e_xcdc=excdc 910 call xmpi_sum(strsxc,mpi_enreg%comm_fft,ierr) 911 end if 912 end if 913 914 !Store stress tensor 915 strsxc(1:3)=strdiag 916 strsxc(4:6)=zero 917 918 !Compute vxcavg 919 call mean_fftr(vxcapn(:,1),vxcavg_tmp,nfft,nfftot,1) 920 vxcavg=vxcavg_tmp(1) 921 922 end subroutine rhohxcpositron
m_electronpositron/destroy_electronpositron [ Functions ]
[ Top ] [ m_electronpositron ] [ Functions ]
NAME
destroy_electronpositron
FUNCTION
Clean and destroy electronpositron datastructure
SIDE EFFECTS
electronpositron=<type(electronpositron_type)>=electronpositron datastructure
SOURCE
355 subroutine destroy_electronpositron(electronpositron) 356 357 !Arguments ------------------------------------ 358 !scalars 359 type(electronpositron_type),pointer :: electronpositron 360 361 !************************************************************************ 362 363 !@electronpositron_type 364 365 if (associated(electronpositron)) then 366 367 if (allocated(electronpositron%cg_ep)) then 368 ABI_FREE(electronpositron%cg_ep) 369 end if 370 if (allocated(electronpositron%eigen_ep)) then 371 ABI_FREE(electronpositron%eigen_ep) 372 end if 373 if (allocated(electronpositron%occ_ep)) then 374 ABI_FREE(electronpositron%occ_ep) 375 end if 376 if (allocated(electronpositron%rhor_ep)) then 377 ABI_FREE(electronpositron%rhor_ep) 378 end if 379 if (allocated(electronpositron%nhat_ep)) then 380 ABI_FREE(electronpositron%nhat_ep) 381 end if 382 if (allocated(electronpositron%vha_ep)) then 383 ABI_FREE(electronpositron%vha_ep) 384 end if 385 if (allocated(electronpositron%lmselect_ep)) then 386 ABI_FREE(electronpositron%lmselect_ep) 387 end if 388 if (allocated(electronpositron%gred_ep)) then 389 ABI_FREE(electronpositron%gred_ep) 390 end if 391 if (allocated(electronpositron%stress_ep)) then 392 ABI_FREE(electronpositron%stress_ep) 393 end if 394 395 if (electronpositron%has_pawrhoij_ep/=0) then 396 call pawrhoij_free(electronpositron%pawrhoij_ep) 397 end if 398 if (allocated(electronpositron%pawrhoij_ep)) then 399 ABI_FREE(electronpositron%pawrhoij_ep) 400 end if 401 402 if (electronpositron%dimcprj/=0) then 403 call pawcprj_free(electronpositron%cprj_ep) 404 end if 405 if (allocated(electronpositron%cprj_ep)) then 406 ABI_FREE(electronpositron%cprj_ep) 407 end if 408 409 electronpositron%calctype =0 410 electronpositron%particle =-1 411 electronpositron%dimcg =0 412 electronpositron%dimcprj =0 413 electronpositron%dimeigen =0 414 electronpositron%dimocc =0 415 electronpositron%has_pawrhoij_ep=0 416 electronpositron%has_pos_ham =0 417 electronpositron%istep =0 418 electronpositron%istep_scf =0 419 420 electronpositron%posdensity0_limit=.false. 421 electronpositron%scf_converged=.false. 422 423 ABI_FREE(electronpositron) 424 425 end if 426 427 end subroutine destroy_electronpositron
m_electronpositron/electronpositron_calctype [ Functions ]
[ Top ] [ m_electronpositron ] [ Functions ]
NAME
electronpositron_calctype
FUNCTION
Returns the value of the calculation type from an electronpositron structure (can be eventually unassociated)
INPUTS
electronpositron=<type(electronpositron_type)>=electronpositron datastructure
SOURCE
730 integer function electronpositron_calctype(electronpositron) 731 732 !Arguments ------------------------------------ 733 !scalars 734 type(electronpositron_type),pointer :: electronpositron 735 736 !************************************************************************ 737 738 if (associated(electronpositron)) then 739 electronpositron_calctype=electronpositron%calctype 740 else 741 electronpositron_calctype=0 742 end if 743 744 745 end function electronpositron_calctype
m_electronpositron/electronpositron_type [ Types ]
[ Top ] [ m_electronpositron ] [ Types ]
NAME
FUNCTION
NOTES
SOURCE
63 type, public :: electronpositron_type 64 65 ! Integer scalars 66 integer :: calctype ! type of electron-positron calculation: 67 ! 0: no calculation 68 ! 1: positron in the electrons potential 69 ! 2: electrons in the positron potential 70 integer :: particle ! current particle stored in electronpositron%xxx_ep arrays 71 ! -1: no particle, 0: electron, 1: positron 72 integer :: dimcg ! Dimension of cg array dimcg=dtset%mpw*dtset%nspinor*dtset%mband*dtset%mkmem*dtset%nsppol 73 integer :: dimcprj ! Dimension of cprj array dimcprj=dtset%nspinor*dtset%mband*dtset%mkmem*dtset%nsppol*usecprj 74 integer :: dimeigen ! Dimension of eigen array dimeigen=dtset%mband*dtset%nkpt*dtset%nsppol 75 integer :: dimocc ! Dimension of occ array dimocc=dtset%mband*dtset%nkpt*dtset%nsppol 76 integer :: has_pawrhoij_ep ! flag for pawrhoij_ep (0: not allocated, 1: allocated, 2: computed) 77 integer :: has_pos_ham ! flag: 1 if current Hamiltonian in memory (vtrial, vpsp, vhartr, vxc, paw_ij%dij) 78 ! is the positronic hamiltonian, 0 is it is the electronic one 79 integer :: ixcpositron ! XC type for electron-positron correlation 80 integer :: istep ! Current index of TC-DFT SCF step 81 integer :: istep_scf ! Current index of DFT SCF step in current electron/positron minimization 82 integer :: lmmax ! Max. number of (l,m) moments over all types of atom 83 integer :: natom ! Number of atoms 84 integer :: nfft ! Number of points in FFT grid 85 integer :: nspden ! Number of spin density components 86 integer :: nstep ! Max. number of steps for the TC-DFT SCF cycle 87 88 ! Logical scalars 89 logical :: posdensity0_limit ! True if we are in the zero positron density limit 90 logical :: scf_converged ! True if the SCF cycle is converged for a positronic/electronic GS calculation 91 92 ! Real(dp) scalars 93 real(dp) :: e_hartree ! Hartree electron-positron interaction energy 94 real(dp) :: e_xc ! XC electron-positron interaction energy 95 real(dp) :: e_xcdc ! Double-counting XC electron-positron interaction energy 96 real(dp) :: e_paw ! PAW electron-positron interaction energy 97 real(dp) :: e_pawdc ! Double-counting PAW electron-positron interaction energy 98 real(dp) :: e0 ! Energy only due to particle(s) currently evolving 99 ! calctype=1, energy due to positron only 100 ! calctype=2, energy due to electrons only 101 real(dp) :: etotal_prev ! Total energy of the previous GS calculation 102 real(dp) :: lambda ! Electron-positron annihilation rate 103 real(dp) :: lifetime ! Positron lifetime 104 real(dp) :: maxfor_prev ! Max. force of the previous GS calculation 105 real(dp) :: posocc ! Occupation number for the positron 106 real(dp) :: postoldfe ! Tolerance on total energy for the TC-DFT SCF cycle 107 real(dp) :: postoldff ! Tolerance on max. force for the TC-DFT SCF cycle 108 109 ! Other scalars 110 type(energies_type) :: energies_ep ! Energies of the previous electronic/positronic SCF step 111 112 ! Logical pointers 113 logical, allocatable :: lmselect_ep(:,:) 114 ! lmselect_ep(lmmax,my_natom) 115 ! flags selecting the non-zero LM-moments of on-site densities 116 117 ! Real(dp) pointers 118 real(dp), allocatable :: cg_ep(:,:) 119 ! cg_ep(2,dimcg) 120 ! if typecalc=1: electronic wavefunctions 121 ! if typecalc=2: positronic wavefunctions 122 123 real(dp), allocatable :: eigen_ep(:) 124 ! eigen(dimeigen) 125 ! if typecalc=1: electronic eigen energies 126 ! if typecalc=2: positronic eigen energies 127 128 real(dp), allocatable :: gred_ep(:,:) 129 ! gred_ep(3,natom) 130 ! if typecalc=1: forces only due to electrons 131 ! if typecalc=2: forces only due to positron 132 133 real(dp), allocatable :: nhat_ep(:,:) 134 ! nhat_ep(nfft,nspden) 135 ! if typecalc=1: electronic compensation charge density in real space 136 ! if typecalc=2: positronic compensation charge density in real space 137 138 real(dp), allocatable :: occ_ep(:) 139 ! occ(dimocc) 140 ! if typecalc=1: electronic occupations 141 ! if typecalc=2: positronic occupations 142 143 real(dp), allocatable :: rhor_ep(:,:) 144 ! rhor_ep(nfft,nspden) 145 ! if typecalc=1: electronic density in real space 146 ! if typecalc=2: positronic density in real space 147 148 real(dp), allocatable :: stress_ep(:) 149 ! stress_ep(6) 150 ! if typecalc=1: stresses only due to electrons 151 ! if typecalc=2: stresses only due to positron 152 153 real(dp), allocatable :: vha_ep(:) 154 ! vha_ep(nfft) 155 ! if typecalc=1: electronic Hartree potential 156 ! if typecalc=2: positronic Hartree potential 157 158 ! Other pointers 159 type(pawrhoij_type), allocatable :: pawrhoij_ep(:) 160 ! pawrhoij_ep(natom) 161 ! Relevant only if PAW 162 ! if typecalc=1: electronic PAW occupation matrix associated with rhor_ep 163 ! if typecalc=2: positronic PAW occupation matrix associated with rhor_ep 164 165 type(pawcprj_type), allocatable :: cprj_ep(:,:) 166 ! cprj_ep(natom,dimcprj) 167 ! Relevant only if PAW 168 ! if typecalc=1: electronic WF projected on nl projectors <p_i|Cnk> 169 ! if typecalc=2: positronic WF projected on nl projectors <p_i|Cnk> 170 171 end type electronpositron_type 172 173 ! public procedures 174 public :: init_electronpositron 175 public :: destroy_electronpositron 176 public :: exchange_electronpositron 177 public :: electronpositron_calctype 178 public :: rhohxcpositron 179 180 CONTAINS 181 182 !===========================================================
m_electronpositron/exchange_electronpositron [ Functions ]
[ Top ] [ m_electronpositron ] [ Functions ]
NAME
exchange_electronpositron
FUNCTION
Invert electron and positron quantities between an electronpositron datastructure and current evoving variables Example: exchange electronpositron%rhor_ep and rhor
INPUTS
dtset <type(dataset_type)>=all input variables for this dataset mpi_enreg=information about MPI parallelization my_natom=number of atoms treated by current proc nfft=(effective) number of FFT grid points (for this processor) ngfft(18)=contain all needed information about 3D FFT npwarr(nkpt)=number of planewaves in basis at this k point usecprj= 1 if cprj array is stored in memory
SIDE EFFECTS
cg(2,mcg)=wavefunctions cprj(natom,mcprj*usecprj)= wave functions projected with non-local projectors: cprj(n,k,i)=<p_i|Cnk> where p_i is a non-local projector. electronpositron=<type(electronpositron_type)>=electronpositron datastructure energies <type(energies_type)>=all part of total energy. eigen(mband*nkpt*nsppol)=array for holding eigenvalues (hartree) gred(3,natom)=gradients wrt nuclear positions in reduced coordinates mcg=size of wave-functions array (cg) =mpw*nspinor*mband*mkmem*nsppol mcprj=size of projected wave-functions array (cprj) =nspinor*mband*mkmem*nsppol occ(mband*nkpt*nsppol)=occupation number for each band at each k point paw_an(natom) <type(paw_an_type)>=paw arrays given on angular mesh pawrhoij(natom) <type(pawrhoij_type)>= paw rhoij occupancies and related data rhog(2,nfft)=Fourier transform of total electron/positron density rhor(nfft,nspden)=total electron/positron density (el/bohr**3) stress(6)=components of the stress tensor (hartree/bohr^3) for the vhartr(nfftf)=array for holding Hartree potential
SOURCE
470 subroutine exchange_electronpositron(cg,cprj,dtset,eigen,electronpositron,energies,gred,mcg,mcprj,& 471 & mpi_enreg,my_natom,nfft,ngfft,nhat,npwarr,occ,paw_an,pawrhoij,& 472 & rhog,rhor,stress,usecprj,vhartr) 473 474 !Arguments ------------------------------------ 475 !scalars 476 integer,intent(in) :: mcg,mcprj,my_natom,nfft,usecprj 477 type(dataset_type),intent(in) :: dtset 478 type(electronpositron_type),pointer :: electronpositron 479 type(energies_type),intent(inout) :: energies 480 type(MPI_type),intent(in) :: mpi_enreg 481 !arrays 482 integer,intent(in) :: ngfft(18),npwarr(dtset%nkpt) 483 real(dp),intent(inout) :: cg(2,mcg) 484 real(dp),intent(inout) :: eigen(dtset%mband*dtset%nkpt*dtset%nsppol) 485 real(dp),intent(inout) :: gred(3,dtset%natom),nhat(nfft,dtset%nspden) 486 real(dp),intent(inout) :: occ(dtset%mband*dtset%nkpt*dtset%nsppol) 487 real(dp), intent(inout) :: rhog(2,nfft),rhor(nfft,dtset%nspden) 488 real(dp),intent(inout) :: stress(6),vhartr(nfft) 489 type(pawcprj_type) :: cprj(dtset%natom,mcprj*usecprj) 490 type(paw_an_type),intent(inout) :: paw_an(my_natom*dtset%usepaw) 491 type(pawrhoij_type),intent(inout) :: pawrhoij(my_natom*dtset%usepaw) 492 493 !Local variables------------------------------- 494 !scalars 495 integer :: comm,iatom,ib,ibsp,icg,icgb,ifft,ii,ilm,ikpt 496 integer :: ispden,isppol,ispinor,me,my_nspinor,nband_k,npw_k,sz1,sz2,sz3 497 logical :: ltmp 498 real(dp) :: rtmp 499 type(energies_type) :: energies_tmp 500 !arrays 501 integer,allocatable :: nlmn(:),typ(:) 502 real(dp) :: ctmp(2) 503 type(pawcprj_type),allocatable :: cprj_tmp(:,:) 504 type(pawrhoij_type),allocatable :: pawrhoij_tmp(:) 505 506 !********************************************************************* 507 508 if (associated(electronpositron)) then 509 if (electronpositron%particle/=EP_NOTHING) then 510 511 ! Type of particle stored 512 if (electronpositron%particle==EP_ELECTRON) then 513 electronpositron%particle=EP_POSITRON 514 else if (electronpositron%particle==EP_POSITRON) then 515 electronpositron%particle=EP_ELECTRON 516 end if 517 518 ! Energies 519 ctmp(1)=energies%e_electronpositron 520 ! ctmp(2)=energies%edc_electronpositron 521 call energies_copy(electronpositron%energies_ep,energies_tmp) 522 call energies_copy(energies,electronpositron%energies_ep) 523 call energies_copy(energies_tmp,energies) 524 energies%e_electronpositron=ctmp(1) 525 ! energies%edc_electronpositron=ctmp(2) 526 energies%e0_electronpositron=electronpositron%e0 527 electronpositron%e0=electronpositron%energies_ep%e0_electronpositron 528 529 ! Density and PAW occupation matrix 530 do ispden=1,dtset%nspden 531 do ifft=1,nfft 532 rtmp=rhor(ifft,ispden) 533 rhor(ifft,ispden)=electronpositron%rhor_ep(ifft,ispden) 534 electronpositron%rhor_ep(ifft,ispden)=rtmp 535 end do 536 if (allocated(electronpositron%nhat_ep).and.size(nhat,2)>0) then 537 do ifft=1,nfft 538 rtmp=nhat(ifft,ispden) 539 nhat(ifft,ispden)=electronpositron%nhat_ep(ifft,ispden) 540 electronpositron%nhat_ep(ifft,ispden)=rtmp 541 end do 542 end if 543 end do 544 call fourdp(1,rhog,rhor,-1,mpi_enreg,nfft,1,ngfft,0) 545 if (dtset%usepaw==1.and.my_natom>0) then 546 if (electronpositron%has_pawrhoij_ep==1) then 547 ABI_MALLOC(pawrhoij_tmp,(my_natom)) 548 ABI_MALLOC(typ,(my_natom)) 549 ABI_MALLOC(nlmn,(my_natom)) 550 do iatom=1,my_natom 551 typ(iatom)=iatom 552 nlmn(iatom)=pawrhoij(iatom)%lmn_size 553 end do 554 ! Be careful: parallelism over atoms is ignored... 555 call pawrhoij_alloc(pawrhoij_tmp,pawrhoij(1)%cplex_rhoij,pawrhoij(1)%nspden,& 556 & pawrhoij(1)%nspinor,pawrhoij(1)%nsppol,typ, & 557 & lmnsize=nlmn,ngrhoij=pawrhoij(1)%ngrhoij,nlmnmix=pawrhoij(1)%lmnmix_sz,& 558 & qphase=pawrhoij(1)%qphase,use_rhoij_=pawrhoij(1)%use_rhoij_,& 559 & use_rhoijres=pawrhoij(1)%use_rhoijres) 560 ABI_FREE(typ) 561 ABI_FREE(nlmn) 562 call pawrhoij_copy(pawrhoij,pawrhoij_tmp) 563 call pawrhoij_copy(electronpositron%pawrhoij_ep,pawrhoij) 564 call pawrhoij_copy(pawrhoij_tmp,electronpositron%pawrhoij_ep) 565 if (pawrhoij_tmp(1)%ngrhoij>0.and.pawrhoij(1)%ngrhoij==0) then 566 do iatom=1,my_natom 567 sz1=pawrhoij_tmp(iatom)%ngrhoij 568 sz2=pawrhoij_tmp(iatom)%cplex_rhoij*pawrhoij_tmp(iatom)%qphase*pawrhoij_tmp(iatom)%lmn2_size 569 sz3=pawrhoij_tmp(iatom)%nspden 570 ABI_MALLOC(pawrhoij(iatom)%grhoij,(sz1,sz2,sz3)) 571 pawrhoij(iatom)%grhoij(:,:,:)=pawrhoij_tmp(iatom)%grhoij(:,:,:) 572 end do 573 end if 574 if (pawrhoij_tmp(1)%use_rhoijres>0.and.pawrhoij(1)%use_rhoijres==0) then 575 do iatom=1,my_natom 576 sz1=pawrhoij_tmp(iatom)%cplex_rhoij*pawrhoij_tmp(iatom)%qphase*pawrhoij_tmp(iatom)%lmn2_size 577 sz2=pawrhoij_tmp(iatom)%nspden 578 ABI_MALLOC(pawrhoij(iatom)%rhoijres,(sz1,sz2)) 579 pawrhoij(iatom)%rhoijres(:,:)=pawrhoij_tmp(iatom)%rhoijres(:,:) 580 end do 581 end if 582 if (pawrhoij_tmp(1)%use_rhoij_>0.and.pawrhoij(1)%use_rhoij_==0) then 583 do iatom=1,my_natom 584 sz1=pawrhoij_tmp(iatom)%cplex_rhoij*pawrhoij_tmp(iatom)%qphase*pawrhoij_tmp(iatom)%lmn2_size 585 sz2=pawrhoij_tmp(iatom)%nspden 586 ABI_MALLOC(pawrhoij(iatom)%rhoij_,(sz1,sz2)) 587 pawrhoij(iatom)%rhoij_(:,:)=pawrhoij_tmp(iatom)%rhoij_(:,:) 588 end do 589 end if 590 if (pawrhoij_tmp(1)%lmnmix_sz>0.and.pawrhoij(1)%lmnmix_sz==0) then 591 do iatom=1,my_natom 592 ABI_MALLOC(pawrhoij(iatom)%kpawmix,(pawrhoij_tmp(iatom)%lmnmix_sz)) 593 pawrhoij(iatom)%kpawmix(:)=pawrhoij_tmp(iatom)%kpawmix(:) 594 end do 595 end if 596 call pawrhoij_free(pawrhoij_tmp) 597 ABI_FREE(pawrhoij_tmp) 598 else 599 do iatom=1,my_natom 600 pawrhoij(iatom)%rhoijp=zero 601 end do 602 end if 603 end if 604 605 ! Hartree potential 606 do ifft=1,nfft 607 rtmp=vhartr(ifft) 608 vhartr(ifft)=electronpositron%vha_ep(ifft) 609 electronpositron%vha_ep(ifft)=rtmp 610 end do 611 612 ! PAW LM-moment selection flags 613 if (dtset%usepaw==1.and.my_natom>0) then 614 if (electronpositron%lmmax>0) then 615 do iatom=1,my_natom 616 do ilm=1,paw_an(iatom)%lm_size 617 ltmp=electronpositron%lmselect_ep(ilm,iatom) 618 electronpositron%lmselect_ep(ilm,iatom)=paw_an(iatom)%lmselect(ilm) 619 paw_an(iatom)%lmselect(ilm)=ltmp 620 end do 621 end do 622 else 623 do iatom=1,my_natom 624 paw_an(iatom)%lmselect(:)=.true. 625 end do 626 end if 627 end if 628 629 ! Wave-functions 630 if (electronpositron%dimcg>0) then 631 do ii=1,electronpositron%dimcg 632 ctmp(1:2)=electronpositron%cg_ep(1:2,ii) 633 electronpositron%cg_ep(1:2,ii)=cg(1:2,ii) 634 cg(1:2,ii)=ctmp(1:2) 635 end do 636 else 637 icg=0 638 my_nspinor=max(1,dtset%nspinor/mpi_enreg%nproc_spinor) 639 comm=mpi_enreg%comm_cell 640 me=xmpi_comm_rank(comm) 641 do isppol=1,dtset%nsppol 642 do ikpt=1,dtset%nkpt 643 npw_k=npwarr(ikpt);nband_k=dtset%nband(ikpt+(isppol-1)*dtset%nkpt) 644 if(proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,1,nband_k,isppol,me)) cycle 645 icgb=icg;ibsp=0 646 do ib=1,nband_k 647 cg(:,icgb+1:icgb+my_nspinor*npw_k)=zero 648 do ispinor=1,my_nspinor 649 ibsp=ibsp+1;if (ibsp<my_nspinor*npw_k) cg(1,icgb+ibsp)=one 650 end do 651 icgb=icgb+my_nspinor*npw_k 652 end do 653 if (dtset%mkmem/=0) icg=icg+my_nspinor*npw_k*nband_k 654 end do 655 end do 656 end if 657 if (dtset%usepaw==1) then 658 if(electronpositron%dimcprj>0) then 659 ABI_MALLOC(nlmn,(dtset%natom)) 660 ABI_MALLOC(cprj_tmp,(dtset%natom,electronpositron%dimcprj)) 661 do iatom=1,dtset%natom;nlmn(iatom)=cprj(iatom,1)%nlmn;end do 662 call pawcprj_alloc(cprj_tmp,cprj(1,1)%ncpgr,nlmn) 663 ABI_FREE(nlmn) 664 call pawcprj_copy(electronpositron%cprj_ep,cprj_tmp) 665 call pawcprj_copy(cprj,electronpositron%cprj_ep) 666 call pawcprj_copy(cprj_tmp,cprj) 667 call pawcprj_free(cprj_tmp) 668 ABI_FREE(cprj_tmp) 669 else 670 !TO BE ACTIVATED WHEN cprj IS PRESENT 671 ! call pawcprj_set_zero(cprj) 672 end if 673 end if 674 675 ! Eigenvalues 676 if (electronpositron%dimeigen>0) then 677 do ii=1,electronpositron%dimeigen 678 rtmp=eigen(ii) 679 eigen(ii)=electronpositron%eigen_ep(ii) 680 electronpositron%eigen_ep(ii)=rtmp 681 end do 682 else 683 eigen(:)=9.99999_dp 684 end if 685 686 ! Occupations 687 if (electronpositron%dimocc>0) then 688 do ii=1,electronpositron%dimocc 689 rtmp=occ(ii) 690 occ(ii)=electronpositron%occ_ep(ii) 691 electronpositron%occ_ep(ii)=rtmp 692 end do 693 else 694 occ(:)=9.99999_dp 695 end if 696 697 ! Forces 698 if (allocated(electronpositron%gred_ep)) then 699 do iatom=1,dtset%natom 700 electronpositron%gred_ep(1:3,iatom)=gred(1:3,iatom)-electronpositron%gred_ep(1:3,iatom) 701 end do 702 end if 703 704 ! Stresses 705 if (allocated(electronpositron%stress_ep)) then 706 electronpositron%stress_ep(1:6)=stress(1:6)-electronpositron%stress_ep(1:6) 707 end if 708 709 end if 710 end if 711 712 end subroutine exchange_electronpositron
m_electronpositron/init_electronpositron [ Functions ]
[ Top ] [ m_electronpositron ] [ Functions ]
NAME
init_electronpositron
FUNCTION
Init all scalars and pointers in the structure.
INPUTS
ireadwf=if 1, read the wavefunction dtset <type(dataset_type)>=all input variables for this dataset mpi_enreg=information about MPI parallelization nfft=(effective) number of FFT grid points (for this processor) pawrhoij(natom*usepaw) <type(pawrhoij_type)>= -PAW only- atomic occupancies pawtab(ntypat*usepaw) <type(pawtab_type)>=paw tabulated starting data
SIDE EFFECTS
electronpositron=<type(electronpositron_type)>=electronpositron datastructure
SOURCE
205 subroutine init_electronpositron(ireadwf,dtset,electronpositron,mpi_enreg,nfft,pawrhoij,pawtab) 206 207 !Arguments ------------------------------------ 208 !scalars 209 integer,intent(in) :: ireadwf,nfft 210 type(dataset_type),intent(in) :: dtset 211 type(electronpositron_type),pointer :: electronpositron 212 type(MPI_type),intent(in) :: mpi_enreg 213 !arrays 214 type(pawrhoij_type), intent(in) :: pawrhoij(mpi_enreg%my_natom*dtset%usepaw) 215 type(pawtab_type),intent(in) :: pawtab(dtset%ntypat*dtset%usepaw) 216 217 !Local variables------------------------------- 218 !scalars 219 integer :: ii,my_nspinor,ncpgr,optfor,optstr 220 logical,parameter :: include_nhat_in_gamma=.false. 221 !arrays 222 integer,allocatable :: nlmn(:) 223 224 !************************************************************************ 225 226 !@electronpositron_type 227 228 if (dtset%positron/=0) then 229 230 ABI_MALLOC(electronpositron,) 231 232 electronpositron%calctype=0 233 electronpositron%particle=-1 234 235 electronpositron%ixcpositron=dtset%ixcpositron 236 electronpositron%natom=dtset%natom 237 electronpositron%nfft=nfft 238 electronpositron%nspden=dtset%nspden 239 electronpositron%istep=0 240 electronpositron%istep_scf=0 241 242 electronpositron%posocc=dtset%posocc 243 electronpositron%nstep=dtset%posnstep 244 electronpositron%postoldfe=dtset%postoldfe 245 electronpositron%postoldff=dtset%postoldff 246 electronpositron%posdensity0_limit=(dtset%ixcpositron/=2) 247 electronpositron%scf_converged=.false. 248 electronpositron%has_pos_ham=0 249 250 call energies_init(electronpositron%energies_ep) 251 252 electronpositron%e_hartree =zero 253 electronpositron%e_xc =zero 254 electronpositron%e_xcdc =zero 255 electronpositron%e_paw =zero 256 electronpositron%e_pawdc =zero 257 electronpositron%e0 =zero 258 electronpositron%etotal_prev=zero 259 electronpositron%maxfor_prev=zero 260 261 electronpositron%lambda=zero 262 electronpositron%lifetime=zero 263 264 ABI_MALLOC(electronpositron%rhor_ep,(nfft,dtset%nspden)) 265 ABI_MALLOC(electronpositron%vha_ep,(nfft)) 266 ABI_MALLOC(electronpositron%pawrhoij_ep,(mpi_enreg%my_natom*dtset%usepaw)) 267 268 if (dtset%usepaw==1) then 269 electronpositron%has_pawrhoij_ep=1 270 if (mpi_enreg%my_natom>0) then 271 call pawrhoij_alloc(electronpositron%pawrhoij_ep,pawrhoij(1)%cplex_rhoij,pawrhoij(1)%nspden,& 272 & pawrhoij(1)%nspinor,pawrhoij(1)%nsppol,dtset%typat,& 273 & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom,& 274 & pawtab=pawtab,ngrhoij=pawrhoij(1)%ngrhoij,nlmnmix=pawrhoij(1)%lmnmix_sz,& 275 & qphase=pawrhoij(1)%qphase,use_rhoij_=pawrhoij(1)%use_rhoij_,& 276 & use_rhoijres=pawrhoij(1)%use_rhoijres) 277 end if 278 electronpositron%lmmax=0 279 do ii=1,dtset%ntypat 280 electronpositron%lmmax=max(electronpositron%lmmax,pawtab(ii)%lcut_size**2) 281 end do 282 ABI_MALLOC(electronpositron%lmselect_ep,(electronpositron%lmmax,mpi_enreg%my_natom)) 283 if (maxval(pawtab(1:dtset%ntypat)%usexcnhat)==0.or.(.not.include_nhat_in_gamma)) then 284 ABI_MALLOC(electronpositron%nhat_ep,(nfft,dtset%nspden)) 285 end if 286 else 287 electronpositron%has_pawrhoij_ep=0 288 electronpositron%lmmax=0 289 end if 290 291 if (dtset%positron<=-10.or.dtset%posdoppler>0) then 292 my_nspinor=max(1,dtset%nspinor/mpi_enreg%nproc_spinor) 293 electronpositron%dimcg=dtset%mpw*my_nspinor*dtset%mband*dtset%mkmem*dtset%nsppol 294 electronpositron%dimocc=dtset%mband*dtset%nkpt*dtset%nsppol 295 electronpositron%dimeigen=dtset%mband*dtset%nkpt*dtset%nsppol 296 ABI_MALLOC(electronpositron%cg_ep,(2,electronpositron%dimcg)) 297 ABI_MALLOC(electronpositron%eigen_ep,(electronpositron%dimeigen)) 298 ABI_MALLOC(electronpositron%occ_ep,(electronpositron%dimocc)) 299 electronpositron%dimcprj=0 300 ! if (.false.) then !TEMPORARY: will be activated later 301 if (dtset%usepaw==1.and.dtset%pawusecp>0.and.dtset%posdoppler>0) then 302 electronpositron%dimcprj=my_nspinor*dtset%mband*dtset%mkmem*dtset%nsppol 303 if (mpi_enreg%paral_kgb/=0) electronpositron%dimcprj=electronpositron%dimcprj/mpi_enreg%nproc_band 304 ABI_MALLOC(electronpositron%cprj_ep,(dtset%natom,electronpositron%dimcprj)) 305 ABI_MALLOC(nlmn,(dtset%natom)) 306 ncpgr=0 307 do ii=1,dtset%natom;nlmn(ii)=pawtab(dtset%typat(ii))%lmn_size;end do 308 call pawcprj_alloc(electronpositron%cprj_ep,ncpgr,nlmn) 309 ABI_FREE(nlmn) 310 else 311 ABI_MALLOC(electronpositron%cprj_ep,(dtset%natom,electronpositron%dimcprj)) 312 end if 313 else 314 electronpositron%dimcg =0 315 electronpositron%dimcprj =0 316 electronpositron%dimeigen=0 317 electronpositron%dimocc =0 318 end if 319 320 optfor=0;optstr=0 321 if ((dtset%optforces>0.or.dtset%ionmov/=0.or.abs(dtset%toldff)>tiny(0._dp))) optfor=1 322 if (dtset%optstress>0.and.dtset%iscf>0.and.(dtset%nstep>0.or.ireadwf==1)) optstr=1 323 324 if (optfor>0) then 325 ABI_MALLOC(electronpositron%gred_ep,(3,dtset%natom)) 326 electronpositron%gred_ep(:,:)=zero 327 end if 328 329 if (optstr>0) then 330 ABI_MALLOC(electronpositron%stress_ep,(6)) 331 electronpositron%stress_ep(:)=zero 332 end if 333 334 else !dtset%positron==0 335 nullify(electronpositron) 336 end if 337 338 end subroutine init_electronpositron