|
struct ShiftAndInvert{TA,TB,TT} |
|
A⁻¹::TA |
|
B::TB |
|
temp::TT |
|
end |
|
|
|
Base.size(S::ShiftAndInvert, args...) = size(S.A⁻¹, args...) |
|
Base.eltype(S::ShiftAndInvert) = eltype(S.A⁻¹) |
|
|
|
function LinearAlgebra.mul!(y,M::ShiftAndInvert,x) |
|
mul!(M.temp, M.B, x) |
|
ldiv!(y, M.A⁻¹, M.temp) |
|
end |
|
|
|
construct_linear_map(A,B,σ=0) = |
|
ShiftAndInvert(factorize(A-σ*B),B,Vector{eltype(A)}(undef, size(A,1))) |
|
|
|
function bsplines_hydrogen_eigenstates() |
|
|
|
k = 7 |
|
N = 31 |
|
|
|
a,b = 0,70 |
|
|
|
coulomb(r) = -1/r |
|
|
|
nev = 5 |
|
σ = -0.5 |
|
|
|
n = 1:nev |
|
|
|
cfigure("Hydrogen", figsize=(7,9)) do |
|
for (j,(t,x,tol)) in enumerate([(LinearKnotSet(k, a, b, N), |
|
range(a, stop=b, length=500)[2:end-1], |
|
9e-3), |
|
(ExpKnotSet(k, -1.0, log10(b), N), |
|
10 .^ range(-1.0, stop=log10(b), length=500)[2:end-1], |
|
2e-7)]) |
|
B = BSpline(t)[:,2:end-1] |
|
xx = axes(B, 1) |
|
S = B'B |
|
|
|
χ = B[x,:] |
|
|
|
D = Derivative(xx) |
|
|
|
∇² = B'*D'*D*B |
|
|
|
T = -∇²/2 |
|
|
|
V = B'*QuasiDiagonal(coulomb.(xx))*B |
|
|
|
H = T + V |
|
|
|
schurQR,history = partialschur(construct_linear_map(H, S, σ), nev=nev) |
Should use built-in functionality instead of duplicating
CompactBases.jl/docs/bspline_plots.jl
Lines 458 to 512 in b022394