9 subroutine atom(sol,ptnucl,zn,nst,n,l,k,occ,xctype,xcgrad,nr,r,eval,rho,vr,rwf)
45 real(8),
intent(in) :: sol
46 logical,
intent(in) :: ptnucl
47 real(8),
intent(in) :: zn
48 integer,
intent(in) :: nst
49 integer,
intent(in) :: n(nst),l(nst),k(nst)
50 real(8),
intent(inout) :: occ(nst)
51 integer,
intent(in) :: xctype(3),xcgrad
52 integer,
intent(in) :: nr
53 real(8),
intent(in) :: r(nr)
54 real(8),
intent(out) :: eval(nst)
55 real(8),
intent(out) :: rho(nr),vr(nr)
56 real(8),
intent(out) :: rwf(nr,2,nst)
58 integer,
parameter :: maxscl=200
60 real(8),
parameter :: fourpi=12.566370614359172954d0
62 real(8),
parameter :: eps=1.d-6
63 real(8) dv,dvp,ze,beta,t1
65 real(8),
allocatable :: vn(:),vh(:),ex(:),ec(:),vx(:),vc(:),vrp(:)
66 real(8),
allocatable :: ri(:),wpr(:,:),fr1(:),fr2(:),gr1(:),gr2(:)
67 real(8),
allocatable :: grho(:),g2rho(:),g3rho(:)
70 write(*,
'("Error(atom): nst < 1 : ",I0)') nst
75 allocate(vn(nr),vh(nr),ex(nr),ec(nr),vx(nr),vc(nr),vrp(nr))
76 allocate(ri(nr),wpr(4,nr),fr1(nr),fr2(nr),gr1(nr),gr2(nr))
78 allocate(grho(nr),g2rho(nr),g3rho(nr))
96 t1=sqrt(dble(k(ist)**2)-(zn/sol)**2)
97 t1=(dble(n(ist)-abs(k(ist)))+t1)**2
98 t1=1.d0+((zn/sol)**2)/t1
99 eval(ist)=sol**2/sqrt(t1)-sol**2
107 call rdirac(sol,n(ist),l(ist),k(ist),nr,r,vr,eval(ist),rwf(:,1,ist), &
113 t1=sum(occ(1:nst)*(rwf(ir,1,1:nst)**2+rwf(ir,2,1:nst)**2))
116 rho(ir)=(t1/fourpi)*ri(ir)**2
122 vh(1:nr)=gr1(1:nr)*ri(1:nr)+t1-gr2(1:nr)
125 rho(1:nr)=t1*rho(1:nr)
128 if (xcgrad == 1)
then 131 call fderiv(1,nr,r,rho,gr1)
133 call fderiv(2,nr,r,rho,g2rho)
134 g2rho(1:nr)=g2rho(1:nr)+2.d0*ri(1:nr)*gr1(1:nr)
136 grho(1:nr)=abs(gr1(1:nr))
138 call fderiv(1,nr,r,grho,gr2)
139 g3rho(1:nr)=gr1(1:nr)*gr2(1:nr)
140 call xcifc(xctype,nr,rho=rho,grho=grho,g2rho=g2rho,g3rho=g3rho,ex=ex,ec=ec,&
144 call xcifc(xctype,nr,rho=rho,ex=ex,ec=ec,vx=vx,vc=vc)
147 vr(1:nr)=vh(1:nr)+vx(1:nr)+vc(1:nr)
149 t1=sum((vr(1:nr)-vrp(1:nr))**2)
153 if (dv > dvp) beta=beta*0.8d0
154 if (beta < 0.01d0) beta=0.01d0
159 vr(ir)=(1.d0-beta)*vrp(ir)+beta*vr(ir)
165 if ((iscl > 2).and.(dv < eps))
goto 10
169 write(*,
'("Warning(atom): maximum iterations exceeded")')
171 deallocate(vn,vh,ex,ec,vx,vc,vrp)
172 deallocate(ri,wpr,fr1,fr2,gr1,gr2)
173 if (xcgrad == 1)
deallocate(grho,g2rho,g3rho)
180 integer,
intent(in) :: n
181 real(8),
intent(in) :: wp(*),f(n)
182 real(8),
intent(out) :: g(n)
187 sm=wp(5)*f(1)+wp(6)*f(2)+wp(7)*f(3)+wp(8)*f(4)
191 sm=sm+wp(j)*f(i-1)+wp(j+1)*f(i)+wp(j+2)*f(i+1)+wp(j+3)*f(i+2)
195 g(n)=sm+wp(j)*f(n-3)+wp(j+1)*f(n-2)+wp(j+2)*f(n-1)+wp(j+3)*f(n)
subroutine potnucl(ptnucl, nr, r, zn, vn)
subroutine atom(sol, ptnucl, zn, nst, n, l, k, occ, xctype, xcgrad, nr, r, eval, rho, vr, rwf)
subroutine fderiv(m, n, x, f, g)
subroutine rdirac(sol, n, l, k, nr, r, vr, eval, g0, f0)
pure subroutine splintwp(n, wp, f, g)
subroutine wsplintp(n, x, wp)
subroutine xcifc(xctype, n, c_tb09, tempa, rho, rhoup, rhodn, grho, gup, gdn, g2rho, g2up, g2dn, g3rho, g3up, g3dn, grho2, gup2, gdn2, gupdn, tau, tauup, taudn, ex, ec, vx, vc, vxup, vxdn, vcup, vcdn, dxdgr2, dxdgu2, dxdgd2, dxdgud, dcdgr2, dcdgu2, dcdgd2, dcdgud, dxdg2r, dxdg2u, dxdg2d, dcdg2r, dcdg2u, dcdg2d, wx, wxup, wxdn, wc, wcup, wcdn, dtdr, dtdru, dtdrd, dtdgr2, dtdgu2, dtdgd2, dtdg2r, dtdg2u, dtdg2d)