From 42479543eb1b824916b6652a79d2a30a7a47d2ab Mon Sep 17 00:00:00 2001 From: antoniolrm <am@antoniomanesco.org> Date: Fri, 1 Sep 2023 13:52:07 +0200 Subject: [PATCH] update tests --- analysis/coarse_k_point_implementation.ipynb | 780 +++++++++++++----- analysis/graphene_test_extended_hubbard.ipynb | 252 +++--- 2 files changed, 683 insertions(+), 349 deletions(-) diff --git a/analysis/coarse_k_point_implementation.ipynb b/analysis/coarse_k_point_implementation.ipynb index 8da464f..f9ad770 100644 --- a/analysis/coarse_k_point_implementation.ipynb +++ b/analysis/coarse_k_point_implementation.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "cb509096-42c6-4a45-8dc4-a8eed3116e67", "metadata": { "tags": [] @@ -12,14 +12,25 @@ "import kwant\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", - "\n", - "\n", + "import utils, hf" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8a550e7e-e90b-4443-99a4-315f96539ac4", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ "s0 = np.identity(2)\n", "sz = np.diag([1, -1])\n", "\n", + "norbs = 2\n", "\n", "graphene = kwant.lattice.general(\n", - " [[1, 0], [1 / 2, np.sqrt(3) / 2]], [[0, 0], [0, 1 / np.sqrt(3)]]\n", + " [[1, 0], [1 / 2, np.sqrt(3) / 2]], [[0, 0], [0, 1 / np.sqrt(3)]], norbs=norbs\n", ")\n", "a, b = graphene.sublattices\n", "\n", @@ -32,85 +43,16 @@ "bulk_graphene[b.shape((lambda pos: True), (0, 0))] = -m0 * s0\n", "# add hoppings between sublattices\n", "bulk_graphene[graphene.neighbors(1)] = s0\n", + "bulk_graphene[graphene.neighbors(2)] = 1j * s0\n", "\n", "# use kwant wraparound to sample bulk k-space\n", - "wrapped_syst_unfinalized = kwant.wraparound.wraparound(bulk_graphene)\n", - "wrapped_syst = kwant.wraparound.wraparound(bulk_graphene).finalized()\n", - "\n", - "\n", - "# return a hamiltonian for a given kx, ky\n", - "@np.vectorize\n", - "def hamiltonian_return(kx, ky, params={}):\n", - " ham = wrapped_syst.hamiltonian_submatrix(params={**params, **dict(k_x=kx, k_y=ky)})\n", - " return ham" - ] - }, - { - "cell_type": "markdown", - "id": "06cecbbe-50e9-4480-b66a-f5203e40937c", - "metadata": {}, - "source": [ - "Now we sample the non-interacting hamiltonian on a k-grid:" + "wrapped_syst = kwant.wraparound.wraparound(bulk_graphene)\n", + "wrapped_fsyst = wrapped_syst.finalized()" ] }, { "cell_type": "code", - "execution_count": 32, - "id": "708cebac-61ad-4cf1-8432-4302d91954b9", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "def mean_field_F(vals, vecs, E_F):\n", - " N_ks = vecs.shape[0]\n", - " unocc_vals = vals > E_F\n", - "\n", - " def mf_generator(i, j):\n", - " occ_vecs = vecs[i, j]\n", - " occ_vecs[:, unocc_vals[i, j]] = 0\n", - " F_ij = occ_vecs @ occ_vecs.conj().T\n", - " return F_ij\n", - "\n", - " F = np.array([[mf_generator(i, j) for i in range(N_ks)] for j in range(N_ks)])\n", - " return F\n", - "\n", - "\n", - "def get_fermi_energy(vals, filling):\n", - " norbs = vals.shape[-1]\n", - " vals_flat = np.sort(vals.flatten())\n", - " ne = len(vals_flat)\n", - " ifermi = int(round(ne * filling / norbs))\n", - " if ifermi >= ne:\n", - " ifermi = ne - 1\n", - " sorte = np.sort(vals_flat) # sorted eigenvalues\n", - " if ifermi == 0:\n", - " return sorte[0]\n", - " fermi = (sorte[ifermi - 1] + sorte[ifermi]) / 2.0 # fermi energy\n", - " return fermi\n", - "\n", - "\n", - "from scipy.signal import convolve2d\n", - "\n", - "\n", - "def convolution(M1, M2):\n", - " cell_size = M2.shape[-1]\n", - " V_output = np.array(\n", - " [\n", - " [\n", - " convolve2d(M1[:, :, i, j], M2[:, :, i, j], boundary=\"wrap\", mode=\"same\")\n", - " for i in range(cell_size)\n", - " ]\n", - " for j in range(cell_size)\n", - " ]\n", - " )\n", - " V_output = np.transpose(V_output, axes=(2, 3, 0, 1))\n", - " return V_output" - ] - }, - { - "cell_type": "code", - "execution_count": 33, + "execution_count": null, "id": "9cc3b32d-404f-4bc5-a338-83571c9e4c4b", "metadata": { "tags": [] @@ -120,44 +62,13 @@ "def func_onsite(site, U):\n", " return U * np.ones((2, 2))\n", "\n", - "\n", "def func_hop(site1, site2, V):\n", - " rij = np.linalg.norm(site1.pos - site2.pos)\n", - " return V * np.ones((2, 2))\n", - "\n", - "\n", - "lattice = graphene\n", - "syst = wrapped_syst_unfinalized\n", - "\n", - "\n", - "def compute_Vk(dummy_syst, kx, ky, params={}):\n", - " V = dummy_syst.hamiltonian_submatrix(params={**params, **dict(k_x=kx, k_y=ky)})\n", - " return V\n", - "\n", - "\n", - "def potential_to_hamiltonian(\n", - " syst, lattice, func_onsite, func_hop, params, nk_axis, max_neighbor=1\n", - "):\n", - " V = kwant.Builder(kwant.TranslationalSymmetry(*lattice.prim_vecs))\n", - " V[syst.sites()] = func_onsite\n", - " for neighbors in range(max_neighbor):\n", - " V[lattice.neighbors(neighbors + 1)] = func_hop\n", - " wrapped_V = kwant.wraparound.wraparound(V).finalized()\n", - "\n", - " return np.array(\n", - " [\n", - " [\n", - " compute_Vk(dummy_syst=wrapped_V, kx=kx, ky=ky, params=params)\n", - " for kx in nk_axis\n", - " ]\n", - " for ky in nk_axis\n", - " ]\n", - " )" + " return V * np.ones((2, 2))" ] }, { "cell_type": "code", - "execution_count": 34, + "execution_count": null, "id": "d1ef154e-70bd-4f28-887f-72362d8533dd", "metadata": { "tags": [] @@ -165,12 +76,12 @@ "outputs": [], "source": [ "Us = np.linspace(1e-6, 5, 10)\n", - "Vs = np.linspace(1e-6, 5, 10)" + "Vs = np.linspace(1e-6, 5, 1)" ] }, { "cell_type": "code", - "execution_count": 115, + "execution_count": null, "id": "117f5557-0e6a-4b02-b0eb-125e68c839dd", "metadata": { "tags": [] @@ -180,49 +91,85 @@ "from numpy.linalg import qr\n", "from functools import partial\n", "\n", - "\n", - "def generate_mf_k(syst, params, nk_axis):\n", - " return np.array(\n", - " [\n", - " [compute_Vk(dummy_syst=syst, kx=kx, ky=ky, params=params) for kx in nk_axis]\n", - " for ky in nk_axis\n", - " ]\n", - " )\n", - "\n", - "\n", - "def scf_loop(mf, H_int, scf_syst, nk_axis, hamiltonians_0, filling=2, max_neighbor=1):\n", - " mf = mf.reshape(\n", - " max_neighbor + 1,\n", - " 2,\n", - " hamiltonians_0.shape[-1] // 2,\n", - " hamiltonians_0.shape[-1] // 2,\n", - " )\n", + "def scf_loop(mf, H_int, scf_syst, ks, hamiltonians_0, filling=2, max_neighbor=1):\n", + " if np.linalg.norm(mf) < 1e-5:\n", + " return 0\n", + " # mf = mf.reshape(\n", + " # max_neighbor + len(graphene.sublattices),\n", + " # 2,\n", + " # norbs,\n", + " # norbs,\n", + " # )\n", " params = dict(mat=mf)\n", - " mf_k = generate_mf_k(syst=scf_syst, nk_axis=nk_axis, params=params)\n", + " mf_k = utils.syst2hamiltonian(syst=scf_syst, kxs=ks, kys=ks, params=params)\n", "\n", " H0_int = H_int[0, 0]\n", "\n", " # Generate the Hamiltonian\n", " hamiltonians = hamiltonians_0 + mf_k\n", " vals, vecs = np.linalg.eigh(hamiltonians)\n", + " # Orthogonalize vectors\n", " vecs = qr(vecs)[0]\n", " # Compute new Fermi energy\n", - " E_F = get_fermi_energy(vals, filling)\n", - " F = mean_field_F(vals, vecs, E_F=E_F)\n", - " rho = np.diag(np.average(F, axis=(0, 1)))\n", - " exchange_mf = convolution(F, H_int) * len(nk_axis) ** (-2)\n", - " direct_mf = np.diag(np.einsum(\"i,ij->j\", rho, H0_int))\n", - "\n", - " mf_new = direct_mf - exchange_mf\n", + " mf_k_new = hf.compute_mf(vals, vecs, filling, ks, H_int)\n", "\n", - " diff = mf_new - mf_k\n", + " diff = mf_k_new - mf_k\n", + " shift = np.trace(np.average(diff, axis=(0,1)))\n", + " diff -= shift / norbs / len(graphene.sublattices)\n", "\n", - " return np.linalg.norm(diff) / np.prod(diff.shape)" + " if np.linalg.norm(mf_k_new) < 1e-5:\n", + " return 0\n", + " else:\n", + " return np.linalg.norm(diff) / np.linalg.norm(mf_k_new)" ] }, { "cell_type": "code", "execution_count": null, + "id": "eb19dbaf-8a85-4eb8-9c68-7266ee250fdc", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def generate_guess(max_neighbor, norbs):\n", + " n_sub = len(graphene.sublattices)\n", + " guess = np.zeros((n_sub + max_neighbor, 2, norbs, norbs))\n", + " for i in range(n_sub):\n", + " # Real part\n", + " guess[i, 0] = np.random.rand(norbs, norbs)\n", + " guess[i, 0] += guess[i, 0].T\n", + " guess[i, 0] *= 0.5\n", + " # Imag part\n", + " guess[i, 1] = np.random.rand(norbs, norbs)\n", + " guess[i, 1] -= guess[i, 1].T\n", + " guess[i, 1] *= 0.5\n", + " for neighbor in range(max_neighbor):\n", + " # Real part\n", + " guess[n_sub + neighbor, 0] = np.random.rand(norbs, norbs)\n", + " # Imag part\n", + " guess[n_sub + neighbor, 1] = np.random.rand(norbs, norbs)\n", + " return guess\n", + "\n", + "def generate_guess(max_neighbor, norbs):\n", + " n_sub = len(graphene.sublattices)\n", + " guess = np.zeros((n_sub + max_neighbor, 2, norbs, norbs))\n", + " for i in range(n_sub):\n", + " # Real part\n", + " guess[i, 0] = np.diag(np.random.rand(norbs))\n", + " # Imag part\n", + " guess[i, 1] = np.diag(np.random.rand(norbs))\n", + " for neighbor in range(max_neighbor):\n", + " # Real part\n", + " guess[n_sub + neighbor, 0] = np.diag(np.random.rand(norbs))\n", + " # Imag part\n", + " guess[n_sub + neighbor, 1] = np.diag(np.random.rand(norbs))\n", + " return guess" + ] + }, + { + "cell_type": "code", + "execution_count": 108, "id": "32b9e7c5-db12-44f9-930c-21e5494404b8", "metadata": { "tags": [] @@ -232,91 +179,177 @@ "name": "stderr", "output_type": "stream", "text": [ - " 80%|████████ | 8/10 [11:09<02:54, 87.27s/it]" + " 0%| | 0/10 [00:00<?, ?it/s]\n" + ] + }, + { + "ename": "AttributeError", + "evalue": "'tuple' object has no attribute 'hamiltonian_submatrix'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[108], line 158\u001b[0m\n\u001b[1;32m 156\u001b[0m gap_U \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 157\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m V \u001b[38;5;129;01min\u001b[39;00m Vs:\n\u001b[0;32m--> 158\u001b[0m gap_U\u001b[38;5;241m.\u001b[39mappend(\u001b[43mcompute_gap\u001b[49m\u001b[43m(\u001b[49m\u001b[43mU\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mV\u001b[49m\u001b[43m)\u001b[49m)\n\u001b[1;32m 159\u001b[0m gap\u001b[38;5;241m.\u001b[39mappend(gap_U)\n", + "Cell \u001b[0;32mIn[108], line 115\u001b[0m, in \u001b[0;36mcompute_gap\u001b[0;34m(U, V, max_neighbor, nk, filling)\u001b[0m\n\u001b[1;32m 113\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mcallback\u001b[39m(x, f):\n\u001b[1;32m 114\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m x\n\u001b[0;32m--> 115\u001b[0m mf \u001b[38;5;241m=\u001b[39m \u001b[43manderson\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 116\u001b[0m \u001b[43m \u001b[49m\u001b[43mfun\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 117\u001b[0m \u001b[43m \u001b[49m\u001b[43mgenerate_guess\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmax_neighbor\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmax_neighbor\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnorbs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnorbs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 118\u001b[0m \u001b[43m \u001b[49m\u001b[43mf_tol\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m1e-3\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 119\u001b[0m \u001b[43m \u001b[49m\u001b[43mw0\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m0.5\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 120\u001b[0m \u001b[43m \u001b[49m\u001b[43mM\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 121\u001b[0m \u001b[43m \u001b[49m\u001b[43mcallback\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcallback\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 122\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 124\u001b[0m mf \u001b[38;5;241m=\u001b[39m mf\u001b[38;5;241m.\u001b[39mreshape(\n\u001b[1;32m 125\u001b[0m max_neighbor \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mlen\u001b[39m(graphene\u001b[38;5;241m.\u001b[39msublattices),\n\u001b[1;32m 126\u001b[0m \u001b[38;5;241m2\u001b[39m,\n\u001b[1;32m 127\u001b[0m norbs,\n\u001b[1;32m 128\u001b[0m norbs,\n\u001b[1;32m 129\u001b[0m )\n\u001b[1;32m 130\u001b[0m ks \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mlinspace(\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m2\u001b[39m \u001b[38;5;241m*\u001b[39m np\u001b[38;5;241m.\u001b[39mpi, \u001b[38;5;241m30\u001b[39m, endpoint\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n", + "File \u001b[0;32m<string>:6\u001b[0m, in \u001b[0;36manderson\u001b[0;34m(F, xin, iter, alpha, w0, M, verbose, maxiter, f_tol, f_rtol, x_tol, x_rtol, tol_norm, line_search, callback, **kw)\u001b[0m\n", + "File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/scipy/optimize/_nonlin.py:170\u001b[0m, in \u001b[0;36mnonlin_solve\u001b[0;34m(F, x0, jacobian, iter, verbose, maxiter, f_tol, f_rtol, x_tol, x_rtol, tol_norm, line_search, callback, full_output, raise_exception)\u001b[0m\n\u001b[1;32m 167\u001b[0m x \u001b[38;5;241m=\u001b[39m x0\u001b[38;5;241m.\u001b[39mflatten()\n\u001b[1;32m 169\u001b[0m dx \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mfull_like(x, np\u001b[38;5;241m.\u001b[39minf)\n\u001b[0;32m--> 170\u001b[0m Fx \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 171\u001b[0m Fx_norm \u001b[38;5;241m=\u001b[39m norm(Fx)\n\u001b[1;32m 173\u001b[0m jacobian \u001b[38;5;241m=\u001b[39m asjacobian(jacobian)\n", + "File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/scipy/optimize/_nonlin.py:166\u001b[0m, in \u001b[0;36mnonlin_solve.<locals>.<lambda>\u001b[0;34m(z)\u001b[0m\n\u001b[1;32m 161\u001b[0m condition \u001b[38;5;241m=\u001b[39m TerminationCondition(f_tol\u001b[38;5;241m=\u001b[39mf_tol, f_rtol\u001b[38;5;241m=\u001b[39mf_rtol,\n\u001b[1;32m 162\u001b[0m x_tol\u001b[38;5;241m=\u001b[39mx_tol, x_rtol\u001b[38;5;241m=\u001b[39mx_rtol,\n\u001b[1;32m 163\u001b[0m \u001b[38;5;28miter\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;28miter\u001b[39m, norm\u001b[38;5;241m=\u001b[39mtol_norm)\n\u001b[1;32m 165\u001b[0m x0 \u001b[38;5;241m=\u001b[39m _as_inexact(x0)\n\u001b[0;32m--> 166\u001b[0m func \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mlambda\u001b[39;00m z: _as_inexact(\u001b[43mF\u001b[49m\u001b[43m(\u001b[49m\u001b[43m_array_like\u001b[49m\u001b[43m(\u001b[49m\u001b[43mz\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mx0\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m)\u001b[38;5;241m.\u001b[39mflatten()\n\u001b[1;32m 167\u001b[0m x \u001b[38;5;241m=\u001b[39m x0\u001b[38;5;241m.\u001b[39mflatten()\n\u001b[1;32m 169\u001b[0m dx \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mfull_like(x, np\u001b[38;5;241m.\u001b[39minf)\n", + "Cell \u001b[0;32mIn[24], line 14\u001b[0m, in \u001b[0;36mscf_loop\u001b[0;34m(mf, H_int, scf_syst, ks, hamiltonians_0, filling, max_neighbor)\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[38;5;66;03m# mf = mf.reshape(\u001b[39;00m\n\u001b[1;32m 8\u001b[0m \u001b[38;5;66;03m# max_neighbor + len(graphene.sublattices),\u001b[39;00m\n\u001b[1;32m 9\u001b[0m \u001b[38;5;66;03m# 2,\u001b[39;00m\n\u001b[1;32m 10\u001b[0m \u001b[38;5;66;03m# norbs,\u001b[39;00m\n\u001b[1;32m 11\u001b[0m \u001b[38;5;66;03m# norbs,\u001b[39;00m\n\u001b[1;32m 12\u001b[0m \u001b[38;5;66;03m# )\u001b[39;00m\n\u001b[1;32m 13\u001b[0m params \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mdict\u001b[39m(mat\u001b[38;5;241m=\u001b[39mmf)\n\u001b[0;32m---> 14\u001b[0m mf_k \u001b[38;5;241m=\u001b[39m \u001b[43mutils\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msyst2hamiltonian\u001b[49m\u001b[43m(\u001b[49m\u001b[43msyst\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mscf_syst\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkxs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mks\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mks\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mparams\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 16\u001b[0m H0_int \u001b[38;5;241m=\u001b[39m H_int[\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m0\u001b[39m]\n\u001b[1;32m 18\u001b[0m \u001b[38;5;66;03m# Generate the Hamiltonian\u001b[39;00m\n", + "File \u001b[0;32m~/Sync/kwant-scf/codes/utils.py:21\u001b[0m, in \u001b[0;36msyst2hamiltonian\u001b[0;34m(kxs, kys, syst, params)\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mh_k\u001b[39m(kx, ky):\n\u001b[1;32m 19\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m syst\u001b[38;5;241m.\u001b[39mhamiltonian_submatrix(params\u001b[38;5;241m=\u001b[39m{\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mparams, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28mdict\u001b[39m(k_x\u001b[38;5;241m=\u001b[39mkx, k_y\u001b[38;5;241m=\u001b[39mky)})\n\u001b[1;32m 20\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m np\u001b[38;5;241m.\u001b[39marray(\n\u001b[0;32m---> 21\u001b[0m [[h_k(kx, ky) \u001b[38;5;28;01mfor\u001b[39;00m kx \u001b[38;5;129;01min\u001b[39;00m kxs] \u001b[38;5;28;01mfor\u001b[39;00m ky \u001b[38;5;129;01min\u001b[39;00m kys]\n\u001b[1;32m 22\u001b[0m )\n", + "File \u001b[0;32m~/Sync/kwant-scf/codes/utils.py:21\u001b[0m, in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mh_k\u001b[39m(kx, ky):\n\u001b[1;32m 19\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m syst\u001b[38;5;241m.\u001b[39mhamiltonian_submatrix(params\u001b[38;5;241m=\u001b[39m{\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mparams, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28mdict\u001b[39m(k_x\u001b[38;5;241m=\u001b[39mkx, k_y\u001b[38;5;241m=\u001b[39mky)})\n\u001b[1;32m 20\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m np\u001b[38;5;241m.\u001b[39marray(\n\u001b[0;32m---> 21\u001b[0m [[h_k(kx, ky) \u001b[38;5;28;01mfor\u001b[39;00m kx \u001b[38;5;129;01min\u001b[39;00m kxs] \u001b[38;5;28;01mfor\u001b[39;00m ky \u001b[38;5;129;01min\u001b[39;00m kys]\n\u001b[1;32m 22\u001b[0m )\n", + "File \u001b[0;32m~/Sync/kwant-scf/codes/utils.py:21\u001b[0m, in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mh_k\u001b[39m(kx, ky):\n\u001b[1;32m 19\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m syst\u001b[38;5;241m.\u001b[39mhamiltonian_submatrix(params\u001b[38;5;241m=\u001b[39m{\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mparams, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28mdict\u001b[39m(k_x\u001b[38;5;241m=\u001b[39mkx, k_y\u001b[38;5;241m=\u001b[39mky)})\n\u001b[1;32m 20\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m np\u001b[38;5;241m.\u001b[39marray(\n\u001b[0;32m---> 21\u001b[0m [[\u001b[43mh_k\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mky\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m kx \u001b[38;5;129;01min\u001b[39;00m kxs] \u001b[38;5;28;01mfor\u001b[39;00m ky \u001b[38;5;129;01min\u001b[39;00m kys]\n\u001b[1;32m 22\u001b[0m )\n", + "File \u001b[0;32m~/Sync/kwant-scf/codes/utils.py:19\u001b[0m, in \u001b[0;36msyst2hamiltonian.<locals>.h_k\u001b[0;34m(kx, ky)\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mh_k\u001b[39m(kx, ky):\n\u001b[0;32m---> 19\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43msyst\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhamiltonian_submatrix\u001b[49m(params\u001b[38;5;241m=\u001b[39m{\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mparams, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28mdict\u001b[39m(k_x\u001b[38;5;241m=\u001b[39mkx, k_y\u001b[38;5;241m=\u001b[39mky)})\n", + "\u001b[0;31mAttributeError\u001b[0m: 'tuple' object has no attribute 'hamiltonian_submatrix'" ] } ], "source": [ - "def generate_guess(max_neighbor, n):\n", - " guesses = []\n", - " for i in range(max_neighbor + 1):\n", - " guess = (\n", - " 0.5 * np.random.rand(n, n) * np.exp(1j * 2 * np.pi * np.random.rand(n, n))\n", - " )\n", - " guess = 0.5 * (guess + guess.T.conj())\n", - " guess = np.stack([guess.real, guess.imag])\n", - " guesses.append(guess)\n", - " return np.asarray(guesses)\n", - "\n", - "\n", - "def generate_scf_syst(syst=syst, max_neighbor=1):\n", - " scf = kwant.Builder(kwant.TranslationalSymmetry(*lattice.prim_vecs))\n", - "\n", + "import tinyarray as ta\n", + "\n", + "def extract_hopping_vectors(builder):\n", + " keep=None\n", + " deltas=[]\n", + " for hop, val in builder.hopping_value_pairs():\n", + " a, b=hop\n", + " b_dom = builder.symmetry.which(b)\n", + " # Throw away part that is in the remaining translation direction, so we get\n", + " # an element of 'sym' which is being wrapped\n", + " b_dom = ta.array([t for i, t in enumerate(b_dom) if i != keep])\n", + " deltas.append(b_dom)\n", + " return np.asarray(deltas)\n", + "\n", + "def generate_scf_syst(max_neighbor, syst):\n", " def scf_onsite(site, mat):\n", - " return mat[0, 0] + 1j * mat[0, 1]\n", + " if site.family == a:\n", + " return mat[0, 0] + 1j * mat[0, 1]\n", + " elif site.family == b:\n", + " return mat[1, 0] + 1j * mat[1, 1]\n", "\n", + " scf = kwant.Builder(kwant.TranslationalSymmetry(*graphene.prim_vecs))\n", " scf[syst.sites()] = scf_onsite\n", " for neighbor in range(max_neighbor):\n", "\n", " def scf_hopping(site1, site2, mat):\n", - " return mat[neighbor + 1, 0] + mat[neighbor + 1, 1]\n", + " return (\n", + " mat[len(graphene.sublattices) + neighbor, 0]\n", + " + 1j * mat[len(graphene.sublattices) + neighbor, 1]\n", + " )\n", "\n", - " scf[lattice.neighbors(neighbor + 1)] = scf_hopping\n", + " scf[graphene.neighbors(neighbor + 1)] = scf_hopping\n", + " deltas = extract_hopping_vectors(scf)\n", " wrapped_scf = kwant.wraparound.wraparound(scf).finalized()\n", - " return wrapped_scf\n", - "\n", + " return wrapped_scf, deltas\n", "\n", "from scipy.optimize import minimize, anderson, fmin, root\n", "\n", "\n", - "def compute_gap(U, V, max_neighbor=1, nk=9):\n", - " nk_axis = np.linspace(0, 2 * np.pi, nk, endpoint=False)\n", - " hamiltonians_0 = np.array(\n", - " [[hamiltonian_return(kx, ky) for kx in nk_axis] for ky in nk_axis]\n", - " )\n", - " # Generate interacting matrix\n", - " Uk = potential_to_hamiltonian(\n", - " syst=wrapped_syst_unfinalized,\n", + "def generate_hint(syst, U, V, lattice, func_onsite, func_hop, params, ks):\n", + " Uk = utils.potential2hamiltonian(\n", + " syst=syst,\n", " lattice=graphene,\n", " func_onsite=func_onsite,\n", " func_hop=func_hop,\n", " params=dict(U=1, V=0),\n", - " nk_axis=nk_axis,\n", + " ks=ks,\n", " )\n", "\n", - " Vk = potential_to_hamiltonian(\n", - " syst=wrapped_syst_unfinalized,\n", + " Vk = utils.potential2hamiltonian(\n", + " syst=syst,\n", " lattice=graphene,\n", " func_onsite=func_onsite,\n", " func_hop=func_hop,\n", " params=dict(U=0, V=1),\n", - " nk_axis=nk_axis,\n", + " ks=ks,\n", + " )\n", + " return U * Uk + V * Vk\n", + "\n", + "\n", + "def total_energy(mf, syst0, syst_mf, ks, max_neighbor, filling):\n", + " mf = mf.reshape(\n", + " max_neighbor + len(graphene.sublattices),\n", + " 2,\n", + " norbs,\n", + " norbs,\n", " )\n", - " H_int = U * Uk + V * Vk\n", - " guess = generate_guess(max_neighbor=max_neighbor, n=hamiltonians_0.shape[-1] // 2)\n", - " scf_syst = generate_scf_syst()\n", + " hamiltonians_0 = utils.syst2hamiltonian(kxs=ks, kys=ks, syst=syst0)\n", + " scf_mf_k = utils.syst2hamiltonian(syst=syst_mf, kxs=ks, kys=ks, params=dict(mat=mf))\n", + " vals, vecs = np.linalg.eigh(hamiltonians_0 + scf_mf_k)\n", + " E_F = utils.get_fermi_energy(vals, filling)\n", + " vals -= E_F\n", + " N_filling = np.sum(vals < 0)\n", + " E_total = np.sum(vals[vals < 0])\n", + " E_p_atom = E_total / N_filling\n", + " return E_p_atom\n", + "\n", + "\n", + "def compute_gap(U, V, max_neighbor=1, nk=12, filling=2):\n", + " n_sub = len(graphene.sublattices)\n", + " ks = np.linspace(0, 2 * np.pi, nk, endpoint=False)\n", + " hamiltonians_0 = utils.syst2hamiltonian(kxs=ks, kys=ks, syst=wrapped_fsyst)\n", + " # Generate interacting matrix\n", + " H_int = generate_hint(\n", + " syst=wrapped_syst,\n", + " lattice=graphene,\n", + " func_onsite=func_onsite,\n", + " func_hop=func_hop,\n", + " U=U,\n", + " V=V,\n", + " ks=ks,\n", + " params={},\n", + " )\n", + " # Create a dummy kwant system for the mean-field\n", + " scf_syst = generate_scf_syst(max_neighbor=max_neighbor, syst=wrapped_syst)\n", + "\n", + " # mf = minimize(\n", + " # scf_loop,\n", + " # generate_guess(max_neighbor=max_neighbor, norbs=norbs).flatten(),\n", + " # tol=1e-4,\n", + " # args=(H_int, scf_syst, ks, hamiltonians_0, filling, max_neighbor),\n", + " # ).x\n", " fun = partial(\n", " scf_loop,\n", " H_int=H_int,\n", " scf_syst=scf_syst,\n", + " ks=ks,\n", " hamiltonians_0=hamiltonians_0,\n", - " nk_axis=nk_axis,\n", + " filling=filling,\n", " max_neighbor=max_neighbor,\n", " )\n", - " mf = minimize(fun, guess.flatten(), tol=1e-3).x\n", + "\n", + " def callback(x, f):\n", + " return x\n", + " mf = anderson(\n", + " fun,\n", + " generate_guess(max_neighbor=max_neighbor, norbs=norbs),\n", + " f_tol=1e-3,\n", + " w0=0.5,\n", + " M=1,\n", + " callback=callback,\n", + " )\n", + "\n", " mf = mf.reshape(\n", - " max_neighbor + 1,\n", + " max_neighbor + len(graphene.sublattices),\n", " 2,\n", - " hamiltonians_0.shape[-1] // 2,\n", - " hamiltonians_0.shape[-1] // 2,\n", + " norbs,\n", + " norbs,\n", " )\n", - " nk_axis = np.linspace(0, 2 * np.pi, 30, endpoint=False)\n", - " hamiltonians_0 = np.array(\n", - " [[hamiltonian_return(kx, ky) for kx in nk_axis] for ky in nk_axis]\n", + " ks = np.linspace(0, 2 * np.pi, 30, endpoint=False)\n", + " hamiltonians_0 = utils.syst2hamiltonian(kxs=ks, kys=ks, syst=wrapped_fsyst)\n", + " scf_mf_k = utils.syst2hamiltonian(\n", + " syst=scf_syst, kxs=ks, kys=ks, params=dict(mat=mf)\n", " )\n", - " scf_mf_k = generate_mf_k(syst=scf_syst, nk_axis=nk_axis, params=dict(mat=mf))\n", " vals, vecs = np.linalg.eigh(hamiltonians_0 + scf_mf_k)\n", - " E_F = get_fermi_energy(vals, 2)\n", + " E_F = utils.get_fermi_energy(vals, 2)\n", + " print(\"U=\" + str(U) + \" , V=\" + str(V))\n", + " extr = np.max(np.abs(scf_mf_k[0, 0]) - E_F * np.eye(n_sub * norbs))\n", + " plt.matshow(\n", + " (scf_mf_k[0, 0] - E_F * np.eye(n_sub * norbs)).real,\n", + " cmap=\"RdBu_r\",\n", + " vmin=-extr,\n", + " vmax=extr,\n", + " )\n", + " plt.colorbar()\n", + " plt.show()\n", " emax = np.max(vals[vals <= E_F])\n", " emin = np.min(vals[vals > E_F])\n", " return np.abs(emin - emax)\n", @@ -334,7 +367,7 @@ }, { "cell_type": "code", - "execution_count": 126, + "execution_count": 12, "id": "a04563c8-81a1-4fd2-9bf3-817224fefe48", "metadata": { "tags": [] @@ -343,16 +376,16 @@ { "data": { "text/plain": [ - "<matplotlib.colorbar.Colorbar at 0x7f5d2ba605e0>" + "<matplotlib.colorbar.Colorbar at 0x7f1629743ac0>" ] }, - "execution_count": 126, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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AbkUcPBdbCdzTZaaf44AAJCiqLgBAEaiVW6PxA0AMFJAztrdgbYLxSip+ecIAAApioobAGAkWuX2SNwAACPxkBF7jn6rkpISuVwuzZgxo43CAQDgGOv4Yz3jHRZfBwtXWVmpl19+WYMGDWrLeAAAQCviStwHDx7UbbfdpoULF+qss85q65gAAAi1yp2MVBTXGve0adM0ZswYXXPNNXriiSdaPdfv98vv94deNzU1xXPJdhcccUmiQ4jQodlKdAgRAmd1SXQIiFOHLxoSHUKEVP26DtoGTwezF3PiXr58ubZu3arKysqozi8pKdHcuXNjDgwAAESKqY9QV1enBx54QEuXLlV6enpUc2bOnCmfzxcadXV1cQUKADi9BI4/1tPJSEUxVdxbtmxRY2OjCgoKQscCgYDWrVun+fPny+/3Ky0tLWyO2+2W2+1um2gBAKcNWuX2YkrcV199tXbs2BF27I477lD//v31yCOPRCRtAADQtmJK3F27dtWAAQPCjnXp0kXdu3ePOA4AgBNBdVDQQbvbyVyTcec0AICRApZLAQftbidzTeY4ca9Zs6YNwgAAANGg4gYAGInNafZI3AAAI1kOnw5mcec0AABOnYBcCjh4UIiTuSZLzT9HAABIUVTcAAAjBS1n69RB8x730CZI3AAAIwUdrnE7mWuy1PytAABIUSRuAICRgnI5HvFYsGCB8vLylJ6eroKCAq1fv77Fc99++21de+21Ovvss5WRkSGv16s//elP8f7KUSFxAwCMdOLOaU5GrFasWKEZM2Zo1qxZ2rZtmy6//HKNHj1atbW1tuevW7dO1157rVavXq0tW7boqquu0g033KBt27Y5/fVbROIGAOC45557TnfddZfuvvtu5efna968ecrJyVFpaant+fPmzdN//Md/6LLLLtP555+vp556Sueff77ee++9douRzWkAACO11ea0pqamsOMtPW76yJEj2rJlix599NGw44WFhdqwYUN01wwGdeDAAXXr1i3OqE+OihsAYKSgXKHbnsY1jq9x5+TkyOPxhEZJSYnt9fbu3atAIKDs7Oyw49nZ2WpoaIgq5v/8z//UoUOHdMsttzj75VtBxQ0ASGl1dXXKyMgIvbartr/L5QpfG7csK+KYnd/+9reaM2eO3n33XWVlZcUXbBRI3AAAI1kOdoafmC9JGRkZYYm7JZmZmUpL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jRsAgCRCxQ0AMBNr3LZI3AAAI7HGbY9WOQAASYSKGwBgJlrltkjcAAAj0Sq3R6scAIAkElPiLikp0WWXXaauXbsqKytLN910k2pqatorNgDA6cxqg5GCYkrca9eu1bRp01RRUaHy8nI1NzersLBQhw4daq/4AACnKxK3rZjWuMvKysJeL168WFlZWdqyZYuuuOIK2zl+v19+vz/0uqmpKY4wAQCA5HBzms/nkyR169atxXNKSko0d+5cJ5c5JazDhxMdQgSro3lbEAL7fYkOITmcwb5PwCk2p9mLOzNYlqXi4mKNGDFCAwYMaPG8mTNnyufzhUZdXV28lwQAnE5olduKuyyYPn26tm/fro8++qjV89xut9xud7yXAQCcrvget624Evd9992nVatWad26derdu3dbxwQAAFoQU+K2LEv33XefVq5cqTVr1igvL6+94gIAnOZY47YXU+KeNm2a3nzzTb377rvq2rWrGhoaJEkej0edO3dulwABAKcpWuW2YtqcVlpaKp/Pp5EjR6pnz56hsWLFivaKDwAAI+3bt09FRUXyeDzyeDwqKirS/v37o55/7733yuVyad68eTFdN+ZWOQAAp4LprfIJEyZo9+7doXuc3HPPPSoqKtJ777130rnvvPOONm3apF69esV8Xb5sCgAwk8Gt8urqapWVlamiokJDhw6VJC1cuFBer1c1NTXq169fi3O//PJLTZ8+XX/60580ZsyYmK9t3h0+AABoQ01NTWHju3fzjNfGjRvl8XhCSVuShg0bJo/How0bNrQ4LxgMqqioSA8//LAuuuiiuK5N4gYAmKmNbsCSk5MTWof2eDwqKSlxHFpDQ4OysrIijmdlZYU2btt55pln1LFjR91///1xX5tWOQDASK7jw8l8Saqrq1NGRkboeGs3BZszZ85Jb9NdWVl57P1dkdFZlmV7XJK2bNmi559/Xlu3bm3xnGiQuAEAKS0jIyMscbdm+vTpGj9+fKvn9O3bV9u3b9eePXsifvbVV18pOzvbdt769evV2NioPn36hI4FAgH9+7//u+bNm6f/+7//iypGEjcAwEwJ2JyWmZmpzMzMk57n9Xrl8/n08ccfa8iQIZKkTZs2yefzafjw4bZzioqKdM0114Qdu+6661RUVKQ77rgj6hhJ3AAAI5n8dbD8/HyNGjVKkydP1ksvvSTp2NfBrr/++rAd5f3791dJSYnGjRun7t27q3v37mHvc8YZZ6hHjx6t7kL/PjanAQDMZPjTwZYtW6aBAweqsLBQhYWFGjRokN54442wc2pqakKPwG4rVNwAAMShW7duWrp0aavnnOzGZdGua38XiRsAYC5u2BmBxA0AMJLJa9yJxBo3AABJhIobAGAmg+9VnkgkbgCAkWiV26NVDgBAEqHiBgCYiVa5LRI3AMBItMrt0SoHACCJUHEDAMxEq9wWiRsAYCYSty0SNwDASKxx22ONGwCAJELFDQAwE61yWyRuAICRXJYl10kei3my+amIVjkAAEmEihsAYCZa5bZI3AAAI7Gr3B6tcgAAkggVNwDATLTKbZG4DdbhSDDRISBO1j5fokMAkh6tcnu0ygEASCJU3AAAM9Eqt0XiBgAYiVa5PRI3AMBMVNy2WOMGACCJUHEDAIyVqu1uJ0jcAAAzWdax4WR+CqJVDgBAEqHiBgAYiV3l9kjcAAAzsavcFq1yAACSCBU3AMBIruCx4WR+KiJxAwDMRKvcFq1yAACSCIkbAGCkE7vKnYz2tG/fPhUVFcnj8cjj8aioqEj79+8/6bzq6mrdeOON8ng86tq1q4YNG6ba2tqor0viBgCY6cQNWJyMdjRhwgRVVVWprKxMZWVlqqqqUlFRUatzPv/8c40YMUL9+/fXmjVr9Je//EW//OUvlZ6eHvV1WeMGABjJ5O9xV1dXq6ysTBUVFRo6dKgkaeHChfJ6vaqpqVG/fv1s582aNUs//elP9eyzz4aOnXPOOTFdm4obAJDSmpqawobf73f8nhs3bpTH4wklbUkaNmyYPB6PNmzYYDsnGAzqD3/4gy644AJdd911ysrK0tChQ/XOO+/EdG0SNwDATFYbDEk5OTmhdWiPx6OSkhLHoTU0NCgrKyvieFZWlhoaGmznNDY26uDBg3r66ac1atQovf/++xo3bpx+9rOfae3atVFfm1Y5AMBIbdUqr6urU0ZGRui42+1ucc6cOXM0d+7cVt+3srLy2Pu7XBE/syzL9rh0rOKWpLFjx+rBBx+UJF1yySXasGGDXnzxRV155ZWtXvcEEjcAIKVlZGSEJe7WTJ8+XePHj2/1nL59+2r79u3as2dPxM+++uorZWdn287LzMxUx44ddeGFF4Ydz8/P10cffRRVfBKJGwBgqgQ81jMzM1OZmZknPc/r9crn8+njjz/WkCFDJEmbNm2Sz+fT8OHDbed06tRJl112mWpqasKOf/rpp8rNzY06Rta4AQBGMvl73Pn5+Ro1apQmT56siooKVVRUaPLkybr++uvDdpT3799fK1euDL1++OGHtWLFCi1cuFCfffaZ5s+fr/fee09Tp06N+tokbgAA4rBs2TINHDhQhYWFKiws1KBBg/TGG2+EnVNTUyOfzxd6PW7cOL344ot69tlnNXDgQC1atEhvvfWWRowYEfV1aZUDAMxk+L3Ku3XrpqVLl7Yegk27/s4779Sdd94Z93VJ3AAAI5l8A5ZEolUOAEASoeIGAJgpaB0bTuanIBI3AMBMhq9xJwqJGwBgJJccrnG3WSRmYY0bAIAkQsUNADBTAu6clgxI3AAAI/F1MHsxt8rXrVunG264Qb169ZLL5Yr5OaIAACB+MSfuQ4cO6eKLL9b8+fPbIx4AAI5po+dxp5qYW+WjR4/W6NGjoz7f7/fL7/eHXjc1NcV6SQDAachlWXI5WKd2Mtdk7b7GXVJSctKHkpvAdcYZiQ4hQtq3zYkOAXEK7NuX6BAApKh2/zrYzJkz5fP5QqOurq69LwkASAXBNhgpqN0rbrfbLbfb3d6XAQCkGFrl9rgBCwAASYTvcQMAzMS9ym3FnLgPHjyozz77LPR6165dqqqqUrdu3dSnT582DQ4AcBrjzmm2Yk7cmzdv1lVXXRV6XVxcLEmaNGmSlixZ0maBAQBOb9w5zV7MiXvkyJGyUvSvGAAATMcaNwDATLTKbZG4AQBGcgWPDSfzUxFfBwMAIIlQcQMAzESr3BaJGwBgJr7HbYtWOQAASYSKGwBgJO5Vbo/EDQAwE2vctmiVAwCQRKi4AQBmsuTsmdqpWXCTuAEAZmKN2x6JGwBgJksO17jbLBKjsMYNAEASoeIGAJiJXeW2SNwAADMFJbkczk9BtMoBAEgiJG4AgJFO7Cp3MtrTvn37VFRUJI/HI4/Ho6KiIu3fv7/VOQcPHtT06dPVu3dvde7cWfn5+SotLY3purTKAQBmMnyNe8KECdq9e7fKysokSffcc4+Kior03nvvtTjnwQcf1IcffqilS5eqb9++ev/99zV16lT16tVLY8eOjeq6VNwAAMSourpaZWVlWrRokbxer7xerxYuXKj//u//Vk1NTYvzNm7cqEmTJmnkyJHq27ev7rnnHl188cXavHlz1NcmcQMAzHSi4nYyJDU1NYUNv9/vOLSNGzfK4/Fo6NChoWPDhg2Tx+PRhg0bWpw3YsQIrVq1Sl9++aUsy9KHH36oTz/9VNddd13U1yZxAwDM1EaJOycnJ7QO7fF4VFJS4ji0hoYGZWVlRRzPyspSQ0NDi/NeeOEFXXjhherdu7c6deqkUaNGacGCBRoxYkTU12aNGwCQ0urq6pSRkRF67Xa7Wzx3zpw5mjt3bqvvV1lZKUlyuSK/q2ZZlu3xE1544QVVVFRo1apVys3N1bp16zR16lT17NlT11xzzcl+FUkkbgCAqdroe9wZGRlhibs106dP1/jx41s9p2/fvtq+fbv27NkT8bOvvvpK2dnZtvO+/fZbPfbYY1q5cqXGjBkjSRo0aJCqqqr061//msQNAEhuiXjISGZmpjIzM096ntfrlc/n08cff6whQ4ZIkjZt2iSfz6fhw4fbzjl69KiOHj2qDh3CV6nT0tIUDEZ/txjWuAEAZmqjNe72kJ+fr1GjRmny5MmqqKhQRUWFJk+erOuvv179+vULnde/f3+tXLlS0rHK/8orr9TDDz+sNWvWaNeuXVqyZIlef/11jRs3LuprU3EDABCHZcuW6f7771dhYaEk6cYbb9T8+fPDzqmpqZHP5wu9Xr58uWbOnKnbbrtN33zzjXJzc/Xkk09qypQpUV+XxA0AMFPQklwOquZg+96ApVu3blq6dGmr51jfq/p79OihxYsXO7ouiRsAYCbD75yWKKxxAwCQRKi4j7OamxMdQoQOh82LKTX/fgVgJqcbzFLz/7FI3AAAM9Eqt0WrHACAJELFDQAwU9CSo3Z3O+8qTxQSNwDATFbw2HAyPwXRKgcAIIlQcQMAzMTmNFskbgCAmVjjtkXiBgCYiYrbFmvcAAAkESpuAICZLDmsuNssEqOQuAEAZqJVbotWOQAASYSKGwBgpmBQkoObqART8wYsJG4AgJlolduiVQ4AQBKh4gYAmImK2xaJGwBgJu6cZotWOQAASYSKGwBgJMsKynLwaE4nc01G4gYAmMmynLW7WeMGAOAUshyucado4maNGwCAJELFDQAwUzAouRysU7PGDQDAKUSr3BatcgAAkggVNwDASFYwKMtBq5yvgwEAcCrRKrdFqxwAgCRCxQ0AMFPQklxU3N9H4gYAmMmyJDn5OlhqJm5a5QAAJBEqbgCAkaygJctBq9xK0YqbxA0AMJMVlLNWeWp+HSyuVvmCBQuUl5en9PR0FRQUaP369W0dFwDgNGcFLcejPT355JMaPny4fvCDH+iHP/xhdL+TZWnOnDnq1auXOnfurJEjR+qvf/1rTNeNOXGvWLFCM2bM0KxZs7Rt2zZdfvnlGj16tGpra2N9KwAAktaRI0f0b//2b/rFL34R9Zxnn31Wzz33nObPn6/Kykr16NFD1157rQ4cOBD1e7isGBcBhg4dqksvvVSlpaWhY/n5+brppptUUlIScb7f75ff7w+99vl86tOnj0bop+qoM2K5dLtK694t0SFECPbOTnQIEay/VCc6BAAJ1Kyj+kirtX//fnk8nna5RlNTkzwej+M8cSLWuro6ZWRkhI673W653e62CFWStGTJEs2YMUP79+9v9TzLstSrVy/NmDFDjzzyiKRjOTI7O1vPPPOM7r333uguaMXA7/dbaWlp1ttvvx12/P7777euuOIK2zmzZ88+cesbBoPBYKTI+Pzzz2NJHzH59ttvrR49erRJnGeeeWbEsdmzZ7dpvIsXL7Y8Hs9Jz/v8888tSdbWrVvDjt94443WxIkTo75eTJvT9u7dq0AgoOzs8EowOztbDQ0NtnNmzpyp4uLi0Ov9+/crNzdXtbW17fbXWipoampSTk5OxF+K+Cc+o+jwOUWHzyk6J7qm3bq1X5cyPT1du3bt0pEjRxy/l2VZcrlcYcfastqOxYk8aZdDv/jii6jfJ65d5d//EOw+mBNaakl4PB7+xxGFjIwMPqeT4DOKDp9TdPicotOhQ/veBiQ9PV3p6enteg07c+bM0dy5c1s9p7KyUoMHD477GrHkUDsxJe7MzEylpaVFVNeNjY0Rf0EAAJBspk+frvHjx7d6Tt++feN67x49ekg6Vnn37NkzdDzWHBpT4u7UqZMKCgpUXl6ucePGhY6Xl5dr7NixsbwVAADGyczMVGZmZru8d15ennr06KHy8nL96Ec/knRsZ/ratWv1zDPPRP0+Mfc6iouLtWjRIr366quqrq7Wgw8+qNraWk2ZMiWq+W63W7Nnz07YGkOy4HM6OT6j6PA5RYfPKTp8Tv9UW1urqqoq1dbWKhAIqKqqSlVVVTp48GDonP79+2vlypWSjrXIZ8yYoaeeekorV67U//7v/+r222/XD37wA02YMCH6C8e0de643/zmN1Zubq7VqVMn69JLL7XWrl0bz9sAAJC0Jk2aZLuT/cMPPwydI8lavHhx6HUwGLRmz55t9ejRw3K73dYVV1xh7dixI6brxvw9bgAAkDg8HQwAgCRC4gYAIImQuAEASCIkbgAAksgpTdw8DvTk1q1bpxtuuEG9evWSy+XSO++8k+iQjFNSUqLLLrtMXbt2VVZWlm666SbV1NQkOizjlJaWatCgQaE7gXm9Xv3xj39MdFjGKykpCX1tB/80Z84cuVyusHHihiI4tU5Z4uZxoNE5dOiQLr74Ys2fPz/RoRhr7dq1mjZtmioqKlReXq7m5mYVFhbq0KFDiQ7NKL1799bTTz+tzZs3a/PmzfrJT36isWPHxvzs39NJZWWlXn75ZQ0aNCjRoRjpoosuUn19fWjs2LEj0SGdntrky2xRGDJkiDVlypSwY/3797ceffTRUxVC0pFkrVy5MtFhGK+xsdGSxP0EonDWWWdZixYtSnQYRjpw4IB1/vnnW+Xl5daVV15pPfDAA4kOySizZ8+2Lr744kSHAcuyTknFfeTIEW3ZskWFhYVhxwsLC7Vhw4ZTEQJSmM/nk6R2fVpRsgsEAlq+fLkOHTokr9eb6HCMNG3aNI0ZM0bXXHNNokMx1s6dO9WrVy/l5eVp/Pjx+tvf/pbokE5LcT0dLFbxPA4UiIZlWSouLtaIESM0YMCARIdjnB07dsjr9erw4cM688wztXLlSl144YWJDss4y5cv19atW1VZWZnoUIw1dOhQvf7667rgggu0Z88ePfHEExo+fLj++te/qnv37okO77RyShL3CU4fZQZ83/Tp07V9+3Z99NFHiQ7FSP369VNVVZX279+vt956S5MmTdLatWtJ3t9RV1enBx54QO+//35CHiOZLEaPHh3654EDB8rr9ercc8/Va6+9puLi4gRGdvo5JYmbx4GiPdx3331atWqV1q1bp969eyc6HCN16tRJ5513niRp8ODBqqys1PPPP6+XXnopwZGZY8uWLWpsbFRBQUHoWCAQ0Lp16zR//nz5/X6lpaUlMEIzdenSRQMHDtTOnTsTHcpp55SscX/3caDfVV5eruHDh5+KEJBCLMvS9OnT9fbbb+uDDz5QXl5eokNKGpZlye/3JzoMo1x99dXasWNH6MlOVVVVGjx4sG677TZVVVWRtFvg9/tVXV0d9lxpnBqnrFVeXFysoqIiDR48WF6vVy+//HJMjwM9XRw8eFCfffZZ6PWuXbtUVVWlbt26qU+fPgmMzBzTpk3Tm2++qXfffVddu3YNdXI8Ho86d+6c4OjM8dhjj2n06NHKycnRgQMHtHz5cq1Zs0ZlZWWJDs0oXbt2jdgf0aVLF3Xv3p19E9/x0EMP6YYbblCfPn3U2NioJ554Qk1NTZo0aVKiQzvtnLLEfeutt+rrr7/W448/rvr6eg0YMECrV69Wbm7uqQohKWzevFlXXXVV6PWJtaNJkyZpyZIlCYrKLKWlpZKkkSNHhh1fvHixbr/99lMfkKH27NmjoqIi1dfXy+PxaNCgQSorK9O1116b6NCQhHbv3q2f//zn2rt3r84++2wNGzZMFRUV/H94AvBYTwAAkgj3KgcAIImQuAEASCIkbgAAkgiJGwCAJELiBgAgiZC4AQBIIiRuAACSCIkbAIAkQuIGACCJkLgBAEgiJG4AAJLI/wN+djy6ZxrjLQAAAABJRU5ErkJggg==\n", + "image/png": "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+XQwJyMZRb05beXKldq+fbuqq6sjOr+srExz586NOjAAANBaVBV3Q0ODHnroIS1fvlypqakRzZk1a5Z8Pl9oNDQ0xBQoAODsEjjxWE8nIxlFVXFv27ZNzc3NysvLCx0LBALasGGDFi5cKL/fr5SUlLA5brdbbre7Y6IFAJw1nLa7aZVLuvbaa7Vr166wY3fddZeGDBmin/3sZ62SNgAA6FhRJe5evXpp6NChYcd69OihPn36tDoOAIATQXVR0EG728lck3HnNACAkQKWSwEH7W4nc03mOHGvW7euA8IAAACRoOIGABiJzWn2SNwAACNZDp8OZiXpndNI3AAAIwXkUsDBg0KczDVZcv51BACAJEXFDQAwUtBytk4dtDowGIOQuAEARgo6XON2MtdkyflbAQCQpEjcAAAjBeVyPGKxaNEi5eTkKDU1VXl5edq4cWOb57755pu6/vrrde655yotLU1er1fvvvturL9yREjcAAAjnbxzmpMRrVWrVmnmzJmaPXu2duzYoSuuuEIFBQWqr6+3PX/Dhg26/vrrtXbtWm3btk3XXHONbrrpJu3YscPpr98mEjcAACfMnz9f99xzj+69917l5uZqwYIFysrKUnl5ue35CxYs0L//+7/r8ssv14UXXqinnnpKF154od55551Oi5HNaQAAI3XU5rSWlpaw4209bvrIkSPatm2bHnvssbDj+fn52rRpU2TXDAZ18OBB9e7dO8aoT4+KGwBgpKBcoduexjROrHFnZWXJ4/GERllZme319u/fr0AgoMzMzLDjmZmZampqiijm//iP/9Dhw4d12223Ofvl20HFDQBIag0NDUpLSwu9tqu2T+Vyha+NW5bV6pid3/zmNyotLdXbb7+tjIyM2IKNAIkbAGAky8HO8JPzJSktLS0scbclPT1dKSkprarr5ubmVlX4t61atUr33HOPfvvb3+q6666LOeZI0CoHABjJUZs8hieLdevWTXl5eaqsrAw7XllZqTFjxrQ57ze/+Y3uvPNOvf766xo/fnxMv2s0qLgBAEaKx53TSkpKVFhYqBEjRsjr9erFF19UfX29pk+fLkmaNWuWPv/8c7366quSjiftKVOm6Nlnn9Xo0aND1Xr37t3l8Xhijr09JG4AAE64/fbb9eWXX2revHlqbGzU0KFDtXbtWmVnZ0uSGhsbw77T/cILL+jYsWOaMWOGZsyYETo+depULVu2rFNiJHEDAIwUS7v72/NjUVRUpKKiItuffTsZr1u3LqZrOEHiBgAYycltS0/OT0ZsTgMAIIFQcQMAjBSvVrnpSNwAACORuO3RKgcAIIFQcQMAjETFbY/EDQAwEonbHq1yAAASCBU3AMBIlpx9F9vquFCMQuIGABiJVrk9EjcAwEgkbnuscQMAkECouAEARqLitkfiBgAYicRtj1Y5AAAJhIobAGAky3LJclA1O5lrMhI3AMBIPI/bHq1yAAASCBU3AMBIbE6zR+IGABiJNW57tMoBAEggVNwAACPRKrdH4gYAGIlWuT0SNwDASJbDijtZEzdr3AAAJBAqbgCAkSxJluVsfjIicQMAjBSUSy7unNYKrXIAABIIFTcAwEjsKrdH4gYAGCloueTie9yt0CoHACCBUHEDAIxkWQ53lSfptnISNwDASKxx26NVDgBAAqHiBgAYiYrbHokbAGAkdpXbo1UOADDSyc1pTkYsFi1apJycHKWmpiovL08bN25s9/z169crLy9PqampOu+88/T888/HduEIkbgBADhh1apVmjlzpmbPnq0dO3boiiuuUEFBgerr623P37Nnj370ox/piiuu0I4dO/T444/rwQcf1BtvvNFpMZK4AQBGOl41uxyM4+/T0tISNvx+f5vXnD9/vu655x7de++9ys3N1YIFC5SVlaXy8nLb859//nkNHDhQCxYsUG5uru69917dfffd+tWvftUZH4kkEjcAwFDOkvY/NrZlZWXJ4/GERllZme31jhw5om3btik/Pz/seH5+vjZt2mQ7Z/Pmza3Ov+GGG7R161YdPXq0Az6F1ticBgBIag0NDUpLSwu9drvdtuft379fgUBAmZmZYcczMzPV1NRkO6epqcn2/GPHjmn//v3q16+fw+hbI3EDAIxkydkztU/OTUtLC0vcp+Nyhe9Gtyyr1bHTnW93vKOQuAEARjrT3+NOT09XSkpKq+q6ubm5VVV9Ut++fW3P79q1q/r06RNdwBFijRsAAEndunVTXl6eKisrw45XVlZqzJgxtnO8Xm+r89977z2NGDFC55xzTqfESeIGAJjJ6oARpZKSEi1ZskQvv/yyamtr9fDDD6u+vl7Tp0+XJM2aNUtTpkwJnT99+nT99a9/VUlJiWpra/Xyyy/rpZde0iOPPBLrb31aUSXu8vJy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QAS+973vWUuWLIl3GEY6ePCgdeGFF1qVlZXWVVddZT300EPxDskoc+bMsS699NJ4hwHLss5IxX3kyBFt27ZN+fn5Ycfz8/O1adOmMxECktjJZ7x35tOKEl0gENDKlSt1+PBheb3eeIdjpBkzZmj8+PG67rrr4h2KsXbv3q3+/fsrJydHkyZN0p///Od4h3RWiunpYNGK5XGgQCQsy1JJSYnGjh2roUOHxjsc4+zatUter1fffPONevbsqdWrV+viiy+Od1jGWblypbZv367q6up4h2KsUaNG6dVXX9VFF12kffv26YknntCYMWP0pz/9SX369Il3eGeVM5K4T3L6KDPg24qLi7Vz5059+OGH8Q7FSIMHD1ZNTY0OHDigN954Q1OnTtX69etJ3qdoaGjQQw89pPfeey8uj5FMFAUFBaF/HzZsmLxer84//3y98sorKikpiWNkZ58zkrh5HCg6wwMPPKA1a9Zow4YNGjBgQLzDMVK3bt10wQUXSJJGjBih6upqPfvss3rhhRfiHJk5tm3bpubmZuXl5YWOBQIBbdiwQQsXLpTf71dKSkocIzRTjx49NGzYMO3evTveoZx1zsga96mPAz1VZWWlxowZcyZCQBKxLEvFxcV688039f777ysnJyfeISUMy7Lk9/vjHYZRrr32Wu3atSv0ZKeamhqNGDFCd9xxh2pqakjabfD7/aqtrQ17rjTOjDPWKi8pKVFhYaFGjBghr9erF198MarHgZ4tDh06pE8//TT0es+ePaqpqVHv3r01cODAOEZmjhkzZuj111/X22+/rV69eoU6OR6PR927d49zdOZ4/PHHVVBQoKysLB08eFArV67UunXrVFFREe/QjNKrV69W+yN69OihPn36sG/iFI888ohuuukmDRw4UM3NzXriiSfU0tKiqVOnxju0s84ZS9y33367vvzyS82bN0+NjY0aOnSo1q5dq+zs7DMVQkLYunWrrrnmmtDrk2tHU6dO1bJly+IUlVnKy8slSVdffXXY8aVLl+rOO+888wEZat++fSosLFRjY6M8Ho+GDx+uiooKXX/99fEODQlo7969+slPfqL9+/fr3HPP1ejRo1VVVcV/w+OAx3oCAJBAuFc5AAAJhMQNAEACIXEDAJBASNwAACQQEjcAAAmExA0AQAIhcQMAkEBI3AAAJBASNwAACYTEDQBAAiFxAwCQQP4fvLYFcle8DksAAAAASUVORK5CYII=\n", "text/plain": [ "<Figure size 640x480 with 2 Axes>" ] @@ -367,13 +400,378 @@ "plt.colorbar()" ] }, + { + "cell_type": "code", + "execution_count": 13, + "id": "1337b3ba-b7df-4b35-b270-22de3df428a3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[<matplotlib.lines.Line2D at 0x7f1629476cb0>]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 640x480 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(Us, gap)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "67b7cc81-411d-4e65-b55d-e72c3711318d", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "only length-1 arrays can be converted to Python scalars", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[8], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m ks \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mlinspace(\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m2\u001b[39m \u001b[38;5;241m*\u001b[39m np\u001b[38;5;241m.\u001b[39mpi, \u001b[38;5;241m2\u001b[39m, endpoint\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[0;32m----> 2\u001b[0m hamiltonians_0 \u001b[38;5;241m=\u001b[39m \u001b[43mutils\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msyst2hamiltonian\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkx\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mks\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mky\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mks\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msyst\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mwrapped_fsyst\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/Sync/kwant-scf/codes/utils.py:21\u001b[0m, in \u001b[0;36msyst2hamiltonian\u001b[0;34m(kx, ky, syst, params)\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[38;5;129m@np\u001b[39m\u001b[38;5;241m.\u001b[39mvectorize\n\u001b[1;32m 19\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mh_k\u001b[39m(kx, ky):\n\u001b[1;32m 20\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m syst\u001b[38;5;241m.\u001b[39mhamiltonian_submatrix(params\u001b[38;5;241m=\u001b[39m{\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mparams, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28mdict\u001b[39m(k_x\u001b[38;5;241m=\u001b[39mkx, k_y\u001b[38;5;241m=\u001b[39mky)})\n\u001b[0;32m---> 21\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mh_k\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mky\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/numpy/lib/function_base.py:2328\u001b[0m, in \u001b[0;36mvectorize.__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 2325\u001b[0m vargs \u001b[38;5;241m=\u001b[39m [args[_i] \u001b[38;5;28;01mfor\u001b[39;00m _i \u001b[38;5;129;01min\u001b[39;00m inds]\n\u001b[1;32m 2326\u001b[0m vargs\u001b[38;5;241m.\u001b[39mextend([kwargs[_n] \u001b[38;5;28;01mfor\u001b[39;00m _n \u001b[38;5;129;01min\u001b[39;00m names])\n\u001b[0;32m-> 2328\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_vectorize_call\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfunc\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mvargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/numpy/lib/function_base.py:2414\u001b[0m, in \u001b[0;36mvectorize._vectorize_call\u001b[0;34m(self, func, args)\u001b[0m\n\u001b[1;32m 2411\u001b[0m outputs \u001b[38;5;241m=\u001b[39m ufunc(\u001b[38;5;241m*\u001b[39minputs)\n\u001b[1;32m 2413\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ufunc\u001b[38;5;241m.\u001b[39mnout \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[0;32m-> 2414\u001b[0m res \u001b[38;5;241m=\u001b[39m \u001b[43masanyarray\u001b[49m\u001b[43m(\u001b[49m\u001b[43moutputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43motypes\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2415\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 2416\u001b[0m res \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtuple\u001b[39m([asanyarray(x, dtype\u001b[38;5;241m=\u001b[39mt)\n\u001b[1;32m 2417\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m x, t \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m(outputs, otypes)])\n", + "\u001b[0;31mTypeError\u001b[0m: only length-1 arrays can be converted to Python scalars" + ] + } + ], + "source": [ + "ks = np.linspace(0, 2 * np.pi, 2, endpoint=False)\n", + "hamiltonians_0 = utils.syst2hamiltonian(kx=ks, ky=ks, syst=wrapped_fsyst)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "8087fe0d-29dd-41c4-89fc-cd5cdc758c28", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "params={}\n", + "# @np.vectorize\n", + "def h_k(kx, ky):\n", + " return wrapped_fsyst.hamiltonian_submatrix(params={**params, **dict(k_x=kx, k_y=ky)})" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "5f79a80f-d9f6-4b22-b8a4-9d188153f0c9", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "only length-1 arrays can be converted to Python scalars", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[19], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m vhk\u001b[38;5;241m=\u001b[39mnp\u001b[38;5;241m.\u001b[39mvectorize(h_k)\n\u001b[0;32m----> 2\u001b[0m \u001b[43mvhk\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkx\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlinspace\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m,\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43mky\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/numpy/lib/function_base.py:2328\u001b[0m, in \u001b[0;36mvectorize.__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 2325\u001b[0m vargs \u001b[38;5;241m=\u001b[39m [args[_i] \u001b[38;5;28;01mfor\u001b[39;00m _i \u001b[38;5;129;01min\u001b[39;00m inds]\n\u001b[1;32m 2326\u001b[0m vargs\u001b[38;5;241m.\u001b[39mextend([kwargs[_n] \u001b[38;5;28;01mfor\u001b[39;00m _n \u001b[38;5;129;01min\u001b[39;00m names])\n\u001b[0;32m-> 2328\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_vectorize_call\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfunc\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mvargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/numpy/lib/function_base.py:2414\u001b[0m, in \u001b[0;36mvectorize._vectorize_call\u001b[0;34m(self, func, args)\u001b[0m\n\u001b[1;32m 2411\u001b[0m outputs \u001b[38;5;241m=\u001b[39m ufunc(\u001b[38;5;241m*\u001b[39minputs)\n\u001b[1;32m 2413\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ufunc\u001b[38;5;241m.\u001b[39mnout \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[0;32m-> 2414\u001b[0m res \u001b[38;5;241m=\u001b[39m \u001b[43masanyarray\u001b[49m\u001b[43m(\u001b[49m\u001b[43moutputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43motypes\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2415\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 2416\u001b[0m res \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtuple\u001b[39m([asanyarray(x, dtype\u001b[38;5;241m=\u001b[39mt)\n\u001b[1;32m 2417\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m x, t \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m(outputs, otypes)])\n", + "\u001b[0;31mTypeError\u001b[0m: only length-1 arrays can be converted to Python scalars" + ] + } + ], + "source": [ + "vhk=np.vectorize(h_k)\n", + "vhk(kx=np.linspace(0,1),ky=[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "94474a64-be2f-4b37-a2bf-a926080e4026", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "max_neighbor=1\n", + "norbs=20\n", + "shape = (\n", + " max_neighbor + len(graphene.sublattices),\n", + " 2,\n", + " norbs,\n", + " norbs\n", + ")\n", + "mf = np.random.rand(*shape)\n", + "mf2 = mf.flatten()\n", + "mf2 = mf2.reshape(*shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "61557cad-5bcc-402b-95a4-ec3e36a6d211", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[[0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " ...,\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.]],\n", + "\n", + " [[0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " ...,\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.]]],\n", + "\n", + "\n", + " [[[0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " ...,\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.]],\n", + "\n", + " [[0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " ...,\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.]]],\n", + "\n", + "\n", + " [[[0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " ...,\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.]],\n", + "\n", + " [[0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " ...,\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.]]]])" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mf - mf2" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "id": "d45e62e4-dace-4472-adbb-3305a41bd333", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "deltas = extract_hopping_vectors(bulk_graphene)\n", + "nk=100\n", + "ks, dk = np.linspace(0, 2 * np.pi, nk, endpoint=False, retstep=True)\n", + "hamiltonians_0 = utils.syst2hamiltonian(kxs=ks, kys=ks, syst=wrapped_fsyst)" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "id": "26e4203a-0140-4a66-891a-2912e3bb721e", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0, -1],\n", + " [ 0, 0],\n", + " [ 1, -1],\n", + " [-1, 0],\n", + " [-1, 1],\n", + " [ 0, -1],\n", + " [-1, 0],\n", + " [-1, 1],\n", + " [ 0, -1]])" + ] + }, + "execution_count": 153, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "deltas" + ] + }, + { + "cell_type": "code", + "execution_count": 154, + "id": "7570fda5-a1e4-43e8-b89e-a6f6e83436be", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "kxx, kyy = np.meshgrid(ks, ks)\n", + "deltas = np.asarray(deltas)\n", + "kxy = np.array([kxx, kyy])\n", + "hopps = np.sum(\n", + " np.einsum(\n", + " \"ijk,jklm->ijklm\",\n", + " np.exp(1j * np.einsum(\"ij,jkl->ikl\", deltas, kxy)),\n", + " hamiltonians_0,\n", + " ),\n", + " axis=(1, 2),\n", + ") * (dk)**2 / (2 * np.pi)**2" + ] + }, + { + "cell_type": "code", + "execution_count": 155, + "id": "89b06c4e-75b1-430b-b026-22f108898e51", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[4.0983883e-17-1.j, 0.0000000e+00+0.j],\n", + " [0.0000000e+00+0.j, 4.0983883e-17-1.j]])" + ] + }, + "execution_count": 155, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hopps[7][:2,:2]" + ] + }, + { + "cell_type": "code", + "execution_count": 156, + "id": "52dcb47f-8a52-4c11-8b4e-38d5959ac118", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1.-1.04091735e-16j, 0.+0.00000000e+00j],\n", + " [0.+0.00000000e+00j, 1.-1.04091735e-16j]])" + ] + }, + "execution_count": 156, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hopps[0][2:,:2]" + ] + }, + { + "cell_type": "code", + "execution_count": 140, + "id": "3dd2139f-713a-496f-8056-19e8d7ef56d2", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(2, 10, 10)" + ] + }, + "execution_count": 140, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "kxy.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "id": "10d07c6b-1762-42e9-aeaf-0c1f4d1ce0e3", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(3, 10, 10)" + ] + }, + "execution_count": 90, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.einsum(\"ij,jkl->ikl\", deltas, kxy).shape" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "44a841db-fde7-4886-a663-9d400746add9", + "id": "b161c9d7-bbf9-403b-882a-df48262315c8", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "deltas=[]\n", + "for hop, val in builder.hopping_value_pairs():\n", + " a, b=hop\n", + " b_dom = builder.symmetry.which(b)\n", + " # Throw away part that is in the remaining translation direction, so we get\n", + " # an element of 'sym' which is being wrapped\n", + " b_dom = ta.array([t for i, t in enumerate(b_dom) if i != keep])\n", + " deltas.append(b_dom)" + ] } ], "metadata": { diff --git a/analysis/graphene_test_extended_hubbard.ipynb b/analysis/graphene_test_extended_hubbard.ipynb index 7eb7a89..e8a8a53 100644 --- a/analysis/graphene_test_extended_hubbard.ipynb +++ b/analysis/graphene_test_extended_hubbard.ipynb @@ -25,6 +25,7 @@ "import kwant\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", + "import utils, hf\n", "\n", "\n", "s0 = np.identity(2)\n", @@ -46,15 +47,8 @@ "bulk_graphene[graphene.neighbors(1)] = s0\n", "\n", "# use kwant wraparound to sample bulk k-space\n", - "wrapped_syst_unfinalized = kwant.wraparound.wraparound(bulk_graphene)\n", - "wrapped_syst = kwant.wraparound.wraparound(bulk_graphene).finalized()\n", - "\n", - "\n", - "# return a hamiltonian for a given kx, ky\n", - "@np.vectorize\n", - "def hamiltonian_return(kx, ky, params={}):\n", - " ham = wrapped_syst.hamiltonian_submatrix(params={**params, **dict(k_x=kx, k_y=ky)})\n", - " return ham" + "wrapped_syst = kwant.wraparound.wraparound(bulk_graphene)\n", + "wrapped_fsyst = wrapped_syst.finalized()" ] }, { @@ -66,7 +60,7 @@ }, { "cell_type": "code", - "execution_count": 143, + "execution_count": 2, "metadata": { "tags": [] }, @@ -83,11 +77,9 @@ } ], "source": [ - "N_ks = 15 # number of k-points in each direction\n", - "N_k_axis = np.linspace(0, 2 * np.pi, N_ks, endpoint=False)\n", - "hamiltonians_0 = np.array(\n", - " [[hamiltonian_return(kx, ky) for kx in N_k_axis] for ky in N_k_axis]\n", - ")\n", + "nk = 15 # number of k-points in each direction\n", + "ks = np.linspace(0, 2 * np.pi, nk, endpoint=False)\n", + "hamiltonians_0 = utils.syst2hamiltonian(syst=wrapped_fsyst, kxs=ks, kys=ks)\n", "\n", "vals0, vecs0 = np.linalg.eigh(hamiltonians_0)\n", "for i in range(len(vals0[:, 0, 0])):\n", @@ -97,70 +89,7 @@ }, { "cell_type": "code", - "execution_count": 144, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "def mean_field_F(vals, vecs, E_F=0):\n", - " N_ks = vals.shape[0]\n", - "\n", - " def mf_generator(i, j):\n", - " vals_i = vals[i, j, :]\n", - " vecs_i = vecs[i, j, :, :]\n", - " n_occ = vals_i < E_F\n", - " occ_vecs = vecs_i[:, n_occ]\n", - " F_ij = occ_vecs @ occ_vecs.conj().T\n", - " return F_ij\n", - "\n", - " F = np.array([[mf_generator(i, j) for i in range(N_ks)] for j in range(N_ks)])\n", - " return F\n", - "\n", - "\n", - "def get_fermi_energy(vals_flat, filling):\n", - " ne = len(vals_flat)\n", - " ifermi = int(round(ne * filling)) # index for fermi\n", - " if ifermi >= ne:\n", - " ifermi = ne - 1\n", - " sorte = np.sort(vals_flat) # sorted eigenvalues\n", - " if ifermi == 0:\n", - " return sorte[0]\n", - " fermi = (sorte[ifermi - 1] + sorte[ifermi]) / 2.0 # fermi energy\n", - " return fermi\n", - "\n", - "\n", - "from scipy.signal import convolve2d\n", - "\n", - "\n", - "def convolution(M1, M2):\n", - " cell_size = Vk.shape[2]\n", - " V_output = np.array(\n", - " [\n", - " [\n", - " convolve2d(M1[:, :, i, j], M2[:, :, i, j], boundary=\"wrap\", mode=\"same\")\n", - " for i in range(cell_size)\n", - " ]\n", - " for j in range(cell_size)\n", - " ]\n", - " )\n", - " V_output = np.transpose(V_output, axes=(2, 3, 0, 1))\n", - " return V_output\n", - "\n", - "\n", - "def dm(mf0,mf):\n", - " return np.mean(np.abs(mf - mf0))\n", - "\n", - "def energy_per_atom(vals, E_F):\n", - " N_filling = np.sum((vals < E_F).flatten())\n", - " E_total = np.sum(vals[vals < E_F].flatten())\n", - " E_p_atom = E_total / N_filling\n", - " return E_p_atom" - ] - }, - { - "cell_type": "code", - "execution_count": 145, + "execution_count": 3, "metadata": { "tags": [] }, @@ -173,88 +102,52 @@ " rij = np.linalg.norm(site1.pos - site2.pos)\n", " return V * np.ones((2, 2))\n", "\n", - "lattice = graphene\n", - "syst = wrapped_syst_unfinalized\n", - "\n", - "@np.vectorize\n", - "def compute_Vk(dummy_syst, kx, ky, params={}):\n", - " V = dummy_syst.hamiltonian_submatrix(params={**params, **dict(k_x=kx, k_y=ky)})\n", - " return V\n", - "\n", - "\n", - "def potential_to_hamiltonian(\n", - " syst, lattice, func_onsite, func_hop, params, max_neighbor=2, single_k = False, k_point=None\n", - "):\n", - " V = kwant.Builder(kwant.TranslationalSymmetry(*lattice.prim_vecs))\n", - " V[syst.sites()] = func_onsite\n", - " V[lattice.neighbors()] = func_hop\n", - " wrapped_V = kwant.wraparound.wraparound(V).finalized()\n", - " if single_k:\n", - " return compute_Vk(dummy_syst=wrapped_V, kx=k_point[0], ky=k_point[1], params=params)\n", - " else:\n", - " return np.array(\n", - " [\n", - " [\n", - " compute_Vk(dummy_syst=wrapped_V, kx=kx, ky=ky, params=params)\n", - " for kx in N_k_axis\n", - " ]\n", - " for ky in N_k_axis\n", - " ]\n", - " )\n", - "\n", - "Uk = potential_to_hamiltonian(\n", - " syst=wrapped_syst_unfinalized,\n", + "Uk = utils.potential2hamiltonian(\n", + " syst=wrapped_syst,\n", " lattice=graphene,\n", " func_onsite=func_onsite,\n", " func_hop=func_hop,\n", " params=dict(U=1, V=0),\n", + " ks=ks,\n", ")\n", "\n", - "Vk = potential_to_hamiltonian(\n", - " syst=wrapped_syst_unfinalized,\n", + "Vk = utils.potential2hamiltonian(\n", + " syst=wrapped_syst,\n", " lattice=graphene,\n", " func_onsite=func_onsite,\n", " func_hop=func_hop,\n", " params=dict(U=0, V=1),\n", - ")\n", - "\n", - "\n", - "U0 = potential_to_hamiltonian(\n", - " syst=wrapped_syst_unfinalized,\n", - " lattice=graphene,\n", - " func_onsite=func_onsite,\n", - " func_hop=func_hop,\n", - " params=dict(U=1, V=0),\n", - " single_k = True,\n", - " k_point = [0,0]\n", - ")\n", - "\n", - "V0 = potential_to_hamiltonian(\n", - " syst=wrapped_syst_unfinalized,\n", - " lattice=graphene,\n", - " func_onsite=func_onsite,\n", - " func_hop=func_hop,\n", - " params=dict(U=0, V=1),\n", - " single_k = True,\n", - " k_point = [0,0]\n", + " ks=ks,\n", ")" ] }, { "cell_type": "code", - "execution_count": 158, + "execution_count": 4, "metadata": { "tags": [] }, "outputs": [], "source": [ - "Us = np.linspace(0, 5, 100)\n", - "Vs = np.linspace(0, 5, 100)" + "Us = np.linspace(0, 5, 10)\n", + "Vs = np.linspace(0, 5, 10)" ] }, { "cell_type": "code", - "execution_count": 163, + "execution_count": 5, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def dm(mf0,mf):\n", + " return np.mean(np.abs(mf - mf0))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, "metadata": { "tags": [] }, @@ -262,37 +155,40 @@ "source": [ "def scf_loop(U, V):\n", " H_int = U * Uk + V * Vk\n", - " H0_int = U * U0 + V * V0\n", " mixing = 0.6\n", " threshold = 1e-5\n", " for n in range(5000):\n", " if n == 0:\n", - " mf = 0.01 * (np.diag(np.random.rand(4)) - 0.5) # starting guess\n", + " # mf = 0.1 * (np.random.rand(4,4) - 0.5) # starting guess\n", + " mf = 0.1 * np.random.rand(4, 4)# * np.exp(1j * 2 * np.pi * np.random.rand(4, 4))\n", + " mf = 0.5 * (mf + mf.T)#.conj())\n", " hamiltonians = hamiltonians_0 + mf\n", " vals, vecs = np.linalg.eigh(hamiltonians)\n", - " E_F = get_fermi_energy(vals.flatten(), 0.5)\n", - " F = mean_field_F(vals, vecs, E_F=E_F)\n", - " rho = np.diag(np.average(F, axis=(0, 1)))\n", - " exchange_mf = convolution(F, H_int) * N_ks ** (-2)\n", - " direct_mf = np.diag(np.einsum(\"i,ij->j\", rho, H0_int))\n", - "\n", - " mf_new = direct_mf - exchange_mf\n", + " vecs = np.linalg.qr(vecs)[0]\n", + " E_F = utils.get_fermi_energy(vals, 2)\n", + " mf_new = hf.compute_mf(vals, vecs, 2, hamiltonians_0.shape[0], H_int)\n", " hamiltonians = hamiltonians_0 + mixing * mf_new + (1 - mixing) * mf\n", "\n", " vals, vecs = np.linalg.eigh(hamiltonians)\n", - " E_F = get_fermi_energy(vals.flatten(), 0.5)\n", + " vecs = np.linalg.qr(vecs)[0]\n", + " E_F = utils.get_fermi_energy(vals, 2)\n", " delta_m = dm(mf_new, mf)\n", " if delta_m < threshold:\n", - " emax = np.max(vals[vals<=E_F])\n", - " emin = np.min(vals[vals>E_F])\n", - " E_p_atom = energy_per_atom(vals, E_F)\n", + " # # Plot\n", + " # for i in range(len(vals[:, 0, 0])):\n", + " # for j in range(4):\n", + " # plt.plot(vals[i, :, j] - E_F)\n", + " # plt.show()\n", + " # Compute gap\n", + " emax = np.max(vals[vals<E_F])\n", + " emin = np.min(vals[vals>=E_F])\n", " return np.abs(emin - emax)\n", " mf = mf_new" ] }, { "cell_type": "code", - "execution_count": 164, + "execution_count": 14, "metadata": { "tags": [] }, @@ -301,7 +197,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "100%|██████████| 100/100 [53:07<00:00, 31.88s/it]\n" + "100%|██████████| 10/10 [00:27<00:00, 2.78s/it]\n" ] } ], @@ -317,7 +213,7 @@ }, { "cell_type": "code", - "execution_count": 180, + "execution_count": 15, "metadata": { "tags": [] }, @@ -328,7 +224,40 @@ }, { "cell_type": "code", - "execution_count": 192, + "execution_count": 16, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "<matplotlib.colorbar.Colorbar at 0x7fd82887aaa0>" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 640x480 with 2 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.imshow(np.log10(gap).T, origin=\"lower\", extent=(0, 5, 0, 5))#, vmin=-1, vmax=0)\n", + "plt.colorbar()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, "metadata": { "tags": [] }, @@ -336,16 +265,16 @@ { "data": { "text/plain": [ - "<matplotlib.colorbar.Colorbar at 0x7f27e224de70>" + "<matplotlib.colorbar.Colorbar at 0x7fd82ae690f0>" ] }, - "execution_count": 192, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "<Figure size 640x480 with 2 Axes>" ] @@ -355,9 +284,16 @@ } ], "source": [ - "plt.imshow(np.log10(gap).T, origin='lower', extent=(0, 5, 0, 5), vmin=-1, vmax=0.5)\n", + "plt.imshow((gap).T, origin=\"lower\", extent=(0, 5, 0, 5))#, vmin=-3, vmax=0)\n", "plt.colorbar()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { -- GitLab