TL;DR ¶
マイクロマグネティックシミュレーションのソフトウェアmumax
の実行サンプルとして磁場による磁壁駆動を解説.
大まかには以下のような流れでシミュレーションを実行するためのスクリプトを作り,シミュレーションを実行,可視化する.
- 空間グリッドを決める.
- 物質パラメタ(material parameters)として交換相互作用の強さ,Gilbert減衰定数,容易軸磁気異方性を指定する.
- 磁化の初期条件(initial magnetization)として
TwoDomain
を用いて2つの磁区があるように指定する.
- 磁気励起(excitation)として外部磁場ベクトルを指定する.
- 実行する計算を指定する.
- 計算を実行する.
- 結果を可視化する.
- 結果を解析する.
シミュレーションの実行 ¶
全体のソースコードを以下に示す.
コードの内容は前回の記事
に意味が書かれている.
domain_wall_motion_by_magnetic_field.mx3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
Nx := 512
Ny := 64
Nz := 1
L0 := 1e-9 // [m]
setgridsize(Nx, Ny, Nz)
setcellsize(L0, L0, L0)
Msat = 800e3 // [A/m]
Aex = 13e-12 // [J/m]
alpha = 0.02
AnisU = vector(1, 0, 0)
Ku1 = 500e3 // [J/m3]
m = TwoDomain(1,0,0, 0,1,0, -1,0,0) // Néel wall
relax()
saveas(m, "m_relaxed")
B_ext = vector(7e-4, 0e0, 0e0) // [T]
autosave(m, 5e-11)
run(8e-9)
|
これを適当なディレクトリで以下のようにして実行する.
bash
1
|
mumax3 domain_wall_motion_by_magnetic_field.mx3
|
計算が成功するとm###.ovf
(###は数字)というファイルが大量に生成される.
この.ovf
ファイルを.png
に以下のように変換する.
bash
1
|
mumax3-convert -png domain_wall_motion_by_magnetic_field.out/m*.ovf
|
bash
1
|
convert -delay 5 domain_wall_motion_by_magnetic_field.out/m*.png movie.gif
|
によって以下のようなgifアニメーションが作成できる.
図1: 磁場による磁壁駆動のシミュレーション結果.磁壁が右に移動していっている様子が見てとれる.
- 注意点
convert
を実行するには別途imagemagick
が必要
ubuntu の場合は
bash
1
|
sudo apt install imagemagick
|
でimagemagick
がインストールされる
mp4ファイルを作成したい場合は以下のようにffmpeg
を使うとよい.
bash
1
|
ffmpeg -r 30 -pattern_type glob -i "domain_wall_motion_by_magnetic_field.out/m*.png" -vcodec libx264 -acodec copy -pix_fmt yuv420p -r 60 movie.mp4
|
- 注意点
ffmpeg
も別途インストールが必要
ubuntu の場合は
bash
1
|
sudo apt install ffmpeg
|
でffmpeg
がインストールされる.
ffmpeg
で.mp4
ファイルを作成するときは画像のアスペクト比が極端にあると,アニメーションの作成に失敗する(たとえば1次元的な磁性体としてNx:=512
かつNy:=1
, Nz:=1
のような場合).
その場合はffmpeg
に-vf scale=1280:360
などで解像度を指定するとうまくいく.
以下で.ovf
ファイルを解析するときにpython
のnumpy
のバイナリ(拡張子.npy
)に変換できる.
bash
1
|
mumax3-convert -numpy domain_wall_motion_by_magnetic_field.out/m*.ovf
|
生成された.npy
ファイルは以下のような方法で読み込める.
analysis.py
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import numpy as np
directory = "./domain_wall_motion_by_magnetic_field.out/"
last_index = 200
m = []
indexes = np.arange(0, last_index+1)
for index in indexes:
file = directory+"m{:06}.npy".format(index)
data = np.load(file)
m.append(data)
#print(m[0].shape) # return: 3, Nz, Ny, Nx
|
結果の解析 ¶
きれいなアニメーションを作成することはできた.
しかし得られた結果が理論式と一致しているのかを確かめたくなるのが科学者というものだ.
そのためには実行ファイルを以下のように改良する.
domain_wall_motion_by_magnetic_field2.mx3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
Nx := 512
Ny := 64
Nz := 1
L0 := 1e-9 // [m]
setgridsize(Nx, Ny, Nz)
setcellsize(L0, L0, L0)
enabledemag = false // 反磁場の効果を取り入れない
Msat = 800e3 // [A/m]
Aex = 13e-12 // [J/m]
alpha = 0.2 // 10倍にした
AnisU = vector(1, 0, 0)
Ku1 = 500e3 // [J/m3]
m = TwoDomain(1,0,0, 0,1,0, -1,0,0) // Néel wall
relax()
saveas(m, "m_relaxed")
ext_centerWall(0) // 磁壁中心の位置が原点になるような座標系に乗る
// 0.1Tの強めの磁場
B_ext = vector(1e-1, 0e0, 0e0) // [T]
tableadd(ext_dwpos) // 磁壁の位置を出力させる; ext_centerWall(0) と一緒に用いる必要がある
tableautosave(5e-11)
run(10e-9)
|
主な変更点として
enabledemag = false
で反磁場の効果を無くし,交換相互作用と容易軸磁気異方性しかない模型に変えた.それに伴ってalpha = 0.2
とGilbert減衰定数を10倍にした.(alpha = 0.02
のままだとほとんど磁壁が動かない.)
ext_centerWall(0)
を指定して磁壁の位置に印を付けてtableadd(ext_dwpos)
とtableautosave(5e-11)
で磁壁の位置を出力させた.ext_centerWall(0)
を指定すると磁壁の中心に乗った座標系が採用されるようである.内部でどういう処理がされているかは分からない.
mumaxを実行すると,domain_wall_motion_by_magnetic_field2.out/table.txt
というtsv
ファイルが生成される.
中身は以下のようになっている.
table.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
# t (s) mx () my () mz () ext_dwpos (m)
0 -1.3969839e-09 0.031185836 0 -0
5.006703970075197e-11 0.0033579152 0.02065175 0.023368128 -0
1.0011073933812663e-10 0.0067142705 -0.0038226263 0.030950801 -0
1.5008286490327814e-10 0.0061595696 -0.02569537 0.017672526 1e-09
2.0005056376038836e-10 0.0056045656 -0.030270409 -0.0075006033 2e-09
2.500158278758397e-10 0.0050494093 -0.014472226 -0.027624441 3e-09
3.0011152919042965e-10 0.0045029963 0.011130565 -0.02913237 4e-09
3.500775365494484e-10 0.003947876 0.029181438 -0.011000791 5e-09
4.000967267983446e-10 0.007302589 0.027578738 0.014559327 5e-09
4.500580287377777e-10 0.0067471573 0.0074071367 0.03029357 6e-09
5.000188740417607e-10 0.006191695 -0.017748833 0.025642749 7e-09
5.501111669416731e-10 0.005645052 -0.030969437 0.0036676528 8e-09
6.000708066570364e-10 0.00508951 -0.023293886 -0.020735199 9e-09
6.500298156779016e-10 0.00453393 5.5267647e-05 -0.03118622 1e-08
7.00118944627916e-10 0.0039870706 0.023412945 -0.02060123 1.1e-08
7.500077692911061e-10 0.00733304 0.030952472 0.0038085135 1.1e-08
︙
中略
︙
9.550071122367543e-09 0.007694713 -0.0068536173 -0.030423524 1.62e-07
9.600029869153063e-09 0.0071391123 0.018212354 -0.025315432 1.63e-07
9.650120590355852e-09 0.0065923627 0.031031135 -0.0031044076 1.64e-07
9.700079329109301e-09 0.0060367584 0.022913812 0.02115482 1.65e-07
9.75003806068247e-09 0.005481154 -0.000621232 0.031179594 1.66e-07
9.800128777088764e-09 0.004934406 -0.023783274 0.020172156 1.67e-07
9.850087519240493e-09 0.0043788035 -0.030873405 -0.0044070003 1.68e-07
9.900106954468164e-09 0.0077335285 -0.017162777 -0.026038472 1.68e-07
9.95006569593455e-09 0.007177924 0.0080909915 -0.030118046 1.69e-07
1e-08 0.006620686 0.027895 -0.013944083 1.7e-07
|
このデータを用いて磁壁速度がどのようになっているかを調べる.
(ext_dwspeed
という磁壁速度を出力するコマンドもあるがあまり使い物にならなかった.)
具体的にはpandas
でこのファイルを読み込み,(pandas
のコマンドを使わずに)matplotlib
でグラフ化してみる.
analysis.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import glob
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
def load_m(directory):
m = []
npy_files = sorted(glob.glob(directory+"m*.npy"))
for file in npy_files:
data = np.load(file)
m.append(data)
return m
def load_table(directory):
table = pd.read_csv(directory+"table.txt", sep='\t')
return table
def main():
directory = "./domain_wall_motion_by_magnetic_field2.out/"
table = load_table(directory)
keys = table.keys()
fig, ax = plt.subplots(1,1,figsize=(7,7))
ax.set_xlabel("time [s]")
ax.set_ylabel("distance [m]")
ax.plot(table[keys[0]], table[keys[-1]], label=keys[-1])
fig.savefig("distance.png", dpi=300)
plt.show()
if __name__=="__main__":
main()
|
これを以下のように実行すると,以下のようなグラフが得られる.
(それと同時にdistance.png
という画像ファイルも生成される.)
図2: 磁壁の移動距離.ほとんど線形に増えていっている.ガタガタしている.
- 注意
numpy
とpandas
とmatplotlib
は事前にpip
など経由で(以下のようなコマンドで)インストールしておく必要がある.
bash
1
|
pip install numpy pandas matplotlib
|
これから磁壁移動速度が,rigidな磁壁の解析解と一致しているかを確かめたい.
容易軸磁気異方性しかない場合の磁壁の移動速度は多々良源著『スピントロニクス理論の基礎』5-3にあるように,
$$\begin{align}
\frac{\dot{X}}{\lambda} = \frac{\alpha}{1 + \alpha^2} \gamma B
\end{align}$$
と等速直線運動をする.
ただし$X$は磁壁の位置を表し,$\lambda = \sqrt{A_{ex}/K}$は磁壁の幅($A_{ex}$は交換スティフネス係数$[\mathrm{J/m}]$で$K$は容易軸磁気異方性の係数$[\mathrm{J/m^3}]$),$\alpha$はGilbert減衰定数,$\gamma$は磁気回転比,$B$は外部磁場である.
今の場合は,$A_{ex} = 13 \times 10^{-12}~\mathrm{J/m}$,$K = 5 \times 10^5~\mathrm{J/m^3}$,$\alpha = 0.2$,$B = 0.1~\mathrm{T}$なので,$\lambda \simeq 5.0~\mathrm{nm}$から,
$$\begin{align}
\dot{X} \simeq 17~\mathrm{m/s}
\end{align}$$
となる.
速度が一定なので,移動距離は単純に時刻をかければ得られる.
これをグラフにして比較してみると以下のようになる.
図3: 磁壁の移動距離の解析解との比較.最初の立ち上がりを考慮すれば,ほぼ一致している.
以上から,理論式と一致していることがわかる.
解析解の物理的な意味については別途考察すべきことであるが,ここではシミュレーションの正しさを確かめるという本筋から外れるので省く.
ext_centerWall(0)
を指定した場合の可視化 ¶
アニメーションを作っても磁壁が動いていないように見える.
ext_centerWall(0)
を用いてウィンドウを磁壁の中心に固定しているからこのようなアニメーションが得られるようである.
内部でどういう処理をしているのかはまだ調査できていない.
前の記事: mumaxの使い方② 基礎
次の記事: mumaxの使い方④磁場による磁壁駆動(困難軸磁気異方性あり)