Eigenvalues of the dielectric matrix

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.234478649958                   -0.50    8.0
  2   -7.250171245484       -1.80       -1.40    1.0   6.85ms
  3   -7.251011182982       -3.08       -1.96    1.0   6.87ms
  4   -7.251066942492       -4.25       -1.93    2.0   8.53ms
  5   -7.251326110505       -3.59       -2.56    1.0   7.23ms
  6   -7.251338118449       -4.92       -3.15    1.0   7.08ms
  7   -7.251338693024       -6.24       -3.51    2.0   8.57ms
  8   -7.251338786124       -7.03       -4.00    2.0   8.44ms
  9   -7.251338797098       -7.96       -4.55    1.0   7.16ms
 10   -7.251338798614       -8.82       -5.05    2.0   9.09ms
 11   -7.251338798695      -10.09       -5.59    1.0   7.52ms
 12   -7.251338798701      -11.26       -5.74    2.0   8.84ms
 13   -7.251338798704      -11.50       -6.18    1.0   7.55ms
 14   -7.251338798704      -12.18       -6.68    2.0   9.02ms
 15   -7.251338798705      -13.30       -7.34    1.0   7.34ms
 16   -7.251338798705      -14.75       -7.64    3.0   10.0ms
 17   -7.251338798705      -15.05       -8.16    1.0   72.2ms

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.030486242182288893
[ Info: Arnoldi iteration step 2: normres = 0.6913080248779351
[ Info: Arnoldi iteration step 3: normres = 0.8315541251777673
[ Info: Arnoldi iteration step 4: normres = 0.33015558079865276
[ Info: Arnoldi iteration step 5: normres = 0.36029168496979086
[ Info: Arnoldi schursolve in iter 1, krylovdim = 5: 0 values converged, normres = (3.90e-02, 5.84e-02, 2.83e-01, 2.10e-01, 2.54e-02)
[ Info: Arnoldi iteration step 6: normres = 0.45068540331271567
[ Info: Arnoldi schursolve in iter 1, krylovdim = 6: 0 values converged, normres = (1.37e-02, 7.97e-02, 4.10e-01, 1.31e-01, 6.59e-02)
[ Info: Arnoldi iteration step 7: normres = 0.10274256649914587
[ Info: Arnoldi schursolve in iter 1, krylovdim = 7: 0 values converged, normres = (7.85e-04, 1.55e-02, 4.09e-02, 7.12e-02, 5.17e-02)
[ Info: Arnoldi iteration step 8: normres = 0.09517715295369383
[ Info: Arnoldi schursolve in iter 1, krylovdim = 8: 0 values converged, normres = (3.24e-05, 1.07e-03, 3.08e-03, 2.18e-02, 3.49e-02)
[ Info: Arnoldi iteration step 9: normres = 0.08085198857239494
[ Info: Arnoldi schursolve in iter 1, krylovdim = 9: 0 values converged, normres = (1.13e-06, 6.17e-05, 1.97e-04, 5.93e-03, 3.00e-02)
[ Info: Arnoldi iteration step 10: normres = 0.09395004241777424
[ Info: Arnoldi schursolve in iter 1, krylovdim = 10: 0 values converged, normres = (4.64e-08, 4.18e-06, 1.49e-05, 1.98e-03, 3.40e-02)
[ Info: Arnoldi iteration step 11: normres = 0.09075824011603416
[ Info: Arnoldi schursolve in iter 1, krylovdim = 11: 0 values converged, normres = (1.85e-09, 2.78e-07, 1.10e-06, 7.32e-04, 4.23e-02)
[ Info: Arnoldi iteration step 12: normres = 0.07754267943013957
[ Info: Arnoldi schursolve in iter 1, krylovdim = 12: 0 values converged, normres = (6.17e-11, 1.52e-08, 6.70e-08, 1.82e-04, 2.12e-02)
[ Info: Arnoldi iteration step 13: normres = 0.03486503841674215
[ Info: Arnoldi schursolve in iter 1, krylovdim = 13: 1 values converged, normres = (9.12e-13, 3.66e-10, 1.78e-09, 1.84e-05, 3.95e-03)
[ Info: Arnoldi iteration step 14: normres = 0.7140210884611637
[ Info: Arnoldi schursolve in iter 1, krylovdim = 14: 1 values converged, normres = (3.45e-13, 2.67e-10, 1.52e-09, 7.09e-01, 1.47e-02)
[ Info: Arnoldi iteration step 15: normres = 0.06792027948492378
[ Info: Arnoldi schursolve in iter 1, krylovdim = 15: 1 values converged, normres = (1.99e-14, 1.32e-09, 5.40e-02, 2.48e-05, 5.86e-05)
[ Info: Arnoldi iteration step 16: normres = 0.6335492321064565
[ Info: Arnoldi schursolve in iter 1, krylovdim = 16: 1 values converged, normres = (6.71e-15, 1.15e-09, 3.53e-02, 6.00e-05, 5.99e-01)
[ Info: Arnoldi iteration step 17: normres = 0.04837002859044906
[ Info: Arnoldi schursolve in iter 1, krylovdim = 17: 1 values converged, normres = (2.44e-16, 3.39e-08, 8.10e-03, 1.85e-05, 3.60e-02)
[ Info: Arnoldi iteration step 18: normres = 0.020326641274435515
[ Info: Arnoldi schursolve in iter 1, krylovdim = 18: 1 values converged, normres = (2.04e-18, 1.06e-04, 2.23e-05, 2.13e-04, 4.84e-04)
[ Info: Arnoldi iteration step 19: normres = 0.10792425537125168
[ Info: Arnoldi schursolve in iter 1, krylovdim = 19: 1 values converged, normres = (9.20e-20, 1.66e-08, 7.85e-06, 2.16e-08, 4.23e-05)
[ Info: Arnoldi iteration step 20: normres = 0.11540792802384545
[ Info: Arnoldi schursolve in iter 1, krylovdim = 20: 1 values converged, normres = (5.16e-21, 2.60e-07, 7.46e-07, 6.15e-07, 4.81e-06)
[ Info: Arnoldi iteration step 21: normres = 0.026930119762307823
[ Info: Arnoldi schursolve in iter 1, krylovdim = 21: 1 values converged, normres = (5.87e-23, 2.61e-09, 1.44e-08, 6.88e-08, 7.19e-08)
[ Info: Arnoldi iteration step 22: normres = 0.015439594275496297
[ Info: Arnoldi schursolve in iter 1, krylovdim = 22: 1 values converged, normres = (3.73e-25, 1.99e-11, 1.47e-10, 8.31e-10, 7.33e-10)
[ Info: Arnoldi iteration step 23: normres = 0.3230769711709697
[ Info: Arnoldi schursolve in iter 1, krylovdim = 23: 1 values converged, normres = (5.08e-26, 4.39e-12, 3.23e-11, 1.91e-10, 1.91e-10)
[ Info: Arnoldi iteration step 24: normres = 0.05420182326602657
[ Info: Arnoldi schursolve in iter 1, krylovdim = 24: 1 values converged, normres = (2.56e-27, 1.62e-12, 1.19e-11, 1.92e-08, 2.07e-08)
[ Info: Arnoldi iteration step 25: normres = 0.015510144018129042
[ Info: Arnoldi schursolve in iter 1, krylovdim = 25: 3 values converged, normres = (1.63e-29, 1.65e-14, 1.21e-13, 6.76e-09, 1.62e-08)
[ Info: Arnoldi iteration step 26: normres = 0.10355532090420419
[ Info: Arnoldi schursolve in iter 1, krylovdim = 26: 3 values converged, normres = (7.06e-31, 1.16e-15, 8.51e-15, 1.53e-05, 2.63e-05)
[ Info: Arnoldi iteration step 27: normres = 0.030398207470579117
[ Info: Arnoldi schursolve in iter 1, krylovdim = 27: 3 values converged, normres = (9.56e-33, 2.63e-17, 1.93e-16, 1.45e-07, 1.40e-08)
[ Info: Arnoldi iteration step 28: normres = 0.050109472613595586
[ Info: Arnoldi schursolve in iter 1, krylovdim = 28: 3 values converged, normres = (1.97e-34, 8.62e-19, 6.34e-18, 9.04e-09, 1.34e-08)
[ Info: Arnoldi iteration step 29: normres = 0.14421826923406125
[ Info: Arnoldi schursolve in iter 1, krylovdim = 29: 3 values converged, normres = (1.31e-35, 9.94e-20, 7.31e-19, 4.42e-09, 2.11e-09)
[ Info: Arnoldi iteration step 30: normres = 0.11975352256034372
[ Info: Arnoldi schursolve in iter 1, krylovdim = 30: 3 values converged, normres = (7.25e-37, 9.46e-21, 6.96e-20, 4.88e-10, 3.12e-10)
[ Info: Arnoldi schursolve in iter 2, krylovdim = 19: 3 values converged, normres = (7.25e-37, 9.46e-21, 6.96e-20, 4.88e-10, 3.12e-10)
[ Info: Arnoldi iteration step 20: normres = 0.049846088991676904
[ Info: Arnoldi schursolve in iter 2, krylovdim = 20: 3 values converged, normres = (1.55e-38, 3.31e-22, 2.43e-21, 1.87e-11, 1.25e-11)
[ Info: Arnoldi iteration step 21: normres = 0.0763460035907213
[ Info: Arnoldi schursolve in iter 2, krylovdim = 21: 3 values converged, normres = (5.07e-40, 1.78e-23, 1.31e-22, 1.11e-12, 7.49e-13)
[ Info: Arnoldi iteration step 22: normres = 0.015338319529993571
┌ Info: Arnoldi eigsolve finished after 2 iterations:
│ *  6 eigenvalues converged
│ *  norm of residuals = (3.2516026580614316e-42, 1.8387330884594443e-25, 1.3233999554401576e-24, 1.2679624756329092e-14, 8.25184799001653e-15, 3.370235314928955e-15)
└ *  number of operations = 33