TABLE OF CONTENTS
ABINIT/pawaccrhoij [ Functions ]
NAME
pawaccrhoij
FUNCTION
Accumulate the PAW quantities rhoij (augmentation occupancies) or their 1-st order change or their gradient vs r Add the contribution of a given k-point and band Remember: for each atom, rho_ij=Sum_{n,k} {occ(n,k)*<Cnk|p_i><p_j|Cnk>}
COPYRIGHT
Copyright (C) 1998-2018 ABINIT group (MT) This file is distributed under the terms of the GNU General Public License, see ~abinit/COPYING or http://www.gnu.org/copyleft/gpl.txt . For the initials of contributors, see ~abinit/doc/developers/contributors.txt.
INPUTS
atindx(natom)=index table for atoms (sorted-->random), inverse of atindx. cplex: if 1, WFs (or 1st-order WFs) are REAL, if 2, COMPLEX cwaveprj(natom,nspinor)= LEFT wave function at given n,k projected with non-local projectors: cwaveprj=<p_i|Cnk> cwaveprj1(natom,nspinor)= RIGHT wave function at n,k,q projected with non-local projectors: cwaveprj1=<p_i|C1nk,q> * USED for RF : C1nk is the first-order wave function * USED for DMFT: C1nk is the RIGHT wave function * NOT USED in usual GS case; can be set to cwaveprj in that case ipert=index of perturbation (RF only, i.e. option=2) isppol=index of current spin component mpi_atmtab(:)=--optional-- indexes of the atoms treated by current proc comm_atom=--optional-- MPI communicator over atoms my_natom=number of atoms treated by current processor natom=number of atoms in cell nspinor=number of spinorial components (on current proc) occ_k=occupation number for current band n,k option: choice of calculation: 1: update rhoij (Ground-State) 2: update 1-st order rhoij (Response Function) according to ipert 3: update gradients of rhoij with respect to r,strain of both usetimerev=.TRUE. if time-reversal symmetry is used (WF(-k)=Conjg[WF(k)]) wtk_k=weight assigned to current k-point
SIDE EFFECTS
pawrhoij(natom) <type(pawrhoij_type)>= GS: paw rhoij occupancies and related data RF: 1-st order paw rhoij occupancies and related data On output, has been updated with the contribution of current n,k === option=1: pawrhoij(:)%rhoij_(lmn2_size,nspden)= (non symetrized) Sum_{n,k} {occ(n,k)*conjugate[cprj_nk(ii)].cprj_nk(jj)} === option=2: pawrhoij(:)%rhoij_(lmn2_size,nspden)= (non symetrized) Sum_{n,k} {occ(n,k)*(conjugate[cprj_nk(ii)].cprj1_nk,q(jj) conjugate[cprj_nk(jj)].cprj1_nk,q(ii)} + Sum_{n,k} {occ(n,k)*(conjugate[dcprj_nk(ii)/dlambda].cprj_nk(jj) +conjugate[cprj_nk(ii)].dcprj_nk(jj)/dlambda)} === option=3: pawrhoij(:)%grhoij(lmn2_size,mu,nspden)= (non symetrized) Sum_{n,k} {occ(n,k)*(conjugate[dcprj_nk(ii)/dr_mu].cprj_nk(jj) +conjugate[cprj_nk(ii)].dcprj_nk(jj)/dr_mu)}
PARENTS
d2frnl,dfpt_accrho,energy,pawmkrhoij,posdoppler,wfd_pawrhoij
CHILDREN
free_my_atmtab,get_my_atmtab
SOURCE
71 #if defined HAVE_CONFIG_H 72 #include "config.h" 73 #endif 74 75 #include "abi_common.h" 76 77 subroutine pawaccrhoij(atindx,cplex,cwaveprj,cwaveprj1,ipert,isppol,my_natom,natom,& 78 & nspinor,occ_k,option,pawrhoij,usetimerev,wtk_k,occ_k_2, & 79 & comm_atom,mpi_atmtab ) ! optional (parallelism) 80 81 82 use defs_basis 83 use m_profiling_abi 84 use m_errors 85 use m_xmpi, only : xmpi_comm_self 86 87 use m_pawrhoij, only : pawrhoij_type 88 use m_pawcprj, only : pawcprj_type 89 use m_paral_atom, only : get_my_atmtab, free_my_atmtab 90 91 !This section has been created automatically by the script Abilint (TD). 92 !Do not modify the following lines by hand. 93 #undef ABI_FUNC 94 #define ABI_FUNC 'pawaccrhoij' 95 !End of the abilint section 96 97 implicit none 98 99 !Arguments --------------------------------------------- 100 !scalars 101 integer,intent(in) :: cplex,ipert,isppol,my_natom,natom,nspinor,option 102 integer,optional,intent(in) :: comm_atom 103 logical,intent(in) :: usetimerev 104 real(dp),intent(in) :: occ_k,wtk_k 105 real(dp),optional,intent(in) :: occ_k_2 106 !arrays 107 integer,intent(in) :: atindx(natom) 108 integer,optional,target,intent(in) :: mpi_atmtab(:) 109 type(pawcprj_type),intent(in) :: cwaveprj(natom,nspinor),cwaveprj1(natom,nspinor) 110 type(pawrhoij_type),intent(inout) :: pawrhoij(my_natom) 111 112 !Local variables --------------------------------------- 113 !scalars 114 integer :: cplex_rhoij,iatm,iatom,iatom1,ilmn,iplex,j0lmn,jlmn,klmn,klmn_im,klmn_re 115 integer :: mu,my_comm_atom,ncpgr,nspden_rhoij 116 logical :: compute_impart,compute_impart_cplex,substract_diagonal 117 logical :: my_atmtab_allocated,paral_atom 118 real(dp) :: ro11_im,ro11_re,ro12_im,ro12_re,ro21_im,ro21_re,ro22_im,ro22_re,weight,weight_2 119 character(len=500) :: message 120 !arrays 121 integer,pointer :: my_atmtab(:) 122 real(dp) :: cpi0(2,nspinor),cpi1(2,nspinor),cpj0(2,nspinor),cpj1(2,nspinor) 123 real(dp) :: dcpi0(2,nspinor,9),dcpj0(2,nspinor,9) 124 125 ! *********************************************************************** 126 127 DBG_ENTER("COLL") 128 129 if (my_natom==0) return 130 131 ncpgr=0 132 if (option==2.and.(ipert<=natom.or.ipert==natom+3.or.ipert==natom+4)) ncpgr=1 133 if (option==3) ncpgr=cwaveprj(1,1)%ncpgr 134 !Tests 135 if(option==2.and.(ipert==natom+1.or.ipert==natom+10.or.ipert==natom+11)) then 136 message = ' not relevant for ipert=natom+1 or ipert=natom+10 or ipert=natom+11 !' 137 MSG_BUG(message) 138 end if 139 if(option==2.and.cwaveprj(1,1)%ncpgr<ncpgr) then 140 message = ' Error on cwaveprj1 factors derivatives !' 141 MSG_BUG(message) 142 end if 143 if(option==3.and.cwaveprj(1,1)%ncpgr/=ncpgr) then 144 message = ' Error on cwaveprj factors derivatives !' 145 MSG_BUG(message) 146 end if 147 148 !Set up parallelism over atoms 149 paral_atom=(present(comm_atom).and.(my_natom/=natom)) 150 nullify(my_atmtab);if (present(mpi_atmtab)) my_atmtab => mpi_atmtab 151 my_comm_atom=xmpi_comm_self;if (present(comm_atom)) my_comm_atom=comm_atom 152 call get_my_atmtab(my_comm_atom,my_atmtab,my_atmtab_allocated,paral_atom,natom,& 153 & my_natom_ref=my_natom) 154 155 weight=wtk_k*occ_k 156 weight_2=zero 157 if(present(occ_k_2).and.nspinor==2) weight_2=wtk_k*occ_k_2 158 if (pawrhoij(1)%nspden==2.and.pawrhoij(1)%nsppol==1.and.nspinor==1) weight=half*weight 159 if (pawrhoij(1)%nspden==2.and.pawrhoij(1)%nsppol==1.and.nspinor==1.and.present(occ_k_2)) weight_2=half*weight_2 160 if (option==1) then 161 162 ! ================================================================== 163 ! === OPTION 1: Accumulate (n,k) contribution to rhoij ============= 164 ! ================================================================== 165 compute_impart=((.not.usetimerev).and.(pawrhoij(1)%cplex==2)) 166 compute_impart_cplex=((compute_impart).and.(cplex==2)) 167 if (nspinor==1) then 168 cplex_rhoij=pawrhoij(1)%cplex 169 if (cplex_rhoij==1) then 170 do iatom=1,my_natom 171 iatom1=iatom;if (paral_atom) iatom1=my_atmtab(iatom) 172 iatm=atindx(iatom1) 173 do jlmn=1,pawrhoij(iatom)%lmn_size 174 j0lmn=jlmn*(jlmn-1)/2 175 cpj0(1:cplex,1)=cwaveprj(iatm,1)%cp(1:cplex,jlmn) 176 do ilmn=1,jlmn 177 klmn=j0lmn+ilmn 178 cpi0(1:cplex,1)=cwaveprj1(iatm,1)%cp(1:cplex,ilmn) 179 ro11_re=zero 180 do iplex=1,cplex 181 ro11_re=ro11_re+cpi0(iplex,1)*cpj0(iplex,1) 182 end do 183 pawrhoij(iatom)%rhoij_(klmn,isppol)=pawrhoij(iatom)%rhoij_(klmn,isppol)+weight*ro11_re 184 end do 185 end do 186 end do 187 else 188 do iatom=1,my_natom 189 iatom1=iatom;if (paral_atom) iatom1=my_atmtab(iatom) 190 iatm=atindx(iatom1) 191 do jlmn=1,pawrhoij(iatom)%lmn_size 192 j0lmn=jlmn*(jlmn-1)/2 193 cpj0(1:cplex,1)=cwaveprj(iatm,1)%cp(1:cplex,jlmn) 194 do ilmn=1,jlmn 195 klmn=j0lmn+ilmn 196 klmn_re=cplex_rhoij*(klmn-1)+1 197 cpi0(1:cplex,1)=cwaveprj1(iatm,1)%cp(1:cplex,ilmn) 198 ro11_re=zero 199 do iplex=1,cplex 200 ro11_re=ro11_re+cpi0(iplex,1)*cpj0(iplex,1) 201 end do 202 pawrhoij(iatom)%rhoij_(klmn_re,isppol)=pawrhoij(iatom)%rhoij_(klmn_re,isppol)+weight*ro11_re 203 if (compute_impart_cplex) then 204 klmn_im=klmn_re+1 205 ro11_im=cpi0(1,1)*cpj0(2,1)-cpi0(2,1)*cpj0(1,1) 206 pawrhoij(iatom)%rhoij_(klmn_im,isppol)=pawrhoij(iatom)%rhoij_(klmn_im,isppol)+weight*ro11_im 207 end if 208 end do 209 end do 210 end do 211 end if 212 else ! nspinor=2 213 do iatom=1,my_natom 214 iatom1=iatom;if (paral_atom) iatom1=my_atmtab(iatom) 215 iatm=atindx(iatom1) 216 cplex_rhoij=pawrhoij(iatom)%cplex 217 nspden_rhoij=pawrhoij(iatom)%nspden 218 do jlmn=1,pawrhoij(iatom)%lmn_size 219 j0lmn=jlmn*(jlmn-1)/2 220 cpj0(1:cplex,1)=cwaveprj(iatm,1)%cp(1:cplex,jlmn) 221 cpj0(1:cplex,2)=cwaveprj(iatm,2)%cp(1:cplex,jlmn) 222 do ilmn=1,jlmn 223 klmn=j0lmn+ilmn 224 klmn_re=cplex_rhoij*(klmn-1)+1 225 cpi0(1:cplex,1)=cwaveprj1(iatm,1)%cp(1:cplex,ilmn) 226 cpi0(1:cplex,2)=cwaveprj1(iatm,2)%cp(1:cplex,ilmn) 227 ro11_re=zero;ro22_re=zero 228 ro12_re=zero;ro21_re=zero 229 ro12_im=zero;ro21_im=zero 230 do iplex=1,cplex 231 ro11_re=ro11_re+cpi0(iplex,1)*cpj0(iplex,1) 232 ro22_re=ro22_re+cpi0(iplex,2)*cpj0(iplex,2) 233 end do 234 pawrhoij(iatom)%rhoij_(klmn_re,1)=pawrhoij(iatom)%rhoij_(klmn_re,1)+weight*(ro11_re+ro22_re) 235 if (nspden_rhoij>1) then 236 do iplex=1,cplex 237 ro12_re=ro12_re+cpi0(iplex,2)*cpj0(iplex,1) 238 ro21_re=ro21_re+cpi0(iplex,1)*cpj0(iplex,2) 239 end do 240 pawrhoij(iatom)%rhoij_(klmn_re,4)=pawrhoij(iatom)%rhoij_(klmn_re,4)+weight*(ro11_re-ro22_re) 241 pawrhoij(iatom)%rhoij_(klmn_re,2)=pawrhoij(iatom)%rhoij_(klmn_re,2)+weight*(ro12_re+ro21_re) 242 if (cplex==2) then 243 ro12_im=cpi0(1,2)*cpj0(2,1)-cpi0(2,2)*cpj0(1,1) 244 ro21_im=cpi0(1,1)*cpj0(2,2)-cpi0(2,1)*cpj0(1,2) 245 pawrhoij(iatom)%rhoij_(klmn_re,3)=pawrhoij(iatom)%rhoij_(klmn_re,3)+weight*(ro21_im-ro12_im) 246 end if 247 end if 248 if (compute_impart) then 249 klmn_im=klmn_re+1 250 if (nspden_rhoij>1) pawrhoij(iatom)%rhoij_(klmn_im,3)=pawrhoij(iatom)%rhoij_(klmn_im,3)+weight*(ro12_re-ro21_re) 251 if (cplex==2) then 252 ro11_im=cpi0(1,1)*cpj0(2,1)-cpi0(2,1)*cpj0(1,1) 253 ro22_im=cpi0(1,2)*cpj0(2,2)-cpi0(2,2)*cpj0(1,2) 254 pawrhoij(iatom)%rhoij_(klmn_im,1)=pawrhoij(iatom)%rhoij_(klmn_im,1)+weight*(ro11_im+ro22_im) 255 if (nspden_rhoij>1) then 256 pawrhoij(iatom)%rhoij_(klmn_im,4)=pawrhoij(iatom)%rhoij_(klmn_im,4)+weight*(ro11_im-ro22_im) 257 pawrhoij(iatom)%rhoij_(klmn_im,2)=pawrhoij(iatom)%rhoij_(klmn_im,2)+weight*(ro12_im+ro21_im) 258 end if 259 if (present(occ_k_2).and.nspinor==2) then 260 pawrhoij(iatom)%rhoij_(klmn_re,1)=pawrhoij(iatom)%rhoij_(klmn_re,1)+weight_2*(-ro11_im-ro22_im) 261 pawrhoij(iatom)%rhoij_(klmn_im,1)=pawrhoij(iatom)%rhoij_(klmn_im,1)+weight_2*( ro11_re+ro22_re) 262 pawrhoij(iatom)%rhoij_(klmn_re,2)=pawrhoij(iatom)%rhoij_(klmn_re,2)+weight_2*(-ro21_im-ro12_im) 263 pawrhoij(iatom)%rhoij_(klmn_im,2)=pawrhoij(iatom)%rhoij_(klmn_im,2)+weight_2*( ro21_re+ro12_re) 264 pawrhoij(iatom)%rhoij_(klmn_re,3)=pawrhoij(iatom)%rhoij_(klmn_re,3)+weight_2*(-ro12_re+ro21_re) 265 pawrhoij(iatom)%rhoij_(klmn_im,3)=pawrhoij(iatom)%rhoij_(klmn_im,3)+weight_2*(-ro12_im+ro21_im) 266 pawrhoij(iatom)%rhoij_(klmn_re,4)=pawrhoij(iatom)%rhoij_(klmn_re,4)+weight_2*(-ro11_im+ro22_im) 267 pawrhoij(iatom)%rhoij_(klmn_im,4)=pawrhoij(iatom)%rhoij_(klmn_im,4)+weight_2*( ro11_re-ro22_re) 268 end if 269 end if 270 end if 271 end do 272 end do 273 end do 274 end if 275 276 else if (option==2) then 277 278 ! ================================================================== 279 ! === OPTION 2: Accumulate (n,k) contribution to 1st-order rhoij === 280 ! ================================================================== 281 282 compute_impart=(pawrhoij(1)%cplex==2) 283 compute_impart_cplex=((pawrhoij(1)%cplex==2).and.(cplex==2)) 284 substract_diagonal=(ipert==natom+3) 285 286 ! Accumulate (n,k) contribution to rhoij1 287 ! due to derivative of wave-function 288 if (nspinor==1) then 289 do iatom=1,my_natom 290 iatom1=iatom;if (paral_atom) iatom1=my_atmtab(iatom) 291 iatm=atindx(iatom1) 292 cplex_rhoij=pawrhoij(iatom)%cplex 293 do jlmn=1,pawrhoij(iatom)%lmn_size 294 j0lmn=jlmn*(jlmn-1)/2 295 cpj0(1:2,1)=cwaveprj (iatm,1)%cp(1:2,jlmn) 296 cpj1(1:2,1)=cwaveprj1(iatm,1)%cp(1:2,jlmn) 297 do ilmn=1,jlmn 298 klmn=j0lmn+ilmn 299 klmn_re=cplex_rhoij*(klmn-1)+1 300 cpi0(1:2,1)=cwaveprj (iatm,1)%cp(1:2,ilmn) 301 cpi1(1:2,1)=cwaveprj1(iatm,1)%cp(1:2,ilmn) 302 ro11_re=zero 303 do iplex=1,cplex 304 ro11_re=ro11_re+cpi0(iplex,1)*cpj1(iplex,1)+cpj0(iplex,1)*cpi1(iplex,1) 305 end do 306 pawrhoij(iatom)%rhoij_(klmn_re,isppol)=pawrhoij(iatom)%rhoij_(klmn_re,isppol)+weight*ro11_re 307 if (compute_impart_cplex) then 308 klmn_im=klmn_re+1 309 ro11_im=cpi0(1,1)*cpj1(2,1)-cpi0(2,1)*cpj1(1,1)+cpj0(1,1)*cpi1(2,1)-cpj0(2,1)*cpi1(1,1) 310 pawrhoij(iatom)%rhoij_(klmn_im,isppol)=pawrhoij(iatom)%rhoij_(klmn_im,isppol)+weight*ro11_im 311 end if 312 end do 313 end do 314 end do 315 else ! nspinor=2 316 do iatom=1,my_natom 317 iatom1=iatom;if (paral_atom) iatom1=my_atmtab(iatom) 318 iatm=atindx(iatom1) 319 cplex_rhoij=pawrhoij(iatom)%cplex 320 nspden_rhoij=pawrhoij(iatom)%nspden 321 do jlmn=1,pawrhoij(iatom)%lmn_size 322 j0lmn=jlmn*(jlmn-1)/2 323 cpj0(1:2,1)=cwaveprj (iatm,1)%cp(1:2,jlmn) 324 cpj0(1:2,2)=cwaveprj (iatm,2)%cp(1:2,jlmn) 325 cpj1(1:2,1)=cwaveprj1(iatm,1)%cp(1:2,jlmn) 326 cpj1(1:2,2)=cwaveprj1(iatm,2)%cp(1:2,jlmn) 327 do ilmn=1,jlmn 328 klmn=j0lmn+ilmn 329 klmn_re=cplex_rhoij*(klmn-1)+1 330 cpi0(1:2,1)=cwaveprj (iatm,1)%cp(1:2,ilmn) 331 cpi0(1:2,2)=cwaveprj (iatm,2)%cp(1:2,ilmn) 332 cpi1(1:2,1)=cwaveprj1(iatm,1)%cp(1:2,ilmn) 333 cpi1(1:2,2)=cwaveprj1(iatm,2)%cp(1:2,ilmn) 334 ro11_re=zero;ro22_re=zero 335 ro12_re=zero;ro21_re=zero 336 ro12_im=zero;ro21_im=zero 337 do iplex=1,cplex 338 ro11_re=cpj0(iplex,1)*cpi1(iplex,1)+cpi0(iplex,1)*cpj1(iplex,1) 339 ro22_re=cpj0(iplex,2)*cpi1(iplex,2)+cpi0(iplex,2)*cpj1(iplex,2) 340 end do 341 pawrhoij(iatom)%rhoij_(klmn_re,1)=pawrhoij(iatom)%rhoij_(klmn_re,1)+weight*(ro11_re+ro22_re) 342 if (nspden_rhoij>1) then 343 do iplex=1,cplex 344 ro12_re=cpj0(iplex,1)*cpi1(iplex,2)+cpi0(iplex,2)*cpj1(iplex,1) 345 ro21_re=cpj0(iplex,2)*cpi1(iplex,1)+cpi0(iplex,1)*cpj1(iplex,2) 346 end do 347 pawrhoij(iatom)%rhoij_(klmn_re,4)=pawrhoij(iatom)%rhoij_(klmn_re,4)+weight*(ro11_re-ro22_re) 348 pawrhoij(iatom)%rhoij_(klmn_re,2)=pawrhoij(iatom)%rhoij_(klmn_re,2)+weight*(ro12_re+ro21_re) 349 if (cplex==2) then 350 ro12_im=cpj0(1,1)*cpi1(2,2)-cpi1(1,1)*cpj0(2,2)+cpi0(1,2)*cpj1(2,1)-cpj1(1,2)*cpi0(2,1) 351 ro21_im=cpj0(1,2)*cpi1(2,1)-cpi1(1,2)*cpj0(2,1)+cpi0(1,1)*cpj1(2,2)-cpj1(1,1)*cpi0(2,2) 352 pawrhoij(iatom)%rhoij_(klmn_re,3)=pawrhoij(iatom)%rhoij_(klmn_re,3)+weight*(ro21_im-ro12_im) 353 end if 354 end if 355 if (compute_impart) then 356 klmn_im=klmn_re+1 357 if (nspden_rhoij>1) pawrhoij(iatom)%rhoij_(klmn_re,3)=pawrhoij(iatom)%rhoij_(klmn_re,3)+weight*(ro12_re-ro21_re) 358 if (cplex==2) then 359 ro11_im=cpj0(1,1)*cpi1(2,1)-cpi1(1,1)*cpj0(2,1)+cpi0(1,1)*cpj1(2,1)-cpj1(1,1)*cpi0(2,1) 360 ro22_im=cpj0(1,2)*cpi1(2,2)-cpi1(1,2)*cpj0(2,2)+cpi0(1,2)*cpj1(2,2)-cpj1(1,2)*cpi0(2,2) 361 pawrhoij(iatom)%rhoij_(klmn_im,1)=pawrhoij(iatom)%rhoij_(klmn_im,1)+weight*(ro11_im+ro22_im) 362 if (nspden_rhoij>1) then 363 pawrhoij(iatom)%rhoij_(klmn_im,4)=pawrhoij(iatom)%rhoij_(klmn_im,4)+weight*(ro11_im-ro22_im) 364 pawrhoij(iatom)%rhoij_(klmn_re,2)=pawrhoij(iatom)%rhoij_(klmn_re,2)+weight*(ro12_im+ro21_im) 365 end if 366 end if 367 end if 368 end do 369 end do 370 end do 371 end if 372 373 ! Accumulate (n,k) contribution to rhoij1 374 ! due to derivative of projectors 375 if (ipert/=natom+2) then 376 if (nspinor==1) then 377 do iatom=1,my_natom 378 iatom1=iatom;if (paral_atom) iatom1=my_atmtab(iatom) 379 iatm=atindx(iatom1) 380 if (ipert<=natom.and.iatom/=ipert) cycle 381 cplex_rhoij=pawrhoij(iatom)%cplex 382 do jlmn=1,pawrhoij(iatom)%lmn_size 383 j0lmn=jlmn*(jlmn-1)/2 384 cpj0 (1:2,1) =cwaveprj(iatm,1)%cp (1:2 ,jlmn) 385 dcpj0(1:2,1,1)=cwaveprj(iatm,1)%dcp(1:2,1,jlmn) 386 do ilmn=1,jlmn 387 klmn=j0lmn+ilmn 388 klmn_re=cplex_rhoij*(klmn-1)+1 389 cpi0 (1:2,1) =cwaveprj(iatm,1)%cp (1:2 ,ilmn) 390 dcpi0(1:2,1,1)=cwaveprj(iatm,1)%dcp(1:2,1,ilmn) 391 ro11_re=zero 392 do iplex=1,cplex 393 ro11_re=ro11_re+dcpi0(iplex,1,1)*cpj0(iplex,1)+cpi0(iplex,1)*dcpj0(iplex,1,1) 394 end do 395 if (substract_diagonal) then 396 do iplex=1,cplex 397 ro11_re=ro11_re-cpi0(iplex,1)*cpj0(iplex,1) 398 end do 399 end if 400 pawrhoij(iatom)%rhoij_(klmn_re,isppol)=pawrhoij(iatom)%rhoij_(klmn_re,isppol)+weight*ro11_re 401 ! This imaginary part does not have to be computed 402 ! It is cancelled because rho_ij+rho_ji is stored in rho_ij 403 ! if (compute_impart_cplex) then 404 ! klmn_im=klmn_re+1 405 ! ro11_im=dcpi0(1,1,1)*cpj0(2,1)-dcpi0(2,1,1)*cpj0(1,1)+cpi0(1,1)*dcpj0(2,1,1)-cpi0(2,1)*dcpj0(1,1,1) 406 ! if (substract_diagonal) then 407 ! ro11_im=ro11_im-cpi0(1,1)*cpj0(2,1)+cpi0(2,1)*cpj0(1,1) 408 ! end if 409 ! pawrhoij(iatom)%rhoij_(klmn_im,isppol)=pawrhoij(iatom)%rhoij_(klmn_im,isppol)+weight*ro11_im 410 ! end if 411 end do 412 end do 413 end do 414 else ! nspinor=2 415 do iatom=1,my_natom 416 iatom1=iatom;if (paral_atom) iatom1=my_atmtab(iatom) 417 iatm=atindx(iatom1) 418 if (ipert<=natom.and.iatom/=ipert) cycle 419 cplex_rhoij=pawrhoij(iatom)%cplex 420 nspden_rhoij=pawrhoij(iatom)%nspden 421 do jlmn=1,pawrhoij(iatom)%lmn_size 422 j0lmn=jlmn*(jlmn-1)/2 423 cpj0 (1:2,1) =cwaveprj(iatm,1)%cp (1:2 ,jlmn) 424 dcpj0(1:2,1,1)=cwaveprj(iatm,1)%dcp(1:2,1,jlmn) 425 cpj0 (1:2,2) =cwaveprj(iatm,2)%cp (1:2 ,jlmn) 426 dcpj0(1:2,2,1)=cwaveprj(iatm,2)%dcp(1:2,1,jlmn) 427 do ilmn=1,jlmn 428 klmn=j0lmn+ilmn 429 klmn_re=cplex_rhoij*(klmn-1)+1 430 cpi0 (1:2,1) =cwaveprj(iatm,1)%cp (1:2 ,ilmn) 431 dcpi0(1:2,1,1)=cwaveprj(iatm,1)%dcp(1:2,1,ilmn) 432 cpi0 (1:2,2) =cwaveprj(iatm,2)%cp (1:2 ,ilmn) 433 dcpi0(1:2,2,1)=cwaveprj(iatm,2)%dcp(1:2,1,ilmn) 434 ro11_re=zero;ro22_re=zero 435 ro12_re=zero;ro21_re=zero 436 ro12_im=zero;ro21_im=zero 437 do iplex=1,cplex 438 ro11_re=dcpi0(iplex,1,1)*cpj0(iplex,1)+cpi0(iplex,1)*dcpj0(iplex,1,1) 439 ro22_re=dcpi0(iplex,2,1)*cpj0(iplex,2)+cpi0(iplex,2)*dcpj0(iplex,2,1) 440 end do 441 if (substract_diagonal) then 442 do iplex=1,cplex 443 ro11_re=ro11_re-cpi0(iplex,1)*cpj0(iplex,1) 444 ro22_re=ro22_re-cpi0(iplex,2)*cpj0(iplex,2) 445 end do 446 end if 447 pawrhoij(iatom)%rhoij_(klmn_re,1)=pawrhoij(iatom)%rhoij_(klmn_re,1)+weight*(ro11_re+ro22_re) 448 if (nspden_rhoij>1) then 449 do iplex=1,cplex 450 ro12_re=dcpi0(iplex,2,1)*cpj0(iplex,1)+cpi0(iplex,2)*dcpj0(iplex,1,1) 451 ro21_re=dcpi0(iplex,1,1)*cpj0(iplex,2)+cpi0(iplex,1)*dcpj0(iplex,2,1) 452 end do 453 if (substract_diagonal) then 454 do iplex=1,cplex 455 ro12_re=ro12_re-cpi0(iplex,2)*cpj0(iplex,1) 456 ro21_re=ro21_re-cpi0(iplex,1)*cpj0(iplex,2) 457 end do 458 end if 459 pawrhoij(iatom)%rhoij_(klmn_re,4)=pawrhoij(iatom)%rhoij_(klmn_re,4)+weight*(ro11_re-ro22_re) 460 pawrhoij(iatom)%rhoij_(klmn_re,2)=pawrhoij(iatom)%rhoij_(klmn_re,2)+weight*(ro12_re+ro21_re) 461 if (cplex==2) then 462 ro12_im=dcpi0(1,2,1)*cpj0(2,1)-dcpi0(2,2,1)*cpj0(1,1)+cpi0(1,2)*dcpj0(2,1,1)-cpi0(2,2)*dcpj0(1,1,1) 463 ro21_im=dcpi0(1,1,1)*cpj0(2,2)-dcpi0(2,1,1)*cpj0(1,2)+cpi0(1,1)*dcpj0(2,2,1)-cpi0(2,1)*dcpj0(1,2,1) 464 if (substract_diagonal) then 465 ro12_im=ro12_im-cpi0(1,2)*cpj0(2,1)+cpi0(2,2)*cpj0(1,1) 466 ro21_im=ro21_im-cpi0(1,1)*cpj0(2,2)+cpi0(2,1)*cpj0(1,2) 467 end if 468 pawrhoij(iatom)%rhoij_(klmn_re,3)=pawrhoij(iatom)%rhoij_(klmn_re,3)+weight*(ro21_im-ro12_im) 469 end if 470 end if 471 if (compute_impart) then 472 klmn_im=klmn_re+1 473 if (nspden_rhoij>1) pawrhoij(iatom)%rhoij_(klmn_im,3)=pawrhoij(iatom)%rhoij_(klmn_im,3)+weight*(ro12_re-ro21_re) 474 if (cplex==2) then 475 ro11_im=dcpi0(1,1,1)*cpj0(2,1)-dcpi0(2,1,1)*cpj0(1,1)+cpi0(1,1)*dcpj0(2,1,1)-cpi0(2,1)*dcpj0(1,1,1) 476 ro22_im=dcpi0(1,2,1)*cpj0(2,2)-dcpi0(2,2,1)*cpj0(1,2)+cpi0(1,2)*dcpj0(2,2,1)-cpi0(2,2)*dcpj0(1,2,1) 477 if (substract_diagonal) then 478 ro11_im=ro11_im-cpi0(1,1)*cpj0(2,1)+cpi0(2,1)*cpj0(1,1) 479 ro22_im=ro22_im-cpi0(1,2)*cpj0(2,2)+cpi0(2,2)*cpj0(1,2) 480 end if 481 pawrhoij(iatom)%rhoij_(klmn_im,1)=pawrhoij(iatom)%rhoij_(klmn_im,1)+weight*(ro11_im+ro22_im) 482 if (nspden_rhoij>1) then 483 pawrhoij(iatom)%rhoij_(klmn_im,4)=pawrhoij(iatom)%rhoij_(klmn_im,4)+weight*(ro11_im-ro22_im) 484 pawrhoij(iatom)%rhoij_(klmn_im,2)=pawrhoij(iatom)%rhoij_(klmn_im,2)+weight*(ro12_im+ro21_im) 485 end if 486 end if 487 end if 488 end do 489 end do 490 end do 491 end if 492 end if 493 494 else if (option==3) then 495 496 ! ================================================================== 497 ! === OPTION 3: Accumulate (n,k) contribution to drhoij/dr ========= 498 ! ================================================================== 499 500 compute_impart=((.not.usetimerev).and.(pawrhoij(1)%cplex==2)) 501 compute_impart_cplex=((compute_impart).and.(cplex==2)) 502 if (nspinor==1) then 503 do iatom=1,my_natom 504 iatom1=iatom;if (paral_atom) iatom1=my_atmtab(iatom) 505 iatm=atindx(iatom1) 506 cplex_rhoij=pawrhoij(iatom)%cplex 507 do jlmn=1,pawrhoij(iatom)%lmn_size 508 j0lmn=jlmn*(jlmn-1)/2 509 cpj0(1:cplex,1) =cwaveprj(iatm,1)%cp (1:cplex,jlmn) 510 dcpj0(1:cplex,1,1:ncpgr)=cwaveprj(iatm,1)%dcp(1:cplex,1:ncpgr,jlmn) 511 do ilmn=1,jlmn 512 klmn=j0lmn+ilmn 513 klmn_re=cplex_rhoij*(klmn-1)+1 514 cpi0(1:cplex,1) =cwaveprj(iatm,1)%cp (1:cplex,ilmn) 515 dcpi0(1:cplex,1,1:ncpgr)=cwaveprj(iatm,1)%dcp(1:cplex,1:ncpgr,ilmn) 516 do mu=1,ncpgr 517 ro11_re=zero 518 do iplex=1,cplex 519 ro11_re=ro11_re+dcpi0(iplex,1,mu)*cpj0(iplex,1)+cpi0(iplex,1)*dcpj0(iplex,1,mu) 520 end do 521 pawrhoij(iatom)%grhoij(mu,klmn_re,isppol)=pawrhoij(iatom)%grhoij(mu,klmn_re,isppol)+weight*ro11_re 522 end do 523 if (compute_impart_cplex) then 524 klmn_im=klmn_re+1 525 do mu=1,ncpgr 526 ro11_im=dcpi0(1,1,mu)*cpj0(2,1)+cpi0(1,1)*dcpj0(2,1,mu)-dcpi0(2,1,mu)*cpj0(1,1)-cpi0(2,1)*dcpj0(1,1,mu) 527 pawrhoij(iatom)%grhoij(mu,klmn_im,isppol)=pawrhoij(iatom)%grhoij(mu,klmn_im,isppol)+weight*ro11_im 528 end do 529 end if 530 end do 531 end do 532 end do 533 else ! nspinor=2 534 do iatom=1,my_natom 535 iatom1=iatom;if (paral_atom) iatom1=my_atmtab(iatom) 536 iatm=atindx(iatom1) 537 cplex_rhoij=pawrhoij(iatom)%cplex 538 nspden_rhoij=pawrhoij(iatom)%nspden 539 do jlmn=1,pawrhoij(iatom)%lmn_size 540 j0lmn=jlmn*(jlmn-1)/2 541 cpj0(1:cplex,1) =cwaveprj(iatm,1)%cp (1:cplex,jlmn) 542 cpj0(1:cplex,2) =cwaveprj(iatm,2)%cp (1:cplex,jlmn) 543 dcpj0(1:cplex,1,1:ncpgr)=cwaveprj(iatm,1)%dcp(1:cplex,1:ncpgr,jlmn) 544 dcpj0(1:cplex,2,1:ncpgr)=cwaveprj(iatm,2)%dcp(1:cplex,1:ncpgr,jlmn) 545 do ilmn=1,jlmn 546 klmn=j0lmn+ilmn 547 klmn_re=cplex_rhoij*(klmn-1)+1 548 klmn_im=klmn_re+1 549 cpi0(1:cplex,1) =cwaveprj(iatm,1)%cp (1:cplex,ilmn) 550 cpi0(1:cplex,2) =cwaveprj(iatm,2)%cp (1:cplex,ilmn) 551 dcpi0(1:cplex,1,1:ncpgr)=cwaveprj(iatm,1)%dcp(1:cplex,1:ncpgr,ilmn) 552 dcpi0(1:cplex,2,1:ncpgr)=cwaveprj(iatm,2)%dcp(1:cplex,1:ncpgr,ilmn) 553 do mu=1,ncpgr 554 ro11_re=zero;ro22_re=zero 555 ro12_re=zero;ro21_re=zero 556 ro12_im=zero;ro21_im=zero 557 do iplex=1,cplex 558 ro11_re=dcpi0(iplex,1,mu)*cpj0(iplex,1)+cpi0(iplex,1)*dcpj0(iplex,1,mu) 559 ro22_re=dcpi0(iplex,2,mu)*cpj0(iplex,2)+cpi0(iplex,2)*dcpj0(iplex,2,mu) 560 end do 561 pawrhoij(iatom)%grhoij(mu,klmn_re,1)=pawrhoij(iatom)%grhoij(mu,klmn_re,1)+weight*(ro11_re+ro22_re) 562 if (nspden_rhoij>1) then 563 do iplex=1,cplex 564 ro12_re=ro12_re+dcpi0(iplex,2,mu)*cpj0(iplex,1)+cpi0(iplex,2)*dcpj0(iplex,1,mu) 565 ro21_re=ro21_re+dcpi0(iplex,1,mu)*cpj0(iplex,2)+cpi0(iplex,1)*dcpj0(iplex,2,mu) 566 end do 567 pawrhoij(iatom)%grhoij(mu,klmn_re,4)=pawrhoij(iatom)%grhoij(mu,klmn_re,4)+weight*(ro11_re-ro22_re) 568 pawrhoij(iatom)%grhoij(mu,klmn_re,2)=pawrhoij(iatom)%grhoij(mu,klmn_re,2)+weight*(ro12_re+ro21_re) 569 if (cplex==2) then 570 ro12_im=dcpi0(1,2,mu)*cpj0(2,1)+cpi0(1,2)*dcpj0(2,1,mu)-dcpi0(2,2,mu)*cpj0(1,1)-cpi0(2,2)*dcpj0(1,1,mu) 571 ro21_im=dcpi0(1,1,mu)*cpj0(2,2)+cpi0(1,1)*dcpj0(2,2,mu)-dcpi0(2,1,mu)*cpj0(1,2)-cpi0(2,1)*dcpj0(1,2,mu) 572 pawrhoij(iatom)%grhoij(mu,klmn_re,3)=pawrhoij(iatom)%grhoij(mu,klmn_re,3)+weight*(ro21_im-ro12_im) 573 end if 574 end if 575 if (compute_impart) then 576 if (nspden_rhoij>1) then 577 pawrhoij(iatom)%grhoij(mu,klmn_im,3)=pawrhoij(iatom)%grhoij(mu,klmn_im,3)+weight*(ro12_re-ro21_re) 578 end if 579 if (cplex==2) then 580 ro11_im=dcpi0(1,1,mu)*cpj0(2,1)+cpi0(1,1)*dcpj0(2,1,mu)-dcpi0(2,1,mu)*cpj0(1,1)-cpi0(2,1)*dcpj0(1,1,mu) 581 ro22_im=dcpi0(1,2,mu)*cpj0(2,2)+cpi0(1,2)*dcpj0(2,2,mu)-dcpi0(2,2,mu)*cpj0(1,2)-cpi0(2,2)*dcpj0(1,2,mu) 582 pawrhoij(iatom)%grhoij(mu,klmn_im,1)=pawrhoij(iatom)%grhoij(mu,klmn_im,1)+weight*(ro11_im+ro22_im) 583 if (nspden_rhoij>1) then 584 pawrhoij(iatom)%grhoij(mu,klmn_im,4)=pawrhoij(iatom)%grhoij(mu,klmn_im,4)+weight*(ro11_im-ro22_im) 585 pawrhoij(iatom)%grhoij(mu,klmn_im,2)=pawrhoij(iatom)%grhoij(mu,klmn_im,2)+weight*(ro12_im+ro21_im) 586 end if 587 end if 588 end if 589 end do 590 end do 591 end do 592 end do 593 end if 594 595 ! End 596 end if ! option 597 598 !Destroy atom table used for parallelism 599 call free_my_atmtab(my_atmtab,my_atmtab_allocated) 600 601 DBG_EXIT("COLL") 602 603 end subroutine pawaccrhoij