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,grho)
133 call fderiv(2,nr,r,rho,g2rho)
135 g2rho(ir)=g2rho(ir)+2.d0*ri(ir)*grho(ir)
139 g3rho(ir)=grho(ir)*g2rho(ir)
141 call xcifc(xctype,nr,rho=rho,grho=grho,g2rho=g2rho,g3rho=g3rho,ex=ex,ec=ec,&
145 call xcifc(xctype,nr,rho=rho,ex=ex,ec=ec,vx=vx,vc=vc)
148 vr(1:nr)=vh(1:nr)+vx(1:nr)+vc(1:nr)
150 t1=sum((vr(1:nr)-vrp(1:nr))**2)
154 if (dv > dvp) beta=beta*0.8d0
155 beta=max(beta,0.01d0)
160 vr(ir)=(1.d0-beta)*vrp(ir)+beta*vr(ir)
166 if ((iscl > 2).and.(dv < eps))
goto 10
170 write(*,
'("Warning(atom): maximum iterations exceeded")')
172 deallocate(vn,vh,ex,ec,vx,vc,vrp)
173 deallocate(ri,wpr,fr1,fr2,gr1,gr2)
174 if (xcgrad == 1)
deallocate(grho,g2rho,g3rho)
181 integer,
intent(in) :: n
182 real(8),
intent(in) :: wp(*),f(n)
183 real(8),
intent(out) :: g(n)
188 sm=wp(5)*f(1)+wp(6)*f(2)+wp(7)*f(3)+wp(8)*f(4)
192 sm=sm+wp(j)*f(i-1)+wp(j+1)*f(i)+wp(j+2)*f(i+1)+wp(j+3)*f(i+2)
196 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)