Calculate phase shift of square well

4 Comments

In the book, Introduction to Nuclear Reaction, by C. A. Bertulani, Chapter 2, there is a section that shows an example of phase shift from a square well. I follow the receipt and able to reproduce the result.


The actual method I did is little different. I use Mathematica to solve the radial Schrodinger equation in u(r) = R(r)/r , the differential equation I solve is

\displaystyle \frac{d^2}{dr^2} u(r) = \begin{cases} 0 & r = 0 \\ \frac{2m}{\hbar^2} W(r) u(r) + \frac{l(l+1)}{r^2} u(r) & r > 0 \end{cases}

where W(r) is the Woods-Saxon function, set the diffusiveness parameter to 0.001, the Woods-Saxon shape becomes square well.

In solving the differential equation, I set the right-hand side to be zero when r=0. That solved to problem when l > 0, it has to deal with the 1/r^2 . In fact, since u(0) = 0 , the right-hand side is always zero when r = 0.

For the solving range, I set

\displaystyle r_{max} = 5 \frac{2\pi}{k} + \frac{\sqrt{l(l+1)}}{k}

This is because the “first” peak of the Riccati-Bessel function appear after \sqrt{l(l+1)}/k . This will make sure the range has 5 oscillations in the solution.

Next, I table the solution for the last 2 oscillations, find the maximum, normalize the solution, and then fit with

\displaystyle u(r) \xrightarrow{r \rightarrow \infty} A \hat{j}_l(kr) + B \hat{n}_l(kr)

and extract A, and B.

The phase shift is

\displaystyle \tan(\phi) = \frac{A}{-B} .

The negative is due to the \hat{n}_l is negatively defined in Mathematica.


The elastics cross section is

\displaystyle \sigma_{el} = \frac{4\pi}{k^2} \sum_{l} \sqrt{2l+1} \sin^2(\phi_l)

From the calculation, we found that, at very small energy, only s-wave scattering cross section is non-zero, which is agree with theory.

[20220531] update

The Mathematical notebook can be downloaded here.

Sensitivity of Woods-Saxon parameters in Glauber model

Leave a comment

Experimentally, people measure the reaction cross section and compare with Glauber model. Since the inputs of the Glauber model are the nuclear density function and the NN cross section. The NN cross section is fixed by experiment. For an assumed density function, one or two parameters have to be fitted to the experimental cross section.

This time, we explore the sensitivity of the Woods-Saxon parameters in Glauber model using the method.

From the above figure, the sensitivity is largest for r_0 and a_0 is around 10 MeV/u. And the sensitivity drops for higher energy.

Note that a_0 = 0.60 match the experimental data even better.

We plot the ratio

And we can see that, all energy range has the same % sensitivity for r_0 , but different sensitivity for a_0 .

Next, we fixed the energy at 10 MeV/u and study the sensitivity of a_0

We can see that,

\displaystyle \frac{\Delta a_0 }{\Delta \sigma_R} \approx \frac{0.05 \textrm{fm}}{ 200 \textrm{mb}}

So, if the measured cross section is smaller than 40 mb, the uncertainty of a_0 is about 0.01 fm at 10 MeV/u for 12C+12C. The last plot at below is the sensitivity for r_0 .

\displaystyle \frac{\Delta r_0 }{\Delta \sigma_R} \approx \frac{0.05 \textrm{fm}}{ 50 \textrm{mb}}

By measuring the reaction cross section at two energies with uncertainty less than 50 mb, if the model explain the data, the Woods-Saxon parameters should be extracted with small uncertainty.

I did not consider the uncertainty from the density. The error propagation from the density to the Woods-Saxon parameters need to be studied.

Woods-Saxon density in Glauber model

Leave a comment

Following the receipt of the Glauber model. I did the calculation on 12C + 12C using Woods-Saxon density, and compared with the experimental result.

I did it using Mathematica. In order to avoid high dimension integration, the T_{A}(s), T_{B}(s) , T_{AB}(b), T(b) are first tablelized and interpolated. This reduced the complexity and speeded things up.

The NN cross section is taken from the reference S. K. Charagi and S. K. Gupta, PRC 41 (1990) 1610. It gives a parametrized from for the NN cross section. But I did not cross check the value for < 10 MeV.

I also compared the calculation with and without Coulomb correction. Also, finite-range interaction was also calculated.


Here is the results. The WS radius is R = 1.25 A^{1/3}, a = 0.67 .

The T_{AB}(b) in this case is very close to a Gaussian, and can be approximated as T_{AB}(b) = 0.02124 \exp\left( - \frac{b^2}{3.884^2} \right)

In order to match the 12C+12C cross section, I have to scale the T_{AB}(b) by 80 times.

The above is the 12C+12C result from Glauber model using zero-range. The calculation is close to the experimental result from the reference. And the low energy is the Coulomb correction. I guess my Coulomb correction is not correct? But for low energy, k^2 = 2m(K)/\hbar^2 should be correct, I am more less confident for the high energy. Anyway, the calculation is not that far away. Below is a figure taken from the reference for the 12C+12C reaction

Taken From S. K. Charagi and S. K. Gupta, PRC 41 (1990) 1610

I take the Coulomb KE to be half of the incident KE, i.e. using Center of mass KE. We get a better result at low energy. It seems that the center of mass KE should be used, but why? [update 2021-07-18] it is because the target will be pushed by the Coulomb force from the projectile. Since the net force on the two-particle system is zero, transform the coordinate into the CM frame, and the CM frame KE is used to calculate the closed distance.

Next I compare the calculation using a Gaussian finite-range with finite range parameter of 0.9 fm, below is the T_{AB}(b) :

The finite-range interaction thickness function takes a similar shape but only different amplitude. This is understandable as the NN interaction not only when the nucleon-nucleon at the same position, but also can interaction at 0.9 fm apart. Since the transparency function is insensitive (I will discuss this at below) for the inner part of the thickness function. The increase of the amplitude would not cause much different, but the increase width will make a different.


At the end, I like to add some comments on the calculation.

Frist, in the calculation, I used a normalized Woods-Saxon density. Is it necessary? Since the probability of a NN-collision at impact parameter b is T_{AB}(b) \sigma_{NN}, and \sigma_{NN} for low energy is 100 ~ 1000 mb or 10 ~ 100 fm2. This term T_{AB} \sigma_{NN} < 1 is often not fulfilled.

Also, the transparency function, if we take the original form

\displaystyle T(b) = (1 - \sigma_{NN} T_{AB}(b) ) ^{AB}

This requires T_{AB}(b) \sigma_{NN} < 1 , but as I discussed above it is usually not the case. However, if we use the exp form

\displaystyle T(b) = \exp \left(- \sigma_{NN} T_{AB}(b) \right)

then there seems to be no limitation for the thickness function T_{AB}(b) . So, if the normalization doesn’t matter, then what is the meaning of the thickness function times NN cross section?? not probability anymore? [update July-16, 2021] refer to the end of this post. The density function is normalized to mass number.

Second, I tried to follow the step in the reference S.K. Charagi and S.K. Gupta, but I cannot reproduce the Gaussian parameters as they did. In the paper, they match the Gaussian density to the surface of the Woods-Saxon function. The problem is the normalization of the Woods-Saxon density. I can use the table to interpolate the density and radius, and the Gaussian density is not normalized. Even I use their table values for the density and radius, I still unable to reproduce their result, except the 12C+12C, I can reproduce the trend, but the curve is still not the same as their.

Third, in the Coulomb correction, the wave number is non-relativistic.

Fourth, at energy below the Coulomb barrier, it becomes mostly elastic scattering, and the effective impact parameter, is very large, the reaction cross section should becomes zero. The Coulomb corrected Glauber model should reflect this.

Fifth, the interplay between the NN cross section, finite-range, the thickness function, and the transparency function. The transparency function is

\displaystyle T(b) = \exp \left(- \sigma_{NN} T_{AB}(b) \right)

We use a Gaussian approximation for the T_{AB}(b) for illustration. And the transparency function becomes

\displaystyle T(b) = \exp \left(- \alpha \exp\left(-\frac{b^2}{\beta^2}\right) \right)

This is the exactly the form from using Gaussian density.

In below, alpha = 4, \beta = 2 ,

We can see that, when \sigma_{NN} T_{AB}(b) > 4 , T(b) \sim 0 and \sigma_{NN} T_{AB}(b) = \ln(2) \rightarrow T(b) = 0.5 . We can see that, the increase of the NN cross section, the increase of the WS density, and the finite-range effect, has similar effect and all contribute to increase the width of \sigma_{NN} T_{AB}(b) . When the width increased, the position for T(b) = 0.5 also increased, and the integration or the reaction cross section increased.

Here is the calculation for the 40Ca + 40Ca, the WS density also 80 times more.

Sixth, the 1- T(b) looks like a Woods-Saxon function, can we find a simple relation between the density parameters to the 1-T(b) ?


[update July-16, 2021]

In the above, we have to multiple the T_{AB}(b) by 80 to reproduce the experimental result. At the calculation, the T_{AB}(b) is calculated using Woods-Saxon function that is normalized by 1. Thus, this 80 is the multiplication of the mass number. But the multiplication of the mass number is 12 \times 12 = 144 . And 80 is only 55%. This 55% could be a correction to the density in the compensation for the radius and diffusiveness parameters.. For Woods-Saxon potential that normalized to the mass number, r_0 = 1.25, a_0 = 0.67

We can see that the density has 20% difference, and we know that the density should be almost constant as the short-range nuclear force saturated at the center of nucleus. And the experimental nuclear density is 0.16 fm-3.

I redo the calculation using r_0 = 1.0, a_0 = 0.6 , and the scaling is 144.

The result is closer to the experimental result.

Gaussian density for Glauber model

Leave a comment

We are going to calculate the reaction cross section using Glauber model with Gaussian density. This already done in reference S. K. Charagi and S. K. Gupta, PRC 41 (1990) 1610, But I will provide more detail of the calculation. And also, in the reference, there is a factor 10, that is the conversion 1 \textrm{fm}^2 = 10 \textrm{mb}


The density function is

\displaystyle \rho(r) = \rho_0  e^{-r^2/R^2},  \rho_0 = \frac{1}{(\sqrt{\pi}R)^3}

The finite-range function takes the form

\displaystyle f(r) = \frac{1}{\pi R^2} e^{-r^2/R^2}

when R \rightarrow 0 , the function becomes 2-D delta function .

The goal is to compute

\displaystyle \sigma^{NN} = 2\pi \int bdb \left( 1 - \exp(-\sigma_{NN} T_{AB}(b) \right)

\displaystyle T_{AB}(b) = \int d z_A d z_B d^2s d^2s' \\ \rho_A\left(\sqrt{s^2+z_A^2}\right) \rho_B\left(\sqrt{|\vec{s'}-\vec{b}|^2 + z_B^2}\right) f(|\vec{s}-\vec{s'}|)

The T_{AB} is a 6-dimension integral, but thanks to the Gaussian density and Gaussian finite-range function, all 6-dimension can be integrated individually in Cartesian coordinate.


Let integrate the beam direction.

\displaystyle \int_{-\infty}^{-\infty} \rho\left(\sqrt{s^2+z^2}\right) dz = \rho_0 \sqrt{\pi} R \exp\left( - \frac{s^2}{R^2} \right)

Thus,

\displaystyle T_{AB}(b) = \rho_1 \rho_2 \frac{R_1 R_2}{R_0^2} \int d^2s d^2s' \exp \left( - \frac{s^2}{R_1^2} \right) \\ \exp \left( - \frac{|\vec{s'}-\vec{b}|^2}{R_2^2} \right) \exp \left( - \frac{|\vec{s}-\vec{s'}|^2}{R_0^2} \right)

In Cartesian coordinate,

\displaystyle T_{AB}(b) = \rho_1 \rho_2 \frac{R_1 R_2}{R_0^2} \int dx_1 dy_1 dx_2 dy_2 \exp \left( - \frac{x_1^2+y_1^2}{R_1^2} \right) \\ \exp \left( - \frac{(x_2 - x_b)^2+(y_2 - y_b)^2}{R_2^2} \right) \exp \left( - \frac{(x_1-x_2)^2 + (y_1-y_2)^2}{R_0^2} \right)

Lets integrate x_2

\displaystyle \int_{-\infty}^{\infty} \exp \left( - \frac{(x_2 -x_b)^2}{R_2^2} - \frac{(x_1-x_2^2)}{R_0^2}  \right) dx_2  \\ = \frac{\sqrt{\pi}R_0 R_2}{\sqrt{R_0^2+R_2^2}} \exp\left(-\frac{(x_1-x_b)^2}{R_0^2+R_2^2} \right)

Similarly for the y_2 , and we have

\displaystyle T_{AB}(b) = \rho_1 \rho_2 \frac{R_1 R_2}{R_0^2} \frac{\pi R_0^2 R_2^2}{R_0^2+R_2^2} \int dx_1 dy_1  \\ \exp \left( - \frac{x_1^2+y_1^2}{R_1^2} \right) \exp\left(-\frac{(x_1-x_b)^2}{R_0^2+R_2^2} -\frac{(y_1-y_b)^2}{R_0^2+R_2^2} \right)

We can see a similar pattern in here, rearrange and simplify

\displaystyle T_{AB}(b) = \rho_1 \rho_2 \pi \frac{R_1 R_2^3}{R_0^2+R_2^2} \int dx_1 dy_1  \\ \exp \left( - \frac{x_1^2}{R_1^2} -\frac{(x_1-x_b)^2}{R_0^2+R_2^2}\right) \exp\left(- \frac{y_1^2}{R_1^2}-\frac{(y_1-y_b)^2}{R_0^2+R_2^2} \right)

Thus,

\displaystyle T_{AB}(b) = \rho_1 \rho_2 \pi \frac{R_1 R_2^3}{R_0^2+R_2^2} \frac{\pi R_1^2 (R_0^2+R_2^2)}{R_0^2+R_1^2+R_2^2} \exp \left( -\frac{x_b^2+ y_b^2}{R_0^2+R_1^2+R_2^2}\right)

\displaystyle T_{AB}(b) = \rho_1 \rho_2 \pi^2 \frac{R_1^3 R_2^3}{R_0^2+R_1^2+R_2^2} \exp \left( -\frac{b^2}{R_0^2+R_1^2+R_2^2}\right)

When R_0 \rightarrow 0 , it reduces to zero-range.

We simplify T_{AB}(b) :

\displaystyle T_{AB}(b) = \alpha \exp\left( - \frac{b^2}{\beta^2} \right) = \frac{1}{\pi \beta^2} \exp \left( - \frac{b^2}{\beta^2}\right)

where

\displaystyle \beta^2 = R_0^2 + R_1^2 + R_2^2,  \alpha = \rho_1 \rho_2 \pi^2 \frac{R_1^3 R_2^3}{\beta^2} = \frac{1}{\pi \beta^2 }

We substitute \rho_i = 1/(\sqrt{\pi}R_i)^3 at the last step. We can check that

\displaystyle 2\pi\int_0^{\infty} T_{AB}(b) b db = 1

which is expected as T_{AB}(b) is the probability of a NN-collision at impact parameter b.


The reaction cross section take the form

\displaystyle \sigma^{AB} = 2\pi \int_{0}^{\infty} \left( 1- \exp(-\sigma_{NN} \alpha e^{-\frac{b^2}{\beta^2}}) \right)b db

This is exponential of exponential, and integrate. I never deal with this before. Lets get a feeling on the \exp(-a \exp(-x^2) . When x is large, the inside exp approaches to zero, so, the outside \exp(-0) gives 1. When x is small, the inside exp gives a finite number, and the outside \exp(-|y|) < 1 . In fact, if we plot using \beta = 1, \sigma_{NN} = 2

We can see that, the T_{AB} is the probability of a NN-collision, and the \exp( -a T_{AB}) is the transparency function.

Mathematica gives the integral as:

\displaystyle \sigma^{AB} =\pi \beta^2 \left( \gamma + \ln(\alpha \sigma_{NN}) - E_i(-\alpha \sigma_{NN}) \right) \\= \pi \beta^2\left( \gamma + \ln\left(\frac{\sigma_{NN}}{\pi \beta^2}\right) - E_i\left(-\frac{\sigma_{NN}}{\pi \beta^2}\right)  \right)

where \gamma = 0.577216 is the Euler Gamma constant and E_i(z) is the exponential integral function.

\displaystyle E_i(z) = - \int_{-z}^{\infty} \frac{e^{-t}}{t} dt

The expression agree with the reference. We plot the \sigma^{AB} below,

For a fixed \beta, i.e. the size of the target and projectile, the reaction cross section change with \sigma_{NN} non-linearly. But for a fixed \sigma_{NN} the reaction cross section saturated to \sigma_{NN}.

In fact, mathematically,

\displaystyle \lim_{\beta \rightarrow \infty} \sigma^{AB} = \sigma_{NN}


For some I don’t know why reason, the radial distance R with

\displaystyle \exp\left( -\sigma_{NN} T_{AB}(R) \right) = 0.5

is called the strong absorption radius. In here, the density normalization is to the mass number, not 1.

\displaystyle \exp\left(\sigma_{NN} T_{AB}(R) \right) = 2

\displaystyle \frac{\sigma_{NN}}{\pi \beta^2} \exp\left( - \frac{R^2}{\beta^2} \right) = \chi_0  \exp\left( - \frac{R^2}{\beta^2} \right)  =\ln(2)

\displaystyle - \frac{R^2}{\beta^2}  =\ln(\ln(2)) - \ln(\chi_0)

\displaystyle R^2 =\beta^2 \left( \ln(\chi_0) -  \ln(\ln(2)) \right)

R^2 > 0 requires \chi_0 > \ln(2) = 0.693147 or

\displaystyle \sigma_{NN} AB > \ln(2) \pi \beta^2 = \ln(2) \pi (R_1^2 +R_2^2 + R_0^2 )

When the energy is more than 100 MeV, the \sigma_{NN} \sim 40 \textrm{mb} = 4 \textrm{fm}^2 , this impiles \beta^2 < 1.8 A B ~ \textrm{fm}^2 , which is satisfied for most nuclei.

Then, a classical geometrical cross section is

\displaystyle \sigma^G = \pi R^2 = \pi \beta^2 \left( \ln\left( \frac{\sigma_{NN}}{\pi \beta^2} \right)  - \ln(\ln(2)) \right)

Compare with

\displaystyle \sigma^{AB} = \pi \beta^2\left( \ln\left(\frac{\sigma_{NN}}{\pi \beta^2}\right) + \gamma - E_i\left(-\frac{\sigma_{NN}}{\pi \beta^2}\right)  \right)

Radial density from Woods-Saxon potential

Leave a comment

In this post, we estimated the radial density from a harmonic oscillator. Now, we do a similar job from Woods-Saxon potential.

The radial function (for neutron) R(r) = u(r)/r is a solution of the Schrodinger equation :

\displaystyle \frac{d^2u}{dr^2} - \frac{l(l+1)}{r^2}u - \frac{2m}{\hbar^2}\left( U(r) \right) u = 0

\displaystyle U(r) = \frac{V_0}{1+\exp\left(\frac{r-R}{a}\right)} + V_{SO}\frac{L\cdot S}{r} \frac{d}{dr}\left( \frac{1}{1+\exp\left(\frac{r-R_{SO}}{a_{SO}}\right)}  \right)

I will use the python code to calculate the eigen wave functions.

The density will be

\displaystyle \rho(r) = \sum_i R_i^2(r) = \sum_{j} w_j R_j^2(r)

where j is the orbital id, and w_j is the occupation number of the j orbital. For magic nuclei,

\displaystyle \rho(r) = \sum_{j} (2j+1)R_j^2(r)


At the edge of the density function, it is similar to the Woods-Saxon, but at the center, depends on how much the s-orbital contributes, it can be a dip, an anti-dip, or flat.

Interestingly, the density saturates around 1 unit. There is no constraint, requirement, or normalization for that in the calculation. Is it a mathematical coincidence that it is a property of Woods-Saxon potential? or it is a general property for the Schrodinger equation?


[update 2022-03-05]

In text book, the mean of nuclear density is the same for all nuclei because the balance between the strong nuclear force and electromagnetic repulsion for proton, or the nuclear force is short-range. A situation similar to a liquid drop. And yes, this is the fundamental reason.

And the fact that the WS calculation reproduces a constant density for all nuclei is that the radius is

\displaystyle R = r_0 A^{1/3} .

That makes sure the number density is

\displaystyle d = \frac{A}{V} = \frac{A}{4/3\pi R^3} = \frac{3}{4 \pi r_0^3} = 0.122~\textrm{nucleon} / \textrm{fm}^3


[update 2023-12-29]

The concepts of the wavefunction and the nuclear density are closely related. The square of the wave function in a given volume is the probability of finding a nucleon, while the density is the number of nucleons in a given volume. Mathematically, we demand the nuclear density to be

\displaystyle \int \rho(r) r^2 dr d\Omega = A

i.e. the total number of nucleons A in the whole nucleus is recovered by integrating the density. From the wave function, we can construct

\displaystyle \rho'(r, \Omega) = \sum_i \phi^2(r, \Omega) = \sum_i R_i^2(r) Y_i^2(\Omega)

integrate out the angular dependence,

\displaystyle \rho''(r) = \int \rho'(r,\Omega) d\Omega = \sum_i R_i^2(r)

if we treat \rho''(r) to be the radial density distribution, thus,

\displaystyle \int \rho''(r) r^2 dr d\Omega = 4\pi A

which is 4\pi larger than it should be. Thus, a proper construction would be

\displaystyle \rho(r) = \frac{1}{4\pi} \sum_i R_i^2(r)

Since the experimental nuclear mass density is 0.16 \pm 0.1 nucleon/fm3. Thus, the neutron (or proton) mass density is approximately half and equal to 0.08 nucleon/fm3. From the above plots, if we divided them with 4 \pi, the density is roughly 0.08 nucleon/fm3. For light nuclei, since the Coulomb force is not strong and the proton and neutron wave functions are similar, we can simply multiply the neutron mass density by A/N to approximate the mass density.

RMS radius of various nuclear density functions

Leave a comment

In the Glauber model, one of the input is the density functions. People will adjust the parameters of the density function to fit the experimental cross section.

There are many choice of nuclear density functions, for example, Woods-Saxon, Harmonic Oscillator, Square well, and Gaussian etc. Among all of them, the root-mean-squared (RMS) radius of these functions usually represent the nuclear RMS radius. So, there are many RMS radius depends on the density function. In here, I will make some comparisons.

All density functions are normalized

\displaystyle 4\pi \int_{0}^{\infty} f(r) r^2 dr = 1

and the mean-squared radius is

\displaystyle \left<r^2\right> = \frac{\int_{0}^{\infty} f(r) r^4 dr}{\int_{0}^{\infty} f(r) r^2 dr } = 4\pi  \int_{0}^{\infty} f(r) r^4 dr

Using the above definition, I have

NameDensity functionRMS radius
Square Well\frac{3}{4\pi R^3}, 0<r<R \sqrt{\frac{3}{5}}R
Woods-Saxon\frac{1}{-8 a^3 \pi \textrm{PolyLog}(3, -e^{R/a})} \frac{1}{1+e^{(r-R)/a}} a \sqrt{12\frac{\textrm{PolyLog}(5, -e^{R/a})}{\textrm{PolyLog}(3, -e^{R/a})}}
Gaussian\frac{1}{\sqrt{\pi^3}R^3} \exp\left(- \frac{r^2}{R^2}\right) \sqrt{\frac{3}{2}}R

The rms radius of Square well and Gaussian is simple ratio to the radius parameter.

As we shown before, the Woods-Saxon will approach to Square well, as it should be. But the Gaussian will be different. How to translate the rms radius between each of them? For example, If I say the rms radius is 4 fm +- 0.1 fm with Gaussian density function, what is the rms radius for Woods-Saxon ?

Here is other comparisons


I guess, to translate the rms radius between different density functions in Glauber model, we have to compare the T_A(s) . If the T_A(s) is similar. To define the similarity of functions, we using

\displaystyle 4\pi \int \sqrt{f(r) g(r)} r^2 dr

When f(x) = g(x) , the integral is equal to 1.

I compare the Woods-Saxon and Gaussian,

The 3rd order approximation for the peak (red) line is

\displaystyle 1.80144 + 0.212716 x + 0.0444465 x^2 - 0.00193038 x^3

Here is the plot for the Woods-Saxon with latex R=4 , a = 0.67$, and the Gaussian with R = 3. 24 ,

Glauber Model – 2

Leave a comment

I compared the calculations from hard sphere and Woods-Saxon type density functions, to study the sensitivity of the Glauber model. The Glauber model calculate, for spherical nuclei

\displaystyle T_{AB}(b)= \int d z_A \int d z_B \int d\theta \int sds \\\rho_A\left(\sqrt{s^2+z_A^2}\right) \rho_B\left(\sqrt{s^2 + b^2 - 2 sb \cos\theta + z_B^2}\right)

which is a 4-dimension integration. Once the T_{AB}(b) is calculated, all other things follow. The reaction cross section is

\displaystyle \sigma^{AB} = 2\pi \int b db \left( 1 - \left(1-T_{AB}(b) \sigma_{NN}\right)^{AB} \right)

When the T_{AB}(b) \sigma_{NN} is small and AB is large, make analog,

\displaystyle \lim_{n\rightarrow \infty} \left( 1+ \frac{x}{n} \right)^n = e^x

an approximation:

\displaystyle \sigma^{AB} = 2\pi \int b db \left(1 - e^{- T_{AB}(b) \sigma_{NN}} \right)

and call the exponential be transparency function T(b)

\displaystyle T(b) = e^{- T_{AB}(b) \sigma_{NN}}

Because the form of the reaction cross section is also like

\displaystyle \sigma_a = \frac{\pi}{k^2} \sum (2l+1) (1-|S_l|^2)

And the meaning of |S_l|^2 is also the transparency. Also, in semi-classical, the average angular momentum is l+1/2 = k b , Thus, people would link

\displaystyle T(b) \approx S_l .


The hard sphere is relatively less time consuming, and the density function is easy to play with. It is easy to know that

\displaystyle \rho(r) = \frac{3}{4\pi R^3} , 0<r<R,

the corresponding T_A is

\displaystyle T_A(s) = \int_{-R}^{R} \rho(\sqrt{s^2 +z_A^2}) dz_A = \frac{3}{2\pi R^3}\sqrt{R^2-s^2}, 0<s<R

But it is hard to get the analytical form of the T_A for Woods-Saxon, so I have to integrate the density numerically using 4-dimensional 25-points Gauss quadrature. Because it is 4-dimensional, the number of sum is 25^4 = 390625 , comparing to 2-dimensional 25-point GQ, which only need 25^2 = 625 .

The normalized Woods-Saxon function is

\displaystyle WS(r) = \frac{1}{4\pi} \frac{1}{-2a^2 PolyLog(3, -e^{R/a})} \frac{1}{1+e^{(r-R)/a}}

Here is the comparison for radius 2 and radius 1, and diffusiveness is 0.3.

The simple hard-sphere means that I use 2-dimension GQ, “hard-sphere” means the 4-D GQ was used. And that verified the calculations for 4-dimension GQ works well.

The Woods-Saxon gives a smooth curve because the function itself is smooth. In Hard-sphere, the function is not smooth and that could create problem when using GQ method.

If we interpolate the two functions and integrate, i.e.

\displaystyle \int T_{AB}(b) d db

The hard-sphere gives 0.160056 and WS gives 0.158891. So, I think I can conclude that the Glauber model is not sensitive in these two cases. i.e., If someone try to extract the nucleus radius by fitting the experimental reaction cross section using Glauber model, using hard-sphere and WS is basically the same.


[Update July-16, 2021]

The “approximation” of \sigma^{AB} mentioned above is not correct.

\displaystyle \sigma^{AB} = 2\pi \int b db \left( 1 - \left(1-T_{AB}(b) \sigma_{NN}\right)^{AB} \right)

For \sigma_{NN} T_{AB}(b) < 1 ,

\displaystyle \sigma^{AB} = 2\pi \int b db \left( 1 - \exp\left(1-AB T_{AB}(b) \sigma_{NN}\right) \right)

And we can absorb the AB into T_{AB}(b) and this lead to re-define of the density function.

\displaystyle  \int \rho_A(r) d^3 r = A

That means, the density function is no longer normalized to 1, but it normalized to equal the number of nucleons.

If we assume the density function is normalized to 1 and takes a Woods-Saxon shape with parameters r_0 = 1.25, a_0 = 0.67 , the maximum \rho_z(0, A=1) = 0.082 \textrm{fm}^{-2}. And this limited the NN cross section be \sigma_{NN} < 12.2 \textrm{fm}^2 = 122 \textrm{mb} . And that translate to E_{Lab} >\approx 100 \textrm{MeV}/u . This estimation is only based on one nucleus. T_{AB}(0) = \int \rho_z(A) \rho_z(B) d^2s <  \int \rho_z^2(\textrm{min}(A,B)) d^2s  , We calculated the energy limit versus mass number using

\displaystyle T_{AB}(0) = \int \rho_z^2(A) d^2s

\displaystyle \sigma_{NN}(E) T_{AB}(0) = 1

We can see that for most of the nuclei, the lab energy can be as low as 4 MeV/u (green line). And that is close to the Coulomb barrier.

Solving Woods-Saxon potential using Python

12 Comments

For seek of nice drawing, I code a python code for that. Although the scipy package can solve differential equation, the way is breaking a 2nd order equation into two 1st order equations. So, I simply move the RK4 method into python. Also, the plotly package can draw a nice plot.

import numpy
import math
import plotly.graph_objects as go
import scipy.integrate
import scipy.special
import scipy.interpolate

class WoodsSaxon:

  #grid setting
  rStart = 0.0001
  dr = 0.1
  nStep = 300

  #constant
  mn = 939.56539 #MeV/c2
  hbarc = 197.326979 #MeV.fm

  #RK4 constants
  parC = [0, 1./2, 1./2, 1.]
  parD = [1./6, 2./6, 2./6, 1./6]

  mu = 0
  R0 = 0
  RSO = 0

  E = 0 #energy of the state
  L = 0
  J = 0

  #inital condition
  solu0 = 0.0
  dsolu0 = 1.0

  trancation = 100 #wavefunction will trancate if value < max/ 100

  rpos = numpy.arange(rStart, rStart+nStep*dr, dr)
  kpos = numpy.arange(0, 1000, 1) #momentum in MeV/c
  kzpos = numpy.arange(0, 500, 1 ) #para-momenutem in MeV/c

  SolU = []
  maxSolU = 0.0
  WF = numpy.empty([nStep], dtype=float) # radial wave function
  maxWF = 0.0
  WFk = numpy.empty([len(kpos)], dtype=float) #momentum wave function
  WFkz = numpy.empty([len(kzpos)], dtype=float) #para-momentum  dist function

  minEigenE = -100 # the lowest eigen energy
  eigenEnergy = numpy.empty([0,6], dtype=float) #energy, N, L, J, dEnergy, rms(raidus)
  eigenWFList = numpy.empty([0,nStep], dtype=float) # list of eigen WF. 
  eigenWFkList = numpy.empty([0, len(kpos)], dtype=float) #list of eigen momentum wave function
  eigenWFkzList = numpy.empty([0, len(kzpos)], dtype=float) # list of para-momentum dist function

#====================== Setting

  # must declare at the initialization of the class
  def __init__(self, A, V0, r0, a0, VSO, rSO, aSO):
    self.A = A
    self.V0 = V0
    self.r0 = r0
    self.a0 = a0
    self.VSO = VSO
    self.rSO = rSO
    self.aSO = aSO
    self.mu = self.mn * A/(A+1)
    self.R0 = r0 * math.pow(A,1./3)
    self.RSO = rSO * math.pow(A, 1./3)
    #self.PrintParameters()
    self.minEigenE = V0 + 5  #assume the 1st s-state is 5 MeV above the V0

  # set energy, can be not eigen status
  def SetE(self, E):
    self.E = E

  # set the mometum L and J
  def SetLJ(self,L,J):
    self.L = L
    self.J = J

  # set the range in fm
  def SetRange(self, rStart, dr, nStep):
    self.rStart = rStart
    self.dr  = dr
    self.nStep = nStep
    self.WF=numpy.empty([nStep], dtype=float)
    rpos = numpy.arange(self.rStart, self.rStart+self.nStep*dr, self.dr)

  # Woods-Saxon potential
  def __WS(self, x):
    return self.V0/(1 + math.exp((x-self.R0)/self.a0))

  # spin-obital potential
  def __SO(self, x):
    return self.LS(self.L, self.J)*(self.VSO * math.exp((x-self.RSO)/self.aSO))/(self.aSO*math.pow(1+math.exp((x-self.RSO)/self.aSO),2))/x

  # LS coupling factor                                  
  def LS(self, L, J) :
    return (J*(J+1)-L*(L+1)-0.5*(1.5))/2.

  # The G-function, u''[r] = G[r, u[r], u'[r]]
  def __G(self, x, y, dy):
    #return  -2*x*dy -2*y  # solution of gaussian
    return 2*self.mu/math.pow(self.hbarc,2)*(self.__WS(x) - self.__SO(x) - self.E)*y + self.L*(1+self.L)/x/x*y

#============================== Radial wave function
  # Plot potential and wavefunction for give energy E
  def PlotAll(self, E, maxR = 20):
    self.E = E
    ypos = []
    rSpinObi = []
    SpinObi = []
    rL = []
    yL = []
    rtot = []
    ytot = []
    yE = []

    maxWS = abs(self.V0)

    for i in range(self.nStep):
      x = self.rStart + self.dr*i
      if( x < maxR ):
        central = self.__WS(x)
        ypos.append(central)
        yE.append(self.E)
        so = self.__SO(x)
        centrapetal = math.pow(self.hbarc,2)/2/self.mu*(self.L*(1+self.L))/x/x
        tot = central-so + centrapetal
        if abs(so) < maxWS  :
          rSpinObi.append(x)
          SpinObi.append(so)
        if abs(centrapetal) < maxWS :
          rL.append(x)
          yL.append(centrapetal)
        if abs(tot) < maxWS :
          rtot.append(x)
          ytot.append(tot)
    fig = go.Figure()
    fig.add_trace(go.Scatter(x=self.rpos, y=ypos, name="Woods-Saxon"))
    fig.add_trace(go.Scatter(x=rSpinObi, y=SpinObi, name="Spin-Orbit"))
    fig.add_trace(go.Scatter(x=rL, y=yL, name="Centrapetal"))
    fig.add_trace(go.Scatter(x=rtot, y=ytot, name="Total"))

    if E != 0.0 :
      fig.add_trace(go.Scatter(x=self.rpos, y=yE, name="Energy", marker=dict(color = 'black')))
      self.SolveByRK4()
      self.CovertSolUtoWF()
      fig.add_trace(go.Scatter(x=self.rpos, y=(self.WF/self.maxWF*maxWS + self.E), name="WaveFunction"))

    fig.update_xaxes(range=[0, maxR])
    fig.update_layout(xaxis_title="radius [fm]")
    fig.update_layout(yaxis_title="Energy [MeV]")
    fig.show()

  # plot the Eigen wave function of ID, will calculate Wave function
  def PlotEigenWF(self, ID, maxR = 20):
    if -1 < ID and ID < len(ws.eigenEnergy) : 
      self.SetLJ(self.eigenEnergy[ID, 2],self.eigenEnergy[ID, 3])
      self.PlotAll(self.eigenEnergy[ID,0], maxR)

  # plot all eigen wave function
  def PlotAllEigenWFs(self, isSquare = False, maxR = 20):
    fig = go.Figure()
    for i in range(len(self.eigenEnergy)) :
      haha = self.eigenEnergy[i]
      wf = self.eigenWFList[i]
      if isSquare == True :
        fig.add_trace(go.Scatter(x=self.rpos, y=(wf*wf), name=self.FormatOrbital(haha)))
      else:
        fig.add_trace(go.Scatter(x=self.rpos, y=wf, name=self.FormatOrbital(haha)))
    fig.update_xaxes(range=[0, maxR])
    fig.update_layout(xaxis_title="radius [fm]")
    fig.update_layout(yaxis_title=r"$\phi(r)$")
    fig.show()

  # Using Rungu-Kutta 4th method to solve u''[r] = G[r, u[r], u'[r]]
  def SolveByRK4(self):
    #initial condition
    self.SolU = [self.solu0]
    dSolU = [self.dsolu0]

    dyy = numpy.array([1., 0., 0., 0., 0.])
    dzz = numpy.array([1., 0., 0., 0., 0.])

    self.maxSolU = 0.0

    for i in range(self.nStep-1):
      r = self.rStart + self.dr * i
      y = self.SolU[i]
      z = dSolU[i]

      for j in range(4):
        j = j+1
        dyy[j] = self.dr * (z + self.parC[j-1]*dzz[j-1])
        dzz[j] = self.dr * self.__G(r + self.parC[j-1]*self.dr, y + self.parC[j-1]*dyy[j-1], z + self.parC[j-1]*dzz[j-1])
        #if( i < 10 ):
        #  print("%d, %f, (%f, %f ), %f, %f, %f" % (j, parC[j-1], dyy[j-1], dzz[j-1], dyy[j], dzz[j], G(r, y,z)))
      
      #if( i < 10 ): 
      #  print(dyy, dzz)

      dy = 0
      dz = 0
      for j in range(4):
        j = j+1
        dy = dy + self.parD[j-1]*dyy[j]
        dz = dz + self.parD[j-1]*dzz[j]

      #if( i < 10 ):
      #  print("%7.5f, %8.4f, %8.4f, %8.4f" % (r, y, G(r,y,z),  y +dy))

      self.SolU.append(y + dy)
      dSolU.append(z + dz)
      
      if abs(y+dy) > self.maxSolU and r < self.R0*6:
        self.maxSolU = abs(y+dy)

    return self.SolU

  # normalize SolU as int( SolU^2 r^2 ) = 
  def NormalizeSolU(self):
    SolU2 = []
    for i in range(self.nStep):
      if( self.rpos[i] > 5* self.R0 and self.SolU[i] < self.maxSolU / self.trancation):
        SolU2.append(0.0)
      else:
        SolU2.append(math.pow(self.SolU[i],2))
    norm = math.sqrt(scipy.integrate.simps(SolU2, self.rpos))
    for i in range(self.nStep):
      self.SolU[i] = self.SolU[i]/norm

  # convert the SolU = u[r] to radial wave function as R[r] = u[r]/r
  def CovertSolUtoWF(self):
    self.NormalizeSolU()
    #convert to wave function
    self.maxWF = 0.0
    for i in range(self.nStep):
      r = self.rStart + self.dr * i
      self.WF[i] = self.SolU[i]/r
      if( self.maxWF < abs(self.SolU[i]/r)):
        self.maxWF = abs(self.SolU[i]/r)
    if self.L == 0 :
      self.WF[0] = self.WF[1]

  # Find Eigen energies, should save the wave function one by one?
  def FindEigenEnergis(self, isPrint=True):
    Estep = 0.2 # this limit the weakly bound state
    self.eigenEnergy = numpy.empty([0,6], dtype=float)
    if self.A < 40 : 
      lmax = 3
    else :
      lmax = 6
    for l in range(lmax+1):
      if l == 0 :
        jList = [1./2]
      else :
        jList = [l + 1./2, l - 1./2]
      for j in jList:
        self.SetLJ(l, j)
        count = 0
        eigenN = 0
        EList = numpy.arange(self.minEigenE, 0, Estep) # assume there is no state with only 5 MeV above the V0
        oldhaha = []
        for E in EList:
          self.E = E
          Enow = E
          haha = self.SolveByRK4()
          if count > 0 :
            # if the tail change sign, use bisection method to find the best E    
            repeat = 0
            while oldhaha[-1] * haha[-1] < 0:
              EMiddle = (Enow + Epast)/2.
              if  (Enow - Epast < 1e-4 and abs(oldhaha[-1] - haha[-1]) < self.maxSolU * 0.01 ) or repeat > 200:
                if eigenN == 0 :
                  self.minEigenE = EMiddle #this set the starting energy for next j-value 

                self.eigenEnergy = numpy.append(self.eigenEnergy, [[EMiddle, eigenN, l, j, abs(Enow-Epast), 0]], axis=0)
                eigenN = eigenN + 1
                break
              else:
                self.E = EMiddle
                hahaMiddle = self.SolveByRK4()
                if oldhaha[-1] * hahaMiddle[-1] < 0  :
                  haha = hahaMiddle
                  Enow = EMiddle
                else:
                  oldhaha = hahaMiddle
                  Epast = EMiddle
              repeat = repeat + 1
          oldhaha = haha
          Epast = E
          count = count + 1

    #sorting energy energy with N, L, J
    self.eigenEnergy = self.eigenEnergy[self.eigenEnergy[:,0].argsort()]

    self.eigenWFList = numpy.empty([0,self.nStep], dtype=float) # list of eigen WF. 
    for i in range(len(self.eigenEnergy)):
      haha = self.eigenEnergy[i]
      self.E = haha[0]
      self.SetLJ(haha[2], haha[3])
      self.SolveByRK4()
      self.NormalizeSolU()
      self.CovertSolUtoWF()
      self.eigenWFList = numpy.append(self.eigenWFList, [self.WF], axis=0)
      self.eigenEnergy[i][5] = self.CalRMSRadius()

    if isPrint :
      self.PrintEigenEnergies()

  # Get Eigen radial wave function
  def GetEigenWF(self, ID):
    return self.eigenWFList[ID]

  # Calculate RMS radius for the WF stored in the momeory
  def CalRMSRadius(self):
    return math.sqrt(scipy.integrate.simps(self.WF*self.WF*numpy.power(self.rpos,4), self.rpos))

  # Print Woods-Saxon parameters
  def PrintParameters(self):
    print("======================================================")
    print("A = %d,  mu = %f MeV/c2" % (self.A, self.mu))
    print("V0  = %7.2f MeV, r0  = %6.3f(%6.3f) fm, a0  = %6.3f fm" % (self.V0, self.r0, self.R0, self.a0))
    print("VSO = %7.2f MeV, rSO = %6.3f(%6.3f) fm, aSO = %6.3f fm" % (self.VSO, self.rSO, self.RSO, self.aSO))
    print("Range = Start : %.6f fm,  End : %.6f | stepSize : %.2f fm, num. Step : %d" % (self.rStart, self.rStart + self.dr*self.nStep, self.dr, self.nStep))
    print("======================================================")

  # Format te orbital symbol from N, L, J using the eigen energy array
  def FormatOrbital(self, eigen):
    if eigen[2] == 0.0 :  Lsym = "s"
    if eigen[2] == 1.0 :  Lsym = "p"
    if eigen[2] == 2.0 :  Lsym = "d"
    if eigen[2] == 3.0 :  Lsym = "f"
    if eigen[2] == 4.0 :  Lsym = "g"
    if eigen[2] == 5.0 :  Lsym = "h"
    if eigen[2] == 6.0 :  Lsym = "i"
    if eigen[2] == 7.0 :  Lsym = "j"
    output = "%.0f%s%.0f/2" % (eigen[1], Lsym, 2*eigen[3])
    return output

  # print eigen energies
  def PrintEigenEnergies(self):
    print("======================================================")
    count = 0
    for haha in self.eigenEnergy:
      print("%2d | %4s   %14.10f MeV +- %14.10e | rms(Radius): %10.6f fm" % (count, self.FormatOrbital(haha), haha[0], haha[4], haha[5]))
      count = count + 1
    print("======================================================")

#================================= Momentum
  # Calculate momentum wave function. This use the WF in the memory.
  def __CalMomentumWF(self, L):
    for i in range(len(self.kpos)):
      kfm = self.kpos[i] / self.hbarc
      function = numpy.empty([self.nStep], dtype=float) # this is SpheicalBeseel(kr)*WF(r)*r^2
      for j in range(self.nStep):
        if( self.rpos[j] > 5 * self.R0 and self.WF[j] < self.maxWF / self.trancation) :
          function[j] = 0.
        else:
          sb = scipy.special.spherical_jn(int(L) , kfm * self.rpos[j])
          function[j] = sb * self.WF[j] * self.rpos[j] * self.rpos[j]
      self.WFk[i] = scipy.integrate.simps(function, self.rpos)
    maxWFk = numpy.sign(self.WFk[1])*max(abs(numpy.amax(self.WFk)), abs(numpy.amin(self.WFk)))
    self.WFk = self.WFk/maxWFk

  # Calculate eigen momentum wave function and store it
  def CalEigenMomentumWF(self):
    self.eigenWFkList = numpy.empty([0, len(self.kpos)], dtype=float)
    for i in range(len(self.eigenWFList)) :
      self.WF = self.eigenWFList[i]
      self.__CalMomentumWF(self.eigenEnergy[i][2])
      self.eigenWFkList = numpy.append(self.eigenWFkList, [self.WFk], axis=0)

  # [Obsolete?] normaalize momentum Wave Function as int(wfk^2 k^2) = 1
  def NormalizedMomentumWF(self):
    if len(self.WFk) == len(self.kpos) :
      norm = math.sqrt(scipy.integrate.simps((self.WFk*self.WFk*self.kpos*self.kpos), self.kpos))
      self.WFk/norm

  # return the eigen momentum wave function
  def GetEigenMomentumWF(self, ID):
    return self.eigenWFkList[ID]

  # Plot all Eigne momentum wave functions, this will recalculate from the eigen energy
  def PlotAllEigenMomentumWF(self, isSquare = False, maxk=500):
    fig = go.Figure()
    if len(self.eigenEnergy) != len(self.eigenWFkList) :
      self.CalEigenMomentumWF()

    for i in range(len(self.eigenWFkList)) :
      haha = self.eigenEnergy[i]
      if isSquare == False :
        wfk = self.eigenWFkList[i]
      else:
        wfk = numpy.power(self.eigenWFkList[i],2)
      fig.add_trace(go.Scatter(x=self.kpos, y=wfk, name=self.FormatOrbital(haha)))
    fig.update_xaxes(range=[0, maxk])
    fig.update_layout(xaxis_title="Momemtum [MeV/c]")
    if isSquare == True :
      fig.update_layout(yaxis_title=r"$\phi^2(k)$")
    else:
      fig.update_layout(yaxis_title=r"$\phi(k)$")
      
    fig.show()

  # calculate the parallel momentum distribution using the WFk in the memory
  # the para-momentum distribution is f(kz) = int( WFk(sqrt(kz^2 + kr^2 ))^2 kr )
  def __CalParaMomentumDist(self):
    wfk = scipy.interpolate.interp1d(self.kpos, self.WFk)
    krList = self.kzpos
    for i in range(len(self.kzpos)):
      kz = self.kzpos[i]
      kList = numpy.sqrt(kz*kz + krList*krList)
      func = wfk(kList)
      self.WFkz[i] = scipy.integrate.simps(func * func * krList, krList )
    maxWFkz = max(abs(numpy.amax(self.WFkz)), abs(numpy.amin(self.WFkz)))
    self.WFkz= self.WFkz/maxWFkz

  # Calculate eigen para-momentum distribution
  def CalEigenParaMomentumDist(self):
    self.eigenWFkzList = numpy.empty([0, len(self.kzpos)], dtype=float)
    if len(self.eigenEnergy) != len(self.eigenWFkList) :
      self.CalEigenMomentumWF()

    for haha in self.eigenWFkList :
      self.WFk = haha
      self.__CalParaMomentumDist()
      self.eigenWFkzList = numpy.append(self.eigenWFkzList, [self.WFkz], axis=0)

  # Plot all parallel momentum distribution 
  def PlotAllParaMomentumDists(self, maxk = 500):
    if len(self.eigenEnergy) != len(self.eigenWFkzList) :
      self.CalEigenParaMomentumDist()

    fig = go.Figure()
    for i in range(len(self.eigenWFkzList)) :
      haha = self.eigenEnergy[i]
      wfkz = self.eigenWFkzList[i]
      fig.add_trace(go.Scatter(x=self.kpos, y=wfkz, name=self.FormatOrbital(haha)))
    fig.update_xaxes(range=[0, maxk])
    fig.update_layout(xaxis_title="para-Momemtum [MeV/c]")
    fig.show()

The usage is very straight forward.

[A, V0, r0, a0, Vso, rso, aso ] = [15, -48.5, 1.24, 0.67, 16.5, 1.24, 0.67]
ws = WoodsSaxon(A, V0, r0, a0, Vso, rso, aso)
ws.SetLJ(1, 1.5)
ws.PlotAll(-13.191423125, 30)

The result is

It can also find all eigen energies

ws = WoodsSaxon(12, -58, 1.22, 0.69, 35, 0.75, 0.56)
ws.FindEigenEnergis()
ws.PlotAllEigenWFs(False)
ws.PlotAllEigenMomentumWF(False, 500)
ws.PlotAllParaMomentumDists() #parallel momentum distribution

The result is

======================================================
A = 12
V0  =  -58.00 MeV, r0  =  1.220( 2.793) fm, a0  =  0.690 fm
VSO =   35.00 MeV, rSO =  0.750( 1.717) fm, aSO =  0.560 fm
Range = Start : 0.000100 fm,  End : 30.000100 | stepSize : 0.10 fm, num. Step : 300
======================================================
found E : -31.1438878912, NLJ: 00(1/2) | E-limit: (-3.114389e+01, -3.114389e+01),  U-limit: (3.275552e-05, -1.037775e-02) | maxSolU: 0.975954
found E :  -1.6901489258, NLJ: 10(1/2) | E-limit: (-1.690161e+00, -1.690137e+00),  U-limit: (-3.547450e-03, 3.666512e-03) | maxSolU: 0.872269
found E : -16.4853724474, NLJ: 01(3/2) | E-limit: (-1.648537e+01, -1.648537e+01),  U-limit: (1.056252e-01, -1.962114e-01) | maxSolU: 40.553369
found E :  -9.5338185416, NLJ: 01(1/2) | E-limit: (-9.533819e+00, -9.533819e+00),  U-limit: (1.387732e-01, -1.342873e-01) | maxSolU: 53.446166
found E :  -1.3501820670, NLJ: 02(5/2) | E-limit: (-1.350188e+00, -1.350176e+00),  U-limit: (2.848967e-01, -1.905022e+01) | maxSolU: 2095.640491
======================================================
 0 | 0s1/2   -31.1438878912 MeV +- 3.5527136788e-15 | rms(Radius):   1.976819 fm
 1 | 0p3/2   -16.4853724474 MeV +- 1.1642242725e-11 | rms(Radius):   2.579059 fm
 2 | 0p1/2    -9.5338185416 MeV +- 1.4901164747e-09 | rms(Radius):   2.976584 fm
 3 | 1s1/2    -1.6901489258 MeV +- 2.4414062500e-05 | rms(Radius):   5.055909 fm
 4 | 0d5/2    -1.3501820670 MeV +- 1.2207031250e-05 | rms(Radius):   3.667586 fm
======================================================

Momentum distribution From Woods-Saxon potential

Leave a comment

In this post, we derived the transformation between radial distribution and momentum distribution. This is a simple “Fourier Transform” in 3D with spherical Bessel function. In that post we also plot some simple functions.

The effective potential for most nuclei can be approximated (or well described) using the Woods-Saxon potential. Here we study the 15C, find the radial wave functions and the corresponding momentum distributions.

There are many way to calculate the radial function for a give set of Woods-Saxon parameters, using C++ code, MS excel, or Mathematica. In this post, I will use Mathematica. I found that MS Excel has the Bessel function, but it only accept integer n, but spherical Bessel needs half integer n, so it is not easy for calculating the momentum distribution.

In Mathematica, solving the Schrodinger equation for the radial part is extremely easy, for give energy T, angular momentum L, total spin J

sol = NDSolve[{u''[
r] == (2 m)/hbar^2 (V0/(1 + Exp[(r - R0)/a0]) - 
1/r (Exp[(r - RSO)/aSO] VSO)/(a0 (1 + Exp[(r - RSO)/aSO)]^2)
LS - T) u[r] + (L (L + 1))/r^2 u[r], u[0] == 0, u'[0] == 1}, 
u, { r, 0, 30}];

where V_i is the potential depth in MeV, R_i is the hald-radius in fm, a_i is the diffusiveness parameter in fm, and the subscript i for central and spin-orbit. LS =( J(J+1) - L(L+1) - 3/4)/2 is the LS coupling factor. u(r) =r \phi(r) is the reduced radial function.

The normalization of the reduced radial function u(r) is

\displaystyle \int_{0}^{\infty} u(r)^2 dr = 1


Usually, we don’t know the energy for a give state, we have to scan through all possible energy from (V_0 , 0 ) . When the energy T is not the eigen energy, the tail of the wave function will diverge and oscillate with respect to the energy. Thus, we can use this property to find the eigen energy that the tail of the wave function is flat.

In here, I am requiring the sum u(20) + u(30) to be minimum.

For 15C, the single particle energies for the 1s1/2 and 0d5/2 is known from the 14C(d,p) reaction, which are -1.2181 MeV and -0.4741 MeV, respectively.

After searching for best fit parameters, I found

V_0 = -45.8, r_0 = 1.24, a_0 = 0.67, V_{SO} = 14.5, r_{SO} = r_0, a_{SO} = a_0

are best fit. The energies of different states are:

OrbitalEnergy (WS) [MeV]Energy (exp) [MeV]
0s1/2-25.634
0p3/2-12.522
0p1/2-10.351
1s1/2-1.210-1.2181
0d5/2-0.463-0.474

And, I have the radial function.

We can see that, the 1s1/2 orbital has largest radial distribution and the 0s1/2 has the smallest.

Next, we transform the radial distribution to the momentum distribution. The unit conversion is that

\displaystyle k = \left[\frac{1}{fm}\right]= 197.326 [MeV/c]

In the above figure, we scaled the distribution so that they have similar magnitude. We can see, the momentum distribution is smallest for the 1s1/2 as expected.

It is interesting that the momentum spread of the 0s1/2 and 1s1/2 are very different, the spread of the 0s1/2 is almost 3 times more than that of the 1s1/2, and that of the p-wave also about double.

And the d-wave momentum distribution has 2 bumps, this looks something wrong. (??? I am no solid answer for that. I suspect this is related to the tail of the wave function, when the tail is not zero, the spherical Bessel J times r^2 will magnify the tail. )


The radial solution of the Woods-Saxon potential (or the Schrodinger equation?) for the bound state is always take this form:

\displaystyle R_{nl}(r) = r^{l} \exp(-\kappa r) f_{nl}(r)

where r^l is the short range behaviour, \exp(-\kappa r),  \kappa^2 \hbar^2 = 2m |E| is the long range behaviour, and f_{nl}(r) is a modifier for the middle part of the function.

Lets assume the f_{nl}(r) = 1 for simplicity.

The momentum distribution using this simplified radial function is

\displaystyle \psi_l(k) = (l+1)!2^{l+1} \kappa  \frac{k^l}{(k^2+\kappa^2)^{l+2}}

Normalized with \int \psi_l(k)^2 dk =1

\displaystyle \psi_l(k) = \sqrt{\frac{2 \kappa^{l+7/2} \Gamma(2l+4)}{\Gamma(l+1/2)\Gamma(l+7/2)} } \frac{k^l}{(k^2+\kappa^2)^{l+2}}

Here are the plot with \kappa = 1 for

\displaystyle \phi_l(r) = \sqrt{   \frac   {(2\kappa)^{2l+3}}   {(2l+2)!}    } r^l \exp(-\kappa r), \int \phi_l(r)^2 r^2 dr = 1

the \phi_l(r) is similar to n = 1 orbital.

The momentum distribution is good for distinguish l = 0 and l = 1, but not so good for higher l.

And it is counter intuitive that more spread of the radial function, the momentum distribution also spread out more. I guess the effect of the angular momentum has to take into account. For same l , more spread of momentum still means the radial spread is smaller.

Coulomb Energy for a s-orbital under Woods-Saxon potential

Leave a comment

Pick up from the Coulomb Energy calculation, For beta-decay, a neutron change to a proton and emit an electron. I assume the proton-orbital is as same as that of the neutron. In particular, I am working on 11Be beta-decay.

The outer most neutron is in the 1s1/2 orbital with separation energy of 0.502 MeV.

First, I have to find the 1s1/2 neutron wave function using Woods-Saxon potential. Since it is the s-orbital, the spin-orbital part can be ignored. And only 3 parameters left: the potential depth, the half-depth radius, and the diffuseness parameter. The diffuseness parameter is fixed at 0.67 fm. The half-depth radius is R = 1.25 A^{1/3} = 2.69304 ~\textrm{fm} for A = 10 . ( May be I should use A = 11? ). I adjusted the depth to give the -0.502 MeV neutron separation energy. The depth is -51.56 MeV.

The proton/charge distribution is also same as the Woods-Saxon potential, but with a normalization that

\displaystyle 4\pi \int_0^\infty \rho_0(x) x^2 dx = 1

In general, a normalized spherical Woods-Saxon potential is

\displaystyle \rho_0(x) = \frac{1}{1+\exp{\frac{x-R}{a}}} \frac{-1}{4\pi a^3 Li_3(-e^{R/a}) }

,where Li_n(z) is the polylogarithm function.

The charge distribution and the squared s-wave function is

Annotation 2020-04-07 122922.png

Now, we have to integrate the wave function and the charge distribution

\displaystyle V(y) = 4\pi \int_0^y \rho_0(x) \frac{x^2}{y} dx + 4\pi \int_y^\infty \rho_0(x) x dx

The potential is follow

Annotation 2020-04-07 123454.png

The Coulomb potential of the Woods-Saxon shape is “smaller” than that of the Uniform sphere is expected.

The Coulomb energy with Z = 4 is then

\displaystyle W = Z \frac{e^2}{4\pi \epsilon_0} 4\pi \int_0^\infty V(y) \phi(y)^2 y^2 dy = 1.15~\textrm{MeV}

The Coulomb energy using the potential of a uniform sphere with Z  = 4 is

\displaystyle W_{U} = 1.24~\textrm{MeV}


The experimental Coulomb displacement energy for the 11Be (T = 3/2 ) state can be extracted using the mass and the excited state of 11B(T=3/2). The excitation energy of 11B(T=3/2) = 12.554 MeV. The experimental Coulomb energy is

\displaystyle W_e = M(11B) + Ex(11B) - M(11Be) + m_n - m_p = 1.827~\textrm{fm}

The calculation is ~ 0.7 MeV smaller. The difference should be due to the shape of the wave function, and also co-related to the shape of the potential, as the Woods-Saxon shape does not accurately descript light nuclei. (or, take the electron mass into account ?? ) 

I changed the WS parameter a = 0.3 fm. So that the wave function is more concentrated toward the center that the 1st node is around 1.9 fm (the potential depth becomes -59.2 MeV). The Coulomb energy with uniform sphere is 1.47 MeV. 

a [fm]Coulomb Energy with Uniformly charge sphere [MeV] (R=1.25(11)^3 = 2.78 fm)
0.671.24
0.31.47
0.11.62
0.021.65
R [fm]Coulomb Energy with Uniformly charge sphere [MeV] ( a= 0.67 fm)
2.781.24
2.51.28
2.11.34

After a few trials, I found that when R=2.2 fm, a = 0.1 fm, The Coulomb energy of the wavefunction of the Woods-Saxon potential and Uniformly charge sphere is 1.85 MeV. The 1st node of the 1s1/2 wavefunction is around 1.5 fm. But the depth of the potential is -98 MeV, which is too deep.

Older Entries