Table of Contents

H atom

The following example shows calculations using the H atom. In this case the full wavefunction is analytically known and we thus can calculate the complete Hamiltonian. This example does not really use DFT, but shows how to calculate radial integrals from known wavefunctions.

Input

HWaveFunctions.Quanty
-- The calculations are done using a set of basis spin-orbitals
-- These are very often given by some radial function times a spherical harmonic
-- (or given by sum of these)
-- Here I show for the very simple example of an H atom how one can calculate the 
-- appropriate integrals
 
-- a gnuplot script to make the plots
gnuplotInput = [[
set autoscale 
set xtic auto 
set ytic auto  
set style line  1 lt 1 lw 1 lc rgb "#FF0000"
set style line  2 lt 1 lw 1 lc rgb "#0000FF"
set style line  3 lt 1 lw 1 lc rgb "#00C000"
set style line  4 lt 1 lw 1 lc rgb "#FF00FF"
set style line  5 lt 1 lw 1 lc rgb "#00FFFF"
set style line  6 lt 1 lw 1 lc rgb "#000000"
 
set ylabel "Rnl" font "Times,12"
set xlabel "r(A)" font "Times,12"
 
set out 'HWaveFunctions.ps'
set size 1.0, 1.0
set terminal postscript portrait enhanced color  "Times" 8
 
plot "Radial" using 1:2  title "R_{1s}(r)" with lines ls 1
plot "Radial" using 1:3  title "R_{2s}(r)" with lines ls 1,\
     "Radial" using 1:4  title "R_{2p}(r)" with lines ls 2
plot "Radial" using 1:5  title "R_{3s}(r)" with lines ls 1,\
     "Radial" using 1:6  title "R_{3p}(r)" with lines ls 2,\
     "Radial" using 1:7  title "R_{3d}(r)" with lines ls 3
plot "Radial" using 1:8  title "R_{4s}(r)" with lines ls 1,\
     "Radial" using 1:9  title "R_{4p}(r)" with lines ls 2,\
     "Radial" using 1:10 title "R_{4d}(r)" with lines ls 3,\
     "Radial" using 1:11 title "R_{4f}(r)" with lines ls 4
plot "Radial" using 1:12 title "R_{5s}(r)" with lines ls 1,\
     "Radial" using 1:13 title "R_{5p}(r)" with lines ls 2,\
     "Radial" using 1:14 title "R_{5d}(r)" with lines ls 3,\
     "Radial" using 1:15 title "R_{5f}(r)" with lines ls 4,\
     "Radial" using 1:16 title "R_{5g}(r)" with lines ls 5
 
set ylabel "<R|j|R>" font "Times,12"
set xlabel "q(A^{-1})" font "Times,12"
 
i=1
do for [n1=1:3] {
  do for [l1=0:n1-1] {
    do for [n2=1:3] {
      do for [l2=0:n2-1] {
        do for [k=abs(l1-l2):l1+l2:2] {
          i=i+1
          plot "Bessel" using 1:(column(i)) title "<R_{".n1." ".l1."}(r)|j[qr]|R_{".n2." ".l2."}(r)" with lines ls 6
        }
      }
    }
  }
}
 
]]
 
-- bohr radius in units of Angstrom
a0 = 0.52917721092;
 
-- Hydrogen wave functions with effective Z
function Rnl (n, l, r, Zeff)
  return 2^(l+1) * e^(-r*Zeff/(a0 * n)) * n^(-2-l) * r^l * (Zeff/a0)^(l+3/2) * math.sqrt(math.fact(n-l-1)/math.fact(n+l)) * math.LaguerreL(n-l-1, 2*l+1, 2*r*Zeff/(a0*n))
end
 
-- write the radial functions to a file
file = io.open("Radial", "w")
dr=0.01
Nr=5000
for ir = 0, Nr, 1 do
  r = ir*dr
  file:write(string.format("%15.8E ",r))
  for n=1, 5, 1 do
    for l=0, n-1, 1 do
      file:write(string.format("%15.8E ",Rnl(n,l,r,1)))
    end
  end
  file:write("\n")
end
file:close()
 
-- normalization
io.write("\n<Rnl|Rnl>\n");
dr=0.01
Nr=5000
for n=1, 5, 1 do
  for l=0, n-1, 1 do
    sum=0
    for ir = 0, Nr, 1 do
      r = ir*dr
      sum = sum + dr * r^2 * Rnl(n,l,r,1)^2
    end
    io.write(string.format("%15.8E ",sum))
  end
  io.write("\n")
end
 
-- average distance
io.write("\n<Rnl|r|Rnl> [units of A]\n");
dr=0.01
Nr=5000
for n=1, 5, 1 do
  for l=0, n-1, 1 do
    sum=0
    for ir = 0, Nr, 1 do
      r = ir*dr
      sum = sum + dr * r^2 * r * Rnl(n,l,r,1)^2
    end
    io.write(string.format("%15.8E ",sum))
  end
io.write("\n")
end
 
-- average distance
io.write("\n<Rnl|r|Rnl> [units of a0]\n");
dr=0.01
Nr=5000
for n=1, 5, 1 do
  for l=0, n-1, 1 do
  sum=0
    for ir = 0, Nr, 1 do
    r = ir*dr
    sum = sum + dr * r^2 * r * Rnl(n,l,r,1)^2 / a0
  end
  io.write(string.format("%15.8E ",sum))
end
io.write("\n")
end
 
-- dipole moments
io.write("\n<Rn1l1|r|Rn2l2> [units of a0]\n");
dr=0.01
Nr=5000
io.write("        R(1s)           R(2s)           R(2p)           R(3s)           R(3p)            R(3d)\n")
for n1=1, 3, 1 do
  for l1=0, n1-1, 1 do
    io.write(string.format("R(%i %i) ",n1,l1))
    for n2=1, 3, 1 do
      for l2=0, n2-1, 1 do
        sum=0
        for ir = 0, Nr, 1 do
          r = ir*dr
          sum = sum + dr * r^2 * Rnl(n1,l1,r,1) * r * Rnl(n2,l2,r,1) / a0
        end
        io.write(string.format("%15.8E ",sum))
      end
    end
    io.write("\n")
  end
end
 
-- Slater Integrals
io.write("\n<Rn1l1(r1) Rn2(r2)l2(r)| e^2/(|r1-r2|) |Rn1l1(r1) Rn2(r2)l2(r)> and <Rn1l1(r1) Rn2(r)l2(r2)| e^2/(|r1-r2|) |Rn1l1(r2) Rn2(r)l2(r1)> [units of Rydberg]\n");
dr=0.05
Nr=1000
for n1=1, 3, 1 do
  for l1=0, n1-1, 1 do
    for n2=1, 3, 1 do
      for l2=0, n2-1, 1 do
        io.write(string.format("R1(%i %i) R2(%i %i) ",n1,l1,n2,l2))
        for k=0, 2*math.min(l1,l2), 2 do
          io.write(string.format("F[%i]= ",k))
          sum=0
          for ir1 = 1, Nr, 1 do
            r1 = ir1*dr
            for ir2 = 1, Nr, 1 do
              r2 = ir2*dr
              sum = sum + a0 * dr^2* r1^2 * r2^2 * Rnl(n1,l1,r1,1)^2 * Rnl(n2,l2,r2,1)^2 * math.min(r1,r2)^k / math.max(r1,r2)^(k+1)
            end
          end
          io.write(string.format("%15.8E ",sum))
        end
        io.write("\n")
        io.write(string.format("                "))
        for k=math.abs(l1-l2), l1+l2, 2 do
          io.write(string.format("G[%i]= ",k))
          sum=0
          for ir1 = 1, Nr, 1 do
            r1 = ir1*dr
            for ir2 = 1, Nr, 1 do
              r2 = ir2*dr
                 sum = sum + a0 * dr^2* r1^2 * r2^2 * Rnl(n1,l1,r1,1) * Rnl(n1,l1,r2,1) * Rnl(n2,l2,r1,1) * Rnl(n2,l2,r2,1) * math.min(r1,r2)^k / math.max(r1,r2)^(k+1)
              end
            end
            io.write(string.format("%15.8E ",sum))
          end
          io.write("\n")
      end
    end
  end
end
 
-- Expectation value of bessel functions
-- q in units of inverse bohr radii
file = io.open("Bessel", "w")
file:write("<Rn1l1|j_k(qr)|Rn2l2> ");
for n1=1, 3, 1 do
  for l1=0, n1-1, 1 do
    for n2=1, 3, 1 do
      for l2=0, n2-1, 1 do
        for k=math.abs(l1-l2), l1+l2, 2 do
          file:write(string.format("%2i %2i %2i %2i %2i         ",n1,l1,n2,l2,k));
        end
      end
    end
  end
end
file:write("\n")
dr=0.05
Nr=1000
dq=0.1
Nq=100
for iq=0, Nq, 1 do
  q = iq*dq
  file:write(string.format("%15.8E ",q))
  for n1=1, 3, 1 do
    for l1=0, n1-1, 1 do
      for n2=1, 3, 1 do
        for l2=0, n2-1, 1 do
          for k=math.abs(l1-l2), l1+l2, 2 do
            sum=0
            for ir = 0, Nr, 1 do
              r = ir*dr
              sum = sum + dr * r^2 * Rnl(n1,l1,r,1) * math.SphericalBesselJ(k,q*r) * Rnl(n2,l2,r,1)
            end
            file:write(string.format("%15.8E ",sum))
          end
        end
      end
    end
  end
file:write("\n")
end
 
-- write the gnuplot script to a file
file = io.open("HWaveFunctions.gnuplot", "w")
file:write(gnuplotInput)
file:close()
 
-- call gnuplot to execute the script
os.execute("gnuplot HWaveFunctions.gnuplot ; ps2pdf HWaveFunctions.ps")

Result

The text output of the example is:

HWaveFunctions.out
<Rnl|Rnl>
 9.99999991E-01 
 9.99999999E-01  1.00000000E+00 
 1.00000000E+00  1.00000000E+00  1.00000000E+00 
 1.00000000E+00  1.00000000E+00  1.00000000E+00  1.00000000E+00 
 9.99996618E-01  9.99997469E-01  9.99998634E-01  9.99999518E-01  9.99999915E-01 
 
<Rnl|r|Rnl> [units of A]
 7.93765819E-01 
 3.17506327E+00  2.64588605E+00 
 7.14389235E+00  6.61471514E+00  5.55636071E+00 
 1.27002531E+01  1.21710758E+01  1.11127214E+01  9.52518980E+00 
 1.98439701E+01  1.93148370E+01  1.82565430E+01  1.66690572E+01  1.45523689E+01 
 
<Rnl|r|Rnl> [units of a0]
 1.50000000E+00 
 6.00000000E+00  5.00000000E+00 
 1.35000000E+01  1.25000000E+01  1.05000000E+01 
 2.40000000E+01  2.30000000E+01  2.10000000E+01  1.80000000E+01 
 3.74996687E+01  3.64997521E+01  3.44998663E+01  3.14999528E+01  2.74999917E+01 
 
<Rn1l1|r|Rn2l2> [units of a0]
        R(1s)           R(2s)           R(2p)           R(3s)           R(3p)            R(3d)
R(1 0)  1.50000000E+00 -5.58701653E-01  1.29026620E+00 -2.43569644E-01  5.16689243E-01  3.85117423E-01 
R(2 0) -5.58701653E-01  6.00000000E+00 -5.19615242E+00 -1.85110879E+00  3.06481541E+00 -5.93938418E+00 
R(2 1)  1.29026620E+00 -5.19615242E+00  5.00000000E+00  9.38404238E-01 -1.76947200E+00  4.74799161E+00 
R(3 0) -2.43569644E-01 -1.85110879E+00  9.38404238E-01  1.35000000E+01 -1.27279221E+01  9.48683298E+00 
R(3 1)  5.16689243E-01  3.06481541E+00 -1.76947200E+00 -1.27279221E+01  1.25000000E+01 -1.00623059E+01 
R(3 2)  3.85117423E-01 -5.93938418E+00  4.74799161E+00  9.48683298E+00 -1.00623059E+01  1.05000000E+01 
 
<Rn1l1(r1) Rn2(r2)l2(r)| e^2/(|r1-r2|) |Rn1l1(r1) Rn2(r2)l2(r)> and <Rn1l1(r1) Rn2(r)l2(r2)| e^2/(|r1-r2|) |Rn1l1(r2) Rn2(r)l2(r1)> [units of Rydberg]
R1(1 0) R2(1 0) F[0]=  6.25361997E-01 
                G[0]=  6.25361997E-01 
R1(1 0) R2(2 0) F[0]=  2.09911370E-01 
                G[0]=  2.19839069E-02 
R1(1 0) R2(2 1) F[0]=  2.42809270E-01 
                G[1]=  5.12484496E-02 
R1(1 0) R2(3 0) F[0]=  9.94970763E-02 
                G[0]=  5.77815972E-03 
R1(1 0) R2(3 1) F[0]=  1.08828908E-01 
                G[1]=  1.36070257E-02 
R1(1 0) R2(3 2) F[0]=  1.11022542E-01 
                G[2]=  1.23687003E-03 
R1(2 0) R2(1 0) F[0]=  2.09911370E-01 
                G[0]=  2.19839069E-02 
R1(2 0) R2(2 0) F[0]=  1.50397569E-01 
                G[0]=  1.50397569E-01 
R1(2 0) R2(2 1) F[0]=  1.62113568E-01 
                G[1]=  8.79037050E-02 
R1(2 0) R2(3 0) F[0]=  8.41155296E-02 
                G[0]=  7.47769953E-03 
R1(2 0) R2(3 1) F[0]=  9.00128174E-02 
                G[1]=  8.49566045E-03 
R1(2 0) R2(3 2) F[0]=  1.03579160E-01 
                G[2]=  3.65275093E-02 
R1(2 1) R2(1 0) F[0]=  2.42809270E-01 
                G[1]=  5.12484496E-02 
R1(2 1) R2(2 0) F[0]=  1.62113568E-01 
                G[1]=  8.79037050E-02 
R1(2 1) R2(2 1) F[0]=  1.81647891E-01 F[2]=  8.79269507E-02 
                G[0]=  1.81647891E-01 G[2]=  8.79269507E-02 
R1(2 1) R2(3 0) F[0]=  8.67567735E-02 
                G[1]=  9.42538747E-03 
R1(2 1) R2(3 1) F[0]=  9.39457829E-02 F[2]=  2.58889132E-02 
                G[0]=  9.91050614E-03 G[2]=  1.13319343E-02 
R1(2 1) R2(3 2) F[0]=  1.06331648E-01 F[2]=  3.71302391E-02 
                G[1]=  3.73743204E-02 G[3]=  2.18070620E-02 
R1(3 0) R2(1 0) F[0]=  9.94970763E-02 
                G[0]=  5.77815972E-03 
R1(3 0) R2(2 0) F[0]=  8.41155296E-02 
                G[0]=  7.47769953E-03 
R1(3 0) R2(2 1) F[0]=  8.67567735E-02 
                G[1]=  9.42538747E-03 
R1(3 0) R2(3 0) F[0]=  6.64069248E-02 
                G[0]=  6.64069248E-02 
R1(3 0) R2(3 1) F[0]=  6.87938354E-02 
                G[1]=  4.23190720E-02 
R1(3 0) R2(3 2) F[0]=  7.31340175E-02 
                G[2]=  2.27882524E-02 
R1(3 1) R2(1 0) F[0]=  1.08828908E-01 
                G[1]=  1.36070257E-02 
R1(3 1) R2(2 0) F[0]=  9.00128174E-02 
                G[1]=  8.49566045E-03 
R1(3 1) R2(2 1) F[0]=  9.39457829E-02 F[2]=  2.58889132E-02 
                G[0]=  9.91050614E-03 G[2]=  1.13319343E-02 
R1(3 1) R2(3 0) F[0]=  6.87938354E-02 
                G[1]=  4.23190720E-02 
R1(3 1) R2(3 1) F[0]=  7.18684241E-02 F[2]=  3.59914255E-02 
                G[0]=  7.18684241E-02 G[2]=  3.59914255E-02 
R1(3 1) R2(3 2) F[0]=  7.69318422E-02 F[2]=  3.61349053E-02 
                G[1]=  3.41809433E-02 G[3]=  2.40553028E-02 
R1(3 2) R2(1 0) F[0]=  1.11022542E-01 
                G[2]=  1.23687003E-03 
R1(3 2) R2(2 0) F[0]=  1.03579160E-01 
                G[2]=  3.65275093E-02 
R1(3 2) R2(2 1) F[0]=  1.06331648E-01 F[2]=  3.71302391E-02 
                G[1]=  3.73743204E-02 G[3]=  2.18070620E-02 
R1(3 2) R2(3 0) F[0]=  7.31340175E-02 
                G[2]=  2.27882524E-02 
R1(3 2) R2(3 1) F[0]=  7.69318422E-02 F[2]=  3.61349053E-02 
                G[1]=  3.41809433E-02 G[3]=  2.40553028E-02 
R1(3 2) R2(3 2) F[0]=  8.60467604E-02 F[2]=  4.54247742E-02 F[4]=  2.96291766E-02 
                G[0]=  8.60467604E-02 G[2]=  4.54247742E-02 G[4]=  2.96291766E-02 

The created pdf is: HWaveFunctions.pdf

Table of contents

Print/export