Branch data Line data Source code
1 : : !!****m* ABINIT/m_psp1
2 : : !! NAME
3 : : !! m_psp1
4 : : !!
5 : : !! FUNCTION
6 : : !! Initialize pspcod=1 or 4 pseudopotential (Teter format)
7 : : !!
8 : : !! COPYRIGHT
9 : : !! Copyright (C) 1998-2026 ABINIT group (DCA, XG, GMR, FrD, MT)
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_psp1
23 : :
24 : : use defs_basis
25 : : use m_errors
26 : : use m_abicore
27 : : use m_splines
28 : :
29 : : use m_special_funcs, only : besjm
30 : : use m_psptk, only : psp1cc
31 : :
32 : : implicit none
33 : :
34 : : private
35 : : !!***
36 : :
37 : : public :: psp1in ! Initialize pspcod=1 or 4 pseudopotential (Teter format)
38 : : !!***
39 : :
40 : : contains
41 : : !!***
42 : :
43 : : !!****f* m_psp1/psp1in
44 : : !! NAME
45 : : !! psp1in
46 : : !!
47 : : !! FUNCTION
48 : : !! Initialize pspcod=1 or 4 pseudopotential (Teter format):
49 : : !! continue to read the corresponding file, then compute the
50 : : !! local and non-local potentials.
51 : : !!
52 : : !! INPUTS
53 : : !! dq= spacing of the q-grid
54 : : !! lloc=angular momentum choice of local pseudopotential
55 : : !! lmax=value of lmax mentioned at the second line of the psp file
56 : : !! lmnmax=if useylm=1, max number of (l,m,n) comp. over all type of psps
57 : : !! =if useylm=0, max number of (l,n) comp. over all type of psps
58 : : !! lnmax=max. number of (l,n) components over all type of psps
59 : : !! mmax=maximum number of points in real space grid in the psp file
60 : : !! mpsang= 1+maximum angular momentum for nonlocal pseudopotentials
61 : : !! mqgrid=dimension of q (or G) grid for arrays.
62 : : !! n1xccc=dimension of xccc1d ; 0 if no XC core correction is used
63 : : !! pspcod=pseudopotential type
64 : : !! qgrid(mqgrid)=values of q (or |G|) on grid from 0 to qmax
65 : : !! useylm=governs the way the nonlocal operator is to be applied:
66 : : !! 1=using Ylm, 0=using Legendre polynomials
67 : : !! zion=nominal valence of atom as specified in psp file
68 : : !! znucl=atomic number of atom as specified in psp file
69 : : !!
70 : : !! OUTPUT
71 : : !! ekb(lnmax)=Kleinman-Bylander energy,
72 : : !! {{\ \begin{equation}
73 : : !! \frac{\int_0^\infty [Rl(r)^2 (Vl(r)-Vloc(r))^2 dr]}
74 : : !! {\int_0^\infty [Rl(r)^2 (Vl(r)-Vloc(r)) dr]}
75 : : !! \end{equation} }}
76 : : !! for each (l,n)
77 : : !! ekb1(mpsang)= Kleinman-Bylander energy from the psp file, for iproj=1
78 : : !! ekb2(mpsang)= Kleinman-Bylander energy from the psp file, for iproj=2
79 : : !! epsatm=$(4\pi) \int_0^\infty [r^2 (V(r)+\frac{Zv}{r}) dr]$(hartree)
80 : : !! epspsp(mpsang)=values of epsatm for different angular momenta, from the psp file
81 : : !! e990(mpsang)=ecut at which 0.99 of the kinetic energy is recovered
82 : : !! e999(mpsang)=ecut at which 0.999 of the kinetic energy is recovered
83 : : !! ffspl(mqgrid,2,lnmax)=Kleinman-Bylander form factor f_l(q) and
84 : : !! second derivative from spline fit for each angular momentum and
85 : : !! each projector
86 : : !! indlmn(6,i)= array giving l,m,n,lm,ln,s for i=ln (if useylm=0)
87 : : !! or i=lmn (if useylm=1)
88 : : !! nproj(mpsang)=number of projection functions for each angular momentum
89 : : !! qchrg is the total (integrated) core charge
90 : : !! rcpsp(mpsang)=cut-off radius for each angular momentum
91 : : !! rms(mpsang)=root mean square of the KB psp
92 : : !! vlspl(mqgrid,2)=q^2 Vloc(q) and second derivatives from spline fit
93 : : !! xccc1d(n1xccc,6)=1D core charge function and five derivatives, from psp file
94 : : !! xcccrc=XC core correction cutoff radius (bohr)
95 : : !!
96 : : !! NOTES
97 : : !! there are only minor differences in the two formats
98 : : !! 1) With pspcod=1, even for the LOCAL angular momentum, there is
99 : : !! a block for the wfs (can be set to zero, though)
100 : : !! 2) The core charge density differs: for pspcod=1, it is a
101 : : !! revised expression for core density of 5 Nov 1992, while
102 : : !! for pspcod=4, it is an older expression, of 7 May 1992 .
103 : : !!
104 : : !! SOURCE
105 : :
106 : 694 : subroutine psp1in(dq,ekb,ekb1,ekb2,epsatm,epspsp,&
107 : 694 : & e990,e999,ffspl,indlmn,lloc,lmax,lmnmax,lnmax,&
108 : 694 : & mmax,mpsang,mqgrid,nproj,n1xccc,pspcod,&
109 : 694 : & qchrg,qgrid,rcpsp,rms,useylm,vlspl,xcccrc,xccc1d,&
110 : : & zion,znucl)
111 : :
112 : : !Arguments ------------------------------------
113 : : !scalars
114 : : integer,intent(in) :: lloc,lmax,lmnmax,lnmax,mmax,mpsang,mqgrid,n1xccc,pspcod
115 : : integer,intent(in) :: useylm
116 : : real(dp),intent(in) :: dq,zion,znucl
117 : : real(dp),intent(out) :: epsatm,qchrg,xcccrc
118 : : !arrays
119 : : integer,intent(out) :: indlmn(6,lmnmax),nproj(mpsang)
120 : : real(dp),intent(in) :: qgrid(mqgrid)
121 : : real(dp),intent(out) :: e990(mpsang),e999(mpsang),ekb(lnmax),ekb1(mpsang)
122 : : real(dp),intent(out) :: ekb2(mpsang),epspsp(mpsang)
123 : : real(dp),intent(inout) :: ffspl(mqgrid,2,lnmax)
124 : : real(dp),intent(out) :: rcpsp(mpsang),rms(mpsang),vlspl(mqgrid,2)
125 : : real(dp),intent(inout) :: xccc1d(n1xccc,6)
126 : :
127 : : !Local variables-------------------------------
128 : : !scalars
129 : : integer :: ii,iln,index,ipsang,kk,lhigh,ll,mm,nlmax
130 : : real(dp) :: arg,dq2pi,fchrg,rchrg,xx,yp1,ypn
131 : : character(len=500) :: message,errmsg
132 : : !arrays
133 : 694 : real(dp),allocatable :: drad(:),ekb_tmp(:,:),ffspl_tmp(:,:,:,:),rad(:),vloc(:)
134 : 694 : real(dp),allocatable :: vpspll(:,:),wfll(:,:),wksincos(:,:,:),work_space(:)
135 : 694 : real(dp),allocatable :: work_spl1(:),work_spl2(:)
136 : : ! ***************************************************************************
137 : :
138 : : !Note: Teter s grid is hard-coded at mmax=2001
139 : : !mmax was read from the pseudopotential file in the calling routine
140 [ - + ]: 694 : if (mmax/=2001) then
141 : : write(message, '(a,i12,a,a,a,a)' )&
142 : 0 : & 'Using Teter grid (pspcod=1 and 4) but mmax=',mmax,ch10,&
143 : 0 : & 'mmax must be 2001 for Teter grid.',ch10,&
144 : 0 : & 'Action: check your pseudopotential input file.'
145 : 0 : ABI_ERROR(message)
146 : : end if
147 : :
148 : : !File format of formatted Teter psp input (the 3 first lines
149 : : !have already been read in calling -pspatm- routine) :
150 : :
151 : : !(1) title (character) line
152 : : !(2) znucl,zion,pspdat
153 : : !(3) pspcod,pspxc,lmax,lloc,mmax,r2well
154 : : !For each angular momentum :
155 : : !(4) ll,e990(ll),e999(ll),nproj(ll),rcpsp(ll)
156 : : !(5) rms(ll),ekb1(ll),ekb2(ll),epspsp(ll)
157 : : !(6) rchrg,fchrg,qchrg
158 : : !(7) ll
159 : : !(8) (vpsp(j,ll),j=0,nmax)
160 : : !Then for iproj=1 to 2
161 : : !for ll=0,lmax
162 : : !(10) ll
163 : : !(11) ((upsp(j,ll,iproj),j=0,nmax)
164 : :
165 [ + + ]: 2353 : do ipsang=1,lmax+1
166 : :
167 [ + - ]: 1659 : read (tmp_unit,*,err=10,iomsg=errmsg) ll,e990(ipsang),e999(ipsang),nproj(ipsang),rcpsp(ipsang)
168 : : write(message, '(i5,2f8.3,i5,f12.7,t47,a)' ) &
169 : 1659 : & ipsang-1,e990(ipsang),e999(ipsang),nproj(ipsang),rcpsp(ipsang),&
170 : 3318 : & 'l,e99.0,e99.9,nproj,rcpsp'
171 : 1659 : call wrtout(ab_out,message,'COLL')
172 : 1659 : call wrtout(std_out, message,'COLL')
173 : :
174 [ + - ]: 1659 : read (tmp_unit,*,err=10,iomsg=errmsg) rms(ipsang),ekb1(ipsang),ekb2(ipsang),epspsp(ipsang)
175 : : write(message, '(4f13.8,t55,a)' ) &
176 : 1659 : & rms(ipsang),ekb1(ipsang),ekb2(ipsang),epspsp(ipsang),&
177 : 3318 : & ' rms, ekb1, ekb2, epsatm'
178 : 1659 : call wrtout(ab_out,message,'COLL')
179 : 2353 : call wrtout(std_out, message,'COLL')
180 : :
181 : : end do
182 : :
183 : : !Initialize array indlmn array giving l,m,n,lm,ln,s for i=lmn
184 [ + + + + ]: 9913 : index=0;iln=0;indlmn(:,:)=0
185 [ + + ]: 2353 : do ipsang=1,lmax+1
186 [ + + ]: 2353 : if(nproj(ipsang)>0)then
187 : 967 : ll=ipsang-1
188 [ + + ]: 2014 : do kk=1,nproj(ipsang)
189 : 1047 : iln=iln+1
190 [ + + ]: 3077 : do mm=1,2*ll*useylm+1
191 : 1063 : index=index+1
192 : 1063 : indlmn(1,index)=ll
193 : 1063 : indlmn(2,index)=mm-ll*useylm-1
194 : 1063 : indlmn(3,index)=kk
195 : 1063 : indlmn(4,index)=ll*ll+(1-useylm)*ll+mm
196 : 1063 : indlmn(5,index)=iln
197 : 2110 : indlmn(6,index)=1
198 : : end do
199 : : end do
200 : : end if
201 : : end do
202 : :
203 [ + - ]: 694 : read (tmp_unit,*,err=10,iomsg=errmsg) rchrg,fchrg,qchrg
204 : 694 : write(message, '(3f20.14,t64,a)' ) rchrg,fchrg,qchrg,'rchrg,fchrg,qchrg'
205 : 694 : call wrtout(ab_out,message,'COLL')
206 : 694 : call wrtout(std_out, message,'COLL')
207 : :
208 : : ! Generate core charge function and derivatives, if needed
209 [ + + ]: 694 : if(fchrg>1.0d-15)then
210 [ + + ]: 589 : if(pspcod==1)then
211 : 586 : call psp1cc(fchrg,n1xccc,xccc1d)
212 : : ! The core charge function for pspcod=1 becomes zero beyond 3*rchrg only.
213 : : ! Thus xcccrc must be set equal to 3*rchrg .
214 : 586 : xcccrc=3*rchrg
215 [ + - ]: 3 : else if(pspcod==4)then
216 : 3 : call psp4cc(fchrg,n1xccc,xccc1d)
217 : : ! For pspcod=4, the core charge cut off exactly beyond rchrg
218 : 3 : xcccrc=rchrg
219 : : end if
220 : : else
221 : 105 : xcccrc=0.0d0
222 [ + + + + ]: 135789 : xccc1d(:,:)=0.0d0
223 : : end if
224 : :
225 : : !--------------------------------------------------------------------
226 : : !Will now proceed at the reading of pots and wfs, as well as their treatment
227 : :
228 : : !vpspll(:,1),...,vpspll(:,4)=nonlocal pseudopotentials
229 : : !vloc(:)=Vlocal(r), lloc=0, 1, or 2 or -1 for avg.
230 : : !rad(:)=radial grid r(i)
231 : : !drad(:)= inverse of d(r(i))/d(i) for radial grid
232 : : !wfll(:,1),...,wfll(:,4)=reference config. wavefunctions
233 : :
234 [ - + + - : 2082 : ABI_MALLOC(vloc,(mmax))
+ - + - -
+ - + ]
235 [ - + + - : 2776 : ABI_MALLOC(vpspll,(mmax,mpsang))
- + + - +
- + - - +
- + ]
236 [ + + + + : 4698 : if(lmax==-1) vpspll(:,:)=zero
+ + ]
237 : :
238 : : !(1) Read atomic pseudopotential for each l, filling up array vpspll
239 : : !Note: put each l into vpspll(:,l+1)
240 [ + + ]: 2353 : do ipsang=1,lmax+1
241 [ + - ]: 1659 : read (tmp_unit,*,err=10,iomsg=errmsg) ll
242 [ + - ]: 2353 : read (tmp_unit,*,err=10,iomsg=errmsg) (vpspll(ii,ipsang),ii=1,mmax)
243 : : end do
244 : :
245 : : !Copy appropriate nonlocal psp for use as local one
246 [ + + ]: 1389388 : vloc( 1:mmax ) = vpspll( 1:mmax , lloc+1 )
247 : :
248 : : !(2) Create radial grid, and associated quantities
249 [ - + + - : 1388 : ABI_MALLOC(rad,(mmax))
- + - + ]
250 [ - + + - : 1388 : ABI_MALLOC(drad,(mmax))
- + - + ]
251 [ - + + - : 2776 : ABI_MALLOC(wksincos,(mmax,2,2))
+ - + - +
- - + -
+ ]
252 : :
253 : : !Teter grid--need both r and dr in this case
254 [ + + ]: 1389388 : do ii=0,mmax-1
255 : 1388694 : xx=dble(ii)/dble(mmax-1)
256 : 1388694 : rad (ii+1)=100.d0*(xx+.01d0)**5-1.d-8
257 : 1389388 : drad(ii+1)=500.d0*(xx+.01d0)**4/dble(mmax-1)
258 : : end do
259 : :
260 : : !here compute sin(r(:)*dq) and cos(r(:)*dq)
261 : : !NOTE: also invert dr !!
262 : 694 : dq2pi=2.0d0*pi*dq
263 [ + + ]: 1389388 : do ii=1,mmax
264 : 1388694 : arg=dq2pi*rad(ii)
265 : 1388694 : drad(ii)=1.0d0/drad(ii)
266 : 1388694 : wksincos(ii,1,1)=sin(arg)
267 : 1389388 : wksincos(ii,2,1)=cos(arg)
268 : : end do
269 : :
270 : : !(3)Carry out calculations for local (lloc) pseudopotential.
271 : : !Obtain Fourier transform (1-d sine transform) to get q^2 V(q).
272 [ - + + - : 2082 : ABI_MALLOC(work_space,(mqgrid))
+ - + - -
+ - + ]
273 [ - + + - : 1388 : ABI_MALLOC(work_spl1,(mqgrid))
- + - + ]
274 [ - + + - : 1388 : ABI_MALLOC(work_spl2,(mqgrid))
- + - + ]
275 : : call psp1lo(drad,epsatm,mmax,mqgrid,qgrid,&
276 : 694 : & work_spl1,rad,vloc,wksincos,yp1,ypn,zion)
277 : :
278 : : !Fit spline to q^2 V(q) (Numerical Recipes subroutine)
279 : 694 : call spline (qgrid,work_spl1,mqgrid,yp1,ypn,work_spl2)
280 [ + + ]: 2083953 : vlspl(:,1)=work_spl1(:)
281 [ + + ]: 2083953 : vlspl(:,2)=work_spl2(:)
282 : :
283 [ - + ]: 694 : ABI_FREE(work_space)
284 [ - + ]: 694 : ABI_FREE(work_spl1)
285 [ - + ]: 694 : ABI_FREE(work_spl2)
286 : :
287 : : !(4)Take care of non-local part
288 : :
289 : : !Zero out all Kleinman-Bylander energies to initialize
290 [ + + ]: 1981 : ekb(:)=0.0d0
291 : : !write(std_out,*)' psp1in : before nonlocal corrections '
292 : : !write(std_out,*)' psp1in : lloc, lmax = ',lloc,lmax
293 : :
294 : : !Allow for option of no nonlocal corrections (lloc=lmax=0)
295 [ + + + + ]: 694 : if (lloc==0.and.lmax==0) then
296 : 97 : write(message, '(a,f5.1)' ) ' Note: local psp for atom with Z=',znucl
297 : 97 : call wrtout(ab_out,message,'COLL')
298 : 97 : call wrtout(std_out, message,'COLL')
299 : :
300 : : else
301 : :
302 : : ! Proceed to make Kleinman-Bylander form factors for each l up to lmax
303 : :
304 : : ! Read wavefunctions for each l up to lmax
305 [ - + + - : 1791 : ABI_MALLOC(wfll,(mmax,mpsang))
- + + - -
+ - + ]
306 [ + + ]: 2159 : do ipsang=1,lmax+1
307 : : ! For pspcod==4, wfs for the local angular momentum are not written
308 [ + + + + ]: 2159 : if (nproj(ipsang)/=0 .or. pspcod==1) then
309 [ + - ]: 1553 : read (tmp_unit,*,err=10,iomsg=errmsg) ll
310 [ - + ]: 1553 : if (ipsang/=ll+1) then
311 : : write(message, '(a,a,a,a,a,a,2i6,a,a)' )&
312 : 0 : & 'Pseudopotential input file does not have',ch10,&
313 : 0 : & 'angular momenta in order expected for first projection',&
314 : 0 : & 'operator.',ch10,' Values are ',ipsang-1,ll,ch10,&
315 : 0 : & 'Action: check your pseudopotential input file.'
316 : 0 : ABI_ERROR(message)
317 : : end if
318 [ + - ]: 1553 : read (tmp_unit,*,err=10,iomsg=errmsg) wfll(:,ipsang)
319 : :
320 : : else
321 [ + + ]: 18018 : wfll(:,ipsang)=0.0d0
322 : : end if
323 : :
324 : : end do
325 : : ! ----------------------------------------------------------------------
326 : : ! Compute KB form factors and fit splines
327 : :
328 : : ! nlmax is highest l for which a nonlocal correction is being computed
329 : 597 : nlmax=lmax
330 [ + + ]: 597 : if (lloc==lmax) nlmax=lmax-1
331 : : ! write(std_out,*)' psp1in : lmax,lloc=',lmax,lloc
332 [ - + + - : 1791 : ABI_MALLOC(ekb_tmp,(mpsang,2))
+ - + - -
+ - + ]
333 [ - + + - : 2985 : ABI_MALLOC(ffspl_tmp,(mqgrid,2,nlmax+1,2))
+ + + + +
- + - + -
+ + - + -
+ ]
334 : :
335 : : call psp1nl(drad,ekb_tmp(:,1),ffspl_tmp(:,:,:,1),lloc,&
336 : 597 : & nlmax,mmax,mpsang,mqgrid,qgrid,rad,vloc,vpspll,wfll,wksincos)
337 : :
338 : : ! Read second wavefunction for second projection operator
339 : : ! (only read cases where nproj(ll)=2) --also find highest l for which nproj(l)=2
340 : 597 : lhigh=-1
341 [ + + ]: 2159 : do ipsang=1,min(lmax+1,mpsang)
342 [ + + ]: 2159 : if (nproj(ipsang)==2) then
343 : 80 : lhigh=ipsang-1
344 [ + - ]: 80 : read (tmp_unit,*,err=10,iomsg=errmsg) ll
345 [ - + ]: 80 : if (ipsang/=ll+1) then
346 : : write(message, '(a,a,a,a,a,a,2i6,a,a)' )&
347 : 0 : & 'Pseudopotential input file does not have',ch10,&
348 : 0 : & 'angular momenta in order expected for second projection',&
349 : 0 : & 'operator.',ch10,' Values are ',ipsang-1,ll,ch10,&
350 : 0 : & 'Action: check your pseudopotential input file.'
351 : 0 : ABI_ERROR(message)
352 : : end if
353 [ + - ]: 80 : read (tmp_unit,*,err=10,iomsg=errmsg) wfll(:,ipsang)
354 : :
355 : : else
356 [ + + ]: 2966964 : wfll(:,ipsang)=0.0d0
357 : :
358 : : end if
359 : : end do
360 : :
361 : : ! Compute KB form factors and fit splines for second wf if any
362 : :
363 [ + + ]: 597 : if (lhigh>-1) then
364 : : call psp1nl(drad,ekb_tmp(:,2),ffspl_tmp(:,:,:,2),lloc,&
365 : 41 : & lhigh,mmax,mpsang,mqgrid,qgrid,rad,vloc,vpspll,wfll,wksincos)
366 : : end if
367 : :
368 : : ! Convert ekb and ffspl
369 : : iln=0
370 [ + + ]: 1811 : do ii=1,lmnmax
371 : 1214 : kk=indlmn(5,ii)
372 [ + + ]: 1811 : if (kk>iln) then
373 : 1047 : iln=kk
374 : 1047 : ekb(kk)=ekb_tmp(1+indlmn(1,ii),indlmn(3,ii))
375 : : ! write(std_out,*)' psp1in : lmnmax,ii,indlmn(1,ii)=',lmnmax,ii,indlmn(1,ii)
376 [ + + + + ]: 6289495 : ffspl(:,:,kk)=ffspl_tmp(:,:,1+indlmn(1,ii),indlmn(3,ii))
377 : : end if
378 : : end do
379 : :
380 [ - + ]: 597 : ABI_FREE(ekb_tmp)
381 [ - + ]: 597 : ABI_FREE(ffspl_tmp)
382 [ - + ]: 597 : ABI_FREE(wfll)
383 : : end if
384 : :
385 [ - + ]: 694 : ABI_FREE(vpspll)
386 [ - + ]: 694 : ABI_FREE(rad)
387 [ - + ]: 694 : ABI_FREE(drad)
388 [ - + ]: 694 : ABI_FREE(vloc)
389 [ - + ]: 694 : ABI_FREE(wksincos)
390 : :
391 : 694 : return
392 : :
393 : : ! Handle IO error
394 : : 10 continue
395 : 0 : ABI_ERROR(errmsg)
396 : :
397 [ - + - + : 1388 : end subroutine psp1in
- + - + -
+ - + - +
- + ]
398 : : !!***
399 : :
400 : : !!****f* m_psp1/psp1lo
401 : : !! NAME
402 : : !! psp1lo
403 : : !!
404 : : !! FUNCTION
405 : : !! Compute sine transform to transform from v(r) to q^2 v(q)
406 : : !! using subroutines related to Teter atomic structure grid.
407 : : !!
408 : : !! INPUTS
409 : : !! drad(mmax)=inverse of r grid spacing at each point
410 : : !! mmax=number of radial r grid points (Teter grid)
411 : : !! mqgrid=number of grid points in q from 0 to qmax.
412 : : !! qgrid(mqgrid)=q grid values (bohr**-1).
413 : : !! rad(mmax)=r grid values (bohr).
414 : : !! vloc(mmax)=v(r) on radial grid.
415 : : !! wksincos(mmax,2,2)=contains sine and cosine of 2*pi*r(:)*dq and 2*pi*r(:)*q
416 : : !! at input : wksincos(:,1,1)=sine of 2*pi*r(:)*dq
417 : : !! wksincos(:,2,1)=cosine of 2*pi*r(:)*dq
418 : : !! wksincos(:,:,2) is not initialized, will be used inside the routine
419 : : !! zion=nominal valence charge of atom.
420 : : !!
421 : : !! OUTPUT
422 : : !! epsatm= $4\pi \int[r^2 (v(r)+Zv/r) dr]$
423 : : !! q2vq(mqgrid)=$q^2 v(q)$
424 : : !! =$\displaystyle -Zv/\pi+q^2 4\pi\int(\frac{\sin(2\pi q r)}{2 \pi q r})(r^2 v(r)+r Zv)dr$.
425 : : !! yp1,ypn=derivative of q^2 v(q) wrt q at q=0 and q=qmax
426 : : !! (needed for spline fitter).
427 : : !!
428 : : !! SOURCE
429 : :
430 : 694 : subroutine psp1lo(drad,epsatm,mmax,mqgrid,qgrid,q2vq,rad,&
431 : 694 : & vloc,wksincos,yp1,ypn,zion)
432 : :
433 : : !Arguments ------------------------------------
434 : : !scalars
435 : : integer,intent(in) :: mmax,mqgrid
436 : : real(dp),intent(in) :: zion
437 : : real(dp),intent(out) :: epsatm,yp1,ypn
438 : : !arrays
439 : : real(dp),intent(in) :: drad(mmax),qgrid(mqgrid),rad(mmax),vloc(mmax)
440 : : real(dp),intent(inout) :: wksincos(mmax,2,2)
441 : : real(dp),intent(out) :: q2vq(mqgrid)
442 : :
443 : : !Local variables-------------------------------
444 : : !scalars
445 : : integer,parameter :: mma0=2001
446 : : integer :: iq,ir,irmax
447 : : real(dp),parameter :: scale=10.0d0
448 : : real(dp) :: result,test,tpiq
449 : : !arrays
450 : : real(dp) :: wk(mma0),wk1(mma0),wk2(mma0)
451 : :
452 : : ! *************************************************************************
453 : :
454 : : !Do q=0 separately (compute epsatm)
455 : : !Set up integrand for q=0: Int[r^2 (V(r)+Zv/r) dr]
456 : : !Treat r=0 by itself
457 : 694 : wk(1)=0.0d0
458 : :
459 [ + + ]: 1388694 : do ir=2,mmax
460 : : ! (at large r do not want prefactor of r^2 and should see
461 : : ! V(r)+Zv/r go to 0 at large r)
462 : 1388000 : test=vloc(ir)+zion/rad(ir)
463 : : ! write(std_out,'(i4,3es20.10)' )ir,rad(ir),test,rad(ir)*test
464 : : ! In this routine, NO cut-off radius is imposed : the input
465 : : ! vloc MUST be in real(dp) to obtain numerically
466 : : ! accurate values. The error can be on the order of 0.001 Ha !
467 [ + + ]: 1388694 : if (abs(test)<1.0d-20) then
468 : 402838 : wk(ir)=0.0d0
469 : : else
470 : 985162 : wk(ir)=rad(ir)*(rad(ir)*vloc(ir)+zion)
471 : : end if
472 : : end do
473 : : !Do integral from 0 to r(max) (disregard contrib beyond r(max)
474 : : !(need numerical derivatives to do integral)
475 : : !Use mmax-1 to convert to Teter s dimensioning starting at 0
476 : 694 : call der_int(wk,wk2,rad,drad,mmax-1,result)
477 : :
478 : 694 : epsatm=4.d0*pi*(result)
479 : : !q=0 value of integral is -zion/Pi + q^2 * epsatm = -zion/Pi
480 : 694 : q2vq(1)=-zion/pi
481 : :
482 : : !Prepare loop over q values
483 : 694 : irmax=mmax+1
484 [ + + ]: 1388694 : do ir=mmax,2,-1
485 : 1388000 : test=vloc(ir)+zion/rad(ir)
486 : 1388000 : wk1(ir)=test*rad(ir)
487 : : ! Will ignore tail within decade of machine precision
488 [ + + + + ]: 1388694 : if ((scale+abs(test))==scale .and. irmax==ir+1) then
489 : 578595 : irmax=ir
490 : : end if
491 : : end do
492 : : !Increase irmax a bit : this is copied from psp1nl
493 : 694 : irmax=irmax+4
494 [ + + ]: 694 : if(irmax>mmax)irmax=mmax
495 : :
496 : : !Loop over q values
497 [ + + ]: 2083259 : do iq=2,mqgrid
498 : 2082565 : tpiq=two_pi*qgrid(iq)
499 : 2082565 : call sincos(iq,irmax,mmax,wksincos,rad,tpiq)
500 : : ! set up integrand Sin(2Pi q r)(rV(r)+Zv) for integral
501 : : !$\displaystyle -Zv/\pi + q^2 4\pi \int[\frac{\sin(2\pi q r)}{2\pi q r}(r^2 v(r)+r Zv)dr]$.
502 : : ! Handle r=0 separately
503 : 2082565 : wk(1)=0.0d0
504 [ + + ]: 2441041533 : do ir=2,irmax
505 : 2441041533 : wk(ir)=wksincos(ir,1,2)*wk1(ir)
506 : : end do
507 : : ! do integral from 0 to r(max)
508 [ + + ]: 2082565 : if(irmax>mmax-1)irmax=mmax-1
509 : :
510 : 2082565 : call der_int(wk,wk2,rad,drad,irmax,result)
511 : : ! store q^2 v(q)
512 : 2083259 : q2vq(iq)=-zion/pi+2.d0*qgrid(iq)*result
513 : : end do
514 : :
515 : : !Compute derivatives of q^2 v(q) at ends of interval
516 : 694 : yp1=0.0d0
517 : : !ypn=$\displaystyle 2\int_0^\infty (\sin (2\pi qmax r)+(2\pi qmax r)\cos (2\pi qmax r)(r V(r)+Z)dr]$
518 : : !integral from r(mmax) to infinity is overkill; ignore
519 : : !set up integrand
520 : : !Handle r=0 separately
521 : 694 : wk(1)=0.0d0
522 : 694 : tpiq=two_pi*qgrid(mqgrid)
523 [ + + ]: 1388694 : do ir=2,mmax
524 : 1388000 : test=vloc(ir)+zion/rad(ir)
525 : : ! Ignore contributions within decade of machine precision
526 [ + + ]: 1388694 : if ((scale+abs(test))==scale) then
527 : 579979 : wk(ir)=0.0d0
528 : : else
529 : : wk(ir)=(sin(tpiq*rad(ir))+tpiq*rad(ir)*cos(tpiq*rad(ir))) * &
530 : 808021 : & (rad(ir)*vloc(ir)+zion)
531 : : end if
532 : : end do
533 : 694 : call der_int(wk,wk2,rad,drad,mmax-1,result)
534 : :
535 : 694 : ypn=2.0d0*result
536 : :
537 : 694 : end subroutine psp1lo
538 : : !!***
539 : :
540 : : !!****f* m_psp1/psp1nl
541 : : !! NAME
542 : : !! psp1nl
543 : : !!
544 : : !! FUNCTION
545 : : !! Make Kleinman-Bylander form factors f_l(q) for each l from 0 to lmax.
546 : : !! Vloc is assumed local potential.
547 : : !!
548 : : !! INPUTS
549 : : !! dr(mmax)=inverse of grid spacing for radial grid
550 : : !! lloc=angular momentum of local channel (avoid doing integrals for this l)
551 : : !! lmax=maximum ang momentum for which nonlocal form factor is desired.
552 : : !! mmax=number of radial grid points for atomic grid
553 : : !! mpsang= 1+maximum angular momentum for nonlocal pseudopotentials
554 : : !! mqgrid=number of grid points for q grid
555 : : !! qgrid(mqgrid)=values at which form factors are returned
556 : : !! rad(mmax)=radial grid values
557 : : !! vloc(mmax)=local pseudopotential on radial grid
558 : : !! vpspll(mmax,lmax+1)=nonlocal pseudopotentials for each l on radial grid
559 : : !! wfll(mmax,lmax+1)=reference state wavefunctions on radial grid
560 : : !! wksincos(mmax,2,2)=contains sine and cosine of 2*pi*r(:)*dq and 2*pi*r(:)*q
561 : : !! at input : wksincos(:,1,1)=sine of 2*pi*r(:)*dq
562 : : !! wksincos(:,2,1)=cosine of 2*pi*r(:)*dq
563 : : !! wksincos(:,:,2) is not initialized, will be used inside the routine
564 : : !!
565 : : !! OUTPUT
566 : : !! ekb(mpsang)=Kleinman-Bylander energy,
567 : : !! {{\ \begin{equation}
568 : : !! \frac{\int_0^\infty [Rl(r)^2 (Vl(r)-Vloc(r))^2 dr]}
569 : : !! {\int_0^\infty [Rl(r)^2 (Vl(r)-Vloc(r)) dr]}
570 : : !! \end{equation} }}
571 : : !! for each l
572 : : !! ffspl(mqgrid,2,mpsang)=Kleinman-Bylander form factor f_l(q) and
573 : : !! second derivative from spline fit for each angular momentum
574 : : !!
575 : : !! NOTES
576 : : !! u_l(r) is reference state wavefunction (input as wfll);
577 : : !! j_l(q) is a spherical Bessel function;
578 : : !! dV_l(r) = vpsp_l(r)-vloc(r) for angular momentum l;
579 : : !! f_l(q) =$ \int_0^{rmax}[j_l(2\pi q r) u_l(r) dV_l(r) r dr]/\sqrt{dvms}$
580 : : !! where dvms=$\displaystyle \int_0^{rmax}[(u_l(r) dV_l(r))^2 dr]$ is the mean
581 : : !! square value of the nonlocal correction for angular momentum l.
582 : : !! E_KB = $\displaystyle \frac{dvms}{\int_0^{rmax}[(u_l(r))^2 dV_l(r) dr]}$.
583 : : !! This is the eigenvalue of the Kleinman-Bylander operator and sets
584 : : !! the energy scale of the nonlocal psp corrections.
585 : : !! Bessel functions replaced by besj, which accomodates args near 0.
586 : : !!
587 : : !! SOURCE
588 : :
589 : 638 : subroutine psp1nl(dr,ekb,ffspl,lloc,lmax,mmax,mpsang,mqgrid,&
590 : 638 : & qgrid,rad,vloc,vpspll,wfll,wksincos)
591 : :
592 : : !Arguments ------------------------------------
593 : : !scalars
594 : : integer,intent(in) :: lloc,lmax,mmax,mpsang,mqgrid
595 : : !arrays
596 : : real(dp),intent(in) :: dr(mmax),qgrid(mqgrid),rad(mmax),vloc(mmax)
597 : : real(dp),intent(in) :: vpspll(mmax,mpsang),wfll(mmax,mpsang)
598 : : real(dp),intent(inout) :: wksincos(mmax,2,2)
599 : : real(dp),intent(out) :: ekb(mpsang),ffspl(mqgrid,2,mpsang)
600 : :
601 : : !Local variables-------------------------------
602 : : !scalars
603 : : integer,parameter :: dpsang=5
604 : : integer :: iq,ir,irmax,lp1
605 : : real(dp) :: dvwf,result,test,tpiq,yp1,ypn
606 : : character(len=500) :: message
607 : : !arrays
608 : : real(dp) :: ckb(dpsang),dvms(dpsang),eta(dpsang),renorm(dpsang)
609 : 638 : real(dp),allocatable :: besjx(:),work1(:),work2(:),work3(:),work4(:),work5(:)
610 : 638 : real(dp),allocatable :: work_spl(:)
611 : :
612 : : ! *************************************************************************
613 : :
614 : : !Zero out Kleinman-Bylander energies ekb
615 [ + + ]: 2392 : ekb(:)=0.0d0
616 : : !Zero out eta and other parameters too (so 0 s show up in output later)
617 : : eta(:)=0.0d0
618 : : dvms(:)=0.0d0
619 : : ckb(:)=0.0d0
620 : :
621 : : !Allow for no nonlocal correction (lmax=-1)
622 [ + + ]: 638 : if (lmax/=-1) then
623 : :
624 : : ! Check that lmax is within allowed range
625 [ - + ]: 636 : if (lmax<0.or.lmax>3) then
626 : : write(message, '(a,i12,a,a,a,a,a,a,a)' )&
627 : 0 : & 'lmax=',lmax,' is not an allowed value.',ch10,&
628 : 0 : & 'Allowed values are -1 for no nonlocal correction or else',ch10,&
629 : 0 : & '0, 1, 2, or 3 for maximum l nonlocal correction.',ch10,&
630 : 0 : & 'Action: check the input atomic psp data file for lmax.'
631 : 0 : ABI_ERROR(message)
632 : : end if
633 : :
634 : : ! Compute normalizing integrals eta=<dV> and mean square
635 : : ! nonlocal psp correction dvms=<dV^2>
636 : : ! "dvwf" consistently refers to dV(r)*wf(r) where dV=nonlocal correction
637 : :
638 [ + - - + : 1908 : ABI_MALLOC(work1,(mmax+1))
+ - + - +
- - + -
+ ]
639 [ - + + - : 1272 : ABI_MALLOC(work2,(mmax+1))
- + - + ]
640 [ - + + - : 1908 : ABI_MALLOC(work_spl,(mqgrid))
+ - + - -
+ - + ]
641 [ - + + - : 1908 : ABI_MALLOC(work5,(mmax))
+ - + - -
+ - + ]
642 [ - + + - : 1272 : ABI_MALLOC(besjx,(mmax))
- + - + ]
643 : :
644 [ + + ]: 1766 : do lp1=1,lmax+1
645 : :
646 : : ! Only do the work if nonlocal correction is nonzero
647 [ + + ]: 1766 : if (lp1 /= lloc+1) then
648 : :
649 : : ! integrand for 0 to r(mmax)
650 [ + + ]: 2096094 : do ir=1,mmax
651 : 2095047 : dvwf=(vpspll(ir,lp1)-vloc(ir))*wfll(ir,lp1)
652 : 2096094 : work1(ir)=wfll(ir,lp1)*dvwf
653 : : end do
654 : :
655 : : ! do integral
656 : : ! first need derivative of function; note use of
657 : : ! shifted indices to accomodate Mike Teter s choice of 0:mmax-1
658 : 1047 : call der_int(work1,work2,rad,dr,mmax-1,result)
659 : 1047 : eta(lp1)=result
660 : :
661 : : ! DEBUG
662 : : ! write(std_out,*)' psp1nl : write eta(lp1)'
663 : : ! write(std_out,*)result
664 : : ! do ir=1,mmax,61
665 : : ! write(std_out,*)vpspll(ir,lp1),vloc(ir),wfll(ir,lp1)
666 : : ! end do
667 : : ! write(std_out,*)
668 : : ! do ir=1,mmax,61
669 : : ! write(std_out,*)work1(ir),rad(ir),dr(ir)
670 : : ! end do
671 : : ! ENDDEBUG
672 : :
673 [ + + ]: 2096094 : do ir=1,mmax
674 : 2095047 : dvwf=(vpspll(ir,lp1)-vloc(ir))*wfll(ir,lp1)
675 : 2096094 : work1(ir)=dvwf**2
676 : : end do
677 : 1047 : call der_int(work1,work2,rad,dr,mmax-1,result)
678 : :
679 : 1047 : dvms(lp1)=result
680 : :
681 : : ! If dvms is not 0 for any given angular momentum l,
682 : : ! compute Xavier Gonze s definition of the Kleinman-Bylander
683 : : ! energy E_KB = dvms/eta. In this case also renormalize
684 : : ! the projection operator to u_KB(r)=$u_l(r) dV(r)/\sqrt{dvms}$.
685 : : ! This means dvwf gets multiplied by the normalization factor
686 : : ! "renorm"=$1/\sqrt{dvms}$ as seen below.
687 : : ! With dvwf=dV(r)*wf(r) for wf(r)=``radial'' wf, the integrand
688 : : ! for each angular momentum l is
689 : : ! Bessel_l(2 $\pi$ q r) * wf(r) * dV(r) * r;
690 : : ! NOTE presence of extra r in integrand.
691 : :
692 [ + - ]: 1047 : if (dvms(lp1)/=0.0d0) then
693 : 1047 : ekb(lp1)=dvms(lp1)/eta(lp1)
694 : 1047 : renorm(lp1)=1.0d0/sqrt(dvms(lp1))
695 : : ! ckb is Kleinman-Bylander "cosine" (Xavier Gonze)
696 : : ckb(lp1)=eta(lp1)/sqrt(dvms(lp1))
697 : : else
698 : 0 : ekb(lp1)=0.0d0
699 : : end if
700 : : end if
701 : : end do
702 : :
703 : : ! Loop on angular momenta
704 [ + + ]: 1766 : do lp1=1,lmax+1
705 : :
706 : : ! Compute form factor if ekb(lp1) not 0
707 [ + + ]: 1766 : if (ekb(lp1)/=0.0d0) then
708 : :
709 : : ! do q=0 separately, non-zero if l=0
710 [ + + ]: 1047 : if(lp1==1)then
711 [ + + ]: 1107106 : do ir=1,mmax
712 : 1106553 : dvwf=(vpspll(ir,lp1)-vloc(ir))*wfll(ir,lp1)*renorm(lp1)
713 : 1107106 : work1(ir)=rad(ir)*dvwf
714 : : end do
715 : 553 : call der_int(work1,work2,rad,dr,mmax-1,result)
716 : 553 : ffspl(1,1,lp1)=result
717 : : else
718 : : ! For l non-zero, f(q=0) vanishes !
719 : 494 : ffspl(1,1,lp1)=0.0d0
720 : : end if
721 : :
722 : : ! Prepare loop over q values
723 : 1047 : irmax=mmax+1
724 [ + + ]: 2095047 : do ir=mmax,2,-1
725 : 2094000 : test=(vpspll(ir,lp1)-vloc(ir))*wfll(ir,lp1)*renorm(lp1)*rad(ir)
726 : 2094000 : work5(ir)=test
727 : 2094000 : work1(ir)=0.0d0
728 : : ! Will ignore tail within decade of machine precision
729 [ + + + + ]: 2095047 : if ((10.0d0+abs(test))==10.0d0 .and. irmax==ir+1) then
730 : 1144491 : irmax=ir
731 : : end if
732 : : end do
733 : : ! Increase irmax a bit
734 : 1047 : irmax=irmax+4
735 : : ! Ask irmax to be lower than mmax
736 [ - + ]: 1047 : if(irmax>mmax-1)irmax=mmax-1
737 : :
738 [ + - - + : 3141 : ABI_MALLOC(work3,(irmax-1))
+ - + - +
- - + -
+ ]
739 [ - + + - : 2094 : ABI_MALLOC(work4,(irmax-1))
- + - + ]
740 : :
741 : : ! Loop over q values
742 [ + + ]: 3143177 : do iq=2,mqgrid
743 : 3142130 : tpiq=two_pi*qgrid(iq)
744 : 3142130 : call sincos(iq,irmax,mmax,wksincos,rad,tpiq)
745 [ + + ]: 2868399040 : work3(:)=wksincos(2:irmax,2,2) !Temporary array (Intel compiler compatibility)
746 [ + + ]: 2868399040 : work4(:)=wksincos(2:irmax,1,2) !Temporary array (Intel compiler compatibility)
747 : :
748 : : ! Handle r=0 separately
749 : 3142130 : work1(1)=0.0d0
750 : 3142130 : call besjm(tpiq,besjx(2:irmax),work3,(lp1-1),irmax-1,work4,rad(2:irmax))
751 [ + + ]: 2868399040 : do ir=2,irmax
752 : 2868399040 : work1(ir)=besjx(ir)*work5(ir)
753 : : end do
754 : : ! do integral
755 : 3142130 : call der_int(work1,work2,rad,dr,irmax,result)
756 : 3143177 : ffspl(iq,1,lp1)=result
757 : : end do
758 : :
759 : : ! Compute yp1=derivative of f(q) at q=0
760 [ + + ]: 1047 : if(lp1/=2)then
761 : : ! For l/=1, yp1=0
762 : 636 : yp1=0.0d0
763 : : else
764 : : ! For l=1, yp1=Int [2 Pi r^2 wf(r) dV(r)]/3
765 [ + + ]: 379700 : do ir=1,irmax
766 : 379289 : dvwf=(vpspll(ir,lp1)-vloc(ir))*wfll(ir,lp1)*renorm(lp1)
767 : 379700 : work1(ir)=(two_pi*rad(ir)**2)*dvwf/3.0d0
768 : : end do
769 : 411 : call der_int(work1,work2,rad,dr,irmax,result)
770 : 411 : yp1=result
771 : : end if
772 : :
773 : : ! Compute ypn=derivative of f(q) at q=qgrid(mqgrid)
774 : 1047 : tpiq=two_pi*qgrid(mqgrid)
775 : : ! Treat ir=1, r=0, separately
776 : 1047 : work1(1)=0.0d0
777 : : ! Here, must distinguish l==0 from others
778 [ + + ]: 1047 : if(lp1==1)then
779 : : ! l==0 : ypn=$\int [2\pi r (-bes1(2\pi r q)) wf(r) dV(r) r dr]$
780 : : ! The sine and cosine of the last point were computed in the previous loop
781 : : ! So, there is no need to call sincos. Note that the rank of besj is 1.
782 : 553 : call besjm(tpiq,besjx(2:irmax),work3,1,irmax-1,work4,rad(2:irmax))
783 [ + + ]: 495803 : do ir=2,irmax
784 : 495250 : dvwf=(vpspll(ir,lp1)-vloc(ir))*wfll(ir,lp1)*renorm(lp1)
785 : 495803 : work1(ir)=-besjx(ir)*two_pi*rad(ir)*rad(ir)*dvwf
786 : : end do
787 : : else
788 : : ! l==1 : ypn=$\int [2\pi r^2 wf(r) dV(r) (j_0(x)-(2/x)j_1(x)) dr]$
789 : : ! l==2 : ypn=$\int [2\pi r^2 wf(r) dV(r) (j_1(x)-(3/x)j_2(x)) dr]$
790 : : ! l==3 : ypn=$\int [2\pi r^2 wf(r) dV(r) (j_2(x)-(4/x)j_3(x)) dr]$
791 : : ! The sine and cosine of the last point were computed in the previous loop
792 : : ! Store first previously computed value with besj of order l, then use
793 : : ! besj of order l-1 (=lp1-2)
794 [ + + ]: 459988 : work1(2:irmax)=besjx(2:irmax)
795 : 494 : call besjm(tpiq,besjx(2:irmax),work3,(lp1-2),irmax-1,work4,rad(2:irmax))
796 [ + + ]: 459988 : do ir=2,irmax
797 : 459494 : dvwf=(vpspll(ir,lp1)-vloc(ir))*wfll(ir,lp1)*renorm(lp1)
798 : : work1(ir)=(two_pi*rad(ir)**2)*dvwf*&
799 : 459988 : & ( besjx(ir) - ( dble(lp1)*work1(ir)/(tpiq*rad(ir)) ) )
800 : : end do
801 : : end if
802 : : ! work1 is ready for integration
803 : 1047 : call der_int(work1,work2,rad,dr,irmax,result)
804 : 1047 : ypn=result
805 : :
806 : : ! Fit spline to get second derivatives by spline fit
807 : : call spline(qgrid,ffspl(:,1,lp1),mqgrid,yp1,ypn,&
808 : 1047 : & ffspl(:,2,lp1))
809 : :
810 [ - + ]: 1047 : ABI_FREE(work3)
811 [ - + ]: 2094 : ABI_FREE(work4)
812 : :
813 : : else
814 : : ! KB energy is zero, put nonlocal correction at l=0 to 0
815 [ + + + + ]: 498415 : ffspl(:,:,lp1)=0.0d0
816 : : end if
817 : :
818 : : end do ! End loop on angular momenta
819 : :
820 [ - + ]: 636 : ABI_FREE(work1)
821 [ - + ]: 636 : ABI_FREE(work2)
822 [ - + ]: 636 : ABI_FREE(work_spl)
823 [ - + ]: 636 : ABI_FREE(work5)
824 [ - + ]: 636 : ABI_FREE(besjx)
825 : : end if ! End of lmax/=-1 condition
826 : :
827 : 638 : end subroutine psp1nl
828 : : !!***
829 : :
830 : : !!****f* m_psp1/der_int
831 : : !! NAME
832 : : !! der_int
833 : : !!
834 : : !! FUNCTION
835 : : !! Given input function f(i) on Teter radial grid, and grid spacing
836 : : !! dr(i), compute function derivative df/dr on points from 0 to n.
837 : : !! Integrate function f(i) on grid r(i) from r(0) to r(nlast).
838 : : !! Note that array dimensions start at 0.
839 : : !!
840 : : !! INPUTS
841 : : !! f(0 to nlast)=function values on grid
842 : : !! r(0 to nlast)=radial grid points
843 : : !! dr(0 to nlast)=INVERSE of spacing on grid
844 : : !! nlast=radial grid point for upper limit
845 : : !!
846 : : !! OUTPUT
847 : : !! df(0 to n)=derivative $ \frac{df}{dr}$ on grid
848 : : !! smf= $ \int_{r(0)}^{r(nlast)} f(r) dr $.
849 : : !!
850 : : !! SOURCE
851 : :
852 : 5230188 : subroutine der_int(ff,df,rr,dr,nlast,smf)
853 : :
854 : : !Arguments ------------------------------------
855 : : !nmax sets standard number of grid points ! SHOULD BE REMOVED
856 : : !scalars
857 : : integer,parameter :: nmax=2000
858 : : integer,intent(in) :: nlast
859 : : real(dp),intent(out) :: smf
860 : : !no_abirules
861 : : !Note that dimension here starts at 0
862 : : real(dp), intent(in) :: dr(0:nmax),ff(0:nmax),rr(0:nmax)
863 : : real(dp), intent(out) :: df(0:nmax)
864 : :
865 : : !Local variables-------------------------------
866 : : !scalars
867 : : integer :: jj
868 : : real(dp),parameter :: div12=1.d0/12.d0
869 : : real(dp) :: hh
870 : : character(len=500) :: message
871 : :
872 : : ! *************************************************************************
873 : :
874 : : !Check that nlast lie within 0 to nmax
875 [ - + ]: 5230188 : if (nlast<0.or.nlast>nmax) then
876 : : write(message, '(a,i12,a,i12)' )&
877 : 0 : & ' nlast=',nlast,' lies outside range [0,nmax] with dimension nmax=',nmax
878 : 0 : ABI_BUG(message)
879 : : end if
880 : :
881 : : !Compute derivatives at lower end, near r=0
882 : : df(0)=-25.d0/12.d0*ff(0)+4.d0*ff(1)-3.d0*ff(2)+4.d0/3.d0*ff(3)&
883 : 5230188 : & -1.d0/4.d0*ff(4)
884 : : df(1)=-1.d0/4.d0*ff(0)-5.d0/6.d0*ff(1)+3.d0/2.d0*ff(2)&
885 : 5230188 : & -1.d0/2.d0*ff(3)+1.d0/12.d0*ff(4)
886 : :
887 : : !Run over range from just past r=0 to near r(n), using central differences
888 [ + + ]: 5308385239 : do jj=2,nlast-2
889 : 5308385239 : df(jj)=(ff(jj-2)-8.d0*(ff(jj-1)-ff(jj+1))-ff(jj+2))*div12
890 : : end do
891 : :
892 : : !Compute derivative at upper end of range
893 [ - + ]: 5230188 : if (nlast < 4) then
894 : 0 : message = ' der_int: ff does not have enough elements. nlast is too low'
895 : 0 : ABI_ERROR(message)
896 : : end if
897 : :
898 : : df(nlast-1)=-1.d0/12.d0*ff(nlast-4)&
899 : : & +1.d0/2.d0*ff(nlast-3)&
900 : : & -3.d0/2.d0*ff(nlast-2)&
901 : : & +5.d0/6.d0*ff(nlast-1)&
902 : 5230188 : & +1.d0/4.d0*ff(nlast)
903 : : df(nlast)=1.d0/4.d0*ff(nlast-4)&
904 : : & -4.d0/3.d0*ff(nlast-3)&
905 : : & +3.d0*ff(nlast-2)&
906 : : & -4.d0*ff(nlast-1)&
907 : 5230188 : & +25.d0/12.d0*ff(nlast)
908 : :
909 : : !Apply correct normalization over full range
910 [ + + ]: 5329305991 : do jj=0,nlast
911 : 5329305991 : df(jj)=df(jj)*dr(jj)
912 : : end do
913 : :
914 : 5230188 : smf=0.d0
915 [ + + ]: 5324075803 : do jj=0,nlast-1
916 : 5318845615 : hh=rr(jj+1)-rr(jj)
917 : 5324075803 : smf=smf+hh*(6.d0*(ff(jj)+ff(jj+1))+hh*(df(jj)-df(jj+1)))
918 : : end do
919 : 5230188 : smf=smf/12.d0
920 : :
921 : 5230188 : end subroutine der_int
922 : : !!***
923 : :
924 : : !!****f* m_psp1/sincos
925 : : !! NAME
926 : : !! sincos
927 : : !!
928 : : !! FUNCTION
929 : : !! Update the sine and cosine values, needed inside the
930 : : !! pseudopotential routines psp1lo and psp1nl.
931 : : !!
932 : : !! INPUTS
933 : : !! iq = number of current wavevector q
934 : : !! irmax = number of values of r on the radial grid to be computed
935 : : !! mmax = dimension of pspwk and rad
936 : : !! pspwk(:,1,1) and pspwk(:,2,1) : sine and cosine of 2$\pi$ dq * rad
937 : : !! pspwk(:,1,2) and pspwk(:,2,2) : sine and cosine of 2$\pi$ previous q * rad
938 : : !! rad(mmax) radial grid
939 : : !! tpiq = 2 $\pi$ * current wavevector q
940 : : !!
941 : : !! OUTPUT
942 : : !! pspwk(*,1,2) and pspwk(*,2,2) : sine and cosine of 2$\pi$ current q * rad
943 : : !!
944 : : !! NOTES
945 : : !! The speed was a special concern, so iterative computation
946 : : !! based on addition formula is possible. Interestingly,
947 : : !! this algorithm places strong constraints on accuracy,
948 : : !! so this routine is machine-dependent.
949 : : !!
950 : : !! SOURCE
951 : :
952 : 5224695 : subroutine sincos(iq,irmax,mmax,pspwk,rad,tpiq)
953 : :
954 : : !Arguments ------------------------------------
955 : : !scalars
956 : : integer,intent(in) :: iq,irmax,mmax
957 : : real(dp),intent(in) :: tpiq
958 : : !arrays
959 : : real(dp),intent(in) :: rad(mmax)
960 : : real(dp),intent(inout) :: pspwk(mmax,2,2)
961 : :
962 : : !Local variables-------------------------------
963 : : !scalars
964 : : integer :: ir,nstep
965 : : real(dp) :: prevcos,prevsin
966 : : logical :: testmipspro
967 : :
968 : :
969 : : ! *************************************************************************
970 : :
971 [ + + ]: 5224695 : if(iq==2)then
972 : :
973 : : ! Here set up the sin and cos at iq=2
974 [ + + ]: 1769298 : do ir=2,irmax
975 : 1767557 : pspwk(ir,1,2)=pspwk(ir,1,1)
976 : 1769298 : pspwk(ir,2,2)=pspwk(ir,2,1)
977 : : end do
978 : :
979 : : else
980 : : !
981 : : ! The sensitivity of the algorithm to changes of nstep
982 : : ! has been tested : for all the machines except SGI - R10000 ,
983 : : ! either using only the hard way, or
984 : : ! using up to nstep=40 causes changes at the level
985 : : ! of 1.0d-16 in the total energy. Larger values of
986 : : ! nstep might be possible, but the associated residual
987 : : ! is already very small ! The accelerated computation of
988 : : ! sine and cosine is essential for a good speed on IBM, but,
989 : : ! fortunately, on the SGI - R10000 the normal computation is fast enough.
990 : :
991 : 5222954 : testmipspro=.false.
992 : 5222954 : nstep=40
993 [ + + ]: 5222954 : if(iq-(iq/nstep)*nstep == 0 .or. testmipspro)then
994 : :
995 : : ! Every nstep steps, uses the hard way
996 [ + + ]: 132735646 : do ir=2,irmax
997 : 132605029 : pspwk(ir,1,2)=sin(tpiq*rad(ir))
998 : 132735646 : pspwk(ir,2,2)=cos(tpiq*rad(ir))
999 : : end do
1000 : :
1001 : : else
1002 : :
1003 : : ! Here the fastest way, iteratively
1004 [ + + ]: 5174935629 : do ir=2,irmax
1005 : 5169843292 : prevsin=pspwk(ir,1,2)
1006 : 5169843292 : prevcos=pspwk(ir,2,2)
1007 : 5169843292 : pspwk(ir,1,2)=prevsin*pspwk(ir,2,1)+prevcos*pspwk(ir,1,1)
1008 : 5174935629 : pspwk(ir,2,2)=prevcos*pspwk(ir,2,1)-prevsin*pspwk(ir,1,1)
1009 : : end do
1010 : :
1011 : : end if
1012 : :
1013 : : end if ! iq==2
1014 : :
1015 : 5224695 : end subroutine sincos
1016 : : !!***
1017 : :
1018 : : !!****f* m_psp1/psp4cc
1019 : : !! NAME
1020 : : !! psp4cc
1021 : : !!
1022 : : !! FUNCTION
1023 : : !! Compute the core charge density, for use in the XC core
1024 : : !! correction, following the function definition valid
1025 : : !! for the format 4 of pseudopotentials.
1026 : : !! This is a even polynomial of 24th order for core density,
1027 : : !! that is cut off exactly beyond rchrg.
1028 : : !! It has been produced on 7 May 1992 by M. Teter.
1029 : : !!
1030 : : !! INPUTS
1031 : : !! fchrg=magnitude of the core charge correction
1032 : : !! n1xccc=dimension of xccc1d ; 0 if no XC core correction is used
1033 : : !!
1034 : : !! OUTPUT
1035 : : !! xccc1d(n1xccc,6)= 1D core charge function and its five first derivatives
1036 : : !!
1037 : : !! NOTES
1038 : : !! The argument of xccc1d is assumed to be normalized, and to vary
1039 : : !! from xx=0 to 1 (from r=0 to r=xcccrc)
1040 : : !!
1041 : : !! WARNINGS
1042 : : !! the fifth derivative is not yet delivered.
1043 : : !!
1044 : : !! SOURCE
1045 : :
1046 : 3 : subroutine psp4cc(fchrg,n1xccc,xccc1d)
1047 : :
1048 : : !Arguments ------------------------------------
1049 : : !scalars
1050 : : integer,intent(in) :: n1xccc
1051 : : real(dp),intent(in) :: fchrg
1052 : : !arrays
1053 : : real(dp),intent(inout) :: xccc1d(n1xccc,6) !vz_i
1054 : :
1055 : : !Local variables-------------------------------
1056 : : !scalars
1057 : : integer :: i1xccc,ider
1058 : : real(dp),parameter :: a10=-0.1156854803757563d5,a12=+0.2371534625455588d5
1059 : : real(dp),parameter :: a14=-0.3138755797827918d5,a16=+0.2582842713241039d5
1060 : : real(dp),parameter :: a18=-0.1200356429115204d5,a20=+0.2405099057118771d4
1061 : : real(dp),parameter :: a2=-0.8480751097855989d1,a4=+0.9684600878284791d2
1062 : : real(dp),parameter :: a6=-0.7490894651588015d3,a8=+0.3670890998130434d4
1063 : : real(dp) :: der1,dern,factor
1064 : : character(len=500) :: message
1065 : : !arrays
1066 : 3 : real(dp),allocatable :: ff(:),ff2(:),work(:),xx(:)
1067 : : real(dp) :: x
1068 : :
1069 : : ! *************************************************************************
1070 : :
1071 [ - + + - : 9 : ABI_MALLOC(ff,(n1xccc))
+ - + - -
+ - + ]
1072 [ - + + - : 6 : ABI_MALLOC(ff2,(n1xccc))
- + - + ]
1073 [ - + + - : 6 : ABI_MALLOC(work,(n1xccc))
- + - + ]
1074 [ - + + - : 6 : ABI_MALLOC(xx,(n1xccc))
- + - + ]
1075 : :
1076 : :
1077 [ + - ]: 3 : if(n1xccc > 1)then
1078 : 3 : factor=1.0d0/dble(n1xccc-1)
1079 [ + + ]: 7506 : do i1xccc=1,n1xccc
1080 : 7506 : xx(i1xccc)=(i1xccc-1)*factor
1081 : : end do
1082 : : else
1083 : 0 : write(message, '(a,i0)' )' n1xccc should larger than 1, while it is n1xccc=',n1xccc
1084 : 0 : ABI_BUG(message)
1085 : : end if
1086 : :
1087 : : !Initialization, to avoid some problem with some compilers
1088 [ + + + + ]: 39 : xccc1d(1,:)=zero ; xccc1d(n1xccc,:)=zero
1089 : :
1090 : : !Take care of each derivative separately
1091 [ + + ]: 12 : do ider=0,2
1092 : :
1093 [ + + ]: 9 : if(ider==0)then
1094 : : ! Generate spline fitting for the function gg
1095 [ + + ]: 7506 : do i1xccc=1,n1xccc
1096 : : ! ff(i1xccc)=fchrg*gg(xx(i1xccc))
1097 : 7506 : ff(i1xccc)=fchrg*gg_psp4(xx(i1xccc))
1098 : : end do
1099 : : ! Complete with derivatives at end points
1100 : 3 : der1=0.0d0
1101 : : ! dern=fchrg*gp(1.0d0)
1102 : 3 : dern=fchrg*gp_psp4(1.0d0)
1103 [ + + ]: 6 : else if(ider==1)then
1104 : : ! Generate spline fitting for the function gp
1105 [ + + ]: 7506 : do i1xccc=1,n1xccc
1106 : : ! ff(i1xccc)=fchrg*gp(xx(i1xccc))
1107 : 7506 : ff(i1xccc)=fchrg*gp_psp4(xx(i1xccc))
1108 : : end do
1109 : : ! Complete with derivatives at end points, already estimated
1110 : 3 : der1=xccc1d(1,ider+2)
1111 : 3 : dern=xccc1d(n1xccc,ider+2)
1112 : : else if(ider==2)then
1113 : : ! Generate spline fitting for the function gpp
1114 : : ! (note : the function gpp has already been estimated, for the spline
1115 : : ! fitting of the function gg, but it is replaced here by the more
1116 : : ! accurate analytic derivative)
1117 [ + + ]: 7506 : do i1xccc=1,n1xccc
1118 : 7503 : x=xx(i1xccc)
1119 : 7506 : ff(i1xccc)=fchrg*(gpp_1_psp4(x)+gpp_2_psp4(x)+gpp_3_psp4(x))
1120 : : ! ff(i1xccc)=fchrg*gpp(xx(i1xccc))
1121 : : end do
1122 : : ! Complete with derivatives of end points
1123 : 3 : der1=xccc1d(1,ider+2)
1124 : 3 : dern=xccc1d(n1xccc,ider+2)
1125 : : end if
1126 : :
1127 : : ! Produce second derivative numerically, for use with splines
1128 : 9 : call spline(xx,ff,n1xccc,der1,dern,ff2)
1129 [ + + ]: 22518 : xccc1d(:,ider+1)=ff(:)
1130 [ + + ]: 22521 : xccc1d(:,ider+3)=ff2(:)
1131 : : end do
1132 : :
1133 [ + + ]: 7506 : xccc1d(:,6)=zero
1134 : :
1135 [ - + ]: 3 : ABI_FREE(ff)
1136 [ - + ]: 3 : ABI_FREE(ff2)
1137 [ - + ]: 3 : ABI_FREE(work)
1138 [ - + ]: 3 : ABI_FREE(xx)
1139 : :
1140 : : !DEBUG
1141 : : !write(std_out,*)' psp1cc : output of core charge density and derivatives '
1142 : : !write(std_out,*)' xx gg gp '
1143 : : !do i1xccc=1,n1xccc
1144 : : !write(std_out,'(3es14.6)' ) xx(i1xccc),xccc1d(i1xccc,1),xccc1d(i1xccc,2)
1145 : : !end do
1146 : : !write(std_out,*)' xx gpp gg2 '
1147 : : !do i1xccc=1,n1xccc
1148 : : !write(std_out,'(3es14.6)' ) xx(i1xccc),xccc1d(i1xccc,3),xccc1d(i1xccc,4)
1149 : : !end do
1150 : : !write(std_out,*)' xx gp2 gpp2 '
1151 : : !do i1xccc=1,n1xccc
1152 : : !write(std_out,'(3es14.6)' ) xx(i1xccc),xccc1d(i1xccc,5),xccc1d(i1xccc,6)
1153 : : !end do
1154 : : !write(std_out,*)' psp1cc : debug done, stop '
1155 : : !stop
1156 : : !ENDDEBUG
1157 : :
1158 : : contains
1159 : :
1160 : 7503 : function gg_psp4(x)
1161 : : !Expression of 7 May 1992
1162 : : real(dp) :: gg_psp4
1163 : : real(dp),intent(in) :: x
1164 : : gg_psp4=(1.d0+x**2*(a2 +x**2*(a4 +x**2*(a6 +x**2*(a8 + &
1165 : : & x**2*(a10+x**2*(a12+x**2*(a14+x**2*(a16+ &
1166 : 7503 : & x**2*(a18+x**2*(a20))))))))))) *(1.0d0-x**2)**2
1167 : 7503 : end function gg_psp4
1168 : :
1169 : 7506 : function gp_psp4(x)
1170 : : !gp(x) is the derivative of gg(x) wrt x
1171 : : real(dp) :: gp_psp4
1172 : : real(dp),intent(in) :: x
1173 : : gp_psp4=2.d0*x*((a2+x**2*(2.d0*a4+x**2*(3.d0*a6+x**2*( &
1174 : : & 4.d0*a8+x**2*(5.d0*a10+x**2*(6.d0*a12+x**2*( &
1175 : : & 7.d0*a14+x**2*(8.d0*a16+x**2*(9.d0*a18+x**2*(10.d0*a20))))))))))*&
1176 : : & (1.d0-x**2)**2 &
1177 : : & -2.0d0*(1.d0+x**2*(a2 +x**2*(a4 +x**2*(a6 +x**2*(a8 + &
1178 : : & x**2*(a10+x**2*(a12+x**2*(a14+x**2*(a16+ &
1179 : 7506 : & x**2*(a18+x**2*a20)))))))))) *(1.0d0-x**2) )
1180 : 7506 : end function gp_psp4
1181 : :
1182 : 7503 : function gpp_1_psp4(x)
1183 : : !gpp(x) is the second derivative of gg(x) wrt x
1184 : : real(dp) :: gpp_1_psp4
1185 : : real(dp),intent(in) :: x
1186 : : gpp_1_psp4= ( 2.d0*a4+ x**2*(3.d0*2.d0*a6 +x**2*( &
1187 : : & 4.d0*3.d0*a8+ x**2*(5.d0*4.d0*a10+x**2*( &
1188 : : & 6.d0*5.d0*a12+x**2*(7.d0*6.d0*a14+x**2*( &
1189 : : & 8.d0*7.d0*a16+x**2*(9.d0*8.d0*a18+x**2*( &
1190 : : & 10.d0*9.d0*a20) &
1191 : 7503 : & ))))))))*(2.d0*x*(1.d0-x**2))**2
1192 : 7503 : end function gpp_1_psp4
1193 : :
1194 : 7503 : function gpp_2_psp4(x)
1195 : :
1196 : : real(dp) :: gpp_2_psp4
1197 : : real(dp),intent(in) :: x
1198 : : gpp_2_psp4=(a2+x**2*(2.d0*a4+x**2*(3.d0*a6+x**2*( &
1199 : : & 4.d0*a8 +x**2*(5.d0*a10+x**2*(6.d0*a12+x**2*( &
1200 : : & 7.d0*a14+x**2*(8.d0*a16+x**2*(9.d0*a18+x**2*( &
1201 : : & 10.d0*a20) &
1202 : 7503 : & )))))))))*(1.d0-x**2)*2*(1.d0-9.d0*x**2)
1203 : 7503 : end function gpp_2_psp4
1204 : :
1205 : 7503 : function gpp_3_psp4(x)
1206 : :
1207 : : real(dp) :: gpp_3_psp4
1208 : : real(dp),intent(in) :: x
1209 : : gpp_3_psp4=(1.d0+x**2*(a2 +x**2*(a4 +x**2*(a6 +x**2*(a8 + &
1210 : : & x**2*(a10+x**2*(a12+x**2*(a14+x**2*(a16+ &
1211 : : & x**2*(a18+x**2*a20 &
1212 : 7503 : & ))))))))))*(1.0d0-3.d0*x**2)*(-4.d0)
1213 : 7503 : end function gpp_3_psp4
1214 : :
1215 : : end subroutine psp4cc
1216 : : !!***
1217 : :
1218 : : end module m_psp1
1219 : : !!***
|