Branch data Line data Source code
1 : : !!****m* ABINIT/m_dfptnl_pert
2 : : !! NAME
3 : : !! m_dfptnl_pert
4 : : !!
5 : : !! FUNCTION
6 : : !!
7 : : !!
8 : : !! COPYRIGHT
9 : : !! Copyright (C) 2008-2026 ABINIT group ()
10 : : !! This file is distributed under the terms of the
11 : : !! GNU General Public License, see ~abinit/COPYING
12 : : !! or http://www.gnu.org/copyleft/gpl.txt .
13 : : !!
14 : : !! SOURCE
15 : :
16 : : #if defined HAVE_CONFIG_H
17 : : #include "config.h"
18 : : #endif
19 : :
20 : : #include "abi_common.h"
21 : :
22 : : module m_dfptnl_pert
23 : :
24 : : use defs_basis
25 : : use m_abicore
26 : : use m_wffile
27 : : use m_wfk
28 : : use m_xmpi
29 : : use m_hamiltonian
30 : : use m_errors
31 : : use m_rf2
32 : : use m_kg
33 : : use m_dtset
34 : : use m_dtfil
35 : :
36 : : use defs_datatypes, only : pseudopotential_type
37 : : use defs_abitypes, only : MPI_type
38 : : use m_cgtools, only : dotprod_g,sqnorm_g,dotprod_vn
39 : : use m_pawang, only : pawang_type
40 : : use m_pawfgrtab, only : pawfgrtab_type
41 : : use m_pawrad, only : pawrad_type
42 : : use m_pawtab, only : pawtab_type
43 : : use m_pawcprj, only : pawcprj_type, pawcprj_alloc, pawcprj_free
44 : : use m_paw_ij, only : paw_ij_type, paw_ij_init, paw_ij_free, paw_ij_nullify,paw_ij_reset_flags
45 : : use m_pawdij, only : pawdijfr
46 : : use m_pawfgr, only : pawfgr_type
47 : : use m_pawrhoij, only : pawrhoij_type, pawrhoij_alloc , pawrhoij_nullify, pawrhoij_free,&
48 : : & pawrhoij_init_unpacked, pawrhoij_mpisum_unpacked, pawrhoij_inquire_dim
49 : : use m_paw_an, only : paw_an_type
50 : : use m_paw_mkrho, only : pawmkrho
51 : : use m_paw_nhat, only : pawnhatfr
52 : : use m_paw_dfpt, only : pawdfptenergy
53 : : use m_paw_dfptnl, only : paw_dfptnl_accrhoij,paw_dfptnl_energy
54 : : use m_initylmg, only : initylmg
55 : : use m_mkffnl, only : mkffnl
56 : : use m_getghc, only : getgsc
57 : : use m_getgh1c, only : rf_transgrid_and_pack
58 : : use m_mpinfo, only : proc_distrb_cycle
59 : : use m_nonlop, only : nonlop
60 : : use m_fourier_interpol, only : transgrid
61 : : use m_cgprj, only : getcprj
62 : :
63 : : implicit none
64 : :
65 : : private
66 : : !!***
67 : :
68 : : public :: dfptnl_pert
69 : : public :: dfptnl_exc3
70 : : !!***
71 : :
72 : : contains
73 : : !!***
74 : :
75 : : !!****f* ABINIT/dfptnl_pert
76 : : !! NAME
77 : : !! dfptnl_pert
78 : : !!
79 : : !! FUNCTION
80 : : !! Compute the linear response part to the 3dte. The main inputs are :
81 : : !! - GS WFs and Hamiltonian (cg,gs_hamkq)
82 : : !! - 1st-order WFs for three perturbations i1pert/i1dir,i2pert/i2dir,i3pert/i3dir (cg1,cg2,cg3)
83 : : !! - 1st-order potentials for i2pert (vhartr1_i2pert,vtrial1_i2pert,vxc1_i2pert)
84 : : !! - 1st-order WFs DDK,DDE and 2nd-order WF DKDE (ddk_f)
85 : : !!
86 : : !! COPYRIGHT
87 : : !! Copyright (C) 2018-2026 ABINIT group (LB)
88 : : !! This file is distributed under the terms of the
89 : : !! GNU General Public License, see ~abinit/COPYING
90 : : !! or http://www.gnu.org/copyleft/gpl.txt .
91 : : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
92 : : !!
93 : : !! INPUTS
94 : : !! atindx(natom)=index table for atoms (see gstate.f)
95 : : !! cg(2,mpw*nspinor*mband*mkmem_rbz*nsppol) = array for planewave
96 : : !! coefficients of wavefunctions
97 : : !! cg1 = first derivative of cg with respect the perturbation i1pert
98 : : !! cg2 = first derivative of cg with respect the perturbation i2pert
99 : : !! cg3 = first derivative of cg with respect the perturbation i3pert
100 : : !! cplex= if 1, real space 1-order functions on FFT grid are REAL,
101 : : !! if 2, COMPLEX
102 : : !! dtfil <type(datafiles_type)>=variables related to files
103 : : !! dtset <type(dataset_type)>=all input variables for this dataset
104 : : !! eigen0(mband*nkpt_rbz*nsppol)=GS eigenvalues at k (hartree)
105 : : !! gs_hamkq <type(gs_hamiltonian_type)>=all data for the Hamiltonian at k+q
106 : : !! k3xc(nfftf,nk3xc)=third-order exchange-correlation kernel
107 : : !! indsy1(4,nsym1,natom)=indirect indexing array for atom labels
108 : : !! i1dir,i2dir,i3dir=directions of the corresponding perturbations
109 : : !! i1pert,i2pert,i3pert = type of perturbation that has to be computed
110 : : !! kg(3,mpw*mkmem_rbz)=reduced planewave coordinates
111 : : !! mband = maximum number of bands
112 : : !! mgfft=maximum size of 1D FFTs
113 : : !! mkmem_rbz = maximum number of k points which can fit in core memory
114 : : !! mk1mem = maximum number of k points for first-order WF
115 : : !! which can fit in core memory
116 : : !! mpert =maximum number of ipert
117 : : !! mpi_enreg=MPI-parallelisation information
118 : : !! mpsang= 1+maximum angular momentum for nonlocal pseudopotentials
119 : : !! mpw = maximum number of planewaves in basis sphere (large number)
120 : : !! natom = number of atoms in unit cell
121 : : !! nattyp(ntypat)= # atoms of each type.
122 : : !! nfftf=(effective) number of FFT grid points (for this proc) for the "fine" grid (see NOTES in respfn.F90)
123 : : !! nfftotf=total number of real space fine grid points
124 : : !! ngfftf(1:18)=integer array with FFT box dimensions and other for the "fine" grid (see NOTES in respfn.F90)
125 : : !! nkpt = number of k points
126 : : !! nk3xc=second dimension of the array k3xc
127 : : !! nspden = number of spin-density components
128 : : !! nspinor = number of spinorial components of the wavefunctions
129 : : !! nsppol = number of channels for spin-polarization (1 or 2)
130 : : !! nsym1=number of symmetry elements in space group consistent with the perturbation
131 : : !! npwarr(nkpt) = array holding npw for each k point
132 : : !! occ(mband*nkpt*nsppol) = occupation number for each band and k
133 : : !! pawang <type(pawang_type)>=paw angular mesh and related data
134 : : !! pawang1 <type(pawang_type)>=pawang datastructure containing only the symmetries preserving the perturbation
135 : : !! pawfgr <type(pawfgr_type)>=fine grid parameters and related data
136 : : !! pawfgrtab(natom*usepaw) <type(pawfgrtab_type)>=atomic data given on fine rectangular grid for the GS
137 : : !! pawrad(ntypat*usepaw) <type(pawrad_type)>=paw radial mesh and related data
138 : : !! pawtab(ntypat*usepaw) <type(pawtab_type)>=paw tabulated starting data
139 : : !! pawrhoij0(natom) <type(pawrhoij_type)>= paw rhoij occupancies and related data for the GS
140 : : !! pawrhoij1_i1pert(natom) <type(pawrhoij_type)>= 1st-order paw rhoij occupancies and related data (i1pert)
141 : : !! pawrhoij1_i2pert(natom) <type(pawrhoij_type)>= 1st-order paw rhoij occupancies and related data (i2pert)
142 : : !! pawrhoij1_i3pert(natom) <type(pawrhoij_type)>= 1st-order paw rhoij occupancies and related data (i3pert)
143 : : !! paw_an0(natom) <type(paw_an_type)>=paw arrays for 0th-order quantities given on angular mesh
144 : : !! paw_an1_i2pert(natom) <type(paw_an_type)>=paw arrays for 1st-order quantities given on angular mesh (i2pert)
145 : : !! paw_ij1_i2pert(natom) <type(paw_ij_type)>=1st-order paw arrays given on (i,j) channels (i2pert)
146 : : !! ph1d(2,3*(2*mgfft+1)*natom)=one-dimensional structure factor information
147 : : !! psps <type(pseudopotential_type)> = variables related to pseudopotentials
148 : : !! rho1r1(cplex*nfftf,nspden)=RF electron density in electrons/bohr**3 (i1pert)
149 : : !! rho1r2(cplex*nfftf,nspden)=RF electron density in electrons/bohr**3 (i2pert)
150 : : !! rho1r3(cplex*nfftf,nspden)=RF electron density in electrons/bohr**3 (i3pert)
151 : : !! rprimd(3,3) = dimensional primitive translations (bohr)
152 : : !! symaf1(nsym)=(anti)ferromagnetic part of symmetry operations
153 : : !! symrc1(3,3,nsym)=symmetries of group in terms of operations on reciprocal space primitive translations
154 : : !! ucvol=volume of the unit cell
155 : : !! vtrial(nfftf,nspden)=GS Vtrial(r).
156 : : !! vhartr1_i2pert(cplex*nfftf,nspden)=firs-order hartree potential
157 : : !! vtrial1_i2pert(cplex*nfft,nspden)=firs-order local potential
158 : : !! vxc1_i2pert(cplex*nfft,nspden)=firs-order exchange-correlation potential
159 : : !! ddk_f = wf files
160 : : !! xccc3d1(cplex*n3xccc)=3D change in core charge density, see n3xccc (i1pert)
161 : : !! xccc3d2(cplex*n3xccc)=3D change in core charge density, see n3xccc (i2pert)
162 : : !! xccc3d3(cplex*n3xccc)=3D change in core charge density, see n3xccc (i3pert)
163 : : !! xred(3,natom) = reduced atomic coordinates
164 : : !!
165 : : !! OUTPUT
166 : : !! d3etot(2,3,mpert,3,mpert,3,mpert) = third derivatives of the energy tensor
167 : : !! = \sum_{i=1}^9 d3etot_i
168 : : !! d3etot_1(2,3,mpert,3,mpert,3,mpert) = 1st term of d3etot
169 : : !! d3etot_2(2,3,mpert,3,mpert,3,mpert) = 2nd term of d3etot
170 : : !! d3etot_3(2,3,mpert,3,mpert,3,mpert) = 3rd term of d3etot
171 : : !! d3etot_4(2,3,mpert,3,mpert,3,mpert) = 4th term of d3etot
172 : : !! d3etot_5(2,3,mpert,3,mpert,3,mpert) = 5th term of d3etot
173 : : !! d3etot_6(2,3,mpert,3,mpert,3,mpert) = 6th term of d3etot
174 : : !! d3etot_7(2,3,mpert,3,mpert,3,mpert) = 7th term of d3etot
175 : : !! d3etot_8(2,3,mpert,3,mpert,3,mpert) = 8th term of d3etot
176 : : !! d3etot_9(2,3,mpert,3,mpert,3,mpert) = 9th term of d3etot
177 : : !!
178 : : !! SIDE EFFECTS
179 : : !! TO DO!
180 : : !!
181 : : !! SOURCE
182 : :
183 : 291 : subroutine dfptnl_pert(atindx,cg,cg1,cg2,cg3,cplex,dtfil,dtset,d3etot,eigen0,gs_hamkq,k3xc,indsy1,i1dir,i2dir,i3dir,&
184 : 291 : & i1pert,i2pert,i3pert,kg,mband,mgfft,mkmem_rbz,mk1mem,mpert,mpi_enreg,mpsang,mpw,natom,nattyp,nfftf,nfftotf,ngfftf,nkpt,nk3xc,&
185 : 291 : & nspden,nspinor,nsppol,nsym1,npwarr,occ,pawang,pawang1,pawfgr,pawfgrtab,pawrad,pawtab,&
186 : 291 : & pawrhoij0,pawrhoij1_i1pert,pawrhoij1_i2pert,pawrhoij1_i3pert,&
187 : 291 : & paw_an0,paw_an1_i2pert,paw_ij1_i2pert,ph1d,psps,rho1r1,rho2r1,rho3r1,rprimd,symaf1,symrc1,&
188 : 291 : & ucvol,vtrial,vhartr1_i2pert,vtrial1_i2pert,vxc1_i2pert,ddk_f,xccc3d1,xccc3d2,xccc3d3,xred,&
189 : 291 : & d3etot_1,d3etot_2,d3etot_3,d3etot_4,d3etot_5,d3etot_6,d3etot_7,d3etot_8,d3etot_9)
190 : :
191 : : !Arguments ------------------------------------
192 : : !scalars
193 : : integer,intent(in) :: cplex,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert,mband,mgfft
194 : : integer,intent(in) :: mk1mem,mkmem_rbz,mpert,mpsang,mpw,natom,nfftf,nfftotf,nkpt,nspden,nsym1
195 : : integer,intent(in) :: nk3xc,nspinor,nsppol
196 : : real(dp),intent(in) :: ucvol
197 : : type(MPI_type),intent(inout) :: mpi_enreg
198 : : type(datafiles_type),intent(in) :: dtfil
199 : : type(dataset_type),intent(in) :: dtset
200 : : type(pseudopotential_type),intent(in) :: psps
201 : : type(gs_hamiltonian_type),intent(inout) :: gs_hamkq
202 : : type(pawang_type),intent(inout) :: pawang,pawang1
203 : : type(pawfgr_type),intent(in) :: pawfgr
204 : : type(wfk_t),intent(inout) :: ddk_f(5)
205 : :
206 : : !arrays
207 : : integer,intent(in) :: atindx(natom),kg(3,mpw*mkmem_rbz),nattyp(psps%ntypat),ngfftf(18),npwarr(nkpt)
208 : : integer,intent(in) :: indsy1(4,nsym1,dtset%natom),symaf1(nsym1),symrc1(3,3,nsym1)
209 : : real(dp),intent(in) :: cg(2,mpw*nspinor*mband*mkmem_rbz*nsppol)
210 : : real(dp),intent(in) :: cg1(2,mpw*nspinor*mband*mk1mem*nsppol)
211 : : real(dp),intent(in) :: cg2(2,mpw*nspinor*mband*mk1mem*nsppol)
212 : : real(dp),intent(in) :: cg3(2,mpw*nspinor*mband*mk1mem*nsppol)
213 : : real(dp),intent(in) :: eigen0(dtset%mband*dtset%nkpt*dtset%nsppol)
214 : : real(dp),intent(in) :: k3xc(nfftf,nk3xc)
215 : : real(dp),intent(in) :: occ(mband*nkpt*nsppol),ph1d(2,3*(2*mgfft+1)*natom)
216 : : real(dp),intent(in) :: rho1r1(cplex*nfftf,dtset%nspden),rho2r1(cplex*nfftf,dtset%nspden)
217 : : real(dp),intent(in) :: rho3r1(cplex*nfftf,dtset%nspden),rprimd(3,3)
218 : : real(dp),intent(in) :: vtrial(cplex*nfftf,nspden)
219 : : real(dp),intent(in) :: xccc3d1(cplex*nfftf),xccc3d2(cplex*nfftf),xccc3d3(cplex*nfftf),xred(3,natom)
220 : : real(dp),intent(in) :: vxc1_i2pert(cplex*nfftf,nspden),vhartr1_i2pert(cplex*nfftf)
221 : : real(dp),intent(inout) :: vtrial1_i2pert(cplex*nfftf,nspden),d3etot(2,3,mpert,3,mpert,3,mpert)
222 : : real(dp),intent(inout) :: d3etot_1(2,3,mpert,3,mpert,3,mpert)
223 : : real(dp),intent(inout) :: d3etot_2(2,3,mpert,3,mpert,3,mpert)
224 : : real(dp),intent(inout) :: d3etot_3(2,3,mpert,3,mpert,3,mpert)
225 : : real(dp),intent(inout) :: d3etot_4(2,3,mpert,3,mpert,3,mpert)
226 : : real(dp),intent(inout) :: d3etot_5(2,3,mpert,3,mpert,3,mpert)
227 : : real(dp),intent(inout) :: d3etot_6(2,3,mpert,3,mpert,3,mpert)
228 : : real(dp),intent(inout) :: d3etot_7(2,3,mpert,3,mpert,3,mpert)
229 : : real(dp),intent(inout) :: d3etot_8(2,3,mpert,3,mpert,3,mpert)
230 : : real(dp),intent(inout) :: d3etot_9(2,3,mpert,3,mpert,3,mpert)
231 : : type(pawfgrtab_type),intent(inout) :: pawfgrtab(natom*psps%usepaw)
232 : : type(pawrad_type),intent(inout) :: pawrad(psps%ntypat*psps%usepaw)
233 : : type(pawrhoij_type),intent(in) :: pawrhoij0(natom*psps%usepaw)
234 : : type(pawrhoij_type),intent(in),target :: pawrhoij1_i1pert(natom*psps%usepaw)
235 : : type(pawrhoij_type),intent(in) :: pawrhoij1_i2pert(natom*psps%usepaw)
236 : : type(pawrhoij_type),intent(in),target :: pawrhoij1_i3pert(natom*psps%usepaw)
237 : : type(pawtab_type),intent(inout) :: pawtab(psps%ntypat*psps%usepaw)
238 : : type(paw_an_type),intent(in) :: paw_an0(natom*psps%usepaw)
239 : : type(paw_an_type),intent(inout) :: paw_an1_i2pert(natom*psps%usepaw)
240 : : type(paw_ij_type),intent(inout) :: paw_ij1_i2pert(natom*psps%usepaw)
241 : :
242 : : !Local variables-------------------------------
243 : : !scalars
244 : : logical :: has_cprj_jband,compute_conjugate,compute_rho21
245 : : integer,parameter :: level=52,tim_nonlop=0
246 : : integer :: bandtot,choice,counter,cplex_cprj,cplex_loc,cplex_rhoij,cpopt,dimffnl1,iband,icg0,ider,ierr
247 : : integer :: idir0,idir_getgh2c,idir_phon,idir_elfd,ipert_phon,ipert_elfd
248 : : integer :: ia,iatm,ibg,ii,ikg,ikg1,ikpt,ilm,isppol,istwf_k,jband
249 : : integer :: me,n1,n2,n3,n4,n5,n6,nband_k,nkpg,nkpg1,nnlout,nsp,nspden_rhoij,npert_phon,npw_k,npw1_k,nzlmopt
250 : : integer :: offset_cgi,offset_cgj,offset_eig0,option,paw_opt,qphase_rhoij,debug_mode
251 : : integer :: signs,size_wf,size_cprj,spaceComm,typat_ipert_phon,usepaw,useylmgr1
252 : : real(dp) :: arg,dot1i,dot1r,dot2i,dot2r,doti,dotr,e3tot,lagi,lagi_paw,lagr,lagr_paw
253 : : real(dp) :: sumi,sum_psi1H1psi1,sum_psi1H1psi1_i
254 : : real(dp) :: sum_lambda1psi1psi1,sum_lambda1psi1psi1_i
255 : : real(dp) :: sum_psi0H2psi1a,sum_psi0H2psi1a_i,sum_psi0H2psi1b,sum_psi0H2psi1b_i
256 : : real(dp) :: sum_lambda1psi0S1psi1,sum_lambda1psi0S1psi1_i
257 : : character(len=1000) :: msg
258 : : !arrays
259 : 291 : integer,allocatable :: kg_k(:,:),kg1_k(:,:)
260 : 582 : real(dp) :: buffer(10),eHxc21_paw(2),eHxc21_nhat(2),exc3(2),exc3_paw(2),kpt(3),eig0_k(mband)
261 : : real(dp) :: enlout1(2),enlout2(2)
262 : : real(dp) :: rmet(3,3),wtk_k
263 : 291 : real(dp),allocatable :: cgi(:,:),cgj(:,:),cg_jband(:,:,:),cwavef1(:,:),cwavef2(:,:),cwavef3(:,:),dkinpw(:)
264 : 291 : real(dp),allocatable :: eig1_k_i2pert(:),eig1_k_stored(:)
265 : 291 : real(dp),allocatable :: chi_ij(:,:,:,:),cwave_right(:,:),cwave_left(:,:),dudk(:,:),dudkde(:,:),dummy_array(:),dummy_array2(:,:)
266 : 291 : real(dp),allocatable :: ffnl1(:,:,:,:),ffnl1_test(:,:,:,:)
267 : 291 : real(dp),allocatable :: h_cwave(:,:),iddk(:,:),kinpw1(:),kpg_k(:,:),kpg1_k(:,:),nhat21(:,:),occ_k(:)
268 : 291 : real(dp),allocatable :: phkxred(:,:),ph3d(:,:,:),s_cwave(:,:)
269 : 291 : real(dp),allocatable :: vlocal(:,:,:,:),vlocal1_i2pert(:,:,:,:),v_i2pert(:,:),wfraug(:,:,:,:)
270 : 291 : real(dp),allocatable :: ylm(:,:),ylm1(:,:),ylmgr(:,:,:),ylmgr1(:,:,:)
271 : 291 : real(dp),allocatable :: ylm_k(:,:),ylm1_k(:,:),ylmgr1_k(:,:,:)
272 : 291 : type(pawcprj_type),allocatable :: cwaveprj0(:,:),cwaveprj1(:,:)
273 : 291 : type(pawcprj_type),target :: cprj_empty(0,0)
274 : 291 : type(pawcprj_type),allocatable,target :: cprj_jband(:,:)
275 : 291 : type(pawrhoij_type),allocatable,target :: pawrhoij21(:)
276 : 291 : type(pawrhoij_type),pointer :: pawrhoij21_unsym(:),pawrhoij11(:)
277 : 291 : type(paw_ij_type),allocatable :: paw_ij_tmp(:)
278 : 291 : type(rf_hamiltonian_type) :: rf_hamkq_i2pert
279 : :
280 : : !***********************************************************************
281 : :
282 : : DBG_ENTER("COLL")
283 : :
284 : : ABI_UNUSED(dtfil%ireadwf)
285 : :
286 : :
287 : 291 : me = mpi_enreg%me
288 : 291 : spaceComm=mpi_enreg%comm_cell
289 : :
290 : 291 : npert_phon = 0
291 : 138 : if(i1pert<=natom) npert_phon = npert_phon + 1
292 [ + + ]: 291 : if(i2pert<=natom) npert_phon = npert_phon + 1
293 [ - + ]: 291 : if(i3pert<=natom) npert_phon = npert_phon + 1
294 [ - + ]: 291 : if (npert_phon>1) then
295 : 0 : ABI_ERROR("dfptnl_pert is available with at most one phonon perturbation. Change your input!")
296 : : end if
297 : :
298 : 291 : usepaw = psps%usepaw
299 : 291 : size_cprj = nspinor
300 : :
301 : 291 : call rf_hamkq_i2pert%init(cplex,gs_hamkq,i2pert,paw_ij1=paw_ij1_i2pert,has_e1kbsc=.true.)
302 : :
303 [ - + - + ]: 291 : ABI_MALLOC(dummy_array,(0))
304 [ - + - + ]: 291 : ABI_MALLOC(dummy_array2,(0,0))
305 : :
306 : : !Acivate computation of rho^(2:1) and related energy derivatives if needed
307 : 291 : compute_rho21 = .false.
308 [ + + + + : 291 : if (usepaw==1.and.npert_phon==1.and.(i1pert<=natom.or.i3pert<=natom)) then ! so i2pert==natom+2
- + ]
309 : 120 : compute_rho21 = .true.
310 [ + - ]: 120 : if (i1pert<=natom) then
311 : 120 : ipert_phon = i1pert
312 : 120 : idir_phon = i1dir
313 : 120 : ipert_elfd = i3pert
314 : 120 : idir_elfd = i3dir
315 : 120 : pawrhoij11 => pawrhoij1_i3pert
316 [ # # ]: 0 : else if (i3pert<=natom) then
317 : 0 : ipert_phon = i3pert
318 : 0 : idir_phon = i3dir
319 : 0 : ipert_elfd = i1pert
320 : 0 : idir_elfd = i1dir
321 : 0 : pawrhoij11 => pawrhoij1_i1pert
322 : : end if
323 [ - + + - : 600 : ABI_MALLOC(pawrhoij21,(natom))
+ - + - -
+ - + - +
+ + ]
324 : 120 : call pawrhoij_nullify(pawrhoij21)
325 : : call pawrhoij_inquire_dim(cplex_rhoij=cplex_rhoij,qphase_rhoij=qphase_rhoij,nspden_rhoij=nspden_rhoij,&
326 : 120 : & nspden=dtset%nspden,spnorb=dtset%pawspnorb,cplex=cplex,cpxocc=dtset%pawcpxocc)
327 : : call pawrhoij_alloc(pawrhoij21,cplex_rhoij,nspden_rhoij,nspinor,dtset%nsppol,dtset%typat,&
328 : 120 : & qphase=qphase_rhoij,pawtab=pawtab,comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab)
329 [ - + + - : 840 : ABI_MALLOC(cwaveprj0,(natom,size_cprj))
- + + - +
- + - - +
- + + + +
+ ]
330 [ - + + - : 720 : ABI_MALLOC(cwaveprj1,(natom,size_cprj))
- + + - -
+ - + + +
+ + ]
331 : 120 : call pawcprj_alloc(cwaveprj0,1,gs_hamkq%dimcprj)
332 : 120 : call pawcprj_alloc(cwaveprj1,1,gs_hamkq%dimcprj)
333 : : ! if (paral_atom) then
334 : : ! ABI_MALLOC(pawrhoij1_unsym,(natom))
335 : : ! call pawrhoij_inquire_dim(cplex_rhoij=cplex_rhoij,qphase_rhoij=qphase_rhoij,nspden_rhoij=nspden_rhoij,&
336 : : !& nspden=dtset%nspden,spnorb=dtset%pawspnorb,cplex=cplex,cpxocc=dtset%pawcpxocc)
337 : : ! call pawrhoij_alloc(pawrhoij1_unsym,cplex_rhoij,nspden_rhoij,dtset%nspinor,&
338 : : !& dtset%nsppol,dtset%typat,qphase=qphase_rhoij,pawtab=pawtab,use_rhoijp=0,use_rhoij_=1)
339 : : ! else
340 : 120 : pawrhoij21_unsym => pawrhoij21
341 : 120 : call pawrhoij_init_unpacked(pawrhoij21_unsym)
342 : : ! end if
343 : : ! Compute phkxred :
344 [ - + + - : 360 : ABI_MALLOC(phkxred,(2,natom))
+ - + - -
+ - + ]
345 [ + + ]: 360 : do ia=1,natom
346 : 240 : iatm=min(atindx(ia),natom)
347 : 240 : arg=two_pi*(kpt(1)*xred(1,ia)+kpt(2)*xred(2,ia)+kpt(3)*xred(3,ia))
348 : 360 : phkxred(1,iatm)=cos(arg);phkxred(2,iatm)=sin(arg)
349 : : end do
350 [ - + + - : 600 : ABI_MALLOC(paw_ij_tmp,(natom))
+ - + - -
+ - + + +
+ - ]
351 : 120 : call paw_ij_nullify(paw_ij_tmp)
352 : 120 : cplex_loc=1;nsp=1 ! Force nsppol/nspden to 1 because Dij^(1) due to electric field is spin-independent
353 : : call paw_ij_init(paw_ij_tmp,cplex_loc,dtset%nspinor,nsp,nsp,dtset%pawspnorb,natom,psps%ntypat,&
354 : 120 : & dtset%typat,pawtab,has_dijfr=1,comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab)
355 : 120 : call paw_ij_reset_flags(paw_ij_tmp,all=.True.)
356 : : call pawdijfr(gs_hamkq%gprimd,idir_elfd,ipert_elfd,natom,natom,nfftf,ngfftf,nsp,nsp,psps%ntypat,&
357 : : & 1,paw_ij_tmp,pawang,pawfgrtab,pawrad,pawtab,cplex_loc,&
358 : : & (/zero,zero,zero/),rprimd,ucvol,dummy_array2,dummy_array2,dummy_array2,xred,&
359 : 120 : & comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab)
360 [ - + + - : 600 : ABI_MALLOC(chi_ij,(gs_hamkq%dimekb1,gs_hamkq%dimekb2,dtset%nspinor**2,cplex_loc))
- + + - -
+ + - + -
+ - - + -
+ ]
361 : 120 : call pawdij2e1kb(paw_ij_tmp,1,mpi_enreg%comm_atom,mpi_enreg%my_atmtab,e1kbfr=chi_ij)
362 : 120 : call paw_ij_free(paw_ij_tmp)
363 [ + - + + : 480 : ABI_FREE(paw_ij_tmp)
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + ]
364 : : else
365 [ - + ]: 171 : ABI_MALLOC(chi_ij,(0,0,0,0))
366 [ - + ]: 171 : ABI_MALLOC(phkxred,(0,0))
367 [ - + - + ]: 171 : ABI_MALLOC(pawrhoij21,(0))
368 : 171 : pawrhoij21_unsym => pawrhoij21
369 [ - + ]: 171 : ABI_MALLOC(cwaveprj0,(0,0))
370 [ - + ]: 171 : ABI_MALLOC(cwaveprj1,(0,0))
371 : : end if
372 : :
373 : 291 : nnlout = 0
374 : 291 : bandtot = 0
375 : 291 : icg0 = 0
376 : 291 : option = 2
377 : 291 : n1=dtset%ngfft(1) ; n2=dtset%ngfft(2) ; n3=dtset%ngfft(3)
378 : 291 : n4=dtset%ngfft(4) ; n5=dtset%ngfft(5) ; n6=dtset%ngfft(6)
379 : :
380 [ - + + - : 1746 : ABI_MALLOC(vlocal,(n4,n5,n6,gs_hamkq%nvloc))
- + + - -
+ + - - +
+ - + - +
- - + - +
- + ]
381 [ - + + - : 1746 : ABI_MALLOC(vlocal1_i2pert,(cplex*n4,n5,n6,gs_hamkq%nvloc))
- + + - -
+ + - - +
+ - + - +
- - + - +
- + ]
382 : :
383 [ - + + - : 1455 : ABI_MALLOC(wfraug,(2,n4,n5,n6))
- + + - -
+ + - + -
+ - - + -
+ ]
384 : :
385 [ + + + + : 11640 : rmet = MATMUL(TRANSPOSE(rprimd),rprimd)
+ + ]
386 : :
387 : 291 : sumi = zero
388 : :
389 : : !Set up the Ylm for each k point
390 [ - + + - : 1164 : ABI_MALLOC(ylm,(dtset%mpw*mkmem_rbz,psps%mpsang*psps%mpsang*psps%useylm))
+ + + - +
- + + - +
- + ]
391 [ - + + - : 1164 : ABI_MALLOC(ylmgr,(dtset%mpw*mkmem_rbz,9,psps%mpsang*psps%mpsang*psps%useylm))
+ + + - +
- + + - +
- + ]
392 [ + + ]: 291 : if (psps%useylm==1) then
393 : : option=2
394 : : call initylmg(gs_hamkq%gprimd,kg,dtset%kptns,mkmem_rbz,mpi_enreg,psps%mpsang,dtset%mpw,dtset%nband,&
395 : 246 : dtset%nkpt,npwarr,dtset%nsppol,option,rprimd,ylm,ylmgr)
396 : : end if
397 : :
398 : : !Set up the spherical harmonics (Ylm) at k+q
399 : 291 : useylmgr1=0; option=0
400 [ + + + - : 291 : if (psps%useylm==1.and. &
+ - + - +
- + + ]
401 : : & (i2pert==natom+1.or.i2pert==natom+3.or.i2pert==natom+4.or.(usepaw==1.and.i2pert==natom+2))) then
402 : 166 : useylmgr1=1; option=1
403 : : end if
404 [ - + + - : 873 : ABI_MALLOC(ylm1,(dtset%mpw*mkmem_rbz,psps%mpsang*psps%mpsang*psps%useylm))
+ + + - -
+ - + ]
405 [ - + + - : 1164 : ABI_MALLOC(ylmgr1,(dtset%mpw*mkmem_rbz,3,psps%mpsang*psps%mpsang*psps%useylm*useylmgr1))
+ + + - +
- + + - +
- + ]
406 : : !To change the following when q/=0
407 [ + + ]: 291 : if (psps%useylm==1) then
408 : : call initylmg(gs_hamkq%gprimd,kg,dtset%kptns,mkmem_rbz,mpi_enreg,psps%mpsang,dtset%mpw,dtset%nband,&
409 : 246 : dtset%nkpt,npwarr,dtset%nsppol,option,rprimd,ylm1,ylmgr1)
410 : : end if
411 : :
412 : 291 : debug_mode = 0
413 [ + + ]: 291 : if (dtset%nonlinear_info>3.or.dtset%nonlinear_info==2) debug_mode = 1
414 : :
415 : : !Real parts
416 : 291 : sum_psi1H1psi1 = zero
417 : 291 : sum_lambda1psi1psi1 = zero
418 : 291 : sum_lambda1psi0S1psi1 = zero
419 : 291 : sum_psi0H2psi1a = zero
420 : 291 : sum_psi0H2psi1b = zero
421 : : !Imaginary parts
422 : 291 : sum_psi1H1psi1_i = zero
423 : 291 : sum_lambda1psi1psi1_i = zero
424 : 291 : sum_lambda1psi0S1psi1_i = zero
425 : 291 : sum_psi0H2psi1a_i = zero
426 : 291 : sum_psi0H2psi1b_i = zero
427 : :
428 : 291 : compute_conjugate = .false.
429 : : !We have to compute < u^(ip1) | H^(ip2) | u^(ip3) >
430 : : !For some cases, we want to apply H^(ip2) on < u^(ip1) |, not on | u^(ip3) > (see below)
431 [ - + ]: 291 : if (i3pert<=natom) then ! As npert_phon<=1, this implies that i1pert=natom+2 and i2pert=natom+2
432 : 0 : compute_conjugate = .true.
433 : : end if
434 : :
435 : : !Loop over spins
436 [ + + ]: 828 : do isppol = 1, nsppol
437 : :
438 : : ! Set up local potential vlocal1 with proper dimensioning, from vtrial1
439 : : ! Same thing for vlocal from vtrial Also take into account the spin.
440 : : call rf_transgrid_and_pack(isppol,nspden,usepaw,cplex,nfftf,dtset%nfft,dtset%ngfft,&
441 : 537 : & gs_hamkq%nvloc,pawfgr,mpi_enreg,vtrial,vtrial1_i2pert,vlocal,vlocal1_i2pert)
442 : :
443 : : ! Continue to initialize the Hamiltonian
444 : 537 : call gs_hamkq%load_spin(isppol,vlocal=vlocal,with_nonlocal=.true.)
445 : 537 : call rf_hamkq_i2pert%load_spin(isppol,vlocal1=vlocal1_i2pert,with_nonlocal=.true.)
446 : :
447 : : ! Loop over k-points
448 : :
449 : 537 : ikg = 0
450 : 537 : ikg1 = 0
451 : :
452 [ + + ]: 12204 : do ikpt = 1, nkpt
453 : :
454 [ - + ]: 11376 : if (proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,1,mband,isppol,mpi_enreg%me)) then
455 : : cycle ! Skip the rest of the k-point loop
456 : : end if
457 : :
458 : 11376 : counter = 100*ikpt
459 : :
460 : 11376 : nband_k = dtset%nband(ikpt+(isppol-1)*nkpt)
461 : 11376 : npw_k = npwarr(ikpt)
462 : 11376 : npw1_k = npw_k ! To change for q/=0
463 : 11376 : istwf_k = dtset%istwfk(ikpt)
464 [ - + + - : 34128 : ABI_MALLOC(occ_k,(nband_k))
+ - + - -
+ - + ]
465 [ + + ]: 88368 : occ_k(:) = occ(1+bandtot:nband_k+bandtot)
466 : 11376 : wtk_k = dtset%wtk(ikpt)
467 : :
468 : 11376 : size_wf = nspinor*npw_k
469 : :
470 [ + + ]: 45504 : kpt(:) = dtset%kptns(:,ikpt)
471 : :
472 [ - + + - : 34128 : ABI_MALLOC(cwavef1,(2,npw_k*nspinor))
+ - + - -
+ - + ]
473 [ - + + - : 22752 : ABI_MALLOC(cwavef3,(2,npw_k*nspinor))
- + - + -
+ ]
474 [ + + ]: 11376 : if (compute_rho21) then
475 [ - + + - : 4032 : ABI_MALLOC(cwavef2,(2,npw_k*nspinor))
- + - + -
+ ]
476 : : end if
477 : :
478 [ - + + - : 34128 : ABI_MALLOC(kg_k,(3,npw_k))
+ - + - -
+ - + -
+ ]
479 [ - + + - : 22752 : ABI_MALLOC(kg1_k,(3,npw1_k))
- + - + -
+ ]
480 [ - + + - : 45504 : ABI_MALLOC(ylm_k,(npw_k,mpsang*mpsang*psps%useylm))
+ + + - +
- + + - +
- + ]
481 [ - + + - : 34128 : ABI_MALLOC(ylm1_k,(npw1_k,mpsang*mpsang*psps%useylm))
+ + + - -
+ - + -
+ ]
482 [ - + + - : 45504 : ABI_MALLOC(ylmgr1_k,(npw1_k,3,psps%mpsang*psps%mpsang*psps%useylm*useylmgr1))
+ + + - +
- + + - +
- + - + ]
483 : :
484 : : ! Get (k+G) wave vectors and associated spherical harmonics
485 [ + + + + ]: 3297408 : kg_k(:,1:npw_k) = kg(:,1+ikg:npw_k+ikg)
486 [ + + ]: 11376 : if (psps%useylm==1) then
487 [ + + ]: 20880 : do ilm=1,mpsang*mpsang
488 [ + + ]: 1595232 : ylm_k(1:npw_k,ilm)=ylm(1+ikg:npw_k+ikg,ilm)
489 : : end do
490 : : end if
491 : :
492 : : ! Get (k+q+G) wave vectors and associated spherical harmonics
493 [ + + + + ]: 3297408 : kg1_k(:,1:npw1_k)=kg(:,1+ikg1:npw1_k+ikg1) ! To change for q/=0
494 [ + + ]: 11376 : if (psps%useylm==1) then
495 [ + + ]: 20880 : do ilm=1,psps%mpsang*psps%mpsang
496 [ + + ]: 1595232 : ylm1_k(1:npw1_k,ilm)=ylm1(1+ikg1:npw1_k+ikg1,ilm)
497 : : end do
498 [ + + ]: 4176 : if (useylmgr1==1) then
499 [ + + ]: 14160 : do ilm=1,psps%mpsang*psps%mpsang
500 [ + + ]: 48144 : do ii=1,3
501 [ + + ]: 3248304 : ylmgr1_k(1:npw1_k,ii,ilm)=ylmgr1(1+ikg1:npw1_k+ikg1,ii,ilm)
502 : : end do
503 : : end do
504 : : end if
505 : : end if
506 : :
507 : : ! Compute (k+G) vectors
508 [ + - + + ]: 11376 : nkpg=0;if(i2pert>=1.and.i2pert<=natom) nkpg=3*dtset%nloalg(3)
509 [ - + + - : 45504 : ABI_MALLOC(kpg_k,(npw_k,nkpg))
+ + + - +
- + + - +
- + - + ]
510 [ + + ]: 11376 : if (nkpg>0) then
511 : 1344 : call mkkpg(kg_k,kpg_k,kpt,nkpg,npw_k)
512 : : end if
513 : :
514 : : ! Compute (k+q+G) vectors
515 [ + - + + ]: 11376 : nkpg1=0;if(i2pert>=1.and.i2pert<=natom) nkpg1=3*dtset%nloalg(3)
516 [ - + + - : 45504 : ABI_MALLOC(kpg1_k,(npw1_k,nkpg1))
+ + + - +
- + + - +
- + - + ]
517 [ + + ]: 11376 : if (nkpg1>0) then
518 : 1344 : call mkkpg(kg1_k,kpg1_k,kpt,nkpg1,npw1_k)
519 : : end if
520 : :
521 : : ! ===== Preparation of the non-local contributions
522 : :
523 : : ! Compute nonlocal form factors ffnl1 at (k+q+G)
524 : : !-- Atomic displacement perturbation
525 [ + + ]: 11376 : if (i2pert<=natom) then
526 : 3264 : ider=0;idir0=0
527 : : !-- Electric field perturbation
528 [ + - ]: 8112 : else if (i2pert==natom+2) then
529 [ + + ]: 8112 : if (psps%usepaw==1) then
530 : 2832 : ider=1;idir0=i2dir
531 : : else
532 : 5280 : ider=0;idir0=0
533 : : end if
534 : : end if
535 [ + + ]: 11376 : if (compute_rho21) then ! compute_rho21 implies i2pert==natom+2
536 : 2016 : ider=1; idir0=4
537 : : end if
538 : :
539 : : ! Compute nonlocal form factors ffnl1 at (k+q+G), for all atoms
540 : 11376 : dimffnl1=1+ider
541 [ + + + + ]: 11376 : if (ider==1.and.(idir0==0.or.idir0==4)) dimffnl1=2+2*psps%useylm
542 : : ! if (ider==2.and.idir0==4) dimffnl1=3+7*psps%useylm
543 [ - + + - : 68256 : ABI_MALLOC(ffnl1,(npw1_k,dimffnl1,psps%lmnmax,psps%ntypat))
- + + - -
+ + - - +
+ - + - +
- - + - +
- + ]
544 : : call mkffnl(psps%dimekb,dimffnl1,psps%ekb,ffnl1,psps%ffspl,gs_hamkq%gmet,gs_hamkq%gprimd,ider,idir0,&
545 : : & psps%indlmn,kg1_k,kpg1_k,kpt,psps%lmnmax,psps%lnmax,psps%mpsang,psps%mqgrid_ff,nkpg1,&
546 : 11376 : & npw1_k,psps%ntypat,psps%pspso,psps%qgrid_ff,rmet,psps%usepaw,psps%useylm,ylm1_k,ylmgr1_k)
547 : :
548 : : ! Compute nonlocal form factors ffnl1 at (k+q+G), for all atoms
549 [ + + ]: 11376 : if (compute_rho21.and.debug_mode/=0) then
550 [ - + + - : 4320 : ABI_MALLOC(ffnl1_test,(npw1_k,dimffnl1,psps%lmnmax,psps%ntypat))
- + + - -
+ + - - +
+ - - + -
+ - + ]
551 : 864 : idir0 = 0 ! for nonlop with signs = 1
552 : : call mkffnl(psps%dimekb,dimffnl1,psps%ekb,ffnl1_test,psps%ffspl,gs_hamkq%gmet,gs_hamkq%gprimd,ider,idir0,&
553 : : & psps%indlmn,kg1_k,kpg1_k,kpt,psps%lmnmax,psps%lnmax,psps%mpsang,psps%mqgrid_ff,nkpg1,&
554 : 864 : & npw1_k,psps%ntypat,psps%pspso,psps%qgrid_ff,rmet,psps%usepaw,psps%useylm,ylm1_k,ylmgr1_k)
555 : : end if
556 : :
557 : : ! ===== Preparation of the kinetic contributions
558 : :
559 : : ! Note that not all these arrays should be allocated in the general case when wtk_k vanishes
560 : :
561 : : ! Compute (1/2) (2 Pi)**2 (k+q+G)**2:
562 [ - + + - : 34128 : ABI_MALLOC(kinpw1,(npw1_k))
+ - + - -
+ - + -
+ ]
563 [ + + ]: 832884 : kinpw1(:)=zero
564 : 11376 : call mkkin(dtset%ecut,dtset%ecutsm,dtset%effmass_free,gs_hamkq%gmet,kg1_k,kinpw1,kpt,npw1_k,0,0)
565 : :
566 [ - + + - : 22752 : ABI_MALLOC(dkinpw,(npw_k)) ! 1st derivative (1st direction)
- + - + -
+ ]
567 [ + + ]: 832884 : dkinpw(:)=zero
568 : :
569 : : !===== Load the k/k+q dependent parts of the Hamiltonian
570 : :
571 : : ! Load k-dependent part in the Hamiltonian datastructure
572 [ - + + - : 45504 : ABI_MALLOC(ph3d,(2,npw_k,gs_hamkq%matblk))
- + + - +
- + - - +
- + - + ]
573 : : call gs_hamkq%load_k(kpt_k=kpt,npw_k=npw_k,istwf_k=istwf_k,kg_k=kg_k,kpg_k=kpg_k,&
574 : 11376 : & ph3d_k=ph3d,compute_ph3d=.true.,compute_gbound=.true.)
575 : : call gs_hamkq%load_k(ffnl_k=ffnl1,kpt_k=kpt,npw_k=npw1_k,istwf_k=istwf_k,&
576 : 11376 : & kinpw_k=kinpw1,kg_k=kg1_k,kpg_k=kpg1_k,compute_gbound=.true.)
577 : : ! end if
578 : :
579 : : ! Load k-dependent part in the 1st-order Hamiltonian datastructure
580 : 11376 : call rf_hamkq_i2pert%load_k(npw_k=npw_k,dkinpw_k=dkinpw)
581 : :
582 [ - + + - : 34128 : ABI_MALLOC_OR_DIE(dudk, (2,nband_k*size_wf), ierr)
+ - + - +
- - + -
+ ]
583 [ - + + - : 22752 : ABI_MALLOC_OR_DIE(dudkde,(2,nband_k*size_wf), ierr)
+ - - + -
+ ]
584 [ + - - + : 34128 : ABI_MALLOC_OR_DIE(eig1_k_i2pert,(2*nband_k), ierr)
+ - + - +
- + - - +
- + ]
585 [ + - - + : 34128 : ABI_MALLOC(eig1_k_stored,(2*nband_k**2))
+ - + - +
- - + -
+ ]
586 [ - + + - : 22752 : ABI_MALLOC(cgi,(2,size_wf))
- + - + -
+ ]
587 [ - + + - : 22752 : ABI_MALLOC(cwave_right,(2,size_wf))
- + - + -
+ ]
588 [ - + + - : 22752 : ABI_MALLOC(cwave_left,(2,size_wf))
- + - + ]
589 : :
590 : : ! **************************************************************************************************
591 : : ! Read dudk and dudkde
592 : : ! **************************************************************************************************
593 : :
594 [ + + ]: 88368 : do iband = 1,nband_k
595 [ + + ]: 88368 : if (occ_k(iband)>tol10) then
596 : :
597 : : ! Read dude file
598 : 45504 : call ddk_f(1)%read_bks(iband, ikpt, isppol, xmpio_single, cg_bks=cwave_right,eig1_bks=eig1_k_i2pert)
599 : : ! Copy eig1_k_i2pert in "eig1_k_stored"
600 [ + + ]: 661440 : eig1_k_stored(1+(iband-1)*2*nband_k:2*nband_k+(iband-1)*2*nband_k)=eig1_k_i2pert(:)
601 : :
602 [ + + ]: 45504 : if (i2pert==natom+2) then
603 : : ! Read dudk file
604 : 32448 : call ddk_f(2)%read_bks(iband, ikpt, isppol, xmpio_single, cg_bks=cwave_right,eig1_bks=eig1_k_i2pert)
605 : 32448 : offset_cgi = (iband-1)*size_wf+icg0
606 [ + + + + ]: 7001136 : cgi(:,:) = cg(:,1+offset_cgi:size_wf+offset_cgi)
607 : : ! Copy cwave_right in "dudk"
608 [ + + + + ]: 7001136 : dudk(:,1+(iband-1)*size_wf:iband*size_wf)=cwave_right(:,:)
609 : :
610 : : ! Read dudkde file
611 : 32448 : call ddk_f(3)%read_bks(iband, ikpt, isppol, xmpio_single, cg_bks=cwave_right,eig1_bks=eig1_k_i2pert)
612 : 32448 : offset_cgi = (iband-1)*size_wf+icg0
613 [ + + + + ]: 7001136 : cgi(:,:) = cg(:,1+offset_cgi:size_wf+offset_cgi)
614 : : ! Copy cwave_right in "dudkde"
615 [ + + + + ]: 7001136 : dudkde(:,1+(iband-1)*size_wf:iband*size_wf)=cwave_right(:,:)
616 : : end if
617 : :
618 : : end if
619 : : end do
620 : :
621 [ - + + - : 22752 : ABI_MALLOC(cgj,(2,size_wf))
- + - + ]
622 [ - + + - : 22752 : ABI_MALLOC(iddk,(2,size_wf))
- + - + -
+ ]
623 : :
624 : 11376 : offset_eig0 = mband*(ikpt-1+nkpt*(isppol-1))
625 [ + + ]: 88368 : eig0_k(:) = eigen0(1+offset_eig0:mband+offset_eig0)
626 : :
627 [ - + + - : 22752 : ABI_MALLOC_OR_DIE(h_cwave,(2,size_wf), ierr)
+ - - + -
+ ]
628 [ - + + - : 22752 : ABI_MALLOC_OR_DIE(s_cwave,(2,size_wf), ierr)
+ - + - -
+ + - -
+ ]
629 : :
630 : : ! Allocate work spaces when debug_mode is activated
631 : 11376 : has_cprj_jband=.false.
632 [ + + ]: 11376 : if (debug_mode/=0) then ! Only for test purposes
633 [ - + + - : 6912 : ABI_MALLOC(cg_jband,(2,size_wf*nband_k,2))
+ - + - +
- - + -
+ ]
634 [ + + + + ]: 5864832 : cg_jband(:,:,1) = cg(:,1+icg0:size_wf*nband_k+icg0)
635 [ + + ]: 1728 : if (i2pert==natom+2) then ! Note the multiplication by "i"
636 [ + + ]: 1304064 : cg_jband(1,:,2) = -dudk(2,1:size_wf*nband_k)
637 [ + + ]: 1304064 : cg_jband(2,:,2) = dudk(1,1:size_wf*nband_k)
638 : : end if
639 [ - + ]: 1728 : if (gs_hamkq%usepaw==1.and.gs_hamkq%usecprj==1) then
640 [ # # # # : 0 : ABI_MALLOC(cprj_jband,(natom,size_cprj*nband_k))
# # # # #
# # # # #
# # # # #
# # # ]
641 : 0 : has_cprj_jband=.true.
642 : : else
643 [ - + + - : 3456 : ABI_MALLOC(cprj_jband,(natom,0))
- + - + -
+ ]
644 : : end if
645 : : else
646 [ - + ]: 9648 : ABI_MALLOC(cg_jband,(2,0,2))
647 [ - + + - : 19296 : ABI_MALLOC(cprj_jband,(natom,0))
- + - + -
+ ]
648 : : end if
649 : :
650 : : ! Loop over bands
651 [ + + ]: 88368 : do jband = 1,nband_k
652 : : ! Skip bands not treated by current proc
653 [ + - ]: 76992 : if((mpi_enreg%proc_distrb(ikpt,jband,isppol)/=me)) cycle
654 : :
655 [ + + ]: 88368 : if (occ_k(jband)>tol10) then
656 : :
657 : : ! tol_test = tol8
658 : 45504 : offset_cgj = (jband-1)*size_wf+icg0
659 [ + + + + ]: 9903600 : cgj(:,:) = cg(:,1+offset_cgj:size_wf+offset_cgj)
660 : :
661 : : ! **************************************************************************************************
662 : : ! Compute < u^(1) | ( H^(1) - eps^(0) S^(1) ) | u^(1) >
663 : : ! **************************************************************************************************
664 : :
665 [ + + ]: 661440 : eig1_k_i2pert(:) = eig1_k_stored(1+(jband-1)*2*nband_k:jband*2*nband_k)
666 [ + + + + ]: 9903600 : cwavef1(:,:) = cg1(:,1+offset_cgj:size_wf+offset_cgj)
667 [ + + + + ]: 9903600 : cwavef3(:,:) = cg3(:,1+offset_cgj:size_wf+offset_cgj)
668 [ + + ]: 45504 : if (i2pert==natom+2) then ! Note the multiplication by i
669 [ + + ]: 2355344 : iddk(1,:) = -dudkde(2,1+(jband-1)*size_wf:jband*size_wf)
670 [ + + ]: 2355344 : iddk(2,:) = dudkde(1,1+(jband-1)*size_wf:jband*size_wf)
671 : : else
672 [ + + + + ]: 2902464 : iddk(:,:) = zero
673 : : end if
674 [ + + + + ]: 9903600 : cwave_right(:,:) = cwavef3(:,:)
675 [ + + + + ]: 9903600 : cwave_left(:,:) = cwavef1(:,:)
676 [ - + ]: 45504 : if (compute_conjugate) then
677 [ # # # # ]: 0 : cwave_right(:,:) = cwavef1(:,:)
678 [ # # # # ]: 0 : cwave_left(:,:) = cwavef3(:,:)
679 : : end if
680 : :
681 : : ! Compute : < u^(ip1) | ( H^(ip2) - eps^(0) S^(ip2) ) | u^(ip3) >
682 : : ! or : < u^(ip3) | ( H^(ip2) - eps^(0) S^(ip2) ) | u^(ip1) >
683 : : call rf2_apply_hamiltonian(cg_jband,cprj_jband,cwave_right,cprj_empty,h_cwave,s_cwave,eig0_k,eig1_k_i2pert,&
684 : : & jband,gs_hamkq,iddk,i2dir,i2pert,ikpt,isppol,mkmem_rbz,mpi_enreg,nband_k,nsppol,&
685 : 45504 : & debug_mode,dtset%prtvol,rf_hamkq_i2pert,size_cprj,size_wf)
686 : 45504 : call dotprod_g(dotr,doti,gs_hamkq%istwf_k,size_wf,2,cwave_left,h_cwave,mpi_enreg%me_g0,mpi_enreg%comm_spinorfft)
687 : :
688 [ + + + + ]: 45504 : if (usepaw==1.and.i2pert/=natom+2) then ! S^(1) is zero for ipert=natom+2
689 : 5376 : call dotprod_g(dot2r,dot2i,gs_hamkq%istwf_k,size_wf,2,cwave_left,s_cwave,mpi_enreg%me_g0,mpi_enreg%comm_spinorfft)
690 : 5376 : dotr = dotr - eig0_k(jband)*dot2r
691 : 5376 : doti = doti - eig0_k(jband)*dot2i
692 : : end if
693 [ - + ]: 45504 : if (compute_conjugate) doti = -doti
694 : :
695 : : ! **************************************************************************************************
696 : : ! Compute sum_i Lambda_ij^(1) < u_j^(1) | u_i^(1)>
697 : : ! **************************************************************************************************
698 : :
699 : : ! eig1_k_i2pert(:) = eig1_k_stored(1+(jband-1)*2*nband_k:jband*2*nband_k)
700 : 45504 : lagr = zero ; lagi = zero
701 : 45504 : lagr_paw = zero ; lagi_paw = zero
702 : :
703 [ + + ]: 353472 : do iband = 1, nband_k
704 [ + + ]: 353472 : if(occ_k(iband)>tol10) then
705 : :
706 : 182016 : offset_cgi = (iband-1)*size_wf+icg0
707 [ + + + + ]: 39614400 : cwavef3(:,:) = cg3(:,1+offset_cgi:size_wf+offset_cgi)
708 : :
709 [ + + ]: 182016 : if(debug_mode/=0) then
710 [ + + ]: 691200 : eig1_k_i2pert(:) = eig1_k_stored(1+(jband-1)*2*nband_k:jband*2*nband_k)
711 : : end if
712 : :
713 : : ! Get Lambda_ij^(1) = < u_i^(0) | H^(1) - eps^(0) S^(1) | u_j^(0) > (see dfpt_cgwf.F90)
714 : 182016 : dot1r = eig1_k_i2pert(2*iband-1)
715 : 182016 : dot1i = eig1_k_i2pert(2*iband )
716 : :
717 : : ! Compute < u_j^(1) | S^(0) | u_i^(1) >
718 [ + + ]: 182016 : if (usepaw==1) then
719 : 66816 : ibg = 0
720 : : call getgsc(cwavef3,cprj_empty,gs_hamkq,s_cwave,ibg,0,0,ikpt,isppol,&
721 : 66816 : & size_wf,size_cprj,size_wf,mpi_enreg,1,natom,-1,npw_k,nspinor,select_k=KPRIME_H_KPRIME)
722 : : else
723 [ + + + + ]: 20655360 : s_cwave(:,:) = cwavef3(:,:)
724 : : end if
725 : :
726 : 182016 : call dotprod_g(dot2r,dot2i,gs_hamkq%istwf_k,size_wf,2,cwavef1,s_cwave,mpi_enreg%me_g0, mpi_enreg%comm_spinorfft)
727 : 182016 : lagr = lagr + dot1r*dot2r - dot1i*dot2i
728 : 182016 : lagi = lagi + dot1r*dot2i + dot1i*dot2r
729 : :
730 : : ! Compute < u_j^(0) | S^(1) | u_i^(1) >
731 [ + + + + ]: 182016 : if (usepaw==1.and.i1pert<=natom) then ! S^(1) is zero for ipert=natom+2
732 : :
733 : 32256 : cpopt=-1+5*gs_hamkq%usecprj ; choice=2 ; signs=2 ; paw_opt=3
734 : : call nonlop(choice,cpopt,cprj_empty,dummy_array,gs_hamkq,i1dir,(/zero/),mpi_enreg,1,nnlout,&
735 : 32256 : & paw_opt,signs,s_cwave,tim_nonlop,cwavef3,dummy_array2,iatom_only=i1pert)
736 : 32256 : call dotprod_g(dot2r,dot2i,gs_hamkq%istwf_k,size_wf,2,cgj,s_cwave,mpi_enreg%me_g0, mpi_enreg%comm_spinorfft)
737 : 32256 : lagr_paw = lagr_paw + dot1r*dot2r - dot1i*dot2i
738 : 32256 : lagi_paw = lagi_paw + dot1r*dot2i + dot1i*dot2r
739 : :
740 : : end if
741 : :
742 : : ! Compute < u_j^(1) | S^(1) | u_i^(0) >
743 [ + + - + ]: 182016 : if (usepaw==1.and.i3pert<=natom) then ! S^(1) is zero for ipert=natom+2
744 : :
745 [ # # # # ]: 0 : cgi(:,:) = cg(:,1+offset_cgi:size_wf+offset_cgi)
746 : 0 : cpopt=-1+5*gs_hamkq%usecprj ; choice=2 ; signs=2 ; paw_opt=3
747 : : call nonlop(choice,cpopt,cprj_empty,dummy_array,gs_hamkq,i3dir,(/zero/),mpi_enreg,1,nnlout,&
748 : 0 : & paw_opt,signs,s_cwave,tim_nonlop,cgi,dummy_array2,iatom_only=i3pert)
749 : 0 : call dotprod_g(dot2r,dot2i,gs_hamkq%istwf_k,size_wf,2,cwavef1,s_cwave,mpi_enreg%me_g0, mpi_enreg%comm_spinorfft)
750 : 0 : lagr_paw = lagr_paw + dot1r*dot2r - dot1i*dot2i
751 : 0 : lagi_paw = lagi_paw + dot1r*dot2i + dot1i*dot2r
752 : :
753 : : end if
754 : :
755 : : end if
756 : : end do ! iband
757 : :
758 : : ! **************************************************************************************************
759 : : ! Sum all band_by_band contributions
760 : : ! **************************************************************************************************
761 : :
762 : : ! Real part
763 : 45504 : sum_psi1H1psi1 = sum_psi1H1psi1 + dtset%wtk(ikpt)*occ_k(jband)*dotr
764 : 45504 : sum_lambda1psi1psi1 = sum_lambda1psi1psi1 - dtset%wtk(ikpt)*occ_k(jband)*lagr
765 : 45504 : sum_lambda1psi0S1psi1 = sum_lambda1psi0S1psi1 - dtset%wtk(ikpt)*occ_k(jband)*lagr_paw
766 : :
767 : : ! Imaginary part
768 : 45504 : sum_psi1H1psi1_i = sum_psi1H1psi1_i + dtset%wtk(ikpt)*occ_k(jband)*doti
769 : 45504 : sum_lambda1psi1psi1_i = sum_lambda1psi1psi1_i - dtset%wtk(ikpt)*occ_k(jband)*lagi
770 : 45504 : sum_lambda1psi0S1psi1_i = sum_lambda1psi0S1psi1_i - dtset%wtk(ikpt)*occ_k(jband)*lagi_paw
771 : :
772 : : ! **************************************************************************************************
773 : : ! If compute_rho21 : accumulate rhoij and compute term with H_KV^(2)
774 : : ! **************************************************************************************************
775 : :
776 [ + + ]: 45504 : if (compute_rho21) then
777 : :
778 [ + - ]: 8064 : if (i1pert<=natom) then ! If true, i3pert==natom+2
779 [ + - + - : 2296224 : cwave_right = cg3(:,1+offset_cgj:size_wf+offset_cgj)
- + - - +
+ + + ]
780 [ # # ]: 0 : else if (i3pert<=natom) then ! If true, i1pert==natom+2
781 [ # # # # : 0 : cwave_right = cg1(:,1+offset_cgj:size_wf+offset_cgj)
# # # # #
# # # ]
782 : : end if
783 : 8064 : choice = 2
784 : 8064 : cpopt = 0
785 : : call getcprj(choice,cpopt,cgj,cwaveprj0,&
786 : : & ffnl1,idir_phon,psps%indlmn,gs_hamkq%istwf_k,kg_k,kpg_k,kpt,psps%lmnmax,&
787 : : & mgfft,mpi_enreg,1,natom,nattyp,dtset%ngfft,dtset%nloalg,&
788 : 8064 : & npw_k,nspinor,psps%ntypat,phkxred,ph1d,ph3d,ucvol,psps%useylm)
789 : : call getcprj(choice,cpopt,cwave_right,cwaveprj1,&
790 : : & ffnl1,idir_phon,psps%indlmn,gs_hamkq%istwf_k,kg_k,kpg_k,kpt,psps%lmnmax,&
791 : : & mgfft,mpi_enreg,1,natom,nattyp,dtset%ngfft,dtset%nloalg,&
792 : 8064 : & npw_k,nspinor,psps%ntypat,phkxred,ph1d,ph3d,ucvol,psps%useylm)
793 : :
794 [ - + ]: 8064 : cplex_cprj=2;if (gs_hamkq%istwf_k>1) cplex_cprj=1
795 : : call paw_dfptnl_accrhoij(atindx,cplex_cprj,cwaveprj0,cwaveprj0,cwaveprj1,cwaveprj1,i1pert,i3pert,isppol,natom,natom,&
796 [ - + ]: 8064 : & nspinor,occ_k(jband),pawrhoij21_unsym,wtk_k)
797 : : !& comm_atom=my_comm_atom,mpi_atmtab=my_atmtab)
798 : :
799 : : ! Compute < psi^(0) | H_KV^(pert1pert3) | psi^(pert2) > + < psi^(pert2) | H_KV^(pert1pert3) | psi^(0) >
800 [ + + + + ]: 2288160 : cwavef2(:,:) = cg2(:,1+offset_cgj:size_wf+offset_cgj)
801 : :
802 : : ! Read dkk file (for tests only)
803 [ + + ]: 8064 : if (debug_mode/=0) then
804 [ + + ]: 3456 : if(idir_elfd==i2dir) then
805 : 1152 : call ddk_f(2)%read_bks(jband, ikpt, isppol, xmpio_single, cg_bks=iddk)
806 : : else
807 : 2304 : call ddk_f(4)%read_bks(jband, ikpt, isppol, xmpio_single, cg_bks=iddk)
808 : : end if
809 [ + + ]: 329184 : cg_jband(1,1+size_wf*(jband-1):size_wf*jband,2) = -iddk(2,1:size_wf)
810 [ + + ]: 329184 : cg_jband(2,1+size_wf*(jband-1):size_wf*jband,2) = iddk(1,1:size_wf)
811 : : end if
812 : : ! Read dkde file
813 [ + + ]: 8064 : if(idir_elfd==i2dir) then
814 : 2688 : call ddk_f(3)%read_bks(jband, ikpt, isppol, xmpio_single, cg_bks=iddk)
815 : : else
816 : 5376 : call ddk_f(5)%read_bks(jband, ikpt, isppol, xmpio_single, cg_bks=iddk)
817 : : end if
818 [ + - + - : 2296224 : s_cwave = iddk
- + - - -
- - - + +
+ + ]
819 [ + + ]: 768096 : iddk(1,:) = -s_cwave(2,:)
820 [ + + ]: 768096 : iddk(2,:) = s_cwave(1,:)
821 : 8064 : call rf2_getidir(idir_phon,idir_elfd,idir_getgh2c)
822 : : call rf2_apply_hamiltonian(cg_jband,cprj_jband,cwavef2,cprj_empty,s_cwave,dummy_array2,eig0_k,eig1_k_i2pert,&
823 : : & jband,gs_hamkq,iddk,idir_getgh2c,ipert_phon+natom+11,ikpt,isppol,mkmem_rbz,mpi_enreg,nband_k,nsppol,&
824 : 8064 : & debug_mode,dtset%prtvol,rf_hamkq_i2pert,size_cprj,size_wf,enl=chi_ij,ffnl1=ffnl1,ffnl1_test=ffnl1_test)
825 : : call dotprod_g(enlout1(1),enlout1(2),gs_hamkq%istwf_k,npw_k*nspinor,2,cgj,s_cwave,&
826 : 8064 : & mpi_enreg%me_g0,mpi_enreg%comm_spinorfft)
827 : 8064 : sum_psi0H2psi1a = sum_psi0H2psi1a + half*dtset%wtk(ikpt)*occ_k(jband)*enlout1(1) ! be careful : factor 0.5
828 : 8064 : sum_psi0H2psi1a_i = sum_psi0H2psi1a_i + half*dtset%wtk(ikpt)*occ_k(jband)*enlout1(2) ! be careful : factor 0.5
829 : :
830 : : ! Read ddk file
831 [ + + ]: 8064 : if(idir_elfd==i2dir) then
832 : 2688 : call ddk_f(2)%read_bks(jband, ikpt, isppol, xmpio_single, cg_bks=iddk)
833 : : else
834 : 5376 : call ddk_f(4)%read_bks(jband, ikpt, isppol, xmpio_single, cg_bks=iddk)
835 : : end if
836 [ + - + - : 2296224 : s_cwave = iddk
- + - - -
- - - + +
+ + ]
837 [ + + ]: 768096 : iddk(1,:) = -s_cwave(2,:)
838 [ + + ]: 768096 : iddk(2,:) = s_cwave(1,:)
839 : : call rf2_apply_hamiltonian(cg_jband,cprj_jband,cgj,cprj_empty,s_cwave,dummy_array2,eig0_k,eig1_k_i2pert,&
840 : : & jband,gs_hamkq,iddk,idir_getgh2c,ipert_phon+natom+11,ikpt,isppol,mkmem_rbz,mpi_enreg,nband_k,nsppol,&
841 : 8064 : & debug_mode,dtset%prtvol,rf_hamkq_i2pert,size_cprj,size_wf,enl=chi_ij,ffnl1=ffnl1,ffnl1_test=ffnl1_test)
842 : : call dotprod_g(enlout2(1),enlout2(2),gs_hamkq%istwf_k,npw_k*nspinor,2,cwavef2,s_cwave,&
843 : 8064 : & mpi_enreg%me_g0,mpi_enreg%comm_spinorfft)
844 : 8064 : sum_psi0H2psi1b = sum_psi0H2psi1b + half*dtset%wtk(ikpt)*occ_k(jband)*enlout2(1) ! be careful : factor 0.5
845 : 8064 : sum_psi0H2psi1b_i = sum_psi0H2psi1b_i + half*dtset%wtk(ikpt)*occ_k(jband)*enlout2(2) ! be careful : factor 0.5
846 : :
847 : : end if ! end if compute_rho21
848 : :
849 : : end if
850 : : end do ! end loop over jband
851 : :
852 : : ! **************************************************************************************************
853 : : ! END OF BAND LOOP
854 : : ! **************************************************************************************************
855 : :
856 [ - + ]: 11376 : ABI_FREE(cgi)
857 [ - + ]: 11376 : ABI_FREE(cgj)
858 [ - + ]: 11376 : ABI_FREE(iddk)
859 [ - + ]: 11376 : ABI_FREE(h_cwave)
860 [ - + ]: 11376 : ABI_FREE(s_cwave)
861 : :
862 [ - + ]: 11376 : ABI_FREE(cwave_right)
863 [ - + ]: 11376 : ABI_FREE(cwave_left)
864 [ - + ]: 11376 : ABI_FREE(eig1_k_i2pert)
865 [ - + ]: 11376 : ABI_FREE(eig1_k_stored)
866 : :
867 : 11376 : bandtot = bandtot + nband_k
868 : 11376 : icg0 = icg0 + npw_k*nspinor*nband_k
869 : 11376 : ikg = ikg + npw_k
870 : 11376 : ikg1 = ikg1 + npw1_k
871 : :
872 [ - + ]: 11376 : ABI_FREE(cwavef1)
873 [ + + ]: 11376 : if (compute_rho21) then
874 [ - + ]: 2016 : ABI_FREE(cwavef2)
875 : : end if
876 [ - + ]: 11376 : ABI_FREE(cwavef3)
877 [ - + ]: 11376 : ABI_FREE(dkinpw)
878 [ - + ]: 11376 : ABI_FREE(kg_k)
879 [ - + ]: 11376 : ABI_FREE(kg1_k)
880 [ - + ]: 11376 : ABI_FREE(kinpw1)
881 [ - + ]: 11376 : ABI_FREE(dudk)
882 [ - + ]: 11376 : ABI_FREE(dudkde)
883 [ - + ]: 11376 : ABI_FREE(ylm_k)
884 [ - + ]: 11376 : ABI_FREE(ylm1_k)
885 [ - + ]: 11376 : ABI_FREE(ylmgr1_k)
886 [ - + ]: 11376 : ABI_FREE(ffnl1)
887 [ + + + + ]: 11376 : if (compute_rho21.and.debug_mode/=0) then
888 [ - + ]: 864 : ABI_FREE(ffnl1_test)
889 : : end if
890 [ - + ]: 11376 : ABI_FREE(kpg_k)
891 [ - + ]: 11376 : ABI_FREE(kpg1_k)
892 [ - + ]: 11376 : ABI_FREE(cg_jband)
893 [ - + ]: 11376 : ABI_FREE(occ_k)
894 [ - + ]: 11376 : ABI_FREE(ph3d)
895 [ - + ]: 11376 : if (has_cprj_jband) call pawcprj_free(cprj_jband)
896 [ + - - + : 11913 : ABI_FREE(cprj_jband)
- - - - -
+ ]
897 : :
898 : : end do ! end loop over k-points
899 : :
900 : : end do ! end loop over spins
901 : :
902 : 291 : call rf_hamkq_i2pert%free()
903 : :
904 : : ! **************************************************************************************************
905 : : ! GATHER BAND-BY-BAND AND XC CONTRIBUTIONS
906 : : ! **************************************************************************************************
907 : :
908 : : if (xmpi_paral == 1) then
909 : :
910 : : ! Real parts
911 : 291 : buffer(1) = sum_psi1H1psi1
912 : 291 : buffer(2) = sum_lambda1psi1psi1
913 : 291 : buffer(3) = sum_lambda1psi0S1psi1
914 : 291 : buffer(4) = sum_psi0H2psi1a
915 : 291 : buffer(5) = sum_psi0H2psi1b
916 : :
917 : : ! Imaginary parts
918 : 291 : buffer(6) = sum_psi1H1psi1_i
919 : 291 : buffer(7) = sum_lambda1psi1psi1_i
920 : 291 : buffer(8) = sum_lambda1psi0S1psi1_i
921 : 291 : buffer(9) = sum_psi0H2psi1a_i
922 : 291 : buffer(10) = sum_psi0H2psi1b_i
923 : :
924 : 291 : call xmpi_sum(buffer,spaceComm,ierr)
925 : :
926 : : ! Real parts
927 : 291 : sum_psi1H1psi1 = buffer(1)
928 : 291 : sum_lambda1psi1psi1 = buffer(2)
929 : 291 : sum_lambda1psi0S1psi1 = buffer(3)
930 : 291 : sum_psi0H2psi1a = buffer(4)
931 : 291 : sum_psi0H2psi1b = buffer(5)
932 : :
933 : : ! Imaginary parts
934 : 291 : sum_psi1H1psi1_i = buffer(6)
935 : 291 : sum_lambda1psi1psi1_i = buffer(7)
936 : 291 : sum_lambda1psi0S1psi1_i = buffer(8)
937 : 291 : sum_psi0H2psi1a_i = buffer(9)
938 : 291 : sum_psi0H2psi1b_i = buffer(10)
939 : :
940 : : ! Accumulate PAW occupancies
941 [ + + ]: 291 : if (compute_rho21) then
942 : 120 : call pawrhoij_mpisum_unpacked(pawrhoij21_unsym,spaceComm)
943 : : end if
944 : :
945 : : end if
946 : :
947 : : ! **************************************************************************************************
948 : : ! Compute E_xc^(3) (NOTE : E_H^(3) = 0)
949 : : ! **************************************************************************************************
950 : :
951 : 291 : call dfptnl_exc3(cplex,exc3,k3xc,mpi_enreg,nk3xc,nfftf,nfftotf,nspden,rho1r1,rho2r1,rho3r1,ucvol,xccc3d1,xccc3d2,xccc3d3)
952 : :
953 : 291 : exc3_paw = zero
954 [ + + ]: 291 : if (usepaw==1) then
955 : :
956 : : call paw_dfptnl_energy(exc3_paw,dtset%ixc,natom,natom,psps%ntypat,paw_an0,pawang,dtset%pawprtvol,pawrad,&
957 : 246 : & pawrhoij1_i1pert,pawrhoij1_i2pert,pawrhoij1_i3pert,pawtab,dtset%pawxcdev,mpi_enreg%my_atmtab,mpi_enreg%comm_atom)
958 : :
959 : : end if
960 : :
961 : : ! **************************************************************************************************
962 : : ! Compute E_Hxc^(2:1)
963 : : ! **************************************************************************************************
964 : :
965 : 291 : eHxc21_paw = zero
966 : 291 : eHxc21_nhat = zero
967 [ + + ]: 291 : if (compute_rho21) then
968 : :
969 [ - + ]: 120 : if (pawfgr%nfft/=nfftf) then
970 : 0 : write(msg,'(2(a,i10))') 'pawfgr%nfft/=nfftf : pawfgr%nfft=',pawfgr%nfft,' nfftf = ',nfftf
971 : 0 : ABI_ERROR(msg)
972 : : end if
973 : :
974 : : call pawnhatfr(0,idir_phon,ipert_phon,natom,dtset%natom,nspden,psps%ntypat,&
975 [ - + ]: 120 : & pawang,pawfgrtab,pawrhoij11,pawtab,rprimd)
976 : :
977 [ - + + - : 480 : ABI_MALLOC(nhat21,(cplex*nfftf,nspden))
- + + - +
- + - - +
- + ]
978 : : call pawmkrho(0,arg,cplex,gs_hamkq%gprimd,idir_phon,indsy1,ipert_phon,mpi_enreg,&
979 : : & natom,natom,nspden,nsym1,psps%ntypat,dtset%paral_kgb,pawang,pawfgr,pawfgrtab,&
980 : : & dtset%pawprtvol,pawrhoij21,pawrhoij21_unsym,pawtab,dtset%qptn,dummy_array2,dummy_array2,&
981 : : & dummy_array2,rprimd,symaf1,symrc1,dtset%typat,ucvol,dtset%usewvl,xred,&
982 : 120 : & pawang_sym=pawang1,pawnhat=nhat21,pawrhoij0=pawrhoij0)
983 : :
984 : : ! if (paral_atom) then
985 : : ! call pawrhoij_free(pawrhoij21_unsym)
986 : : ! ABI_FREE(pawrhoij21_unsym)
987 : : ! end if
988 : 120 : nzlmopt = 0
989 : : call pawdfptenergy(eHxc21_paw,i2pert,ipert_phon,dtset%ixc,natom,dtset%natom,dtset%ntypat,&
990 : : & nzlmopt,nzlmopt,paw_an0,paw_an1_i2pert,paw_ij1_i2pert,pawang,dtset%pawprtvol,&
991 : 120 : & pawrad,pawrhoij1_i2pert,pawrhoij21,pawtab,dtset%pawxcdev,dtset%xclevel)
992 : : !& mpi_atmtab=my_atmtab,comm_atom=my_comm_atom
993 : :
994 [ - + + - : 360 : ABI_MALLOC(v_i2pert,(cplex*nfftf,nspden))
- + + - -
+ - + ]
995 [ + + ]: 699960 : v_i2pert(:,1) = vhartr1_i2pert(:)
996 [ + + ]: 120 : if(nspden>1) then
997 [ + + ]: 664962 : v_i2pert(:,2) = vhartr1_i2pert(:)
998 : : end if
999 : :
1000 : 120 : typat_ipert_phon = dtset%typat(ipert_phon)
1001 [ + + ]: 120 : if (debug_mode/=0) then
1002 : 54 : write(msg,'(2(a,i6))') ' DFPTNL_PERT : pawtab(',typat_ipert_phon,')%usexcnhat = ',pawtab(ipert_phon)%usexcnhat
1003 : 54 : call wrtout(std_out,msg,'COLL')
1004 : : end if
1005 [ - + ]: 120 : if (pawtab(typat_ipert_phon)%usexcnhat>0) then
1006 [ # # # # ]: 0 : v_i2pert(:,:) = v_i2pert(:,:) + vxc1_i2pert(:,:)
1007 : : end if
1008 : :
1009 : : call dotprod_vn(cplex,nhat21,eHxc21_nhat(1),eHxc21_nhat(2),nfftf,nfftotf,nspden,2,v_i2pert,&
1010 : 120 : & ucvol,mpi_comm_sphgrid=mpi_enreg%comm_fft)
1011 : :
1012 [ - + ]: 120 : ABI_FREE(v_i2pert)
1013 [ - + ]: 120 : ABI_FREE(nhat21)
1014 : :
1015 : : end if
1016 : :
1017 : : ! **************************************************************************************************
1018 : : ! ALL TERMS HAVE BEEN COMPUTED
1019 : : ! **************************************************************************************************
1020 : :
1021 : : !Real part
1022 : 291 : e3tot = sum_psi1H1psi1 + sum_lambda1psi1psi1 + sum_lambda1psi0S1psi1 + sum_psi0H2psi1a + sum_psi0H2psi1b
1023 : 291 : e3tot = e3tot + half * (eHxc21_paw(1)+eHxc21_nhat(1)) + sixth * (exc3(1) + exc3_paw(1))
1024 : :
1025 : : !Imaginary part
1026 : 291 : sumi = sum_psi1H1psi1_i + sum_lambda1psi1psi1_i + sum_lambda1psi0S1psi1_i + sum_psi0H2psi1a_i + sum_psi0H2psi1b_i
1027 : 291 : sumi = sumi + half * (eHxc21_paw(2)+eHxc21_nhat(2)) + sixth * (exc3(2) + exc3_paw(2))
1028 : :
1029 : : !Real parts
1030 : 291 : d3etot(1,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = e3tot
1031 : 291 : d3etot_1(1,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = sum_psi1H1psi1
1032 : 291 : d3etot_2(1,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = sum_lambda1psi1psi1
1033 : 291 : d3etot_3(1,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = sum_lambda1psi0S1psi1
1034 : 291 : d3etot_4(1,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = sum_psi0H2psi1a
1035 : 291 : d3etot_5(1,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = sum_psi0H2psi1b
1036 : 291 : d3etot_6(1,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = half * eHxc21_paw(1)
1037 : 291 : d3etot_7(1,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = half * eHxc21_nhat(1)
1038 : 291 : d3etot_8(1,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = sixth * exc3(1)
1039 : 291 : d3etot_9(1,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = sixth * exc3_paw(1)
1040 : : !Imaginary parts
1041 : 291 : d3etot(2,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = sumi
1042 : 291 : d3etot_1(2,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = sum_psi1H1psi1_i
1043 : 291 : d3etot_2(2,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = sum_lambda1psi1psi1_i
1044 : 291 : d3etot_3(2,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = sum_lambda1psi0S1psi1_i
1045 : 291 : d3etot_4(2,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = sum_psi0H2psi1a_i
1046 : 291 : d3etot_5(2,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = sum_psi0H2psi1b_i
1047 : 291 : d3etot_6(2,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = half * eHxc21_paw(2)
1048 : 291 : d3etot_7(2,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = half * eHxc21_nhat(2)
1049 : 291 : d3etot_8(2,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = sixth * exc3(2)
1050 : 291 : d3etot_9(2,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = sixth * exc3_paw(2)
1051 : :
1052 : : !Before printing, set small contributions to zero
1053 : : !Real parts
1054 [ - + ]: 291 : if (abs(sum_psi1H1psi1) <tol8) sum_psi1H1psi1 = zero
1055 [ - + ]: 291 : if (abs(sum_lambda1psi1psi1) <tol8) sum_lambda1psi1psi1 = zero
1056 [ + + ]: 291 : if (abs(sum_lambda1psi0S1psi1)<tol8) sum_lambda1psi0S1psi1 = zero
1057 [ + + ]: 291 : if (abs(sum_psi0H2psi1a) <tol8) sum_psi0H2psi1a = zero
1058 [ + + ]: 291 : if (abs(sum_psi0H2psi1b) <tol8) sum_psi0H2psi1b = zero
1059 [ + + ]: 291 : if (abs(eHxc21_paw(1)) <tol8) eHxc21_paw(1) = zero
1060 [ + + ]: 291 : if (abs(eHxc21_nhat(1)) <tol8) eHxc21_nhat(1) = zero
1061 [ - + ]: 291 : if (abs(exc3(1)) <tol8) exc3(1) = zero
1062 [ + + ]: 291 : if (abs(exc3_paw(1)) <tol8) exc3_paw(1) = zero
1063 [ - + ]: 291 : if (abs(e3tot) <tol8) e3tot = zero
1064 : :
1065 : : !Imaginary parts
1066 [ + + ]: 291 : if (abs(sum_psi1H1psi1_i) <tol8) sum_psi1H1psi1_i = zero
1067 [ + + ]: 291 : if (abs(sum_lambda1psi1psi1_i) <tol8) sum_lambda1psi1psi1_i = zero
1068 [ + + ]: 291 : if (abs(sum_lambda1psi0S1psi1_i)<tol8) sum_lambda1psi0S1psi1_i = zero
1069 [ + + ]: 291 : if (abs(sum_psi0H2psi1a_i) <tol8) sum_psi0H2psi1a_i = zero
1070 [ + + ]: 291 : if (abs(sum_psi0H2psi1b_i) <tol8) sum_psi0H2psi1b_i = zero
1071 [ + - ]: 291 : if (abs(eHxc21_paw(2)) <tol8) eHxc21_paw(2) = zero
1072 [ + - ]: 291 : if (abs(eHxc21_nhat(2)) <tol8) eHxc21_nhat(2) = zero
1073 [ + - ]: 291 : if (abs(exc3(2)) <tol8) exc3(2) = zero
1074 [ + - ]: 291 : if (abs(exc3_paw(2)) <tol8) exc3_paw(2) = zero
1075 [ + + ]: 291 : if (abs(sumi) <tol8) sumi = zero
1076 : :
1077 : 291 : write(msg,'(2a,3(a,i2,a,i1))') ch10,'NONLINEAR : ',&
1078 : 582 : ' perts : ',i1pert,'.',i1dir,' / ',i2pert,'.',i2dir,' / ',i3pert,'.',i3dir
1079 : 291 : call wrtout(std_out,msg,'COLL')
1080 : 291 : call wrtout(ab_out,msg,'COLL')
1081 [ + + ]: 291 : if (dtset%nonlinear_info>0) then
1082 : : write(msg,'(10(a,2(a,f18.8)),a)') &
1083 : 108 : ch10,' sum_psi1H1psi1 = ',sum_psi1H1psi1, ',',sum_psi1H1psi1_i,&
1084 : 108 : ch10,' sum_lambda1psi1psi1 = ',sum_lambda1psi1psi1, ',',sum_lambda1psi1psi1_i,&
1085 : 108 : ch10,' sum_lambda1psi0S1psi1 = ',sum_lambda1psi0S1psi1, ',',sum_lambda1psi0S1psi1_i,&
1086 : 108 : ch10,' sum_psi0H2psi1a = ',sum_psi0H2psi1a, ',',sum_psi0H2psi1a_i,&
1087 : 108 : ch10,' sum_psi0H2psi1b = ',sum_psi0H2psi1b, ',',sum_psi0H2psi1b_i,&
1088 : 108 : ch10,' eHxc21_paw/2 = ',half*eHxc21_paw(1), ',',half*eHxc21_paw(2),&
1089 : 108 : ch10,' eHxc21_nhat/2 = ',half*eHxc21_nhat(1), ',',half*eHxc21_nhat(2),&
1090 : 108 : ch10,' exc3/6 = ',sixth*exc3(1), ',',sixth*exc3(2),&
1091 : 108 : ch10,' exc3_paw/6 = ',sixth*exc3_paw(1), ',',sixth*exc3_paw(2),&
1092 : 216 : ch10,' >>>>>>>>>>>>>>> e3tot = ',e3tot, ',',sumi,ch10
1093 : 108 : call wrtout(std_out,msg,'COLL')
1094 : 108 : call wrtout(ab_out,msg,'COLL')
1095 : : end if
1096 : :
1097 [ + + ]: 291 : if (compute_rho21) then
1098 : 120 : call pawcprj_free(cwaveprj0)
1099 : 120 : call pawcprj_free(cwaveprj1)
1100 : 120 : call pawrhoij_free(pawrhoij21)
1101 : : end if
1102 [ - + ]: 291 : ABI_FREE(chi_ij)
1103 [ - + ]: 291 : ABI_FREE(dummy_array)
1104 [ - + ]: 291 : ABI_FREE(dummy_array2)
1105 [ - + ]: 291 : ABI_FREE(phkxred)
1106 [ + - + + : 531 : ABI_FREE(cwaveprj0)
- + - + -
+ ]
1107 [ + - + + : 531 : ABI_FREE(cwaveprj1)
- + - + -
+ ]
1108 [ + - + + : 531 : ABI_FREE(pawrhoij21)
- + - + -
+ - + - +
- + - + ]
1109 [ - + ]: 291 : ABI_FREE(ylm)
1110 [ - + ]: 291 : ABI_FREE(ylm1)
1111 [ - + ]: 291 : ABI_FREE(ylmgr)
1112 [ - + ]: 291 : ABI_FREE(ylmgr1)
1113 [ - + ]: 291 : ABI_FREE(vlocal)
1114 [ - + ]: 291 : ABI_FREE(vlocal1_i2pert)
1115 [ - + ]: 291 : ABI_FREE(wfraug)
1116 : :
1117 : : DBG_EXIT("COLL")
1118 : :
1119 [ + + - + : 582 : end subroutine dfptnl_pert
- + - + -
+ - + - +
- + - + -
- - - - -
- - - - -
- - - - +
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
- - - - -
- + ]
1120 : : !!***
1121 : :
1122 : : !!****f* ABINIT/dfptnl_exc3
1123 : : !! NAME
1124 : : !! dfptnl_exc3
1125 : : !!
1126 : : !! FUNCTION
1127 : : !! Compute the third-order xc energy.
1128 : : !!
1129 : : !! Take into account the contribution of the term
1130 : : !!$
1131 : : !! \frac{d}{d \lambda}
1132 : : !! \frac{\delta^2 E_{Hxc}}{\delta n(r) \delta n(r\prim)}
1133 : : !!$
1134 : : !! (seventh term of Eq. (110) of X. Gonze, PRA 52, 1096 (1995) [[cite:Gonze1995]]).
1135 : : !!
1136 : : !! The following is essentially the 4th and the 3rd terms of PRB 71,125107 [[cite:Veithen2005]].
1137 : : !!
1138 : : !! However, we treat the nonlinear xc core correction in a slightly different way,
1139 : : !! in order to keep the symmetry between pert1,pert2 and pert3. It helps for debugging.
1140 : : !!
1141 : : !! Namely, here we consider Exc as a functional depending on the TOTAL density (core+valence),
1142 : : !! so it does not depend explicitely on the perturbation, and the term given above is always zero.
1143 : : !! The "lost" terms are recovered adding the derivative of the core densities for EVERY perturbations,
1144 : : !! and not only to 'pert2', as in the first case.
1145 : : !!
1146 : : !! COPYRIGHT
1147 : : !! Copyright (C) 2020-2026 ABINIT group (LB)
1148 : : !! This file is distributed under the terms of the
1149 : : !! GNU General Public License, see ~abinit/COPYING
1150 : : !! or http://www.gnu.org/copyleft/gpl.txt .
1151 : : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
1152 : : !!
1153 : : !! INPUTS
1154 : : !! cplex= if 1, real space 1-order functions on FFT grid are REAL,
1155 : : !! if 2, COMPLEX
1156 : : !! k3xc(nfftf,nk3xc)=third-order exchange-correlation kernel
1157 : : !! mpi_enreg=MPI-parallelisation information
1158 : : !! nk3xc=second dimension of the array k3xc
1159 : : !! nfftf=(effective) number of FFT grid points (for this proc) for the "fine" grid (see NOTES in respfn.F90)
1160 : : !! nfftotf=total number of real space fine grid points
1161 : : !! nspden = number of spin-density components
1162 : : !! rho1r1(cplex*nfftf,nspden)=RF electron density in electrons/bohr**3 (i1pert)
1163 : : !! rho1r2(cplex*nfftf,nspden)=RF electron density in electrons/bohr**3 (i2pert)
1164 : : !! rho1r3(cplex*nfftf,nspden)=RF electron density in electrons/bohr**3 (i3pert)
1165 : : !! ucvol=volume of the unit cell
1166 : : !! xccc3d1(cplex*n3xccc)=3D change in core charge density, see n3xccc (i1pert)
1167 : : !! xccc3d2(cplex*n3xccc)=3D change in core charge density, see n3xccc (i2pert)
1168 : : !! xccc3d3(cplex*n3xccc)=3D change in core charge density, see n3xccc (i3pert)
1169 : : !!
1170 : : !! OUTPUT
1171 : : !! exc3(2)=real and imaginray part of the exchange correlation energy term
1172 : : !!
1173 : : !! SIDE EFFECTS
1174 : : !!
1175 : : !! SOURCE
1176 : :
1177 : 698 : subroutine dfptnl_exc3(cplex,exc3,k3xc,mpi_enreg,nk3xc,nfftf,nfftotf,nspden,rho1r1,rho2r1,rho3r1,ucvol,xccc3d1,xccc3d2,xccc3d3)
1178 : :
1179 : : !Arguments ------------------------------------
1180 : : !scalars
1181 : : integer,intent(in) :: cplex,nk3xc,nfftf,nfftotf,nspden
1182 : : real(dp),intent(in) :: ucvol
1183 : : type(MPI_type),intent(inout) :: mpi_enreg
1184 : :
1185 : : !arrays
1186 : : real(dp),intent(in) :: k3xc(nfftf,nk3xc)
1187 : : real(dp),intent(in) :: rho1r1(cplex*nfftf,nspden),rho2r1(cplex*nfftf,nspden),rho3r1(cplex*nfftf,nspden)
1188 : : real(dp),intent(in) :: xccc3d1(cplex*nfftf),xccc3d2(cplex*nfftf),xccc3d3(cplex*nfftf)
1189 : : real(dp),intent(out) :: exc3(2)
1190 : :
1191 : : !Local variables-------------------------------
1192 : : !scalars
1193 : : integer :: ifft,ifft_im,ifft_re
1194 : : real(dp) :: rho2ur,rho2ui,rho2dr,rho2di,rho3ur,rho3ui,rho3dr,rho3di
1195 : : ! character(len=1000) :: msg
1196 : : !arrays
1197 : 698 : real(dp),allocatable :: rho1r1_tot(:,:),xc_tmp(:,:)
1198 : :
1199 : : !***********************************************************************
1200 : :
1201 : : DBG_ENTER("COLL")
1202 : :
1203 [ - + + - : 2792 : ABI_MALLOC(xc_tmp,(cplex*nfftf,nspden))
- + + - +
- + - - +
- + ]
1204 [ - + + - : 2094 : ABI_MALLOC(rho1r1_tot,(cplex*nfftf,nspden))
- + + - -
+ - + ]
1205 [ + + ]: 698 : if (nspden==1)then
1206 : :
1207 [ - + ]: 338 : if (cplex==1) then
1208 [ + + ]: 1969730 : do ifft=1,nfftf
1209 : 1969392 : rho1r1_tot(ifft,1) = rho1r1(ifft,1) + xccc3d1(ifft)
1210 : 1969392 : rho2ur = rho2r1(ifft,1)+xccc3d2(ifft)
1211 : 1969392 : rho3ur = rho3r1(ifft,1)+xccc3d3(ifft)
1212 : 1969730 : xc_tmp(ifft,1)= k3xc(ifft,1)*rho2ur*rho3ur
1213 : : end do
1214 : : else
1215 [ # # ]: 0 : do ifft=1,nfftf
1216 : 0 : ifft_re = 2*ifft-1 ! Real part
1217 : 0 : ifft_im = 2*ifft ! Imaginary part
1218 : 0 : rho1r1_tot(ifft_re,1) = rho1r1(ifft_re,1) + xccc3d1(ifft_re)
1219 : 0 : rho1r1_tot(ifft_im,1) = rho1r1(ifft_im,1) + xccc3d1(ifft_im)
1220 : 0 : rho2ur = rho2r1(ifft_re,1)+xccc3d2(ifft_re)
1221 : 0 : rho2ui = rho2r1(ifft_im,1)+xccc3d2(ifft_im)
1222 : 0 : rho3ur = rho3r1(ifft_re,1)+xccc3d3(ifft_re)
1223 : 0 : rho3ui = rho3r1(ifft_im,1)+xccc3d3(ifft_im)
1224 : 0 : xc_tmp(ifft_re,1)= k3xc(ifft,1)*(rho2ur*rho3ur-rho2ui*rho3ui)
1225 : 0 : xc_tmp(ifft_im,1)= k3xc(ifft,1)*(rho2ur*rho3ui+rho2ui*rho3ur)
1226 : : end do
1227 : : end if
1228 : :
1229 [ + - ]: 360 : else if (nspden==2) then
1230 : :
1231 : : ! Remember : rhor(...,1) = total density ( n_up(r) + n_down(r) )
1232 : : ! rhor(...,2) = up density ( n_up(r) )
1233 : : ! But : pot(...,1) = up potential ( v_up(r) )
1234 : : ! pot(...,2) = down potential ( v_down(r) )
1235 : :
1236 [ - + ]: 360 : if (cplex==1) then
1237 [ + + ]: 2109024 : do ifft=1,nfftf
1238 : 2108664 : rho1r1_tot(ifft,1) = rho1r1(ifft,1) + xccc3d1(ifft) ! 1 tot
1239 : 2108664 : rho1r1_tot(ifft,2) = rho1r1(ifft,2) + xccc3d1(ifft)*half ! 1 up
1240 : 2108664 : rho2ur = rho2r1(ifft,2) + xccc3d2(ifft)*half ! 2 up
1241 : 2108664 : rho2dr = rho2r1(ifft,1)-rho2r1(ifft,2) + xccc3d2(ifft)*half ! 2 down
1242 : 2108664 : rho3ur = rho3r1(ifft,2) + xccc3d3(ifft)*half ! 3 up
1243 : 2108664 : rho3dr = rho3r1(ifft,1)-rho3r1(ifft,2) + xccc3d3(ifft)*half ! 3 down
1244 : : ! uuu uud
1245 : : xc_tmp(ifft,1)= k3xc(ifft,1)*rho2ur*rho3ur + k3xc(ifft,2)*rho2ur*rho3dr + &
1246 : : ! udu udd
1247 : 2108664 : & k3xc(ifft,2)*rho2dr*rho3ur + k3xc(ifft,3)*rho2dr*rho3dr
1248 : : ! duu dud
1249 : : xc_tmp(ifft,2)= k3xc(ifft,2)*rho2ur*rho3ur + k3xc(ifft,3)*rho2ur*rho3dr + &
1250 : : ! ddu ddd
1251 : 2109024 : & k3xc(ifft,3)*rho2dr*rho3ur + k3xc(ifft,4)*rho2dr*rho3dr
1252 : : end do
1253 : :
1254 : : else ! cplex = 2
1255 : :
1256 [ # # ]: 0 : do ifft=1,nfftf
1257 : 0 : ifft_re = 2*ifft-1 ! Real part
1258 : 0 : ifft_im = 2*ifft ! Imaginary part
1259 : 0 : rho1r1_tot(ifft_re,1) = rho1r1(ifft_re,1) + xccc3d1(ifft_re) ! 1 tot re
1260 : 0 : rho1r1_tot(ifft_im,1) = rho1r1(ifft_im,1) + xccc3d1(ifft_im) ! 1 tot im
1261 : 0 : rho1r1_tot(ifft_re,2) = rho1r1(ifft_re,2) + xccc3d1(ifft_re)*half ! 1 up re
1262 : 0 : rho1r1_tot(ifft_im,2) = rho1r1(ifft_im,2) + xccc3d1(ifft_im)*half ! 1 up im
1263 : 0 : rho2ur = rho2r1(ifft_re,2) + xccc3d2(ifft_re)*half ! 2 up re
1264 : 0 : rho2ur = rho2r1(ifft_im,2) + xccc3d2(ifft_im)*half ! 2 up im
1265 : 0 : rho2dr = rho2r1(ifft_re,1)-rho2r1(ifft_re,2) + xccc3d2(ifft_re)*half ! 2 down re
1266 : 0 : rho2dr = rho2r1(ifft_im,1)-rho2r1(ifft_im,2) + xccc3d2(ifft_im)*half ! 2 down im
1267 : 0 : rho3ur = rho3r1(ifft_re,2) + xccc3d3(ifft_re)*half ! 3 up re
1268 : 0 : rho3ur = rho3r1(ifft_im,2) + xccc3d3(ifft_im)*half ! 3 up im
1269 : 0 : rho3dr = rho3r1(ifft_re,1)-rho3r1(ifft_re,2) + xccc3d3(ifft_re)*half ! 3 down re
1270 : 0 : rho3dr = rho3r1(ifft_im,1)-rho3r1(ifft_im,2) + xccc3d3(ifft_im)*half ! 3 down im
1271 : : ! Real part:
1272 : : ! uuu uud
1273 : : xc_tmp(ifft_re,1)= k3xc(ifft,1)*(rho2ur*rho3ur-rho2ui*rho3ui) + k3xc(ifft,2)*(rho2ur*rho3dr-rho2ui*rho3di) + &
1274 : : ! udu udd
1275 : 0 : & k3xc(ifft,2)*(rho2dr*rho3ur-rho2di*rho3ui) + k3xc(ifft,3)*(rho2dr*rho3dr-rho2di*rho3di)
1276 : : ! duu dud
1277 : : xc_tmp(ifft_re,2)= k3xc(ifft,2)*(rho2ur*rho3ur-rho2ui*rho3ui) + k3xc(ifft,3)*(rho2ur*rho3dr-rho2ui*rho3di) + &
1278 : : ! ddu ddd
1279 : 0 : & k3xc(ifft,3)*(rho2dr*rho3ur-rho2di*rho3ui) + k3xc(ifft,4)*(rho2dr*rho3dr-rho2di*rho3di)
1280 : : ! Imaginary part:
1281 : : ! uuu uud
1282 : : xc_tmp(ifft_im,1)= k3xc(ifft,1)*(rho2ur*rho3ui+rho2ui*rho3ur) + k3xc(ifft,2)*(rho2ur*rho3di+rho2ui*rho3dr) + &
1283 : : ! udu udd
1284 : 0 : & k3xc(ifft,2)*(rho2dr*rho3ui+rho2di*rho3ur) + k3xc(ifft,3)*(rho2dr*rho3di+rho2di*rho3dr)
1285 : : ! duu dud
1286 : : xc_tmp(ifft_im,2)= k3xc(ifft,2)*(rho2ur*rho3ui+rho2ui*rho3ur) + k3xc(ifft,3)*(rho2ur*rho3di+rho2ui*rho3dr) + &
1287 : : ! ddu ddd
1288 : 0 : & k3xc(ifft,3)*(rho2dr*rho3ui+rho2di*rho3ur) + k3xc(ifft,4)*(rho2dr*rho3di+rho2di*rho3dr)
1289 : : end do
1290 : :
1291 : : end if
1292 : :
1293 : : else
1294 : 0 : ABI_BUG('DFPTNL_PERT is implemented only for nspden=1 or 2')
1295 : : end if
1296 : :
1297 : 698 : call dotprod_vn(cplex,rho1r1_tot,exc3(1),exc3(2),nfftf,nfftotf,nspden,2,xc_tmp,ucvol,mpi_comm_sphgrid=mpi_enreg%comm_fft)
1298 [ - + ]: 698 : ABI_FREE(xc_tmp)
1299 [ - + ]: 698 : ABI_FREE(rho1r1_tot)
1300 : :
1301 : : DBG_EXIT("COLL")
1302 : :
1303 : 698 : end subroutine dfptnl_exc3
1304 : : !!***
1305 : :
1306 : : end module m_dfptnl_pert
1307 : : !!***
|