{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# マグノン\n",
"\n",
"(初版:2020年3月、更新:2023年2月21日) \n",
"\n",
"スピン波は強磁性体などの秩序状態にあるスピン系において発生する。\n",
"スピン波を量子化したものがマグノンである。\n",
"\n",
"## スピン波の分散関係\n",
"\n",
"一次元ハイゼンベルグモデルから、以下のようなスピン波の分散関係が求められる。\n",
"\n",
"### $\\displaystyle{\\omega = \\frac{4JS}{\\hbar}[1-\\cos (qa)]}$ \n",
"\n",
"ここで、 \n",
"$S$ : スピン、$J$ : 交換積分、$a$ : 格子定数、$q$ : 波数、$\\omega$ : 角周波数 \n",
"である。\n",
"\n",
"これをJuliaでかいてみる。 \n",
"\n",
"gifにした時に、角周波数 $\\omega$ [rad/s] より周波数 $f$ [Hz] の方が分かりやすいので、$\\omega \\to f$ に変える。 \n",
"また、波数も $\\displaystyle{q \\to q\\frac{2\\pi}{a}}$ に変える。 \n",
"周波数の最大値を 1 Hz になるように設定すると分散関係は\n",
"### $\\displaystyle{f = \\frac{1}{2}\\left[ 1-\\cos \\left( 2\\pi q \\right) \\right]}$ \n",
"となる。これをプロットすると以下のようになる。"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"using Plots\n",
"using Plots.PlotMeasures\n",
"using LaTeXStrings"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"qvec = collect(0:0.01:0.5) # qのArray\n",
"wvec = @. 0.5*(1-cos(2π*qvec)) # ωのArray\n",
"plot(qvec, wvec, legend=false, xlabel=L\"q\", ylabel=L\"ω\", size=(300,300))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## スピン波のアニメーション \n",
"\n",
"波数を決めて、そのときのスピン波の様子のgif動画を作る。 \n",
"動画作成には下記URLを参考にした。 \n",
"[Qiita: JuliaでグラフのGIFアニメを作ってみた](https://qiita.com/MTNakata/items/0418ae3493a26ac44603) \n",
"\n",
"教科書などでは円錐状の回転運動としてスピン波の様子が描かれているが、簡単に描くため、2Dで左右に首を振るような形にした(真横から見ているイメージ)。 \n",
"\n",
"これらを踏まえて作成したgif動画は以下になる。"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"main1 (generic function with 1 method)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"function main1(a, qval, num)\n",
" \n",
" fval = 0.5*(1-cos(2π*qval)) # Hzだとωよりfが良いので変えとく。\n",
" xvec1 = a.*collect(0:1:num);\n",
" xvec2 = a.*collect(0:0.1:num);\n",
" yvec1 = zeros(length(xvec1)) .+ 1.0;\n",
" arrowyvec1 = ones(length(xvec1));\n",
"\n",
" flamenum = Int64(round(10/fval))\n",
" println(\"T = \", round(100/fval)/100, \" sec, f = \", round(fval*100)/100, \" Hz, flame_num = \", flamenum)\n",
" anim = Animation()\n",
" \n",
" for t = range(0, 1/fval*((flamenum-1)/flamenum), length = flamenum)\n",
" φvec1 = @. a*0.5*sin(xvec1*(qval*2π/a) + 2π*fval*t)\n",
" φvec2 = @. 0.5*sin(xvec2*(qval*2π/a) + 2π*fval*t)\n",
" plt = scatter(xvec1, yvec1, legend=false, ylims=[-0.5,2.5], xlims=[xvec1[begin], xvec1[end]], size=(800,200))\n",
" plt = quiver!(xvec1, yvec1, quiver = (φvec1, arrowyvec1))\n",
" plt = plot!(xvec2, φvec2)\n",
" frame(anim, plt)\n",
" end\n",
"\n",
" return gif(anim, \"magnon.gif\", fps = 10)\n",
"end"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"T = 1.0 sec, f = 1.0 Hz, flame_num = 10\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\u001b[36m\u001b[1m[ \u001b[22m\u001b[39m\u001b[36m\u001b[1mInfo: \u001b[22m\u001b[39mSaved animation to D:\\Dropbox\\Python_Julia\\Julia\\教育用\\magnon.gif\n"
]
},
{
"data": {
"text/html": [
""
],
"text/plain": [
"Plots.AnimatedGif(\"D:\\\\Dropbox\\\\Python_Julia\\\\Julia\\\\教育用\\\\magnon.gif\")"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = 1; # 格子定数。何でも良い。\n",
"num = 50; # 表示するスピンの数\n",
"qval = 1/2; # 波数\n",
"\n",
"main1(a, qval, num)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"T = 1.11 sec, f = 0.9 Hz, flame_num = 11\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
]
},
{
"data": {
"text/html": [
""
],
"text/plain": [
"Plots.AnimatedGif(\"D:\\\\Dropbox\\\\Python_Julia\\\\Julia\\\\教育用\\\\magnon.gif\")"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = 1;\n",
"num = 50;\n",
"qval = 2/5;\n",
"\n",
"main1(a, qval, num)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"T = 1.53 sec, f = 0.65 Hz, flame_num = 15\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
]
},
{
"data": {
"text/html": [
""
],
"text/plain": [
"Plots.AnimatedGif(\"D:\\\\Dropbox\\\\Python_Julia\\\\Julia\\\\教育用\\\\magnon.gif\")"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = 1;\n",
"num = 50;\n",
"qval = 3/10\n",
"\n",
"main1(a, qval, num)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"T = 2.89 sec, f = 0.35 Hz, flame_num = 29\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
]
},
{
"data": {
"text/html": [
""
],
"text/plain": [
"Plots.AnimatedGif(\"D:\\\\Dropbox\\\\Python_Julia\\\\Julia\\\\教育用\\\\magnon.gif\")"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = 1;\n",
"num = 50;\n",
"qval = 1/5\n",
"\n",
"main1(a, qval, num)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"T = 10.47 sec, f = 0.1 Hz, flame_num = 105\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
]
},
{
"data": {
"text/html": [
""
],
"text/plain": [
"Plots.AnimatedGif(\"D:\\\\Dropbox\\\\Python_Julia\\\\Julia\\\\教育用\\\\magnon.gif\")"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = 1;\n",
"num = 50;\n",
"qval = 1/10\n",
"\n",
"main1(a, qval, num)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.9.0-beta3",
"language": "julia",
"name": "julia-1.9"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.9.0"
}
},
"nbformat": 4,
"nbformat_minor": 4
}