{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Juliaで学ぶタイトバインディング模型とトポロジカル物質\n",
"## 番外編:ずらした二層グラフェンのプロット\n",
"Magic Angle Grapheneというものが話題となっている。1度ほどずらした角度で二枚のグラフェンを重ね合わせて、ゲート電圧を調整すると超伝導が出るという話である。\n",
"\n",
"Y. Cao, et al. \"Unconventional superconductivity in magic-angle graphene superlattices\", Nature (2018): doi:10.1038/nature26160\n",
"\n",
"http://www.nature.com/articles/nature26160\n",
"\n",
"プレプリントバージョンはこちら。Natureを読めない環境ならこちらを参照。\n",
"https://arxiv.org/abs/1803.02342\n",
"\n",
"グラフェンを二枚重ねた時の格子はモアレパターンが見られることが知られている。\n",
"これをJuliaで実装してモアレパターンを見てみよう。\n",
"\n",
"### 一層グラフェン\n",
"一層グラフェン、つまり普通のグラフェンである。\n",
"基本格子ベクトルは\n",
"$$\n",
"{\\bf a}_1 = (\\sqrt(3)/2 \\: -1/2)\n",
"$$\n",
"$$\n",
"{\\bf a}_2 = (\\sqrt(3)/2 \\: 1/2)\n",
"$$\n",
"であり、この二つのベクトルで囲った領域を「ユニットセル」と呼ぶ。\n",
"この二つのベクトルを用いると、グラフェンの二種類の炭素原子は\n",
"$$\n",
"d{\\bf r}_A = 2 {\\bf a}_1/3 + 2 {\\bf a}_2/3\n",
"$$\n",
"$$\n",
"d{\\bf r}_B = {\\bf a}_1/3 + {\\bf a}_2/3\n",
"$$\n",
"という場所にある。これを図示してみよう。"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"using Plots\n",
"\n",
"a1 = [sqrt(3)/2,-1/2]\n",
"a2 = [sqrt(3)/2,1/2]\n",
"drA = 2a1/3+2a2/3\n",
"drB = a1/3+a2/3 \n",
"\n",
"lw = 0.5\n",
"ls = :dash\n",
"\n",
"plot(size=(500,500), legend=false)\n",
"plot!([drA[1]],[drA[2]],marker=:circle,color=\"red\") #原子A\n",
"plot!([drB[1]],[drB[2]],marker=:circle,color=\"blue\") #原子B\n",
"plot!([0,a1[1]],[0,a1[2]], lw=lw, ls =ls,color=\"black\") #a1\n",
"plot!([a2[1],a2[1]+a1[1]],[a2[2],a2[2]+a1[2]], lw=lw, ls =ls,color=\"black\") #a1\n",
"plot!([0,a2[1]],[0,a2[2]], lw=lw, ls =ls,color=\"brown\") #a2\n",
"plot!([a1[1],a1[1]+a2[1]],[a1[2],a1[2]+a2[2]], lw=lw, ls =ls,color=\"brown\") #a2\n",
"\n",
"plot!(aspect_ratio=:equal)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"このユニットセルを繰り返してタイリングすることで、グラフェンの格子を作ることができる。\n",
"菱形の左の角を原点${\\bf r}$として、この原点をずらしていけば、タイルを作ることができる。つまり、\n",
"$$\n",
"{\\bf r}(n,m) = n {\\bf a}_1 + m {\\bf a}_2\n",
"$$\n",
"という二つの整数$n,m$を用意すれば、原子Aと原子Bの座標は\n",
"$$\n",
"{\\bf r}_A(n,m) ={\\bf r}(n,m) + d{\\bf r}_A\n",
"$$\n",
"$$\n",
"{\\bf r}_B(n,m) ={\\bf r}(n,m) + d{\\bf r}_B\n",
"$$\n",
"と書くことができる。実際に描いてみよう。"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"r(n,m)=n*a1+m*a2\n",
"Nx=10\n",
"Ny=10\n",
"plot(size=(500,500), legend=false)\n",
"for n in 1:Nx\n",
" for m in 1:Ny\n",
" rA = r(n,m)+drA\n",
" rB = r(n,m)+drB\n",
" plot!([rA[1]],[rA[2]],marker=:circle,color=\"red\") #原子A\n",
" plot!([rB[1]],[rB[2]],marker=:circle,color=\"blue\") #原子B\n",
" end\n",
"end\n",
"\n",
"plot!(xlim=(7.5,12.5),ylim=(-2,2),aspect_ratio=:equal)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"原子と原子の線を結んでみよう。"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Nx=10\n",
"Ny=10\n",
"plot(size=(500,500), legend=false)\n",
"for n in 1:Nx\n",
" for m in 1:Ny\n",
" rA = r(n,m)+drA\n",
" rB = r(n,m)+drB\n",
" plot!([rA[1],rB[1]],[rA[2],rB[2]], color=\"red\", lw=lw)\n",
" plot!([rA[1]-a1[1],rB[1]],[rA[2]-a1[2],rB[2]], color=\"red\", lw=lw)\n",
" plot!([rA[1]-a2[1],rB[1]],[rA[2]-a2[2],rB[2]], color=\"red\", lw=lw)\n",
" end\n",
"end\n",
"\n",
"plot!(aspect_ratio=:equal)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 二層グラフェン\n",
"次に少しだけずらしてグラフェンを重ねてみよう。基本格子ベクトルを傾けることで、ずらしたグラフェンを作ることができる。\n",
"ベクトルの回転は、\n",
"$$\n",
"M(\\theta) = \n",
"\\left(\n",
"\\begin{matrix}\n",
"\\cos \\theta && -\\sin \\theta \\\\\n",
"\\sin \\theta && \\cos \\theta\n",
"\\end{matrix}\n",
"\\right)\n",
"$$\n",
"という行列をかければ良いので、\n",
"新しい基本格子ベクトルを\n",
"$$\n",
"{\\bf a}_1' =M(\\theta) {\\bf a}_1 \n",
"$$\n",
"$$\n",
"{\\bf a}_2' =M(\\theta) {\\bf a}_2 \n",
"$$\n",
"とすれば、全く同じように描画することができる。"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"θ=π/8\n",
"\n",
"M = [\n",
"cos(θ) -sin(θ)\n",
"sin(θ) cos(θ)\n",
"]\n",
"\n",
"a1d = M*a1\n",
"a2d = M*a2\n",
"drAd = 2a1d/3+2a2d/3\n",
"drBd = a1d/3+a2d/3 \n",
"rd(n,m) = n*a1d+m*a2d\n",
"\n",
"Nx=10\n",
"Ny=10\n",
"plot(size=(500,500), legend=false)\n",
"for n in 1:Nx\n",
" for m in 1:Ny\n",
" rAd = rd(n,m)+drAd\n",
" rBd = rd(n,m)+drBd\n",
" plot!([rAd[1],rBd[1]],[rAd[2],rBd[2]], color=\"blue\", lw=lw)\n",
" plot!([rAd[1]-a1d[1],rBd[1]],[rAd[2]-a1d[2],rBd[2]], color=\"blue\", lw=lw)\n",
" plot!([rAd[1]-a2d[1],rBd[1]],[rAd[2]-a2d[2],rBd[2]], color=\"blue\", lw=lw)\n",
" end\n",
"end\n",
"\n",
"\n",
"plot!(aspect_ratio=:equal)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"ついでなので、関数の形にしてもう少しすっきりとさせてみる。"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"function plotGraphene(θ,n,m,color)\n",
" M = [\n",
" cos(θ) -sin(θ)\n",
" sin(θ) cos(θ)\n",
" ]\n",
" a1 = [sqrt(3)/2,-1/2]\n",
" a2 = [sqrt(3)/2,1/2]\n",
" lw = 0.5\n",
" ls = :dash\n",
"\n",
" a1d = M*a1\n",
" a2d = M*a2\n",
" drAd = 2a1d/3+2a2d/3\n",
" drBd = a1d/3+a2d/3 \n",
" rd = n*a1d+m*a2d\n",
"\n",
" rAd = rd+drAd\n",
" rBd = rd+drBd\n",
" plot!([rAd[1],rBd[1]],[rAd[2],rBd[2]], color=\"blue\", lw=lw)\n",
" plot!([rAd[1]-a1d[1],rBd[1]],[rAd[2]-a1d[2],rBd[2]], color=color, lw=lw)\n",
" plot!([rAd[1]-a2d[1],rBd[1]],[rAd[2]-a2d[2],rBd[2]], color=color, lw=lw)\n",
"end\n",
"\n",
"θ=π/8\n",
"Nx=10\n",
"Ny=10\n",
"plot(size=(500,500), legend=false)\n",
"for n in 1:Nx\n",
" for m in 1:Ny\n",
" plotGraphene(θ,n,m,\"blue\")\n",
" end\n",
"end\n",
"\n",
"\n",
"plot!(aspect_ratio=:equal)\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"これで、この関数を二回呼べば二層グラフェンとなる。"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"θ=2π/360\n",
"Nx=10\n",
"Ny=10\n",
"plot(size=(500,500), legend=false)\n",
"for n in 1:Nx\n",
" for m in 1:Ny\n",
" plotGraphene(0,n,m,\"red\")\n",
" plotGraphene(θ,n,m,\"blue\")\n",
" end\n",
"end\n",
"\n",
"\n",
"plot!(aspect_ratio=:equal)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"広い範囲で描画してみよう。"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"θ=2π/360\n",
"Nx=20\n",
"Ny=20\n",
"plot(size=(500,500), legend=false)\n",
"for n in 1:Nx\n",
" for m in 1:Ny\n",
" plotGraphene(0,n,m,\"red\")\n",
" plotGraphene(θ,n,m,\"blue\")\n",
" end\n",
"end\n",
"\n",
"\n",
"plot!(aspect_ratio=:equal)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"適当に$\\theta$を選ぶと、どこまでもお互いが揃わない模様になる。これは周期がないため\n",
"準結晶に似ている。\n",
"もし、周期のあるものが欲しければ、\n",
"$$\n",
"\\cos \\theta = \\frac{N^2+4NM+M^2}{2(N^2+NM+M^2)}\n",
"$$\n",
"という整数$N,M$を用いれば良い。この整数が大きければ大きいほど、周期が長くなる。\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"N = 4\n",
"M = 5\n",
"\n",
"θ=acos((N^2+4N*M+M^2)/(2(N^2+N*M+M^2)))\n",
"Nx=40\n",
"Ny=40\n",
"plot(size=(500,500), legend=false)\n",
"for n in 1:Nx\n",
" for m in 1:Ny\n",
" plotGraphene(0,n,m,\"red\")\n",
" plotGraphene(θ,n,m,\"blue\")\n",
" end\n",
"end\n",
"\n",
"\n",
"plot!(aspect_ratio=:equal)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"このように、モアレパターンが出る。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.6.2",
"language": "julia",
"name": "julia-1.6"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}