最終更新日: 2024/02/12 作成日: 2024/02/09
このページの概要

マイクロマグネティックシミュレーションのソフトウェアmumax の実行サンプルとして磁場による磁壁駆動を解説.

TL;DR

マイクロマグネティックシミュレーションのソフトウェアmumax の実行サンプルとして磁場による磁壁駆動を解説.

大まかには以下のような流れでシミュレーションを実行するためのスクリプトを作り,シミュレーションを実行,可視化する.

  1. 空間グリッドを決める.
  2. 物質パラメタ(material parameters)として交換相互作用の強さ,Gilbert減衰定数,容易軸磁気異方性を指定する.
  3. 磁化の初期条件(initial magnetization)としてTwoDomainを用いて2つの磁区があるように指定する.
  4. 磁気励起(excitation)として外部磁場ベクトルを指定する.
  5. 実行する計算を指定する.
  6. 計算を実行する.
  7. 結果を可視化する.
  8. 結果を解析する.

シミュレーションの実行

全体のソースコードを以下に示す. コードの内容は前回の記事 に意味が書かれている.

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ファイルを解析するときにpythonnumpyのバイナリ(拡張子.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)

主な変更点として

  1. enabledemag = falseで反磁場の効果を無くし,交換相互作用と容易軸磁気異方性しかない模型に変えた.それに伴ってalpha = 0.2とGilbert減衰定数を10倍にした.(alpha = 0.02のままだとほとんど磁壁が動かない.)
  2. 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という画像ファイルも生成される.)

bash
1
python3 analysis.py

磁壁の移動距離.ほとんど線形に増えていっている.ガタガタしている.
図2: 磁壁の移動距離.ほとんど線形に増えていっている.ガタガタしている.

注意
numpypandasmatplotlibは事前に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の使い方④磁場による磁壁駆動(困難軸磁気異方性あり)