Fixed unstability of wave functions
This commit is contained in:
parent
6538c30fa8
commit
f77e5dfed8
19
dirac.jl
19
dirac.jl
|
|
@ -26,18 +26,18 @@ end
|
||||||
"Solve the Dirac equation and return the wave function u(r)=[g(r), f(r)] where
|
"Solve the Dirac equation and return the wave function u(r)=[g(r), f(r)] where
|
||||||
divs is the number of mesh divisions if the solution should be discretized as a 2×(1+divs) matrix (keep divs=0 to obtain an interpolating function),
|
divs is the number of mesh divisions if the solution should be discretized as a 2×(1+divs) matrix (keep divs=0 to obtain an interpolating function),
|
||||||
the other parameters are the same from dirac!(...)."
|
the other parameters are the same from dirac!(...)."
|
||||||
function solveWf(κ, p, E, Φ0, W0, B0, A0, r_max, divs::Int=0)
|
function solveWf(κ, p, E, Φ0, W0, B0, A0, r_max, divs::Int=0; dtype=BigFloat, algo=Feagin12())
|
||||||
prob = ODEProblem(dirac!, [0, 1], (0, r_max))
|
prob = ODEProblem(dirac!, convert.(dtype, [0, 1]), (0, r_max))
|
||||||
sol = solve(prob, RK4(), p=(κ, p, E, Φ0, W0, B0, A0), saveat=(divs == 0 ? [] : r_max/divs))
|
sol = solve(prob, algo, p=(κ, p, E, Φ0, W0, B0, A0), saveat=(divs == 0 ? [] : r_max/divs))
|
||||||
return divs == 0 ? sol : hcat(sol.u...)
|
return divs == 0 ? sol : hcat(sol.u...)
|
||||||
end
|
end
|
||||||
|
|
||||||
"Solve the Dirac equation and return g(r=r_max) where
|
"Solve the Dirac equation and return g(r=r_max) where
|
||||||
r_max is the outer boundary in fm,
|
r_max is the outer boundary in fm,
|
||||||
the other parameters are the same from dirac!(...)."
|
the other parameters are the same from dirac!(...)."
|
||||||
function boundaryValue(κ, p, E, Φ0, W0, B0, A0, r_max)
|
function boundaryValue(κ, p, E, Φ0, W0, B0, A0, r_max; dtype=Float64, algo=RK4())
|
||||||
prob = ODEProblem(dirac!, [0, 1], (0, r_max))
|
prob = ODEProblem(dirac!, convert.(dtype, [0, 1]), (0, r_max))
|
||||||
sol = solve(prob, RK4(), p=(κ, p, E, Φ0, W0, B0, A0), saveat=[r_max], save_idxs=[1])
|
sol = solve(prob, algo, p=(κ, p, E, Φ0, W0, B0, A0), saveat=[r_max], save_idxs=[1])
|
||||||
return sol[1, 1]
|
return sol[1, 1]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -48,6 +48,13 @@ function findEs(κ, p, Φ0, W0, B0, A0, r_max, E_min=0, E_max=(p ? M_p : M_n))
|
||||||
return find_zeros(f, (E_min, E_max))
|
return find_zeros(f, (E_min, E_max))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
"Find more precise bound energies for a given list of Es where
|
||||||
|
the other parameters are the same from dirac!(...)."
|
||||||
|
function refineEs(κ, p, Φ0, W0, B0, A0, r_max, Es)
|
||||||
|
f(E) = boundaryValue(κ, p, E, Φ0, W0, B0, A0, r_max; dtype=BigFloat, algo=Feagin12())
|
||||||
|
return [find_zero(f, E) for E in Es]
|
||||||
|
end
|
||||||
|
|
||||||
"Find all orbitals and return two lists containing κ values and corresponding energies for a single species where
|
"Find all orbitals and return two lists containing κ values and corresponding energies for a single species where
|
||||||
the other parameters are defined above"
|
the other parameters are defined above"
|
||||||
function findAllOrbitals(p, Φ0, W0, B0, A0, r_max, E_min=0, E_max=(p ? M_p : M_n))
|
function findAllOrbitals(p, Φ0, W0, B0, A0, r_max, E_min=0, E_max=(p ? M_p : M_n))
|
||||||
|
|
|
||||||
|
|
@ -21,14 +21,14 @@ r_max = maximum(xs)
|
||||||
E_min = 880
|
E_min = 880
|
||||||
E_max = 939
|
E_max = 939
|
||||||
|
|
||||||
boundEs = findEs(κ, p, S_interp, V_interp, R_interp, A_interp, r_max, E_min, E_max)
|
approxE = findEs(κ, p, S_interp, V_interp, R_interp, A_interp, r_max, E_min, E_max) |> minimum
|
||||||
groundE = minimum(boundEs)
|
groundE = refineEs(κ, p, S_interp, V_interp, R_interp, A_interp, r_max, [approxE])[1]
|
||||||
|
|
||||||
println("ground state E = $groundE")
|
println("ground state E = $groundE")
|
||||||
|
|
||||||
plot_r_max = r_max * 0.75
|
|
||||||
divs = 50
|
divs = 50
|
||||||
wf = solveWf(κ, p, groundE, S_interp, V_interp, R_interp, A_interp, plot_r_max, divs)
|
wf = solveWf(κ, p, groundE, S_interp, V_interp, R_interp, A_interp, r_max, divs)
|
||||||
rs = collect(0: plot_r_max/divs : plot_r_max)
|
rs = range(0, r_max, length=divs+1)
|
||||||
gs = wf[1, :]
|
gs = wf[1, :]
|
||||||
fs = wf[2, :]
|
fs = wf[2, :]
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue