TABLE OF CONTENTS
ABINIT/mkffnl [ Functions ]
NAME
mkffnl
FUNCTION
Make FFNL, nonlocal form factors, for each type of atom up to ntypat and for each angular momentum. When Legendre polynomials are used in the application of the nonlocal operator, FFNLs depend on (l,n) components; in this case, form factors are real and divided by |k+G|^l; When spherical harmonics are used, FFNLs depend on (l,m,n) components; in this case, form factors are multiplied by Ylm(k+G).
COPYRIGHT
Copyright (C) 1998-2018 ABINIT group (DCA, XG, GMR, MT, DRH) This file is distributed under the terms of the GNU General Public License, see ~abinit/COPYING or http://www.gnu.org/copyleft/gpl.txt .
INPUTS
dimekb=second dimension of ekb (see ekb) dimffnl=second dimension of ffnl (1+number of derivatives) ekb(dimekb,ntypat*(1-usepaw))=(Real) Kleinman-Bylander energies (hartree) ->NORM-CONSERVING PSPS ONLY ffspl(mqgrid,2,lnmax,ntypat)=form factors and spline fit to 2nd derivative gmet(3,3)=reciprocal space metric tensor in bohr**-2 gprimd(3,3)=dimensional reciprocal space primitive translations ider=0=>no derivative wanted; 1=>1st derivative wanted; 2=>1st and 2nd derivatives wanted idir=ONLY WHEN YLMs ARE USED: When 1st derivative has to be computed: (see more info below) - Determine the direction(s) of the derivatives(s) - Determine the set of coordinates (reduced or cartesians) indlmn(6,i,ntypat)= array giving l,m,n,lm,ln,spin for i=ln (if useylm=0) or i=lmn (if useylm=1) kg(3,npw)=integer coordinates of planewaves in basis sphere for this k point. kpg(npw,nkpg)= (k+G) components (only if useylm=1) kpt(3)=reduced coordinates of k point lmnmax=if useylm=1, max number of (l,m,n) comp. over all type of psps =if useylm=0, max number of (l,n) comp. over all type of psps lnmax=max. number of (l,n) components over all type of psps mpsang= 1+maximum angular momentum for nonlocal pseudopotentials mqgrid=size of q (or |G|) grid for f(q) nkpg=second dimension of kpg_k (0 if useylm=0) npw=number of planewaves in basis sphere ntypat=number of types of atoms usepaw= 0 for non paw calculation; =1 for paw calculation pspso(ntypat)=spin-orbit characteristics for each atom type (1, 2, or 3) qgrid(mqgrid)=uniform grid of q values from 0 to qmax rmet(3,3)=real space metric (bohr**2) useylm=governs the way the nonlocal operator is to be applied: 1=using Ylm, 0=using Legendre polynomials ylm (npw,mpsang*mpsang*useylm)=real spherical harmonics for each G and k point ylm_gr(npw,3,mpsang*mpsang*useylm)=gradients of real spherical harmonics wrt (k+G)
OUTPUT
ffnl(npw,dimffnl,lmnmax,ntypat)=described below
NOTES
Uses spline fit ffspl provided by Numerical Recipes spline subroutine. Form factor $f_l(q)$ is defined by \begin{equation} \textrm{f}_l(q)=\frac{1}{dvrms} \int_0^\infty [j_l(2 \pi r q) u_l(r) dV(r) r dr] \end{equation} where u_l(r)=reference state wavefunction, dV(r)=nonlocal psp correction, j_l(arg)=spherical Bessel function for angular momentum l, and \begin{equation} \textrm{dvrms} = \int_0^\infty [(u_l(r) dV(r))^2 dr])^{1/2} \end{equation} which is square root of mean square dV, i.e. $ (\langle (dV)^2 \rangle)^{1/2} $ . This routine is passed f_l(q) in spline form in the array ffspl and then constructs the values of $f_l(q)$ on the relevant (k+G) in array ffnl. The evaluation of the integrals defining ffspl was done in mkkbff. Delivers the following (for each atom type t, or itypat): -------------------------- Using Legendre polynomials in the application of nl operator: ffnl are real. ffnl(ig,1,(l,0,n),itypat) $= f_ln(k+G)/|k+G|^l $ === if ider>=1 ffnl(ig,2,(l,0,n),itypat) $=(fprime_ln(k+G)-l*f_ln(k+G)/|k+G|)/|k+G|^(l+1) $ === if ider=2 ffnl(ig,3,(l,0,n),itypat) $=(fprimeprime_ln(k+G)-(2l+1)*fprime_ln(k+G)/|k+G| +l(l+2)*f_ln(k+G)/|k+G|**2)/|k+G|^(l+2) -------------------------- Using spherical harmonics in the application of nl operator: ffnl are real (we use REAL spherical harmonics). ffnl(ig,1,(l,m,n),itypat) = ffnl_1 $= f_ln(k+G) * Y_lm(k+G) $ === if ider>=1 --if (idir==0) ffnl(ig,1+i,(l,m,n),itypat) = dffnl_i = 3 reduced coord. of d(ffnl_1)/dK^cart $= fprime_ln(k+G).Y_lm(k+G).(k+G)^red_i/|k+G|+f_ln(k+G).(dY_lm/dK^cart)^red_i $ for i=1..3 --if (1<=idir<=3) ffnl(ig,2,(l,m,n),itypat)= cart. coordinate idir of d(ffnl_1)/dK^red = Sum_(mu,nu) [ Gprim(mu,idir) Gprim(mu,nu) dffnl_nu ] --if (idir==4) ffnl(ig,1+i,(l,m,n),itypat)= 3 cart. coordinates of d(ffnl_1)/dK^red = Sum_(mu,nu) [ Gprim(mu,i) Gprim(mu,nu) dffnl_nu ] --if (-6<idir<-1) ffnl(ig,2,(l,m,n),itypat)=1/2 [d(ffnl)/dK^cart_mu K^cart_nu + d(ffnl)/dK^cart_nu K^cart_mu] with d(ffnl)/dK^cart_i = Sum_nu [ Gprim(nu,i) dffnl_nu ] for |idir|->(mu,nu) (1->11,2->22,3->33,4->32,5->31,6->21) --if (idir==-7) ffnl(ig,2:7,(l,m,n),itypat)=1/2 [d(ffnl)/dK^cart_mu K^cart_nu + d(ffnl)/dK^cart_nu K^cart_mu] with d(ffnl)/dK^cart_i = Sum_nu [ Gprim(nu,i) dffnl_nu ] for all (mu,nu) (6 independant terms) === if ider==2 --if (idir==0) ffnl(ig,4+i,(l,m,n),itypat) = d2ffnl_mu,nu = 6 reduced coord. of d2(ffnl_1)/dK^cart.dK^cart for all i=(mu,nu) (6 independant terms) --if (idir==4) ffnl(ig,4+i,(l,m,n),itypat) = d2ffnl_i =6 cart. coordinates of d2(ffnl_1)/dK^red.dK^red for all i=(mu,nu) (6 independant terms) = Sum_(mu1,mu2,mu3,mu4) [ Gprim(mu1,mu) Gprim(mu2,nu) Gprim(mu1,mu3) Gprim(mu2,mu4) d2ffnl_mu3,mu4 ] --------------------------
NOTES
1) l may be 0, 1, 2, or 3 in this version. 2) Norm-conserving psps : only FFNL for which ekb is not zero are calculated. 3) Each expression above approaches a constant as $|k+G| \rightarrow 0 $. In the cases where $|k+G|$ is in the denominator, there is always a factor of $(k+G)_mu$ multiplying the ffnl term where it is actually used, so that we may replace the ffnl term by any constant when $|k+G| = 0$. Below we replace 1/0 by 1/tol10, thus creating an arbitrary constant which will later be multiplied by 0.
TODO
Some parts can be rewritten with BLAS1 calls.
PARENTS
ctocprj,d2frnl,dfpt_nsteltwf,dfpt_nstpaw,dfpt_nstwf,dfpt_rhofermi dfptnl_resp,energy,fock2ACE,forstrnps,getgh1c,ks_ddiago,m_io_kss m_shirley,m_vkbr,m_wfd,nonlop_test,vtorho
CHILDREN
mkkin,splfit,timab
SOURCE
146 #if defined HAVE_CONFIG_H 147 #include "config.h" 148 #endif 149 150 #include "abi_common.h" 151 152 subroutine mkffnl(dimekb,dimffnl,ekb,ffnl,ffspl,gmet,gprimd,ider,idir,indlmn,& 153 & kg,kpg,kpt,lmnmax,lnmax,mpsang,mqgrid,nkpg,npw,ntypat,pspso,& 154 & qgrid,rmet,usepaw,useylm,ylm,ylm_gr) 155 156 use defs_basis 157 use m_profiling_abi 158 use m_errors 159 use m_splines 160 161 use m_kg, only : mkkin 162 163 !This section has been created automatically by the script Abilint (TD). 164 !Do not modify the following lines by hand. 165 #undef ABI_FUNC 166 #define ABI_FUNC 'mkffnl' 167 use interfaces_18_timing 168 !End of the abilint section 169 170 implicit none 171 172 !Arguments ------------------------------------ 173 !scalars 174 integer,intent(in) :: dimekb,dimffnl,ider,idir,lmnmax,lnmax,mpsang,mqgrid,nkpg 175 integer,intent(in) :: npw,ntypat,usepaw,useylm 176 !arrays 177 integer,intent(in) :: indlmn(6,lmnmax,ntypat),kg(3,npw),pspso(ntypat) 178 real(dp),intent(in) :: ekb(dimekb,ntypat*(1-usepaw)) 179 real(dp),intent(in) :: ffspl(mqgrid,2,lnmax,ntypat),gmet(3,3),gprimd(3,3) 180 real(dp),intent(in) :: kpg(npw,nkpg),kpt(3),qgrid(mqgrid),rmet(3,3) 181 real(dp),intent(in) :: ylm(:,:),ylm_gr(:,:,:) 182 real(dp),intent(out) :: ffnl(npw,dimffnl,lmnmax,ntypat) 183 184 !Local variables------------------------------- 185 !scalars 186 integer :: ider_tmp,iffnl,ig,ig0,il,ilm,ilmn,iln,iln0,im,itypat,mu,mua,mub,nlmn,nu,nua,nub 187 real(dp),parameter :: renorm_factor=0.5d0/pi**2,tol_norm=tol10 188 real(dp) :: ecut,ecutsm,effmass_free,fact,kpg1,kpg2,kpg3,kpgc1,kpgc2,kpgc3,rmetab,yp1 189 logical :: testnl=.false. 190 character(len=500) :: message 191 !arrays 192 integer,parameter :: alpha(6)=(/1,2,3,3,3,2/),beta(6)=(/1,2,3,2,1,1/) 193 integer,parameter :: gamma(3,3)=reshape((/1,6,5,6,2,4,5,4,3/),(/3,3/)) 194 real(dp) :: rprimd(3,3),tsec(2) 195 real(dp),allocatable :: dffnl_cart(:,:),dffnl_red(:,:),dffnl_tmp(:) 196 real(dp),allocatable :: d2ffnl_cart(:,:),d2ffnl_red(:,:),d2ffnl_tmp(:) 197 real(dp),allocatable :: kpgc(:,:),kpgn(:,:),kpgnorm(:),kpgnorm_inv(:),wk_ffnl1(:) 198 real(dp),allocatable :: wk_ffnl2(:),wk_ffnl3(:),wk_ffspl(:,:) 199 200 ! ************************************************************************* 201 202 DBG_ENTER("COLL") 203 204 !Keep track of time spent in mkffnl 205 call timab(16,1,tsec) 206 207 !Compatibility tests 208 if (mpsang>4) then 209 write(message,'(a,i0,a,a)')& 210 & 'Called with mpsang > 4, =',mpsang,ch10,& 211 & 'This subroutine will not accept lmax+1 > 4.' 212 MSG_BUG(message) 213 end if 214 if (idir<-7.or.idir>4) then 215 MSG_BUG('Called with idir<-6 or idir>4 !') 216 end if 217 if (useylm==0) then 218 iffnl=1+ider 219 else 220 iffnl=1 221 if (ider>=1) then 222 if (idir==0) iffnl=iffnl+3 223 if (idir/=0) iffnl=iffnl+1 224 if (idir==4) iffnl=iffnl+2 225 if (idir==-7) iffnl=iffnl+5 226 end if 227 if (ider==2) then 228 if (idir==0) iffnl=iffnl+6 229 if (idir==4) iffnl=iffnl+6 230 end if 231 end if 232 if (iffnl/=dimffnl) then 233 message = 'Incompatibility between ider, idir and dimffnl !' 234 MSG_BUG(message) 235 end if 236 if (useylm==1) then 237 ABI_CHECK(size(ylm,1)==npw,'BUG: wrong ylm size (1)') 238 ABI_CHECK(size(ylm,2)==mpsang**2,'BUG: wrong ylm size (2)') 239 if(ider>0)then 240 ABI_CHECK(size(ylm_gr,1)==npw,'BUG: wrong ylm_gr size (1)') 241 ABI_CHECK(size(ylm_gr,2)>=3+6*(ider/2),'BUG: wrong ylm_gr size (2)') 242 ABI_CHECK(size(ylm_gr,3)==mpsang**2,'BUG: wrong ylm_gr size (3)') 243 end if 244 end if 245 !Get (k+G) and |k+G|: 246 ABI_ALLOCATE(kpgnorm,(npw)) 247 ABI_ALLOCATE(kpgnorm_inv,(npw)) 248 ig0=-1 ! index of |k+g|=0 vector 249 250 if (useylm==1) then 251 ABI_ALLOCATE(kpgc,(npw,3)) 252 if (ider>=1) then 253 ABI_ALLOCATE(kpgn,(npw,3)) 254 end if 255 if (nkpg<3) then 256 !$OMP PARALLEL DO PRIVATE(ig,kpg1,kpg2,kpg3,kpgc1,kpgc2,kpgc3) 257 do ig=1,npw 258 kpg1=kpt(1)+dble(kg(1,ig)) 259 kpg2=kpt(2)+dble(kg(2,ig)) 260 kpg3=kpt(3)+dble(kg(3,ig)) 261 kpgc1=kpg1*gprimd(1,1)+kpg2*gprimd(1,2)+kpg3*gprimd(1,3) 262 kpgc2=kpg1*gprimd(2,1)+kpg2*gprimd(2,2)+kpg3*gprimd(2,3) 263 kpgc3=kpg1*gprimd(3,1)+kpg2*gprimd(3,2)+kpg3*gprimd(3,3) 264 kpgc(ig,1)=kpgc1 265 kpgc(ig,2)=kpgc2 266 kpgc(ig,3)=kpgc3 267 kpgnorm(ig)=sqrt(kpgc1*kpgc1+kpgc2*kpgc2+kpgc3*kpgc3) 268 if (kpgnorm(ig)<=tol_norm) ig0=ig 269 if (ider>=1) then 270 kpgnorm_inv(ig)=1.d0/max(kpgnorm(ig),tol_norm) 271 kpgn(ig,1)=kpg1*kpgnorm_inv(ig) 272 kpgn(ig,2)=kpg2*kpgnorm_inv(ig) 273 kpgn(ig,3)=kpg3*kpgnorm_inv(ig) 274 end if 275 end do 276 else 277 !$OMP PARALLEL DO PRIVATE(ig,kpgc1,kpgc2,kpgc3) 278 do ig=1,npw 279 kpgc1=kpg(ig,1)*gprimd(1,1)+kpg(ig,2)*gprimd(1,2)+kpg(ig,3)*gprimd(1,3) 280 kpgc2=kpg(ig,1)*gprimd(2,1)+kpg(ig,2)*gprimd(2,2)+kpg(ig,3)*gprimd(2,3) 281 kpgc3=kpg(ig,1)*gprimd(3,1)+kpg(ig,2)*gprimd(3,2)+kpg(ig,3)*gprimd(3,3) 282 kpgc(ig,1)=kpgc1 283 kpgc(ig,2)=kpgc2 284 kpgc(ig,3)=kpgc3 285 kpgnorm(ig)=sqrt(kpgc1*kpgc1+kpgc2*kpgc2+kpgc3*kpgc3) 286 if (kpgnorm(ig)<=tol_norm) ig0=ig 287 if (ider>=1) then 288 kpgnorm_inv(ig)=1.d0/max(kpgnorm(ig),tol_norm) 289 kpgn(ig,1:3)=kpg(ig,1:3)*kpgnorm_inv(ig) 290 end if 291 end do 292 end if 293 else 294 if (nkpg<3) then 295 ecut=huge(0.0d0)*0.1d0;ecutsm=zero;effmass_free=one 296 ! Note that with ecutsm=0, the right kinetic energy is computed 297 call mkkin(ecut,ecutsm,effmass_free,gmet,kg,kpgnorm,kpt,npw,0,0) 298 !$OMP PARALLEL DO 299 do ig=1,npw 300 kpgnorm(ig)=sqrt(renorm_factor*kpgnorm(ig)) 301 kpgnorm_inv(ig)=1.d0/max(kpgnorm(ig),tol_norm) 302 if (kpgnorm(ig)<=tol_norm) ig0=ig 303 end do 304 else 305 !$OMP PARALLEL DO PRIVATE(ig,kpgc1,kpgc2,kpgc3) 306 do ig=1,npw 307 kpgc1=kpg(ig,1)*gprimd(1,1)+kpg(ig,2)*gprimd(1,2)+kpg(ig,3)*gprimd(1,3) 308 kpgc2=kpg(ig,1)*gprimd(2,1)+kpg(ig,2)*gprimd(2,2)+kpg(ig,3)*gprimd(2,3) 309 kpgc3=kpg(ig,1)*gprimd(3,1)+kpg(ig,2)*gprimd(3,2)+kpg(ig,3)*gprimd(3,3) 310 kpgnorm(ig)=sqrt(kpgc1*kpgc1+kpgc2*kpgc2+kpgc3*kpgc3) 311 kpgnorm_inv(ig)=1.d0/max(kpgnorm(ig),tol_norm) 312 if (kpgnorm(ig)<=tol_norm) ig0=ig 313 end do 314 end if 315 end if 316 317 !Need rprimd in some cases 318 if (ider>=1.and.useylm==1.and.ig0>0) then 319 do mu=1,3 320 do nu=1,3 321 rprimd(mu,nu)=gprimd(mu,1)*rmet(1,nu)+gprimd(mu,2)*rmet(2,nu)+gprimd(mu,3)*rmet(3,nu) 322 end do 323 end do 324 end if 325 326 !Allocate several temporary arrays 327 ABI_ALLOCATE(wk_ffnl1,(npw)) 328 ABI_ALLOCATE(wk_ffnl2,(npw)) 329 ABI_ALLOCATE(wk_ffnl3,(npw)) 330 ABI_ALLOCATE(wk_ffspl,(mqgrid,2)) 331 if (ider>=1.and.useylm==1) then 332 ABI_ALLOCATE(dffnl_red,(npw,3)) 333 if (idir/=0) then 334 ABI_ALLOCATE(dffnl_cart,(npw,3)) 335 end if 336 if (idir>0) then 337 ABI_ALLOCATE(dffnl_tmp,(npw)) 338 end if 339 end if 340 if (ider>=2.and.useylm==1) then 341 ABI_ALLOCATE(d2ffnl_red,(npw,6)) 342 if (idir==4) then 343 ABI_ALLOCATE(d2ffnl_cart,(npw,6)) 344 ABI_ALLOCATE(d2ffnl_tmp,(npw)) 345 end if 346 end if 347 348 !Loop over types of atoms 349 do itypat=1,ntypat 350 351 ! Loop over (l,m,n) values 352 iln0=0;nlmn=count(indlmn(3,:,itypat)>0) 353 ffnl(:,:,:,itypat)=zero 354 do ilmn=1,nlmn 355 il=indlmn(1,ilmn,itypat) 356 im=indlmn(2,ilmn,itypat) 357 ilm =indlmn(4,ilmn,itypat) 358 iln =indlmn(5,ilmn,itypat) 359 iffnl=ilmn;if (useylm==0) iffnl=iln 360 ! Special case : we enter the loop in case of spin-orbit calculation 361 ! even if the psp has no spin-orbit component. 362 if ((indlmn(6,ilmn,itypat)==1).or.(pspso(itypat)/=0)) then 363 364 ! Compute FFNL only if ekb>0 or paw 365 if (usepaw==1) testnl=.true. 366 if (usepaw==0) testnl=(abs(ekb(iln,itypat))>tol_norm) 367 if (testnl) then 368 369 ! Store form factors (from ffspl) 370 ! ------------------------------- 371 if (iln>iln0) then 372 do ig=1,mqgrid 373 wk_ffspl(ig,1)=ffspl(ig,1,iln,itypat) 374 wk_ffspl(ig,2)=ffspl(ig,2,iln,itypat) 375 end do 376 ider_tmp=min(ider,1) 377 call splfit(qgrid,wk_ffnl2,wk_ffspl,ider_tmp,kpgnorm,wk_ffnl1,mqgrid,npw) 378 if(ider==2) then 379 call splfit(qgrid,wk_ffnl3,wk_ffspl,ider,kpgnorm,wk_ffnl1,mqgrid,npw) 380 end if 381 end if 382 383 ! Store FFNL and FFNL derivatives 384 ! ------------------------------- 385 386 ! ========================================================================= 387 ! A-USE OF SPHER. HARMONICS IN APPLICATION OF NL OPERATOR: 388 ! ffnl(K,l,m,n)=fnl(K).Ylm(K) 389 ! --if (idir==0) 390 ! ffnl_prime(K,1:3,l,m,n)=3 reduced coordinates of d(ffnl)/dK^cart 391 ! =fnl_prime(K).Ylm(K).K^red_i/|K|+fnl(K).(dYlm/dK^cart)^red_i 392 ! --if (0<idir<4) 393 ! ffnl_prime(K,l,m,n)=cart. coordinate idir of d(ffnl)/dK^red 394 ! --if (idir==4) 395 ! ffnl_prime(K,l,m,n)=3 cart. coordinates of d(ffnl)/dK^red 396 ! --if (-7<=idir<0) - |idir|=(mu,nu) (1->11,2->22,3->33,4->32,5->31,6->21) 397 ! ffnl_prime(K,l,m,n)=1/2 [d(ffnl)/dK^cart_mu K^cart_nu + d(ffnl)/dK^cart_nu K^cart_mu] 398 ! ffnl_prime_prime(K,l,m,n)=6 reduced coordinates of d2(ffnl)/dK^cart.dK^cart 399 400 if (useylm==1) then 401 !$OMP PARALLEL DO 402 do ig=1,npw 403 ffnl(ig,1,iffnl,itypat)=ylm(ig,ilm)*wk_ffnl1(ig) 404 end do 405 406 if (ider>=1) then 407 !$OMP PARALLEL DO COLLAPSE(2) 408 do mu=1,3 409 do ig=1,npw 410 dffnl_red(ig,mu)=ylm(ig,ilm)*wk_ffnl2(ig)*kpgn(ig,mu)+ylm_gr(ig,mu,ilm)*wk_ffnl1(ig) 411 end do 412 end do 413 !Special cases |k+g|=0 414 if (ig0>0) then 415 do mu=1,3 416 dffnl_red(ig0,mu)=zero 417 if (il==1) then 418 !Retrieve 1st-deriv. of ffnl at q=zero according to spline routine 419 yp1=(wk_ffspl(2,1)-wk_ffspl(1,1))/qgrid(2)-sixth*qgrid(2)*(two*wk_ffspl(1,2)+wk_ffspl(2,2)) 420 fact=yp1*sqrt(three/four_pi) 421 if (im==-1) dffnl_red(ig0,mu)=fact*rprimd(2,mu) 422 if (im== 0) dffnl_red(ig0,mu)=fact*rprimd(3,mu) 423 if (im==+1) dffnl_red(ig0,mu)=fact*rprimd(1,mu) 424 end if 425 end do 426 end if 427 if (idir==0) then 428 !$OMP PARALLEL DO COLLAPSE(2) 429 do mu=1,3 430 do ig=1,npw 431 ffnl(ig,1+mu,iffnl,itypat)=dffnl_red(ig,mu) 432 end do 433 end do 434 else 435 dffnl_cart=zero 436 !$OMP PARALLEL DO COLLAPSE(2) 437 do mu=1,3 438 do ig=1,npw 439 do nu=1,3 440 dffnl_cart(ig,mu)=dffnl_cart(ig,mu)+dffnl_red(ig,nu)*gprimd(mu,nu) 441 end do 442 end do 443 end do 444 if (idir>=1.and.idir<=3) then 445 dffnl_tmp=zero 446 !$OMP PARALLEL PRIVATE(nu,ig) 447 !$OMP DO 448 do ig=1,npw 449 do nu=1,3 450 dffnl_tmp(ig)=dffnl_tmp(ig) + dffnl_cart(ig,nu)*gprimd(nu,idir) 451 end do 452 end do 453 !$OMP END DO 454 !$OMP WORKSHARE 455 ffnl(:,2,iffnl,itypat)=dffnl_tmp(:) 456 !$OMP END WORKSHARE 457 !$OMP END PARALLEL 458 else if (idir==4) then 459 do mu=1,3 460 !$OMP PARALLEL PRIVATE(nu,ig) 461 !$OMP WORKSHARE 462 dffnl_tmp=zero 463 !$OMP END WORKSHARE 464 !$OMP DO 465 do ig=1,npw 466 do nu=1,3 467 dffnl_tmp(ig)=dffnl_tmp(ig) + dffnl_cart(ig,nu)*gprimd(nu,mu) 468 end do 469 end do 470 !$OMP END DO 471 !$OMP WORKSHARE 472 ffnl(:,1+mu,iffnl,itypat)=dffnl_tmp(:) 473 !$OMP END WORKSHARE 474 !$OMP END PARALLEL 475 end do 476 else if (idir/=-7) then 477 mu=abs(idir);mua=alpha(mu);mub=beta(mu) 478 !$OMP PARALLEL DO 479 do ig=1,npw 480 ffnl(ig,2,iffnl,itypat)=0.5d0* & 481 & (dffnl_cart(ig,mua)*kpgc(ig,mub) & 482 & +dffnl_cart(ig,mub)*kpgc(ig,mua)) 483 end do 484 else if (idir==-7) then 485 !$OMP PARALLEL DO COLLAPSE(2) PRIVATE(mua, mub) 486 do mu=1,6 487 do ig=1,npw 488 mua=alpha(mu);mub=beta(mu) 489 ffnl(ig,1+mu,iffnl,itypat)=0.5d0* & 490 & (dffnl_cart(ig,mua)*kpgc(ig,mub) & 491 & +dffnl_cart(ig,mub)*kpgc(ig,mua)) 492 end do 493 end do 494 end if 495 end if 496 end if 497 498 if (ider==2) then 499 do mu=1,6 500 mua=alpha(mu);mub=beta(mu) 501 rmetab=rmet(mua,mub) 502 !$OMP PARALLEL DO 503 do ig=1,npw 504 d2ffnl_red(ig,mu)= & 505 & ylm_gr(ig,3+mu,ilm)*wk_ffnl1(ig) & 506 & + (rmetab-kpgn(ig,mua)*kpgn(ig,mub))*ylm(ig,ilm)*wk_ffnl2(ig)*kpgnorm_inv(ig) & 507 & + ylm(ig,ilm)*kpgn(ig,mua)*kpgn(ig,mub)*wk_ffnl3(ig) & 508 & + (ylm_gr(ig,mua,ilm)*kpgn(ig,mub)+ylm_gr(ig,mub,ilm)*kpgn(ig,mua))*wk_ffnl2(ig) 509 end do 510 !Special cases |k+g|=0 511 if (ig0>0) then 512 d2ffnl_red(ig0,mu)=zero 513 if (il==0) then 514 d2ffnl_red(ig0,mu)=wk_ffspl(1,2)*rmetab/sqrt(four_pi) 515 end if 516 if (il==2) then 517 fact=wk_ffspl(1,2)*quarter*sqrt(15._dp/pi) 518 if (im==-2) d2ffnl_red(ig0,mu)=fact*(rprimd(1,mua)*rprimd(2,mub)+rprimd(2,mua)*rprimd(1,mub)) 519 if (im==-1) d2ffnl_red(ig0,mu)=fact*(rprimd(2,mua)*rprimd(3,mub)+rprimd(3,mua)*rprimd(2,mub)) 520 if (im==+1) d2ffnl_red(ig0,mu)=fact*(rprimd(1,mua)*rprimd(3,mub)+rprimd(3,mua)*rprimd(1,mub)) 521 if (im==+2) d2ffnl_red(ig0,mu)=fact*(rprimd(1,mua)*rprimd(1,mub)-rprimd(2,mua)*rprimd(2,mub)) 522 if (im== 0) d2ffnl_red(ig0,mu)=(fact/sqrt3)*(two*rprimd(3,mua)*rprimd(3,mub) & 523 & -rprimd(1,mua)*rprimd(1,mub)-rprimd(2,mua)*rprimd(2,mub)) 524 end if 525 end if 526 end do 527 if (idir==0) then 528 !$OMP PARALLEL DO COLLAPSE(2) 529 do mu=1,6 530 do ig=1,npw 531 ffnl(ig,4+mu,iffnl,itypat)=d2ffnl_red(ig,mu) 532 end do 533 end do 534 else if (idir==4) then 535 d2ffnl_cart=zero 536 !$OMP PARALLEL DO COLLAPSE(2) PRIVATE(mu,mua,mub,ig,nu,nua,nub) 537 do mu=1,6 538 do ig=1,npw 539 mua=alpha(mu);mub=beta(mu) 540 do nua=1,3 541 do nub=1,3 542 nu=gamma(nua,nub) 543 d2ffnl_cart(ig,mu)=d2ffnl_cart(ig,mu)+d2ffnl_red(ig,nu)*gprimd(mua,nua)*gprimd(mub,nub) 544 end do 545 end do 546 end do 547 end do 548 do mu=1,6 549 mua=alpha(mu);mub=beta(mu) 550 !$OMP PARALLEL PRIVATE(nu,nua,nub,ig) 551 !$OMP WORKSHARE 552 d2ffnl_tmp=zero 553 !$OMP END WORKSHARE 554 !$OMP DO 555 do ig=1,npw 556 do nua=1,3 557 do nub=1,3 558 nu=gamma(nua,nub) 559 d2ffnl_tmp(ig)=d2ffnl_tmp(ig)+d2ffnl_cart(ig,nu)*gprimd(nua,mua)*gprimd(nub,mub) 560 end do 561 end do 562 end do 563 !$OMP END DO 564 !$OMP WORKSHARE 565 ffnl(:,4+mu,iffnl,itypat)=d2ffnl_tmp(:) 566 !$OMP END WORKSHARE 567 !$OMP END PARALLEL 568 end do 569 end if 570 end if 571 572 ! ========================================================================= 573 ! B-USE OF LEGENDRE POLYNOMIAL IN APPLICATION OF NL OPERATOR: 574 ! ffnl(K,l,n)=fnl(K)/|K|^l 575 ! ffnl_prime(K,l,n)=(fnl_prime(K)-l*fnl(K)/|K|)/|K|^(l+1) 576 ! ffnl_prime_prime(K,l,n)=(fnl_prime_prime(K)-(2*l+1)*fnl_prime(K)/|K| 577 ! +l*(l+2)*fnl(K)/|K|^2)/|K|^(l+2) 578 else if (iln>iln0) then 579 580 if (il==0) then 581 !$OMP PARALLEL DO 582 do ig=1,npw 583 ffnl(ig,1,iffnl,itypat)=wk_ffnl1(ig) 584 end do 585 else 586 !$OMP PARALLEL DO 587 do ig=1,npw 588 ffnl(ig,1,iffnl,itypat)=wk_ffnl1(ig)*kpgnorm_inv(ig)**il 589 end do 590 end if 591 if (ider>=1) then 592 !$OMP PARALLEL DO 593 do ig=1,npw 594 ffnl(ig,2,iffnl,itypat)= (wk_ffnl2(ig)-dble(il)*wk_ffnl1(ig)*kpgnorm_inv(ig))*kpgnorm_inv(ig)**(il+1) 595 end do 596 if (ider==2) then 597 !$OMP PARALLEL DO 598 do ig=1,npw 599 ffnl(ig,3,iffnl,itypat)= (wk_ffnl3(ig)- & 600 & dble(2*il+1)*wk_ffnl2(ig)*kpgnorm_inv(ig)+ & 601 & dble(il*(il+2))*wk_ffnl1(ig)*kpgnorm_inv(ig)**2)*kpgnorm_inv(ig)**(il+2) 602 end do 603 end if 604 end if 605 606 end if ! End if - Use of Ylm or not 607 608 else ! No NL part 609 !$OMP PARALLEL DO COLLAPSE(2) 610 do mu=1,dimffnl 611 do ig=1,npw 612 ffnl(ig,mu,iffnl,itypat)=zero 613 end do 614 end do 615 616 end if ! End if - a nonlocal part exists 617 end if ! End if - special case : spin orbit calc. & no spin-orbit psp 618 619 if (iln>iln0) iln0=iln 620 end do ! End do - loop over (l,m,n) values 621 622 end do ! End do - loop over atom types 623 624 if (allocated(kpgc)) then 625 ABI_DEALLOCATE(kpgc) 626 end if 627 if (allocated(kpgn)) then 628 ABI_DEALLOCATE(kpgn) 629 end if 630 if (allocated(dffnl_red)) then 631 ABI_DEALLOCATE(dffnl_red) 632 end if 633 if (allocated(d2ffnl_red)) then 634 ABI_DEALLOCATE(d2ffnl_red) 635 end if 636 if (allocated(dffnl_cart)) then 637 ABI_DEALLOCATE(dffnl_cart) 638 end if 639 if (allocated(d2ffnl_cart)) then 640 ABI_DEALLOCATE(d2ffnl_cart) 641 end if 642 if (allocated(dffnl_tmp)) then 643 ABI_DEALLOCATE(dffnl_tmp) 644 end if 645 if (allocated(d2ffnl_tmp)) then 646 ABI_DEALLOCATE(d2ffnl_tmp) 647 end if 648 649 ABI_DEALLOCATE(kpgnorm_inv) 650 ABI_DEALLOCATE(kpgnorm) 651 ABI_DEALLOCATE(wk_ffnl1) 652 ABI_DEALLOCATE(wk_ffnl2) 653 ABI_DEALLOCATE(wk_ffnl3) 654 ABI_DEALLOCATE(wk_ffspl) 655 656 call timab(16,2,tsec) 657 658 DBG_EXIT("COLL") 659 660 end subroutine mkffnl