{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "%run ../code/init_mooc_nb.ipy\n", "import scipy\n", "import scipy.linalg as sla\n", "from matplotlib import cm\n", "\n", "\n", "import warnings\n", "warnings.simplefilter(\"ignore\", UserWarning)\n", "\n", "\n", "sigma0 = np.array([[1, 0], [0, 1]])\n", "sigmax = np.array([[0, 1], [1, 0]])\n", "sigmay = np.array([[0, -1j], [1j, 0]])\n", "sigmaz = np.array([[1, 0], [0, -1]])\n", "\n", "\n", "def evaluate_on_grid(X, Y, func):\n", " \"\"\" X, Y should be in np.meshgrid form. It's enough for func to work on floats. \"\"\"\n", " data = []\n", " for xx, yy in zip(X, Y):\n", " row = []\n", " for i,j in zip(xx, yy):\n", " row.append(func(i,j))\n", " data.append(row)\n", " data = np.array(data)\n", " data = [np.array(data[:,:,i]) for i in range(np.shape(data)[2])]\n", " return data\n", "\n", "\n", "def get_energy_function(A, B, C):\n", " \"\"\" Used for plotting of hexagonal warping. \"\"\"\n", " def func(kx, ky):\n", " matrix = A*(kx**2+ky**2)*sigma0\\\n", " + B*(kx * sigmay - ky * sigmax) \\\n", " + C* 0.5 * ( (kx+1j*ky)**3 + (kx-1j*ky)**3 ) * sigmaz\n", " return sla.eigh(matrix)[0]\n", " return func\n", "\n", "\n", "# Onsite and hoppings matrices used for building BHZ model\n", "def onsite(site, par):\n", " A1, A2, B1, B2, D1, D2, C, M = par.A1, par.A2, par.B1, par.B2, par.D1, par.D2, par.C, par.M\n", " return (C + 2 * D1 + 4 * D2) * np.kron(sigma0, sigma0) + (M + 2 * B1 + 4 * B2) * np.kron(sigma0, sigmaz)\n", "\n", "\n", "def hopx(site1, site2, par):\n", " A1, A2, B1, B2, D1, D2, C, M = par.A1, par.A2, par.B1, par.B2, par.D1, par.D2, par.C, par.M\n", " return - D2 * np.kron(sigma0, sigma0) - B2 * np.kron(sigma0, sigmaz) + A2 * 0.5j * np.kron(sigmax, sigmax)\n", "\n", "\n", "def hopy(site1, site2, par):\n", " A1, A2, B1, B2, D1, D2, C, M = par.A1, par.A2, par.B1, par.B2, par.D1, par.D2, par.C, par.M\n", " return - D2 * np.kron(sigma0, sigma0) - B2 * np.kron(sigma0, sigmaz) + A2 * 0.5j * np.kron(sigmay, sigmax)\n", "\n", "\n", "def hopz(site1, site2, par):\n", " A1, A2, B1, B2, D1, D2, C, M = par.A1, par.A2, par.B1, par.B2, par.D1, par.D2, par.C, par.M\n", " return - D1 * np.kron(sigma0, sigma0) - B1 * np.kron(sigma0, sigmaz) + A1 * 0.5j * np.kron(sigmaz, sigmax)\n", "\n", "\n", "def bhz_slab(L, W, H):\n", " \"\"\"A cuboid region of BHZ material with two leads attached.\n", " \n", " parameters for leads and scattering region can be defined separately\n", " \"\"\"\n", " lat = kwant.lattice.general(np.identity(3))\n", " sys = kwant.Builder()\n", " \n", " sym = kwant.TranslationalSymmetry((1, 0, 0))\n", " lead = kwant.Builder(sym)\n", " \n", " def shape_lead(pos):\n", " (x, y, z) = pos\n", " return (0 <= z < H) and (0 <= y < W)\n", " \n", " def shape(pos):\n", " (x, y, z) = pos\n", " return (0 <= z < H) and (0 <= y < W) and (0 <= x < L)\n", " \n", " def hopping_x(site1, site2, par):\n", " xt, yt, zt = site1.pos\n", " xs, ys, zs = site2.pos\n", " return hopx(site1,site2,par) * np.exp(-0.5j * par.Bz * (xt - xs) * (yt + ys))\n", " \n", " # scattering system\n", " sys[lat.shape(shape, (0,0,0))] = lambda site, par: onsite(site, par.scat) - par.mu * np.eye(4)\n", " sys[kwant.HoppingKind((1,0,0), lat)] = lambda site1, site2, par: hopping_x(site1, site2, par.scat)\n", " sys[kwant.HoppingKind((0,1,0), lat)] = lambda site1, site2, par: hopy(site1, site2, par.scat)\n", " sys[kwant.HoppingKind((0,0,1), lat)] = lambda site1, site2, par: hopz(site1, site2, par.scat)\n", "\n", " # leads\n", " lead[lat.shape(shape_lead, (0,0,0))] = lambda site, par: onsite(site, par.lead) - par.mu_lead * np.eye(4)\n", " lead[kwant.HoppingKind((1,0,0), lat)] = lambda site1, site2, par: hopping_x(site1, site2, par.lead)\n", " lead[kwant.HoppingKind((0,1,0), lat)] = lambda site1, site2, par: hopy(site1, site2, par.lead)\n", " lead[kwant.HoppingKind((0,0,1), lat)] = lambda site1, site2, par: hopz(site1, site2, par.lead)\n", " \n", " # attaching leads\n", " sys.attach_lead(lead)\n", " sys.attach_lead(lead.reversed())\n", " return sys.finalized()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Performing the necessary imports.\n", "\n", "from __future__ import division, print_function\n", "import numpy as np\n", "import matplotlib\n", "import kwant\n", "\n", "import ipywidgets\n", "from IPython.html.widgets import interact\n", "from ipywidgets import StaticInteract, RangeWidget, DropDownWidget\n", "from IPython.display import display_html\n", "from matplotlib import pyplot as plt\n", "\n", "import pfaffian as pf\n", "from edx_components import *\n", "\n" ] }, { "html": [ "\n", "\n", "\n", "
Press this button to show/hide the code used in the notebook:\n", "
\n", "" ], "metadata": {}, "output_type": "display_data" }, { "javascript": [ "/**\n", " * Calico Jupyter Notebooks Extensions\n", " *\n", " * Copyright (c) The Calico Project\n", " * http://calicoproject.org/ICalico\n", " *\n", " * Released under the BSD Simplified License\n", " *\n", " **/\n", "\n", "function ip_version() {\n", " if (IPython.version[0] === \"2\")\n", "\treturn 2;\n", " else if (IPython.version[0] === \"3\")\n", "\treturn 3;\n", " else\n", "\tthrow \"IPython version not supported\";\n", "}\n", "\n", "function break_into_sections(index) {\n", " if (ip_version() === 2)\n", "\treturn 0;\n", " var cells = IPython.notebook.get_cells();\n", " var count = 0; // count below index, or -1\n", " // go in reverse order to keep index accurate\n", " for (var i = cells.length - 1; i > -1; i--) {\n", "\tvar cell = cells[i];\n", "\tvar rendered = cell.rendered;\n", "\t// consider it for breaking:\n", "\tif (cell.cell_type === \"markdown\") {\n", "\t var text = cell.get_text();\n", "\t if (text.match(/^#+Table of Contents/)) \n", "\t\tcontinue;\n", "\t var lines = text.split(/\\n/g);\n", "\t if (lines.length > 1) {\n", "\t\t// possibly break up\n", "\t\tvar state = \"ok\";\n", "\t\tvar current = \"\";\n", "\t\tvar cell_texts = [];\n", "\t\tfor (var line_no in lines) {\n", "\t\t var line = lines[line_no];\n", "\t\t if (state === \"ok\") {\n", "\t\t\tif (line.indexOf('```') === 0) {\n", " // set state to fence: allows for longer fences\n", "\t\t\t state = line.substr(0, line.search(\"[^`]\"));\n", "\t\t\t current += line + \"\\n\";\n", "\t\t\t} else if (line.indexOf('#') === 0) {\n", "\t\t\t if (current !== \"\") {\n", "\t\t\t\tcell_texts.push(current.trim());\n", "\t\t\t }\n", "\t\t\t current = \"\";\n", "\t\t\t cell_texts.push(line);\n", "\t\t\t} else {\n", "\t\t\t current += line + \"\\n\";\n", "\t\t\t}\n", "\t\t } else { // in block\n", "\t\t\tif (line.indexOf(state) === 0) {\n", "\t\t\t state = \"ok\";\n", "\t\t\t current += line + \"\\n\";\n", "\t\t\t cell_texts.push(current.trim());\n", "\t\t\t current = \"\";\n", "\t\t\t} else {\n", "\t\t\t current += line + \"\\n\";\n", "\t\t\t}\n", "\t\t }\n", "\t\t} // for\n", "\t\t// anything left over:\n", "\t\tif (current.trim() !== \"\") {\n", "\t\t cell_texts.push(current.trim());\n", "\t\t}\n", "\t\tif (cell_texts.length > 1) {\n", "\t\t var current_cell = IPython.notebook.get_cell(i);\n", "\t\t var added = 0;\n", "\t\t for (var j = 0; j < cell_texts.length; j++) {\n", "\t\t\tif (cell_texts[j].trim() !== \"\") {\n", "\t\t\t if (added === 0) {\n", "\t\t\t\tcurrent_cell.set_text(cell_texts[j]);\n", "\t\t\t\tif (rendered) {\n", "\t\t\t\t current_cell.render();\n", "\t\t\t\t}\t\t\t\t\t\n", "\t\t\t } else {\n", "\t\t\t\tif (i === index) {\n", "\t\t\t\t count = -1; // nope, can't do it\n", "\t\t\t\t} else if (i < index && count !== -1) {\n", "\t\t\t\t count++;\n", "\t\t\t\t}\n", "\t\t\t\tvar new_cell = IPython.notebook.insert_cell_below(\"markdown\", i + added - 1);\n", "\t\t\t\tnew_cell.set_text(cell_texts[j]);\n", " if (rendered) {\n", "\t\t\t\t new_cell.render();\n", "\t\t\t\t}\n", "\t\t\t }\n", "\t\t\t added++;\n", "\t\t\t}\n", "\t\t }\n", "\t\t}\n", "\t }\n", "\t}\n", " }\n", " return count;\n", "}\n", "\n", "function is_heading(cell) {\n", " if (ip_version() === 2)\n", "\treturn (cell.cell_type === \"heading\");\n", " else \n", "\treturn (cell.cell_type === \"markdown\" && cell.get_text().indexOf(\"#\") === 0)\n", "}\n", "\n", "function get_heading_text(cell) {\n", " if (ip_version() === 2)\n", "\treturn cell.get_text();\n", " else if (cell.get_text().indexOf(\"######\") === 0)\n", "\treturn cell.get_text().substring(6).trim();\n", " else if (cell.get_text().indexOf(\"#####\") === 0)\n", "\treturn cell.get_text().substring(5).trim();\n", " else if (cell.get_text().indexOf(\"####\") === 0)\n", "\treturn cell.get_text().substring(4).trim();\n", " else if (cell.get_text().indexOf(\"###\") === 0)\n", "\treturn cell.get_text().substring(3).trim();\n", " else if (cell.get_text().indexOf(\"##\") === 0)\n", "\treturn cell.get_text().substring(2).trim();\n", " else if (cell.get_text().indexOf(\"#\") === 0)\n", "\treturn cell.get_text().substring(1).trim();\n", " else return \"\";\n", "}\n", "\n", "function repeat(pattern, count) {\n", " if (count < 1) return '';\n", " var result = '';\n", " while (count > 1) {\n", " if (count & 1) result += pattern;\n", " count >>= 1, pattern += pattern;\n", " }\n", " return result + pattern;\n", "}\n", "\n", "function set_heading_text(cell, text) {\n", " var rendered = cell.rendered;\n", " cell.unrender();\n", " if (ip_version() === 2)\n", "\tcell.set_text(text);\n", " else {\n", "\tvar level = get_level(cell);\n", "\tcell.set_text( repeat(\"#\", level) + \" \" + text)\n", " }\n", " if (rendered) {\n", " cell.render();\n", " }\n", "}\n", "\n", "function get_level(cell) {\n", " if (ip_version() === 2)\n", "\treturn cell.level;\n", " else if (cell.get_text().indexOf(\"######\") === 0)\n", "\treturn 6;\n", " else if (cell.get_text().indexOf(\"#####\") === 0)\n", "\treturn 5;\n", " else if (cell.get_text().indexOf(\"####\") === 0)\n", "\treturn 4;\n", " else if (cell.get_text().indexOf(\"###\") === 0)\n", "\treturn 3;\n", " else if (cell.get_text().indexOf(\"##\") === 0)\n", "\treturn 2;\n", " else if (cell.get_text().indexOf(\"#\") === 0)\n", "\treturn 1;\n", " else return 0;\n", "}\n", "\n", "function get_last_cell_index_in_section(level, index) {\n", " var current = index;\n", " while (IPython.notebook.is_valid_cell_index(current + 1)) {\n", "\tvar cell = IPython.notebook.get_cell(current + 1);\n", "\tif (is_heading(cell) && get_level(cell) <= level) {\n", "\t return current;\n", "\t}\n", "\tcurrent++;\n", " }\n", " return current;\n", "}\n", "\n", "function get_index_level_above(level, index) {\n", " var current = current = index - 1;\n", " while (IPython.notebook.is_valid_cell_index(current)) {\n", "\tvar cell = IPython.notebook.get_cell(current);\n", "\tif (is_heading(cell) && get_level(cell) <= level) {\n", "\t return current;\n", "\t}\n", "\tcurrent--;\n", " }\n", " return undefined;\n", "}\n", "\n", "function get_index_level_below(level, index) {\n", " var current = current = index + 1;\n", " while (IPython.notebook.is_valid_cell_index(current)) {\n", "\tvar cell = IPython.notebook.get_cell(current);\n", "\tif (is_heading(cell) && get_level(cell) <= level) {\n", "\t return current;\n", "\t}\n", "\tcurrent++;\n", " }\n", " return undefined;\n", "}\n", "\n", "function section_label() {\n", " // Label headings with numbers, or toggle them off\n", " // If there is a table of contents, re-do it\n", " break_into_sections();\n", " var cells = IPython.notebook.get_cells();\n", " var levels = [0,0,0,0,0,0];\n", " var current_level = 1;\n", " var flag = false;\n", " var alert_text = \"\";\n", " var alert_flag = false;\n", " var remove_numbering = true;\n", " \n", " for (var i = 0; i < cells.length; i++) {\n", "\tvar cell = cells[i];\n", "\tif (is_heading(cell)) {\n", "\t if (cell.get_text().match(/^#+Table of Contents/)) \n", "\t\tcontinue;\n", "\t if (cell.get_text().match(/^#+References/)) \n", "\t\tcontinue;\n", "\t var level = get_level(cell);\n", "\t \n", "\t if (level >= current_level) { //just keep incrementing\n", "\t\tcurrent_level = level;\n", "\t\tlevels[level-1]++;\n", "\t } else { //went back a level\n", "\t\tlevels[current_level-1] = 0;\n", "\t\t\n", "\t\tif (current_level-level > 1) { //Skipped levels in between\n", "\t\t for (var j = 1; j < current_level-level; j++) { //back-prop the zeros\n", "\t\t\tlevels[current_level - 1 - j] = 0;\n", "\t\t }\n", "\t\t}\n", "\t\t\n", "\t\tlevels[level -1]++;\n", "\t\tcurrent_level = level;\n", "\t }\n", "\t \n", "\t var error = false;\n", "\t var error_no_begin = 0;\n", "\t var error_no_end = 0;\n", "\t var error_heading_label = \"\";\n", "\t var heading_label = \"\"; //Generate the appropriate number for the heading\n", "\t for (var k = 0; k < level; k++) {\n", "\t\tif (levels[k] == 0) {\n", "\t\t if (!error) {\n", "\t\t\terror_heading_label = heading_label;\n", "\t\t\terror = true;\n", "\t\t\terror_no_begin = k;\n", "\t\t } else {\n", "\t\t\terror_no_end = k + 2;\n", "\t\t }\n", "\t\t}\n", "\t\theading_label += levels[k];\n", "\t\tif (level-k == 1 && level > 1) {\n", "\t\t break;\n", "\t\t}\n", "\t\theading_label += \".\";\n", "\t }\n", "\t \n", "\t if (error) {\n", "\t\tif (error_no_end == 0) {\n", "\t\t error_no_end = error_no_begin + 2;\n", "\t\t}\n", "\t\tif (error_heading_label == \"\") {\n", "\t\t if (!flag) {\n", "\t\t\tvar temp1 = \"Notebook begins with a Header \" + error_no_end + \" cell.\" + \"\\n\";\n", "\t\t\talert_text += temp1;\n", "\t\t\talert_flag = true;\n", "\t\t\tflag = true;\n", "\t\t }\n", "\t\t} else{\n", "\t\t var temp = \"You placed a Header \" + error_no_end + \" cell under a Header \" + error_no_begin + \" cell in section \" + error_heading_label +\"\\n\";\n", "\t\t alert_text += temp;\n", "\t\t alert_flag = true;\n", "\t\t}\n", "\t }\n", "\t \n", "\t var heading_text = get_heading_text(cell);\n", "\t var old_header = heading_text;\n", "\t var re = /(?:\\d*\\.*)*\\s*(.*)/;\n", "\t var match = heading_text.match(re);\n", "\t \n", "\t if (match) {\n", "\t\theading_text = heading_label + \" \" + match[1];\n", "\t } else {\n", "\t\theading_text = heading_label;\n", "\t }\n", "\t \n", "\t if (old_header != heading_text) {\n", "\t\tremove_numbering = false;\n", "\t\treplace_links(old_header, heading_text);\n", "\t }\n", "\t \n", "\t heading_text = heading_text.trim();\n", "\t set_heading_text(cell, heading_text);\n", "\t}\n", " }\n", " \n", " if (alert_flag) {\n", "\talert(alert_text);\n", " }\n", " \n", " if (remove_numbering) {\n", "\tfor (var i = 0; i < cells.length; i++) {\n", "\t var cell = cells[i];\n", "\t if (is_heading(cell)) {\n", "\t\tif (cell.get_text().match(/^#+Table of Contents/)) \n", "\t\t continue;\n", "\t\tif (cell.get_text().match(/^#+References/)) \n", "\t\t continue;\n", "\t\tvar heading_text = get_heading_text(cell);\n", "\t\told_header = heading_text;\n", "\t\tvar re = /(?:\\d*\\.*)*\\s*(.*)/;\n", "\t\tvar match = heading_text.match(re);\n", "\t\tif (match) {\n", "\t\t heading_text = match[1];\n", "\t\t}\n", "\t\tset_heading_text(cell, heading_text);\n", "\t\treplace_links(old_header, heading_text);\n", "\t }\n", "\t}\n", " }\n", " \n", " // If there is a Table of Contents, replace it:\n", " var cells = IPython.notebook.get_cells();\n", " for (var i = 0; i < cells.length; i++) {\n", " var cell = cells[i];\n", " if (cell.cell_type == \"markdown\") {\n", "\t var cell_text = cell.get_text();\n", "\t var match = cell_text.match(/^#+Table of Contents/);\n", "\t if (match) {\n", "\t\ttable_of_contents();\n", "\t\tbreak;\n", "\t }\n", "\t}\n", " }\n", "}\n", "\n", "function replace_links(old_header, new_header) {\n", " // Replace an old internal link with new link\n", " new_header = new_header.trim();\n", " var cells = IPython.notebook.get_cells();\n", " for (var i = 0; i < cells.length; i++) {\n", " var cell = cells[i];\n", " if (cell.cell_type == \"markdown\") {\n", "\t var cell_text = cell.get_text();\n", "\t // Skip over table of contents:\n", "\t if (cell_text.match(/^#+Table of Contents/)) {\n", "\t\tcontinue;\n", "\t }\n", "\t var re_string = old_header;\n", "\t re_string = re_string.replace(/\\\\/g, \"\\\\\\\\\");\n", "\t re_string = re_string.replace(/\\//g, \"\\\\/\");\n", "\t re_string = re_string.replace(/\\^/g, \"\\\\^\");\n", "\t re_string = re_string.replace(/\\$/g, \"\\\\$\");\n", "\t re_string = re_string.replace(/\\*/g, \"\\\\*\");\n", "\t re_string = re_string.replace(/\\+/g, \"\\\\+\");\n", "\t re_string = re_string.replace(/\\?/g, \"\\\\?\");\n", "\t re_string = re_string.replace(/\\./g, \"\\\\.\");\n", "\t re_string = re_string.replace(/\\)/g, \"%29\");\n", "\t re_string = re_string.replace(/\\|/g, \"\\\\|\");\n", "\t re_string = re_string.replace(/\\[/g, \"\\\\[\");\n", "\t re_string = re_string.replace(/\\]/g, \"\\\\]\");\n", "\t re_string = re_string.replace(/\\(/g, \"?:\\\\(|%28\");\n", "\t re_string = re_string.replace(/\\s/g, \"-\");\n", "\t re_string = \"(\\\\[.*\\\\](?::\\\\s*|\\\\()#)\" + re_string + \"(.*\\\\)|(.*)$)\";\n", "\t \n", "\t var re = new RegExp(re_string, \"gm\");\n", "\t var link_text = new_header.replace(/\\s+$/g, \"\"); //Delete trailing spaces before they become \"-\"\n", "\t link_text = link_text.replace(/\\(/g, \"%28\"); //Replace left parentheses with their encoding\n", "\t link_text = link_text.replace(/\\)/g, \"%29\"); //Replace right parentheses with their encoding\n", "\t link_text = link_text.replace(/ /g, \"-\"); //Replace all spaces with dashes to create links\n", "\t \n", "\t var match = cell_text.match(re);\n", "\t if (match) {\n", " var new_text = cell_text.replace(re, \"$1\" + link_text + \"$2\");\n", " cell.unrender();\n", " cell.set_text(new_text);\n", " cell.render();\n", "\t }\n", " }\n", " }\n", "}\n", "\n", "function find_cell(cell_type, text) {\n", " // Finds first cell of cell_type that starts with text\n", " // cell_type and text are interpreted as a regular expression\n", " var cell = undefined;\n", " var cells = IPython.notebook.get_cells();\n", " for (var x = 0; x < cells.length; x++) {\n", "\tvar temp = cells[x];\n", "\tif (temp.cell_type.match(cell_type) != undefined) {\n", "\t var temp_text = temp.get_text();\n", "\t var re = new RegExp(\"^\" + text);\n", "\t if (re.test(temp_text)) {\n", "\t\tcell = cells[x];\n", "\t\tbreak;\n", "\t }\n", "\t}\n", " }\n", " return cell;\n", "}\n", "\n", "function table_of_contents() {\n", " break_into_sections();\n", " // Create and/or replace Table of Contents\n", " var cells = IPython.notebook.get_cells();\n", " var toc_cell = find_cell(\"markdown\", \"#+Table of Contents\");\n", " // Default to top-level heading\n", " var toc_text = \"#Table of Contents\\n\";\n", " if (toc_cell == undefined) {\n", "\t//Create a new markdown cell at the top of the Notebook\n", "\ttoc_cell = IPython.notebook.select(0).insert_cell_below(\"markdown\"); \n", " } else {\n", "\t// already exists:\n", "\ttoc_text = toc_cell.get_text().match(/^#+Table of Contents/)[0] + \"\\n\";\n", " }\n", " var prev_lev = 0;\n", " for (var i = 0; i < cells.length; i++) {\n", "\tvar cell = cells[i];\n", "\tif (is_heading(cell)) {\n", "\t if (cell.get_text().match(/^#+Table of Contents/)) \n", "\t\tcontinue;\n", "\t if (cell.get_text().match(/^#+References/)) \n", "\t\tcontinue;\n", "\t if (get_level(cell) - prev_lev > 1) { //Skipped levels. Enter Dummy levels\n", "\t\tfor (var x = 0; x < ((get_level(cell) - prev_lev) - 1); x++) {\n", "\t\t for (var y = 0; y < (prev_lev + x); y++) {\n", "\t\t\ttoc_text += \"\\t\";\n", "\t\t }\n", "\t\t toc_text += \"* \\n\";\n", "\t\t}\n", "\t }\n", "\t var cell_text = get_heading_text(cell);\n", "\t for (var j = 0; j < get_level(cell) -1; j++) { //Loop to add the proper amount of tabs based on header level\n", "\t\ttoc_text += \"\\t\";\n", "\t }\n", "\t toc_text += \"* [\";\n", "\t toc_text += cell_text;\n", "\t toc_text += \"](#\";\n", "\t var link_text = cell_text.replace(/\\s+$/g, \"\"); //Delete trailing spaces before they become \"-\"\n", "\t link_text = link_text.replace(/\\(/g, \"%28\"); //Replace left parentheses with their encoding\n", "\t link_text = link_text.replace(/\\)/g, \"%29\"); //Replace right parentheses with their encoding\n", "\t link_text = link_text.replace(/ /g, \"-\"); //Replace all spaces with dashes to create links\n", "\t toc_text += link_text;\n", "\t toc_text += \")\\n\";\n", "\t prev_lev = get_level(cell);\n", "\t}\n", " }\n", " toc_cell.unrender();\n", " toc_cell.set_text(toc_text);\n", " toc_cell.render();\n", "}\n", "$([IPython.events]).on('status_started.Kernel notebook_loaded.Notebook', table_of_contents);" ], "metadata": {}, "output_type": "display_data" } ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#Table of Contents\n", "* [Introduction: searching the periodic table for topological materials](#Introduction:-searching-the-periodic-table-for-topological-materials)\n", "* [Conductance of a 3D topological insulator](#Conductance-of-a-3D-topological-insulator)\n", "* [Landau levels](#Landau-levels)\n", "* [Spectroscopy of the surface of a 3D topological insulator](#Spectroscopy-of-the-surface-of-a-3D-topological-insulator)\n", "* [Quasiparticle interference (QPI)](#Quasiparticle-interference-%28QPI%29)\n", "* [The issue of bulk conductivity](#The-issue-of-bulk-conductivity)\n", "* [Hexagonal warping](#Hexagonal-warping)\n", "* [Outlook: from basic science to potential applications](#Outlook:-from-basic-science-to-potential-applications)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Plan\n", "\n", "* Spectroscopy of 3D TI\n", "* Landau levels\n", "* QPI\n", "* The issue of bulk conductivity\n", "* Hexagonal warping" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Introduction: searching the periodic table for topological materials" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How do we find a topological insulator? In the first video of today, David Vanderbilt from Rutgers University will tell us more about the material science aspects of topological insulators research.\n", "\n", "This is an expertise that no one from the course team has, so pay close attention to it: this material stands apart from the rest." ] }, { "cell_type": "code", "collapsed": false, "input": [ "MoocVideo(\"62ZObitJ4DM\", src_location=\"6.2-intro\")" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", " \n", " " ], "metadata": {}, "output_type": "pyout", "text": [ "MoocVideo(**{'download_video': 'true', 'display_name': '', 'sub': '62ZObitJ4DM', 'youtube': '1.00:62ZObitJ4DM', 'show_captions': 'true', 'youtube_id_1_0': '62ZObitJ4DM', 'source': 'http://delftxdownloads.tudelft.nl/TOPOCMx-QuantumKnots/TOPOCMx-6.2-intro-video.720.mp4', 'download_track': 'true'})" ] } ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the rest of the lecture, we will instead discuss the experimental signatures of 3D topological insulators, similarly to what we did in the previous week for their 2D counterparts.\n", "\n", "All the figures showing the experimental data are copyright of the Zahid Hasan lab, Princeton, 2015. They are available under CC-BY-NC-SA 4.0 International license." ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Conductance of a 3D topological insulator" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Both the quantum Hall and quantum spin Hall states had striking conductance quantization properties, thanks to the presence of perfectly transmitting one-dimensional transport channels.\n", "\n", "The 3D topological insulators do not posses similarly striking conductance properties. In a slab geometry, the surface states contribute with a finite density of propagating states. This density has a minimum at the Dirac point, and we expect the conductance to increase with a roughly hyperbolic shape away if the chemical potential is tuned away from the Dirac point.\n", "\n", "This is what is shown in the plot below:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Making system\n", "\n", "Bz = 0.\n", "mu_lead = 0.7\n", "mu_max = 0.4\n", "\n", "L, W, H = 10, 30, 6\n", "sys = bhz_slab(L, W, H)\n", "\n", "momenta = np.linspace(-np.pi/3, np.pi/3, 100)\n", "\n", "# calculating bands in scat\n", "par_lead = SimpleNamespace(A1=1.0, A2=1.0, B1=1.0, B2=1.0, C=0.0, D1=0., D2=0., M=-1.0, Bz=Bz)\n", "par = SimpleNamespace(lead=par_lead, scat=par_lead, mu_lead=0.0)\n", "bands = kwant.physics.Bands(sys.leads[0], args=[par])\n", "energies_scat = [bands(k) for k in momenta]\n", "\n", "\n", "# calculating conductance\n", "mus = np.linspace(-mu_max, mu_max, 40)\n", "data = []\n", "\n", "par_lead = SimpleNamespace(A1=1.0, A2=1.0, B1=1.0, B2=1.0, C=0.0, D1=0., D2=0., M=-1.0, Bz=0.0)\n", "par_scat = SimpleNamespace(A1=1.0, A2=1.0, B1=1.0, B2=1.0, C=0.0, D1=0., D2=0., M=-1.0, Bz=Bz)\n", "\n", "par = SimpleNamespace(lead=par_lead, scat=par_scat, mu_lead=mu_lead)\n", "sys_leads_fixed = sys.precalculate(energy=0.0, args=[par])\n", "\n", "for par.mu in mus: \n", " smatrix = kwant.smatrix(sys_leads_fixed, energy=0.0, args=[par])\n", " data.append(smatrix.transmission(1, 0))\n", "\n", "\n", " \n", "# making plot\n", "gmax = 8\n", "band_max = 1\n", "\n", "def plot(mu):\n", " # Figures, axes and matplotlib defaults.\n", " fig, ax = plt.subplots(1,2, figsize=([9.5, 4]), tight_layout=True)\n", " ax1, ax2 = ax\n", " ax2.set_color_cycle(['k'])\n", "\n", " # Plotting conductance\n", " ax1.plot(mus, data, 'r-')\n", " ax1.plot([mu, mu], [0, gmax], 'b--')\n", " \n", " # Plotting bands\n", " ax2.plot(momenta, energies_scat)\n", " ax2.plot([-4, 4], [mu, mu], 'k--')\n", " \n", " # Setting labels and titles\n", " ax1.set_xlabel(r'$\\mu$')\n", " ax1.set_ylabel(r'$G\\,[e^2/h]$')\n", "\n", " ax2.set_xlabel('$k$')\n", " ax2.set_ylabel('$E$')\n", " \n", " ax1.set_title('conductance')\n", " ax2.set_title('spectrum')\n", " \n", " # Setting ticks\n", " vals = np.arange(-0.4, 0.8, 0.4)\n", " ax1.set_xticks(vals)\n", " ax1.set_xticklabels([\"${0}$\".format(i) for i in vals])\n", "\n", " vals = range(0, gmax+1, 2)\n", " ax1.set_yticks(vals)\n", " ax1.set_yticklabels([\"${0}$\".format(i) for i in vals])\n", "\n", " vals = np.arange(-2, 2.5, .5)\n", " ax2.set_yticks(vals)\n", " ax2.set_yticklabels([\"${0}$\".format(i) for i in vals])\n", "\n", " ax2.set_xticks([-np.pi/3, 0.0, np.pi/3])\n", " ax2.set_xticklabels([r'$-\\frac{\\pi}{3}$', r'$0$', r'$\\frac{\\pi}{3}$'])\n", "\n", " # Setting limits\n", " ax1.set_xlim(-mu_max, mu_max)\n", " ax1.set_ylim(0, gmax)\n", " \n", " ax2.set_xlim(-np.pi/3,np.pi/3);\n", " ax2.set_ylim(-band_max, band_max)\n", " \n", " return fig\n", "\n", "StaticInteract(lambda mu: plot(.1*mu), mu = RangeWidget(-3, 3, name='mu', default=0, show_range=True))" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", " \n", " \n", "http://arxiv.org/abs/0908.1418
Discussion entitled '3DTI materials and signatures' is available in the online version of the course.
" ], "metadata": {}, "output_type": "pyout", "text": [ "MoocDiscussion(**{'discussion_category': 'Questions', 'discussion_target': '3DTI materials and signatures', 'display_name': '3DTI materials and signatures', 'discussion_id': '099ba034a0ba28eaf675262c8749b797'})" ] } ] } ], "metadata": {} } ] }