TL;DR ¶
マイクロマグネティックシミュレーションのソフトウェアmumax
の実行サンプルとして磁場による磁壁駆動を解説.
大まかには以下のような流れでシミュレーションを実行するためのスクリプトを作り,シミュレーションを実行,可視化する.
- 空間グリッドを決める.
- 長方形の形状(shape)として
rq
を作成して幾何学構造(geometry)を決める.
- 物質パラメタ(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
23
24
25
26
27
28
29
|
Nx := 512
Ny := 64
Nz := 1
L0 := 1e-9 // [m]
setgridsize(Nx, Ny, Nz)
setcellsize(L0, L0, L0)
Lx := Nx*L0
Ly := Ny*L0
Lz := Nz*L0
rq := rect(Lx, Ly)
setgeom(rq)
saveas(geom, "bar")
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
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
2
3
4
5
|
convert -delay 5 domain_wall_motion_by_magnetic_field.out/m*.png movie.gif
# これを実行するには別途imagemagickが必要
# ubuntu の場合は
# sudo apt install imagemagick
# でimagemagickがインストールされる
|
によって以下のようなgifアニメーションが作成できる.
mp4ファイルを作成したい場合は以下のようにffmpeg
を使うとよい.
bash
1
2
3
4
5
|
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 の場合は
# sudo apt install ffmpeg
# でffmpegがインストールされる
|
以下で.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
|
0. 空間グリッドを決める ¶
今回は2次元的なサンプルを作成する.
これはメインの話題ではないので,以下のコードが理解できない場合はmumaxの使い方② 基礎/空間グリッドを決める
を参照されたし.
1
2
3
4
5
|
Nx := 512
Ny := 64
Nz := 1
L0 := 1e-9 // [m]
setgridsize(Nx, Ny, Nz)
|
1. 形状の指定と幾何学構造の決定 ¶
以下の部分で形状を指定して幾何学構造の決定を行なっている.
1
2
3
4
5
6
7
|
Lx := Nx*L0
Ly := Ny*L0
Lz := Nz*L0
rq := rect(Lx, Ly)
setgeom(rq)
saveas(geom, "bar")
|
2. 物質パラメタの指定 ¶
磁気異方性を導入して磁壁の幅をが有限の幅を持つようにしている.
1
2
3
4
5
6
|
Msat = 800e3 // [A/m]
Aex = 13e-12 // [J/m]
alpha = 0.02
AnisU = vector(1, 0, 0)
Ku1 = 500e3 // [J/m3]
|
3. 磁化の初期配置 ¶
以下で磁化が$+x$方向に向いた磁区と$-x$方向に向いた磁区の間に$+y$方向を経由したNéel磁壁を導入している.
1
2
|
m = TwoDomain(1,0,0, 0,1,0, -1,0,0) // Néel wall
saveas(m, "m_relaxed")
|
4. 外部磁場ベクトルの指定 ¶
$+x$方向に$0.7~\mathrm{mT}$の磁場を印加するように指定する.
1
|
B_ext = vector(7e-4, 0e0, 0e0) // [T]
|
5. 実行する計算の指定 ¶
$8~\mathrm{ns}$まで時間発展させ,$50~\mathrm{ps}$間隔で磁化配置を出力させるように指定する.
1
2
|
autosave(m, 5e-11)
run(8e-9)
|
6. 計算の実行 ¶
適当なディレクトリで以下のようにして実行する.
bash
1
|
mumax3 domain_wall_motion_by_magnetic_field.mx3
|
計算が成功するとm###.ovf
(###は数字)というファイルが大量に生成される.
7. 結果の可視化 ¶
この.ovf
ファイルを.png
に以下のように変換する.
bash
1
|
mumax3-convert -png domain_wall_motion_by_magnetic_field.out/m*.ovf
|
生成された.png
ファイルをアニメーションにするために,
bash
1
2
3
4
5
|
convert -delay 5 domain_wall_motion_by_magnetic_field.out/m*.png movie.gif
# これを実行するには別途imagemagickが必要
# ubuntu の場合は
# sudo apt install imagemagick
# でimagemagickがインストールされる
|
を実行すると以下のような.gif
ファイルが作成できる.
.mp4
ファイルを作成したい場合は以下のようにffmpeg
を使うとよい.
bash
1
2
3
4
5
|
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 の場合は
# sudo apt install ffmpeg
# でffmpegがインストールされる
|
前の記事: mumaxの使い方② 基礎