9subroutine atom(sol,ptnucl,zn,nst,n,l,k,occ,xctype,xcgrad,nr,r,eval,rho,vr,rwf)
45real(8),
intent(in) :: sol
46logical,
intent(in) :: ptnucl
47real(8),
intent(in) :: zn
48integer,
intent(in) :: nst
49integer,
intent(in) :: n(nst),l(nst),k(nst)
50real(8),
intent(inout) :: occ(nst)
51integer,
intent(in) :: xctype(3),xcgrad
52integer,
intent(in) :: nr
53real(8),
intent(in) :: r(nr)
54real(8),
intent(out) :: eval(nst)
55real(8),
intent(out) :: rho(nr),vr(nr)
56real(8),
intent(out) :: rwf(nr,2,nst)
58integer,
parameter :: maxscl=200
60real(8),
parameter :: fourpi=12.566370614359172954d0
62real(8),
parameter :: eps=1.d-6
63real(8) dv,dvp,ze,beta,t1
65real(8),
allocatable :: vn(:),vh(:),ex(:),ec(:),vx(:),vc(:),vrp(:)
66real(8),
allocatable :: ri(:),wpr(:,:),fr1(:),fr2(:),gr1(:),gr2(:)
67real(8),
allocatable :: grho(:),g2rho(:),g3rho(:)
70 write(*,
'("Error(atom): nst < 1 : ",I8)') nst
75allocate(vn(nr),vh(nr),ex(nr),ec(nr),vx(nr),vc(nr),vrp(nr))
76allocate(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
174write(*,
'("Warning(atom): maximum iterations exceeded")')
176deallocate(vn,vh,ex,ec,vx,vc,vrp)
177deallocate(ri,wpr,fr1,fr2,gr1,gr2)
178if (xcgrad == 1)
deallocate(grho,g2rho,g3rho)
186integer,
intent(in) :: n
187real(8),
intent(in) :: wp(*),f(n)
188real(8),
intent(out) :: g(n)
193sm=wp(5)*f(1)+wp(6)*f(2)+wp(7)*f(3)+wp(8)*f(4)
197 sm=sm+wp(j)*f(i-1)+wp(j+1)*f(i)+wp(j+2)*f(i+1)+wp(j+3)*f(i+2)
201g(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 atom(sol, ptnucl, zn, nst, n, l, k, occ, xctype, xcgrad, nr, r, eval, rho, vr, rwf)
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)