• 沒有找到結果。

Self-consistency

在文檔中 原子基態能量的計算 (頁 20-99)

0

Ppr(r)dr =

0

r2RnlRnldr = 1. (2.29) Therefore, we have the conclusion that if we want to normalize a radial wave function Rnl, we just compute the integral

0

r2RnlRnldr = k, k is a constant, and divided Rnl by

k. Then the new function R0nl= Rnl

k is the radial wave function which has been normalized.

2.7 Self-consistency

Define Mef f be the matrix which signifies the effective potential vef f, and Mef f = Mee+ Mxc+ Mr. (2.30) By (2.23), (2.24) and (2.30), the equation (1.18) can be represented as the form

(Mp+ Ml+ Mef f) ~Pnl = enlP~nl, where the vector ~Pnl is

13

P~nl =

Pnl( ~r1) Pnl( ~r2) ...

Pnl( ~r399)

.

It is an eigenvalue problem.

We can determine the correct electronic density and ~Pnl by executing self-consistency. The table (2.7) can describe the process of self-consistency.

In the beginning, build a vector ~ρin to be the initial guess, and we will get a Hamiltonian Hkh (here Hkh = Mp + Ml + Mef f). Then, computing the minimal eigenvalue emin of Hkh, and find an eigenvector ~P corresponding emin. Normalizing ~P and we get the eigenvector ~Pout. Then we can compute the electronic density ~ρout. Now, if ~ρout = ~ρin it means that we get the right Pnl, otherwise, generate a new ~ρinas this ~ρout and construct a new Hkh. After finding the correct electronic density and wave function, we can calculate the ground state energy by using the formula (1.12).

We compute the ground state energy of He (z = 2) to No (z = 102) in the order, and use the preceding atom’s ~ρnlto be the initial guess. For example, if we want to compute the ground state energy of Mg (z = 12), we will use the ~ρnl of Na (z = 11) to be its initial guess.

14

out

in

Table (2.7) YES

1. Give an initial guess Pin nl( )

2. Compute in, in i| in nl( ) |2

i occ

f P

r

 

3. Construct the Kohn-Sham Hamiltonian H kh

4. Compute H Pkhnl nlPnl

and get Pout nl( )

5. Compute out, out i| out nl( ) |2

i occ

f P

r

 

7. Compute the total energy

NO 6. Isout in

?

16

3 Results

The errors between the computation and the realistic values are less than 15%. The list (3.1) is the comparison of the ideal answer [3] and the answer of this computation with atomic unit, and figure (3.2) is the scale error between the realistic values (Idea data) and the answer of this computat- ion .

The formula of the errors is

errors | |

i i ,

i

a b a

 

where ai is the data from this computation and bi is the idea data.

Figure (3.2)

Atomic number Idea data

–E(a.u.)

Data in this computation Errors(%)

0.500000 2.893138 7.388389 14.67078 25.11337 39.11898 57.24088 79.84583 107.2576 139.8187 173.8986 212.1369 254.2069 300.3957 350.7181 410.3264 464.3733 527.6907 592.0264 659.9070 735.5189 815.8062 900.7615 995.9873 1085.262 1270.632 1384.305 1503.796 1640.438 1761.187 1886.647 2016.884 2151.999 2292.058 2437.159

0.0000

18

Atomic number Idea data

-E(a.u.)

Data in this computation Errors(%)

36

2657.920 2809.000 2964.275 3134.383 3310.443 3504.019 3692.796 3887.294 4087.941 4294.852 4523.195 4728.309 4937.590 5155.548 5379.200 5713.260 5953.587 6200.008 6452.556 6697.584 6947.461 7215.920 7535.974 7844.062 8159.394 8482.952 8814.835 9155.146 9476.594 9860.293 10227.65 10602.66 10986.59 11379.53 11781.56

3.5400 10.6800 11.3400 11.9700 10.5100 11.0600 11.5800 12.0800 12.7900 13.4800 13.9300 13.6800 13.7300 13.7800 13.8200 13.8400 13.8500 14.1800 13.8500 13.8200 13.7900 13.7600 13.7100 13.6600

Atomic number Idea data

-E(a.u.)

Data in this computation Errors(%)

12159.12 12542.46 12933.05 13330.92 13736.11 15464.24 15932.53 16442.05 16929.71 17391.06 17868.97 18354.69 18848.17 19349.36 19858.31 20375.08 20871.18 21373.11 21907.81 22450.80 23074.43 23674.40 24320.71 24940.68 25568.91 26166.23 26811.44 27510.10 28178.74 28855.63 29542.39 30239.09

13.9200 14.2000 14.4400 14.6700 14.9100 5.3600

References

[1] P.Marder, Micheal. Condensed Matter Physics. A Wiley-Tnterscience Publication, 203-253. 1960.

[2] Gasiorowicz, Stephen. Quantum Physics. John Wiley & Sons, Inc, 197-200. 1995.

[3] Fisher, Forse. Atomic Data. erratum Atom. Data. Nucl. Tables 12 87.

301. 1972.

[4] R. L. Flyrry Jr. Quantum chemistry- An introduction. Englewood Cliffs, NJ: Prentice-Hall, 32-85. 1983.

[5] Parr, Robert G. Density-Function Theory of Atoms and Molecules. New York: Oxford University Press, 1989.

[6] Fiolhais, Carlos, Nogueira. Primer in Density Functional Theory. Berlin;

New York: Springer,. 2003.

[7] Menguc, Mustafa, Pinar. Modeling of Radiate Heat transfer in Multi-didimensional Enclosures using Spherical Harmonics Approximation. A Bell & Howel information Company, 17. 1985.

[8] Gilbarg David. Elliptic partial differential equations of second order. New York: Springer, 2001.

[9] Richard, Courant and David, Hilbert. Methods of mathematical Physics.

1962.

[10] Dahl, Jens Peder ed. Local Density Approximation in Quantum Chem-istry and Solid State Physics. New York: Plenum, 1984.

20

Appendix

The source file of this computation

module global

implicit none

integer ,parameter ::d=400 integer ,parameter ::sz=399 integer i,j,Bool,k,times real ,parameter ::pi=3.1416 real ,parameter ::bdd =10.0

real Yini(sz),Nini(sz),Pin(sz),Rin(sz),Yin(sz),ABNd(sz)

real Nin(sz),Pout(sz),Rout(sz),Yout(sz),Nout(sz),R(sz),N(sz),Nd(sz) real Sch(sz,sz),L1(sz,sz),L2(sz,sz)

real Veff(sz,sz),Exc(sz,sz),Eee(sz,sz),Rv(sz,sz) real s,Ncin,Ncout

real A_2nd(sz),B_2nd(sz),A_3rd(sz),B_3rd(sz) real A_4th(sz),B_4th(sz),A_5th(sz),B_5th(sz) real A_6th(sz),B_6th(sz),A_7th(sz),B_7th(sz) integer k_2nd,k_3rd,k_4th,k_5th,k_6th,k_7th real Pin_2s(sz),Pout_2s(sz),H_2s(sz),Rout_2s(sz) real Pout_3s(sz),Pin_3s(sz),Rout_3s(sz),H_3s(sz) real Pin_2p(sz),Pout_2p(sz),H_2p(sz),Rout_2p(sz) real H_3p(sz),Pout_3p(sz),Pin_3p(sz),Rout_3p(sz) real Pin_4s(sz),Pout_4s(sz),H_4s(sz),Rout_4s(sz) real Pin_3d(sz),Pout_3d(sz),H_3d(sz),Rout_3d(sz) real Pin_4p(sz),Pout_4p(sz),H_4p(sz),Rout_4p(sz) real Pin_5s(sz),Pout_5s(sz),H_5s(sz),Rout_5s(sz) real Pin_4d(sz),Pout_4d(sz),H_4d(sz),Rout_4d(sz) real Pin_5p(sz),Pout_5p(sz),H_5p(sz),Rout_5p(sz) real Pin_6s(sz),Pout_6s(sz),H_6s(sz),Rout_6s(sz) real Pin_5d(sz),Pout_5d(sz),H_5d(sz),Rout_5d(sz) real Pin_4f(sz),Pout_4f(sz),H_4f(sz)

real Rout_4f(sz)

real Pin_6p(sz),Pout_6p(sz),H_6p(sz),Rout_6p(sz) real Pin_7s(sz),Pout_7s(sz),H_7s(sz),Rout_7s(sz) real Pin_6d(sz),Pout_6d(sz),H_6d(sz),Rout_6d(sz)

real Pin_5f(sz),Pout_5f(sz),H_5f(sz),Rout_5f(sz) real Pin_7p(sz),Pout_7p(sz),H_7p(sz),Rout_7p(sz) !sch 變數

real H(sz),eigenvalue(sz),eigenvector(sz,sz) !L1 變數

real hg !L2 變數 !Veff 變數 !Ec 變數

real Ec(sz,sz)

real ,parameter ::Ge=0.1423 real ,parameter ::Be1=1.0529 real ,parameter ::Be2=0.3334 real Ech(sz,sz)

real ,parameter ::Aec=0.0311 real ,parameter ::Bec=-0.048 real ,parameter ::Cec=0.002 real ,parameter ::Dec=-0.0116 !Ex 變數

real Rs(sz),Ex(sz,sz) !Ediff 變數

real Addxc(sz,sz),Edr(sz,sz),Ndr(sz,sz),Ediff(sz,sz) !Exc 變數

!intg1 變數

!real ,external ::Intg1

!intg1 變數

!real ,external ::Intg2 !Eee 變數

!Exc 變數 !Energy 的變數 real total real

lPout_1sl(sz),lPout_2sl(sz),lPout_3sl(sz),lPout_4sl(sz),lPout_5sl(sz) ,lPout_6sl(sz),lPout_7sl(sz)

real

lPout_2pl(sz),lPout_3pl(sz),lPout_4pl(sz),lPout_5pl(sz),lPout_6pl(sz) real lPout_3dl(sz),lPout_4dl(sz),lPout_5dl(sz),lPout_6dl(sz)

22

real lPout_4fl(sz),lPout_5fl(sz) real

Hn(sz),Hn_2s(sz),Hn_3s(sz),Hn_4s(sz),Hn_5s(sz),Hn_6s(sz),Hn_7s(sz) real Hn_2p(sz),Hn_3p(sz),Hn_4p(sz),Hn_5p(sz),Hn_6p(sz)

real Hn_3d(sz),Hn_4d(sz),Hn_5d(sz),Hn_6d(sz) real Hn_4f(sz),Hn_5f(sz)

end module

!--- Program main

use IMSL use global implicit none

call self_he()

open(unit=11,file='Reslet1.txt')

open(unit=12,file='eigenvalueofHe.txt')

call total_energy(2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"He(2)"

write(*,*)times write(*,*)total write(11,*)"He(2)"

write(11,*)times write(11,*)total !do i=1,sz

!write(12,*)eigenvalue(i) !end do

call Li3() call Be4() call B5() call C6() call N7() call O8() call F9() call Ne10()

call Na11() call Mg12() call Al13() call Si14() call P15() call S16() call Cl17() call Ar18() call K19() call Ca20() call Sc21() call Ti22() call V23() call Cr24() call Mn25() call Fe26() call Co27() call Ni28() call Cu29() call Zn30() call Ga31() call Ge32() call As33() call Se34() call Br35() call Kr36() call Rb37() call Sr38() call Y39() call Zr40() call Nb41() call Mo42() call Tc43() call Ru44() call Rh45() call Pb46() call Ag47() call Cd48()

24

call In49() call Sn50() call Sb51() call Te52() call I53() call Xe54() call Cs55() call Ba56() call La57() call Ce58() call Pr59() call Nd60() call Pm61() call Sm62() call Eu63() call Gd64() call Tb65() call Dy66() call Ho67() call Er68() call Tm69() call Yb70() call Lu71() call Hf72() call Ta73() call W74() call Re75() call Os76() call Ir77() call Pt78() call Au79() call Hg80() call Tl81() call Pb82() call Bi83() call Po84() call At85() call Rn86()

call Fr87() call Ra88() call Ac89() call Th90() call Pa91() call U92() call Np93() call Pu94() call Am95() call Cm96() call Bk97() call Cf98() call Es99() call Fm100() call Md101() call No102() call Lr103() call Rf104() call Db105() call Sg106() call Bh107()

end

!--- subroutine subSch_7s() !矩陣合

use global use IMSL implicit none

real ,external :: norl do i=1,sz

do j=1,sz

Sch(i,j)=L1(i,j)+L2(i,j)+Veff(i,j) end do

end do

eigenvalue=eig(Sch,V=eigenvector)

!為了存取特徵值的最小值位置

open(unit=10,file="7s_1st.txt")

26

write(10,*)minloc(eigenvalue) rewind(10)

read(10,*)k

!--- do i=1,sz

H(i)=eigenvector(i,k) end do

do i=1,sz

Hn(i)=H(i)/norl(R,H) end do

do i=1,sz A_2nd(i)=0 end do

A_2nd(k)=100000 do i=1,sz

B_2nd(i)=A_2nd(i)+eigenvalue(i) end do

open(unit=10,file="7s_2nd.txt") write(10,*)minloc(B_2nd)

rewind(10) read(10,*)k_2nd do i=1,sz

H_2s(i)=eigenvector(i,k_2nd) end do

do i=1,sz

Hn_2s(i)=H_2s(i)/norl(R,H_2s) end do

!--- do i=1,sz A_3rd(i)=0 end do

A_3rd(k_2nd)=100000 do i=1,sz

B_3rd(i)=B_2nd(i)+A_3rd(i) end do

open(unit=10,file="7s_3rd.txt") write(10,*)minloc(B_3rd)

rewind(10)

read(10,*)k_3rd do i=1,sz

H_3s(i)=eigenvector(i,k_3rd) end do

do i=1,sz

Hn_3s(i)=H_3s(i)/norl(R,H_3s) end do

do i=1,sz A_4th(i)=0 end do

A_4th(k_3rd)=100000 do i=1,sz

B_4th(i)=B_3rd(i)+A_4th(i) end do

open(unit=10,file="7s_4th.txt") write(10,*)minloc(B_4th)

rewind(10) read(10,*)k_4th do i=1,sz

H_4s(i)=eigenvector(i,k_4th) end do

do i=1,sz

Hn_4s(i)=H_4s(i)/norl(R,H_4s) end do

do i=1,sz A_5th(i)=0 end do

A_5th(k_4th)=100000 do i=1,sz

B_5th(i)=B_4th(i)+A_5th(i) end do

open(unit=10,file="7s_5th.txt") write(10,*)minloc(B_5th)

rewind(10) read(10,*)k_5th do i=1,sz

H_5s(i)=eigenvector(i,k_5th) end do

28

do i=1,sz

Hn_5s(i)=H_5s(i)/norl(R,H_5s) end do

do i=1,sz A_6th(i)=0 end do

A_6th(k_5th)=100000 do i=1,sz

B_6th(i)=B_5th(i)+A_6th(i) end do

open(unit=10,file="7s_6th.txt") write(10,*)minloc(B_6th)

rewind(10) read(10,*)k_6th do i=1,sz

H_6s(i)=eigenvector(i,k_6th) end do

do i=1,sz

Hn_6s(i)=H_6s(i)/norl(R,H_6s) end do

do i=1,sz A_7th(i)=0 end do

A_7th(k_6th)=100000 do i=1,sz

B_7th(i)=B_6th(i)+A_7th(i) end do

open(unit=10,file="7s_7th.txt") write(10,*)minloc(B_7th)

rewind(10) read(10,*)k_7th do i=1,sz

H_7s(i)=eigenvector(i,k_7th) end do

do i=1,sz

Hn_7s(i)=H_7s(i)/norl(R,H_7s) end do

end

subroutine subSch_6p() !矩陣合 use global

use IMSL implicit none

real ,external :: norl do i=1,sz

do j=1,sz

Sch(i,j)=L1(i,j)+L2(i,j)+Veff(i,j) end do

end do

eigenvalue=eig(Sch,V=eigenvector)

!為了存取特徵值的最小值位置

open(unit=10,file="6p_1st.txt") write(10,*)minloc(eigenvalue) rewind(10)

read(10,*)k

!--- do i=1,sz

H_2p(i)=eigenvector(i,k) end do

do i=1,sz

Hn_2p(i)=H_2p(i)/norl(R,H_2p) end do

do i=1,sz A_2nd(i)=0 end do

A_2nd(k)=100000 do i=1,sz

B_2nd(i)=A_2nd(i)+eigenvalue(i) end do

open(unit=10,file="6P_2nd.txt") write(10,*)minloc(B_2nd)

rewind(10) read(10,*)k_2nd do i=1,sz

H_3p(i)=eigenvector(i,k_2nd) end do

30

do i=1,sz

Hn_3p(i)=H_3p(i)/norl(R,H_3p) end do

do i=1,sz A_3rd(i)=0 end do

A_3rd(k_2nd)=100000 do i=1,sz

B_3rd(i)=A_3rd(i)+B_2nd(i) end do

open(unit=10,file="6P_3rd.txt") write(10,*)minloc(B_3rd)

rewind(10) read(10,*)k_3rd do i=1,sz

H_4p(i)=eigenvector(i,k_3rd) end do

do i=1,sz

Hn_4p(i)=H_4p(i)/norl(R,H_4p) end do

!--- do i=1,sz

A_4th(i)=0 end do

A_4th(k_3rd)=100000 do i=1,sz

B_4th(i)=A_4th(i)+B_3rd(i) end do

open(unit=10,file="6P_4th.txt") write(10,*)minloc(B_4th)

rewind(10) read(10,*)k_4th do i=1,sz

H_5p(i)=eigenvector(i,k_4th) end do

do i=1,sz

Hn_5p(i)=H_5p(i)/norl(R,H_5p) end do

do i=1,sz A_5th(i)=0 end do

A_5th(k_4th)=100000 do i=1,sz

B_5th(i)=A_5th(i)+B_4th(i) end do

open(unit=10,file="6P_5th.txt") write(10,*)minloc(B_5th)

rewind(10) read(10,*)k_5th do i=1,sz

H_6p(i)=eigenvector(i,k_5th) end do

do i=1,sz

Hn_6p(i)=H_6p(i)/norl(R,H_6p) end do

end

subroutine subSch_6d() !矩陣合 use global

use IMSL implicit none

real ,external ::norl do i=1,sz

do j=1,sz

Sch(i,j)=L1(i,j)+L2(i,j)+Veff(i,j) end do

end do

eigenvalue=eig(Sch,V=eigenvector)

!為了存取特徵值的最小值位置

open(unit=10,file="6d_1st.txt") write(10,*)minloc(eigenvalue) rewind(10)

read(10,*)k

!--- do i=1,sz

H_3d(i)=eigenvector(i,k) end do

32

do i=1,sz

Hn_3d(i)=H_3d(i)/norl(R,H_3d) end do

do i=1,sz A_2nd(i)=0 end do

A_2nd(k)=100000 do i=1,sz

B_2nd(i)=A_2nd(i)+eigenvalue(i) end do

open(unit=10,file="6d_2nd.txt") write(10,*)minloc(B_2nd)

rewind(10) read(10,*)k_2nd do i=1,sz

H_4d(i)=eigenvector(i,k_2nd) end do

do i=1,sz

Hn_4d(i)=H_4d(i)/norl(R,H_4d) end do

do i=1,sz A_3rd(i)=0 end do

A_3rd(k_2nd)=100000 do i=1,sz

B_3rd(i)=A_3rd(i)+B_2nd(i) end do

open(unit=10,file="6d_3rd.txt") write(10,*)minloc(B_3rd)

rewind(10) read(10,*)k_3rd do i=1,sz

H_5d(i)=eigenvector(i,k_3rd) end do

do i=1,sz

Hn_5d(i)=H_5d(i)/norl(R,H_5d) end do

do i=1,sz

A_4th(i)=0 end do

A_4th(k_3rd)=100000 do i=1,sz

B_4th(i)=A_4th(i)+B_3rd(i) end do

open(unit=10,file="6d_4th.txt") write(10,*)minloc(B_4th)

rewind(10) read(10,*)k_4th do i=1,sz

H_6d(i)=eigenvector(i,k_4th) end do

do i=1,sz

Hn_6d(i)=H_6d(i)/norl(R,H_6d) end do

end

subroutine subSch_5f() !矩陣合 use global

use IMSL implicit none

real ,external :: norl do i=1,sz

do j=1,sz

Sch(i,j)=L1(i,j)+L2(i,j)+Veff(i,j) end do

end do

eigenvalue=eig(Sch,V=eigenvector)

!為了存取特徵值的最小值位置

open(unit=10,file="5f_1st.txt") write(10,*)minloc(eigenvalue) rewind(10)

read(10,*)k

!--- do i=1,sz

H_4f(i)=eigenvector(i,k) end do

34

do i=1,sz

Hn_4f(i)=H_4f(i)/norl(R,H_4f) end do

do i=1,sz A_2nd(i)=0 end do

A_2nd(k)=100000 do i=1,sz

B_2nd(i)=A_2nd(i)+eigenvalue(i) end do

open(unit=10,file="5f_2nd.txt") write(10,*)minloc(B_2nd)

rewind(10) read(10,*)k_2nd do i=1,sz

H_5f(i)=eigenvector(i,k_2nd) end do

do i=1,sz

Hn_5f(i)=H_5f(i)/norl(R,H_5f) end do

end

subroutine subL1() !兩次倒數用泰勒展開之後逼近的結果 use IMSL

use global implicit none L1=eye(sz) hg=bdd/d do i=1,sz

L1(i,i)=1.0/(hg**2.0) end do

do i=2,sz

L1(i,i-1)=-1.0/(2.0*(hg**2.0)) end do

do i=1,sz-1

L1(i,i+1)=-1.0/(2.0*(hg**2.0)) end do

end

subroutine subL2(l) !l(l+1)/2r^2 那項 use IMSL

use global implicit none integer l L2=eye(sz) hg=bdd/d do i=1,sz

L2(i,i)=(l*(l+1))/(2.0*((hg*i)**2.0)) end do

end

subroutine subVeff(z) !Veff=Vee+Vxc+V 那項(總合) use IMSL

use global implicit none integer z hg=bdd/d

!-z/r(Vr 那項) Rv=eye(sz) do i=1,sz

Rv(i,i)=-z/(hg*i) end do

do i=1,sz do j=1,sz

Veff(i,j)=Eee(i,j)+Exc(i,j)+Rv(i,j) end do

end do end

subroutine subExc() !Vex=Exc+n*dExc/dn(總合) use global

use IMSL implicit none do j=1,sz

do i=1,sz

If (Rs(i)>=1) then

Exc(i,j)=Ex(i,j)+Ec(i,j)+Ediff(i,j) else

Exc(i,j)=Ex(i,j)+Ech(i,j)+Ediff(i,j)

36

end if end do end do end

subroutine subEx() use IMSL

use global implicit none Ex=eye(sz) do i=1,sz

rs(i)=(3.0/(4.0*pi*N(i)))**(1.0/3.0) end do

do i=1,sz

Ex(i,i)=(-0.458)/(rs(i)) end do

end

subroutine subEc() use IMSL

use global implicit none Ec=eye(sz) do i=1,sz

Ec(i,i)=-Ge/(1.0+Be1*(Rs(i)**(0.5))+Be2*Rs(i)) end do

end

subroutine subEch() use IMSL

use global implicit none Ech=eye(sz) do i=1,sz

Ech(i,i)=Aec*LOG(Rs(i))+Bec+Cec*Rs(i)*LOG(Rs(i))+Dec*Rs(i) end do

end

subroutine subEdiff() !用數值微分 use global

use IMSL implicit none

Ediff=eye(sz) do i=1,sz

R(i)=(bdd/d)*i end do

Edr=eye(sz) Ndr=eye(sz) do j=1,sz do i=1,sz

if (Rs(i)>=1) then

Addxc(i,j)=Ex(i,j)+Ec(i,j) !其實就是 Exc else

Addxc(i,j)=Ex(i,j)+Ech(i,j) end if

end do end do

Edr(1,1)=(Addxc(1,1)-Addxc(2,2))/(R(1)-R(2))

Edr(sz,sz)=(Addxc(sz-1,sz-1)-Addxc(sz,sz))/(R(sz-1)-R(sz)) do i=2,sz-1

Edr(i,i)=(Addxc(i+1,i+1)-Addxc(i-1,i-1))/(R(i+1)-R(i-1)) end do

Ndr(1,1)=(N(1)-N(2))/(R(1)-R(2))

Ndr(sz,sz)=(N(sz-1)-N(sz))/(R(sz-1)-R(sz)) do i=2,sz-1

Ndr(i,i)=(N(i+1)-N(i-1))/(R(i+1)-R(i-1)) end do

do i=1,sz

Ediff(i,i)=Edr(i,i)*(1/Ndr(i,i))*N(i) end do

end

subroutine subEee() use Global

use IMSL implicit none

real ,external::Intg1 real ,external::Intg2 Eee=eye(sz)

do i=1,sz

R(i)=(bdd/d)*i

38

end do do i=1,sz

Eee(i,i)=Intg1(i,n)+Intg2(i,n) end do

end

real function Intg1(a,n) !Eee 的數值積分 use IMSL

implicit none

integer ,parameter::d=400 integer ,parameter::sz=399 real ,parameter::bdd=10.0 real N(sz)

real hg,Int

real ,parameter ::pi=3.1416 integer i,a

Int=0.0 hg=bdd/d do i=1,a-1

Int=Int+((((hg*i)**2.0)*N(i)/(a*hg))+(((hg*(i+1))**2.0)*N(i+1)/(a*hg) )) *hg*0.5*4*pi

end do

Intg1=Int end function

real function Intg2(b,n) use IMSL

implicit none

integer ,parameter ::d=400 integer ,parameter ::sz=399 real ,parameter::bdd=10.0 real ,parameter ::pi=3.1416 real N(sz)

real hg,Int integer b,i Int=0.0 hg=bdd/d do i=b,sz-1

Int=Int+((((hg*i)**2.0)*N(i))/(hg*i)+(((hg*(i+1))**2.0)*N(i+1))/(hg*(

i+1))) *hg*0.5*4*pi

end do

Intg2=Int !+( (((hg*sz)**2.0)*N(sz))/(hg*sz) )*0.5*hg end function

subroutine subProcess_6p(l,z)!所有的 subroutine 都呼叫一次 use IMSL

use global implicit none integer l,z call subL1() call subL2(l) call subEee() call subEx() call subEc() call subEdiff() call subExc() call subVeff(z) call subSch_6p() end

subroutine subProcess_7s(l,z)!所有的 subroutine 都呼叫一次 use IMSL

use global implicit none integer l,z call subL1() call subL2(l) call subEee() call subEx() call subEc() call subEdiff() call subExc() call subVeff(z) call subSch_7s() end

subroutine subProcess_6d(l,z)!所有的 subroutine 都呼叫一次 use IMSL

use global implicit none integer l,z

40

call subL1() call subL2(l) call subEee() call subEx() call subEc() call subEdiff() call subExc() call subVeff(z) call subSch_6d() end

subroutine subProcess_5f(l,z)!所有的 subroutine 都呼叫一次 use IMSL

use global implicit none integer l,z call subL1() call subL2(l) call subEee() call subEx() call subEc() call subEdiff() call subExc() call subVeff(z) call subSch_5f() end

!-Total Energy--- subroutine

Total_Energy(z,N1s,N2s,N2p,N3s,N3p,N4s,N3d,N4p,N5s,N4d,N5p,N6s,N5d,N4 f,N6p,N7s,N6d,N5f)!4d 的 energy

use IMSL use global implicit none integer

z,N1s,N2s,N3s,N4s,N5s,N6s,N7s,N2p,N3p,N4p,N5p,N6p,N3d,N4d,N5d,N6d,N4f ,N5f

real ,external :: Env real ,external :: Enee real ,external :: Enxc

real ,external :: Intk1 real ,external :: Intk2 real ,external :: norl real Enkk

do i=1,sz

Rout(i)=Pout(i)/R(i)

Rout_2s(i)=Pout_2s(i)/R(i) Rout_3s(i)=Pout_3s(i)/R(i) Rout_3p(i)=Pout_3p(i)/R(i) Rout_4s(i)=Pout_4s(i)/R(i) Rout_3d(i)=Pout_3d(i)/R(i) Rout_4p(i)=Pout_4p(i)/R(i) Rout_5s(i)=Pout_5s(i)/R(i) Rout_4d(i)=Pout_4d(i)/R(i) Rout_5p(i)=Pout_5p(i)/R(i) Rout_6s(i)=Pout_6s(i)/R(i) Rout_4f(i)=Pout_4f(i)/R(i) Rout_5d(i)=Pout_5d(i)/R(i) Rout_6p(i)=Pout_6p(i)/R(i) Rout_7s(i)=Pout_7s(i)/R(i) Rout_5f(i)=Pout_5f(i)/R(i) Rout_6d(i)=Pout_6d(i)/R(i) end do

Enkk =

N1s*( Intk1(Rout,R)+Intk2(Rout,R,0) )+N2s*( Intk1(Rout_2s,R)+Intk2(Ro ut_2s,R,0) )+N2p*( Intk1(Rout_2p,R)+Intk2(Rout_2p,R,1) )+N3s*( Intk1(

Rout_3s,R)+Intk2(Rout_3s,R,0) )+N3p*( Intk1(Rout_3p,R)+Intk2(Rout_3p, R,1) )+N4s*( Intk1(Rout_4s,R)+Intk2(Rout_4s,R,0) )+N3d*( Intk1(Rout_3 d,R)+Intk2(Rout_3d,R,2) )+N4p*( Intk1(Rout_4p,R)+Intk2(Rout_4p,R,1) ) +N5s*( Intk1(Rout_5s,R)+Intk2(Rout_5s,R,0) )+N4d*( Intk1(Rout_4d,R)+I ntk2(Rout_4d,R,2) )+N5p*( Intk1(Rout_5p,R)+Intk2(Rout_5p,R,1) )+N6s*(

Intk1(Rout_6s,R)+Intk2(Rout_6s,R,0))+N5d*(Intk1(Rout_5d,R)+Intk2(Rout _5d,R,2))+N4f*(Intk1(Rout_4f,R)+Intk2(Rout_4f,R,3))+N6p*(Intk1(Rout_6 p,R)+Intk2(Rout_6p,R,1))+N7s*( Intk1(Rout_7s,R)+Intk2(Rout_7s,R,0) )+

N6d*( Intk1(Rout_6d,R)+Intk2(Rout_6d,R,2) )+N5f*( Intk1(Rout_5f,R)+In tk2(Rout_5f,R,3) )

total = Enkk+Env(Nout,R,z)+Enxc(Nout,R,Addxc)+Enee(Nout,R,z) end

42

real function Env(n,r,z)!(外位能) implicit none

integer i,z

real ,parameter ::pi=3.1416 integer ,parameter ::d=400 integer ,parameter ::sz=399 real bdd

real n(sz),r(sz) Env=0.0

bdd=10.0 do i=1,sz-1

Env = Env-( z*r(i)*n(i)+z*r(i+1)*n(i+1) )*4*pi*0.5*(bdd/d) end do

end function

real function Enxc(n,r,x)!Exc implicit none

integer i

real ,parameter ::pi=3.1416 integer ,parameter ::d=400 integer ,parameter ::sz=399 real hg,bdd

real n(sz),r(sz),x(sz,sz) bdd=10.0

hg=bdd/d Enxc=0.0 do i=1,sz-1

Enxc=Enxc+4*pi*( x(i,i)*n(i)*(r(i)**2)+x(i+1,i+1)*n(i+1)*(r(i+1)**2) )*0.5*(bdd/d)

end do end function

real function Enee(n,r,z)!Eee implicit none

integer i,j,z

real ,parameter ::pi=3.1416 integer ,parameter ::d=400 integer ,parameter ::sz=399

real n(sz),r(sz),bdd bdd=10.0

Enee=0.0 do i=1,sz do j=1,sz

Enee=Enee+0.5*( (( r(i)*r(j) )**2)/( max(i,j)*(bdd/d) ) )*n(i)*n(j)*(

bdd/d)*(bdd/d)*4*pi*4*pi end do

end do end

real function Intk1(Rc,r) implicit none

integer i,j

real ,parameter ::pi=3.1416 integer ,parameter ::d=400 integer ,parameter ::sz=399 real hg

real n(sz),r(sz),bdd,Rc(sz),inti1 bdd=10.0

inti1=0.0 hg=bdd/d do i=2,sz-2

Inti1=Inti1+(( -0.5*Rc(i)*r(i)*( (Rc(i+1)-Rc(i-1))/(r(i+1)-r(i-1))+(R c(i+1)-2*Rc(i)+Rc(i-1))/(hg**2) ) )+( -0.5*Rc(i+1)*r(i+1)*( (Rc(i+2) -Rc(i))/(r(i+2)-r(i))+(Rc(i+2)-2*Rc(i+1)+Rc(i))/(hg**2) ) ))*hg*0.5 !( Rc(i)*( (-1.0/r(i))*( (Rc(i-1)-Rc(i+1))/(R(i-1)-R(i+1)) ) )-0.5

*( (Rc(i+1)-2*Rc(i)+Rc(i-1))/((bdd/d)**2) )*hg*0.5 ) +

( Rc(i+1)*( (-1.0/r(i+1))*( (Rc(i)-Rc(i+2))/(R(i)-R(i+2)) ) )-0.5*(

(Rc(i+2)-2*Rc(i+1)+Rc(i))/((bdd/d)**2))*hg*0.5 ) end do

Intk1=inti1 end function

real function Intk2(Rc,r,l) implicit none

integer i,j,l

real ,parameter ::pi=3.1416 integer ,parameter ::d=400

44

integer ,parameter ::sz=399 real hg,Intk

real n(sz),r(sz),bdd,Rc(sz) bdd=10.0

intk=0.0 hg=bdd/d do i=1,sz-1

Intk=Intk+( ( (Rc(i)**2)*l*(l+1)*0.5 )+( (Rc(i+1)**2)*l*(l+1)*0.5 ) )*0.5*hg

end do Intk2=Intk end function

subroutine self_he() use IMSL

use global implicit none

real ,external :: norl ! bool=1 !自洽迴圈用的值 hg=bdd/d !空隙

do i=1,sz

R(i)=hg*i !R 向量 domain 的值 end do

!以下為初始值 do i=1,sz

Yini(i)=exp(-R(i)/0.53)!*2.0*((2.0/0.53)**(1.5)) end do

do i=1,sz

Nini(i)=2.0*((Yini(i))**2.0) end do

!---初始值帶入矩陣 do i=1,sz

N(i)=Nini(i) end do

call subProcess_7s(0,2) do i=1,sz

Pout(i)=Hn(i) end do

do i=1,sz

Nout(i)=2.0*((Pout(i)/R(i))**2.0) end do

!(以上)----初始直的結果--

!-給 s 初值-- s=10 times=0

!---自洽---He

do while (s>=10**(-3.0)) !誤差值在 10**-6 如果寫 s=0 跑不完 times=times+1

do i=1,sz N(i)=Nout(i) end do

call subProcess_7s(0,2) do i=1,sz

Pin(i)=Hn(i) end do

do i=1,sz

Nin(i)=2.0*((Pin(i)/R(i))**2.0) end do

do i=1,sz

Nd(i)=Nin(i)-Nout(i) end do

do i=1,sz

ABNd(i)=ABS(Nd(i)) end do

s=maxval(ABNd)

!write(*,*)times

!write(*,*)s

!--- do i=1,sz

Nout(i)=Nin(i) end do

end do end

subroutine Li3() use IMSL

46

use global implicit none

!---自洽---Li

call sub_self(3,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) call total_energy(3,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"Li(3)"

write(*,*)times write(*,*)total write(11,*)"Li(3)"

write(11,*)times write(11,*)total end

subroutine Be4() use IMSL

use global implicit none

!---自洽---Be

call sub_self(4,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) call total_energy(4,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"Be(4)"

write(*,*)times write(*,*)total write(11,*)"Be(4)"

write(11,*)times write(11,*)total end

subroutine B5() use IMSL

use global implicit none

!----B 自洽 ---

call sub_self(5,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) call total_energy(5,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"B(5)"

write(*,*)times

write(*,*)total write(11,*)"B(5)"

write(11,*)times write(11,*)total end

subroutine C6() use IMSL

use global implicit none

!---C

call sub_self(6,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) call total_energy(6,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"C(6)"

write(*,*)times write(*,*)total write(11,*)"C(6)"

write(11,*)times write(11,*)total end

!---N----

subroutine N7() use IMSL

use global implicit none

call sub_self(7,2,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) call total_energy(7,2,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"N(7)"

write(*,*)times write(*,*)total write(11,*)"N(7)"

write(11,*)times write(11,*)total end

subroutine O8()

48

use IMSL use global implicit none

!---O----

call sub_self(8,2,2,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) call total_energy(8,2,2,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"O(8)"

write(*,*)times write(*,*)total write(11,*)"O(8)"

write(11,*)times write(11,*)total end

subroutine F9() use IMSL

use global implicit none

!----F---

call sub_self(9,2,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) call total_energy(9,2,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"F(9)"

write(*,*)times write(*,*)total write(11,*)"F(9)"

write(11,*)times write(11,*)total end

subroutine Ne10() use IMSL

use global implicit none

!---Ne---

call sub_self(10,2,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) call total_energy(10,2,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"Ne(10)"

write(*,*)times write(*,*)total write(11,*)"Ne(10)"

write(11,*)times write(11,*)total end

subroutine Na11() use IMSL

use global implicit none

!---Na---

call sub_self(11,2,2,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0) call total_energy(11,2,2,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"Na(11)"

write(*,*)times write(*,*)total write(11,*)"Na(11)"

write(11,*)times write(11,*)total end

subroutine Mg12() use IMSL

use global implicit none

!---Mg---

call sub_self(12,2,2,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0) call total_energy(12,2,2,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"Mg(12)"

write(*,*)times write(*,*)total write(11,*)"Mg(12)"

write(11,*)times write(11,*)total end

subroutine AL13()

50

use IMSL use global implicit none

!----AL----

call sub_self(13,2,2,6,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0) call total_energy(13,2,2,6,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"AL(13)"

write(*,*)times write(*,*)total write(11,*)"AL(13)"

write(11,*)times write(11,*)total end

subroutine SI14() use IMSL

use global implicit none

!----SI----

call sub_self(14,2,2,6,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0) call total_energy(14,2,2,6,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"SI(14)"

write(*,*)times write(*,*)total write(11,*)"SI(14)"

write(11,*)times write(11,*)total end

subroutine P15() use IMSL

use global implicit none

!----P----

call sub_self(15,2,2,6,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0) call total_energy(15,2,2,6,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"P(15)"

write(*,*)times

write(*,*)total write(11,*)"P(15)"

write(11,*)times write(11,*)total end

subroutine S16() use IMSL

use global implicit none

!----S----

call sub_self(16,2,2,6,2,4,0,0,0,0,0,0,0,0,0,0,0,0,0) call total_energy(16,2,6,2,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"S(16)"

write(*,*)times write(*,*)total write(11,*)"S(16)"

write(11,*)times write(11,*)total end

subroutine CL17() use IMSL

use global implicit none

!----CL----

call sub_self(17,2,2,6,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0) call total_energy(17,2,2,6,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"CL(17)"

write(*,*)times write(*,*)total write(11,*)"CL(17)"

write(11,*)times write(11,*)total end

subroutine Ar18() use IMSL

52

use global implicit none

!----Ar----

call sub_self(18,2,2,6,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0) call total_energy(18,2,2,6,2,6,0,0,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"Ar(18)"

write(*,*)times write(*,*)total write(11,*)"Ar(18)"

write(11,*)times write(11,*)total end

subroutine K19() use IMSL

use global implicit none

!---K----

call sub_self(19,2,2,6,2,6,1,0,0,0,0,0,0,0,0,0,0,0,0) call total_energy(19,2,2,6,2,6,1,0,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"K(19)"

write(*,*)times write(*,*)total write(11,*)"K(19)"

write(11,*)times write(11,*)total end

subroutine Ca20() use IMSL

use global implicit none

!---Ca---

call sub_self(20,2,2,6,2,6,2,0,0,0,0,0,0,0,0,0,0,0,0) call total_energy(20,2,2,6,2,6,2,0,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"Ca(20)"

write(*,*)times write(*,*)total

write(11,*)"Ca(20)"

write(11,*)times write(11,*)total end

subroutine Sc21() use IMSL

use global implicit none

!---Sc---

call sub_self(21,2,2,6,2,6,2,1,0,0,0,0,0,0,0,0,0,0,0) call total_energy(21,2,2,6,2,6,2,1,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"Sc(21)"

write(*,*)times write(*,*)total write(11,*)"Sc(21)"

write(11,*)times write(11,*)total end

subroutine Ti22() use IMSL

use global implicit none

!---Ti---

call sub_self(22,2,2,6,2,6,2,2,0,0,0,0,0,0,0,0,0,0,0) call total_energy(22,2,2,6,2,6,2,2,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"Ti(22)"

write(*,*)times write(*,*)total write(11,*)"Ti(22)"

write(11,*)times write(11,*)total end

subroutine V23() use IMSL

use global

54

implicit none

!---V---

call sub_self(23,2,2,6,2,6,2,3,0,0,0,0,0,0,0,0,0,0,0) call total_energy(23,2,2,6,2,6,2,3,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"V(23)"

write(*,*)times write(*,*)total write(11,*)"V(23)"

write(11,*)times write(11,*)total end

subroutine Cr24() use IMSL

use global implicit none

!---Cr----

call sub_self(24,2,2,6,2,6,1,5,0,0,0,0,0,0,0,0,0,0,0) call total_energy(24,2,2,6,2,6,1,5,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"Cr(24)"

write(*,*)times write(*,*)total write(11,*)"Cr(24)"

write(11,*)times write(11,*)total end

subroutine Mn25() use IMSL

use global implicit none

!---Mn---

call sub_self(25,2,2,6,2,6,2,5,0,0,0,0,0,0,0,0,0,0,0) call total_energy(25,2,2,6,2,6,2,5,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"Mn(25)"

write(*,*)times write(*,*)total write(11,*)"Mn(25)"

write(11,*)times write(11,*)total end

subroutine Fe26() use IMSL

use global implicit none

!---Fe---

call sub_self(26,2,2,6,2,6,2,6,0,0,0,0,0,0,0,0,0,0,0) call total_energy(26,2,2,6,2,6,2,6,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"Fe(26)"

write(*,*)times write(*,*)total write(11,*)"Fe(26)"

write(11,*)times write(11,*)total end

subroutine Co27() use IMSL

use global implicit none

!---Co---

call sub_self(27,2,2,6,2,6,2,7,0,0,0,0,0,0,0,0,0,0,0) call total_energy(27,2,2,6,2,6,2,7,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"Co(27)"

write(*,*)times write(*,*)total write(11,*)"Co(27)"

write(11,*)times write(11,*)total end

subroutine Ni28() use IMSL

use global implicit none

56

!---Ni---

call sub_self(28,2,2,6,2,6,2,8,0,0,0,0,0,0,0,0,0,0,0) call total_energy(28,2,2,6,2,6,2,8,0,0,0,0,0,0,0,0,0,0,0) write(*,*)"Ni(28)"

write(*,*)times write(*,*)total write(11,*)"Ni(28)"

write(11,*)times write(11,*)total end

subroutine Cu29() use IMSL

use global implicit none

!---Cu---

call sub_self(29,2,2,6,2,6,1,10,0,0,0,0,0,0,0,0,0,0,0)

call sub_self(29,2,2,6,2,6,1,10,0,0,0,0,0,0,0,0,0,0,0)

在文檔中 原子基態能量的計算 (頁 20-99)

相關文件