Branch data Line data Source code
1 : : !!****m* ABINIT/m_psp_hgh
2 : : !! NAME
3 : : !! m_psp_hgh
4 : : !!
5 : : !! FUNCTION
6 : : !! Initialize pspcod=2, 3, 10 pseudopotentials (GTH)
7 : : !!
8 : : !! COPYRIGHT
9 : : !! Copyright (C) 1998-2026 ABINIT group (DCA, XG, GMR, MT, FD, PT)
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_psp_hgh
23 : :
24 : : use defs_basis
25 : : use m_splines
26 : : use m_abicore
27 : : use m_errors
28 : : use m_dtset
29 : :
30 : : use defs_datatypes, only : pseudopotential_type
31 : : use m_special_funcs, only : abi_derfc
32 : : #if defined HAVE_BIGDFT
33 : : use BigDFT_API, only: atomic_info
34 : : #endif
35 : : use m_wvl_descr_psp, only : wvl_descr_psp_fill
36 : :
37 : : implicit none
38 : :
39 : : private
40 : : !!***
41 : :
42 : : public :: psp2in
43 : : public :: psp3in
44 : : public :: psp10in
45 : : !!***
46 : :
47 : : contains
48 : : !!***
49 : :
50 : : !!****f* m_psp_hgh/psp2in
51 : : !! NAME
52 : : !! psp2in
53 : : !!
54 : : !! FUNCTION
55 : : !! Initialize pspcod=2 pseudopotentials (GTH format):
56 : : !! continue to read the file, then compute the corresponding
57 : : !! local and non-local potentials.
58 : : !!
59 : : !! INPUTS
60 : : !! dtset <type(dataset_type)>=all input variables in this dataset
61 : : !! ipsp=id in the array of the pseudo-potential.
62 : : !! lmax=value of lmax mentioned at the second line of the psp file
63 : : !! zion=nominal valence of atom as specified in psp file
64 : : !!
65 : : !! OUTPUT
66 : : !! ekb(lnmax)=Kleinman-Bylander energy,
67 : : !! {{\ \begin{equation}
68 : : !! \frac{\int_0^\infty [Rl(r)^2 (Vl(r)-Vloc(r))^2 dr]}
69 : : !! {\int_0^\infty [Rl(r)^2 (Vl(r)-Vloc(r)) dr]}
70 : : !! \end{equation} }}
71 : : !! for each (l,n)
72 : : !! epsatm=$ (4\pi)\int_0^\infty [r^2 (V(r)+Zv/r) dr]$ (hartree)
73 : : !! ffspl(mqgrid,2,lnmax)=Kleinman-Bylander form factor f_l(q) and
74 : : !! second derivative from spline fit for each angular momentum and
75 : : !! each projector
76 : : !! indlmn(6,i)= array giving l,m,n,lm,ln,s for i=ln (if useylm=0)
77 : : !! or i=lmn (if useylm=1)
78 : : !! nproj(mpsang)=number of projection functions for each angular momentum
79 : : !! vlspl(mqgrid_vl,2)=q^2 Vloc(q) and second derivatives from spline fit
80 : : !! dvlspl(mqgrid_vl,2)=dVloc(r)/dr and second derivatives from spline fit (only
81 : : !! allocated if vlspl_recipSpace is false.
82 : : !!
83 : : !! SIDE EFFECTS
84 : : !! Input/output
85 : : !! lmax : at input =value of lmax mentioned at the second line of the psp file
86 : : !! at output= 1
87 : : !! psps <type(pseudopotential_type)>=at output, values depending on the read
88 : : !! pseudo are set.
89 : : !! | lmnmax(IN)=if useylm=1, max number of (l,m,n) comp. over all type of psps
90 : : !! | =if useylm=0, max number of (l,n) comp. over all type of psps
91 : : !! | lnmax(IN)=max. number of (l,n) components over all type of psps
92 : : !! | angular momentum of nonlocal pseudopotential
93 : : !! | mpsang(IN)= 1+maximum angular momentum for nonlocal pseudopotentials
94 : : !! | mqgrid_ff(IN)=dimension of q (or G) grid for nl form factors (array ffspl)
95 : : !! | mqgrid_vl(IN)=dimension of q (or G) grid or r grid (if vlspl_recipSpace = .false.)
96 : : !! | qgrid_ff(mqgrid_ff)(IN)=values of q on grid from 0 to qmax (bohr^-1) for nl form factors
97 : : !! | qgrid_vl(mqgrid_vl)(IN)=values of q on grid from 0 to qmax (bohr^-1) for Vloc
98 : : !! | if vlspl_recipSpace is .true. else values of r on grid from
99 : : !! | 0 to 2pi / qmax * mqgrid_ff (bohr).
100 : : !! | useylm(IN)=governs the way the nonlocal operator is to be applied:
101 : : !! | 1=using Ylm, 0=using Legendre polynomials
102 : : !! | vlspl_recipSpace(IN)=.true. if pseudo are expressed in reciprocal space.
103 : : !! | gth_params(OUT)=store GTH coefficients and parameters.
104 : : !!
105 : : !! SOURCE
106 : :
107 : 328 : subroutine psp2in(dtset,ekb,epsatm,ffspl,indlmn,ipsp,lmax,nproj,psps,vlspl,dvlspl,zion)
108 : :
109 : : !Arguments ------------------------------------
110 : : !scalars
111 : : integer,intent(in) :: ipsp,lmax
112 : : real(dp),intent(in) :: zion
113 : : real(dp),intent(out) :: epsatm
114 : : type(dataset_type),intent(in) :: dtset
115 : : type(pseudopotential_type),intent(inout) :: psps
116 : : !arrays
117 : : integer,intent(out) :: indlmn(6,psps%lmnmax),nproj(psps%mpsang)
118 : : real(dp),intent(out) :: dvlspl(psps%mqgrid_vl,2),ekb(psps%lnmax)
119 : : real(dp),intent(inout) :: ffspl(psps%mqgrid_ff,2,psps%lnmax) !vz_i
120 : : real(dp),intent(out) :: vlspl(psps%mqgrid_vl,2)
121 : :
122 : : !Local variables-------------------------------
123 : : !scalars
124 : : integer :: iln,index,ipsang,kk,ll,mm
125 : : real(dp) :: cc1,cc2,cc3,cc4,h1p,h1s,h2s,rloc,rrp,rrs
126 : : real(dp) :: yp1,ypn
127 : : character(len=500) :: msg,errmsg
128 : : !arrays
129 : 328 : real(dp),allocatable :: work_space(:),work_spl(:)
130 : 328 : real(dp),allocatable :: dvloc(:)
131 : :
132 : : ! ***************************************************************************
133 : :
134 : : !Set various terms to 0 in case not defined below
135 : : !GTH values
136 : 328 : rloc=0.d0
137 : 328 : cc1=0.d0
138 : 328 : cc2=0.d0
139 : 328 : cc3=0.d0
140 : 328 : cc4=0.d0
141 : 328 : rrs=0.d0
142 : 328 : h1s=0.d0
143 : 328 : h2s=0.d0
144 : 328 : rrp=0.d0
145 : 328 : h1p=0.d0
146 [ + + ]: 771 : nproj(1:psps%mpsang)=0
147 : :
148 : : !Read and write different lines of the pseudopotential file
149 [ + - ]: 328 : read (tmp_unit,*, err=10, iomsg=errmsg) rloc,cc1,cc2,cc3,cc4
150 : 328 : write(msg, '(a,f12.7)' ) ' rloc=',rloc
151 : 328 : call wrtout(ab_out,msg,'COLL')
152 : 328 : call wrtout(std_out, msg,'COLL')
153 : 328 : write(msg, '(a,f12.7,a,f12.7,a,f12.7,a,f12.7)' )' cc1=',cc1,'; cc2=',cc2,'; cc3=',cc3,'; cc4=',cc4
154 : 328 : call wrtout(ab_out,msg,'COLL')
155 : 328 : call wrtout(std_out, msg,'COLL')
156 : :
157 [ + - ]: 328 : read (tmp_unit,*, err=10, iomsg=errmsg) rrs,h1s,h2s
158 : 328 : write(msg, '(a,f12.7,a,f12.7,a,f12.7)' )' rrs=',rrs,'; h1s=',h1s,'; h2s=',h2s
159 : 328 : call wrtout(ab_out,msg,'COLL')
160 : 328 : call wrtout(std_out, msg,'COLL')
161 : :
162 [ + - ]: 328 : read (tmp_unit,*, err=10, iomsg=errmsg) rrp,h1p
163 : 328 : write(msg, '(a,f12.7,a,f12.7)' )' rrp=',rrp,'; h1p=',h1p
164 : 328 : call wrtout(ab_out,msg,'COLL')
165 : 328 : call wrtout(std_out, msg,'COLL')
166 : :
167 : : !Store the coefficients.
168 : 328 : psps%gth_params%set(ipsp) = .true.
169 [ + + ]: 2624 : psps%gth_params%psppar(0, :, ipsp) = (/ rloc, cc1, cc2, cc3, cc4, 0.d0, 0.d0 /)
170 [ + + ]: 2624 : psps%gth_params%psppar(1, :, ipsp) = (/ rrs, h1s, h2s, 0.d0, 0.d0, 0.d0, 0.d0 /)
171 [ + + ]: 2624 : psps%gth_params%psppar(2, :, ipsp) = (/ rrp, h1p, 0.d0, 0.d0, 0.d0, 0.d0, 0.d0 /)
172 [ - + ]: 328 : if (dtset%usewvl == 1) then
173 : 0 : call wvl_descr_psp_fill(psps%gth_params, ipsp, 0, int(psps%zionpsp(ipsp)), int(psps%znuclpsp(ipsp)), tmp_unit)
174 : : end if
175 : :
176 [ + + ]: 328 : if (abs(h1s)>1.d-08) nproj(1)=1
177 [ + + ]: 328 : if (abs(h2s)>1.d-08) nproj(1)=2
178 : :
179 [ + + ]: 328 : if (abs(h1p)>1.d-08) then
180 [ - + ]: 104 : if(psps%mpsang<2)then
181 : : write(msg, '(a,es12.4,a,a,a,i2,a)' )&
182 : 0 : & 'With non-zero h1p (=',h1p,'), mpsang should be at least 2,',ch10,&
183 : 0 : & 'while mpsang=',psps%mpsang,'.'
184 : 0 : ABI_ERROR(msg)
185 : : end if
186 : 104 : nproj(2)=1
187 [ - + ]: 104 : if (lmax<1) then
188 : : write(msg, '(a,i5,a,e12.4,a,a,a,a)' )&
189 : 0 : & 'Input lmax=',lmax,' disagree with input h1p=',h1p,'.',&
190 : 0 : & 'Your pseudopotential is incoherent.',ch10,&
191 : 0 : & 'Action: correct your pseudopotential file.'
192 : 0 : ABI_ERROR(msg)
193 : : end if
194 : : end if
195 : :
196 : : !Initialize array indlmn array giving l,m,n,lm,ln,s for i=lmn
197 [ + + + + ]: 4178 : index=0;iln=0;indlmn(:,:)=0
198 [ + + ]: 760 : do ipsang=1,lmax+1
199 [ + + ]: 760 : if(nproj(ipsang)>0)then
200 : 209 : ll=ipsang-1
201 [ + + ]: 522 : do kk=1,nproj(ipsang)
202 : 313 : iln=iln+1
203 [ + + ]: 835 : do mm=1,2*ll*psps%useylm+1
204 : 313 : index=index+1
205 : 313 : indlmn(1,index)=ll
206 : 313 : indlmn(2,index)=mm-ll*psps%useylm-1
207 : 313 : indlmn(3,index)=kk
208 : 313 : indlmn(4,index)=ll*ll+(1-psps%useylm)*ll+mm
209 : 313 : indlmn(5,index)=iln
210 : 626 : indlmn(6,index)=1
211 : : end do
212 : : end do
213 : : end if
214 : : end do
215 : :
216 : : !First, the local potential --
217 : : !compute q^2V(q) or V(r)
218 : : !MJV NOTE: psp2lo should never be called with dvspl unallocated, which
219 : : !is possible unless .not.psps%vlspl_recipSpace
220 [ - + + - : 984 : ABI_MALLOC(dvloc,(psps%mqgrid_vl))
+ - + - -
+ - + ]
221 : : call psp2lo(cc1,cc2,cc3,cc4,dvloc,epsatm,psps%mqgrid_vl,psps%qgrid_vl,&
222 : 328 : & vlspl(:,1),rloc,psps%vlspl_recipSpace,yp1,ypn,zion)
223 : :
224 : : !Fit spline to (q^2)V(q) or V(r)
225 [ - + + - : 984 : ABI_MALLOC(work_space,(psps%mqgrid_vl))
+ - + - -
+ - + ]
226 [ - + + - : 656 : ABI_MALLOC(work_spl,(psps%mqgrid_vl))
- + - + ]
227 : 328 : call spline (psps%qgrid_vl,vlspl(:,1),psps%mqgrid_vl,yp1,ypn,work_spl)
228 [ + + ]: 1078984 : vlspl(:,2)=work_spl(:)
229 [ - + ]: 328 : if (.not.psps%vlspl_recipSpace) then
230 [ # # ]: 0 : dvlspl(:,1) = dvloc
231 : 0 : call spline (psps%qgrid_vl,dvlspl(:,1),psps%mqgrid_vl,yp1,ypn,work_spl)
232 [ # # ]: 0 : dvlspl(:,2)=work_spl(:)
233 : : end if
234 : :
235 [ - + ]: 328 : ABI_FREE(work_space)
236 [ - + ]: 328 : ABI_FREE(work_spl)
237 [ - + ]: 328 : ABI_FREE(dvloc)
238 : :
239 : :
240 : : !Second, compute KB energies and form factors and fit splines
241 [ + + ]: 878 : ekb(:)=0.0d0
242 : : !First check if any nonlocal projectors are being used
243 [ + + + + ]: 760 : if (maxval(nproj(1:lmax+1))>0) then
244 : 105 : call psp2nl(ekb,ffspl,h1p,h1s,h2s,psps%lnmax,psps%mqgrid_ff,psps%qgrid_ff,rrp,rrs)
245 : : end if
246 : :
247 : : return
248 : :
249 : : ! Handle IO error
250 : : 10 continue
251 : 0 : ABI_ERROR(errmsg)
252 : :
253 : : end subroutine psp2in
254 : : !!***
255 : :
256 : : !!****f* m_psp_hgh/psp2nl
257 : : !! NAME
258 : : !! psp2nl
259 : : !!
260 : : !! FUNCTION
261 : : !! Goedecker-Teter-Hutter nonlocal pseudopotential (from preprint of 1996).
262 : : !! Uses Gaussians for fully nonlocal form, analytic expressions.
263 : : !!
264 : : !! INPUTS
265 : : !! h1p=factor defining strength of 1st projector for l=1 channel
266 : : !! h1s=factor defining strength of 1st projector for l=0 channel
267 : : !! h2s=factor defining strength of 2nd projector for l=0 channel
268 : : !! lnmax=max. number of (l,n) components over all type of psps
269 : : !! mqgrid=number of grid points for qgrid
270 : : !! qgrid(mqgrid)=array of |G| values
271 : : !! rrp=core radius for p channel (bohr)
272 : : !! rrs=core radius for s channel (bohr)
273 : : !!
274 : : !! OUTPUT
275 : : !! ekb(lnmax)=Kleinman-Bylander energy
276 : : !! ffspl(mqgrid,2,lnmax)=Kleinman-Bylander form factor f_l(q) and
277 : : !! second derivative from spline fit for each angular momentum
278 : : !! and each projector
279 : : !!
280 : : !! SOURCE
281 : :
282 : 105 : subroutine psp2nl(ekb,ffspl,h1p,h1s,h2s,lnmax,mqgrid,qgrid,rrp,rrs)
283 : :
284 : : !Arguments ------------------------------------
285 : : !scalars
286 : : integer,intent(in) :: lnmax,mqgrid
287 : : real(dp),intent(in) :: h1p,h1s,h2s,rrp,rrs
288 : : !arrays
289 : : real(dp),intent(in) :: qgrid(mqgrid)
290 : : real(dp),intent(inout) :: ekb(lnmax),ffspl(mqgrid,2,lnmax) !vz_i
291 : :
292 : : !Local variables-------------------------------
293 : : !scalars
294 : : integer :: iln,iqgrid
295 : : real(dp) :: qmax,yp1,ypn
296 : : !arrays
297 : 105 : real(dp),allocatable :: work(:)
298 : :
299 : : ! *************************************************************************
300 : :
301 [ - + + - : 315 : ABI_MALLOC(work,(mqgrid))
+ - + - -
+ - + ]
302 : :
303 : : !Kleinman-Bylander energies ekb were set to zero in calling program
304 : :
305 : : !Compute KB energies
306 : 105 : iln=0
307 [ + - ]: 105 : if (abs(h1s)>1.d-12) then
308 : 105 : iln=iln+1
309 : 105 : ekb(iln)=h1s*32.d0*rrs**3*(pi**(2.5d0)/(4.d0*pi)**2)
310 : : end if
311 [ + + ]: 105 : if (abs(h2s)>1.d-12) then
312 : 104 : iln=iln+1
313 : 104 : ekb(iln) =h2s*(128.d0/15.d0)*rrs**3*(pi**(2.5d0)/(4.d0*pi)**2)
314 : : end if
315 [ + + ]: 105 : if (abs(h1p)>1.d-12) then
316 : 104 : iln=iln+1
317 : 104 : ekb(iln)=h1p*(64.d0/3.d0)*rrp**5*(pi**(2.5d0)/(4.d0*pi)**2)
318 : : end if
319 : :
320 : : !Compute KB form factor
321 : 105 : iln=0
322 : :
323 : : !l=0 first projector
324 [ + - ]: 105 : if (abs(h1s)>1.d-12) then
325 : 316974 : iln=iln+1
326 [ + + ]: 316974 : do iqgrid=1,mqgrid
327 : 316974 : ffspl(iqgrid,1,iln)=exp(-0.5d0*(two_pi*qgrid(iqgrid)*rrs)**2)
328 : : end do
329 : : ! Compute yp1,ypn=derivatives of f(q) at q=0, q=qgrid(mqgrid)
330 : 105 : yp1=0.d0
331 : 105 : qmax=qgrid(mqgrid)
332 : 105 : ypn=-4.d0*pi**2*qmax*rrs**2*exp(-0.5d0*(two_pi*qmax*rrs)**2)
333 : : ! Fit spline to get second derivatives by spline fit
334 : 105 : call spline(qgrid,ffspl(:,1,iln),mqgrid,yp1,ypn,ffspl(:,2,iln))
335 : : ! else
336 : : ! or else put first projector nonlocal correction at l=0 to 0
337 : : ! ffspl(:,:,iln)=0.0d0
338 : : end if
339 : :
340 : : !l=0 second projector
341 [ + + ]: 105 : if (abs(h2s)>1.d-12) then
342 : 104 : iln=iln+1
343 [ + + ]: 313972 : do iqgrid=1,mqgrid
344 : : ffspl(iqgrid,1,iln)=exp(-0.5d0*(two_pi*qgrid(iqgrid)*rrs)**2) * &
345 : 313972 : & (3.d0-(two_pi*qgrid(iqgrid)*rrs)**2)
346 : : end do
347 : : ! Compute yp1,ypn=derivatives of f(q) at q=0, q=qgrid(mqgrid)
348 : 104 : yp1=0.d0
349 : 104 : qmax=qgrid(mqgrid)
350 : : ypn=4.d0*pi**2*qmax*rrs**2*exp(-0.5d0*(two_pi*qmax*rrs)**2) * &
351 : 104 : & (-5.d0+(two_pi*qmax*rrs)**2)
352 : : ! Fit spline to get second derivatives by spline fit
353 : 104 : call spline(qgrid,ffspl(:,1,iln),mqgrid,yp1,ypn,ffspl(:,2,iln))
354 : : ! else if(mproj>=2)then
355 : : ! or else put second projector nonlocal correction at l=0 to 0
356 : : ! ffspl(:,:,iln)=0.0d0
357 : : end if
358 : :
359 : : !l=1 first projector
360 [ + + ]: 105 : if (abs(h1p)>1.d-12) then
361 : 104 : iln=iln+1
362 [ + + ]: 313972 : do iqgrid=1,mqgrid
363 : : ffspl(iqgrid,1,iln)=exp(-0.5d0*(two_pi*qgrid(iqgrid)*rrp)**2) * &
364 : 313972 : & (two_pi*qgrid(iqgrid))
365 : : end do
366 : : ! Compute yp1,ypn=derivatives of f(q) at q=0, q=qgrid(mqgrid)
367 : 104 : yp1=two_pi
368 : 104 : qmax=qgrid(mqgrid)
369 : 104 : ypn=-two_pi*((two_pi*qmax*rrp)**2-1.d0) * exp(-0.5d0*(two_pi*qmax*rrp)**2)
370 : : ! Fit spline to get second derivatives by spline fit
371 : 104 : call spline(qgrid,ffspl(:,1,iln),mqgrid,yp1,ypn,ffspl(:,2,iln))
372 : : ! else if(mpsang>=2)then
373 : : ! or else put first projector l=1 nonlocal correction to 0
374 : : ! ffspl(:,:,iln)=0.0d0
375 : : end if
376 : :
377 [ - + ]: 105 : ABI_FREE(work)
378 : :
379 : 105 : end subroutine psp2nl
380 : : !!***
381 : :
382 : : !!****f* ABINIT/psp2lo
383 : : !! NAME
384 : : !! psp2lo
385 : : !!
386 : : !! FUNCTION
387 : : !! Treat local part of Goedecker-Teter-Hutter pseudopotentials (pspcod=2),
388 : : !! as well as Hartwigsen-Goedecker-Hutter pseudopotentials (pspcod=3)
389 : : !!
390 : : !! INPUTS
391 : : !! cc1,2,3,4=parameters from analytic pseudopotential form
392 : : !! mqgrid=number of grid points in q from 0 to qmax.
393 : : !! qgrid(mqgrid)=values of q (or G) on grid from 0 to qmax (bohr^-1)
394 : : !! if vlspl_recipSpace is .true. else values of r on grid from
395 : : !! 0 to 2pi / qmax * mqgrid_ff (bohr).
396 : : !! rloc=local pseudopotential core radius (bohr)
397 : : !! vlspl_recipSpace= .true. if computation of vlspl is done in reciprocal space
398 : : !! zion=valence charge of atom
399 : : !! parameters for local potential: rloc,c1,c2,c3,c4
400 : : !!
401 : : !! OUTPUT
402 : : !! dvloc(mqgrid)=dVloc(r)/dr (only allocated if vlspl_recipSpace is false).
403 : : !! epsatm=$4\pi\int[r^2 (v(r)+\frac{Zv}{r} dr]$
404 : : !!{{\ \begin{eqnarray}
405 : : !! q2vq(mqgrid)&=&q^2 v(q) \nonumber \\
406 : : !! &=&-Zv/\pi
407 : : !! +q^2 4\pi\int[(\frac{\sin(2\pi qr)}{2\pi qr})(r^2 v(r)+r Zv)dr]\nonumber\\
408 : : !! &=&\exp(-K^2*rloc^2/2) \nonumber \\
409 : : !! && *(-\frac{zion}{\pi}+(\frac{K^2*rloc^3}{\sqrt{2*\pi}}*
410 : : !! (c1+c2*(3-(rloc*K)^2) \nonumber \\
411 : : !! && +c3*(15-10(rloc*K)^2+(rloc*K)^4) \nonumber \\
412 : : !! && +c4*(105-105*(rloc*K)^2+21*(rloc*K)^4-(rloc*K)^6)) \nonumber
413 : : !!\end{eqnarray} }}
414 : : !! for GTH vloc with $K=(2\pi q)$.
415 : : !! yp1,ypn=derivative of q^2 v(q) wrt q at q=0 and q=qmax
416 : : !! (needed for spline fitter).
417 : : !!
418 : : !! SOURCE
419 : :
420 : 658 : subroutine psp2lo(cc1,cc2,cc3,cc4,dvloc,epsatm,mqgrid,qgrid,q2vq,&
421 : : & rloc,vlspl_recipSpace,yp1,ypn,zion)
422 : :
423 : : !Arguments ------------------------------------
424 : : !scalars
425 : : integer,intent(in) :: mqgrid
426 : : real(dp),intent(in) :: cc1,cc2,cc3,cc4,rloc,zion
427 : : real(dp),intent(out) :: epsatm,yp1,ypn
428 : : logical,intent(in) :: vlspl_recipSpace
429 : : !arrays
430 : : real(dp),intent(in) :: qgrid(mqgrid)
431 : : real(dp),intent(out) :: dvloc(mqgrid),q2vq(mqgrid)
432 : :
433 : : !Local variables-------------------------------
434 : : !scalars
435 : : integer :: iqgrid
436 : : real(dp) :: erfValue,gaussValue,polyValue,qmax,rq,rq2
437 : : character(len=500) :: msg
438 : :
439 : : ! *************************************************************************
440 : :
441 : : !Compute epsatm = lim(q->0) [Vloc(q) + zion/(Pi*q^2)]
442 : : epsatm=2.d0*pi*rloc**2*zion+(2.d0*pi)**(1.5d0)*rloc**3*&
443 : 658 : & (cc1+3.d0*cc2+15.d0*cc3+105.d0*cc4)
444 : :
445 : : !If vlspl_recipSpace is .true., we compute V(q)*q^2 in reciprocal space,
446 : : !else we compute V(r) in real space.
447 [ + - ]: 658 : if (vlspl_recipSpace) then
448 : 658 : write(msg, '(a)' ) '- Local part computed in reciprocal space.'
449 : 658 : call wrtout(ab_out,msg,'COLL')
450 : 658 : call wrtout(std_out, msg,'COLL')
451 : :
452 : : ! d(q^2*V(q))/d(q) at q=0 and q=qmax
453 : 658 : qmax=qgrid(mqgrid)
454 : 658 : rq2=(2.d0*pi*qmax*rloc)**2
455 : 658 : yp1=0.d0
456 : : ypn= (2.d0*pi*qmax*rloc**2)*exp(-0.5d0*rq2)* &
457 : : & (2.d0*zion + sqrt(2.d0*pi)*rloc*&
458 : : & (cc1*(2.d0-rq2) + cc2*(6.d0-7.d0*rq2+rq2**2) +&
459 : : & cc3*(30.d0-55.d0*rq2+16.d0*rq2**2-rq2**3) +&
460 : 658 : & cc4*(210.d0-525.d0*rq2+231.d0*rq2**2-29.d0*rq2**3+rq2**4)))
461 : : ! ypn has been tested against Maple-derived expression.
462 : :
463 : : ! Compute q^2*vloc(q) on uniform grid
464 [ + + ]: 2073916 : do iqgrid=1,mqgrid
465 : 2073258 : rq2=(2.d0*pi*qgrid(iqgrid)*rloc)**2
466 : : q2vq(iqgrid)=exp(-0.5d0*rq2)*(-zion/pi+rq2*(rloc/sqrt(2.d0*pi)) *&
467 : : & ( cc1 + cc2*(3.d0-rq2) + cc3*(15.d0-10.d0*rq2+rq2**2) +&
468 : 2073916 : & cc4*(105.d0-rq2*(105.d0-rq2*(21.d0-rq2))) ))
469 : : end do
470 : : else
471 : 0 : write(msg, '(a)' ) '- Local part computed in real space.'
472 : 0 : call wrtout(ab_out,msg,'COLL')
473 : 0 : call wrtout(std_out, msg,'COLL')
474 : :
475 : : ! Compute derivatives for splines computations
476 : 0 : yp1 = 0.d0
477 : 0 : rq2 = (qgrid(mqgrid) / rloc) ** 2
478 : 0 : erfValue = abi_derfc(sqrt(0.5d0 * rq2))
479 : 0 : ypn = - 2.0d0 * zion / sqrt(2.d0 * pi) / qgrid(mqgrid) / rloc
480 : 0 : ypn = ypn - rq2 * (cc1 + cc2 * rq2 + cc3 * rq2 ** 2 + cc4 * rq2 ** 3) / qgrid(mqgrid)
481 : 0 : ypn = ypn + (2.d0 * cc2 * rq2 + 4.d0 * cc3 * rq2 ** 2 + 6.d0 * cc4 * rq2 ** 3) / qgrid(mqgrid)
482 : 0 : ypn = ypn * exp(-0.5d0 * rq2)
483 : 0 : ypn = ypn + zion / qgrid(mqgrid) ** 2 * erfValue
484 : : ! Note that ypn has been calculated on a full-proof a4 paper sheet.
485 : :
486 : : ! Compute local potential and its first derivatives.
487 [ # # ]: 0 : do iqgrid = 1, mqgrid, 1
488 : 0 : rq2 = (qgrid(iqgrid) / rloc) ** 2
489 : : ! Compute erf() part
490 : : ! Case r = 0
491 : 0 : gaussValue = exp(-0.5d0 * rq2)
492 [ # # ]: 0 : if (qgrid(iqgrid) == 0.d0) then
493 : 0 : q2vq(iqgrid) = -zion / rloc * sqrt(2.d0 / pi)
494 : 0 : dvloc(iqgrid) = 0.d0
495 : : else
496 : 0 : erfValue = abi_derfc(sqrt(0.5d0 * rq2))
497 : 0 : q2vq(iqgrid) = -zion / qgrid(iqgrid) * (1.0d0 - erfValue)
498 : : dvloc(iqgrid) = - sqrt(2.d0 / pi) * zion * gaussValue / (qgrid(iqgrid) * rloc) - &
499 : 0 : & q2vq(iqgrid) / qgrid(iqgrid)
500 : : end if
501 : : ! Add the gaussian part
502 : 0 : polyValue = cc1 + cc2 * rq2 + cc3 * rq2 ** 2 + cc4 * rq2 ** 3
503 : 0 : q2vq(iqgrid) = q2vq(iqgrid) + gaussValue * polyValue
504 : 0 : rq = qgrid(iqgrid) / rloc
505 : : dvloc(iqgrid) = dvloc(iqgrid) - qgrid(iqgrid) / rloc ** 2 * gaussValue * polyValue + &
506 : : & gaussValue * (2.0d0 * cc2 * rq / rloc + 3.0d0 * cc3 * rq ** 3 / rloc + &
507 : 0 : & 6.0d0 * cc4 * rq ** 5 / rloc)
508 : : end do
509 : :
510 : : write(msg, '(a,f12.7,a,a,f12.7,a,a,a,f12.7)' ) &
511 : 0 : & ' | dr spline step is : ', qgrid(2), ch10, &
512 : 0 : & ' | r > ', qgrid(mqgrid) ,' is set to 0.', ch10, &
513 : 0 : & ' | last non-nul potential value is : ', q2vq(mqgrid)
514 : 0 : call wrtout(ab_out,msg,'COLL')
515 : 0 : call wrtout(std_out, msg,'COLL')
516 : : end if
517 : :
518 : 658 : end subroutine psp2lo
519 : : !!***
520 : :
521 : : !!****f* ABINIT/psp3in
522 : : !! NAME
523 : : !! psp3in
524 : : !!
525 : : !! FUNCTION
526 : : !! Initialize pspcod=3 pseudopotentials (HGH psps PRB58,3641(1998) [[cite:Hartwigsen1998]]):
527 : : !! continue to read the file, then compute the corresponding
528 : : !! local and non-local potentials.
529 : : !!
530 : : !! INPUTS
531 : : !! dtset <type(dataset_type)>=all input variables in this dataset
532 : : !! pspso=spin-orbit characteristics, govern the content of ffspl and ekb
533 : : !! if =0 : this input requires NO spin-orbit characteristics of the psp
534 : : !! if =2 : this input requires HGH characteristics of the psp
535 : : !! if =3 : this input requires HFN characteristics of the psp
536 : : !! ipsp=id in the array of the pseudo-potential.
537 : : !! zion=nominal valence of atom as specified in psp file
538 : : !!
539 : : !! OUTPUT
540 : : !! ekb(lnmax)=Kleinman-Bylander energy,
541 : : !! {{\ \begin{equation}
542 : : !! \frac{\int_0^\infty [Rl(r)^2 (Vl(r)-Vloc(r))^2 dr]}
543 : : !! {\int_0^\infty [Rl(r)^2 (Vl(r)-Vloc(r)) dr]}
544 : : !! \end{equation} }}
545 : : !! for each (l,n)
546 : : !! if any, spin-orbit components begin at l=mpsang+1
547 : : !! epsatm=$ (4\pi)\int_0^\infty [r^2 (V(r)+\frac{Zv}{r}) dr]$ (hartree)
548 : : !! ffspl(mqgrid_ff,2,lnmax)=Kleinman-Bylander form factor f_l(q) and
549 : : !! second derivative from spline fit for each angular momentum and
550 : : !! each projector; if any, spin-orbit components begin at l=mpsang+1
551 : : !! indlmn(6,i)= array giving l,m,n,lm,ln,s for i=ln (if useylm=0)
552 : : !! or i=lmn (if useylm=1)
553 : : !! nproj(mpssoang)=number of projection functions for each angular momentum
554 : : !! vlspl(mqgrid_ff,2)=q^2 Vloc(q) and second derivatives from spline fit
555 : : !!
556 : : !! SIDE EFFECTS
557 : : !! Input/output
558 : : !! lmax : at input =value of lmax mentioned at the second line of the psp file
559 : : !! at output= 1
560 : : !! psps <type(pseudopotential_type)>=at output, values depending on the read
561 : : !! pseudo are set.
562 : : !! | lmnmax(IN)=if useylm=1, max number of (l,m,n) comp. over all type of psps
563 : : !! | =if useylm=0, max number of (l,n) comp. over all type of psps
564 : : !! | lnmax(IN)=max. number of (l,n) components over all type of psps
565 : : !! | angular momentum of nonlocal pseudopotential
566 : : !! | mpsang(IN)= 1+maximum angular momentum for nonlocal pseudopotentials
567 : : !! | mpssoang(IN)= 1+maximum (spin*angular momentum) for nonlocal pseudopotentials
568 : : !! | mqgrid_ff(IN)=dimension of q (or G) grid for arrays.
569 : : !! | qgrid_ff(mqgrid_ff)(IN)=values of q on grid from 0 to qmax (bohr^-1) for nl form factors
570 : : !! | useylm(IN)=governs the way the nonlocal operator is to be applied:
571 : : !! | 1=using Ylm, 0=using Legendre polynomials
572 : : !!
573 : : !! SOURCE
574 : :
575 : 318 : subroutine psp3in(dtset, ekb, epsatm, ffspl, indlmn, ipsp, lmax, nproj, psps, pspso, vlspl, zion)
576 : :
577 : : !Arguments ------------------------------------
578 : : !scalars
579 : : integer,intent(in) :: ipsp,pspso
580 : : integer,intent(inout) :: lmax
581 : : real(dp),intent(in) :: zion
582 : : real(dp),intent(out) :: epsatm
583 : : type(dataset_type),intent(in) :: dtset
584 : : type(pseudopotential_type),intent(inout) :: psps
585 : : !arrays
586 : : integer,intent(out) :: indlmn(6,psps%lmnmax),nproj(psps%mpssoang)
587 : : real(dp),intent(inout) :: ekb(psps%lnmax),ffspl(psps%mqgrid_ff,2,psps%lnmax)!vz_i
588 : : real(dp),intent(out) :: vlspl(psps%mqgrid_ff,2)
589 : :
590 : : !Local variables-------------------------------
591 : : !scalars
592 : : integer :: iln,iln0,index,ipsang,jj,kk,ll,mm,mproj,nn,nso
593 : : real(dp) :: cc1,cc2,cc3,cc4,h11d,h11f,h11p,h11s,h22d,h22p,h22s,h33d,h33p,h33s
594 : : real(dp) :: k11d,k11f,k11p,k22d,k22p,k33d,k33p,rloc
595 : : real(dp) :: rrd,rrf,rrp,rrs,yp1,ypn
596 : : character(len=500) :: msg,errmsg
597 : : !arrays
598 : 318 : real(dp),allocatable :: dvlspl(:),ekb_so(:,:),ekb_sr(:,:),ffspl_so(:,:,:,:)
599 : 318 : real(dp),allocatable :: ffspl_sr(:,:,:,:),work_space(:),work_spl(:)
600 : :
601 : : ! ***************************************************************************
602 : :
603 : : !Set various terms to 0 in case not defined below
604 : : !HGH values
605 : 318 : rloc=zero ; rrs=zero ; h11p=zero ; k33p=zero ; k11d=zero;
606 : 318 : cc1=zero ; h11s=zero ; h22p=zero ; rrd=zero ; k22d=zero;
607 : 318 : cc2=zero ; h22s=zero ; h33p=zero ; h11d=zero ; k33d=zero;
608 : 318 : cc3=zero ; h33s=zero ; k11p=zero ; h22d=zero ; h11f=zero;
609 : 318 : cc4=zero ; rrp=zero ; k22p=zero ; h33d=zero ; k11f=zero;
610 : 318 : rrf=zero
611 [ + + ]: 1802 : nproj(1:psps%mpssoang)=0
612 : :
613 : : !Read and write different lines of the pseudopotential file
614 : :
615 [ + - ]: 318 : read (tmp_unit,*,err=10,iomsg=errmsg) rloc,cc1,cc2,cc3,cc4
616 : 318 : write(msg, '(a,f12.7)' ) ' rloc=',rloc
617 : 318 : call wrtout(ab_out,msg,'COLL')
618 : 318 : call wrtout(std_out, msg,'COLL')
619 : 318 : write(msg, '(a,f12.7,a,f12.7,a,f12.7,a,f12.7)' )' cc1 =',cc1,'; cc2 =',cc2,'; cc3 =',cc3,'; cc4 =',cc4
620 : 318 : call wrtout(ab_out,msg,'COLL')
621 : 318 : call wrtout(std_out, msg,'COLL')
622 : :
623 : : !For the time being, the s state line must be present and is read,
624 : : !even for local pseudopotentials (zero must appear)
625 [ + - ]: 318 : read (tmp_unit,*,err=10,iomsg=errmsg) rrs,h11s,h22s,h33s
626 : 318 : write(msg, '(a,f12.7,a,f12.7,a,f12.7,a,f12.7)' )' rrs =',rrs,'; h11s=',h11s,'; h22s=',h22s,'; h33s=',h33s
627 : 318 : call wrtout(ab_out,msg,'COLL')
628 : 318 : call wrtout(std_out, msg,'COLL')
629 : :
630 [ + + ]: 318 : if (lmax > 0) then
631 : :
632 [ + - ]: 298 : read (tmp_unit,*,err=10,iomsg=errmsg) rrp,h11p,h22p,h33p
633 : 298 : write(msg, '(a,f12.7,a,f12.7,a,f12.7,a,f12.7)' )' rrp =',rrp,'; h11p=',h11p,'; h22p=',h22p,'; h33p=',h33p
634 : 298 : call wrtout(ab_out,msg,'COLL')
635 : 298 : call wrtout(std_out, msg,'COLL')
636 : :
637 [ + - ]: 298 : read (tmp_unit,*,err=10,iomsg=errmsg) k11p,k22p,k33p
638 : 298 : write(msg, '(a,f12.7,a,f12.7,a,f12.7)' )' k11p=',k11p,'; k22p=',k22p,'; k33p=',k33p
639 : 298 : call wrtout(ab_out,msg,'COLL')
640 : 298 : call wrtout(std_out, msg,'COLL')
641 : :
642 : : end if
643 : :
644 [ + + ]: 318 : if (lmax > 1) then
645 [ + - ]: 250 : read (tmp_unit,*,err=10,iomsg=errmsg) rrd,h11d,h22d,h33d
646 : 250 : write(msg, '(a,f12.7,a,f12.7,a,f12.7,a,f12.7)' )' rrd =',rrd,'; h11d=',h11d,'; h22d=',h22d,'; h33d=',h33d
647 : 250 : call wrtout(ab_out,msg,'COLL')
648 : 250 : call wrtout(std_out, msg,'COLL')
649 : :
650 [ + - ]: 250 : read (tmp_unit,*,err=10,iomsg=errmsg) k11d,k22d,k33d
651 : 250 : write(msg, '(a,f12.7,a,f12.7,a,f12.7)' )' k11d=',k11d,'; k22d=',k22d,'; k33d=',k33d
652 : 250 : call wrtout(ab_out,msg,'COLL')
653 : 250 : call wrtout(std_out, msg,'COLL')
654 : : end if
655 : :
656 [ + + ]: 318 : if (lmax > 2) then
657 [ + - ]: 2 : read (tmp_unit,*,err=10,iomsg=errmsg) rrf,h11f
658 : 2 : write(msg, '(a,f12.7,a,f12.7)' )' rrf =',rrf,'; h11f=',h11f
659 : 2 : call wrtout(ab_out,msg,'COLL')
660 : 2 : call wrtout(std_out, msg,'COLL')
661 : :
662 [ + - ]: 2 : read (tmp_unit,*,err=10,iomsg=errmsg) k11f
663 : 2 : write(msg, '(a,f12.7)' )' k11f=',k11f
664 : 2 : call wrtout(ab_out,msg,'COLL')
665 : 2 : call wrtout(std_out, msg,'COLL')
666 : : end if
667 : :
668 [ + + ]: 318 : if (abs(h11s)>1.d-08) nproj(1)=1
669 [ + + ]: 318 : if (abs(h22s)>1.d-08) nproj(1)=2
670 [ + + ]: 318 : if (abs(h33s)>1.d-08) nproj(1)=3
671 : :
672 [ + + ]: 318 : if (abs(h11p)>1.d-08) then
673 : 273 : nproj(2)=1
674 [ - + ]: 273 : if (lmax<1) then
675 : 0 : write(msg, '(a,a,a,a,i5,a,e12.4,a,a)' ) ch10,&
676 : 0 : & ' psp3in : COMMENT -',ch10,&
677 : 0 : & ' input lmax=',lmax,' does not agree with input h11p=',h11p,ch10,&
678 : 0 : & ' setting lmax to 1'
679 : 0 : call wrtout(ab_out,msg,'COLL')
680 : 0 : call wrtout(std_out, msg,'COLL')
681 : 0 : lmax=1
682 : : end if
683 : : end if
684 : :
685 [ + + ]: 318 : if (abs(h22p)>1.d-08) then
686 : 252 : nproj(2)=2
687 [ - + ]: 252 : if (lmax<1) then
688 : 0 : write(msg, '(a,a,a,a,i5,a,e12.4,a,a)' ) ch10,&
689 : 0 : & ' psp3in : COMMENT -',ch10,&
690 : 0 : & ' input lmax=',lmax,' does not agree with input h22p=',h22p,ch10,&
691 : 0 : & ' setting lmax to 1'
692 : 0 : call wrtout(ab_out,msg,'COLL')
693 : 0 : call wrtout(std_out, msg,'COLL')
694 : 0 : lmax=1
695 : : end if
696 : : end if
697 : :
698 [ + + ]: 318 : if (abs(h33p)>1.d-08) then
699 : 2 : nproj(2)=3
700 [ - + ]: 2 : if (lmax<1) then
701 : 0 : write(msg, '(a,a,a,a,i5,a,e12.4,a,a)' ) ch10,&
702 : 0 : & ' psp3in : COMMENT -',ch10,&
703 : 0 : & ' input lmax=',lmax,' does not agree with input h33p=',h33p,ch10,&
704 : 0 : & ' setting lmax to 1'
705 : 0 : call wrtout(ab_out,msg,'COLL')
706 : 0 : call wrtout(std_out, msg,'COLL')
707 : 0 : lmax=1
708 : : end if
709 : : end if
710 : :
711 [ + + ]: 318 : if (abs(h11d)>1.d-08) then
712 : 250 : nproj(3)=1
713 [ - + ]: 250 : if (lmax<2) then
714 : 0 : write(msg, '(a,a,a,a,i5,a,e12.4,a,a)' ) ch10,&
715 : 0 : & ' psp3in : COMMENT -',ch10,&
716 : 0 : & ' input lmax=',lmax,' does not agree with input h11d=',h11d,ch10,&
717 : 0 : & ' setting lmax to 2'
718 : 0 : call wrtout(ab_out,msg,'COLL')
719 : 0 : call wrtout(std_out, msg,'COLL')
720 : 0 : lmax=2
721 : : end if
722 : : end if
723 : :
724 [ + + ]: 318 : if (abs(h22d)>1.d-08) then
725 : 6 : nproj(3)=2
726 [ - + ]: 6 : if (lmax<2) then
727 : 0 : write(msg, '(a,a,a,a,i5,a,e12.4,a,a)' ) ch10,&
728 : 0 : & ' psp3in : COMMENT -',ch10,&
729 : 0 : & ' input lmax=',lmax,' does not agree with input h22d=',h22d,ch10,&
730 : 0 : & ' setting lmax to 2'
731 : 0 : call wrtout(ab_out,msg,'COLL')
732 : 0 : call wrtout(std_out, msg,'COLL')
733 : 0 : lmax=2
734 : : end if
735 : : end if
736 : :
737 [ - + ]: 318 : if (abs(h33d)>1.d-08) then
738 : 0 : nproj(3)=3
739 [ # # ]: 0 : if (lmax<2) then
740 : 0 : write(msg, '(a,a,a,a,i5,a,e12.4,a,a)' ) ch10,&
741 : 0 : & ' psp3in : COMMENT -',ch10,&
742 : 0 : & ' input lmax=',lmax,' does not agree with input h33d=',h33d,ch10,&
743 : 0 : & ' setting lmax to 2'
744 : 0 : call wrtout(ab_out,msg,'COLL')
745 : 0 : call wrtout(std_out, msg,'COLL')
746 : 0 : lmax=2
747 : : end if
748 : : end if
749 : :
750 [ + + ]: 318 : if (abs(h11f)>1.d-08) then
751 : 2 : nproj(4)=1
752 [ - + ]: 2 : if (lmax<3) then
753 : 0 : write(msg, '(a,a,a,a,i5,a,e12.4,a,a)' ) ch10,&
754 : 0 : & ' psp3in : COMMENT -',ch10,&
755 : 0 : & ' input lmax=',lmax,' does not agree with input h11f=',h11f,ch10,&
756 : 0 : & ' setting lmax to 3'
757 : 0 : call wrtout(ab_out,msg,'COLL')
758 : 0 : call wrtout(std_out, msg,'COLL')
759 : 0 : lmax=3
760 : : end if
761 : : end if
762 : :
763 [ + + ]: 318 : if(pspso/=0) then
764 : :
765 [ + - ]: 28 : if (abs(k11p)>1.d-08) then
766 : 28 : nproj(psps%mpsang+1)=1
767 [ - + ]: 28 : if (lmax<1) then
768 : 0 : write(msg, '(a,a,a,a,i5,a,e12.4,a,a)' ) ch10,&
769 : 0 : & ' psp3in : COMMENT -',ch10,&
770 : 0 : & ' input lmax=',lmax,' does not agree with input k11p=',k11p,ch10,&
771 : 0 : & ' setting lmax to 1'
772 : 0 : call wrtout(ab_out,msg,'COLL')
773 : 0 : call wrtout(std_out, msg,'COLL')
774 : 0 : lmax=1
775 : : end if
776 : : end if
777 : :
778 [ + - ]: 28 : if (abs(k22p)>1.d-08) then
779 : 28 : nproj(psps%mpsang+1)=2
780 [ - + ]: 28 : if (lmax<1) then
781 : 0 : write(msg, '(a,a,a,a,i5,a,e12.4,a,a)' ) ch10,&
782 : 0 : & ' psp3in : COMMENT -',ch10,&
783 : 0 : & ' input lmax=',lmax,' does not agree with input k22p=',k22p,ch10,&
784 : 0 : & ' setting lmax to 1'
785 : 0 : call wrtout(ab_out,msg,'COLL')
786 : 0 : call wrtout(std_out, msg,'COLL')
787 : 0 : lmax=1
788 : : end if
789 : : end if
790 : :
791 : :
792 [ + + ]: 28 : if (abs(k33p)>1.d-08) then
793 : 2 : nproj(psps%mpsang+1)=3
794 [ - + ]: 2 : if (lmax<1) then
795 : 0 : write(msg, '(a,a,a,a,i5,a,e12.4,a,a)' ) ch10,&
796 : 0 : & ' psp3in : COMMENT -',ch10,&
797 : 0 : & ' input lmax=',lmax,' does not agree with input k33p=',k33p,ch10,&
798 : 0 : & ' setting lmax to 1'
799 : 0 : call wrtout(ab_out,msg,'COLL')
800 : 0 : call wrtout(std_out, msg,'COLL')
801 : 0 : lmax=1
802 : : end if
803 : : end if
804 : :
805 [ + + ]: 28 : if (abs(k11d)>1.d-08) then
806 : 26 : nproj(psps%mpsang+2)=1
807 [ - + ]: 26 : if (lmax<2) then
808 : 0 : write(msg, '(a,a,a,a,i5,a,e12.4,a,a)' ) ch10,&
809 : 0 : & ' psp3in : COMMENT -',ch10,&
810 : 0 : & ' input lmax=',lmax,' does not agree with input k11d=',k11d,ch10,&
811 : 0 : & ' setting lmax to 2'
812 : 0 : call wrtout(ab_out,msg,'COLL')
813 : 0 : call wrtout(std_out, msg,'COLL')
814 : 0 : lmax=2
815 : : end if
816 : : end if
817 : :
818 [ + + ]: 28 : if (abs(k22d)>1.d-08) then
819 : 4 : nproj(psps%mpsang+2)=2
820 [ - + ]: 4 : if (lmax<2) then
821 : 0 : write(msg, '(a,a,a,a,i5,a,e12.4,a,a)' ) ch10,&
822 : 0 : & ' psp3in : COMMENT -',ch10,&
823 : 0 : & ' input lmax=',lmax,' does not agree with input k22d=',k22d,ch10,&
824 : 0 : & ' setting lmax to 2'
825 : 0 : call wrtout(ab_out,msg,'COLL')
826 : 0 : call wrtout(std_out, msg,'COLL')
827 : 0 : lmax=2
828 : : end if
829 : : end if
830 : :
831 [ - + ]: 28 : if (abs(k33d)>1.d-08) then
832 : 0 : nproj(psps%mpsang+2)=3
833 [ # # ]: 0 : if (lmax<2) then
834 : 0 : write(msg, '(a,a,a,a,i5,a,e12.4,a,a)' ) ch10,&
835 : 0 : & ' psp3in : COMMENT -',ch10,&
836 : 0 : & ' input lmax=',lmax,' does not agree with input k33d=',k33d,ch10,&
837 : 0 : & ' setting lmax to 2'
838 : 0 : call wrtout(ab_out,msg,'COLL')
839 : 0 : call wrtout(std_out, msg,'COLL')
840 : 0 : lmax=2
841 : : end if
842 : : end if
843 : :
844 [ - + ]: 28 : if (abs(k11f)>1.d-08) then
845 : 0 : nproj(psps%mpsang+3)=1
846 [ # # ]: 0 : if (lmax<3) then
847 : 0 : write(msg, '(a,a,a,a,i5,a,e12.4,a,a)' ) ch10,&
848 : 0 : & ' psp3in : COMMENT -',ch10,&
849 : 0 : & ' input lmax=',lmax,' does not agree with input k11f=',k11f,ch10,&
850 : 0 : & ' setting lmax to 3'
851 : 0 : call wrtout(ab_out,msg,'COLL')
852 : 0 : call wrtout(std_out, msg,'COLL')
853 : 0 : lmax=3
854 : : end if
855 : : end if
856 : :
857 : : end if
858 : :
859 : : !Store the coefficients.
860 : 318 : psps%gth_params%set(ipsp) = .true.
861 [ + + ]: 2544 : psps%gth_params%psppar(0, :, ipsp) = (/ rloc, cc1, cc2, cc3, cc4, zero, zero /)
862 [ + + ]: 2544 : psps%gth_params%psppar(1, :, ipsp) = (/ rrs, h11s, h22s, h33s, zero, zero, zero /)
863 [ + + ]: 2544 : psps%gth_params%psppar(2, :, ipsp) = (/ rrp, h11p, h22p, h33p, zero, zero, zero /)
864 [ + + ]: 2544 : psps%gth_params%psppar(3, :, ipsp) = (/ rrd, h11d, h22d, h33d, zero, zero, zero /)
865 [ + + ]: 2544 : psps%gth_params%psppar(4, :, ipsp) = (/ rrf, h11f, zero, zero, zero, zero, zero /)
866 : :
867 : : !Store the k coefficients
868 [ + + ]: 1272 : psps%gth_params%psp_k_par(1, :, ipsp) = (/ zero, zero, zero /)
869 [ + + ]: 1272 : psps%gth_params%psp_k_par(2, :, ipsp) = (/ k11p, k22p, k33p /)
870 [ + + ]: 1272 : psps%gth_params%psp_k_par(3, :, ipsp) = (/ k11d, k22d, k33d /)
871 [ + + ]: 1272 : psps%gth_params%psp_k_par(4, :, ipsp) = (/ k11f, zero, zero /)
872 : :
873 : : !Additionnal wavelet parameters
874 [ - + ]: 318 : if (dtset%usewvl == 1) then
875 : 0 : call wvl_descr_psp_fill(psps%gth_params, ipsp, 0, int(psps%zionpsp(ipsp)), int(psps%znuclpsp(ipsp)), tmp_unit)
876 : : end if
877 : :
878 : : !Initialize array indlmn array giving l,m,n,ln,lm,s for i=lmn
879 [ + + ]: 318 : nso=1;if(pspso/=0) nso=2
880 [ + + + + ]: 19295 : index=0;iln=0;indlmn(:,:)=0
881 [ + + ]: 664 : do nn=1,nso
882 [ + + ]: 1586 : do ipsang=1+(nn-1)*(lmax+1),nn*lmax+1
883 [ + + ]: 1268 : if (nproj(ipsang)>0) then
884 : 875 : ll=ipsang-(nn-1)*lmax-1
885 [ + + ]: 2553 : do kk=1,nproj(ipsang)
886 : 1678 : iln=iln+1
887 [ + + ]: 4249 : do mm=1,2*ll*psps%useylm+1
888 : 1696 : index=index+1
889 : 1696 : indlmn(1,index)=ll
890 : 1696 : indlmn(2,index)=mm-ll*psps%useylm-1
891 : 1696 : indlmn(3,index)=kk
892 : 1696 : indlmn(4,index)=ll*ll+(1-psps%useylm)*ll+mm
893 : 1696 : indlmn(5,index)=iln
894 : 3374 : indlmn(6,index)=nn
895 : : end do
896 : : end do
897 : : end if
898 : : end do
899 : : end do
900 : :
901 [ - + + - : 954 : ABI_MALLOC(dvlspl,(psps%mqgrid_ff))
+ - + - -
+ - + ]
902 : : !First, the local potential -- compute on q grid and fit spline
903 : 318 : call psp2lo(cc1,cc2,cc3,cc4,dvlspl,epsatm,psps%mqgrid_ff,psps%qgrid_ff,vlspl(:,1),rloc,.true.,yp1,ypn,zion)
904 [ - + ]: 318 : ABI_FREE(dvlspl)
905 : :
906 : : !DEBUG
907 : : !write(std_out,*)' psp3in : after psp2lo '
908 : : !ENDDEBUG
909 : :
910 : : !Fit spline to q^2 V(q) (Numerical Recipes subroutine)
911 [ - + + - : 954 : ABI_MALLOC(work_space,(psps%mqgrid_ff))
+ - + - -
+ - + ]
912 [ - + + - : 636 : ABI_MALLOC(work_spl,(psps%mqgrid_ff))
- + - + ]
913 : 318 : call spline (psps%qgrid_ff,vlspl(:,1),psps%mqgrid_ff,yp1,ypn,work_spl)
914 [ + + ]: 958908 : vlspl(:,2)=work_spl(:)
915 [ - + ]: 318 : ABI_FREE(work_space)
916 [ - + ]: 318 : ABI_FREE(work_spl)
917 : :
918 : : !Second, compute KB energies and form factors and fit splines
919 [ + + ]: 2997 : ekb(:)=zero
920 : :
921 : : !Check if any nonlocal projectors are being used
922 [ + + ]: 1802 : mproj=maxval(nproj)
923 [ + + ]: 318 : if (mproj>0) then
924 : :
925 [ - + + - : 1192 : ABI_MALLOC(ekb_sr,(psps%mpsang,mproj))
- + + - +
- + - - +
- + ]
926 [ - + + - : 1490 : ABI_MALLOC(ffspl_sr,(psps%mqgrid_ff,2,psps%mpsang,mproj))
- + + - -
+ + - + -
+ - - + -
+ ]
927 [ - + + - : 894 : ABI_MALLOC(ekb_so,(psps%mpsang,mproj))
- + + - -
+ - + ]
928 [ - + + - : 1192 : ABI_MALLOC(ffspl_so,(psps%mqgrid_ff,2,psps%mpsang,mproj))
- + + - -
+ + - - +
- + ]
929 : :
930 : : call psp3nl(ekb_sr,ffspl_sr,h11s,h22s,h33s,h11p,h22p,h33p,h11d,h22d,&
931 : 298 : & h33d,h11f,mproj,psps%mpsang,psps%mqgrid_ff,psps%qgrid_ff,rrd,rrf,rrp,rrs)
932 [ + + ]: 298 : if(pspso/=0) then
933 : : call psp3nl(ekb_so,ffspl_so,zero,zero,zero,k11p,k22p,k33p,k11d,&
934 : 28 : & k22d,k33d,k11f,mproj,psps%mpsang,psps%mqgrid_ff,psps%qgrid_ff,rrd,rrf,rrp,rrs)
935 : : end if
936 : :
937 : :
938 : : ! Convert ekb and ffspl
939 : 298 : iln0=0
940 [ + + ]: 2975 : do jj=1,psps%lmnmax
941 : 2677 : iln=indlmn(5,jj)
942 [ + + ]: 2975 : if (iln>iln0) then
943 : 1678 : iln0=iln
944 [ + + ]: 1678 : if (indlmn(6,jj)<=1) then
945 : 1594 : ekb(iln)=ekb_sr(1+indlmn(1,jj),indlmn(3,jj))
946 [ + + + + ]: 9619058 : ffspl(:,:,iln)=ffspl_sr(:,:,1+indlmn(1,jj),indlmn(3,jj))
947 : : else
948 : 84 : ekb(iln)=ekb_so(1+indlmn(1,jj),indlmn(3,jj))
949 [ + + + + ]: 504420 : ffspl(:,:,iln)=ffspl_so(:,:,1+indlmn(1,jj),indlmn(3,jj))
950 : : end if
951 : : end if
952 : : end do
953 : :
954 [ - + ]: 298 : ABI_FREE(ekb_sr)
955 [ - + ]: 298 : ABI_FREE(ffspl_sr)
956 [ - + ]: 298 : ABI_FREE(ekb_so)
957 [ - + ]: 298 : ABI_FREE(ffspl_so)
958 : : end if
959 : :
960 : : return
961 : :
962 : : ! Handle IO error
963 : : 10 continue
964 : 0 : ABI_ERROR(errmsg)
965 : :
966 : : end subroutine psp3in
967 : : !!***
968 : :
969 : : !!****f* m_psp_hgh/psp3nl
970 : : !! NAME
971 : : !! psp3nl
972 : : !!
973 : : !! FUNCTION
974 : : !! Hartwigsen-Goedecker-Hutter nonlocal pseudopotential (from preprint of 1998).
975 : : !! Uses Gaussians for fully nonlocal form, analytic expressions.
976 : : !!
977 : : !! INPUTS
978 : : !! h11s=factor defining strength of 1st projector for l=0 channel
979 : : !! h22s=factor defining strength of 2nd projector for l=0 channel
980 : : !! h33s=factor defining strength of 3rd projector for l=0 channel
981 : : !! h11p=factor defining strength of 1st projector for l=1 channel
982 : : !! h22p=factor defining strength of 2nd projector for l=1 channel
983 : : !! h33p=factor defining strength of 2nd projector for l=1 channel
984 : : !! h11d=factor defining strength of 1st projector for l=2 channel
985 : : !! h22d=factor defining strength of 2nd projector for l=2 channel
986 : : !! h33d=factor defining strength of 2nd projector for l=2 channel
987 : : !! h11f=factor defining strength of 1st projector for l=3 channel
988 : : !! mproj=maximum number of projectors in any channel
989 : : !! mpsang= 1+maximum angular momentum for nonlocal pseudopotentials
990 : : !! mqgrid=number of grid points for qgrid
991 : : !! qgrid(mqgrid)=array of |G| values
992 : : !! rrd=core radius for d channel (bohr)
993 : : !! rrf=core radius for f channel (bohr)
994 : : !! rrp=core radius for p channel (bohr)
995 : : !! rrs=core radius for s channel (bohr)
996 : : !!
997 : : !! OUTPUT
998 : : !! ekb(mpsang,mproj)=Kleinman-Bylander energies
999 : : !! ffspl(mqgrid,2,mpssang,mproj)=Kleinman-Bylander form factor f_l(q) and
1000 : : !! second derivative from spline fit for each angular momentum and
1001 : : !! each projectors
1002 : : !!
1003 : : !! SOURCE
1004 : :
1005 : 326 : subroutine psp3nl(ekb,ffspl,h11s,h22s,h33s,h11p,h22p,h33p,h11d,h22d,&
1006 : 326 : & h33d,h11f,mproj,mpsang,mqgrid,qgrid,rrd,rrf,rrp,rrs)
1007 : :
1008 : : !Arguments ------------------------------------
1009 : : !scalars
1010 : : integer,intent(in) :: mproj,mpsang,mqgrid
1011 : : real(dp),intent(in) :: h11d,h11f,h11p,h11s,h22d,h22p,h22s,h33d,h33p,h33s,rrd
1012 : : real(dp),intent(in) :: rrf,rrp,rrs
1013 : : !arrays
1014 : : real(dp),intent(in) :: qgrid(mqgrid)
1015 : : real(dp),intent(out) :: ekb(mpsang,mproj),ffspl(mqgrid,2,mpsang,mproj)
1016 : :
1017 : : !Local variables-------------------------------
1018 : : !scalars
1019 : : integer :: info,iproj,iqgrid,ldz,mu,nproj,nu
1020 : : real(dp) :: qmax
1021 : : character(len=500) :: msg
1022 : : character :: jobz,uplo
1023 : : !arrays
1024 : : real(dp) :: ap(2,9),rwork1(9),work1(2,9),ww(3),yp1j(3),ypnj(3)
1025 : 326 : real(dp),allocatable :: ppspl(:,:,:,:),uu(:,:),work(:),zz(:,:,:)
1026 : :
1027 : : ! *************************************************************************
1028 : :
1029 [ - + + - : 1630 : ABI_MALLOC(ppspl,(mqgrid,2,mpsang,mproj))
- + + - -
+ + - + -
+ - - + -
+ ]
1030 [ - + + - : 978 : ABI_MALLOC(work,(mqgrid))
+ - + - -
+ - + ]
1031 : :
1032 : 326 : qmax=qgrid(mqgrid)
1033 : 326 : jobz='v'
1034 : 326 : uplo='u'
1035 [ + + + + ]: 3863 : ekb(:,:)=0.0d0
1036 : :
1037 : : !---------------------------------------------------------------
1038 : : !Treat s channel
1039 : :
1040 : 326 : nproj=0
1041 : 326 : ap(:,:)=0.0d0
1042 : : !If there is at least one s-projector
1043 [ + + ]: 326 : if ( abs(h11s) >= 1.0d-8 ) then
1044 : 298 : nproj=1 ; ldz=1 ; ap(1,1)=h11s
1045 : : end if
1046 : 326 : nproj=1
1047 : : !If there is a second projector
1048 [ + + ]: 326 : if ( abs(h22s) >= 1.0d-8 ) then
1049 : 266 : nproj=2 ; ldz=2 ; ap(1,3)=h22s
1050 : 266 : ap(1,2)=-0.5d0*sqrt(0.6d0)*h22s
1051 : : end if
1052 : : !If there is a third projector
1053 [ + + ]: 326 : if ( abs(h33s) >= 1.0d-8 ) then
1054 : 245 : nproj=3 ; ldz=3 ; ap(1,6)=h33s
1055 : 245 : ap(1,4)=0.5d0*sqrt(5.d0/21.d0)*h33s
1056 : 245 : ap(1,5)=-0.5d0*sqrt(100.d0/63.d0)*h33s
1057 : : end if
1058 : :
1059 [ + - ]: 326 : if(nproj/=0)then
1060 : :
1061 [ - + + - : 1304 : ABI_MALLOC(uu,(nproj,nproj))
- + + - +
- + - - +
- + ]
1062 [ - + + - : 1304 : ABI_MALLOC(zz,(2,nproj,nproj))
- + + - +
- + - - +
- + ]
1063 : :
1064 [ + + ]: 326 : if (nproj > 1) then
1065 : 266 : call ZHPEV(jobz,uplo,nproj,ap,ww,zz,ldz,work1,rwork1,info)
1066 [ + + + + ]: 3332 : uu(:,:)=zz(1,:,:)
1067 : : else
1068 : 60 : ww(1)=h11s
1069 : 60 : uu(1,1)=1.0d0
1070 : : end if
1071 : :
1072 : : ! Initialization of ekb, and spline fitting
1073 [ + + ]: 1163 : do iproj=1,nproj
1074 : 837 : ekb(1,iproj)=ww(iproj)*32.d0*(rrs**3)*(pi**2.5d0)/(4.d0*pi)**2
1075 [ + + ]: 837 : if(iproj==1)then
1076 [ + + ]: 982886 : do iqgrid=1,mqgrid
1077 : 982886 : ppspl(iqgrid,1,1,1)=exp(-0.5d0*(two_pi*qgrid(iqgrid)*rrs)**2)
1078 : : end do
1079 : 326 : yp1j(1)=0.d0
1080 : 326 : ypnj(1)=-(two_pi*rrs)**2*qmax*exp(-0.5d0*(two_pi*qmax*rrs)**2)
1081 [ + + ]: 511 : else if(iproj==2)then
1082 [ + + ]: 802766 : do iqgrid=1,mqgrid
1083 : : ppspl(iqgrid,1,1,2)=2.0d0/sqrt(15.0d0) &
1084 : : & *exp(-0.5d0*(two_pi*qgrid(iqgrid)*rrs)**2) &
1085 : 802766 : & *( 3.d0-(two_pi*qgrid(iqgrid)*rrs)**2 )
1086 : : end do
1087 : 266 : yp1j(2)=0.0d0
1088 : : ypnj(2)=2.0d0/sqrt(15.0d0)*(two_pi*rrs)**2*qmax &
1089 : 266 : & *exp(-0.5d0*(two_pi*qmax*rrs)**2) * (-5.d0+(two_pi*qmax*rrs)**2)
1090 [ + - ]: 245 : else if(iproj==3)then
1091 [ + + ]: 739104 : do iqgrid=1,mqgrid
1092 : : ppspl(iqgrid,1,1,3)=(4.0d0/3.0d0)/sqrt(105.0d0)*&
1093 : : & exp(-0.5d0*(two_pi*qgrid(iqgrid)*rrs)**2) * &
1094 : : & (15.0d0-10.0d0*(two_pi*qgrid(iqgrid)*rrs)**2 + &
1095 : 739104 : & (two_pi*qgrid(iqgrid)*rrs)**4)
1096 : : end do
1097 : 245 : yp1j(3)=0.0d0
1098 : : ypnj(3)=(4.0d0/3.0d0)/sqrt(105.0d0)*exp(-0.5d0*(two_pi*qmax*rrs)**2) * &
1099 : 245 : & (two_pi*rrs)**2*qmax*(-35.0d0+14d0*(two_pi*qmax*rrs)**2-(two_pi*qmax*rrs)**4)
1100 : : end if
1101 : : call spline(qgrid,ppspl(:,1,1,iproj),mqgrid,&
1102 : 1163 : & yp1j(iproj),ypnj(iproj),ppspl(:,2,1,iproj))
1103 : : end do
1104 : :
1105 : : ! Linear combination using the eigenvectors
1106 [ + + + + : 5362935 : ffspl(:,:,1,:)=0.0d0
+ + ]
1107 [ + + ]: 1163 : do mu=1,nproj
1108 [ + + ]: 3512 : do nu=1,nproj
1109 [ + + ]: 7087541 : do iqgrid=1,mqgrid
1110 : : ffspl(iqgrid,1:2,1,mu)=ffspl(iqgrid,1:2,1,mu) &
1111 [ + + ]: 21255414 : & +uu(nu,mu)*ppspl(iqgrid,1:2,1,nu)
1112 : : end do
1113 : : end do
1114 : : end do
1115 : :
1116 [ - + ]: 326 : ABI_FREE(uu)
1117 [ - + ]: 326 : ABI_FREE(zz)
1118 : : end if ! End condition on nproj(/=0)
1119 : :
1120 : : !--------------------------------------------------------------------
1121 : : !Now treat p channel
1122 : :
1123 : 326 : nproj=0
1124 : 326 : ap(:,:)=0.0d0
1125 : : !If there is at least one projector
1126 [ + + ]: 326 : if ( abs(h11p) >= 1.0d-8 ) then
1127 : 301 : nproj=1 ; ldz=1 ; ap(1,1)=h11p
1128 : : end if
1129 : : !If there is a second projector
1130 [ + + ]: 326 : if ( abs(h22p) >= 1.0d-8 ) then
1131 : 280 : nproj=2 ; ldz=2 ; ap(1,3)=h22p
1132 : 280 : ap(1,2)=-0.5d0*sqrt(5.d0/7.d0)*h22p
1133 : : end if
1134 : : !If there is a third projector
1135 [ + + ]: 326 : if ( abs(h33p) >= 1.0d-8 ) then
1136 : 4 : nproj=3 ; ldz=3 ; ap(1,6)=h33p
1137 : 4 : ap(1,4)= (1.d0/6.d0)*sqrt(35.d0/11.d0)*h33p
1138 : 4 : ap(1,5)=-(1.d0/6.d0)*(14.d0/sqrt(11.d0))*h33p
1139 : : end if
1140 : :
1141 [ + + ]: 326 : if(nproj/=0)then
1142 : :
1143 [ - + + - : 1204 : ABI_MALLOC(uu,(nproj,nproj))
- + + - +
- + - - +
- + ]
1144 [ - + + - : 1204 : ABI_MALLOC(zz,(2,nproj,nproj))
- + + - +
- + - - +
- + ]
1145 : :
1146 [ + + ]: 301 : if (nproj > 1) then
1147 : 280 : call ZHPEV(jobz,uplo,nproj,ap,ww,zz,ldz,work1,rwork1,info)
1148 [ + + + + ]: 1984 : uu(:,:)=zz(1,:,:)
1149 : : else
1150 : 21 : ww(1)=h11p
1151 : 21 : uu(1,1)=1.0d0
1152 : : end if
1153 : :
1154 : : ! Initialization of ekb, and spline fitting
1155 [ + + ]: 886 : do iproj=1,nproj
1156 : 585 : ekb(2,iproj)=ww(iproj)*64.d0*(rrp**5)*(pi**2.5d0)/(4.d0*pi)**2
1157 [ + + ]: 585 : if(iproj==1)then
1158 [ + + ]: 907836 : do iqgrid=1,mqgrid
1159 : : ppspl(iqgrid,1,2,1)=(1.0d0/sqrt(3.0d0))* &
1160 : 907836 : & exp(-0.5d0*(two_pi*qgrid(iqgrid)*rrp)**2) * (two_pi*qgrid(iqgrid))
1161 : : end do
1162 : 301 : yp1j(1)=two_pi*(1.0d0/sqrt(3.0d0))
1163 : : ypnj(1)=-two_pi*((two_pi*qmax*rrp)**2-1.d0)*exp(-0.5d0*(two_pi*qmax*rrp)**2)*&
1164 : 301 : & (1.0d0/sqrt(3.0d0))
1165 [ + + ]: 284 : else if(iproj==2)then
1166 [ + + ]: 844174 : do iqgrid=1,mqgrid
1167 : : ppspl(iqgrid,1,2,2)=(2.0d0/sqrt(105.0d0))* &
1168 : : & exp(-0.5d0*(two_pi*qgrid(iqgrid)*rrp)**2) * &
1169 : 844174 : & (two_pi*qgrid(iqgrid))*(5.0d0-(two_pi*qgrid(iqgrid)*rrp)**2)
1170 : : end do
1171 : 280 : yp1j(2)=(5.0d0*two_pi)*(2.0d0/sqrt(105.0d0))
1172 : : ypnj(2)=(2.0d0/sqrt(105.0d0))*two_pi*exp(-0.5d0*(two_pi*qmax*rrp)**2)* &
1173 : 280 : & (-8*(two_pi*qmax*rrp)**2 + (two_pi*qmax*rrp)**4 + 5.0d0)
1174 [ + - ]: 4 : else if(iproj==3)then
1175 [ + + ]: 15622 : do iqgrid=1,mqgrid
1176 : : ppspl(iqgrid,1,2,3)=(4.0d0/3.0d0)/sqrt(1155d0)*&
1177 : : & exp(-0.5d0*(two_pi*qgrid(iqgrid)*rrp)**2) * &
1178 : : & (two_pi*qgrid(iqgrid))*&
1179 : 15622 : & (35.0d0-14.0d0*(two_pi*qgrid(iqgrid)*rrp)**2+(two_pi*qgrid(iqgrid)*rrp)**4)
1180 : : end do
1181 : 4 : yp1j(3)=(35.0d0*two_pi)*(4.0d0/3.0d0)/sqrt(1155.0d0)
1182 : : ypnj(3)=(4.0d0/3.0d0)/sqrt(1155.0d0)*two_pi*exp(-0.5d0*(two_pi*qmax*rrp)**2)* &
1183 : : & (35.0d0-77.0d0*(two_pi*qmax*rrp)**2+19.0d0*(two_pi*qmax*rrp)**4 - &
1184 : 4 : & (two_pi*qmax*rrp)**6)
1185 : : end if
1186 : : call spline(qgrid,ppspl(:,1,2,iproj),mqgrid,&
1187 : 886 : & yp1j(iproj),ypnj(iproj),ppspl(:,2,2,iproj))
1188 : : end do
1189 : :
1190 : : ! Linear combination using the eigenvectors
1191 [ + + + + : 5212785 : ffspl(:,:,2,:)=0.0d0
+ + ]
1192 [ + + ]: 886 : do mu=1,nproj
1193 [ + + ]: 2047 : do nu=1,nproj
1194 [ + + ]: 3519053 : do iqgrid=1,mqgrid
1195 : : ffspl(iqgrid,1:2,2,mu)=ffspl(iqgrid,1:2,2,mu) &
1196 [ + + ]: 10553082 : & +uu(nu,mu)*ppspl(iqgrid,1:2,2,nu)
1197 : : end do
1198 : : end do
1199 : : end do
1200 : :
1201 [ - + ]: 301 : ABI_FREE(uu)
1202 [ - + ]: 301 : ABI_FREE(zz)
1203 : : end if ! End condition on nproj(/=0)
1204 : :
1205 : : !-----------------------------------------------------------------------
1206 : : !Now treat d channel.
1207 : :
1208 : 326 : nproj=0
1209 : 326 : ap(:,:)=0.0d0
1210 : : !If there is at least one projector
1211 [ + + ]: 326 : if ( abs(h11d) >= 1.0d-8 ) then
1212 : 276 : nproj=1 ; ldz=1 ; ap(1,1)=h11d
1213 : : end if
1214 : : !If there is a second projector
1215 [ + + ]: 326 : if ( abs(h22d) >= 1.0d-8 ) then
1216 : 10 : nproj=2 ; ldz=2 ; ap(1,3)=h22d
1217 : 10 : ap(1,2)=-0.5d0*sqrt(7.d0/9.d0)*h22d
1218 : : end if
1219 : : !If there is a third projector. Warning : only two projectors are allowed.
1220 [ - + ]: 326 : if ( abs(h33d) >= 1.0d-8 ) then
1221 : : write(msg, '(a,a,a)' )&
1222 : 0 : & ' only two d-projectors are allowed ',ch10,&
1223 : 0 : & ' Action: check your pseudopotential file.'
1224 : 0 : ABI_ERROR(msg)
1225 : : ! nproj=3 ; ldz=3 ; ap(1,6)=h33d
1226 : : ! ap(1,4)= 0.5d0*sqrt(63.d0/143.d0)*h33d
1227 : : ! ap(1,5)= -0.5d0*(18.d0/sqrt(143.d0))*h33d
1228 : : end if
1229 : :
1230 [ + + ]: 326 : if(nproj/=0)then
1231 : :
1232 [ - + + - : 1104 : ABI_MALLOC(uu,(nproj,nproj))
- + + - +
- + - - +
- + ]
1233 [ - + + - : 1104 : ABI_MALLOC(zz,(2,nproj,nproj))
- + + - +
- + - - +
- + ]
1234 : :
1235 [ + + ]: 276 : if (nproj > 1) then
1236 : 10 : call ZHPEV(jobz,uplo,nproj,ap,ww,zz,ldz,work1,rwork1,info)
1237 [ + + + + ]: 70 : uu(:,:)=zz(1,:,:)
1238 : : else
1239 : 266 : ww(1)=h11d
1240 : 266 : uu(1,1)=1.0d0
1241 : : end if
1242 : :
1243 : : ! Initialization of ekb, and spline fitting
1244 [ + + ]: 562 : do iproj=1,nproj
1245 : 286 : ekb(3,iproj)=ww(iproj)*128.d0*(rrd**7)*(pi**2.5d0)/(4.d0*pi)**2
1246 [ + + ]: 286 : if(iproj==1)then
1247 [ + + ]: 828552 : do iqgrid=1,mqgrid
1248 : : ppspl(iqgrid,1,3,1)=(1.0d0/sqrt(15.0d0))* &
1249 : 828552 : & exp(-0.5d0*(two_pi*qgrid(iqgrid)*rrd)**2) * (two_pi*qgrid(iqgrid))**2
1250 : : end do
1251 : 276 : yp1j(1)=0.0d0
1252 : : ypnj(1)=(1.0d0/sqrt(15.0d0))*(two_pi**2)*&
1253 : 276 : & exp(-0.5d0*(two_pi*qmax*rrd)**2)*qmax*(2d0-(two_pi*qmax*rrd)**2)
1254 [ + - ]: 10 : else if(iproj==2)then
1255 [ + + ]: 30020 : do iqgrid=1,mqgrid
1256 : : ppspl(iqgrid,1,3,2)=(2.0d0/3.0d0)/sqrt(105.0d0)* &
1257 : : & exp(-0.5d0*(two_pi*qgrid(iqgrid)*rrd)**2) * &
1258 : 30020 : & ((two_pi*qgrid(iqgrid))**2)*(7.0d0-(two_pi*qgrid(iqgrid)*rrd)**2)
1259 : : end do
1260 : 10 : yp1j(2)=0.0d0
1261 : : ypnj(2)=(2.0d0/3.0d0)/sqrt(105.0d0)*exp(-0.5d0*(two_pi*qmax*rrd)**2)* &
1262 : 10 : & qmax*(two_pi**2)*( (two_pi*qmax*rrd)**4 - 11.0d0*(two_pi*qmax*rrd)**2 + 14.0d0)
1263 : : end if
1264 : : call spline(qgrid,ppspl(:,1,3,iproj),mqgrid,&
1265 : 562 : & yp1j(iproj),ypnj(iproj),ppspl(:,2,3,iproj))
1266 : : end do
1267 : :
1268 : : ! Linear combination using the eigenvectors
1269 [ + + + + : 4918371 : ffspl(:,:,3,:)=0.0d0
+ + ]
1270 [ + + ]: 562 : do mu=1,nproj
1271 [ + + ]: 868 : do nu=1,nproj
1272 [ + + ]: 918898 : do iqgrid=1,mqgrid
1273 : : ffspl(iqgrid,1:2,3,mu)=ffspl(iqgrid,1:2,3,mu) &
1274 [ + + ]: 2755224 : & +uu(nu,mu)*ppspl(iqgrid,1:2,3,nu)
1275 : : end do
1276 : : end do
1277 : : end do
1278 : :
1279 [ - + ]: 276 : ABI_FREE(uu)
1280 [ - + ]: 276 : ABI_FREE(zz)
1281 : : end if ! End condition on nproj(/=0)
1282 : :
1283 : : !-----------------------------------------------------------------------
1284 : : !Treat now f channel (max one projector ! - so do not use ppspl)
1285 : :
1286 : : !l=3 first projector
1287 [ + + ]: 326 : if (abs(h11f)>1.d-12) then
1288 : 2 : ekb(4,1)=h11f*(256.0d0/105.0d0)*(rrf**9)*(pi**2.5d0)/(4.d0*pi)**2
1289 [ + + ]: 6004 : do iqgrid=1,mqgrid
1290 : : ffspl(iqgrid,1,4,1)=(two_pi*qgrid(iqgrid))**3* &
1291 : 6004 : & exp(-0.5d0*(two_pi*qgrid(iqgrid)*rrf)**2)
1292 : : end do
1293 : : ! Compute yp1,ypn=derivatives of f(q) at q=0, q=qgrid(mqgrid)
1294 : 2 : yp1j(1)=0d0
1295 : : ypnj(1)=(two_pi**3)*qmax**2*exp(-0.5d0*(two_pi*qmax*rrf)**2)*&
1296 : 2 : & (3.0d0-(two_pi*qmax*rrf)**2)
1297 : : ! Fit spline to get second derivatives by spline fit
1298 : : call spline(qgrid,ffspl(:,1,4,1),mqgrid,&
1299 : 2 : & yp1j(1),ypnj(1),ffspl(:,2,4,1))
1300 : : end if
1301 : :
1302 : : !-----------------------------------------------------------------------
1303 : :
1304 [ - + ]: 326 : ABI_FREE(ppspl)
1305 [ - + ]: 326 : ABI_FREE(work)
1306 : :
1307 : 326 : end subroutine psp3nl
1308 : : !!***
1309 : :
1310 : : !!****f* m_psp_hgh/psp10in
1311 : : !! NAME
1312 : : !! psp10in
1313 : : !!
1314 : : !! FUNCTION
1315 : : !! Initialize pspcod=10 pseudopotentials (formalism is the same as in HGH psps
1316 : : !! PRB58,3641(1998) [[cite:Hartwigsen1998]], but the full h and k matrices are read, allowing for using
1317 : : !! also subsequent developments such as Theor. Chem. Acc. 114, 145 (2005) [[cite:Dolg2005]]:
1318 : : !! continue to read the file, then compute the corresponding
1319 : : !! local and non-local potentials.
1320 : : !!
1321 : : !! INPUTS
1322 : : !! dtset <type(dataset_type)>=all input variables in this dataset
1323 : : !! pspso=spin-orbit characteristics, govern the content of ffspl and ekb
1324 : : !! if =0 : this input requires NO spin-orbit characteristics of the psp
1325 : : !! if =2 : this input requires HGH characteristics of the psp
1326 : : !! if =3 : this input requires HFN characteristics of the psp
1327 : : !! ipsp=id in the array of the pseudo-potential.
1328 : : !! zion=nominal valence of atom as specified in psp file
1329 : : !!
1330 : : !! OUTPUT
1331 : : !! ekb(lnmax)=Kleinman-Bylander energy,
1332 : : !! {{\ \begin{equation}
1333 : : !! \frac{\int_0^\infty [Rl(r)^2 (Vl(r)-Vloc(r))^2 dr]}
1334 : : !! {\int_0^\infty [Rl(r)^2 (Vl(r)-Vloc(r)) dr]}
1335 : : !! \end{equation} }}
1336 : : !! for each (l,n)
1337 : : !! if any, spin-orbit components begin at l=mpsang+1
1338 : : !! epsatm=$ (4\pi)\int_0^\infty [r^2 (V(r)+\frac{Zv}{r}) dr]$ (hartree)
1339 : : !! ffspl(mqgrid_ff,2,lnmax)=Kleinman-Bylander form factor f_l(q) and
1340 : : !! second derivative from spline fit for each angular momentum and
1341 : : !! each projector; if any, spin-orbit components begin at l=mpsang+1
1342 : : !! indlmn(6,i)= array giving l,m,n,lm,ln,s for i=ln (if useylm=0)
1343 : : !! or i=lmn (if useylm=1)
1344 : : !! nproj(mpssoang)=number of projection functions for each angular momentum
1345 : : !! vlspl(mqgrid_ff,2)=q^2 Vloc(q) and second derivatives from spline fit
1346 : : !!
1347 : : !! SIDE EFFECTS
1348 : : !! Input/output
1349 : : !! lmax : at input =value of lmax mentioned at the second line of the psp file
1350 : : !! at output= 1
1351 : : !! psps <type(pseudopotential_type)>=at output, values depending on the read
1352 : : !! pseudo are set.
1353 : : !! | lmnmax(IN)=if useylm=1, max number of (l,m,n) comp. over all type of psps
1354 : : !! | =if useylm=0, max number of (l,n) comp. over all type of psps
1355 : : !! | lnmax(IN)=max. number of (l,n) components over all type of psps
1356 : : !! | angular momentum of nonlocal pseudopotential
1357 : : !! | mpsang(IN)= 1+maximum angular momentum for nonlocal pseudopotentials
1358 : : !! | mpssoang(IN)= 1+maximum (spin*angular momentum) for nonlocal pseudopotentials
1359 : : !! | mqgrid_ff(IN)=dimension of q (or G) grid for arrays.
1360 : : !! | qgrid_ff(mqgrid_ff)(IN)=values of q on grid from 0 to qmax (bohr^-1) for nl form factors
1361 : : !! | useylm(IN)=governs the way the nonlocal operator is to be applied:
1362 : : !! | 1=using Ylm, 0=using Legendre polynomials
1363 : : !!
1364 : : !! SOURCE
1365 : :
1366 : 12 : subroutine psp10in(dtset, ekb, epsatm, ffspl, indlmn, ipsp, lmax, nproj, psps, pspso, vlspl, zion)
1367 : :
1368 : : !Arguments ------------------------------------
1369 : : !scalars
1370 : : integer,intent(in) :: ipsp,pspso
1371 : : integer,intent(inout) :: lmax
1372 : : real(dp),intent(in) :: zion
1373 : : real(dp),intent(out) :: epsatm
1374 : : type(dataset_type),intent(in) :: dtset
1375 : : type(pseudopotential_type),intent(inout) :: psps
1376 : : !arrays
1377 : : integer,intent(out) :: indlmn(6,psps%lmnmax),nproj(psps%mpssoang)
1378 : : real(dp),intent(out) :: ekb(psps%lnmax) !vz_i
1379 : : real(dp),intent(inout) :: ffspl(psps%mqgrid_ff,2,psps%lnmax) !vz_i
1380 : : real(dp),intent(out) :: vlspl(psps%mqgrid_ff,2)
1381 : :
1382 : : !Local variables-------------------------------
1383 : : !scalars
1384 : : integer :: ii,iln,iln0,index,ipsang,jj,kk,ll,mm,mproj,nn,nnonloc,nprl,nso
1385 : : real(dp) :: rloc,yp1,ypn
1386 : : character(len=500) :: msg,errmsg
1387 : : !arrays
1388 : 12 : integer,allocatable :: dummy_nproj(:)
1389 : : real(dp) :: cc(4)
1390 : 12 : real(dp),allocatable :: dvlspl(:),ekb_so(:,:),ekb_sr(:,:),ffspl_so(:,:,:,:)
1391 : 12 : real(dp),allocatable :: ffspl_sr(:,:,:,:),hij(:,:,:),kij(:,:,:),rr(:)
1392 : 12 : real(dp),allocatable :: work_space(:),work_spl(:)
1393 : :
1394 : : ! ***************************************************************************
1395 : :
1396 : : !Set various terms to 0 in case not defined below
1397 : : !HGH values
1398 : 12 : rloc=zero ; cc(:)=zero
1399 [ + + ]: 50 : nproj(1:psps%mpssoang)=0
1400 : :
1401 : : !Read and write different lines of the pseudopotential file
1402 : :
1403 [ + - ]: 12 : read (tmp_unit,*,err=10,iomsg=errmsg) rloc,nn,(cc(jj),jj=1,nn)
1404 : 12 : write(msg, '(a,f12.7)' ) ' rloc=',rloc
1405 : 12 : call wrtout(ab_out,msg,'COLL')
1406 : 12 : call wrtout(std_out, msg,'COLL')
1407 : 12 : write(msg, '(a,i1,a,4f12.7)' )' cc(1:',nn,')=',(cc(jj),jj=1,nn)
1408 : 12 : call wrtout(ab_out,msg,'COLL')
1409 : 12 : call wrtout(std_out, msg,'COLL')
1410 : :
1411 : : !Read the number of the non-local projectors
1412 [ + - ]: 12 : read (tmp_unit,*,err=10,iomsg=errmsg) nnonloc
1413 [ - + ]: 12 : if (nnonloc/=lmax+1) then
1414 : 0 : write(msg, '(a,a,a,a,i5,a,i5,a,a,a,a,i5)' ) ch10,&
1415 : 0 : & ' psp10in : COMMENT -',ch10,&
1416 : 0 : & ' input lmax=',lmax,' does not agree with input nnonloc=',nnonloc,ch10,&
1417 : 0 : & ' which has to be lmax+1.',ch10,&
1418 : 0 : & ' Setting lmax to ',nnonloc-1
1419 : 0 : call wrtout(ab_out,msg,'COLL')
1420 : 0 : call wrtout(std_out, msg,'COLL')
1421 : 0 : lmax=1
1422 : : end if
1423 [ - + + - : 36 : ABI_MALLOC(rr,(0:lmax))
+ - + - -
+ - + ]
1424 [ - + + - : 60 : ABI_MALLOC(hij,(0:lmax,3,3))
+ - + - +
- + - - +
- + ]
1425 [ - + + - : 24 : ABI_MALLOC(kij,(0:lmax,3,3))
- + + - ]
1426 [ + + + + : 799 : rr(:)=zero; hij(:,:,:)=zero; kij(:,:,:)=zero
+ + + + +
+ + + +
+ ]
1427 : :
1428 : : !Read and echo the coefficients of non-local projectors
1429 [ + + ]: 37 : prjloop: do ll=0,lmax
1430 [ + - ]: 25 : read (tmp_unit,*,err=10,iomsg=errmsg) rr(ll),nprl,(hij(ll,1,jj),jj=1,nprl)
1431 [ + + ]: 29 : do ii=2,nprl
1432 [ + - ]: 29 : read (tmp_unit,*,err=10,iomsg=errmsg) (hij(ll,ii,jj),jj=ii,nprl)
1433 : : end do
1434 : 25 : nproj(ll+1)=nprl
1435 : : write(msg, '(a,i3,a,f12.7,2a,3f12.7,2a,12x,2f12.7,2a,24x,f12.7)' )&
1436 : 25 : & ' for angular momentum l =',ll,' r(l) =',rr(ll),ch10,&
1437 : 25 : & ' h11, h12, h13 =', (hij(ll,1,jj),jj=1,3),ch10,&
1438 : 25 : & ' h22, h23 =', (hij(ll,2,jj),jj=2,3),ch10,&
1439 : 50 : & ' h33 =', (hij(ll,3,jj),jj=3,3)
1440 : 25 : call wrtout(ab_out,msg,'COLL')
1441 : 25 : call wrtout(std_out, msg,'COLL')
1442 [ + + ]: 25 : if (ll==0) cycle
1443 [ + + ]: 27 : do ii=1,nprl
1444 [ + - ]: 27 : read (tmp_unit,*,err=10,iomsg=errmsg) (kij(ll,ii,jj),jj=ii,nprl)
1445 : : end do
1446 : : write(msg, '(a,3f12.7,2a,12x,2f12.7,2a,24x,f12.7)' )&
1447 : 13 : & ' k11, k12, k13 =', (kij(ll,1,jj),jj=1,3),ch10,&
1448 : 13 : & ' k22, k23 =', (kij(ll,2,jj),jj=2,3),ch10,&
1449 : 26 : & ' k33 =', (kij(ll,3,jj),jj=3,3)
1450 : 13 : call wrtout(ab_out,msg,'COLL')
1451 : 37 : call wrtout(std_out, msg,'COLL')
1452 : : end do prjloop
1453 : :
1454 [ - + ]: 12 : if(pspso/=0) then
1455 : :
1456 : : ! MJV 10/2008: is this correct? For the normal HGH psp there are cases
1457 : : ! where there are more SO projectors than SR ones! e.g. Pb with 12 electrons.
1458 [ # # ]: 0 : do ll=1,lmax
1459 : 0 : nproj(psps%mpsang+ll)=nproj(ll+1)
1460 : : end do
1461 : :
1462 : : end if
1463 : :
1464 : : !Store the coefficients.
1465 : 12 : psps%gth_params%set(ipsp) = .true.
1466 [ + + ]: 96 : psps%gth_params%psppar(0, :, ipsp) = (/ rloc, cc(1), cc(2), cc(3), cc(4), zero, zero /)
1467 [ + + ]: 60 : do ii=1,4
1468 : 48 : ll=ii-1
1469 [ + + ]: 60 : if (ll>lmax) then
1470 [ + + ]: 184 : psps%gth_params%psppar(ii,:,ipsp) = (/ zero, zero, zero, zero, zero, zero, zero /)
1471 : : else
1472 : : psps%gth_params%psppar(ii,:,ipsp) =&
1473 [ + + ]: 200 : & (/ rr(ll), hij(ll,1,1), hij(ll,2,2), hij(ll,3,3), hij(ll,1,2), hij(ll,1,3), hij(ll,2,3) /)
1474 : : end if
1475 : : end do
1476 : :
1477 : : !Additionnal wavelet parameters
1478 [ - + ]: 12 : if (dtset%usewvl == 1) then
1479 : 0 : call wvl_descr_psp_fill(psps%gth_params, ipsp, 0, int(psps%zionpsp(ipsp)), int(psps%znuclpsp(ipsp)), tmp_unit)
1480 : : end if
1481 : :
1482 : : !Initialize array indlmn array giving l,m,n,ln,lm,s for i=lmn
1483 [ - + ]: 12 : nso=1;if(pspso/=0) nso=2
1484 [ + + + + ]: 313 : index=0;iln=0;indlmn(:,:)=0
1485 [ + + ]: 24 : do nn=1,nso
1486 [ + + ]: 49 : do ipsang=1+(nn-1)*(lmax+1),nn*lmax+1
1487 [ + - ]: 37 : if (nproj(ipsang)>0) then
1488 : 25 : ll=ipsang-(nn-1)*lmax-1
1489 [ + + ]: 54 : do kk=1,nproj(ipsang)
1490 : 29 : iln=iln+1
1491 [ + + ]: 83 : do mm=1,2*ll*psps%useylm+1
1492 : 29 : index=index+1
1493 : 29 : indlmn(1,index)=ll
1494 : 29 : indlmn(2,index)=mm-ll*psps%useylm-1
1495 : 29 : indlmn(3,index)=kk
1496 : 29 : indlmn(4,index)=ll*ll+(1-psps%useylm)*ll+mm
1497 : 29 : indlmn(5,index)=iln
1498 : 58 : indlmn(6,index)=nn
1499 : : end do
1500 : : end do
1501 : : end if
1502 : : end do
1503 : : end do
1504 : :
1505 [ - + + - : 36 : ABI_MALLOC(dvlspl,(psps%mqgrid_ff))
+ - + - -
+ - + ]
1506 : : !First, the local potential -- compute on q grid and fit spline
1507 : : call psp2lo(cc(1),cc(2),cc(3),cc(4),dvlspl,epsatm,psps%mqgrid_ff,psps%qgrid_ff,&
1508 : 12 : & vlspl(:,1),rloc,.true.,yp1,ypn,zion)
1509 [ - + ]: 12 : ABI_FREE(dvlspl)
1510 : :
1511 : : !Fit spline to q^2 V(q) (Numerical Recipes subroutine)
1512 [ - + + - : 36 : ABI_MALLOC(work_space,(psps%mqgrid_ff))
+ - + - -
+ - + ]
1513 [ - + + - : 24 : ABI_MALLOC(work_spl,(psps%mqgrid_ff))
- + - + ]
1514 : 12 : call spline (psps%qgrid_ff,vlspl(:,1),psps%mqgrid_ff,yp1,ypn,work_spl)
1515 [ + + ]: 36024 : vlspl(:,2)=work_spl(:)
1516 [ - + ]: 12 : ABI_FREE(work_space)
1517 [ - + ]: 12 : ABI_FREE(work_spl)
1518 : :
1519 : : !Second, compute KB energies and form factors and fit splines
1520 [ + + ]: 55 : ekb(:)=zero
1521 : :
1522 : : !Check if any nonlocal projectors are being used
1523 [ + + ]: 50 : mproj=maxval(nproj)
1524 : :
1525 [ + - ]: 12 : if (mproj>0) then
1526 : :
1527 [ - + + - : 48 : ABI_MALLOC(ekb_sr,(psps%mpsang,mproj))
- + + - +
- + - - +
- + ]
1528 [ - + + - : 60 : ABI_MALLOC(ffspl_sr,(psps%mqgrid_ff,2,psps%mpsang,mproj))
- + + - -
+ + - + -
+ - - + -
+ ]
1529 [ - + + - : 36 : ABI_MALLOC(ekb_so,(psps%mpsang,mproj))
- + + - -
+ - + ]
1530 [ - + + - : 48 : ABI_MALLOC(ffspl_so,(psps%mqgrid_ff,2,psps%mpsang,mproj))
- + + - -
+ + - - +
- + ]
1531 : :
1532 : : call psp10nl(ekb_sr,ffspl_sr,hij,lmax,mproj,psps%mpsang,psps%mqgrid_ff,&
1533 : 12 : & nproj,psps%qgrid_ff,rr)
1534 [ - + ]: 12 : if(pspso/=0) then
1535 [ # # # # : 0 : ABI_MALLOC(dummy_nproj,(psps%mpsang))
# # # # #
# # # ]
1536 : 0 : dummy_nproj(1)=0
1537 [ # # ]: 0 : do ll=1,lmax
1538 : 0 : dummy_nproj(ll+1)=nproj(psps%mpsang+ll)
1539 : : end do
1540 : : call psp10nl(ekb_so,ffspl_so,kij,lmax,mproj,psps%mpsang,psps%mqgrid_ff,&
1541 : 0 : & dummy_nproj,psps%qgrid_ff,rr)
1542 : 0 : ABI_FREE(dummy_nproj)
1543 : : end if
1544 : :
1545 : : ! Convert ekb and ffspl
1546 : 12 : iln0=0
1547 [ + + ]: 55 : do jj=1,psps%lmnmax
1548 : 43 : iln=indlmn(5,jj)
1549 [ + + ]: 55 : if (iln>iln0) then
1550 : 29 : iln0=iln
1551 [ + - ]: 29 : if (indlmn(6,jj)<=1) then
1552 : 29 : ekb(iln)=ekb_sr(1+indlmn(1,jj),indlmn(3,jj))
1553 [ + + + + ]: 174145 : ffspl(:,:,iln)=ffspl_sr(:,:,1+indlmn(1,jj),indlmn(3,jj))
1554 : : else
1555 : 0 : ekb(iln)=ekb_so(1+indlmn(1,jj),indlmn(3,jj))
1556 [ # # # # ]: 0 : ffspl(:,:,iln)=ffspl_so(:,:,1+indlmn(1,jj),indlmn(3,jj))
1557 : : end if
1558 : : end if
1559 : : end do
1560 : :
1561 [ - + ]: 12 : ABI_FREE(ekb_sr)
1562 [ - + ]: 12 : ABI_FREE(ffspl_sr)
1563 [ - + ]: 12 : ABI_FREE(ekb_so)
1564 [ - + ]: 12 : ABI_FREE(ffspl_so)
1565 : : end if
1566 : :
1567 [ - + ]: 12 : ABI_FREE(rr)
1568 [ - + ]: 12 : ABI_FREE(hij)
1569 [ - + ]: 12 : ABI_FREE(kij)
1570 : :
1571 : 12 : return
1572 : :
1573 : : ! Handle IO error
1574 : : 10 continue
1575 : 0 : ABI_ERROR(errmsg)
1576 : :
1577 [ - + - + : 12 : end subroutine psp10in
- + ]
1578 : : !!***
1579 : :
1580 : : !!****f* m_psp_hgh/psp10nl
1581 : : !! NAME
1582 : : !! psp10nl
1583 : : !!
1584 : : !! FUNCTION
1585 : : !! Hartwigsen-Goedecker-Hutter nonlocal pseudopotential (from preprint of 1998).
1586 : : !! Uses Gaussians for fully nonlocal form, analytic expressions.
1587 : : !!
1588 : : !! INPUTS
1589 : : !! hij(0:lmax,3,3)=factor defining strength of (max 3) projectors for each
1590 : : !! angular momentum channel l among 0, 1, ..., lmax
1591 : : !! lmax=maximum angular momentum
1592 : : !! mproj=maximum number of projectors in any channel
1593 : : !! mpsang= 1+maximum angular momentum for nonlocal pseudopotentials
1594 : : !! mqgrid=number of grid points for qgrid
1595 : : !! nproj(1:lmax+1)=number of projectors in any channel
1596 : : !! qgrid(mqgrid)=array of |G| values
1597 : : !! rr(0:lmax)=core radius for each 0<l<lmax channel (bohr)
1598 : : !!
1599 : : !! OUTPUT
1600 : : !! ekb(mpsang,mproj)=Kleinman-Bylander energies
1601 : : !! ffspl(mqgrid,2,mpssang,mproj)=Kleinman-Bylander form factor f_l(q) and
1602 : : !! second derivative from spline fit for each angular momentum and
1603 : : !! each projectors
1604 : : !!
1605 : : !! SOURCE
1606 : :
1607 : 12 : subroutine psp10nl(ekb,ffspl,hij,lmax,mproj,mpsang,mqgrid,nproj,qgrid,rr)
1608 : :
1609 : : !Arguments ------------------------------------
1610 : : !scalars
1611 : : integer,intent(in) :: lmax,mproj,mpsang,mqgrid
1612 : : !arrays
1613 : : integer,intent(in) :: nproj(mpsang)
1614 : : real(dp),intent(in) :: hij(0:lmax,3,3),qgrid(mqgrid),rr(0:lmax)
1615 : : real(dp),intent(out) :: ekb(mpsang,mproj),ffspl(mqgrid,2,mpsang,mproj)
1616 : :
1617 : : !Local variables-------------------------------
1618 : : !scalars
1619 : : integer :: info,ipack,iproj,iqgrid,jproj,ll,numproj
1620 : : real(dp) :: qmax,rrl
1621 : : character(len=500) :: msg
1622 : : character :: jobz,uplo
1623 : : !arrays
1624 : : real(dp) :: ap(2,9),rwork1(9),work1(2,9),ww(3),yp1j(3),ypnj(3)
1625 : 12 : real(dp),allocatable :: ppspl(:,:,:,:),uu(:,:),work(:),zz(:,:,:)
1626 : :
1627 : : ! *************************************************************************
1628 : :
1629 [ - + + - : 60 : ABI_MALLOC(ppspl,(mqgrid,2,mpsang,mproj))
- + + - -
+ + - + -
+ - - + -
+ ]
1630 [ - + + - : 36 : ABI_MALLOC(work,(mqgrid))
+ - + - -
+ - + ]
1631 : :
1632 : 12 : qmax=qgrid(mqgrid)
1633 : 12 : jobz='v'
1634 : 12 : uplo='u'
1635 [ + + + + ]: 60 : ekb(:,:)=zero
1636 : :
1637 [ + + ]: 37 : lloop: do ll=0,lmax
1638 : 25 : ap(:,:)=zero
1639 : 25 : numproj=nproj(ll+1)
1640 : :
1641 : : ! Fill up the matrix in packed storage
1642 [ + + ]: 54 : prjloop: do jproj=1,numproj
1643 [ + + ]: 88 : priloop: do iproj=1,jproj
1644 : 34 : ipack=iproj+(jproj-1)*jproj/2
1645 [ - + ]: 34 : if(mod((jproj-1)*jproj,2)/=0) then
1646 : 0 : ABI_ERROR("odd")
1647 : : end if
1648 : 63 : ap(1,ipack)=hij(ll,iproj,jproj)
1649 : : end do priloop
1650 : : end do prjloop
1651 : :
1652 [ - + ]: 37 : if(numproj/=0)then
1653 : :
1654 [ - + + - : 100 : ABI_MALLOC(uu,(numproj,numproj))
- + + - +
- + - - +
- + ]
1655 [ - + + - : 100 : ABI_MALLOC(zz,(2,numproj,numproj))
- + + - +
- + - - +
- + ]
1656 : :
1657 [ + + ]: 25 : if (numproj > 1) then
1658 : 3 : call ZHPEV(jobz,uplo,numproj,ap,ww,zz,numproj,work1,rwork1,info)
1659 [ + + + + ]: 27 : uu(:,:)=zz(1,:,:)
1660 : : else
1661 : 22 : ww(1)=hij(ll,1,1)
1662 : 22 : uu(1,1)=one
1663 : : end if
1664 : :
1665 : : ! Initialization of ekb, and spline fitting
1666 : :
1667 [ + + ]: 25 : if (ll==0) then ! s channel
1668 : :
1669 : 12 : rrl=rr(0)
1670 [ + + ]: 27 : do iproj=1,numproj
1671 : 15 : ekb(1,iproj)=ww(iproj)*32.d0*(rrl**3)*(pi**2.5d0)/(4.d0*pi)**2
1672 [ + + ]: 15 : if(iproj==1)then
1673 [ + + ]: 36024 : do iqgrid=1,mqgrid
1674 : 36024 : ppspl(iqgrid,1,1,1)=exp(-0.5d0*(two_pi*qgrid(iqgrid)*rrl)**2)
1675 : : end do
1676 : 12 : yp1j(1)=zero
1677 : 12 : ypnj(1)=-(two_pi*rrl)**2*qmax*exp(-0.5d0*(two_pi*qmax*rrl)**2)
1678 [ + + ]: 3 : else if(iproj==2)then
1679 [ + + ]: 6004 : do iqgrid=1,mqgrid
1680 : : ppspl(iqgrid,1,1,2)=2.0d0/sqrt(15.0d0) &
1681 : : & *exp(-0.5d0*(two_pi*qgrid(iqgrid)*rrl)**2) &
1682 : 6004 : & *( 3.d0-(two_pi*qgrid(iqgrid)*rrl)**2 )
1683 : : end do
1684 : 2 : yp1j(2)=zero
1685 : : ypnj(2)=2.0d0/sqrt(15.0d0)*(two_pi*rrl)**2*qmax &
1686 : 2 : & *exp(-0.5d0*(two_pi*qmax*rrl)**2) * (-5.d0+(two_pi*qmax*rrl)**2)
1687 [ + - ]: 1 : else if(iproj==3)then
1688 [ + + ]: 3002 : do iqgrid=1,mqgrid
1689 : : ppspl(iqgrid,1,1,3)=(4.0d0/3.0d0)/sqrt(105.0d0)*&
1690 : : & exp(-0.5d0*(two_pi*qgrid(iqgrid)*rrl)**2) * &
1691 : : & (15.0d0-10.0d0*(two_pi*qgrid(iqgrid)*rrl)**2 + &
1692 : 3002 : & (two_pi*qgrid(iqgrid)*rrl)**4)
1693 : : end do
1694 : 1 : yp1j(3)=zero
1695 : : ypnj(3)=(4.0d0/3.0d0)/sqrt(105.0d0)*exp(-0.5d0*(two_pi*qmax*rrl)**2) * &
1696 : 1 : & (two_pi*rrl)**2*qmax*(-35.0d0+14d0*(two_pi*qmax*rrl)**2-(two_pi*qmax*rrl)**4)
1697 : : end if
1698 : : call spline(qgrid,ppspl(:,1,1,iproj),mqgrid,&
1699 : 27 : & yp1j(iproj),ypnj(iproj),ppspl(:,2,1,iproj))
1700 : : end do
1701 : :
1702 [ + + ]: 13 : else if (ll==1) then ! p channel
1703 : :
1704 : 12 : rrl=rr(1)
1705 [ + + ]: 25 : do iproj=1,numproj
1706 : 13 : ekb(2,iproj)=ww(iproj)*64.d0*(rrl**5)*(pi**2.5d0)/(4.d0*pi)**2
1707 [ + + ]: 13 : if(iproj==1)then
1708 [ + + ]: 36024 : do iqgrid=1,mqgrid
1709 : : ppspl(iqgrid,1,2,1)=(1.0d0/sqrt(3.0d0))* &
1710 : 36024 : & exp(-0.5d0*(two_pi*qgrid(iqgrid)*rrl)**2) * (two_pi*qgrid(iqgrid))
1711 : : end do
1712 : 12 : yp1j(1)=two_pi*(1.0d0/sqrt(3.0d0))
1713 : : ypnj(1)=-two_pi*((two_pi*qmax*rrl)**2-1.d0)*exp(-0.5d0*(two_pi*qmax*rrl)**2)*&
1714 : 12 : & (1.0d0/sqrt(3.0d0))
1715 [ + - ]: 1 : else if(iproj==2)then
1716 [ + + ]: 3002 : do iqgrid=1,mqgrid
1717 : : ppspl(iqgrid,1,2,2)=(2.0d0/sqrt(105.0d0))* &
1718 : : & exp(-0.5d0*(two_pi*qgrid(iqgrid)*rrl)**2) * &
1719 : 3002 : & (two_pi*qgrid(iqgrid))*(5.0d0-(two_pi*qgrid(iqgrid)*rrl)**2)
1720 : : end do
1721 : 1 : yp1j(2)=(5.0d0*two_pi)*(2.0d0/sqrt(105.0d0))
1722 : : ypnj(2)=(2.0d0/sqrt(105.0d0))*two_pi*exp(-0.5d0*(two_pi*qmax*rrl)**2)* &
1723 : 1 : & (-8*(two_pi*qmax*rrl)**2 + (two_pi*qmax*rrl)**4 + 5.0d0)
1724 [ # # ]: 0 : else if(iproj==3)then
1725 [ # # ]: 0 : do iqgrid=1,mqgrid
1726 : : ppspl(iqgrid,1,2,3)=(4.0d0/3.0d0)/sqrt(1155d0)*&
1727 : : & exp(-0.5d0*(two_pi*qgrid(iqgrid)*rrl)**2) * &
1728 : : & (two_pi*qgrid(iqgrid))*&
1729 : 0 : & (35.0d0-14.0d0*(two_pi*qgrid(iqgrid)*rrl)**2+(two_pi*qgrid(iqgrid)*rrl)**4)
1730 : : end do
1731 : 0 : yp1j(3)=(35.0d0*two_pi)*(4.0d0/3.0d0)/sqrt(1155.0d0)
1732 : : ypnj(3)=(4.0d0/3.0d0)/sqrt(1155.0d0)*two_pi*exp(-0.5d0*(two_pi*qmax*rrl)**2)* &
1733 : : & (35.0d0-77.0d0*(two_pi*qmax*rrl)**2+19.0d0*(two_pi*qmax*rrl)**4 - &
1734 : 0 : & (two_pi*qmax*rrl)**6)
1735 : : end if
1736 : : call spline(qgrid,ppspl(:,1,2,iproj),mqgrid,&
1737 : 25 : & yp1j(iproj),ypnj(iproj),ppspl(:,2,2,iproj))
1738 : : end do
1739 : :
1740 [ + - ]: 1 : else if (ll==2) then ! d channel
1741 : :
1742 : : ! If there is a third projector. Warning : only two projectors are allowed.
1743 [ - + ]: 1 : if ( numproj>2 ) then
1744 : : write(msg, '(3a)' )&
1745 : 0 : & ' only two d-projectors are allowed ',ch10,&
1746 : 0 : & ' Action: check your pseudopotential file.'
1747 : 0 : ABI_ERROR(msg)
1748 : : end if
1749 : :
1750 : 1 : rrl=rr(2)
1751 [ + + ]: 2 : do iproj=1,numproj
1752 : 1 : ekb(3,iproj)=ww(iproj)*128.d0*(rrl**7)*(pi**2.5d0)/(4.d0*pi)**2
1753 [ + - ]: 1 : if(iproj==1)then
1754 [ + + ]: 3002 : do iqgrid=1,mqgrid
1755 : : ppspl(iqgrid,1,3,1)=(1.0d0/sqrt(15.0d0))* &
1756 : 3002 : & exp(-0.5d0*(two_pi*qgrid(iqgrid)*rrl)**2) * (two_pi*qgrid(iqgrid))**2
1757 : : end do
1758 : 1 : yp1j(1)=zero
1759 : : ypnj(1)=(1.0d0/sqrt(15.0d0))*(two_pi**2)*&
1760 : 1 : & exp(-0.5d0*(two_pi*qmax*rrl)**2)*qmax*(2d0-(two_pi*qmax*rrl)**2)
1761 [ # # ]: 0 : else if(iproj==2)then
1762 [ # # ]: 0 : do iqgrid=1,mqgrid
1763 : : ppspl(iqgrid,1,3,2)=(2.0d0/3.0d0)/sqrt(105.0d0)* &
1764 : : & exp(-0.5d0*(two_pi*qgrid(iqgrid)*rrl)**2) * &
1765 : 0 : & ((two_pi*qgrid(iqgrid))**2)*(7.0d0-(two_pi*qgrid(iqgrid)*rrl)**2)
1766 : : end do
1767 : 0 : yp1j(2)=zero
1768 : : ypnj(2)=(2.0d0/3.0d0)/sqrt(105.0d0)*exp(-0.5d0*(two_pi*qmax*rrl)**2)* &
1769 : 0 : & qmax*(two_pi**2)*( (two_pi*qmax*rrl)**4 - 11.0d0*(two_pi*qmax*rrl)**2 + 14.0d0)
1770 : : end if
1771 : : call spline(qgrid,ppspl(:,1,3,iproj),mqgrid,&
1772 : 2 : & yp1j(iproj),ypnj(iproj),ppspl(:,2,3,iproj))
1773 : : end do
1774 : :
1775 [ # # ]: 0 : else if (ll==3) then ! f channel
1776 : :
1777 : : ! If there is a second projector. Warning : only one projector is allowed.
1778 [ # # ]: 0 : if ( numproj>1 ) then
1779 : : write(msg, '(a,a,a)' )&
1780 : 0 : & 'only one f-projector is allowed ',ch10,&
1781 : 0 : & 'Action: check your pseudopotential file.'
1782 : 0 : ABI_ERROR(msg)
1783 : : end if
1784 : :
1785 : 0 : rrl=rr(3)
1786 : 0 : ekb(4,1)=ww(1)*(256.0d0/105.0d0)*(rrl**9)*(pi**2.5d0)/(4.d0*pi)**2
1787 [ # # ]: 0 : do iqgrid=1,mqgrid
1788 : : ppspl(iqgrid,1,4,1)=(two_pi*qgrid(iqgrid))**3* &
1789 : 0 : & exp(-0.5d0*(two_pi*qgrid(iqgrid)*rrl)**2)
1790 : : end do
1791 : : ! Compute yp1,ypn=derivatives of f(q) at q=0, q=qgrid(mqgrid)
1792 : 0 : yp1j(1)=zero
1793 : : ypnj(1)=(two_pi**3)*qmax**2*exp(-0.5d0*(two_pi*qmax*rrl)**2)*&
1794 : 0 : & (3.0d0-(two_pi*qmax*rrl)**2)
1795 : : ! Fit spline to get second derivatives by spline fit
1796 : : call spline(qgrid,ppspl(:,1,4,1),mqgrid,&
1797 : 0 : & yp1j(1),ypnj(1),ppspl(:,2,4,1))
1798 : :
1799 : : else
1800 : 0 : ABI_ERROR("lmax>3?")
1801 : : end if
1802 : :
1803 : : ! Linear combination using the eigenvectors
1804 [ + + + + : 198190 : ffspl(:,:,ll+1,:)=zero
+ + ]
1805 [ + + ]: 54 : do jproj=1,numproj
1806 [ + + ]: 93 : do iproj=1,numproj
1807 [ + + ]: 117107 : do iqgrid=1,mqgrid
1808 : : ffspl(iqgrid,1:2,ll+1,jproj)=ffspl(iqgrid,1:2,ll+1,jproj) &
1809 [ + + ]: 351156 : & +uu(iproj,jproj)*ppspl(iqgrid,1:2,ll+1,iproj)
1810 : : end do
1811 : : end do
1812 : : end do
1813 : :
1814 [ - + ]: 25 : ABI_FREE(uu)
1815 [ - + ]: 25 : ABI_FREE(zz)
1816 : :
1817 : : ! End condition on numproj(/=0)
1818 : : end if
1819 : :
1820 : : end do lloop
1821 : :
1822 [ - + ]: 12 : ABI_FREE(ppspl)
1823 [ - + ]: 12 : ABI_FREE(work)
1824 : :
1825 : 12 : end subroutine psp10nl
1826 : : !!***
1827 : :
1828 : : end module m_psp_hgh
1829 : : !!***
|