{ "cells": [ { "cell_type": "markdown", "id": "457fb52c-7f5c-4895-9e1c-de0b3ba559ef", "metadata": {}, "source": [ "# Tutorial Tiles\n", "\n", "Tiles is a module to compute vectors that respect a certain symmetry, the symmetry of a superlattice.\n", "The only requirement for computations to make sense, is that the system is closed and has periodic boundaries, in which case it constitutes a superlattice.\n", "\n", "These vectors are used to compute momentum-resolved spectral densities, or expectation values of any operator acting on the closed system.\n", "\n", "The advantage of using `tiles` instad of local vectors, is that we can do Brillouin zone-unfolding; a procedure to compute the unfolded bands of superlattices.\n", "\n", "Another benefit is that we can compute momentum-resolved spectral densities, even when the translation symmetry is broken or the system is disordered.\n", "\n", "For example, if we would like to simulate the ARPES measurement of a non-pristine crystalline surface, the momentum components of a moire superlattice, then can use `tiles` to compute them.\n" ] }, { "cell_type": "code", "execution_count": 1, "id": "b6bfe28c-e8c4-4b16-adbb-0e63802854fc", "metadata": {}, "outputs": [], "source": [ "from kpm_tools.tiles import (\n", " tile_random_kvectors, TileKVectors,\n", " momentum_to_ts\n", ")\n", "from kpm_tools.kpm_generator import SpectralDensityIterator\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "675c9792-2f13-4995-b83d-d6af25219e3c", "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "(function(root) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " var force = true;\n", " var py_version = '3.3.2'.replace('rc', '-rc.').replace('.dev', '-dev.');\n", " var reloading = false;\n", " var Bokeh = root.Bokeh;\n", "\n", " if (typeof (root._bokeh_timeout) === \"undefined\" || force) {\n", " root._bokeh_timeout = Date.now() + 5000;\n", " root._bokeh_failed_load = false;\n", " }\n", "\n", " function run_callbacks() {\n", " try {\n", " root._bokeh_onload_callbacks.forEach(function(callback) {\n", " if (callback != null)\n", " callback();\n", " });\n", " } finally {\n", " delete root._bokeh_onload_callbacks;\n", " }\n", " console.debug(\"Bokeh: all callbacks have finished\");\n", " }\n", "\n", " function load_libs(css_urls, js_urls, js_modules, js_exports, callback) {\n", " if (css_urls == null) css_urls = [];\n", " if (js_urls == null) js_urls = [];\n", " if (js_modules == null) js_modules = [];\n", " if (js_exports == null) js_exports = {};\n", "\n", " root._bokeh_onload_callbacks.push(callback);\n", "\n", " if (root._bokeh_is_loading > 0) {\n", " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", " return null;\n", " }\n", " if (js_urls.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n", " run_callbacks();\n", " return null;\n", " }\n", " if (!reloading) {\n", " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", " }\n", "\n", " function on_load() {\n", " root._bokeh_is_loading--;\n", " if (root._bokeh_is_loading === 0) {\n", " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n", " run_callbacks()\n", " }\n", " }\n", " window._bokeh_on_load = on_load\n", "\n", " function on_error() {\n", " console.error(\"failed to load \" + url);\n", " }\n", "\n", " var skip = [];\n", " if (window.requirejs) {\n", " window.requirejs.config({'packages': {}, 'paths': {'jspanel': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/jspanel', 'jspanel-modal': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal', 'jspanel-tooltip': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip', 'jspanel-hint': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint', 'jspanel-layout': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout', 'jspanel-contextmenu': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu', 'jspanel-dock': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock', 'gridstack': 'https://cdn.jsdelivr.net/npm/gridstack@7.2.3/dist/gridstack-all', 'notyf': 'https://cdn.jsdelivr.net/npm/notyf@3/notyf.min'}, 'shim': {'jspanel': {'exports': 'jsPanel'}, 'gridstack': {'exports': 'GridStack'}}});\n", " require([\"jspanel\"], function(jsPanel) {\n", "\twindow.jsPanel = jsPanel\n", "\ton_load()\n", " })\n", " require([\"jspanel-modal\"], function() {\n", "\ton_load()\n", " })\n", " require([\"jspanel-tooltip\"], function() {\n", "\ton_load()\n", " })\n", " require([\"jspanel-hint\"], function() {\n", "\ton_load()\n", " })\n", " require([\"jspanel-layout\"], function() {\n", "\ton_load()\n", " })\n", " require([\"jspanel-contextmenu\"], function() {\n", "\ton_load()\n", " })\n", " require([\"jspanel-dock\"], function() {\n", "\ton_load()\n", " })\n", " require([\"gridstack\"], function(GridStack) {\n", "\twindow.GridStack = GridStack\n", "\ton_load()\n", " })\n", " require([\"notyf\"], function() {\n", "\ton_load()\n", " })\n", " root._bokeh_is_loading = css_urls.length + 9;\n", " } else {\n", " root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n", " }\n", "\n", " var existing_stylesheets = []\n", " var links = document.getElementsByTagName('link')\n", " for (var i = 0; i < links.length; i++) {\n", " var link = links[i]\n", " if (link.href != null) {\n", "\texisting_stylesheets.push(link.href)\n", " }\n", " }\n", " for (var i = 0; i < css_urls.length; i++) {\n", " var url = css_urls[i];\n", " if (existing_stylesheets.indexOf(url) !== -1) {\n", "\ton_load()\n", "\tcontinue;\n", " }\n", " const element = document.createElement(\"link\");\n", " element.onload = on_load;\n", " element.onerror = on_error;\n", " element.rel = \"stylesheet\";\n", " element.type = \"text/css\";\n", " element.href = url;\n", " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", " document.body.appendChild(element);\n", " } if (((window['jsPanel'] !== undefined) && (!(window['jsPanel'] instanceof HTMLElement))) || window.requirejs) {\n", " var urls = ['https://cdn.holoviz.org/panel/1.3.6/dist/bundled/floatpanel/jspanel4@4.12.0/dist/jspanel.js', 'https://cdn.holoviz.org/panel/1.3.6/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal.js', 'https://cdn.holoviz.org/panel/1.3.6/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip.js', 'https://cdn.holoviz.org/panel/1.3.6/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint.js', 'https://cdn.holoviz.org/panel/1.3.6/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout.js', 'https://cdn.holoviz.org/panel/1.3.6/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu.js', 'https://cdn.holoviz.org/panel/1.3.6/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock.js'];\n", " for (var i = 0; i < urls.length; i++) {\n", " skip.push(urls[i])\n", " }\n", " } if (((window['GridStack'] !== undefined) && (!(window['GridStack'] instanceof HTMLElement))) || window.requirejs) {\n", " var urls = ['https://cdn.holoviz.org/panel/1.3.6/dist/bundled/gridstack/gridstack@7.2.3/dist/gridstack-all.js'];\n", " for (var i = 0; i < urls.length; i++) {\n", " skip.push(urls[i])\n", " }\n", " } if (((window['Notyf'] !== undefined) && (!(window['Notyf'] instanceof HTMLElement))) || window.requirejs) {\n", " var urls = ['https://cdn.holoviz.org/panel/1.3.6/dist/bundled/notificationarea/notyf@3/notyf.min.js'];\n", " for (var i = 0; i < urls.length; i++) {\n", " skip.push(urls[i])\n", " }\n", " } var existing_scripts = []\n", " var scripts = document.getElementsByTagName('script')\n", " for (var i = 0; i < scripts.length; i++) {\n", " var script = scripts[i]\n", " if (script.src != null) {\n", "\texisting_scripts.push(script.src)\n", " }\n", " }\n", " for (var i = 0; i < js_urls.length; i++) {\n", " var url = js_urls[i];\n", " if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n", "\tif (!window.requirejs) {\n", "\t on_load();\n", "\t}\n", "\tcontinue;\n", " }\n", " var element = document.createElement('script');\n", " element.onload = on_load;\n", " element.onerror = on_error;\n", " element.async = false;\n", " element.src = url;\n", " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " document.head.appendChild(element);\n", " }\n", " for (var i = 0; i < js_modules.length; i++) {\n", " var url = js_modules[i];\n", " if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n", "\tif (!window.requirejs) {\n", "\t on_load();\n", "\t}\n", "\tcontinue;\n", " }\n", " var element = document.createElement('script');\n", " element.onload = on_load;\n", " element.onerror = on_error;\n", " element.async = false;\n", " element.src = url;\n", " element.type = \"module\";\n", " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " document.head.appendChild(element);\n", " }\n", " for (const name in js_exports) {\n", " var url = js_exports[name];\n", " if (skip.indexOf(url) >= 0 || root[name] != null) {\n", "\tif (!window.requirejs) {\n", "\t on_load();\n", "\t}\n", "\tcontinue;\n", " }\n", " var element = document.createElement('script');\n", " element.onerror = on_error;\n", " element.async = false;\n", " element.type = \"module\";\n", " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " element.textContent = `\n", " import ${name} from \"${url}\"\n", " window.${name} = ${name}\n", " window._bokeh_on_load()\n", " `\n", " document.head.appendChild(element);\n", " }\n", " if (!js_urls.length && !js_modules.length) {\n", " on_load()\n", " }\n", " };\n", "\n", " function inject_raw_css(css) {\n", " const element = document.createElement(\"style\");\n", " element.appendChild(document.createTextNode(css));\n", " document.body.appendChild(element);\n", " }\n", "\n", " var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.3.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.3.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.3.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.3.2.min.js\", \"https://cdn.holoviz.org/panel/1.3.6/dist/panel.min.js\"];\n", " var js_modules = [];\n", " var js_exports = {};\n", " var css_urls = [];\n", " var inline_js = [ function(Bokeh) {\n", " Bokeh.set_log_level(\"info\");\n", " },\n", "function(Bokeh) {} // ensure no trailing comma for IE\n", " ];\n", "\n", " function run_inline_js() {\n", " if ((root.Bokeh !== undefined) || (force === true)) {\n", " for (var i = 0; i < inline_js.length; i++) {\n", "\ttry {\n", " inline_js[i].call(root, root.Bokeh);\n", "\t} catch(e) {\n", "\t if (!reloading) {\n", "\t throw e;\n", "\t }\n", "\t}\n", " }\n", " // Cache old bokeh versions\n", " if (Bokeh != undefined && !reloading) {\n", "\tvar NewBokeh = root.Bokeh;\n", "\tif (Bokeh.versions === undefined) {\n", "\t Bokeh.versions = new Map();\n", "\t}\n", "\tif (NewBokeh.version !== Bokeh.version) {\n", "\t Bokeh.versions.set(NewBokeh.version, NewBokeh)\n", "\t}\n", "\troot.Bokeh = Bokeh;\n", " }} else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(run_inline_js, 100);\n", " } else if (!root._bokeh_failed_load) {\n", " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", " root._bokeh_failed_load = true;\n", " }\n", " root._bokeh_is_initializing = false\n", " }\n", "\n", " function load_or_wait() {\n", " // Implement a backoff loop that tries to ensure we do not load multiple\n", " // versions of Bokeh and its dependencies at the same time.\n", " // In recent versions we use the root._bokeh_is_initializing flag\n", " // to determine whether there is an ongoing attempt to initialize\n", " // bokeh, however for backward compatibility we also try to ensure\n", " // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n", " // before older versions are fully initialized.\n", " if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n", " root._bokeh_is_initializing = false;\n", " root._bokeh_onload_callbacks = undefined;\n", " console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n", " load_or_wait();\n", " } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n", " setTimeout(load_or_wait, 100);\n", " } else {\n", " root._bokeh_is_initializing = true\n", " root._bokeh_onload_callbacks = []\n", " var bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n", " if (!reloading && !bokeh_loaded) {\n", "\troot.Bokeh = undefined;\n", " }\n", " load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n", "\tconsole.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", "\trun_inline_js();\n", " });\n", " }\n", " }\n", " // Give older versions of the autoload script a head-start to ensure\n", " // they initialize before we start loading newer version.\n", " setTimeout(load_or_wait, 100)\n", "}(window));" ], "application/vnd.holoviews_load.v0+json": "(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n var py_version = '3.3.2'.replace('rc', '-rc.').replace('.dev', '-dev.');\n var reloading = false;\n var Bokeh = root.Bokeh;\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks;\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, js_modules, js_exports, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n if (js_modules == null) js_modules = [];\n if (js_exports == null) js_exports = {};\n\n root._bokeh_onload_callbacks.push(callback);\n\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n run_callbacks();\n return null;\n }\n if (!reloading) {\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n }\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n window._bokeh_on_load = on_load\n\n function on_error() {\n console.error(\"failed to load \" + url);\n }\n\n var skip = [];\n if (window.requirejs) {\n window.requirejs.config({'packages': {}, 'paths': {'jspanel': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/jspanel', 'jspanel-modal': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal', 'jspanel-tooltip': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip', 'jspanel-hint': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint', 'jspanel-layout': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout', 'jspanel-contextmenu': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu', 'jspanel-dock': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock', 'gridstack': 'https://cdn.jsdelivr.net/npm/gridstack@7.2.3/dist/gridstack-all', 'notyf': 'https://cdn.jsdelivr.net/npm/notyf@3/notyf.min'}, 'shim': {'jspanel': {'exports': 'jsPanel'}, 'gridstack': {'exports': 'GridStack'}}});\n require([\"jspanel\"], function(jsPanel) {\n\twindow.jsPanel = jsPanel\n\ton_load()\n })\n require([\"jspanel-modal\"], function() {\n\ton_load()\n })\n require([\"jspanel-tooltip\"], function() {\n\ton_load()\n })\n require([\"jspanel-hint\"], function() {\n\ton_load()\n })\n require([\"jspanel-layout\"], function() {\n\ton_load()\n })\n require([\"jspanel-contextmenu\"], function() {\n\ton_load()\n })\n require([\"jspanel-dock\"], function() {\n\ton_load()\n })\n require([\"gridstack\"], function(GridStack) {\n\twindow.GridStack = GridStack\n\ton_load()\n })\n require([\"notyf\"], function() {\n\ton_load()\n })\n root._bokeh_is_loading = css_urls.length + 9;\n } else {\n root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n }\n\n var existing_stylesheets = []\n var links = document.getElementsByTagName('link')\n for (var i = 0; i < links.length; i++) {\n var link = links[i]\n if (link.href != null) {\n\texisting_stylesheets.push(link.href)\n }\n }\n for (var i = 0; i < css_urls.length; i++) {\n var url = css_urls[i];\n if (existing_stylesheets.indexOf(url) !== -1) {\n\ton_load()\n\tcontinue;\n }\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n } if (((window['jsPanel'] !== undefined) && (!(window['jsPanel'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/1.3.6/dist/bundled/floatpanel/jspanel4@4.12.0/dist/jspanel.js', 'https://cdn.holoviz.org/panel/1.3.6/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal.js', 'https://cdn.holoviz.org/panel/1.3.6/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip.js', 'https://cdn.holoviz.org/panel/1.3.6/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint.js', 'https://cdn.holoviz.org/panel/1.3.6/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout.js', 'https://cdn.holoviz.org/panel/1.3.6/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu.js', 'https://cdn.holoviz.org/panel/1.3.6/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } if (((window['GridStack'] !== undefined) && (!(window['GridStack'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/1.3.6/dist/bundled/gridstack/gridstack@7.2.3/dist/gridstack-all.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } if (((window['Notyf'] !== undefined) && (!(window['Notyf'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/1.3.6/dist/bundled/notificationarea/notyf@3/notyf.min.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } var existing_scripts = []\n var scripts = document.getElementsByTagName('script')\n for (var i = 0; i < scripts.length; i++) {\n var script = scripts[i]\n if (script.src != null) {\n\texisting_scripts.push(script.src)\n }\n }\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (var i = 0; i < js_modules.length; i++) {\n var url = js_modules[i];\n if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (const name in js_exports) {\n var url = js_exports[name];\n if (skip.indexOf(url) >= 0 || root[name] != null) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onerror = on_error;\n element.async = false;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n element.textContent = `\n import ${name} from \"${url}\"\n window.${name} = ${name}\n window._bokeh_on_load()\n `\n document.head.appendChild(element);\n }\n if (!js_urls.length && !js_modules.length) {\n on_load()\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.3.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.3.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.3.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.3.2.min.js\", \"https://cdn.holoviz.org/panel/1.3.6/dist/panel.min.js\"];\n var js_modules = [];\n var js_exports = {};\n var css_urls = [];\n var inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n\ttry {\n inline_js[i].call(root, root.Bokeh);\n\t} catch(e) {\n\t if (!reloading) {\n\t throw e;\n\t }\n\t}\n }\n // Cache old bokeh versions\n if (Bokeh != undefined && !reloading) {\n\tvar NewBokeh = root.Bokeh;\n\tif (Bokeh.versions === undefined) {\n\t Bokeh.versions = new Map();\n\t}\n\tif (NewBokeh.version !== Bokeh.version) {\n\t Bokeh.versions.set(NewBokeh.version, NewBokeh)\n\t}\n\troot.Bokeh = Bokeh;\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n }\n root._bokeh_is_initializing = false\n }\n\n function load_or_wait() {\n // Implement a backoff loop that tries to ensure we do not load multiple\n // versions of Bokeh and its dependencies at the same time.\n // In recent versions we use the root._bokeh_is_initializing flag\n // to determine whether there is an ongoing attempt to initialize\n // bokeh, however for backward compatibility we also try to ensure\n // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n // before older versions are fully initialized.\n if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n root._bokeh_is_initializing = false;\n root._bokeh_onload_callbacks = undefined;\n console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n load_or_wait();\n } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n setTimeout(load_or_wait, 100);\n } else {\n root._bokeh_is_initializing = true\n root._bokeh_onload_callbacks = []\n var bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n if (!reloading && !bokeh_loaded) {\n\troot.Bokeh = undefined;\n }\n load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n\tconsole.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n\trun_inline_js();\n });\n }\n }\n // Give older versions of the autoload script a head-start to ensure\n // they initialize before we start loading newer version.\n setTimeout(load_or_wait, 100)\n}(window));" }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", "if ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n", " window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n", "}\n", "\n", "\n", " function JupyterCommManager() {\n", " }\n", "\n", " JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n", " if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n", " var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n", " comm_manager.register_target(comm_id, function(comm) {\n", " comm.on_msg(msg_handler);\n", " });\n", " } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n", " window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n", " comm.onMsg = msg_handler;\n", " });\n", " } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n", " google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n", " var messages = comm.messages[Symbol.asyncIterator]();\n", " function processIteratorResult(result) {\n", " var message = result.value;\n", " console.log(message)\n", " var content = {data: message.data, comm_id};\n", " var buffers = []\n", " for (var buffer of message.buffers || []) {\n", " buffers.push(new DataView(buffer))\n", " }\n", " var metadata = message.metadata || {};\n", " var msg = {content, buffers, metadata}\n", " msg_handler(msg);\n", " return messages.next().then(processIteratorResult);\n", " }\n", " return messages.next().then(processIteratorResult);\n", " })\n", " }\n", " }\n", "\n", " JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n", " if (comm_id in window.PyViz.comms) {\n", " return window.PyViz.comms[comm_id];\n", " } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n", " var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n", " var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n", " if (msg_handler) {\n", " comm.on_msg(msg_handler);\n", " }\n", " } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n", " var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n", " comm.open();\n", " if (msg_handler) {\n", " comm.onMsg = msg_handler;\n", " }\n", " } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n", " var comm_promise = google.colab.kernel.comms.open(comm_id)\n", " comm_promise.then((comm) => {\n", " window.PyViz.comms[comm_id] = comm;\n", " if (msg_handler) {\n", " var messages = comm.messages[Symbol.asyncIterator]();\n", " function processIteratorResult(result) {\n", " var message = result.value;\n", " var content = {data: message.data};\n", " var metadata = message.metadata || {comm_id};\n", " var msg = {content, metadata}\n", " msg_handler(msg);\n", " return messages.next().then(processIteratorResult);\n", " }\n", " return messages.next().then(processIteratorResult);\n", " }\n", " }) \n", " var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n", " return comm_promise.then((comm) => {\n", " comm.send(data, metadata, buffers, disposeOnDone);\n", " });\n", " };\n", " var comm = {\n", " send: sendClosure\n", " };\n", " }\n", " window.PyViz.comms[comm_id] = comm;\n", " return comm;\n", " }\n", " window.PyViz.comm_manager = new JupyterCommManager();\n", " \n", "\n", "\n", "var JS_MIME_TYPE = 'application/javascript';\n", "var HTML_MIME_TYPE = 'text/html';\n", "var EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\n", "var CLASS_NAME = 'output';\n", "\n", "/**\n", " * Render data to the DOM node\n", " */\n", "function render(props, node) {\n", " var div = document.createElement(\"div\");\n", " var script = document.createElement(\"script\");\n", " node.appendChild(div);\n", " node.appendChild(script);\n", "}\n", "\n", "/**\n", " * Handle when a new output is added\n", " */\n", "function handle_add_output(event, handle) {\n", " var output_area = handle.output_area;\n", " var output = handle.output;\n", " if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n", " return\n", " }\n", " var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", " if (id !== undefined) {\n", " var nchildren = toinsert.length;\n", " var html_node = toinsert[nchildren-1].children[0];\n", " html_node.innerHTML = output.data[HTML_MIME_TYPE];\n", " var scripts = [];\n", " var nodelist = html_node.querySelectorAll(\"script\");\n", " for (var i in nodelist) {\n", " if (nodelist.hasOwnProperty(i)) {\n", " scripts.push(nodelist[i])\n", " }\n", " }\n", "\n", " scripts.forEach( function (oldScript) {\n", " var newScript = document.createElement(\"script\");\n", " var attrs = [];\n", " var nodemap = oldScript.attributes;\n", " for (var j in nodemap) {\n", " if (nodemap.hasOwnProperty(j)) {\n", " attrs.push(nodemap[j])\n", " }\n", " }\n", " attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n", " newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n", " oldScript.parentNode.replaceChild(newScript, oldScript);\n", " });\n", " if (JS_MIME_TYPE in output.data) {\n", " toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n", " }\n", " output_area._hv_plot_id = id;\n", " if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n", " window.PyViz.plot_index[id] = Bokeh.index[id];\n", " } else {\n", " window.PyViz.plot_index[id] = null;\n", " }\n", " } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", " var bk_div = document.createElement(\"div\");\n", " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", " var script_attrs = bk_div.children[0].attributes;\n", " for (var i = 0; i < script_attrs.length; i++) {\n", " toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n", " }\n", " // store reference to server id on output_area\n", " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", " }\n", "}\n", "\n", "/**\n", " * Handle when an output is cleared or removed\n", " */\n", "function handle_clear_output(event, handle) {\n", " var id = handle.cell.output_area._hv_plot_id;\n", " var server_id = handle.cell.output_area._bokeh_server_id;\n", " if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n", " var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n", " if (server_id !== null) {\n", " comm.send({event_type: 'server_delete', 'id': server_id});\n", " return;\n", " } else if (comm !== null) {\n", " comm.send({event_type: 'delete', 'id': id});\n", " }\n", " delete PyViz.plot_index[id];\n", " if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n", " var doc = window.Bokeh.index[id].model.document\n", " doc.clear();\n", " const i = window.Bokeh.documents.indexOf(doc);\n", " if (i > -1) {\n", " window.Bokeh.documents.splice(i, 1);\n", " }\n", " }\n", "}\n", "\n", "/**\n", " * Handle kernel restart event\n", " */\n", "function handle_kernel_cleanup(event, handle) {\n", " delete PyViz.comms[\"hv-extension-comm\"];\n", " window.PyViz.plot_index = {}\n", "}\n", "\n", "/**\n", " * Handle update_display_data messages\n", " */\n", "function handle_update_output(event, handle) {\n", " handle_clear_output(event, {cell: {output_area: handle.output_area}})\n", " handle_add_output(event, handle)\n", "}\n", "\n", "function register_renderer(events, OutputArea) {\n", " function append_mime(data, metadata, element) {\n", " // create a DOM node to render to\n", " var toinsert = this.create_output_subarea(\n", " metadata,\n", " CLASS_NAME,\n", " EXEC_MIME_TYPE\n", " );\n", " this.keyboard_manager.register_events(toinsert);\n", " // Render to node\n", " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", " render(props, toinsert[0]);\n", " element.append(toinsert);\n", " return toinsert\n", " }\n", "\n", " events.on('output_added.OutputArea', handle_add_output);\n", " events.on('output_updated.OutputArea', handle_update_output);\n", " events.on('clear_output.CodeCell', handle_clear_output);\n", " events.on('delete.Cell', handle_clear_output);\n", " events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n", "\n", " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", " safe: true,\n", " index: 0\n", " });\n", "}\n", "\n", "if (window.Jupyter !== undefined) {\n", " try {\n", " var events = require('base/js/events');\n", " var OutputArea = require('notebook/js/outputarea').OutputArea;\n", " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", " register_renderer(events, OutputArea);\n", " }\n", " } catch(err) {\n", " }\n", "}\n" ], "application/vnd.holoviews_load.v0+json": "\nif ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n}\n\n\n function JupyterCommManager() {\n }\n\n JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n comm_manager.register_target(comm_id, function(comm) {\n comm.on_msg(msg_handler);\n });\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n comm.onMsg = msg_handler;\n });\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n console.log(message)\n var content = {data: message.data, comm_id};\n var buffers = []\n for (var buffer of message.buffers || []) {\n buffers.push(new DataView(buffer))\n }\n var metadata = message.metadata || {};\n var msg = {content, buffers, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n })\n }\n }\n\n JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n if (comm_id in window.PyViz.comms) {\n return window.PyViz.comms[comm_id];\n } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n if (msg_handler) {\n comm.on_msg(msg_handler);\n }\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n comm.open();\n if (msg_handler) {\n comm.onMsg = msg_handler;\n }\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n var comm_promise = google.colab.kernel.comms.open(comm_id)\n comm_promise.then((comm) => {\n window.PyViz.comms[comm_id] = comm;\n if (msg_handler) {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data};\n var metadata = message.metadata || {comm_id};\n var msg = {content, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n }\n }) \n var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n return comm_promise.then((comm) => {\n comm.send(data, metadata, buffers, disposeOnDone);\n });\n };\n var comm = {\n send: sendClosure\n };\n }\n window.PyViz.comms[comm_id] = comm;\n return comm;\n }\n window.PyViz.comm_manager = new JupyterCommManager();\n \n\n\nvar JS_MIME_TYPE = 'application/javascript';\nvar HTML_MIME_TYPE = 'text/html';\nvar EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\nvar CLASS_NAME = 'output';\n\n/**\n * Render data to the DOM node\n */\nfunction render(props, node) {\n var div = document.createElement(\"div\");\n var script = document.createElement(\"script\");\n node.appendChild(div);\n node.appendChild(script);\n}\n\n/**\n * Handle when a new output is added\n */\nfunction handle_add_output(event, handle) {\n var output_area = handle.output_area;\n var output = handle.output;\n if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n return\n }\n var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n if (id !== undefined) {\n var nchildren = toinsert.length;\n var html_node = toinsert[nchildren-1].children[0];\n html_node.innerHTML = output.data[HTML_MIME_TYPE];\n var scripts = [];\n var nodelist = html_node.querySelectorAll(\"script\");\n for (var i in nodelist) {\n if (nodelist.hasOwnProperty(i)) {\n scripts.push(nodelist[i])\n }\n }\n\n scripts.forEach( function (oldScript) {\n var newScript = document.createElement(\"script\");\n var attrs = [];\n var nodemap = oldScript.attributes;\n for (var j in nodemap) {\n if (nodemap.hasOwnProperty(j)) {\n attrs.push(nodemap[j])\n }\n }\n attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n oldScript.parentNode.replaceChild(newScript, oldScript);\n });\n if (JS_MIME_TYPE in output.data) {\n toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n }\n output_area._hv_plot_id = id;\n if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n window.PyViz.plot_index[id] = Bokeh.index[id];\n } else {\n window.PyViz.plot_index[id] = null;\n }\n } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n var bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n var script_attrs = bk_div.children[0].attributes;\n for (var i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n}\n\n/**\n * Handle when an output is cleared or removed\n */\nfunction handle_clear_output(event, handle) {\n var id = handle.cell.output_area._hv_plot_id;\n var server_id = handle.cell.output_area._bokeh_server_id;\n if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n if (server_id !== null) {\n comm.send({event_type: 'server_delete', 'id': server_id});\n return;\n } else if (comm !== null) {\n comm.send({event_type: 'delete', 'id': id});\n }\n delete PyViz.plot_index[id];\n if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n var doc = window.Bokeh.index[id].model.document\n doc.clear();\n const i = window.Bokeh.documents.indexOf(doc);\n if (i > -1) {\n window.Bokeh.documents.splice(i, 1);\n }\n }\n}\n\n/**\n * Handle kernel restart event\n */\nfunction handle_kernel_cleanup(event, handle) {\n delete PyViz.comms[\"hv-extension-comm\"];\n window.PyViz.plot_index = {}\n}\n\n/**\n * Handle update_display_data messages\n */\nfunction handle_update_output(event, handle) {\n handle_clear_output(event, {cell: {output_area: handle.output_area}})\n handle_add_output(event, handle)\n}\n\nfunction register_renderer(events, OutputArea) {\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n var toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[0]);\n element.append(toinsert);\n return toinsert\n }\n\n events.on('output_added.OutputArea', handle_add_output);\n events.on('output_updated.OutputArea', handle_update_output);\n events.on('clear_output.CodeCell', handle_clear_output);\n events.on('delete.Cell', handle_clear_output);\n events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n safe: true,\n index: 0\n });\n}\n\nif (window.Jupyter !== undefined) {\n try {\n var events = require('base/js/events');\n var OutputArea = require('notebook/js/outputarea').OutputArea;\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n } catch(err) {\n }\n}\n" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.holoviews_exec.v0+json": "", "text/html": [ "
\n", "
\n", "
\n", "" ] }, "metadata": { "application/vnd.holoviews_exec.v0+json": { "id": "p1002" } }, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "
\n", "\n", "\n", "\n", "\n", "\n", " \n", " \n", "\n", "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot, matplotlib.backends\n", "import holoviews as hv\n", "hv.extension()\n" ] }, { "cell_type": "code", "execution_count": 3, "id": "bb7583fb-dd34-46a3-a6e8-09d7264e2ab8", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "5c0635bc-dceb-41d3-9c0f-27156f90fbfe", "metadata": {}, "outputs": [], "source": [ "import kwant\n", "from concurrent.futures import ProcessPoolExecutor\n", "from kpm_tools.kpm_generator import _BaseKPM\n" ] }, { "cell_type": "markdown", "id": "d2058ba6-3d20-4156-80b0-e20d8fe6e9b3", "metadata": {}, "source": [ "We define globally the `honeycomb` lattice, in part to define a `tile`:" ] }, { "cell_type": "code", "execution_count": 5, "id": "2ec765b7-b2f9-4d4a-9c1d-d329de20226f", "metadata": {}, "outputs": [], "source": [ "honeycomb = kwant.lattice.honeycomb(norbs=1, name=[\"a\", \"b\"])\n" ] }, { "cell_type": "markdown", "id": "771661d6-0349-4abc-b5d1-43b5cb0a7964", "metadata": {}, "source": [ "However, we don't need to restrict the tiles to one unitcell of the lattice, it could span several unitcells, as long as it's commensurate with the superlattice plus the periodic boundary conditions." ] }, { "cell_type": "code", "execution_count": 6, "id": "f211dbd7-57f2-485b-bac3-e4cd0a78dccc", "metadata": {}, "outputs": [], "source": [ "def make_superlattice(tags_1=[1, 0], tags_2=[0, 1], disorder=0):\n", " def disorder_onsite(site, disorder):\n", " return disorder * kwant.digest.uniform(bytes(str(site), \"UTF8\"))\n", " period_1 = honeycomb.prim_vecs.T @ tags_1\n", " period_2 = honeycomb.prim_vecs.T @ tags_2\n", " symm = kwant.TranslationalSymmetry(period_1, period_2)\n", " builder = kwant.Builder(symmetry=symm)\n", "\n", " builder[honeycomb.shape(lambda s: True, (0, 0))] = disorder_onsite\n", "\n", " builder[honeycomb.neighbors()] = 1\n", "\n", " return kwant.wraparound.wraparound(builder).finalized()\n" ] }, { "cell_type": "code", "execution_count": 7, "id": "58d1c852-9565-4973-9cab-b63a377dab40", "metadata": {}, "outputs": [], "source": [ "fsyst = make_superlattice(tags_1=[3, 0], tags_2=[0, 1], disorder=0.5)\n" ] }, { "cell_type": "code", "execution_count": 8, "id": "4738437a-e74c-46a0-b197-18a3081e3560", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi8AAAFKCAYAAADVBb8wAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABchklEQVR4nO3dd1wT9/8H8FcCJIAsFWQL7ok4Koij2ooK9OtobWvdtY4ObUGtioriqHsgtlpbq7XVWq3W0Z8iDhQXKIqiorg3U1T2Csnn9wc1LRWQYC53l7yfj0cereFyn/cnd5d73/s+dydhjDEQQgghhIiElO8ACCGEEEI0QckLIYQQQkSFkhdCCCGEiAolL4QQQggRFUpeCCGEECIqlLwQQgghRFQoeSGEEEKIqFDyQgghhBBRMeY7AG1TqVRISUmBpaUlJBIJ3+EQQgghpBoYY8jNzYWTkxOk0qprK3qXvKSkpMDV1ZXvMAghhBBSA48ePYKLi0uV0+hd8mJpaQmgrPNWVlY8R0MIIYSQ6sjJyYGrq6t6P14VvUteXpwqsrKyouSFEEIIEZnqDPmgAbuEEEIIERVKXgghhBAiKpS8EEIIIURUKHkhhBBCiKhQ8kIIIYQQUaHkhRBCCCGiQskLIYQQQkSFkhdCCCGEiAolL4QQQggRFUpeCCGEECIqlLwQQgghRFQoeSGEEEKIqFDyQgghhBBRoeSFEEIIIaJCyQshhBBCRIWSF0IIIYSICiUvhBBCCBEVSl4IIYQQIiqUvBBCCCFEVCh5IYQQQoiocJ68rFmzBu7u7jA1NYW3tzfi4uKqnH7VqlVo1qwZzMzM4OrqiokTJ6KoqIjrMAkhhBAiEpwmL9u3b8ekSZMQGhqKCxcuwNPTE3369EFGRkaF02/duhXBwcEIDQ1FUlISNmzYgO3bt2PGjBlchkkIIYQQEeE0eVm5ciXGjh2LUaNGoWXLlli3bh3Mzc2xcePGCqePiYlBly5dMGTIELi7u6N3794YPHjwK6s1hBBCCDEcnCUvJSUliI+Ph6+v7z+NSaXw9fVFbGxshZ/p3Lkz4uPj1cnK3bt3ERERgYCAAK7CJIQQQojIGHM148zMTCiVStjb25d7397eHtevX6/wM0OGDEFmZia6du0KxhhKS0vx2WefVXnaqLi4GMXFxep/5+TkaKcDhBBCCBEkQV1tFB0djYULF2Lt2rW4cOECdu3ahf3792P+/PmVfmbRokWwtrZWv1xdXXUYMSGEEEJ0TcIYY1zMuKSkBObm5ti5cycGDBigfn/kyJHIysrC3r17X/pMt27d0KlTJyxbtkz93pYtWzBu3Djk5eVBKn0516qo8uLq6ors7GxYWVlpt1OEEEII4UROTg6sra2rtf/mrPIik8nQoUMHREVFqd9TqVSIioqCj49PhZ8pKCh4KUExMjICAFSWY8nlclhZWZV7EUIIIUR/cTbmBQAmTZqEkSNH4o033oCXlxdWrVqF/Px8jBo1CgAwYsQIODs7Y9GiRQCAvn37YuXKlWjXrh28vb1x+/ZtzJo1C3379lUnMYQQQggxbJwmL4MGDcKTJ08we/ZspKWloW3btoiMjFQP4n348GG5SktISAgkEglCQkKQnJwMOzs79O3bFwsWLOAyTEIIIYSICGdjXviiyTkzQgghhAiDIMa8EEIIIYRwgZIXQgghhIgKJS+EEEIIERVKXgghhBAiKpS8EEIIIURUKHkhhBBCiKhQ8kIIIYQQUaHkhRBCCCGiQskLIYQQQkSFkhdCCCGEiAolL4QQQggRFU4fzChqiiIgPbHsVZQDlBaVvSRGgIkpYGwGWLsATm0Bm/p8R0uIfnr+AEhNALIfl21/iiKAKQFj07KXqRVg7wHYtyrbLgkh2lWSD6RdAdKvAiV5ZdugshiQGpdtgyZmQG13wLEtYOWos7AoeXkh+QKQHF/2Q5lyCXiSBKhKq/dZ87qAoyfg1K5sAbp1BmrZchktIfon7wnwMAZISfh7O0wACp9V77NSY8CuBeDkWbYNOncAnNtzFysh+kilAh6fA1Iu/LMdZt4EmKp6n7ewL9v+nNr+sy80s+EkVMN+qnRRNpCwFTi/sWwBaYuRDGjRF+g4pmzhEUIqd/8UcO4nIGkfoFJob762zYA3PgHaDgZMrbU3X0L0TX4mcOEX4PwmIPuh9uZrbAa0Hgh4jSk7uH8FTfbfhpm8pF4Gzq0HruwEFAXcBlSvFdDxE6DNR4Dcgtu2CBGL4lzg0jbg3IayKieXTGoBHu8DXmMBBw9u2yJETB6eKTtwuLYXUJZw25ZT+7ID+tYDKz3FS8lLZZ1/chPYNxF4cEr3gcksga6BQJeJgBGdrSMGSlkKnFoJnA4vO3+ua+7dgP+FAbZNdN82IUKRfKFsX5iaoPu2zWoDPWaUHUxIJOX+RMnLfzuvUgIx3wLRi8oG/fHJsS0wYG3ZAENCDElaIrDncyDtMr9xGJsCb80EfCYAUrrgkhiQ0pKy/eDp8LKB73xy6wr0/w6o00D9FiUv/+78k5tlP5jJ5/kO7R9GMuDNqUBXqsIQA6AsBU6uAE4s0+6Yltfl4lV2IEFVGGIIki8Ae77g/jStJkxqAb6hgNc4QCKh5MXa2hrZWVmwStwEHFvIf7WlMo5tgXd/AOo15zsSQriRfg3Y/Sn/1ZbKGJsCb4cAnb/kOxJCuKEsBaIXAqdW8V9tqYxbV2DAWuQY1abkJXvLJ7C6tZPvcF5Nbg0M2Q64+fAdCSHadf808PtHQHEO35G8WrthQN/VgNSI70gI0R5FEbDjY+DmAb4jeTULe+QM2AzrJp2qlbzo7wnfxB18R1A9xdnAlveAW0f4joQQ7bl5CNgyUByJCwBc3FL2I1/K8RUXhOhKcS7w2/viSFwAIC8d2PJ+tSfX3+RFTBQFwLbBwJ2jfEdCyOu7dQTYPhQoLeQ7Es0k/QXsHFU2wJ8QMVMUAr99ANw/yXckminOrvaklLwIhbIE2DYMeBTHdySE1NyDWOCP4dzfM4Ir1/cBe8cD+nU2nRgSpQLYPhx4GMt3JJyi5EVIFPll2fLzB3xHQojmnt0Dtg7i/saPXLv0O3BsAd9REFIz+4KA24f5joJzlLwITVEW8NcEOvIj4sIYsHeCRmVfQTu5Engcz3cUhGjmxoGy8VsGgJIXIbp3Aji/ge8oCKm+uPX83LmaK0wJ7P0CKC3mOxJCqqfwOfB/QXxHoTOUvAjV4VA6fUTE4dk94MgcvqPQvifXy+5GSogYHAgG8tL4jkJnKHkRqpI8On1EhO/F6SJFPt+RcOP0ajp9RITvxgHg8ja+o9ApSl6E7N4JIH4T31EQUrnzG/XrdNF/MWXZ40WUpXxHQkjFinMN6nTRC5S8CN3pcKq+EGFSqcrWT32XeQO4EcF3FIRULGGrQZ0ueoGSF6F7fg+4HcV3FIS87PZhIMtAxmWd+4nvCAip2DnDvLiDkhcxoB9OIkSGtF7eOwFk3uI7CkLKu3eirDJogCh5EYNbB4Gsh3xHQcg/nt8HbhvS87iYwR7hEgEzpAOI/6DkRQyYCjj/M99REPKP8xvL1ktDcmkrUCLyuwcT/ZGbBlzfz3cUvOE8eVmzZg3c3d1hamoKb29vxMVV/eyerKwsjB8/Ho6OjpDL5WjatCkiImiwHC5upoG7RBgYAy7+xncUuleUDVzby3cUhJRJ2AqoDPcqOE6Tl+3bt2PSpEkIDQ3FhQsX4OnpiT59+iAjI6PC6UtKStCrVy/cv38fO3fuxI0bN7B+/Xo4OztzGaY45D8Bnt3lOwpCysZ+FGTyHQU/Hp3hOwJCyjw07HXRmMuZr1y5EmPHjsWoUaMAAOvWrcP+/fuxceNGBAcHvzT9xo0b8ezZM8TExMDExAQA4O7uzmWI4pJyEajbiO8oiKFLTeA7Av6kJPAdASFlDHk7BIeVl5KSEsTHx8PX1/efxqRS+Pr6Ija24kd1//XXX/Dx8cH48eNhb2+P1q1bY+HChVAqlVyFKS4GvrISgTDkHXjGNaC0hO8oiKHLSQXy0vmOglecVV4yMzOhVCphb29f7n17e3tcv369ws/cvXsXR48exdChQxEREYHbt2/jiy++gEKhQGhoaIWfKS4uRnHxPw9Py8nJ0V4nhMaQdxpEOAw5iVaWlCUwTm35joQYMkPeBv8mqKuNVCoV6tWrhx9//BEdOnTAoEGDMHPmTKxbt67SzyxatAjW1tbql6urqw4j1rHUyzRol/CLsbL10JDRjoPwjQ5kuUtebG1tYWRkhPT08qWt9PR0ODg4VPgZR0dHNG3aFEZGRur3WrRogbS0NJSUVFyqnT59OrKzs9WvR48eaa8TQlOcTYN2Cb+e3gFKcvmOgl+04yB8S73EdwS84yx5kclk6NChA6Ki/rm1vUqlQlRUFHx8fCr8TJcuXXD79m2oVP/cP+LmzZtwdHSETCar8DNyuRxWVlblXnqt4CnfERBDlv+E7wj4Z6hXWhHhoO2Q29NGkyZNwvr16/HLL78gKSkJn3/+OfLz89VXH40YMQLTp09XT//555/j2bNnCAwMxM2bN7F//34sXLgQ48eP5zJMcVEU8h0BMWSltP5BUcR3BMTQldI6yOml0oMGDcKTJ08we/ZspKWloW3btoiMjFQP4n348CGk0n/yJ1dXVxw8eBATJ05EmzZt4OzsjMDAQEybNo3LMMWltPjV0xDCFdpx046D8I/WQW6TFwCYMGECJkyYUOHfoqOjX3rPx8cHZ84Y9s13CCGEEFI5QV1tRKrBWM53BMSQmZjyHQH/jOk7IDyjdZCSF7E5HhOH3FwDv9qD8Id+NOkAgvCPtkNKXsRmTGAw6tati549e2LFihVISkoCo3u/EF2pZcd3BPyrZct3BMTQ0TpIyYuYZBcx3H6mgkKhwNGjR/H111+jZcuWaNiwIcaPH499+/YhPz+f7zCJPqvTCJBZ8B0Fvxw9+Y6AGDqHNnxHwDtKXkTkQmrFz3i6f/8+1q5di759+6Ju3brw8/PD6tWrcfv2bR1HSPSeVEo/nE7t+I6AGDpaByl5EZP4SpKXfysuLsbBgwcRGBiIJk2aoGnTpggKCsKhQ4dQVESX1xEtMOTn+hjJgHqt+I6CGDpD3gb/RsmLiFQnefmvW7duITw8HH369EHdunXRt29ffP/993jw4AEHERKD4NiW7wj4U68FYFzx3b4J0RkrJ6BWPb6j4BXn93kh2hOfonr1RFUoKCjAvn37sG/fPgBAy5YtERAQgICAAHTp0qXSRzAQUo4hH/UZcuJGhMWpLXDrEN9R8IYqLyKRka/CrWevl7z817Vr17B8+XK8/fbbsLW1xcCBA7FhwwakpKRotR2iZ+o2ATOrw3cU/HD15jsCQsoY+LpIyYtI/Jyg4HT+ubm52LVrF8aMGQNnZ2e0a9cOM2bMwKlTp1BaWspp20Rc4i9exLbrBvjTIbcCWg3gOwpCkJ+fj2VHUqBQGu5tMgzwF0h8lCqGdedLdNpmQkICFi1ahG7dusHOzg4fffQRfv31V2RkZOg0DiIcaWlpGD16NDp27IiQvfegMrT7C3l+BMhq8R0FMWCMMWzduhXNmjXD1Plh+L+bhntgScmLCETeLsX9LP52FFlZWdi+fTtGjhwJe3t7eHl5Yc6cOYiLi4NKpd1TWUR4iouLsXTpUjRt2hQbN24EYwx3nzMcuqP5AHJR6ziG7wiIATt37hy6du2KoUOHIjk5GQCw9pxuD2qFhJIXEVh7nttTRpo6d+4c5s6dC29vbzg4OGDEiBH4/fff8ezZM75DI1rEGMNff/2FVq1aYdq0aS89lsKgfjjduwF2zfiOghig1NRUjBo1Cl5eXoiJiSn3t6h7SlzPNLCDiL9R8iJwd5+rcOCWcEuDT548webNmzFkyBDY2dmhS5cuWLBgAS5evEiPLRCxq1evok+fPujfvz/u3LlT4TT7bpbifpaBVN46juY7AmJgiouLsWTJEjRt2hSbNm2qdLp1Aju41RVKXgTOtt88/LxpEwYNGgQbGxu+w6mSSqVCTEwMQkJC0L59ezg7O2P06NH4888/kZ2dzXd4pBqePXuGL7/8Ep6enjh8+HCV0zIAy2OKdRMYn+o2AZr35TsKYiAYY9izZw9atmyJ4OBg5OXlVTn9zwklSMszkIOIf5EwPTs8zsnJgbW1NbKDLWEll/Adzutx6wp8vA+QlPWjtLQUZ86cQUREBCIiInDp0iWeA6w+Y2NjdOnSRX1fmVatWkEiEfny0SOlpaX44YcfMHv2bI1O/0kAHP/YHN3c9PSWURIp8MlBwNWL70iIAUhMTERQUBCioqI0+tyA5sbYPcico6h0J6eYwXpxLrKzs2FlZVXltJS8CJWJOfB5DFCnQaWTJCcn48CBA4iIiMCRI0deGpMgZK6urupE5u2334aFhYE/7I9HR44cQVBQEK5evVqjzzeqLcHlzy1gbiLi7a0yPhOAPgv4joLouadPnyI0NBTff/99jS+C2PqeGQZ7mGg5Mt2i5EUfkhf/pYD3p9WevKSkBKdPn1ZXZa5du8ZhcNolk8nQvXt3dTLTpEkTqsrowJ07dzB58mTs3bv3tecV6C3DKj9TLUQlIHWbAJ+dAkz0rF9EMBQKBdatW4fQ0FA8f/78teZVx0yCq1/UgoOFeEeDUPIi9uTlP6eLauL+/fvqqkxUVBQKCwu1GCC3GjVqBH9/fwQEBKBHjx4wMzPjOyS9kpubiwULFiAsLAwlJdq5YkjvTh/R6SLCscOHDyMoKEirB5piP31EyYuYkxe5NfDp8SpPF2mqqKgIx48fV1dlbt++rbV5c83U1BRvv/22uirToIH2vhdDo1Kp8Ouvv2L69OlIS0vT+vwb1ZYgfpwFrE1FuN39V9eJgO8cvqMgeuj27duYPHky/vrrL07m/8sAU4zwFOdz6ih5EWvyYmwGDN8FuHXmtJlbt26pqzLR0dEoLhbPFSPNmzdXJzJdu3aFXC7nOyRRiImJQWBgIM6fP89pO+N6t8TaLhkwUon4HjAeHwDvrX+tyich/5WTk6OueCoU3F3ebGNpjvjJjdCQPeCsDa5Q8iLG5EVqAgz+HWjSS6fN5ufn49ixY+qqzIMH4lnhLSws4OvrC39/f/j7+8PV1ZXvkATn8ePHmDZtGrZu3cppO/b29li8eDFGjBgB6a1DwPahgEq49yeqVFM/YNBvgJGenP4ivFOpVNi0aRNmzJiB9PR0TtsaNmwYFi9eDGc7G+DX/sDjc5y2p22UvIgteTE2BT74BWjmx2sYjDEkJSUhIiICBw4cwIkTJ0T1UEYPDw91VcbHxwcmJuIeef86CgsLsXz5cixevBgFBQWctSOTyTBx4kTMmDGj/I/N9f3AjlGAUjxVPTR7B/jgZ8CYqnlEO06fPo3AwEDEx8dz2k7Hjh0RHh4OHx+ff94syga2DgIexnLatjblMEtYz0s28OTl1+GwuvP6V1FwTmYJDNkGuHflO5KX5OTkICoqSl2VSUlJ4TukarO2tkbv3r0REBAAPz8/ODg48B2STjDGsGPHDkyZMgUPHz7ktK0BAwZg+fLlaNSoUcUT3D0ObBsClFR9ky1BaPMR0H8NVVyIVjx8+BDTpk3Dtm3bOG3HwcEBS5YswbBhwyCVVnCVkaIQ2D4MuH2E0zi0opYdcvr/AutmXQ08eXn+HFaX1wPHlwJKgZ5/t28NvPsD4NCa70heiTGGy5cvqxOZmJgYUT2UsX379uqqjJeXF4yMjPgOSesuXryIwMBAnDx5ktN2WrVqhVWrVsHX1/fVE6deBnZ/BmTU7B4ynDOSAT2Cga6TaIwLeW0FBQVYtmwZlixZwukVnjKZDJMnT8b06dNhaWlZ9cRKBRA1F4hdAzCB/ma7egPvrkOOsW3Z/tugk5cXnU+/Cuz5AkhN4Du0f0iNgW6TgTenAEbiPLXx/PlzHDp0CBEREYiMjERGRgbfIVVbnTp14Ofnh4CAAPTp0we2trZ8h/RaMjIyMHPmTGzYsIHT50nVqVMH8+fPx7hx42BsrEGForQEOLEUOBUmrHEwTu2AAd8D9VrwHQkROcYY/vjjD0yZMgWPHj3itK333nsPy5YtQ8OGDTX74KO4sn3h01vcBFYTxmbA2yFApy8AqfTl/XcV9D95AQBlKXA6TBhVGPvWwIC1gKMnv3FokUqlwoULF9RVmbi4ONE8lFEikcDb21tdlWnXrl3F5VcBKikpwbfffot58+YhJyeHs3aMjIzwxRdfYM6cOahTp07NZ5RyEdgznv8qzItqS5cgQKp/FTiiW/Hx8QgKCsKpU6c4bad169YIDw/H22+/XfOZKIqAY98Iowrj6g30XwvYNla/RclLZZ1Pvwr8XxDwOE73gZmYA52/FHW1pbqePHmCgwcPqqsyr3vnSF2yt7dXV2V69+4tyIdhMsYQERGBiRMn4tYtbo+ievXqhbCwMLRq1Uo7M3xRhYldAyi4G0hcKVdvoG84VVvIa0tPT8fMmTOxceNGTg/W6tati/nz52Ps2LGaVTyr8iiubF/Ix4GE3BroPlVdbfk3Sl5e1fnH8cC5n4Cru4DSIm4Dsm0KvDEaaDsYMLXmti0BUiqVOHv2rPq+MhcuXOA7pGozMjJC586d1VUZDw8P3h9bkJSUhEmTJiEyMpLTdho1aoSVK1eib9++3PS5MAtI2Aqc3wA85fimicZmQOv3gI6jAecO3LZF9F5JSQlWr16NefPmcfo8OSMjI4wfPx6hoaGvV/Gsyr2TZfvC6/sBFXf3ngEAOLQp2wY9PgRkFd8FmJKXanYeBc+Ai1uA8xuB5/e0F4TUGGgWAHQcAzTsrr356oHU1FRERkYiIiIChw4d4vR0h7Y5OzsjICAA/v7+8PX1ffVAOS16/vw55s6di++++w5KpZKzdiwtLTFr1ix89dVXurkBIGPA3eiyH9AbBwCmxb7VaQi88QnQdihgztGPPzEYjDHs27cPkydP5rzi2bt3b4SFhaFly5actqOWmwbE/wLEbwJytXhVqZEcaDWgbF9YjUdtUPJS3eTlBcbKymgpF4CUBLCUi1BlXIeRtHpHnFlFDBdSlXhryERInNsBbl0AS8O4NPd1KBQKxMTEqMfKJCYm8h1StZmYmKBbt27qqkzz5s05qVCUlpbip59+QkhICJ4+far1+b8gkUgwatQoLFiwgL/LynNSgQengdQEsJQEZF8/AZtqPmpAqWK4nqlCS98hkDi1K6uwuHSkK4iIVly7dg0TJ07EoUOHOG2ncePGCAsLwzvvvMNPlVdZWnZfmJSL6u2QPb0NaTVjySxQIT5Fhd4jp/y9L+wK1Kpb7eYpedE0efkPlUoFK1MjtHUwgqeDFFZyCcyMJTA1BpQMKFQwFJYCD7NViE9R4s7zsq9QqVSKZrCnED18+BAHDhzAgQMHcOTIEeTn5/MdUrW5u7urE5m33noL5uav/3C0Y8eOITAwEFeuXNFChJXr3LkzwsPD8cYbb3DajiZUKhWMjIzQuI4UHRylqG8thakxYGYigbEUKFQAhaUM2UUMl9JVSEhTokBB2yDRrmfPnmHu3LlYs2YN5xXP2bNn46uvvoJMJpznEqlUKtQ2N0I7ByN42EthKZPAzKRsX6hQlm2DhQrgXpYK51OUeJj9evtCjfbfTM9kZ2czACw7O7vG81AqlQyAxi+lUqnFnhi2oqIidvjwYTZx4kTWrFmzGi0Pvl5yuZz5+fmx1atXs1u3bmnc97t377L33nuP8zhdXFzY77//zlQqFQdL8PXQNkj4pFAo2Jo1a1idOnU43QYlEgkbM2YMS0tL47vLFdL1dqjJ/psqLxV4cdSnKTrq486dO3fUg36PHTuGoiKOB1prUZMmTdRVmTfffBOmpqYVTpeXl4dFixZhxYoVnD4s09TUFNOmTcPUqVO1UiHiAm2DhC9Hjx5FYGAg56exu3btivDwcLRv357Tdl6HrrdDqrxUM3OrDB31CVtBQQGLiIhgEyZMYA0aNOC90qLJy9zcnPXt25d9//337P79+4yxsvXtl19+YY6Ojpy3/9FHH7EHDx7wvARfjbZBomt37txh7777LufboKurK9u2bZsgK57/JeTKi06Sl++++465ubkxuVzOvLy82NmzZ6v1ud9//50BYP379692W5S8GBaVSsWuX7/OVq5cyXx9fZmJiQnvCYomr4YNGzIHBwfO22nXrh07ceIE34ur2mgbJLqSk5PDgoODmUwm43QbNDMzY3PnzmX5+fl8d7naDDp52bZtG5PJZGzjxo3s6tWrbOzYsczGxoalp6dX+bl79+4xZ2dn1q1bN0peSLXl5uayPXv2sHHjxjEXFxfekxO+X/Xq1WM//fQTKy0t5XvRaIS2QcI1pVLJNm3apJODh8GDB7OHDx/y3WWNCTl54XzMi7e3Nzp27IjvvvsOQNk5NFdXV3z55ZcIDg6u8DNKpRJvvvkmPvnkE5w8eRJZWVnYs2dPtdqjMS/kBcYYEhMT1WNlTp06xekVA0JiYmKCwMBAhISEwNramu9wNEbbIOFSbGwsAgMDce7cOU7b6dChA1atWoWuXbty2g5XhDzmhdOtvKSkBPHx8eWePiuVSuHr64vY2NhKPzdv3jzUq1cPo0ePfmUbxcXFyMnJKfciBCi7d4mHhwemTp2K6OhoZGZmYseOHRg1ahR/9zLRgb59++Lq1atYtmyZKBMXQriSnJyM4cOHo3PnzpwmLvb29ti4cSPi4uJEm7gInZYelFCxzMxMKJVK2Nvbl3vf3t4e169fr/Azp06dwoYNG5CQkFCtNhYtWoS5c+e+bqjEANjY2OD999/H+++/D5VKhYSEBPUN8s6ePQuVSqCPi6+mFi1aICwsDH369OE7FEIEpbCwECtWrMCiRYtQUMDdM7VMTEwwceJEzJw5s8aVf1I9gqqv5ubmYvjw4Vi/fj1sbW2r9Znp06cjOztb/eL6ceREP0ilUrRv3x4hISGIiYlBRkYGtm7dimHDhlV73RMKiUSCjh07YsaMGejYsSPf4RAiGIwx7Ny5Ey1atMCsWbM4TVz69++Pa9euYcmSJZS46ACnlRdbW1sYGRkhPT293Pvp6ekVlu3v3LmD+/fvo2/fvur3XhwNGxsb48aNG2jUqFG5z8jlct08g4Xotbp162Lw4MEYPHgwlEolzp8/r67KnD9/nu/wqsQYw7lz5zB8+HBIpVL4+Pio7yvj6enJ+8MkCeFDQkICAgMDceLECU7badmyJVatWoVevXpx2g4pTycDdr28vPDtt98CKEtG6tevjwkTJrw0YLeoqAi3b5d/wmxISAhyc3MRHh6Opk2bvvLWyTRgl2hbenq6+mGSBw8eRHZ2Nt8hVZujoyP8/f0REBAAX19f0YyBoW2Q1NSTJ08QEhKC9evXg8vdW+3atTFv3jx89tlnMDbmtA7AGyEP2NXJpdJyuZxt2rSJXbt2jY0bN47Z2Niob4c8fPhwFhwcXOnnR44cSZdKE8FQKBTs5MmTbPr06czT05P3S6E1eRkbG7MePXqwpUuXssTEREHfJIu2QaKp4uJitnLlSmZtbc3pdmRkZMQmTJjAMjMz+e4y54R8qbROblL37bffsvr16zOZTMa8vLzYmTNn1H/r3r07GzlyZKWfpeSFCFliYiLr1asXk0gkvCcnmr7q16/PPvvsM/bXX3+xvLw8vr/KcmgbJJrYv38/a9q0KefbTM+ePdmVK1f47q7OCDl5oWcbVYBK1uRVlEolNmzYgJCQEDx58oTvcF6bTCZD9+7d1WNlmjRpwutYGdoGSXVcv34dkyZNwoEDBzhtp2HDhli5ciX69etnUGPIhHzaiJKXCtAPJ6nK8ePHERgYiEuXLvEdCmcaNWqkTmS6d+8OMzMznbZP2yCpSlZWFubOnYvvvvsOpaWlnLVjYWGBWbNmITAw0CAvDKHkRYcoeSFcefDgAaZMmYIdO3bwHYpOmZmZ4e2330ZAQAD8/f3RoEEDztukbZBURKlU4qeffkJISAgyMzM5bWvUqFFYuHChXt/Q8lUoedEhSl6ItuXn52PJkiVYtmwZioqK+A6Hd82bN1dXZbp16/bKKwBrgrZB8l/R0dEICgrivOLp4+OD8PBwumcSKHnRKUpeiLYwxrB161ZMmzYNycnJnLbVpUsXNGjQACdOnMDDhw85bUubLCws4Ovrq67KuLi4aGW+tA2SF+7fv48pU6Zg586dnLbj4uKCJUuWYPDgwQY1rqUqlLzoECUvRBvOnTuHwMDAKp/BpQ2enp4IDw9H9+7dAZQlTElJSeob5J08eZLTc/ra1qZNG3VVxsfHp8b3v6BtkOTl5WHx4sVYvnw5iouLOWvH1NQUU6dOxdSpU1GrVi3O2hEjIScvOrlUWpfoUmnyOlJSUtjHH3/M+SWXtra27IcffmClpaVVxpOdnc3+/PNPNmbMGObk5MT75dWavKytrdkHH3zAfv75Z5aamqrRcqBt0HAplUq2efNmnazvH374Ibt//z7fXRYsulRah6jyQmqiqKgIq1atwoIFC5CXl8dZO8bGxvjqq68wa9Ys2NjYaPRZxhguX76srsrExMSI6mGSHTp0UFdlOnbsWOU2RtugYYqLi0NgYCDOnDnDaTvt2rVDeHg4unXrxmk7YkeVFx2iygvRhEqlYrt372YNGzbk/CgvICCAXb9+XWuxP3v2jG3bto2NGDGC2dnZ8V5p0eRVt25dNnToULZlyxb25MmTl/pG26BhSU5OZiNGjOB8vbOzs2Pr169/ZcWTlKHKiw5R5YVUV2JiIoKCghAVFcVpO82aNcPKlSsREBDAWRsqlQrx8fGIiIjAgQMHEBcXx+lzXbRJIpHA29tbXZVp164dANA2aACKiooQFhaGBQsWID8/n7N2TExM1BVPsTzfSwio8qJDVHkhr5KZmcm++OILJpVKOT3Ks7a2ZmFhYaykpETnfczIyGCbN29mgwcPZrVr1+a90qLJy97eno0cOZK2QT2mUqnYrl27WIMGDThfn/73v/+xGzdu8N1lUaLKiw5R5YVURqFQYN26dQgNDcXz5885a0cqlWLs2LGYP38+7OzsOGunukpLSxEXF6ceK3Px4kW+Q+IMbYPCd/nyZQQFBeHYsWOcttO8eXOEhYXBz8+P03b0mZArL5S8VICSF/1z+PBhBAUF4dq1a5y20717d4SHh8PT05PTdl5HamoqIiMjERERgUOHDiEnJ4fvkLSGtkHhyszMxOzZs/HDDz9wOtDcxsYGc+fOxeeffw4TExPO2jEElLzoECUv5N9u3bqFyZMn4//+7/84bcfd3R3Lly/He++9J6obXCkUCsTExKirMomJiXyH9FpoGxQehUKB77//HqGhocjKyuKsHalUik8//RTz5s2Dra0tZ+0YEiEnLzTmpQI05kX8srOz2ZQpU5iJiQmn59PNzc3ZN998wwoKCvjuslY8ePCArVu3jvXr14+Zm5vzPv5F09cXX3zB9u/fz/Lz8/n+KgljLDIykrVo0YLz5f7WW2+xS5cu8d1dvUNjXnSIKi+GTalUYtOmTZgxYwYyMjI4bWv48OFYtGgRnJ2dOW2HL8XFxThx4gQOHDiAiIgI3Lhxg++Qqs3U1BQ9evRQX8HUqFEjvkMyKDdv3sTkyZOxb98+Tttxd3fHihUr8O6774qq4ikWQq68UPJSAUpexOnUqVMIDAzEhQsXOG3Hy8sL4eHh6NSpE6ftCM2dO3fUicyxY8dE9ZDKpk2bqhOZN998E3K5nO+Q9FJ2djbmz5+P1atXQ6FQcNZOrVq1MHPmTEycOBGmpqactWPoKHnRIUpeDM/Dhw8xbdo0bNu2jdN2HB0dsXjxYgwbNszgl3NBQQGio6PVY2Xu3bvHd0jVZm5uDl9fX/j7+yMgIAD169fnOyTRUyqV+PnnnzFjxgw8efKE07ZGjBiBRYsWwcnJidN2CCUvOkXJi+EoKCjA0qVLsXTpUhQWFnLWjlwux+TJkzF9+nRYWFhw1o5YMcZw8+ZNdSJz/PhxTo+6ta1Vq1bqqkyXLl3oChUNnTx5EoGBgZxfgu/t7Y3w8HB4e3tz2g75ByUvOkTJi/5jjGH79u2YOnUqHj16xGlb7733HpYtW4aGDRty2o4+yc3NxdGjR9XJzOPHj/kOqdqsrKzQq1cvBAQEwM/Pj47uq/Dw4UNMnToV27dv57QdJycnLFmyBEOGDKHfVx2j5EWHKHnRb/Hx8QgMDMTp06c5bcfDwwOrVq3C22+/zWk7+o4xhsTERHUic/r0aSiVSr7DqrZ27dohICAA/v7+8Pb2hrGxMd8h8S4/P19d8eRy3JNcLsfXX3+N4OBgqnjyRMjJC10qXQG6VFp4UlNT2SeffMIkEgmnl1zWrVuXrV27likUCr67rJeeP3/OduzYwUaNGsXs7e15v7Rak1ft2rXZRx99xH799VeWkZHB91epcyqVim3dupW5uLhw/l0PHDiQ3b17l+8uGzy6VFqHqPKiX4qLi7F69WrMnz8fubm5nLVjZGSECRMmIDQ0FLVr1+asHfIPlUqFhIQEdVXmzJkzonqYZMeOHdVjZTp06KDX2/758+cRGBiImJgYTttp06YNwsPD0aNHD07bIdUj5MoLJS8VoOSFf4wx7Nu3D5MmTcLt27c5batPnz5YuXIlWrZsyWk7pGqZmZk4dOgQDhw4gAMHDuDp06d8h1RtdnZ28PPzQ0BAAHr37o06derwHZJWpKWlYcaMGdi0aROniaWtrS2++eYbjBkzpka/vYQblLzoECUv4nft2jVMnDgRhw4d4rSdJk2aICwsDAEBAXSDK4FRKBSQyWR8h1EjUqkUPj4+6qqMp6en6Nav4uJihIeH45tvvuG04mlsbIwvv/wSs2fPho2NDWftkJqh5EWHKHkRr2fPnmHOnDlYu3Ytp4M6raysMHv2bHz55Zei3UHqu5pug0Lk5OSkvqeMr69vjX+XdIExhr/++guTJ0/GnTt3OG3Lz88PYWFhaN68OaftkJqj5EWHKHkRn9LSUvz444+YNWsWnj17xlk7EokEo0ePxjfffAN7e3vO2iGvT5+Sl38zNjZGt27d1MlMy5YtBVOVSUxMxMSJE3HkyBFO22natKm64kmEjZIXHaLkRVyioqIQFBTE+dOMu3XrhvDwcLRr147Tdoh21HQbtLCwQF5eHgcRcaN+/frq00tvv/02atWqpfMYnj17htDQUHz//fecVzznzJmD8ePHU8VTJIScvNCl0hWgS6W5d/v2bTZgwADOL7msX78+2759O1OpVHx3mWigpttgYWEhi4qKYpMnT9bJ04y1+ZLJZKx3795s1apV7ObNm5x/xwqFgn333XesTp06nPZLIpGwcePGsfT0dM77RLSLLpXWIaq8CFtubi4WLlyIlStXoqSkhLN2zMzMEBwcjK+//hrm5uactUO4oa1t8P79++qHSUZFRXH6GAlta9y4sfoGed27d4eZmZnW5n3kyBEEBQXh6tWrWptnRd58802Eh4ejbdu2nLZDuEGVFx2iyoswKZVK9vPPPzMHBwfOj2CHDBnCHj58yHeXyWvgYhssLCxkkZGR7KuvvmKNGjXivdKiycvMzIy98847bM2aNezevXs1/l5v3brF+vfvz3m8bm5ubMeOHVTxFDmqvOgQVV6EJzY2Fl999RXOnz/PaTsdOnRAeHg4unTpwmk7hHu62AZv3bqlvkFedHQ0p5VAbWvRooV6rEzXrl1fOYYkJycHCxYswKpVqzjtp7m5OaZPn47JkydrtVJE+EGVFx2iyotwPHr0iA0dOpTzozx7e3u2ceNG+v71iK63wby8PPbXX3+xzz77jNWvX5/3SosmLwsLCzZgwAD2448/skePHr30PW7cuFEnj2IYOnToS+0TcaPKiw5R5YV/hYWFWL58ORYvXoyCggLO2pHJZJg4cSJmzJgh6HtnEM3xuQ0yxpCUlKSuypw8eRKlpaWvNU9datOmDQICAuDq6ooNGzbgwoULnLbXsWNHhIeHw8fHh9N2iO4JufJCyUsFKHmpGcYYdu7ciSlTpuDBgwecttW/f38sX74cjRs35rQdwg8hbYM5OTk4cuSIOplJTU3V6vzFysHBAYsXL8bw4cMN+ndPnwk5edHJGrdmzRq4u7vD1NQU3t7eiIuLq3Ta9evXo1u3bqhduzZq164NX1/fKqcnwpCQkIAePXrgww8/5DRxadWqFQ4fPow9e/ZQ4kJ0wsrKCu+99x5++uknJCcnIyEhAQsXLkTXrl0Ncqctk8kQHByMmzdvYuTIkQb5HRABqNGJKQ1s27aNyWQytnHjRnb16lU2duxYZmNjU+k1/0OGDGFr1qxhFy9eZElJSezjjz9m1tbW7PHjx9Vqj8a86FZ6ejobO3Ysk0gknJ5Pr127Nvvuu++YQqHgu8tEB8SyDT59+pRt27aNjRgxgtnZ2fE+/oXr17vvvsvu3Lmj0++Y8EfIY144T168vLzY+PHj1f9WKpXMycmJLVq0qFqfLy0tZZaWluyXX36p1vSUvOhGcXExW7FiBbOysuL0x9LIyIhNmDCBZWZm8t1lokNi3AaVSiWLi4tjc+bMYV5eXpwn9Lp8tW7dmh05coS375bwQ8jJC6f1vpKSEsTHx8PX11f9nlQqha+vL2JjY6s1j4KCAigUikofMV9cXIycnJxyL8KtiIgIeHh4YPLkyZx+376+vkhISMC3336LunXrctYOIdoglUrRsWNHhIaG4uzZs0hPT8fmzZsxePBg1K5dm+/wasTCwgLLli3DxYsX0bNnT77DIUSN0+QlMzMTSqXypYfg2dvbIy0trVrzmDZtGpycnMolQP+2aNEiWFtbq1+urq6vHTep2PXr1+Hv74933nkHN2/e5KydRo0aYe/evTh06BBat27NWTuEcMnOzg7Dhg3D1q1bkZGRgdOnT2PmzJmier5WXl4egoOD0bNnTyxZsgRXrlwB069rPIhICXqk1eLFi7Ft2zbs3r0bpqamFU4zffp0ZGdnq1+PHj3ScZT67/nz55g4cSI8PDwQGRnJWTsWFhZYsmQJrl69in79+gnmabuEvC5jY2N07twZ33zzDS5cuIDk5GRs2LABAwcOFPxl/kqlEidOnEBwcDDatGmD+vXr49NPP8XevXtF9RBMomdqdGKqmoqLi5mRkRHbvXt3ufdHjBjB+vXrV+Vnly1bxqytrdm5c+c0apPGvGhPaWkpW7duHbO1teX0fLpEImGffPIJS01N5bvLRCAMaRssKSlh0dHRbOrUqax169a8j2/R5GViYsJ69uzJVqxYwZKSkuhxAHpGyGNedDJgd8KECep/K5VK5uzsXOWA3SVLljArKysWGxurcXuUvGjH0aNHWZs2bTj/8evcubPGCSrRf4a8DT548ICtW7eO+fv7M2NjY94TFE1eDRo0YOPHj2f79+9n+fn5fH+V5DUZdPKybds2JpfL2aZNm9i1a9fYuHHjmI2NDUtLS2OMMTZ8+HAWHBysnn7x4sVMJpOxnTt3stTUVPUrNze3Wu1R8vJ67t69ywYOHMj5j5yLiwvbunUrHamRChnyNqhQKNjatWtZ3bp1eU9GXudlamrK/P392bfffkuXV4uUQScvjDH27bffsvr16zOZTMa8vLzYmTNn1H/r3r07GzlypPrfbm5uFX4ZoaGh1WqLkpeayc3NZTNnzmRyuZzzH7TQ0FCWl5fHd5eJgBniNsgYY1FRUczDw4P3xIOLV7NmzVhQUBA7dOgQKyoq4vurJtUg5OSFHg9QASHdmpxrKpUKv/32G4KDg5GSksJpW4MGDcKSJUvg5ubGaTtE/AxpGwSAu3fvYsqUKdi1axffoehErVq10LNnTwQEBMDf3x/169fnOyRSASE/HoCSlwoYyg/n2bNnERgYiLNnz3LaTrt27RAeHo5u3bpx2g7RH4ayDebl5WHRokVYsWIFiouL+Q6HN61bt0ZAQAACAgLQuXNnmJiY8B0SASUvOkXJy6ulpKQgODgYmzdv5rSdevXqYcGCBRg1alSNvk9iuPR9G1SpVNiyZQuCg4M5f9CjmZkZCgsLOW1Dm6ysrNCrVy91VcbR0ZHvkAyWkJMX4W/lRGuKioqwcOFCNG3alNPExcTEBF9//TVu3ryJMWPGUOJCyL+cOXMGPj4+GDlyJKeJS/v27XHy5Enk5+fj8uXLWLx4Md58803Bb485OTn4888/MXr0aDg5OaF9+/YICQlBTEwMlEol3+ERoajRqBoBowG7L1OpVOzPP/9k7u7unA/K+9///sdu3LjBd5eJyOnbNsgYY48fP2bDhg3jfBusV68e27BhQ6XfxfPnz9mOHTvYqFGjmL29Pe8DeTV51alThw0ePJht3ryZZWRk6HgJGh4asKtDdNqovMuXLyMoKAjHjh3jtJ0WLVogLCwMffr04bQdYhj0aRssLCzEypUrsXDhQhQUFHDWjomJCYKCghASElLt3z6VSoWEhAREREQgIiICZ86cEc3t/yUSCTp27KgeK9OhQwfBLXuxE/JpI0peKvBigUlkZpDZuUMirwWpsQwwMgGYCqy0BKy0BKU5T1D6LBllyaawfjgzMzMxa9Ys/Pjjj1CpVJy1Y2Njg7lz5+Lzzz+nQXZEa/750ZTAuK4zjK3qQWJkAomxDJBIAaUCqtISsOJ8lDy5D1ZSNqZDSNsgYwy7du3C119/jfv373PaVr9+/bB8+XI0adLkteaTmZmJQ4cOISIiApGRkXj69KmWIuSenZ0d/P39ERAQgN69e4v2YZhC8mI7lJpawMTWDVKZWdk2aGQCMOU/+8KsNJRm/fO8QkpeaqCmyUtukQKJyTlITM7G5cdZ2BV9Hsa1HSGRVL0AVMUFKMm4i5K02/hp2Wy0camNhra1IJXy81wehUKBtWvXYs6cOcjKyuKsHalUik8//RTz5s2Dra0tZ+0Qw6FSMdzNzMOV5GxcfpyN77ftg6xeQ0jl5lV+jjEVSp+loCT9NhZM/gweLjZo7WwFS1P+kulLly4hMDAQx48f57Sdli1bIiwsDL1799b6vJVKJc6dO4cDBw4gIiIC58+f13obXJFKpejcubN60K+npyc9K62asgpKcCU5u+z1OBt/nUqAiY3DKz+nLMpDSdodlKTfxi9h89HGxQbutrU0apuSl2p2njGGU7czsTn2AaKuZ0Cp0s5X4WhtisFe9fGRlyvqWVb8QEkuREZGYuLEibh+/Tqn7bz11ltYtWoV2rRpw2k7xDBk5BRha9xDbIt7hLScIq3M01gqQc8W9TC8kzu6NtFdcv3kyRPMmjUL69ev57TiWbt2bcydOxefffaZziqe6enpiIyMREREBA4ePIjs7GydtKsNTk5O6qqMr6+v4B+GqWtKFUNUUjo2n3mAU7czoa2swL2uOYZ418eHb7jCxlz2yukpeXlF57MLFdgZ/xi/nXmAu5n5nMViYiRB71YOGN7JDZ0a1uWsnZs3b2LSpEnYv38/Z20AQIMGDbBixQoMGDCAjmLIa4u98xSbz9zHoavpKNXSgUNFGtrVwjBvN7z/hgusOKrGlJSUYM2aNZg7dy6nO3WpVIrPP/8cc+fORd263P2mvEppaSliY2PVY2UuX77MWyyaMjY2Rrdu3dRjZVq0aGGwv2eZecXYfu4Rtp59iOQs7i6nlxtL0dfTCSN83NDGxabS6Sh5qaTz2YUKLD94AzvjH6NQodtL7praW2By72bo0+rV5bfqys7Oxvz587F69WooFAqtzfe/atWqhZkzZ2LixIkwNdVdJYnop8jEVKw4dBO3MvJ02q6ZiRE+eMMFX/dpptUk5sCBA5g4cSJu3LihtXlWpGfPnggLC4OHhwen7dTE48ePceDAARw4cACHDx9GXp5ul+3rcHNzUycyb731FmrV0uxUhxhl5BZhccR17LucihIldxXCirRxsUawX3N0bvxyRZSSlwo6H5WUjhm7ryA9h9+7WPb1dMK8fq1Qu9arS2iVUSqV2LhxI2bOnIknT55oMbqXjRw5EgsXLoSTkxOn7RD99yy/BLP2JmL/ZW5vyvYqDlamWDTQA281q/da87lx4wYmTZqEiIgILUVWsYYNG2LlypXo16+fKCoEJSUlOHXqlLoqk5SUxHdI1SaXy9G9e3d1MvO6A6CFaM/FZMz5v6vIKuDugPdVJBJgiFd9zAhogVpyY/X7lLz8q/PZhQrM/b+r2HUhme/Q1Gwt5PhmQGv4tda8CnPixAkEBgYiISFB+4H9S6dOnRAeHg4vLy9O2yGGIeJKKmbtScTT/BK+Q1F7v4MLZvdtqXEVJisrS13xLC0t5Sg6wMLCAiEhIQgKCoJcLuesHa7du3dPPej36NGjorrbb+PGjdWJTPfu3UVdec7ILcLM3Yk4fC2d71DUnG3MsPT9NujydxWGkpe/O38uuVAQ1ZbKaFKFefDgAaZOnYo//viD05icnJywdOlSDB48WDCXnBLxEkq1pTIOVqZY9J4H3mr+6iqMUqnEhg0bMHPmTGRmZnIa16hRo7BgwQK9uzV+YWEhTpw4gYiICOzfvx937tzhO6RqMzMzK/cwSXd3d75DqjYhVFsqI5EAg73qY2ZACyiLCyh5WbHvIlafFE61pTL165jjtzHecK1T8eWg+fn5WLp0KZYuXYqiIu1ciVERuVyOKVOmYNq0abCwsOCsHWI4HjzNx9CfzuLxc+Efac8IaI5xbzaq9O/Hjx9HYGAgLl26xGkcPj4+CA8PR8eOHTltRyhu3bqlPr0UHR2NkhLhVOZepUWLFuqqTNeuXSGT1XwoAJcW7L+G9Sfv8R3GK7VwtMKa95ujkUs9w05eXIP+eOX9IYTC3kqOLaO90cTeUv0eYwy///47pk6diuRkbpOw999/H0uXLkWDBg04bYcYjutpORi+IQ5PcoVZ9azI+LcaYUqf5uXeu3//PqZOnYodO3Zw2razs7O64imGcS1cyM/Px9GjR9XJzMOHD/kOqdosLCzKPUzS2dmZ75CgUjFM33UF288/4juUanO1AE7N+h8lL2JJXgCgTi0Zto/rhCb2ljh//jwCAwMRExPDaZuenp4IDw9H9+7dOW2HGJYbabkY9GOsIEvUrzLuzYaYEdAC+fn5WLx4MZYvX85pxdPU1FRd8TSEq1yqizGGa9euqcfKnDx5ktPxRdrm6empTmR8fHxgbGz86g9pEWMMk/+4hF0XhX/24d9UxQV4tOpDSl7ElLwAgG0tEzS+vxfbN67lth1bWyxYsACjR48W/BNmibg8eJqPD9bFIkNEFZf/6mVfiAMrgjiveH744YdYunQp3NzcOG1HH+Tk5ODIkSPqqgyXT+PWNhsbG/Tu3RsBAQHw8/ODvb09523O3puIX2MfcN6OtlHyItLkBQAUz1OQ9stEqIq1f/M8Y2NjfPnll5g9ezZsbGy0Pn9i2LIKStD3u1N49Ez4Y1xeJTMiHPlXDnMy77Zt2yI8PBxvvvkmJ/PXd4wxXLp0SZ3IxMbGcno3Y21744031GNl3njjDa0fQH4bdQsrDt/U6jx1hZIXEScvAJCXeBRP96/U6jz9/f2xcuVKNG/e/NUTE1IDgdsuYm9CCt9haIWqpBCpGyegNFt7l5Xa2dlhwYIF+OSTT6jiqUXPnj3D4cOHERERgQMHDnB+7yttsrW1hZ+fn/phkq971+TLj7Pw7toYrT3qRtcoeRF58gIAGTvnofBO3GvPp1mzZli5ciUCAgK0EBUhFTt0NQ3jNsfzHYZWFT24jPRtM157PsbGxggMDMSsWbNgbW2thchIZVQqFeLj49VVmXPnzkEsuzipVApvb291VaZt27Ya3a6iuFSJvt+ews108dzd+L8oedGD5KU09ylSN3xR49NH1tbWCA0Nxfjx4wV7CR/RD1kFJegVdkJUVxZV19ND3yPvYs2fGfbOO+9gxYoVaNasmRajItWVkZGBgwcPqh8m+fz5c75DqjYHBwf1wyR79er1ysR3aeR1rI0Wz31zKkLJix4kL0DNTh9JJBKMGzcO8+fPh52dHUeREfIPfTpd9F81PX3UvHlzhIWFwc/Pj6PIiKZKS0sRFxenrspcvHiR75CqzcjICF27dlVXZVq1alXuknqxny56gZIXPUleACBj51wU3jlXrWm7d++OVatWoW3bttwGRcjfDl9Lx9hfz/MdBqc0OX1kbW2NuXPn4osvvoCJCTdPsCbakZKSgsjISERERODQoUPIzc3lO6Rqc3FxUScyb/Z4C4M2XhT16aIXKHnRo+SlOPUW0n6dWOU0bm5uWL58OQYOHGiwN7gi/Hhn9UlcTcnhOwzOpW2djuJHVyr9u1Qqxbhx4zBv3jyqeIqQQqHA6dOn1YN+ExMT+Q6p2qza+KK2fxDfYWiFJskLPbxG4OSOTSBzbFrh38zNzTF//nwkJSXh/fffp8SF6FT8g+cGkbgAgGX7yge89+jRAxcuXMD3339PiYtImZiYoEePHli6dCmuXLmCBw8eYN26dejXrx/MzYV9EGzm0ZvvEHhByYsIWLZ7+Ydz2LBhuHnzJkJCQmBmZsZDVMTQbTkjvptg1ZR5k04wqlW73Hvu7u74888/cfToUXh6evIUGeFC/fr18emnn2Lv3r149uwZDh06hKCgIDRtWvGBJF9M7BrA1KUl32HwgpIXETBv3g1S07KHJXbs2BExMTHYvHmzIJ6fQQzTs/wS7L8inrucvi6JkQksPPsAAGrVqoUFCxYgKSkJ7733HlU89ZxcLkevXr0QFhaGGzdu4Pbt2/j222/h7+8PU1NTXmOrqiKo73T7wAVSI1ITORy7vIeFI3pi2LBhGl37TwgXtp97hJJS8dzVVBss2vqhX2M5Fi9aCCcnJ77DITxp1KgRJkyYgAkTJqCgoADR0dGIiIjA/v37cf/+fZ3FIZGZoVbLHjprT2hoLygSDXuNwIgRIyhxIYKwNc5wThm9YGxpi6FTF1PiQtTMzc0REBCA7777Dnfv3kVSUhJWrFiBnj17cn61Wa1Wb0EqM9whA7QnFImHz4uQmi3+Z8YQ8Xv8vEAvnl9UE2fuPuU7BCJQEokEzZs3x6RJk3DkyBE8ffoUu3fvxrhx4+Di4qL19kzrt9H6PMWEThuJyJXH2XC0NtxMmwhDYnI23yHwxpD7TjRjaWmJAQMGYMCAAWCMITExUX2DvNOnT0OpVL7W/GUOjbUUqThR5UVE6IeTCMEVA14Pr6bkQCXyu5gS3ZNIJPDw8MC0adNw/PhxZGZm4o8//sDHH38Me3t7jecnNbWAiY0DB5GKByUvInLZgHcaRDguPzbc9bCgRIk7T8R/J1PCLxsbG3zwwQf4+eefkZKSgvj4eMyfPx8+Pj7VunrN0KsuACUvokKVFyIEhr4eGnLliWifVCpF+/btERISgpiYGGRkZOC3337D0KFDUbdu3Qo/I7On5EUnycuaNWvg7u4OU1NTeHt7Iy4ursrpd+zYgebNm8PU1BQeHh6IiIjQRZiCl5lXQoN2Ca8ePy/A8wIF32HwipIXwiVbW1sMGTIEW7ZsQXp6OmJjYzFr1ix06NBBPQ1VXnSQvGzfvh2TJk1CaGgoLly4AE9PT/Tp0wcZGRkVTh8TE4PBgwdj9OjRuHjxonrAk5ieNcGl1OwivkMgBiyN1j/6DojOGBkZoVOnTpg3bx7Onz+P1NRUbNq0CfbuzfgOjXecJy8rV67E2LFjMWrUKLRs2RLr1q2Dubk5Nm7cWOH04eHh8PPzw5QpU9CiRQvMnz8f7du3x3fffcd1qKJQrDCsG4MRYSmi9Q9Fite7SoSQmnJwcMDIkSNRv0EjvkPhHafJS0lJCeLj4+Hr6/tPg1IpfH19ERsbW+FnYmNjy00PAH369Kl0+uLiYuTk5JR76bOiUvrhJPwppvUPxQZ2Z2EiPLQf4Dh5yczMhFKpfOlSMHt7e6SlpVX4mbS0NI2mX7RoEaytrdUvV1dX7QQvUIzRZZqEP0q6TJi+A8I72g3owdVG06dPR3Z2tvr16NEjvkPilNzYiO8QiAGTm9D6R98B4ZvcWPS77tfG6R12bW1tYWRkhPT09HLvp6enw8Gh4hvsODg4aDS9XC6HXC7XTsAiQCst4ZMprX/0HRDe0X6A48qLTCZDhw4dEBUVpX5PpVIhKioKPj4+FX7Gx8en3PQAcPjw4UqnNzRWZtw+7IuQqlib0/pH2yDhG62DOjhtNGnSJKxfvx6//PILkpKS8PnnnyM/Px+jRo0CAIwYMQLTp09XTx8YGIjIyEisWLEC169fx5w5c3D+/HlMmDCB61AFT24sRUPbWnyHQQxYIzsLyAz8qK+loxXfIRADR+ugDh7MOGjQIDx58gSzZ89GWloa2rZti8jISPWg3IcPH0Iq/efHsHPnzti6dStCQkIwY8YMNGnSBHv27EHr1q25DlXwWjhawdjIsHcchF8mRlI0d7A06EcEeLhY8x0CMXCtnWkd1MlTpSdMmFBp5SQ6Ovql9z744AN88MEHHEclPh60whIBaO1sbbDJi1QCtHKio17CL9oX6MHVRoaEVlgiBIa8Hja0s4C5TCfHfIRUyq2uOaxMDXs9pORFRKhcTYTAkJOXNgbcdyIcEonE4E8dUfIiEuYyIzSpZ8F3GISgmYMlzAz0XieerjZ8h0AIAFoXKXkRif5tnWiwLhEEEyMp+no68h2GzsmMpfhfG8PrNxGmge2d+Q6BV7Q3FInhndz5DoEQtRE+7nyHoHMBrR1Q18JwbohJhK1xPUt0aliH7zB4Q8mLCLSvb4OWdIUDEZDWztYGV7Ye7uPGdwiElGPIB7WUvIgA/WgSIRreyXDWy5aOVujgZrhHuUSY+rSyRz1Lw6wGUvIicHVryRDgQefZifD8r40jahvI4wKGGVCiRsTD2EiKj7zq8x0GLyh5EbhhndzoSdJEkExNjAxip25rIcOAdk58h0FIhYZ61zfIq/8oeRGwxvUs8MVbjfgOg5BKjX+rMRra6ffztr4Z0JpuTEcEy97KFNP8mvEdhs5R8iJQRlIJlr3fhqouRNBMTYyw7H1PSCV8R8KN/7VxhF9rOm1LhG1kZ3d4NTCsMVmUvAjUmG4N0K5+bb7DIOSVOrjVxuiuDfgOQ+tsLWSY158eCEuETyIpO9g1pNNHlLwIUON6FpjUqynfYRBSbZN7N9O700ffDGiNOrVkfIdBSLW41a1lUKePKHkRGGM6XURE6MXpIyM9OX/U19OJThcR0RnZ2R3eBnL6iJIXAZFIgGUftKHTRUSUOrjVxpKBbSARef7yhlttLB3Yhu8wCNGYRCLBumEdDOI5eJS8CMjcfq3wbjsXvsMgpMbe7+CC2f9ryXcYNdbS0QobR3WEmYwqn0ScateSYcsYb7jWMeM7FE5R8iIQIe+0MMjnxRD9M6pLA0z3b853GBpr6WiFzaO9YGVqGDfeI/rL3soUW8d0El0Co8lpZ71NXjxdrPkOoVqMpBIsHdgGY7o15DsUQrTm0+6NsPBdD9FcQt3RvTa2fdqJHrxI9IZrHXPs/KwzmtqL4xSSzFiKFR96Vnt6vU1e1o98A/08hX1XzDq1ZFg3rAM+7OjKdyiEaN0Q7/pYO7SD4B8hMKCtE379xJsqLkTv2FuZ4o9PfdCjmR3foVTJ0doUv37iBd8W9tX+jIQxxjiMSedycnJgbW2N7OxsWFlZITIxDSF7EpGZV8x3aOX4t3bA/AGtYUtHekTPPcktxszdV3DoWjrfoZRjZynHggGt0buVA9+hEMK5P84/wvx915BbVMp3KOV8+IYLQv7XElamJi/tv6ui98kLADzPL8Hsv67i/y6l8BxdWbVlbr9W6CvwqhAh2rY3IRlz/rqK5wUKvkPBgLZOmNOvFWzM6T4uxHCkZRcheNdlRN94wncocLQ2xaL3PNCjWT31e5S8VNJ5vqswVG0hhu5JbjFC9lzBwav8VGGo2kJIWRXmm33XkMNDFUYiAT7o8E+15d8oeami80UKJf66lIItZx7g8uNszuMxlxmhf1tnDO/khpZOVS8MQgxFYnI2tpx5gL0JKShUKDlvz9PFGsM6uaGvpxNMDegW6oRUJq+4FLsuPMaWMw9wMz2P8/asTI0xsIMLhnVyQyO7igcRU/JSzc5fepSFzWceYN/lFBQpVFqNo3E9Cwzzro+BHVxgSQMBCalQTpECO88/xpazD3D3Sb5W521qIkXfNk4Y7uOGNi42Wp03IfrkzN2n2HzmAQ5dTYNCqd2UoJWTFYZ3ckP/ts6vvH8SJS/V7PwLWQUlOJCYhsuPs3AlORs30nI1XoC2FnJ4OFvBw9kanRvbolPDujUJnxCDFXMnE7F3nuJKcjYSk7ORmVei0edlRlI0dbCAh7M1PF1s4N/aEdYCv9KJECHJyC1CZGIaLj8u2wZvZeRBqdJsX+hgZYrWztbwcLbGm01tNbpjPCUvGiYv/1VSqsL1tBxcSc5GUmoO8opKUaRQobhUCSOpFHITKUyNjeBs8/dCcrGGo7W4bgZEiNClZheqf0STswpRXKpCsUIFpUoFubERTE2ksDQ1QQvHsoOGZg6WkBnr7d0fCNG5IoUS11JzkJicjetpucgvLkXx3/tCYyMp5MZSmJoYwbW2Odq4WKO1szXsLGs+ppOSl9dMXgghhBCiW5rsv+kwhRBCCCGiQskLIYQQQkSFkhdCCCGEiAolL4QQQggRFUpeCCGEECIqlLwQQgghRFQoeSGEEEKIqHCWvDx79gxDhw6FlZUVbGxsMHr0aOTlVf78hGfPnuHLL79Es2bNYGZmhvr16+Orr75Cdjb3zx8ihBBCiHhwlrwMHToUV69exeHDh7Fv3z6cOHEC48aNq3T6lJQUpKSkYPny5UhMTMSmTZsQGRmJ0aNHcxUiIYQQQkSIkzvsJiUloWXLljh37hzeeOMNAEBkZCQCAgLw+PFjODk5VWs+O3bswLBhw5Cfnw9jY+NqfYbusEsIIYSID+932I2NjYWNjY06cQEAX19fSKVSnD17ttrzedGBqhKX4uJi5OTklHsRQgghRH9xkrykpaWhXr165d4zNjZGnTp1kJaWVq15ZGZmYv78+VWeagKARYsWwdraWv1ydXWtcdyEEEIIET6Nkpfg4GBIJJIqX9evX3/toHJycvDOO++gZcuWmDNnTpXTTp8+HdnZ2erXo0ePXrt9QgghhAhX9QaS/G3y5Mn4+OOPq5ymYcOGcHBwQEZGRrn3S0tL8ezZMzg4OFT5+dzcXPj5+cHS0hK7d++GiYlJldPL5XLI5TV/BDchhBBCxEWj5MXOzg52dnavnM7HxwdZWVmIj49Hhw4dAABHjx6FSqWCt7d3pZ/LyclBnz59IJfL8ddff8HU1FST8AghhBBiADgZ89KiRQv4+flh7NixiIuLw+nTpzFhwgR89NFH6iuNkpOT0bx5c8TFxQEoS1x69+6N/Px8bNiwATk5OUhLS0NaWhqUSiUXYRJCCCFEhDSqvGjit99+w4QJE9CzZ09IpVIMHDgQq1evVv9doVDgxo0bKCgoAABcuHBBfSVS48aNy83r3r17cHd35ypUQgghhIgIJ/d54RPd54UQQggRH97v80IIIYQQwhVKXgghhBAiKpS8EEIIIURUKHkhhBBCiKhQ8kIIIYQQUaHkhRBCCCGiQskLIYQQQkSFkhdCCCGEiAolL4QQQggRFUpeCCGEECIqlLwQQgghRFQoeSGEEEKIqFDyQgghhBBRoeSFEEIIIaJCyQshhBBCRIWSF0IIIYSICiUvhBBCCBEVSl4IIYQQIiqUvBBCCCFEVCh5IYQQQoioUPJCCCGEEFGh5IUQQgghokLJCyGEEEJEhZIXQgghhIgKJS+EEEIIERVjvgPQNsYYACAnJ4fnSAghhBBSXS/22y/241XRu+QlNzcXAODq6spzJIQQQgjRVG5uLqytraucRsKqk+KIiEqlQkpKCiwtLSGRSLQ675ycHLi6uuLRo0ewsrLS6ryFgPonfvreR33vH6D/faT+iR9XfWSMITc3F05OTpBKqx7VoneVF6lUChcXF07bsLKy0tuVEqD+6QN976O+9w/Q/z5S/8SPiz6+quLyAg3YJYQQQoioUPJCCCGEEFGh5EUDcrkcoaGhkMvlfIfCCeqf+Ol7H/W9f4D+95H6J35C6KPeDdglhBBCiH6jygshhBBCRIWSF0IIIYSICiUvhBBCCBEVSl4IIYQQIioGnbysWbMG7u7uMDU1hbe3N+Li4qqcfseOHWjevDlMTU3h4eGBiIiIcn9njGH27NlwdHSEmZkZfH19cevWLS678Eqa9HH9+vXo1q0bateujdq1a8PX1/el6T/++GNIJJJyLz8/P667USlN+rdp06aXYjc1NS03jdCWoSb969Gjx0v9k0gkeOedd9TTCGn5nThxAn379oWTkxMkEgn27Nnzys9ER0ejffv2kMvlaNy4MTZt2vTSNJpu11zStI+7du1Cr169YGdnBysrK/j4+ODgwYPlppkzZ85Ly7B58+Yc9qJymvYvOjq6wnU0LS2t3HRiXoYVbWMSiQStWrVSTyOUZbho0SJ07NgRlpaWqFevHgYMGIAbN2688nNC2BcabPKyfft2TJo0CaGhobhw4QI8PT3Rp08fZGRkVDh9TEwMBg8ejNGjR+PixYsYMGAABgwYgMTERPU0S5cuxerVq7Fu3TqcPXsWtWrVQp8+fVBUVKSrbpWjaR+jo6MxePBgHDt2DLGxsXB1dUXv3r2RnJxcbjo/Pz+kpqaqX7///rsuuvMSTfsHlN0R8t+xP3jwoNzfhbQMNe3frl27yvUtMTERRkZG+OCDD8pNJ5Tll5+fD09PT6xZs6Za09+7dw/vvPMO3nrrLSQkJCAoKAhjxowpt3OvyTrBJU37eOLECfTq1QsRERGIj4/HW2+9hb59++LixYvlpmvVqlW5ZXjq1Ckuwn8lTfv3wo0bN8rFX69ePfXfxL4Mw8PDy/Xt0aNHqFOnzkvboRCW4fHjxzF+/HicOXMGhw8fhkKhQO/evZGfn1/pZwSzL2QGysvLi40fP179b6VSyZycnNiiRYsqnP7DDz9k77zzTrn3vL292aeffsoYY0ylUjEHBwe2bNky9d+zsrKYXC5nv//+Owc9eDVN+/hfpaWlzNLSkv3yyy/q90aOHMn69++v7VBrRNP+/fzzz8za2rrS+QltGb7u8gsLC2OWlpYsLy9P/Z6Qlt+/AWC7d++ucpqpU6eyVq1alXtv0KBBrE+fPup/v+53xqXq9LEiLVu2ZHPnzlX/OzQ0lHl6emovMC2pTv+OHTvGALDnz59XOo2+LcPdu3cziUTC7t+/r35PqMswIyODAWDHjx+vdBqh7AsNsvJSUlKC+Ph4+Pr6qt+TSqXw9fVFbGxshZ+JjY0tNz0A9OnTRz39vXv3kJaWVm4aa2treHt7VzpPLtWkj/9VUFAAhUKBOnXqlHs/Ojoa9erVQ7NmzfD555/j6dOnWo29Omrav7y8PLi5ucHV1RX9+/fH1atX1X8T0jLUxvLbsGEDPvroI9SqVavc+0JYfjXxqm1QG9+Z0KhUKuTm5r60Dd66dQtOTk5o2LAhhg4diocPH/IUYc20bdsWjo6O6NWrF06fPq1+Xx+X4YYNG+Dr6ws3N7dy7wtxGWZnZwPAS+vbvwllX2iQyUtmZiaUSiXs7e3LvW9vb//SudcX0tLSqpz+xX81mSeXatLH/5o2bRqcnJzKrYR+fn749ddfERUVhSVLluD48ePw9/eHUqnUavyvUpP+NWvWDBs3bsTevXuxZcsWqFQqdO7cGY8fPwYgrGX4ussvLi4OiYmJGDNmTLn3hbL8aqKybTAnJweFhYVaWeeFZvny5cjLy8OHH36ofs/b2xubNm1CZGQkvv/+e9y7dw/dunVDbm4uj5FWj6OjI9atW4c///wTf/75J1xdXdGjRw9cuHABgHZ+t4QkJSUFBw4ceGk7FOIyVKlUCAoKQpcuXdC6detKpxPKvlDvnipNtGPx4sXYtm0boqOjyw1q/eijj9T/7+HhgTZt2qBRo0aIjo5Gz549+Qi12nx8fODj46P+d+fOndGiRQv88MMPmD9/Po+Rad+GDRvg4eEBLy+vcu+LefkZmq1bt2Lu3LnYu3dvuTEh/v7+6v9v06YNvL294ebmhj/++AOjR4/mI9Rqa9asGZo1a6b+d+fOnXHnzh2EhYVh8+bNPEbGjV9++QU2NjYYMGBAufeFuAzHjx+PxMRE3sZPacogKy+2trYwMjJCenp6uffT09Ph4OBQ4WccHByqnP7FfzWZJ5dq0scXli9fjsWLF+PQoUNo06ZNldM2bNgQtra2uH379mvHrInX6d8LJiYmaNeunTp2IS3D1+lffn4+tm3bVq0fQb6WX01Utg1aWVnBzMxMK+uEUGzbtg1jxozBH3/88VKJ/r9sbGzQtGlTUSzDinh5ealj16dlyBjDxo0bMXz4cMhksiqn5XsZTpgwAfv27cOxY8fg4uJS5bRC2RcaZPIik8nQoUMHREVFqd9TqVSIiooqd2T+bz4+PuWmB4DDhw+rp2/QoAEcHBzKTZOTk4OzZ89WOk8u1aSPQNko8fnz5yMyMhJvvPHGK9t5/Pgxnj59CkdHR63EXV017d+/KZVKXLlyRR27kJbh6/Rvx44dKC4uxrBhw17ZDl/LryZetQ1qY50Qgt9//x2jRo3C77//Xu4y98rk5eXhzp07oliGFUlISFDHri/LECi7kuf27dvVOojgaxkyxjBhwgTs3r0bR48eRYMGDV75GcHsC7U29Fdktm3bxuRyOdu0aRO7du0aGzduHLOxsWFpaWmMMcaGDx/OgoOD1dOfPn2aGRsbs+XLl7OkpCQWGhrKTExM2JUrV9TTLF68mNnY2LC9e/eyy5cvs/79+7MGDRqwwsJCnfePMc37uHjxYiaTydjOnTtZamqq+pWbm8sYYyw3N5d9/fXXLDY2lt27d48dOXKEtW/fnjVp0oQVFRUJvn9z585lBw8eZHfu3GHx8fHso48+Yqampuzq1avqaYS0DDXt3wtdu3ZlgwYNeul9oS2/3NxcdvHiRXbx4kUGgK1cuZJdvHiRPXjwgDHGWHBwMBs+fLh6+rt37zJzc3M2ZcoUlpSUxNasWcOMjIxYZGSkeppXfWe6pmkff/vtN2ZsbMzWrFlTbhvMyspSTzN58mQWHR3N7t27x06fPs18fX2Zra0ty8jIEHz/wsLC2J49e9itW7fYlStXWGBgIJNKpezIkSPqacS+DF8YNmwY8/b2rnCeQlmGn3/+ObO2tmbR0dHl1reCggL1NELdFxps8sIYY99++y2rX78+k8lkzMvLi505c0b9t+7du7ORI0eWm/6PP/5gTZs2ZTKZjLVq1Yrt37+/3N9VKhWbNWsWs7e3Z3K5nPXs2ZPduHFDF12plCZ9dHNzYwBeeoWGhjLGGCsoKGC9e/dmdnZ2zMTEhLm5ubGxY8fy9qPCmGb9CwoKUk9rb2/PAgIC2IULF8rNT2jLUNN19Pr16wwAO3To0EvzEtrye3HZ7H9fL/o0cuRI1r1795c+07ZtWyaTyVjDhg3Zzz///NJ8q/rOdE3TPnbv3r3K6Rkruzzc0dGRyWQy5uzszAYNGsRu376t2479TdP+LVmyhDVq1IiZmpqyOnXqsB49erCjR4++NF8xL0PGyi4NNjMzYz/++GOF8xTKMqyoXwDKbVdC3RdK/u4AIYQQQogoGOSYF0IIIYSIFyUvhBBCCBEVSl4IIYQQIiqUvBBCCCFEVCh5IYQQQoioUPJCCCGEEFGh5IUQQgghokLJCyGEEEJEhZIXQgghhIgKJS+EEEIIERVKXgghhBAiKpS8EEIIIURU/h/daPOEVutdSAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "kwant.plot(fsyst);\n" ] }, { "cell_type": "code", "execution_count": 9, "id": "ce2b9a9b-7e6d-49ef-bc36-5918e19f748a", "metadata": {}, "outputs": [], "source": [ "params = {'k_x': 0, 'k_y': 0, 'disorder': 0}\n" ] }, { "cell_type": "markdown", "id": "fc77edbe-0e11-4694-b061-f33cf9b3c0b9", "metadata": {}, "source": [ "The bounds should be fixed, since we will iterate in reciprocal space" ] }, { "cell_type": "code", "execution_count": 10, "id": "524a0c3c-6328-49b9-8ae9-db6d25296739", "metadata": {}, "outputs": [], "source": [ "def init_kpm_params(fsyst, params):\n", " num_moments = 300\n", " kpm_params = {\n", " \"num_moments\": num_moments,\n", " \"num_vectors\": 8,\n", " \"rng\": 0,\n", " }\n", "\n", " bounds = _BaseKPM(\n", " fsyst,\n", " params=params,\n", " num_vectors=1,\n", " num_moments=2,\n", " ).bounds\n", "\n", " kpm_params[\"bounds\"] = bounds\n", "\n", "\n", " energies = (\n", " kwant.kpm._chebyshev_nodes(2 * num_moments) * (bounds[1] - bounds[0]) / 2\n", " + (bounds[1] + bounds[0]) / 2\n", " )\n", " return kpm_params, energies\n" ] }, { "cell_type": "markdown", "id": "9da2a896-dcab-4454-9bee-32e45a601728", "metadata": {}, "source": [ "### Define the k-path" ] }, { "cell_type": "code", "execution_count": 11, "id": "0b8bb1e8-eeb7-42af-b5ce-f3cb6db233d3", "metadata": {}, "outputs": [], "source": [ "def make_path_segment(p1, p2, num_k):\n", " return (\n", " p1[np.newaxis]\n", " + np.linspace(0, 1, num_k, endpoint=False)[:, np.newaxis]\n", " * (p2 - p1)[np.newaxis]\n", " )\n", "\n", "def make_path(points, num_k):\n", " k_path = np.zeros((0, *points[0].shape))\n", " for idx in range(len(points)-1):\n", " p1 = points[idx]\n", " p2 = points[idx+1]\n", " k_path = np.concatenate([k_path, make_path_segment(p1, p2, num_k)], axis=0)\n", " return k_path\n" ] }, { "cell_type": "code", "execution_count": 12, "id": "045e02ab-e776-4f8c-a625-d8b7a7d19722", "metadata": {}, "outputs": [], "source": [ "p_gamma = np.array([0 ,0])\n", "p_m = np.array([1/2,-1/(2*np.sqrt(3))])\n", "p_K = np.array([2/3, 0])\n", "p_Kp = p_K + 2 * (p_m - p_K)\n" ] }, { "cell_type": "code", "execution_count": 13, "id": "2e523a23-013c-4bac-9bd9-2069a17b958b", "metadata": {}, "outputs": [], "source": [ "points = np.array([p_gamma, p_m, p_K, p_gamma, p_Kp]) * 2 * np.pi\n", "num_k = 50\n", "\n", "points = points\n", "\n", "k_path = make_path(points, num_k)\n", "num_k_full = len(k_path)\n", "\n", "k_path_lengths = np.cumsum(np.append(0, np.linalg.norm(np.diff(k_path, axis=0), axis=1)))\n", "\n", "xticks = [(k_path_lengths[num_k * 0], '$\\Gamma$'),\n", " (k_path_lengths[num_k * 1], '$M$'),\n", " (k_path_lengths[num_k * 2], '$K$'),\n", " (k_path_lengths[num_k * 3], '$\\Gamma$'),\n", " (k_path_lengths[num_k * 4-1], \"$K'$\"),\n", " ]\n" ] }, { "cell_type": "code", "execution_count": 14, "id": "8996547d-f0fa-4442-8aab-d2b072e9695b", "metadata": {}, "outputs": [], "source": [ "def density_in_k(k, tile):\n", " kvecs = tile_random_kvectors(k, tile, fsyst)\n", "\n", " # update boundary conditions to be periodic like `k`\n", " k_in_ts = momentum_to_ts(k, fsyst._wrapped_symmetry)\n", " params.update(dict(zip(fsyst._momentum_names, k_in_ts)))\n", "\n", " spectrum_k = SpectralDensityIterator(\n", " fsyst,\n", " params=params,\n", " vector_factory=kvecs,\n", " **kpm_params,\n", " )\n", "\n", " return spectrum_k.densities\n" ] }, { "cell_type": "markdown", "id": "807a4c8a-a6f6-4d58-940d-e8023eae3d91", "metadata": {}, "source": [ "### Typical k-path plot\n", "Here, we obtain the Brillouin zone-unfolded typical k-path for graphene or the honeycomb lattice.\n", "\n", "Notice that the `tile` controls the translational symmetry of the KPM vectors used in the expansion, and it has no effect that the superlattice is skewed, since the periodic boundaries are take periodic in `k`, just like the vectors." ] }, { "cell_type": "code", "execution_count": 15, "id": "9cef7201-f90c-4ef0-bac6-1491b7ee9713", "metadata": {}, "outputs": [], "source": [ "params[\"disorder\"] = 0\n" ] }, { "cell_type": "code", "execution_count": 16, "id": "bb89c79f-8d64-4332-bee6-7f3abcf95851", "metadata": {}, "outputs": [], "source": [ "kpm_params, energies = init_kpm_params(fsyst, params)\n" ] }, { "cell_type": "code", "execution_count": 17, "id": "1fb80ad3-cb3d-404e-8fb9-f29afbce0797", "metadata": {}, "outputs": [], "source": [ "tile = kwant.TranslationalSymmetry(*honeycomb.prim_vecs)\n" ] }, { "cell_type": "code", "execution_count": 18, "id": "d56aab9a-723d-423d-8ee3-dfbaac7bd039", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 142 ms, sys: 53.7 ms, total: 196 ms\n", "Wall time: 29.5 s\n" ] } ], "source": [ "%%time\n", "with ProcessPoolExecutor() as executor:\n", " densities_unfolded = np.array(list(executor.map(\n", " density_in_k,\n", " k_path,\n", " [tile] * num_k_full,\n", " )))\n" ] }, { "cell_type": "code", "execution_count": 19, "id": "91a4c605-d275-48ba-b966-bc71337e2942", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 138 ms, sys: 36.7 ms, total: 174 ms\n", "Wall time: 21.7 s\n" ] } ], "source": [ "%%time\n", "with ProcessPoolExecutor() as executor:\n", " densities_folded = np.array(list(executor.map(\n", " density_in_k,\n", " k_path,\n", " [fsyst._wrapped_symmetry] * num_k_full,\n", " )))\n" ] }, { "cell_type": "code", "execution_count": 20, "id": "c1901035-50aa-43be-b92e-1a7cacc910bf", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ ":Layout\n", " .QuadMesh.I :QuadMesh [$k$,$\\epsilon$] ($\\rho(\\epsilon, k)$)\n", " .QuadMesh.II :QuadMesh [$k$,$\\epsilon$] ($\\rho(\\epsilon, k)$)" ] }, "execution_count": 20, "metadata": { "application/vnd.holoviews_exec.v0+json": {} }, "output_type": "execute_result" } ], "source": [ "plot_kpath_unfolded = hv.QuadMesh(\n", " (k_path_lengths, energies, densities_unfolded.T.real),\n", " kdims=[r'$k$', r'$\\epsilon$'],\n", " vdims=hv.Dimension(r'$\\rho(\\epsilon, k)$', range=(0, 50)),\n", ").opts(\n", " xticks=xticks,\n", " colorbar=True,\n", " cmap='bone_r',\n", " title=\"k-path unfolded\",\n", ")\n", "\n", "plot_kpath_folded = hv.QuadMesh(\n", " (k_path_lengths, energies, densities_folded.T.real),\n", " kdims=[r'$k$', r'$\\epsilon$'],\n", " vdims=hv.Dimension(r'$\\rho(\\epsilon, k)$', range=(0, 50)),\n", ").opts(\n", " xticks=xticks,\n", " colorbar=True,\n", " cmap='bone_r',\n", " title=\"k-path folded\",\n", ")\n", "\n", "plot_kpath_folded + plot_kpath_unfolded\n" ] }, { "cell_type": "markdown", "id": "852d4b7b-a921-40b6-9b71-6124aa100635", "metadata": {}, "source": [ "### Zone-unfolded k-path plot\n", "Now we can add noise to the system. This will break the translational symmetry of the lattice, and only the translational symmetry of the superlattice will remain unbroken.\n", "\n", "In this case, we expect to see some avoided crossing evidencing the zone-unfolding procedure." ] }, { "cell_type": "code", "execution_count": 21, "id": "34ea44ad-63b8-43b8-89a6-d8452127a743", "metadata": {}, "outputs": [], "source": [ "params[\"disorder\"] = 1\n" ] }, { "cell_type": "code", "execution_count": 22, "id": "2c1e9291-7f0e-47f5-a8ac-2f5cfcb49947", "metadata": {}, "outputs": [], "source": [ "kpm_params, energies = init_kpm_params(fsyst, params)\n" ] }, { "cell_type": "code", "execution_count": 23, "id": "e72537f8-8629-42f2-989d-5a586bbb159a", "metadata": {}, "outputs": [], "source": [ "tile = kwant.TranslationalSymmetry(*honeycomb.prim_vecs)\n" ] }, { "cell_type": "code", "execution_count": 24, "id": "f1e03450-3e0d-4de8-8233-8173f0076a84", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 134 ms, sys: 104 ms, total: 238 ms\n", "Wall time: 25.5 s\n" ] } ], "source": [ "%%time\n", "with ProcessPoolExecutor() as executor:\n", " densities_unfolded = np.array(list(executor.map(\n", " density_in_k,\n", " k_path,\n", " [tile] * num_k_full,\n", " )))\n" ] }, { "cell_type": "code", "execution_count": 25, "id": "3b8f3141-b8b1-4e0b-87f0-aecba03ef934", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 147 ms, sys: 35.5 ms, total: 183 ms\n", "Wall time: 21 s\n" ] } ], "source": [ "%%time\n", "with ProcessPoolExecutor() as executor:\n", " densities_folded = np.array(list(executor.map(\n", " density_in_k,\n", " k_path,\n", " [fsyst._wrapped_symmetry] * num_k_full,\n", " )))\n" ] }, { "cell_type": "code", "execution_count": 26, "id": "c926d1ec-8450-463c-806c-9b04f9c7a517", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ ":Layout\n", " .QuadMesh.I :QuadMesh [$k$,$\\epsilon$] ($\\rho(\\epsilon, k)$)\n", " .QuadMesh.II :QuadMesh [$k$,$\\epsilon$] ($\\rho(\\epsilon, k)$)" ] }, "execution_count": 26, "metadata": { "application/vnd.holoviews_exec.v0+json": {} }, "output_type": "execute_result" } ], "source": [ "plot_kpath_unfolded = hv.QuadMesh(\n", " (k_path_lengths, energies, densities_unfolded.T.real),\n", " kdims=[r'$k$', r'$\\epsilon$'],\n", " vdims=hv.Dimension(r'$\\rho(\\epsilon, k)$', range=(0, 50)),\n", ").opts(\n", " xticks=xticks,\n", " colorbar=True,\n", " cmap='bone_r',\n", " title=\"k-path unfolded\",\n", ")\n", "\n", "plot_kpath_folded = hv.QuadMesh(\n", " (k_path_lengths, energies, densities_folded.T.real),\n", " kdims=[r'$k$', r'$\\epsilon$'],\n", " vdims=hv.Dimension(r'$\\rho(\\epsilon, k)$', range=(0, 50)),\n", ").opts(\n", " xticks=xticks,\n", " colorbar=True,\n", " cmap='bone_r',\n", " title=\"k-path folded\",\n", ")\n", "\n", "plot_kpath_folded + plot_kpath_unfolded\n" ] } ], "metadata": { "kernelspec": { "display_name": "kt", "language": "python", "name": "kt" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.13" } }, "nbformat": 4, "nbformat_minor": 5 }