We compute a few eigenvalues of the dielectric matrix ($q=0$, $ω=0$) iteratively.
using DFTK
using Plots
using KrylovKit
using Printf
# Calculation parameters
kgrid = [1, 1, 1]
Ecut = 5
# Silicon lattice
a = 10.26
lattice = a / 2 .* [[0 1 1.]; [1 0 1.]; [1 1 0.]]
Si = ElementPsp(:Si, psp=load_psp("hgh/lda/Si-q4"))
atoms = [Si, Si]
positions = [ones(3)/8, -ones(3)/8]
# Compute the dielectric operator without symmetries
model = model_LDA(lattice, atoms, positions, symmetries=false)
basis = PlaneWaveBasis(model; Ecut, kgrid)
scfres = self_consistent_field(basis, tol=1e-8);
n Energy log10(ΔE) log10(Δρ) Diag Δtime --- --------------- --------- --------- ---- ------ 1 -7.232797979692 -0.50 6.0 2 -7.249367036029 -1.78 -1.39 1.0 10.0ms 3 -7.250972694135 -2.79 -1.82 2.0 11.6ms 4 -7.250953560013 + -4.72 -1.87 2.0 12.1ms 5 -7.251315577644 -3.44 -2.48 1.0 10.1ms 6 -7.251337763936 -4.65 -3.06 1.0 10.0ms 7 -7.251338657416 -6.05 -3.59 1.0 10.0ms 8 -7.251338783761 -6.90 -3.89 2.0 11.8ms 9 -7.251338796349 -7.90 -4.32 1.0 10.4ms 10 -7.251338798482 -8.67 -4.97 2.0 11.9ms 11 -7.251338798634 -9.82 -5.05 3.0 13.8ms 12 -7.251338798692 -10.23 -5.55 1.0 10.5ms 13 -7.251338798698 -11.23 -5.60 3.0 14.0ms 14 -7.251338798704 -11.23 -6.22 1.0 10.5ms 15 -7.251338798705 -12.16 -6.98 3.0 14.0ms 16 -7.251338798705 -13.91 -7.16 2.0 12.0ms 17 -7.251338798705 -14.45 -7.44 1.0 10.3ms 18 -7.251338798705 + -Inf -8.05 2.0 12.3ms
Applying $ε^† ≔ (1- χ_0 K)$ …
function eps_fun(δρ)
δV = apply_kernel(basis, δρ; ρ=scfres.ρ)
χ0δV = apply_χ0(scfres, δV)
δρ - χ0δV
end;
… eagerly diagonalizes the subspace matrix at each iteration
eigsolve(eps_fun, randn(size(scfres.ρ)), 5, :LM; eager=true, verbosity=3);
[ Info: Arnoldi iteration step 1: normres = 0.06198435834205509 [ Info: Arnoldi iteration step 2: normres = 0.5158645562562821 [ Info: Arnoldi iteration step 3: normres = 0.8459982776164054 [ Info: Arnoldi iteration step 4: normres = 0.19587794323692703 [ Info: Arnoldi iteration step 5: normres = 0.40686045264409537 [ Info: Arnoldi schursolve in iter 1, krylovdim = 5: 0 values converged, normres = (1.47e-02, 3.02e-02, 3.49e-01, 2.06e-01, 1.02e-02) [ Info: Arnoldi iteration step 6: normres = 0.37411436293354805 [ Info: Arnoldi schursolve in iter 1, krylovdim = 6: 0 values converged, normres = (4.99e-03, 2.61e-01, 2.25e-01, 1.03e-01, 3.41e-02) [ Info: Arnoldi iteration step 7: normres = 0.09537329598050488 [ Info: Arnoldi schursolve in iter 1, krylovdim = 7: 0 values converged, normres = (2.53e-04, 2.84e-02, 6.29e-03, 6.85e-02, 5.49e-02) [ Info: Arnoldi iteration step 8: normres = 0.12263535557645752 [ Info: Arnoldi schursolve in iter 1, krylovdim = 8: 0 values converged, normres = (1.33e-05, 2.44e-03, 6.13e-04, 2.49e-02, 3.67e-02) [ Info: Arnoldi iteration step 9: normres = 0.07015692665996354 [ Info: Arnoldi schursolve in iter 1, krylovdim = 9: 0 values converged, normres = (4.11e-07, 1.26e-04, 3.53e-05, 7.16e-03, 3.61e-02) [ Info: Arnoldi iteration step 10: normres = 0.09549714432971323 [ Info: Arnoldi schursolve in iter 1, krylovdim = 10: 0 values converged, normres = (1.72e-08, 8.79e-06, 2.75e-06, 2.61e-03, 3.31e-02) [ Info: Arnoldi iteration step 11: normres = 0.07107279716594946 [ Info: Arnoldi schursolve in iter 1, krylovdim = 11: 0 values converged, normres = (5.24e-10, 4.37e-07, 1.52e-07, 5.94e-04, 1.60e-02) [ Info: Arnoldi iteration step 12: normres = 0.066254625964104 [ Info: Arnoldi schursolve in iter 1, krylovdim = 12: 0 values converged, normres = (1.47e-11, 2.00e-08, 7.67e-09, 1.11e-04, 5.40e-03) [ Info: Arnoldi iteration step 13: normres = 0.060141829679643835 [ Info: Arnoldi schursolve in iter 1, krylovdim = 13: 1 values converged, normres = (3.78e-13, 8.35e-10, 3.55e-10, 1.96e-05, 1.75e-03) [ Info: Arnoldi iteration step 14: normres = 0.6752175667957129 [ Info: Arnoldi schursolve in iter 1, krylovdim = 14: 1 values converged, normres = (1.61e-13, 8.30e-10, 4.44e-10, 6.64e-01, 4.36e-02) [ Info: Arnoldi iteration step 15: normres = 0.06571931169706294 [ Info: Arnoldi schursolve in iter 1, krylovdim = 15: 1 values converged, normres = (6.68e-15, 1.89e-10, 4.10e-02, 1.29e-03, 3.63e-05) [ Info: Arnoldi iteration step 16: normres = 0.6601214999636914 [ Info: Arnoldi schursolve in iter 1, krylovdim = 16: 1 values converged, normres = (3.44e-15, 3.37e-10, 1.07e-01, 1.12e-02, 6.49e-01) [ Info: Arnoldi iteration step 17: normres = 0.03540273724803503 [ Info: Arnoldi schursolve in iter 1, krylovdim = 17: 1 values converged, normres = (7.09e-17, 6.45e-09, 1.72e-02, 7.25e-06, 5.38e-03) [ Info: Arnoldi iteration step 18: normres = 0.01599247542469627 [ Info: Arnoldi schursolve in iter 1, krylovdim = 18: 1 values converged, normres = (4.70e-19, 1.81e-08, 1.82e-04, 3.23e-05, 5.21e-05) [ Info: Arnoldi iteration step 19: normres = 0.19244883663341256 [ Info: Arnoldi schursolve in iter 1, krylovdim = 19: 1 values converged, normres = (3.89e-20, 9.86e-06, 2.27e-05, 9.77e-09, 9.25e-06) [ Info: Arnoldi iteration step 20: normres = 0.05594731736472959 [ Info: Arnoldi schursolve in iter 1, krylovdim = 20: 1 values converged, normres = (1.04e-21, 9.71e-09, 1.17e-06, 3.59e-07, 3.43e-07) [ Info: Arnoldi iteration step 21: normres = 0.028143217504210106 [ Info: Arnoldi schursolve in iter 1, krylovdim = 21: 1 values converged, normres = (1.22e-23, 7.30e-09, 2.10e-08, 9.18e-10, 1.04e-08) [ Info: Arnoldi iteration step 22: normres = 0.02605433776547058 [ Info: Arnoldi schursolve in iter 1, krylovdim = 22: 1 values converged, normres = (1.31e-25, 8.02e-11, 3.73e-10, 2.36e-11, 1.96e-10) [ Info: Arnoldi iteration step 23: normres = 0.6633721844226979 [ Info: Arnoldi schursolve in iter 1, krylovdim = 23: 1 values converged, normres = (5.21e-26, 7.00e-11, 3.25e-10, 2.50e-11, 2.08e-10) [ Info: Arnoldi iteration step 24: normres = 0.01921959552375744 [ Info: Arnoldi schursolve in iter 1, krylovdim = 24: 1 values converged, normres = (6.53e-28, 4.74e-12, 2.20e-11, 2.46e-10, 2.06e-09) [ Info: Arnoldi iteration step 25: normres = 0.03686838831214523 [ Info: Arnoldi schursolve in iter 1, krylovdim = 25: 3 values converged, normres = (9.90e-30, 1.15e-13, 5.34e-13, 2.98e-05, 2.37e-04) [ Info: Arnoldi iteration step 26: normres = 0.06820801126164587 [ Info: Arnoldi schursolve in iter 1, krylovdim = 26: 3 values converged, normres = (3.05e-31, 5.99e-15, 2.78e-14, 1.35e-05, 1.02e-05) [ Info: Arnoldi iteration step 27: normres = 0.03017217897859313 [ Info: Arnoldi schursolve in iter 1, krylovdim = 27: 3 values converged, normres = (3.81e-33, 1.20e-16, 5.58e-16, 2.68e-09, 2.18e-08) [ Info: Arnoldi iteration step 28: normres = 0.09352966133290364 [ Info: Arnoldi schursolve in iter 1, krylovdim = 28: 3 values converged, normres = (1.55e-34, 8.09e-18, 3.76e-17, 4.31e-10, 1.69e-08) [ Info: Arnoldi iteration step 29: normres = 0.03653691232545321 [ Info: Arnoldi schursolve in iter 1, krylovdim = 29: 3 values converged, normres = (2.38e-36, 2.00e-19, 9.29e-19, 7.52e-12, 8.57e-10) [ Info: Arnoldi iteration step 30: normres = 0.19178918475219967 [ Info: Arnoldi schursolve in iter 1, krylovdim = 30: 3 values converged, normres = (2.14e-37, 3.15e-20, 1.46e-19, 1.32e-12, 1.52e-10) [ Info: Arnoldi schursolve in iter 2, krylovdim = 19: 3 values converged, normres = (2.14e-37, 3.15e-20, 1.46e-19, 1.32e-12, 1.52e-10) [ Info: Arnoldi iteration step 20: normres = 0.04558371531091134 [ Info: Arnoldi schursolve in iter 2, krylovdim = 20: 4 values converged, normres = (4.26e-39, 1.04e-21, 4.84e-21, 4.89e-14, 5.61e-12) [ Info: Arnoldi iteration step 21: normres = 0.07873596414034613 ┌ Info: Arnoldi eigsolve finished after 2 iterations: │ * 6 eigenvalues converged │ * norm of residuals = (1.428561320805377e-40, 5.711665972977044e-23, 2.63581390873658e-22, 2.9658733101081714e-15, 3.404235781471831e-13, 1.6997031325785676e-13) └ * number of operations = 32