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 : ",I8)') 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))
100 t1=sqrt(dble(k(ist)**2)-(zn/sol)**2)
101 t1=(dble(n(ist)-abs(k(ist)))+t1)**2
102 t1=1.d0+((zn/sol)**2)/t1
103 eval(ist)=sol**2/sqrt(t1)-sol**2
111 call rdirac(sol,n(ist),l(ist),k(ist),nr,r,vr,eval(ist),rwf(:,1,ist), &
117 t1=sum(occ(1:nst)*(rwf(ir,1,1:nst)**2+rwf(ir,2,1:nst)**2))
120 rho(ir)=(1.d0/fourpi)*t1*ri(ir)**2
126 vh(1:nr)=gr1(1:nr)*ri(1:nr)+t1-gr2(1:nr)
129 rho(1:nr)=t1*rho(1:nr)
132 if (xcgrad == 1)
then 135 call fderiv(1,nr,r,rho,grho)
137 call fderiv(2,nr,r,rho,g2rho)
139 g2rho(ir)=g2rho(ir)+2.d0*ri(ir)*grho(ir)
143 g3rho(ir)=grho(ir)*g2rho(ir)
145 call xcifc(xctype,nr,rho=rho,grho=grho,g2rho=g2rho,g3rho=g3rho,ex=ex,ec=ec,&
149 call xcifc(xctype,nr,rho=rho,ex=ex,ec=ec,vx=vx,vc=vc)
152 vr(1:nr)=vh(1:nr)+vx(1:nr)+vc(1:nr)
154 t1=sum((vr(1:nr)-vrp(1:nr))**2)
158 if (dv > dvp) beta=beta*0.8d0
159 beta=max(beta,0.01d0)
164 vr(ir)=(1.d0-beta)*vrp(ir)+beta*vr(ir)
170 if ((iscl > 2).and.(dv < eps))
goto 10
174 write(*,
'("Warning(atom): maximum iterations exceeded")')
176 deallocate(vn,vh,ex,ec,vx,vc,vrp)
177 deallocate(ri,wpr,fr1,fr2,gr1,gr2)
178 if (xcgrad == 1)
deallocate(grho,g2rho,g3rho)
185 integer,
intent(in) :: n
186 real(8),
intent(in) :: wp(*),f(n)
187 real(8),
intent(out) :: g(n)
192 sm=wp(5)*f(1)+wp(6)*f(2)+wp(7)*f(3)+wp(8)*f(4)
196 sm=sm+wp(j)*f(i-1)+wp(j+1)*f(i)+wp(j+2)*f(i+1)+wp(j+3)*f(i+2)
200 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)