diff options
Diffstat (limited to 'src/labat/labat.f')
| -rw-r--r-- | src/labat/labat.f | 587 |
1 files changed, 587 insertions, 0 deletions
diff --git a/src/labat/labat.f b/src/labat/labat.f new file mode 100644 index 0000000..da1f7fe --- /dev/null +++ b/src/labat/labat.f | |||
| @@ -0,0 +1,587 @@ | |||
| 1 | program atom | ||
| 2 | implicit double precision (a-h,o-z) | ||
| 3 | dimension dval(2,561),nval(2,7,10),ddval(2,561),ndval(2,7,10) | ||
| 4 | dimension dcore(2,561),vhv(561),fpu(561) | ||
| 5 | c | ||
| 6 | c free atom program by m.p. summer 1985 (valence energy and core | ||
| 7 | c density are calculated) | ||
| 8 | c | ||
| 9 | c GGA implemented by T. Holmquist and U. Yxklinten. | ||
| 10 | c | ||
| 11 | c files used: | ||
| 12 | c 6: terminal output | ||
| 13 | c 22: density and potential output | ||
| 14 | c 33: density and potential input | ||
| 15 | c 44: potential and density double prec. output | ||
| 16 | c 46: potential and density double prec. input | ||
| 17 | c 55: control input | ||
| 18 | c 66: printer output | ||
| 19 | c 77: density (total and core) output (J.H.) | ||
| 20 | c | ||
| 21 | dimension r(561),veff(2,561),vc(561),vcold(561),vv(561) | ||
| 22 | dimension gr(561),lm(2),rnocc(2,7,10),ux1(561),ux2(561) | ||
| 23 | dimension u(561),roo(561),spl(561),nb(7) | ||
| 24 | dimension db(2,561),v(561),vold(2,561) | ||
| 25 | dimension snlo(561),wj(301),ekin(2) | ||
| 26 | dimension ebound(2,7,10),nbound(2,7),de(2,7,10) | ||
| 27 | dimension apu(561),bpu(561),cpu(561),dpu(561),nlp(2,7,10) | ||
| 28 | dimension epu(561) | ||
| 29 | c=================================================================== | ||
| 30 | c gga | ||
| 31 | dimension excgga(561),uxcup(561),uxcdn(561) | ||
| 32 | logical doned,donela,donegr,donez,donec | ||
| 33 | c gga | ||
| 34 | c=================================================================== | ||
| 35 | common/sc/gr,r,snlo,nbl | ||
| 36 | common/mess/wj,dx,nblock,jblock | ||
| 37 | common/pot/v | ||
| 38 | frs(x)=(3.d0/(4.d0*pi*x))**(1.d0/3.d0) | ||
| 39 | pi=4.d0*datan(1.d0) | ||
| 40 | pi2=pi/2.d0 | ||
| 41 | a=(4.d0/9.d0/pi)**(1.d0/3.d0) | ||
| 42 | c | ||
| 43 | open(22,file='adensout.dat',status='unknown') | ||
| 44 | open(33,file='adensin.dat',status='unknown') | ||
| 45 | open(44,file='apotout.dat',status='unknown') | ||
| 46 | open(46,file='apotin.dat',status='unknown') | ||
| 47 | open(55,file='atomctrl.dat',status='old') | ||
| 48 | open(66,file='aprtout.dat',status='unknown') | ||
| 49 | open(77,file='atomdens.dat',status='unknown') | ||
| 50 | write(6,*) '=== Its ===== Energy (Ha) ======' | ||
| 51 | call flush(6) | ||
| 52 | read(55,*)z,zion | ||
| 53 | c z : atomic number | ||
| 54 | c zion : ionicity | ||
| 55 | c | ||
| 56 | write(66,2) z,zion | ||
| 57 | 2 format(/' atom number:',f5.0,' ionicity:',f5.0) | ||
| 58 | sf=4.d0*pi | ||
| 59 | read(55,*)jblock,nbl,c | ||
| 60 | c parameters of the hermann-skillmann mesh | ||
| 61 | read(55,*)fback,thresh,qsc | ||
| 62 | C fback : feedback | ||
| 63 | c thresh : error allowed for the bound state eigenenergy | ||
| 64 | c e.g. 0.00001 | ||
| 65 | c qsc : parameter for the screened green's function (0.005) | ||
| 66 | read(55,*)itmax,inopt,ipr,iout | ||
| 67 | c itmax : max. no. of iterations | ||
| 68 | c iopt : =0 starting potential generated; =1 starting potential | ||
| 69 | c read in; =2 starting potential read in from unit 46. | ||
| 70 | c (double precision format) | ||
| 71 | c ipr, iout : print out parameters | ||
| 72 | c | ||
| 73 | c set up the herman-skillman mesh | ||
| 74 | c | ||
| 75 | nblock=jblock | ||
| 76 | mesh=nblock*nbl+1 | ||
| 77 | n=mesh | ||
| 78 | mest=mesh | ||
| 79 | dx=c*0.0025d0 | ||
| 80 | en0=-0.01d0 | ||
| 81 | i=1 | ||
| 82 | r(i)=0.d0 | ||
| 83 | deltax=dx | ||
| 84 | do 251 j=1,nblock | ||
| 85 | do 241 jk=1,nbl | ||
| 86 | i=i+1 | ||
| 87 | 241 r(i)=r(i-1)+deltax | ||
| 88 | deltax=2.d0*deltax | ||
| 89 | 251 continue | ||
| 90 | c | ||
| 91 | read(55,*)ne,iys,ixc | ||
| 92 | c ne: no. bound states | ||
| 93 | c iys: =1 for spin compensated; =2 spin polarized | ||
| 94 | c ixc: = 1 b-h xc; =0 c-a xc | ||
| 95 | if(ixc.eq.1)write(66,2149) | ||
| 96 | if(ixc.eq.0)write(66,2148) | ||
| 97 | if(ixc.eq.2)write(66,2147) | ||
| 98 | 2149 format(/' von barth - hedin xc') | ||
| 99 | 2148 format(/' ceperley - alder xc') | ||
| 100 | 2147 format(/' perdew - wang xc') | ||
| 101 | dxx=r(n)-r(n-1) | ||
| 102 | write(66,5)jblock,nbl,c | ||
| 103 | write(66,5849)dx,dxx,r(n) | ||
| 104 | 5 format(/' hermann-skillmann mesh',/,' blocks, nbl, c:',2(i5,','), | ||
| 105 | j f10.7) | ||
| 106 | 5849 format(' first interval, last interval, final r:',2(f10.6,','), | ||
| 107 | j f10.6) | ||
| 108 | write(66,2312) thresh,qsc,fback | ||
| 109 | 2312 format(/' energy eigenvalue threshold, screening parameter, ', | ||
| 110 | j 'feedback:',2(f12.6,','),f6.3) | ||
| 111 | write(66,9) | ||
| 112 | do 5273 i=1,7 | ||
| 113 | 5273 nb(i)=0 | ||
| 114 | lmax=0 | ||
| 115 | 9 format(//' initial bound state configuration',/, | ||
| 116 | j ' nlm energy occup. val.el. d-band el.') | ||
| 117 | zv=0.d0 | ||
| 118 | do 5595 ispin=1,iys | ||
| 119 | do 5595 ii=1,ne | ||
| 120 | read(55,*)nnlz,eb0,rnoc,nv,ndv | ||
| 121 | c | ||
| 122 | c nnlz : e.g. 100 | ||
| 123 | c eb0 : energy eigenvalue guess | ||
| 124 | c rnoc : occupation number | ||
| 125 | c nv : =1 when orbital is a valence orbital; =0 for core orbitals | ||
| 126 | c ndv : =1 when orbital is a d-valence orbital; =0 for other orbitals | ||
| 127 | c | ||
| 128 | nnn=nnlz/100 | ||
| 129 | lll=(nnlz-nnn*100)/10 | ||
| 130 | nnn=nnn-lll | ||
| 131 | if(nnn.gt.nb(lll+1))nb(lll+1)=nnn | ||
| 132 | if(lll.gt.lmax)lmax=lll | ||
| 133 | rnocc(ispin,lll+1,nnn)=rnoc | ||
| 134 | nval(ispin,lll+1,nnn)=nv | ||
| 135 | ndval(ispin,lll+1,nnn)=ndv | ||
| 136 | if(iys.eq.1)nval(2,lll+1,nnn)=nv | ||
| 137 | if(iys.eq.1)ndval(2,lll+1,nnn)=ndv | ||
| 138 | if(iys.eq.1)rnocc(2,lll+1,nnn)=rnoc | ||
| 139 | if(iys.eq.1)rnoc=rnoc*2 | ||
| 140 | write(66,19)nnlz,eb0,rnoc,nv,ndv | ||
| 141 | zv=zv+rnoc*(nv+ndv) | ||
| 142 | 5595 ebound(ispin,lll+1,nnn)=eb0 | ||
| 143 | write(66,5120)zv | ||
| 144 | 5120 format(/' number of valence electrons: ',f5.1) | ||
| 145 | 19 format(i6,e12.4,f7.2,i7,i10) | ||
| 146 | nb1=nbl+1 | ||
| 147 | iter=0 | ||
| 148 | itr=itmax-iout | ||
| 149 | c | ||
| 150 | 16 format(7(f12.5,1x)) | ||
| 151 | 17 format(/' charge and spin density profiles '/) | ||
| 152 | 18 format(1h0/' potentials vs. distance after ',i3,' iterations'/) | ||
| 153 | c | ||
| 154 | c tabulate screened green's function | ||
| 155 | do 10 i=1,n | ||
| 156 | 10 gr(i)=exp(-qsc*r(i)) | ||
| 157 | c | ||
| 158 | c integration weigths | ||
| 159 | do 121 i=1,nb1 | ||
| 160 | 121 wj(i)=(3.d0+(-1.d0)**i)/3.d0 | ||
| 161 | wj(1)=1.d0/3.d0 | ||
| 162 | wj(nb1)=1.d0/3.d0 | ||
| 163 | c | ||
| 164 | c initial values of the potentials | ||
| 165 | if(inopt.eq.1) goto 302 | ||
| 166 | if(inopt.eq.2) goto 306 | ||
| 167 | c | ||
| 168 | itt=0 | ||
| 169 | c thomas-fermi potential | ||
| 170 | do 30 i=2,n | ||
| 171 | x=r(i)/0.88534135d0*z**(1.d0/3.d0) | ||
| 172 | xx=sqrt(x) | ||
| 173 | vc(i)=-z/r(i)/(1.+0.02747d0*xx+1.243d0*x-0.1486d0*x*xx | ||
| 174 | j+0.2302d0*x*x+0.007298d0*x*x*xx+0.006944d0*x*x*x) | ||
| 175 | do 30 ispin=1,2 | ||
| 176 | 30 veff(ispin,i)=vc(i) | ||
| 177 | goto 311 | ||
| 178 | c read in an old potential for the input | ||
| 179 | 302 read(33,2645)itt | ||
| 180 | 2645 format(i3) | ||
| 181 | 1645 format(i3,' z,ion:',2f4.0,' jblock,nbl,c:',2i5,f10.7) | ||
| 182 | do 303 i=1,n | ||
| 183 | 303 read(33,907) vc(i),veff(1,i),veff(2,i),du1,du2 | ||
| 184 | goto 311 | ||
| 185 | 306 read(46,2645) itt | ||
| 186 | do 304 i = 1, n | ||
| 187 | read(46,*) du1, vc(i), vve, du2 | ||
| 188 | veff(1,i) = vve | ||
| 189 | veff(2,i) = vve | ||
| 190 | 304 continue | ||
| 191 | 311 do 312 i=1,n | ||
| 192 | vcold(i)=vc(i) | ||
| 193 | do 312 ispin=1,2 | ||
| 194 | 312 vold(ispin,i)=veff(ispin,i) | ||
| 195 | 5555 format(e15.8) | ||
| 196 | 7771 format(/' initial potentials'/) | ||
| 197 | 7773 format(5f13.5) | ||
| 198 | if(iout.lt.-1)go to 1437 | ||
| 199 | write(66,7771) | ||
| 200 | do 7772 i=2,n,ipr | ||
| 201 | 7772 write(66,7773) r(i),vc(i),veff(1,i),veff(2,i) | ||
| 202 | 1437 eold=0.d0 | ||
| 203 | etot=-1.d0 | ||
| 204 | itec=0 | ||
| 205 | c | ||
| 206 | c iteration | ||
| 207 | c | ||
| 208 | 100 iter=iter+1 | ||
| 209 | c write(6,*) 'NEW ITERATION' | ||
| 210 | c call flush(6) | ||
| 211 | c convergency check | ||
| 212 | if(abs(etot-eold).lt.5.d-5)itec=itec+1 | ||
| 213 | if(abs(etot-eold).lt.5.d-5.and.itec.eq.1)itmax=iter | ||
| 214 | eold=etot | ||
| 215 | if(iter-itmax)999,999,400 | ||
| 216 | 999 itt=itt+1 | ||
| 217 | write(66,6147)itt | ||
| 218 | do 117 i=1,n | ||
| 219 | dval(2,i)=0.d0 | ||
| 220 | ddval(2,i)=0.d0 | ||
| 221 | dcore(1,i)=0.d0 | ||
| 222 | dcore(2,i)=0.d0 | ||
| 223 | dval(1,i)=0.d0 | ||
| 224 | 117 ddval(1,i)=0.d0 | ||
| 225 | 6147 format(///' ********************* iteration:', | ||
| 226 | 1 i4,' ***********************'/) | ||
| 227 | do 917 ispin=1,iys | ||
| 228 | do 116 i=1,n | ||
| 229 | vv(i)=veff(ispin,i) | ||
| 230 | v(i)=2*vv(i) | ||
| 231 | 116 db(ispin,i)=0.d0 | ||
| 232 | lm(ispin)=-1 | ||
| 233 | do 807 i=0,4 | ||
| 234 | ik=i | ||
| 235 | if(i)817,817,818 | ||
| 236 | 817 do 819 jj=1,4 | ||
| 237 | 819 u(jj)=r(jj)-z*r(jj)**2 | ||
| 238 | go to 822 | ||
| 239 | 818 do 821 jj=1,4 | ||
| 240 | 821 u(jj)=r(jj)**(i+1) | ||
| 241 | 822 call schrhs(vv,0.d0,ik,u) | ||
| 242 | merkki=1 | ||
| 243 | c determine the number of bound states | ||
| 244 | ncross=0 | ||
| 245 | do 826 ii=2,n | ||
| 246 | if(merkki)823,823,824 | ||
| 247 | 823 if(u(ii))826,826,825 | ||
| 248 | 824 if(u(ii))825,826,826 | ||
| 249 | 825 merkki=-merkki | ||
| 250 | ncross=ncross+1 | ||
| 251 | 826 continue | ||
| 252 | dlo=(u(n)-u(n-1))*u(n) | ||
| 253 | if(dlo.ge.0)nbound(ispin,i+1)=ncross | ||
| 254 | if(dlo.lt.0)nbound(ispin,i+1)=ncross+1 | ||
| 255 | if(nbound(ispin,i+1).eq.0)go to 827 | ||
| 256 | lm(ispin)=i | ||
| 257 | write(66,678)i,nbound(ispin,i+1) | ||
| 258 | nbound(ispin,i+1)=min0(nbound(ispin,i+1),nb(i+1)) | ||
| 259 | 678 format(' l = ',i4,',',i4,' bound states ') | ||
| 260 | 807 continue | ||
| 261 | 827 if(lm(ispin).lt.0.and.ispin.eq.2)go to 674 | ||
| 262 | if(lm(ispin).lt.0.and.ispin.eq.1)go to 917 | ||
| 263 | lm(ispin)=min0(lm(ispin),lmax) | ||
| 264 | lmm=lm(ispin) | ||
| 265 | do 918 i=0,lmm | ||
| 266 | nii=min0(nbound(ispin,i+1),8) | ||
| 267 | ik=i | ||
| 268 | do 918 ii=1,nii | ||
| 269 | if(rnocc(ispin,i+1,ii).lt.0.1d0)go to 918 | ||
| 270 | nn=i+ii | ||
| 271 | en=2.d0*ebound(ispin,i+1,ii) | ||
| 272 | if(en.ge.0.d0)en=en0 | ||
| 273 | en1=en | ||
| 274 | dde=de(ispin,i+1,ii) | ||
| 275 | if(iter.le.2)dde=0.d0 | ||
| 276 | c determine the bound state energy and eigenfunction | ||
| 277 | call scheq(z,en,ik,nn,mest,mesh,c,thresh,iflag,npr,dde) | ||
| 278 | c scheq operates in rydberg units | ||
| 279 | if(iter.ge.2)de(ispin,i+1,ii)=abs(en-en1) | ||
| 280 | if(iflag.eq.1) goto 400 | ||
| 281 | 163 ebound(ispin,i+1,ii)=en/2.d0 | ||
| 282 | nlp(ispin,i+1,ii)=npr | ||
| 283 | do 9188 ji=1,n | ||
| 284 | dval(ispin,ji)=dval(ispin,ji)+rnocc(ispin,i+1,ii)*snlo(ji)**2/sf | ||
| 285 | j*nval(ispin,i+1,ii) | ||
| 286 | ddval(ispin,ji)=ddval(ispin,ji)+rnocc(ispin,i+1,ii)*snlo(ji)**2/ | ||
| 287 | j sf*ndval(ispin,i+1,ii) | ||
| 288 | dcore(ispin,ji)=dcore(ispin,ji)+rnocc(ispin,i+1,ii)*snlo(ji)**2/ | ||
| 289 | j sf*(1-ndval(ispin,i+1,ii))*(1-nval(ispin,i+1,ii)) | ||
| 290 | 9188 db(ispin,ji)=db(ispin,ji)+rnocc(ispin,i+1,ii)*snlo(ji)**2/sf | ||
| 291 | 918 continue | ||
| 292 | do 919 ji=2,n | ||
| 293 | dcore(ispin,ji)=dcore(ispin,ji)/r(ji)**2 | ||
| 294 | 919 db(ispin,ji)=db(ispin,ji)/r(ji)**2 | ||
| 295 | db(ispin,1)=db(ispin,2) | ||
| 296 | dcore(ispin,1)=dcore(ispin,2) | ||
| 297 | do 5739 ji=2,n | ||
| 298 | ddval(ispin,ji)=ddval(ispin,ji)/r(ji)**2 | ||
| 299 | 5739 dval(ispin,ji)=dval(ispin,ji)/r(ji)**2 | ||
| 300 | dval(ispin,1)=dval(ispin,2) | ||
| 301 | ddval(ispin,1)=ddval(ispin,2) | ||
| 302 | 917 continue | ||
| 303 | if(iys.eq.2)go to 923 | ||
| 304 | do 921 i=1,n | ||
| 305 | dval(2,i)=dval(1,i) | ||
| 306 | ddval(2,i)=ddval(1,i) | ||
| 307 | dcore(2,i)=dcore(1,i) | ||
| 308 | 921 db(2,i)=db(1,i) | ||
| 309 | lmm=lm(1) | ||
| 310 | lm(2)=lm(1) | ||
| 311 | do 922 i=0,lmm | ||
| 312 | nii=nbound(1,i+1) | ||
| 313 | nbound(2,i+1)=nii | ||
| 314 | do 922 ii=1,nii | ||
| 315 | 922 ebound(2,i+1,ii)=ebound(1,i+1,ii) | ||
| 316 | 923 continue | ||
| 317 | 8 format(' ',i6,' energy: ',f12.5,' iteration loops: ',i4) | ||
| 318 | c | ||
| 319 | c total bound state energy | ||
| 320 | c | ||
| 321 | c write(6,*) 'Total energy starts' | ||
| 322 | c call flush(6) | ||
| 323 | 661 eb=0.d0 | ||
| 324 | ebv=0.d0 | ||
| 325 | write(66,7496) | ||
| 326 | 7496 format(//' bound states'/) | ||
| 327 | do 673 ispin=1,2 | ||
| 328 | lmm=lm(ispin) | ||
| 329 | do 673 i=0,lmm | ||
| 330 | nii=nbound(ispin,i+1) | ||
| 331 | do 673 j=1,nii | ||
| 332 | nn=i+j | ||
| 333 | nnlz=100*nn+10*i | ||
| 334 | eb=eb+ebound(ispin,i+1,j)*rnocc(ispin,i+1,j) | ||
| 335 | ebv=ebv+ebound(ispin,i+1,j)*rnocc(ispin,i+1,j)* | ||
| 336 | j (nval(ispin,i+1,j)+ndval(ispin,i+1,j)) | ||
| 337 | if(rnocc(ispin,i+1,j).lt.0.1d0) go to 673 | ||
| 338 | write(66,8) nnlz,ebound(ispin,i+1,j),nlp(ispin,i+1,j) | ||
| 339 | 673 continue | ||
| 340 | go to 679 | ||
| 341 | 674 write(66,676) | ||
| 342 | 676 format('0no bound states') | ||
| 343 | 679 continue | ||
| 344 | c | ||
| 345 | c total charge and spin densities | ||
| 346 | c computing energy integrals | ||
| 347 | c | ||
| 348 | 506 continue | ||
| 349 | c========================================= | ||
| 350 | c gga | ||
| 351 | c set the "done" controle variables to false in the beginning of | ||
| 352 | c each iteration | ||
| 353 | |||
| 354 | if (ixc.eq.2) then | ||
| 355 | doned = .false. | ||
| 356 | donela = .false. | ||
| 357 | donegr = .false. | ||
| 358 | donez = .false. | ||
| 359 | donec = .false. | ||
| 360 | endif | ||
| 361 | c gga | ||
| 362 | c======================================== | ||
| 363 | do 660 i=2,n | ||
| 364 | roo(i)=db(1,i)+db(2,i) | ||
| 365 | rr=roo(i) | ||
| 366 | c When db = (0,0) then the spin-polarization, spl = 0, and not 0/0. | ||
| 367 | if (rr.gt.0.0000000001) then | ||
| 368 | spl(i)=(db(1,i)-db(2,i))/rr | ||
| 369 | else | ||
| 370 | spl(i)=0.0 | ||
| 371 | endif | ||
| 372 | x1=r(i)**2 | ||
| 373 | apu(i)=x1*veff(1,i)*db(1,i)*sf | ||
| 374 | bpu(i)=x1*veff(2,i)*db(2,i)*sf | ||
| 375 | if (ixc.eq.2) then | ||
| 376 | c================================================================ | ||
| 377 | c gga | ||
| 378 | c calculate the gga exchange-correlation energy | ||
| 379 | |||
| 380 | call ggaexc(r,db,i,1,n,doned,excgga(i)) | ||
| 381 | cpu(i) = x1*rr*excgga(i)*sf | ||
| 382 | c gga | ||
| 383 | c================================================================ | ||
| 384 | else | ||
| 385 | cpu(i)=x1*rr*exc(rr,spl(i),ixc)*sf | ||
| 386 | endif | ||
| 387 | dpu(i)=x1*spl(i)*rr*sf | ||
| 388 | 660 continue | ||
| 389 | 26 format(' induced moment: ',f10.5) | ||
| 390 | call simpsh(apu,v1) | ||
| 391 | call simpsh(bpu,v2) | ||
| 392 | call simpsh(cpu,eexc) | ||
| 393 | call simpsh(dpu,smom) | ||
| 394 | c | ||
| 395 | c compute coulomb energy | ||
| 396 | c | ||
| 397 | cz=z | ||
| 398 | do 683 i=1,n | ||
| 399 | bpu(i)=roo(i)*r(i)**2*sf | ||
| 400 | dpu(i)=(dval(1,i)+dval(2,i))*r(i)**2*sf | ||
| 401 | apu(i)=(ddval(1,i)+ddval(2,i))*r(i)**2*sf | ||
| 402 | cpu(i)=roo(i)*(r(i)**2*vc(i)-z*r(i))*sf/2.d0 | ||
| 403 | 683 continue | ||
| 404 | call simpsh(dpu,sum1) | ||
| 405 | call simpsh(apu,sum3) | ||
| 406 | call simpsh(bpu,sum2) | ||
| 407 | call simpsh(cpu,ec) | ||
| 408 | 24 format(' kin: ',2(e14.6,1x),' coul: ',e14.6,' exc: ',e14.6) | ||
| 409 | 25 format(/' total energy: ',e15.7) | ||
| 410 | write(66,192) sum2,sum1,sum3 | ||
| 411 | write(66,26) smom | ||
| 412 | ekin(1)=-v1 | ||
| 413 | ekin(2)=-v2 | ||
| 414 | etot=ekin(1)+ekin(2)+eb+ec+eexc | ||
| 415 | write(66,7453) | ||
| 416 | 7453 format(/' energy terms') | ||
| 417 | write(66,622)eb | ||
| 418 | 622 format(' energy eigenvalue sum: ',e14.6) | ||
| 419 | write(66,24) ekin(1),ekin(2),ec,eexc | ||
| 420 | write(66,25) etot | ||
| 421 | c write(6,2573) itt,sum2,etot | ||
| 422 | c call flush(6) | ||
| 423 | c2573 format(' iter:',i4,' total ch:',f6.2,' total en:',f15.7) | ||
| 424 | write(6,2573) itt,etot | ||
| 425 | call flush(6) | ||
| 426 | 2573 format(' ',i4,' ',f15.5) | ||
| 427 | |||
| 428 | if(iter.ne.1 .and. iter.lt.itr) goto 167 | ||
| 429 | if(iout.lt.0)go to 167 | ||
| 430 | write(66,17) | ||
| 431 | 192 format(/' integr charges: total ',f10.7,' valence: ',2f10.7) | ||
| 432 | do 166 i=1,n,ipr | ||
| 433 | r22=r(i)*r(i) | ||
| 434 | db1=db(1,i) | ||
| 435 | db2=db(2,i) | ||
| 436 | dr=db1+db2 | ||
| 437 | dcc=dcore(1,i)+dcore(2,i) | ||
| 438 | dvv=dval(1,i)+dval(2,i)+ddval(1,i)+ddval(2,i) | ||
| 439 | ddb=db1-db2 | ||
| 440 | c166 write(66,1624) r(i),db1,db2,dval(i),ddval(i),dr,ddb | ||
| 441 | 166 write(66,1624) r(i),db1,db2,dr,dcc,dvv | ||
| 442 | c | ||
| 443 | c | ||
| 444 | c compute coulomb potential | ||
| 445 | c | ||
| 446 | 167 do 55 i=2,n | ||
| 447 | 55 vc(i)=r(i)*vc(i)+zion | ||
| 448 | c write(6,*) 'Coulomb potential' | ||
| 449 | c call flush(6) | ||
| 450 | zi=z-zion | ||
| 451 | vc(1)=-zi | ||
| 452 | call scrhs(roo,vc,zi,qsc,n) | ||
| 453 | do 50 i=2,n | ||
| 454 | 50 vc(i)=(vc(i)-zion)/r(i) | ||
| 455 | c | ||
| 456 | c set up the total potential | ||
| 457 | c | ||
| 458 | do 60 i=2,n | ||
| 459 | dr=roo(i) | ||
| 460 | vc(i)=(1.d0-fback)*vcold(i)+fback*vc(i) | ||
| 461 | vcold(i)=vc(i) | ||
| 462 | if (ixc.eq.2) then | ||
| 463 | c================================================================ | ||
| 464 | c gga | ||
| 465 | c calculate the gga exchange-correlation potential | ||
| 466 | |||
| 467 | call ggauxc(r,db,spl,i,1,n,donela,donegr,donez, | ||
| 468 | j uxcup(i),uxcdn(i)) | ||
| 469 | ux1(i) = uxcup(i) | ||
| 470 | ux2(i) = uxcdn(i) | ||
| 471 | c gga | ||
| 472 | c================================================================ | ||
| 473 | else | ||
| 474 | ux1(i)=uxc(dr,spl(i),1,ixc) | ||
| 475 | ux2(i)=uxc(dr,spl(i),2,ixc) | ||
| 476 | endif | ||
| 477 | 6848 veff(1,i)=vc(i)+ux1(i) | ||
| 478 | veff(2,i)=vc(i)+ux2(i) | ||
| 479 | do 60 ispin=1,2 | ||
| 480 | veff(ispin,i)=(1.d0-fback)*vold(ispin,i)+fback*veff(ispin,i) | ||
| 481 | 60 vold(ispin,i)=veff(ispin,i) | ||
| 482 | c calculate the valence energy | ||
| 483 | do 5100 i=2,mesh | ||
| 484 | do 5110 j=1,mesh | ||
| 485 | apu(j)=0.d0 | ||
| 486 | if(i.le.j)apu(j)=(dval(1,j)+dval(2,j)+ddval(1,j)+ddval(2,j))* | ||
| 487 | j (r(j)**2/r(i)-r(j)) | ||
| 488 | 5110 continue | ||
| 489 | call simpsh(apu,vp) | ||
| 490 | 5100 vhv(i)=-vp*4.d0*pi+zv/r(i) | ||
| 491 | do 5130 i=1,mesh | ||
| 492 | x1=r(i)**2 | ||
| 493 | rr=db(1,i)+db(2,i) | ||
| 494 | spt=0.d0 | ||
| 495 | if(rr.gt.1.d-10)spt=(db(1,i)-db(2,i))/rr | ||
| 496 | rrv=dval(1,i)+dval(2,i)+ddval(1,i)+ddval(2,i) | ||
| 497 | spv=0.d0 | ||
| 498 | if(rrv.gt.1.d-10)spv=(dval(1,i)-dval(2,i)+ddval(1,i)-ddval(2,i)) | ||
| 499 | j /rrv | ||
| 500 | rrc=dcore(1,i)+dcore(2,i) | ||
| 501 | spc=0.d0 | ||
| 502 | if(rrc.gt.1.d-10)spc=(dcore(1,i)-dcore(2,i))/rrc | ||
| 503 | apu(i)=-0.5d0*x1*sf*rrv*vhv(i) | ||
| 504 | if (ixc.eq.2) then | ||
| 505 | c============================================================= | ||
| 506 | c gga | ||
| 507 | c calculate the gga exchange-correlation energy for core electrons | ||
| 508 | |||
| 509 | if (rrc.lt.1.d-100) then | ||
| 510 | excgac = 0.d0 | ||
| 511 | else | ||
| 512 | call ggaexc(r,dcore,i,1,n,donec,excgac) | ||
| 513 | endif | ||
| 514 | bpu(i)=x1*rr*excgga(i)*sf | ||
| 515 | cpu(i)=-x1*rrc*excgac*sf | ||
| 516 | fpu(i)=(dcore(1,i)+dcore(2,i))*excgga(i)*x1*sf | ||
| 517 | dpu(i)=(-(dval(1,i)+ddval(1,i))*uxcup(i) | ||
| 518 | j -(dval(2,i)+ddval(2,i))*uxcdn(i))*sf*x1 | ||
| 519 | c gga | ||
| 520 | c================================================================== | ||
| 521 | else | ||
| 522 | bpu(i)=x1*rr*exc(rr,spt,ixc)*sf | ||
| 523 | cpu(i)=-x1*rrc*exc(rrc,spc,ixc)*sf | ||
| 524 | fpu(i)=(dcore(1,i)+dcore(2,i))*exc(rr,spt,ixc)*x1*sf | ||
| 525 | dpu(i)=(-(dval(1,i)+ddval(1,i))*uxc(rr,spt,1,ixc) | ||
| 526 | j -(dval(2,i)+ddval(2,i))*uxc(rr,spt,2,ixc))*sf*x1 | ||
| 527 | endif | ||
| 528 | epu(i)=apu(i)+bpu(i)+cpu(i)+dpu(i)+fpu(i) | ||
| 529 | 5130 continue | ||
| 530 | c call simpsh(apu,ec) | ||
| 531 | c call simpsh(bpu,eext) | ||
| 532 | c call simpsh(fpu,eexx) | ||
| 533 | c call simpsh(cpu,eexc) | ||
| 534 | c call simpsh(dpu,eexv) | ||
| 535 | c etv=ebv+ec+eext+eexc+eexv | ||
| 536 | call simpsh(epu,etv) | ||
| 537 | etv = etv + ebv | ||
| 538 | write(66,5140)etv | ||
| 539 | 5140 format(' valence energy:',e15.7) | ||
| 540 | if(iter.ne.1 .and. iter.lt.itr) go to 100 | ||
| 541 | if(iout.lt.0)go to 100 | ||
| 542 | write(66,18) itt | ||
| 543 | do 75 i=2,n,ipr | ||
| 544 | dr=roo(i) | ||
| 545 | 75 write(66,1624) r(i),vc(i),ux1(i),ux2(i),veff(1,i),veff(2,i) | ||
| 546 | 1624 format(1x,f12.5,6e14.5) | ||
| 547 | goto 100 | ||
| 548 | 400 continue | ||
| 549 | c | ||
| 550 | c | ||
| 551 | c | ||
| 552 | do 1140 i=2,mesh | ||
| 553 | do 1130 j=1,mesh | ||
| 554 | apu(j)=0.d0 | ||
| 555 | if(i.le.j)apu(j)=(db(1,j)+db(2,j))*(r(j)**2/r(i)-r(j)) | ||
| 556 | 1130 continue | ||
| 557 | call simpsh(apu,vp) | ||
| 558 | 1140 vc(i)=-vp*sf | ||
| 559 | write(22,1645)itt,z,zion,jblock,nbl,c | ||
| 560 | write(44,1645)itt,z,zion,jblock,nbl,c | ||
| 561 | do 900 i=1,n | ||
| 562 | dd=db(1,i)+db(2,i) | ||
| 563 | dc=dcore(1,i)+dcore(2,i) | ||
| 564 | dddc = dd + dc | ||
| 565 | dv1=dval(1,i)+dval(2,i) | ||
| 566 | ddv1=ddval(1,i)+ddval(2,i) | ||
| 567 | vve = 0.5d00*(veff(1,i) + veff(2,i)) | ||
| 568 | write(44,*) r(i), vc(i), vve, dddc | ||
| 569 | c The line below writes total and core densities to atomdens.dat (J.H.) | ||
| 570 | write(77,906) r(i), 4*pi*dd*r(i)*r(i), 4*pi*dc*r(i)*r(i) | ||
| 571 | write(22,907)vc(i),veff(1,i),veff(2,i),dddc,r(i) | ||
| 572 | 900 continue | ||
| 573 | 907 format(6e15.7) | ||
| 574 | c900 write(22,906)vc(i),veff(1,i),veff(2,i),dd,dc | ||
| 575 | c900 write(22,906)vc(i),veff(1,i),veff(2,i),dd,dv1,ddv1 | ||
| 576 | 906 format(6e20.12) | ||
| 577 | write(6,*) '================================' | ||
| 578 | call flush(6) | ||
| 579 | c ieeer=ieee_flags('clear','exception','all',ieeeout) | ||
| 580 | close(6) | ||
| 581 | close(22) | ||
| 582 | close(33) | ||
| 583 | close(55) | ||
| 584 | close(66) | ||
| 585 | close(77) | ||
| 586 | stop | ||
| 587 | end | ||
