This site is version 0.0.1. Most of the code on this site is drafted by an agent and needs review. I apologize for the AI-speak, we are working on rewriting it!
viv-lang.org

Notebooks · posts/skyrme-hartree-fock-of-oxygen-16

Skyrme Hartree-Fock of oxygen-16

The ground state of O from the SLy5 Skyrme functional, solved on a radial mesh at two spacings and extrapolated. The binding energy comes out 8.0250 MeV per nucleon and the charge radius 2.7993 fm; skyrme_rpa, the published code of Colò et al. (2013), gives 8.0261 MeV and 2.7991 fm in its own test run with the same force, and the six single-particle energies agree with it to 3 keV.

A nucleus is up to a few hundred protons and neutrons (sixteen here) held together by the strong force, which has no simple closed form. Nuclear density functional theory replaces it with an energy that depends only on a few local densities: the number density of neutrons () and protons (), their kinetic-energy densities , and their spin-orbit densities . Skyrme's functional is the oldest of these, with about ten parameters fitted to nuclear data. Minimizing the energy gives each nucleon a Schrödinger equation (the second equation above) with a position-dependent effective mass , a central potential and a spin-orbit field , all computed from the densities. That makes the problem self-consistent, and the program solves it by iteration: densities, then fields, then orbitals, then new densities.

O has 8 protons and 8 neutrons, which fill the , and shells of each, so it is spherical and every orbital is the lowest of its block. The force is SLy5 (Chabanat et al., Nucl. Phys. A 643, 441 (1998)), with the parameters and conventions of skyrme_rpa (G. Colò, L. Cao, N. Van Giai and L. Capelli, Comput. Phys. Commun. 184, 142 (2013)), whose distribution includes a Hartree-Fock run of O with SLy5 as its test case. That output file is the published reference here. posts/refs/skyrme-hartree-fock-of-oxygen-16.py copies its numbers, describes rerunning the program, and holds a numpy twin of this solver that diagonalizes each block densely.

Look inside this program

  • Atlas

    The program’s map: every function and which calls which.

  • Explore

    Run it and step through what each part did, with the code, values and plots beside it.

Shift+Enter in a cell runs it and moves to the next. Running a cell runs every cell above it too, as one program.

[1]lines 37–75

The discretization

Each orbital is , and on a mesh , , the radial equation for is a symmetric tridiagonal matrix:

The first term uses at the half points, which keeps the matrix symmetric; the term comes from writing the equation for rather than . Each block's lowest eigenvector comes from inverse iteration: three solves of by the tridiagonal (Thomas) algorithm per pass, starting from the previous pass's vector, with the shift 0.1 MeV below the previous orbital energy. On the first pass the eigenvalue itself is found first, by bisection on the Sturm count (the number of negative pivots of is the number of eigenvalues below ), so the iteration starts on the right state. Derivatives of the densities are centered differences with second-order one-sided ones at the ends, and integrals are trapezoidal. The protons also feel the Coulomb field of their own density, with exchange in the Slater approximation.

Every piece is second order in , so the program solves the problem at and fm in a 15 fm box and extrapolates, .

[2]lines 104–440

Two meshes and the extrapolation

The iteration starts from a Woods-Saxon density and mixes half of each new density into the old one until the energy changes by less than MeV, which takes 38 passes on each mesh. On both meshes the energy per nucleon, the three radii and the six orbital energies match the numpy twin to ; the tests allow . Going from to fm moves the energy per nucleon by 0.016 MeV and the charge radius by 0.002 fm.

[3]lines 454–504

Against the published run

The extrapolated binding energy is MeV per nucleon, against skyrme_rpa's : the two differ by MeV per nucleon, 18 keV out of 128 MeV. skyrme_rpa's own answer moves by MeV per nucleon between its 0.1 fm and 0.05 fm meshes (the reference script records the rerun), so most of the remaining difference is between the two programs' formulas, not their meshes. The radii agree to fm and the six orbital energies to 3 keV. On the 0.1 fm mesh alone, this program's second-order scheme is off by 0.02 MeV per nucleon, which is why it extrapolates.

The figure shows the converged densities on the fine mesh.

[4]lines 522–572