{ "cells": [ { "cell_type": "markdown", "source": [ "# Eigenvalues of the dielectric matrix\n", "\n", "We compute a few eigenvalues of the dielectric matrix ($q=0$, $ω=0$) iteratively." ], "metadata": {} }, { "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "n Energy log10(ΔE) log10(Δρ) Diag Δtime\n", "--- --------------- --------- --------- ---- ------\n", " 1 -7.232993692324 -0.50 7.0 \n", " 2 -7.249581092803 -1.78 -1.40 1.0 7.01ms\n", " 3 -7.251072239149 -2.83 -1.88 2.0 8.26ms\n", " 4 -7.251011770409 + -4.22 -1.90 1.0 6.99ms\n", " 5 -7.251329914374 -3.50 -2.72 1.0 50.3ms\n", " 6 -7.251337729214 -5.11 -3.13 2.0 8.07ms\n", " 7 -7.251338701750 -6.01 -3.57 2.0 8.57ms\n", " 8 -7.251338788850 -7.06 -4.13 1.0 7.22ms\n", " 9 -7.251338796977 -8.09 -4.47 2.0 8.74ms\n", " 10 -7.251338798470 -8.83 -5.00 1.0 7.24ms\n", " 11 -7.251338798695 -9.65 -5.51 2.0 8.96ms\n", " 12 -7.251338798702 -11.16 -5.87 1.0 7.42ms\n", " 13 -7.251338798704 -11.65 -6.26 2.0 8.77ms\n", " 14 -7.251338798705 -12.34 -6.93 2.0 8.87ms\n", " 15 -7.251338798705 -13.51 -7.48 3.0 10.5ms\n", " 16 -7.251338798705 + -14.75 -8.04 2.0 8.86ms\n" ] } ], "cell_type": "code", "source": [ "using DFTK\n", "using Plots\n", "using KrylovKit\n", "using Printf\n", "\n", "# Calculation parameters\n", "kgrid = [1, 1, 1]\n", "Ecut = 5\n", "\n", "# Silicon lattice\n", "a = 10.26\n", "lattice = a / 2 .* [[0 1 1.]; [1 0 1.]; [1 1 0.]]\n", "Si = ElementPsp(:Si, psp=load_psp(\"hgh/lda/Si-q4\"))\n", "atoms = [Si, Si]\n", "positions = [ones(3)/8, -ones(3)/8]\n", "\n", "# Compute the dielectric operator without symmetries\n", "model = model_LDA(lattice, atoms, positions, symmetries=false)\n", "basis = PlaneWaveBasis(model; Ecut, kgrid)\n", "scfres = self_consistent_field(basis, tol=1e-8);" ], "metadata": {}, "execution_count": 1 }, { "cell_type": "markdown", "source": [ "Applying $ε^† ≔ (1- χ_0 K)$ …" ], "metadata": {} }, { "outputs": [], "cell_type": "code", "source": [ "function eps_fun(δρ)\n", " δV = apply_kernel(basis, δρ; ρ=scfres.ρ)\n", " χ0δV = apply_χ0(scfres, δV)\n", " δρ - χ0δV\n", "end;" ], "metadata": {}, "execution_count": 2 }, { "cell_type": "markdown", "source": [ "… eagerly diagonalizes the subspace matrix at each iteration" ], "metadata": {} }, { "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ Info: Arnoldi iteration step 1: normres = 0.05786104761270987\n", "[ Info: Arnoldi iteration step 2: normres = 0.7212084074816676\n", "[ Info: Arnoldi iteration step 3: normres = 0.655478199457947\n", "[ Info: Arnoldi iteration step 4: normres = 0.21694125027914068\n", "[ Info: Arnoldi iteration step 5: normres = 0.3273328140708042\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 5: 0 values converged, normres = (8.74e-03, 4.69e-02, 2.55e-01, 1.99e-01, 4.99e-03)\n", "[ Info: Arnoldi iteration step 6: normres = 0.5660839287260718\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 6: 0 values converged, normres = (3.93e-03, 1.36e-01, 5.04e-01, 1.34e-01, 1.69e-01)\n", "[ Info: Arnoldi iteration step 7: normres = 0.07299570772088708\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 7: 0 values converged, normres = (1.72e-04, 3.34e-02, 1.19e-02, 4.40e-02, 3.36e-02)\n", "[ Info: Arnoldi iteration step 8: normres = 0.09789435002333843\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 8: 0 values converged, normres = (7.31e-06, 2.33e-03, 9.25e-04, 1.36e-02, 2.42e-02)\n", "[ Info: Arnoldi iteration step 9: normres = 0.09124814097284249\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 9: 0 values converged, normres = (2.88e-07, 1.52e-04, 6.67e-05, 4.27e-03, 2.91e-02)\n", "[ Info: Arnoldi iteration step 10: normres = 0.0903190360596701\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 10: 0 values converged, normres = (1.15e-08, 1.02e-05, 4.99e-06, 1.60e-03, 4.88e-02)\n", "[ Info: Arnoldi iteration step 11: normres = 0.07395055446269212\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 11: 0 values converged, normres = (3.67e-10, 5.30e-07, 2.88e-07, 3.93e-04, 2.46e-02)\n", "[ Info: Arnoldi iteration step 12: normres = 0.07823820455542502\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 12: 0 values converged, normres = (1.23e-11, 2.92e-08, 1.76e-08, 9.73e-05, 1.15e-02)\n", "[ Info: Arnoldi iteration step 13: normres = 0.046727849693438225\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 13: 1 values converged, normres = (2.43e-13, 9.30e-10, 6.21e-10, 1.24e-05, 2.58e-03)\n", "[ Info: Arnoldi iteration step 14: normres = 0.6863531329154221\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 14: 1 values converged, normres = (1.11e-13, 1.07e-09, 9.34e-10, 6.81e-01, 1.46e-02)\n", "[ Info: Arnoldi iteration step 15: normres = 0.1182029571279364\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 15: 1 values converged, normres = (8.16e-15, 5.66e-10, 7.04e-02, 3.94e-04, 3.69e-05)\n", "[ Info: Arnoldi iteration step 16: normres = 0.42980120181790904\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 16: 1 values converged, normres = (3.24e-15, 2.01e-09, 2.02e-01, 7.13e-03, 3.77e-01)\n", "[ Info: Arnoldi iteration step 17: normres = 0.02747153694086166\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 17: 1 values converged, normres = (4.19e-17, 1.04e-08, 6.48e-03, 3.07e-07, 5.52e-03)\n", "[ Info: Arnoldi iteration step 18: normres = 0.021908266718919704\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 18: 1 values converged, normres = (3.77e-19, 4.95e-08, 9.31e-05, 3.56e-05, 7.95e-05)\n", "[ Info: Arnoldi iteration step 19: normres = 0.21679994960800547\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 19: 1 values converged, normres = (3.59e-20, 1.24e-05, 7.92e-06, 3.25e-08, 1.53e-05)\n", "[ Info: Arnoldi iteration step 20: normres = 0.06245063676753702\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 20: 1 values converged, normres = (1.05e-21, 2.29e-08, 7.59e-07, 8.87e-07, 1.29e-07)\n", "[ Info: Arnoldi iteration step 21: normres = 0.024320461106877883\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 21: 1 values converged, normres = (1.07e-23, 8.88e-09, 8.57e-09, 5.50e-09, 1.51e-08)\n", "[ Info: Arnoldi iteration step 22: normres = 0.014865946546674072\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 22: 1 values converged, normres = (6.51e-26, 1.11e-10, 4.50e-11, 3.75e-11, 1.68e-10)\n", "[ Info: Arnoldi iteration step 23: normres = 0.15140592054861735\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 23: 1 values converged, normres = (4.07e-27, 1.11e-11, 4.50e-12, 4.14e-12, 1.85e-11)\n", "[ Info: Arnoldi iteration step 24: normres = 0.1443291244053131\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 24: 1 values converged, normres = (6.53e-28, 1.06e-11, 4.30e-12, 5.95e-11, 2.67e-10)\n", "[ Info: Arnoldi iteration step 25: normres = 0.09401840301007694\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 25: 3 values converged, normres = (2.18e-29, 7.12e-13, 2.88e-13, 1.58e-10, 7.00e-10)\n", "[ Info: Arnoldi iteration step 26: normres = 0.03724897199763652\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 26: 3 values converged, normres = (3.64e-31, 2.01e-14, 8.13e-15, 8.66e-05, 1.20e-04)\n", "[ Info: Arnoldi iteration step 27: normres = 0.01669706130720581\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 27: 3 values converged, normres = (2.49e-33, 2.20e-16, 8.88e-17, 8.62e-11, 3.90e-10)\n", "[ Info: Arnoldi iteration step 28: normres = 0.0956751599905577\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 28: 3 values converged, normres = (1.00e-34, 1.43e-17, 5.79e-18, 9.42e-11, 5.23e-10)\n", "[ Info: Arnoldi iteration step 29: normres = 0.021527488961754666\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 29: 3 values converged, normres = (9.39e-37, 2.21e-19, 8.93e-20, 1.01e-11, 1.73e-09)\n", "[ Info: Arnoldi iteration step 30: normres = 0.030566576810141025\n", "[ Info: Arnoldi schursolve in iter 1, krylovdim = 30: 4 values converged, normres = (1.18e-38, 4.43e-21, 1.79e-21, 2.27e-13, 9.51e-11)\n", "[ Info: Arnoldi schursolve in iter 2, krylovdim = 19: 4 values converged, normres = (1.18e-38, 4.43e-21, 1.79e-21, 2.27e-13, 9.51e-11)\n", "[ Info: Arnoldi iteration step 20: normres = 0.19410303228968878\n", "[ Info: Arnoldi schursolve in iter 2, krylovdim = 20: 4 values converged, normres = (1.04e-39, 6.57e-22, 2.66e-22, 3.76e-14, 1.58e-11)\n", "[ Info: Arnoldi iteration step 21: normres = 0.11972686543373572\n", "[ Info: Arnoldi schursolve in iter 2, krylovdim = 21: 4 values converged, normres = (5.76e-41, 6.36e-23, 2.57e-23, 4.11e-15, 1.72e-12)\n", "[ Info: Arnoldi iteration step 22: normres = 0.02133925507091388\n", "┌ Info: Arnoldi eigsolve finished after 2 iterations:\n", "│ * 6 eigenvalues converged\n", "│ * norm of residuals = (5.245439753977714e-43, 9.487670557440135e-25, 4.690810676852894e-25, 6.813651634105719e-17, 2.785047502003835e-14, 9.159985879503366e-15)\n", "└ * number of operations = 33\n" ] } ], "cell_type": "code", "source": [ "eigsolve(eps_fun, randn(size(scfres.ρ)), 5, :LM; eager=true, verbosity=3);" ], "metadata": {}, "execution_count": 3 } ], "nbformat_minor": 3, "metadata": { "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.9.0" }, "kernelspec": { "name": "julia-1.9", "display_name": "Julia 1.9.0", "language": "julia" } }, "nbformat": 4 }